Class: Musa::Scales::ScaleSystem Abstract
Overview
Subclass and implement abstract methods
Abstract base class for musical scale systems.
ScaleSystem defines the foundation of a tuning system, including:
- Number of notes per octave
- Available intervals
- Frequency calculation method
- Registered scale kinds (major, minor, etc.)
Subclass Requirements
Subclasses must implement:
- ScaleSystem.id: Unique symbol identifier
- ScaleSystem.notes_in_octave: Number of notes in an octave
- ScaleSystem.part_of_tone_size: Size of smallest pitch unit (for sharps/flats)
- ScaleSystem.intervals: Hash of named intervals to semitone offsets
- ScaleSystem.frequency_of_pitch: Pitch to frequency conversion
Optionally override:
- ScaleSystem.default_a_frequency: Reference A frequency (defaults to 440.0 Hz)
Usage
ScaleSystem is accessed via Scales module, not instantiated directly:
system = Scales[:et12] # Get system
tuning = system[440.0] # Get tuning
scale = tuning.major[60] # Get scale
Direct Known Subclasses
Class Method Summary collapse
-
.[](a_frequency) ⇒ ScaleSystemTuning
Creates or retrieves a tuning for this scale system.
-
.chromatic_class ⇒ Class
Returns the chromatic scale kind class.
-
.default_a_frequency ⇒ Float
Returns the default A frequency.
-
.default_tuning ⇒ ScaleSystemTuning
Returns the default tuning (A=440Hz).
-
.frequency_of_pitch(pitch, root_pitch, a_frequency) ⇒ Float
abstract
Calculates frequency for a given pitch.
-
.id ⇒ Symbol
abstract
Returns the unique identifier for this scale system.
-
.intervals ⇒ Hash{Symbol => Integer}
abstract
Returns available intervals as name-to-offset mapping.
-
.notes_in_octave ⇒ Integer
abstract
Returns the number of notes in one octave.
-
.offset_of_interval(name) ⇒ Integer
Returns semitone offset for a named interval.
-
.part_of_tone_size ⇒ Integer
abstract
Returns the size of the smallest pitch unit.
-
.register(scale_kind_class) ⇒ self
Registers a scale kind (major, minor, etc.) with this system.
-
.scale_kind_class(id) ⇒ Class
Retrieves a registered scale kind by ID.
-
.scale_kind_class?(id) ⇒ Boolean
Checks if a scale kind is registered.
-
.scale_kind_classes ⇒ Hash{Symbol => Class}
Returns all registered scale kinds.
Instance Method Summary collapse
-
#==(other) ⇒ Boolean
Compares scale systems for equality.
Class Method Details
.[](a_frequency) ⇒ ScaleSystemTuning
Creates or retrieves a tuning for this scale system.
Returns a Musa::Scales::ScaleSystemTuning instance for the specified A frequency. Tunings are cached—repeated calls with same frequency return same instance.
297 298 299 300 301 302 303 304 |
# File 'lib/musa-dsl/music/scales.rb', line 297 def self.[](a_frequency) a_frequency = a_frequency.to_f @a_tunings ||= {} @a_tunings[a_frequency] = ScaleSystemTuning.new self, a_frequency unless @a_tunings.key?(a_frequency) @a_tunings[a_frequency] end |
.chromatic_class ⇒ Class
Returns the chromatic scale kind class.
373 374 375 376 377 |
# File 'lib/musa-dsl/music/scales.rb', line 373 def self.chromatic_class raise "Chromatic scale kind class for [#{self.id}] scale system undefined" if @chromatic_scale_kind_class.nil? @chromatic_scale_kind_class end |
.default_a_frequency ⇒ Float
Returns the default A frequency.
277 278 279 |
# File 'lib/musa-dsl/music/scales.rb', line 277 def self.default_a_frequency 440.0 end |
.default_tuning ⇒ ScaleSystemTuning
Returns the default tuning (A=440Hz).
323 324 325 |
# File 'lib/musa-dsl/music/scales.rb', line 323 def self.default_tuning self[default_a_frequency] end |
.frequency_of_pitch(pitch, root_pitch, a_frequency) ⇒ Float
Subclass must implement
Calculates frequency for a given pitch.
Converts MIDI pitch numbers to frequencies in Hz. The calculation method depends on the tuning system (equal temperament, just intonation, etc.).
267 268 269 |
# File 'lib/musa-dsl/music/scales.rb', line 267 def self.frequency_of_pitch(pitch, root_pitch, a_frequency) raise 'Method not implemented. Should be implemented in subclass.' end |
.id ⇒ Symbol
Subclass must implement
Returns the unique identifier for this scale system.
194 195 196 |
# File 'lib/musa-dsl/music/scales.rb', line 194 def self.id raise 'Method not implemented. Should be implemented in subclass.' end |
.intervals ⇒ Hash{Symbol => Integer}
Subclass must implement
Returns available intervals as name-to-offset mapping.
Intervals are named using standard music theory notation:
- P (Perfect): P1, P4, P5, P8
- M (Major): M2, M3, M6, M7
- m (minor): m2, m3, m6, m7
- TT: Tritone
242 243 244 245 246 247 |
# File 'lib/musa-dsl/music/scales.rb', line 242 def self.intervals # TODO: implementar intérvalos sinónimos (p.ej, m3 = A2) # TODO: implementar identificación de intérvalos, teniendo en cuenta no sólo los semitonos sino los grados de separación # TODO: implementar inversión de intérvalos raise 'Method not implemented. Should be implemented in subclass.' end |
.notes_in_octave ⇒ Integer
Subclass must implement
Returns the number of notes in one octave.
206 207 208 |
# File 'lib/musa-dsl/music/scales.rb', line 206 def self.notes_in_octave raise 'Method not implemented. Should be implemented in subclass.' end |
.offset_of_interval(name) ⇒ Integer
Returns semitone offset for a named interval.
313 314 315 |
# File 'lib/musa-dsl/music/scales.rb', line 313 def self.offset_of_interval(name) intervals[name] end |
.part_of_tone_size ⇒ Integer
Subclass must implement
Returns the size of the smallest pitch unit.
Used for calculating sharp (#) and flat (♭) alterations. In equal temperament, this is 1 semitone.
221 222 223 |
# File 'lib/musa-dsl/music/scales.rb', line 221 def self.part_of_tone_size raise 'Method not implemented. Should be implemented in subclass.' end |
.register(scale_kind_class) ⇒ self
Registers a scale kind (major, minor, etc.) with this system.
334 335 336 337 338 339 340 341 |
# File 'lib/musa-dsl/music/scales.rb', line 334 def self.register(scale_kind_class) @scale_kind_classes ||= {} @scale_kind_classes[scale_kind_class.id] = scale_kind_class if scale_kind_class.chromatic? @chromatic_scale_kind_class = scale_kind_class end self end |
.scale_kind_class(id) ⇒ Class
Retrieves a registered scale kind by ID.
348 349 350 351 352 |
# File 'lib/musa-dsl/music/scales.rb', line 348 def self.scale_kind_class(id) raise KeyError, "Scale kind class [#{id}] not found in scale system [#{self.id}]" unless @scale_kind_classes.key? id @scale_kind_classes[id] end |
.scale_kind_class?(id) ⇒ Boolean
Checks if a scale kind is registered.
358 359 360 |
# File 'lib/musa-dsl/music/scales.rb', line 358 def self.scale_kind_class?(id) @scale_kind_classes.key? id end |
.scale_kind_classes ⇒ Hash{Symbol => Class}
Returns all registered scale kinds.
365 366 367 |
# File 'lib/musa-dsl/music/scales.rb', line 365 def self.scale_kind_classes @scale_kind_classes end |
Instance Method Details
#==(other) ⇒ Boolean
Compares scale systems for equality.
383 384 385 |
# File 'lib/musa-dsl/music/scales.rb', line 383 def ==(other) self.class == other.class end |