Strudelify

It Ain't Necessarily So

Gershwin

KeyG minorTempo84 bpm
0:00/0:00
// It Ain't Necessarily So — Gershwin
// 84 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 2/4 at bar 26, 4/4 at bar 31) are rendered on a constant 4/4 grid of one bar per cycle
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 59 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(84/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@2 B@2 C@2 D E C@2 F G H I@2 J@2 K L M N@2 O@3 P Q@8 R@5 S@2 T U@6 V@7 W@3>".pickRestart({
  A: "[~@13 c2@13 ~@6]/2", B: "[~@23 d2@19 ~@6]/2", C: "[g2@47 ~]/2", D: "g2@47 ~", E: "g1@47 ~", F: "~ d2",
  G: "g1@11 ~", H: "g2 d2", I: "[g1@31 ~]/2", J: "[g1@23 ~]/2", K: "g1@23 f1@25", L: "e1@23 eb1@25",
  M: "db1@23 ~ b1@16 d2@8", N: "[g1@62 ~ eb2@11 f2@11 gb2@11]/2",
  O: "[g2@11 ab2@11 ~ bb2@11 b2@11 c3@11 d2@11 e2@11 ~ f2@11 gb2@11 g2@22 db2@3 bb1@2 ~@4 g1@12]/3",
  P: "~@2 a1@7 gb1@9 d1@30",
  Q: "[~@22 g1@23 c2@24 g1@24 c2@23 ~ g1@24 ~ c2@23 g1@23 ~ g2@25 c2@23 db2@24 ~@24 db2@23 ~ a1@23 ~ d2@24 ~@27]/8",
  R: "[~@21 eb2@41 ~ eb2@5 ~ ab1@32 ~@4 ab1@12 a1@24 ab1@22 ~@2 g1@35 ~@13 c2@24 ~@3]/5",
  S: "[~@21 f2@24 c2@12 f1@12 a1@22 ~@5]/2", T: "~@21 d2@26 ~",
  U: "[d1@34 g1@24 c2@24 g1@24 c2@24 ~ g1@23 c2@24 g1@24 c2@24 g1@24 f2@24 e2@14]/6",
  V: "[~@10 eb2@24 a1@24 d2@24 g1@48 c2@48 b1@47 ~ a1@24 b1@24 e2@24 f2@24 d2@14]/7",
  W: "[~@11 d2@36 g1@38 ~@6 g1@43 ~@10]/3",
})).s("gm_acoustic_bass").gain(0.3)

// bass · acoustic bass · "ACOU BASS" · soft notes
const bass_soft = note("<~@11 A ~@20 B ~ C@2 ~@3 D@2 E@2 ~@16>".pickRestart({
  A: "g2 ~", B: "~@11 c2@12 ~", C: "[~@22 g1@23 g2@24 ~@27]/2", D: "[~@9 g2@13 ~@23 g2@24 ~@27]/2",
  E: "[~@15 a1@8 ~@9]/2",
})).s("gm_acoustic_bass").gain(0.2)

