Strudelify

And I Love You So

Don McLean

KeyB♭ majorTempo82 bpm
0:00/0:00
// And I Love You So — Don McLean
// 82 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 67 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(82/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once · [...]/2 spreads a riff over 2 bars.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// other · french horn · "Fr. Horn"
const french_horn = note("<~@9 A@2 B C D E@2 F G@2 H@2 I@7 J@4 ~@9 A@2 B C D K@2 F ~@2 H@2 L@4 ~@10>".pickRestart({
  A: "[~@15 a4@8 g4@8 f4@32 ~]/2", B: "~ c4 d4 eb4", C: "bb4@31 ~", D: "a4@6 f4@2 c5@3 a4@3 f4@2",
  E: "[g4@10 d4@2 eb4@2 g4 bb4]/2", F: "g4 a4", G: "bb4/2", H: "[d4@63 ~]/2", I: "[eb4 d4]/7", J: "[~ eb4@7]/4",
  K: "[g4@40 d4@7 ~ eb4@8 g4@4 bb4@4]/2", L: "[eb4@7 ~]/4",
})).s("gm_french_horn").gain(0.27).pan(0.7)

// bass · electric bass finger · "Bass"
const bass = note(`<
  A B C D E F G H I J K L M N O P Q A R S T U V W X Y@2 Z@2 AA AB@2 A AC C AD AE AF AG P AH AI K L AJ N O P AK A AL AM T
  U V W X AN@2 Z@2 AA AB@2 ~@3
>`.pickRestart({
  A: "bb1@15 ~ bb1@15 ~", B: "bb1@7 ~ bb1@8", C: "bb1@15 ~", D: "c2@7 g1", E: "c2", F: "bb1@17 ~@3 bb1@4 a1@4 f1@4",
  G: "g1", H: "c2@5 bb1 c2 d2", I: "eb2", J: "f2", K: "bb1@9 ~@3 bb1@2 ~@2 bb1@15 ~", L: "c2@11 ~ c2@2 ~@2 c2@12 g1@4",
  M: "c2@8 ~@4 c2 ~@3 c2@16", N: "bb1@9 ~@3 bb1 ~@3 bb1@2 ~@2 bb1@4 a1@4 f1@4", O: "g1@9 ~@3 g1 ~@3 g1@11 ~ a1@4",
  P: "c2@9 ~@3 c2@2 ~@2 c2@4 bb1@4 c2@4 d2@4", Q: "eb2@10 ~@2 eb2@4 f2@9 ~@3 f2@3 ~", R: "bb1@14 ~@2 bb1@12 f1 ~@3",
  S: "bb1@10 ~@2 bb1 ~@3 bb1@14 ~@2", T: "bb1@9 ~@3 bb1 ~@3 bb1@15 ~", U: "c2@12 g1@2 ~ c2@14 ~@3",
  V: "c2@6 g1 ~ c2@6 g1 ~", W: "c2@11 ~ f2@4 f1@9 ~@3 f1 ~@3, ~@11 eb2@2 ~@19", X: "f1@15 ~ bb1@11 ~ f1@2 ~@2",
  Y: "[bb1@12 f1 ~@3 bb1@11 ~ f1 ~@2 bb1@9 a1@6 ~@2 g1@9 ~@3 g1 ~@3]/2",
  Z: "[g1@13 ~@3 g1@9 ~@2 g1@2 ~@2 g1@15 ~@2 c2@10 ~@2 g1 ~@3]/2", AA: "c2@13 ~@3 c2@11 g1 ~@4",
  AB: "[c2@14 ~@2 c2@11 g1 ~@3 c2@12 ~ f2@4 f1@9 ~@3 f1 ~@3, ~@43 eb2@2 ~@19]/2", AC: "bb1@14 ~@2 bb1@15 ~",
  AD: "c2@5 ~ c2 ~ c2@6 g1@2", AE: "c2@9 ~@3 c2@2 ~@2 c2@15 ~", AF: "bb1@9 ~@3 bb1@2 ~@2 bb1@2 ~@2 bb1@4 a1@4 f1@4",
  AG: "g1@9 ~@3 g1@2 ~@2 g1@15 ~", AH: "eb2@9 ~@3 eb2 ~@3 eb2@14 ~@2", AI: "f2@10 ~@2 f2 ~@3 f2@8 eb2@8",
  AJ: "c2@4 ~@2 c2 ~ c2@8", AK: "eb2@9 ~@3 eb2@4 f2@8 ~@4 f2@3 ~", AL: "bb1@15 ~ bb1@16",
  AM: "bb1@9 ~@3 bb1 ~@3 bb1@14 ~@2", AN: "[bb1@11 ~ f1 ~@3 bb1@11 ~ f1 ~@2 bb1@9 a1@6 ~@2 g1@9 ~@3 g1 ~@3]/2",
})).s("gm_electric_bass_finger").gain(0.39)

