uses
  MMSystem;const
  MAX_LEN = 255;
  MSG_LEN = 1024;
  DATABLOCK_SIZE = 1024;
  HEAP_ZERO_MEMORY = $00000008;
  EXCL_LEN = 8;
  SONG_LEN = 3;
  cMidi = 1;var
  HMS: PHMIDISTRM;
  PHM: PMIDIHDR;
  uDeviceID: UINT;
  MIDIEVENT: array[0..SONG_LEN] of TMIDIEVENT;procedure SetMidiEvent;
//これはとりあえずのデータです。
begin
  MIDIEVENT[0].dwDeltaTime:= 0;
  MIDIEVENT[0].dwStreamID:=  0;
  MIDIEVENT[0].dwEvent:=   MEVT_F_SHORT or MEVT_SHORTMSG or $7F3E90;
  MIDIEVENT[0].dwParms[0]:= 0;  MIDIEVENT[1].dwDeltaTime:= 100;
  MIDIEVENT[1].dwStreamID:=  0;
  MIDIEVENT[1].dwEvent:=   MEVT_F_SHORT or MEVT_SHORTMSG or $003E90;
  MIDIEVENT[1].dwParms[0]:=  0;  MIDIEVENT[2].dwDeltaTime:= 100;
  MIDIEVENT[2].dwStreamID:=  0;
  MIDIEVENT[2].dwEvent:=   MEVT_F_SHORT or MEVT_SHORTMSG or $7F3A90;
  MIDIEVENT[2].dwParms[0]:= 0;  MIDIEVENT[3].dwDeltaTime:= 100;
  MIDIEVENT[3].dwStreamID:=  0;
  MIDIEVENT[3].dwEvent:=   MEVT_F_SHORT or MEVT_SHORTMSG or $003A90;
  MIDIEVENT[3].dwParms[0]:=  0;
end;
procedure START;
var
  mmr: MMResult;
begin
  //ヒープの取得
  PHM := HeapAlloc(GetProcessHeap,HEAP_ZERO_MEMORY,SizeOf(TMIDIHDR));
  PHM.lpData:= HeapAlloc(GetProcessHeap,HEAP_ZERO_MEMORY,DATABLOCK_SIZE);
  PHM.dwBufferLength:= DATABLOCK_SIZE;  //Midi Deviceの取得
  uDeviceID:= GetDeviceID;  //Streamのオープン
  New(HMS);
  mmr:= midiStreamOpen(HMS,@uDeviceID,cMidi,0,0,0); //再生の中断
  midiStreamPause(HMS^);  //データの設定
  PHM.dwBytesRecorded:=12;
  //この数値の意味がよくわからない。12の倍数でないとパラメータが適切でないと
エラーが出る。  COPYMEMORY(PHM.lpData,MIDIEVENT,PHM.dwBufferLength);
 //MIDIEVENTはアドレスです。なんかわかりませんが私のメールソフトでは@マーク
をここで使うと、メールアドレスになっちゃうので省きました。
  PHM.dwFlags:=0;  mmr:= midiOutPrepareHeader(HMIDIOUT(HMS^),PHM,SizeOf(TMIDIHDR));
  mmr:= midiStreamRestart(HMS^);
  mmr:= midiStreamOut(HMS^,PHM,SizeOf(TMIDIHDR));
end;
这是我从网上找到的,不明白为什么 PHM.dwBytesRecorded:=12
请高手指教。 我试了一下,如果不等于12什么也播不了,等于12也只能播出一个音符。
?????????