返回
{***************************************************************}
{***               FVision Unit Version1.0                   ***}
{***                    蓝蚂蚁工作室                         ***}
{***************************************************************}
{***                    MIDI文件单元                         ***}
{***************************************************************}
Unit FMidi;
Interface
Uses
  Dos,FDsp;

Type
  TrackType=record
   Length:Longint;
   Point:Pointer;
  end;

  TMidiFile=object
   Error:Boolean;
   Fp:File;
   FileName:PathStr;
   Result:Word;
   TrackChunks:Word;
   Division:Word;
   Tracks:array[1..10] of TrackType;
   constructor Init(Name:PathStr);
   destructor Done;virtual;
   procedure Play;
  end;



Implementation
Type
  ConType=array[1..64000] of Byte;

constructor TMidiFile.Init;
var
  i:Integer;
  Temp:array[0..13] of Byte;
begin
  Error:=False;
  FileName:=Name;
  Assign(Fp,FileName);
  {$i-}Reset(Fp,1);{$i+}
  BlockRead(Fp,Temp,14,Result);
  TrackChunks:=Word(Temp[10] shl 8)+Temp[11];
  Division:=Word(Temp[12] shl 8)+Temp[13];
  for i:=1 to TrackChunks do
  begin
    BlockRead(Fp,Temp,8,Result);
    Tracks[i].Length:=Longint(Temp[4] shl 24)+Longint(Temp[5] shl 16)+
                      Longint(Temp[6] shl 8)+Longint(Temp[7]);
    GetMem(Tracks[i].Point,Tracks[i].Length);
    BlockRead(Fp,Tracks[i].Point^,Tracks[i].Length,Result);
  end;
end;

destructor TMidiFile.Done;
var
  i:Integer;
begin
  for i:=1 to TrackChunks do
  FreeMem(Tracks[i].Point,Tracks[i].Length);
end;

procedure TMidiFile.Play;
var
  i,j:Integer;
begin
  SpeakerOn;
  for i:=1 to TrackChunks do
  for j:=1 to Tracks[i].Length do
  WriteMidi(ConType(Tracks[i].Point^)[j]);
  SpeakerOff;
end;

end.