Sha256: 8e919ca680c3417eed23b5a49d83ef82cf51e5b38ca03ed9102336942c716a3b

Contents?: true

Size: 1.57 KB

Versions: 1

Compression:

Stored size: 1.57 KB

Contents

class HeadMusic::Position
  attr_reader :composition, :measure_number, :count, :tick
  delegate :to_s, to: :code
  delegate :meter, to: :composition

  def initialize(composition, code_or_measure, count = nil, tick = nil)
    if code_or_measure.is_a?(String) && code_or_measure =~ /\D/
      ensure_state(composition, *code_or_measure.split(/\D+/))
    else
      ensure_state(composition, code_or_measure, count, tick)
    end
  end

  def code
    [measure_number, count, tick].join(':')
  end

  def state
    [composition.name, code].join(' ')
  end

  def ==(other)
    self.state == other.state
  end

  private

  def ensure_state(composition, measure_number, count, tick)
    @composition = composition
    @measure_number = measure_number.to_i
    @count = (count || 1).to_i
    @tick = (tick || 0).to_i
    roll_over_units
  end

  def roll_over_units
    roll_over_ticks
    roll_over_counts
  end

  def roll_over_ticks
    while @tick > meter.ticks_per_count
      @tick -= meter.ticks_per_count.to_i
      @count += 1
    end
  end

  def roll_over_counts
    while @count > meter.counts_per_measure
      @count -= meter.counts_per_measure
      @measure_number += 1
    end
  end
end

# In Logic Pro X, the 'beat' is determined by the denominator, even if compound.
# Logic then divides the beat into 'divisions' that are a sixteenth in length.
# Each division is then divided into 240 ticks (960 PPQN / 4 sixteenths-per-quarter)

# Tempo specifies the beat unit, usually the traditional beat unit in the case of compound meters,
# so 6/8 would specify [dotted-quarter] = 132 (or whatever).

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
head_music-0.7.0 lib/head_music/position.rb