Strudelify

Lightning Strikes Again

Christie Lou

KeyE♭ majorTempo132 bpm
0:00/0:00
// Lightning Strikes Again — Christie Lou
// 132 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 106 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(132/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 · piano · "Ac Piano"
const piano = note(`<
  A B C D A B C D A B C D A B C D E F G H E F G H I@3 J K@2 L@2 M N O P A B C D A B C D E F G H E F Q H I@3 J K@2 L@2 M
  N O P A B C D A B C D E F G H E F Q H I@3 J K@2 L@2 K@2 L@2 K@2 L@2 M N O P A B C D R@2
>`.pickRestart({
  A: "[eb5,g5,bb5]@7 ~ [eb5,g5,bb5]@7 ~", B: "[eb5,g5,bb5]@6 ~@2 [f5,ab5,db6]@3 ~ [eb5,ab5,c6]@3 ~",
  C: "[eb5,g5,bb5]@6 ~@2 [eb5,g5,bb5]@7 ~", D: "[eb5,g5,bb5]@7 ~ [f5,ab5,db6]@3 ~ [eb5,ab5,c6]@3 ~",
  E: "[e5,g5] c5 [e5,g5] c5 [e5,g5] c5 [e5,g5] c5", F: "[f5,a5] d5 [f5,a5] d5 [f5,a5] d5 [f5,a5] d5",
  G: "[g5,b5] d5 [g5,b5] d5 [g5,b5] d5 [g5,b5] f5", H: "[g5,c6]@2 e5@2 [g5,c6]@2 e5@2 [g5,c6]@2 e5@2 [g5,c6]@2 e5 ~",
  I: "[c5,e5,g5]@3 ~ [c5,e5,g5]@3 ~ [c5,e5,g5]@3 ~ [c5,e5,g5]@3 ~", // C
  J: "[c5,e5,g5]@3 ~ [e5,g5] ~ c6@2 [c4,c5] ~ [c4,c5,c6] ~ [c4,c5,c6] ~ [c4,c5,c6] ~, ~@4 c5@2 c4 ~@9", // C Em C
  K: "[[ab4,c5,eb5]@6 f3@2 [ab4,c5,eb5]@4 f3@2 ~@6 ab4 ~@3 f3 ~ f3@2 [ab4,c5,eb5]@2 f3 ~, f3@4 ~@10 [ab4,c5,eb5]@7 ~ [ab4,c5,eb5]@5 ~@5, ~@16 f3@7 ~@9]/2", // Ab
  L: "[[bb4,d5,f5]@4 bb4 ~ bb4@2 g3@2 bb4@2 g3@2 bb4@2 c4@2 bb4 ~ [c4,c5,e5]@2 bb4 ~ [bb4,c5,e5] ~ bb4@2 c4@2 [c4,bb4] ~, g3@6 [d5,f5]@6 ~@2 [c5,e5]@5 ~ bb4 ~@3 c4@2 [c5,e5]@5 ~]/2", // Bb C C7 Dm C
  M: "[c5,eb5]@4 ab4 ~ ab4@2 f3@2 ab4@3 ~ f3@2, f3@7 ~@9, ab4@3 ~@3 [c5,eb5]@7 ~@3", // Cm
  N: "[ab4,c5,eb5]@2 f3@2 [ab4,c5,eb5]@2 ~@2 [ab4,c5,eb5] ~@3 f3@4, ~@3 f3@2 [ab4,c5,eb5]@2 ~", // Ab
  O: "[g3,bb4,d5,f5]@2 g3 bb4 g3 bb4 g3 c4, ~@3 [d5,f5]@3 ~@2", // Gm7 Dm
  P: "[bb4,c5,e5]@2 c4@2 ~@2 c4 ~ c4 ~ c6@2 [c4,c6] ~ [c4,c6] ~, ~@4 [bb4,c5,e5]@4 ~@2 c4 ~@5", // C7 C C7
  Q: "[g5,b5] d5 [g5,b5] d5 [g5,b5] d5 [g5,b5] d5", R: "[eb5,g5,bb5]/2",
})).s("gm_piano").gain(0.3)

