Strudelify
Only Yesterday cover art

Horizon

Only Yesterday

Carpenters

KeyC majorTempo123 bpm
0:00/0:00
// Only Yesterday — Carpenters
// 123 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 104 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(123/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, A@4 for four bars: edit a riff to change every repeat.

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  A@2 B C D E D F G H D I J K L M N O P Q R S T U V W D X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ AR AS
  AT AQ AU AV AW AX AY AZ BA BB BC BD BE D E D BF G BG BH BI BJ BK BL BM BN BK BO BP BQ BR BS BT AK BU AE BV BW BX AQ BY
  BZ CA AQ AU CB CC CD CE CF BA CG CH CI CJ
>`.pickRestart({
  A: "[d2@10 f2@2 d3 ~ d3@12 f2@2 a2@2 f2@2]/2", B: "d#2@6 b2 d#2", C: "f2@5 ~ f2@2 g2@4 g1@4", D: "c2@13 ~ g1@2",
  E: "c2@15 ~", F: "c2@6 a2 c2", G: "d2@11 ~ a1@4", H: "g1@6 d2 g1", I: "c2@5 g2 c2@2", J: "a1@6 a2 g2", K: "f#2@3 d2",
  L: "g2@11 ~ g2@2 f2@2", M: "e2@7 e1", N: "f1", O: "d2", P: "g1@7 ~ g1@7 ~", Q: "g1 ~ g1@2 ~@2 g1 ~ g1@7 ~",
  R: "c2@5 ~ c2 ~ c2@5 ~ g1@2", S: "c2@5 ~ c2@2 g2@3 ~ c2@4", T: "d2@5 ~ d2@8 a1@2", U: "d2 ~ d2@2 ~@2 d2 ~ d2@8",
  V: "d2@4 ~@2 d2 ~ d2@5 ~ a1@2", W: "d2@3 d1", X: "c2@6 c3 ~ c3@2 a2@2 g2@2 e2@2", Y: "a1@5 ~ a1@2 a2@4 g2@4",
  Z: "f#2@3 f#2@3 d2@2", AA: "g2@7 ~ g2@4 f2@4", AB: "e2@5 ~ e2@8 c2@2", AC: "f2@5 ~ f2 ~ f2@4 e2@4",
  AD: "d2@5 ~ d2@6 ~@2 d2@2", AE: "g1@5 ~ g1 ~ g1@5 ~ g1 ~", AF: "g1 ~ g1@3 ~ g1 ~ g1@3 ~ g1@4",
  AG: "a#1@5 ~ a#1@2 a#1@6 f1@2", AH: "a#1@5 ~ a#1@2 f2@4 a#1@2 c2@2", AI: "d2@5 ~ d2@2 a1@7 ~",
  AJ: "d2@5 ~ d2 ~ d2@6 c2@2", AK: "a#1@5 ~ a#1@2 f1@5 ~ f1@2", AL: "a#1@5 ~ a#1@2 f1@4 a#1@4",
  AM: "g1@5 ~ g1 ~ g1@4 d2@4", AN: "g2@4 g1 ~ g1@2 a1 ~ a1@2 b1 ~ b1@2", AO: "c2@3 ~ c2@4 c2@2 a1@2 g1@4",
  AP: "c2@5 ~ c2@2 g1@4 c2@4", AQ: "d2@5 ~ d2@2 a1@4 d2@4", AR: "g1@3 g2@3 e2 d2", AS: "c2@5 ~ c2@2 g1@5 ~ g1@2",
  AT: "c2@5 ~ c2@2 g2@2 g1@2 c2@4", AU: "g1@4 g2 ~ g2@2 a2@2 g2@2 e2@2 d2@2", AV: "e2@5 ~ e2@2 b1@4 ~@2 b1@2",
  AW: "e1@5 ~ e1@2 f#1@4 g#1@4", AX: "a1@3 b1@3 a1@2", AY: "a1@5 ~ a1@2 e2@4 a1@4", AZ: "d2@5 ~ d2@4 a2@2 f2@2 d2@2",
  BA: "g1@5 ~ g1@2 d2@4 g1@4", BB: "d2@5 ~ d2@4 d3 ~ d3@2 c3@2", BC: "g2@15 ~", BD: "c2@5 ~ c2@8 g1@2",
  BE: "c2@5 g2@2 e2", BF: "c2 ~ c2 ~@3 c2 ~ c2@8", BG: "g1@2 g2 g1", BH: "c2@14 g2 ~", BI: "c3 d3 e3@3 d3 c3 g2",
  BJ: "a1@10 a1@2 g1@3 ~", BK: "f#1@6 d2 f#1", BL: "g1@6 g2 f2", BM: "e2@11 ~ e2@4", BN: "f2@5 c2 f1@2",
  BO: "g1@5 ~ g1 ~ g1 ~ g1@3 ~ g1 ~", BP: "g1 ~ g1@3 ~ g1@3 ~ g1 ~ g1@2 a1@2", BQ: "a#1@5 ~ a#1 ~ a#1@5 ~ f1@2",
  BR: "a#1@2 ~ a#1@2 f2 a#1 c2", BS: "d2@5 ~ d2@2 a1@5 ~ a1@2", BT: "d2@6 d3 ~ d3@2 c3@2 a2@2 f2@2",
  BU: "a#1@6 f2@3 ~ f1@2 a#1@4", BV: "g1 ~ g1@3 ~ g1@3 ~ g1@2 a1@2 b1@2", BW: "c2@5 ~ c2 ~ c2@2 g1@2 a1@2 g1@2",
  BX: "c2@5 ~ c2@2 g2@4 c2@2 g1@2", BY: "g1@5 ~ g1@2 d2@2 g1@2 g2@2 g1@2", BZ: "c2@5 ~ c2@2 g2@4 g1@4",
  CA: "c2@5 ~ c2@2 g2@2 g1@2 c2@2 c#2@2", CB: "e2@5 ~ e2@2 b1@4 e2@3 ~", CC: "e1@5 ~ e1@2 b1@2 e1@2 e2@2 e1@2",
  CD: "a1@5 ~ a1@2 e2@5 ~ e2@2", CE: "a1@5 ~ a1@2 a2@2 e2@4 a1@2", CF: "d2@6 a2 ~ a2@2 g2@2 d2@2 b1@2",
  CG: "d2@4 ~@2 d2@4 a1@2 d2@3 ~", CH: "g1@6 g2@6 g1@3 ~", CI: "c2@5 ~ g2 ~ g2@4 e2@2 d2@2", CJ: "c2@3 ~",
})).s("gm_fretless_bass").gain(0.23)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  A B C D E@2 F G H I J K L M N O P Q R S E@2 T U V W X Y L Z N O P AA AB AC AD AE AF AG AD AH AI@2 AJ AK AF AL AJ AK AF
  AM AN AO AP AQ AR AS AT AU AV AW E@2 F G H I J K L M N O P AX AY I AD AE AF AG AD AH AI@2 AJ AK AF AL AJ AK AF AM AN
  AO AP AQ AR AS AT AU AV AW
>`.pickRestart({
  A: "e4@6 d4@2 d4@6 c4 ~", B: "c4@6 b3 ~ b3@7 ~", C: "c4@6 b3 ~ b3@6 a3 ~", D: "a3@6 g3@2 g3@7 ~",
  E: "[c3,e3,g3]@15 ~", F: "c3@3 g3 f3@3 e3", G: "d3@3 e3 f3@4", H: "[d3,f3,a3]@15 ~", I: "g3@15 ~", J: "[c3,g3]",
  K: "c3@3 a3 g3@4", L: "[a2,e3]", M: "~@8 c4@7 ~, d3 ~, ~ f#3@3", N: "g3@6 d3@2 g3@7 ~", O: "[e3,g3]",
  P: "f3@6 c3@2 f3@7 ~", Q: "[d3,f3]", R: "~ g3@2 a3", S: "g3@2 f3@4 e3@2 d3@7 ~", T: "f#3@3 e3 d3@3 e3",
  U: "f#3@6 e3@2 d3@7 ~", V: "[f3,g#3]@15 ~", W: "b3 d4", X: "c4", Y: "a3@3 g3 e3@2 c3@2", Z: "d3 ~ c4@2, ~ f#3@3",
  AA: "[d3,a3]@15 ~", AB: "[g3,b3]@3 a3", AC: "[g3,d4]@15 ~", AD: "[a#3,f4]@15 ~", AE: "[a#3,f4]", AF: "[d4,f4]@15 ~",
  AG: "d4@5 ~ d4@2 a3@7 ~", AH: "[a#3,f4]@3 g#3", AI: "[[g3,d4,f4]@12 ~@4 f4@15 ~, ~@12 g3@19 ~]/2", AJ: "[c4,g4]",
  AK: "[c4,g4]@15 ~", AL: "[d4,f4]@2 b3 g3", AM: "[g3,d4]", AN: "[e3,g#3,b3]@15 ~", AO: "e3 d4", AP: "[a3,c4]",
  AQ: "~@4 g3@4 a3@7 ~", AR: "d4@15 ~", AS: "[g3,f4]", AT: "~@2 d4@2 c4 a3@2 g3", AU: "f3@2 f3 e3@2 d3 e3@2",
  AV: "c3@2 g3@2 a3 g3@2 a3", AW: "g3 a3@2 g3 c3@2 ~@2", AX: "[d3,c4]", AY: "[g3,b3]@3 d3",
})).s("gm_piano").gain(0.36)

