Алгоритм Karplus Strong дает очень хороший синтез сорванной струны. Он также может быть закодирован в несколько строк C. Вы создаете круговой буфер с плавающей точкой (длина, пропорциональная длине волны, т.е. 1 / f), и заполняете его полным случайным шумом между -1 и 1.
Затем вы циклически проходите: каждый цикл, вы заменяете значение в текущем индексе на среднее из двух предыдущих значений и генерируете это новое значение.
index = (index+1) % bufSize;
outVal = buf[index] = decay * 0.5 * ( buf[index-1] + buf[index-2] );
Результирующий поток байтов дает вам звук. Конечно, это может быть сильно оптимизировано.
Чтобы звуковая волна стала влажной до 0,15 от ее первоначальной силы через одну секунду, вы можете установить затухание следующим образом:
#define DECAY_1S =.15
Float32 decay = pow(DECAY_1S, 1.0f / freq);
Примечание: вам нужно изменить размер исходного буфера так, чтобы он содержал один полный сигнал. поэтому, если вы хотите создать звук с частотой 441 Гц, а частота дискретизации составляет 44,1 кГц, вам необходимо выделить 100 элементов в буфере.
Вы можете думать об этом как о резонансной камере, чья основная частота составляет 441 Гц, изначально под напряжением, с энергией, рассеивающейся наружу из каждой точки в кольце одновременно. Волшебно, кажется, он организуется в обертоны основной частоты.
Может кто-нибудь опубликовать больше алгоритмов? Как насчет алгоритма для непрерывного тона?