Sha256: 6d7dd005ebccf50f63ba736e4cea6317643414631d9827eeef991befaa8cd31f

Contents?: true

Size: 1.36 KB

Versions: 3

Compression:

Stored size: 1.36 KB

Contents

module Music
module Transcription

class Meter
  include Validatable

  attr_reader :measure_duration, :beat_duration, :beats_per_measure
  
  def initialize beats_per_measure, beat_duration
    @beats_per_measure = beats_per_measure
    @beat_duration = beat_duration
    @measure_duration = beats_per_measure * beat_duration    
  end
  
  def check_methods
    [ :check_beats_per_measure, :check_beat_duration ]
  end
  
  def check_beats_per_measure
    unless @beats_per_measure > 0
      raise NonPositiveError, "beats per measure #{@beats_per_measure} is not positive"
    end
    
    unless @beats_per_measure.is_a?(Integer)
      raise NonIntegerError, "beats per measure #{@beats_per_measure} is not an integer"
    end
  end
    
  def check_beat_duration
    unless @beat_duration > 0
      raise NonPositiveError, "beat duration #{@beat_duration} is not positive"
    end
    
    unless @beat_duration > 0
      raise NonRationalError, "beat duration #{@beat_duration} is a rational"
    end
  end
  
  def ==(other)
    return (@beats_per_measure == other.beats_per_measure &&
      @beat_duration == other.beat_duration)
  end
  
  def to_s
    if beat_duration.numerator == 1
      num = beats_per_measure * beat_duration.numerator
      den = beat_duration.denominator
      "#{num}/#{den}"
    else
      "#{beats_per_measure}*#{beat_duration}"
    end
  end
end

end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
music-transcription-0.21.0 lib/music-transcription/model/meter.rb
music-transcription-0.20.0 lib/music-transcription/model/meter.rb
music-transcription-0.19.0 lib/music-transcription/model/meter.rb