Module: Musa::Scales::Scales
- Defined in:
- lib/musa-dsl/music/scales.rb
Overview
Scale system registry.
The Scales module provides a central registry for scale systems, allowing access by symbol ID or method name.
Registration
Scale systems register themselves using Scales.register:
Scales.register EquallyTempered12ToneScaleSystem, default: true
Access Methods
By symbol:
Scales[:et12] # => EquallyTempered12ToneScaleSystem
Scales[:et12][440.0] # => ScaleSystemTuning with A=440Hz
By method name:
Scales.et12 # => EquallyTempered12ToneScaleSystem
Scales.et12[440.0] # => ScaleSystemTuning with A=440Hz
Default system:
Scales.default_system # => The default scale system
Scales.default_system.default_tuning # => Default tuning (A=440Hz)
Class Method Summary collapse
-
.default_system ⇒ Class<ScaleSystem>
Returns the default scale system.
-
.extend_metadata(scale_kind_id, **metadata) ⇒ Hash
Convenience method to extend metadata for a scale kind by ID.
-
.get(id) ⇒ Class<ScaleSystem>
(also: [])
Retrieves a registered scale system by ID.
-
.register(scale_system, default: nil) ⇒ self
Registers a scale system.
Class Method Details
.default_system ⇒ Class<ScaleSystem>
Returns the default scale system.
167 168 169 |
# File 'lib/musa-dsl/music/scales.rb', line 167 def self.default_system @default_scale_system end |
.extend_metadata(scale_kind_id, **metadata) ⇒ Hash
Convenience method to extend metadata for a scale kind by ID.
Finds the ScaleKind class by its ID symbol and adds custom metadata to it. This is a shortcut for accessing the class directly and calling extend_metadata.
186 187 188 189 190 191 192 193 194 |
# File 'lib/musa-dsl/music/scales.rb', line 186 def self.(scale_kind_id, **) system = default_system raise KeyError, "No default scale system registered" unless system klass = system.scale_kind_class(scale_kind_id) raise KeyError, "Scale kind :#{scale_kind_id} not found" unless klass klass.(**) end |
.get(id) ⇒ Class<ScaleSystem> Also known as: []
Retrieves a registered scale system by ID.
151 152 153 154 155 |
# File 'lib/musa-dsl/music/scales.rb', line 151 def self.get(id) raise KeyError, "Scale system :#{id} not found" unless @scale_systems.key?(id) @scale_systems[id] end |
.register(scale_system, default: nil) ⇒ self
Registers a scale system.
Makes the scale system available via symbol lookup and dynamic method. Optionally marks it as the default system.
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/musa-dsl/music/scales.rb', line 123 def self.register(scale_system, default: nil) @scale_systems ||= {} if (existing = @scale_systems[scale_system.id]) raise ArgumentError, "scale system #{scale_system.id.inspect} is already registered " \ "as #{existing.name}; unregister it first if you mean to replace it" end @scale_systems[scale_system.id] = scale_system @default_scale_system = scale_system if default self.class.define_method scale_system.id do scale_system end self end |