Strudelify
Boogie Nights cover art

1977 · Too Hot to Handle

Boogie Nights

Heatwave

KeyD minorTempo116 bpm
0:00/0:00
// Boogie Nights — Heatwave
// 116 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 103 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(116/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.

// other · orchestral harp · "Harp"
const orchestral_harp = note("<~@5 A B C D ~@88 A B C D E ~>".pickRestart({
  A: "[c4,d4] [e4,f4] [g4,a4] [c5,d5] [e5,f5] [g5,a5] [c6,d6] [e6,f6] [d6,e6] [a5,c6] [f5,g5] [d5,e5] [a4,c5] [f4,g4] [d4,e4] c4", // Csus2 Fmaj7 Gsus2 Csus2 Fmaj7 Gsus2 Csus2 Fmaj7 …
  B: "[d4,e4] [f4,g4] [a4,c5] [d5,e5] [f5,g5] [a5,c6] [d6,e6] [e6,f6] [c6,d6] [g5,a5] [e5,f5] [c5,d5] [g4,a4] [e4,f4] [c4,d4] ~", // Dsus2 Fsus2 Am Dsus2 Fsus2 Am Dsus2 Fmaj7 …
  C: "[bb3,c4] [d4,eb4] [f4,g4] [bb4,c5] [d5,eb5] [f5,g5] [bb5,c6] [d6,eb6] [c6,d6] [g5,bb5] [eb5,f5] [c5,d5] [g4,bb4] [eb4,f4] [c4,d4] bb3", // Bbsus2 Ebmaj7 Fsus2 Bbsus2 Ebmaj7 Fsus2 Bbsus2 Ebmaj7 …
  D: "[c4,d4] [eb4,f4] [g4,bb4] [c5,d5] [eb5,f5] [g5,bb5] [c6,d6] [d6,eb6] [bb5,c6] [f5,g5] [d5,eb5] [bb4,c5] [f4,g4] [d4,eb4] [bb3,c4] ~", // Csus2 Ebsus2 Gm Csus2 Ebsus2 Gm Csus2 Ebmaj7 …
  E: "c4 ~@15",
})).s("gm_orchestral_harp").gain(0.19)

// bass · slap bass 2
const bass = note(`<
  ~ A B C D A B C D E F E F E F E F G H I J E F E F E F E F G H I J E F E F K L K M N L K M E F E F G H I J E F E F E F
  E F G H I J E F E F K L K M N L O M E F E F G H I J E F E F P Q R S P Q R S A B C D T@2
>`.pickRestart({
  A: "d2 f2 a2 c3 e3 c3 d3 b2", B: "c3 b2 a2 g2 f2 g2 e2 d2", C: "c2 d2 eb2 f2 g2 bb2 c3 d3",
  D: "eb3 d3 c3 bb2 g2 f2 eb2 c2", E: "d2@6 a2@2 e3@3 c3@3 d3@2", F: "d2@3 d3 c2 c3 db2 db3", G: "g1@2 ~@5 g1 g1@2 ~@6",
  H: "f1@2 ~@5 f1!2 ~@7", I: "e1@2 ~@5 e1!2 ~@3 f1@2 g1 ~", J: "a1@2 ~@2 a1@2 ~ a1!2 ~ a1 ~ c2@2 d2 ~",
  K: "g1@2 ~ g1 f1@2 ~ d1 c1 ~@5 c1@2", L: "d1 ~ f1@2 g1@2 bb1@4 g1 ~ f1@2 d1 ~",
  M: "d1@2 f1@2 g1 ~ bb1@4 g1 ~ f1@2 d1 ~", N: "g1@2 ~ g1 f1@3 d1 c1 ~@5 c1@2", O: "g1@2 ~ g1 f1@2 ~ d1 c1 ~@5 c1 ~",
  P: "d2@4 d1@2 a2 ~ e3@2 ~ c3@3 d3 ~", Q: "d2@4 d1@2 a2@2 d2@2 d3 ~ db2@2 db3 ~", R: "c2@5 ~ g2@2 d3@2 ~ bb2@2 ~ c3@2",
  S: "c2@6 c3 ~ c2@2 c3@2 db2@2 db3@2", T: "d1/2",
})).s("gm_slap_bass_2").gain(0.4)

