[comp.sys.atari.st] midi recorder/playbacker

logajan@ns.network.com (John Logajan) (11/28/89)

Someone requested a midi recorder-playbacker.

Here is my entry -- in GFA Basic.

     ------

PRINT "Simple midi recorder/playback program." ! by John Logajan, Nov 27, 1989.
DIM bt%(10000),btt%(10000)     ! 10,000 midi bytes and 10,000 byte times.
done=0
WHILE done=0
  INPUT "Enter, r=record, p=play, s=save, l=load, q=quit ";c$
  IF c$="r"
    GOSUB record
  ENDIF
  IF c$="p"
    GOSUB play
  ENDIF
  IF c$="s"
    GOSUB keep
  ENDIF
  IF c$="l"
    GOSUB revue
  ENDIF
  IF c$="q"
    done=1
  ENDIF
WEND
END
REM
REM
REM
PROCEDURE record               ! Record yourself on the midi keyboard.
  WHILE INP?(3)                ! Throw away buffered junk.
    x=INP(3)
  WEND
  PRINT "It would probably be a good idea to power off/on your midi instrument"
  PRINT "at this time to insure that it sends a proper select channel function"
  PRINT "(which it should do upon playing the first key.)"
  PRINT
  PRINT "Begin playing on your midi instrument."
  PRINT "Press any key on the Atari keyboard to exit recording mode."
  st%=TIMER                    ! Start time as a reference.
  bc%=0                        ! Zero byte (midi event) counter.
  WHILE NOT INP?(2)            ! Loop until Atari key pressed.
    IF INP?(3)                 ! Test for midi incoming byte.
      INC bc%                  ! Increment the event counter.
      bt%(bc%)=INP(3)          ! If incoming byte, save byte in byte array.
      btt%(bc%)=TIMER-st%      ! Also save relative time byte arrived.
    ENDIF
  WEND
  x=INP(2)                     ! Throw away useless key pressed.
RETURN
REM
REM
REM
PROCEDURE play                 ! Play back your creations.
  st%=TIMER-btt%(1)            ! Get playback start time as a reference.
  FOR j%=1 TO bc%              ! Do each saved event -- when it is time --
    WHILE btt%(j%)>TIMER-st%   ! -- by delaying until it is time --
    WEND
    OUT 3,bt%(j%)              ! -- and then sending event (byte) to the midi.
  NEXT j%
RETURN
REM
REM
REM
PROCEDURE keep                 ! Save your magnum opus works.
  fn$=""
  WHILE LEN(fn$)=0             ! I won't allow zero length file names.
    INPUT "Enter name of file to store this musical work of art in";fn$
  WEND
  PRINT "... saving file ..."
  OPEN "O",#1,fn$
  FOR j%=1 TO bc%
    WRITE #1,bt%(j%),btt%(j%)
  NEXT j%
  CLOSE #1
  PRINT "File saved."
RETURN
REM
REM
REM
PROCEDURE revue
  fn$=""
  WHILE LEN(fn$)=0
    INPUT "Enter name of music file you wish to hear played";fn$
  WEND
  PRINT "... loading ..."
  OPEN "I",#2,fn$
  bc%=0
  WHILE NOT EOF(#2)
    INC bc%
    INPUT #2,bt%(bc%),btt%(bc%)
  WEND
  CLOSE #2
  PRINT "File loaded and ready to play."
RETURN

-- 
- John M. Logajan @ Network Systems;  7600 Boone Ave; Brooklyn Park, MN 55428 -
- logajan@ns.network.com, john@logajan.mn.org, Phn 612-424-4888, Fax 424-2853 -

hafer@tubsibr.uucp (Udo Hafermann) (11/30/89)

logajan@ns.network.com (John Logajan) writes:

>Someone requested a midi recorder-playbacker.

I remember reading that EZ-track by Hybrid Arts has been turned public
domain.  Correct?  If so: it's a reasonably complete GEM-based 20-track
sequencer.