Мне тут задавали вопросы, каким образом конвертируется музыка из Savage - расскажу немного.
Плеер by J.C.Brooke обязан своим качественным и богатым звучанием главному своему "сердцу" - циклу генерации. В игре Savage 2 этот цикл расположен по адресу E2C5. Характеристики у него следующие:
- 2 тональных канала
- частота дискретизации по каждому каналу - ~28.2кГц
- может генерировать прямоугольные сигналы
- для сигналов может задаваться частота и скважность. именно скважность, отличная от 2, дает особую тембровую окраску звукам Savage, по сравнению с AY.
- есть возможность плавного изменения частоты звука вниз (но не вверх)
- для каждого канала есть режим спецэффекта, который дополнительно усложняет генерируемый звук. Для каждого канала спецэффект разный.
Как известно, у бипера на спектруме имеется лишь один канал разрешением в один бит. Каким же образом генератор Savage смешивает два канала? Применяется простой принцип: однобитный сигнал генерируется независимо по каждому каналу, а на выход бипера оба сигнала подаются поочередно, через равные промежутки времени. То есть сигнал, подаваемый на бипер, имеет вид:
s1 s2 s1 s2 s1 s2 s1 s2
где s1 и s2 - отсчеты сигналов по каждому каналу.
Несмотря на простоту, этот принцип имеет прекрасное теоретическое обоснование. Спектр сигнала бипера в диапазоне частот от 0 до 14.1кГц является суммой спектров s1 и s2 (с небольшим сдвигом по фазе), что и дает идеальное восприятие смеси двух звуков. Подробнее об этом можно почтитать по тематике Polyphase components.
Параметры звука, которые генерирует описанный цикл, хранятся в регистрах Z80 во время его работы. Изменение этих параметров происходит по прерыванию. Таким образом, структура плеера Savage очень похожа на типичную структуру плеера на AY, с той разницей, что AY сам генерирует звук, а у Savage этим должен заниматься процессор в промежутках между прерываниями. Тут у Savage больше сходства с плеерами "цифровой" музыки на AY, такими как WTAW by ASC. В плеере Savage широко применяется индексная адресация, при этом в регистр IX помещается адрес структуры, в которой хранятся данные, относящиеся к одному из звуковых каналов, и вызывается подпрограмма, одинаковая для обоих каналов.
Кроме того, подпрограмма обработки прерываний в Savage воспроизводит шумовые эффекты (звук ударников). На это время работа основного генератора приостанавливается. Поэтому, чтобы не искажать темп мелодии, звуки ударников должны быть короткими. Обработка канала ударников в плеере очень похожа на обработку данных по двум тональным каналам.
Помимо высоты тона, скользящего тона, скважности и спецэффекта, которые реализует генераторный цикл, на уровне плеера каждая нота имеет еще и следующие параметры:
- орнамент. действие аналогично орнаментам в AY-музыках;
- вариация скважности. Действие этого механизма довольно сложное; я даже подозреваю, что автор плеера сам не до конца понимал, каким образом действует этот эффект. Не разобрался до конца и ASC, когда конвертировал музыку на AY в формат ASM.
Структура данных нот тоже похожа на AY-плееры. Для каждого канала имеется список одноканальных паттернов переменной длины. Данные каждого паттерна содержат ноты, длительность нот, либо команды изменения параметров звука (скважность, вариация скважности, орнамент, скользящая тональность, спецэффект, транспозиция). С применением транспозиции записаны ноты первого (басового) канала, когда для разной тональности баса вызывается один и тот же паттерн с разной транспозицией.
Вот так примерно... Относительно просто на первый взгляд. Каким именно образом моя программа конвертирует это все в многоканальные паттерны без транспозиции и с инструментами - расскажу в следующем выпуске