// Максимальное количество мод-каналов
#define MaxModVoices 8

// Максимальный период
#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,
 RetringNote, FineVolumeSlideUp, FineVolumeSlideDown, CutNote, NoteDelay,
 PatternDelay, InvertLoop
};



// Структура паттерна
struct PATTERNELEMENT
{
 byte SampleNumber;     // Номер семпла
 word NotePeriod;       // Период ноты
 byte EffectNumber;     // Номер эффекта
 byte EffectParametr;   // Параметр эффекта
};



// Структура  мод-канала
struct MODVOICE
{
 word LastNotePeriod;    // Последний использовавшийся период ноты
 word LastSampleNumber;  // Последний использовавшийся семпл на канале
 dword LastRate;         // Послядняя использовавшаяся частота выборки семпла
 dword CurrentRate;      // Текущая частота выборки семпла
 byte CurrentVolume;     // Текущая громкость
// word NumSamples;        // Количество оставшихся выборок до конца семпла
 word RepeatLength;      // Длина зацикливания семпла
 word RepeatOffs;        // Смещение зацикливания семпла
 word SampleSeg;         // Сегмент семпла
 fixed SampleOffs;       // Смещение семпла
// fixed SampleDeltaOffs;  // На сколько смещаться в выборке
 fixed SampleLength;     // Длина семпла
// word SampleNumber;      // Номер текущего семпла
// byte LastEffect;        // Номер последнего использовавшегося эффекта
// byte LastEffectParametr; // Параметр последнего использовавшегося эффекта
 PATTERNELEMENT PatternElement; // Элемент паттерна
 word ModWorkBufSeg;            // Сегмент рабочего буфера текущего канала
 word ModWorkBufSampleLength;   // Длина семпла в рабочем буфере
 byte Active;                   // Флаг активности канала
 byte Cycling;                  // Флаг зацикленности канала

 // Переменные для эффекта Tremolo
 byte TremoloWaveFormOffs;      // Смещение в массиве волновой формы
 byte TremoloVolume;            // Громкость канала
 // Переменные для эффекта Vibrato
 byte VibratoEffectParametr;    // Параметр эффекта
 byte VibratoWaveFormOffs;      // Смещение в массиве волновой формы
 word VibratoNotePeriod;        // Период текущей ноты для эффекта Vibrato
 byte VibratoNegative;
 // Переменные для эффекта TonePortamento
 word TonePortamentoNotePeriod; // Период ноты
 byte TonePortamentoEffectParametr; // Параметр эффекта
 // Переменные для эффекта Arpeggio
 byte ArpeggioIndex;            // Индекс
 word ArpeggioFramePeriod[3];   // Период ноты для каждого кадра
}ModVoice[MaxModVoices];


// Флаг воспроизведения мод-модуля
:byte PlayModModule=FALSE;


// Размер рабочего буфера
:word ModWorkBufSize;

// Таблица синусов 0..360 (sin*256)
/*:char SinTable[32]={
  0, 25, 50, 74, 98,120,142,162,180,197,212,225,
236,244,250,254,255,254,250,244,236,225,212,197,
180,162,142,120,98,74,50,25};*/
:char SinTable[64]=
//{0,25,49,71,90,106,117,125,127,125,117,106,90,71,49,25,0,231,207,185,166,150,
//139,131,129,131,139,150,166,185,207,231,0,25,49,71,90,106,117,125,127,125,117,106,
//90,71,49,25,0,231,207,185,166,150,139,131,129,131,139,150,166,185,207,231};
{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,244,231,219,207,196,185,175,166,158,150,144,139,134,
131,130,129,130,131,134,139,144,150,158,166,175,185,196,207,219,231,244};



// Таблица периодов для эффекта 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};


// Отношение SbRate/CurrentRate
:fixed SbRate_CurrentRate;
// Отношение CurrentRate/SbRate
:fixed CurrentRate_SbRate;



