Strudelify

They Can't Take That Away From Me

Gershwin

KeyF majorTempo120 bpm
0:00/0:00
// They Can't Take That Away From Me — Gershwin
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 53 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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.

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A ~ B ~ C D E F G H I J K L M@2 N@2 O P Q R S ~ T U V W X Y Z AA AB AC AD ~ AE AF AG AH AI AJ AK AL@5 AM AN@3
>`.pickRestart({
  A: "~@6 a1@5 ~ bb1@5 ~ b1@4 c2@2", B: "~@6 e2@5 ~ f2@5 ~ gb2@3 ~ g2@2", C: "~@3 c2@8 f2", D: "~ c3 b2 a2",
  E: "bb2@12 gb2@9 ~ g2@2", F: "~@2 g1 gb1", G: "f1@8 ~@2 f1@2 g1@9 ~ g1 ~", H: "a1@9 ~ a1@2 ab1@9 ~ ab1@2",
  I: "g1@4 ~ g1 gb1@4 ~ gb1", J: "g1@4 ~@8 d2@5 ~ db2@5 ~", K: "c2@8 g2 c2@3", L: "f2@3 f1",
  M: "[bb1@8 ~@2 bb1@2 c2@9 ~ f1@14 b1@6 e2@6]/2", N: "a1@11 e2", O: "a1@17 ~ a1@6", P: "b1 e2", Q: "a1 g1",
  R: "gb1@12 ab1@11 ~", S: "g1@3 ~@3 b1@3 ~@3 b1@3 ~ b1@3 ~@3 c2@2", T: "b1 bb1", U: "a1@4 ~ a1 ab1@6", V: "g1 gb1",
  W: "g1 ~@5", X: "f2@11 ~ bb1@2 b1 ~ c2@3 ~ ab1 ~ a1 ~", Y: "f1@5 ~ g1@5 ~ ab1@5 ~ a1@5 ~", Z: "bb1@11 ~ c2@11 ~",
  AA: "d2@12 eb2@11 ~", AB: "f2@6 eb2@6 d2@11 ~", AC: "db2@11 ~ c2@11 ~", AD: "f2@6 ~@6 bb1@5 ~ b1@4 c2@2",
  AE: "f2@3 ~ f1@7 ~ g2@4 g1@7 ~", AF: "a2@4 a1@8 bb2@3 ~ bb1@8", AG: "a2@3 ~ a1@8 g2@3 ~ g1@8",
  AH: "f2@3 ~ f1@8 g2@4 g1@8", AI: "a2@3 ~ a1@8 bb2@4 bb1@8", AJ: "a2@4 a1@19 ~", AK: "bb1@16 ~@2 db2@3 ~ d2@2",
  AL: "[~@6 eb1@31 f2@9 ~ e2@11 eb2@9 ~ d2@10 db2@21 c2@20 ~]/5", AM: "~@6 bb1@3 ~ a1@5 ~@2 ab1@3 g1@4",
  AN: "[~@6 gb1@10 ~ f1@49 ~@6]/3",
})).s("gm_acoustic_bass").gain(0.35)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~ A B@2 ~ C D E F G H I J K@2 L@2 M@2 N O P Q R ~ S H T U V W X Y Z AA AB ~ AC AD AE AC AF AG AH AI@5 AJ@4
>`.pickRestart({
  A: "~@3 a2@3 bb2@3 b2@2 c3", B: "[~@30 e3@5 ~ f3@6 gb3@3 ~ g3@2, ~@22 c4@25 ~]/2", C: "~@6 [c3,bb3]@15 ~ f3@2",
  D: "~@6 [c4,f4]@5 ~ [b3,e4]@6 [a3,eb4]@5 ~", E: "[bb3,d4]@12 [gb3,a3]@9 ~ f3@2, ~@21 b3@2 ~", F: "~@2 g2 gb2",
  G: "f2 g2", H: "a2 ab2", I: "g2@12 gb2@11 ~", J: "g2@5 ~@7 [d3,bb3]@5 ~ [db3,b3]@5 ~",
  K: "[bb3@12 g3@6 bb3@6 a3@12 [a3,eb4]@11 ~, c3@7 ~@5]/2", // Adim
  L: "[[bb3,d4]@12 [e3,bb3]@9 ~ f3@13 ~ a3@6 ab3@6, ~@21 a3@13 ~@2 b2@12]/2", // Bb Edim
  M: "[e3@11 ~ f3@12 gb3@12 g3@11 ~, a2@47 ~]/2", N: "gb3@2 f3 eb3, a2@19 ~@5", O: "~@6 a3@6 ab3@11 ~, b2@23 ~",
  P: "~@6 e3@6 ~@6 e3@5 ~, a2@12 g2@11 ~", Q: "~@6 e3@6 [ab2,gb3]@11 ~, gb2 ~",
  R: "~@6 b2@3 ~@3 b2@2 ~@2 b2@5 ~ c3@2, g2@23 ~", S: "b2 bb2", T: "g2 gb2", U: "g2@5 ~@19",
  V: "[a3,eb4]@11 ~ [bb3,e4]@12", W: "[a3,eb4]@2 [g3,db4] [gb3,c4]", X: "[g3,bb3] [e3,db4]",
  Y: "[d3,c4]@12 [eb3,db4]@11 ~", Z: "~@6 eb3@6 [d3,c4]@11 ~, [f3,c4] ~", AA: "[db3,b3] [c3,bb3]",
  AB: "[f3,a3]@5 ~@7 bb2@4 ~@2 b2@3 ~ c3@2", AC: "[f3,a3,e4] [g3,bb3,f4]", AD: "[a3,c4,g4] [bb3,d4,f4]",
  AE: "[a3,c4,g4] [g3,bb3,f4]", AF: "[a3,eb4] [bb3,e4]", AG: "[a3,eb4]!2", AH: "[bb3,d4]@15 ~@3 db4@4 d4@2",
  AI: "[~@6 [eb3,g3,db4]@30 ~ [f3,c4]@10 [e3,d4]@10 ~ [eb3,db4]@10 [d3,c4]@9 ~ [db3,b3]@20 ~ c3@20 ~, ~@49 bb3@10 ~]/5", // Eb7 F5 E7 Eb7 D7 Db7
  AJ: "[~@6 bb2@3 ~ a2@5 ~ ab2@4 [g2,d3]@9 ~ [gb2,db3]@8 ~@2 [f2,c3]@49 ~@7]/4", // G5 Gb5 F5
})).s("gm_piano").gain(0.25)

