Miracle #03
16 июля 1999

Кто там кодит? - Работаем с MS-DOS: Все о mod файлах - полное описание структуры mod-файла, а также описание всех эффектов.

<b>Кто там кодит?</b> - Работаем с MS-DOS: Все о mod файлах - полное описание структуры mod-файла, а также описание всех эффектов.
    (c) 1998 Anodyne
    -----------------

      ФОРМАТ MOD-ФАЙЛОВ
              И
ТЕХНОЛОГИЯ  ИХ ВОСПРОИЗВЕДЕНИЯ

     1.ОБЩИЕ ПОНЯТИЯ О MOD-ФОРМАТЕ 

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

         2.СТРУКТУРА MOD-ФАЙЛА 

    Имена   файлов  музыкальных  модулей
имеют  стандартные  расширения. Для MOD-
-формата  ими  являются  MOD, NST и M15.
Расширение  может  стоять  либо  в конце
имени  файла,  либо в начале, но может и
вовсе отсутствовать.

    MOD-файл  состоит  из  трех  частей:
заголовка,  паттернов и сэмплов. Сущест-
вует  также  понятие  песня (song) - это
модуль без сэмплов.

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

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

    При  проигрывании  композиции прохо-
дятся  все  строки  в каждом паттерне по
порядку.   Ноты,  находящиеся  на  одной
строке,  начинают  звучать одновременно;
через некоторое время, зависящее от тем-
па, происходит переход к следующей стро-
ке, и процесс повторяется.

    Каждая строка дополнительно разбива-
ется  на  кадры (frames), еще называемые
тиками  (ticks)  или  кварками (quarks).
Число  кадров  в  строке называется ско-
ростью (speed). Продолжительности кадров
в  одной строке равны и зависят от теку-
щего  темпа.  Нота,  если  она  указана,
начинает   звучать  в  начале  кадра  0.
В   промежутках  между  началами  кадров
звучание   не  меняется,  но  оно  может
менятся  в начале любого кадра под дейс-
твием эффектов.

    Элементы  в паттерне хранятся после-
довательно:  сначала все элементы первой
строки,  расположенные  по порядку кана-
лов,  затем все элементы второй строки и
т.д.   Размер  элемента  паттерна  равен
четырем байтам, а размер самого паттерна
зависит  от числа каналов. В каждом кон-
кретном модуле все паттерны имеют одина-
ковый  размер,  так  как число каналов в
модуле - константа.

           Формат элемента паттерна имеет следующий вид:
     
         байт 1   байт 2   байт 3   байт 4
        76543210 76543210 76543210 76543210 - номера битов
        ssssffff ffffffff aaaaeeee pppppppp
     
        ffff ffffffff - период, определяющий высоту ноты.
        ssss aaaa - номер сэмпла.
        eeee - эффект.
        pppppppp - параметр эффекта.

    В  байте  1  находится старшая часть
периода,  в  байте 2 - младшая. Эффект и
параметр принято обозначать шестнадцате-
ричными цифрами. Если период равен 0, то
нота отсутствует; аналогично, если номер
сэмпла  равен  0,  то  сэмпл  не указан.
Нумерация сэмплов начинается с 1. Эффект
не может отсутствовать, так как все зна-
чения номера эффекта от 0 до F обознача-
ют  какой-либо эффект. Но эффект 0 с па-
раметром  00 ни на что не влияет, поэто-
му  это значение можно рассматривать как
отсутствие эффекта.

    Ноты  в MOD-формате хранятся как пе-
риоды. Период определяет частоту выборки
для  сэмпла.  Частота F выборки в Герцах
вычисляется  по  формуле F=A/(период*2),
где  A - либо 7093789.2, либо 7159090.5.
Последнее значение используется наиболее
часто, хотя принципиально большой разни-
цы  между  этими значениями нет. Истори-
ческая  справка.  Период  в  MOD-формате
представляет собой значение, привязанное
к   архитектуре   компьютера  Amiga,  на
котором  появились  первые  трекеры, а с
ними  и  MOD-формат.  Неоднозначность  в
значении  A  объясняется  существованием
двух модификаций Amiga, в которых разли-
чалась частота синхросигналов. Все числа
в  MOD-файле  хранятся  в "тупоконечном"
(big-endian) формате - старший байт идет
первым,  так  как это родной формат про-
цессора Motorola 680x0, установленного в
Amiga.

    Периоды  одной  и той же ноты в MOD-
-файлах,  созданных  на разных трекерах,
могут  различаться. Это различие неболь-
шое  и  объясняется либо математическими
ошибками  создателей  трекеров,  либо их
отходом от равнотемперированной гаммы.

    Стандартно,  MOD-формат предусматри-
вает три октавы, имеющих номера 1,2 и 3.
Октаве  2  соответствует средняя октава.
Но  кроме стандартных могут быть нестан-
дартные  октавы с номерами 0 и 4. Нота C
средней  октавы  имеет  период  428,  ей
соответствует  частота выборки приблизи-
тельно 8363 Гц.

    В  музыкальных  модулях есть понятие
тонкий  тон  (finetune). В MOD-формате -
это восьмая часть полутона, т.е. полутон
разбивается на 8 частей по логарифмичес-
кой шкале, каждый тонкий тон больше пре-
дыдущего  в FT раз, где FT - корень сте-
пени 96 из 2 ( 96 = 12 * 8 ).

    Сэмплы  часто называют инструментами
для  MOD-формата  это одно и то же, но в
форматах   других  модулей  эти  понятия
различаются. Для получения звуков разной
частоты  из  одного  сэмпла используется
метод частотного сдвига (frequency shif-
ting) - каждой  ноте  соответствует своя
частота  выборки  сэмпла.  Использование
другого  метода  может  сильно  исказить
оригинальное звучание.

       Общая структура MOD-файла выглядит следующим образом:

    1)  заголовок,  его длина может быть
либо 600, либо 1084 байта, в зависимости
от количества сэмплов (см.ниже);

    2)  паттерны,  хранятся  по  порядку
номеров сразу после заголовка, начиная с
паттерна  0; так как размер паттерна для
конкретного  модуля - константа, то зная
номер паттерна легко рассчитать его сме-
щение в файле;

    3)  сэмплы,  идут по порядку номеров
сразу  за  последним  паттерном,  каждый
сэмпл  представляет собой сырую волновую
форму  из  знаковых  8-битовых  выборок;
первые   два   байта   в  каждом  сэмпле
зарезервированы  и  не предназначены для
хранения  выборок,  но, на практике, они
там всегда есть.

    Количество сэмплов в MOD-файле может
