Sha256: 2ab85ac96e65d65cb1c4fe6b8b2c71cce8027b662ce63272f1991b45258e7775
Contents?: true
Size: 1.58 KB
Versions: 3
Compression:
Stored size: 1.58 KB
Contents
# A chromatic interval is the distance between two pitches measured in half-steps. class HeadMusic::ChromaticInterval include Comparable include HeadMusic::Named private_class_method :new NAMES = %w[ perfect_unison minor_second major_second minor_third major_third perfect_fourth tritone perfect_fifth minor_sixth major_sixth minor_seventh major_seventh perfect_octave ].freeze attr_reader :semitones def self.get(identifier) @intervals ||= {} candidate = identifier.to_s.downcase.gsub(/\W+/, "_") semitones = NAMES.index(candidate) || identifier.to_i @intervals[semitones] ||= new(semitones.to_i) end def initialize(identifier) if /^\D/i.match?(identifier.to_s.strip) candidate = identifier.to_s.downcase.gsub(/\W+/, "_") semitones = NAMES.index(candidate) || identifier.to_i end @semitones = semitones || identifier.to_i set_name end def set_name candidate = semitones while name.nil? && candidate > 0 self.name = NAMES[candidate] candidate -= 12 end end def simple HeadMusic::ChromaticInterval.get(semitones % 12) end def simple? (0..12).cover?(semitones) end def compound? semitones > 12 end def to_i semitones end def diatonic_name NAMES[simple.semitones].tr("_", " ") end # diatonic set theory alias_method :specific_interval, :semitones def +(other) HeadMusic::ChromaticInterval.get(to_i + other.to_i) end def -(other) HeadMusic::ChromaticInterval.get((to_i - other.to_i).abs) end def <=>(other) to_i <=> other.to_i end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
head_music-7.0.5 | lib/head_music/chromatic_interval.rb |
head_music-7.0.4 | lib/head_music/chromatic_interval.rb |
head_music-7.0.3 | lib/head_music/chromatic_interval.rb |