Strudelify
KeyC majorTempo70 bpm
0:00/0:00
// Imagine — John Lennonarr. Brett Lair
// 70 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 16, 4/4 at bar 17, 2/4 at bar 29, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/5823735; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 58 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(70/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.

// other · trombone · "Solo Trombone"
const trombone = note(`<
  ~@4 A@2 B@2 C@2 D E F G H@3 I J K L@2 M N O P Q R S T U V@2 W U X Y A@2 B@2 C@2 D E F G Z@3 AA AB@2 AC AA AD AE@2
>`.pickRestart({
  A: "[~@3 g3 g3@2 g3@2 g3@4 b3@2 b3 a3@3 ~@14]/2", B: "[~@3 g3 g3@2 g3@2 g3@4 b3@2 a3@4 ~@14]/2",
  C: "[~@4 g3@2 g3@6 b3@2 b3 a3@3 ~@14]/2", D: "~@7 g3 g3@2 g3@2 b3@2 b3@2", E: "a3 ~", F: "~ a3 c4 a3 c4@2 e4!2",
  G: "d4 c4 a3@6 ~@8", H: "[b3@2 b3@6 b3@4 c4@2 d4@10 e4@2 g4@4 e4 d4@9 ~@3 g3 g3@2 g3@2]/3",
  I: "g3@4 b3@2 b3 a3@3 ~@6", J: "~@11 g3 g3@2 g3@2", K: "g3@2 b3 a3@2 ~@3", L: "[~@12 g3@2 g3@6 b3@2 b3 a3@3 ~@6]/2",
  M: "~@15 g3", N: "g3!2 b3!2 a3@4", O: "~@5 a3 c4 a3", P: "c4@4 e4@2 e4@2 d4 c4 a3@6", Q: "~@4 b3 b3@3",
  R: "b3@2 c4 d4@5", S: "e4@2 g4@4 e4 d4@9", T: "c4@4 a3 c4@3 b3@2 c4 b3 a3@2 b3@2", U: "c4 c4@3 ~@4",
  V: "[~@4 a3 c4@2 b3@3 b3 a3@2 a3 e3@10 ~@8]/2", W: "~@4 a3@2 c4@2 b3@2 c4 b3 a3@2 b3@2",
  X: "~@6 a3 c4 d4@2 e4 d4 c4@2 d4@2", Y: "d4 c4@7 ~@8",
  Z: "[b3@2 b3@6 b3@4 c4@2 d4@10 e4@2 g4@4 e4 d4@9 c4@4 a3 c4@3]/3", AA: "b3@2 c4 b3 a3@2 b3@2 c4@2 c4@6",
  AB: "[~@12 a3 c4@2 b3@3 b3 a3@2 a3 e3@10]/2", AC: "~@6 a3 c4", AD: "~@14 a3 c4",
  AE: "[d4@2 e4 d4 c4@2 d4@2 d4 c4@15 ~@8]/2",
})).s("gm_trombone").gain(0.4)

// other · trumpet · "B♭Trumpet 1"
const trumpet = note("<~@26 A B ~ C D E F G H I J K L K L K L K L M N O P Q R S T U V W X@2>".pickRestart({
  A: "c5@2 b4!2", B: "b4 c5 d5@2", C: "c5@4 a5 c6@3 b5@2 c6 b5 a5@2 a5 b5", D: "d6 c6@3 ~@4", E: "a4@3 c5 b4@3 d5",
  F: "c5 b4", G: "a4@3 c5 b4@4", H: "c5 e5", I: "c5@4 b4@2 a5 b5", J: "c6 ~", K: "c5@14 c5 e5", L: "f5@12 f5 e5 c5 ~",
  M: "a4 c5", N: "f4 c5", O: "b4!3 c5", P: "d5 ~", Q: "~@8 c5@4 a5 c6@3", R: "b5@2 c6 b5 a5@2 a5 b5 d6@2 c6@6",
  S: "~@4 a4@3 c5", T: "b4@3 d5 c5@4", U: "b4@4 a4@3 c5", V: "b4 c5", W: "e5 c5", X: "[b4@2 a5 b5 c6@8 ~@4]/2",
})).s("gm_trumpet").gain(0.4)

