Strudelify

Cruise Control

Bruce Hornsby

KeyB♭ majorTempo200 bpm
0:00/0:00
// Cruise Control — Bruce Hornsby
// 200 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 7 "Vocal Echo" lead 8 bass lead (copy of ch 1 "Vocal" synth choir)
// note: Full arrangement: all 193 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(200/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
const piano = note(`<
  ~@6 A B C ~@5 A B C D@2 E F G@2 H I D@2 E F G@2 H I J@2 K@2 G@2 L M ~@21 A B C D@2 E F G@2 H I D@2 E F G@2 H I J@2 K@2
  G@2 L M ~@21 A B C ~@56 D@2 N@2 G@2 H O ~@5 A B C ~@5 A B C
>`.pickRestart({
  A: "[f4,bb4]@3 ~ [f4,bb4]@3 ~ [f4,c5]@4 [f4,d5]@4", B: "[g4,bb4,eb5]@6 [f4,d5]@5 [eb4,c5]@2 [eb4,bb4]@3",
  C: "[eb4,g4]@3 [eb4,f4]@5", D: "[bb4,d5,f5]/2", E: "[d4,f4]", F: "[bb3,f4]@3 [c4,f4]@5", G: "[f4,a4,c5]/2",
  H: "[eb4,g4,c5]", I: "~@3 f4@5, [bb3,eb4,g4]", J: "~ [f4,bb4,d5]@2 [f4,bb4,d5]@3 ~@2",
  K: "[[d4,f4]@11 [f4,bb4,d5]@5]/2", L: "[eb4,g4,bb4]", M: "[eb4,g4,bb4]@3 [eb4,g4,bb4]@2 g4@3", N: "[d4,f4]/2",
  O: "[bb3,eb4,g4]", // Eb
})).s("gm_piano").gain(0.35)

// chords · drawbar organ · "Organ"
const drawbar_organ = note(`<
  ~@9 A@4 B@2 C D A@4 B@2 C D A@4 B@2 C D A@4 B@2 C D E@2 F@2 G@2 H@2 E@2 F@2 G@2 H@2 A@4 B@2 C D A@4 B@2 C D A@4 B@2 C
  D A@4 B@2 C D E@2 F@2 G@2 H@2 E@2 F@2 G@2 H@2 A@4 B@2 C D I J K@4 L@2 I J K@2 M@4 E@2 F@2 G@2 H@2 E@2 F@2 G@2 H@2 A@4
  B@2 C D A@4 B@2 C D A@4 B@2 C D A@4 B@2 C D A@4 B@2 C D A@4 B@2 C D
>`.pickRestart({
  A: "[~ g4, [f4,bb4,d5]]/4", B: "[f4,a4,c5]/2", C: "[eb4,g4,bb4,c5]", D: "[eb4,g4,bb4]", E: "[f4,bb4,d5]/2",
  F: "[g4,bb4,eb5]/2", G: "[ab4,c5,eb5]/2", H: "[[g4,bb4,eb5]@5 [f4,bb4,d5]@3]/2", I: "[f4,bb4,d5]", J: "[f4,a4,c5]",
  K: "[bb3,eb4,g4]/2", L: "[[f4,bb4,d5]@3 [f4,a4,c5]]/2", M: "[bb3,eb4,g4]/4",
})).s("gm_drawbar_organ").gain(0.12)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~ A B C D E F G H A B C D E F G H A B C D E F G H A B C D E F G H A B C D E F G H A I A I A I J K A I A I A I J K A B
  C D E F G H A B C D E F G H A B C D E F G H A B C D E F G H A I A I A I J K A I A I A I J K A B C D E F G L M N O P
  Q@2 R S M T O P Q U V W A I A I A I J K A I A I A I J K A B C D E F G L A B C D E F G L A B C D E F G L A B C D E F G
  H A B C D E F G H A B C D E F G H
