midisynth.frink

View or download midisynth.frink in plain text format


// Uses Java calls to play notes via MIDI synthesis.  This requires a JVM that
// actually *has* a MIDI synthesizer (e.g. Oracle's JVM works,
// OpenJDK does not.)

synth = callJava["javax.sound.midi.MidiSystem","getSynthesizer",[]]
synth.open[]
chan = synth.getChannels[]

// This part is unnecessary but it shows how to change instruments.
soundbank = synth.getDefaultSoundbank[]
instruments = soundbank.getInstruments[]
instrument = rand[instruments]
patch = instrument.getPatch[]
(chan@0).programChange[patch.getBank[], patch.getProgram[]]

// Dump names of instruments?
for i=0 to length[instruments]-1
   println["$i\t" + (instruments@i).getName[]]

println["Random instrument for channel 0: " + instrument.getName[]]

sleep[1 s]   // Sound seems choppy if we play too soon?


// Major pentatonic scale
pentMajor = [0,2,4,7,9]    // I also see [0,2,5,7,9]
// Minor pentatonic scale
pentMinor = [0,3,5,7,10]

key = 60   // Start around middle C (these are MIDI note definitions)

for n=0 to 50
{
   keyChange = rand[[0,0,0,0,0,0,0,0,+7,-5,+5,-7]]   // Follows "circle of fifths"
   key = key + keyChange
   if keyChange != 0
      println["Key change: $key"]

   for note = 0 to 3    // Notes per measure without keychange
   {
      for sim = 0 to 2     // Simultaneous notes
      {
         mid = rand[0,10]
         // Play each note on a separate channel.
         (chan@sim).noteOn[key + (mid div 5) * 12 + pentMajor@(mid mod 5),93]
      }
      sleep[.5 s]
   }
}

sleep[9 s]  // Sleep while the notes play.


View or download midisynth.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 17592 days, 15 hours, 30 minutes ago.