在C#中播放带有时间偏移量的Midi文件

时间:2011-06-29 04:03:40

标签: c# xna midi naudio

我正在尝试在播放歌曲时浏览midi文件,midi文件在播放前几毫秒“播放”。更详细地说,我通过从屏幕的右侧到左侧滑动所述音符来可视化歌曲的音符。我创建了音符的可视化,就在屏幕右侧,来自midi文件的信号,然后开始将它们翻译到左侧。我希望他们在歌曲实际播放的同时通过屏幕的中心。

我可以使用以下代码播放midi文件:

 if (counter < _file.Events[track].Count)
        {
            double s_ms = Microsoft.Xna.Framework.Media.MediaPlayer.PlayPosition.TotalMilliseconds;
            double m_ms = _file.Events[track][counter].AbsoluteTime / _pulses_per_millisecond;
            if (s_ms + offset > m_ms)
            {
                counter++;
                if (_file.Events[track][counter].CommandCode == NAudio.Midi.MidiCommandCode.NoteOn)
                {
                    Console.Beep(777, 25);
                    Console.Write("Beep ");
                }
            }
        }

偏移有效地使midi文件播放了一连串音符,然后返回到轨道位置,如果根本没有使用偏移,它将会处于该位置。

我很难过,非常感谢任何帮助。我正在使用XNA 3.1和NAudio。 midi和歌曲一起播放就好了。当然,我需要midi的播放速度与歌曲保持一致。

1 个答案:

答案 0 :(得分:0)

为什么不同时播放2个midi文件,而只使用一个实际输出音频(如果音频API支持它...)

甚至更好,解析整个midi文件一次。 获取注释及其时间,并将其存储在一个大阵列中。 播放实际的midi文件时,请使用刚刚填充的数组来显示音符。