class Diamond::Clock

A wrapper for Topaz::Tempo that's geared towards the arpeggiator

Public Class Methods

new(tempo_or_input, options = {}) click to toggle source

@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

<<(arpeggiator)
Alias for: add
add(arpeggiator) click to toggle source

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
Also aliased as: <<
midi_outputs() click to toggle source

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) click to toggle source

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(options = {}) click to toggle source

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() click to toggle source

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

initialize_clock(tempo_or_input, options = {}) click to toggle source

@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_events() click to toggle source

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