быть либо 15, либо 31. По этому критерию
все  MOD-файлы  делятся  на  два типа. В
модулях  с  15  сэмплами заголовок имеет
длину 600 байтов, в модулях с 31 сэмплом
1084 байта.

           В общем виде заголовок имеет следующий формат:

         1) имя песни (song name);
         2) дескрипторы сэмплов;
         3) длина песни в позициях;
         4) позиция зацикливания песни;
         5) таблица паттернов;
         6) сигнатура модуля.

     Рассмотрим эти поля более подробно.

    1.  Имя  песни.  Хранится в файле по
смещению  0  и  имеет  длину  20 байтов.
Является  строкой, заканчивающейся нуле-
вым  байтом,  но  может  занимать все 20
байтов.

    2. Дескрипторы  сэмплов. Их количес-
тво может быть либо 15, либо 31, в зави-
симости от того, сколько сэмплов в моду-
ле.  Дескрипторы хранятся по порядку но-
меров  сразу за именем песни, длина каж-
дого  дескриптора - 30 байтов. Таким об-
разом,  дескриптор  первого сэмпла нахо-
дится по смещению 20, дескриптор второго
- по  смещению 50 и т.д. Формат дескрип-
тора  (смещения даны относительно начала
дескриптора):

    a) Имя сэмпла. Смещение - 0, длина -
22  байта. Это строка с нулевым байтом в
конце, но может занимать все 22 байта.

    b)  Длина  сэмпла.  Смещение  -  22,
длина  -  2  байта.  Длина  сэмпла - это
слово  в  "тупоконечном" формате. Задает
количество  слов  в  сэмпле,  т.е.  если
умножить это значение на 2, то получится
длина  сэмпла  в  байтах.  В  это  число
входят  и  зарезервированные  2  байта в
начале  сэмпла. Но если длина сэмпла - 1
слово, то это означает полное отсутствие
сэмпла,  в области сэмплов в этом случае
2 байта не хранятся.

    c) Значение тонкого тона. Смещение -
24,  длина - 1 байт. Старший нибл всегда
равен  0,  в  младшем  хранится знаковое
число   от   -8   до   7.   Каждой  ноте
соответствует   своя   частота   выборки
сэмпла.   Но   для  каждого  конкретного
сэмпла   эта   частота  повышается  либо
понижается   на  заданное  число  тонких
тонов.  Например,  если значение тонкого
тона равно 2, то частота повышается на 2
тонких  тона; если значение равно -8, то
нота    играется    на   полутон   ниже.
Необходимость  тонких  тонов  связана  с
тем,  что  звук  может быть оцифрован на
частоте,  не  совпадающей  ни с одной из
нотных  частот.  С  помощью тонких тонов
это   можно  скорректировать,  например,
средний  A  имеет  частоту выборки 14093
Гц,  а  звук этой же высоты оцифрован на
частоте  14195  Гц; тогда понижаем ее на
один тонкий тон - получается стандартная
частота.

    d)  Громкость  сэмпла  по умолчанию.
Смещение  -  25,  длина  - 1 байт. Может
быть  в диапазоне от 0 до 64, 0 - полная
тишина,  64  -  максимальная  громкость.
Задается в линейной шкале.

    e)   Смещение  зацикливания  сэмпла.
Смещение  -  26,  длина  -  2 байта. Это
смещение  задается в словах относительно
начала сэмпла, включая зарезервированные
байты.    Имеет    смысл,   если   длина
повторяемой части больше единицы.

    f) Длина повторяемой части. Смещение
28,  длина  - 2 байта. Задает количество
слов    после   смещения   зацикливания,
которые  будут  проиграны.  После  этого
проигрывание  продолжается  со  смещения
зацикливания.  Если это значение равно 0
или 1, то сэмпл не зацикливается.

    3.  Длина песни в позициях. Смещение
относительно  начала  файла  - либо 470,
если в модуле 15 сэмплов, либо 950, если
31 сэмпл. Задается 1 байтом. Длина песни
в   позициях   -   количество  элементов
(позиций)  в  таблице паттернов, которые
относятся  к композиции. Может быть от 1
до 128.

    4.   Позиция   зацикливания   песни.
Смещение  относительно  начала  файла  -
либо 471, если в модуле 15 сэмплов, либо
951,  если  31 сэмпл. Задается 1 байтом.
Определяет  позицию зацикливания модуля,
с   которой   продолжится  проигрывание,
когда  модуль доиграется до конца. Может
принимать  значения от 0 до 127. Многими
трекерами  это  поле  не поддерживается,
так  как  для  зацикливания  есть  более
эффективные средства.

    5.   Таблица   паттернов.   Смещение
относительно  начала  файла  - либо 472,
если в модуле 15 сэмплов, либо 952, если
31  сэмпл. Представляет собой одномерный
массив   из   128   элементов  (позиций)
размером  1  байт. В каждой позиции хра-
нится номер паттерна. К композиции отно-
сятся  только первые позиции, количество
которых определяется длиной песни. Чтобы
узнать  количество  паттернов  в модуле,
надо просканировать эту таблицу (все 128
элементов!). Наибольшее значение, увели-
ченное  на 1, даст количество паттернов.
В  принципе,  в  модуле  могут находится
паттерны,  не  относящиеся к композиции.
О  максимально возможном количестве пат-
тернов см. ниже.

    6.  Сигнатура модуля. В модулях с 15
сэмплами  сигнатура отсутствует, поэтому
сразу  за таблицей паттернов по смещению
600 начинается первый паттерн. Сигнатура
есть  только в модулях с 31 сэмплом, где
она  находится  по  смещению  1080, имея
длину  4  байта.  Теоретически,  никаких
ограничений  на  это  поле  нет, - здесь
могут   находится   произвольные  четыре
байта.   Но  по  общепринятому  правилу,
сигнатура  -  это четыре ASCII-символа с
кодами от 32 до 127.

    По   сигнатуре   или  ее  отсутствию
определяется    количество   каналов   и
сэмплов   в  модуле.  По  смещению  1080
считываются  4  байта.  Для модулей с 15
сэмплами  по  этому  смещению  находится
элемент  первого паттерна, расположенный
в  строке  30  на  первом канале, первый
байт  этого  элемента  не больше 15 (см.
формат элемента паттерна). Для модулей с
31  сэмплом  первый  байт  сигнатуры  не
меньше  32.  Таким  образом определяется
количество   сэмплов  в  модуле,  а  для
модулей  с  15 сэмплами еще и количество
каналов - оно всегда равно

    7.   Если  в  модуле  31  сэмпл,  то
количество   каналов   определяется   по
сигнатуре.   Известными  на  сегодняшний
день сигнатурами являются:

        1) сигнатура 2CHN означает, что каналов 2;
        2) сигнатура M.K. , M!K! или FLT4 - 4 канала;
        3) сигнатура 6CHN - 6 каналов;
        4) сигнатура FLT8 , 8CHN или OKTA - 8 каналов;
        5) сигнатура вида <nn>CH задает число каналов равным nn,
           где  <nn> - две  ASCII-цифры, число nn - четное число
           от 10 до 32.

    В  Protracker'е сигнатура M.K. также
