![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Музыка в игре. 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 не нравится???