// chords · piano · "A.PIANO 1"
const piano_2 = note(`<
  A@3 B C@3 D E F@2 G H I@2 J@2 K L M N O P Q R S@2 T@2 U@2 V W X Y Z AA@3 AB@2 AC AD AE AF@2 AG@3 AH@4
>`.pickRestart({
  A: "[~@4 f4@2 f4@3 ~ f4 ~ f4@4 ~@2 f4@4 ~@8 c4@3 ~ db4@2 d4@3 ~ f4@2 d4@4 f4@3 ~@3 f4 ~ f4@2 ~@2 f4 ~ f4@4 ~@2 f4@4 ~@2, ~@11 a4@14 ~@11]/3",
  B: "~@3 g4@2 ab4 a4@2 c5 d5@2 c5",
  C: "[~@4 f4 ~ f4@2 ~@2 f4 ~ f4@3 ~@3 f4@4 ~@8 g4@6 bb4@6 g4@4 a4@2 ~@6 [a4,d5]@5 ~ [ab4,d5]@4 ~@2 [g4,d5]@4 ~@2, ~@22 c5@27 ~@23, ~@5 eb4@3 ~@4]/3", // D5 Abdim G5
  D: "f5@3 ~ d5@2 c5@4 bb4@2 c5@6 a4@4 g4@2, g4@7 ~@5", E: "~@4 f4 ~ f4@2 ~@2 f4 ~ f4@5 ~ f4@6, ~@6 bb3@5 ~",
  F: "[a3@12 bb3@12 ~@4 f4 ~ f4@2 ~@2 f4@2 f4@4 ~@2 f4@6, a4@7 ~@5, ~@24 c4@11 ~ b3@12]/2", G: "bb3@6 a3@5 ~, c4@7 ~",
  H: "[bb3,c4]@4 f4@2 f4@2 ~@2 f4 ~ f4@5 ~ f4@6", I: "[[g4,c5]@9 ~ d5@2 d5@2 d5@2, eb4@3 g4]/2",
  J: "[~@10 bb4@2 [g4,c5]@6 a4@4 f4@14 a4@6 b4@5 ~, [g4,f5]@12 ~@24 d4@11 ~, ~ d5@2 ~@9, ~ c5 ~@6]/2", // C5 G7
  K: "c5@3 a4@3 e5@5 d5", L: "c5@2 b4 a4@2 e5@4 d5@2 c5", M: "a4@5 ~ a4@4 ~@2 a4@6 g4@6", N: "d4@9 a4@2 b4, e4@7 ~@5",
  O: "c5 a4 [c5,e5] [b4,d5]", P: "[a4,c5]@3 a4@3 d5@2 ~ d5@2 ~, ~ ab4",
  Q: "~@6 [db4,f4]@3 ~@3 f4@2 ~@2 f4@5 ~ [c4,e4]@2, g4, ~@12 db4 ~@3 db4@3 ~@5", // Db C
  R: "~@3 f4@2 ~ f4@2 ~@2 f4 ~ f4@5 ~ f4@6",
  S: "[d4@12 db4@12 ~@4 f4 ~ f4@2 ~@2 f4@2 f4@5 ~ f4@6, a4@13 ~@11, ~@24 c4@11 ~ b3@12]/2",
  T: "[bb3@11 ~ a3@12 bb3@4 f4 ~ f4@3 ~ f4@2 f4@5 ~ f4@4 ~@2, c4@7 ~@5]/2",
  U: "[g4@2 ab4@2 ~ c5 [a4,db5] [b4,d5], d5@31 ~@17, ~@2 g4 ~]/2", // A Bm
  V: "f5@4 d5@2 c5@3 ~ bb4@2 [g4,c5]@6 a4@6, g4@11 ~@13", W: "f4@10 ~@2 [g4,c5]@6 bb4@5 ~, ~@6 f4@5 ~",
  X: "a4@6 bb4@5 ~ [gb4,a4]@6 c5@5 ~, f4@11 ~@13", Y: "[f4,g4] [e4,a4]", Z: "f4@6 c4@3 ~ db4@2 d4@4 f4@2 d4@3 ~ f4@2",
  AA: "[~@4 f5 ~ f5@2 ~@2 f5 ~ f5@4 ~@2 f5@4 a5@14 f5@4 a5@2 d6@4 c6@6 f5 ~ f5@3 ~ f5@2 ab5@4 f5@2 g5@6]/3",
  AB: "[c5@27 ~ f5@2 f5@3 ~ f5@2 f5@5 ~ f5@6]/2", AC: "g5 ab5, d6", AD: "g5@6 f5@5 ~ f5@4 ~@2 f5@5 ~, ~@12 db5@11 ~",
  AE: "f5@2 d5 c5@2 bb4 c5@3 a4@2 f4, g4@13 ~@11", AF: "[~@27 bb4@8 ~@2 [f4,a4]@11, ~@6 [f4,c5]@23 ~@19]/2",
  AG: "[[gb4,bb4]@9 ~ [f4,a4]@10 c5@9 ~@2 g4@20 [e4,a4]@20 ~, ~@20 gb4@7 ~@3 f4@20 ~@22]/3", // Gb F A5
  AH: "[f4@4 ~@2 [d4,f4]@3 ~ [db4,f4]@4 ~@2 [c4,f4]@2 ~@2 [b3,f4]@8 ~@2 [bb3,f4]@4 ~@29 [d5,g5,c6]@27 ~@6, ~@41 [a3,e4,a4]@48 ~@7]/4", // Dm Db F5 Bdim Bb5 Csus2 A5
})).s("gm_piano").gain(0.35)

