CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  Windows SDK/API

怎样用MCI API播放MIDI文件?

楼主yhec(@_@ 俺是贫农俺怕谁)2000-12-21 11:23:00 在 Delphi / Windows SDK/API 提问

主  题:怎样用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

相关问题

  • 怎样用API播放MIDI文件?
  • 怎样用 MCI 命令循环播放 MIDI?
  • 用MCI接口编写播放MIDI程序,怎样才能使音乐循环播放
  • 请问如何在Delphi中调用API函数播放MIDI音乐?
  • 用MCI(API)怎样播放文件路径及文件名中带 space 的文件???(急!!!,答对一定给分)
  • 想播放一个midi
  • NokiaS60播放midi的问题
  • 请问怎么样在Windows Mobile中播放MIDI格式的音乐,有什么API可以调用?
  • 用API播放声音?
  • API 如何播放MP3

关键词

  • win2k
  • windows2000
  • 文件
  • 软件
  • api
  • sendmcistr
  • mcinotify
  • tbutton
  • tform
  • tobject

得分解答快速导航

  • 帖主:yhec
  • Kingron

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo