Merge branch 'scales' of github.com:JulienH2000/Topos into scales
This commit is contained in:
@ -346,24 +346,30 @@ export const makeArrayExtensions = (api: UserAPI) => {
|
||||
Array.prototype.rand = Array.prototype.random;
|
||||
};
|
||||
|
||||
Array.prototype.scale = function(scale: string = "major", base_note: number = 0) {
|
||||
Array.prototype.scale = function (
|
||||
scale: string = "major",
|
||||
base_note: number = 0
|
||||
) {
|
||||
/**
|
||||
* @param scale - the scale name
|
||||
* @param base_note - the base note to start at (MIDI note number)
|
||||
*/
|
||||
if (SCALES.hasOwnProperty(scale)) {
|
||||
const selected_scale = SCALES[scale];
|
||||
return this.map((value) => {
|
||||
const octaveShift = Math.floor(value / selected_scale.length) * 12 * Math.sign(value);
|
||||
return selected_scale[Math.abs(value) % selected_scale.length] + base_note + octaveShift;
|
||||
const octaveShift =
|
||||
Math.floor(value / selected_scale.length) * 12 * Math.sign(value);
|
||||
return (
|
||||
selected_scale[Math.abs(value) % selected_scale.length] +
|
||||
base_note +
|
||||
octaveShift
|
||||
);
|
||||
});
|
||||
} else {
|
||||
return this.map((value) => value + base_note);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Array.prototype.scale = function(scale: string = "major", base_note: number = 0) {
|
||||
Array.prototype.scale = function (
|
||||
scale: string = "major",
|
||||
base_note: number = 0
|
||||
) {
|
||||
/**
|
||||
* @param scale - the scale name
|
||||
* @param base_note - the base note to start at (MIDI note number)
|
||||
@ -373,25 +379,46 @@ Array.prototype.scale = function(scale: string = "major", base_note: number = 0)
|
||||
|
||||
// This is a helper function to handle up or down octaviation.
|
||||
const mod = (n: number, m: number) => ((n % m) + m) % m;
|
||||
let selected_scale = safeScale(scale);
|
||||
|
||||
if (SCALES.hasOwnProperty(scale)) {
|
||||
const selected_scale = SCALES[scale];
|
||||
return this.map((value) => {
|
||||
const octaveShift = Math.floor(value / selected_scale.length) * 12;
|
||||
return selected_scale[mod(value, selected_scale.length)] + base_note + octaveShift;
|
||||
return (
|
||||
selected_scale[mod(value, selected_scale.length)] +
|
||||
base_note +
|
||||
octaveShift
|
||||
);
|
||||
});
|
||||
} else {
|
||||
return this.map((value) => value + base_note);
|
||||
}
|
||||
};
|
||||
|
||||
Array.prototype.arp = function(scaleName: string = "major") {
|
||||
Array.prototype.arp = function (scaleName: string = "major", mask: number = 0) {
|
||||
/*
|
||||
* Ajouter documentation
|
||||
* @param scaleName - the scale name
|
||||
* @param mask - the length of the mask
|
||||
*
|
||||
*/
|
||||
const scale = safeScale[scaleName];
|
||||
|
||||
//input protect from unknow scale
|
||||
|
||||
if (!scale) {
|
||||
throw new Error(`Unknown scale ${scaleName}`);
|
||||
}
|
||||
|
||||
let result = [];
|
||||
for (let j = 0; j < scale.length; j++) {
|
||||
|
||||
mask = mask > scale.length ? scale.length : mask;
|
||||
mask = mask == 0 ? scale.length : mask;
|
||||
|
||||
for (let j = 0; j < mask; j++) {
|
||||
for (let i = 0; i < this.length; i++) {
|
||||
result.push(this[i] + scale[j]);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
@ -185,6 +185,74 @@ beat(1)::snd('sine').sustain(0.1).freq([100,100,100,100,200].unique().beat()).ou
|
||||
true
|
||||
)}
|
||||
|
||||
- <ic>scale(scale: string, mask: number)</ic>: extrapolate a custom-masked scale from each list elements. _[0].scale("major", 3)_ returns _[0,2,4]_
|
||||
|
||||
${makeExample(
|
||||
"Extrapolate a 3-elements Persian scale from 2 notes",
|
||||
`
|
||||
beat(1) :: snd('gtr')
|
||||
.note([0,5].scale("persian", 3).beat() + 50)
|
||||
.out()
|
||||
`,
|
||||
true
|
||||
)}
|
||||
|
||||
- Currently supported scales :
|
||||
| Scale name | Values |
|
||||
|------------|------------------------|
|
||||
| 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
|
||||
| hindi | 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
|
||||
|
||||
- <ic>add()</ic>: add a given amount to every list element.
|
||||
- <ic>sub()</ic>: add a given amount to every list element.
|
||||
- <ic>mult()</ic>: add a given amount to every list element.
|
||||
|
||||
Reference in New Issue
Block a user