// chords · piano · "A.PIANO 1"
const piano_2 = note(`<
  A B C D E F G@2 H I J@2 K L M N O P Q@2 E R S@2 T U V@2 K W X N Y Z AA AB AC AD AE AF AD@2 AG AH AI AJ@2 AK AI AJ@2 AL
  AM AN AO AP AQ AR AS AT@3 E R S@2 H AU J@2 K L AV N O Z AA AW AD@2 AX AF AD@2 AY AH AI AJ@2 AK AI AJ@2 AL AM AN AZ AP
  BA AR BB BC BD@2
>`.pickRestart({
  A: "~@6 d5 ~@5 [f4,a4]@2 c5 ~, e5@3 ~ d5@3 ~, ~@2 [f4,a4]@3 ~@3", // F
  B: "~@6 b4 ~@5 [d4,f4]@3 ~, c5@6 ~@2 b4@7 ~, ~@4 [d4,f4]@7 ~@5", // Dm
  C: "~@6 b4 ~@5 [d#4,f#4]@2 a4 ~, c5@3 ~ b4@3 ~, ~@4 [d#4,f#4]@7 ~@5", // D#m
  D: "~@6 g4 ~@5 [d4,f4]@3 ~, a4@6 ~@2 g4@7 ~, ~@2 [d4,f4]@3 ~@3", E: "c4@3 ~ c4 ~ c4@6 e4@4",
  F: "g4@3 ~ g4 ~ g4@4 f4@2 e4@4", G: "[~@4 [a3,c4]@6 ~@2 [a3,c4] ~@7 [a3,c4]@7 ~ [a3,c4]@2 ~@2, d4@15 ~]/2",
  H: "d4@3 ~ d4 ~ d4@6 f4@4", I: "~@8 b4@3 a4@3 g4@2, b4@7 ~@9, ~ [d4,f4]@3",
  J: "[~@6 g4@2 ~@4 c4@4 ~@4 c4@7 ~ c4@4, f4@3 ~ e4@12, ~@4 c4@7 ~@21]/2", K: "~@2 c4@2 e4 g4@3",
  L: "a4@4 c5 b4 a4@2, c5@3 ~@5", M: "~@4 [d4,g4]@9 ~ d4@2, b4@7 ~", N: "b4 ~ b4 ~ b4@2 c5@6 g4@4, e4@15 ~",
  O: "~@2 [c4,f4]@5 c4, a4@7 ~", P: "a4 ~ a4 ~ a4@2 g4@6 f4@4, c4@7 ~", Q: "[e4@3 f4 d4@11 ~, c4@2 b3@5 ~]/2",
  R: "g4@5 ~ g4@2 f4@4 e4@4", S: "[~@4 [a3,c4]@7 ~ [a3,c4]@3 ~@5 [a3,c4]@6 ~@2 [a3,c4]@4, d4@31 ~]/2",
  T: "d4@3 ~ d4 ~ d4@6 f4@4, b3@7 ~", U: "~@6 d5@2 c5@4 b4@3 ~, b4@3 ~@5, ~@4 [f4,g#4]@11 ~",
  V: "[~@3 c5 ~@2 e4@2 ~@2 [c4,e4]@6, b4@3 ~ g4@12, ~@4 [e4,g4]@5 ~@23]/2", W: "a4@4 c5 b4 a4@2, c5@7 ~@9",
  X: "~@2 [d4,g4]@5 d4, b4@7 ~", Y: "~@4 [c4,f4]@6 ~@2 [c4,f4]@3 ~, a4@7 ~",
  Z: "a4 ~ a4 ~ a4 ~ b4@5 ~ c5@3 ~, f#4@13 ~@3", AA: "d5@4 g4 ~ g4@9 ~, f4@15 ~",
  AB: "[g4,b4] ~ [g4,b4]@6 [f4,a4,c5]@4 [g4,b4,d5]@4", AC: "[d5,f5]@3 ~ [d5,f5]@2 [c5,e5]@4 [a#4,d5]@6",
  AD: "[d5,f5]@3 ~ [d5,f5]@2 [c5,e5]@4 [a#4,d5]@5 ~", AE: "d5@3 ~ d5@4 e5 ~ f5@6, a4",
  AF: "~@4 [f4,a4]@6 ~@2 [f4,a4]@3 ~, d5@15 ~", AG: "[c5,d5] ~ [c5,d5] ~ [c5,d5] ~ [c5,d5]@9 ~",
  AH: "[g4,b4] ~ [g4,b4] ~ [g4,b4]@2 [a4,c5]@4 [b4,d5]@6", AI: "[c5,e5]@3 ~ [c5,e5]@3 ~ [c5,e5] ~ [c5,e5]@5 ~",
  AJ: "[[d5,f5]@2 [c5,e5]@2 d5 c5@2 a4@3 [c5,e5]@2 [b4,d5] [a4,c5]@3]/2", AK: "[g4,b4]@4 g4@11 ~",
  AL: "[g4,b4]@3 ~ [g4,b4]@2 [a4,c5]@4 [b4,d5]@6", AM: "~@2 e4@2 g#4 b4@3",
  AN: "[c5,e5]@4 [b4,d5]@4 [a4,c5]@2 [g#4,b4]@5 ~", AO: "[a4,c5]@3 ~ [a4,c5]@2 [b4,d5]@6 [a4,c5]@4",
  AP: "[b4,d5]@2 [a4,c#5] a4, e5@3 ~", AQ: "[e5,g5]@3 [d5,f5]@3 [c5,e5]@2", AR: "[b4,d5]@3 [a4,c5]@3 [g4,b4]@2",
  AS: "[f4,a4,d5]@7 ~", AT: "[[a4,d5]@3 ~ [a4,d5] ~ [g4,c5]@4 [f4,b4]@2 g4@4 [e4,g4]@27 ~@5, ~@3 c5@8 ~]/3",
  AU: "~@8 b4@2 ~ a4@3 g4@2, b4@7 ~@9, ~@4 [d4,f4]@11 ~", AV: "~@2 [d4,g4]@4 ~ d4, b4@7 ~",
  AW: "[g4,b4] ~ [g4,b4]@4 [a4,c5]@4 [b4,d5]@6", AX: "d5@3 ~ d5@4 e5@2 f5@6, a4",
  AY: "[c5,d5] ~ [c5,d5] ~ [c5,d5] ~ [c5,d5]@10", AZ: "[a4,c5]@3 ~ a4@2 [b4,d5]@6 [a4,c5]@4, ~@4 c5 ~@11",
  BA: "[e5,g5]@6 [d5,f5]@5 ~ [c5,e5]@3 ~", BB: "[f4,a4,d5]@15 ~",
  BC: "[a4,d5]@3 ~ [a4,d5] ~ [g4,c5]@4 [f4,b4]@2 g4@3 ~", BD: "[[e4,g4]@27 ~@5]/2",
})).s("gm_piano").gain(0.46).pan(0.6)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@20 A@2 B@2 C@2 A@2 D E F@2 G E H@2 I@2 J@2 I@2 K L M@2 N O M@2 K P Q@2 D R N O N S@3 A@2 T@2 N O A@2 D E F@2 K E O P
  I@2 J@2 I@2 K L M@2 N O M@2 K P U@2 D R N O N S@3
>`.pickRestart({
  A: "[g3,c4,e4]/2", B: "[a3,c4,f#4]/2", C: "[g#3,b3,d4]/2", D: "[a3,c4,e4]@15 ~", E: "[a3,c4,f#4]",
  F: "[[b3,d4] [b3,e4], g4]/2", G: "[a3,c4,f4]", H: "[f4@15 ~ g4@16, [b3,d4]]/2", I: "[[a#3,d4,f4]@31 ~]/2",
  J: "[a3,d4,f4]/2", K: "[a3,c4,f4]@15 ~", L: "f4@7 ~ g4@7 ~, [b3,d4]@15 ~",
  M: "[e4@15 ~ f4@4 e4@11 ~, [g3,c4]@31 ~]/2", N: "[a3,d4,f4]@15 ~", O: "[b3,d4,f4]", P: "[b3,d4,g4]",
  Q: "[e4@16 d4@15 ~, [g#3,b3]]/2", R: "d4@8 c#4@7 ~, [a3,e4]@15 ~",
  S: "[[a3,d4,f4]@3 [c4,e4]@2 [b3,d4] [c4,e4]@16 ~@2, ~@3 g3@19 ~@2]/3", T: "[[a3,c4,f4]@31 ~]/2",
  U: "[e4@3 d4, [g#3,b3]]/2", // G#m
})).s("gm_string_ensemble_2").gain(0.19).pan(0.3)

// other · oboe
const oboe = note("<A B@2 C@3 ~@6 D E F G H I J@2 ~@3 K L@2 M@2 ~@11 N O@2 ~@39 P Q@2 ~@20>".pickRestart({
  A: "~@3 a4", B: "[e5@3 f5 d5@6 ~@4 f#4@2]/2", C: "[a4@6 b4@2 g4@25 ~@15]/3", D: "~@2 c4@2 e4 g4@3",
  E: "c5@7 ~ c5@2 b4@2 a4@4", F: "b4@7 d4", G: "b4 ~ b4 ~ b4@2 c5@6 g4@4", H: "a4@13 ~ c4@2",
  I: "a4 ~ a4 ~ a4@2 g4@6 f4@4", J: "[e4@3 f4 d4@10 ~@2]/2", K: "~@2 d5 a4", L: "[g#4@7 b4]/2", M: "c5/2",
  N: "~ d4 e4 f4 e4 d4 a3 f3", O: "[d3@21 ~@11]/2", P: "~ d5 e5 f5 e5 d5 a4 f4", Q: "[d4@3 ~]/2",
})).s("gm_oboe").gain(0.16).pan(0.2)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@4 A@2 B@2 C D E A F G D H I J K L A M N@2 O P E Q R S T H U G D V W@2 X@2 W Y Z AA AB AC AD AE AB AC AF AE AG AH AI
  AJ AK AL AM AN@2 ~ A@2 B@2 C D A Q AO G D AP I G AQ AR AS AT X AF W AU AV AW AX AY AZ AE AX BA AZ AE BB BC BD BE@2 BF
  BG BH@2 ~
>`.pickRestart({
  A: "~@3 e4@5, c3@15 ~, ~ g3@7, ~ c4@3", B: "~@3 f4@5, c3@15 ~, ~ a3@7, ~ c4@3",
  C: "~@3 f4@5, d3@15 ~, ~@2 a3@13 ~, ~@4 d4@11 ~", D: "~@6 b3@9 ~, g2@15 ~, ~@2 d3@13 ~, ~@4 g3@11 ~",
  E: "~@3 e4@5, c3@7 ~, ~ g3@7, ~ c4@3", F: "~@6 c4@9 ~, a2@15 ~, ~ e3@7, ~@4 a3@11 ~",
  G: "~@3 c4@4 ~, d3@15 ~, ~ f#3@6 ~, ~@2 a3@5 ~", H: "~@3 e4@5, e3@7 ~, ~ g3@7, ~ b3@3",
  I: "~@3 a3@5, f2@7 ~, ~@2 c3@13 ~, ~ f3@3", J: "~@6 c4@9 ~, d3@7 ~, ~@2 f3@13 ~, ~@4 a3@11 ~",
  K: "~ [c4,e4] [g2,b3,d4]@2, c3@5 ~@11, ~ g3@7", L: "~@6 d4@9 ~, g2@13 ~@3, ~@2 g3@13 ~, ~@4 b3@11 ~",
  M: "~@3 e4@4 ~, c3, ~@2 g3@13 ~, ~@4 c4@11 ~", N: "~@3 f#4@5, d3@15 ~, ~ a3@7, ~ c4@3",
  O: "~@3 d4@5, d3@7 ~, ~ f3@7, ~ g#3@3", P: "~@6 d4@9 ~, d3@15 ~, ~ f3@7, ~ g#3@3",
  Q: "~@2 c3 b2, c3@3 e4@5, ~ g3@7, ~ c4@3", R: "~@3 c4@5, a2@15 ~, ~@2 e3@13 ~, ~@4 g3@11 ~",
  S: "~@6 c4@9 ~, d3@7 ~, ~ f#3@6 ~, ~@4 a3@11 ~", T: "~@3 b3@5, g2@3 ~, ~@2 d3@13 ~, ~ g3@3",
  U: "~@6 a3@9 ~, f2@15 ~, ~@2 c3@13 ~, ~@4 f3@11 ~", V: "~@3 b3@4 ~, ~ d3@6 ~, ~@2 g3@5 ~",
  W: "a#2@4 [f3,a#3,d4] ~ a#2 ~@3 [f3,a#3,d4]@6, ~@4 a#2@3 ~", X: "d3@4 [f3,a3,d4] ~ d3 ~@3 [f3,a3,d4]@6, ~@4 d3@3 ~",
  Y: "a#2@4 [f3,a#3,d4] ~ a#2 ~@3 [f3,a#3,d4]@6, ~@8 a#2@7 ~", // A#
  Z: "g2@4 [f3,a3,d4] ~ g2 ~@3 f3@3 ~ f3@2, ~@8 g2@7 ~, ~@5 [a3,d4]@3", // Dm D5
  AA: "g2@4 [g3,b3]@2 g3@2 ~ b3 ~@4 g2 ~, ~@2 d4@3 g3@3, ~@6 g2 ~ g2@4 [b3,d4]@4", // G Bm
  AB: "c3@4 [g3,c4,e4] ~ c3 ~ c3@2 ~@2 c3@2 g3 ~, ~@5 [g3,c4,e4]@2 ~", // C
  AC: "[a3,c4,f4]@3 ~ [g3,c4,e4]@2 c3 ~ c3@2 g3@2 c3@2 g3@2, c3@2 ~@3 [c4,e4]@3", // F C
  AD: "d3@4 [f3,a3,d4] ~ d3 ~ d3@2 f3@2 d3@3 ~, ~@5 [a3,d4]@3", // Dm D5
  AE: "g2@4 [g3,b3,d4] ~ g2 ~ g2@2 g3@2 g2@2 g3@2, ~@5 [b3,d4]@3", // G Bm
  AF: "d3@4 [f3,a3,d4] ~ d3 ~ d3@2 f3@2 d3@2 f3@2, ~@5 [a3,d4]@3", // Dm D5
  AG: "e3@4 [g#3,b3,e4] ~ e3 ~ e3@2 g#3@2 e3@2 g#3@2, ~@5 [b3,e4]@3", // E E5
  AH: "e3@4 [g#3,b3,e4] ~ e3 ~ e3@2 g#3@2 ~@2 g#3@2, ~@5 [b3,e4]@3, ~@3 e3", // E E5
  AI: "a2@4 [a3,c4,e4] ~ a2 ~ a2@2 a3@2 a2@2 a3 ~, ~@5 [c4,e4]@3", // Am C
  AJ: "~ d4 ~ d4 c#4 ~ e4 a2, a3@9 ~ a3@6, a2@4 e4@7 ~@5, ~@6 a2 ~ a2@5 ~@3",
  AK: "d3@4 [a3,d4,f4] ~ d3 ~ d3@2 a3@2 ~@2 a3@2, d4 ~@9 [d4,f4]@6, ~@3 d3", // Dm
  AL: "g2@4 [g3,b3,d4] ~ g2 ~ g2@2 g3@2 g2@3 ~, ~@5 [b3,d4]@3", // G Bm
  AM: "~@12 d4@2 d3 ~, d3@6 f4@9 ~, ~@2 a3@6 d3@5 ~@3, ~@4 d4@6 a3@5 ~",
  AN: "[[a3,d4,f4]@3 ~ [a3,d4,f4] ~ [g3,c4,e4]@2 ~@2 [g3,b3,d4]@2 [g3,c4,e4]@12 ~@8]/2", // Dm C G C
  AO: "~@3 c4@4 ~, a2, ~@2 e3@13 ~, ~@2 a3@5 ~", AP: "~@3 e4@4 ~, e3@3 ~, ~@2 g3@13 ~, ~@4 b3@11 ~",
  AQ: "~@3 b3@5, g2@7 ~, ~@2 d3@13 ~, ~ g3@3", AR: "~@10 g3@2 g3@2 d3 ~, g2@15 ~, ~@2 d3@4 b3@5 ~@5, ~@4 g3@4 d3@5 ~@3",
  AS: "[f3,a#3,d4]@2 ~@2 [f3,a#3,d4] ~ a#2 ~ a#2@2 f3@2 a#2@2 f3@2, a#2@2 ~@3 [a#3,d4]@3", // A#
  AT: "a#2@4 [f3,a#3,d4] ~ a#2 ~ a#2@2 f3@2 a#2@2 f3@2, ~@5 [a#3,d4]@3", // A#
  AU: "a#2@4 [f3,a#3,d4] ~ a#2 ~ a#2@4 [f3,a#3,d4]@2 a#2 ~", // A#
  AV: "~@6 d3 ~@7 [d3,f4]@2, d3@2 d4@3 a3@3, ~@2 a3@6 d3@5 ~@3, ~@3 f4@3 c4@2", // Dm
  AW: "~@12 b3@2 g2 ~, g2@6 d4@9 ~, ~@2 g3@6 g2@5 ~@3, ~@4 b3@6 g3@5 ~",
  AX: "c3@4 [g3,c4,e4] ~ c3 ~ c3@2 g3@2 c3@2 g3 ~, ~@10 [c4,e4]@5 ~", // C
  AY: "[c3,a3,c4,f4]@3 ~ [g3,c4,e4]@2 c3 ~ c3@2 g3@2 ~@2 g3@2, ~@5 [c4,e4]@3, ~@3 c3", // F C
  AZ: "d3@4 [a3,d4,f4] ~ d3 ~ d3@2 a3@2 d3@2 a3@2, ~@5 [d4,f4]@3", // Dm
  BA: "[c3,a3,c4,f4]@3 ~ [g3,c4,e4] ~ c3 ~ c3@2 g3@2 c3@2 g3@2, ~@5 [c4,e4]@3", // F C
  BB: "e3@4 [g#3,b3,e4] ~ e3 ~@3 g#3@3 ~ g#3@2, ~@8 e3@5 ~@3, ~@5 [b3,e4]@3", // E E5
  BC: "e3@4 [g#3,b3,e4] ~ e3 ~ e3@2 g#3@2 e3@2 g#3 ~, ~@10 [b3,d4]@5 ~", // E Bm
  BD: "a2@4 [a3,c4,e4] ~ a2 ~@3 [c4,e4]@5 ~, ~@4 a2@3 ~, ~@10 a3@3 ~@3", // Am C
  BE: "[~@2 d4@2 ~@2 [a2,d4]@2 ~@6 a2@2 [d4,f4] ~ a3 ~ [a3,d4,f4] ~ d3 ~ d3@2 a3@2 ~@2 a3 ~, a3@8 [a2,a3]@4 e4@4 ~@10 [d4,f4]@5 ~, a2@4 e4@5 ~ c#4@6 d3@4 ~@8 d3@4, ~@7 a3@2 ~@7]/2", // D5 Dm A Dm
  BF: "~@6 g2 ~@5 [b3,d4]@2 g2 ~, g2@4 b3@6 g3@5 ~, ~@2 g3@6 g2@5 ~@3, ~@6 d4@5 ~@5", // Bm
  BG: "~@6 d3 ~@5 d4@2 d3 ~, d3@2 d4@3 a3@2 ~, ~@2 a3@6 d3@5 ~@3, ~@3 f4@4 ~",
  BH: "[[a3,d4,f4]@3 ~ [a3,d4,f4] ~ [g3,c4,e4] ~@3 [g3,b3,d4]@2 [g3,c4,e4]@12 ~@8]/2", // Dm C G C
})).s("gm_electric_guitar_clean").gain(0.14).pan(0.9)

