想在程序中加入MIDI背景音乐,请指点一下(50分)

  • 主题发起人 主题发起人 千晶
  • 开始时间 开始时间

千晶

Unregistered / Unconfirmed
GUEST, unregistred user!
不想使用VCL库,并将MIDI音乐定义到资源中
我应该如何做呢?
 
二进制资源,用MCI函数播放。
 
我想问的就是哪个MCI函数...[8D]
 
uses MMSystem

procedure TForm1.btn1Click(Sender: TObject);
var
strPath:string;
mciOpenParms:TMCI_OPEN_PARMS ;
mciPlayParms:TMCI_Play_Parms;
wDeviceID:DWORD;
mciCloseParms:TMCI_Generic_Parms;
begin

strPath:=SysUtils.ExtractFilePath(Application.ExeName)+'Test.MID';
showmessage(strpath);
FillChar(mciOpenParms, SizeOf(TMCI_Open_Parms), 0);
mciOpenParms.lpstrDeviceType := 'sequencer';
mciOpenParms.dwCallback:=0;
mciOpenParms.lpstrElementName := PChar(strPath);
mciSendCommand(0,MCI_OPEN,
MCI_OPEN_TYPE or MCI_OPEN_ELEMENT,
DWORD(@mciOpenParms));
wDeviceID:=mciOpenParms.wDeviceID;
mciPlayParms.dwCallback:=Handle;
mciSendCommand(wDeviceID, MCI_PLAY,
MCI_NOTIFY,
DWORD(@mciPlayParms));
end;
 
我想将MIDI音乐定义到资源中来播放,该如何做呢?
 
<style type="text/css">.text{font-family:宋体;font-size:10.5pt}</style><pre class="text">
//在菜单project->resources下建立new->user data,resource type='MID'
//并将lost.mid文件插入资源文件中(project1.res)
procedure TForm1.BitBtn1Click(Sender: TObject);
var
R: TResourceStream;
begin

r:=TResourceStream.Create(HInstance, 'lost', 'MID');
//其中lost为mid歌曲名称,MID为资源类型
r.SaveToFile('c:/temp.mid');
r.Free;
MediaPlayer1.FileName:='c:/temp.mid';
MediaPlayer1.open;
MediaPlayer1.Play;
end;


 
如果是播放背景音乐,建议单独做一个播放背景音乐的程序。
否则,如果播放音乐和主程序在一起,在主程序处理量大的
时候,背景音乐的播放会出问题,如停顿等。
两个程序之间的通信可以用发送消息
 
to 楼上:
用另外一个线程不就搞定了?
可是搞不明白应该怎样播放
 
to :千晶
用另一个线程虽然可以搞定,但是你可以这么想,如果你把背景音乐程序
独立出来,那么这个东西可以在其他程序中使用,而不用移植代码和编译。
另外,即使用另一个线程播放,在程序处理量大时也会出问题,如
你用shellexec打开另一个大的exe文件时。
 
我只想发部出去一个exe文件,否则的话我就可以直接打开放在磁盘上的文件了[:)]
 
帮你顶!!!
 
你不要做两二进制资源,还是不会从资源读取?
 
后退
顶部