Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Музыка в игре. mid и подобное


pavel_k ©   (2003-07-18 00:07:00) 

Я пишу небольшую игру и хотелось бы устроить фоновую музыку. Я написал небольшую мелодию, она есть у меня в midi файле. Внимание, вопрос: как лучше ее проиграть? Как я понял, библиотека BASS не играет midi, с другими я не знаком. Посоветуйте, пожалуйста, библиоьеку, проигрывающую mid, или программу конвертатор в другой формат, не занимающий много места (например, я видел *.mod, но что это за такой муз. формат и как такой сделать я не знаю).


pavel_k   (2003-07-20 22:14:00) [1]

>Rouse_ ©
Я проверил ваш код: отлично работает. Единственная проблема - как бы поймать млмент окончания мелодии? Вроде в комментарии написано, что главной форме должно приходить сообщение MM_MCINOTIFY, но то ли оно не приходит, то ли я его как-то не так ловлю. Я пользовал такую процедуру:
procedure MMMCINOTIFY( Var Message:TMessage); message MM_MCINOTIFY;
Она не вызывается в нужное время.


pavel_k   (2003-07-20 21:19:00) [2]

>Rouse_ ©
Извините, но я не очень понимаю во всяких mci...
Ответьте, я правильно понял, что это проигрывание файла из ресурса?
Я обязательно поэкспериментирую с вашим кодом. Спасибо.


Rouse_   (2003-07-20 15:54:00) [3]

Например вот так делал (увы покойный) Ян Хорн

unit sound;

interface

procedure initSound;
procedure deInitSound;

implementation

uses Windows, MMsystem, Classes, SysUtils;

var wDeviceID : word;

procedure initSound;
var dwReturn : DWord;
mciOpenParms : MCI_OPEN_PARMS;
mciPlayParms : MCI_PLAY_PARMS;
mciStatusParms : MCI_STATUS_PARMS;
mciSeqSetParms : MCI_SEQ_SET_PARMS;

ResourceStream : TResourceStream;
begin
try
ResourceStream :=TResourceStream.Create(hInstance, "music", "MIDI");
ResourceStream.SaveToFile("music.mid");
finally
ResourceStream.Free;
end;

// Open the device by specifying the device and filename.
// MCI will attempt to choose the MIDI mapper as the output port.
mciOpenParms.lpstrDeviceType := "sequencer";
mciOpenParms.lpstrElementName := "music.mid";
dwReturn := mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE OR MCI_OPEN_ELEMENT, Longint(@mciOpenParms));
if dwReturn <> 0 then
exit;

// The device opened successfully; get the device ID.
wDeviceID := mciOpenParms.wDeviceID;

// Check if the output port is the MIDI mapper.
mciStatusParms.dwItem := MCI_SEQ_STATUS_PORT;
dwReturn := mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, Longint(@mciStatusParms));
if dwReturn <> 0 then
begin
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
exit;
end;

// The output port is not the MIDI mapper.
// Ask if the user wants to continue.
if LOWORD(mciStatusParms.dwReturn) <> Word(MIDI_MAPPER) then
begin
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
exit;
end;

// Begin playback. The window procedure function for the parent
// window will be notified with an MM_MCINOTIFY message when
// playback is complete. At this time, the window procedure closes
// the device.
dwReturn := mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, Longint(@mciPlayParms));
if dwReturn <> 0 then
begin
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
( wDeviceID, MCI_CLOSE, 0, 0) [6]

Например вот так делал (увы покойный) Ян Хорн

unit sound;

interface

procedure initSound;
procedure deInitSound;

implementation

uses Windows, MMsystem, Classes, SysUtils;

var wDeviceID : word;

procedure initSound;
var dwReturn : DWord;
mciOpenParms : MCI_OPEN_PARMS;
mciPlayParms : MCI_PLAY_PARMS;
mciStatusParms : MCI_STATUS_PARMS;
mciSeqSetParms : MCI_SEQ_SET_PARMS;

ResourceStream : TResourceStream;
begin
try
ResourceStream :=TResourceStream.Create(hInstance, "music", "MIDI");
ResourceStream.SaveToFile("music.mid");
finally
ResourceStream.Free;
end;

// Open the device by specifying the device and filename.
// MCI will attempt to choose the MIDI mapper as the output port.
mciOpenParms.lpstrDeviceType := "sequencer";
mciOpenParms.lpstrElementName := "music.mid";
dwReturn := mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE OR MCI_OPEN_ELEMENT, Longint(@mciOpenParms));
if dwReturn <> 0 then
exit;

// The device opened successfully; get the device ID.
wDeviceID := mciOpenParms.wDeviceID;

// Check if the output port is the MIDI mapper.
mciStatusParms.dwItem := MCI_SEQ_STATUS_PORT;
dwReturn := mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, Longint(@mciStatusParms));
if dwReturn <> 0 then
begin
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
exit;
end;

// The output port is not the MIDI mapper.
// Ask if the user wants to continue.
if LOWORD(mciStatusParms.dwReturn) <> Word(MIDI_MAPPER) then
begin
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
exit;
end;

// Begin playback. The window procedure function for the parent
// window will be notified with an MM_MCINOTIFY message when
// playback is complete. At this time, the window procedure closes
// the device.
dwReturn := mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, Longint(@mciPlayParms));
if dwReturn <> 0 then
begin
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
exit;
end;
end;


procedure deInitSound;
begin
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
DeleteFile("music.mid");
end;


end.


Желаю успехов


pavel_k   (2003-07-20 15:21:00) [4]

>r0n1n
Спасибо, обязательно все посмотрю.


r0n1n   (2003-07-20 03:44:00) [5]

http://www.torry.net/vcl/mmedia/video/hgdspack.zip
нашел тебе ссылку
посмотри может там есть чо


r0n1n   (2003-07-20 03:20:00) [6]

Кстати на счет BASS ты понял неправильно. Проигрывает она еще как.
Если получится я те на мыло скину компоненту.
У меня она дисках где то завалялась. Для работы с DirectShow фильтрами. По-моему там тож есть эта возможность.
Но это будет токо через несколько дней, вернее в понедельник или во вторник.


pavel_k   (2003-07-19 14:32:00) [7]

Что-то не понял я с этим TWinAmp"ом, заставить его midi играть не получилось. TMediaPlayer тормозит (когда я пытаюсь заставить мелодию играть по кругу, возникают тормоза ок. 2 сек.).
Больше ничего подобного нет?


r0n1n   (2003-07-18 01:32:00) [8]

возьми компонент TWinamp(помойму с midi работает)
он здесь в кладовке находится
а чем тебе TMediaPlayer не нравится???


Наверх

Титульная страница Поиск, карта сайта Написать письмо