Strudelify

Come On Eileen

Dexys Midnight Runners

KeyD majorTempo240 bpm
0:00/0:00
// Come On Eileen — Dexys Midnight Runners
// 240 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (2/4 at bar 61, 4/4 at bar 62, 2/4 at bar 124, 4/4 at bar 125) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 192 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(240/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.

// chords · string ensemble 2 · "strings2222"
const string_ensemble_2 = note(`<
  ~ A B C B D E F G@2 H I J K L M N O H I J P L Q N O R S T@2 U V W X R Y@3 Z@2 AA AB ~ AC ~ AC AD@2 AA AB R S AE AF Z@2
  W X ~@3 AG@2 AH@4 AI@2 AG@2 AH@4 AI@2 ~@4 H I J K L M N O H I J K L M N O R S T@2 U V W X ~ AC ~ AC AD@2 AA AB R S AE
  AF Z@2 W X ~@3 AG@2 AH@4 AI@2 AG@2 AH@4 AI@2 ~@27 AJ@6 AK@3 ~@16
>`.pickRestart({
  A: "~@3 c4", B: "c5 d5", C: "c5 ~@2 c4", D: "c5 a#4@3 f4@4", E: "a#4 c5", F: "a4 f4", G: "[a#3,c4]/2",
  H: "[c5,e5,g5] ~ [c5,e5,a5]@2", I: "g5 ~", J: "[b4,e5,g5] ~ [b4,e5,a5]@2", K: "[b4,e5,g5] ~",
  L: "[a4,c5,f5] ~ [a4,c5,a5]@2", M: "g5@4 ~@2 e5 f5", N: "g5 g5@2 g5@3 e5 f5", O: "g5 g5@2 g5@5", P: "[b4,e5,g5] ~@3",
  Q: "g5@2 ~@4 e5 f5", R: "[e4,g4]", S: "[g4,c5]", T: "[b4,e5]/2", U: "[c5,f5]", V: "c5", W: "[c5,e5]", X: "[b4,d5]",
  Y: "[[e4,g4] [b3,e4]@3]/3", Z: "[c5,f5]/2", AA: "~@2 g5@2 e5 c5 a4@2", AB: "g4 ~", AC: "~@2 a5@2 g5 a5@3", AD: "a4/2",
  AE: "[b4,e5]", AF: "[e5,g5]", AG: "[f#4,f#5]/2", AH: "[[g4,g5]@15 b4]/4", AI: "[[g4,g5]@3 c#5@5]/2",
  AJ: "[~@3 c#5@8 d5@8 e5@8 f#5@8 g5@8 a5@8 b5@8 c#6@8 b5@16 ~@13]/6", AK: "[~@3 d5@16 a5@16 ~@13]/3",
})).s("gm_string_ensemble_2").gain(0.58)

