Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Innym zagadnieniem w czasie syntetyzatora jest opóźnienie, czyli różnica między bieżącym czasem a pierwszym momentem, w którym notatka może być odtwarzana. Komunikat MIDI nie może zostać przesłany do syntezatora i renderowany do buforu wyjściowego w bieżącym czasie próbki. Należy uwzględnić dane, które zostały już umieszczone w buforze, ale nie zostały jeszcze przesłane strumieniowo do urządzenia wyjściowego dźwięku.
W związku z tym odbiornik fal powinien zaimplementować zegar opóźnienia, który jest obiektem IReferenceClock (opisanym w dokumentacji zestawu Microsoft Windows SDK). Metoda IReferenceClock::GetTime zegara opóźnienia pobiera czas próbki, do którego dane zostały już zapisane w buforze, i konwertuje to na czas odwołania względem zegara głównego. Zlew fali wykonuje konwersje między czasem odniesienia a czasem próbkowania za pomocą metody IDirectMusicSynthSink::SampleToRefTime i IDirectMusicSynthSink::RefTimeToSample, więc w tym przypadku syntezator wywołuje metodę IDirectMusicSynthSink::RefTimeToSample w celu przeprowadzenia konwersji.
Czas opóźnienia jest kontrolowany przez odbiornik sygnału. Implementacja metody IDirectMusicSynthSink::GetLatencyClock powinna zwrócić wskaźnik do zegara opóźnienia, a ten wskaźnik musi zostać pobrany przez IDirectMusicSynth::GetLatencyClock. Aplikacja używa zegara opóźnienia, aby określić najwcześniejszy punkt w czasie, w którym komunikat MIDI może być w kolejce do odtwarzania, gdy jest przekazywany do syntezatora, wywołując metodę IDirectMusicSynth::P layBuffer .
Przykład opóźnienia komunikatu MIDI przedstawiono na poniższej ilustracji.
Na powyższej ilustracji zegar opóźnienia wskazuje na pierwsze miejsce w pętli buforu PCM, gdzie można odegrać dźwięk. Należy pamiętać, że zegar główny jest w 22 jednostkach czasu, co jest punktem, w którym dźwięk jest obecnie odtwarzany, ale przestrzeń między 22 i 30 jednostkami czasu została już wypełniona danymi falowymi i nie można już jej zapisać. Dlatego pierwszym miejscem, w którym można zaplanować do odtworzenia nowe wydarzenie MIDI ze znacznikiem czasowym, jest czas 30. W związku z tym zegar opóźnienia odczytuje 30 jednostek czasu.
Komunikaty mogą być odtwarzane w dowolnym momencie lub w dowolnym momencie po tym opóźnieniu. W związku z tym komunikaty, które mają być renderowane natychmiast, są oznaczane czasem opóźnienia (a nie bieżącym czasem) przed umieszczeniem w buforze wejściowym syntezatora.