Sha256: c257a30c283902c78b3cbb8116718447ec551283c33bc28b7a7b064d869eb1e9

Contents?: true

Size: 871 Bytes

Versions: 3

Compression:

Stored size: 871 Bytes

Contents

# frozen_string_literal: true

# An Interval Cycle is a collection of pitch classes created from a sequence of the same interval class.
class HeadMusic::IntervalCycle
  def self.get(interval = 7)
    @circles ||= {}
    interval = interval.to_s.gsub(/^C/i, '').to_i
    @circles[interval.to_i] ||= new(interval)
  end

  attr_reader :interval, :pitch_classes

  def initialize(interval)
    @interval = interval.to_i
    @pitch_classes = pitch_classes_by_interval
  end

  def index(pitch_class)
    @pitch_classes.index(HeadMusic::Spelling.get(pitch_class).pitch_class)
  end

  private_class_method :new

  private

  def pitch_classes_by_interval
    [HeadMusic::PitchClass.get(0)].tap do |list|
      loop do
        next_pitch_class = list.last + interval
        break if next_pitch_class == list.first

        list << next_pitch_class
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
head_music-0.23.4 lib/head_music/interval_cycle.rb
head_music-0.23.3 lib/head_music/interval_cycle.rb
head_music-0.23.2 lib/head_music/interval_cycle.rb