// chords · piano · "A.PIANO 1"
const piano = note("<A@5 B@2 C@4 D E F@3 G@2 H I J K@5 L M@8 N@8 O@8 P@8>".pickRestart({
  A: "[~@32 g3@6 d4@8 db4@8 g3@8 c4@17 ~@8 [c3,e3,bb3]@44 ~@2 g3@6 c4@8 b3@7 ~ g3@8 bb3@26 [d3,gb3]@40 ~@11]/5", // C7 D
  B: "[g4 gb4 f4 e4 eb4 e4 f4 gb4, bb3@47 ~]/2",
  C: "[g4@12 gb4@12 f4@12 e4@11 eb4@11 ~ d4@13 db4@11 c4@10 ~@2 d4@25 eb4@24 e4@24 ~ eb4@23, bb3@47 g3@46 ~@2 g3@96 ~, ~@95 bb3@51 ~@46]/4",
  D: "~ g3@11 db4@11 ~ c4@24, d4@12 ~@11 gb3@24 ~, ~ bb3@23 ~@24", E: "~ d4@2 e4, g3@47 ~",
  F: "[[g3,db4]@23 [gb3,c4]@23 ~@2 d4@12 eb4@12 e4@12 eb4@10 ~ d4@12 eb4@12 e4@13 eb4@11 ~, ~@47 g3@95 ~@2]/3", // Gdim Gbdim
  G: "[d4@12 eb4@12 e4@12 eb4@12 d4@12 eb4@11 ~ e4@12 eb4@12, g3]/2", H: "g3 f3, [bb3,d4]",
  I: "[e3,d4]@23 [eb3,db4]@24 ~", J: "[db3,b3]@24 [b2,a3]@13 ~@3 [d3,gb3]@8",
  K: "[g3@8 bb3@7 ~ g3@7 ~ f3@9 ~ d3@10 ~ f3@17 ~ [g3,eb4]@8 [ab3,f4]@14 [a3,gb4]@8 ~ [bb3,g4]@11 ~@2 [ab3,c4]@12 [bb3,db4]@11 [b3,d4]@11 c4@10 ~ [d2,d3]@11 [e2,e3]@11 ~ [f2,f3]@11 [gb2,gb3]@11 [g2,g3]@22 db3@3 bb2@5 ~ g2@12, ~@47 eb4@2 ~@31]/5", // Cm Db D Eb Ab Bbm Bm D …
  L: "~@2 a2@7 gb2@7 ~@2 d2@30",
  M: "[~@33 g3@13 ~@11 g3@12 ~@12 g3@11 ~@13 g3@12 ~@12 g3@12 ~@12 g3@11 ~@13 g3@12 ~@12 g3@12 ~@12 bb3@11 ~@13 b3@12 ~@12 bb3@11 ~@13 b3@12 ~@12 e3@12 ~@13 gb3@11 ~@12 d3@12 g3@3, ~@21 g2@24 ~ c3@23 g2@23 ~ c3@23 ~ g2@24 c3@23 ~ g2@24 g2@24 ~ c3@23 db3@23 ~ c3@23 db3@25 a2@24 d3@23 ~@2 g2@18 ~@8]/8",
  N: "[~@9 bb3@12 ~@12 eb4@12 ~@12 eb4@12 ab3@11 ~ eb3@12 ab3@11 ~ eb3@12 a3@12 a2@12 ab3@12 ab2@12 g2@12 d3@12 e3@12 g3@12 c3@12 g3@12 bb3@12 c3@11 ~ f3@8 e3@9 d3@7 c3@8 d3@8 e3@7 ~@13 g3@12 ~@12 g3@12 [d3,gb3]@12 ~ d3@14, ~@22 eb3@23 eb3@24 ~@240 a2@24 a2@24 ~@27]/8", // D
  O: "[d2@17 d3@16 ~@13 [g3,bb3]@11 ~@13 [g3,bb3]@12 ~@13 g3@11 ~@13 g3@11 ~@12 [g3,bb3]@12 ~@12 [g3,bb3]@12 ~@12 g3@12 ~@12 [g3,bb3]@12 ~@12 g3@12 ~@12 f3@12 ~@13 e3@11 eb2@12 eb3@12 ~@12 e3@12 ~@12 gb3@12 g3@9 gb3@5, ~@34 g2@23 ~ c3@24 g2@24 c3@23 ~ g2@24 c3@25 ~@23 c3@24 ~@96 a2@25 ~@37, ~@94 bb3@12 ~@12 bb3@11 ~@49 g2@24 ~@24 g2@24 f2@24 e2@24 ~@48 d3@24 ~@14]/8", // Gm
  P: "[~@2 f3@8 e3@8 eb3@8 d3@8 g3@24 a3@24 ~@8 gb3@8 g3@7 ~ a3@8 g3@8 gb3@8 [a2,g3]@24 [b2,a3]@24 [e3,b3]@24 [f3,a3]@24 g3@8 a3@8 b3@8 ~ d3@9 ~ [d3,c4]@12 ~ [d3,c4]@12 ~ [g2,d3,g3]@43 ~ g2@43 ~@10, ~@34 c3@48 b2@42 ~@102 d3@24 c4@9 ~@71 g1@43 ~@11]/8", // A7 B7 E5 F D7 G5
})).s("gm_piano").gain(0.25)

