Strudelify
Enola Gay (OMD vs. Sash radio edit) cover art

1994

Enola Gay (OMD vs. Sash radio edit)

OMD

KeyF majorTempo150 bpm
0:00/0:00
// Enola Gay (OMD vs. Sash radio edit) — OMD
// 150 bpm, 3/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 158 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(150/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.

// other · piano · "Honky-tonk Piano"
const piano = note(`<
  ~@16 A B C D@2 E F G H I J ~@21 A B C D@2 E F G H I J ~@53 A B C D@2 E F G H I J ~@35
>`.pickRestart({
  A: "f4@3 f4@2 a4@3 bb4@3 c5@2 bb4@3", B: "a4@3 f4@5 f4@3 a4@2 bb4@3", C: "c5@3 bb4@2 a4@5 ~ d4@2 d4@3",
  D: "[f4@3 g4@2 a4@3 g4@3 f4@2 d4@5 ~ d4@2 a4@3 a4@3 g4@5]/2", E: "f4@5 bb3@3 bb3@3 d4@2 eb4@3",
  F: "f4@3 eb4@2 d4@3 bb3@5 bb3@3", G: "d4@3 eb4@2 f4@3 eb4@3 d4@5", H: "c4@3 c4@2 e4@3 f4@3 g4@2 f4@3",
  I: "e4@3 c4@5 c4@3 g4@2 g4@3", J: "f4@5 e4@5 ~@6",
})).s("gm_piano").gain(0.8)

