Strudelify

Dirty Laundry

Don Henley

KeyB♭ majorTempo114 bpm
0:00/0:00
// Dirty Laundry — Don Henley
// 114 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 113 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): ElecGtr.
setcpm(114/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 · drawbar organ · "Organ"
const drawbar_organ = note(`<
  A@7 B A@7 B A@7 B A@5 C A@2 D E A@2 D E ~@2 A@5 F A B A@5 F A B A@5 C A@2 D E A@2 D E ~@2 G@5 H G I G@5 H G J G@5 H G
  J G@5 H G J G@5 H G K ~
>`.pickRestart({
  A: "[f4,bb4,c5,eb5]@2 ~ [f4,bb4,c5,eb5]!4 ~ [f4,bb4,c5,eb5] ~ [f4,bb4,c5,eb5] ~ [f4,bb4,c5,eb5] ~ [f4,bb4,c5,eb5] ~", // Fsus4
  B: "[f4,bb4,c5,eb5]@2 ~ [f4,bb4,c5,eb5]!4 ~ [bb3,eb4,g4]@3 ~ [bb3,d4,f4]@3 ~", // Fsus4 Eb Bb
  C: "[f4,bb4,c5,eb5]@2 ~ [f4,ab4,bb4,c5,eb5]!4 ~ [f4,ab4,bb4,c5,eb5] ~ [f4,ab4,bb4,c5,eb5] ~ [f4,ab4,bb4,c5,eb5] ~ [f4,ab4,bb4,c5,eb5] ~, ab4 ~@15", // Fsus4 Fm7
  D: "[eb4,g4,bb4,c5]@5 ~@3 [d4,f4,bb4]@5 ~@3", E: "[c4,eb4,ab4]@5 ~@3 [bb3,eb4,g4]@5 ~@3",
  F: "[f4,ab4,bb4,c5,eb5]@2 ~ [f4,ab4,bb4,c5,eb5]!4 ~ [f4,ab4,bb4,c5,eb5] ~ [f4,ab4,bb4,c5,eb5] ~ [f4,ab4,bb4,c5,eb5] ~ [f4,ab4,bb4,c5,eb5] ~", // Fm7
  G: "[g4,c5,d5,f5]@2 ~ [g4,c5,d5,f5]!4 ~ [g4,c5,d5,f5] ~ [g4,c5,d5,f5] ~ [g4,c5,d5,f5] ~ [g4,c5,d5,f5] ~", // Gsus4
  H: "[g4,bb4,c5,d5,f5]@2 ~ [g4,bb4,c5,d5,f5]!4 ~ [g4,bb4,c5,d5,f5] ~ [g4,bb4,c5,d5,f5] ~ [g4,bb4,c5,d5,f5] ~ [g4,bb4,c5,d5,f5] ~", // Gm7
  I: "[g4,c5,d5,f5]@2 ~ [g4,c5,d5,f5]!4 ~ [c4,f4,a4]@3 ~ [c4,e4,g4]@3 ~", // Gsus4 F C
  J: "[g4,c5,d5,f5]@2 ~ [g4,c5,d5,f5]!4 ~ [g4,c5,d5,f5] ~ [g4,c5,d5,f5] ~ [c4,e4,g4]@2 [g4,c5,d5,f5] ~, ~@8 [c4,f4,a4]@2 ~@2 [c5,d5,f5] ~@3", // Gsus4 C Gsus4 F Dm7
  K: "[g4,c5,d5,f5]@2 ~ [g4,c5,d5,f5]!4 ~ [g4,c5,d5,f5] ~ [g4,c5,d5,f5] ~ [c4,e4,g4]@3 ~, ~@8 [c4,f4,a4]@2 ~@2 [c5,d5,f5] ~@3", // Gsus4 C F Dm7
})).s("gm_drawbar_organ").gain(0.12).pan(0.9)

// bass · slap bass 2 · "Bass"
const bass = note(`<
  A@2 B@2 C@2 A D A@2 B@2 C@2 A D A@2 B@2 C@2 A D A@2 B@2 C@2 A@2 E F A@2 E F G H A@2 B@2 C@2 A D A@2 B@2 C@2 A D A@2
  B@2 C@2 A@2 E F A@2 E F G I J@2 A@2 K@2 J L J@2 A@2 K@2 J L J@2 A@2 K@2 J L J@2 A@2 K@2 J L J@2 A@2 K@2 J L ~
>`.pickRestart({
  A: "f1@4 ~@2 f1 ~ f1 ~@3 f1 ~@3", B: "eb1@4 ~@2 eb1 ~ eb1 ~@3 eb1 ~@3", C: "bb1@4 ~@2 bb1 ~ bb1 ~@3 bb1 ~@3",
  D: "f1@4 ~@2 f1 ~ c2@3 ~ eb2@3 ~", E: "c2 ~ c2 ~ c2 ~ c2 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~",
  F: "ab1 ~ ab1 ~ ab1 ~ ab1 ~ eb1 ~ eb1 ~ eb1 ~ eb1 ~", G: "f1@3 ~ f1@3 ~ f1@3 ~ f1@3 ~",
  H: "f1@3 ~ f1@3 ~@5 eb1 ~ e1 ~", I: "f1@3 ~ f1@3 ~@5 f1 ~ gb1 ~", J: "g1@4 ~@2 g1 ~ g1 ~@3 g1 ~@3",
  K: "c2@4 ~@2 c2 ~ c2 ~@3 c2 ~@3", L: "g1@4 ~@2 g1 ~ d2@3 ~ f2@3 ~",
})).s("gm_slap_bass_2").gain(0.39)

// chords · overdriven guitar · "ElecGtr"
const overdriven_guitar = note(`<
  A@3 B@2 C D@2 ~@2 E ~ F G ~ H ~@2 E ~ F G ~ H ~@2 E ~ F I ~ J ~@10 E ~ F I ~ H ~@2 E ~ F I ~ H ~@2 K ~ J@2 ~@2 L M ~@8
  N ~ O@2 ~@4 N ~ O@2 ~@4 N ~ O@2 ~ P ~@2 N ~ O@2 ~ P ~@2 N ~ O@2 ~ P ~
>`.pickRestart({
  A: "[[eb4,f4,bb4,c5]@5 [eb4,g4,bb4]]/3", B: "[eb4@2 eb5 [d4,f4,bb4], [f4,bb4,c5]@3 ~]/2",
  C: "[f4,bb4,c5,eb5]@2 [c4,eb4,ab4] [bb3,d4,f4]", D: "[[eb4,f4,bb4,c5]@24 [bb3,eb4,g4]@3 ~ [bb3,d4,f4]@3 ~]/2",
  E: "~ g4", F: "~ d4", G: "~@2 ab4 d4", H: "~@8 f4@3 ~ c5@3 ~", I: "~@3 d4", J: "~@12 d4@3 ~", K: "~@12 g4@3 ~",
  L: "~@4 [c4,eb4,g4,bb4]@3 ~@5 [bb3,d4,f4]@3 ~", M: "~@4 [ab3,c4,eb4]@3 ~@5 [bb3,eb4,g4]@3 ~", N: "~@12 a4@3 ~",
  O: "~@12 e4@3 ~", P: "~@10 [gb4,a4] ~@3 a4 ~",
})).s("gm_overdriven_guitar").gain(0.23)

// chords · overdriven guitar · "ElecGuitar 2"
const overdriven_guitar_2 = note(`<
  ~@8 A@7 B A@7 B A@5 C A@2 D E A@2 D E ~@2 A@5 C A B A@5 C A B A@5 C A@2 D E A@2 D E ~@2 F@5 G F H F@5 G F I F@5 G F I
  F@5 G F I F@5 G F I ~
>`.pickRestart({
  A: "[f3,bb3,c4,eb4]@2 ~ [f3,bb3,c4,eb4]!4 ~ [f3,bb3,c4,eb4] ~ [f3,bb3,c4,eb4] ~ [f3,bb3,c4,eb4] ~ [f3,bb3,c4,eb4] ~", // Fsus4
  B: "[f3,bb3,c4,eb4]@2 ~ [f3,bb3,c4,eb4]!4 ~ [bb2,eb3,g3]@3 ~ [bb2,d3,f3]@3 ~", // Fsus4 Eb Bb
  C: "[f3,ab3,bb3,c4,eb4]@2 ~ [f3,ab3,bb3,c4,eb4]!4 ~ [f3,ab3,bb3,c4,eb4] ~ [f3,ab3,bb3,c4,eb4] ~ [f3,ab3,bb3,c4,eb4] ~ [f3,ab3,bb3,c4,eb4] ~", // Fm7
  D: "[eb3,g3,bb3,c4]@5 ~@3 [d3,f3,bb3]@5 ~@3", E: "[c3,eb3,ab3]@5 ~@3 [bb2,eb3,g3]@5 ~@3",
  F: "[g3,c4,d4,f4]@2 ~ [g3,c4,d4,f4]!4 ~ [g3,c4,d4,f4] ~ [g3,c4,d4,f4] ~ [g3,c4,d4,f4] ~ [g3,c4,d4,f4] ~", // Gsus4
  G: "[g3,bb3,c4,d4,f4]@2 ~ [g3,bb3,c4,d4,f4]!4 ~ [g3,bb3,c4,d4,f4] ~ [g3,bb3,c4,d4,f4] ~ [g3,bb3,c4,d4,f4] ~ [g3,bb3,c4,d4,f4] ~", // Gm7
  H: "[g3,c4,d4,f4]@2 ~ [g3,c4,d4,f4]!4 ~ [c3,f3,a3]@3 ~ [c3,e3,g3]@3 ~", // Gsus4 F C
  I: "[g3,c4,d4,f4]@2 ~ [g3,c4,d4,f4]!4 ~ [g3,c4,d4,f4] ~ [g3,c4,d4,f4] ~ [c3,e3,g3]@2 [g3,c4,d4,f4] ~, ~@8 [c3,f3,a3]@2 ~@2 [c4,d4,f4] ~@3", // Gsus4 C Gsus4 F Dm7
})).s("gm_overdriven_guitar").gain(0.15).pan(0.1)

// drums · kick
const kick = s("bd").struct("<~@8 [x!2]!7 x [x!2]!96 ~>").gain(0.47)

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

// drums · hihat
const hihat = s("hh").struct("<~@8 [x!8]!7 [x!4 ~@4] [x!8]!96 ~>").gain(0.47)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@7 A ~@7 A ~@7 B@2 ~@2 B@2 ~@2 A ~@7 A ~@7 A ~@7 B@2 ~@2 B@2 ~@2 A ~@7 A ~@7 A ~@7 A ~ A ~@5 A ~@8
>`.pickRestart({
  A: "x", B: "x!2",
})).gain(0.47)

// drums · tambourine
const tambourine = s("tb").struct("<[~ x ~ x]!8 [x!4]!7 [x!2 ~@2] [x!4]!95 [x!3 ~] ~>").gain(0.59)

stack(drawbar_organ, bass, overdriven_guitar, overdriven_guitar_2, kick, snare, hihat, crash, tambourine)

More by Don Henley