Strudelify

End of the Night

The Doors

KeyD majorTempo99 bpm
0:00/0:00
// End of the Night — The Doors
// 99 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 139 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(99/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 · clavinet · "harpsichor"
const clavinet = note("<~@2 A@3 B C D E F G H I J F K L M N@4 O P Q@3 R S@7 T@4 U V W X Y@2 ~@94>".pickRestart({
  A: "[~@4 d4@9 c#4@3 d4@13 ~@23 d4@8 c#4@4 d4@16 f4@4 d4@7 c#4@5, ~@29 a3@41 ~@26]/3",
  B: "d4@9 ~ c3@3 c#3@2 d3@17, ~@9 a2@4 ~@19", C: "~@21 d4@8 c#4@3", D: "d4@16 ~@5 d4@11, ~@16 [e4,f4]@9 ~@7",
  E: "c#4 d4@3 ~ d4!2 c#4, ~@16 f4@9 ~@7", F: "d4@4 ~ d4@2 c#4", G: "~@11 a3@13 ~@8, d4 ~", H: "a4!3 a4@5, d4",
  I: "~@2 c5@2 c5 b4@3, ~ c4@3", J: "d4@4 ~ d4@2 c#4, a4", K: "a4!3 a4@5, d4 ~@3", L: "~ c5!2 g4, ~ c4@2 ~",
  M: "a4@3 c5 ~ d4@2 c#4, d4 a4",
  N: "[d4@4 b4@2 c5@2 d5@2 [g4,b4]@2 g4@2 a4@3 c5 ~ d4@2 c#4 d4@4 b4@2 c5@2 d5@2, ~@3 [e4,g4]@2 d4@2 d4@2 a4@2 ~@3 [e4,g4]@2]/4", // G Em
  O: "[g4,b4]@2 g4@2 a4@3 c5, d4!2", P: "~ d4@2 c#4 d4@4, a4 ~",
  Q: "[b4@2 c5@2 d5@2 [g4,b4]@2 g4@2 a4@3 c5 ~ d4@2 c#4 d4@4 b4@2, ~ [e4,g4]@2 d4@2 d4@2 a4@2 ~@3]/3", // G Em
  R: "d5 c5@3 d5@2 d5@2, [e4,g4]!2", // Em
  S: "[d5 c5@3 a4@6 c5@2 d4@4 ~ d4@2 c#4 d4@4 ~ d4@2 c#4 ~@4 a4@2 a4@2 e5 e5@4 e5 e5@2 [d4,a4,d5]@6 e5 d5 [f4,f5]@2 g4@2, [e4,g4]@2 d4@4 a4@8 d4@4 [e4,g4,c5]@4 ~@3 f4 ~@2]/7", // D5 F Em C
  T: "[~@4 [a3,d4,a4]@8 [d4,d5]@2 [g4,c#5]@6 d5 a4@3 ~ c5 c5@2 ~@4, ~@5 d4@2 ~]/4", U: "c5 g4 g5@2, d4 ~",
  V: "[d4,a4] ~", W: "[f4,f5] c5 d4@2", X: "d4@2 c#4 ~@5", Y: "~ d4@2 c#4 ~@4",
})).s("gm_clavinet").gain(0.08)

// other · harpsichord · "harpsichor"
const harpsichord = note("<~@134 A@4 ~>".pickRestart({
  A: "[~ a4@15 g4@18 f4@17 d4@74 ~@3]/4",
})).s("gm_harpsichord").gain(0.09).pan(1)

// other · epiano1 · "clickorgan"
const epiano1 = note(`<
  A B@10 C D E B C D E F G@2 H I J K L M N O P Q@2 R S T U V W X Y Z W Q AA Q@2 ~@93
>`.pickRestart({
  A: "d2@3 a2 d3@2 ~ d3, ~@6 a2 ~, ~@25 a#3@7", B: "d2@3 a2 d3@2 a2 d3", C: "d2@3 a2 d3@2 a2 b2",
  D: "[c2,g2,c3]@3 g2 c3@2 g2 c3", E: "[d2,a2]@3 a2 d3@2 a2 d3", F: "~@3 [c2,g2]",
  G: "[g2 c3 g2@2 b2 d3 [d2,a2]@3 a2 d3@2 a2 d3 ~@2]/2", H: "~@4 [c2,g2]@2 g2 c3", I: "g2@2 b2 d3 [d2,a2]@3 a2",
  J: "d3@2 a2 d3 ~@4", K: "~@2 [c2,g2]@2 g2 c3 g2@2", L: "b2 d3 [d2,a2]@3 a2 d3@2", M: "a2 d3 ~@6", N: "c2 g2 c3 g2",
  O: "c2@2 g2 c3 d2@3 a2", P: "d3@4 d2@3 a2", Q: "d3@2 a2 d3 d2@3 a2", R: "d3@2 a2 d3 c2@3 g2", S: "c3@2 g2 c3 d2@3 a2",
  T: "d3@2 a2 d3 g2@3 b2", U: "d3 g2 b2 d3 d2@3 a2", V: "d3@2 a2 d3 [c2,g2]@3 g2", W: "~ c3@4 g2@2 c3 [d2,a2]@6 a2@2",
  X: "d3@2 a2 ~ g2@3 b2, ~@3 d3@4 ~", Y: "d3 g2 b2 d3 [d2,a2]@3 a2", Z: "d3@2 d3 ~ [c2,g2]@3 g2",
  AA: "~ a2 ~@2 d2@3 a2, d3 ~@3",
})).s("gm_epiano1").gain(0.48)

