Strudelify

Lonely Ol' Night

John Mellencamp

KeyE majorTempo130 bpm
0:00/0:00
// Lonely Ol' Night — John Mellencamp
// 130 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 120 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(130/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.

// bass · electric bass finger · "Split Chan 16"
const bass = note(`<
  ~ A B@2 C D C D C D E D C D C F G H I J C D C K L M N O N P C D C Q C R S T C U S E G V G W C R C X Y I Z I Z AA C R
  C@2 G AB G AC C AD C@2 G AB G AE C R AF AG AH@3 ~@11 AI@2 AJ G AJ G AK AA C R C AL AM AN Y G AO AA C R C R C R S AP
  AQ@3 ~
>`.pickRestart({
  A: "~@8 e1 ~@2 e1 ~@2 e1 ~", B: "[~@4 e2@18 ~@2 e1@4 ~@2 e1 ~]/2", C: "e1@4 ~@2 e1 ~ e1@4 ~@2 e1 ~",
  D: "e1@3 ~ g#1 ~ f#1 ~ e1@4 ~@2 e1 ~", E: "e1@5 ~ e1 ~ e1@4 ~@2 e1 ~", F: "e1@4 ~@2 g#1 ~ a1@4 ~@2 a1 ~",
  G: "a1@4 ~@2 a1 ~ a1@4 ~@2 a1 ~", H: "a1@4 ~@2 e1 ~ a1@4 ~@2 a1 ~", I: "a1@4 ~@2 a1 ~ a1@5 ~ a1 ~",
  J: "a1@3 ~ a1 ~ b1 ~ e1@4 ~@2 e1 ~", K: "e1@4 ~@2 c#2@2 d2@5 ~ d2 ~", L: "f#2@4 a2@4 a1@4 ~@2 a1 ~",
  M: "a1@4 ~@2 a1 ~ d2@4 ~@2 d2 ~", N: "f#2@3 ~ a2@4 a1@4 ~@2 a1 ~", O: "a1@5 ~ a1 ~ d2@5 ~ d2 ~",
  P: "a1@3 ~ g#1 ~ f#1 ~ e1@4 ~@2 e1 ~", Q: "e1@8 ~@2 e1 ~ g#1 ~ f#1 ~", R: "e1@4 ~@2 e1 ~ e1@3 ~ g#1 ~ f#1 ~",
  S: "e1@4 ~@2 e1 ~ e1@5 ~ e1 ~", T: "e1@4 ~@2 e1 ~ e1@3 ~ g#1@2 f#1 ~", U: "e1@5 ~ e1 ~ e1@4 g#1 ~ f#1 ~",
  V: "a1@4 ~@2 a1 ~ a1@5 ~ e1 ~", W: "a1@4 ~@2 a1 ~ a1@3 ~ a1 ~ b1 ~", X: "e1@4 ~@2 e1 ~ e1@4 ~@2 a#1 ~",
  Y: "d2@5 ~ d2 ~ f#2@3 ~ a2@3 ~", Z: "d2@5 ~ d2 ~ f#2@4 a2@3 ~", AA: "a1@4 ~@2 a1 ~ a1@3 ~ g#1 ~ f#1 ~",
  AB: "a1@4 ~@2 a1 ~ a1@4 ~@2 e1 ~", AC: "a1@4 ~@2 a1 ~ a1@3 ~ a1 ~ f#1 ~", AD: "e1@4 ~@2 e1 ~ e1@2 e1 ~ g#1 ~ f#1 ~",
  AE: "a1@3 ~@3 a1 ~ a1@3 ~ g#1 ~ f#1 ~", AF: "e1@5 ~ e1 ~ e1@5 ~ e1 ~", AG: "e1@5 ~ e1 ~ e1@3 ~ g#1 ~ f#1 ~",
  AH: "[e1@43 ~@5]/3", AI: "[e1@31 ~]/2", AJ: "d2@5 ~ d2 ~ f#2@4 a2@4", AK: "d2@4 ~@2 d2 ~ f#2@3 ~ a2@4",
  AL: "e1@4 ~@2 e1 ~ e1@4 ~ e1 ~@2", AM: "d2@4 ~@2 d2 ~ f#2@4 a2@4", AN: "a1@5 ~ a1 ~ a1@4 ~@2 a1 ~",
  AO: "d2@4 ~@2 d2 ~ f#2@4 a2@3 ~", AP: "e1@4 ~@2 e1 ~ e1@8", AQ: "[~@2 e1 ~ g#1 ~ f#1 ~ e1@32 ~@8]/3",
})).s("gm_electric_bass_finger").gain(0.56)

// chords · piano
const piano = note(`<
  ~ A B@2 C@2 D@7 E@7 F@8 G@6 H I J I J I K@2 L M L N O I K@2 P Q P Q P R J I S@2 T M L U V I W X L M L Y J I Z@6 J I
  AA@2 J I Z@2 AB@2 AC@2 P Q P Q P R J I K@2 P Q P Q P R J I J I J I J AD AE@4
>`.pickRestart({
  A: "~@8 [e2,e3,g#3,b3] ~@2 [e2,e3,g#3,b3] ~@2 [e2,e3,g#3,b3] ~", // E
  B: "[~@4 [e2,e3,a3,b3]@20 e2@2 [e3,g#3,b3] e2!2 [e3,g#3,b3] e2!2]/2", // Esus4 E
  C: "[[e3,g#3,b3] ~@3 [e2,e3,a3,b3]@20 e2@2 [e3,g#3,b3] e2!2 [e3,g#3,b3] e2!2]/2", // E Esus4 E
  D: "[[e3,g#3,b3] ~@3 [e2,e3,a3,b3]@19 ~ [e3,g#3,b3]@15 ~ [e3,a3,b3]@15 ~ [e2,e3,g#3,b3]@16 [e2,e3,a3,b3]@16 [e2,e3,g#3,b3]@15 ~ [e2,e3,a3,b3]@8, ~@4 d2 ~@19 e2@31 ~@57]/7", // E Esus4 E Esus4 E Esus4 E Esus4
  E: "[~@8 [e2,e3,b3]@16 [e2,e3,a3,b3]@15 ~ [a3,c#4,e4]@15 ~ [a3,d4,e4]@15 ~ [a3,c#4,e4]@15 ~ [a3,d4,e4]@15 ~ [e3,g#3,b3]@8, ~@8 g#3@29 ~@3 d#4 ~@71]/7", // E5 Esus4 A Asus4 A Asus4 E
  F: "[~@8 [e2,e3,a3,b3]@15 ~ [e2,e3,b3]@16 [e2,e3,a3,b3]@15 ~ [a3,d4,f#4]@15 ~ [a3,c#4,e4]@15 ~ [a3,d4,f#4]@14 ~@2 [a3,c#4,e4]@15 ~ [a3,d4,f#4]@8, ~@24 g#3@27 ~@77]/8", // Esus4 E5 Esus4 D A D A D
  G: "[~@8 [a3,c#4,e4]@12 ~@4 [e3,g#3,b3]@15 ~ [e3,a3,b3]@15 ~ [e2,e3,b3]@16 [e2,e3,a3,b3]@16 ~@8, ~@24 e2@31 ~ g#3@31 ~@9]/6", // A E Esus4 E5 Esus4
  H: "[e2,e3,g#3,b3]@15 ~, f2 ~@7", I: "[e2,e3,a3,b3]@15 ~", J: "[e2,e3,g#3,b3]@15 ~",
  K: "[[e2,e3,b3]@16 [e2,e3,a3,b3]@15 ~, g#3@27 ~@5]/2", L: "[a2,a3,c#4,e4]@15 ~", M: "[a2,a3,d4,e4]@15 ~",
  N: "[a3,d4,e4]@7 ~, a2@7 ~@9", O: "[e2,e3,g#3,b3]@15 ~, d2 ~@15", P: "[a3,d4,f#4]@15 ~", Q: "[a3,c#4,e4]@15 ~",
  R: "[a3,c#4,e4]@3 ~", S: "[[e2,e3,b3]@16 [e2,e3,a3,b3]@15 ~, g#3@29 ~@3]/2", T: "[a3,c#4,e4]@15 ~, d#4 ~@15",
  U: "[a3,d4,e4]@7 ~, a2 ~", V: "[e2,e3,g#3,b3]@15 ~, [d2,a#3] ~@15", W: "[e2,e3,g#3,b3]",
  X: "[e3,a3,b3]@7 ~, e2@7 ~@9", Y: "[a3,d4,e4]@15 ~, a2@3 ~@5", Z: "[[e2,e3,b3] [e2,e3,a3,b3], g#3]/2",
  AA: "[[e2,e3,b3]@16 [e2,e3,a3,b3]@15 ~, g#3@31 ~]/2", // E5 Esus4
  AB: "[e2@2 [e3,g#3,b3] e2!2 [e3,g#3,b3] e2!2 [e3,g#3,b3] ~@3 [e2,e3,a3,b3]@20]/2", // E Esus4
  AC: "[e2@2 [e3,g#3,b3] e2!2 [e3,g#3,b3] e2!2 [e3,g#3,b3] ~@3 [e2,e3,a3,b3]@16 ~@4]/2", AD: "[e2,e3,a3,b3]",
  AE: "[~ [e2,e3,g#3,b3]@6 ~]/4", // E
})).s("gm_piano").gain(0.5)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B C D E D E F@7 E F@6 D B F@8 D G F@15 D F@9 G F@3 H F@3 G F@3 D F@3 H@2 I H I H I H I H I H I H@2 D F@10 D F@13
  H@2 ~@3
>`.pickRestart({
  A: "~@8 x ~@2 x ~@2 x ~", B: "~@2 x!2", C: "x ~@2 x!2 ~ x ~", D: "x!3 ~", E: "x ~ x!2", F: "x!4", G: "x", H: "x!2",
  I: "x ~@3 x!2 ~ x",
})).gain(0.6)

// drums · snare
const snare = s("sd").struct(`<
  ~@2 A B@2 C B C B@6 D B@8 E B@9 F B@15 G B@9 H B@3 I B@3 H B@3 G B@3 I B@13 J K L B@9 G B@13 M N ~@3
>`.pickRestart({
  A: "~ x ~@2", B: "~ x ~ x", C: "x ~ x ~ x!4 ~@4 x ~@3", D: "~@4 x ~@5 x ~ x!3 ~", E: "x!2 ~@4 x ~",
  F: "~@2 x!7 ~ x!6", G: "~@2 x ~ x!3 ~@5 x ~@3", H: "~@2 x ~ x!2 ~@2", I: "~@4 x ~@3 x ~ x ~ x!4",
  J: "~ x ~@2 x ~@2 x", K: "~@3 x", L: "~@2 x ~@3 x ~ x ~ x!2 ~@4", M: "~@4 x ~@5 x!6", N: "x ~ x!7 ~@7",
})).gain(0.6)

// drums · low tom
const low_tom = s("lt").struct("<~@23 A ~@35 B ~@7 B ~@21 C ~ B ~@28>".pickRestart({
  A: "~@7 x ~@8", B: "~@15 x", C: "~@3 x ~@2 x ~",
})).gain(0.6)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@15 A ~@7 B ~@25 C ~@9 D ~@7 D ~@3 C ~@17 E ~ D ~@9 C ~@18>".pickRestart({
  A: "~@4 x!3 ~@9", B: "~@3 x ~@4", C: "~@12 x!3 ~", D: "~@7 x", E: "~@5 x ~@5 x ~@4",
})).gain(0.6)

// drums · high tom
const high_tom = s("ht").struct("<~@15 A ~@7 B ~@25 C ~@9 D ~@7 D ~@3 C ~@17 E ~ D ~@9 C ~@18>".pickRestart({
  A: "~ x ~@6", B: "~@4 x!2 ~@10", C: "~@5 x ~@2", D: "~@12 x!2 ~@2", E: "~@2 x ~ x!2 ~@2",
})).gain(0.6)

// drums · crash
const crash = s("cr").struct(`<
  ~@15 A ~@7 A ~@5 A ~@4 B ~@7 B ~@3 B ~@3 B ~@5 B ~@3 B ~@7 B ~@23 B ~@5 B ~@3 B ~@5 B ~@7 A ~@3
>`.pickRestart({
  A: "~ x", B: "x",
})).gain(0.6)

// drums · ride
const ride = s("rd").struct("<~@23 A B@5 C ~@20 B@6 ~@36 B@6 ~@4 B@6 ~@12>".pickRestart({
  A: "~@4 x!4", B: "x!8", C: "x!4 ~@4",
})).gain(0.6)

stack(bass, piano, kick, snare, low_tom, hihat, mid_tom, high_tom, crash, ride)

More by John Mellencamp