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

时间:2012-06-24 15:29:24

标签: c# wpf midi naudio

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

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

为了同步步骤,我需要在音乐中每次事件,然后显示下一步。在这种情况下,我不再使用Timer了。

我已经看过 NAudio 了。我发现播放MP3文件的教程对我没用。我创建了一个 MidiFile-object ,但我不知道怎么玩它。我知道MIDI文件包含有关如何播放音乐的信息(用于合成器),但我不想实现自己的播放器。

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

  2. 如何在每次音乐中接收活动

  3. NAudio是否有替代可能对我有所帮助?

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

  5. 我感谢各种帮助。我一直在寻找一段时间,并认为我可能正朝着错误的方向前进。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

使用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
        }
    }
}

Playback文章和Playback API参考中的更多信息。