// other · trumpet · "B♭ Trumpet 2"
const trumpet_2 = note("<~@26 A B ~ C D C E F G H I J K J K J K J K L M N O P Q R S T E U V@2>".pickRestart({
  A: "c5 ~", B: "a4 g4 f4@2", C: "f4@3 a4 g4@3 b4", D: "g4@2 g4!2 g#4@4", E: "g4!2", F: "f4@3 a4 g4@4", G: "g4 b4",
  H: "a4@4 g4@2 c5 d5", I: "g4 ~", J: "g4", K: "a4", L: "f4 a4", M: "d4 a4", N: "~@2 a4 g4", O: "f4 ~",
  P: "~@4 f4@3 a4", Q: "g4@3 b4 g4@2 g4!2", R: "g#4@4 f4@3 a4", S: "g4@3 b4 g4@4", T: "g4@4 f4@3 a4", U: "b4 a4",
  V: "[g4@2 c5 d5 g4@8 ~@4]/2",
})).s("gm_trumpet").gain(0.4)

// other · trumpet · "B♭ Trumpet 2" · soft notes
const trumpet_soft = note("<~@26 [~@2 b4 a4] ~@20 [b4 a4 ~@2] ~@10>").s("gm_trumpet").gain(0.25)

// other · french horn · "Horn in F"
const french_horn = note(`<
  ~@4 A B A B A B A B ~@3 C D@8 ~@2 E F ~ G H I@2 G H G J A B A B A B A B ~@2 K C L M N@2 L M O P@2
>`.pickRestart({
  A: "e4", B: "f4", C: "f4 ~", D: "[~ e4@2 f4@2 e4@2 f4@2 e4@2 f4@2 e4@2 f4]/8", E: "~@2 b4 a4", F: "a4 g4 f4@2",
  G: "a4!2 g4!2", H: "e4!3 g4", I: "[~@4 a3 c4@2 b3@3 b3 a3@2 a3 e3@10 ~@8]/2", J: "e4 ~", K: "b4 a4!2 g4",
  L: "~@2 a4!2", M: "g4!2 e4!2", N: "[e4@4 g4@4 ~@4 a3 c4@2 b3@3 b3 a3@2 a3 e3@10]/2", O: "e4 g4 a4!2",
  P: "[g4!2 e4@4 ~@2]/2",
})).s("gm_french_horn").gain(0.34)

// bass · tuba
const bass = note(`<
  A B A B A B A B A B A B@2 C D E F@8 G@3 H ~ I J K L M N I O A B A B A B A B@2 C P E Q R S T S U V W@2
>`.pickRestart({
  A: "c2", B: "f2", C: "d3", D: "g2", E: "d3 ~", F: "[~ c2@2 f2@2 c2@2 f2@2 c2@2 f2@2 c2@2 f2]/8",
  G: "[~@2 f2@4 d3@4 g2!2]/3", H: "g2!2 d3@2", I: "f2 g2", J: "c3 b2", K: "a2 g2", L: "c2 b2", M: "a2 b2", N: "c3 g2",
  O: "c3 ~", P: "g2!4", Q: "~ f2", R: "g2 c3", S: "b2 a2", T: "g2 c2", U: "b2 c3", V: "g2 f2", W: "[g2 c3@2 ~]/2",
})).s("gm_tuba").gain(0.3)