// chords · music box
const music_box = note(`<
  ~@5 A B C B D E D B F B C ~@10 G D B F B C B D E D B F B C B D E D B F B C ~@10 G D B F B C B D E D B H@2 I J@2 K L M
  N@3 O@2 P Q@2 R S T U@3 D B F B C B D E D B F B C B D V@6 ~@10 W X@2 Y@2 Z AA AB AC AD@2 AE@2 I J@2 K L M N@3 O@2 P
  Q@2 R S T AF@2 AG@3 ~
>`.pickRestart({
  A: "~@5 f4@3 d4@3 f4@2 e4@3", B: "f4@3 d4@2 f4@3 e4@3 f4@2 d4@3", C: "f4@3 e4@2 f4@3 d4@3 g4@2 e4@3",
  D: "f4@3 e4@2 f4@3 d4@3 f4@2 e4@3", E: "f4@3 d4@2 g4@3 e4@3 f4@2 d4@3", F: "g4@3 e4@2 f4@3 d4@3 f4@2 e4@3",
  G: "~@11 f4@2 d4@3",
  H: "[g4@3 e4@2 f4@3 d4@3 [f4,bb4]@2 e4@3 f4@3 d4@2 f4@3 e4@3 f4@2 [d4,f4]@3, ~@5 a4@5 ~@3 a4@16 ~@3]/2", // Bb5 Dm
  I: "[f4,a4]@3 [e4,bb4]@2 [f4,c5]@3 [d4,bb4]@3 g4@2 e4@3, ~@11 a4@5", // F Edim F5 Gm
  J: "[f4@3 d4@2 [d4,f4]@3 e4@3 f4@2 ~@3 f4@3 e4@2 f4@3 d4@3 f4@2 e4@3, a4@5 ~@3 d4@5 d4@11 ~@3 a4@5]/2", // Dm
  K: "f4@3 d4@2 g4@3 e4@3 f4@2 d4@3, g4@5 f4@5 ~ bb4@5", L: "[f4,a4]@3 [e4,f4]@2 ~@3 d4@3 ~@2 e4@3, ~@5 f4@6 f4@5",
  M: "~@3 d4@2 f4@3 [e4,g4]@3 [f4,a4]@2 [d4,g4]@3, f4@5 ~@11", // Em F G5
  N: "[g4@3 e4@2 f4@3 d4@3 [f4,a4]@2 e4@3 f4@3 d4@2 f4@3 e4@3 f4@2 d4@3 f4@3 e4@2 f4@3 d4@3 g4@2 [e4,f4]@3, f4@5 g4@5 ~@3 g4@30 ~@5]/3", // F Fmaj7
  O: "[f4@3 d4@2 [f4,bb4]@3 e4@3 f4@2 d4@3 f4@3 e4@2 f4@3 [d4,f4]@3 [f4,a4]@2 [e4,bb4]@3, a4@5 ~@3 a4@16 ~@8]/2", // Bb5 Dm F Edim
  P: "[f4,c5]@3 [d4,bb4]@2 g4@3 e4@3 f4@2 d4@3, ~@5 a4@5 ~ a4@5", // F5 Gm
  Q: "[[d4,f4]@3 e4@2 f4@3 ~@3 f4@2 e4@3 f4@3 d4@2 f4@3 e4@3 f4@2 d4@3, ~@3 d4@5 d4@11 ~@2 a4@5 ~ g4@5]/2", // Dm
  R: "g4@3 e4@2 f4@3 d4@3 [f4,a4]@2 [e4,f4]@3, f4@5 bb4@5 ~@6", S: "~@3 d4@2 ~@3 e4@3 ~@2 d4@3, f4@5 f4@6 f4@5",
  T: "f4@3 [e4,g4]@2 [f4,a4]@3 [d4,g4]@3 g4@2 e4@3, ~@11 f4@5", // Em F G5
  U: "[f4@3 d4@2 [f4,a4]@3 e4@3 f4@2 d4@3 f4@3 e4@2 f4@3 d4@3 f4@2 e4@3 f4@3 d4@2 g4@3 [e4,f4]@3 f4@2 d4@3, g4@5 ~@3 g4@29 ~@11]/3", // F Fmaj7
  V: "[f4@3 d4@2 g4@3 e4@3 f4@2 d4@3 f4@3 e4@2 f4@3 d4@3 f4@2 e4@3 f4@3 d4@2 f4@3 e4@3 f4@2 d4@3 g4@3 e4@2 f4@3 d4@3 f4@2 e4@3 f4@3 d4@2 f4@3 e4@3 f4@2 d4@3 f4@3 e4@2 f4@3 d4@3 g4@2 e4@3, ~@11 bb3@42 c4@43]/6",
  W: "~@11 f4@2 d4@3, ~@11 a4@5",
  X: "[[f4,bb4]@3 e4@2 f4@3 d4@3 f4@2 e4@3 f4@3 [d4,f4]@2 [f4,a4]@3 [e4,bb4]@3 [f4,c5]@2 [d4,bb4]@3, ~@3 a4@16 ~@13]/2", // Bb5 Dm F Edim F5 Gm
  Y: "[g4@3 e4@2 f4@3 d4@3 [d4,f4]@2 e4@3 f4@3 ~@2 f4@3 e4@3 f4@2 d4@3, a4@5 a4@5 ~@3 d4@6 d4@10 ~@3]/2", // Dm
  Z: "f4@3 e4@2 f4@3 d4@3 g4@2 e4@3, a4@5 g4@5 ~ f4@5", AA: "f4@3 d4@2 [f4,a4]@3 [e4,f4]@3 ~@2 d4@3, bb4@5 ~@6 f4@5",
  AB: "~@3 e4@2 ~@3 d4@3 f4@2 [e4,g4]@3, f4@5 f4@5 ~@6", AC: "[f4,a4]@3 [d4,g4]@2 g4@3 e4@3 f4@2 d4@3, ~@5 f4@5 ~ g4@5",
  AD: "[[f4,a4]@3 e4@2 f4@3 d4@3 f4@2 e4@3 f4@3 d4@2 f4@3 e4@3 f4@2 d4@3, ~@3 g4@29]/2", // F
  AE: "[g4@3 [e4,f4]@2 f4@3 d4@3 [f4,bb4]@2 e4@3 f4@3 d4@2 f4@3 e4@3 f4@2 [d4,f4]@3, ~@5 a4@5 ~@3 a4@16 ~@3]/2", // Fmaj7 Bb5 Dm
  AF: "[f4@3 d4@2 [f4,a4]@3 e4@3 f4@2 d4@3 f4@3 e4@2 c5@5 ~ bb4@5, g4@5 ~@3 g4@13 ~@11]/2", AG: "[a4@5 g4@5 ~ f4@37]/3",
})).s("gm_music_box").gain(0.69)