// chords · piano · "A.PIANO 1"
const piano_2 = note("<A@5 B C D E F G H I J K L M@2 N@2 O P Q@2 R@2 S@3 T@2 U@7 V@6 W@5 X@8 Y@2>".pickRestart({
  A: "[~@32 g5@6 d6@8 db6@8 g5@8 c6@25 [d4,gb4]@43 ~@3 g5@6 c6@8 b5@7 ~ g5@8 bb5@26 [c4,f4]@45 g5@6]/5", // D F5
  B: "d6@8 db6@7 ~ g5@7 c6@8 b5@8 ~ g5@8", C: "bb5@13 ~ g5@2", D: "~ d6@8 db6@7 g5@7 ~ c6@8 b5@8 g5@8",
  E: "bb5@34 ~@7 g5@6 ~", F: "d6@8 db6@8 g5@7 ~ bb5@8 g5@8 bb5@7 ~", G: "g5@8 bb5@7 ~ g5@8 bb5@8 g5@8 bb5@7 ~",
  H: "g5@8 bb5@8 g5@8 f5@7 ~ d5@7 ~ f5@7 ~", I: "~ [a4,bb4]@2 [g4,bb4], g5",
  J: "[f4,a4,c5]@23 ~@19 g4@6, ~@23 [ab4,d5]@25", K: "d5@8 db5@8 g4@7 ~ c5@8 b4@8 g4@8", L: "bb4@36 ~@5 g4@6 ~",
  M: "[d5@8 ~ db5@7 g4@8 c5@8 b4@7 ~ g4@7 bb4@35 ~@8 g4@6]/2",
  N: "[d5@8 db5@8 g4@8 bb4@8 g4@8 bb4@7 g4@9 bb4@8 g4@8 bb4@8 g4@8 bb4@7 ~, ~@72 f4@17 ~@7]/2",
  O: "g4 bb4 g4 f4 d4 f4, f4@17 ~@23 c4@5 ~@3", P: "[bb3,d4,g4]@11 ~",
  Q: "[~@15 [db5,gb5]@8 [db5,eb5]@11 ~@3 [db5,gb5]@9 [db5,eb5]@10 ~@3 eb5@3 ~@3 eb5@2 ~@4 eb5@2 f5@3 eb5@3 ~@3 eb5@2 ~@3 eb5@2 ~@4 eb5@2 ~]/2", // Gb5 Dbsus2 Gb5 Dbsus2
  R: "[f5@3 eb5 ~@4 d5@2 ~ d4@3 d5@2 ~ d4@2 g4@6 d5@3 ~@3 d5@2 d4@3 d5@3 d4@3 d5@3 ~@2 d5@3 ~@3 [g4,db5]@3 bb4@5 ~ g4@9 ~@5 db4@2 bb3@5 ~ g3@12, ~@19 d5@3 ~@9 ab4@9 ~@2 a4@8 ~@3 bb4@2 ~@41]/2", // Gdim
  S: "[~@3 a4@7 gb4@8 d4@41 ~@4 d4@6 d5@8 ~ db5@7 g4@8 c5@8 ~ b4@7 ~ g4@8 ~@12 [d4,f4]@12 ~@2, ~@93 e4@24 ~ bb4@25 ~]/3", // Dm
  T: "[~@15 g4@7 d5@8 db5@7 g4@8 c5@8 b4@6 ~@2 g4@8 ~@12 [d4,f4]@13 ~@2, ~@9 [c4,e4]@12 ~@24 e4@23 ~ bb4@25 ~@2]/2", // Dm C
  U: "[~@15 g4@6 ~ d5@8 db5@7 ~ g4@7 bb4@8 ~ g4@8 bb4@7 g4@8 ~ bb4@7 g4@8 bb4@7 ~ g4@8 ~ bb4@7 g4@8 bb4@7 ~ g4@8 f4@8 d4@8 f4@8 ~ d4@35 g5@12 f5@8 eb5@8 db5@8 c5@7 ~ bb4@8 ab4@8 g4@8 f4@7 ~ g4@7 ~ [f4,ab4]@8 [g4,bb4]@8 [ab4,c5]@7 ~@17 d5@6 ~@2 d5@3, ~@10 [d4,e4]@11 ~ e4@20 ~@3 f4@20 ~@4 e4@20 ~@4 f4@20 ~@4 db4@24 c4@24 [bb3,g4]@36 ~@12 g4@24 f4@24 eb4@23 ~@25 d5@12 ~@15, ~@317 [e4,g4]@14 ~@5]/7", // Fm Gm Ab Dsus2 Eb Em
  V: "[~@15 d5@7 [e4,g4,d5]@35 [f4,d5]@11 ~ c5@9 bb4@6 ~ a4@8 [e4,g4]@8 [d4,f4]@8 [c4,e4]@8 d4@8 c4@7 ~ d4@8 e4@8 f4@6 ~@2 g4@8 a4@11 ~@7 a4@6 ~@19 a4@6 [c4,f4,bb4]@42 ~ d4@17 [bb4,d5]@8 db5@6, ~@9 [d4,gb4]@13 ~@47 e4@24 ~@24 a3@44 ~@15 [d4,e4]@13 a4@19 ~@66 g4@14, ~@201 db4@13 ~@74, ~@202 eb4@13 ~@73]/6", // Em7 Dm Em Dm C Fsus4 Bb D …
  W: "[~@3 g4@7 c5@8 b4@7 ~@2 g4@7 ~@12 [d4,f4]@13 ~@17 g4@7 [g4,bb4,d5]@8 db5@7 g4@8 c5@8 b4@6 ~@2 g4@8 ~@11 [d4,f4]@12 ~@19 g4@6 d5@8 db5@8 g4@7 ~ [bb4,g5]@7 ~ g4@7 ~ [bb4,g5]@8 g4@8 [bb4,g5]@6, ~@10 e4@24 bb4@32 ~@64 bb4@48 g5@23 ~@39, ~@59 [c4,e4]@24 ~@23 e4@23 ~@25 [c4,e4]@25 ~@61]/5", // Dm Gm Dm Eb C
  X: "[~@2 g4@8 [bb4,g5]@7 ~@9 [bb4,g5]@7 ~ g4@8 bb4@8 g4@8 f4@7 ~ d4@8 f4@7 ~ [bb3,d4,g4]@48 a4@8 bb4@8 c5@8 a4@8 bb4@8 ~ c5@7 ~@8 d4@8 e4@8 gb4@8 e4@8 d4@8 e4@8 gb4@8 g4@7 ~ ab4@8 b4@8 a4@7 ~ g4@8 a4@8 bb4@8 b4@8 d5@8 c5@7 ~ b4@8 c5@7 ~ d5@7 ~@2 [g4,c5,e5]@9 ~ [gb4,b4,e5]@11 ~@2 [f4,bb4,e5]@12 ~@2, ~@18 g4@15 ~ db4@24 c4@23 ~@49 eb4@24 eb4@24 d5@41 ~@7 c4@23 ~ eb4@23 ~ d4@22 ~@2 eb4@23 ~ g4@23 ~@39]/8", // Eb Gm C Esus2 Bb
  Y: "[[g4,b4,e5]@43 g3@42 ~@11]/2", // Em
})).s("gm_piano").gain(0.3)

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

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