// bass · synth bass 1
const bass_2 = note(`<
  ~@9 A B A B A B A B ~@4 C B A B A B A B ~@4 C B C B ~@8 A B A B ~@4 A B A B A B A B ~@4 C B C B ~@8 A B C B ~@4 A B A
  B D E F G D E F G ~@4 H I
>`.pickRestart({
  A: "d2@2 a2 d3@2 a2 c3@3 ~ db3@3 ~ d3@2", B: "d2@2 a2 d3@2 a2 c3@2 c2@2 c3@2 db2@2 db3 ~",
  C: "d2@2 a2 d3@2 a2 c3@4 db3@3 ~ d3@2", D: "d1@2 c3@2 a2@2 d3@4 a2 ~ c3@2 a2 ~", E: "d1 a2 c3 a2 d1 d3 db1 db3",
  F: "c1@2 g2@2 bb2@2 g2@2 ~@2 c3@2 ~ g2 bb2@2", G: "c1@2 g2@2 bb2@2 g2@2 c1@2 c3@2 db1@2 db3 ~",
  H: "d1!2 d2!2 d1!2 d2!2 d1!2 d2!2 d1!2 d2!2", I: "d1",
})).s("gm_synth_bass_1").gain(0.25)

// bass · synth bass 1 · soft notes
const bass_soft = note("<~@37 A ~ A ~ A ~ A ~@25 A ~ A ~ A ~ A ~@27>".pickRestart({
  A: "[bb3,d4,f4]@4 [c4,e4,g4]@4 [bb3,d4,f4,a4] ~@7", // Bb C Bbmaj7
})).s("gm_synth_bass_1").gain(0.16)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~ A@2 B@2 A@2 B@2 ~@8 C@2 D@2 ~@8 C@2 D@2 ~@16 C@2 D@2 ~@8 C@2 D@2 ~@16 C@2 D@2 ~@4 E@2 F@2 G@2 F@2 A@2 B@2 A@2
>`.pickRestart({
  A: "[e5,f5,a5,e6]/2", B: "[d5,eb5,g5,d6]/2", C: "[[f3,bb3] a3, d4, ~@16 f3 ~@15]/2",
  D: "[[g3,b3]@23 ~ [g3,b3,d4] ~ [g3,b3,d4] ~ [g3,b3,d4] ~@3, d4 ~@31]/2", E: "[e5@7 eb5, ~@28 d5 ~@3]/2",
  F: "[d5@6 g5 f5]/2", G: "e5/2",
})).s("gm_string_ensemble_1").gain(0.28).pan(0.3)

// chords · brass section · "Brass 1"
const brass_section = note("<~@37 A ~ A ~ A ~ A ~@25 A ~ A ~ A ~ A ~@10 B@3 ~@12 C ~>".pickRestart({
  A: "[f3,bb3,d4]@4 [g3,c4,e4]@4 [bb3,d4,f4] ~@7", // Bb C Bb
  B: "[~@10 [eb4,g4,bb4] [e4,ab4,b4] [f4,a4,c5]@14 [e4,g4,b4] [d4,f4,a4] [e4,g4,b4]@6 [d4,f4,a4] [c4,e4,g4] [d4,f4,a4]@6 [c4,e4,g4] [a3,d4,f4] [c4,e4,g4]@2 [a3,d4,f4] ~]/3", // Eb E F Em Dm Em Dm C …
  C: "d2",
})).s("gm_brass_section").gain(0.35).pan(0.7)

// chords · electric guitar clean · "Clean Gt."
const electric_guitar_clean = note(`<
  ~ A B C D E B C F G@8 ~@4 G@8 ~@4 H@4 I J I J I J I J H@4 ~@4 H@8 ~@4 H@4 I J I J I J I J H@4 ~@4 H@6 K@2 H@2 K@2 H@2
  K L@3
