jevstrudel.git / test / testtunes.mjs
1export const timeCatMini = `stack(
2  "c3@3 [eb3, g3, [c4 d4]/2]",
3  "c2 g2",
4  "[eb4@5 [f4 eb4 d4]@3] [eb4 c4]/2".slow(8)
5)`;
6
7export const timeCat = `stack(
8  timeCat([3, c3], [1, stack(eb3, g3, seq(c4, d4).slow(2))]),
9  seq(c2, g2),
10  seq(
11    timeCat([5, eb4], [3, seq(f4, eb4, d4)]), 
12    seq(eb4, c4).slow(2)
13  ).slow(4)
14)`;
15
16export const shapeShifted = `stack(
17  seq(
18    e5, [b4, c5], d5, [c5, b4],
19    a4, [a4, c5], e5, [d5, c5],
20    b4, [r, c5], d5, e5,
21    c5, a4, a4, r,
22    [r, d5], [r, f5], a5, [g5, f5],
23    e5, [r, c5], e5, [d5, c5],
24    b4, [b4, c5], d5, e5,
25    c5, a4, a4, r,
26  ).rev(),
27  seq(
28    e2, e3, e2, e3, e2, e3, e2, e3,
29    a2, a3, a2, a3, a2, a3, a2, a3,
30    gs2, gs3, gs2, gs3, e2, e3, e2, e3,
31    a2, a3, a2, a3, a2, a3, b1, c2,
32    d2, d3, d2, d3, d2, d3, d2, d3,
33    c2, c3, c2, c3, c2, c3, c2, c3,
34    b1, b2, b1, b2, e2, e3, e2, e3,
35    a1, a2, a1, a2, a1, a2, a1, a2,
36  ).rev()
37).slow(16)`;
38
39/* export const tetrisWithFunctions = `stack(seq(
40  'e5', seq('b4', 'c5'), 'd5', seq('c5', 'b4'),
41  'a4', seq('a4', 'c5'), 'e5', seq('d5', 'c5'),
42  'b4', seq(r, 'c5'), 'd5', 'e5',
43  'c5', 'a4', 'a4', r,
44  seq(r, 'd5'), seq(r, 'f5'), 'a5', seq('g5', 'f5'),
45  'e5', seq(r, 'c5'), 'e5', seq('d5', 'c5'),
46  'b4', seq('b4', 'c5'), 'd5', 'e5',
47  'c5', 'a4', 'a4', r),
48  seq(
49    'e2', 'e3', 'e2', 'e3', 'e2', 'e3', 'e2', 'e3',
50    'a2', 'a3', 'a2', 'a3', 'a2', 'a3', 'a2', 'a3',
51    'g#2', 'g#3', 'g#2', 'g#3', 'e2', 'e3', 'e2', 'e3',
52    'a2', 'a3', 'a2', 'a3', 'a2', 'a3', 'b1', 'c2',
53    'd2', 'd3', 'd2', 'd3', 'd2', 'd3', 'd2', 'd3',
54    'c2', 'c3', 'c2', 'c3', 'c2', 'c3', 'c2', 'c3',
55    'b1', 'b2', 'b1', 'b2', 'e2', 'e3', 'e2', 'e3',
56    'a1', 'a2', 'a1', 'a2', 'a1', 'a2', 'a1', 'a2',
57  )
58).slow(16)`; */
59
60/* export const tetris = `stack(
61  seq(
62    "e5 [b4 c5] d5 [c5 b4]",
63    "a4 [a4 c5] e5 [d5 c5]",
64    "b4 [~ c5] d5 e5",
65    "c5 a4 a4 ~",
66    "[~ d5] [~ f5] a5 [g5 f5]",
67    "e5 [~ c5] e5 [d5 c5]",
68    "b4 [b4 c5] d5 e5",
69    "c5 a4 a4 ~"
70  ),
71  seq(
72    "e2 e3 e2 e3 e2 e3 e2 e3",
73    "a2 a3 a2 a3 a2 a3 a2 a3",
74    "g#2 g#3 g#2 g#3 e2 e3 e2 e3",
75    "a2 a3 a2 a3 a2 a3 b1 c2",
76    "d2 d3 d2 d3 d2 d3 d2 d3",
77    "c2 c3 c2 c3 c2 c3 c2 c3",
78    "b1 b2 b1 b2 e2 e3 e2 e3",
79    "a1 a2 a1 a2 a1 a2 a1 a2",
80  )
81).slow(16)`;
82 */
83
84export const whirlyStrudel = `seq(e4, [b2,  b3], c4)
85.every(4, fast(2))
86.every(3, slow(1.5))
87.fast(cat(1.25, 1, 1.5))
88.every(2, _ => seq(e4, r, e3, d4, r))`;
89
90export const transposedChordsHacked = `stack(
91  "c2 eb2 g2",
92  "Cm7".voicings('lefthand').slow(2)
93).transpose(
94  "<1 2 3 2>".slow(2)
95).transpose(5)`;
96// range ['g2','c4']
97
98export const scaleTranspose = `"f2,f3,c4,ab4"
99.scale(seq('F minor', 'F harmonic minor').slow(4))
100.scaleTranspose("<0 -1 -2 -3>")
101.transpose("0 1".slow(16))`;
102
103export const struct = `stack(
104  "c2 g2 a2 [e2@2 eb2] d2 a2 g2 [d2 ~ db2]",
105  "[C^7 A7] [Dm7 G7]".struct("[x@2 x] [~@2 x] [~ x@2]@2 [x ~@2] ~ [~@2 x@4]@2")
106  .voicings('lefthand')
107).slow(4)`;
108// range ['G3','A4']
109
110export const magicSofa = `stack(
111  "<C^7 F^7 ~> <Dm7 G7 A7 ~>"
112   .every(2, fast(2))
113   .voicings('lefthand'),
114  "<c2 f2 g2> <d2 g2 a2 e2>"
115).transpose("<0 2 3 4>")`;
116// below doesn't work anymore due to constructor cleanup
117// ).slow(1).transpose.cat(0, 2, 3, 4)`;
118
119export const confusedPhone = `"[g2 ~@1.3] [c3 ~@1.3]"
120.superimpose(
121  transpose(-12).late(0),
122  transpose(7).late(0.1),
123  transpose(10).late(0.2),
124  transpose(12).late(0.3),
125  transpose(24).late(0.4)
126)
127.scale(cat('C dorian', 'C mixolydian'))
128.scaleTranspose("<0 1 2 1>")
129.slow(2)`;
130
131export const technoDrums = `stack(
132  "c1*2".tone(new MembraneSynth().toDestination()),
133  "~ x".tone(new NoiseSynth().toDestination()),
134  "[~ c4]*2".tone(new MetalSynth().set({envelope:{decay:0.06,sustain:0}}).chain(new Gain(0.5),getDestination()))
135)`;
136
137/*
138export const caverave = `const delay = new FeedbackDelay(1/8, .4).chain(vol(0.5), out());
139const kick = new MembraneSynth().chain(vol(.8), out());
140const snare = new NoiseSynth().chain(vol(.8), out());
141const hihat = new MetalSynth().set(adsr(0, .08, 0, .1)).chain(vol(.3).connect(delay),out());
142const bass = new Synth().set({ ...osc('sawtooth'), ...adsr(0, .1, .4) }).chain(lowpass(900), vol(.5), out());
143const keys = new PolySynth().set({ ...osc('sawtooth'), ...adsr(0, .5, .2, .7) }).chain(lowpass(1200), vol(.5), out());
144
145const drums = stack(
146  "c1*2".tone(kick).mask("<x@7 ~>/8"),
147  "~ <x!7 [x@3 x]>".tone(snare).mask("<x@7 ~>/4"),
148  "[~ c4]*2".tone(hihat)
149);
150
151const thru = (x) => x.transpose("<0 1>/8").transpose(-1);
152const synths = stack(
153  "<eb4 d4 c4 b3>/2".scale(timeCat([3,'C minor'],[1,'C melodic minor']).slow(8)).struct("[~ x]*2")
154  .layer(
155    scaleTranspose(0).early(0),
156    scaleTranspose(2).early(1/8),
157    scaleTranspose(7).early(1/4),
158    scaleTranspose(8).early(3/8)
159  ).apply(thru).tone(keys).mask("<~ x>/16"),
160  "<C2 Bb1 Ab1 [G1 [G2 G1]]>/2".struct("[x [~ x] <[~ [~ x]]!3 [x x]>@2]/2".fast(2)).apply(thru).tone(bass),
161  "<Cm7 Bb7 Fm7 G7b13>/2".struct("~ [x@0.1 ~]".fast(2)).voicings('lefthand').apply(thru).every(2, early(1/8)).tone(keys).mask("<x@7 ~>/8".early(1/4))
162)
163stack(
164  drums.fast(2), 
165  synths
166).slow(2)`; */
167
168export const tetrisMini = `note(\`[[e5 [b4 c5] d5 [c5 b4]]
169[a4 [a4 c5] e5 [d5 c5]]
170[b4 [~ c5] d5 e5]
171[c5 a4 a4 ~]
172[[~ d5] [~ f5] a5 [g5 f5]]
173[e5 [~ c5] e5 [d5 c5]]
174[b4 [b4 c5] d5 e5]
175[c5 a4 a4 ~]],
176[[e2 e3]*4]
177[[a2 a3]*4]
178[[g#2 g#3]*2 [e2 e3]*2]
179[a2 a3 a2 a3 a2 a3 b1 c2]
180[[d2 d3]*4]
181[[c2 c3]*4]
182[[b1 b2]*2 [e2 e3]*2]
183[[a1 a2]*4]\`).slow(16)
184`;
185
186export const giantStepsReggae = `stack(
187  // melody
188  seq(
189    "[F#5 D5] [B4 G4] Bb4 [B4 A4]",
190    "[D5 Bb4] [G4 Eb4] F#4 [G4 F4]",
191    "Bb4 [B4 A4] D5 [D#5 C#5]",
192    "F#5 [G5 F5] Bb5 [F#5 [F#5 ~@3]]",
193  ),
194  // chords
195  seq(
196    "[B^7 D7] [G^7 Bb7] Eb^7 [Am7 D7]",
197    "[G^7 Bb7] [Eb^7 F#7] B^7 [Fm7 Bb7]",
198    "Eb^7 [Am7 D7] G^7 [C#m7 F#7]",
199    "B^7 [Fm7 Bb7] Eb^7 [C#m7 F#7]"
200  )
201  .struct("~ [x ~]".fast(4*8))
202  .voicings('lefthand'),
203  // bass
204  seq(
205    "[B2 D2] [G2 D2] [Eb2 Bb2] [A2 D2]",
206    "[G2 Bb2] [Eb2 F#2] [B2 F#2] [F2 Bb2]",
207    "[Eb2 Bb2] [A2 D2] [G2 D2] [C#2 F#2]",
208    "[B2 F#2] [F2 Bb2] [Eb2 Bb2] [C#2 F#2]"
209  )
210  .struct("x ~".fast(4*8))
211).slow(25).note()`;
212
213// range ['E3', 'G4']
214
215// TODO:
216/*
217export const xylophoneCalling = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/
218// by Felix Roos
219const t = x => x.scaleTranspose("<0 2 4 3>/4").transpose(-2)
220const s = x => x.scale(cat('C3 minor pentatonic','G3 minor pentatonic').slow(4))
221const delay = new FeedbackDelay(1/8, .6).chain(vol(0.1), out());
222const chorus = new Chorus(1,2.5,0.5).start();
223stack(
224  // melody
225  "<<10 7> <8 3>>/4".struct("x*3").apply(s)
226  .scaleTranspose("<0 3 2> <1 4 3>")
227  .superimpose(scaleTranspose(2).early(1/8))
228  .apply(t).tone(polysynth().set({
229    ...osc('triangle4'),
230    ...adsr(0,.08,0)
231  }).chain(vol(0.2).connect(delay),chorus,out())).mask("<~@3 x>/16".early(1/8)),
232  // pad
233  "[1,3]/4".scale('G3 minor pentatonic').apply(t).tone(polysynth().set({
234    ...osc('square2'),
235    ...adsr(0.1,.4,0.8)
236  }).chain(vol(0.2),chorus,out())).mask("<~ x>/32"),
237  // xylophone
238  "c3,g3,c4".struct("<x*2 x>").fast("<1 <2!3 [4 8]>>").apply(s).scaleTranspose("<0 <1 [2 [3 <4 5>]]>>").apply(t).tone(polysynth().set({
239    ...osc('sawtooth4'),
240    ...adsr(0,.1,0)
241  }).chain(vol(0.4).connect(delay),out())).mask("<x@3 ~>/16".early(1/8)),
242  // bass
243  "c2 [c2 ~]*2".scale('C hirajoshi').apply(t).tone(synth({
244    ...osc('sawtooth6'),
245    ...adsr(0,.03,.4,.1)
246  }).chain(vol(0.4),out())),
247  // kick
248  "<c1!3 [c1 ~]*2>*2".tone(membrane().chain(vol(0.8),out())),
249  // snare
250  "~ <c3!7 [c3 c3*2]>".tone(noise().chain(vol(0.8),out())),
251  // hihat
252  "c3*4".transpose("[-24 0]*2").tone(metal(adsr(0,.02)).chain(vol(0.5).connect(delay),out()))
253).slow(1)
254// strudel disable-highlighting`;
255*/
256
257// TODO:
258/*
259export const sowhatelse = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/
260// by Felix Roos
261// mixer
262const mix = (key) => vol({
263  chords: .2,
264  lead: 0.8,
265  bass:  .4,
266  snare: .95, 
267  kick:  .9,
268  hihat: .35,
269}[key]||0);
270const delay = new FeedbackDelay(1/6, .3).chain(vol(.7), out());
271const delay2 = new FeedbackDelay(1/6, .2).chain(vol(.15), out());
272const chorus = new Chorus(1,2.5,0.5).start();
273// instruments
274const instr = (instrument) => ({
275  organ: polysynth().set({...osc('sawtooth4'), ...adsr(.01,.2,0)}).chain(mix('chords').connect(delay),out()),
276  lead: polysynth().set({...osc('triangle4'),...adsr(0.01,.05,0)}).chain(mix('lead').connect(delay2), out()),
277  bass: polysynth().set({...osc('sawtooth8'),...adsr(.02,.05,.3,.2)}).chain(mix('bass'),lowpass(3000), out()),
278  pad: polysynth().set({...osc('square2'),...adsr(0.1,.4,0.8)}).chain(vol(0.15),chorus,out()),
279  hihat: metal(adsr(0, .02, 0)).chain(mix('hihat'), out()),
280  snare: noise(adsr(0, .15,  0.01)).chain(mix('snare'), lowpass(5000), out()),
281  kick: membrane().chain(mix('kick'), out())
282}[instrument]);
283// harmony
284const t = transpose("<0 0 1 0>/8");
285const sowhat = scaleTranspose("0,3,6,9,11");
286// track
287stack(
288  "[<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"),
289  "<<e3 [~@2 a3]> <[d3 ~] [c3 f3] g3>>".scale('D dorian').apply(sowhat).apply(t).tone(instr('organ')).mask("<x x x ~>/8"),
290  "<[d2 [d2 ~]*3]!3 <a1*2 c2*3 [a1 e2]>>".apply(t).tone(instr('bass')),
291  "c1*6".tone(instr('hihat')),
292  "~ c3".tone(instr('snare')),
293  "<[c1@5 c1] <c1 [[c1@2 c1] ~] [c1 ~ c1] [c1!2 ~ c1!3]>>".tone(instr('kick')),
294  "[2,4]/4".scale('D dorian').apply(t).tone(instr('pad')).mask("<x x x ~>/8")
295).fast(6/8)
296// strudel disable-highlighting`;
297*/
298
299// TODO: rework tune to use freq
300/*
301export const jemblung = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/
302// by Felix Roos
303const delay = new FeedbackDelay(1/8, .6).chain(vol(0.15), out());
304const snare = noise({type:'white',...adsr(0,0.2,0)}).chain(lowpass(5000),vol(1.8),out());
305const s = polysynth().set({...osc('sawtooth4'),...adsr(0.01,.2,.6,0.2)}).chain(vol(.23).connect(delay),out());
306stack(
307  stack(
308    "0 1 4 [3!2 5]".layer(
309      // chords
310      x=>x.add("0,3").duration("0.05!3 0.02"),
311      // bass
312      x=>x.add("-8").struct("x*8").duration(0.1) 
313    ),
314    // melody
315    "12 11*3 12 ~".duration(0.005) 
316  )
317  .add("<0 1>")
318  .tune("jemblung2")
319  //.mul(22/5).round().xen("22edo")
320  //.mul(12/5).round().xen("12edo")
321  .tone(s),
322  // kick
323  "[c2 ~]*2".duration(0.05).tone(membrane().chain(out())), 
324  // snare
325  "[~ c1]*2".early(0.001).tone(snare),
326  // hihat
327  "c2*8".tone(noise().chain(highpass(6000),vol(0.5).connect(delay),out())),
328).slow(3)`;
329*/
330
331/*
332// TODO: does not work on linux (at least for me..)
333export const speakerman = `// licensed with CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/
334// by Felix Roos
335backgroundImage('https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fi.ytimg.com%2Fvi%2FXR0rKqW3VwY%2Fmaxresdefault.jpg&f=1&nofb=1', 
336{ className:'darken', style:'background-size:cover'})
337stack(
338  "[g3,bb3,d4] [f3,a3,c4] [c3,e3,g3]@2".slow(2).late(.1),
339  cat(
340  'Baker man',
341  'is baking bread',
342  'Baker man',
343  'is baking bread',
344  'Sagabona',
345  'kunjani wena',
346  'Sagabona',
347  'kunjani wena',
348  'The night train, is coming',
349  'got to keep on running',
350  'The night train, is coming',
351  'got to keep on running',
352  ).speak("en zu en".slow(12), "<0 2 3 4 5 6>".slow(2)),
353).slow(4)`;
354*/
355
356export const bossa = `const scales = sequence('C minor', ['D locrian', 'G phrygian'], 'Bb2 minor', ['C locrian','F phrygian']).slow(4)
357stack(
358  "<Cm7 [Dm7b5 G7b9] Bbm7 [Cm7b5 F7b9]>".fast(2).struct("x ~ x@3 x ~ x ~ ~ ~ x ~ x@3".late(1/8)).early(1/8).slow(2).voicings('lefthand'),
359  "[~ [0 ~]] 0 [~ [4 ~]] 4".sub(7).restart(scales).scale(scales).early(.25)
360).note().piano().slow(2)`;
361
362export const swimmingWithSoundfonts = `// Koji Kondo - Swimming (Super Mario World)
363stack(
364    n(
365      "~",
366      "~",
367      "~",
368      "A5 [F5@2 C5] [D5@2 F5] F5",
369      "[C5@2 F5] [F5@2 C6] A5 G5",
370      "A5 [F5@2 C5] [D5@2 F5] F5",
371      "[C5@2 F5] [Bb5 A5 G5] F5@2",
372      "A5 [F5@2 C5] [D5@2 F5] F5",
373      "[C5@2 F5] [F5@2 C6] A5 G5",
374      "A5 [F5@2 C5] [D5@2 F5] F5",
375      "[C5@2 F5] [Bb5 A5 G5] F5@2",
376      "A5 [F5@2 C5] A5 F5",
377      "Ab5 [F5@2 Ab5] G5@2",
378      "A5 [F5@2 C5] A5 F5",
379      "Ab5 [F5@2 C5] C6@2",
380      "A5 [F5@2 C5] [D5@2 F5] F5",
381      "[C5@2 F5] [Bb5 A5 G5] F5@2"
382    ).s('Sitar: Ethnic'),
383    n(
384      "[F4,Bb4,D5] [[D4,G4,Bb4]@2 [Bb3,D4,F4]] [[G3,C4,E4]@2 [[Ab3,F4] [A3,Gb4]]] [Bb3,E4,G4]",
385      "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, Bb3, Db3] [F3, Bb3, Db3]]",
386      "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]",
387      "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]",
388      "[~ [A3, C4, E4] [A3, C4, E4]] [~ [Ab3, C4, Eb4] [Ab3, C4, Eb4]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [G3, C4, E4] [G3, C4, E4]]",
389      "[~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]",
390      "[~ [F3, Bb3, D4] [F3, Bb3, D4]] [~ [F3, Bb3, C4] [F3, Bb3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]]",
391      "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]",
392      "[~ [A3, C4, E4] [A3, C4, E4]] [~ [Ab3, C4, Eb4] [Ab3, C4, Eb4]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [G3, C4, E4] [G3, C4, E4]]",
393      "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]",
394      "[~ [F3, Bb3, D4] [F3, Bb3, D4]] [~ [F3, Bb3, C4] [F3, Bb3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]]",
395      "[~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [A3, C4, F4] [A3, C4, F4]] [~ [A3, C4, F4] [A3, C4, F4]]",
396      "[~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [G3, Bb3, F4] [G3, Bb3, F4]] [~ [G3, Bb3, E4] [G3, Bb3, E4]]",
397      "[~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [A3, C4, F4] [A3, C4, F4]] [~ [A3, C4, F4] [A3, C4, F4]]",
398      "[~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [G3, Bb3, F4] [G3, Bb3, F4]] [~ [G3, Bb3, E4] [G3, Bb3, E4]]",
399      "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]",
400      "[~ [F3, Bb3, D4] [F3, Bb3, D4]] [~ [F3, Bb3, C4] [F3, Bb3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]]"
401    ).s('Kalimba: Ethnic'),
402    n(
403      "[G3 G3 C3 E3]",
404      "[F2 D2 G2 C2]",
405      "[F2 D2 G2 C2]",
406      "[F2 A2 Bb2 B2]",
407      "[A2 Ab2 G2 C2]",
408      "[F2 A2 Bb2 B2]",
409      "[G2 C2 F2 F2]",
410      "[F2 A2 Bb2 B2]",
411      "[A2 Ab2 G2 C2]",
412      "[F2 A2 Bb2 B2]",
413      "[G2 C2 F2 F2]",
414      "[Bb2 Bb2 A2 A2]",
415      "[Ab2 Ab2 G2 [C2 D2 E2]]",
416      "[Bb2 Bb2 A2 A2]",
417      "[Ab2 Ab2 G2 [C2 D2 E2]]",
418      "[F2 A2 Bb2 B2]",
419      "[G2 C2 F2 F2]"
420    ).s('Acoustic Bass: Bass')
421  ).slow(51)
422    `;
423
424export const bossaRandom = `const chords = "<Am7 Am7 Dm7 E7>"
425const roots = chords.rootNotes(2)
426
427stack(
428  chords.voicings('lefthand').struct(
429  \` x@2   ~ x ~ ~ ~ x |
430    x?  ~ ~ x@3   ~ x |
431    x?  ~ ~ x ~ x@3\`),
432  roots.struct("x [~ x?0.2] x [~ x?] | x!4 | x@2 ~ ~ ~ x x x").transpose("0 7")
433).slow(2).pianoroll().note().piano()`;
434
435// range ['F4', 'A5']