// other · pad new age · "Fantasia"
const pad_new_age = note("<A@3 ~@29 A@3 ~@14 B@2 ~@13 C D ~>".pickRestart({
  A: "[~ f5 f6 bb5@2 g5 f6 bb5@2 f5 f6 bb5@2 g5 f6 bb5@5 ~@4]/3",
  B: "[~ f5 f6 bb5@2 g5 f6 bb5@2 f5 f6 bb5@2 g5 f6 bb5]/2", C: "~ f5 f6 bb5@2 g5 f6 bb5", D: "bb5 f5 f6 bb5@2 g5 ~@2",
})).s("gm_pad_new_age").gain(0.51).pan(0.7)

// other · string ensemble 2 · "String"
const string_ensemble_2 = note(`<
  A@3 B@2 C D E F G H I@2 J D E K L@2 M N O P@5 Q R S@2 T A@3 B@2 C D E F U H I@2 C D E K L@2 M N O P@5 Q R S@2 T V@3
>`.pickRestart({
  A: "[[bb4,f5]@5 ~]/3", B: "[~ c5 d5 eb5@5]/2", C: "d5 bb4 a4 c5", D: "bb4", E: "c5@4 d5@2 eb5 g5", F: "eb5",
  G: "f5 c5 d5 eb5", H: "d5", I: "[eb5 c5 d5 eb5@5]/2", J: "d5@8 bb4@8 a4@7 ~ c5@8", K: "eb5@16 f5@15 ~",
  L: "[bb4,f5]/2", M: "bb5 a5 g5 gb5", N: "f5 gb5 g5 a5", O: "bb5@5 g5 gb5 g5",
  P: "[bb5@70 f5@2 bb5@2 a5 ~ a5@2 g5 ~]/5", Q: "g5@8 gb5@7 ~ g5@4 a5 ~@3 a5@4 bb5@3 ~",
  R: "bb5@12 d6@8 c6 ~@3 c6@4 f5@4", S: "eb5/2", T: "f5", U: "f5@8 c5@8 d5@8 eb5@7 ~", V: "bb4/3",
})).s("gm_string_ensemble_2").gain(0.16).pan(0.3)

