Method: Coltrane::Theory::Interval#initialize

Defined in:
lib/coltrane/theory/interval.rb

#initialize(arg_1 = nil, arg_2 = nil, ascending: true, letter_distance: nil, semitones: nil, compound: false) ⇒ Interval

Returns a new instance of Interval.



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/coltrane/theory/interval.rb', line 40

def initialize(arg_1 = nil, arg_2 = nil, ascending: true,
               letter_distance: nil,
               semitones: nil,
               compound: false)
  if arg_1 && !arg_2 # assumes arg_1 is a letter
    @compound = compound
    IntervalClass[arg_1].interval.yield_self do |interval|
      @letter_distance = interval.letter_distance
      @cents = interval.cents
    end
  elsif arg_1 && arg_2 # assumes those are notes
    if ascending
      @compound = compound
      @cents =
        (arg_1.frequency / arg_2.frequency)
        .interval_class
        .cents

      @letter_distance = calculate_letter_distance arg_1.letter,
                                                   arg_2.letter,
                                                   ascending
    else
      self.class.new(arg_1, arg_2).descending.yield_self do |base_interval|
        @compound        = base_interval.compound?
        @cents           = base_interval.cents
        @letter_distance = base_interval.letter_distance
      end
    end
  elsif letter_distance && semitones
    @compound        = compound || letter_distance > 8
    @cents           = semitones * 100
    @letter_distance = letter_distance
  else
    raise WrongKeywordsError,
          '[interval_class_name]' \
          'Provide: [first_note, second_note] || ' \
          '[letter_distance:, semitones:]'
  end
end