Конвертация музыки Savage
Мне тут задавали вопросы, каким образом конвертируется музыка из 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-плееры. Для каждого канала имеется список одноканальных паттернов переменной длины. Данные каждого паттерна содержат ноты, длительность нот, либо команды изменения параметров звука (скважность, вариация скважности, орнамент, скользящая тональность, спецэффект, транспозиция). С применением транспозиции записаны ноты первого (басового) канала, когда для разной тональности баса вызывается один и тот же паттерн с разной транспозицией.
Вот так примерно... Относительно просто на первый взгляд. Каким именно образом моя программа конвертирует это все в многоканальные паттерны без транспозиции и с инструментами - расскажу в следующем выпуске :)
Как Тим Фоллин делал своё уникальное звучание на бипере спекки
Выкладываю сюда инфу, так как надеюсь на помощь автора темы Barmaley_m :v2_cheer: в разборе материала и в надежде на попытку дизассемблирования и конвертации хотя бы одного из треков. В числе страждущих не я один, а других методов, увы, не видно...
Цитата:
Tim Follin was a game music programmer for the ZX Spectrum between 1985 and 1987. He “programmed a single channel phase-shift routine, a three channel routine, and a five channel routine”
Тим Фоллин был программистом музыки для игр ZX Spectrum между 1985 и 1987. Он "написал одно канальную процедуру смещения фазы сигнала, трёх канальную и пяти канальную."
Цитата:
The five channel routine is described by Tim Follin himself in an interview in a ZX spectrum magazine, and in more detail in a post on an internet newsgroup below.
Пяти канальную процедуру описал сам Тим Фоллин в интервью журналу ZX spectrum и более детально в сообщениях новостной интернет группы ниже:
Цитата:
“It worked by using five of the Z80’s operators (C, D, E, H, L) in a loop, which were all counting down to 0. When they hit 0, I’d make a click at a certain volume (governed by the delay between switching the speaker on and off) and reset the operator to it’s original value. Every so many cycles of the loop, I’d jump out to change notes and things. To keep the speed up, it used self-modifying code, which meant that the main loop could just have simple commands like ‘set H to 110’, while the code outside the main loop changed the code inside the main loop by writing over it with the new values. The only draw back was that it sounded like a vacuum cleaner with nails stuck in it.”
(Comps.sys.sinclair newsgroup, 2000b)
Цитата:
“The program consisted of a tight loop, set to play for about 1/30th of a second, before breaking out to alter the parameters within the loop (writing directly over the code within the loop, to speed it all up). In the break, it also checked for things such as the break key, and played the drum ‘samples’. In the loop, I had three – or as many channels as it played counters (registers b, c, d, e, etc) counting down continuously until they reached zero, at which point it would switch the speaker on and off; the delay between the on and off controled the volume. This obviously meant that the delay between clicks had to be balanced by another delay loop, to keep the overall time the same, which obviously slowed the whole loop down quite a bit. But there you go! It worked... Sort of.”
(Comp.sys.sinclair newsgroup, 2000a)
Завтра попробую перевести всё остальное, а может кто-нибудь здесь более знаком с терминологией - давайте попробуем вместе.