-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathguitar_scales.app.js
244 lines (230 loc) · 11.5 KB
/
guitar_scales.app.js
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
const stringInterval = 24;
const stringLength = 138;
const fretHeight = 35;
const xOffset = 26;
const yOffset = 29;
const notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
const tuning = ["E", "B", "G", "D", "A", "E"];
const scales = {
"Major": ["E", "F#", "G#", "A", "B", "C#", "D#"],
"Minor": ["E", "F#", "G", "A", "B", "C", "D"],
"Pentatonic": ["E", "G", "A", "B", "D"],
"Blues": ["E", "G", "A", "A#", "B", "D"],
"Mixolydic": ["E", "F#", "G#", "A", "B", "C#", "D"],
"Bebop Dominant": ["E", "F#", "G#", "A", "B", "C#", "D", "D#"],
"Altered": ["E", "F", "G", "Ab", "Bb", "B", "Db"],
"Ionian": ["E", "F#", "G#", "A", "B", "C#", "D#"],
"Dorian": ["E", "F#", "G", "A", "B", "C#", "D"],
"Phrygian": ["E", "F", "G", "A", "B", "C", "D"],
"Lydian": ["E", "F#", "G#", "A#", "B", "C#", "D#"],
"Mixolydian": ["E", "F#", "G#", "A", "B", "C#", "D"],
"Aeolian": ["E", "F#", "G", "A", "B", "C", "D"],
"Locrian": ["E", "F", "G", "A", "Bb", "C", "D"],
"Whole Tone": ["E", "F#", "G#", "A#", "C", "D"],
"Chromatic": ["E", "F", "F#", "G", "G#", "A", "A#", "B", "C", "C#", "D", "D#"],
"Harmonic Minor": ["E", "F#", "G", "A", "B", "C", "D#"],
"Harmonic Minor #5": ["E", "F#", "G", "A", "B", "C", "D#"],
"Melodic Minor": ["E", "F#", "G", "A", "B", "C#", "D#"],
"Dorian b2": ["E", "F", "G", "A", "B", "C#", "D"],
"Lydian #5": ["E", "F#", "G#", "A#", "B", "C#", "D"],
"Lydian Dominant": ["E", "F#", "G#", "A#", "B", "C#", "D"],
"Phrygian Dominant": ["E", "F", "G#", "A", "B", "C", "D"],
"Lydian b7": ["E", "F#", "G#", "A", "B", "C#", "D"],
"Altered Dominant": ["E", "F", "G", "A", "Bb", "Cb", "Db"],
"Half Diminished": ["E", "F#", "G", "A", "Bb", "C", "D"],
"Diminished": ["E", "F", "G", "Ab", "Bb", "Cb", "Db"],
"Whole Half Diminished": ["E", "F#", "G", "A", "Bb", "C", "D"],
"Half Whole Diminished": ["E", "F", "G", "Ab", "Bb", "B", "C#", "D#"],
"Augmented": ["E", "F#", "G#", "Bb"],
"Augmented Heptatonic": ["E", "F#", "G#", "B"],
"Hexatonic": ["E", "F#", "G#", "A#", "B", "D"],
"In Sen": ["E", "F", "A", "B", "D"],
"Istrian": ["E", "F#", "G", "B", "C"],
"Marva": ["E", "F#", "G", "A", "B", "C"],
"Shivranjani": ["E", "F#", "G#", "A", "B", "C#", "D#"],
"Bhairav": ["E", "F#", "G", "A", "B", "C", "D"],
"Bhairavi": ["E", "F", "G", "A", "B", "C", "D"],
"Charukesi": ["E", "F#", "G#", "A", "B", "C#", "D"],
"Kalyani": ["E", "F#", "G#", "A", "B", "C#", "D#"],
"Kharaharapriya": ["E", "F#", "G#", "A", "B", "C", "D#"],
"Mayamalavagowla": ["E", "F#", "G", "A", "B", "C", "D"],
"Sankarabharanam": ["E", "F#", "G#", "A", "B", "C#", "D#"],
"Bebop Locrian": ["E", "F", "G", "A", "Bb", "C", "D", "Db"],
"Bebop Major": ["E", "F#", "G#", "A", "B", "C#", "D#", "D"],
"Bebop Minor": ["E", "F#", "G", "A", "B", "C", "D", "D#"],
"Blues Major": ["E", "F#", "G", "G#", "A", "B", "D"],
"Diminished Whole Tone": ["E", "F", "G", "Ab", "A#", "C#", "D"],
"Double Harmonic Major": ["E", "F", "G#", "A", "B", "C", "D#"],
"Eight Tone Spanish": ["E", "F", "F#", "G#", "A", "B", "C#", "D#"],
"Enigmatic Major": ["E", "F#", "G#", "A", "B", "C#", "D", "D#"],
"Auxiliary Augmented": ["E", "F#", "G#", "B", "C#", "E"],
"Auxiliary Diminished": ["E", "F#", "G#", "A#", "B", "C#", "E"],
"Auxiliary Diminished Blues": ["E", "F#", "G", "A", "C", "D#", "E"],
"Spanish Gypsy": ["E", "F#", "G", "A#", "B", "C", "D#"],
"Neapolitan Major Pentatonic": ["E", "F", "G#", "A#", "C#", "E"],
"Neapolitan Minor Pentatonic": ["E", "F", "G#", "A", "C#", "E"],
"Purvi Raga": ["E", "F#", "G", "A", "B", "C#", "D"],
"Ganamurti": ["E", "F#", "G#", "A#", "B", "C#", "D"],
"Zokuso": ["E", "F#", "G", "A", "Bb", "C#", "D"],
"Raga Madhmad Sarang": ["E", "F#", "G", "A#", "B", "C#", "D"],
"Raga Hameer": ["E", "F#", "G#", "A", "B", "C", "D#"],
"Raga Pilu": ["E", "F#", "G", "A", "Bb", "C#", "D#"],
"Leading Whole Tone": ["E", "F#", "G#", "A#", "C", "D", "E"],
"Neapolitan Major": ["E", "F", "G#", "A", "B", "C#", "D#"],
"Neapolitan Minor": ["E", "F", "G#", "A", "B", "C#", "D"],
"Persian": ["E", "F", "G#", "A", "B", "C", "D"],
"Prometheus": ["E", "F#", "G#", "B", "C#", "D#"],
"Tritone": ["E", "G#", "A#", "C", "D", "F"],
"Harmonic Major": ["E", "F#", "G#", "A", "B", "C", "D#"],
"Double Harmonic Minor": ["E", "F", "G#", "A", "B", "C", "D#"],
"Hungarian Minor": ["E", "F#", "G", "A#", "B", "C", "D#"],
"Hungarian Major": ["E", "F#", "G#", "A#", "B", "C#", "D"],
"Ukrainian Dorian": ["E", "F#", "G", "A", "B", "C#", "D#"],
"Byzantine": ["E", "F", "G#", "A", "B", "C#", "D#"],
"Egyptian": ["E", "F#", "G", "B", "D"],
"Enigmatic Minor": ["E", "F", "G#", "A#", "B", "C#", "D#"],
"Gypsy": ["E", "F#", "G", "A#", "B", "C", "D"],
"Arabian": ["E", "F", "G", "A", "B", "C#", "D#"],
"Algerian": ["E", "F#", "G#", "A", "B", "C#", "D"],
"Balinese": ["E", "F#", "A", "B", "C", "E"],
"Chinese": ["E", "F#", "G#", "B", "C#", "E"],
"Hirajoshi": ["E", "F", "A", "B", "E"],
"Iwato": ["E", "F", "Bb", "B", "Eb"],
"Kumoi": ["E", "F", "A", "Bb", "D"],
"Pelog": ["E", "F", "G", "Bb", "C"],
"Prometheus Neapolitan": ["E", "F", "G#", "A", "B", "D", "D#"],
"Romanian Minor": ["E", "F#", "G", "G#", "B", "C#", "D#"],
"Japanese": ["E", "F", "G", "A", "C"],
"Yo": ["E", "F", "A", "B", "D"],
"Vietnamese": ["E", "F", "G#", "A", "B", "D", "E"],
"Ritusen": ["E", "F", "A#", "C", "D"],
"Lydian Minor": ["E", "F#", "G#", "A#", "B", "C", "D"],
"Lydian Augmented": ["E", "F#", "G#", "A#", "B", "C#", "D#"],
"Acoustic": ["E", "F#", "G#", "A", "B", "C#", "D#"],
"Altered Dominant bb7": ["E", "F", "G", "A", "Bb", "C", "D"],
"Augmented Major": ["E", "F#", "G#", "A#", "C", "D", "E"],
"Bebop": ["E", "F#", "G#", "A", "B", "C#", "D#", "D"],
"Bebop Dominant Locrian": ["E", "F", "G", "A", "Bb", "C", "D", "D#"],
"Bebop Major Locrian": ["E", "F#", "G#", "A", "B", "C#", "D#", "D"],
"Blues Minor": ["E", "G", "A", "A#", "B", "D"],
"Blues Phrygian": ["E", "G", "A", "Bb", "B", "D"],
"Chromatic Mixolydian": ["E", "F#", "G#", "A", "B", "C#", "D"],
"Dorian b5": ["E", "F#", "G", "Ab", "B", "C#", "D"],
"Dorian b9": ["E", "F", "G", "A", "Bb", "C#", "D"],
"Dorian #11": ["E", "F#", "G", "A", "B", "C#", "D"],
"Dorian #4": ["E", "F#", "G", "A#", "B", "C#", "D"],
"Dorian #9": ["E", "F#", "G", "A", "B", "C#", "D"],
"Double Harmonic": ["E", "F", "G#", "A", "B", "C", "D#"],
"Half Diminished Whole Tone": ["E", "F#", "G", "A", "Bb", "C#", "D"],
"Half Whole Mixolydian": ["E", "F", "G", "Ab", "Bb", "C", "D"],
"Hungarian Gypsy": ["E", "F#", "G", "A#", "B", "C", "D#"],
"Hungarian Major Pentatonic": ["E", "F#", "G#", "A#", "C#", "E"],
"In": ["E", "F", "A", "Bb", "D"],
"Ionian Augmented": ["E", "F#", "G#", "A#", "B", "C#", "D#"],
"Ionian Augmented #2": ["E", "F#", "G#", "B", "C#", "D#", "D"],
"Ionian b2": ["E", "F", "G#", "A", "B", "C#", "D#"],
"Ionian b5": ["E", "F#", "G#", "A#", "B", "C", "D#"],
"Ionian #5": ["E", "F#", "G#", "A#", "B", "C#", "D"],
"Ionian #5 #7": ["E", "F#", "G#", "A#", "B", "D", "D#"],
"Ionian #5 b6": ["E", "F#", "G#", "A#", "B", "C", "D"],
"Ionian #5 b6 b7": ["E", "F#", "G#", "A#", "B", "C", "D#"],
"Ionian #5 b7": ["E", "F#", "G#", "A#", "B", "C#", "D"],
"Ionian #5 b7 #7": ["E", "F#", "G#", "A#", "B", "C#", "D#"],
"Ionian b6": ["E", "F#", "G#", "A", "B", "C#", "D#"],
"Ionian b7": ["E", "F#", "G#", "A", "B", "C#", "D"],
"Japanese (Pentatonic)": ["E", "F", "A", "B", "D"],
"Kafi": ["E", "F#", "G#", "A#", "B"],
"Kafi (Pentatonic)": ["E", "F#", "A", "B", "D"],
"Kumoi (Pentatonic)": ["E", "F", "A", "Bb", "D"],
"Lydian Augmented #2": ["E", "F#", "G#", "A#", "C", "D#", "D"],
"Lydian Augmented #9": ["E", "F#", "G#", "A#", "B", "C#", "D"],
"Lydian b3": ["E", "F#", "G#", "B", "C#", "D#", "D"],
"Lydian b7 P5": ["E", "F#", "G#", "A#", "B", "C#", "D"],
"Lydian Diminished": ["E", "F#", "G#", "A#", "B", "C", "D"],
"Lydian Dominant b7": ["E", "F#", "G#", "A#", "B", "C#", "D"],
"Lydian Pentatonic": ["E", "F#", "G#", "B", "C#", "E"],
"Melodic Minor b2": ["E", "F", "G", "A", "B", "C#", "D#"],
"Melodic Minor b4": ["E", "F#", "G", "A", "B", "C#", "D#"],
"Melodic Minor b6": ["E", "F#", "G#", "A#", "B", "C#", "D"],
"Melodic Minor #5": ["E", "F#", "G#", "A#", "B", "C", "D"],
"Persian (Pentatonic)": ["E", "F", "A", "B", "D"],
"Phrygian Diminished": ["E", "F", "G", "A", "Bb", "C", "D"],
"Roumanian Minor": ["E", "F#", "G", "G#", "B", "C#", "D#"],
"Scriabin": ["E", "F#", "A", "B", "C#", "E"],
"Spanish": ["E", "F#", "G", "A", "B", "C", "D#"],
"Todi": ["E", "F#", "G", "A#", "B", "C#", "D"],
"Whole Tone Diminished": ["E", "F#", "G#", "Bb", "C", "D", "D#"],
"Whole Tone Pentatonic": ["E", "F#", "G#", "Bb", "C#", "E"],
"Yo (Pentatonic)": ["E", "F", "A", "B", "D"],
"Yonanuki": ["E", "F", "A#", "B", "C", "E"]
};
function createFretboardMatrix() {
const fretsPerString = 5;
let matrix = [];
for (let string = 0; string < tuning.length; string++) {
matrix[string] = [];
let noteIndex = notes.indexOf(tuning[string]);
for (let fret = 0; fret <= fretsPerString; fret++) {
matrix[string][fret] = notes[(noteIndex + fret) % notes.length];
}
}
return matrix.reverse();
}
function markScaleNotesOnFretboard(scaleNotes, fretboard) {
let markedFretboard = JSON.parse(JSON.stringify(fretboard));
for (let string = 0; string < fretboard.length; string++) {
for (let fret = 0; fret < fretboard[string].length; fret++) {
markedFretboard[string][fret] = scaleNotes.includes(fretboard[string][fret]) ? "X" : " ";
}
}
return markedFretboard;
}
function drawBase() {
g.clear();
for (let i = 0; i < 6; i++) {
g.drawLine(xOffset + i * stringInterval, yOffset, xOffset + i * stringInterval, yOffset + stringLength);
}
for (let i = 0; i <= 5; i++) {
g.drawLine(xOffset, yOffset + i * fretHeight, xOffset + 5 * stringInterval, yOffset + i * fretHeight);
}
}
function drawScaleName(scaleName) {
g.setFontAlign(0, 0);
let scaleFontSize = 2;
const maxScaleNameLength = 14;
if (scaleName.length > maxScaleNameLength) {
scaleFontSize = Math.floor(maxScaleNameLength / scaleName.length * scaleFontSize);
}
g.setFont("6x8", scaleFontSize);
g.drawString(scaleName, g.getWidth() / 2, 15);
g.drawLine(0, 22, g.getWidth(), 22);
}
function drawMarkedFretboard(markedFretboard, scaleName) {
drawBase();
drawScaleName(scaleName);
for (let string = 0; string < markedFretboard.length; string++) {
for (let fret = 0; fret < markedFretboard[string].length; fret++) {
if (markedFretboard[string][fret] === "X") {
let stringPos = xOffset + string * stringInterval;
let yPos = yOffset + fret * fretHeight;
g.fillCircle(stringPos, yPos, 5);
}
}
}
}
function generateMenu() {
let menu = { "": { "title": "Guitar Scales" } };
Object.keys(scales).forEach(scale => {
menu[scale] = () => {
const fretboard = createFretboardMatrix();
const scaleNotes = scales[scale];
const markedFretboard = markScaleNotesOnFretboard(scaleNotes, fretboard);
drawMarkedFretboard(markedFretboard, scale);
};
});
return menu;
}
function main() {
E.showMenu(generateMenu());
}
main();