// drums · kick
const kick = s("bd").struct("<A@35 B A@7 B A@7 C A C A C A@2 C A@24 D A@13 C A@5 E>".pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x", C: "x ~@2 x!2 ~@2 x", D: "x ~@3 x!2 ~@2", E: "x!2",
})).gain(0.28)

// drums · rim
const rim = s("rim").struct("<[~@3 x]!34 ~@70>").gain(0.28)

// drums · snare
const snare = s("sd").struct("<~@35 A B@7 C B@16 D@17 E B@7 F B@17 G>".pickRestart({
  A: "~ x ~@6", B: "~ x ~ x", C: "~@3 x!2 ~@3", D: "~@3 x", E: "~@5 x ~@2", F: "~@2 x ~@2 x ~@2", G: "~ x ~@2",
})).gain(0.25)

// drums · hihat
const hihat = s("hh").struct(`<
  A B C A@2 B C A D E D A D F B F A G C@2 A H I A F G J G D A F G F G J K ~@26 F G D C H F G H@2 A F G F G H L ~@26
>`.pickRestart({
  A: "x ~ x!5 ~", B: "x ~@2 x!4 ~", C: "x ~ x!3 ~ x ~", D: "x ~ x!3 ~ x!2", E: "x ~@2 x!2 ~ x ~", F: "x ~ x!6",
  G: "x!7 ~", H: "x!8", I: "x!2 ~ x!5", J: "x!5 ~ x!2", K: "x!3 ~ x ~@3", L: "~ x!4 ~@3",
})).gain(0.22)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  A B C D A B C D E F E D E D B D A ~ C E A ~ G D@2 ~ H ~ E D@2 ~ D ~@29 D ~ E@2 ~ D ~@3 D@2 ~ D ~@29
>`.pickRestart({
  A: "~ x ~@5 x", B: "~ x!2 ~@5", C: "~ x ~@3 x ~ x", D: "~ x ~@6", E: "~ x ~@3 x ~@2", F: "~ x!2 ~@2 x ~@2",
  G: "~ x ~@2", H: "~@5 x ~@2",
})).gain(0.12)

// … 65 more lines

More by Carpenters