означала,   что   максимально  возможное
число  паттернов  в модуле не больше 64,
сигнатура  M!K! снимала это ограничение.
Но  Fast  Tracker II  сохраняет модули с
сигнатурами  M.K.,  <n>CHN  и  <nn>CH, в
которых  число  паттернов  может быть до
256.

    Двумя  главными  временными характе-
ристиками  в  MOD-формате  являются ско-
рость (speed) и темп - количество ударов
в  минуту  (beats  per  minute) или BPM.
Скорость - количество  кадров  в строке,
начальное  значение скорости - 6. В MOD-
-формате  один удар принимается равным 4
строкам  или 4*speed кадрам. Понятие ко-
личество  ударов в минуту не совсем кор-
ректно в MOD-формате, оно отражает дейс-
твительность только когда скорость равна
шести. Начальное значение BPM 125.

    Зная  BPM можно вычислить количество
кадров  в  секунду.  Количество кадров в
минуту  -  это  BPM*4*6,  а  в секунду -
BPM*4*6/60  или  BPM*2/5.  Длина  одного
кадра в секундах равна 5/(BPM*2).

  3.ПРИНЦИП ВОСПРОИЗВЕДЕНИЯ MOD-ФАЙЛОВ

    В  проигрывателе  для каждого канала
хранится  описание состояния канала. Оно
полностью описывает звучание канала. Со-
стояние  канала имеет следующие характе-
ристики:

        1) последняя использовавшаяся на канале нота;
        2) последняя использовавшаяся на канале частота выборки
           для сэмпла;
        3) текущая частота выборки для сэмпла;
        4) текущая громкость;
        5) количество выборок, оставшихся до конца сэмпла;
        6) длина повторяемой части сэмпла;
        7) смещение текущей выборки;
        8) смещение зацикливания;
        9) целая  и  дробная части значения, на которое увеличи-
           вается  смещение  текущей выборки, определяет текущую
           частоту выборки;
       10) дробная часть смещения в буфере, в который помещается
           сумма  выборок  сэмплов  со всех каналов, целая часть
           смещения глобальна для всех  каналов;
       11) указатель  на дескриптор последнего использовавшегося
           на канала сэмпла;
       12) последний использовавшийся на канале эффект и его па-
           раметр;
       13) значения по умолчанию параметров некоторых эффектов:
           a) параметр эффектов Portamento Up & Down;
           b) параметр эффекта TonePortamento;
           c) параметр эффекта Sample Offset;
       14) переменные, используемые при обработке эффектов:
           a) счетчики для эффектов Arpeggio, Note Cut, Note De-
              lay и Retrig;
           b) переменные для Vibrato: глубина, скорость, текущий
              указатель  в таблице волновой формы Vibrato, теку-
              щая  волновая  форма  Vibrato и указатель, надо ли
              играть  новую  ноту  с  начала волновой формы, или
              использовать  позицию,  оставшуюся  от  предыдущей
              ноты;
           c) переменные для Tremolo: глубина, скорость, текущий
              указатель  в таблице волновой формы Tremolo, базо-
              вая громкость Tremolo, текущая волновая форма Tre-
              molo  и  указатель,  надо  ли  играть новую ноту с
              начала  волновой  формы, или использовать позицию,
              оставшуюся от предыдущей ноты;
           d) номер сэмпла для эффектов Note Delay и Retrig;
           e) счетчик  и  номер  строки начала цикла для эффекта
              Pattern Loop.

    Перед  проигрыванием  текущая нота и
текущий номер сэмпла не заданы. Эффект и
его  параметр  нулевые, что эквивалентно
отсутствию  эффекта.  С  момента, как на
канале встретится нота или номер сэмпла,
они  будут  уже  всегда заданы. На одном
канале  в  каждый  момент  времени может
звучать только один сэмпл.

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

    Микшер    в   это   время,   работая
параллельно  с проигрывателем, микширует
сэмплы  и  подает  результат на звуковой
выход.  Микшер в своей работе использует
часть  характеристик  состояния  канала.
Работа   микшера  сводится  к  просмотру
структур, описывающих состояние каналов.
Если  на  канале  задан  сэмпл,  и он не
доиграл  до  конца, то из сэмпла берется
текущая  выборка  и  добавляется в сумму
текущих  выборок  со всех каналов. После
чего  указатель текущей выборки передви-
гается  на  следующую  позицию в сэмпле.
Оригинально, в MOD-формате звук из кана-
лов с номерами 1+4*n и 4+4*n выводится в
левый  звуковой выход, а звук из каналов
с номерами 2+4*n и 3+4*n - в правый, где
n - целое неотрицательное число, завися-
щее от числа каналов.

    После   того,  как  проигрыватель  в
начале  первого  кадра изменил состояния
каналов,  он  ждет  5/(BPM*2) секунд. По
прошествии этого времени начнется второй
кадр.  В  это  время  возможно изменение
состояния  каналов,  если  до этого были
заданы  соответствующие  эффекты.  Опять
ожидается,  пока не начнется новый кадр.
И  т.д. Когда пройдет число кадров, рав-
ное  текущей скорости, указатель текущей
строки перемещается на следующую, и про-
исходит  изменение  состояния  каналов в
соответствии с новыми нотами, сэмплами и
эффектами.

    Рассмотрим  влияние  ноты  и  номера
сэмпла  на  изменение  состояния канала.
Если  встречается  нота  при  незаданном
номере сэмпла или встречается номер сэм-
пла при незаданной ноте, то они сохраня-
ются  и  никаких  дальнейших действий не
происходит.

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

    Если  задана только нота, она стано-
вится текущей и происходит инициализация
информации о сэмпле.

    Если  задан  только номер сэмпла, то
проверяется не совпадает ли он с номером
текущего   сэмпла.  Если  совпадает,  то
инициализируется  только  текущая  гром-
кость.  Иначе  происходит полная инициа-
лизация информации о сэмпле.

    Кроме   ноты   и  номера  сэмпла  на
состояние канала влияют эффекты.

4.ЭФФЕКТЫ В MOD-ФОРМАТЕ
     
    Эффект - это некоторая команда прои-
грывателю.  Эффекты делятся на три груп-
пы:

        1) эффекты, влияющие на звучание сэмплов;
        2) эффекты, влияющие на порядок воспроизведения компози-
           ции;
        3) эффекты, влияющие на временные характеристики воспро-
           изведения.

    Одни эффекты имеют действие только в
начале кадра 0, другие - в начале любого
кадра.  Последние зависят от скорости, и
при  ее  изменении  звучание может стать
совсем другим.

    Эффект  задается  одной шестнадцати-
ричной   цифрой  и  имеет  параметр  XY,
задаваемый    двумя   шестнадцатиричными
цифрами.  В  одних  эффектах параметр XY
является   единым  целым,  в  других  он
разбивается  на  два  параметра:  X и Y.
Рассмотрим эффекты более подробно.
     
          ЭФФЕКТ 0. ARPEGGIO.
     
    На  самом деле этот эффект делает не
