Вам нужно хранить звуковые данные в памяти и иметь какую-то команду read (), которая заполняет массив байтов для отправки на звуковую карту. Команда read () должна отслеживать свое положение между операциями чтения, поэтому необходимо сохранить постоянный указатель. Вы проверите положение указателя и увидите, достиг ли вы конца или нет, и при необходимости вернетесь к началу.
Конечно, специфика будет зависеть от выбранного вами языка.
Я сделал это с Java, с добавленной возможностью воспроизведения на разных скоростях.
http://www.hexara.com/VSL/VSL2.htm
Это немного отстает. С тех пор как я это опубликовал, я многому научился, но пока не вернулся, чтобы исправить это. Программа запросит разрешение и попросит вас загрузить файл wav с вашего компьютера. Это должно быть 16 бит, стерео, 44100 кадров в секунду, little-endian.
Синтез WaveTable немного отличается тем, что в качестве исходных данных сохраняется и используется только одна итерация волны.
Вот краткое обсуждение с сайта CCRMA Стэнфорда:
https://ccrma.stanford.edu/~bilbao/booktop/node9.html
Я использовал этот метод, чтобы сделать Java "Термен"
http://www.hexara.com/VSL/JTheremin.htm
С помощью WaveTable вы выбираете размер массива. Если это степень 2, можно битовую маску указателя после каждого приращения, что быстрее, чем сравнение и сброс.