Strudelify

Hello Mudduh, Hello Fadduh! (A Letter from Camp)

Allan Sherman

KeyB♭ majorTempo130 bpm
0:00/0:00
// Hello Mudduh, Hello Fadduh! (A Letter from Camp) — Allan Sherman
// 130 bpm, 3/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 41 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(130/3)

// 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.

// chords · piano · Ebsus2 Ebdim Bb
const piano = note(`<
  [~@7 [eb4,f4]]
  [~@4 d5@3 bb4 ~@2 bb4@2 ~ g4 ~@2 g4@3 f4@2 ~ [eb4,a4]@2, ~ f4@2 ~@3]
  [~ c5@2 ~@2 [d4,f4,bb4]@15 ~@4]
  ~@38
>`).s("gm_piano").gain(0.31)

// other · piano · F Bb
const piano_2 = note("<~ [~@2 [f2,f3]@5 ~ c3@3 f3] [~@5 bb1 ~@5 f2@3 ~@4 [bb1,bb2]@2 ~@4, ~@2 bb2@5 ~@5] ~@38>")
  .s("gm_piano").gain(0.31)

// chords · piano
const piano_3 = note("<~@3 A@4 B C D@2 E F G@5 H I J K L M N@2 O@3 P@2 Q R@4 S@2 T U ~>".pickRestart({
  A: "[~@8 d4@3 f4@2 ~@2 f4@2 ~@2 d4@10 ~@6 g4@3 bb4@2 ~ [c4,eb4] ~@2 [c4,eb4,a4]@12 ~@8 g4@2 ~@2 [c4,g4]@2 ~ [c4,eb4,a4]@9 ~@8 a4@2 ~ eb5@2 ~ [f4,eb5]@2, ~@18 g4@10 ~@13 bb4@2 ~@18 [c4,eb4,f4]@5 ~@2 eb4 ~@18 eb4@3 ~@4 bb4 ~]/4", // Cm Adim C5 Adim F7
  B: "~ [f4,bb4,d5]@10 ~@8 d4@2 ~ bb4@2", C: "~ [db4,e4] ~@2 [db4,e4,a4]@12 ~@5 [db4,e4,a4]@3, bb4 ~@11",
  D: "[g4 ~@2 g4 d4 ~@2 [d4,f4]@11 ~@5 f4@3 d5 ~@3 [f4,d5]@3 [a4,c5]@2 ~ c5@3 a4 ~@3 [c4,a4]@3 g4 ~]/2", // Dm Am F
  E: "~ [e4,a4]@3 g4 ~@2 g4@2 ~@3 eb4@10 ~@2, ~@11 f4@11 ~@2", F: "~@4 d4@3 f4 ~@6 g4@8 ~@2",
  G: "[~@6 g4@3 bb4@2 ~ bb4@3 ~ [c4,eb4,a4]@11 ~@5 [c4,eb4,f4]@3 g4@2 ~ [eb4,g4]@2 ~@2 [c4,eb4,f4,a4]@10 ~@7 a4@2 ~ eb5@2 ~ [f4,bb4] ~@3 d5@5 ~@11 f4@3 d5@2 ~ d5@2 ~@2 d4@10 ~@6 [d4,gb4]@4 ~@3 a4@2, ~@38 c4 ~@19 eb4@3 ~@4 eb5@2 ~ [f4,bb4]@10 ~@7 [d4,bb4]@5 ~ d4 ~@2 [gb4,a4]@13 ~@4 c5@2 ~@7]/5", // Adim F7 Eb F7 Bb5 D Bb5 Gm …
  H: "~ g4@10 ~@7 [eb4,eb5]@3 d5 ~@2", I: "d5@3 bb4 ~@2 bb4 ~@2 g4 ~@3 eb4@3 f4 ~@2 eb4@2 ~ c5 ~, ~@12 g4@4 ~@3 a4 ~@4",
  J: "~@2 [d4,f4,c5] ~@2 [d4,f4,bb4]@17 ~@2", K: "~@12 f4@7 db4@2 ~@3",
  L: "~ db5@6 ~ bb4@2 ~@4 c5@6 [eb4,gb4]@2 ~ bb4, ~@7 db4@3 ~@14", M: "~@2 ab4@2 g4@2 ~@2 db4@4 ~@3 f4@7 db4 ~",
  N: "[~@4 db5@6 [db4,bb4]@3 ~@3 c5@6 ~ eb4@2 ~ bb4@2 ~ [ab4,bb4] ~@3 gb4@2 db4@3 ~@2 eb4@2 f4@6, ~@23 gb4 ~@24]/2", // Gb Absus2
  O: "[~ db4@2 ~@4 bb4@6 ~@7 ab4@6 ~ f4 ~ ab4 ~@3 ab4@2 ~@5 eb4@2 ~@2 f4@2 gb4@7 db4@2 ~ ab4 ~@3 [db4,gb4]@7 ab4@4 ~, ~@26 db4@2 ~@4 db4@4 ~@4 db4 ~@31]/3", // Gb5
  P: "[~@2 eb4@6 ~ gb4@6 ~@3 [c4,f4]@23 ~@7, ~@6 eb4@5 ~@5]/2", Q: "~@6 d4@3 f4@2 ~ d4 f4 ~@4 d4@4 ~@2, ~@2 g4",
  R: "[~@8 g4@3 bb4@2 ~ [eb4,bb4]@2 ~@2 [c4,a4]@14 ~@3 [c4,eb4,f4]@3 g4@2 ~ [eb4,g4]@2 ~@2 [c4,a4]@11 ~@5 eb4@3 eb5@2 ~ [f4,bb4] ~@3 [f4,d5]@12 ~@3 f4@4 d5@2 ~ [gb4,d5]@2 ~, ~@14 c4 ~@2 eb4@13 ~@11 c4 ~@2 eb4@10 ~@42, ~@45 g4@7 ~@9 a4@2 ~@4 eb5@2 ~ bb4@18 ~@5 a4 ~@2]/4", // Eb5 F F7 Eb F Bb5 Dm D
  S: "[[gb4,c5]@11 ~@6 d4@3 a4 ~@2 a4@2 ~ g4@11 ~@6 [eb4,eb5]@4 d5, a4@6 ~@10 gb4@4 ~@23 g4 ~@4, ~@8 c5 ~@15]/2", // Gbdim Eb
  T: "~@2 d5@3 bb4 ~@2 bb4@3 g4 ~@3 g4@3 [eb4,f4] ~@3 [eb4,a4]@2, ~@2 f4@7 ~@6 a4 ~@8", // Ebsus2 Ebdim
  U: "~ c5 ~@3 d4 ~@2 [d4,f4,bb4]@16, ~@2 c5 ~@9", // Bb
})).s("gm_piano").gain(0.46)