// other · synth brass 2
const synth_brass_2 = note("<~@5 A B@2 C@2 D E@2 F G@2 ~@142>".pickRestart({
  A: "~@5 f3@3 f3@3 f3@2 f3@3", B: "f3@3 f3@2 f3@3 f3@3 f3@2 f3@3", C: "d3@3 d3@2 d3@3 d3@3 d3@2 d3@3",
  D: "d3@3 d3@2 d3@3 d3@3 bb2@2 bb2@3", E: "bb2@3 bb2@2 bb2@3 bb2@3 bb2@2 bb2@3", F: "bb2@3 bb2@2 c3@3 c3@3 c3@2 c3@3",
  G: "c3@3 c3@2 c3@3 c3@3 c3@2 c3@3",
})).s("gm_synth_brass_2").gain(0.8)

// bass · fretless bass
const bass = note(`<
  ~@16 A B C D E F G H I J K L A M N D O P Q R I S T L E U V H O W X R A B C D E F G H I J K L A M N D O P Q R I S T L E
  U V H O W X R A B C D E F G H I J K L A M N D O P Q R I Y ~@10 A B C D E F G H I J K L A M N D O P Q R I S T L E U V H
  O W X R A B C D E F G H I Z AA AB AC ~
>`.pickRestart({
  A: "f2@3 f3@2 f3@3 f2@3 f3@2 f2@3", B: "f3@3 f3@2 f2@3 f3@3 f3@2 f2@3", C: "f3@3 f2@2 f3@3 f3@3 d2@2 d3@3",
  D: "d3@3 d2@2 d3@3 d2@3 d3@2 d3@3", E: "d2@3 d3@2 d3@3 d2@3 d3@2 d2@3", F: "d3@3 d3@2 bb2@3 bb3@3 bb3@2 bb2@3",
  G: "bb3@3 bb2@2 bb3@3 bb3@3 bb2@2 bb3@3", H: "bb3@3 bb2@2 bb3@3 bb2@3 bb3@2 bb3@3",
  I: "c3@3 c4@2 c4@3 c3@3 c4@2 c3@3", J: "c4@3 c4@2 c3@3 c4@3 c4@2 c3@3", K: "c4@3 c3@2 c4@3 c4@3 f2@2 f3@3",
  L: "f3@3 f2@2 f3@3 f2@3 f3@2 f3@3", M: "f3@3 f3@2 d2@3 d3@3 d3@2 d2@3", N: "d3@3 d2@2 d3@3 d3@3 d2@2 d3@3",
  O: "bb2@3 bb3@2 bb3@3 bb2@3 bb3@2 bb2@3", P: "bb3@3 bb3@2 bb2@3 bb3@3 bb3@2 bb2@3",
  Q: "bb3@3 bb2@2 bb3@3 bb3@3 c3@2 c4@3", R: "c4@3 c3@2 c4@3 c3@3 c4@2 c4@3", S: "c4@3 c4@2 f2@3 f3@3 f3@2 f2@3",
  T: "f3@3 f2@2 f3@3 f3@3 f2@2 f3@3", U: "d3@3 d3@2 d2@3 d3@3 d3@2 d2@3", V: "d3@3 d2@2 d3@3 d3@3 bb2@2 bb3@3",
  W: "bb3@3 bb3@2 c3@3 c4@3 c4@2 c3@3", X: "c4@3 c3@2 c4@3 c4@3 c3@2 c4@3", Y: "c4@3 c4@3 ~@10",
  Z: "c4@3 c4@2 c3@3 c4@3 bb2@2 bb3@3", AA: "a2@3 a3@2 g2@3 g3@3 f2@2 f2@3", AB: "f2@3 ~@2 f2@3 ~@3 f2@3 ~@2",
  AC: "f2@3 ~@2 f2@3 f2@3 ~@5",
})).s("gm_fretless_bass").gain(0.8)

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

