Strudelify
Missing You cover art

No Brakes

Missing You

John Waite

KeyG majorTempo106 bpm
0:00/0:00
// Missing You — John Waite
// 106 bpm, 4/4, key G 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.
// note: Guitar parts that double another keep only their own notes (fills, solos): Lead Guit.
setcpm(106/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, A@4 for four bars: edit a riff to change every repeat.

// bass · fretless bass · "Bass Gtr"
const bass = note(`<
  ~ A B C D A B C D A E C D A B C D F G C H A B C D A B C D F I C H A B J H A B C H A B C D A B C D A B C D F G J D A B
  C K A B C D F I C L M N C K A B C O A B C K A E C D F I C P A B C P A B C P A B C P A B C P Q
>`.pickRestart({
  A: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~", B: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1@2 a1@2 b1@2",
  C: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2@2", D: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2@2",
  E: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ a1@2 b1@2", F: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~",
  G: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ d2 ~ d2@2", H: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2@2 f#1@2",
  I: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2@2 d2@2", J: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~",
  K: "d2 ~ d2 ~ d2 ~ d2 ~ d2@2 c2@2 b1@2 a1@2", L: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ c2@2 b1@2",
  M: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~", N: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1@2 b1@2",
  O: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2@2 c2@2", P: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2@2 c2@2 b1@2", Q: "g1",
})).s("gm_fretless_bass").gain(0.41)

// chords · overdriven guitar · "Lead Guit" · D5
const overdriven_guitar = note("<~@72 [~ [a3,d4] ~ a3 [a3,d4]@2 a3@2] ~@33>")
  .s("gm_overdriven_guitar").gain(0.25).pan(0.2)

// other · epiano2 · "E.Piano"
const epiano2 = note("<~@33 A@8 ~@16 A@8 ~@8 A@12 ~@4 A@16 B>".pickRestart({
  A: "[d5,d6] [g5,g6] [a5,a6] [b5,b6]", B: "[g5,g6]@15 ~",
})).s("gm_epiano2").gain(0.48).pan(0.2)

// other · marimba · D G A B G A G D …
const marimba = note(`<
  ~@33
  [[d5,d6] ~ [g4,g5] ~ [a4,a5] ~ [b4,b5] ~ [g4,g5] ~ [g4,g5] ~ [a4,a5] ~ [g4,g5] ~]!8
  ~@16
  [[d5,d6] ~ [g4,g5] ~ [a4,a5] ~ [b4,b5] ~ [g4,g5] ~ [g4,g5] ~ [a4,a5] ~ [g4,g5] ~]!48
  ~
>`).s("gm_marimba").gain(0.46).pan(0.9)

// chords · string ensemble 1 · "Pad"
const string_ensemble_1 = note("<~ A@8 ~@8 B@4 A@8 B@4 A@16 ~@4 C@4 A@24 ~@4 C@4 A@8 ~@9>".pickRestart({
  A: "[g3,a3,d4]/8", B: "[g4@10 f#4@6 a4@16 c5@16 d5@15 ~, d4@63 ~]/4",
  C: "[g4@10 f#4@8 a4@14 c5@16 d5@15 ~, d4@63 ~]/4",
})).s("gm_string_ensemble_1").gain(0.24).pan(0.3)

// other · electric guitar muted · "StaccGtr"
const electric_guitar_muted = note(`<
  ~ A@2 B C A@2 B C D@8 E@2 B C D@8 E@2 B C F@8 D@12 E@2 B C F@28 E@2 B C F@16 ~
>`.pickRestart({
  A: "[g3,d4] ~ [g3,d4] ~ [g3,d4] ~ [g3,d4] ~ [g3,d4] ~ [g3,d4] ~ [g3,d4] ~ [g3,d4] ~", // G5
  B: "[c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~", // C5
  C: "[d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~", // D5
  D: "g3 ~ b3 ~ d4 ~ g3 ~ d4 ~ a3 ~ g3 ~ a3 ~",
  E: "[e3,b3] ~ [e3,b3] ~ [e3,b3] ~ [e3,b3] ~ [e3,b3] ~ [e3,b3] ~ [e3,b3] ~ [e3,b3] ~", // E5
  F: "d4 ~ g3 ~ a3 ~ b3 ~ g3 ~ g3 ~ a3 ~ g3 ~",
})).s("gm_electric_guitar_muted").gain(0.31).pan(0.2)

// chords · electric guitar clean · "Guitar"
const electric_guitar_clean = note(`<
  ~ A B C D E F G H ~@3 I ~@3 J ~@7 K ~@3 L ~@4 M@3 N M@3 O ~@3 I ~@3 P ~@3 Q ~@3 R M@3 N M@3 O S@2 T@4 U V M@3 N M@3 N
  M@3 N ~@3 R M@3 N M@3 N M@3 N M@3 N ~
>`.pickRestart({
  A: "~ b3 d4 g3 d4@2 ~@2, g3 ~@3", B: "g3@2 d4 ~ d4@3 a3", C: "g3@2 d4 ~@2 a3 g3 ~, ~@2 d4 ~",
  D: "~ b3 d4 c4@2 b3 a3@2, g3 ~@3", E: "~@2 d4 ~@3 g3 ~, g3 ~@3, ~ b3@2 ~ d4@4",
  F: "~@2 d4 ~@3 g3 a3, g3 ~@3, ~ b3@2 ~ d4@4", G: "~@2 d4 ~ d4@2 g3 a3, g3 ~@3, ~ b3@2 ~@5",
  H: "~ b3 d4 c4@2 b3 a3@2, g3@3 ~@5", I: "~ b3 ~ c4@2 b3 a3@2, ~ d4@3", J: "~@3 c4@2 ~@3, ~ d4@3",
  K: "~@3 c4@2 ~ a3@2, ~ b3@2 ~@5, ~ d4@3", L: "~@3 c4@2 ~@3, ~ b3@2 ~@5, ~ d4@3", M: "[d4,g4] ~@2 [d4,g4]@3 ~@2",
  N: "~ [d4,g4]!2 d4 [e4,a4]@2 [e4,a4] ~", O: "~@2 [d4,g4]@2 [d4,g4]@2 d4@2 [e4,a4]@4 [e4,a4]@3 ~",
  P: "~ b3 ~ c4@2 ~@3, ~ d4@3", Q: "~ b3 ~ c4@2 b3 ~@2, ~ d4@3", R: "~ [a3,d4] ~ [a3,d4] [a3,d4]@2 [a3,d4]@2",
  S: "[e4@3 a3@2 g3@4 ~@2 a3@2 g3 a3 g3, ~@9 e4@5 ~@2]/2",
  T: "[~@2 c4@4 ~@6 c4@2 ~@4 c4@4 ~@6 c4@2 ~@12 g3@3 ~@5 a3@2 g3@2 ~@2 a3@2 g3@2 e4@2 g3@2, d4@5 ~ g3@7 ~ g3@4 ~@4 g3@7 ~ g3@4 ~@4 a3@8 ~@18, ~@10 d4@6 d4@5 ~@5 d4@6 e4@12 ~@2 e4@6 ~@2 e4@4 ~@6]/4",
  U: "~ c4@2 g3@2 d4 c4 g3, d4@3 ~@5", V: "~ c4 g3 ~ c4 g3 d4 g3, d4@2 ~ d4@2 ~@3",
})).s("gm_electric_guitar_clean").gain(0.4).pan(0.8)

// chords · electric guitar clean · "Guitar" · soft notes
const electric_guitar_clean_2 = note("<~ A B C D E F G D ~@7 H ~@7 I ~@3 J ~@19 J ~@3 K ~@53>".pickRestart({
  A: "~@5 a3 g3 a3", B: "~ b3@2 g3@2 a3 g3 ~", C: "~ b3@2 g3@2 ~@2 a3", D: "~@3 g4@5", E: "~@3 g3@2 a3 ~ a3",
  F: "~@3 g3@2 a3 ~@2", G: "~@6 g3@3 ~ a3@2 ~@4", H: "~ b3 ~@3 b3 a3@2", I: "~@5 b3@3", J: "~@5 b3 a3@2", K: "~@3 a3",
})).s("gm_electric_guitar_clean").gain(0.24).pan(0.8)

// drums · kick
const kick = s("bd").struct("<~ [x ~@2 x!2 ~@3]!103 [x ~@2 x!2 ~@2 x] x>").gain(0.4)

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

// drums · hihat
const hihat = s("hh").struct("<[x!3 ~] [x!8]!104 ~>").gain(0.3)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@31 B ~@3 B ~@19 B ~@3 B ~@11 B ~@3 B ~@3 B ~@7 B ~@3 B ~@3 B ~@3 B ~@2 C A
>`.pickRestart({
  A: "x", B: "~ x ~@2", C: "~@7 x",
})).gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<~@33 A@7 B ~@16 A@7 B ~@8 A@7 B A@4 ~@4 A@7 B A@7 B ~>".pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!3",
})).gain(0.4)

stack(
  bass, overdriven_guitar, epiano2, marimba, string_ensemble_1, electric_guitar_muted, electric_guitar_clean,
  electric_guitar_clean_2, kick, snare, hihat, crash, tambourine
)