// chords · piano
const piano = note(`<
  A B A B A B A B A B A B C D E@8 F@3 G H@2 ~ I J I J I J I K A B A B A B A B C D L M N O P O P O P Q@2
>`.pickRestart({
  A: "~@5 c3 ~ c3, [e3,g3]!3 [e3,b3], ~ c3@2 c3@2 ~@3", B: "~@10 c3@2 a3 a#3 b3 ~, [f3,a3]!3 ~, ~ c3@2 c3@2 ~@3",
  C: "~@3 c3 ~@3 c3, [f3,a3]!2 [e3,a3]!2, ~ c3@2 ~@2 c3@2 ~", // F A5
  D: "~@3 a2 ~@3 a2, [d3,a3]!2 [c3,a3]!2, ~ a2@2 ~@2 a2@2 ~", // D5 F
  E: "[~@10 d3@2 ~@4 [g3,d4,f4]@24 ~@10 c3@2 ~@2 c3@2 ~@10 c3@2 a3 a#3 b3 ~@11 c3@2 ~@2 c3@2 ~@10 c3@2 a3 a#3 b3 ~@11 c3@2 ~@2 c3@2 ~@6 c3@2, [g3,b3]!3 c4@7 ~@22, ~ d3@2 d3@2 ~ g3@2 ~@13 c3@2 c3@2 ~@4 c3@2 c3@2 ~@4 c3@2 c3@2 ~@4 c3@2 c3@2 ~@4 c3@2 c3@2 ~@4 c3@2 ~, ~@7 d3@13 [e3,g3]@2 [e3,g3]@2 [e3,g3]@2 [e3,b3]@2 [f3,a3]@2 [f3,a3]@2 [f3,a3]@2 ~@2 [e3,g3]@2 [e3,g3]@2 [e3,g3]@2 [e3,b3]@2 [f3,a3]@2 [f3,a3]@2 [f3,a3]@2 ~@2 [e3,g3]@2 [e3,g3]@2 [e3,g3]@2 [e3,b3]@2 [f3,a3]@2 [f3,a3]@2]/8", // G7 G Em E5 F Em E5 F …
  F: "[~@2 c3@2 a3 a#3 b3 ~@11 c3@2 ~@2 c3@2 ~@10 c3@2 a3 a#3 b3 ~@7 c3@2, [f3,a3] ~ [e3,g3]!2 [e3,g3] [e3,b3] [f3,a3]!2 [f3,a3] ~ [f3,a3]!2, ~@5 c3@2 c3@2 ~@4 c3@2 c3@2 ~@4 c3@2 ~]/3", // F Em E5 F
  G: "~@3 c3 ~@3 a2, [e3,a3]!2 [d3,a3]!2, ~ c3@2 ~@2 a2@2 ~", // A5 D5
  H: "[~@3 a2 ~@5 d3 [g3,c4] d3 [g3,d4,f4]@4, [c3,a3]!2 [g3,b3]!2 [g3,b3] ~@3, ~ a2@2 ~@2 d3@2 d3@2 ~@7]/2", // C5 G7 F G
  I: "~@3 c3 ~@3 b2, [f3,a3]@2 [f3,a3]@2 ~ b2@2 ~, ~ c3@2 ~ [d3,g3]@2 [d3,g3]@2", // F G5
  J: "~@3 g2 ~@3 b2, [c3,e3]!2 e3@2, ~ g2@2 ~ b2@3 ~, ~@5 g2@3, ~@3 [d3,g3]", K: "~ g3 g2 g3 a2 g3 b2 g3, [c3,e3] ~@3",
  L: "~@5 d3 [g3,c4] d3, [g3,b3]!3 ~, ~ d3@2 d3@2 ~@3", M: "[g3,d4,f4] ~", N: "~@7 c3, ~@2 [f3,a3]!2, ~@5 c3@2 ~",
  O: "~@3 b2 ~@3 g2, [d3,g3]@2 [d3,g3]@2 ~ g2@2 ~, ~ b2@2 ~ [c3,e3]@2 [c3,e3]@2", // G5 C
  P: "~@3 b2 ~@3 c3, e3@2 [f3,a3]!2, b2@3 ~@2 c3@2 ~, ~ g2@3 ~@4, ~ [d3,g3] ~@2", // F G5
  Q: "[~@6 b2@2 ~ g3@15 ~@8, [d3,g3]!2 ~@6, ~ b2@2 ~ [c3,e3]@8 ~@4]/2", // G5 C
})).s("gm_piano").gain(0.3)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@23 A B C D E ~@16 F G@2 H ~@10>".pickRestart({
  A: "~ x", B: "x ~@2 x!2 ~ x ~ x ~@7", C: "x!2 ~@2 x ~@3", D: "x!2 ~@4 x ~", E: "~ x ~@2", F: "x ~@7 x ~@2 x!2 ~ x ~",
  G: "x ~@3 x!2 ~@2", H: "~ x ~ x",
})).gain(0.3)

// drums · snare
const snare = s("sd").struct("<~@12 A@3 ~ B A@7 B A C ~@2 A@6 C ~ A@7 C A@2 ~@2 B A@6 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@3 x", C: "~ x ~@2",
})).gain(0.3)

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

// drums · open hat
const open_hat = s("oh").struct("<~@26 [~@3 x] [x!2 ~@2] ~@19 [~ x!3] ~@10>").gain(0.25)

// drums · crash
const crash = s("cr").struct("<~@24 A@2 ~@3 B C ~ C ~@2 B@2 ~@8 B@2 ~@2 A ~ D ~ D ~ A@2 ~>".pickRestart({
  A: "~ x", B: "x", C: "~@3 x", D: "~ x ~@2",
})).gain(0.4)

stack(
  trombone, trumpet, trumpet_2, trumpet_soft, french_horn, bass, piano, kick, kick_soft, snare, hihat, open_hat, crash
)