>`.pickRestart({
  A: "bb2@3 bb2@2 bb2!3", B: "bb2@2 bb2@2 bb2@2 bb2 a2", C: "g2@3 g2@2 g2!3", D: "g2@2 g2@2 g2@2 g2 bb2",
  E: "f2@3 f2@2 f2!3", F: "f2!2 f2@2", G: "c2@3 c2@2 c2!3", H: "eb2@2 eb2@2 eb2 f2 gb2 f2",
  I: "bb2@2 bb2@2 bb2@2 g2 f2", J: "bb2@3 bb2@2 bb2!2 eb2", K: "eb2@2 bb2@2 bb2@2 g2 f2",
  L: "eb2@2 eb2@2 eb2 d2 eb2 f2", M: "g2@3 g2@2 g2 c2 db2", N: "d2@3 d2@2 d2 eb2 d2", O: "c2@3 c2@2 c2@2 c2",
  P: "c2@3 c2@2 c2@2 d2", Q: "eb2@3 eb2@2 eb2@2 eb2", R: "bb2@3 bb2@2 bb2@2 f2", S: "bb2!2 a2!2",
  T: "d2@3 d2@2 d2!2 c2", U: "eb2!2 bb2 eb2 eb2@2 eb2@2", V: "eb2!4 eb2@2 eb2@2", W: "eb2!2 f2 g2 bb2 g2 f2 g2",
})).s("gm_electric_bass_finger").gain(0.4)

// chords · lead 8 bass lead · "Synth"
const lead_8_bass_lead = note(`<
  ~ A B A B A C D E A B A B A C D E ~@40 A B A B A C D E ~@40 A B A B A C D E ~@32 A B A B A C ~@2 A B A B A ~@3 A B A B
  A ~@11 A B A B A C D E A B A B A C D E
>`.pickRestart({
  A: "[f4,bb4]@3 ~@3 [g4,c5]@6 ~@4", B: "[f4,bb4]@3 ~ [f4,bb4]@3 ~ [g4,c5]@4 ~@4",
  C: "[f4,bb4]@3 ~ [f4,bb4]@3 ~ [f4,c5]@4 [f4,d5]@4", D: "[g4,bb4,eb5]@6 [f4,d5]@5 [eb4,c5]@2 [eb4,bb4]@3",
  E: "[eb4,g4]@3 [eb4,f4]@5", // Eb Ebsus2
})).s("gm_lead_8_bass_lead").gain(0.52)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~ A@16 ~@40 A@8 ~@40 A@8 ~@7 B ~@7 A ~@16 A@8 C D ~ E F E ~ F ~@2 G E ~@2 H ~@9 A@16
>`.pickRestart({
  A: "~@6 x!2", B: "~@4 x!2 ~@2", C: "x ~@2 x ~@2 x!2", D: "~ x ~@2", E: "~@3 x", F: "~@4 x!3 ~", G: "~@5 x!3", H: "x",
})).gain(0.57)

// drums · hihat
const hihat = s("hh").struct("<~ [x!8]!159 [x!7 ~] [x!8]!7 [x!7 ~] [x!8]!24>").gain(0.29)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@23 B ~@15 C ~ A ~ A ~ A ~ A ~@23 B ~@15 C ~ A ~ A ~ A ~ A ~@13 D E F ~@15 C ~ A ~
  A ~ A ~ A@2 B D G H I J@2 K ~ L G ~ M ~@11 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
>`.pickRestart({
  A: "~@5 x ~@2", B: "~ x", C: "~@6 x!2", D: "~@7 x", E: "~@2 x!2 ~@2 x!2", F: "x!2 ~@3 x ~@2", G: "x!3 ~ x!2 ~@2",
  H: "~@12 x ~@2 x", I: "x ~ x ~ x!3 ~", J: "x ~ x ~ x!3 ~@9", K: "~@5 x!2 ~", L: "~@3 x!2 ~@3", M: "~@2 x!2",
})).gain(0.57)

// drums · open hat
const open_hat = s("oh").struct("<~@167 [x!2]!2 ~@24>").gain(0.57)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@40 A ~@15 B ~@31 A ~@15 B ~@22 C D ~@15 B ~@9 B E ~@2 F G ~ H I J ~@2 K ~@26
>`.pickRestart({
  A: "~@3 x ~@4", B: "~@5 x!2 ~", C: "x!2 ~@6", D: "~@3 x!2 ~@3", E: "x!3 ~@2 x!2 ~", F: "x!3 ~@5",
  G: "~@8 x ~@3 x ~ x!2", H: "~@5 x ~@2", I: "~@7 x", J: "x ~ x!6", K: "~@2 x!3 ~@3",
})).gain(0.57)

// drums · crash
const crash = s("cr").struct(`<
  ~@48 A ~@8 B ~@38 A ~@8 B ~@14 A ~@7 A ~@7 A ~@8 B ~@7 B A ~ C ~@3 D B A ~ A ~@3 D ~@24
>`.pickRestart({
  A: "~@3 x", B: "x", C: "~ x ~ x", D: "~@7 x",
})).gain(0.57)

// drums · ride bell
const ride_bell = s("rd").struct("<~@155 [~@3 x ~@4] ~@3 [~ x] ~@33>").gain(0.57)

// drums · bongos
const bongos = s("bongo:4").struct("<~@161 [~@14 x!2] [x!3 ~] ~@30>").gain(1.5)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@162 [x!3 ~] ~@30>").gain(1.5)

stack(
  piano, drawbar_organ, bass, lead_8_bass_lead, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash,
  ride_bell, bongos, bongos_2
)

More by Bruce Hornsby