我的播放因 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 库文档的作者以了解更多信息。
我使用 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 库文档的作者以了解更多信息。