// chords · piano
const piano_4 = note("<~@3 A@5 B@2 C D@8 E F G@2 H@2 I@4 J@2 K@7 L M ~>".pickRestart({
  A: "[~@15 bb3@2 ~@11 bb2@7 bb3@3 ~@17 f3@12 ~@14 f3@2 ~@5 f3 ~@19 bb2@3 ~@3 [bb2,bb3]@3 ~@3, ~@15 bb1@21 ~@58 bb1@22 ~@4, ~@18 bb3@11 ~@19 c3@17 ~@9 c3@15 ~@31, ~@22 f2@14 ~@5 f2@21 ~@6 f2@21 ~@12 f2@14 ~@5]/5", // Bb
  B: "[~@15 a2@3 ~@3 a2@5 ~@2 a3 ~@5 a2@7 d3@4 ~@3, ~ a1@20 ~@10 a3@8 ~@9, ~@7 e2@14 ~@7 d2@15 ~@5]/2",
  C: "b2@3 ~@16 f3@5, ~@3 c3@8 ~",
  D: "[~@2 bb3@4 ~@2 f2@4 ~@3 c3@6 f2@6 ~@7 bb3 ~@12 bb2@7 bb3@3 ~@16 a3@6 ~@21 f3@9 ~@17 bb3@6 ~@20 d3@4 ~@3 d3@3 ~@4 bb3 ~@12 eb3@10 ~@3, ~ c3@6 ~ f3@18 ~@9 bb1@19 ~@32 f2@21 ~@32 d2@22 ~@6 eb2@23 ~@2, ~@8 bb3@2 ~@2 a3@10 ~@16 bb3@9 ~@20 eb3@14 ~@38 f3@13 ~@37 bb3@9 ~@14, ~@41 f2@14 ~@6 c3@16 ~@16 c3@15 ~@5 bb2@21 ~@12 a2@15 ~@11 bb2@17 ~@3]/8",
  E: "[d2,d3]@10 ~@4 a3@3 ~@7, ~@13 [f2,f3]@9 ~@2", F: "~@2 bb1@6 f2@7 [bb1,bb2]@7 ~@2, ~@2 bb2@5 ~@17",
  G: "[~@19 bb3@2 ~@4 bb2@12 ~ eb2@9 ~, ~@3 bb1@5 ~@4]/2",
  H: "[~@3 eb3@2 ~@4 bb3@3 ~@9 bb3@2 ~@5 bb2@8 ~@4 eb2@8, ~@2 [eb2,bb3]@3 ~@3 [eb2,eb3]@3 ~@5 bb1@19 ~@13]/2", // Eb5 Eb
  I: "[~@6 eb3@2 ~@3 [eb2,bb3]@4 ~@10 bb3@2 ~@11 bb3@3 ~@3 f2@8 ~@11 ab3@3 ~@11 bb3@2 ~@5 [bb2,bb3]@12, ~@5 [eb2,bb3]@3 ~@3 eb3@2 ~@5 bb1@11 ~@2 bb2@10 ~@16 f2@9 ~@5 [bb1,bb2]@9 ~@16]/4", // Eb5 Bb Eb5 Bb
  J: "[~@3 c3@13 ~@2 [f2,f3,a3]@23 ~@7, ~ bb3@7 ~@16]/2", // F
  K: "[~@12 bb3@2 ~@2 bb3@3 f3@4 ~@3 bb3@8 ~@11 eb3@14 a3@2 ~@18 f3@4 ~@2 f3@3 ~@10 f3@6 bb3@7 ~@19 d3@4 ~@3 d3@3 ~@3 bb3@2 ~@11 eb3@10 ~@2, ~@12 bb2@20 ~@7 c3@22 ~@4 f2@21 ~@31 d2@21 ~@5 eb2@23 ~@2, ~@72 c3@14 ~@5 bb2@21 ~@11 a2@16 ~@7 bb3@10 ~@12, ~@150 bb2@17 ~]/7",
  L: "~@3 f2@11 ~ [f2,f3]@4 ~@3 [f2,f3]@2, ~@2 f3@10 ~@3 b3@2 ~@7", M: "~@5 bb1@2 ~@4 f2@7 bb1@6, ~@5 bb2@19",
})).s("gm_piano").gain(0.26)

stack(piano, piano_2, piano_3, piano_4)