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 |