// other · epiano1 · "clickorgan" · soft notes
const epiano1_soft = note("<~@18 A B C@2 D E F ~ G ~@112>".pickRestart({
  A: "[d2,a2]@3 a2 d3@2 a2 d3", B: "d2@2 a2 d3 ~@4", C: "[~@6 [d2,a2]@3 a2 d3@2 a2 d3 d2@2]/2", D: "a2 d3 ~@6",
  E: "~@4 [d2,a2]@3 a2", F: "d3@2 a2 d3 d2@2 a2 d3", G: "~@2 [d2,a2]@3 a2 d3@2",
})).s("gm_epiano1").gain(0.2)

// other · church organ · "clickorgan"
const church_organ = note("<~@46 A@87 B C@4 ~>".pickRestart({
  A: "d3@2 a2 d3 d2@3 a2", B: "d3@2 a2 d3 d2@3 ~", C: "[~ a2@15 g2@18 f2@17 d2@74 ~@3]/4",
})).s("gm_church_organ").gain(0.24).pan(0)

// chords · church organ · "elecorgan"
const church_organ_2 = note("<~@11 A@2 B@2 C D E F@4 G H I@3 J K@7 L@4 M N O P Q@2 ~@94>".pickRestart({
  A: "[a5@40 c6@7 ~@9 b5@8, ~@5 c5@3, ~@12 c6@3 ~]/2", B: "[d5,a5]/2", C: "a4!3 a4@5, d4 ~@3", D: "~ c5!2 g4, ~ c4@2 ~",
  E: "a4@3 c5 ~ d4@2 c#4, d4 a4",
  F: "[d4@4 b4@2 c5@2 d5@2 [g4,b4]@2 g4@2 a4@3 c5 ~ d4@2 c#4 d4@4 b4@2 c5@2 d5@2, ~@3 [e4,g4]@2 d4@2 d4@2 a4@2 ~@3 [e4,g4]@2]/4", // G Em
  G: "[g4,b4]@2 g4@2 a4@3 c5, d4!2", H: "~ d4@2 c#4 d4@4, a4 ~",
  I: "[b4@2 c5@2 d5@2 [g4,b4]@2 g4@2 a4@3 c5 ~ d4@2 c#4 d4@4 b4@2, ~ [e4,g4]@2 d4@2 d4@2 a4@2 ~@3]/3", // G Em
  J: "d5 c5@3 d5@2 d5@2, [e4,g4]!2", // Em
  K: "[d5 c5@3 a4@6 c5@2 d4@4 ~ d4@2 c#4 d4@4 ~ d4@2 c#4 ~@4 a4@2 a4@2 e5 e5@4 e5 e5@2 [d4,a4,d5]@6 e5 d5 [f4,f5]@2 [e4,e5]@2, [e4,g4]@2 d4@4 a4@8 d4@4 [e4,g4,c5]@4 ~@3 f4 g4@2]/7", // D5 F E Em C
  L: "[[d4,d5]@2 [c4,c5]@2 [a3,d4,a4]@8 [d4,d5]@2 [d4,d5]@2 [d4,d5]@2 [d4,d5]@2 d5 a4@3 ~ c5 c5@2 ~@4, ~@24 [g4,c#5]@15 ~ d4@16 ~@8]/4", // D C D5 D Gdim
  M: "c5 g4 g5@2, d4 ~", N: "[d4,a4] ~", O: "[f4,f5] c5 d4@2", P: "d4@2 c#4 ~@5", Q: "~ d4@2 c#4 ~@4",
})).s("gm_church_organ").gain(0.08)

