Sha256: 32c08edf83d9d49249806910b6de7e99636d341434ad569c5d639e3ed96633cd

Contents?: true

Size: 1.02 KB

Versions: 11

Compression:

Stored size: 1.02 KB

Contents

module Coltrane
  module Theory
    class GreekMode < Scale
      attr_reader :mode

      MODES = %w[
        Ionian
        Dorian
        Phrygian
        Lydian
        Mixolydian
        Aeolian
        Locrian
      ].freeze

      LETTER_SEQUENCE = %w[C D E F G A B].freeze

      def initialize(mode, tone)
        super name: mode.capitalize, notes: begin
          @mode = mode.to_s
          @tone = Note[tone]
          base_major_notes
          .rotate(mode_index)
          .zip(letter_sequence)
          .map { |(note, letter)| note.as(letter) }
        end
      end

      private

      def letter_sequence
        LETTER_SEQUENCE.yield_self { |seq| seq.rotate(seq.index(tone.letter))}
      end

      def mode_index
        @mode_index ||= MODES.map(&:downcase).index(mode.to_s)
      end

      def base_major_notes
        base_scale    = DiatonicScale.new(Note['C']).notes
        base_interval = base_scale[0] - base_scale[mode_index]
        DiatonicScale.new(Note[tone] - base_interval).notes
      end
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
coltrane-4.1.2 lib/coltrane/theory/greek_mode.rb
coltrane-4.1.1 lib/coltrane/theory/greek_mode.rb
coltrane-4.1.0 lib/coltrane/theory/greek_mode.rb
coltrane-4.0.6 lib/coltrane/theory/greek_mode.rb
coltrane-4.0.5 lib/coltrane/theory/greek_mode.rb
coltrane-4.0.4 lib/coltrane/theory/greek_mode.rb
coltrane-4.0.3 lib/coltrane/theory/greek_mode.rb
coltrane-3.4.2 lib/coltrane/theory/greek_mode.rb
coltrane-3.4.1 lib/coltrane/theory/greek_mode.rb
coltrane-3.4.0 lib/coltrane/theory/greek_mode.rb
coltrane-3.3.3 lib/coltrane/theory/greek_mode.rb