Qual é o tempo de latência (ou atraso) dos retornos de chamada do método da API waveOutWrite?

Eu estou tendo um debate com alguns desenvolvedores em outro fórum sobre como gerar com precisão eventos MIDI (Nota sobre mensagens e assim por diante). O ouvido humano é bastante sensível a pequenas imprecisões de tempo, e acho que seu principal problema vem do uso de temporizadores de resolução relativamente baixa que quantificam seus eventos em intervalos de 15 milissegundos (o que é grande o suficiente para causar imprecisões perceptíveis).

Cerca de 10 anos atrás, eu escrevi um aplicativo de exemplo (Visual Basic 5 no Windows 95) que era um sintetizador de software combinado e um player MIDI. A premissa básica era um sistema de reprodução buffer-buffer com cada buffer sendo a duração de uma semicolcheia (exemplo: com 120 semínimas por minuto, cada semínimo era de 500 ms e assim cada semínima era de 125 ms, então cada buffer é 5513 amostras). Cada buffer foi reproduzido através do método waveOutWrite, e a função de retorno de chamada deste método foi usada para enfileirar o próximo buffer e também para enviar mensagens MIDI. Isso manteve o áudio baseado em WAV e o áudio MIDI sincronizado.

Ao meu ouvido, esse método funcionou perfeitamente - as notas MIDI não soaram nem um pouco fora de passo (ao passo que se você usar um timer comum com precisão de 15 ms para tocar notas MIDI, elas soarão notoriamente fora de sintonia).

Em teoria, esse método produziria um tempo de MIDI preciso para a amostra, ou 0,0227 milissegundos (já que há 44,1 amostras por milissegundo). Eu duvido que esta seja a verdadeira latência dessa abordagem, já que há presumivelmente algum pequeno atraso entre quando um buffer termina e quando o retorno de chamada waveOutWrite é notificado. Alguém sabe o quão grande esse atraso seria realmente?

questionAnswers(3)

yourAnswerToTheQuestion