// drums · rim
const rim = s("rim").struct("<~@13 A B@7 ~@6 C D@2 E F E@3 ~@24>".pickRestart({
  A: "~ x ~@2", B: "~ x ~ x", C: "~@11 x ~@4", D: "~@9 x ~@24 x ~@13", E: "~@3 x ~@7 x ~@4", F: "~@10 x ~@22 x ~@14",
})).gain(0.25)

// drums · snare
const snare = s("sd").struct("<~@22 A B C ~ D ~@8 E F@6 G H I@4 ~ J K ~@2 L I@2 M ~@2>".pickRestart({
  A: "~@20 x ~@10 x ~@10 x ~@5", B: "~@6 x ~@10 x ~@10 x ~@10 x ~@8", C: "~ x ~@2 x ~ x ~@7 x ~@10 x ~@10 x ~@10 x",
  D: "x!2 ~@22", E: "~@11 x ~@4", F: "~@3 x ~@7 x ~@4", G: "~@3 x ~@12", H: "~@23 x", I: "~@11 x ~@11 x",
  J: "~@9 x ~@5 x ~@7 x", K: "~@11 x ~@12", L: "~@5 x ~@18", M: "~@21 x ~@12 x ~@13",
})).gain(0.15)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@23 A B ~@14 C ~ C D E ~ F ~@2 G H ~@3 I ~@5>".pickRestart({
  A: "~ x ~@10", B: "~@23 x", C: "~@5 x ~@42", D: "~@17 x ~@6", E: "~@7 x ~@4", F: "~@3 x ~@4", G: "~@11 x ~@11 x",
  H: "~@13 x ~@10", I: "~@15 x ~@7 x",
})).gain(0.05)

// drums · hihat
const hihat = s("hh").struct(`<
  ~
  [~ x ~@5 x ~@5 x ~@10]
  [~@4 x ~@13 x ~@12 x ~@11 x ~@4]
  [~@7 x ~@11 x ~@12 x ~@15]
  [~@11 x ~@12 x ~@11 x ~@11]
  ~@52
  [~@7 x ~@6 x ~@9]
  ~
>`).gain(0.3)

// drums · ride
const ride = s("rd").struct(`<
  ~ A ~ B ~ C@3 D C@2 D C E C E C@4 F G H I J K L M N O P O@2 Q R S P T U@2 O@2 R V W X W@2 Y Z AA W@2 AB W@2 AC AD ~
>`.pickRestart({
  A: "~@37 x!2 ~ x ~@7", B: "~@43 x ~ x!2 ~", C: "x!2", D: "x ~@3 x ~@2 x", E: "x", F: "x ~@2 x!2 ~@3",
  G: "x ~@3 x ~@3 x ~@3 x ~@4 x ~@5 x", H: "~@15 x ~@4 x ~@5 x ~@4 x ~@3 x!2 ~@5 x ~@5",
  I: "x ~@4 x ~@5 x ~@5 x ~@5 x ~@4 x ~@4 x ~@5 x ~@5 x ~@2", J: "~ x!2 ~@5 x ~@11 x ~@10 x ~@10 x ~@5",
  K: "~@5 x ~@21 x ~@20", L: "~@2 x!2 ~@5 x ~@8 x ~@29", M: "~@15 x ~@5 x ~@12 x ~@10 x ~@2",
  N: "~@10 x ~@11 x ~@10 x ~@11 x ~@2", O: "~@3 x ~@3 x ~@3 x ~@3 x", P: "~@9 x ~@12 x ~@10 x ~@11 x ~@2",
  Q: "~ x ~@7 x ~@11 x ~@11 x ~@11 x ~@2", R: "~@3 x ~@3 x ~@8", S: "~@10 x ~@10 x ~@11 x ~@12 x ~",
  T: "~@5 x ~@15 x ~@11 x ~@11 x ~@2", U: "~@3 x ~@3 x ~@3 x ~@4", V: "x ~@16 x ~@16 x ~@11 x ~",
  W: "~@5 x ~@5 x ~@5 x ~@5 x", X: "~@10 x ~@23 x ~@12 x", Y: "~@5 x ~@9 x ~ x ~@5 x", Z: "~@5 x ~@3 x ~@5 x ~ x ~@5 x",
  AA: "~@5 x ~@3 x ~@3 x ~@3 x ~@5 x", AB: "~@3 x ~ x ~@11 x ~@5 x", AC: "~@11 x ~@36", AD: "x ~@6 x",
})).gain(0.25)

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

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

More by Gershwin