refactor uses of voicings

+ fix usages of scaleTranspose
This commit is contained in:
Felix Roos 2022-12-10 21:47:58 +01:00
parent bc43fc9585
commit b81a66f07e
7 changed files with 32 additions and 14 deletions

View File

@ -1533,7 +1533,7 @@ export const { firstOf, every } = register(['firstOf', 'every'], function (n, fu
/** /**
* Like layer, but with a single function: * Like layer, but with a single function:
* @name _apply * @name apply
* @memberof Pattern * @memberof Pattern
* @example * @example
* "<c3 eb3 g3>".scale('C minor').apply(scaleTranspose("0,2,4")).note() * "<c3 eb3 g3>".scale('C minor').apply(scaleTranspose("0,2,4")).note()

View File

@ -31,6 +31,7 @@ export const voicingDictionaries = {
* '7alt': ['3M 7m 10m 13m 15P'], * '7alt': ['3M 7m 10m 13m 15P'],
* '7#11': ['7m 10m 13m 15P 17m'], * '7#11': ['7m 10m 13m 15P 17m'],
* }, ['C3', 'C6']) * }, ['C3', 'C6'])
* "<C^7 A7 Dm7 G7>".voicings('cookie').note()
*/ */
export const addVoicings = (name, dictionary, range = ['F3', 'A4']) => { export const addVoicings = (name, dictionary, range = ['F3', 'A4']) => {
Object.assign(voicingDictionaries, { [name]: { dictionary, range } }); Object.assign(voicingDictionaries, { [name]: { dictionary, range } });

View File

@ -19,8 +19,7 @@ import { mini } from '@strudel.cycles/mini/mini.mjs';
// import euclid from '@strudel.cycles/core/euclid.mjs'; // import euclid from '@strudel.cycles/core/euclid.mjs';
// import '@strudel.cycles/tone/tone.mjs'; // import '@strudel.cycles/tone/tone.mjs';
// import '@strudel.cycles/midi/midi.mjs'; // import '@strudel.cycles/midi/midi.mjs';
import '@strudel.cycles/tonal/voicings.mjs'; import * as tonalHelpers from '@strudel.cycles/tonal';
import '@strudel.cycles/tonal/tonal.mjs';
import '@strudel.cycles/xen/xen.mjs'; import '@strudel.cycles/xen/xen.mjs';
// import '@strudel.cycles/xen/tune.mjs'; // import '@strudel.cycles/xen/tune.mjs';
// import '@strudel.cycles/core/euclid.mjs'; // import '@strudel.cycles/core/euclid.mjs';
@ -164,6 +163,7 @@ evalScope(
uiHelpersMocked, uiHelpersMocked,
controls, controls,
webaudio, webaudio,
tonalHelpers,
/* controls, /* controls,
toneHelpers, toneHelpers,
voicingHelpers, voicingHelpers,

View File

@ -89,10 +89,11 @@ export const whirlyStrudel = `seq(e4, [b2, b3], c4)
export const transposedChordsHacked = `stack( export const transposedChordsHacked = `stack(
"c2 eb2 g2", "c2 eb2 g2",
"Cm7".voicings(['g2','c4']).slow(2) "Cm7".voicings('lefthand').slow(2)
).transpose( ).transpose(
"<1 2 3 2>".slow(2) "<1 2 3 2>".slow(2)
).transpose(5)`; ).transpose(5)`;
// range ['g2','c4']
export const scaleTranspose = `"f2,f3,c4,ab4" export const scaleTranspose = `"f2,f3,c4,ab4"
.scale(seq('F minor', 'F harmonic minor').slow(4)) .scale(seq('F minor', 'F harmonic minor').slow(4))
@ -102,8 +103,9 @@ export const scaleTranspose = `"f2,f3,c4,ab4"
export const struct = `stack( export const struct = `stack(
"c2 g2 a2 [e2@2 eb2] d2 a2 g2 [d2 ~ db2]", "c2 g2 a2 [e2@2 eb2] d2 a2 g2 [d2 ~ db2]",
"[C^7 A7] [Dm7 G7]".struct("[x@2 x] [~@2 x] [~ x@2]@2 [x ~@2] ~ [~@2 x@4]@2") "[C^7 A7] [Dm7 G7]".struct("[x@2 x] [~@2 x] [~ x@2]@2 [x ~@2] ~ [~@2 x@4]@2")
.voicings(['G3','A4']) .voicings('lefthand')
).slow(4)`; ).slow(4)`;
// range ['G3','A4']
export const magicSofa = `stack( export const magicSofa = `stack(
"<C^7 F^7 ~> <Dm7 G7 A7 ~>" "<C^7 F^7 ~> <Dm7 G7 A7 ~>"
@ -197,7 +199,7 @@ export const giantStepsReggae = `stack(
"B^7 [Fm7 Bb7] Eb^7 [C#m7 F#7]" "B^7 [Fm7 Bb7] Eb^7 [C#m7 F#7]"
) )
.struct("~ [x ~]".fast(4*8)) .struct("~ [x ~]".fast(4*8))
.voicings(['E3', 'G4']), .voicings('lefthand'),
// bass // bass
seq( seq(
"[B2 D2] [G2 D2] [Eb2 Bb2] [A2 D2]", "[B2 D2] [G2 D2] [Eb2 Bb2] [A2 D2]",
@ -208,6 +210,8 @@ export const giantStepsReggae = `stack(
.struct("x ~".fast(4*8)) .struct("x ~".fast(4*8))
).slow(25).note()`; ).slow(25).note()`;
// range ['E3', 'G4']
// TODO: // TODO:
/* /*
export const xylophoneCalling = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ export const xylophoneCalling = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/
@ -443,9 +447,11 @@ export const bossaRandom = `const chords = "<Am7 Am7 Dm7 E7>"
const roots = chords.rootNotes(2) const roots = chords.rootNotes(2)
stack( stack(
chords.voicings(['F4', 'A5']).struct( chords.voicings('lefthand').struct(
\` x@2 ~ x ~ ~ ~ x | \` x@2 ~ x ~ ~ ~ x |
x? ~ ~ x@3 ~ x | x? ~ ~ x@3 ~ x |
x? ~ ~ x ~ x@3\`), x? ~ ~ x ~ x@3\`),
roots.struct("x [~ x?0.2] x [~ x?] | x!4 | x@2 ~ ~ ~ x x x").transpose("0 7") roots.struct("x [~ x?0.2] x [~ x?] | x!4 | x@2 ~ ~ ~ x x x").transpose("0 7")
).slow(2).pianoroll().note().piano()`; ).slow(2).pianoroll().note().piano()`;
// range ['F4', 'A5']

View File

@ -81,7 +81,7 @@ stack(
"[G^7 Bb7] [Eb^7 F#7] B^7 [Fm7 Bb7]", "[G^7 Bb7] [Eb^7 F#7] B^7 [Fm7 Bb7]",
"Eb^7 [Am7 D7] G^7 [C#m7 F#7]", "Eb^7 [Am7 D7] G^7 [C#m7 F#7]",
"B^7 [Fm7 Bb7] Eb^7 [C#m7 F#7]" "B^7 [Fm7 Bb7] Eb^7 [C#m7 F#7]"
).voicings(['E3', 'G4']), ).voicings('lefthand'),
// bass // bass
seq( seq(
"[B2 D2] [G2 Bb2] [Eb2 Bb3] [A2 D2]", "[B2 D2] [G2 Bb2] [Eb2 Bb3] [A2 D2]",
@ -90,6 +90,7 @@ stack(
"[B2 F#2] [F2 Bb2] [Eb2 Bb3] [C#2 F#2]" "[B2 F#2] [F2 Bb2] [Eb2 Bb3] [C#2 F#2]"
) )
).slow(20).note()`; ).slow(20).note()`;
// range: ['E3', 'G4']
export const zeldasRescue = `// Koji Kondo - Princess Zelda's Rescue export const zeldasRescue = `// Koji Kondo - Princess Zelda's Rescue
stack( stack(
@ -130,10 +131,10 @@ const synths = stack(
"<eb4 d4 c4 b3>/2".scale(timeCat([3,'C minor'],[1,'C melodic minor']) "<eb4 d4 c4 b3>/2".scale(timeCat([3,'C minor'],[1,'C melodic minor'])
.slow(8)).struct("[~ x]*2") .slow(8)).struct("[~ x]*2")
.layer( .layer(
scaleTranspose(0).early(0), x=>x.scaleTranspose(0).early(0),
scaleTranspose(2).early(1/8), x=>x.scaleTranspose(2).early(1/8),
scaleTranspose(7).early(1/4), x=>x.scaleTranspose(7).early(1/4),
scaleTranspose(8).early(3/8) x=>x.scaleTranspose(8).early(3/8)
).apply(thru).note().apply(keys).mask("<~ x>/16"), ).apply(thru).note().apply(keys).mask("<~ x>/16"),
note("<C2 Bb1 Ab1 [G1 [G2 G1]]>/2".apply(thru)) note("<C2 Bb1 Ab1 [G1 [G2 G1]]>/2".apply(thru))
.struct("[x [~ x] <[~ [~ x]]!3 [x x]>@2]/2".fast(2)) .struct("[x [~ x] <[~ [~ x]]!3 [x x]>@2]/2".fast(2))
@ -654,7 +655,7 @@ dino:{b4:'https://cdn.freesound.org/previews/316/316403_5123851-hq.mp3'}})
stack( stack(
s('bass').loopAt(8).clip(1), s('bass').loopAt(8).clip(1),
s("bd*2, ~ sd,hh*4"), s("bd*2, ~ sd,hh*4"),
note("Abm7".voicings(['c3','a4']).struct("x(3,8,1)".slow(2))), note("Abm7".voicings('lefthand').struct("x(3,8,1)".slow(2))),
"0 1 2 3".scale('ab4 minor pentatonic') "0 1 2 3".scale('ab4 minor pentatonic')
.superimpose(x=>x.add(.1)) .superimpose(x=>x.add(.1))
.sometimes(x=>x.add(12)) .sometimes(x=>x.add(12))
@ -665,6 +666,7 @@ note("Abm7".voicings(['c3','a4']).struct("x(3,8,1)".slow(2))),
.degradeBy(.4).room(1), .degradeBy(.4).room(1),
note("<b4 eb4>").s('dino').delay(.8).slow(8).room(.5) note("<b4 eb4>").s('dino').delay(.8).slow(8).room(.5)
)`; )`;
// ['c3','a4']
export const sampleDemo = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ export const sampleDemo = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/
// by Felix Roos // by Felix Roos

View File

@ -2352,6 +2352,15 @@ exports[`runs examples > example "room" example index 0 1`] = `
] ]
`; `;
exports[`runs examples > example "rootNotes" example index 0 1`] = `
[
"[ 0/1 → 1/1 | note:C2 ]",
"[ 1/1 → 2/1 | note:A2 ]",
"[ 2/1 → 3/1 | note:D2 ]",
"[ 3/1 → 4/1 | note:G2 ]",
]
`;
exports[`runs examples > example "round" example index 0 1`] = ` exports[`runs examples > example "round" example index 0 1`] = `
[ [
"[ 0/1 → 1/3 | note:D3 ]", "[ 0/1 → 1/3 | note:D3 ]",

View File

@ -769,7 +769,7 @@ Together with layer, struct and voicings, this can be used to create a basic bac
<MiniRepl <MiniRepl
tune={`"<C^7 A7b13 Dm7 G7>".layer( tune={`"<C^7 A7b13 Dm7 G7>".layer(
x => x.voicings(['d3','g4']).struct("~ x").note(), x => x.voicings('lefthand').struct("~ x").note(),
x => x.rootNotes(2).note().s('sawtooth').cutoff(800) x => x.rootNotes(2).note().s('sawtooth').cutoff(800)
)`} )`}
/> />