minimal scale system
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
import { Editor } from "./main";
|
||||
import { scale } from './Scales';
|
||||
import { tryEvaluate } from "./Evaluator";
|
||||
import { MidiConnection } from "./IO/MidiConnection";
|
||||
// @ts-ignore
|
||||
@ -17,6 +18,8 @@ export class UserAPI {
|
||||
|
||||
log = console.log
|
||||
|
||||
scale = scale
|
||||
|
||||
rate(rate: number): void {
|
||||
// TODO: Implement this. This function should change the rate at which the global script
|
||||
// is evaluated. This is useful for slowing down the script, or speeding it up. The default
|
||||
|
||||
67
src/Scales.ts
Normal file
67
src/Scales.ts
Normal file
@ -0,0 +1,67 @@
|
||||
const SCALES: Record<string, number[]> = {
|
||||
major: [0, 2, 4, 5, 7, 9, 11],
|
||||
naturalMinor: [0, 2, 3, 5, 7, 8, 10],
|
||||
harmonicMinor: [0, 2, 3, 5, 7, 8, 11],
|
||||
melodicMinor: [0, 2, 3, 5, 7, 9, 11],
|
||||
dorian: [0, 2, 3, 5, 7, 9, 10],
|
||||
phrygian: [0, 1, 3, 5, 7, 8, 10],
|
||||
lydian: [0, 2, 4, 6, 7, 9, 11],
|
||||
mixolydian: [0, 2, 4, 5, 7, 9, 10],
|
||||
aeolian: [0, 2, 3, 5, 7, 8, 10],
|
||||
locrian: [0, 1, 3, 5, 6, 8, 10],
|
||||
wholeTone: [0, 2, 4, 6, 8, 10],
|
||||
majorPentatonic: [0, 2, 4, 7, 9],
|
||||
minorPentatonic: [0, 3, 5, 7, 10],
|
||||
chromatic: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
|
||||
blues: [0, 3, 5, 6, 7, 10],
|
||||
diminished: [0, 2, 3, 5, 6, 8, 9, 11],
|
||||
neapolitanMinor: [0, 1, 3, 5, 7, 8, 11],
|
||||
neapolitanMajor: [0, 1, 3, 5, 7, 9, 11],
|
||||
enigmatic: [0, 1, 4, 6, 8, 10, 11],
|
||||
doubleHarmonic: [0, 1, 4, 5, 7, 8, 11],
|
||||
octatonic: [0, 2, 3, 5, 6, 8, 9, 11],
|
||||
bebopDominant: [0, 2, 4, 5, 7, 9, 10, 11],
|
||||
bebopMajor: [0, 2, 4, 5, 7, 8, 9, 11],
|
||||
bebopMinor: [0, 2, 3, 5, 7, 8, 9, 11],
|
||||
bebopDorian: [0, 2, 3, 4, 5, 7, 9, 10],
|
||||
harmonicMajor: [0, 2, 4, 5, 7, 8, 11],
|
||||
hungarianMinor: [0, 2, 3, 6, 7, 8, 11],
|
||||
hungarianMajor: [0, 3, 4, 6, 7, 9, 10],
|
||||
oriental: [0, 1, 4, 5, 6, 9, 10],
|
||||
romanianMinor: [0, 2, 3, 6, 7, 9, 10],
|
||||
spanishGypsy: [0, 1, 4, 5, 7, 8, 10],
|
||||
jewish: [0, 1, 4, 5, 7, 8, 10],
|
||||
hindu: [0, 2, 4, 5, 7, 8, 10],
|
||||
japanese: [0, 1, 5, 7, 8],
|
||||
hirajoshi: [0, 2, 3, 7, 8],
|
||||
kumoi: [0, 2, 3, 7, 9],
|
||||
inSen: [0, 1, 5, 7, 10],
|
||||
iwato: [0, 1, 5, 6, 10],
|
||||
yo: [0, 2, 5, 7, 9],
|
||||
minorBlues: [0, 3, 5, 6, 7, 10],
|
||||
algerian: [0, 2, 3, 5, 6, 7, 8, 11],
|
||||
augmented: [0, 3, 4, 7, 8, 11],
|
||||
balinese: [0, 1, 3, 7, 8],
|
||||
byzantine: [0, 1, 4, 5, 7, 8, 11],
|
||||
chinese: [0, 4, 6, 7, 11],
|
||||
egyptian: [0, 2, 5, 7, 10],
|
||||
eightToneSpanish: [0, 1, 3, 4, 5, 6, 8, 10],
|
||||
hawaiian: [0, 2, 3, 5, 7, 9, 10],
|
||||
hindustan: [0, 2, 4, 5, 7, 8, 10],
|
||||
persian: [0, 1, 4, 5, 6, 8, 11],
|
||||
eastIndianPurvi: [0, 1, 4, 6, 7, 8, 11],
|
||||
orientalA: [0, 1, 4, 5, 6, 9, 10]
|
||||
};
|
||||
|
||||
export function scale(n: number, scaleName: string = 'major', octave: number = 4): number {
|
||||
const scale = SCALES[scaleName];
|
||||
|
||||
if (!scale) {
|
||||
throw new Error(`Unknown scale ${scaleName}`);
|
||||
}
|
||||
|
||||
let index = n % scale.length;
|
||||
if (index < 0) index += scale.length; // adjust for negative indexes
|
||||
let additionalOctaves = Math.floor(n / scale.length);
|
||||
return 60 + (octave + additionalOctaves) * 12 + scale[index];
|
||||
}
|
||||
@ -258,6 +258,9 @@ export class Editor {
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
if (event.keyCode == 121) { this.changeModeFromInterface("global"); }
|
||||
if (event.keyCode == 122) { this.changeModeFromInterface("init"); }
|
||||
});
|
||||
|
||||
// ================================================================================
|
||||
|
||||
Reference in New Issue
Block a user