PSM

Введение

Это компилированные модули Pro Sound Maker, проект Дениса Дратова (Dexus). В середине 90-х был представлен в виде демоверсии. Через 10 лет проект был доработан, а формат компилированных модулей хорошо задокументирован (включая исходный код плеера).

Идеи в редакторе заложены интересные, но модулей написано не много: чуть более 50 (в основном за авторством Dexus, но есть несколько у Scratcher).

Особенности формата

Также, как и в Sound Tracker, в списке позиций присутствует транспозиция. Однако скорость проигрывания уже как в SQ Tracker – свойство не всего модуля, а каждого паттерна (команда изменения скорости планировалась, но реализована не была).

Огибающие можно выставлять традиционно, но выбор возможных значений периода огибающих получается ограничен диапазонами 0x0000..0x00F0 (старший байт всегда равен нулю) и 0x0100..0x0F00 (здесь наоборот, младший байт всегда равен нулю), а можно и с автоподсчётом периода по частоте ноты (в т.ч. есть режим автоматического расчёта огибающих при каждой установке ноты).

Регулирование громкости канала сделано рационально (как в STP, SQT и GTR, см. описания этих форматов), т.е. без использования громоздкой таблицы или аналогичной сложной формулы.

Сэмплы и орнаменты могут быть не зациклены. При этом при зацикливании сэмпла предусмотрена возможность долгого затухания или нарастания амплитуды (такого больше нет ни в одном трекере).

Маски огибающих в сэмпле нет, но, поскольку громкость канала применяется к регистру амплитуды уже после установки бита огибающих, при определённых значениях громкости часть тиков может звучать с огибающей, а часть – без.

Ноты в описателе канала паттерна хранятся не как в других трекерах, а в виде относительных величин (подробно описано далее).

Формат модуля

СмещениеРазмерОбозначениеОписание
+02PossPtrУказатель на список позиций в порядке проигрывания.
+22SamsPtrУказатель на список сэмплов.
+42OrnsPtrУказатель на список орнаментов.
+62PatsPtrУказатель на список паттернов.
+80..128RemarkПримечание. Во всех существующих модулях начинается с пяти байт "psm1" с завершающим нулём. Наличие продолжения примечания можно предположить по значению PossPtr.
+PossPtr?PosListСписок позиций (пары байт "паттерн:транспозиция"). Оканчивается байтом 0xFF, за которым следует второй байт: это либо позиция цикла, либо 0xFF – без зацикливания.
+SamsPtr?SamPtrsУказатели на сэмплы.
SamPtrs[]?SamplesСэмплы (описан ниже).
+OrnsPtr?OrnPtrsУказатели на орнаменты.
OrnPtrs[]?OrnamentsОрнаменты (описан ниже).
+PatsPtr?PatChanPtrsСписок из семибайтовых блоков (первый байт – скорость проигрывания, далее три слова – указатели на каналы A, B, C паттерна).
PatChanPtrs[]?PatChansКаналы паттернов (описан ниже).

Канал паттерна

Последовательность байт, оканчивающаяся на 0xFF.

Байт каналаОписание
0x00..0x5FВычислить номер ноты (описано ниже). При необходимости вычислить тип и период огибающей (описано ниже). Выйти.
0x60Отключить звук. Выйти.
0x61..0x6FУстановить сэмпл 0..14.
0x70..0x8FУстановить орнамент 0..31. Запретить огибающие.
0x90Выйти.
0x91..0x9FУстановить громкость 1..15.
0xA0Отключить орнаменты.
0xA1..0xB0Разрешить огибающие вариант 2 (описано ниже), рассчитывать и устанавливать при каждой установке ноты (режим можно изменять 0xFA/0xFB).
0xB1..0xB7, EnvDivРазрешить огибающие вариант 1 (описано ниже), рассчитать и установить однократно (режим можно изменить 0xFB/0xFA).
0xB8..0xF8Пропускать с этого момента 1..65 строк (в авторской документации 1..64).
0xF9, AddrL, AddrH, CntЗапомнить адрес следующего за этими четырьмя байта (для последующего возврата к этому месту) и продолжить анализ паттерна с адреса Addr (подпрограмма). Cnt уменьшается при каждом входе в анализатор паттерна, как только обнулится, анализ продолжится с запомненного адреса. Команда так и не была реализована в компиляторе.
0xFAОтключить режим расчёта и установки огибающей при каждой установке ноты.
0xFBВключить режим расчёта и установки огибающей при каждой установке ноты.
0xFC, DelayИзменить скорость проигрывания (проект). Команда не была реализована ни в родном плеере, ни в компиляторе.

Вычисление номера ноты в анализаторе паттерна

Значение из паттерна (0..95) вычесть из номера предыдущей ноты паттерна, а если это первая, то от значения "транспозиция паттерна + 48"). Если полученный номер меньше нуля, увеличить его на 96.

В дальнейшем после применения орнамента проверить на выход из диапазона 0..95 (по количеству нот в таблице).

Вычисление типа и периода огибающей в анализаторе паттерна

Если огибающая установлена байтами 0xB1..0xB7 (вариант 1), то установить тип огибающей 8..14 соответственно, если EnvDiv <= 0xF0, установить старший байт периода огибающей в 0, а младший в EnvDiv, иначе установить младший байт огибающей в 0, а в старший – значение в битах 3–0 EnvDiv.

Если огибающая установлена байтами 0xA1..0xB0 (вариант 2), то значение битов 1–0 умножить на 2, добавить 8 и установить результат в тип огибающей, значение битов 3–2 умножить на 12, добавить номер ноты, уменьшать на 48 до тех пор, пока результат не будет в пределах [0..47], добавить 48 и использовать этот результат как индекс в таблице нот для установки обоих байтов периода огибающей.

Сэмпл

СмещениеОписание
+0Биты 7–6: величина изменения громкости в сэмпле (уменьшена на 1, если понижение громкости). Бит 5: направление изменения громкости в сэмпле (0 – повышение, 1 – понижение). Биты 4–0: длина сэмпла, уменьшенная на 1.
+1Биты 7–5: 0, если сэмпл не зациклен, 1–7 – количество повторов сэмпла до очередного изменения громкости в сэмпле. Биты 4–0: точка цикла.
+2Трёхбайтовые тики сэмпла по порядку. Каждый тик:
+0 Бит 7: маска шума. Бит 4: маска тона. Биты 3–0: амплитуда.
+1 Биты 7–3: период шума (используется только если шум разрешён маской). Биты 2–0: старшие биты накопления смещения периода тона (старший бит – знаковый).
+2 Младший байт накопления смещения периода тона. При выходе тона за границы диапазона 0..4095, тон устанавливается по соответствующей границе.

Орнамент

СмещениеОписание
+0Длина орнамента, уменьшенная на 1.
+1Бит 7: 1, если орнамент зациклен. Биты 4–0: точка цикла.
+2Однобайтовые тики орнамента по порядку.