Программистам - Формат Mod файлов. Описания формата стандартных MOD файлов, используемых в General Sound.

ZX Format #07
 Формат Mod-файла

music by MIDISOFT
(C) Stinger '& TP 1997
_

  1. Название_композиции 
  2. Заголовки_инструментов
  3. Таблица_позиций_и_информация_о_мо-
   дуле 
  4. Паттерны 
  5. Сэмплы 

   1. Название композиции

 Смещение   Длина

   +0 20
 Название композиции,  максимальная длина
20 символов. Если название состоит меньше
чем  из  20 символов, то оставшаяся часть
данного  поля  будет  заполнена двоичными
нулями.  Смещение  отсчитывается  относи-
тельно начала файла.

   2. Заголовки инструментов

 Здесь расположены последовательно 31 за-
головок, длина каждого заголовка 30 (#1E)
байт,т.е.  относительно начала файла сме-
щения заголовков будут
   следующими:
   Заголовок 1 - смещение +20 (#14)
   Заголовок 2 - смещение +50 (#32)
   . 
   Заголовок 31 - смещение +920 (#398)

 Приведенные  ниже смещения являются сме-
щениями относительно начала заголовка

 Смещение   Длина

   +0  22
 Название инструмента, максимальная длина
22  символа. Если название состоит меньше
чем  из  22 символов, то оставшаяся часть
данного  поля  будет  заполнена двоичными
нулями.
  +22 2
 Sample length-длина сэмпла (*). Значение
данного  поля  0  или  1  означает пустой
сэмпл  (т.е если  длина  сэмпла  в байтах
меньше или  равна  2,  то  сэмпл пустой).
Большее  значение  означает  реально при-
сутствующий сэмпл.
  +24 1
 Нижние  4 бита представляют собой значе-
ние настройки тона (Finetune) для сэмпла.
Значeние  лежит  в  пределах от -8 до +7.
Старшие  4 бита должны при чтении игнори-
роваться,  а при записи устанавливаться в
ноль.
 Байт: Значения настройки тона:

   x0  0
   x1 +1
   x2 +2
   x3 +3
   x4 +4
   x5 +5
   x6 +6
   x7 +7
   x8 -8
   x9 -7
   xA -6
   xB -5
   xC -4
   xD -3
   xE -2
   xF -1

 Одна  единица  настройки  тона равна 1/8
полутона,  т.е. с помощью этого параметра
можно опустить частоту звучания сэмпла на
полутон вниз или на 7/8 полутона вверх.
  +25 1
 Громкость инструмента по умолчанию. Зна-
чение   лежит  в  пределах  от  0  до  64
(#00..#40),  где  64  максимальная  гром-
кость,а 0 - минимальная.
  +26 2
 Repeat offset - начало точки  повтора  в
инструменте (*). Это смещение относитель-
но  начала  сэмпла. Данная величина имеет
смысл   если  длина  повторяющейся  части
(cмещение +28) больше нуля.
  +28 2
 Repeat length - длина повторяющейся час-
ти (*). Сэмпл является зацикленным в том,
и только том случае, если рассматриваемая
величина больше нуля. (*) Данные величины
измеряются  в  словах  и хранятся в стан-
дартном  для  Амиги  High-Endian формате,
поэтому для адекватной интерпретации дан-
ных  величин требуется произвести следую-
щие действия:

 а) переставить  старшую и младшую поло-
винки слова;
   б) умножить слово на два

   LD HL,(32768+20+22) ;Длина первого сэмпла в Амижных словах
   LD A,H ; (если модуль загружен по адресу 32768)
   LD H,L 
   LD L,A 
   ADD  HL,HL  ;  Теперь  получили  длину сэмпла в байтах

Сэмпл проигрывается следующим образом:
 1) если длина сэмпла меньше двух, то ни-
чего не проигрывается;
 2)  далее  анализируется длина повторяю-
щейся  части:  если  она  больше нуля, то
сэмпл  является зацикленным, а если равна
нулю,то незацикленным.
 3)   незацикленный  сэмпл  проигрывается
просто  от начала до конца, т.е. от Samp-
le_start_adress    до    Sample_start_ad-
ress+Sample_Length  (Sample_start_adress-
адрес начала сэмпла).
 4)  зацикленный  же  сэмпл проигрывается
