В настоящее время я работаю над очень простым синтезатором с волновой таблицей. Я постараюсь дать понятный обзор.
У меня есть один поисковый сигнал с 4096 точками, который сэмплируется аудиопотоком. Однако, как правило, один осциллятор имеет несколько волновых форм, которые можно трансформировать с помощью параметра position
. Например, возьмем две синусоиды, вторая из которых имеет половину периода первой. Когда мы воспроизведем их на frequency = 440Hz
и position = 0.5
, мы услышим два одинаково громких тона на частотах 440 Гц и 880 Гц. Вот ссылка на аудио (см. примечание 2).
Из соображений производительности я генерирую таблицу поиска в другом потоке всякий раз, когда изменяется параметр позиции. И в этом моя проблема. Даже когда я не меняю положение таблицы и просто периодически генерирую свою таблицу поиска, я получаю странные, непредсказуемые сбои. Поскольку аудиоданные в таблице при этом не меняются, могу объяснить это только разрывными считываниями. Это правильно? И если да, то как мне обойти это? Нужно ли использовать двойной буфер с атомарной подменой указателя после завершения генерации данных?
Опять же, вот аудио для этой записи (см. примечание 2). Также немного данных осциллографа:
Примечание 1. Заполнение моей таблицы поиска занимает ~50,000ns
без оптимизации и ~10,000ns
с оптимизацией. Но глюки вроде случаются с одинаковой вероятностью.
Примечание 2. Веб-сайт, на который я загрузил аудио, похоже, содержит некоторые странные гармоники, которые не слышны в моем видео. Просто чтобы вы знали.