怎样用MCI API播放MIDI文件?
主 题:怎样用API播放MIDI文件?
作 者:BCB
所属论坛:Delphi
问题点数:50
回复次数:5
人气指数:52
发表时间:2000-12-19 20:37:00
API 播放 MIDI的流在mmedia.hlp有介绍,
midiStreamOpen( )
midiStreamOut()
midiStreamClose( )
因涉及到回调函数,
怎样用它们播放MIDI流,
请高手指点!!!!!
转移贴子到 Visual C++ Visual Basic Delphi C/C++ C++ Builder ASM 数据库开发 PowerBuilder ActiveX/COM 数据算法 软件工程 图形/游戏/多媒体 安全技术 网络/通讯 技术书籍 文件格式 C# XML 主页制作 图形处理 ASP PHP Perl Java Javascript JSP 软件使用 资源使用 软件注册 我看软件 寻找软件 行业软件 软件评测 Windows 95/98 Windows NT/2000 DOS Linux/Unix 硬件指南 程序人生 软件市场 程序员考试 人才热线 建议和意见 灌水乐园 走向海外 | 加到精华区
回复贴子:
yhec回复于2000-12-19 22:42:00 得40分
咳,这个问题这么难?!
请问:有没有详细介绍Windows API编程方面的参考书或手册,最好有例子的书。
Nicrosoft回复于2000-12-20 9:28:00 得10分
you'd better use MCI API
BCB回复于2000-12-21 11:06:00 得0分
MCI API 怎样播放MIDI 文件?请写出程序
Kingron回复于2000-12-21 11:15:00 得0分
这儿有一篇以前的贴子,关于MCI API播放MIDI的,供你参考:
下面的程序我已实际编译运行过,随便你暂停多少次,都可以再次循环播放
unit Unit1;
interface
uses
Windows, Messages, mmsystem,SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
protected
procedure MCINotify(Var Message:TMessage);Message MM_MCINOTIFY;
private
function SendMCIStr(Const Value:String):PChar;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
SendMciStr('Open C:\123.mid alias mid');
SendMciStr('Play mid notify');
end;
procedure TForm1.MCINotify(var Message: TMessage);
begin
if SendMciStr('Status mid mode')='stopped' then
begin
SendMciStr('Seek mid to start');
SendMciStr('Play mid notify');
end;
end;
function TForm1.SendMCIStr(const Value: String):PChar;
Var Buf:Array[0..4095] of char;
begin
MCISendString(PChar(Value),Buf,Sizeof(Buf),Handle);
Result:=Buf;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SendMCiStr('Pause mid notify');
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
SendMCiStr('Play mid notify');
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
SendMciStr('Close mid');
end;
end.
回复人:yeah(2000-8-22 1:39:00) 得0分
下面的程序我已实际编译运行过,随便你暂停多少次,都可以再次循环播放,
其中Button1为打开并播放,Button2为暂停,Button3恢复,Button4关闭。
unit Unit1;
interface
uses
Windows, Messages, mmsystem,SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
protected
procedure MCINotify(Var Message:TMessage);Message MM_MCINOTIFY;
private
function SendMCIStr(Const Value:String):PChar;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
SendMciStr('Open C:\123.mid alias mid');
SendMciStr('Play mid notify');
end;
procedure TForm1.MCINotify(var Message: TMessage);
begin
if SendMciStr('Status mid mode')='stopped' then
begin
SendMciStr('Seek mid to start');
SendMciStr('Play mid notify');
end;
end;
function TForm1.SendMCIStr(const Value: String):PChar;
Var Buf:Array[0..4095] of char;
begin
MCISendString(PChar(Value),Buf,Sizeof(Buf),Handle);
Result:=Buf;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SendMCiStr('Pause mid notify');
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
SendMCiStr('Play mid notify');
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
SendMciStr('Close mid');
end;
end.
回复人:drmy(2000-8-22 21:43:00) 得0分
奇怪的事情发生了。yeah兄你的程序完全正确,不过条件是运行在Windows98下,我测试过了。但是在Windows2000下如果按过pause和resume就会无法再循环播放了。我主要使用Windows2000,还请再费心了,谢谢。
回复人:yeah(2000-8-23 0:16:00) 得23分
今天看到drmy的留言,我急忙装上Win2K(开玩笑)*_^,在D5中运行一遍,果然
不行,于是代码改成这样,别说你又用D4,我要晕倒了:)
unit Unit1;
interface
uses
Windows, Messages, mmsystem,SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
protected
procedure MCINOTIFY(Var Message:TMessage); message MM_MCINOTIFY;
private
nowloop:boolean;
function SendMCIStr(Const Msg:String):PChar;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{打开并播放}
procedure TForm1.Button1Click(Sender: TObject);
begin
SendMciStr('open c:\123.mid alias mid');
Sendmcistr('play mid notify');
Nowloop:=true;
end;
{Callback}
procedure TForm1.MCINOTIFY(var Message: TMessage);
begin
if nowloop and (SendmciStr('Status mid mode')='stopped') then
begin
sendmcistr('seek mid to start');
sendmcistr('play mid notify');
end;
end;
{暂停(实际上是停止,但效果一样)}
procedure TForm1.Button2Click(Sender: TObject);
begin
nowloop:=False;
mcisendstring('stop mid',nil,0,0);
end;
{恢复(实际上是从当前位置播放,效果一样,
因为SEQ设备不支持Resume命令)}
procedure TForm1.Button3Click(Sender: TObject);
begin
nowloop:=true;
sendmcistr('play mid notify');
end;
{关闭}
procedure TForm1.Button4Click(Sender: TObject);
begin
sendmcistr('close mid');
end;
{公用函数}
function TForm1.SendMCIStr(const Msg: String): PChar;
Var Buf:Array[0..4095] of Char;
begin
MciSendString(PChar(msg),Buf,sizeof(buf),Handle);
Result:=Buf;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
button4click(nil);
end;
end.
前面那个程序在Win2k不行的原因,我跟踪了一下,原来在Win2k下的Callback中,
只要发送了Pause命令,下次再调用play,在Callback中mode仍为paused,所以就
不能循环喽,这下该结了吧。
问题点数:50、回复次数:3Top
1 楼yhec(@_@ 俺是贫农俺怕谁)回复于 2000-12-21 11:32:00 得分 0
请直接介绍一下SendMCIStr( )的用法Top
2 楼Kingron(单身走我路……)回复于 2000-12-21 12:00:00 得分 50
SendMCIStr调用的是MCISendString.
MCISendString(command,resultbuf,sizeof(resultbuf),callback);
其中resultbuf为Pchar,Callback为一个句柄,但命令完成后会发送一个消息给handle的对象。
command为一个字符串:
格式为:
cmd DeviceID flag1 flag2
可以用format命令进行格式化format('%s %s %s %s',[cmd,deviceid,flag1,flag2]);
例如:format('%s %s %s %s',['open','abc.wav','waveaudio','alias mywave');
啊,懒的敲了,太多了,你自己看MSDN吧。因为每个cmd 都有自己的flags,我把Cmd写出来:
break
capability
capture
close
configure
copy
cue
cut
delete
escape
freeze
index
info
list
load
mark
monitor
open
paste
pause
play
put
quality
realize
record
reserve
restore
resume
save
seek
set
setaudio
settimecode
settuner
setvideo
signal
spin
status
step
stop
sysinfo
undo
unfreeze
update
where
window Top
3 楼yhec(@_@ 俺是贫农俺怕谁)回复于 2000-12-21 12:55:00 得分 0
谢谢,Kingron
给分50!Top




