使用 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 文件并与视觉效果同步时间的主要内容,如果未能解决你的问题,请参考以下文章