// bass · electric bass pick · "base2222"
const bass = note(`<
  A@2 B C B D@2 B C@4 E@2 B@2 F G C@2 E@2 B@2 F G C F E@2 H@2 F I C F E@2 H@2 F I C@2 E@2 H@2 C G C@2 E@2 B@2 C B G@2 ~
  J K L M N@4 J K L M N@4 O@4 C@2 E@2 B@2 F G C@2 E@2 B@2 F G C F E@2 H@2 F I C@2 E@2 H@2 C G C@2 E@2 B@2 C B G@2 ~ J K
  L M N@4 J K L M N@4 P@2 Q@4 R@4 G@4 Q@2 S@2 T@2 U V@8 W@7 X@3 Y Z@2 AA AB@2 AC AD@5 ~
>`.pickRestart({
  A: "c2@3 c2 c2@2 ~@2", B: "f2@6 f2@2 f2@7 ~", C: "c2@6 c2@2 c2@7 ~", D: "a#2@6 a#2@2 a#2@7 ~", E: "e2@6 e2@2 e2@7 ~",
  F: "c2@7 ~ c2@7 ~", G: "g2@7 ~ g2@7 ~", H: "f2@7 ~ f2@7 ~", I: "g2@6 g2@2 g2@7 ~", J: "d2@7 ~ a2@7 ~",
  K: "d3 b2 a2 b2", L: "a2@7 ~ e2@7 ~", M: "a2@7 ~ a1@7 ~",
  N: "[e2@4 b1@4 d2@4 e2@11 ~ e2@4 g2@8 d2@4 g2@4 a2@8 e2@4 f2@4 f#2@4]/4", O: "a1@7 ~ a1@7 ~",
  P: "[d2@22 ~@2 a1@7 ~]/2", Q: "d2@7 ~ d2@7 ~", R: "f#2@7 ~ f#2@7 ~", S: "a2@7 ~ a2@7 ~",
  T: "[d2@6 ~@2 d2@6 ~ d2@6 d2@5 ~@2 d2@4]/2", U: "~@2 d2@5 d2@4 ~ d2@4",
  V: "[~ f#2@4 ~ f#2@4 f#2@4 ~ f#2@3 ~ f#2@3 ~ f#2@3 ~ f#2@3 ~ f#2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~ d2@3 ~ d2@3 ~ d2@3 ~ d2@3 ~ a2@3 ~ a2@3 ~ a2@3 ~ a2@3 ~ d2@3 ~ d2@3 ~ d2@3 ~ d2@3 ~ d2@3 ~ d2@3 ~ d2@3 ~ d2]/8",
  W: "[~@3 f#2@3 ~ f#2@3 ~ f#2@3 ~ f#2@3 ~ f#2@3 ~ f#2@3 ~ f#2@3 ~ f#2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~ d2@3 ~ d2@3 ~ d2@3 ~ d2@3 ~ a2@3 ~ a2@3 ~ a2@3 ~ a2@3 ~ d2@6 ~ a2@6]/7",
  X: "[~ d3@3 b2@3 a2@3 ~ b2@3 a2@6 ~ e2@6 ~ a2@6 ~ a1@6 ~ e2@3 b1@3]/3", Y: "~ d2@3 e2@9 ~ e2@2",
  Z: "[~@2 g2@7 d2@3 g2@3 a2@7 e2@3 ~ f2@3 f#2@3]/2", AA: "~ d2@6 a2@6 ~ d3@2",
  AB: "[~@2 b2@3 a2@3 ~ b2@3 a2@6 ~ e2@6 ~ a2@6]/2", AC: "~ a1@6 e2@3 ~ b1@3 d2@2",
  AD: "[~@2 e2@9 ~ e2@3 g2@7 d2@3 ~ g2@3 a2@7 e2@3 f2@3 ~ f#2@3 d2@19 ~@2 a1@6 ~@7]/5",
})).s("gm_electric_bass_pick").gain(0.72)

