Войти
ДельфинарийСтатьи

MIDI файлы

Автор:

Нашел отличный исходник проигрывателя MIDI файлов
http://bulba.at.kz/progr.htm

Немножко минимизировал его, что бы не исплоьзывались лишние библиотеки.
Теперь минимальное приложение весит 30.5кб

Смотреть тут: webfile.ru/877433 (31кб)

25 марта 2006

Комментарии [9]

#1
18:38, 25 мар. 2006
function mus_Play(FileName : PChar): integer;
var
 mciOpen  : TMCI_OPEN_PARMS;
 music_ID : WORD;
begin
Result := 0;
with mciOpen do
 begin
 dwCallBack        := 0;
 lpstrDeviceType   := nil;
 lpstrElementName  := FileName;
 lpstrAlias        := nil;
 end;

if mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, Longint(@mciOpen)) = 0 then
 begin
 music_ID           := mciOpen.wDeviceId;
 mciPlay.dwCallBack := Handle;
 mciPlay.dwFrom     := 0;
 if mciSendCommand(music_ID, MCI_PLAY, MCI_NOTIFY or MCI_FROM, Longint(@mciPlay)) <> 0 then
  mus_Stop(music_ID)
 else
  Result := music_ID;
 end;
end;
Проиграет, mid, wav, mp3, wma, wmv, asf, avi, mpg...
Минимальное приложение - 2 кб
#2
19:13, 25 мар. 2006

XProger
Спорный вопрос вобще-то:)  2 кб в любом случае надо жать.
К тому же в твоем примере нет ни mciPlay, ни mus_Stop, ни всего возможного остального.
Так что не понятно какая часть MMSystem использованна.

#3
19:15, 25 мар. 2006
var
 music_ID        : WORD = 0;
 mciPlay         : TMCI_PLAY_PARMS;
...
function mus_RePlay(music_id: WORD): boolean;
begin
Result := mciSendCommand(music_ID, MCI_PLAY, MCI_NOTIFY or MCI_FROM, Longint(@mciPlay)) = 0;
end;

procedure mus_Stop(music_id: WORD);
begin
mciSendCommand(music_id, MCI_CLOSE, 0, 0);
end;

А вот на счёт сжатия ;)
http://xproger.mirgames.ru/?id=1&page=0&doc=delphi_min

#4
19:56, 25 мар. 2006

Ну да. Получается 14кб.
Но нет двух вещей: текущей позиции проигрывания и loop.

Блин, у меня ведь есть книжка по программированию звука. Я от туда только Direct3Dsound взял, а на mci забил.
Видимо зря:) Надо будет потаращится.

#5
19:59, 25 мар. 2006

Убиение системных заголовков за сжатие считать нельзя! Так что 3 кб ;)

Вот тебе Loop аналогично и с позицией ;)

  MM_MCINOTIFY :
   if wParam = MCI_NOTIFY_SUCCESSFUL then
    if music_ID <> 0 then
     begin
     mciSendCommand(music_ID, MCI_SEEK, MCI_SEEK_TO_START, 0);
     mciPlayParms.dwCallback := Handle;
     mciSendCommand(music_ID, MCI_PLAY, MCI_NOTIFY, Longint(@mciPlayParms));
     end;

#6
20:07, 25 мар. 2006

>Убиение системных заголовков за сжатие считать нельзя
Так что в твоем примере, что в том одни и те же заголовки. Там просто наворотов больше.
Или это о чем сейчас? :)

#7
20:09, 25 мар. 2006

О 14 кб.
Урезанные System.pas SysUtils.pas дадут 3 кб приложение. Т.к. будет вырезан менеджер памяти и т.п. не нужная здесь бяка ;)

#8
20:14, 25 мар. 2006

Вот что я точно нигде не видел, это как усилить звук.
Везде Volume идет как заглушение в децибелах. То есть отрицательный. А как сделать погромче неизвестно:(

#9
20:34, 25 мар. 2006

DROnik
При загрузке PCM аудио умножать значение амплитуды на k > 1. Ну и ограничивать полученную амплитуду верхним и нижним пределами разрядности типа :)

ДельфинарийСтатьи

Тема в архиве.