Strudelify
KeyG majorTempo105 bpm
0:00/0:00
// lazy river — Hoagy CarmichaelSidney Arodin
// 105 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/6344999; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 77 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(105/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/2 spreads a riff over 2 bars.
// A part's distinct bars are riffs (A, B, C...) played in order, A@4 for four bars: edit a riff to change every repeat.

// other · trumpet
const trumpet = note(`<
  A B C D E F G H I J C D K L@2 M A N O P C D E F G H I J C D K L@2 M A N O Q R S T U V W X Y Z AA AB AC AD AE AF AG AH
  AI AJ@2 AK AL AM AN AO AP AQ AR AS AT@2 AU AV AW AX ~ AY AZ ~
>`.pickRestart({
  A: "d5@2 f5 d5@2 a4 c5@2 a4@3 c4", B: "~ f4 e4 d#4", C: "d4@2 f#4 a4@2 d#5 d5@2 c5 d4@2 d#4",
  D: "c5@3 b4@2 a#4 ~@5 g4", E: "b3@4 d4@2 f4@4 a4@2 g4@4 f4@5 e4 ~ g4", F: "e4@3 d#4@2 d4 ~@6",
  G: "e4@2 g4 a#4@2 e5 d5@3 a4@2 g#4", H: "g4@3 a4@2 g4 ~@6", I: "g4 ~ a4 f4@7 c4@2 g4 ~ g4@7 c4 ~ d4",
  J: "f4@3 f4@2 c4 ~@6", K: "b3@2 d4 f4@2 a4 g4@2 f4@3 g4",
  L: "[e4@4 g4@2 e4 ~ d#4 d4@3 ~@10 d5@6 c5@2 a#4@2 a4@2 g#4@8 ~@6]/2", M: "f5@2 f5 e5@2 f5 d5@3 ~@3",
  N: "f4@4 f4@2 e4 ~ f4 f#4@9 ~@6", O: "d5@2 f5 d5@2 a4 c5@2 a4@3 a4", P: "f4@3 ~@5 c4@4",
  Q: "f4@2 g4 d#4@2 d4 c4@2 d4@3 e4", R: "f#4!2 d4 f4", S: "~@2 f#4 ~@2 d4@4 f4@3",
  T: "g4 ~ g4 b4 ~ b4 d5 ~ d5 g4 ~ g4", U: "~@2 e4 ~@2 d#4 g4@3 b4@3", V: "~@5 g4 c4@6", W: "c4@6 ~@2 e4 ~@2 g4",
  X: "c4@3 a3@3 f4@5 e4", Y: "a4@2 g4@2 a4@2 e4@3 a3@3", Z: "d4", AA: "c4", AB: "g4 f4 e4 d4", AC: "b3@6 g4@3 f4@2 e4",
  AD: "g4@3 f4 e4@2", AE: "f4@6 f#4@3 d4@2 e4", AF: "d4 g4 e4 c4", AG: "f4@2 d4 f#4", AH: "d4@2 e4 c4",
  AI: "c5@3 a4@2 f4 d4@2 f4 c4@2 c#4", AJ: "[d4@2 f#4 a4@2 e5 d5@2 c5 c#5@2 d5@3 c5@3 b4 a#4@2 ~@4]/2",
  AK: "b4@2 g4 f4@2 a4 g4@2 f4 a#4@2 b4", AL: "d4 ~ g4 f4 ~ e4 d4@6 ~@4 d4@2 d4@6", AM: "e5@3 e5@3 d5 c5 b4 a#4 c#5 d5",
  AN: "a4@3 g#4 g4@2", AO: "a4 g4 f4 e4", AP: "a4 g4 f4 a4 g4 f#4 a4 g#4 g4 d5@2 e5",
  AQ: "c5@2 a4 e5@2 d#5 d5@2 e5 c5@2 a4", AR: "e5@3 d5 a4 c5@6 c#5", AS: "d5@2 g#4 a4@2 g4 e4@2 d4 a4@2 c#4",
  AT: "[d4@6 ~@2 a4 a4@2 a4@4 g4@3 f4@2 d4 f4@2 d4]/2", AU: "a4@2 a#4 b4@2 c5 e5@2 d5@3 c#5",
  AV: "d5@2 f5 d5@2 a4 c5@2 a4 g4@2 e4", AW: "f4@2 f4 e4@2 f4 f#4@2 d4@3 d4", AX: "f4@2 d5@3 d5 c5@2 d5 g#4@2 f4",
  AY: "f5", AZ: "[a4,a5]",
})).s("gm_trumpet").gain(0.31)

// chords · piano
const piano = note(`<
  ~@2 A@2 B@2 C@2 D E A@2 B@2 F G H I H J A@2 B@2 C@2 D E A@2 B@2 F G H K@3 A@2 B L@5 M@2 B@2 N O H G H D A@2 B@2 C@2 D
  P A@2 B@2 Q R H R S@2 D@2 ~
>`.pickRestart({
  A: "[d2,c4,d4,f#4,a4]", B: "[g2,d4,f4,g4,b4]", C: "[c2,c4,e4,g4,a#4]", D: "[f2,c4,f4,a4]", E: "[f2,c4,d#4,f4,a4]",
  F: "[a#2,d4,f4,g#4,a#4]", G: "[c2,c4,f4,a4] [d2,d4,f#4,a4]", H: "[g2,d4,f4,g4,b4] [c2,c4,e4,g4,a#4]",
  I: "[f2,c4,f4,a4] [d2,d4,f#4,a4]", J: "[f2,c4,f4,a4] [c2,c4,e4,g4,a#4]", K: "[[f2,c4,f4,a4] [d2,d4,f#4,a4]@5]/3",
  L: "[g2,d4,f4,g4,b4]/5", M: "[d2,c4,d4,f#4,a4]/2", N: "[g2,d4,f4,g4,b4] [f2,f4,g#4,b4]",
  O: "[f2,c4,d#4,f4,a4] [d2,c4,d4,f#4,a4]", P: "[a2,c#4,e4,g4,a4]!2 [a2,c#4,e4,g4,a4]@2",
  Q: "[a#2,d4,f4,a#4] [f2,c4,f4,a4]", R: "[f2,c4,f4,a4] [d2,c4,d4,f#4,a4]",
  S: "[[g2,d4,f4,g4,b4] [c2,c4,e4,g4,a#4]@3]/2", // G7 C7
})).s("gm_piano").gain(0.31)

// chords · piano
const piano_2 = note("<A B@8 ~@21 C@2 D E F G F H@8 ~@32>".pickRestart({
  A: "[f2,c4,f4,a4] [d2,c4,d4,f#4,a4]", B: "[f2,c4,f4,a4]/8", C: "[g2,d4,f4,g4,b4]", D: "[a#2,d4,f4,g#4,a#4]!2",
  E: "[c2,c4,f4,a4] [d2,d4,f#4,a4]", F: "[g2,d4,f4,g4,b4] [c2,c4,e4,g4,a#4]", G: "[f2,c4,f4,a4] [d2,d4,f#4,a4]",
  H: "[[f2,c4,d#4,f4,a4]@5 [c2,c4,e4,g4,a#4]@59]/8", // F7 C7
})).s("gm_piano").gain(0.41)

stack(trumpet, piano, piano_2)