// drums · kick
const kick = s("bd").struct(`<
  ~ A ~ B ~ C ~ D ~ D@3 E D F G H I@6 J ~ D@2 K I L D@5 M ~ N O@4 P Q ~ R S T U V W ~@2
>`.pickRestart({
  A: "~@3 x ~@4 x ~ x!2", B: "~@3 x ~@4 x ~ x ~", C: "~@3 x ~@7 x", D: "x!2", E: "x ~ x!2", F: "x ~ x",
  G: "x ~@5 x ~@4 x", H: "~ x", I: "x", J: "x ~@4 x ~@6", K: "x ~@4 x!2 ~@5", L: "x ~@5 x!2 ~@2 x ~", M: "x ~@8 x ~ x",
  N: "~@2 x ~@5 x ~@2 x", O: "~ x ~@2 x ~", P: "~@2 x ~@6 x ~@2", Q: "x ~@7 x ~@2 x", R: "~@13 x ~@9 x", S: "~@5 x ~@6",
  T: "~ x ~@2", U: "~ x ~@6", V: "~@7 x ~@2 x ~@9 x ~@3", W: "~@7 x ~@9 x ~@6",
})).gain(0.25)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@10 A B ~ B@2 ~@2 B@5 ~ C ~ A@2 B ~@2 A@2 D ~@20>".pickRestart({
  A: "~@5 x ~@6", B: "~@11 x", C: "~@3 x", D: "~@5 x ~@2 x ~@2 x",
})).gain(0.1)

