class Diamond::Clock
A wrapper for Topaz::Tempo that's geared towards the arpeggiator
Public Class Methods
@param [Fixnum, UniMIDI::Input] tempo_or_input @param [Hash] options @option options [Array<UniMIDI::Output>, UniMIDI::Output] :output MIDI
output device(s) (also: :outputs)
# File lib/diamond/clock.rb, line 13 def initialize(tempo_or_input, options = {}) @arpeggiators = [] output = options[:output] || options[:outputs] || options[:midi] initialize_clock(tempo_or_input, :output => output) initialize_events end
Public Instance Methods
Add arpeggiator(s) to this clock's control @param [Array<Arpeggiator>, Arpeggiator] arpeggiator @return [Array<Arpeggiator>]
# File lib/diamond/clock.rb, line 50 def add(arpeggiator) arpeggiators = [arpeggiator].flatten @arpeggiators += arpeggiators @arpeggiators end
Shortcut to the clock's MIDI
output devices @return [Array<UniMIDI::Output>]
# File lib/diamond/clock.rb, line 22 def midi_outputs @clock.midi_output.devices end
Remove arpeggiator(s) from this clock's control @param [Array<Arpeggiator>, Arpeggiator] arpeggiator @return [Array<Arpeggiator>]
# File lib/diamond/clock.rb, line 60 def remove(arpeggiator) arpeggiators = [arpeggiator].flatten @arpeggiators.delete_if { |arpeggiator| arpeggiators.include?(arpeggiator) } @arpeggiators end
Start the clock @param [Hash] options @option options [Boolean] :blocking Whether to run in the foreground (also :focus, :foreground) @option options [Boolean] :suppress_clock Whether this clock is a sync-slave @return [Boolean]
# File lib/diamond/clock.rb, line 31 def start(options = {}) begin @clock.start(options) rescue SystemExit, Interrupt => exception stop end end
Stop the clock (and fire the arpeggiator sequencer stop event) @return [Boolean]
# File lib/diamond/clock.rb, line 41 def stop @arpeggiators.each { |arpeggiator| arpeggiator.sequencer.event.do_stop } @clock.stop true end
Private Instance Methods
@param [Fixnum, UniMIDI::Input] tempo_or_input @param [Hash] options @option options [Array<UniMIDI::Output>, UniMIDI::Output] :output MIDI
output device(s) @option options [Fixnum] :resolution @return [Topaz::Clock]
# File lib/diamond/clock.rb, line 73 def initialize_clock(tempo_or_input, options = {}) @clock = Topaz::Clock.new(tempo_or_input, :midi => options[:output]) resolution = options.fetch(:resolution, 128) @clock.interval = @clock.interval * (resolution / @clock.interval) @clock end
Initialize the tick event @return [Boolean]
# File lib/diamond/clock.rb, line 82 def initialize_events @arpeggiators.each do |arpeggiator| arpeggiator.sequencer.event.stop << proc { @clock.stop } end @clock.event.tick << proc do @arpeggiators.map do |arpeggiator| arpeggiator.sequencer.exec(arpeggiator.sequence) arpeggiator end end true end