Skip to content

Instantly share code, notes, and snippets.

@aalin
Created April 8, 2010 18:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aalin/360350 to your computer and use it in GitHub Desktop.
Save aalin/360350 to your computer and use it in GitHub Desktop.
class Scale
IONIAN_HALF_STEPS = [2, 2, 1, 2, 2, 2, 1]
class << self
[
:ionian,
:dorian,
:phrygian,
:lydian,
:mixolydian,
:aeolian,
:locrian
].each_with_index do |name, i|
define_method(name) do
half_steps = IONIAN_HALF_STEPS.dup
i.times { half_steps.push(half_steps.shift) }
from_half_steps(half_steps)
end
end
end
def self.from_half_steps(*half_steps)
values = half_steps.flatten[0..-2].inject([0]) { |a, x|
a + [(a.last + x) % 12]
}.uniq
new(values)
end
attr_reader :values
def initialize(values)
@values = values
end
end
puts Scale.ionian.values.inspect
puts Scale.dorian.values.inspect
puts Scale.ionian.values.inspect
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment