Strudelify

Let's Call the Whole Thing Off

Gershwin

KeyG majorTempo120 bpm
0:00/0:00
// Let's Call the Whole Thing Off — Gershwin
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 62 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 D F G H I J K L M N O P Q R S T U R S V W X K Y M Z G AA AB AC AD AE AF AG ~@2 AH ~ AI R AJ AK U AL AM O
  AN@3 AO AP@3 AQ@3 AR
>`.pickRestart({
  A: "b1@5 e2@7", B: "a1@9 ~ d2@14", C: "g1@9 ~ a#1@9 ~@3 a#1@2", D: "a1@5 d2@4 ~@2 d2", E: "g1@5 a#1@4 ~@2 a#1",
  F: "g2@7 ~@3 g2@2 f2@7 ~@3 f2@2", G: "e2@7 ~@3 e2@2 d#2@6 ~@4 d#2@2", H: "d2@5 ~@19", I: "a1@12 d2@11 ~",
  J: "b1@4 ~ b1 a#1@3 ~@2 a#1", K: "a1@6 ~@4 a1@2 d2@7 ~@3 d2@2", L: "b1@7 ~@3 b1@2 a#1@6 ~@4 a#1@2",
  M: "a1@3 ~@2 a1 d2@3 ~@2 d2", N: "g2 f2", O: "e2 d#2", P: "d2 ~@5", Q: "g2@6 d2@6 g1@5 ~@7", R: "c#2", S: "f#2 b1",
  T: "e2 a1", U: "d2", V: "e2 a#1", W: "a1 d2", X: "g1@7 ~@3 g1@2 a#1@7 ~@3 a#1@2", Y: "g1@3 ~@2 g1 a#1@3 ~@2 a#1",
  Z: "g2@8 ~@2 g2@2 f2@9 ~ f2@2", AA: "d2@11 ~", AB: "d#2 d2", AC: "a1@7 ~@11 d2@6", AD: "g1 ~@3", AE: "b2 a#2",
  AF: "~ c3", AG: "b2 ~", AH: "e2 ~", AI: "~ d2 g1 ~", AJ: "f#2 b2", AK: "e2 a2", AL: "c#2@23 ~", AM: "f#2@11 ~ b2@12",
  AN: "[d2@12 c#2@14 ~ c2@5 ~ e2@3 c2@2 d#2@6 ~ d#2@5 ~ d2@5 d2@5 ~ g1@5 ~ a1@4]/3",
  AO: "b1 ~ c2@4 ~@2 c2@5 ~ d#2@4 ~@2 d#2@4",
  AP: "[~@2 d2@5 ~ d2@6 g2@5 ~ g2@6 ~ c2@5 c2@5 ~ a#1@5 ~ a#1@6 ~ a1@5 a1@6 g#1@5 ~ g#1@4]/3",
  AQ: "[~@3 c2@11 d2@12 e2@12 a2@12 d2@6 e2@4 f2@2 g2@6 g1@4]/3", AR: "~@2 c2@3 ~@3 g1@3 ~ c2@4 ~@8",
})).s("gm_acoustic_bass").gain(0.3)

// bass · acoustic bass · "ACOU BASS" · soft notes
const bass_soft = note("<~@37 A B C D E F G ~@18>".pickRestart({
  A: "a2 ~", B: "~ a#2", C: "a2 d2", D: "g2 f2", E: "~ d#2", F: "d2@19 ~@5", G: "g2 ~@3",
})).s("gm_acoustic_bass").gain(0.2)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  A B C D C E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AJ AL AM AN AO AP AQ AR AS AT
  AU AR AV AW AX@8 AY@2
>`.pickRestart({
  A: "a3@9 ~ g#3@14, b2", B: "g3@9 ~ f#3@8 d3@6, a2@17 ~@7", C: "g2@9 ~ a#2@14", D: "a2@9 ~ d3@14",
  E: "~@10 f#3@11 ~@3, a2", F: "g3 f3", G: "[e3,c4] [f3,a3]", H: "[d3,b3] ~@5", I: "a2@12 [d3,f#3]@11 ~, g3 ~@2",
  J: "~ g3 ~ g3, b2 a#2", K: "~ g3 ~ f#3, a2 d3", L: "~ g3 ~ g3, b2@12 a#2@11 ~", M: "~@6 g3@6 ~@6 f#3@5 ~, a2 d3",
  N: "~@6 g3@5 ~@7 f3@6, g2@11 ~ f2@12", O: "~@6 e3@5 ~@7 d#3@6, e2@11 ~ d#2@12", P: "d2@5 ~@13 a3@4 ~@2",
  Q: "g3@4 ~@2 d3@2 ~@4 g2@5 ~@7", R: "[c#3,b3]@23 ~", S: "[f#3,a#3] [b2,a3]", T: "e3 [a2,g3], g#3 ~@3", U: "[d3,f#3]",
  V: "[c#3,b3]", W: "f#3@11 ~ [b2,a3]@12, a#3@5 ~@19", X: "[e3,g#3]@11 ~ [a#2,g#3]@11 ~", Y: "[a2,g3]@6 [d3,f#3]@5 ~",
  Z: "g2@11 ~ a#2@11 ~", AA: "a2@15 ~ d3@4 ~@2 d3@2", AB: "g2@11 ~ a#2@12", AC: "a2@7 ~ d3@2 ~ d3", AD: "~ f3, g2",
  AE: "g3@12 a3@11 ~, c3@23 ~", AF: "b3@3 a3@2 g3 a3@2 g3 f#3@3", AG: "[d#3,a3] [d3,g#3]",
  AH: "c4@6 b3@4 a3@2 g3@6 f#3@5 ~", AI: "[g3,b3]@5 ~@19", AJ: "b3 d4 g4 d4 a#3 c#4 g4 c#4",
  AK: "~ e4 g4 e4 [c4,f#4]@3 ~, a3@3 ~@5", AL: "~@3 e4@3 g4@3 e4@3 [c4,f#4]@8 ~@4, a3@3 ~@5",
  AM: "g4 b4 d5 b4 ~ b4 d5 b4, ~@12 f4@5 ~@7", AN: "e4 g4 c5 g4 d#4 g4 c5 g4", AO: "b4@6 a4@3 g4@3 f#4@5 ~ f#4@6",
  AP: "g4@6 d4@5 ~ g3@6 ~@6", AQ: "~ b3@3, c#3, ~ g3@7", AR: "a#3 b3, f#3", AS: "g#3 a3, e3@23 ~",
  AT: "f#3@11 ~ c4@12, d3@11 ~", AU: "~ b3@7, c#3", AV: "[e3,d4] [d#3,c#4]", AW: "[d3,c4] [c#3,b3]",
  AX: "[~@3 c4@3 ~@3 [a3,c4]@5 ~ b3@5 a3@6 ~ d4@5 c4@3 ~ b3@8 g3@6 c3@3 ~ c4@5 ~ a3@2 b3@6 a3@6 d4@6 c4@3 ~ b3@8 g3@6 ~ c4@11 a#3@12 [f3,a3]@12 [d3,g#3]@12 [c3,b3]@12 [d3,c4]@12 [e3,d4]@11 ~ [a3,c#4]@10, ~@49 e3@12 ~@35]/8", // Am F Ddim Cmaj7 D7 E7 A
  AY: "[~ f4@3 e4@2 ~ f4@6 ~@3 g2@2 c2@2 ~@4, ~@12 d4@13 ~ [c4,e4]@10 ~@12]/2", // C
})).s("gm_piano").gain(0.3)

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

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

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