арпеджио,  а имитирует трезвучие с помо-
щью "очень быстрого" арпеджио. Параметры
X  и  Y  этого эффекта задают значение в
полутонах, на которое повышается текущая
играемая  нота.  Детально  этот  процесс
выглядит так:

        1) кадр 0 играется текущей нотой;
        2) кадр 1 играется  высотой,  равной высоте текущей ноты
           плюс X полутонов;
        3) кадр 2 играется  высотой,  равной высоте текущей ноты
           плюс Y полутонов;
        4) кадр 3 опять играется текущей нотой;
        5) и т.д. до последнего кадра в строке.

    На   этот   эффект  сильное  влияние
оказывает   скорость.   Например,   если
скорость  равна  1,  то эффект вообще не
проявится.
       
ЭФФЕКТ 1. PORTAMENTO UP.
     
    Повышает  высоту ноты в каждом кадре
на XY периодов:

        1) кадр 0 играется текущей нотой;
        2) кадр 1 играется  высотой,  равной высоте текущей ноты
           минус XY периодов;
        3) кадр 2 играется  высотой,  равной высоте текущей ноты
           минус XY*2 периодов;
        4) и т.д. до последнего кадра в строке.

    Если  текущая высота звука превышает
некоторый  порог,  то  действие  эффекта
автоматически отключается. При этом звук
либо  пропадает, либо останавливается на
максимуме. Это зависит от проигрывателя.

    Если   XY  =  00,  то  возможно  два
варианта:  либо высота не меняется, либо
берется последнее ненулевое значение XY,
использованное   в  эффектах  1  или  2.
Зависит от проигрывателя.

    Если  текущая высота звука F1 задана
в  Герцах,  легко вычислить, какая будет
высота звука F2 в Герцах после повышения
ее  на  XY  периодов:  текущая  высота в
периодах  -  P1=A/(F1*2),  высота  после
повышения, в Герцах, - F2=A/( P2*2), где
P2=P1-XY,  A  - это либо 7093789.2, либо
7159090.5 (см. выше).
    
       ЭФФЕКТ 2. PORTAMENTO DOWN.
     
    Аналогичен  повышающему  портаменто,
только  в этом эффекте высота, соответс-
твенно, понижается.
     
       ЭФФЕКТ 3. TONE PORTAMENTO.
     
    Портаменто  к  ноте.  Один  из  двух
эффектов (второй - эффект 5), у которого
параметром,  кроме  XY,  является  нота.
Нота,  указанная  рядом с этим эффектом,
не становится текущей, а запоминается, и
высота   звука   начинает  скользить  от
текущей  высоты к этой ноте со скоростью
XY периодов за кадр:

        1) кадр 0 играется текущей нотой;
        2) кадр 1 играется  высотой,  равной высоте текущей ноты
           плюс  или  минус  XY периодов, в зависимости от того,
           надо  ли понижать или повышать высоту, чтобы дойти до
           заданной ноты;
        3) кадр 2 играется  высотой,  равной высоте текущей ноты
           плюс или минус XY*2 периодов;
        4) и т.д.  до  того,  пока  не дойдем либо до последнего
           кадра в строке, либо до заданной ноты.

    Если  при  этом  эффекте  не указана
нота,  то берется последняя использовав-
шаяся  на  канале нота. Если XY = 00, то
берется последнее ненулевое значение XY,
использованное в этом эффекте.

    Если  при  этом эффекте указан номер
сэмпла,  то дальнейшее поведение зависит
от  проигрывателя. Рекомендуемый вариант
инициализировать   сэмпл.  Если  указана
нота-параметр,  она  становится  текущей
нотой,  и  эффект  при этом, фактически,
игнорируется.
     
           ЭФФЕКТ 4. VIBRATO.
     
    Вибрато со скоростью X и глубиной Y.
Вибрато   может   иметь   четыре  разные
волновые  формы:  синусоида, ниспадающая
пилообразная,   квадратная   (меандр)  и
случайная.

    Текущая   волновая   форма   вибрато
выбирается  эффектом  E4Y (см. ниже). На
случайную волновую форму никаких ограни-
чений  не накладывается, но практически,
это  периодически повторяющаяся последо-
вательность  из 64 чисел, распределенных
по равномерному закону.

    Глубина   Y   определяет   амплитуду
волновой  формы, которая линейно зависит
от   Y.   Если   Y  =  1,  то  амплитуда
минимальна;  если  Y  =  F, максимальна.
Высота звука будет колебаться в пределах
от  CF-Y*2  до  CF+Y*2,  где CF - высота
текущей ноты в периодах.

    X   определяет   скорость  изменения
высоты звука - она будет менятся на X/64
периода  за  кадр. Например, если X = 8,
то  полный период волновой формы вибрато
пройдется  за  8  кадров.  Высота  звука
обновляется   только  в  начале  каждого
кадра.

    На  практике этот эффект реализуется
следующим  образом.  Имеется  4 массива,
каждый  из 64 элементов. В этих массивах
хранятся  4  волновые формы, одна из них
является   текущей.   Состоянием  канала
определяется текущий индекс в массиве. В
начале  каждого  кадра строки, в которой
действует   этот   эффект,   к  текущему
индексу  прибавляется X, полученное зна-
чение становится новым текущим индексом,
по которому из массива считывается число
от -1 до 1,  умножается на Y*2 и прибав-
ляется к высоте текущей ноты в периодах.
Текущий  индекс всегда берется по модулю
64.

    Пусть i - текущий индекс, VibratoWa-
veform - массив  текущей  формы вибрато.
Тогда по шагам это выглядит так.

        1) кадр 0 играется высотой текущей ноты (CF периодов);
        2) в начале кадра 1: i = ( i + X ) mod 64  и  установить
           текущую высоту звука = CF+VibratoWaveform[i]*Y*2;
        3) в начале кадра 2: i = ( i + X ) mod 64  и  установить
           текущую высоту звука = CF+VibratoWaveform[i]*Y*2;
        4) и т.д. до последнего кадра в строке.

    Если  в следующей строке идет эффект
вибрато   с  указанием  новой  ноты,  то
возможно   два  варианта:  либо  текущий
индекс обнуляется в начале кадра 0, либо
нет.    В   последнем   случае   вибрато
продолжится с того места волновой формы,
на котором оно остановилось в предыдущий
раз.  Обнулять  (retrig) текущую позицию
волновой  формы  для  вибрато  или  нет,
определяется эффектом E4Y.

    Если  X  =  0  или Y = 0, то берутся
последние  ненулевые  значения  X  и  Y,
которые использовались в вибрато.
     
ЭФФЕКТ 5. TONE PORTAMENTO+VOLUME SLIDE.
     
    Этот  эффект - комбинация эффектов 3
(портаменто  к  ноте)  и  A  (скольжение
громкости,  см.  ниже).  Параметр  XY  в
эффекте    5    относится   эффекту   A.
Параметром   XY   для  эффекта  3  будет
последнее  значение,  использовавшееся в
эффекте  3;  нотой-параметром, если нота
не  указана,  будет последняя нота-пара-
метр.

    Если  вместе  с  эффектом  5 указана
нота  или  сэмпл, то дальнейшее звучание
зависит  от проигрывателя. Рекомендуемое
поведение  -  ноту и сэмпл рассматривать
как параметры эффекта 3.

    Пусть  SetPortaNote(note,  sample) -
функция,   обрабатывающая  в  эффекте  3
указанные вместе с ним ноту и сэмпл. Она
проверяет, указана ли нота; если нет, то
берется   последняя  использовавшаяся  в
эффекте   3  или  5  нота.  Эта  функция
работает  так, как описано в разделе про
эффект 3.

    Функция TonePortamento(XY_3) обраба-
тывает эффект 3. Параметр XY_3 - послед-
нее значение, использовавшееся в эффекте
3. Функция VolumeSlide(XY_A) обрабатыва-
ет  эффект  A, ее параметр - указанный с
эффектом 5 XY. Тогда обработка эффекта 5
выглядит так:

        1) в   начале   кадра  0  вызывается  SetPortaNote(note,
           sample); кадр 0 играет с текущей нотой и громкостью;
        2) начало  кадра 1 - вызывается  TonePortamento(XY_3)  и
           VolumeSlide(XY_A);
        3) начало  кадра 2 - вызывается  TonePortamento(XY_3)  и
           VolumeSlide(XY_A);
        4) и т.д. до последнего кадра.
     
   ЭФФЕКТ 6. VIBRATO + VOLUME SLIDE.
     
    Этот  эффект - комбинация эффектов 4
(вибрато)  и  A  (скольжение громкости).
Параметр XY в эффекте 6 относится эффек-
ту A.  Параметром XY для эффекта 4 будет
последнее  значение,  использовавшееся в
эффекте 4.

    Пусть  функция Vibrato(XY_4) обраба-
тывает эффект 4. Параметр XY_4 - послед-
нее значение, использовавшееся в эффекте
4. Функция VolumeSlide(XY_A) обрабатыва-
ет  эффект  A, ее параметр - указанный с
эффектом 6 XY. Тогда обработка эффекта 6
выглядит так:

        1)  кадр 0 играется текущей нотой и громкостью;
        2)  начало  кадра  1 - вызывается Vibrato(XY_4) и Volume
    Slide(XY_A);
        3)  начало  кадра  2 - вызывается Vibrato(XY_4) и Volume
    Slide(XY_A);
        4)  и т.д. до последнего кадра.
     
           ЭФФЕКТ 7. TREMOLO.
     
    Тремоло со скоростью X и глубиной Y.
Тремоло   может   иметь   четыре  разные
волновые  формы, такие же как у вибрато:
синусоида,   ниспадающая   пилообразная,
квадратная и случайная.

    Эффект  тремоло заставляет громкость
колебаться   в  пределах  от  CV-Y*4  до
CV+Y*4  единиц громкости, где CV - теку-
щая громкость. Если громкость выходит за
границы от 0 до 64, то она обрезается.

    Скорость  X  имеет тот же смысл, что
скорость    в   вибрато.   Для   тремоло
используются  те  же  таблицы, что и для
вибрато. Для назначения текущей волновой
формы  тремоло  служит  эффект  E7Y.  По
кадрам этот эффект работает так:

        1)  кадр 0 играется текущей громкостью (CV);
        2)  в начале кадра 1: i = ( i + X ) mod 64  и установить
    текущую высоту звука = CV+TremoloWaveform[i]*Y*4;
        3)  в начале кадра 2: i = ( i + X ) mod 64  и установить
    текущую высоту звука = CV+TremoloWaveform[i]*Y*4;
        4)  и т.д. до последнего кадра в строке.

    Обнулять  (retrig)  текущую  позицию
волновой формы для тремоло, если указана
нота,   или   нет,   определяется  также
эффектом E7Y.

    Если  X  =  0  или Y = 0, то берутся
последние  ненулевые  значения  X  и  Y,
которые использовались в тремоло.
     
             ЭФФЕКТ 8. PAN.
     
    Баланс.  Оригинально,  в MOD-формате
не  было  этого  эффекта,  он появился в
более поздних трекерах.

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

    В интерпретации параметра существует
неоднозначность.   Первоначально  эффект
баланса  был введен в Dual Mod Player by
Otto  Chrons.  Там  параметр  XY означал
следующее:

        1) XY = 00 - звук целиком идет в левый выход;
        2) XY = 40 - звук в одинаковой степени идет и в левый, и
           в правый выходы;
        3) XY = 80 - звук целиком идет в правый выход.

    Промежуточные значения соответствен-
но  регулируют баланс. Кроме этого, зна-
чение  XY  =  A4  делает  mono  surround
(монофонический   звук   вокруг),   т.е.
выводит   звук  одинаковой  громкости  в
левый  и  правый  каналы,  но  на  одном
канале звук инвертируется.

    В  Fast Tracker ][ и Impulse Tracker
интерпретация XY немного другая:

        1) XY = 00 - звук целиком идет в левый выход;
        2) XY = 7F..80 - звук  в  практически одинаковой степени
           идет и в левый, и правый выходы;
        3) XY = FF - звук целиком идет в правый выход.

ЭФФЕКТ 9. SAMPLE OFFSET.
     
    Этот   эффект   заставляет   звучать
сэмпл,  начиная  со  смещения, которое в
шестнадцатиричном виде выглядит как XY00
байтов. Эффект действует после того, как
обработаны  нота и номер сэмпла, изменяя
указатель  на  текущую выборку в сэмпле.
Если  смещение превосходит длину сэмпла,
то  оно  урезается  до  него. Необходимо
учитывать,  что  если сэмпл зациклен, то
он  должен зацикливаться. При этом может
быть,  что  длина  сэмпла  больше  суммы
смещения   зацикливания   и  повторяемой
части,  и  смещение в эффекте 9 попадает
за  границу  этой  суммы.  В этом случае
сэмпл     доигрывает    до    конца    и
зацикливается.

    Если  XY  = 00, то берется последний
ненулевой параметр этого эффекта.
     
ЭФФЕКТ A. VOLUME SLIDE.
     
    Скольжение громкости вверх или вниз.
В  параметре XY либо цифра X, либо цифра
Y,  но  не  обе  сразу должны быть равны
нулю,  иначе  параметр  недействителен и
эффект игнорируется.

    Если  нулю  не равна X, то громкость
скользит   вверх;   если   Y,  то  вниз.
Громкость  повышается/понижается  на max
(X,Y) единиц громкости каждый кадр:

         1) кадр 0 играется текущей громкостью;
         2) в начале кадра 1:  если X<>0, то CV=CV+X; если Y<>0,
    то CV=CV-Y;
         3) в начале кадра 2:  если X<>0, то CV=CV+X; если Y<>0,
    то CV=CV-Y;
         4) и т.д. до последнего кадра в строке.

    Если  громкость  выходит  за пределы
интервала [0,64], она обрезается.
     
ЭФФЕКТ B. POSITION JUMP.
     
    Прыгнуть  на  позицию  XY  в таблице
паттернов.  После  того,  как  строка, в
которой стоит этот эффект, доигрывает до
конца,   проигрывание   продолжается   с
первой  строки  паттерна  из позиции XY.
Надо   следить,   чтобы   не   произошло
выпрыгивание за пределы композиции.

    Если  в строке встречается несколько
эффектов   B,   то   учитывается  только
последний.

    Это   первый   из   трех   эффектов,
влияющих   на   порядок  воспроизведения
композиии.  О  совместном  действии этих
эффектов см. ниже.

         ЭФФЕКТ C. SET VOLUME.

    Меняет  текущую  громкость сэмпла на
канале.  Параметр  XY может быть от 0 до
40  (от 0 до 64 в десятичном виде). Если
он больше 40, то принимается равным 40.


ЭФФЕКТ D. PATTERN BREAK.

    Прервать  паттерн.  Это единственный
эффект,  у которого параметр XY является
десятичным  числом,  т.е.  X  и Y должны
быть десятичными цифрами.

    Строка,  в  которой  встретился этот
эффект,    доигрывает    до   конца,   и
дальнейшее  проигрывание  идет со строки
XY паттерна в следующей позиции.

    Если  XY превышает 63, то перепрыги-
вание  производится  на строку 0. Если в
XY   есть  шестнадцатиричные  цифры,  то
обработка  эффекта D зависит от проигры-
вателя.   В  этом  случае  рекомендуется
рассматривать  XY  как шестнадцатиричное
число.

    Если  в строке встречается несколько
эффектов   D,   то   учитывается  только
последний.  Это второй из трех эффектов,
влияющих   на   порядок  воспроизведения
композиии.  О  совместном  действии этих
эффектов см. ниже.

               ЭФФЕКТ E.

    Этот  эффект  имеет  16 подэффектов,
определяемых параметром X. Эти подэффек-
ты  можно рассматривать как эффекты вида
EX с параметром Y.

         ЭФФЕКТ E0. SET FILTER.

    Включает  (Y = 0) или выключает (Y =
1)  фильтр  верхних  частот  на звуковом
выходе.  Этот эффект использует аппарат-
ный  фильтр  на  Amiga,  и, практически,
больше нигде не реализован.

    ЭФФЕКТ E1. FINE PORTAMENTO UP.

    Тонкое  повышающее портаменто. Повы-
шает текущую высоту звука на Y периодов,
это  делается  только  в начале кадра 0.
Если  с  этим  эффектом указана нота, то
она сразу играется на повышенной высоте.

    Также,   как  для  портаменто,  надо
следить,   чтобы  частота  не  вышла  за
определенные границы.

    ЭФФЕКТ E2. FINE PORTAMENTO DOWN.

    Тонкое понижающее портаменто. Анало-
гично  эффекту E1, только в этом эффекте
высота, соответственно, понижается.

     ЭФФЕКТ E3. GLISSANDO CONTROL.

    Включает  (Y = 1) или выключает (Y =
0)   глиссандо  для  портаменто  к  ноте
(эффект  3).  Глиссандо - портаменто  по
полутонам.  Когда  оно  включено, высота
звука   при   использовании   эффекта  3
меняется  по  полутонам.  Параметр  XY в
эффекте 3 сохраняет смысл, только теперь
частота выборки сэмпла будет обновляться
тогда,  когда  текущая  высота  звука  в
периодах  повысится/понизится до следую-
щего полутона.

    Во  многих  трекерах  этот эффект не
реализован,  его нет в Scream Tracker 3,
Fast Tracker ][ и Impulse Tracker.

      ЭФФЕКТ E4. VIBRATO WAVEFORM.

    Назначает волновую форму для вибрато
и   определяет,   надо   ли   сбрасывать
(retrig)  на  начало  указатель  текущей
позиции  в  волновой  форме  каждый раз,
когда   встречается   эффект  вибрато  с
указанием  ноты, или продолжать эффект с
того  места  в  форме,  на  котором было
остановлено    выполнение    предыдущего
вибрато.   Это   задается  параметром  Y
следующим образом:

        1) Y = 0 - выбрать синусоиду, указатель сбрасывается;
        2) Y = 1 - выбрать ниспадающую  пилообразную форму, ука-
           затель сбрасывается;
        3) Y = 2 - выбрать квадратную форму, указатель сбрасыва-
           ется;
        4) Y = 3 - выбрать случайную  форму, указатель сбрасыва-
           ется;
        5) Y = 4 - выбрать синусоиду, указатель не сбрасывается;
        6) Y = 5 - выбрать  ниспадающую пилообразную форму, ука-
           затель не сбрасывается;
        7) Y = 6 - выбрать  квадратную форму, указатель не сбра-
           сывается;
        8) Y = 7 - выбрать случайную форму, указатель не сбрасы-
           вается.

    Одни трекеры не поддерживают случай-
ную  форму  (например, Fast Tracker ][);
другие   (Scream  Tracker  3  и  Impulse
Tracker) всегда сбрасывают указатель.

ЭФФЕКТ E5. SET FINETUNE.

    Устанавливает   тонкий  тон  сэмпла,
который   является  текущим  на  канале,
равным Y. Параметр Y рассматривается как
знаковое  число  в  форме  дополнения до
двух,   т.е.   8=-8,  9=-7,  ...,  F=-1.
Значение  Y  перезаписывает  тонкий  тон
сэмпла в дескрипторе сэмпла.

    Редко  встречаемый эффект, но тем не
менее  поддерживаемый почти всеми треке-
рами.  Он не реализован только в Impulse
Tracker.

ЭФФЕКТ E6. PATTERN LOOP.

    Это   последний  из  трех  эффектов,
влияющих на порядок воспроизведения ком-
позиии. Сначала отмечается начало цикла,
это  делается указанием E60, т.е. Y = 0.
Когда встречается этот эффект с парамет-
ром  Y<>0  на  том  же  канале, делается
переход на строку с предшествующим E60 и
так повторяется Y раз.

    Эффекты   Position  Jump  и  Pattern
Break  действуют  совместно, если встре-
чаются  в  одной  строке.  Если  в одной
строке  с  эффектами  Position  Jump или
Pattern Break встречается эффект Pattern
Loop,  то он имеет более высокий приори-
тет над ними.

    Эффект  Pattern  Loop имеет действие
только  на  том  канале,  на  котором он
указан,  т.е. эффекты, указанные на раз-
ных  каналах, действуют параллельно. Так
это  выглядит в идеале, тонкости зависят
от проигрывателя.

    Вложенные  циклы на одном канале как
правило  не  допускаются,  и если подряд
идут  E60, то учитывается только послед-
ний.  Если  встречается  E6Y, у которого
Y<>0, без парного E60, он игнорируется.

    Некоторые   проигрыватели,  если  на
канале  не встречается парного E60, ищут
его  на  другом  канале.  Например,  так
делает Fast Tracker ][.

      ЭФФЕКТ E7. TREMOLO WAVEFORM.

    Этот    эффект   назначает   текущую
волновую  форму  для тремоло. Параметр Y
аналогичен   параметру  эффекта  Vibrato
Waveform.

      ЭФФЕКТ E8. 16 POSITION PAN.

    Баланс  на  16  позиций.  Также, как
эффект  8,  не является стандартным MOD-
-эффектом   и  поддерживается  немногими
трекерами, так как его можно заменить на
эффект  8. Параметр Y может быть от 0 до
F:

        1) Y = 0 - вся громкость на левом выходе;
        2) Y = F - вся громкость на правом выходе;

ЭФФЕКТ E9. RETRIG NOTE.

    Сбросить ноту на начало, т.е. заново
установить   текущий   сэмпл  на  начало
звучания.  Параметр  Y задает количество
кадров,  через которые будет происходить
сброс:

        1) кадры  от  0 до Y-1 играются текущей нотой и сэмплов,
           эффект здесь не действует;
        2) в  начале  кадра  Y  нота  сбрасывается  и продолжает
           играть с начала;
        3) в  начале  кадра Y*2  нота сбрасывается  и продолжает
           играть с начала;
        4) и т.д. до последнего кадра в строке.

    Если  Y  =  0,  то  обработка  этого
эффекта зависит от проигрывателя. Напри-
мер, его можно игнорировать.

    ЭФФЕКТ EA. FINE VOLUME SLIDE UP.

    Тонкое  скольжение  громкости вверх.
Параметр Y задает на сколько увеличивать
громкость  в  единицах  громкости.  Этот
эффект  действует в начале кадра 0, т.е.
перед   тем,  как  зазвучать,  громкость
текущей   ноты   будет   повышена.  Надо
следить,  чтобы  громкость  не превысила
значение 64.

   ЭФФЕКТ EB. FINE VOLUME SLIDE DOWN.

    Тонкое  скольжение  громкости  вниз.
Аналогичен  эффекту EA, только громкость
уменьшается.

          ЭФФЕКТ EC. CUT NOTE.

    Обрезать ноту. Текущая нота звучит в
течение  кадров  0, ..., Y-1, а в начале
кадра  Y  ее громкость устанавливается в
0.

         ЭФФЕКТ ED. NOTE DELAY.

    Задержать  ноту. В течении кадров 0,
...,  Y-1  звук на канале пропадает, а в
начале  кадра  Y  текущий сэмпл начинает
играть с начала текущую ноту.

       ЭФФЕКТ EE. PATTERN DELAY.

    Задержать проигрывание текущей стро-
ки. Строка проиграется за время, которое
бы   понадобилось   для   проигрывания Y
строк. Этот эффект, фактически, увеличи-
вает  число  кадров в строке до Y*speed,
где   speed  -  текущая   скорость.  Все
остальные   эффекты  обрабатываются  как
обычно.

    Эффект   EE0  игнорируется;  если  в
строке   несколько   эффектов   EE,   то
учитывается только последний.

ЭФФЕКТ EF. INVERT LOOP.

    Проигрывает   зацикленную   часть  в
сэмпле  в  обратном направлении, изменяя
при   этом   знак   выборок  (инвертируя
сэмпл).  Для  этого текущий сэмпл должен
быть  зациклен,  и длина цикла не должна
быть  большой. Сэмпл проигрывается назад
со   скоростью  Y.  Насколько  небольшой
должна  быть  длина цикла, а также в чем
измеряется   скорость   Y  знают  только
создатели Noisetracker'а, Soundtracker'а
и  Protracker'а (а может и они не знают,
по  крайней  мере,  он  реализован не во
всех версиях Protracker'а). Но они этого
никому не расскажут, поэтому этот эффект
нигде больше не был реализован.

    Если  указан эффект EF0, то устанав-
ливается   обычное  прямое  зацикливание
сэмпла.

          ЭФФЕКТ F. SET SPEED.

    Этот    эффект    устанавливает    в
зависимости от параметра XY либо текущую
скорость, либо текущий темп (BPM).

        Если  XY <= 1F,  то  устанавливается  скорость. Значение
        XY = 0 игнорируется.
        Если XY >= 20, то устанавливается BPM.

    Надо  заметить,  что  одно  время  к
скорости  относились значения XY <= 20 и
есть очень небольшое количество модулей,
играющих на скорости 20.

4.КЛАССИФИКАЦИЯ СПОСОБОВ ВОСПРОИЗВЕДЕНИЯ
     
    Проигрыватель  MOD-фалов можно пред-
ставить  как  два параллельно работающих
процесса:   собственно  проигрыватель  и
микшер  (см.  параграф  2.  Принцип вос-
произведения  MOD-файлов). Прежде всего,
способы  воспроизведения можно классифи-
цировать по типу проигрывателя:

         1) проигрыватель работает в реальном времени;
         2) проигрыватель не работает в реальном времени.

    Аналогично  способы  воспроизведения
классифицируются по типу микшера:

         1) микшер работает в реальном времени;
         2) микшер не работает в реальном времени.

    Обязательным    условием    является
синхронная  работа  и  проигрывателя,  и
микшера,   поэтому,   в  общем,  способы
воспроизведения  можно  разделить на два
типа:

         1) синхронные, т.е. работающие в реальном времени;
         2) асинхронные, т.е. не работающие в реальном времени.

    Специфика   воспроизведения   музыки
состоит  в том, что в оконечное устройс-
тво  она  должна  поступать с постоянной
скоростью,  т.е. в реальном времени. Для
способов  воспроизведения  типа  1 здесь
никаких  проблем не возникает - сигнал с
выхода   микшера   идет   с   постоянной
скоростью    и   напрямую   подается   в
оконечное устройство.

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

    Одним   из  способов  преобразования
является   использование   буфера  между
микшером  и оконечным устройством.Сигнал
из   микшера   поступает   в   буфер   с
произвольной скоростью, а считывается из
буфера  со  строго постоянной скоростью.
Скорость  заполнения  буфера должна быть
не меньше скорости его опустошения.

    Чтобы    воспроизводить    MOD-файлы
