Полное описание формата компилированного модуля программы 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.