3.ПРИНЦИП ВОСПРОИЗВЕДЕНИЯ MOD-ФАЙЛОВ
В проигрывателе для каждого канала хранится описание состояния канала. Оно полностью описывает звучание канала. Состояние канала имеет следующие характеристики:
- последняя использовавшаяся на канале нота;
- последняя использовавшаяся на канале частота выборки для сэмпла;
- текущая частота выборки для сэмпла;
- текущая громкость;
- количество выборок, оставшихся до конца сэмпла;
- длина повторяемой части сэмпла;
- смещение текущей выборки;
- смещение зацикливания;
- целая и дробная части значения, на которое увеличивается смещение текущей выборки, определяет текущую частоту выборки;
- дробная часть смещения в буфере, в который помещается сумма выборок сэмплов со всех каналов, целая часть смещения глобальна для всех каналов;
- указатель на дескриптор последнего использовавшегося на канала сэмпла;
- последний использовавшийся на канале эффект и его параметр;
- значения по умолчанию параметров некоторых эффектов:
- параметр эффектов Portamento Up & Down;
- параметр эффекта TonePortamento;
- параметр эффекта Sample Offset;
- переменные, используемые при обработке эффектов:
- счетчики для эффектов Arpeggio, Note Cut, Note Delay и Retrig;
- переменные для Vibrato: глубина, скорость, текущий указатель в таблице волновой формы Vibrato, текущая волновая форма Vibrato и указатель, надо ли играть новую ноту с начала волновой формы, или использовать позицию, оставшуюся от предыдущей ноты;
- переменные для Tremolo: глубина, скорость, текущий указатель в таблице волновой формы Tremolo, базовая громкость Tremolo, текущая волновая форма Tremolo и указатель, надо ли играть новую ноту с начала волновой формы, или использовать позицию, оставшуюся от предыдущей ноты;
- номер сэмпла для эффектов Note Delay и Retrig;
- счетчик и номер строки начала цикла для эффекта Pattern Loop.
Перед проигрыванием текущая нота и текущий номер сэмпла не заданы. Эффект и его параметр нулевые, что эквивалентно отсутствию эффекта. С момента, как на канале встретится нота или номер сэмпла, они будут уже всегда заданы. На одном канале в каждый момент времени может звучать только один сэмпл.
Воспроизведение модуля можно представить как работу двух параллельных процессов: проигрывателя и микшера. В проигрывателе есть указатель текущей строки в партитуре. В начале воспроизведения модуля он указывает на первую строку паттерна из первой позиции. Когда воспроизведение начинается, считываются значения ноты, номера сэмпла и эффекта для каждого канала в строке. В соответствии со считанными значениями меняются состояния каналов.
Микшер в это время, работая параллельно с проигрывателем, микширует сэмплы и подает результат на звуковой выход. Микшер в своей работе использует часть характеристик состояния канала. Работа микшера сводится к просмотру структур, описывающих состояние каналов. Если на канале задан сэмпл, и он не доиграл до конца, то из сэмпла берется текущая выборка и добавляется в сумму текущих выборок со всех каналов. После чего указатель текущей выборки передвигается на следующую позицию в сэмпле. Оригинально, в MOD-формате звук из каналов с номерами 1+4*n и 4+4*n выводится в левый звуковой выход, а звук из каналов с номерами 2+4*n и 3+4*n - в правый, где n - целое неотрицательное число, зависящее от числа каналов.
После того, как проигрыватель в начале первого кадра изменил состояния каналов, он ждет 5/(BPM*2) секунд. По прошествии этого времени начнется второй кадр. В это время возможно изменение состояния каналов, если до этого были заданы соответствующие эффекты. Опять ожидается, пока не начнется новый кадр. И т.д. Когда пройдет число кадров, равное текущей скорости, указатель текущей строки перемещается на следующую, и происходит изменение состояния каналов в соответствии с новыми нотами, сэмплами и эффектами.
Рассмотрим влияние ноты и номера сэмпла на изменение состояния канала.
Если встречается нота при незаданном номере сэмпла или встречается номер сэмпла при незаданной ноте, то они сохраняются и никаких дальнейших действий не происходит.
Если одновременно заданы и нота, и номер сэмпла, то они становятся текущими, и происходит инициализация информации о сэмпле. Она включает в себя следующее: по ноте и тонкому тону сэмпла находится текущая частота выборки; смещение текущей выборки обнуляется; длина повторяемой части, смещение зацикливания и текущая громкость копируется из дескриптора сэмпла; вычисляется количество выборок, оставшихся до конца сэмпла.
Если задана только нота, она становится текущей и происходит инициализация информации о сэмпле.
Если задан только номер сэмпла, то проверяется не совпадает ли он с номером текущего сэмпла. Если совпадает, то инициализируется только текущая громкость. Иначе происходит полная инициализация информации о сэмпле.
Кроме ноты и номера сэмпла на состояние канала влияют эффекты.
|