Wie lang ist die Wartezeit (oder Verzögerung) für Rückrufe von der waveOutWrite-API-Methode?

Ich habe eine Debatte mit einigen Entwicklern in einem anderen Forum über das genaue Generieren von MIDI-Ereignissen (Note-On-Meldungen usw.). Das menschliche Ohr reagiert sehr empfindlich auf leichte Ungenauigkeiten im Timing, und ich denke, das Hauptproblem liegt in der Verwendung von Timern mit relativ niedriger Auflösung, die ihre Ereignisse in Intervallen von etwa 15 Millisekunden quantisieren (was groß genug ist, um wahrnehmbare Ungenauigkeiten zu verursachen).

Vor ungefähr 10 Jahren schrieb ich eine Beispielanwendung (Visual Basic 5 unter Windows 95), die ein kombinierter Software-Synthesizer und MIDI-Player war. Die Grundvoraussetzung war ein Schaltpuffer-Wiedergabesystem, bei dem jeder Puffer die Dauer einer Sechzehntelnote betrug (Beispiel: Bei 120 Viertelnoten pro Minute betrug jede Viertelnote 500 ms und somit jede Sechzehntelnote 125 ms, also jede Puffer ist 5513 Proben). Jeder Puffer wurde über die waveOutWrite-Methode abgespielt, und die Rückruffunktion dieser Methode wurde verwendet, um den nächsten Puffer in die Warteschlange zu stellen und auch um MIDI-Nachrichten zu senden. Dadurch wurden WAV-basiertes Audio und MIDI-Audio synchronisiert.

Meines Erachtens hat diese Methode perfekt funktioniert - die MIDI-Noten klangen nicht einmal ein wenig unpassend (wenn Sie zum Spielen von MIDI-Noten einen gewöhnlichen Timer mit einer Genauigkeit von 15 ms verwenden, klingen sie merklich unpassend).

Theoretisch würde diese Methode ein MIDI-Timing erzeugen, das genau zum Sample oder 0,0227 Millisekunden (da es 44,1 Samples pro Millisekunde gibt) ist. Ich bezweifle, dass dies die wahre Latenz dieses Ansatzes ist, da zwischen dem Ende eines Puffers und der Benachrichtigung über den waveOutWrite-Rückruf vermutlich eine gewisse Verzögerung liegt. Weiß jemand, wie groß diese Verzögerung tatsächlich sein würde?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage