Strudelify

Boots or Hearts

The Tragically Hip

KeyG majorTempo128 bpm
0:00/0:00
// Boots or Hearts — The Tragically Hip
// 128 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// 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.
setcpm(128/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 · electric bass finger · "Bass"
const bass = note(`<
  ~@32 A B@3 C B D B E F G F H I C B@2 G J K L G J B C B M B N B C B O G@3 P B K Q N B@3 C B D B E F G F H I C B@2 G J K
  L G J B C B M B N B C R S ~
>`.pickRestart({
  A: "~@5 e2 f2 e2", B: "g2@3 ~@3 g2@8 ~@2", C: "g2@3 ~@3 g2@3 ~ e2@2 f2@2 e2@2", D: "g2@3 ~@3 g2@8 f2@2",
  E: "g2@3 ~@3 g2@3 ~ a2@2 b2@3 ~", F: "c3@3 ~@3 c3@8 ~@2", G: "c3@3 ~@3 c3@6 ~@2 g2@2", H: "c3@3 ~@3 c3@6 ~@2 a#2@2",
  I: "g2@3 ~@3 g2@6 ~@4", J: "d3@3 ~@3 d3@6 ~@2 e2@2", K: "g2@3 ~@3 g2@6 ~@2 f2@2", L: "b2@3 ~@3 b2@8 ~@2",
  M: "g2@3 ~@7 e2@2 f2@2 e2@2, ~@3 g2@4 ~", N: "g2@3 ~@3 g2@3 ~ e2@2 f2@3 ~", O: "g2@3 ~@3 g2@5 ~ g2@2 a2@2",
  P: "c3@3 ~@3 c3@3 ~ e2@2 f2@2 e2@2", Q: "g2@3 ~@3 g2@7 ~@3", R: "g2@3 ~@3 g2@2 g2@5 ~ b2@2", S: "e3 d3 e2 g2@5",
})).s("gm_electric_bass_finger").gain(0.51)

// chords · acoustic guitar steel · "Guitar 1"
const acoustic_guitar_steel = note(`<
  A@2 B@2 C@2 D@3 E F@2 G H I@3 J K L M N F@2 O P Q R S T U V W E F@2 G H I@3 J K L M N F@2 O P Q R S T U V W E F@2 G H
  I@3 J K L M N F@2 O E F@2 G H I@3 J K L M N F@2 O P Q R S T U V W E F@2 G H X@2 Y ~
>`.pickRestart({
  A: "[~@5 [b3,b4] [a3,a4] [g3,d4,g4]@3 [g3,d4] [d4,g4] [g3,d4] [d4,g4] ~ [g3,d4]]/2", // B A G5
  B: "[[g3,d4] [d4,g4] ~ [d4,g4] ~ g3 b3 [d4,g4]@3 [g3,d4] [d4,g4] [g3,d4] [d4,g4] ~ d4]/2", // G5
  C: "[f4@2 e4@2 d4@2 g4@3 ~ g3@2 b3@2 [d4,g4]@6 [g3,d4]@2 [d4,g4]@2 [g3,d4]@2 [d4,g4]@2 ~@2 [g3,d4]@2]/2", // G5
  D: "[[g3,d4] [d4,g4] ~ [d4,g4] ~ g3 b3 [d4,g4]@3 [g3,d4] [g3,d4,g4] [g3,d4] [g3,d4,g4] [g3,d4] [f4,g4]@2 g4!7]/3", // G5 Fsus2
  E: "[g3,d4] ~ [g3,d4] [d4,g4] [g3,d4] [d4,g4] ~ [g3,d4]", // G5
  F: "[[g3,d4] [d4,g4] ~ [d4,g4] ~ g3 b3 [d4,g4]@3 [g3,d4] [d4,g4] [g3,d4] [d4,g4] ~ [d4,g4]]/2", // G5
  G: "~ [f4,g4] e4 d4 [e4,g4] d4 a#3 b3", H: "[d4,g4]@3 ~ [g3,d4]@2 [d4,g4]@2 [g3,d4]@2 [d4,g4]@2 ~@2 g3@2",
  I: "[[g3,d4] [d4,g4] ~ [d4,g4] ~ g3 b3 [d4,g4]@3 [g3,d4] [g3,d4,g4] [g3,d4] [g3,d4,g4] [g3,d4] g4@2 g4 [f4,g4]!2 [e4,g4]!3 [d4,g4]]/3", // G5 Fsus2 Em G5
  J: "[c4,g4,c5]@3 ~ [c4,g4,d5]@3 ~ [c4,g4,c5]@3 ~@3 [g4,c5]@2", // C5 Csus2 C5
  K: "~@2 c5@2 [c4,g4,d5]@3 ~ [c4,g4,d5]@2 [c4,g4,c5,e5]@2 [g4,c5]@2 [g4,c5]@2", // Csus2 C C5
  L: "~@2 [d4,g4] ~ [c4,g4,d5]@3 ~ [c4,g4,d5]@3 ~@3 [c4,g4,c5,e5]@2", // G5 Csus2 C
  M: "~ [a4,c5,f5] [g4,c5,e5] [g4,c5] [a4,c5,f5] [g4,c5,e5] [a4,c5,f5,a5]!2", // F C C5 F C F
  N: "d4@3 ~ [g3,d4,g4]@2 [d4,g4]@2 [g3,d4]@2 [d4,g4]@2 ~@2 g3@2", O: "~ [f4,g4] e4 d4 [e4,g4] d4 g3 [d4,g4]",
  P: "[c4,g4,c5]@3 ~ [c4,g4,d5]@3 ~ [c4,g4,c5,e5]@2 ~@4 [d4,a4,d5]@2", // C5 Csus2 C D5
  Q: "[d4,a4,d5]@2 [d4,a4,d5]@2 [d4,b4,d5,g5]@3 ~ [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,b4,d5,g5]@2", // D5 G D G
  R: "~@2 [g3,d4] [g3,d4,g4] [g3,d4] [d4,g4] ~ d4", S: "f4@2 e4@2 d4@2 [d4,g4]@3 ~ g3@2 b3@2 [d4,g4]@2",
  T: "[c4,g4,c5]@3 ~ [c4,g4,d5]@3 ~ [c4,g4,c5,e5]@2 ~@4 [d4,a4,d5,f#5]@2", // C5 Csus2 C D
  U: "~@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@3 ~ [d4,b4,d5,g5]@2 [d4,a4,d5,f#5]@2 [d4,b4,d5,g5]@2 [d4,b4,d5,g5]@2", // D G D G
  V: "~@2 g3 ~ [g3,d4]@2 [d4,g4]@2 [g3,d4]@2 [d4,g4]@2 ~@2 d4@2", W: "f4@2 e4@2 d4@2 [d4,g4]@3 ~ g3@2 a3 b3 [d4,g4]@2",
  X: "[[g3,d4] [d4,g4] ~ [d4,g4] ~ g3 b3 [d4,g4]@3 [g3,d4] [d4,g4] [g3,d4] [d4,g4] ~ b4]/2", // G5
  Y: "[b4,d5] [a4,c5] [g4,b4] [g3,f4,g4]@5", // Bm Am G G7
})).s("gm_acoustic_guitar_steel").gain(0.51)

// chords · distortion guitar · "Guitar 2"
const distortion_guitar = note("<~@56 A B@2 C D B@2 E F G H G I J@2 K@2 ~@24 B@2 C D B@2 K@2 ~>".pickRestart({
  A: "~@5 f#5@3", B: "[g5@12 ~ [f#5,a#5]@3]/2", C: "[g5,b5]@7 ~", D: "g5 f5 g5!2 ~ d4 f#5@2", E: "[g5,b5]@6 ~ g5",
  F: "f5 d5 f5!2 e5@2 ~@2", G: "[g4,c5]@13 ~ [g4,c5]@2", H: "~ g4 a#4!3 g4 a#4@2",
  I: "~@2 a#4@2 ~ a#4 ~@2, ~@2 g4@13 ~", J: "[[g5,b5]@7 [f#5,a#5]]/2", K: "[g5,b5]/2",
})).s("gm_distortion_guitar").gain(0.51)

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

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

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@24 [~@7 x] ~@81>").gain(0.4)

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

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@24 [~@5 x ~@2] ~@39 [~@3 x ~ x ~@2] ~@41>").gain(0.35)

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

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@12 A ~@22 B ~@19 B ~@20 A B ~@5 B ~@22>".pickRestart({
  A: "~@5 x ~@2", B: "~ x ~@6",
})).gain(0.2)

// drums · high tom
const high_tom = s("ht").struct("<~@24 [~@3 x ~@4] ~@39 [~ x ~@2] ~@41>").gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@64 [~@7 x] ~@41>").gain(0.3)

// drums · ride
const ride = s("rd").struct(`<
  ~ A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@8
>`.pickRestart({
  A: "x",
})).gain(0.35)

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

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ [~ x!2 ~@2 x!2 ~]!104 ~>").gain(1.76)

// drums · shaker
const shaker = s("sh").struct("<~ [x!4]!104 x>").gain(0.25)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~ [~ x ~ x ~ x ~ x]!104 ~>").gain(0.1)

stack(
  bass, acoustic_guitar_steel, distortion_guitar, kick, rim, snare, clap, low_tom, hihat, hihat_soft, mid_tom, open_hat,
  open_hat_soft, high_tom, crash, ride, tambourine, cabasa, shaker, shaker_soft
)

More by The Tragically Hip