Мое воспроизведение отстает с midioutshortmsg - PullRequest
0 голосов
/ 28 апреля 2020

Я использую Wpf. Я анализирую midi-файл и использую midioutshortmsg для отправки сообщения в For L oop, и перерыва для ожидания Delta Time; Воспроизведение у меня запаздывает, но, когда я одновременно открываю другое программное обеспечение midi (включая WindowMediaPlayer), все проблемы сбрасываются, моя программа работает нормально. Когда я закрываю другое открытое программное обеспечение. Проблема возвращается.

Моя программа застряла здесь. Я уже попробовал отправить в midistreamout, MidiOutPro c или midioutlongmsg и т. Д. c. Но моя проблема все еще не решена. Большое спасибо.

[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]));
}
}

1 Ответ

0 голосов
/ 03 мая 2020

Если вы довольны Windows, вы можете использовать функции таймера winmm для запуска таймера высокого разрешения, который даст точность в 1 мс, что невозможно при Thread.Sleep.

Также вы можете использовать сторонние библиотеки, которые делают всю эту работу за вас. Я автор DryWetMIDI , поэтому вы можете использовать его для воспроизведения. Пожалуйста, прочитайте Воспроизведение статью из документации библиотеки, чтобы узнать больше.

...