// bass · electric bass finger · "El Bass"
const bass = note(`<
  A B C D A B C D A B C D A B C D E F G H E F G H I J K L M N O P M N O P A B C D A B C D E F G H E F G H I J K L M N O
  P M N O P A B C D A B C D E F G H E F G H I J K L M N O P M N O P M N O P M N O P A B C D Q@2
>`.pickRestart({
  A: "eb2@5 ~ eb2 ~ eb2@5 ~@3", B: "eb2@5 ~ eb2 ~ eb2@6 bb1@2", C: "eb2@5 ~ eb2 ~ eb2@5 ~ eb2 ~",
  D: "eb2@5 ~ eb2 ~ eb2@6 ~@2", E: "c2@5 ~ c2 ~ c2@8", F: "d2@5 ~ d2 ~ d2@7 ~", G: "g2@5 ~ g2 ~ g2@8",
  H: "c2@4 ~@4 c2@4 g2@3 ~", I: "c3@3 ~ b2@3 ~ a2@3 ~ g2@3 ~", J: "c3@3 ~ b2@3 ~ a2@3 ~ g2@2 ~@2",
  K: "c3@3 ~ b2@3 ~ a2@4 g2@3 ~", L: "c3@2 c3 ~ c3 ~ c3 ~ c3@2 c2@2 eb2@4", M: "f2@5 ~ c3@5 ~ ab2@2 g2@2",
  N: "f2@5 ~ c3@6 ab2@2 f2 ~", O: "g2@5 ~ d3@4 bb2@2 g2@4", P: "c2@2 c2@2 d2 ~ d2 ~ eb2@2 eb2 ~ e2@2 e2 ~", Q: "eb2/2",
})).s("gm_electric_bass_finger").gain(0.4)

// bass · electric bass finger · "El Bass" · soft notes
const bass_soft = note(`<
  A ~@2 B A ~@2 B A ~@2 B A ~@2 B ~@3 C ~@3 C ~@12 A ~@2 B A ~@2 B ~@3 C ~@3 C ~@12 A ~@2 B A ~@2 B ~@3 C ~@3 C ~@20 A
  ~@2 B ~@2
>`.pickRestart({
  A: "~@14 eb2 ~", B: "~@14 bb1 ~", C: "~@6 c2 ~@9",
})).s("gm_electric_bass_finger").gain(0.25)

// chords · rock organ · "Rock Orga"
const rock_organ = note(`<
  ~@20 A B@2 C ~ D@2 E F G H I F G H I ~@12 A B@2 C ~ D@2 E F G H I F G H I ~@12 A B@2 C ~ D@2 E F G H I F G H I F G H I
  F G H I J@4 K@2
>`.pickRestart({
  A: "g4@3 g5, [c5,e5]", B: "[~@4 g5@3 f5, [a4,f5]@16 b4@15 ~, ~ d5@31]/2", C: "[g4,c5,e5]", D: "~@12 [c5,c6] ~@3",
  E: "~@4 c6@11 ~", F: "[eb5,ab5,c6]@7 ~ [eb5,ab5,c6]@7 ~, f4@15 ~",
  G: "[eb5,ab5,c6]@7 ~ [eb5,ab5,c6]@3 ~ [eb5,ab5,c6]@3 ~, f4@15 ~", H: "c6@5 ~ bb5@9 ~, [g4,d5,f5]",
  I: "[c4,bb4,e5]@15 ~", J: "[eb5@24 db5@4 [ab4,c5]@4 ~ eb5@23 db5@4 [ab4,c5]@4, eb4@63 ~, bb4@7 ~ bb4@7 ~]/4",
  K: "[eb4,g4,bb4]/2", // Eb
})).s("gm_rock_organ").gain(0.35)

// chords · brass section · "Brass"
const brass_section = note(`<
  ~@4 A@2 B@2 A@2 B@2 A@2 B@2 ~@8 C@3 D E@2 F G E@2 H I A@2 B@2 A@2 B@2 ~@8 C@3 D E@2 F G E@2 H I A@2 B@2 A@2 B@2 ~@8
  C@3 D E@2 F G E@2 F G E@2 F G E@2 H I A@2 B@2 J@2
>`.pickRestart({
  A: "[[eb2,bb2]@5 ~ [eb2,bb2] ~@17 [db4,f4,ab4]@3 ~ [c4,eb4,ab4]@2 ~@2, [bb3,eb4,g4]@21 ~@11, ~@8 [eb2,bb2]@23 ~]/2", // Eb5 Db Ab Eb Eb5
  B: "[[eb2,bb2]@5 ~ [eb2,bb2] ~@17 [db4,f4,ab4] ~ [db4,f4,ab4] ~ [c4,eb4,ab4]@3 ~, [bb3,eb4,g4]@23 ~@9, ~@4 [eb2,bb2]@11 ~]/2", // Eb5 Db Ab Eb Eb5
  C: "c3@3 ~ b2@3 ~ a2@3 ~ g2@3 ~", D: "~@3 c5, c3@15 ~, ~@3 c4@5",
  E: "[[f3,c4,eb4,ab4]@9 ~ [f3,c4,eb4,ab4] ~@3 [f3,c4,eb4,ab4]@17 ~]/2", F: "[g3,bb3,d4,f4]@15 ~",
  G: "[c3,e4]@4 [d3,f4]@4 [eb3,gb4]@3 ~ [e3,g4]@3 ~", H: "[g3,bb3,d4,f4]", I: "e4@10 c4@5 ~, c3@15 ~",
  J: "[eb2,bb2,bb3,eb4,g4]/2", // Eb
})).s("gm_brass_section").gain(0.32)

// other · electric guitar clean · "Solo Gtr"
const electric_guitar_clean = note("<~@64 A B C D@2 E F G ~@34>".pickRestart({
  A: "eb2@2 eb2!2 eb2@2 f2@2 g2@2 f2@2 eb2@2 f2@2", B: "g2 f2 eb2 g2@3 ~@2",
  C: "eb2@2 eb2 eb2@2 eb2 ab2@2 bb2@2 ab2@2 g2@2 ab2@2",
  D: "[bb2@2 ab2@2 g2@2 bb2@2 ~@4 bb1 c2 eb2 eb2@3 bb2 c3@2 eb3 c3@2 bb2@2 g2@2 f2@2 eb2@2]/2",
  E: "g2@2 f2@2 eb2@2 g2@4 bb1 c2@2 eb2 c2@2", F: "eb2 bb2!4 ab2 g2 eb2", G: "bb2 ab2 g2 bb2@5",
})).s("gm_electric_guitar_clean").gain(0.35)

// drums · kick
const kick = s("bd").struct(`<
  A B@2 C A B A@3 B A@3 B A@3 B A B A B@2 C D@12 A B A@3 B A@3 B A B A B@2 C D@12 A B A@3 B A@3 B A B A B@2 C D@20 A@2 B
  A E ~
>`.pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x!2", C: "x ~@2 x!2 ~ x ~", D: "x!4", E: "x",
})).gain(0.6)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  A B C ~ A C A@3 C A@3 C A@3 B A B A B C ~@13 A C A@3 C A@3 B A B A B C ~@13 A C A@3 C A@3 B A B A B C ~@23 C ~@3
>`.pickRestart({
  A: "~@7 x", B: "~@3 x ~@4", C: "~@3 x ~@3 x",
})).gain(0.36)

// drums · clap
const clap = s("cp").struct("<~@24 A@4 B@8 ~@16 A@4 B@16 ~@8 A@4 B@16 ~@6>".pickRestart({
  A: "~@3 x", B: "~ x ~ x",
})).gain(0.54)

// drums · snare
const snare = s("sd").struct(`<
  ~ A ~ B C@12 A@7 B D@3 E D@7 E C@8 A@7 B D@3 E D@7 E C@8 A@7 B D@3 E D@15 E ~@6
