Strudelify
KeyG majorTempo120 bpm
0:00/0:00
// Oh! Susanna — Stephan C. Foster Piano
// 120 bpm, 2/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (1/8 at bar 1, 2/4 at bar 2, 3/8 at bar 33, 1/8 at bar 33, ...) are rendered on a constant 2/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/1751001; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 73 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/2)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · piano
const piano = note(`<
  ~@4 A B C D E F@2 G H I J K L M N O P M Q R S T@2 U H V W X L ~@3 A B C D E F@2 G H I J K L M N O P M Q R S T@2 U H V
  W X Y Z AA AB AC AD AE AF AG
>`.pickRestart({
  A: "~@6 [g4,g5] [a4,a5]", B: "[g3,b4,b5] [b3,d4,d5,d6]!2 [b3,d4,d#5,d#6]",
  C: "[g#3,e5,e6]@2 ~ [d5,d6] [b3,d4,e4,c5,c6]@2 [b3,d4,e4,b4,b5]@2, ~ [b3,d4,e4] ~@2", // C#m D Cmaj7 E7
  D: "[a4,a5]@2 e5@2 g5 f#5 e5 f#5, [a3,c#4,e4]@2 [d3,a3,c#4]!2", E: "[g3,b3,g5]@11 ~@5",
  F: "[b3,g4] d4 [b3,g4] d4, [g2,g3] ~", G: "[b3,g4] d4 [a3,g4] c#4, [g2,g3] [e2,e3]",
  H: "~ [a3,d4,f#4]!2 ~, [d2,d3] ~", I: "[b3,d4] g4 [c4,e4] g4, [g2,g3] ~", J: "[b3,d4] g4 [g3,e4] g4, [g2,g3] [c2,c3]",
  K: "[b3,d4] g4 [a3,d4] f#4, [d2,d3]!2", L: "~ [b3,d4,g4]!2 ~, [g2,g3] ~",
  M: "b3 d4 g4 d4 b3 g4 [c4,e4] g4, [g2,g3] ~", N: "b3 d4 g4 d4 b3 d4 g4 d4, [g2,g3] ~",
  O: "b3 d4 b4 d4 a3 c#4 g4 c#4, [g2,g3] [e2,e3]", // G E
  P: "a3 [d4,f#4] [f#4,a4] [e4,g4] [d4,f#4] [c4,e4] [b3,d4] [a3,c4], [d2,d3] ~", // D F#m Em D C Bm Am D
  Q: "[g3,b3] d4 g4 d4 [g3,a#3] e4 g4 e4, [g1,g2] [c#2,c#3]", R: "[g3,b3] d4 g4 d4 [a3,c4] d4 f#4 d4, [d2,d3]!2",
  S: "[g3,b3] d4 g4 d4 [g3,b3]@4, [g1,g2] ~", T: "~ [g3,c4,e4]!3, [c2,c3] ~", U: "~ [b3,d4,g4]!3, [g1,g2] ~",
  V: "~ [b3,d4,g4] [d4,f4,g4] [c4,e4,g4], [g2,g3] ~", W: "~ [b3,d4,g4]!3, [g2,g3] ~",
  X: "[d2,d3] [b3,d4,a4] [d2,d3] [a3,c4,d4,f#4]", Y: "~@2 [b3,d4,g4]@2 [b3,d4,g4]@2 g4 a4, [g2,g3] ~",
  Z: "[g3,b4] [g3,b3,d5] [g3,b3,f4,d5] [g3,c4,e4,e5]", AA: "[g3,d5]@2 ~ b4 [b3,d4,g4]@2 g4 a4, ~ [b3,d4] ~ [b3,d4]",
  AB: "[g3,b4]@2 g5 f#5 e5 d5 c5 b4, ~ [b3,d4]!3", AC: "f#3@2 [c4,d4,f#4]@2 [c4,d4,f#4]@2 g4 a4, a4@11 ~@5",
  AD: "[g3,b4] [b3,d4,d5]!2 [b3,d4,d#5]", AE: "[e3,e5]@2 ~ d5!2 c5 b4 a4, ~ [g#3,b3,d4] [a3,c4] ~",
  AF: "[d3,b3,d4,g4]@2 [d3,g3,b3,g4]@2 g4 f#4 b4 a4, ~@2 [d3,a3,c4]!2", AG: "g3 d3 g2 ~, [b3,g4] ~",
})).s("gm_piano").gain(0.4)

// chords · piano · soft notes
const piano_soft = note("<A B C D E ~@27 A B C D E ~@36>".pickRestart({
  A: "~@6 g4 a4", B: "[g3,b4] [b3,d4,d5]!2 [b3,d4,e5]", C: "[g3,d5]@2 [b3,d4,b4]@2 [b3,d4,g4]@2 ~ a4, ~@3 [b3,d4]",
  D: "[e3,b4] [g3,a3,c#4,b4] [g3,a3,c#4,a4] [g3,a3,c#4,g4]", E: "d3 [f#3,a3,d4]!2 ~, a4@11 ~@5",
})).s("gm_piano").gain(0.2)

stack(piano, piano_soft)