// chords · drawbar organ · "elecorgan"
const drawbar_organ = note(`<
  ~@46 A B A B A C 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 D@4 ~
>`.pickRestart({
  A: "[d4,a4]@3 g4", B: "[d4,a4]", C: "d4, a4 ~", D: "[~ a2@15 g2@18 f2@17 d2@74 ~@3]/4",
})).s("gm_drawbar_organ").gain(0.06).pan(1)

// other · clavinet · "clav1"
const clavinet_2 = note(`<
  ~@46 A B C D E F G@2 H ~ I J G H ~ K L@2 ~ E M N ~@2 O@2 ~@2 P Q@2 ~ R S ~@2 T D T D U D U D V D V D W D W D E D X Y E
  Z D ~ E AA ~@2 AB D ~@2 AC@2 AD@2 AC@2 AD@2 AE AF ~ AG AH AI AJ AG AK AL G D AM@4 ~
>`.pickRestart({
  A: "a4@4 a4 a4@3", B: "a4 a4@7", C: "c5@2 c5@2 c5 b4@3", D: "a4 ~", E: "~@7 g4", F: "a4@3 g4", G: "c5 g4", H: "a4",
  I: "~@5 a4 a4@2", J: "a4 a4@5 ~@2", K: "f5 d5@3 d5@2 d5@2", L: "[f5 f5@3 f5@2 d5@10]/2", M: "c5 a4@4 a4 a4@2",
  N: "a4!2 g4@2 a4@4", O: "[a4@2 g4 a4@4 a4@2 d4@6 ~]/2", P: "c5@4 c5@3 b4", Q: "[c5@3 b4 c5@2 a4@6 ~@4]/2",
  R: "a4@2 g4 a4 a4@2 a4@2", S: "a4 d4@3 a4 d4@3", T: "~ a4@2 g4", U: "~@4 a4@3 g4", V: "~ a4@2 a4@4 a4@4 ~@5",
  W: "~@2 a4!2", X: "~@5 g4 g4@2", Y: "a4@2 a4 a4@3 ~@2", Z: "a4@2 ~@2 a4@3 g4", AA: "c5@4 ~@2 g4!2 a4@8",
  AB: "~@4 a4@4 a4@8 ~@8 a4@3 a4@2 a4@3", AC: "[~@2 a4@2 a4@2 c5@6 ~@3 a4]/2", AD: "[d5 c5 a4@4 ~@2]/2", AE: "a4!4",
  AF: "c5@2 g4 a4@5", AG: "~@7 a4", AH: "d5@3 c5", AI: "a4!2 ~ a4", AJ: "c5 a4 ~@2", AK: "a4@3 a4", AL: "c5 a4",
  AM: "[~ a3@15 g3@18 f3@17 d3@74 ~@3]/4",
})).s("gm_clavinet").gain(0.29)

// other · clavinet · "harpsichor"
const clavinet_3 = note(`<
  ~@15 A B C D E@2 F G H I J@2 K L@4 M@3 N@2 O P Q@2 R@2 ~@18 S T@2 ~ U V W ~@2 X@2 ~@2 Y Z@2 ~ AA AB ~@2 AC AD AC AD AE
  AD AE AD AF AD AF AD AG AD AG AD U AD AH AI U AJ AD ~ U AK ~@2 AL AD ~@2 AM@2 AN@2 AM@2 AN@2 AO AP ~ AQ AR AS AT AQ AU
  AV AW AD AX@4 ~
>`.pickRestart({
  A: "a3!3 a3@5", B: "~ c4!2 g3", C: "a3@3 c4 a3@4", D: "~@2 b3 c4", E: "[d4@2 b3@2 ~@2 a3@3 c4 a3@4 ~@2]/2",
  F: "~ b3 c4 d4", G: "b3@2 ~@2 a3@3 c4", H: "a3 ~", I: "b3 c4 d4 b3", J: "[~@2 a3@3 c4 a3@4 ~@4 b3@2]/2",
  K: "d4 c4@3 d4@2 d4@2", L: "[d4 c4@3 a3@6 c4@2 a3@16 ~@4]/4", M: "[~ a3@2 a3 e4@2 e4@4 e4!2 d4@6 e4 d4 f4@2 e4@2]/3",
  N: "[d4 c4 a3@4 d4!2]/2", O: "d4@2 d4@2 d4 a3@3", P: "~ c4 c4@2 ~@4",
  Q: "[c4@2 g3@2 ~@5 c4 c4@2 ~@4, ~@8 a3@15 ~@9]/2", R: "[f4 e4 d4@4 ~@2]/2", S: "f5 d5@3 d5@2 d5@2",
  T: "[f5 f5@3 d5@10 ~@2]/2", U: "~@7 g4", V: "c5 a4@4 a4 a4@2", W: "a4!2 g4@2 a4@4", X: "[a4@2 g4 a4@4 a4@2 d4@6 ~]/2",
  Y: "c5@4 c5@3 b4", Z: "[c5@3 b4 c5@2 a4@6 ~@4]/2", AA: "a4@2 g4 a4 a4@2 a4@2", AB: "a4 d4@3 a4 d4@3", AC: "~ a4@2 g4",
  AD: "a4 ~", AE: "~@4 a4@3 g4", AF: "~ a4@2 a4@4 a4@4 ~@5", AG: "~@2 a4!2", AH: "~@5 g4 g4@2", AI: "a4@2 a4 a4@3 ~@2",
  AJ: "a4@2 ~@2 a4@3 g4", AK: "c5@4 ~@2 g4!2 a4@8", AL: "~@4 a4@4 a4@8 ~@8 a4@3 a4@2 a4@3",
  AM: "[~@2 a4@2 a4@2 c5@6 ~@3 a4]/2", AN: "[d5 c5 a4@4 ~@2]/2", AO: "a4!4", AP: "c5@2 g4 a4@5", AQ: "~@7 a4",
  AR: "d5@3 c5", AS: "a4!2 ~ a4", AT: "c5 a4 ~@2", AU: "a4@3 a4", AV: "c5 a4", AW: "c5 g4",
  AX: "[~ a3@15 g3@18 f3@17 d3@74 ~@3]/4",
})).s("gm_clavinet").gain(0.22)

