Class: Tonal::Midi::Note
- Inherits:
-
Object
- Object
- Tonal::Midi::Note
- Includes:
- Comparable
- Defined in:
- lib/tonal/midi.rb
Constant Summary collapse
- A4_MIDI_NUMBER =
69- C4_MIDI_NUMBER =
60- DEFAULT_MODULO =
12
Instance Attribute Summary collapse
-
#modulo ⇒ Object
readonly
Returns the value of attribute modulo.
-
#number ⇒ Object
(also: #value)
readonly
Returns the value of attribute number.
-
#reference_frequency ⇒ Object
readonly
Returns the value of attribute reference_frequency.
-
#reference_number ⇒ Object
readonly
Returns the value of attribute reference_number.
Instance Method Summary collapse
- #<=>(other) ⇒ Object
-
#frequency(round: nil) ⇒ Float
The frequency corresponding to the MIDI note number.
- #initialize(number: nil, frequency: nil, modulo: DEFAULT_MODULO, reference_number: A4_MIDI_NUMBER, reference_frequency: Tonal::Hertz::REFERENCE_FREQUENCY) ⇒ Tonal::Midi::Note constructor
-
#inspect ⇒ String
Representation of self.
Constructor Details
#initialize(number: nil, frequency: nil, modulo: DEFAULT_MODULO, reference_number: A4_MIDI_NUMBER, reference_frequency: Tonal::Hertz::REFERENCE_FREQUENCY) ⇒ Tonal::Midi::Note
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/tonal/midi.rb', line 21 def initialize(number: nil, frequency: nil, modulo: DEFAULT_MODULO, reference_number: A4_MIDI_NUMBER, reference_frequency: Tonal::Hertz::REFERENCE_FREQUENCY) raise ArgumentError, "Provide either number: or frequency:, not both" if number && frequency @modulo = modulo @reference_number = reference_number @reference_frequency = reference_frequency.to_f if frequency raise ArgumentError, "Frequency argument is not Numeric or Tonal::Hertz" unless frequency.kind_of?(Numeric) || frequency.kind_of?(Tonal::Hertz) @frequency = Tonal::Hertz.new(frequency) @number = (@reference_number + modulo * Math.log2(frequency.to_f / @reference_frequency)).round else number = @reference_number if number.nil? raise ArgumentError, "Number argument is not Integer" unless number.kind_of?(Integer) @number = number @frequency = Tonal::Hertz.new(@reference_frequency * (2 ** ((number - @reference_number) / modulo.to_f))) end end |
Instance Attribute Details
#modulo ⇒ Object (readonly)
Returns the value of attribute modulo.
9 10 11 |
# File 'lib/tonal/midi.rb', line 9 def modulo @modulo end |
#number ⇒ Object (readonly) Also known as: value
Returns the value of attribute number.
9 10 11 |
# File 'lib/tonal/midi.rb', line 9 def number @number end |
#reference_frequency ⇒ Object (readonly)
Returns the value of attribute reference_frequency.
9 10 11 |
# File 'lib/tonal/midi.rb', line 9 def reference_frequency @reference_frequency end |
#reference_number ⇒ Object (readonly)
Returns the value of attribute reference_number.
9 10 11 |
# File 'lib/tonal/midi.rb', line 9 def reference_number @reference_number end |
Instance Method Details
#<=>(other) ⇒ Object
55 56 57 |
# File 'lib/tonal/midi.rb', line 55 def <=>(other) number <=> (other.kind_of?(self.class) ? other.number : other) end |
#frequency(round: nil) ⇒ Float
Returns the frequency corresponding to the MIDI note number.
46 47 48 |
# File 'lib/tonal/midi.rb', line 46 def frequency(round: nil) round ? @frequency.to_f.round(round) : @frequency.to_f end |
#inspect ⇒ String
Returns representation of self.
51 52 53 |
# File 'lib/tonal/midi.rb', line 51 def inspect "#{number} MIDI" end |