tonal-tools 8.8.0 → 8.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ad355622f7095fece5a99d754e0769935e66757f5d0fdae60ca21f9edfed35f3
4
- data.tar.gz: 6b1ac2a795e4650a2dfc28634a05db3501e76cea05ff999b3958cebe63a37094
3
+ metadata.gz: 6a2b3699a8ff06f96c208824d04c62c5ea28db3915bcabf73d0ff0860fbf677f
4
+ data.tar.gz: e5fb5120820a4bf96d4489cdf0034a43de897d7dab7a040d6cfc94698ec6bb7e
5
5
  SHA512:
6
- metadata.gz: 39fbd7a2445f7290f446f808e185c7291b6d7edf889e57cc5a6a8c7925a51940f9e374de6041dd92b03d244f65a1921b93d532e0fee211e467f6ce26dd926252
7
- data.tar.gz: adcd55527c91b82f3723f32df38163c747aea3c492eb67d57a8a245a2565302f96cf1c84de2e91a33d533442da8ce88bf07c223789b957f48a965dc4deba926b
6
+ metadata.gz: d85688a692e9cdf24bc776d2da3faf817015c9b72d31f2c5a4000f05a29db97bf3c13b78307c92496bd9fac1a3a1da9d34a02f250792af25aaf890a5f646d723
7
+ data.tar.gz: 0a21eff54af842f1a640d4fe6b6081a4679359c72f4e03fb06c782724c573b1ec2b1bcc78fbc8538413a464a8ad35ae18c0d5c72669b74d2a6fb7e86ec3ec566
@@ -1,4 +1,4 @@
1
1
  module Tonal
2
2
  TOOLS_PRODUCER = "mTonal"
3
- TOOLS_VERSION = "8.8.0"
3
+ TOOLS_VERSION = "8.8.1"
4
4
  end
data/lib/tonal/hertz.rb CHANGED
@@ -51,11 +51,12 @@ class Tonal::Hertz
51
51
  # @return [Tonal::Midi::Note] the midi representation of self
52
52
  # @example
53
53
  # Tonal::Hertz.new(440).to_midi => 69.0 MIDI
54
- # @param reference [Tonal::Hertz, Numeric] the reference frequency to compare to
55
54
  # @param modulo [Integer] the modulo to use for the MIDI note calculation
55
+ # @param reference_number [Integer] the MIDI note number that anchors the conversion
56
+ # @param reference_frequency [Numeric] the frequency (Hz) that anchors the conversion
56
57
  #
57
- def to_midi_note(modulo: Tonal::Midi::Note::DEFAULT_MODULO)
58
- Tonal::Midi::Note.new(frequency: to_f, modulo: modulo)
58
+ def to_midi_note(modulo: Tonal::Midi::Note::DEFAULT_MODULO, reference_number: Tonal::Midi::Note::A4_MIDI_NUMBER, reference_frequency: Tonal::Hertz::REFERENCE_FREQUENCY)
59
+ Tonal::Midi::Note.new(frequency: to_f, modulo: modulo, reference_number: reference_number, reference_frequency: reference_frequency)
59
60
  end
60
61
  alias :to_midi :to_midi_note
61
62
 
data/lib/tonal/midi.rb CHANGED
@@ -6,7 +6,7 @@ module Tonal::Midi
6
6
  C4_MIDI_NUMBER = 60
7
7
  DEFAULT_MODULO = 12
8
8
 
9
- attr_reader :number, :modulo
9
+ attr_reader :number, :modulo, :reference_number, :reference_frequency
10
10
 
11
11
  # @return [Tonal::Midi::Note]
12
12
  # @example
@@ -15,20 +15,24 @@ module Tonal::Midi
15
15
  # @param number [Integer, nil] the MIDI note number. Mutually exclusive with frequency:
16
16
  # @param frequency [Numeric, Tonal::Hertz, nil] the frequency in Hz. Mutually exclusive with number:
17
17
  # @param modulo [Integer] the number of steps per octave
18
+ # @param reference_number [Integer] the MIDI note number that anchors the number/frequency conversion
19
+ # @param reference_frequency [Numeric] the frequency (Hz) that anchors the number/frequency conversion
18
20
  #
19
- def initialize(number: nil, frequency: nil, modulo: DEFAULT_MODULO)
21
+ def initialize(number: nil, frequency: nil, modulo: DEFAULT_MODULO, reference_number: A4_MIDI_NUMBER, reference_frequency: Tonal::Hertz::REFERENCE_FREQUENCY)
20
22
  raise ArgumentError, "Provide either number: or frequency:, not both" if number && frequency
21
23
 
22
24
  @modulo = modulo
25
+ @reference_number = reference_number
26
+ @reference_frequency = reference_frequency.to_f
23
27
  if frequency
24
28
  raise ArgumentError, "Frequency argument is not Numeric or Tonal::Hertz" unless frequency.kind_of?(Numeric) || frequency.kind_of?(Tonal::Hertz)
25
29
  @frequency = Tonal::Hertz.new(frequency)
26
- @number = (A4_MIDI_NUMBER + modulo * Math.log2(frequency.to_f / Tonal::Hertz::REFERENCE_FREQUENCY)).round
30
+ @number = (@reference_number + modulo * Math.log2(frequency.to_f / @reference_frequency)).round
27
31
  else
28
- number = A4_MIDI_NUMBER if number.nil?
32
+ number = @reference_number if number.nil?
29
33
  raise ArgumentError, "Number argument is not Integer" unless number.kind_of?(Integer)
30
34
  @number = number
31
- @frequency = Tonal::Hertz.new(Tonal::Hertz::REFERENCE_FREQUENCY * (2 ** ((number - A4_MIDI_NUMBER) / modulo.to_f)))
35
+ @frequency = Tonal::Hertz.new(@reference_frequency * (2 ** ((number - @reference_number) / modulo.to_f)))
32
36
  end
33
37
  end
34
38
 
data/lib/tonal/ratio.rb CHANGED
@@ -187,10 +187,13 @@ class Tonal::Ratio
187
187
  # @example
188
188
  # Tonal::Ratio.new(3,2).to_midi => 76 MIDI
189
189
  # @param reference [Numeric] the reference frequency
190
- # @param modulo [Integer] the modulo for the MIDI note
190
+ # @param modulo [Integer] the number of steps per octave used to scale self's offset from reference. The
191
+ # reference frequency's own MIDI note number is always computed independently of modulo.
191
192
  #
192
193
  def to_midi(reference: Tonal::Hertz.reference, modulo: Tonal::Midi::Note::DEFAULT_MODULO)
193
- to_hertz(reference: reference).to_midi(modulo: modulo)
194
+ reference_hertz = Tonal::Hertz.new(reference)
195
+ reference_number = reference_hertz.to_midi_note.number
196
+ to_hertz(reference: reference_hertz).to_midi_note(modulo: modulo, reference_number: reference_number, reference_frequency: reference_hertz.to_f)
194
197
  end
195
198
 
196
199
  # @return [Integer] the step of self in the given modulo
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tonal-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.8.0
4
+ version: 8.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jose Hales-Garcia
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-07-02 00:00:00.000000000 Z
10
+ date: 2026-07-03 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: yaml