MOD
Эффект - это некоторая команда проигрывателю. Эффекты делятся на три группы:
- эффекты, влияющие на звучание сэмплов;
- эффекты, влияющие на порядок воспроизведения композиии;
- эффекты, влияющие на временные характеристики воспроизведения.
Одни эффекты имеют действие только в начале кадра 0, другие - в начале любого кадра. Последние зависят от скорости, и при ее изменении звучание может стать совсем другим.
Эффект задается одной шестнадцатиричной цифрой и имеет параметр XY, задаваемый двумя шестнадцатиричными цифрами. В одних эффектах параметр XY является единым целым, в других он разбивается на два параметра: X и Y. Рассмотрим эффекты более подробно.
ЭФФЕКТ 0. ARPEGGIO.
На самом деле этот эффект делает не арпеджио, а имитирует трезвучие с помощью "очень быстрого" арпеджио. Параметры X и Y этого эффекта задают значение в полутонах, на которое повышается текущая играемая нота. Детально этот процесс выглядит так:
- кадр 0 играется текущей нотой;
- кадр 1 играется высотой, равной высоте текущей ноты плюс X полутонов;
- кадр 2 играется высотой, равной высоте текущей ноты плюс Y полутонов;
- кадр 3 опять играется текущей нотой;
- и т.д. до последнего кадра в строке.
На этот эффект сильное влияние оказывает скорость. Например, если скорость равна 1, то эффект вообще не проявится.
ЭФФЕКТ 1. PORTAMENTO UP.
Повышает высоту ноты в каждом кадре на XY периодов:
- кадр 0 играется текущей нотой;
- кадр 1 играется высотой, равной высоте текущей ноты минус XY периодов;
- кадр 2 играется высотой, равной высоте текущей ноты минус XY*2 периодов;
- и т.д. до последнего кадра в строке.
Если текущая высота звука превышает некоторый порог, то действие эффекта автоматически отключается. При этом звук либо пропадает, либо останавливается на максимуме. Это зависит от проигрывателя.
Если 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 периодов за кадр:
- кадр 0 играется текущей нотой;
- кадр 1 играется высотой, равной высоте текущей ноты плюс или минус XY периодов, в зависимости от того, надо ли понижать или повышать высоту, чтобы дойти до заданной ноты;
- кадр 2 играется высотой, равной высоте текущей ноты плюс или минус XY*2 периодов;
- и т.д. до того, пока не дойдем либо до последнего кадра в строке, либо до заданной ноты.
Если при этом эффекте не указана нота, то берется последняя использовавшаяся на канале нота. Если 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 - текущий индекс, VibratoWaveform - массив текущей формы вибрато. Тогда по шагам это выглядит так.
- кадр 0 играется высотой текущей ноты (CF периодов);
- в начале кадра 1: i = ( i + X ) mod 64 и установить текущую высоту звука равной CF+VibratoWaveform[i]*Y*2;
- в начале кадра 2: i = ( i + X ) mod 64 и установить текущую высоту звука равной CF+VibratoWaveform[i]*Y*2;
- и т.д. до последнего кадра в строке.
Если в следующей строке идет эффект вибрато с указанием новой ноты, то возможно два варианта: либо текущий индекс обнуляется в начале кадра 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 выглядит так:
- в начале кадра 0 вызывается SetPortaNote(note, sample); кадр 0 играется текущей нотой и громкостью;
- начало кадра 1 - вызывается TonePortamento(XY_3) и VolumeSlide(XY_A);
- начало кадра 2 - вызывается TonePortamento(XY_3) и VolumeSlide(XY_A);
- и т.д. до последнего кадра.
ЭФФЕКТ 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 выглядит так:
- кадр 0 играется текущей нотой и громкостью;
- начало кадра 1 - вызывается Vibrato(XY_4) и VolumeSlide(XY_A);
- начало кадра 2 - вызывается Vibrato(XY_4) и VolumeSlide(XY_A);
- и т.д. до последнего кадра.
ЭФФЕКТ 7. TREMOLO.
Тремоло со скоростью X и глубиной Y. Тремоло может иметь четыре разные волновые формы, такие же как у вибрато: синусоида, ниспадающая пилообразная, квадратная и случайная.
Эффект тремоло заставляет громкость колебаться в пределах от CV-Y*4 до CV+Y*4 единиц громкости, где CV - текущая громкость. Если громкость выходит за границы от 0 до 64, то она обрезается.
Скорость X имеет тот же смысл, что скорость в вибрато. Для тремоло используются те же таблицы, что и для вибрато. Для назначения текущей волновой формы тремоло служит эффект E7Y. По кадрам этот эффект работает так:
- кадр 0 играется текущей громкостью (CV);
- в начале кадра 1: i = ( i + X ) mod 64 и установить текущую высоту звука равной CV+TremoloWaveform[i]*Y*4;
- в начале кадра 2: i = ( i + X ) mod 64 и установить текущую высоту звука равной CV+TremoloWaveform[i]*Y*4;
- и т.д. до последнего кадра в строке.
Обнулять (retrig) текущую позицию волновой формы для тремоло, если указана нота, или нет, определяется также эффектом E7Y.
Если X = 0 или Y = 0, то берутся последние ненулевые значения X и Y, которые использовались в тремоло.
ЭФФЕКТ 8. PAN.
Баланс. Оригинально, в MOD-формате не было этого эффекта, он появился в более поздних трекерах.
Действие этого эффекта состоит в том, что звук идет из канала не целиком либо в левый, либо в правый звуковой выход, а на оба выхода, причем с помощью параметра XY регулируется относительная громкость звука на левом и правом выходе.
В интерпретации параметра существует неоднозначность. Первоначально эффект баланса был введен в Dual Mod Player by Otto Chrons. Там параметр XY означал следующее:
- XY = 00 - звук целиком идет в левый выход;
- XY = 40 - звук в одинаковой степени идет и в левый, и в правый выходы;
- XY = 80 - звук целиком идет в правый выход.
Промежуточные значения соответственно регулируют баланс. Кроме этого, значение XY = A4 делает mono surround (монофонический звук вокруг), т.е. выводит звук одинаковой громкости в левый и правый каналы, но на одном канале звук инвертируется.
В Fast Tracker ][ и Impulse Tracker интерпретация XY немного другая:
- XY = 00 - звук целиком идет в левый выход;
- XY = 7F..80 - звук в практически одинаковой степени идет и в левый, и в правый выходы;
- XY = FF - звук целиком идет в правый выход.
ЭФФЕКТ 9. SAMPLE OFFSET.
Этот эффект заставляет звучать сэмпл, начиная со смещения, которое в шестнадцатиричном виде выглядит как XY00 байтов. Эффект действует после того, как обработаны нота и номер сэмпла, изменяя указатель на текущую выборку в сэмпле. Если смещение превосходит длину сэмпла, то оно урезается до него. Необходимо учитывать, что если сэмпл зациклен, то он должен зацикливаться. При этом может быть, что длина сэмпла больше суммы смещения зацикливания и повторяемой части, и смещение в эффекте 9 попадает за границу этой суммы. В этом случае сэмпл доиг рывает до конца и зацикливается.
Если XY = 00, то берется последний ненулевой параметр этого эффекта.
ЭФФЕКТ A. VOLUME SLIDE.
Скольжение громкости вверх или вниз. В параметре XY либо цифра X, либо цифра Y, но не обе сразу должны быть равны нулю, иначе параметр недействителен и эффект игнорируется.
Если нулю не равна X, то громкость скользит вверх; если Y, то вниз. Громкость повышается/понижается на max(X,Y) единиц громкости каждый кадр:
- кадр 0 играется текущей громкостью;
- в начале кадра 1: если X0, то CV=CV+X; если Y0, то CV=CV-Y;
- в начале кадра 2: если X0, то CV=CV+X; если Y0, то CV=CV-Y;
- и т.д. до последнего кадра в строке.
Если громкость выходит за пределы интервала [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, то учитывается только последний. Это второй из трех эффектов, влияющих на порядок воспроизведения композиии. О совместном действии этих эффектов см. ниже.