// drums · rim
const rim = s("rim").struct("<~@17 [~ x ~ x]!5 [~@3 x ~@5 x ~ x] ~@30>").gain(0.2)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~ A ~ A ~ B ~@2 C ~@14 B ~@8 D ~@9 B ~@10>".pickRestart({
  A: "~@7 x ~@4", B: "~@5 x", C: "~@2 x", D: "~@3 x",
})).gain(0.1)

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

// drums · open hat
const open_hat = s("oh").struct("<~ A ~ A ~@11 B ~@7 C ~@11 B ~@15 D ~>".pickRestart({
  A: "~@6 x ~@4 x", B: "~@11 x", C: "~@5 x ~@5 x", D: "~@5 x ~@2",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct("<~@5 A ~ B ~@9 C ~@7 C ~ C@3 ~@5 C ~@5 D ~ E F ~@2 F G ~@4>".pickRestart({
  A: "~@3 x ~@7 x", B: "x ~@5 x ~@4 x", C: "x", D: "~ x ~@2 x ~", E: "~@9 x ~ x", F: "~ x ~@2", G: "~ x ~@6",
})).gain(0.3)

// drums · ride
const ride = s("rd").struct(`<
  ~@6 A ~@2 B@3 C B C D ~ E B@4 F ~@2 A B G ~ G B@2 H B F ~@2 I J I@2 K L M N O P Q R S T U ~
>`.pickRestart({
  A: "~ x!3", B: "x!4", C: "x ~ x!2", D: "x ~@2 x ~@2 x!2 ~@4", E: "~@3 x ~ x!2 ~@2 x ~@2",
  F: "x ~@2 x ~@2 x ~@2 x ~ x", G: "~@3 x ~@2 x ~@2 x ~ x", H: "x ~@2 x ~@2 x!2 ~ x ~@2", I: "x ~ x ~@2 x!2 ~ x ~@2 x",
  J: "x ~ x ~@3 x!6", K: "x ~@4 x!2 ~@4 x", L: "x ~ x ~@2 x!2 ~@2 x ~@2", M: "x ~@2 x ~@2 x ~ x ~@3", N: "~@2 x",
  O: "~@3 x ~@9 x ~@9 x", P: "~@5 x ~@4 x ~", Q: "~@13 x ~@3 x ~@5 x", R: "~@10 x ~@2 x ~@6 x ~@3",
  S: "~@7 x ~@2 x ~@9 x ~@3", T: "~@7 x ~@9 x ~@6", U: "x!2 ~@3 x ~@2",
})).gain(0.3)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@9 A B C ~ D ~@3 C E ~ D C ~@3 D@2 F ~ A C ~ A C F ~@3 A ~@3 C G ~@9>".pickRestart({
  A: "~@5 x ~@6", B: "~ x ~@2 x ~", C: "~@11 x", D: "~@5 x ~@5 x", E: "~@8 x ~@2 x", F: "~@2 x", G: "~@5 x ~ x ~@4",
})).gain(0.15)

stack(bass, piano, piano_2, kick, kick_soft, rim, snare, snare_soft, hihat, open_hat, crash, ride, ride_soft)

More by Gershwin