=== About === 
(add by 3EPHOEd aka Billy Hammer)
Формат Модульный 8-ми канальный из нижеследующего описания это не очень понятно, скажем так я понял только когда сумел проиграть все ноты подряд, хотя это там все же сказано.
Надо понимать раньше я с разнообразными МОД-ами дел не имел по этому дабы народ копья об это ломающий не отчаивался тут приведу толкования в скобках().

=== Формат файла DMM === 
Заголовок: 
4 байта - id - 'D' 'M' 'M' 0 
1 байт - версия 
	(Во всех Музыках стоит версия &H00 то есть нулевая версия)
1 байт - количество блоков 
	(В каждом блоке восемь каналов, каналы в общем потоке разделяются "хх,хх,&H80(128),хх" в громкости)
	(Если в канале и последующих нет не одной ноты то ноты с &H80 идут подряд до конца блока)
2 байта - количество "нот" во всех блоках
	(Это значение и надо умножить на 4, потому что в одной ноте 4-е байта)
	(Перевести в десятичную, "Кол-во нот = Байт 1 + (256 * на Байт 2)" хотя как хотите)

"Ноты": 
количество "нот" (из заголовка) * 4 байта на "ноту"
	(Вот от сюда и следует что 4-е байта на ноту)

Последовательность блоков: 
1 байт - длина последовательности 
# байт - последовательность 

Инструменты: 
1 байт - количество инструментов 
по 16 байт на каждый инструмент: 
1 байт - ? не используется при проигрывании 
13 байт - название инструмента (имя файла) 
2 байта - ? не используется при проигрывании 
	(Грубо говоря, на одно название сэмпла 16 байт или 15 и один разделитель, не суть важно можно 7 на название и до следующего 9-ть пропустит, других вариантов не встречал)


=== Формат последовательности === 

Последовательность определяет, какие блоки в каком порядке будут играться.
	(То есть в ней идут номера блоков, байт - номер, не подряд все играется)

Байт последовательности может иметь такие значения: 
255 - переход, следующий байт задает смещение от начала последовательности. 
другой - номер блока, который надо поставить на проигрывание.

Переходы нужны в основном для зацикливания музыки. 
	(В Doom2D кроме зацикливания в прочем и не используется по этому можно сказать если найдено в последовательности 255 то конец композиции)
	(Хотя есть музыки, в которых оно зацикливается не с самого начала, как бы есть вступление конторе играется один раз но все равно суть не меняется)
	(Это все важно, если использовать такую музыку в своей игрушке или порте D2D, для перевода в S3M-IT-XM не обязательно)

=== Блоки === 

В "нотах" записаны подряд сначала восемь каналов для нулевого блока, затем 8 каналов 
для первого блока и т.д. 
	(Важный момент, поскольку о каналах идет ниже то не ясно как они разделяются если идут подряд)
	(Кстати если все ноты с значением &H80 или 128(в десятичной) в громкости разделить на количество блоков всегда равно 8-и)

При загрузке ноты "прочёсываются" и создается таблица, указывающая на начало каждого 
канала в каждом блоке, чтобы быстро ставить блоки на проигрывание. 
	(Надо полагать отыскивается эта самая 128-ка)

=== Формат "нот" === 

Каждая "нота" занимает 4 байта, обозначим их так: N, I, V, D. 
	(N, I, V, D = Note, Instrument, Volume, Duration)
	(N, I, V, D = Нота, Инструмент, Громкость, Задержка)
		(Нота -  24 считаем что "0" звучит родное звучание сэмпла, меньше 24-х понижение ноты, больше 24-х повышение)
		(Инструмент - номер сэмпла (сымплы перечислены в конце файла) в ноте)
		(Громкость - от 0 до 127, по этому, если 128 конец канала)
		(Задержка - Количество "тиков" до проигрывания следующей ноты)
		(Помним, что ноты живут в своих каналах и каналы играются независимо)

Основная мера времени - "тики" - 1/64 секунды.
	(или 15,625 миллисекунды, во всяком случаи для "тормоза" в миле секундах)

Алгоритм проигрывания одного канала (всего каналов восемь, они играются независимо): 

