diff --git a/repl/src/tunes.ts b/repl/src/tunes.ts index 64d71fed..ff394ed4 100644 --- a/repl/src/tunes.ts +++ b/repl/src/tunes.ts @@ -58,62 +58,28 @@ export const tetrisWithFunctions = `stack(sequence( ).slow(16)`; export const tetris = `stack( - cat( - "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 ~" - ), - cat( - "e2 e3 e2 e3 e2 e3 e2 e3", - "a2 a3 a2 a3 a2 a3 a2 a3", - "g#2 g#3 g#2 g#3 e2 e3 e2 e3", - "a2 a3 a2 a3 a2 a3 b1 c2", - "d2 d3 d2 d3 d2 d3 d2 d3", - "c2 c3 c2 c3 c2 c3 c2 c3", - "b1 b2 b1 b2 e2 e3 e2 e3", - "a1 a2 a1 a2 a1 a2 a1 a2", + cat( + "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 ~" + ), + cat( + "e2 e3 e2 e3 e2 e3 e2 e3", + "a2 a3 a2 a3 a2 a3 a2 a3", + "g#2 g#3 g#2 g#3 e2 e3 e2 e3", + "a2 a3 a2 a3 a2 a3 b1 c2", + "d2 d3 d2 d3 d2 d3 d2 d3", + "c2 c3 c2 c3 c2 c3 c2 c3", + "b1 b2 b1 b2 e2 e3 e2 e3", + "a1 a2 a1 a2 a1 a2 a1 a2", ) ).slow(16)`; -export const tetrisRev = `stack( - cat( - "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 ~", - ).rev(), - cat( - "e2 e3 e2 e3 e2 e3 e2 e3", - "a2 a3 a2 a3 a2 a3 a2 a3", - "g#2 g#3 g#2 g#3 e2 e3 e2 e3", - "a2 a3 a2 a3 a2 a3 b1 c2", - "d2 d3 d2 d3 d2 d3 d2 d3", - "c2 c3 c2 c3 c2 c3 c2 c3", - "b1 b2 b1 b2 e2 e3 e2 e3", - "a1 a2 a1 a2 a1 a2 a1 a2", - ).rev() -).slow(16)`; - -/* -.synth({ - oscillator: {type: 'sawtooth'}, - envelope: { attack: 0.1 } -}).filter(1200).gain(0.8) - -*/ - -/* export const tetrisMini1 = - '"[[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 e2 e3 e2 e3 e2 e3] [a2 a3 a2 a3 a2 a3 a2 a3] [g#2 g#3 g#2 g#3 e2 e3 e2 e3] [a2 a3 a2 a3 a2 a3 b1 c2] [d2 d3 d2 d3 d2 d3 d2 d3] [c2 c3 c2 c3 c2 c3 c2 c3] [b1 b2 b1 b2 e2 e3 e2 e3] [a1 a2 a1 a2 a1 a2 a1 a2]]".slow(16)'; - */ export const tetrisMini = `\`[[e5 [b4 c5] d5 [c5 b4]] [a4 [a4 c5] e5 [d5 c5]] [b4 [~ c5] d5 e5] @@ -132,52 +98,6 @@ export const tetrisMini = `\`[[e5 [b4 c5] d5 [c5 b4]] [[a1 a2]*4]\`.slow(16) `; -/* export const tetrisHaskellH = `h(\`slow 16 $ "[[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]"\`) -`; */ -// following syntax is not supported anymore -/* export const tetrisHaskell = `slow 16 $ "[[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]" -`; */ - -/* -export const tetrisHaskell = `h(\`slow 16 $ "[[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]"\`)`; -*/ -export const spanish = `slowcat( - stack(c4,eb4,g4), - stack(bb3,d4,f4), - stack(ab3,c4,eb4), - stack(g3,b3,d4) -)`; - export const whirlyStrudel = `sequence(e4, [b2, b3], c4) .every(4, fast(2)) .every(3, slow(1.5)) @@ -321,26 +241,6 @@ export const magicSofa = `stack( " " ).slow(1).transpose.slowcat(0, 2, 3, 4)`; -/* export const confusedPhone = `stack("[g2 ~@1.3] [c3 ~@1.3]".slow(2)) -.superimpose( - x => transpose(-12,x).late(0), - x => transpose(7,x).late(0.2), - x => transpose(10,x).late(0.4), - x => transpose(12,x).late(0.6), - x => transpose(24,x).late(0.8) -) -.scale(sequence('C dorian', 'C mixolydian').slow(4)) -.scaleTranspose(slowcat(0,1,2,1).slow(2)) -.synth('triangle').gain(0.5).filter(1500)`; */ - -export const confusedPhoneDynamic = `stack("[g2 ~@1.3] [c3 ~@1.3]".slow(2)) -.superimpose( - ...[-12,7,10,12,24].slice(0,5).map((t,i,{length}) => x => transpose(t,x).late(i/length)) -) -.scale(sequence('C dorian', 'C mixolydian').slow(4)) -.scaleTranspose(slowcat(0,1,2,1).slow(2)) -.synth('triangle').gain(0.5).filter(1500)`; - export const confusedPhone = `"[g2 ~@1.3] [c3 ~@1.3]" .superimpose( transpose(-12).late(0), @@ -391,24 +291,25 @@ export const loungerave = `() => { const keys = new PolySynth().set({ ...osc('sawtooth'), ...adsr(0, .5, .2, .7) }).chain(lowpass(1200), vol(.5), out); const drums = stack( - "c1*2".tone(kick).bypass("<0@7 1>/8"), - "~ ".tone(snare).bypass("<0@7 1>/4"), + "c1*2".tone(kick).mask("/8"), + "~ ".tone(snare).mask("/4"), "[~ c4]*2".tone(hihat) ); const thru = (x) => x.transpose("<0 1>/8").transpose(1); const synths = stack( "/2".struct("[x [~ x] <[~ [~ x]]!3 [x x]>@2]/2").edit(thru).tone(bass), - "/2".struct("~ [x@0.1 ~]").voicings().edit(thru).every(2, early(1/4)).tone(keys).bypass("<0@7 1>/8".early(1/4)) + "/2".struct("~ [x@0.1 ~]").voicings().edit(thru).every(2, early(1/4)).tone(keys).mask("/8".early(1/4)) ) return stack( drums, synths ) - //.bypass("<0 1>*4") + //.mask("*4") //.early("0.25 0"); }`; + export const caverave = `() => { const delay = new FeedbackDelay(1/8, .4).chain(vol(0.5), out); const kick = new MembraneSynth().chain(vol(.8), out); @@ -418,8 +319,8 @@ export const caverave = `() => { const keys = new PolySynth().set({ ...osc('sawtooth'), ...adsr(0, .5, .2, .7) }).chain(lowpass(1200), vol(.5), out); const drums = stack( - "c1*2".tone(kick).bypass("<0@7 1>/8"), - "~ ".tone(snare).bypass("<0@7 1>/4"), + "c1*2".tone(kick).mask("/8"), + "~ ".tone(snare).mask("/4"), "[~ c4]*2".tone(hihat) ); @@ -431,9 +332,9 @@ export const caverave = `() => { scaleTranspose(2).early(1/8), scaleTranspose(7).early(1/4), scaleTranspose(8).early(3/8) - ).edit(thru).tone(keys).bypass("<1 0>/16"), - "/2".struct("[x [~ x] <[~ [~ x]]!3 [x x]>@2]/2".fast(2)).edit(thru).tone(bass), - "/2".struct("~ [x@0.1 ~]".fast(2)).voicings().edit(thru).every(2, early(1/8)).tone(keys).bypass("<0@7 1>/8".early(1/4)) + ).apply(thru).tone(keys).mask("<~ x>/16"), + "/2".struct("[x [~ x] <[~ [~ x]]!3 [x x]>@2]/2".fast(2)).apply(thru).tone(bass), + "/2".struct("~ [x@0.1 ~]".fast(2)).voicings().apply(thru).every(2, early(1/8)).tone(keys).mask("/8".early(1/4)) ) return stack( drums.fast(2), @@ -441,15 +342,16 @@ export const caverave = `() => { ).slow(2); }`; + export const callcenterhero = `()=>{ const bpm = 90; const lead = polysynth().set({...osc('sine4'),...adsr(.004)}).chain(vol(0.15),out) const bass = fmsynth({...osc('sawtooth6'),...adsr(0.05,.6,0.8,0.1)}).chain(vol(0.6), out); const s = scale(slowcat('F3 minor', 'Ab3 major', 'Bb3 dorian', 'C4 phrygian dominant').slow(4)); return stack( - "0 2".struct(" [x ~]").edit(s).scaleTranspose(stack(0,2)).tone(lead), - "<6 7 9 7>".struct("[~ [x ~]*2]*2").edit(s).scaleTranspose("[0,2] [2,4]".fast(2).every(4,rev)).tone(lead), - "-14".struct("[~ x@0.8]*2".early(0.01)).edit(s).tone(bass), + "0 2".struct(" [x ~]").apply(s).scaleTranspose(stack(0,2)).tone(lead), + "<6 7 9 7>".struct("[~ [x ~]*2]*2").apply(s).scaleTranspose("[0,2] [2,4]".fast(2).every(4,rev)).tone(lead), + "-14".struct("[~ x@0.8]*2".early(0.01)).apply(s).tone(bass), "c2*2".tone(membrane().chain(vol(0.6), out)), "~ c2".tone(noise().chain(vol(0.2), out)), "c4*4".tone(metal(adsr(0,.05,0)).chain(vol(0.03), out)) @@ -457,3 +359,95 @@ export const callcenterhero = `()=>{ .slow(120 / bpm) } `; + +export const primalEnemy = `()=>{ + const f = fast("<1 <2 [4 8]>>"); + return stack( + "c3,g3,c4".struct("[x ~]*2").apply(f).transpose("<0 <3 [5 [7 [9 [11 13]]]]>>"), + "c2 [c2 ~]*2".tone(synth(osc('sawtooth8')).chain(vol(0.8),out)), + "c1*2".tone(membrane().chain(vol(0.8),out)) + ).slow(1) +}`; + +export const drums = `stack( + "c1*2".tone(membrane().chain(vol(0.8),out)), + "~ c3".tone(noise().chain(vol(0.8),out)), + "c3*4".transpose("[-24 0]*2").tone(metal(adsr(0,.015)).chain(vol(0.8),out)) +) +`; + +export const xylophoneCalling = `()=>{ + const t = x=> x.scaleTranspose("<0 2 4 3>/4").transpose(-2) + const s = x => x.scale(slowcat('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(); + return 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) +}`; + +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 + return 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) +}`; diff --git a/strudel.mjs b/strudel.mjs index fbffa443..6cc75ba5 100644 --- a/strudel.mjs +++ b/strudel.mjs @@ -636,9 +636,6 @@ class Pattern { edit(...funcs) { return stack(...funcs.map(func => func(this))); } - pipe(func) { - return func(this); - } _bypass(on) { on = Boolean(parseInt(on));