Всегда интересовало, как несколько команд может генерировать такие сложные звуки, напоминающие музыку. Вот кусок кода из заставки Demon Stalker:
Код:
001046: mov #10000, @#177706
001054: mov #20, @#177712
001062: clr @#177710
001066: mov #3, r1
001072: inc r1
001074: mov #5000, r3
001100: bit r1, @#177710
001104: beq 001124
001106: mov #100, @#177716
001114: mov r1, r2
001116: sob r3, 001100
001120: br 001134
001122: nop
001124: clr @#177716
001130: mov r1, r2
001132: sob r3, 001100
001134: bit #100, @#177716
001142: bne 001072
Изучив код, я реализовал алгоритм на C, результат превзошел все ожидания: стереоэффект, звуки разной амплитуды, полифония, все это через ШИМ и благодаря сложению вычитанию и логическому И. Таймер оказался не нужен.
Подбирая значение decrement, можно менять характер "мелодии", а меняя начальное значение COUNT (05000) — темп.
Наверняка это какой-нибудь известный алгоритм из 70-х, однако я больше ни где с ним не сталкивался, если это не так — респект товарищу KV, надеюсь он меня простит.
Результаты работы генератора выложены на youtube:
Исходники генератора доступны на github: https://github.com/y-salnikov/ds_sound_sdl