>`.pickRestart({
  A: "~ [g3,a3,c4] ~@2 [g3,a3,c4] ~@3 [g3,a3,c4] ~@2 [g3,a3,c4] ~@4", // Am7
  B: "~ [g3,a3,c4] ~@2 [g3,a3,c4]!2 ~@2 [g3,a3,c4] ~@2 [g3,a3,c4] ~@4", // Am7
  C: "~ [f3,g3,bb3] ~@2 [f3,g3,bb3] ~@3 [f3,g3,bb3] ~@2 [f3,g3,bb3] ~@4", // Gm7
  D: "~ [f3,g3,bb3] ~@2 [f3,g3,bb3]!2 ~@2 [f3,g3,bb3] ~@2 [f3,g3,bb3] ~@4", // Gm7
  E: "~ [g3,a3,c4] ~@2 [g3,a3,c4] ~@3 [g3,c4] ~@2 [g3,a3,c4] ~@4", // Am7 C5 Am7
  F: "~ [f3,g3,bb3] ~@2 [f3,g3,bb3]!2 ~@2 [f3,g3,bb3] ~@7", G: "[c4,f4] ~@2 [c4,f4]!2 ~@3 [c4,f4]!2 ~@2 [c4,f4] ~@3",
  H: "[c4,f4] ~@3 [c4,f4] ~@3 [c4,f4] ~@3 [c4,f4] ~@3", // F5
  I: "[f3,bb3] ~ [bb3,d4,g4]!2 [f3,bb3] f3 [bb3,d4] [bb3,d4,g4] [f3,bb3]!2 [bb3,d4,g4]!2 [f3,bb3]!2 [bb3,d4,g4]!2", // Bb5 Gm Bb5 Bb Gm Bb5 Gm Bb5 …
  J: "[f3,bb3]!2 [bb3,d4,g4]!2 [f3,bb3]!2 [bb3,d4,g4]!2 [f3,bb3]!2 [bb3,d4,g4]!2 [f3,bb3]!2 [bb3,d4,g4]!2", // Bb5 Gm Bb5 Gm Bb5 Gm Bb5 Gm
  K: "[bb3,eb4] ~@3 [bb3,eb4] ~@3 [bb3,eb4] ~@3 [bb3,eb4] ~@3", // Eb5
  L: "[[bb3,eb4] ~@3 [bb3,eb4] ~@3 [bb3,eb4] ~@3 eb4@36]/3", // Eb5
})).s("gm_electric_guitar_clean").gain(0.25).pan(0.2)

// chords · electric guitar clean · "Clean Gt." · soft notes
const electric_guitar_clean_2 = note(`<
  ~@33 A@4 B ~ B ~ B ~ B ~ A@4 ~@4 A@8 ~@4 A@4 B ~ B ~ B ~ B ~ A@4 ~@4 A@6 C@2 A@2 C@2 A@2 C@2 ~@2
>`.pickRestart({
  A: "~@3 [c4,f4] ~@5 [c4,f4] ~@6", B: "~ [f3,bb3] ~@3 bb3 g4 ~@9", C: "~@3 [bb3,eb4] ~@5 [bb3,eb4] ~@6",
})).s("gm_electric_guitar_clean").gain(0.16).pan(0.2)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@2 A ~ A ~ A ~@5 B ~@3 B ~@7 B ~@3 B ~@7 B ~@7 C ~@3 B ~@7 B ~@3 B ~@7 B ~@7 C ~@3 B ~@7 B ~@3 B ~@3 B ~@3 B ~@2
>`.pickRestart({
  A: "~@13 x ~@2", B: "~@11 x ~@4", C: "~@7 x ~@8",
})).gain(0.3)

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

// drums · low tom
const low_tom = s("lt").struct("<~@8 [~@8 x ~@2 x!2 ~ x ~] ~@94>").gain(0.54)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@9 A B C D A B C D E ~ C ~ A B C D A B C D E ~ C ~ A B C D F B G D A H B ~ A B C D E ~ C ~ A B C D A B C D E ~ C ~ A
  B C D F B G D A H B ~ A B C D E ~ C ~ A B C D A B C D A B C D A B C D ~@2
>`.pickRestart({
  A: "~@3 x ~ x ~ x", B: "~ x ~ x ~ x ~@2", C: "~ x ~@3 x ~ x", D: "~@3 x ~@4", E: "~@5 x ~@2", F: "~@5 x ~ x",
  G: "~ x ~ x ~ x ~ x", H: "~ x ~ x ~@3 x",
})).gain(0.24)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 [~@5 x ~@10] ~@94>").gain(0.54)

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

// drums · high tom
const high_tom = s("ht").struct("<~@8 [~ x ~@6] ~@94>").gain(0.54)

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

// drums · ride
const ride = s("rd").struct("<~ A B C D A B C E ~@94>".pickRestart({
  A: "~@4 x ~ x!3 ~ x ~ x ~ x ~", B: "~@2 x ~ x ~ x!3 ~ x!3 ~@3", C: "~@3 x!2 ~ x!3 ~ x!3 ~ x!2",
  D: "x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~", E: "x ~ x!3 ~ x ~ x ~ x ~@5",
})).gain(0.48)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~ A B C ~ A B C ~@95>".pickRestart({
  A: "~@2 x!2 ~@7 x ~@3 x", B: "x ~@2 x ~@12", C: "~ x ~@6",
})).gain(0.3)

stack(
  orchestral_harp, bass, bass_2, bass_soft, string_ensemble_1, brass_section, electric_guitar_clean,
  electric_guitar_clean_2, kick, snare, snare_soft, clap, low_tom, hihat, hihat_soft, mid_tom, open_hat, high_tom,
  crash, ride, ride_soft
)

More by Heatwave