This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.

Generating MIDI Music
CodeExpectedActual
require 'rubygems'
require 'midilib'
false false
class Array
  def to_midi(file, note_length='eighth') 
    midi_max = 108.0
    midi_min = 21.0    
    low, high = min, max
    song = MIDI::Sequence.new
    # Create a new track to hold the melody, running at 120 beats per minute.
    song.tracks << (melody = MIDI::Track.new(song))
    melody.events << MIDI::Tempo.new(MIDI::Tempo.bpm_to_mpq(120))
    # Tell channel zero to use the "piano" sound.
    melody.events << MIDI::ProgramChange.new(0, 0)
    # Create a series of note events that play on channel zero.
    each do |number|
      midi_note = (midi_min + ((number-midi_min) * (midi_max-low)/high)).to_i
      melody.events << MIDI::NoteOnEvent.new(0, midi_note, 127, 0)
      melody.events << MIDI::NoteOffEvent.new(0, midi_note, 127, 
                                              song.note_to_delta(note_length))
    end
    open(file, 'w') { |f| song.write(f) }
  end
end
((1..100).collect { |x| x ** 2 }).to_midi('squares.mid')
class TimedTrack < MIDI::Track
  MIDDLE_C = 60
  @@channel_counter=0
  def initialize(number, song)
    super(number)
    @sequence = song
    @time = 0
    @channel = @@channel_counter
    @@channel_counter += 1
  end
  # Tell this track's channel to use the given instrument, and
  # also set the track's instrument display name.
  def instrument=(instrument)
    @events << MIDI::ProgramChange.new(@channel, instrument)
    super(MIDI::GM_PATCH_NAMES[instrument])
  end
  # Add one or more notes to sound simultaneously. Increments the per-track
  # timer so that subsequent notes will sound after this one finishes.
  def add_notes(offsets, velocity=127, duration='quarter')
    offsets = [offsets] unless offsets.respond_to? :each
    offsets.each do |offset|
      event(MIDI::NoteOnEvent.new(@channel, MIDDLE_C + offset, velocity))
    end   
    @time += @sequence.note_to_delta(duration)
    offsets.each do |offset|
      event(MIDI::NoteOffEvent.new(@channel, MIDDLE_C + offset, velocity))
    end
    recalc_delta_from_times
  end
  # Uses add_notes to sound a chord (a major triad in root position), using the
  # given note as the low note. Like add_notes, increments the per-track timer.
  def add_major_triad(low_note, velocity=127, duration='quarter')
    add_notes([0, 4, 7].collect { |x| x + low_note }, velocity, duration)
  end
  private
  def event(event)    
    @events << event
   event.time_from_start = @time
  end
end
song = MIDI::Sequence.new
song.tracks << (melody = TimedTrack.new(0, song))
song.tracks << (background = TimedTrack.new(1, song))
melody.instrument = 56                 # Trumpet
background.instrument = 19             # Church organ
melody.events << MIDI::Tempo.new(MIDI::Tempo.bpm_to_mpq(120))
melody.events << MIDI::MetaEvent.new(MIDI::META_SEQ_NAME, 
                                    'A random Ruby composition')
Some musically pleasing intervals: thirds and fifths.
intervals = [-5, -1, 0, 4, 7]
Start at middle C.
note = 0
Create 8 measures of music in 4/4 time
(8*4).times do |i|
  note += intervals[rand(intervals.size)]
  #Reset to middle C if we go out of the MIDI range
  note = 0 if note < -39 or note > 48
  # Add a quarter note on every beat.
  melody.add_notes(note, 127, 'quarter')
  # Add a chord of whole notes at the beginning of each measure.
  background.add_major_triad(note, 50, 'whole') if i % 4 == 0