// drums · kick
const kick = s("bd").struct("<~@71 [~@27 x ~@4] ~@63 [~@5 x ~@2] ~@3>").gain(0.48)

// drums · rim
const rim = s("rim").struct(`<
  ~@47 A ~@3 B ~@2 C B ~ D E F ~ G H C I ~ J K L H M N O F M N H O M P H M N O P O Q R S T U V P W X ~ F Y H Z X W L@2 Q
  AA AB AC ~@2 L ~ AD W ~@4 X L H AE AF P H V P L Q X L O Q Y V ~@4
>`.pickRestart({
  A: "~@27 x ~@4", B: "~ x ~ x ~@4", C: "~@3 x ~@4", D: "~@11 x ~@20", E: "~@4 x ~@6 x ~@20", F: "x ~@14 x ~@16",
  G: "~@5 x ~@6 x ~@19", H: "~@15 x ~@16", I: "~@21 x ~@6 x ~@3", J: "~ x ~ x!2 ~@3", K: "~@5 x ~@2",
  L: "~@15 x ~@15 x", M: "x!2", N: "x ~@15 x ~@14 x", O: "~ x", P: "x ~@14 x ~@15 x", Q: "~@3 x", R: "~ x ~ x",
  S: "~@12 x ~@10 x ~@8", T: "~@19 x ~@7 x ~@4", U: "~ x!2 ~", V: "x", W: "~@31 x", X: "~@16 x ~@14 x", Y: "~@9 x ~@22",
  Z: "x ~@28 x ~@2", AA: "x ~@10 x ~@20", AB: "~ x ~@30", AC: "x ~@10 x ~@12 x ~@7", AD: "~@17 x ~@13 x",
  AE: "~@23 x ~@8", AF: "~@3 x ~@12",
})).gain(0.4)

// drums · rim · soft notes
const rim_soft = s("rim").struct(`<
  ~@47 A ~ B ~@4 C ~@2 C ~@5 D ~@3 E ~@20 C F ~ G ~ G ~ G ~@2 H G ~ I ~@4 J ~ K L C G L M ~@18 F ~@6
>`.pickRestart({
  A: "~@19 x ~@12", B: "~@2 x ~@2 x ~@10", C: "~@5 x ~@26", D: "~ x ~@6", E: "~@31 x", F: "~@7 x ~@24", G: "~ x",
  H: "~ x ~@30", I: "~@11 x ~@4", J: "~@23 x ~@8", K: "~@7 x ~@8", L: "x", M: "~@17 x ~@14",
})).gain(0.16)

