Полное описание формата компилированного модуля программы Sound Tracker ZX-Spectrum
Обновлено 07.12.2015
Формат файла STC программы Sound Tracker для ZX-Spectrum достаточно простой, по сравнению с другими трекерными форматами.
Структура STC файла:
Offset Size Name Description +0 1 Delay Глобальное число прерываний между нотами +1 2 Positions Pointer Указатель на таблицу Positions +3 2 Ornaments Pointer Указатель на таблицу Ornaments +5 2 Patterns Pointer Указатель на таблицу Patterns (длина всех паттернов одинаковая!) +7 18 Identifier Строка 'SONG BY ST COMPILE' либо другая информация +25 2 Size Длина всего блока в байтах (может быть некорректной) +27 99*X Samples Pointer Таблица Samples (Инструменты) по 99 байт на инструмент первый байт номер инструмента инструменты могут идти не по порядку, поэтому проверяем номер в первом байте сэмплов X=1-16 +27+99*X Data Остальные данные
Формат сэмпла (инструмента) «Таблица Samples»
Полная длина сэмпла = 99 байт (32 позиции * 3 + 1) Off Size Name Description +0 1 Sample Number номер сэмпла +1 32*3 Data данные сэмпла (по 3 байта на позицию) - байт 0 - биты 0-3 громкость, биты 7-4 четыре младших бита старшего байта смещения тона - байт 1 - - бит 7 маска шума (0 - включен, 1 - выключен) - бит 6 маска тона (0 - включен, 1 - выключен) - бит 5 +- определяет направление сдвига тона (1 - плюс к частоте, 0 - минус к частоте) - биты 0-4 значение шума - байт 2 - смещение тона (младший байт) +97 1 Repeat Position - с какой позиции начинать повтор сэмпла и орнамента (если равно нулю, канал отключается по завершении сэмпла) +98 1 Repeat Length - количество позиций в повторе
PS: если Repeat Length больше чем оставшихся позиций, то после 32-ой позиция переходит на первую
Формат орнамента «Таблица Ornaments»
Полная длина орнамента = 33 байта (32 позиции в орнаменте меняются синхронно сэмплу)
Off Size Name Description +0 1 Ornament Number номер орнамента +1 32byte Data данные орнамента (каждое значение равно 12 полутонам т.е. октаве, величина со знаком)
Формат паттерна
Значения внутри паттерна 0x00-0x5f - номер ноты (позиция завершается) 0x60-0x6f - номер инструмента (в таблице Samples) -0x60 нулевого инструмента нет, но можно на всякий случай заблокировать канал 0x70-0x7f - номер орнамента (в таблице Ornaments) -0x70 огибающая отключается при нулевом значении орнаменты отключаются 0x80 - команда R (пауза) (отключить канал, завершить позицию) 0x81 - пустая нота (позиция завершается) 0x82 - отключение огибающей и орнамента 0x83-0x8e - номер огибающей -0x80 (т.е. огибающие могут иметь номера 3 - 14) (следующий байт значение периода огибающей младший байт) орнаменты отключаются 0x8f-0xa0 - такие значение не должны присутствовать в паттерне (запас на возможные будущие версии) 0xa1-0xfe - значение задержки между нотами в канале (в прерываниях) -0xA1 0xff - конец паттерна
Формат блока паттернов «Таблица Patterns»
Каждая позиция занимает 7 байт
Off Size Name Description
+0 1 Number Порядковый номер паттерна
+1 2 Address Ch A Смещение для данных паттерна канала A
+3 2 Address Ch B Смещение для данных паттерна канала B
+5 2 Address Ch C Смещение для данных паттерна канала C
Формат блока позиций «Таблица Positions»
Указывают номера (последовательность) паттернов при проигрывании
Off Size Name Description +0 1 Count Общее число позиций в таблице +1 Count*2 Данные позиций по 2 байта, см. ниже
Каждая позиция занимает 2 байта
Off Size Name Description
+0 1 Transposition Глобальное смещение тона для паттерна
+1 1 PNum Номер паттерна для данной позиции
Частотная таблица для нот
static ushort[] ST_Table = { 0xef8, 0xe10, 0xd60, 0xc80, 0xbd8, 0xb28, 0xa88, 0x9f0, 0x960, 0x8e0, 0x858, 0x7e0, 0x77c, 0x708, 0x6b0, 0x640, 0x5ec, 0x594, 0x544, 0x4f8, 0x4b0, 0x470, 0x42c, 0x3f0, 0x3be, 0x384, 0x358, 0x320, 0x2f6, 0x2ca, 0x2a2, 0x27c, 0x258, 0x238, 0x216, 0x1f8, 0x1df, 0x1c2, 0x1ac, 0x190, 0x17b, 0x165, 0x151, 0x13e, 0x12c, 0x11c, 0x10b, 0x0fc, 0x0ef, 0x0e1, 0x0d6, 0x0c8, 0x0bd, 0x0b2, 0x0a8, 0x09f, 0x096, 0x08e, 0x085, 0x07e, 0x077, 0x070, 0x06b, 0x064, 0x05e, 0x059, 0x054, 0x04f, 0x04b, 0x047, 0x042, 0x03f, 0x03b, 0x038, 0x035, 0x032, 0x02f, 0x02c, 0x02a, 0x027, 0x025, 0x023, 0x021, 0x01f, 0x01d, 0x01c, 0x01a, 0x019, 0x017, 0x016, 0x015, 0x013, 0x012, 0x011, 0x010, 0x00f };
Особенности формата
Количество октав: 8
Количество позиций: 1-256
Количество паттернов: 1-32
Количество нот в паттерне: 1-64
Число инструментов (сэмплов): 16
Число орнаментов: 16
Возможность изменения громкости каждой ноты — нет
Возможность изменения длины каждого паттерна — нет
Возможность изменения скорости композиции при проигрывании — нет
Любое музыкальное произведение, написанное в «SOUND TRACKER», состоит из n-го количества отрезков (паттернов/PATTERN),
где n — величина, принимающая значения от 1 до 32. То есть в композиции не может быть больше 32 паттернов. Длина музыкального
произведения может быть от 1 до 256 позиций. Можно условиться, что позиция — это некая ячейка, в которую вставляется один из паттернов.
Вы можете, скажем, написать всего один паттерн и прокрутить его во всех возможных 256 позициях, т.е. 256 раз.
Каждый паттерн, в свою очередь, может содержать в себе от 1 до 64 нот. Длина паттерна задается для каждой композиции
один раз и одинакова для всех паттернов, составляющих эту композицию. Это, кстати, является одним из главных недостатков
«SOUND TRACKERа».
Еще два термина, используемые музыкантами, работающими в этом редакторе — SAMPLE (Сэмпл) и ORNAMENT (Орнамент).
Сэмпл — это тембровая окраска звука, которая определяется формой звукового сигнала, его амплитудными и частотными характеристиками.
Для удобства мы будем называть сэмпл инструментом.
Орнамент — это дополнительный частотный эффект, который изменяет звучание сэмпла, например, понижает или повышает высоту тона и т.д.
Сегмент — единичная составляющая каждого звука в редакторе.
Звук может состоять из n-ного количества сегментов, где n принимает значения от 1 до 32.