From 72a8e4bc22c5c85afb0d5dc2aa9b34dde3b023fb Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 2 Dec 2022 12:11:28 +0100 Subject: [PATCH] add licenses / credits to all tunes + remove some --- repl/src/testtunes.mjs | 287 ++++++++++++++++++++++++++++++ repl/src/tunes.mjs | 391 +++++++++-------------------------------- 2 files changed, 369 insertions(+), 309 deletions(-) diff --git a/repl/src/testtunes.mjs b/repl/src/testtunes.mjs index e62e51f2..fe5d8358 100644 --- a/repl/src/testtunes.mjs +++ b/repl/src/testtunes.mjs @@ -162,3 +162,290 @@ stack( drums.fast(2), synths ).slow(2)`; */ + +export const tetrisMini = `note(\`[[e5 [b4 c5] d5 [c5 b4]] +[a4 [a4 c5] e5 [d5 c5]] +[b4 [~ c5] d5 e5] +[c5 a4 a4 ~] +[[~ d5] [~ f5] a5 [g5 f5]] +[e5 [~ c5] e5 [d5 c5]] +[b4 [b4 c5] d5 e5] +[c5 a4 a4 ~]], +[[e2 e3]*4] +[[a2 a3]*4] +[[g#2 g#3]*2 [e2 e3]*2] +[a2 a3 a2 a3 a2 a3 b1 c2] +[[d2 d3]*4] +[[c2 c3]*4] +[[b1 b2]*2 [e2 e3]*2] +[[a1 a2]*4]\`).slow(16) +`; + +export const giantStepsReggae = `stack( + // melody + seq( + "[F#5 D5] [B4 G4] Bb4 [B4 A4]", + "[D5 Bb4] [G4 Eb4] F#4 [G4 F4]", + "Bb4 [B4 A4] D5 [D#5 C#5]", + "F#5 [G5 F5] Bb5 [F#5 [F#5 ~@3]]", + ), + // chords + seq( + "[B^7 D7] [G^7 Bb7] Eb^7 [Am7 D7]", + "[G^7 Bb7] [Eb^7 F#7] B^7 [Fm7 Bb7]", + "Eb^7 [Am7 D7] G^7 [C#m7 F#7]", + "B^7 [Fm7 Bb7] Eb^7 [C#m7 F#7]" + ) + .struct("~ [x ~]".fast(4*8)) + .voicings(['E3', 'G4']), + // bass + seq( + "[B2 D2] [G2 D2] [Eb2 Bb2] [A2 D2]", + "[G2 Bb2] [Eb2 F#2] [B2 F#2] [F2 Bb2]", + "[Eb2 Bb2] [A2 D2] [G2 D2] [C#2 F#2]", + "[B2 F#2] [F2 Bb2] [Eb2 Bb2] [C#2 F#2]" + ) + .struct("x ~".fast(4*8)) +).slow(25).note()`; + +// TODO: +/* +export const xylophoneCalling = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +const t = x => x.scaleTranspose("<0 2 4 3>/4").transpose(-2) +const s = x => x.scale(cat('C3 minor pentatonic','G3 minor pentatonic').slow(4)) +const delay = new FeedbackDelay(1/8, .6).chain(vol(0.1), out()); +const chorus = new Chorus(1,2.5,0.5).start(); +stack( + // melody + "<<10 7> <8 3>>/4".struct("x*3").apply(s) + .scaleTranspose("<0 3 2> <1 4 3>") + .superimpose(scaleTranspose(2).early(1/8)) + .apply(t).tone(polysynth().set({ + ...osc('triangle4'), + ...adsr(0,.08,0) + }).chain(vol(0.2).connect(delay),chorus,out())).mask("<~@3 x>/16".early(1/8)), + // pad + "[1,3]/4".scale('G3 minor pentatonic').apply(t).tone(polysynth().set({ + ...osc('square2'), + ...adsr(0.1,.4,0.8) + }).chain(vol(0.2),chorus,out())).mask("<~ x>/32"), + // xylophone + "c3,g3,c4".struct("").fast("<1 <2!3 [4 8]>>").apply(s).scaleTranspose("<0 <1 [2 [3 <4 5>]]>>").apply(t).tone(polysynth().set({ + ...osc('sawtooth4'), + ...adsr(0,.1,0) + }).chain(vol(0.4).connect(delay),out())).mask("/16".early(1/8)), + // bass + "c2 [c2 ~]*2".scale('C hirajoshi').apply(t).tone(synth({ + ...osc('sawtooth6'), + ...adsr(0,.03,.4,.1) + }).chain(vol(0.4),out())), + // kick + "*2".tone(membrane().chain(vol(0.8),out())), + // snare + "~ ".tone(noise().chain(vol(0.8),out())), + // hihat + "c3*4".transpose("[-24 0]*2").tone(metal(adsr(0,.02)).chain(vol(0.5).connect(delay),out())) +).slow(1) +// strudel disable-highlighting`; +*/ + +// TODO: +/* +export const sowhatelse = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +// mixer +const mix = (key) => vol({ + chords: .2, + lead: 0.8, + bass: .4, + snare: .95, + kick: .9, + hihat: .35, +}[key]||0); +const delay = new FeedbackDelay(1/6, .3).chain(vol(.7), out()); +const delay2 = new FeedbackDelay(1/6, .2).chain(vol(.15), out()); +const chorus = new Chorus(1,2.5,0.5).start(); +// instruments +const instr = (instrument) => ({ + organ: polysynth().set({...osc('sawtooth4'), ...adsr(.01,.2,0)}).chain(mix('chords').connect(delay),out()), + lead: polysynth().set({...osc('triangle4'),...adsr(0.01,.05,0)}).chain(mix('lead').connect(delay2), out()), + bass: polysynth().set({...osc('sawtooth8'),...adsr(.02,.05,.3,.2)}).chain(mix('bass'),lowpass(3000), out()), + pad: polysynth().set({...osc('square2'),...adsr(0.1,.4,0.8)}).chain(vol(0.15),chorus,out()), + hihat: metal(adsr(0, .02, 0)).chain(mix('hihat'), out()), + snare: noise(adsr(0, .15, 0.01)).chain(mix('snare'), lowpass(5000), out()), + kick: membrane().chain(mix('kick'), out()) +}[instrument]); +// harmony +const t = transpose("<0 0 1 0>/8"); +const sowhat = scaleTranspose("0,3,6,9,11"); +// track +stack( + "[<0 4 [3 [2 1]]>]/4".struct("[x]*3").mask("[~ x ~]").scale('D5 dorian').off(1/6, scaleTranspose(-7)).off(1/3, scaleTranspose(-5)).apply(t).tone(instr('lead')).mask("<~ ~ x x>/8"), + "< <[d3 ~] [c3 f3] g3>>".scale('D dorian').apply(sowhat).apply(t).tone(instr('organ')).mask("/8"), + "<[d2 [d2 ~]*3]!3 >".apply(t).tone(instr('bass')), + "c1*6".tone(instr('hihat')), + "~ c3".tone(instr('snare')), + "<[c1@5 c1] >".tone(instr('kick')), + "[2,4]/4".scale('D dorian').apply(t).tone(instr('pad')).mask("/8") +).fast(6/8) +// strudel disable-highlighting`; +*/ + +// TODO: rework tune to use freq +/* +export const jemblung = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +const delay = new FeedbackDelay(1/8, .6).chain(vol(0.15), out()); +const snare = noise({type:'white',...adsr(0,0.2,0)}).chain(lowpass(5000),vol(1.8),out()); +const s = polysynth().set({...osc('sawtooth4'),...adsr(0.01,.2,.6,0.2)}).chain(vol(.23).connect(delay),out()); +stack( + stack( + "0 1 4 [3!2 5]".layer( + // chords + x=>x.add("0,3").duration("0.05!3 0.02"), + // bass + x=>x.add("-8").struct("x*8").duration(0.1) + ), + // melody + "12 11*3 12 ~".duration(0.005) + ) + .add("<0 1>") + .tune("jemblung2") + //.mul(22/5).round().xen("22edo") + //.mul(12/5).round().xen("12edo") + .tone(s), + // kick + "[c2 ~]*2".duration(0.05).tone(membrane().chain(out())), + // snare + "[~ c1]*2".early(0.001).tone(snare), + // hihat + "c2*8".tone(noise().chain(highpass(6000),vol(0.5).connect(delay),out())), +).slow(3)`; +*/ + +/* +// TODO: does not work on linux (at least for me..) +export const speakerman = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +backgroundImage('https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fi.ytimg.com%2Fvi%2FXR0rKqW3VwY%2Fmaxresdefault.jpg&f=1&nofb=1', +{ className:'darken', style:'background-size:cover'}) +stack( + "[g3,bb3,d4] [f3,a3,c4] [c3,e3,g3]@2".slow(2).late(.1), + cat( + 'Baker man', + 'is baking bread', + 'Baker man', + 'is baking bread', + 'Sagabona', + 'kunjani wena', + 'Sagabona', + 'kunjani wena', + 'The night train, is coming', + 'got to keep on running', + 'The night train, is coming', + 'got to keep on running', + ).speak("en zu en".slow(12), "<0 2 3 4 5 6>".slow(2)), +).slow(4)`; +*/ + +export const bossa = `const scales = sequence('C minor', ['D locrian', 'G phrygian'], 'Bb2 minor', ['C locrian','F phrygian']).slow(4) +stack( + "".fast(2).struct("x ~ x@3 x ~ x ~ ~ ~ x ~ x@3".late(1/8)).early(1/8).slow(2).voicings(), + "[~ [0 ~]] 0 [~ [4 ~]] 4".sub(7).restart(scales).scale(scales).early(.25) +).note().piano().slow(2)`; + +/* +export const customTrigger = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +stack( + freq("55 [110,165] 110 [220,275]".mul("<1 <3/4 2/3>>").struct("x(3,8)").layer(x=>x.mul("1.006,.995"))), + freq("440(5,8)".legato(.18).mul("<1 3/4 2 2/3>")).gain(perlin.range(.2,.8)) +).s("/2") + .onTrigger((t,hap,ct)=>{ + const ac = Tone.getContext().rawContext; + t = ac.currentTime + t - ct; + const { freq, s, gain = 1 } = hap.value; + const master = ac.createGain(); + master.gain.value = 0.1 * gain; + master.connect(ac.destination); + const o = ac.createOscillator(); + o.type = s || 'triangle'; + o.frequency.value = Number(freq); + o.connect(master); + o.start(t); + o.stop(t + hap.duration); +}).stack(s("bd(3,8),hh*4,~ sd").webdirt())`; */ + +export const swimmingWithSoundfonts = `// Koji Kondo - Swimming (Super Mario World) +stack( + n( + "~", + "~", + "~", + "A5 [F5@2 C5] [D5@2 F5] F5", + "[C5@2 F5] [F5@2 C6] A5 G5", + "A5 [F5@2 C5] [D5@2 F5] F5", + "[C5@2 F5] [Bb5 A5 G5] F5@2", + "A5 [F5@2 C5] [D5@2 F5] F5", + "[C5@2 F5] [F5@2 C6] A5 G5", + "A5 [F5@2 C5] [D5@2 F5] F5", + "[C5@2 F5] [Bb5 A5 G5] F5@2", + "A5 [F5@2 C5] A5 F5", + "Ab5 [F5@2 Ab5] G5@2", + "A5 [F5@2 C5] A5 F5", + "Ab5 [F5@2 C5] C6@2", + "A5 [F5@2 C5] [D5@2 F5] F5", + "[C5@2 F5] [Bb5 A5 G5] F5@2" + ).s('Sitar: Ethnic'), + n( + "[F4,Bb4,D5] [[D4,G4,Bb4]@2 [Bb3,D4,F4]] [[G3,C4,E4]@2 [[Ab3,F4] [A3,Gb4]]] [Bb3,E4,G4]", + "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, Bb3, Db3] [F3, Bb3, Db3]]", + "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", + "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", + "[~ [A3, C4, E4] [A3, C4, E4]] [~ [Ab3, C4, Eb4] [Ab3, C4, Eb4]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [G3, C4, E4] [G3, C4, E4]]", + "[~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", + "[~ [F3, Bb3, D4] [F3, Bb3, D4]] [~ [F3, Bb3, C4] [F3, Bb3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]]", + "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", + "[~ [A3, C4, E4] [A3, C4, E4]] [~ [Ab3, C4, Eb4] [Ab3, C4, Eb4]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [G3, C4, E4] [G3, C4, E4]]", + "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", + "[~ [F3, Bb3, D4] [F3, Bb3, D4]] [~ [F3, Bb3, C4] [F3, Bb3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]]", + "[~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [A3, C4, F4] [A3, C4, F4]] [~ [A3, C4, F4] [A3, C4, F4]]", + "[~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [G3, Bb3, F4] [G3, Bb3, F4]] [~ [G3, Bb3, E4] [G3, Bb3, E4]]", + "[~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [A3, C4, F4] [A3, C4, F4]] [~ [A3, C4, F4] [A3, C4, F4]]", + "[~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [G3, Bb3, F4] [G3, Bb3, F4]] [~ [G3, Bb3, E4] [G3, Bb3, E4]]", + "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", + "[~ [F3, Bb3, D4] [F3, Bb3, D4]] [~ [F3, Bb3, C4] [F3, Bb3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]]" + ).s('Kalimba: Ethnic'), + n( + "[G3 G3 C3 E3]", + "[F2 D2 G2 C2]", + "[F2 D2 G2 C2]", + "[F2 A2 Bb2 B2]", + "[A2 Ab2 G2 C2]", + "[F2 A2 Bb2 B2]", + "[G2 C2 F2 F2]", + "[F2 A2 Bb2 B2]", + "[A2 Ab2 G2 C2]", + "[F2 A2 Bb2 B2]", + "[G2 C2 F2 F2]", + "[Bb2 Bb2 A2 A2]", + "[Ab2 Ab2 G2 [C2 D2 E2]]", + "[Bb2 Bb2 A2 A2]", + "[Ab2 Ab2 G2 [C2 D2 E2]]", + "[F2 A2 Bb2 B2]", + "[G2 C2 F2 F2]" + ).s('Acoustic Bass: Bass') + ).slow(51) + `; + +export const bossaRandom = `const chords = "" +const roots = chords.rootNotes(2) + +stack( + chords.voicings(['F4', 'A5']).struct( + \` x@2 ~ x ~ ~ ~ x | + x? ~ ~ x@3 ~ x | + x? ~ ~ x ~ x@3\`), + roots.struct("x [~ x?0.2] x [~ x?] | x!4 | x@2 ~ ~ ~ x x x").transpose("0 7") +).slow(2).pianoroll().note().piano()`; diff --git a/repl/src/tunes.mjs b/repl/src/tunes.mjs index c9224d7a..03375121 100644 --- a/repl/src/tunes.mjs +++ b/repl/src/tunes.mjs @@ -4,25 +4,8 @@ Copyright (C) 2022 Strudel contributors - see . */ -export const tetrisMini = `note(\`[[e5 [b4 c5] d5 [c5 b4]] -[a4 [a4 c5] e5 [d5 c5]] -[b4 [~ c5] d5 e5] -[c5 a4 a4 ~] -[[~ d5] [~ f5] a5 [g5 f5]] -[e5 [~ c5] e5 [d5 c5]] -[b4 [b4 c5] d5 e5] -[c5 a4 a4 ~]], -[[e2 e3]*4] -[[a2 a3]*4] -[[g#2 g#3]*2 [e2 e3]*2] -[a2 a3 a2 a3 a2 a3 b1 c2] -[[d2 d3]*4] -[[c2 c3]*4] -[[b1 b2]*2 [e2 e3]*2] -[[a1 a2]*4]\`).slow(16) -`; - -export const swimming = `stack( +export const swimming = `// Koji Kondo - Swimming (Super Mario World) +stack( seq( "~", "~", @@ -83,7 +66,8 @@ export const swimming = `stack( ).note().slow(51); `; -export const giantSteps = `stack( +export const giantSteps = `// John Coltrane - Giant Steps +stack( // melody seq( "[F#5 D5] [B4 G4] Bb4 [B4 A4]", @@ -107,34 +91,8 @@ export const giantSteps = `stack( ) ).slow(20).note()`; -export const giantStepsReggae = `stack( - // melody - seq( - "[F#5 D5] [B4 G4] Bb4 [B4 A4]", - "[D5 Bb4] [G4 Eb4] F#4 [G4 F4]", - "Bb4 [B4 A4] D5 [D#5 C#5]", - "F#5 [G5 F5] Bb5 [F#5 [F#5 ~@3]]", - ), - // chords - seq( - "[B^7 D7] [G^7 Bb7] Eb^7 [Am7 D7]", - "[G^7 Bb7] [Eb^7 F#7] B^7 [Fm7 Bb7]", - "Eb^7 [Am7 D7] G^7 [C#m7 F#7]", - "B^7 [Fm7 Bb7] Eb^7 [C#m7 F#7]" - ) - .struct("~ [x ~]".fast(4*8)) - .voicings(['E3', 'G4']), - // bass - seq( - "[B2 D2] [G2 D2] [Eb2 Bb2] [A2 D2]", - "[G2 Bb2] [Eb2 F#2] [B2 F#2] [F2 Bb2]", - "[Eb2 Bb2] [A2 D2] [G2 D2] [C#2 F#2]", - "[B2 F#2] [F2 Bb2] [Eb2 Bb2] [C#2 F#2]" - ) - .struct("x ~".fast(4*8)) -).slow(25).note()`; - -export const zeldasRescue = `stack( +export const zeldasRescue = `// Koji Kondo - Princess Zelda's Rescue +stack( // melody \`[B3@2 D4] [A3@2 [G3 A3]] [B3@2 D4] [A3] [B3@2 D4] [A4@2 G4] [D4@2 [C4 B3]] [A3] @@ -157,7 +115,9 @@ export const zeldasRescue = `stack( .room(1) `; -export const caverave = `const keys = x => x.s('sawtooth').cutoff(1200).gain(.5).attack(0).decay(.16).sustain(.3).release(.1); +export const caverave = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +const keys = x => x.s('sawtooth').cutoff(1200).gain(.5).attack(0).decay(.16).sustain(.3).release(.1); const drums = stack( s("bd*2").mask("/8").gain(.8), @@ -201,90 +161,7 @@ stack( ).s() `; -// TODO: -/* -export const xylophoneCalling = `const t = x => x.scaleTranspose("<0 2 4 3>/4").transpose(-2) -const s = x => x.scale(cat('C3 minor pentatonic','G3 minor pentatonic').slow(4)) -const delay = new FeedbackDelay(1/8, .6).chain(vol(0.1), out()); -const chorus = new Chorus(1,2.5,0.5).start(); -stack( - // melody - "<<10 7> <8 3>>/4".struct("x*3").apply(s) - .scaleTranspose("<0 3 2> <1 4 3>") - .superimpose(scaleTranspose(2).early(1/8)) - .apply(t).tone(polysynth().set({ - ...osc('triangle4'), - ...adsr(0,.08,0) - }).chain(vol(0.2).connect(delay),chorus,out())).mask("<~@3 x>/16".early(1/8)), - // pad - "[1,3]/4".scale('G3 minor pentatonic').apply(t).tone(polysynth().set({ - ...osc('square2'), - ...adsr(0.1,.4,0.8) - }).chain(vol(0.2),chorus,out())).mask("<~ x>/32"), - // xylophone - "c3,g3,c4".struct("").fast("<1 <2!3 [4 8]>>").apply(s).scaleTranspose("<0 <1 [2 [3 <4 5>]]>>").apply(t).tone(polysynth().set({ - ...osc('sawtooth4'), - ...adsr(0,.1,0) - }).chain(vol(0.4).connect(delay),out())).mask("/16".early(1/8)), - // bass - "c2 [c2 ~]*2".scale('C hirajoshi').apply(t).tone(synth({ - ...osc('sawtooth6'), - ...adsr(0,.03,.4,.1) - }).chain(vol(0.4),out())), - // kick - "*2".tone(membrane().chain(vol(0.8),out())), - // snare - "~ ".tone(noise().chain(vol(0.8),out())), - // hihat - "c3*4".transpose("[-24 0]*2").tone(metal(adsr(0,.02)).chain(vol(0.5).connect(delay),out())) -).slow(1) -// strudel disable-highlighting`; -*/ - -// TODO: -/* -export const sowhatelse = `// mixer -const mix = (key) => vol({ - chords: .2, - lead: 0.8, - bass: .4, - snare: .95, - kick: .9, - hihat: .35, -}[key]||0); -const delay = new FeedbackDelay(1/6, .3).chain(vol(.7), out()); -const delay2 = new FeedbackDelay(1/6, .2).chain(vol(.15), out()); -const chorus = new Chorus(1,2.5,0.5).start(); -// instruments -const instr = (instrument) => ({ - organ: polysynth().set({...osc('sawtooth4'), ...adsr(.01,.2,0)}).chain(mix('chords').connect(delay),out()), - lead: polysynth().set({...osc('triangle4'),...adsr(0.01,.05,0)}).chain(mix('lead').connect(delay2), out()), - bass: polysynth().set({...osc('sawtooth8'),...adsr(.02,.05,.3,.2)}).chain(mix('bass'),lowpass(3000), out()), - pad: polysynth().set({...osc('square2'),...adsr(0.1,.4,0.8)}).chain(vol(0.15),chorus,out()), - hihat: metal(adsr(0, .02, 0)).chain(mix('hihat'), out()), - snare: noise(adsr(0, .15, 0.01)).chain(mix('snare'), lowpass(5000), out()), - kick: membrane().chain(mix('kick'), out()) -}[instrument]); -// harmony -const t = transpose("<0 0 1 0>/8"); -const sowhat = scaleTranspose("0,3,6,9,11"); -// track -stack( - "[<0 4 [3 [2 1]]>]/4".struct("[x]*3").mask("[~ x ~]").scale('D5 dorian').off(1/6, scaleTranspose(-7)).off(1/3, scaleTranspose(-5)).apply(t).tone(instr('lead')).mask("<~ ~ x x>/8"), - "< <[d3 ~] [c3 f3] g3>>".scale('D dorian').apply(sowhat).apply(t).tone(instr('organ')).mask("/8"), - "<[d2 [d2 ~]*3]!3 >".apply(t).tone(instr('bass')), - "c1*6".tone(instr('hihat')), - "~ c3".tone(instr('snare')), - "<[c1@5 c1] >".tone(instr('kick')), - "[2,4]/4".scale('D dorian').apply(t).tone(instr('pad')).mask("/8") -).fast(6/8) -// strudel disable-highlighting`; -*/ - -export const barryHarris = `backgroundImage( - 'https://media.npr.org/assets/img/2017/02/03/barryharris_600dpi_wide-7eb49998aa1af377d62bb098041624c0a0d1a454.jpg', - {style:'background-size:cover'}) - +export const barryHarris = `// adapted from a Barry Harris excercise "0,2,[7 6]" .add("<0 1 2 3 4 5 7 8>") .scale('C bebop major') @@ -293,7 +170,9 @@ export const barryHarris = `backgroundImage( .note().piano() `; -export const blippyRhodes = `samples({ +export const blippyRhodes = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +samples({ bd: 'samples/tidal/bd/BT0A0D0.wav', sn: 'samples/tidal/sn/ST0T0S3.wav', hh: 'samples/tidal/hh/000_hh3closedhh.wav', @@ -332,7 +211,9 @@ stack( .s('sawtooth').cutoff(600), ).fast(3/2)`; -export const wavyKalimba = `samples({ +export const wavyKalimba = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +samples({ 'kalimba': { c5:'https://freesound.org/data/previews/536/536549_11935698-lq.mp3' } }) const scales = cat('C major', 'C mixolydian', 'F lydian', ['F minor', 'Db major']) @@ -360,37 +241,9 @@ stack( .delay(.2) `; -// TODO: rework tune to use freq -/* -export const jemblung = `const delay = new FeedbackDelay(1/8, .6).chain(vol(0.15), out()); -const snare = noise({type:'white',...adsr(0,0.2,0)}).chain(lowpass(5000),vol(1.8),out()); -const s = polysynth().set({...osc('sawtooth4'),...adsr(0.01,.2,.6,0.2)}).chain(vol(.23).connect(delay),out()); -stack( - stack( - "0 1 4 [3!2 5]".layer( - // chords - x=>x.add("0,3").duration("0.05!3 0.02"), - // bass - x=>x.add("-8").struct("x*8").duration(0.1) - ), - // melody - "12 11*3 12 ~".duration(0.005) - ) - .add("<0 1>") - .tune("jemblung2") - //.mul(22/5).round().xen("22edo") - //.mul(12/5).round().xen("12edo") - .tone(s), - // kick - "[c2 ~]*2".duration(0.05).tone(membrane().chain(out())), - // snare - "[~ c1]*2".early(0.001).tone(snare), - // hihat - "c2*8".tone(noise().chain(highpass(6000),vol(0.5).connect(delay),out())), -).slow(3)`; -*/ - -export const festivalOfFingers = `const chords = ""; +export const festivalOfFingers = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +const chords = ""; stack( chords.voicings().struct("x(3,8,-1)").velocity(.5).off(1/7,x=>x.transpose(12).velocity(.2)), chords.rootNotes(2).struct("x(4,8,-2)"), @@ -403,7 +256,8 @@ stack( .note().piano()`; // iter, echo, echoWith -export const undergroundPlumber = `backgroundImage('https://images.nintendolife.com/news/2016/08/video_exploring_the_funky_inspiration_for_the_super_mario_bros_underground_theme/large.jpg',{ className:'darken' }) +export const undergroundPlumber = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos, inspired by Friendship - Let's not talk about it (1979) :) samples({ bd: 'bd/BT0A0D0.wav', sn: 'sn/ST0T0S3.wav', hh: 'hh/000_hh3closedhh.wav', cp: 'cp/HANDCLP0.wav', }, 'https://loophole-letters.vercel.app/samples/tidal/') @@ -428,7 +282,9 @@ stack( .fast(2/3) .pianoroll({})`; -export const bridgeIsOver = `samples({mad:'https://freesound.org/data/previews/22/22274_109943-lq.mp3'}) +export const bridgeIsOver = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos, bassline by BDP - The Bridge Is Over +samples({mad:'https://freesound.org/data/previews/22/22274_109943-lq.mp3'}) stack( stack( "c3*2 [[c3@1.4 bb2] ab2] gb2*2 <[[gb2@1.4 ab2] bb2] gb2>".legato(".5 1".fast(2)).velocity(.8), @@ -447,7 +303,9 @@ stack( .pianoroll() `; -export const goodTimes = `const scale = cat('C3 dorian','Bb2 major').slow(4); +export const goodTimes = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +const scale = cat('C3 dorian','Bb2 major').slow(4); stack( "2*4".add(12).scale(scale) .off(1/8,x=>x.scaleTranspose("2")).fast(2) @@ -467,7 +325,9 @@ stack( .slow(2) .pianoroll({maxMidi:100,minMidi:20})`; -export const echoPiano = `"<0 2 [4 6](3,4,1) 3*2>" +export const echoPiano = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +"<0 2 [4 6](3,4,1) 3*2>" .scale('D minor') .color('salmon') .off(1/4, x=>x.scaleTranspose(2).color('green')) @@ -477,7 +337,7 @@ export const echoPiano = `"<0 2 [4 6](3,4,1) 3*2>" .note().piano() .pianoroll()`; -export const sml1 = ` +export const sml1 = `// Hirokazu Tanaka - World 1-1 stack( // melody \`< @@ -512,30 +372,9 @@ stack( .legato(.5) ).fast(2).note()`; -/* -// TODO: does not work on linux (at least for me..) -export const speakerman = `backgroundImage('https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fi.ytimg.com%2Fvi%2FXR0rKqW3VwY%2Fmaxresdefault.jpg&f=1&nofb=1', -{ className:'darken', style:'background-size:cover'}) -stack( - "[g3,bb3,d4] [f3,a3,c4] [c3,e3,g3]@2".slow(2).late(.1), - cat( - 'Baker man', - 'is baking bread', - 'Baker man', - 'is baking bread', - 'Sagabona', - 'kunjani wena', - 'Sagabona', - 'kunjani wena', - 'The night train, is coming', - 'got to keep on running', - 'The night train, is coming', - 'got to keep on running', - ).speak("en zu en".slow(12), "<0 2 3 4 5 6>".slow(2)), -).slow(4)`; -*/ - -export const randomBells = `samples({ +export const randomBells = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +samples({ bell: { c6: 'https://freesound.org/data/previews/411/411089_5121236-lq.mp3' }, bass: { d2: 'https://freesound.org/data/previews/608/608286_13074022-lq.mp3' } }) @@ -556,7 +395,9 @@ stack( .pianoroll({minMidi:20,maxMidi:120,background:'transparent'}) `; -export const waa2 = `n( +export const waa2 = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +n( "a4 [a3 c3] a3 c3" .sub("<7 12 5 12>".slow(2)) .off(1/4,x=>x.add(7)) @@ -570,7 +411,9 @@ export const waa2 = `n( .room(.5) `; -export const hyperpop = `const lfo = cosine.slow(15); +export const hyperpop = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +const lfo = cosine.slow(15); const lfo2 = sine.slow(16); const filter1 = x=>x.cutoff(lfo2.range(300,3000)); const filter2 = x=>x.hcutoff(lfo.range(1000,6000)).cutoff(4000) @@ -619,7 +462,9 @@ stack( ).slow(2) // strudel disable-highlighting`; -export const festivalOfFingers3 = `"[-7*3],0,2,6,[8 7]" +export const festivalOfFingers3 = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +"[-7*3],0,2,6,[8 7]" .echoWith(4,1/4, (x,n)=>x .add(n*7) .velocity(1/(n+1)) @@ -635,33 +480,9 @@ export const festivalOfFingers3 = `"[-7*3],0,2,6,[8 7]" .note().piano() //.pianoroll({maxMidi:160})`; -export const bossa = ` -const scales = sequence('C minor', ['D locrian', 'G phrygian'], 'Bb2 minor', ['C locrian','F phrygian']).slow(4) -stack( - "".fast(2).struct("x ~ x@3 x ~ x ~ ~ ~ x ~ x@3".late(1/8)).early(1/8).slow(2).voicings(), - "[~ [0 ~]] 0 [~ [4 ~]] 4".sub(7).restart(scales).scale(scales).early(.25) -).note().piano().slow(2)`; -/* -export const customTrigger = `stack( - freq("55 [110,165] 110 [220,275]".mul("<1 <3/4 2/3>>").struct("x(3,8)").layer(x=>x.mul("1.006,.995"))), - freq("440(5,8)".legato(.18).mul("<1 3/4 2 2/3>")).gain(perlin.range(.2,.8)) -).s("/2") - .onTrigger((t,hap,ct)=>{ - const ac = Tone.getContext().rawContext; - t = ac.currentTime + t - ct; - const { freq, s, gain = 1 } = hap.value; - const master = ac.createGain(); - master.gain.value = 0.1 * gain; - master.connect(ac.destination); - const o = ac.createOscillator(); - o.type = s || 'triangle'; - o.frequency.value = Number(freq); - o.connect(master); - o.start(t); - o.stop(t + hap.duration); -}).stack(s("bd(3,8),hh*4,~ sd").webdirt())`; */ - -export const meltingsubmarine = `samples({ +export const meltingsubmarine = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +samples({ bd: ['bd/BT0AADA.wav','bd/BT0AAD0.wav','bd/BT0A0DA.wav','bd/BT0A0D3.wav','bd/BT0A0D0.wav','bd/BT0A0A7.wav'], sd: ['sd/rytm-01-classic.wav','sd/rytm-00-hard.wav'], hh: ['hh27/000_hh27closedhh.wav','hh/000_hh3closedhh.wav'], @@ -701,68 +522,9 @@ stack( ) .slow(3/2)`; -export const swimmingWithSoundfonts = `stack( - n( - "~", - "~", - "~", - "A5 [F5@2 C5] [D5@2 F5] F5", - "[C5@2 F5] [F5@2 C6] A5 G5", - "A5 [F5@2 C5] [D5@2 F5] F5", - "[C5@2 F5] [Bb5 A5 G5] F5@2", - "A5 [F5@2 C5] [D5@2 F5] F5", - "[C5@2 F5] [F5@2 C6] A5 G5", - "A5 [F5@2 C5] [D5@2 F5] F5", - "[C5@2 F5] [Bb5 A5 G5] F5@2", - "A5 [F5@2 C5] A5 F5", - "Ab5 [F5@2 Ab5] G5@2", - "A5 [F5@2 C5] A5 F5", - "Ab5 [F5@2 C5] C6@2", - "A5 [F5@2 C5] [D5@2 F5] F5", - "[C5@2 F5] [Bb5 A5 G5] F5@2" - ).s('Sitar: Ethnic'), - n( - "[F4,Bb4,D5] [[D4,G4,Bb4]@2 [Bb3,D4,F4]] [[G3,C4,E4]@2 [[Ab3,F4] [A3,Gb4]]] [Bb3,E4,G4]", - "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, Bb3, Db3] [F3, Bb3, Db3]]", - "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", - "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", - "[~ [A3, C4, E4] [A3, C4, E4]] [~ [Ab3, C4, Eb4] [Ab3, C4, Eb4]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [G3, C4, E4] [G3, C4, E4]]", - "[~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", - "[~ [F3, Bb3, D4] [F3, Bb3, D4]] [~ [F3, Bb3, C4] [F3, Bb3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]]", - "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", - "[~ [A3, C4, E4] [A3, C4, E4]] [~ [Ab3, C4, Eb4] [Ab3, C4, Eb4]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [G3, C4, E4] [G3, C4, E4]]", - "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", - "[~ [F3, Bb3, D4] [F3, Bb3, D4]] [~ [F3, Bb3, C4] [F3, Bb3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]]", - "[~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [A3, C4, F4] [A3, C4, F4]] [~ [A3, C4, F4] [A3, C4, F4]]", - "[~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [G3, Bb3, F4] [G3, Bb3, F4]] [~ [G3, Bb3, E4] [G3, Bb3, E4]]", - "[~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [A3, C4, F4] [A3, C4, F4]] [~ [A3, C4, F4] [A3, C4, F4]]", - "[~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [G3, Bb3, F4] [G3, Bb3, F4]] [~ [G3, Bb3, E4] [G3, Bb3, E4]]", - "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", - "[~ [F3, Bb3, D4] [F3, Bb3, D4]] [~ [F3, Bb3, C4] [F3, Bb3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]]" - ).s('Kalimba: Ethnic'), - n( - "[G3 G3 C3 E3]", - "[F2 D2 G2 C2]", - "[F2 D2 G2 C2]", - "[F2 A2 Bb2 B2]", - "[A2 Ab2 G2 C2]", - "[F2 A2 Bb2 B2]", - "[G2 C2 F2 F2]", - "[F2 A2 Bb2 B2]", - "[A2 Ab2 G2 C2]", - "[F2 A2 Bb2 B2]", - "[G2 C2 F2 F2]", - "[Bb2 Bb2 A2 A2]", - "[Ab2 Ab2 G2 [C2 D2 E2]]", - "[Bb2 Bb2 A2 A2]", - "[Ab2 Ab2 G2 [C2 D2 E2]]", - "[F2 A2 Bb2 B2]", - "[G2 C2 F2 F2]" - ).s('Acoustic Bass: Bass') - ).slow(51) - `; - -export const outroMusic = `samples({ +export const outroMusic = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +samples({ bd: ['bd/BT0AADA.wav','bd/BT0AAD0.wav','bd/BT0A0DA.wav','bd/BT0A0D3.wav','bd/BT0A0D0.wav','bd/BT0A0A7.wav'], sd: ['sd/rytm-01-classic.wav','sd/rytm-00-hard.wav'], hh: ['hh27/000_hh27closedhh.wav','hh/000_hh3closedhh.wav'], @@ -789,7 +551,9 @@ export const outroMusic = `samples({ //.pianoroll({autorange:1,vertical:1,fold:0}) `; -export const bassFuge = `samples({ flbass: ['00_c2_finger_long_neck.wav','01_c2_finger_short_neck.wav','02_c2_finger_long_bridge.wav','03_c2_finger_short_bridge.wav','04_c2_pick_long.wav','05_c2_pick_short.wav','06_c2_palm_mute.wav'] }, +export const bassFuge = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +samples({ flbass: ['00_c2_finger_long_neck.wav','01_c2_finger_short_neck.wav','02_c2_finger_long_bridge.wav','03_c2_finger_short_bridge.wav','04_c2_pick_long.wav','05_c2_pick_short.wav','06_c2_palm_mute.wav'] }, 'github:cleary/samples-flbass/main/') samples({ bd: ['bd/BT0AADA.wav','bd/BT0AAD0.wav','bd/BT0A0DA.wav','bd/BT0A0D3.wav','bd/BT0A0D0.wav','bd/BT0A0A7.wav'], @@ -813,18 +577,9 @@ x=>x.add(7).color('steelblue') .stack(s("bd:1*2,~ sd:0,[~ hh:0]*2")) .pianoroll({vertical:1})`; -export const bossaRandom = `const chords = "" -const roots = chords.rootNotes(2) - -stack( - chords.voicings(['F4', 'A5']).struct( - \` x@2 ~ x ~ ~ ~ x | - x? ~ ~ x@3 ~ x | - x? ~ ~ x ~ x@3\`), - roots.struct("x [~ x?0.2] x [~ x?] | x!4 | x@2 ~ ~ ~ x x x").transpose("0 7") -).slow(2).pianoroll().note().piano()`; - -export const chop = `samples({ p: 'https://cdn.freesound.org/previews/648/648433_11943129-lq.mp3' }) +export const chop = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +samples({ p: 'https://cdn.freesound.org/previews/648/648433_11943129-lq.mp3' }) s("p") .loopAt(32,1) @@ -835,14 +590,18 @@ s("p") .sustain(.6) `; -export const delay = `stack( +export const delay = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +stack( s("bd ") .delay("<0 .5>") .delaytime(".16 | .33") .delayfeedback(".6 | .8") ).sometimes(x=>x.speed("-1"))`; -export const orbit = `stack( +export const orbit = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +stack( s("bd ") .delay(.5) .delaytime(.33) @@ -854,7 +613,9 @@ export const orbit = `stack( .orbit(2) ).sometimes(x=>x.speed("-1"))`; -export const belldub = `samples({ bell: {b4:'https://cdn.freesound.org/previews/339/339809_5121236-lq.mp3'}}) +export const belldub = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +samples({ bell: {b4:'https://cdn.freesound.org/previews/339/339809_5121236-lq.mp3'}}) // "Hand Bells, B, Single.wav" by InspectorJ (www.jshaw.co.uk) of Freesound.org stack( // bass @@ -885,7 +646,9 @@ stack( .mask("<1 0>/8") ).slow(5)`; -export const dinofunk = `samples({bass:'https://cdn.freesound.org/previews/614/614637_2434927-hq.mp3', +export const dinofunk = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +samples({bass:'https://cdn.freesound.org/previews/614/614637_2434927-hq.mp3', dino:{b4:'https://cdn.freesound.org/previews/316/316403_5123851-hq.mp3'}}) stack( @@ -903,7 +666,9 @@ note("Abm7".voicings(['c3','a4']).struct("x(3,8,1)".slow(2))), note("").s('dino').delay(.8).slow(8).room(.5) )`; -export const sampleDemo = `stack( +export const sampleDemo = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +stack( // percussion s("[woodblock:1 woodblock:2*2] snare_rim:0,gong/8,brakedrum:1(3,8),~@3 cowbell:3") .sometimes(x=>x.speed(2)), @@ -917,7 +682,9 @@ export const sampleDemo = `stack( .release(.1).room(.5) )`; -export const holyflute = `"c3 eb3(3,8) c4/2 g3*2" +export const holyflute = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +"c3 eb3(3,8) c4/2 g3*2" .superimpose( x=>x.slow(2).add(12), x=>x.slow(4).sub(5) @@ -928,7 +695,9 @@ export const holyflute = `"c3 eb3(3,8) c4/2 g3*2" .pianoroll({fold:0,autorange:0,vertical:0,cycles:12,smear:0,minMidi:40}) `; -export const flatrave = `stack( +export const flatrave = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +stack( s("bd*2,~ [cp,sd]").bank('RolandTR909'), s("hh:1*4").sometimes(fast("2")) @@ -949,7 +718,9 @@ export const flatrave = `stack( .decay(.05).sustain(0).delay(.2).degradeBy(.5).mask("<0 1>/16") )`; -export const amensister = `await samples('github:tidalcycles/Dirt-Samples/master') +export const amensister = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +await samples('github:tidalcycles/Dirt-Samples/master') stack( // amen @@ -981,7 +752,9 @@ stack( n("0 1").s("east").delay(.5).degradeBy(.8).speed(rand.range(.5,1.5)) ).reset("")`; -export const juxUndTollerei = `note("c3 eb3 g3 bb3").palindrome() +export const juxUndTollerei = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ +// by Felix Roos +note("c3 eb3 g3 bb3").palindrome() .s('sawtooth') .jux(x=>x.rev().color('green').s('sawtooth')) .off(1/4, x=>x.add(note("<7 12>/2")).slow(2).late(.005).s('triangle'))