После недолгих поисков по всемирной паутине, я нашел таки, что искал - модуль, который проигрывает модульную музыку. (Оказалось, что он "заточен" только под xm-файлы, ну да ладно...) После некоторого ознакомления модуля, я пришел к такому выводу:
(Разбираем функции, которые предлагает нам модуль...)
- function uFMOD_PlaySong(lpXM:string; param, fdwSong: LongWord): PHWAVEOUT;
Главная функция, которая отвечает за воспроизведение трека.
lpXM:string - название трека;
param: LongWord - оставляем его "0";
fdwSong: LongWord - спецификация воспроизведения: XM_FILE (воспроизводить файл), XM_MEMORY (из памяти) XM_RESOURCE (как ресурс.)
- procedure uFMOD_Jump2Pattern(pat: LongWord); //прыжок на паттерн
- function uFMOD_GetTime:LongWord; //вывод заголовока трека
- procedure uFMOD_SetVolume(vol: LongWord); //Громкость трека
- procedure uFMOD_Pause; //Пауза
- procedure uFMOD_StopSong; //Остановка воспроизведения
...а также еще ряд других полезных процедур и функций.
Ваяем плеер
Итак, для написания плеера, который будет проигрывать "XM" файлы (один из многих форматов модульной музыки) нам необходимо: Дельфи, желание и... остальное по вкусу. Первое, на новой форме (думаю проблем с созданием формы не будет - мы же не на WinAPI пишем... пока...) располагай одну кнопку и сразу обзывай ее "Open", по названию ты наверное догадался - мы откроем файл и проиграем его. Следующее уже на твое усмотрение (что вышло у меня, смотри на скриншоте), я еще добавил "Edit", в котором буду отображать полное имя файла. Нажимай кнопку на своей форме и переписывай содержимое листинга. Чуть не забыл - кидай на форму компонент "OpenDialog" с закладки "Dialog", что даст нам возможность выбора файла. И еще не забываем подключать в раздел "uses" наш модуль.
Листинг:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if Opendialog1.Execute then
uFMOD_PlaySong(Opendialog1.FileName,0,XM_FILE);
Edit1.Text:=OpenDialog1.FileName;
end;
Имеется некоторая заморочка со спецификой воспроизведения:
1. Если вы хотите проигрывать ресурс, то в модуле, парамер функции "uFMOD_PlaySong" меняем на lpXM:integer, следовательно "fdwSong" у нас будет XM_RESOURCE.
2. Если читать из памяти, то "lpXM:Pointer" и XM_MEMORY соответственно.
Пример для чтения из памяти с последующим воспроизведением:
//Обрезанный трек, записанный побайтово в массив
const
xm : array[1..905] of Byte = (
$45,$78,$74,$65,$6E,$64,$65,$64,$20,$4D,$6F,$64,$75,$6C,$65,$3A,
...
$00,$08,$00,$01,$00,$83,$12,$01,$81,$61,$83,$19,$01,$80,$83,$1E);
Функция воспроизведения.
uFMOD_PlaySong(@xm,0,XM_MEMORY);