Strudelify

(Love Is Like a) Heat Wave

Reeves

KeyG♯ minorTempo164 bpm
0:00/0:00
// (Love Is Like a) Heat Wave — Reeves
// 164 bpm, 4/4, key G# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 74, 4/4 at bar 75) are rendered on a constant 4/4 grid of one bar per cycle
// note: duplicate parts dropped: ch 5 "TENOR SAX" tenor sax (copy of ch 4 "BRASS 1" brass section)
// note: Full arrangement: all 126 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(164/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A B A C D E F G H E I J K L M N O P@2 Q R S I T R E U G K L V N O W@4 X@3 D S I Y Z@2 AA J K L AB N O AC O W@2 AD@2
  AE AF AG AH AI AJ AK AH AL K AM AN AO Q AP@2 AQ AR AS@2 I AT K L AU N AC AV AW@2 AX AY AP@2 AQ AZ BA L V BB AC Q BC BD
  AQ BE BF@2 BG BH BA AM AN BI BJ AC O W@2 AD@2 AE D BK BL@2
>`.pickRestart({
  A: "f#2 ~ f#2 ~ f#2 ~ f#2 ~", B: "f#2@2 ~@2 f#2@2 ~@2 f#2@2 ~@2 f#2@3 c#2",
  C: "f#2 ~@3 f#2@2 ~ g#2@3 ~@2 d#2@2 ~@2, ~@11 f#2@2 ~@3", D: "c#2@3 ~@4 c#2@7 ~ d2", E: "d#2@3 ~@4 d#2@6 ~@2 d#2",
  F: "g#2@3 ~@4 g#2@7 ~ d#2", G: "g#2@4 ~@3 g#2@5 d#2@4", H: "c#2@3 ~@4 c#2@9", I: "g#2@3 ~@4 g#2@6 ~@2 d#2",
  J: "g#2 f#2 d#2 d2", K: "c#2 d#2 e2 c#2", L: "d#2 e2 f#2 d#2", M: "e2 f#2 g#2 e2", N: "f#2 g#2 a#2 f#2",
  O: "b2 g#2 f#2 g#2", P: "[b2@4 g#2@4 f#2@4 g#2@3 ~ b2@4 g#2@4 f#2@4 g#2@3 ~, ~@15 f#2@2 ~@15]/2",
  Q: "b2@2 ~@2 f#2@2 ~ g#2@2 ~@2 f#2 d#2@2 ~@2", R: "c#2@4 ~@3 c#2@8 d2", S: "d#2@3 ~@4 d#2@8 ~",
  T: "g#2@3 ~@4 g#2@5 d#2@3 d2", U: "g#2@4 ~@3 g#2@7 ~ d#2", V: "e2@4 f#2@3 ~ g#2@4 e2@4",
  W: "[b2@4 g#2@4 f#2@4 g#2@3 ~ b2@4 g#2@4 f#2@4 g#2@4, ~@15 f#2@2 ~@15]/2",
  X: "[b2@4 g#2@4 f#2@4 g#2@3 ~ b2@4 g#2@4 f#2@4 g#2@3 ~ b2@2 ~@2 f#2@2 ~ g#2@2 ~@2 f#2 d#2@2 ~@2, ~@15 f#2@2 ~@14 f#2@2 ~@15]/3",
  Y: "g#2@3 ~@4 g#2@5 d#2@4", Z: "[c#2@3 ~@4 c#2@8 ~ d#2@3 ~@3 d#2@6 ~@3 d#2, ~@15 d2@2 ~@15]/2",
  AA: "g#2@4 ~@3 g#2@6 ~@2 d#2", AB: "e2@4 f#2@4 g#2@4 e2@3 ~", AC: "b2@4 g#2@4 f#2@4 g#2@3 f#2",
  AD: "[b2@4 g#2@4 f#2@4 g#2@3 ~ b2@4 g#2@4 f#2@4 g#2@3 f#2, ~@15 f#2@2 ~@15]/2",
  AE: "b2 ~@3 f#2@2 ~ g#2@2 ~@2 f#2 d#2@2 ~@2", AF: "c#2@3 ~ b1@4 c#2@4 d2@4", AG: "d#2@4 c#2@4 d#2@4 f#2@3 ~",
  AH: "g#2 f#2 d#2 f#2", AI: "g#2@2 a#2@2 b2@2 g#2 ~", AJ: "c#2 b1 c#2 d2", AK: "d#2 c#2 d#2 f#2",
  AL: "g#2@4 f#2@4 d#2@4 d2@3 ~", AM: "d#2@4 e2@4 f#2@3 ~ d#2@4", AN: "e2@4 f#2@3 ~ g#2@3 ~ e2@4",
  AO: "f#2@4 g#2@4 a#2@4 f#2@3 ~", AP: "[c#2@3 ~@4 c#2@7 ~@2 d#2@3 ~@4 d#2@8 ~, ~@15 d2@2 ~@15]/2",
  AQ: "g#2@3 ~@4 g#2@3 ~@2 f#2@3 ~, ~@11 d#2@2 ~@3", AR: "g#2@2 ~@5 g#2@5 d#2@3 ~",
  AS: "[c#2@2 ~@5 c#2@7 ~@2 d#2@3 ~@3 d#2@6 ~@3 [d#2,e2], ~@15 d2@2 ~@15]/2", AT: "g#2@4 f#2@3 ~ d#2@4 d2@3 ~",
  AU: "e2@4 f#2@4 g#2@3 ~ e2@4", AV: "b2@2 ~@2 f#2@3 g#2@2 ~@2 f#2 d#2@2 ~@2",
  AW: "[c#2@3 ~@4 c#2@8 ~ d#2@3 ~@4 d#2@7 ~@2, ~@15 d2@2 ~@15]/2", AX: "g#2@2 ~@5 g#2@7 ~ f#2",
  AY: "g#2@3 ~@4 g#2@5 d#2@3 ~", AZ: "g#2@3 ~@3 g#2@5 ~ d#2@3 ~", BA: "c#2@4 d#2@4 e2@3 ~ c#2@4",
  BB: "f#2@4 g#2@4 a#2@3 ~ f#2@3 ~", BC: "c#2@3 ~@3 c#2@8 ~@2", BD: "d#2@3 ~@3 d#2@7 ~@3",
  BE: "g#2@3 ~ f#2@3 ~ d#2@3 ~ d2@3 ~", BF: "[c#2@3 ~@4 c#2@7 ~@2 d#2@3 ~@3 d#2@7 ~@3, ~@15 d2@2 ~@15]/2",
  BG: "g#2@3 ~@4 g#2@3 ~@2 f#2@2 ~@2, ~@11 d#2@2 ~@3", BH: "g#2@4 ~@3 g#2@5 d#2@3 ~",
  BI: "f#2@4 g#2@3 ~ a#2@3 ~ f#2@3 ~", BJ: "~ g#2 f#2 g#2, b2@3 ~@5",
  BK: "d#2@3 ~@4 d#2@3 ~@2 f#2@2 ~ d#2, ~@11 d#2@2 ~@3", BL: "[g#2@2 ~@5 g#2@21 ~@4]/2",
})).s("gm_acoustic_bass").gain(0.56)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  ~ A B C@2 D E F G H I J K H I L M N@2 O@2 D E F G H I J K P I Q M N@6 O@2 R E F G H I J K P I Q M N@6 O@2 R E F G H I
  J K P I Q M S R E F G H I J K P I Q M O@2 R E F G H I J K P I Q M O@2 R E F G H I J K P I Q M N@6 O@2 R E T@2
>`.pickRestart({
  A: "[a#3,c#4,f#4]@3 f#3 [b3,d#4,f#4]@3 f#3 [a#3,c#4,f#4]@3 f#3 [b3,d#4,f#4]@3 f#3", // F# B F# B
  B: "[a#3,c#4,f#4]@3 f#3 [b3,d#4,f#4]@3 f#3 [a#3,c#4,f#4]@3 ~ [b3,d#4,f#4]@3 f#3, ~@11 f#3@2 ~@3", // F# B F# B
  C: "[[a#3,c#4,f#4]@3 f#3 [b3,d#4,f#4]@3 f#3 [a#3,c#4,f#4]@3 f#3 [b3,d#4,f#4]@3 ~ [a#3,c#4] ~@3 [f#3,f#4]@3 [g#3,g#4]@3 ~@2 d#3@2 ~@2, ~@8 d4 ~@6 f#3@3 ~@8 f#3@2 d#4 ~@3, ~@16 f#4@2 ~@9 f#4@2 ~@3]/2", // F# B F# B A#m F# G#
  D: "[c#3,b3,g#4] ~@5 [c#3,b3,e4,g#4]@8 ~@2, e4 ~@7", // C#7 C#m7
  E: "[d#3,c#4,f#4]@2 ~@5 [d#3,f#4]@7 ~@2, a#4 ~@5 [c#4,a#4]@7 ~@3", // D#m7 D#m F#
  F: "[g#3,b3,d#4,g#4] ~@5 [g#3,b3,d#4,f#4,g#4]@8 ~@2, f#4 ~@7", // G#m G#m7
  G: "[g#3,b3,d#4,f#4,g#4] ~@6 f#4@9, ~@6 [g#3,b3,d#4,g#4]@9 ~", // G#m7 G#m
  H: "[c#3,b3,g#4] ~@6 e4@8 ~, e4@2 ~@4 [c#3,b3,g#4]@9 ~", I: "[d#3,c#4,f#4,a#4] ~@6 [d#3,c#4,f#4]@8 ~, ~@7 a#4@6 ~@3",
  J: "[g#3,b3,d#4,f#4,g#4] ~@6 g#3@8 ~, ~@6 [b3,d#4,f#4,g#4]@9 ~", // G#m7
  K: "[g#3,b3,d#4,f#4,g#4] ~@6 [g#3,b3,f#4,g#4]@9, ~@7 d#4@7 ~@2", L: "[e3,b3,e4,g#4] ~@2 [e3,b3,e4,g#4]@4 ~",
  M: "[f#3,c#4,f#4,a#4] ~@2 [f#3,c#4,f#4]@4 ~, ~@3 a#4@3 ~@2", // F# F#5
  N: "[[d#4,f#4,b4]@3 ~ [e4,g#4,b4]@3 b3 [d#4,f#4,b4]@3 ~ [e4,g#4,b4]@3 ~ [d#4,f#4,b4]@3 b3 [e4,g#4,b4]@3 b3 [d#4,f#4,b4]@3 b3 [e4,g#4,b4]@3 b3, ~@3 b3@2 ~@6 b3@2 ~@2 b3@2 ~@15]/2", // B E B E B E B E
  O: "[[d#4,f#4,b4]@3 b3 [e4,g#4,b4]@3 b3 [d#4,f#4,b4]@3 b3 [e4,g#4,b4]@3 ~ [f#4,b4]@2 ~@2 [f#3,f#4]@3 [g#3,g#4]@3 ~@2 d#3@2 ~@2, ~@15 b3@3 ~@8 f#3@2 d#4 ~@3, ~@16 d#4 ~@10 f#4@2 ~@3]/2", // B E B E B5 F# G#
  P: "[c#3,b3,e4,g#4] ~@6 e4@8 ~, ~@6 [c#3,b3,g#4]@9 ~", Q: "[e3,g#4] ~@2 [e3,b3,e4,g#4]@4 ~, [b3,e4] ~@15",
  R: "[c#3,b3,e4,g#4] ~@5 [c#3,b3,e4,g#4]@8 ~@2", // C#m7
  S: "[f#4,b4]@2 ~@2 [f#3,f#4]@3 [g#3,g#4]@3 ~@2 d#3@2 ~@2, d#4 ~@9 f#3@2 d#4 ~@3, ~@11 f#4@2 ~@3", // B5 F# G#
  T: "[[g#3,b3,d#4,g#4] ~@5 [g#3,b3,d#4,f#4,g#4]@17 ~@9, f#4 ~@15]/2", // G#m G#m7
})).s("gm_epiano2").gain(0.43)

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

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

