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

Posted

技术标签:

【中文标题】使用 WPF 播放 MIDI 文件并与视觉效果同步时间【英文标题】:Playing MIDI-files and synchronizing time with visuals with WPF 【发布时间】:2012-06-24 15:29:24 【问题描述】:

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

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

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

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

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

    我如何在每次播放音乐时接收事件

    NAudio 是否有替代方法可以更好地帮助我?

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

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

【问题讨论】:

【参考方案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 参考资料。

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于使用 WPF 播放 MIDI 文件并与视觉效果同步时间的主要内容,如果未能解决你的问题,请参考以下文章

使用 chrome 播放 MIDI 文件

Flutter mobile,播放midi文件

Soundfonts 播放 MIDI 文件没有衰减

播放多乐器 MIDI 文件

为啥干净的 Midi 文件播放不同? (与米多)

同步播放 AKSamplerMetronome 和 AKAppleSequencer