使用 WPF 播放 MIDI 文件并将时间与视觉效果同步



我正在使用C#/Windows Presentation Foundation编写一个应用程序。它是用脚形可视化舞蹈的步骤。目前,我正在以WAV文件的形式播放音乐,并使用计时器对步骤进行计时。

由于计时器的不规则性,音乐与步骤不同步。我需要某种同步,这就是我想使用 MIDI 文件的原因。

要同步步骤,我需要音乐中每次都有一个事件,然后显示下一步。在这种情况下,我不会再使用计时器了。

我已经看过纳乌迪奥了。我找到了播放MP3文件的教程,这对我没有帮助。我创建了一个 MidiFile 对象,但我不知道如何播放它。我知道 MIDI 文件包含有关如何播放音乐(用于合成器)的信息,但我不想实现自己的播放器。

  1. 使用 NAudio 播放 MIDI 文件的简单方法是什么?

  2. 如何在每次音乐中接收事件

  3. 有没有可以更好地帮助我的NAudio的替代品

  4. 是否有可以同步到我的可视化的 MIDI 替代方案?

我感谢各种帮助。我一直在寻找一段时间,并认为我可能看错了方向。

使用 DryWetMIDI(我是作者),播放 MIDI 文件以及触发播放的事件非常简单:

namespace SimplePlaybackApp
{
    class Program
    {
        private static Playback _playback;
        static void Main(string[] args)
        {
            var midiFile = MidiFile.Read("The Greatest Song Ever.mid");
            var outputDevice = OutputDevice.GetByName("Microsoft GS Wavetable Synth");
            _playback = midiFile.GetPlayback(outputDevice);
            _playback.EventPlayed += OnEventPlayed;
            _playback.Start();
            SpinWait.SpinUntil(() => !_playback.IsRunning);
            Console.WriteLine("Playback stopped or finished.");
            outputDevice.Dispose();
            _playback.Dispose();
        }
        private static void OnEventPlayed(object sender, MidiEventPlayedEventArgs e)
        {
            // ... do something
        }
    }
}

有关详细信息,请参阅播放文章和播放 API 参考。

如果你想更深入地了解 midi 内部,这看起来是一个非常酷的库和源代码来探索。

http://code.google.com/p/midi-dot-net/

最新更新