ASC

Введение

Это компилированные модули ASC Sound Master (Advanced Sound Master, ASM) версий 1.xx и 2.x, проект Андрея Сендетского (ASC).

Данный редактор появился в то время, когда широкую популярность уже успел получить Sound Tracker. Возможности ASM в сравнении с этим единственным конкурентом потрясали воображение музыкантов первой половины 90-х. Многие собирались вот-вот перейти на ASM, но реально сделали это совсем не многие.

Особенности редактора

Так какие же возможности манили музыкантов, а какие пугали настолько, что многие так и остались на Sound Tracker, а потом с энтузиазмом перешли на Pro Tracker, несмотря на то что всё это время существовал ASC Sound Master? Давайте разберёмся.

Прежде всего, ASM профессиональный и хорошо продуманный инструмент. Он на годы опередил по возможностям такой мощный редактор, как Pro Tracker 3.

На дворе 1992 год, а ASM уже имеет:

При этом сами сэмплы и орнаменты не простые (не говоря уже о том, что их и по количеству больше, чем в Sound Tracker). В сэмплах есть маска огибающих, нарастание/затухание громкости, накопление смещения частот тона, шума и огибающих. В орнаменте есть накопления отклонений как тона, так и шума.

Впечатляет даже сейчас, когда большинство музыкантов выбрало Pro Tracker 3 и до сих пор его использует в виде Vortex Tracker II. И впечатляет потому, что некоторые из возможностей ASM в PT3 так и не были реализованы (или реализованы хуже).

Но если всё так хорошо, почему ASM не заменил ST и уступил в популярности другим проектам?

Недостатки редактора:

Такие особенности, как медленный плеер компилированных модулей, искусственное ограничение по темпо (не ниже 3) или период огибающей без старшего байта к недостаткам (тем более, отпугивающим музыкантов) относятся вряд ли.

А вот отказ от TR-DOS (или хотя бы выбора возможности записи на ленту) в пользу своей файловой системы – это уже серьёзно. Нигде, кроме редактора, содержимое диска ни посмотреть, ни отформатировать, ни попытаться восстановить нечитаемое, ни сделать резервную копию. Риск потерять записанную музыку, не имея на руках привычных инструментов, которые есть под TR-DOS, вполне мог повлиять на популярность. Прежде чем писать музыку, нужно было подготовить диски специально для ASM и только для ASM, разобраться с форматированием и прочими тонкостями по работе с ними. Среднестатистическому программисту разобраться с этим не сложно, а вот простому музыканту, едва освоившему тот же ST и даже для компиляции прибегающего к помощи друга-кодера, это проблема. К сожалению, версии редактора, в которых энтузиасты научили работать ASM с TR-DOS, появились слишком поздно.

Мыслить одними накоплениями для создания сэмпла или орнамента тяжело любому человеку. Человек привык работать с абсолютными величинами, как в Sound Tracker. И хотя с накоплениями получаются красивые лаконичные решения, нужно изрядно повозиться, чтобы получилось то, что задумал, да ещё и корректно зациклилось, а не поплыло вниз или вверх. Компромиссное решение, реализованное в PT3, подходит многим: когда надо, используются накопления, когда нет, просто ставь отклонения тона и огибающих почти наугад – ничего никуда не поплывёт.

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

Структура компилированного модуля

Структуру ASC модуля можно назвать традиционной за небольшим исключением: смещения внутри структур (паттерны, сэмплы, орнаменты) хранятся не от начала модуля, а от начала этой структуры. Таким образом, можно перемещать или менять местами структуры, не пересчитывая внутри этих структур смещения.

СмещениеРазмерОбозначениеОписание
+01DelayНачальное минимальное число прерываний между соседними нотами
+11LoopPosПозиция в списке позиций, на которую зацикливается проигрывание
+22PatPtrs_PtrСмещение от +0 до таблицы PatPtrs
+42SamPtrs_PtrСмещение от +0 до таблицы SamPtrs
+62OrnPtrs_PtrСмещение от +0 до таблицы OrnPtrs
+81PosLst_LenКоличество позиций в списке позиций
+9PosLst_LenPosLstСписок позиций (номера паттернов в порядке проигрывания)
+PatPtrs_Ptr6*PatQtyPatPtrsТаблица смещений от +PatPtrs_Ptr до каждого PatChn – описатель канала в паттерне (описан ниже); PatQty – количество паттернов
+PatPtrs_Ptr+6*PatQty?PatChnsОписатели каждого PatChn
+SamPtrs_Ptr64SamPtrs32 смещения от +SamPtrs_Ptr до каждого Sam – сэмпл (описан ниже)
+SamPtrs_Ptr+64?SamsВсе Sam друг за другом
+OrnPtrs_Ptr64OrnPtrs32 смещения от +OrnPtrs_Ptr до каждого Orn – орнамент (описан ниже)
+OrnPtrs_Ptr+64?OrnsВсе Orn друг за другом

Структура описателя канала в паттерне PatChn

Канал описывается строкой из байтов, оканчивающихся 0xff. Паттерн состоит из трёх каналов (по одному смещению на канал до каждого описателя). Такой подход применён в большинстве трекеров, он позволяет не хранить в компилированном модуле одинаковые описатели каналов.

Далее приводится описание байтов в последовательности, в квадратных скобках указаны необязательные байты. Неописанные байты игнорируются.