>`.pickRestart({
  A: "~@3 x", B: "~@8 x!4 ~@4", C: "~ x ~ x", D: "x!4", E: "x!8",
})).gain(0.54)

// drums · low tom
const low_tom = s("lt").struct("<~@3 A ~@19 A ~@3 B ~@7 B ~@15 A ~@3 B ~@7 B ~@15 A ~@3 B ~@15 B ~@6>".pickRestart({
  A: "~@12 x!4", B: "~@5 x!3",
})).gain(0.54)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@7 A ~@3 A ~@3 A ~@8 B C ~@2 B C ~@2 B C ~@5 A ~@3 A ~@8 B C ~@2 B C ~@2 B C ~@5 A ~@3 A ~@8 B C ~@2 B C ~@2 B C ~@2
  B C ~@2 B C ~@8
>`.pickRestart({
  A: "~ x ~@3 x ~@2", B: "~@3 x ~@3 x", C: "~ x ~@6",
})).gain(0.24)

// drums · mid tom
const mid_tom = s("mt").struct("<~@27 A ~@7 A ~@19 A ~@7 A ~@19 A ~@15 A ~@6>".pickRestart({
  A: "~@3 x!2 ~@3",
})).gain(0.42)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@25 A B C ~ A B@2 ~ A B C ~@17 A B C ~ A B@2 ~ A B C ~@17 A B C ~ A B@2 ~ A B@2 ~ A B@2 ~ A B C ~@6
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@7 x", C: "~@2 x!2 ~@4",
})).gain(0.48)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@27 A ~@7 A ~@19 A ~@7 A ~@19 A ~@15 A ~@6>".pickRestart({
  A: "~ x ~@6",
})).gain(0.3)

// drums · high tom
const high_tom = s("ht").struct("<~@27 A ~@7 A ~@19 A ~@7 A ~@19 A ~@15 A ~@6>".pickRestart({
  A: "~ x ~@2",
})).gain(0.36)

// drums · high tom · soft notes
const high_tom_soft = s("ht").struct("<~@27 A ~@7 A ~@19 A ~@7 A ~@19 A ~@15 A ~@6>".pickRestart({
  A: "~ x ~@6",
})).gain(0.24)

// drums · crash
const crash = s("cr").struct(`<
  ~@24 A ~@3 A ~@3 A ~@19 A ~@3 A ~@3 A ~@19 A ~@3 A ~@7 A ~@3 A ~@3 A ~ A ~ A ~
>`.pickRestart({
  A: "x",
})).gain(0.48)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@4 A ~@3 A ~@3 A ~@23 A ~@3 A ~@23 A ~@3 A ~@37>".pickRestart({
  A: "x",
})).gain(0.24)

// drums · tambourine
const tambourine = s("tb").struct(`<
  A@16 ~@8 B@4 C@8 B@8 ~@7 A B@3 D C@8 B@8 ~@4 A@4 B@3 D C@16 D@2 E F G ~
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "x!4", D: "~ x!3", E: "x ~ x!5 ~", F: "x!2 ~ x", G: "x",
})).gain(0.54)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@55 A ~@27 B ~@16 C@2 D E ~@2>".pickRestart({
  A: "~@3 x ~ x ~ x", B: "~@5 x ~ x", C: "x!2 ~ x ~ x ~ x", D: "~ x ~@5 x", E: "~ x ~ x!3 ~ x",
})).gain(0.3)

stack(
  piano, bass, bass_soft, rock_organ, brass_section, electric_guitar_clean, kick, kick_soft, clap, snare, low_tom,
  hihat, hihat_soft, mid_tom, open_hat, open_hat_soft, high_tom, high_tom_soft, crash, crash_soft, tambourine,
  tambourine_soft
)