Это компилированные модули Pro Sound Maker, проект Дениса Дратова (Dexus). В середине 90-х был представлен в виде демоверсии. Через 10 лет проект был доработан, а формат компилированных модулей хорошо задокументирован (включая исходный код плеера).
Идеи в редакторе заложены интересные, но модулей написано не много: чуть более 50 (в основном за авторством Dexus, но есть несколько у Scratcher).
Также, как и в Sound Tracker, в списке позиций присутствует транспозиция. Однако скорость проигрывания уже как в SQ Tracker – свойство не всего модуля, а каждого паттерна (команда изменения скорости планировалась, но реализована не была).
Огибающие можно выставлять традиционно, но выбор возможных значений периода огибающих получается ограничен диапазонами 0x0000..0x00F0 (старший байт всегда равен нулю) и 0x0100..0x0F00 (здесь наоборот, младший байт всегда равен нулю), а можно и с автоподсчётом периода по частоте ноты (в т.ч. есть режим автоматического расчёта огибающих при каждой установке ноты).
Регулирование громкости канала сделано рационально (как в STP, SQT и GTR, см. описания этих форматов), т.е. без использования громоздкой таблицы или аналогичной сложной формулы.
Сэмплы и орнаменты могут быть не зациклены. При этом при зацикливании сэмпла предусмотрена возможность долгого затухания или нарастания амплитуды (такого больше нет ни в одном трекере).
Маски огибающих в сэмпле нет, но, поскольку громкость канала применяется к регистру амплитуды уже после установки бита огибающих, при определённых значениях громкости часть тиков может звучать с огибающей, а часть – без.
Ноты в описателе канала паттерна хранятся не как в других трекерах, а в виде относительных величин (подробно описано далее).
Смещение | Размер | Обозначение | Описание |
---|---|---|---|
+0 | 2 | PossPtr | Указатель на список позиций в порядке проигрывания. |
+2 | 2 | SamsPtr | Указатель на список сэмплов. |
+4 | 2 | OrnsPtr | Указатель на список орнаментов. |
+6 | 2 | PatsPtr | Указатель на список паттернов. |
+8 | 0..128 | Remark | Примечание. Во всех существующих модулях начинается с пяти байт "psm1" с завершающим нулём. Наличие продолжения примечания можно предположить по значению PossPtr. |
+PossPtr | ? | PosList | Список позиций (пары байт "паттерн:транспозиция"). Оканчивается байтом 0xFF, за которым следует второй байт: это либо позиция цикла, либо 0xFF – без зацикливания. |
+SamsPtr | ? | SamPtrs | Указатели на сэмплы. |
? | Samples | Сэмплы (описан ниже). | |
+OrnsPtr | ? | OrnPtrs | Указатели на орнаменты. |
? | Ornaments | Орнаменты (описан ниже). | |
+PatsPtr | ? | PatChanPtrs | Список из семибайтовых блоков (первый байт – скорость проигрывания, далее три слова – указатели на каналы A, B, C паттерна). |
? | PatChans | Каналы паттернов (описан ниже). |
Последовательность байт, оканчивающаяся на 0xFF.
Байт канала | Описание |
---|---|
0x00..0x5F | Вычислить номер ноты (описано ниже). При необходимости вычислить тип и период огибающей (описано ниже). Выйти. |
0x60 | Отключить звук. Выйти. |
0x61..0x6F | Установить сэмпл 0..14. |
0x70..0x8F | Установить орнамент 0..31. Запретить огибающие. |
0x90 | Выйти. |
0x91..0x9F | Установить громкость 1..15. |
0xA0 | Отключить орнаменты. |
0xA1..0xB0 | Разрешить огибающие вариант 2 (описано ниже), рассчитывать и устанавливать при каждой установке ноты (режим можно изменять 0xFA/0xFB). |
Разрешить огибающие вариант 1 (описано ниже), рассчитать и установить однократно (режим можно изменить 0xFB/0xFA). | |
0xB8..0xF8 | Пропускать с этого момента 1..65 строк (в авторской документации 1..64). |
Запомнить адрес следующего за этими четырьмя байта (для последующего возврата к этому месту) и продолжить анализ паттерна с адреса 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 | Однобайтовые тики орнамента по порядку. |