Sha256: a846eae57800fe39e29bb19328b60297e5735b37cfedef00ac0df14b985afef8

Contents?: true

Size: 918 Bytes

Versions: 3

Compression:

Stored size: 918 Bytes

Contents

# frozen_string_literal: true

require 'head_music/interval_cycle'

# A Circle of Fifths or Fourths shows relationships between pitch classes
class HeadMusic::Circle < HeadMusic::IntervalCycle
  def self.of_fifths
    get(7)
  end

  def self.of_fourths
    get(5)
  end

  def self.get(interval = 7)
    @circles ||= {}
    @circles[interval.to_i] ||= new(interval)
  end

  attr_reader :interval, :pitch_classes

  # Accepts an interval (as an integer number of semitones)
  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 interval_cycle
    @interval_cycle ||= HeadMusic::IntervalCycle.get(interval)
  end

  def pitch_classes_by_interval
    interval_cycle.send(:pitch_classes_by_interval)
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

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