if (V==0x80) - CHR$(128)
{ 
конец канала, он больше не будет проигрываться (хотя инструмент может позвучать); 
(когда закончились каналы, переходим к следующему блоку в последовательности, 
при этом глушим все инструменты во всех каналах, чтобы остановить зацикленные); 
	(Да, есть еще зацикленные инструменты, тому, кто их грузит из WAV-ков надо это как-то решать)
} 
else 
{ 
if (N==0xFE) - CHR$(254)
{ 
длинная пауза, длительность (в тиках) берем из I(старший байт) и D(младший байт); 
	(Для Ооооочень длинных пауз, более 256 тиков, бывает и такое (I * 256) + D, вроде так)
} 
else 
{ 
if (I!=0) - CHR$(0)
{ 
устанавливаем инструмент (I-1) как текущий в данном канале; 
(однако, старый инструмент может продолжать играться, новый начнется только 
когда будет проиграна новая нота, см. ниже); 
	(То есть I равное какому-то байту отличному от нуля, байт порядковый номер сэмпла из "хвоста" файла)
} 

if (N!=0xFF) - CHR$(255)
{ 
начинаем проигрывать новый инструмент на частоте ноты N-24; 
(номер ноты - количество полутонов вверх или вниз от нормального звучания, 
при (N-24)==0 инструмент звучит "как есть", на sample rate, указанном в DMI); 
	(То есть не равное 0 или 255 или нота тут устанавливается)
} 

if (V & 0x80) - CHR$(128)
{ 
special fx, сейчас только 0x80 - конец канала; 
	(Никаких Специал ЭфИксов нету просто конец канала.)
	(Ждем пока во всех каналах станет 128 и начинаем играть новый Блок)
} 
else 
{ 
установить громкость данного канала в V (127 max); 
если V==0, инструмент перестает проигрываться; 
	(Опять же дабы не... Если громкость 128 конец канала)
	(Так оно разделяется)
} 

if (D==0) - CHR$(0)
{ 
пауза в 256 тиков; 
} 
else 
{ 
пауза в D тиков; 
} 
} 
} 

-----------------------
----DMI файлы, формат.
// заголовок инструмента (DMI) 
typedef struct{ 
unsigned long len, // длина в байтах 
rate, // частота в Гц. 
lstart, // начало повтора в байтах от начала данных 
llen; // длина повтора в байтах 
}snd; 
	(В Doom2D все сэмплы обозваны DMIххххх, хотя названия можно любые, просто нет ничего другого)

-=Вот собственно и все=-
Помогай вам DoomGod. ;)
Стало быть, надеюсь, что сей документ поможет желающим конвертировать DMM в какой либо более распространенный Сэмпловый формат.
Если конечно я сам это и не сделаю, гораздо большая для меня проблема теперь разобраться, как это все записать в XM или S3M формат.
========================================================================
-=Billy Hammer aka 3EPHOEd=- (3EPHOEd`s Ware, Warezzz and Tools 2007)
========================================================================
Приложение 1.

Из вопросов по форуму о переводе в другие форматы.
Что-то мне кажется, что в MOD такое не перевести он 4-х канальный.
Хотя при желании оно можно и в одном канале все проиграть.

======================== 
Хотел спросить про формат DMI, но уже нашёл его в OSOUND2.H: 
// заголовок инструмента (DMI) 
typedef struct{ 
unsigned long len, // длина в байтах 
rate, // частота в Гц. 
lstart, // начало повтора в байтах от начала данных 
llen; // длина повтора в байтах 
}snd; 
В связи с этим такой вопрос - в .MOD для инструментов записана их нота - а у Вас частота в Гц. Как перевести обратно? Я обзавёлся двумя неплохими документациями по .MOD формату, и там описано какая частота какой ноте соответствует. Однако хотелось бы узнать от Вас - чтобы расхождения в нотах небыло, так как они могут несовпасть. Ещё вопрос - длинная пауза, длительность (в тиках) берем из I(старший байт) и D(младший байт); - т.е. задержка в 2 байта (word)? В формате .MOD есть только задержка в 1 байт. 
======================== 
Частотой можно называть две вещи: sample rate и высоту звука ноты. 

В DMI записан sample rate, с которым должен проигрываться инструмент, когда его играют на ноте N=24. Предполагается, что он при этом выдает "до" первой октавы (если не ошибаюсь). Но на самом деле звук можно записать какой угодно, и сделать это на любом sample rate. Поэтому вообще, звучание при этом может быть разное. Как и в МОДе, впрочем. 

В документации по МОДу должна быть формула, по которой вычисляется sample rate, на котором должен проигрываться инструмент МОДа, в зависимости от "ноты" ("period", кажется, такие числа порядком нескольких сотен  ). 

В ДММ формула такова: play_sample_rate = pow(2, (N-24)/12.0) * dmi_sample_rate 

В МОДе считается, что у всех инструментов одинаковый sample rate (порядка 8KГц, кажется), поэтому для разных инструментов (ДМИ) придется по-разному считать высоту "ноты" в МОДе. Она может и не попасть на "стандартные" значения для нот. 

Другой вариант - пересемплировать инструменты на другой sample rate. Правда, при этом они скорее всего потеряют в качестве. 


> Ещё вопрос - длинная пауза, 
> длительность (в тиках) берем из I(старший байт) и 
> D(младший байт); - т.е. задержка в 2 байта (word)? 
> В формате .MOD есть только задержка в 1 байт. 

Никто не обещал, что перевести DMM в MOD будет просто  
Задержка в МОДе, насколько я помню, задерживает ВСЕ каналы. А в ДММ - только тот, в котором написана. 
Например, если инструмент в этом канале вступает только в конце блока, в начале с большой вероятностью будет длинная пауза. В МОДе при этом обычно просто пустое место.
======================== 