способом типа 1, необходима операционная
система,  работающая в реальном времени.
Win32  не  является  такой  операционной
системой.   Она   предоставляет  микшер,
работающий  в  реальном  времени,  - это
DirectSound, но реализация проигрывателя
такого  же  типа  с  помощью стандартных
средств Win32 невозможна.
     
       5.АСИНХРОННОЕ ВОСПРОИЗВЕДЕНИЕ
     
    Способ    воспроизведения   типа   2
использует  буфер.  В  этот буфер микшер
записывает   волновую   форму   сигнала,
которая   затем   считывается   из  него
звуковой картой и передается в оконечное
устройтво.

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

    Главное,      принципиальное     для
проигрывателя,  деление  MOD-файла - это
деление  на  кадры. Зная длину T кадра в
секундах,  можно вычислить его длину L в
выборках:   L=T*F.   Эта   длина   может
меняться   на   протяжении  проигрывания
модуля.

 Алгоритм воспроизведения выглядит так:
     
    while(буфер_еще_не_заполнен)  
    обработать_начало_кадра( i ); // i - номер текущего кадра
    заполнить_буфер_выборками(L); // L - длина кадра в выборках
    i++;
    

    Функция заполнить_буфер_выборками(L)
это  микшер. В общем случае длина буфера
может  быть  неделящейся  нацело на L, и
алгоритм  получится  немного  другим, но
это не меняет существа дела.

    Как  правило, длина воспроизводимого
сигнала   значительно   превышает  обьем
буфера.    Поэтому   этот   буфер   надо
постоянно  пополнять,  при этом скорость
заполнения  может колебаться, - главное,
чтобы   она   была  не  меньше  скорости
считывания из буфера.

-=ЛИТЕРАТУРА=-
     
    6. ftp://ftp.cdrom.com
    7. http://www.citenet.net
    8. http://huizen.dds.nl
    9. ftp://sdc.wtm.tudelft.nl
   10. ftp://crystal.clare.cam.ac.uk
   11. http://wuarchive.wustl.edu
   12. ftp://ftp.cwi.nl
   13. http://snake.mcs.kent.edu
   14. http://ftp.cica.indiana.edu
   



Другие статьи номера:

От редакции - Предисловие: С какой целью мы выпускаем журнал?

От редакции - Оболочка: описание новой оболчки к журналу.

От редакции - письма в журнал: Dr.Sioux/Phantom Family, Fistsoft, Mr.Z/HardWave, Куров Н., Eagle/Computer Ratz Group, Rom Corp/Virtual Vision Group.

От редакции - в этом номере: содержание номера.

Проект года - презентация версии игры Robo от KT-soft/ETC.

Проект года - презентация игры от группы Spark: Городки.

Проект года - презентация игры "12 Тайных книг".

Проект года - несколько слов о готовящейся к выходу игре Chip & Dale.

Проект года - потрясающая новелла к игре "Навигатор".

Проект года - Мир тьмы: описание новой real-time strategy.

Погремушки - свежие и не очень, но смачные читы.

Погремушки - крематорий: игра Сталкер - описание всех предметов.

Погремушки - крематорий: Страна мифов - советы спеца.

Основы SWAP'А - информация для начинающих, а также несколько хитрых извратов, которые можно провернуть с почтой.

Кто там кодит? - Быстрая графика: несколько рецептов от Zetter'а (печать спрайтов, обновление экрана).

Кто там кодит? - Packer'ы и Depacker'ы: вся правда о паковщиках, или разглагольствования сэра Kot'а.

Кто там кодит? - Работаем с MS-DOS: Все о mod файлах - полное описание структуры mod-файла, а также описание всех эффектов.

Кто там кодит? - Работаем с MS-DOS: Ms-Dos дискеты - описание структуры Ms-Dos диска.

Кто там кодит? - Chanky flame: описание алгоритма чанкового огня.

Кто там кодит? - Attribute bump mapping: bump mapping для тех кто не въехал.

Кто там кодит? - Гуру медитирует: оптимизация программ по времени исполнения и по размеру.

Кто там кодит? - Приближенный поиск заданной последовательности байт!

Кто там кодит? - Fast 42 print: быстрая процедура печати 42 символов в строке.

Party zone - KidSoft'98: репортаж с Воронежского фестиваля компьютерного искусства.

Party zone - EarthQuake'99: репортаж с Челябинского фестиваля компьютерного искусства.

Я сама - 128 цветов на Spectrum: схема доработки до 128 цветов от донецкой группы Spark.

Я сама - Чайникам: подключение General Sound к Profi через системный разъем.

Я сама - Бесперебойные блоки питания: информация об UPS-технологии.

Я сама - General Sound Filter: рассказ о новой примочке к GS.

Я сама - Модемы: Схемы, схемы! Схемы Г.Шепелева и М.Кондратьева подключения Hayes модема.

Я сама - Модемы: Описание команд - описание команд терминала.

Я сама - Модемы: Тотальная модемизация - призыв к подключению момедов.

Системный софт - FastCopy 3.0: полное описание навороченного турбо-копировщика.

Системный софт - Pro Tracker глюки!!! несколько глючков в ProTracker'ах.

Системный софт - Pro Tracker 3.4 final презентация ремикса Pro Tracker из Самары.

Новости - Челябинск: X-Raizor вернулся на спектрум, Wocen пишет boot, Blade отдахыет, Steelzer вступил в Triumph, Crite доделал альфа версию "Мира тьмы", Bytic купил GS, Edison делает сайт, Ironman хочет купить спектрум.

Новости - Омск: полный состав и ожидаемы продукты от группы U98.

Новости - Калининград: громкая смерть или тихая жизнь Spectrum в Калининграде.

Techno-nature - Электронная музыка: Dj.Ironman рассказывает о техно (часть 1).

Techno-nature - Электронная музыка: Dj.Ironman рассказывает о техно (часть 2).

Techno-nature - Internet music-sites: куча адресов,где можно узнать нового об электронной музыке.

Techno-nature - Наркомания XX: байка от Dj.Ironman'а.

Без четверти четыре - рассказ из повседневной жизни от X-Raizor'а.

Комната смеха - Запахи вокруг и внутри: прикольный рассказ из журнала ПТЮЧ.

Комната смеха - Пердмен: убийственный рассказ из все того-же ПТЮЧ'а.

Комната смеха - Фитиль: неколько сценариев из киножурнала ФИТИЛЬ.

Комната смеха - Ореол: окончание рассказа опубликованного во втором номере.

Прокламация - реклама и обьявления о поиске друзей на спектруме.

Прокламация - реклама и обьявления о поиске друзей на спектруме.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Жизнь вне спектрума - продолжение рассказа РУЛЕЗНИКИ (часть 5).
News - смерть Fatality, статья о Спектруме из Компьютерры #36/2000
Сериал - Сериал игровых программ.
Игры - описание новой игры "NUMBEROLOGY N1&2".
Байка - История реальная, поскольку произошла при моем непосредственном участии.

В этот день...   27 сентября