// chords · piano · "piano2222"
const piano = note(`<
  ~@2 A B C D E F G H ~ I J K L M N O ~ I J K L M N O P Q R S T U ~ V P W@2 X T Y Z@2 P AA P AB AC@2 ~@10 AD@3 AE@2 AF@2
  AG@2 AH AI AE@2 AF@2 AG@2 AH AJ AK AL AK AM ~ I AN K L M N O ~ I J K L M N O P Q R S T U ~ V P AA P AB AC@2 ~@10 AD@3
  AO@2 AF@2 AP@2 AQ@2 AO@2 AF@2 AP@2 AQ@2 AR@2 AS AT@2 AS AU AV@2 AU AW AX@2 AW AY@2 AZ@2 BA BB BC BD@8 BE@6 BF@4 BG@3
  BH@3 BI BJ@2 BK ~ BL@2
>`.pickRestart({
  A: "[f4,a4]", B: "[e4,g4] ~", C: "[d#4,a4]", D: "d4", E: "c#4", F: "c4", G: "f5 e5", H: "d5 e5", I: "~ [c4,e4]@2 e4",
  J: "~ b3@3", K: "~ [b3,e4]@2 e4", L: "~ [c4,a4]@3", M: "~ [a3,c4]@2 c4", N: "~ [e4,c5]", O: "~ [d4,b4]",
  P: "~ [e4,g4]", Q: "~ [g4,c5]", R: "~ [b4,e5]", S: "~ [b4,e5] ~ [b4,e5]", T: "~ [f4,c5]", U: "~ c4",
  V: "~ [b4,d5] ~ b4", W: "[~ [e4,g4]@2 [b3,e4]@5]/2", X: "~ [b3,e4] ~ [c4,e4]", Y: "~ [f4,c5] ~@2", Z: "[e4,g4]/2",
  AA: "[e4,g4]", AB: "[e4,b4]", AC: "~ a4", AD: "[g3,b3,d4] [g3,b3,e4] [g3,b3,d4] [g3,b3,e4]",
  AE: "[[d4,f#4,a4]@2 ~ [d4,f#4,a4]@3 ~ [d4,f#4,a4]]/2", AF: "[[c#4,e4,a4]@2 ~ [c#4,e4,a4]@3 ~@2]/2",
  AG: "[[e4,g4,b4]@2 ~ [e4,g4,b4]@3 [e4,g4,b4]@2]/2", AH: "[d4,g4,b4]@2 ~ [d4,g4,b4]", AI: "[e4,a4,c#5]!2",
  AJ: "[e4,a4,c#5] ~ [e4,a4,c#5]@2", AK: "a4 a4@2 a4 a4@2 a4!2", AL: "~ a4 b4 a4 b4 a4 f#4@2",
  AM: "~@2 a3 b3 c#4 d4 e4!2 f#4 g4 a4 b4 c#5 d5 e5 f#5, ~ a4 b4 a4 b4 ~@3", AN: "~ b3",
  AO: "[[d4,f#4,a4]@2 ~ [d4,f#4,a4]@3 ~@2]/2", AP: "[[e4,g4,b4]@2 ~ [e4,g4,b4]@3 ~@2]/2",
  AQ: "[[d4,g4,b4]@2 ~ [e4,a4,c#5]@3 ~@2]/2", AR: "[d4,f#4,a4]/2", AS: "~ [f#4,a4,d5]",
  AT: "[~ [f#4,a4,d5]@2 [f#4,a4,d5]]/2", AU: "~ [f#4,a4,c#5]", AV: "[~ [f#4,a4,c#5]@2 [f#4,a4,c#5]]/2",
  AW: "~ [d4,g4,b4]", AX: "[~ [d4,g4,b4]@2 [d4,g4,b4]]/2", AY: "~ [a4,d5,f#5]", AZ: "~ [a4,c#5,e5]",
  BA: "~@8 [f#4,a4,d5]@7 ~", BB: "~@5 [f#4,a4,d5]@11", BC: "~ [f#4,a4,d5]@3 ~@2 [f#4,a4,d5]@2",
  BD: "[~@6 [f#4,a4,c#5]@4 ~@5 [f#4,a4,c#5]@8 [f#4,a4,c#5]@4 ~@4 [f#4,a4,c#5]@4 ~@4 [d4,g4,b4]@4 ~@4 [d4,g4,b4]@8 [d4,g4,b4]@4 ~@4 [d4,g4,b4]@4 ~@4 [a4,d5,f#5]@4 ~@4 [a4,d5,f#5]@4 ~@4 [a4,c#5,e5]@4 ~@4 [a4,c#5,e5]@4 ~@4 [f#4,a4,d5]@4 ~@4 [f#4,a4,d5]@8 [f#4,a4,d5]@4 ~@4 [f#4,a4,d5]]/8", // F#m G D A D
  BE: "[~@7 [f#4,a4,c#5]@4 ~@4 [f#4,a4,c#5]@8 [f#4,a4,c#5]@4 ~@4 [f#4,a4,c#5]@4 ~@4 [d4,g4,b4]@4 ~@4 [d4,g4,b4]@8 [d4,g4,b4]@4 ~@4 [d4,g4,b4]@4 [a4,d5,f#5]@2 [a4,d5,f#5]@2 [a4,d5,f#5]@2 [a4,d5,f#5]@2 [a4,d5,f#5]@2 [a4,d5,f#5]@2 [a4,d5,f#5]@2 [a4,d5,f#5]@2 [c#5,e5,a5]@2 [c#5,e5,a5]@2 [c#5,e5,a5]@2 [c#5,e5,a5]@2 [c#5,e5,a5]@2 [c#5,e5,a5]@2 [c#5,e5,a5]]/6", // F#m G D A
  BF: "[~ [c#5,e5,a5]@2 [d4,f#4,a4]@7 ~@3 [d4,f#4,a4]@10 ~@4 [d4,f#4,a4]@3 [c#4,e4,a4]@7 ~@4 [c#4,e4,a4]@10 ~@7 [e4,g4,b4]@6]/4", // A D A Em
  BG: "[~@4 [e4,g4,b4]@10 [e4,g4,b4]@7 [d4,g4,b4]@7 ~@3 [d4,g4,b4]@3 ~ [e4,a4,c#5]@7 [e4,a4,c#5]@6]/3", // Em G A
  BH: "[~ [d4,f#4,a4]@7 ~@3 [d4,f#4,a4]@10 ~@4 [d4,f#4,a4]@3 [c#4,e4,a4]@7 ~@3 [c#4,e4,a4]@10]/3", // D A
  BI: "~@7 [e4,g4,b4]@7 ~@2", BJ: "[~@2 [e4,g4,b4]@10 [e4,g4,b4]@7 [d4,g4,b4]@7 ~@3 [d4,g4,b4]@3]/2",
  BK: "~ [e4,a4,c#5]@3 ~@3 [e4,a4,c#5]@7 ~@2", BL: "[~@11 d5@9 ~@12, ~@3 f#4@7 ~@6, ~@9 a4@11 ~@12]/2",
})).s("gm_piano").gain(0.72)

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

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~@11 B ~@7 B ~@3 B ~@3 C ~@3 B ~@3 C ~@3 B ~@7 A ~@11 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ D@4 ~@3 B ~@7 B ~@7 C ~@3 B
  ~@7 A ~@11 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@36 E ~ F ~ C G ~ H ~ I ~ J E ~@4
