// Максимальное количество MOD-каналов
#define MaxModVoices 64
// Максимальный период
#define MaxPeriod 856
// Минимальный период
#define MinPeriod 113



// MOD эффекты
enum{
 Arpeggio=0, PortamentoUp, PortamentoDown, TonePortamento, Vibrato,
 TonePortamentoPlusVolumeSlide, VibratoPlusVolumeSlide, Tremolo, Pan,
 SampleOffset, VolumeSlide, PositionJump, SetVolume, PatternBreak, ExtendedEffects,
 SetSpeed,
 // Расширенные эффекты
 SetFilter=0h, FinePortamentoUp, FinePortamentoDown, GlissandoControl,
 VibratoWaveForm, SetFineTune, PatternLoop, TremoloWaveForm, _16PositionPan,
 RetrigNote, FineVolumeSlideUp, FineVolumeSlideDown, CutNote, NoteDelay,
 PatternDelay, InvertLoop
};



// Структура канала
struct MODVOICE
{
 byte Active;                   // Флаг активности канала

 word OldNotePeriod;            // Последний использовавшийся период ноты
 dword OldRate;                 // Послядняя использовавшаяся частота выборки семпла
 dword CurrentRate;             // Текущая частота выборки семпла
 word CurrentNotePeriod;        // Текущий период ноты
 byte CurrentVolume;            // Текущая громкость

 byte Balance;                  // Баланс канала

 // Информация о семпле
 byte OldSampleNumber;          // Последний использовавшийся семпл на канале
 byte CurrentSampleNumber;      // Номер семпла

 fixed SampleOffs;              // Смещение в семпле
 fixed SampleLength;            // Длина семпла
 fixed SampleLoopOffs;          // Смещение зацикливания в семпле
 fixed SampleLoopLength;        // Длина зацикливания семпла

 dword NumMixedSamples;         // Количество отмикшированных семплов

 byte EffectNumber;             // Номер эффекта
 byte EffectParametr;           // Параметр эффекта

 BUFFERDESCRIPTOR WorkBuf;      // Сегмент рабочего буфера текущего канала

 // Информация некоторых эффектов на канале
 byte OldSampleOffset;          // Последнее ненулевое значение эффекта Sample Offset
 // Переменные для эффекта Vibrato
 byte VibratoEffectParametr;     // Параметр эффекта Vibrato
 byte VibratoWaveFormOffs;       // Смещение в массиве волновой формы
 word VibratoNotePeriod;         // Период текущей ноты для эффекта Vibrato
 byte VibratoTrig;               // Флаг сбрасывания положения в звуковой волне
 byte VibratoWaveFormNumber;     // Номер звуковой волны (0-синусоида,1-пилообразная,2-квадратная,3-случайная)
 // Переменные для эффекта Tremolo
 byte TremoloEffectParametr;     // Параметр эффекта Tremolo
 byte TremoloWaveFormOffs;       // Смещение в массиве волновой формы
 byte TremoloVolume;             // Громкость канала для эффекта Tremolo
 byte TremoloTrig;               // Флаг сбрасывания положения в звуковой волне
 byte TremoloWaveFormNumber;     // Номер звуковой волны (0-синусоида,1-пилообразная,2-квадратная,3-случайная)
 // Переменные для эффекта TonePortamento
 word TonePortamentoNotePeriod;     // Период ноты
 byte TonePortamentoEffectParametr; // Параметр эффекта TonePortamento
 // Переменные для эффекта Arpeggio
 word ArpeggioNotePeriod[3];     // Период ноты для каждого кадра
 byte ArpeggioEffectParametr;    // Параметр эффекта Arpeggio
 // Переменные эффекта RetrigNote
 byte RetrigNoteFrameCounter;    // Счетчик кадров для эффекта RetrigNote
 // Переменные эффекта PatternLoop
 byte PatternLoopOrderPos;       // Положение в листе порядка воспроизведения
 byte PatternLoopPatternLine;    // Номер строки в паттерне
 byte PatternLoopCounter;        // Счетчик текущего прыжка
 byte PatternLoopNumLoops;       // Количество прыжков
 byte PatternLoopSkip;           // Флаг пропуска
 // Переменные эффекта NoteDelay
 word NoteDelayNotePeriod;       // Период ноты
 byte NoteDelaySampleNumber;     // Номер семпла
}ModVoice[MaxModVoices];



// Таблица синусоидальной волны для эффекта Vibrato и Tremolo
:char SinTable[64]={
0,12,25,37,49,60,71,81,90,98,106,112,117,122,125,126,
127,126,125,122,117,112,106,98,90,81,71,60,49,37,25,12,
0,-12,-25,-37,-49,-60,-71,-81,-90,-98,-106,-112,-117,-122,-125,-126,
-127,-126,-125,-122,-117,-112,-106,-98,-90,-81,-71,-60,-49,-37,-25,-12};



// Таблица периодов для эффекта Arpeggio
:word PeriodTable[36]={
856,808,762,720,678,640,604,570,538,508,480,453,
428,404,381,360,339,320,302,285,269,254,240,226,
214,202,190,180,170,160,151,143,135,127,120,113};