// drums · clap
const clap = s("cp").struct("<~ A@19 B A@19 B A@19 B A@12 ~ A@47 B A@2 ~@2>".pickRestart({
  A: "~ x ~ x", B: "x",
})).gain(0.5)

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

// drums · hihat
const hihat = s("hh").struct("<~ A@2 B C A@15 ~ A@19 ~ A@19 ~ A@12 ~ A@13 ~ A@13 ~ A@19 ~@5>".pickRestart({
  A: "x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x", B: "x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@3", C: "x",
})).gain(0.5)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 A ~@15 A ~@19 A ~@19 A ~@60 A ~ B ~@2>".pickRestart({
  A: "x", B: "~@11 x!3 ~@2",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@20 A ~@19 A ~@19 A ~@12 A ~@13 A ~@13 A ~@19 A B@3 ~>".pickRestart({
  A: "x", B: "x ~@6 x ~@8",
})).gain(0.5)

// drums · crash
const crash = s("cr").struct("<~@122 [x ~@6 x ~@8]!3 ~>").gain(0.57)

// drums · tambourine
const tambourine = s("tb").struct("<~ A@3 B A@15 B A@19 B A@19 B A@12 B A@13 B A@13 B A@19 B A@2 C ~>".pickRestart({
  A: "x!4", B: "x", C: "x ~@6 x ~@8",
})).gain(0.5)

stack(bass, epiano2, kick, snare, clap, low_tom, hihat, mid_tom, open_hat, crash, tambourine)

More by Reeves