// drums · rim
const rim = s("rim").struct(`<
  ~@26 A ~@10 B ~@9 C ~@10 A ~@9 D B ~@9 D ~@10 A ~@9 D B ~@9 E ~@10 A ~@10 B ~@9 D ~@14
>`.pickRestart({
  A: "~ x", B: "~@3 x ~@12", C: "~@8 x ~@4 x ~@2", D: "~@13 x ~@2", E: "~@11 x ~@4",
})).gain(0.8)

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

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  A@2 B A@2 C D B D B D B D B D E A F C G H I J K A F L M L N O M L N O M L P O M L N O M L N O ~ A F C G H I J K A F L
  M L N O M L N O M Q P O M L N O M L N O P L N O M L N O M L N L M L N O M L N O M Q R S T U V S T U V S W A F C G H I
  J K A F L M L N O M L N O M L P O M L N O M L N O P L N O M L N O M L N@2 ~@3
>`.pickRestart({
  A: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2", B: "x ~@2 x ~@4 x ~@2 x ~ x ~@2", C: "~@3 x ~@4 x ~@2 x ~ x ~@2",
  D: "~@3 x ~ x ~@2 x ~@4 x ~@2", E: "x ~@2 x ~@12", F: "x ~@2 x!3 ~@2 x ~@2 x ~ x ~@2",
  G: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~ x", H: "x ~@2 x ~ x ~@2 x ~@4 x ~@2", I: "~@3 x ~ x ~@2 x ~@2 x ~ x ~@2",
  J: "x ~@2 x ~ x ~@2 x!2 ~ x ~ x ~@2", K: "x ~@2 x ~@4 x ~@4 x ~@2", L: "~@3 x ~@9 x ~@2", M: "~@8 x ~@4 x ~@2",
  N: "~@3 x ~@4 x ~@7", O: "~@3 x ~@4 x ~@4 x ~@2", P: "~ x", Q: "~@3 x ~@12", R: "~@5 x ~@2 x ~@2 x ~ x ~@2",
  S: "x ~@2 x ~ x ~ x!3 ~ x!3 ~@2", T: "x ~@2 x ~ x ~@2 x ~@2 x!3 ~ x", U: "x!2 ~ x ~ x ~@2 x ~@2 x ~ x ~@2",
  V: "x!2 ~ x!3 ~ x!2 ~@2 x ~ x ~@2", W: "x ~@2 x ~ x ~ x!3 ~@6",
})).gain(0.8)

// drums · mid tom
const mid_tom = s("mt").struct("<A B A B A B A ~ A B C B D B A ~@86 B A ~ A B ~@48 C B ~@2>".pickRestart({
  A: "~@3 x ~@9 x ~@2", B: "~ x", C: "~@13 x ~@2", D: "~@3 x ~@12",
})).gain(0.8)

// drums · cowbell
const cowbell = s("cb").struct(`<
  ~@2 A ~ B C ~ D ~@2 A ~ B C ~ D ~@2 A ~ B C ~ D ~@2 A ~@23 A ~ B C ~ D ~@2 A ~@44 D ~@2 A ~@7 A ~ B C ~ D ~@2 A ~@33 B
  ~
>`.pickRestart({
  A: "x!2 ~ x!3 ~ x!3 ~@6", B: "~@11 x!3 ~ x", C: "x!2 ~ x!2 ~@11", D: "~@5 x ~ x!3 ~ x!3 ~ x",
})).gain(0.8)

// drums · ride
const ride = s("rd").struct("<~@102 A ~@2 B ~ C ~@2 A D ~@46>".pickRestart({
  A: "~@5 x ~@10", B: "x", C: "~@11 x ~@4", D: "~@13 x ~@2",
})).gain(0.8)

// drums · bongos
const bongos = s("bongo:4").struct("<~@111 [~@11 x ~@4] ~@46>").gain(2.1)

stack(piano, music_box, synth_brass_2, bass, kick, rim, snare, pedal_hat, mid_tom, cowbell, ride, bongos)