// drums · snare
const snare = s("sd").struct(`<
  ~@135
  x
  [~@3 x ~@2 x ~@2 x ~@3 x ~@2 x ~@2 x ~@3 x ~@2 x ~@2 x ~@2]
  [x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~@3 x ~@8]
  ~
>`).gain(0.16)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@44 A ~@31 B ~@3 A ~@5 C ~@13 D E ~ F@4 ~@2 G D ~@10 A G H I ~@3 J ~@5 K ~@4
>`.pickRestart({
  A: "~ x", B: "~@15 x ~@16", C: "~@11 x ~@3 x ~@16", D: "~@3 x ~@4", E: "~@27 x ~@4", F: "~ x ~@6", G: "~@11 x ~@20",
  H: "~ x ~ x ~@4", I: "~@3 x ~@28", J: "~@7 x", K: "~@17 x ~@14",
})).gain(0.32)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@101 A ~@6 B C ~ D ~@13 E F ~ G ~@10>".pickRestart({
  A: "~@17 x ~@14", B: "~ x ~@30", C: "~@5 x ~@26", D: "~@7 x ~@16 x ~@7", E: "~ x ~@6", F: "~@7 x", G: "~@3 x ~@28",
})).gain(0.08)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@3 A B C@3 D E C@2 E C E C E C E C E C E C E C E C E C E C E C E C E C E C E C E F ~@95
>`.pickRestart({
  A: "~@16 x ~@14 x", B: "~@15 x ~@16", C: "x!2", D: "~ x ~@14 x ~@15", E: "x ~@14 x ~@16", F: "x",
})).gain(0.56)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@44 A ~@31 B ~@3 C ~@4 D E ~@12 F G H ~@2 H ~@2 I ~ J ~@11 K L ~ M N O ~ P ~ Q ~@3 R ~@4
>`.pickRestart({
  A: "~@5 x ~@6 x ~@19", B: "~@19 x ~@7 x ~@4", C: "~@20 x ~@6 x ~@4", D: "~@31 x", E: "~ x ~@6", F: "~ x ~@2",
  G: "~@5 x ~@26", H: "~@3 x ~@4", I: "~ x ~ x ~@4", J: "~@16 x ~@12 x ~@2", K: "~@12 x ~@14 x ~@4", L: "~@15 x ~@16",
  M: "~@11 x ~@20", N: "~@7 x", O: "~@7 x ~@20 x ~@3", P: "~@5 x ~@5 x ~@20", Q: "~@3 x ~@12", R: "~ x ~@30",
})).gain(0.24)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@102 A B ~@2 C ~@5 D ~@12 B ~@3 E ~ F ~@7>".pickRestart({
  A: "~@5 x ~@10", B: "~@3 x ~@4", C: "~@15 x ~@13 x ~@2", D: "~@7 x ~@24", E: "~@13 x ~@2", F: "~@21 x ~@10",
})).gain(0.08)

// drums · open hat
const open_hat = s("oh").struct("<~@18 [~@3 x] [~ x ~ x] [~@7 x ~@20 x ~@3] [~@4 x ~@10 x ~@16] [x!2] ~@116>").gain(0.4)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@43 A@2 ~ B C D E F G@2 F H F@2 I E J K L ~ F@3 M K N ~@2 O ~ P ~@2 Q ~@3 Q ~@2 R ~ S ~@10 Q ~ T ~ A U ~@2 K ~@7 V
  ~@5 W X Y Z ~@3 H ~@6 AA AB ~@5
>`.pickRestart({
  A: "x", B: "~ x ~@14 x ~@14 x", C: "~@15 x ~@14 x ~", D: "~@16 x ~@14 x", E: "~@15 x ~@16", F: "x!2",
  G: "x ~@14 x ~@16", H: "~@3 x", I: "x ~@15 x ~@14 x", J: "~@4 x ~@6 x ~@19 x", K: "~ x", L: "x ~@14 x ~@15 x",
  M: "~ x ~@29 x", N: "~@19 x ~@7 x ~@4", O: "~@23 x ~@8", P: "~@3 x ~@7 x ~@20", Q: "~@31 x", R: "~@20 x ~@6 x ~@4",
  S: "~@7 x ~@11 x ~@7 x ~@4", T: "~@5 x ~@22 x ~@3", U: "~ x ~@6", V: "~@13 x ~@18", W: "x ~@2 x ~@2 x ~",
  X: "~@11 x ~@11 x ~@3 x ~@4", Y: "~@7 x ~@24", Z: "~ x ~@2", AA: "~@5 x ~@2", AB: "~@17 x ~@14",
})).gain(0.32)

// drums · high tom · soft notes
const high_tom_soft = s("ht").struct("<~@54 A ~@41 B C ~@11 D ~@2 C ~@15 E ~ F G H ~@6>".pickRestart({
  A: "~ x ~@15 x ~@14", B: "~@4 x ~@6 x ~@20", C: "~@27 x ~@4", D: "~@5 x ~@2", E: "~ x", F: "~@11 x ~@20",
  G: "~@2 x ~@4 x", H: "~@15 x ~@14 x ~",
})).gain(0.16)

// drums · crash
// … 28 more lines

More by The Doors