БайтыОписание
0x00..0x55, [Env]Установить ноту. Инициализировать сэмпл и/или орнамент (если разрешено). Установить младший байт периода огибающей в Env (если включена). Выйти.
0x56..0x5dВыйти.
0x5eПрервать цикл сэмпла: доигрывание текущего цикла и переход к release (описано ниже). Выйти.
0x5fВыключить звук. Выйти.
0x60..0x9fС этого момента пропускать указанное количество строк (0..63). По умолчанию 0.
0xa0..0xbfУстановить сэмпл 0..31.
0xc0..0xdfУстановить орнамент 0..31.
0xe0Установить громкость канала 15. Включить огибающую.
0xe1..0xefУстановить громкость канала (1..15). Выключить огибающую.
0xf0, NoiseУстановить базу для периода шума.
0xf1Запретить инициализацию сэмпла в текущей строке паттерна.
0xf2Запретить инициализацию орнамента в текущей строке паттерна.
0xf3Запретить инициализацию сэмпла и орнамента в текущей строке паттерна.
0xf4, DelayУстановить новое значение скорости проигрывания (Delay в прерываниях).
0xf5, SlideУстановить величину изменения тона на прерывание для слайда вниз (Slide – число со знаком).
0xf6, SlideУстановить величину изменения тона на прерывание для слайда вверх (Slide – число со знаком).
0xf7, TicksПортаменто от предыдущей ноты в течение Ticks прерываний без переинициализации сэмпла . Расчёт идёт в долях единиц регистров периода тона с точностью до 1/16. Сразу же за этими байтами должен идти байт установки ноты (0x00..0x55).
0xf8Установить тип огибающей 8.
0xf9, TicksАналогично 0xf7, но с переинициализацией сэмпла.
0xfaУстановить тип огибающей 10.
0xfb, AmpDelayЗапустить периодическое увеличение или уменьшение амплитуды сэмпла на 1. В битах 0-4 период изменений в прерываниях (1..31), бит 5: 0 – увеличение; 1 – уменьшение.
0xfсУстановить тип огибающей 12.
0xfeУстановить тип огибающей 14.

Структура сэмпла Sam

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

Более того, сэмпл в ASC Sound Master с помощью таких флагов можно разбить на три части: attack (нажатие), loop (цикл), release (отпускание). Такое подход не реализован ни в одном другом трекере на ZX Spectrum (за исключение PSC).

Итак, сэмпл в ASC состоит из тиков по три байта на каждый, структура тика следующая:

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

Если в сэмпле не обозначен последний тик тела цикла, то сэмпл считается не зацикленным, он доиграет до последнего тика и замолчит.

Накопление амплитуды (из сэмпла и/или командой из трека) производится в диапазоне -15..+15 для того, чтобы гарантированно заглушить или максимизировать любую амплитуду в сэмпле.

Структура орнамента Orn

В орнаменте применён тот же подход маркировки тиков битовыми флагами. В отличие от сэмпла, бит перехода на цикл одновременно является маркёром последнего тика, поэтому его наличие обязательно. Каждый тик орнамента – два байта, его структура:

СмещениеОписание
+0Бит 7: 1 – данный тик является точкой зацикливания. Бит 6: 1 – данный тик является последним тиком орнамента. Биты 4–0 – накопление отклонения периода шума (старший бит – знаковый).
+1Накопление к смещению ноты в полутонах (число со знаком).

Авторская строка

В описании формата STP упомянуто о проблеме хранения авторской строки первых редакторов трекерной музыки на ZX Spectrum. Корни этой проблемы находятся в редакторе ASC Sound Master.

Появление редактора ASC Sound Master повлияло не только на ход мыслей программистов, обдумывавших свой проект музыкального редактора, но и в целом на многих рядовых пользователей. Появлению стереотипа о том, что плеер и модуль – одно целое, во многом поспособствовало то, что в ASC Sound Master при компиляции модуля к нему всегда дописывается и плеер. Как следствие такого подхода, многим показалось не противоречащим логике то, что строка о названии модуля и его авторе хранится в теле плеера.

Когда один и тот же плеер, отличающийся только авторской строкой, приклеен к каждому модулю, неизбежно наступает момент понимания, что это как минимум расточительно (если речь о коллекции модулей на дискете), а как максимум ограничивает возможности (если речь о попытке загрузить в ОЗУ компьютера некоторое количество модулей одновременно).

Применённые некоторыми решения приводили к проблемам – простое отрезание плеера делало модули ASM безымянными (что повторяло проблему Sound Tracker), а применение одного плеера для нескольких модулей в программе оставляло неразрешимым вопрос, к какому именно модулю относится авторская строчка в плеере.

Авторская строка внутри ASC

Исходная строка в плеере имеет фиксированный размер 63 байта, её структура следующая: "ASM COMPILATION OF <NAME> BY <AUTHOR>" (все пробелы важны, длина <NAME> такая же, как и <AUTHOR>, и равна 20-ти ASCII-символам, в результате положение тега " BY " фиксировано).

Автор Ay_Emul рассматривал несколько вариантов сохранения названия ASM модуля. Но вариант, предложенный автором спектрумовского риппера и проигрывателя музыки Pusher Ильёй Кудрявцевым из Ижевска (Himik's ZXZ), оказался наиболее оптимальным.

Для вставки строки в тело модуля ASC необходимо:

Благодаря описанному выше свойству смещений внутри структур ASC, модификации других указателей не требуется.

Готовые программные решения для вставки авторской строки в модуль

Для того чтобы вставить авторскую строку из плеера в тело модуля достаточно загрузить модуль с плеером в Ay_Emul и сохранить из плейлиста или прогнать через инструмент "Поиск модулей в файлах". В последнем случае сохранится два варианта: с тэгом и без.

Если вручную вытащить из плеера текст вида "ASM COMPILATION OF LET'S DANCE, BABY ! BY ANDREW SENDETSKI ASC", то можно вставить его в комментарий элемента плейлиста, а потом сохранить ASC из окна списка проигрывания, и, если в исходном файле ещё нет никакой строки, она будет вставлена.