-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathscale_filter_generator.rb
66 lines (61 loc) · 2.4 KB
/
scale_filter_generator.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
require 'fileutils'
require 'zlib'
require 'shellwords'
require './scale_filter_note'
require './scale_filter_device'
class ScaleFilterGenerator
SCALE_NAMES = {
major: "Major (Ionian)",
natural_minor: "Natural Minor (Aeolian)",
general_minor: "General Minor (Aeolian+Harmonic+Melodic)",
dorian: "Dorian",
phrygian: "Phrygian",
lydian: "Lydian",
mixolydian: "Mixolydian",
locrian: "Locrian",
harmonic_minor: "Harmonic Minor",
melodic_minor: "Melodic Minor",
whole_tone: "Whole Tone",
diminished: "Diminished",
major_pentatonic: "Major Pentatonic",
minor_pentatonic: "Minor Pentatonic",
minor_major_pentatonic: "Minor Major Pentatonic",
enigmatic: "Enigmatic",
major_neapolitan: "Major Neapolitan",
minor_neapolitan: "Minor Neapolitan",
minor_hungarian: "Minor Hungarian"
}
class << self
def flat_note_name(note)
ScaleFilterNote.flat_twelve_tones[note.value % 12]
end
def note_label(note_number)
note = ScaleFilterNote.new(note_number)
octave = (note_number/12) - 2
"\u2666 #{note.name}#{octave}"
end
def generate_filter(path, filter_name, scale)
Zlib::GzipWriter.open(File.join(path, "#{filter_name}.adg")) do |gz|
notes_and_values = []
scale_note_values = scale.note_values.map { |note_number| note_number % 12}
127.times.map do |note_number|
notes_and_values << [note_label(note_number), note_number] if scale_note_values.include?(note_number % 12)
end
gz.write ScaleFilterDevice.new(filter_name, notes_and_values).xml
end
end
def generate_all
FileUtils.rm_rf("output")
SCALE_NAMES.each do |scale_identifier, scale_name|
path = "./output/Scale Filters/#{scale_name}"
FileUtils.mkdir_p(path)
12.times do |note_number|
root_note = ScaleFilterNote.new(note_number)
scale = root_note.send("#{scale_identifier}_scale")
generate_filter(path, "#{root_note.name} #{scale_name} Scale Filter", scale)
generate_filter(path, "#{flat_note_name(root_note)} #{scale_name} Scale Filter", scale) unless root_note.name == flat_note_name(root_note)
end
end
end
end
end