[Back to SOUND SWAG index]  [Back to Main SWAG index]  [Original]

> Is there anyone here who has a source on how to play MID-files in
> PAS-programs, they could post here or NetMail to me???

I can tell you how to access the MIDI port for MPU-401 compatible
controllers.  The MFF (.MID) format is WAY too complex to describe here,
but I *highly* recommend studying the excellent set of articles by Charles
Petzold on MIDI and MIDI files in PC Magazine Vol 11, No 7 (April
14, 1992) to Vol 11, No 19 (November 10, 1992).  The article was mainly for
Windows programmers, but he spent a good portion of the articles
explaining MIDI itself in detail (including the MFF (.MID) format).  All
his source code and sample programs are availible on ZiffNet.  You can
also get the MFF format detailed in the 14-page document "Standard MIDI Files
1.0" from the International MIDI Association for $7 + $1.50p&h US funds (call

I wrote a small (buggy, not working yet) unit for MPU-401 access from
information I got here a few months back.  Your MIDI device must be
fully MPU-401 compatible to use this.

{ MPU-401 MIDI playback/record routines }
{ Public domain 1993 Steven Tallent     }
{ Plays the proper notes on an MPU-401  }
{ compatible synthesizer. }
{ Reading the Status port (331h) and masking 80h will tell you if}
{ something is waiting to be received from the mpu-401. }

Unit Midi;

{**********************} Interface {**********************}

Type MPU401 = object
     Address : Word; {Data port. Status/Comport 1 higher, standard 330h-331h}
     Silent  : Boolean;              {Silence : Software mute }
     Function  Exists : Boolean;     {Does an MPU-401 device exist here?}
     Function  ByteHere: Boolean;    {Is a byte ready to be received?}
     Function  RecByte : Byte;       {Get byte from MIDI device}
     Procedure SendByte (x:Byte);    {Send byte to MIDI device}
     Procedure SendStr (x : String); {Send string of bytes to MIDI device}

VAR Synth : MPU401;

{********************} Implementation {*******************}

Function MPU401.Exists : Boolean;
  Exists := True;

Function MPU401.ByteHere : Boolean;
  If (port[Address+1] and $80) = 0 then ByteHere := True {wrong?}
                                  else ByteHere := False;

Function MPU401.RecByte : Byte;
  RecByte := Port[Address];

Procedure MPU401.SendByte (x:Byte);
{Must wait for no data in the buffer}
  Repeat until (Port[Address+1] and $80) = $80; {wrong?}
  Port[Address] := x;

Procedure MPU401.SendStr (x : String);
Var t : Byte;
  For t := 1 to ord(x[0]) do SendByte (ord(x[t]));

  Synth.Address := $300;
  Synth.Silent := False;

This is semi-OOP, so its pretty simple to use.  MIDI uses 1, 2, or 3 byte
commands to send messages.  For any commands you send to the MIDI device,
use SendByte for each byte or send them all in SendStr for convenience.
If you get it working, please respond with the fixed version either
here or Netmail.

[Back to SOUND SWAG index]  [Back to Main SWAG index]  [Original]