Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Outra consideração no tempo do sintetizador é a latência, que é a diferença entre a hora atual e a primeira vez que uma nota pode tocar. Uma mensagem MIDI não pode ser enviada para o sintetizador e processada no buffer de saída no momento da amostra atual. Devem ser tidos em conta os dados que já foram colocados na memória intermédia, mas que ainda não foram transmitidos para o dispositivo de saída de ondas.
O coletor de onda, portanto, deve implementar um relógio de latência, que é um objeto IReferenceClock (descrito na documentação do SDK do Microsoft Windows). O método IReferenceClock::GetTime do relógio de latência recupera o tempo de amostra até o qual os dados já foram gravados no buffer e o converte em tempo de referência relativo ao relógio mestre. O coletor de onda faz conversões entre referência e tempo de amostra com IDirectMusicSynthSink::SampleToRefTime e IDirectMusicSynthSink::RefTimeToSample, portanto, neste caso, o sintetizador chama IDirectMusicSynthSink::RefTimeToSample para realizar a conversão.
O tempo de latência é todo gerenciado pelo coletor de onda. Sua implementação do método IDirectMusicSynthSink::GetLatencyClock deve gerar um ponteiro para o relógio de latência, e esse ponteiro deve, por sua vez, ser recuperado por IDirectMusicSynth::GetLatencyClock. A aplicação utiliza o relógio de latência para determinar o momento mais cedo em que uma mensagem MIDI pode ser enfileirada para reprodução quando é passada para o sintetizador, através do método IDirectMusicSynth::PlayBuffer.
Um exemplo da latência de uma mensagem MIDI é mostrado na figura a seguir.
Na figura anterior, o relógio de latência aponta para o primeiro lugar no loop de buffer PCM onde uma nota pode ser reproduzida. Note que o relógio mestre está em 22 unidades de tempo, que é o ponto de onde o som está sendo reproduzido atualmente, mas o espaço entre 22 e 30 unidades de tempo já foi preenchido com dados de onda e não pode mais ser gravado. Portanto, o primeiro lugar onde um novo evento MIDI com carimbo de data e hora pode ser programado para tocar é no tempo 30. Assim, o relógio de latência lê 30 unidades de tempo.
As mensagens podem ser agendadas para serem reproduzidas nesse tempo de latência ou a qualquer momento depois. Portanto, as mensagens que devem ser renderizadas imediatamente são marcadas com o tempo de latência (não a hora atual) antes de serem colocadas no buffer de entrada do sintetizador.