// drums · rim
const rim = s("rim").struct("<~@36 [~ x ~ x ~ x ~ x]!6 ~@20>").gain(0.2)

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

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

// drums · ride
const ride = s("rd").struct(`<
  A@2 B C D E F G H I F C J D K G H I D L E G C M B I D B F N F@2 H I O ~ P Q R S T U H V W X Y Z AA X O AB AC AD AE AF
  AG AH AI AJ AC AK
>`.pickRestart({
  A: "x ~@2 x ~ x ~@6", B: "x ~@2 x ~@2 x ~@2 x ~ x", C: "x ~@2 x ~@2 x ~ x!2 ~ x", D: "x!4",
  E: "x ~@2 x ~@2 x ~ x!2 ~@2", F: "x ~@2 x ~ x!2 ~@2 x ~@2", G: "x ~@2 x ~ x!2 ~@2 x ~ x", H: "x", I: "x!3 ~",
  J: "x ~ x!2 ~@2 x ~@2 x ~ x", K: "x ~ x!2 ~@2 x ~ x!2 ~@2", L: "x ~@2 x ~ x!2 ~ x!2 ~@2",
  M: "x ~ x!2 ~ x!2 ~@2 x ~ x", N: "x ~@2 x ~@2 x ~ x!4", O: "x ~ x!2", P: "x!4 ~ x!3", Q: "x ~ x!5 ~",
  R: "x!2 ~ x!2 ~ x!2", S: "x ~@5 x ~@2 x ~@5 x ~@5 x ~ x", T: "x ~@5 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~ x", U: "x!8",
  V: "x!2 ~@2", W: "~@2 x ~ x ~ x!2", X: "x ~ x!3 ~ x ~", Y: "x ~ x ~ x ~ x!2", Z: "x ~ x!3 ~ x!2", AA: "x!2",
  AB: "~@12 x ~@6 x ~@4", AC: "~@4 x ~ x!2 ~@2 x ~", AD: "~ x ~@2 x ~ x!2 ~@2 x ~", AE: "~@3 x ~@8 x ~ x ~@5 x ~@3",
  AF: "~ x ~ x!2 ~@5 x ~", AG: "x!2 ~@2 x ~@2 x ~@2 x ~", AH: "x!2 ~@2 x ~ x!2 ~@2 x ~", AI: "x ~ x!2 ~ x",
  AJ: "~@4 x ~@2 x ~@2 x ~", AK: "~ x ~@10",
})).gain(0.25)

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

stack(bass, bass_soft, piano, piano_2, kick, kick_soft, rim, snare, crash, ride, ride_soft)

More by Gershwin