>`.pickRestart({
  A: "~@3 x", B: "~@7 x", C: "~ x ~@2", D: "~ x ~ x", E: "~@13 x ~@2", F: "~@9 x ~@6", G: "~@15 x", H: "~@11 x ~@4",
  I: "~@3 x ~@4", J: "~ x ~@6",
})).gain(0.72)

// drums · ride bell
const ride_bell = s("rd").struct(`<
  ~@2 A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B@7 C B@5 D B@21 ~@4 A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B@7 C B@5 D B@21 ~@35 E F G E F G E F G E F G E F ~@3
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~ x ~@2", D: "~@2 x ~@3 x!2", E: "~@6 x ~@6 x ~@2", F: "~@4 x ~@6 x ~@4",
  G: "~@2 x ~@6 x ~@5 x",
})).gain(0.72)

// drums · tambourine
const tambourine = s("tb").struct("<~@17 A ~@7 A ~@62 A ~@7 A ~@95>".pickRestart({
  A: "x",
})).gain(0.72)

// drums · splash
const splash = s("cr").struct(`<
  ~@10 A ~ A ~ A ~ A ~ A ~@5 A ~ A ~@7 A ~@7 A ~ A ~ A@2 ~@2 A ~@5 A ~ A ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~@5
  A ~ A ~@5 A ~ A ~@7 A ~ A ~ A@2 ~@2 A ~@5 A ~ A ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@16 B ~@8 C ~@8 D E ~ F ~ G ~ H
  I ~ J ~ K ~@4
>`.pickRestart({
  A: "x", B: "~ x", C: "~@15 x", D: "~ x ~ x ~@12", E: "~@7 x", F: "~@5 x ~@2", G: "~@5 x ~@10", H: "~ x ~@14",
  I: "~@3 x", J: "~@7 x ~@8", K: "~@3 x ~@12",
})).gain(0.72)

stack(string_ensemble_2, bass, piano, snare, hihat, open_hat, ride_bell, tambourine, splash)