#!/usr/bin/ruby require 'smf' include SMF prev_note = 0 def rand_note(key, max_duration) blues_scale = [0,3,5,6,7,10] octave = rand(2) pitch = blues_scale[rand(blues_scale.size)] + key + 12*octave duration = rand(max_duration) return pitch,duration end seq = Sequence.new trk = Track.new key = 7 # key of G measure = seq.division*4 max_duration = measure/4 channel = 0 offset = 0 while ( offset < 96 * 120 * 3 ) # three minutes of joy pitch,duration = rand_note(key, max_duration) pitch += 0x3c # orient on middle c if duration + offset%measure > measure offset += measure - offset%measure end velocity = 0x40 trk << NoteOn.new(offset, channel, pitch, velocity) offset += duration trk << NoteOn.new(offset, channel, pitch, 0) end seq << trk print seq.encode