Strudelify

Nice Work If You Can Get It

Gershwin

KeyG majorTempo120 bpm
0:00/0:00
// Nice Work If You Can Get It — 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 64 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@2 J ~ K L M N O@2 P Q R S T U V W X Y Z E AA AB AC@2 AD AE AF AG AH AI AJ AK AL AM ~ R F AN AO AP AQ
  AR AS AT AU AV AW AX AY AZ BA@2 BB BC
>`.pickRestart({
  A: "d2@23 ~", B: "a1@10 d2@3 ~@11", C: "b2@6 g2@6 e2@5 ~ c2@4 b1@2", D: "~@4 c#2@2 d2@3 ~ g1@3 ~@11", E: "d#2 d2",
  F: "c#2 c2", G: "b1@12 a#1@11 ~", H: "a1", I: "[~@4 d2@43 ~, ~@4 c#2 ~@43]/2", J: "a1@11 ~ a1@5 ~ a#1@3 ~ b1@2",
  K: "a2@11 ~ g#2@11 ~", L: "g#2@10 f#2@13 ~", M: "f2@5 e2@6 ~", N: "~@4 a1@2 b1@3 ~@3 c2@3 ~@3 c#2@3 ~@3",
  O: "[d2@47 ~]/2", P: "a1@11 ~ c2@5 ~ c#2@3 ~ d2 ~", Q: "~@4 b2@2 a2@3 ~@3 g2@3 ~@3 f#2@2 ~@4", R: "e2 d2",
  S: "c2@19 ~@3 c2@2", T: "e2@5 ~@19", U: "~ a1@3", V: "d2@9 ~ d2@2 c2@8 ~@2 c2 ~", W: "e2@4 ~ e1@7", X: "a1 ~@5",
  Y: "d2@17 ~ d2@2 d#2@2 e2@2", Z: "f2@11 ~ e2@12", AA: "c#2@7 ~@5 c2@4 b1@3 ~ a#1@3 ~", AB: "a1 a#1", AC: "b1/2",
  AD: "~@4 e2@17 ~@3", AE: "b2@4 ~@2 g2@5 ~ e2@5 ~ c2@4 b1@2", AF: "~@4 c#2@2 d2@3 ~ g1@2 ~@12", AG: "a2@5 g#2@7",
  AH: "g2@5 f#2@7", AI: "f2@10 e2@13 ~", AJ: "~@4 a2 ~@7 a1@7 ~@5", AK: "g1@10 ~@2 a1@11 ~",
  AL: "b1@8 ~@2 b1 ~ e2@9 ~ e2 ~", AM: "a1@11 ~ g#1@3 ~@3 g#1@4 g1 ~", AN: "e2 ~@7", AO: "a1@19 ~@3 a1 ~", AP: "d2 c2",
  AQ: "b1@11 ~ a1@11 ~", AR: "a1@11 ~ d2@11 ~", AS: "a#1@11 ~ d#2@11 ~", AT: "e2@9 ~ e2@2 d#2@9 ~ d#2@2",
  AU: "d2@9 ~ d2@2 c#2@11 ~", AV: "c2@6 ~@6 f2@4 e2@3 ~ d#2@3 ~", AW: "d2@12 d#2@11 ~", AX: "e2@10 ~ e2",
  AY: "f2@11 ~ g2@12", AZ: "a#1 a1", BA: "[~@6 g2@12 g1@12 g2@12 g1@5 ~]/2", BB: "c2 ~@3", BC: "~@12 c2@5 ~@7",
})).s("gm_acoustic_bass").gain(0.35)

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

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

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

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

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

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

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

// drums · open hat
const open_hat = s("oh").struct("<~ A B ~ C D E A ~@2 A ~ E F G A ~@19 H ~@9 D C A ~ I@2 ~@4 J ~@8>".pickRestart({
  A: "x", B: "~@11 x", C: "x ~@4 x!2 ~@5", D: "x!2", E: "x ~@5 x ~@4 x", F: "x ~@4 x ~@5 x", G: "x ~@4 x ~@6",
  H: "~@3 x", I: "x ~@4 x!2 ~@4 x", J: "~ x",
})).gain(0.3)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@4 A B C ~@5 C ~@32 B ~@18>".pickRestart({
  A: "~@11 x", B: "~@5 x ~@5 x", C: "~@5 x ~@6",
})).gain(0.2)

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

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

// drums · ride · soft notes
const ride_soft = s("rd").struct(`<
  ~@16 A B ~@2 C ~@3 D E ~@2 C@2 ~@2 F B ~ G ~ E H ~@2 F ~@9 I ~@2 J ~@2 C F ~@5
>`.pickRestart({
  A: "x ~@10 x", B: "~@2 x", C: "~@5 x ~@6", D: "~@11 x", E: "~@3 x ~@7 x", F: "~@5 x ~@5 x", G: "~ x ~@2",
  H: "~@2 x!2 ~@7 x", I: "~@3 x", J: "~@5 x ~@2 x ~@3",
})).gain(0.25)

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

More by Gershwin