// chords · piano
const piano = note(`<
  A@2 B@2 C@2 D E F G@2 H@5 I J K@2 L M@2 N@3 O@6 P Q R S@2 T U@2 V@2 W X Y Z AA@2 AB AC AD AE AF AG@2 AH AI AJ@6 AK AL
  AM AN
>`.pickRestart({
  A: "[~@8 a4@7 ~@9 bb4@6 ~@10 a4@7 ~@8 bb4@8 ~, [bb2,f3]@15 ~ [bb2,f3]@14 ~ [bb2,f3]@15 ~@2 [bb2,f3]@15 ~, ~@6 [c4,d4]@9 ~@6 c4@9 ~@6 c4@10 ~@6 c4@11 ~, ~@7 f4@8 ~@7 eb4@8 ~@7 d4@9 ~@7 eb4@10 ~, ~@23 g4@7 ~@8 f4@8 ~@8 g4@9 ~]/2", // Bb5 Csus2
  B: "[~@27 [g4,bb4]@4 ~@29 eb4@4, [bb2,f3]@32 ~@7 c3@17 c4@8, ~@5 c4@18 [f4,a4]@8 ~@17 [g4,bb4]@16, ~@6 d4@2 a4@8 f4@3 g4 eb4@11 ~@13 g3@19 ~, ~@7 f4@8 d4@16 [c4,eb4]@16 c4 eb4@4 bb3@12]/2", // Gm Bb5 F Gm Cm
  C: "[~@27 a4@4 ~@29 [a2,a3]@4, [c3,bb4]@23 g4 eb4@8 ~@8 f4@11 f3@5 d4@8, g4@16 eb4@3 g3@12 bb2@33, [c4,eb4]@12 bb3@19 ~@5 f3@4 c4@4 bb3@20, ~@8 g3@8 c4@15 ~@9 d4@8 c4@16]/2", // A C7 Cm
  D: "~@25 f4@7, g2@24 [bb3,d4]@7 ~, bb3@20 d3@11 ~, g3@12 f3@19 ~, ~@8 d3@8 g3@15 ~", // Bb
  E: "~@7 c4, [c3,bb4]@31 ~, [eb4,g4]@23 c4 [eb4,g4]@8, c4@12 bb3@19 ~, ~@8 g3@8 c4@4 g3@11 ~", // C7 Eb
  F: "~@3 bb3, eb2 g3, ~ bb2@7, ~ eb3@3, ~@3 f3@5",
  G: "[~@28 f3@3 ~@29 bb4@4, ~@7 c4@13 f3@8 ~@4 a4@16 [d4,f4]@4 [f3,eb4,g4]@4 [f4,a4]@8, ~@8 [eb4,g4]@16 [c4,eb4,g4,bb4]@7 ~ c4@32, ~@11 f2@19 ~@2 [d4,f4]@4 f3@4 bb3@24, ~@16 c3@15 bb2@33]/2", // Dm Cm F Eb Cm7 Dm
  H: "[~@11 c4@4 ~@12 bb3@4 ~@13 [c4,eb4]@3 ~@13 f4@3 ~@29 a3@3 ~@13 g3@4 ~@12 f3@3 ~@28 bb3@4 ~, c3@31 c3@17 eb4@4 [g3,d4,f4]@4 [eb4,g4]@3 a4@4 ~@9 f4@16 [c4,d4]@8 ~@4 d3@15 d3@11 ~ c3@25 [c4,g4]@7 ~, eb4@16 c4@4 g3@11 ~ [c4,eb4]@4 g3@3 bb3@5 g3@3 bb3@16 bb2@32 ~ g2@31 ~ [c4,eb4]@4 g3@3 bb3@16 eb4@7 ~@2, c4@8 bb3@16 [c4,eb4,g4]@7 ~ g4@16 c4@15 ~@5 f3@4 c4@4 bb3@19 bb3@16 ~ [g3,bb3,d4]@8 [g3,bb3,d4,f4]@7 ~ bb4@31 ~, ~@4 g3@12 bb4@15 ~ bb4@31 ~@9 d4@8 c4@4 f3@12 g3@8 f3@19 ~@5 g4@11 c4@5 eb4@3 g3@11 ~@2]/5", // Cm G7 Eb Csus2 C5 Cm Gm Gm7
  I: "~@12 eb3@3 ~@13 f3@4, eb2@15 ~ f2@16, [f3,g3,bb3,d4]@8 [f3,g3,bb3,d4]@7 ~ [c4,eb4,g4,bb4]@8 [c4,eb4,g4,bb4]@7 ~, ~@4 bb2@11 ~@5 c3@11 ~", // Gm7 Cm7
  J: "~@8 a4@7 ~@9 bb4@7 ~, [bb2,f3]@15 ~ [bb2,f3]@15 ~, ~@5 c4@10 ~@5 c4@10 ~@2, ~@6 d4@9 ~@6 eb4@9 ~@2, ~@7 f4@8 ~@7 g4@8 ~@2", // Bb5
  K: "[~@8 a4@7 ~@26 c4@3 ~ c4@2 ~@15 c4@2, [bb2,f3]@15 ~ [bb2,f3]@16 bb2@16 bb2@16, ~@4 c4@10 ~@6 c4@13 f3@3 bb3@12 ~@2 f3@14, ~@5 d4@9 ~@7 eb4@17 c4 d4@4 ~ d4@4 ~@4 bb3@12, ~@7 f4@8 ~@8 [g4,bb4]@25 ~@6 c4@2 d4@2 c4@2 d4@4]/2", // Bb5 Gm
  L: "~@7 c4 ~@7 c4, bb2@16 bb2@15 ~, ~@2 f3@14 ~@2 f3@13 ~, ~@4 bb3@12 ~@4 bb3@11 ~, ~@6 c4@2 d4@2 c4@2 d4@5 ~@5 c4@2 d4@2 c4@2 d4@4",
  M: "[~@11 eb4@4 ~@14 bb3@2 ~@14 bb3@2 ~@6 bb3@3 ~@2 bb3@2 ~ bb3@2 ~, c3@15 c3@16 c3@16 c3@16 ~, ~ bb3@4 bb3@4 bb3@6 ~@2 bb3@4 bb3@4 bb3@4 ~@4 bb3@4 bb3@4 bb3@4 ~@4 bb3@4 ~@11, ~@3 eb4@4 eb4@4 ~@8 eb4@4 eb4@4 eb4@4 ~@4 eb4@4 eb4@4 eb4@4 ~@4 eb4@5 eb4@4 eb4@4]/2",
  N: "[~@2 bb3@2 ~ bb3@3 eb4@2 ~@3 bb3@2 ~@28 c4@4 ~@29 d4@4 ~@12 bb3@4, c3@16 f2@20 c3@4 f3@7 bb2@22 c4@2 d4@2 c4@6 ~ bb2@16, ~@4 eb4@4 ~@2 bb3@3 ~@5 c3@10 bb4@19 ~ c4@3 f3@10 c4@4 f3@18 f3@13, ~@11 eb4@4 ~@5 f3@10 c4@2 eb4@15 d4@6 bb3@10 d4@4 bb3@25 ~@4, ~@22 c4@2 eb4@2 g4@21 ~ f4@8 c4 d4@3 f4@20 [c4,d4,f4]@8 [c4,d4,f4]@8]/3", // Dm7
  O: "[~@12 a2@3 ~@13 bb3@4 [g3,bb3,d4]@8 ~@2 [g3,bb3,d4]@4 ~@2 g3@4 ~@24 d3@4 ~@18 [c4,bb4]@4 ~@37 bb3@4 ~@17 [f2,c4,eb4,g4,bb4]@21 ~@3 [f2,bb4]@8, [bb2,c5,f5]@16 g2@24 g2@6 ~@2 g1@32 ~@12 bb3@12 c4@4 bb3@4 [c4,eb4]@3 g3@4 bb3@16 [c4,eb4,g4]@8 ~ [c4,eb4,g4]@16 ~@23 [c4,eb4,g4]@9, ~@2 f3@6 [d4,f4]@7 ~@5 d3@26 ~@13 g2@14 g3@7 ~@4 g3@13 g3@5 g3@10 g4@11 c4@4 eb4@4 g3@12 ~@13 g3@26 ~@10, ~@4 bb3@11 bb3@9 g3@8 ~@16 [bb3,d4]@8 [bb3,d4]@8 d3@8 [bb3,d4]@7 ~ c4@8 [c4,bb4]@10 ~@6 bb4@39 ~@49, ~@6 c4@10 g3@6 f3@24 ~@6 g3@14 [g3,bb3,d4]@4 f3@9 ~ [c3,eb4,g4]@32 c3@31 ~@9 c3@30 ~@10]/6", // Gm C7 Cm7 Bb5 Bbsus2 Cm Dm Bb …
  P: "~@9 a4@7 ~@8 bb4@6 ~@2, [bb2,f3]@15 ~ [bb2,f3]@14 ~@2, ~@7 [c4,d4]@9 ~@5 c4@9 ~@2, ~@4 f4@4 ~@3 eb4@4 ~, ~@23 g4@7 ~@2", // Bb5 Csus2
  Q: "~@8 a4@7 ~@9 bb4@7 ~, [bb2,f3]@15 ~ [bb2,f3]@15 ~, ~@5 c4@11 ~@4 c4@11 ~, ~@6 d4@10 ~@6 eb4@9 ~, ~@7 f4@9 ~@7 g4@8 ~", // Bb5
  R: "[bb2,f3]@4 ~@3 [g4,bb4], ~ d4, ~@2 f4 [f4,a4], ~@5 eb4@3, ~@5 g4@2 ~", // Bb5 Gm F
  S: "[~@24 c4@4 ~@15 [c4,eb4]@4 ~@13 a4@4, c3@28 c4@15 ~@4 c4 eb4@4 d4@7 f4@5, ~@4 g3@12 c4@3 g3@12 ~ c3@32, ~@8 [eb4,g4,bb4]@16 [eb4,g4,bb4]@7 ~@8 bb3@13 f4@4 [eb4,g4]@8, ~@8 c4@4 bb3@19 ~@5 g3@28]/2", // Cm Eb
  T: "~@12 c4@4 ~@7 d4@4 ~ [a2,a3]@4, bb2@27 d4@5, ~ f3@3 d4 f3@3, ~@9 bb3@23, ~ c4", // A
  U: "[~@11 [g3,bb3]@4 ~@12 c4@4 ~@25 c4@4 c4@4, g2@20 [a3,c4]@3 bb3 d4@3 eb4@12 eb4@5 bb3@12 [eb4,g4]@7 ~, [g3,bb3]@11 ~@4 bb3 g3@15 ~@5 g3@4 g4@8 c4@4 g3@11 ~, ~@4 d3@27 c3@32 ~, ~@8 f3@23 ~@8 c4 bb4@23 ~]/2", // Gm Am Eb Gm
  V: "[~@28 eb3@3 ~@12 c3@4 ~ [g4,bb4]@8 ~@4 f3@4, eb2@24 [f3,bb3]@7 ~@4 c3@8 ~@21, ~@4 bb2@12 [f4,g4,bb4]@15 ~@16 [c4,eb4]@9 [c4,eb4,g4,bb4]@8, ~@8 [f3,g3,bb3]@12 bb2@11 f2@15 ~ f2@16 ~, ~@12 eb3@11 g3@8 ~@9 f3@7 ~ c5@15 ~]/2", // Gm Bb5 Gm7 Cm Cm7 Gm7
  W: "~@7 g4, [bb2,c4]@27 bb4@4 ~, a4@20 [bb3,eb4]@11 ~, [d4,f4]@8 bb3@8 f4@4 g4@4 [f4,a4]@7 ~, ~@4 f3@12 [f3,d4]@15 ~", // Bbsus2 Eb5 Dm F Dm
  X: "~@4 c4 ~@2 c4, c3@5 c4 g3@2, ~ g3 c4 bb3@5, ~ [eb4,g4]@3, ~@2 bb4@2 g3 bb4@3", // Eb
  Y: "~@11 [c4,eb4]@4 ~@13 a4@4, c3@27 f4@5, ~@4 g3@11 [g3,c4]@16 ~, ~@7 bb3@12 [bb3,d4]@12 ~, ~@15 eb4@5 f4@4 [eb4,g4]@8", // Cm C5 Bb Eb
  Z: "~@12 c4@4 ~@12 a2@3 ~, bb2, ~@3 f3@13 d4@4 f3@4 [a3,d4]@7 ~, ~ bb3@3, ~@16 c4@15 ~", // D5
  AA: "[~@12 [g3,bb3]@4 ~@12 d3@3 ~@29 c4@4, g2@31 ~ c4@4 g3@8 c4@4 eb4@3 g3@11 ~@2, [g3,bb3]@12 ~@4 [g3,bb3]@8 [g3,bb3]@7 ~ g4@23 c4 [eb4,g4]@7 ~, ~@4 d3@12 d3@11 ~@4 c3@31 ~@2, ~@8 f3@12 f3@11 ~ eb4@8 bb3@23 ~]/2", // Gm Eb
  AB: "~@3 eb3 ~@3 f3, eb2@15 ~ f2@16, ~@4 bb2@11 ~@5 c3@11 ~, ~@8 [f3,g3,bb3,d4]@7 ~ [c4,eb4,g4]@8 [c4,eb4,g4,bb4]@8", // Gm7 Cm Cm7
  AC: "~@8 [f4,a4]@8 ~@8 bb4@7 ~, bb2@16 [bb2,f3]@15 ~, ~@4 f3@11 ~@7 eb4@9 ~, ~@7 [c4,d4]@9 ~@5 c4@9 ~@2, ~@23 g4@8 ~", // F Bb5 Csus2
  AD: "~@8 a4@7 ~@9 bb4@7 ~, [bb2,f3]@7 ~ [bb2,f3]@8, ~@5 c4@10 ~@6 c4@10 ~, ~@6 [d4,f4]@8 ~@8 eb4@9 ~, ~@23 g4@9", // Bb5 Dm
  AE: "~@3 c4 d4 c4 d4 c4 ~@7 c4, bb2@7 ~ bb2@8, ~@2 f3@13 ~@3 f3@14, ~@4 bb3@11 ~@5 bb3@12, ~@11 c4 d4 c4 d4@2",
  AF: "~@14 c4@2 ~@7 d4@3 ~@4 c4@2, bb2@15 ~ bb2@16, ~@2 f3@14 ~ f3@14 ~, ~@4 bb3@12 ~@3 bb3@12 ~, ~@6 c4@2 d4@2 c4@2 d4@4 ~@5 c4@5 c4@2 d4@4",
  AG: "[~@10 bb3@2 ~ bb3@2 ~@3 bb3@2 ~ bb3@3 ~@2 bb3@2 ~ bb3@2 ~@11 bb3@2 ~ bb3@2 ~@4 eb4@3 ~@6 eb4@2 bb3@2, c3@15 ~ c3@15 c3@16 ~ c3@15 ~, ~ bb3@2 bb3@2 ~@12 bb3@2 bb3@2 ~@4 bb3@2 bb3@2 bb3@2 ~, ~@4 eb4@4 eb4@4 eb4@3 ~@5 eb4@4 eb4@4 eb4@4 ~@4 eb4@4 eb4@4 eb4@4 ~@8 eb4@4 ~@4]/2",
  AH: "~@7 bb3 ~@6 eb4 bb3, c3@15 ~ c3@15 ~, ~ bb3@2 bb3@2 bb3@2 ~@2 bb3@2 bb3@2 bb3@2 ~, ~ eb4!3 ~ eb4!2 ~",
  AI: "~@3 eb4@3 ~@2 eb4@2 ~@3 bb3 ~@16 c4@2, c3@7 ~ bb2@8, ~@2 bb3@4 bb3@4 bb3@3 ~@5 f3@14, ~@11 eb4@4 ~@5 bb3@12, ~@11 c4 d4 c4 d4@2",
  AJ: "[~@14 c4@2 ~@29 a2@3 ~@8 [g3,bb3,d4]@7 ~@8 d3@5 ~@29 g2@7 ~@59 c4@4 ~@8 bb3@5 c4@4, bb2@16 bb2@32 g2@30 ~ g1@32 ~@8 c4 bb4@12 bb3@11 c4 c2@19 c4@4 [g3,eb4,g4]@8 ~@4 g3@11 ~@2, ~ f3@15 ~@2 f3@6 d4@10 d5@14 ~@17 [g3,bb3,d4]@11 [g3,bb3,d4]@22 [g3,bb3,d4]@13 ~@8 eb4@9 g3@15 bb4@32 ~@17, ~@4 bb3@13 ~@3 bb3@6 f4@10 f5@12 ~@71 g4@32 c3@24 c3@15 ~@2, ~@6 c4@2 d4@2 c4@2 d4@5 ~@5 c4@6 f3@2 bb3@2 c5@6 f3@2 bb3@2 c4 d4@4 ~@5 d3@11 d3@8 ~@41 c3@23 c4@4 eb4@16 g3@4 bb3@16 ~@17]/6", // Gm Cm Gm
  AK: "f2@21 ~@3 bb4@8, ~@11 [f2,c4,eb4]@5, ~@23 [f3,g4]@9", // F7 Fsus2
  AL: "~@9 a4@7 ~@9 bb4@7, [bb2,f3]@15 ~ [bb2,f3]@15 ~, ~@7 [c4,d4]@8 ~@7 c4@9 ~, ~@8 f4@7 ~@8 eb4@9, ~@3 g4", // Bb5 Csus2
  AM: "~@8 a4@7 ~@9 bb4@6 ~@2, [bb2,f3]@14 ~@2 [bb2,f3]@15 ~, ~@6 [c4,d4]@9 ~@6 c4@10 ~, ~@7 f4@7 ~@8 eb4@9 ~, ~@23 g4@8 ~", // Bb5 Csus2
  AN: "bb2",
})).s("gm_piano").gain(0.45).pan(0.3)

