class GlimmerMetronome::Model::Rhythm

Attributes

beat_count[R]
beats[RW]
tempo[RW]

Public Class Methods

new(beat_count) click to toggle source
# File app/glimmer_metronome/model/rhythm.rb, line 32
def initialize(beat_count)
  self.beat_count = beat_count
  @tempo = 120
end

Public Instance Methods

beat_count=(value) click to toggle source
# File app/glimmer_metronome/model/rhythm.rb, line 37
def beat_count=(value)
  @beat_count = value
  reset_beats!
end
off!() click to toggle source
# File app/glimmer_metronome/model/rhythm.rb, line 47
def off!
  beats.select(&:on).each(&:off!)
end
on_beat!(beat_index) click to toggle source
# File app/glimmer_metronome/model/rhythm.rb, line 42
def on_beat!(beat_index)
  off!
  beats[beat_index].on!
end
reset_beats!() click to toggle source
# File app/glimmer_metronome/model/rhythm.rb, line 51
def reset_beats!
  if @beats
    off!
    if beat_count > @beats.count
      @beats += (beat_count - @beats.count).times.map {Beat.new(false)}
    elsif beat_count < @beats.count
      @beats = @beats[0, @beats.count]
    end
  else
    @beats = beat_count.times.map {|i| Beat.new(i == 0)}
  end
  on_beat!(0)
end
tap!() click to toggle source
# File app/glimmer_metronome/model/rhythm.rb, line 65
def tap!
  new_tap_time = Time.now
  @tap_time ||= []
  time_difference = nil
  if @tap_time.any?
    if @tap_time[-2]
      time_difference1 = new_tap_time - @tap_time[-1]
      time_difference2 = @tap_time[-1] - @tap_time[-2]
      time_difference = BigDecimal((time_difference1 + time_difference2).to_s) / 2.0
    else
      time_difference = BigDecimal((new_tap_time - @tap_time[-1]).to_s)
    end
  end
  if time_difference
    if time_difference < 2
      self.tempo = (BigDecimal('60.0') / time_difference)
    else
      @tap_time = []
    end
  end
  @tap_time << Time.now
end