Комментарии 4
Мне интересно, как вы реализовали преобразование последовательности пар (номер_такта, амплитуда) в сигнал частотой 44100 Hz. Ведь за один семпл звукового результирующего сигнала переключений может произойти несколько
Я не совсем понял вопрос, но попробую ответить.
Говоря о том, что сэмплы генерируются с с тем же темпом, что и процессор, я имел ввиду следующее. Я завел счетчик с периодом в тактах, равным 4194304/{частота дискретизации}, т.е. частота процессора деленная на частоту дискретизации. Он так же как и все остальные компоненты синхронизирован с процессором. Каждый его отсчет генерирует два сэмпла — для левого и правого уха. Звуковые каналы в процессе работы хранят свое выходное значение амплитуды — его я и забираю при каждом отсчете. Таким образом сэмплы накапливаются в буфер сэмплов, который потом вставляется в кольцевой буфер. Оттуда SDL забирает их на воспроизведение.
По сути, получается довольно грубая передискретизация (resampling).
Говоря о том, что сэмплы генерируются с с тем же темпом, что и процессор, я имел ввиду следующее. Я завел счетчик с периодом в тактах, равным 4194304/{частота дискретизации}, т.е. частота процессора деленная на частоту дискретизации. Он так же как и все остальные компоненты синхронизирован с процессором. Каждый его отсчет генерирует два сэмпла — для левого и правого уха. Звуковые каналы в процессе работы хранят свое выходное значение амплитуды — его я и забираю при каждом отсчете. Таким образом сэмплы накапливаются в буфер сэмплов, который потом вставляется в кольцевой буфер. Оттуда SDL забирает их на воспроизведение.
По сути, получается довольно грубая передискретизация (resampling).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Пишем эмулятор Gameboy, часть 3