// drums · kick
const kick = s("bd").struct("<~@10 [x ~@2 x!2 ~@3]!56 ~>").gain(0.4)

// drums · rim
const rim = s("rim").struct("<~@10 A@16 B A@4 C ~@3 A@23 B A@4 C ~@3>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@4 x ~", C: "~@2 x ~@2 x ~@2",
})).gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<~@26 A ~@4 B ~@26 A ~@4 B ~@3>".pickRestart({
  A: "~@3 x ~@4", B: "~@24 x ~@2 x ~@4",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<~@3 A@6 B C@7 ~@2 C@7 D C@4 E ~@2 F C@28 E ~@3>".pickRestart({
  A: "~ x ~@2", B: "~@8 x ~@11 x ~@2 x ~ x ~@6", C: "x!8", D: "x ~@3 x!4", E: "x!6 ~@2", F: "x ~@7 x ~@7 x ~@7 x!2 ~@6",
})).gain(0.25)

// drums · mid tom
const mid_tom = s("mt").struct("<~@26 A ~@4 B ~@26 A ~@4 B ~@3>".pickRestart({
  A: "~ x ~@2", B: "~@3 x",
})).gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@9 [~@7 x] ~@24 [~@7 x] ~@32>").gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@26 A ~@5 B ~@25 A ~@5 B ~@2>".pickRestart({
  A: "~ x", B: "x",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct("<A@2 ~@15 A@2 ~@13 B@2 ~@15 A@2 ~@13 A C ~>".pickRestart({
  A: "~ x ~ x", B: "~@3 x", C: "~ x ~@2",
})).gain(0.45)

stack(
  french_horn, bass, pad_new_age, string_ensemble_2, piano, kick, rim, low_tom, hihat, mid_tom, open_hat, crash, ride
)

More by Don McLean