более сложно:
в  начале играется от Sample_start_adress
до   Sample_start_adress   +  Repeat_off-
set+Repeat_Length,  а  затем до бесконеч-
ности  от Sample_start_adress+Repeat_off-
set  до Sample_start_adress + Repeat_off-
set+Repeat_Length. 

  3. Таблица позиций и инфор-
 мация о модуле

 Смещение   Длина

 +950(#3B6)   1
 Длина  композиции в позициях (Song Posi-
tions)  Значение лежит в пределах от 1 до
128
 +951(#3B7)   1
 Позиция, на которую плейер должен перей-
ти  по  окончании  проигрывания модуля. С
помощью этого можно зациклить модуль. Ес-
ли  это  значение  больше, чем количество
позиций, то плейер должен остановиться по
окончании  прoигрывания  модуля. Если мо-
дуль  зацикливать  не требуется, то реко-
мендуется записывать в данное поле значе-
ние 127.
 +952(#3B8) 128
 Таблица  позиций.  Длина таблицы от 1 до
128  (определяется  значением по смещению
+950)  Номер  позиции  являтся индексом в
таблице,  а  значение  в таблице по этому
индексу будет номером паттерна. С помощью
данной таблицы можно определить количест-
во паттернов в модуле. Для этого требует-
ся  найти в таблице максимальное значение
и добавить к нему единицу - это будет ко-
личеством паттернов.

Пример:
  (+950)= 6 длина композиции - 6 позиции.
  (+952)= 2,2,1,0,3,2,6,7 
   Позиция 1 - паттерн 3
   Позиция 2 - паттерн 3
   Позиция 3 - паттерн 2
   Позиция 4 - паттерн 1
   Позиция 5 - паттерн 4 << максимум
   Позиция 6 - паттерн 3
   В модуле четыре паттерна.

+1080(#438)   4
 Идентификатор  модуля, с помощью данного
поля  можно определить количество каналов
в  модуле. В случая отсутствия по данному
смещению   одного   из  нижеперечисленных
идентификаторов модуль скорее всего имеет
старый  тип и в нем 15 инструментов. (См.
"Формат  модуля  старого  типа")
   M.K. - 4 канала, наиболее  распростра-
 ненный идентификатор
-   M!K! - 4 канала, вероятно что в модуле
  будет более чем 64 паттерна.
   FLT4 - 4 канала
   FLT8 - 8 каналов
   OCTA - 8 каналов
-   xCHN - x каналов (x=4,6,8 ASCII code)
   xxCH - xx каналов (xx - ASCII codes)

Пример:
   4D 2E 4B 2E ("M.K.") - 4 канала
   31 32 43 48 ("12CH") - 12 каналов
   36 43 48 4E ("6CHN") - 6 каналов

 4. Паттерны.

 По  смещению  +1084  (#43C)  расположены
паттерны, в которых хранится нотный текст
произведения.  Количество паттернов опре-
деляется  следующим образом: просматрива-
ется вся таблица позиций ( смещение +952)
и  находится  наибольшее  значение в этой
таблице. Для того, чтобы найти количест-
во паттернов, к этому найденному значению
требуется прибавить единицу. Длина каждо-
го паттерна равна 256*Количество каналов,
т.е.  1K для 4 каналов, 2 Килобайта для 8
каналов  и т.д. (Количество каналов опре-
деляется  идентификатором модуля, смеще-
ние +1080) Hоты (нотные записи) в паттер-
не расположены следующим образом:
 Первая  нота  первого канала,первая нота
второго канала,.,первая нота последнего
канала,вторая  нота первого канала,вторая
нота второго канала, .,вторая нота пос-
леднего  канала  и т.д. до последней ноты
последнего канала.

 Формат нотной записи

 Каждая  нотная  запись  имеет  длину 4
байта, и состоит из следующих полей:

байт 1   байт 2   байт 3   байт 4

xSP P SE F 

S - номер инструмента
   P - период инструмента
   Е - номер эффекта
   F - параметр для эффекта
   x  -  неиспользуемые биты,при чтении
должны  игнорироваться,  при записи уста-
навливаться в ноль.
 Если  значение в поле S больше нуля,
то  в  канале  инициируется  проигрывание
инструмента  с  этим  номером.  Если этот
инструмент  является  пустым, то в канале
просто  ничего  не играется. (Пустой инс-
трумент  -  инструмент  с  нулевой длиной
сэмпла)
 Если  значение  поля P больше
нуля, то это означает, что сэмпл требует-
 ся проигрывать с частотой
8363*428/P, т.е.  столько байт
сэмпла в секунду будет выброшено в ЦАП.
 Для  того,чтобы  период  преобразовать в
ноту   и  обратно,используется  следующая
таблица:

╔═╤2═╗
 Нота      Значение   периода  для соответствующей ноты ╠═╪2═╣
║ │  C   C#  D   D#  E   F   F#  G   G#  A   A#  B  C1 - B1 856,808,762,720,678,640,604,570,538,508,480,453 C2 - B2 428,404,381,360,339,320,302,285,269,254,240,226 C3 - B3 214,202,190,180,170,160,151,143,135,127,120,113 ╚═╧2═╝



 5. Сэмплы.

 Hепосредственно за паттернами расположе-
ны  последовательно  сэмплы.  Если  длина
сэмпла  в байтах больше 2, то сэмпл физи-
чески присутствует в данной области. Если
же  сэмпл является пустым (байтовая длина
<=2),  то никакие данные в данную область
не записываются. Сэмплы записаны в знако-
вом  виде,т.е.  нулевой  уровень  сигнала
обозначается  как  +0 (#00), максимальный
положительный  уровень +127 (#7F), макси-
мальный  по  модулю отрицательный уровень
-128 (#80).
 Для  перевода  сэмпла  в беззнаковый вид
(пригодный  для непосредственной выдачи в
ЦАП)  требуется прибавить к каждому байту
сэмпла  128 (#80). В беззнаковом виде ну-
левой  уровень  сигнала  обозначается как
#80, максимальный положительный уровень
как #FF, а максимальный по модулю отрица-
тельный уровень как #00.
 В  некоторых  проигрывателях  первые два
байта сэмпла не проигрываются и использу-
ются  в служебных целях, поэтому рекомен-
дуется,  чтобы  первые два байта в сэмпле
  были #00 #00 (знаковый вид).
 _

 Формат Mod-файла старого типа

 Это изначальный формат Mod'ов,появивший-
ся  в 1988 году. Отличительные особеннос-
ти:  15  инструментов,  только  4 канала,
слабо распространен.

 Смещение   Длина

   +0 20
 Название  композиции, максимальная длина
20 символов.
   +20 30 Заголовок 1.
  +50 30 Заголовок 2.
   .
 +440 30 Заголовок 15.
 +470 1
 Длина композиции в позициях.
 +471 1
 Позиция, на которую плейер должен перей-
ти по окончании проигрывания модуля.
 +472 128 Таблица позиций.
 +6001024*n Паттерны, n штук.
 +x x
 Сэмплы.  (Смещение  +600+1024*Количество
паттернов)
(  The  original  Amiga SoundTracker song
format from 1988 by Karsten Obars
 _

  Kраткое описание эффектов

  0 - None/Arpeggio  8 - * NOT USED *
1  1 - Portamento Up  9 - SampleOffset
0  2 - Portamento Down    A - VolumeSlide
0  3 - TonePortamento B - PositionJump
  4 - Vibrato  C - Set Volume
2  5 - ToneP + VolSlide   D - PatternBreak
/  6 - Vibra + VolSlide   E - Misc. Cmds
  7 - Tremolo  F - Set Speed

Команды с кодом Е:

 E0 - Filter On/Off Е8 - * NOT USED *
/ E1 - Fineslide Up Е9 - Retrig Note
. E2 - Fineslide DownЕA - FineVol Up
3 E3 - Glissando Control ЕB - FineVol Down
, E4 - Vibrato Control   ЕC - NoteCut
- E5 - Set Finetune ЕD - NoteDelay
/ E6 - Patternloop ЕE - PatternDelay
0 E7 - Tremolo Control   ЕF - Invert Loop

_