// Максимальное количество мод-семплов
#define MaxModSamples 31
#define MaxPatterns   256



// Структура дескриптора буфера
struct BUFFERDESCRIPTOR
{
 dword Sel;      // Селектор
 dword Handle;   // Handle
};



// Структура мод-семпла (30 bytes)
struct MODSAMPLE
{
 byte Name[22];                      // Имя семпла
 word Length;                        // Длина семпла
 byte FineTune;                      // Значение тонкого тона
 byte Volume;                        // Громкость семпла
 word LoopOffs;                    // Смещение зацикливания семпла
 word LoopLength;                  // Длина зацикливания семпла
};



// Структура мод-модуля (1084 bytes)
struct MODMODULE
{
 byte Name[20];                      // Имя песни
 MODSAMPLE ModSample[MaxModSamples]; // Семплы
 byte OrderLength;                   // Длина песни в паттернах (1..128)
 byte ReStart;                 // Номер паттерна, после окончания проигрывания
 byte Order[128];              // Порядок воспроизведения паттернов
 byte Signature[4];            // Сигнатура модуля

 dword NumSamples;              // Количество семплов (15...31)
 BUFFERDESCRIPTOR Sample[MaxModSamples];   // Дескрипторы семплов
 dword NumPatterns;            // Количество паттернов
 BUFFERDESCRIPTOR Pattern[MaxPatterns]; // Дескрипторы паттернов
 dword NumVoices;            // Количество каналов
 dword OrderPos;             // Положение в списке очередности паттернов
 byte  PatternLine;          // Текущая линия в паттерне
 dword Frame;                // Текущий кадр
 dword SamplesPerFrame;      // Количество выборок во фрейме
 dword CurrentFrameSample;   // Номер текущей выборки во фрейме
 dword NumMixSamples;        // Количество выборок для микширования
 dword WorkBufOffs;          // Смещение в рабочем буфере
 dword Speed;                // Скорость
 dword BPM;                  // Количество ударов в минуту
 byte MasterVolume;          // Основная громкость
 byte Play;                  // Флаг воспроизведения композиции
 byte ModuleLoaded;          // Флаг загрузки модуля

 byte PatternDelayCount;     // Значение задержки строки (Speed*PatternDelayCount фреймов)

 // Вспомогательные процедуры
 void static CARRYFLAG fastcall AllocateBuffer(EAX,ESI); // Выделение буфера
 void static CARRYFLAG fastcall FreeBuffer(EDX);     // Распределение буфера

 // Процедуры управления мод плейером
 void static Init();                       // Инициализация системы
 void static DeInit();                     // Деинициализация системы
 void static fastcall LoadModule(EDX);     // Подгрузка модуля
 void static fastcall UnLoadModule();      // Выгрузка модуля
 void static fastcall SetBPM(EBX);         // Установка BPM
 void static fastcall NextLine();          // Переход на следующую строку в паттерне
 void static fastcall PreviousLine();      // Переход на предыдущую строку в паттерне
 void static fastcall NextPattern();       // Переход на следующий паттерн в списке
 void static fastcall PreviousPattern();   // Переход на предыдущий паттерн в списке
 void static fastcall OrderEffects();      // Обработка эффектов, влияющих на порядок воспроизведения
 void static fastcall SampleEffects();     // Обработка эффектов, влияющих на воспроизведение семплов

 // Основные эффекты
 void static fastcall Arpeggio(AL);        // Эффект Arpeggio
 void static fastcall PortamentoUp(AL);    // Повышение высоты ноты
 void static fastcall PortamentoDown(AL);  // Понижение высоты ноты
 void static fastcall TonePortamento(AL);  // Портаменто к ноте
 void static fastcall Vibrato(AL);                // Эффект Vibrato
 void static fastcall TonePortamentoPlusVolumeSlide(AL); // Портаменто к ноте + скольжение громкости
 void static fastcall VibratoPlusVolumeSlide(AL); // Vibrato и скольжение громкости
 void static fastcall Tremolo(AL);                // Вибрация громкости
 void static fastcall Pan(AL);                    // Установка баланса вывода звука (0..0FFh)
 void static fastcall SampleOffset(EAX);   // Установка смещения в семпле
 void static fastcall VolumeSlide(AL);     // Скольжение громкости
 void static fastcall PositionJump(AL);    // Переход по списку паттернов
 void static fastcall SetVolume(AL);       // Установка громкости на канале
 void static fastcall PatternBreak(AL);    // Прервать паттерн
 void static fastcall SetSpeed(EAX);       // Установка скорости

 // Расширенные эффекты
 void static fastcall FinePortamentoUp(AL);       // Понизить ноту на Y периодов
 void static fastcall FinePortamentoDown(AL);     // Повысить ноту на Y периодов
 void static fastcall VibratoWaveForm(AL);        // Установка формы волны для эффекта Vibrato
 void static fastcall PatternLoop(AL);            // Зацикливание
 void static fastcall TremoloWaveForm(AL);        // Установка формы волны для эффекта Tremolo
 void static fastcall _16PositionPan(AL);         // Установка баланса вывода звука (0..0Fh)
 void static fastcall RetrigNote(AL);             // Сброс ноты
 void static fastcall FineVolumeSlideUp(AL);      // Плавное повышение громкости
 void static fastcall FineVolumeSlideDown(AL);    // Плавное понижение громкости
 void static fastcall CutNote(AL);                // Обрезать ноту
 void static fastcall NoteDelay(AL);              // Задержать ноту
 void static fastcall PatternDelay(AL);           // Увеличить количество фреймов в строке в Y раз
}ModModule;



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


