## MidiSequencer

The MidiSequencer plays Standard Midi Files (SMF files or SMF's). It is modeled on how the SampleActor plays .aiff files.

To use the MidiSequencer implementation, load midi.so and create an actor of type MidiSequencer.

### MidiSequencer

In addition to the messages understood by all actors, the MidiSequencer understands the following messages:

PlayFile`hActor szFile`
  Load, play, and unload an SMF file (`PlayFile(szFile)` ).
  The argument `szFile` is a string.
RewindAll`hActor`
  Rewind all SMF's (`RewindAll()` ).
SetDirectory`hActor szFile`
  Set default directory to load SMF's from (`set_Directory(szFile)` ).
  The argument `szFile` is a string.
SetAllDirectory`hActor szFile`
  For all handlers, set directory to load SMF's from (`set_AllDirectory(szFile)` ).
  The argument `szFile` is a string.
SetAllBounds`hActor tMin tMax`
  For all handlers, set start and end of played segment (in seconds) (`set_AllBounds(tMin, tMax)` ).
  The argument `tMin` has a range of [0, 3600] and defaults to 0.
  The argument `tMax` has a range of [0, 3600] and defaults to 60.
SetLoop`hActor bool`
  Toggle looping (`set_Loop(bool)` ).
  The argument `bool` has a range of [0, 1] and defaults to 0.
  The argument `bool` has a range of [0, 1.4013e-45] and defaults to 0.
SetAllLoop`hActor tMin tMax [ bool ]`
  For all handlers, toggle looping (`set_AllLoop(tMin, tMax, bool)` ).
  The argument `tMin` has a range of [0, 3600] and defaults to 0.
  The argument `tMax` has a range of [0, 3600] and defaults to 60.
  The argument `bool` has a range of [0, 1] and defaults to 0.

The following MidiSequencer messages are under construction.

SetPlaybackRate`hActor rate`
  Set default playback rate (1 = unchanged, 0.5 = half speed, 0 = frozen) (`set_playbackRate(rate)` ).
  The argument `rate` has a range of [0, 1000] and defaults to 1.
SetAllPlaybackRate`hActor rate`
  For all handlers, set playback rate (1 = unchanged, 0.5 = half speed, 0 = frozen) (`setAll_playbackRate(rate)` ).
  The argument `rate` has a range of [0, 1000] and defaults to 1.

### MidiSequencer handler messages

In addition to the messages understood by all handlers, the handler for the MidiSequencer understands the following messages. Defaults start off with the values specified below, but are in fact whatever the handler's actor's defaults are (possibly changed by sending one of the messages listed above).

DeleteWhenDone`hSound`
  Unload this SMF when it finishes playing (`DeleteWhenDone()` ).
JumpTo`hSound when`
  Turn all notes off, then skip to a point in the SMF (`JumpTo(when)` ).
  The argument `when` has a range of [0, 3600] and defaults to 1.
Rewind`hSound`
  Turn all notes off, then rewind the SMF to its beginning (`Rewind()` ).
SetDirectory`hSound szFile`
  Set directory to load SMF's from (`set_Directory(szFile)` ).
  The argument `szFile` is a string.
SetFile`hSound szFile`
  Load an SMF (`set_File(szFile)` ).
  The argument `szFile` is a string.
SetBounds`hSound tMin tMax`
  Set start and end of played segment (in seconds) (`set_Bounds(tMin, tMax)` ).
  The argument `tMin` has a range of [0, 3600] and defaults to 0.
  The argument `tMax` has a range of [0, 3600] and defaults to 60.
SetLoop`hSound [[ tMin tMax ] [ bool ]]`
  Toggle looping.
  The argument `tMin` has a range of [0, 3600] and defaults to 0.
  The argument `tMax` has a range of [0, 3600] and defaults to 60.
  The argument `bool` has a range of [0, 1] and defaults to 0.
SetPlaybackRate`hSound rate`
(under construction)
  Set playback rate (1 = unchanged, 0.5 = half speed, 0 = frozen) (`set_PlaybackRate(rate)` ).
  The argument `rate` has a range of [0, 1000] and defaults to 1.

### Examples

`LoadDSO midi.so;
midiseq = Create MidiSequencer;
`

Play two songs in a row:

  `PlayFile midiseq "MaryHadALittleLamb.mid";
  PlayFile midiseq "ThreeBlindMice.mid";`

Play one song over and over again:

  `SetLoop midiseq 1;
  PlayFile midiseq "Barneys_Song.mid";`

Play two songs at the same time:

  `seq1 = BeginSound midiseq SetFile "foo.mid";
  seq2 = BeginSound midiseq SetFile "bar.mid";
  `

Play two songs over and over again at the same time:

  `seq1 = BeginSound midiseq SetFile "foo.mid" SetLoop 1;
  seq2 = BeginSound midiseq SetFile "bar.mid" SetLoop 1;
  `