Get ready...
To start using HyperMIDI, simply use the
hmOpenMIDI
command. You need to make this call once in your application before you can use other HyperMIDI commands. For instance, you'd place this command in youropenStack
handler in HyperCard, or yourstartMovie
handler in Director.on OpenStack hmOpenMIDI end openStackSimilarly, you'll also use an
hmCloseMIDI
command when you're done using HyperMIDI (in HyperCard, you'd place it in acloseStack
handler, for instance)....Go!
Now you're ready to use the other HyperMIDI commands. To play a MIDI file sequence, for example, use the
hmPlay
command with the file name in any script:hmPlay "HD:Song folder:Earthshake"When this command executes, the song starts playing, but doesn't tie up your computer. Script execution continues, and you can do anything you normally do—even edit and debug, or switch to another application—while the sequence plays "in the background".
You still have complete control of the sequence. You can transpose it while it's playing, scale the velocity and send controller messages to adjust the volume, send program changes to change its voicing, alter its tempo, and mute individual tracks. You can also stop it—for instance if the user makes a choice that should turn off or change the music. And you can ask HyperMIDI is the sequence is done playing, so you can move on in a presentation when the music finishes, for instance.
Or you can loop a song an endless (or specific) number of times, and stop it when the user does something to move on.
MIDI files, instruments, and algorithms
Sequences don't have to come from MIDI files. You can MIDI record directly from a MIDI device. Or, you can script any MIDI sequence, including timing. This script plays a chromatic scale:
put 0 into time get hmClock("time",0) -- set clock to 0 repeat with note = 60 to 72 hmWriteMIDI 1,time & ":" & 144 & note & 64 & time + 100 & 144 & note & 0,"timeMode abs" add 200 to time end repeatBecause HyperMIDI schedules the events to play at the requested time, the above script plays in perfect time, independent of how fast the script executes! Here's another example, which plays 40 random notes over a two octave range, with random velocity:
put 0 into time get hmClock("time",0) -- set clock to 0 repeat for 40 put random(24) + 59 into note put random(127) into vel hmWriteMIDI 1,time & ":" & 144 & note & vel & time + 100 & 144 & note & 0,"timeMode abs" add 200 to time end repeatRecording directly into HyperMIDI is simple because there is no record "mode"—HyperMIDI is always listening to MIDI input, time stamping and buffering it even when you are doing other things. This example captures all MIDI input that has come in since you last read (or cleared) the input:
put hmReadMIDI(1,-1,"track") into mySequenceTo hear it back, in in the exact timing in which it was played:
hmWriteMIDI mySequenceTo save it as MIDI file:
get hmMIDIFiler("write",mySequence,"Song Title")