Как и обещал, выкладываю перевод информации Тима Фоллина о кодировании 5-канальной музыки. Информация была проверена и подтверждена в ходе дизассемблирования плеера "Future Games". Итак,
Программа работает с испозованием 5 регистров Z80 (C, D, E, H, L) в цикле генерации, в течение которого все они уменьшаются до 0. Когда они обнуляются, я делаю щелчок на определенной громкости (которая зависит от задержки между моментом включения и моментом выключения спикера) и загружаю в регистры их изначальные значения. Через каждые 256 повторений цикла, я перехожу за его пределы, чтобы изменить ноты и эффекты. Чтобы добиться максимальной скорости, я использую модификацию кода в цикле генерации. Он содержит простые команды, к примеру ‘LD H,110’, в то время как код за пределами цикла генерации изменяет код внутри этого самого цикла путем записи поверх него новых значений [переменных]. Один лишь недостаток состоит в том, что все это звучит как пылесос, набитый гвоздями.
Уточнение Barmaley_m: звук формируется короткими импульсами, этим объясняется его характерный тембр.
Программа состоит из компактного цикла генерации, играющего примерно 1/30 секунды, после чего он прерывается, чтобы изменить параметры внутри него самого (записываются прямо поверх кода, для увеличения общей скорости работы). В момент прерывания программа также проверяет, не нажата ли клавиша, и играет спецэффекты. В цикле генерации имеется 3 или более переменных [счетчиков], в зависимости от количества каналов (регистры b, c, d, e, и пр.), уменьшающихся до тех пор, пока они не обнулятся. В этот момент спикер включается, либо выключается. Задержка между моментом включения и моментом выключения спикера определяет громкость. Очевидно, что пауза между щелчками должна регулироваться другим циклом задержки, чтобы полное время исполнения цикла в тактах оставалось неизменным. Также очевидно, что это замедляет весь цикл в целом на некую величину. Но всё получается! Это работает… Вроде.
Barmaley_m приводит следующие технические данные для Future Games music:
69 тактов занимает цикл при условии, что ни по одному из каналов не идет импульс;
выполняется цикл 256 раз;
частота дискретизации (на каждый канал) - 50724Гц;
время работы цикла - 1/198 секунды,
то есть 200 раз в секунду идут "прерывания";
я думаю, что рабочие частоты, которые воспроизводит этот цикл, не превышают пары кГц;
Это значит, что в среднем по каждому каналу идет не более 10 импульсов за один "блок" работы цикла.
Даже можно принять, что в целом по всем каналам идет 10 импульсов за один блок. Ну может 20.




Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
