Topaz is a Ruby based music tempo generator / analyzer
gem install midi-topaz
It gives you the ability to time events to a given rate in beats per minute
("sequencer" is some kind of imagined sequencer)
@tempo = Topaz::Tempo.new(130) { sequencer.step! }
or synchronize them to incoming MIDI clock messages
@input = UniMIDI::Input.first.open # a midi input @tempo = Topaz::Tempo.new(@input) { sequencer.step! }
Topaz can also act as a MIDI master clock. If a MIDI output object is passed to Topaz, MIDI start/stop/clock signals will automatically be sent to that output at the appropriate time
@output = UniMIDI::Output.first.open # a midi output @tempo = Topaz::Tempo.new(120, :midi => @output) { sequencer.step! }
an input can be used along with multiple outputs simultaneously
@tempo = Topaz::Tempo.new(@input, :midi => [@output1, @output2]) { sequencer.step! }
once everything is all set, start the clock
@tempo.start
Note that if you are syncing to external clock, nothing will happen until Topaz receives a start or clock message
Other stuff to note...
Whether or not you're using an internal or external clock source, the event block will be called at quarter note intervals by default. If you wish to change this, set the option :interval. In this case, 16th notes will occur at 138 beats per minute where one beat equals one quarter note
@tempo = Topaz::Tempo.new(138, :interval => 16) { sequencer.step! }
View the current tempo, which is calculated by Topaz if you're syncing to an external source.
(this feature is in progress. you might receive some unreliable values - 5/26/2011)
@tempo.tempo => 132.422000
Run the generator in a background thread by passing :background => true to Tempo#start
@tempo.start(:background => true) @tempo.join # join later if you want
Pass a block in that will stop the clock when it evaluates to true
@tempo.stop_when { @i.eql?(20) }