3

我正在使用 C#/Windows Presentation Foundation 编写应用程序。它正在用脚的形状可视化舞蹈的步伐。目前我正在将音乐作为 WAV 文件播放,并使用 Timer 计时。

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

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

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

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

  2. 我怎样才能在音乐的每个时间接收事件?

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

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

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

4

2 回答 2

1

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

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

于 2012-06-24T15:44:39.283 回答
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
        }
    }
}

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

于 2020-08-21T16:06:38.410 回答