end
open('random.mid', 'w') { |f| song.write(f) }
[#<TimedTrack:0xb79cf8d4 @channels_used=0, @instrument="Trumpet", @time=15360, @events=[#<MIDI::ProgramChange:0xb79c6c5c @status=192, @is_system=false, @program=56, @is_note=false, @is_meta=false, @is_channel=true, @time_from_start=0, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @is_note_on=false>, #<MIDI::Tempo:0xb79b9124 @meta_type=81, @status=255, @is_system=false, @data=500000, @is_note=false, @is_meta=true, @is_channel=false, @time_from_start=0, @is_note_off=false, @delta_time=0, @is_realtime=false, @is_note_on=false>, #<MIDI::MetaEvent:0xb79b2090 @meta_type=3, @status=255, @is_system=false, @data="A random Ruby composition", @is_note=false, @is_meta=true, @is_channel=false, @time_from_start=0, @is_note_off=false, @delta_time=0, @is_realtime=false, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb7990ad0 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=0, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=64, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb7990a1c @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=480, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=64, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb79907b0 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=480, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=59, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb7990724 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=960, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=59, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb79906ac @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=960, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=58, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb7990620 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=1440, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=58, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb7990594 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=1440, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=53, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb799051c @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=1920, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=53, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb7990490 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=1920, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=60, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb7990418 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=2400, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=60, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb799024c @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=2400, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=64, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb79901d4 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=2880, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=64, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb7990148 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=2880, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=64, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb79900d0 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=3360, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=64, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb7990058 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=3360, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=63, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798ffcc @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=3840, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=63, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798ff40 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=3840, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=67, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798fea0 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=4320, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=67, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798fc98 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=4320, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=71, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798fbd0 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=4800, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=71, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798fb30 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=4800, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=78, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798fab8 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=5280, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=78, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798fa40 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=5280, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=77, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798f9b4 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=5760, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=77, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798f8ec @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=5760, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=77, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798e258 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=6240, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=77, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798e014 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=6240, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=81, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798df88 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=6720, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=81, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798defc @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=6720, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=76, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798de84 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=7200, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=76, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798de0c @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=7200, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=83, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798dd80 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=7680, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=83, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798dcf4 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=7680, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=78, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798dc68 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=8160, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=78, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798da60 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=8160, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=77, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798d9e8 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=8640, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=77, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798d95c @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=8640, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=77, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798d8d0 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=9120, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=77, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798d81c @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=9120, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=76, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798d768 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=9600, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=76, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798d6b4 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=9600, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=80, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798d600 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=10080, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=80, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798d344 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=10080, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=79, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798d290 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=10560, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=79, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798d1dc @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=10560, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=83, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798d128 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=11040, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=83, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798d074 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=11040, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=90, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798cfc0 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=11520, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=90, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798cf0c @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=11520, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=89, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798ce58 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=12000, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=89, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798cbb0 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=12000, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=88, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798cafc @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=12480, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=88, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798ca48 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=12480, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=95, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798c994 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=12960, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=95, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798c8e0 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=12960, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=99, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798c82c @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=13440, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=99, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798c778 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=13440, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=103, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798c6c4 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=13920, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=103, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798c408 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=13920, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=60, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798c354 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=14400, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=60, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798c2a0 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=14400, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=60, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798c1ec @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=14880, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=60, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798c138 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=14880, @velocity=127, @is_note_off=false, @channel=0, @delta_time=0, @is_realtime=false, @note=59, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798c084 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=15360, @velocity=127, @is_note_off=true, @channel=0, @delta_time=480, @is_realtime=false, @note=59, @is_note_on=false>], @channel=0, @sequence=#<MIDI::Sequence:0xb7bf3450 @ppqn=480, @writer_class=MIDI::IO::SeqWriter, @clocks=480, @tracks=[...], @denom=2, @reader_class=MIDI::IO::SeqReader, @numer=4, @qnotes=8>>, #<TimedTrack:0xb79ca30c @channels_used=0, @instrument="Church Organ", @time=15360, @events=[#<MIDI::ProgramChange:0xb79c3764 @status=192, @is_system=false, @program=19, @is_note=false, @is_meta=false, @is_channel=true, @time_from_start=0, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb799092c @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=0, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=64, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb7990904 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=0, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=68, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb79908f0 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=0, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=71, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb7990864 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=1920, @velocity=50, @is_note_off=true, @channel=1, @delta_time=1920, @is_realtime=false, @note=64, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb7990850 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=1920, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=68, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb799083c @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=1920, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=71, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb7990378 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=1920, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=60, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb7990364 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=1920, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=64, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb7990350 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=1920, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=67, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb79902d8 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=3840, @velocity=50, @is_note_off=true, @channel=1, @delta_time=1920, @is_realtime=false, @note=60, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb79902c4 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=3840, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=64, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb79902b0 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=3840, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=67, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798fe00 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=3840, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=67, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb798fdec @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=3840, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=71, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb798fdd8 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=3840, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=74, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798fd4c @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=5760, @velocity=50, @is_note_off=true, @channel=1, @delta_time=1920, @is_realtime=false, @note=67, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb798fd38 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=5760, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=71, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb798fd24 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=5760, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=74, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798e190 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=5760, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=77, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb798e17c @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=5760, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=81, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb798e12c @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=5760, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=84, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798e0a0 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=7680, @velocity=50, @is_note_off=true, @channel=1, @delta_time=1920, @is_realtime=false, @note=77, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb798e08c @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=7680, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=81, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb798e078 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=7680, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=84, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798dbb4 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=7680, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=78, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb798dba0 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=7680, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=82, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb798db8c @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=7680, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=85, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798db00 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=9600, @velocity=50, @is_note_off=true, @channel=1, @delta_time=1920, @is_realtime=false, @note=78, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb798daec @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=9600, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=82, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb798dac4 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=9600, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=85, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798d510 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=9600, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=80, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb798d4e8 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=9600, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=84, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb798d4d4 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=9600, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=87, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798d420 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=11520, @velocity=50, @is_note_off=true, @channel=1, @delta_time=1920, @is_realtime=false, @note=80, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb798d3f8 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=11520, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=84, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb798d3e4 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=11520, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=87, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798cd68 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=11520, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=89, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb798cd54 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=11520, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=93, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb798cd2c @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=11520, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=96, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798cc78 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=13440, @velocity=50, @is_note_off=true, @channel=1, @delta_time=1920, @is_realtime=false, @note=89, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb798cc64 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=13440, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=93, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb798cc3c @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=13440, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=96, @is_note_on=false>, #<MIDI::NoteOnEvent:0xb798c5d4 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=13440, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=103, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb798c5ac @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=13440, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=107, @is_note_on=true>, #<MIDI::NoteOnEvent:0xb798c598 @status=144, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=13440, @velocity=50, @is_note_off=false, @channel=1, @delta_time=0, @is_realtime=false, @note=110, @is_note_on=true>, #<MIDI::NoteOffEvent:0xb798c4e4 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=15360, @velocity=50, @is_note_off=true, @channel=1, @delta_time=1920, @is_realtime=false, @note=103, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb798c4bc @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=15360, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=107, @is_note_on=false>, #<MIDI::NoteOffEvent:0xb798c4a8 @status=128, @is_system=false, @is_note=true, @is_meta=false, @is_channel=true, @time_from_start=15360, @velocity=50, @is_note_off=true, @channel=1, @delta_time=0, @is_realtime=false, @note=110, @is_note_on=false>], @channel=1, @sequence=#<MIDI::Sequence:0xb7bf3450 @ppqn=480, @writer_class=MIDI::IO::SeqWriter, @clocks=480, @tracks=[...], @denom=2, @reader_class=MIDI::IO::SeqReader, @numer=4, @qnotes=8>>]