Sha256: 880a2d4ad8d65e93e64da195cb8b972d684aff4b33f43b8561c8f273e711aa3a

Contents?: true

Size: 1.49 KB

Versions: 1

Compression:

Stored size: 1.49 KB

Contents

module Coltrane
  # It describes a sequence of intervals
  class IntervalSequence
    attr_reader :intervals

    def initialize(arg)
      arg = [arg] if arg.class != Array
      @intervals = arg.reduce([]) do |memo, arg_item|
        case arg_item
        when Numeric  then memo << Interval.new(arg_item)
        when Interval then memo << arg_item
        when NoteSet  then memo + intervals_from_note_set(arg_item)
        end
      end
    end

    def intervals_from_note_set(note_set)
      note_numbers = note_set.notes.collect(&:number)
      root         = note_numbers.shift
      note_numbers.reduce([Interval.new(0)]) do |memo, number|
        number += 12 if number < root
        memo << Interval.new(number - root)
      end
    end

    def reordered
      IntervalSequence.new @intervals.sort_by!(&:number)
    end

    def all
      intervals
    end

    def [](x)
      intervals[x]
    end

    def shift(ammount)
      IntervalSequence.new(intervals.map do |i|
        (i.number + ammount) % 12
      end)
    end

    def zero_it
      self.shift(-intervals.first.number)
    end

    def next_inversion
      IntervalSequence.new(intervals.rotate(+1))
    end

    def previous_inversion
      IntervalSequence.new(intervals.rotate(-1))
    end

    def inversions
      Array.new(intervals.length) do |index|
        IntervalSequence.new(interval.rotate(index))
      end
    end

    def numbers
      intervals.collect(&:number)
    end

    def names
      intervals.collect(&:name)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
coltrane-0.0.2 lib/coltrane/interval_sequence.rb