我的播放因 midioutshortmsg 而滞后

My playback is lagging with midioutshortmsg

我使用 Wpf。 我解析一个 midi 文件并使用 midioutshortmsg 在 For 循环中发送消息, 并睡眠以延迟Delta Time; 我的播放很滞后,但是,当我同时打开其他 midi 软件时 (包括 WindowMediaPlayer),所有问题都已解决,我的程序运行良好。 当我关闭另一个打开时 software.Problem 回来了。

我的程序卡在了这里。 我已经试过send in midistreamout,MidiOutProc,or midioutlongmsg,etc.but 我的问题还是没有解决。 非常感谢。

[DllImport("winmm.dll")]
private extern static int midiOutOpen(out int lphMidiOut, int uDeviceID, int dwCallback, int dwInstance, int dwFlags);
[DllImport("winmm.dll")]
public extern static int midiOutShortMsg(int lphMidiOut, int dwMsg);

public int midiOut;

private void Play_Click(object sender, RoutedEventArgs e)
{   
midiOutOpen(out midiOut, 0, 0, 0, 0);

InstanceCaller = new Thread(new ThreadStart(SendMessage));
InstanceCaller.Start();
}

private void SendMessage()
{
for (int i = 0; i < melodyList.Count; i++)
{
var messgae = Convert.ToInt32(melodyList[i], 16);
midiOutShortMsg(midiOut, messgae);
Thread.Sleep(Convert.ToInt32(durationList[i]));
}
}

如果您对 Windows 满意,您可以使用 winmm timer functions 到 运行 高分辨率计时器,这将提供 1 毫秒的精度,这 impossible Thread.Sleep.

您也可以使用第三方库,它们会为您完成所有这些工作。我是 DryWetMIDI so you can use it for playback. Please read Playback 文章 os 库文档的作者以了解更多信息。