Strudelify
KeyD majorTempo132 bpm
0:00/0:00
// Courage — The Tragically Hip
// 132 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 7 "Guitar 3" electric guitar jazz (copy of ch 3 "Guitar 1" overdriven guitar)
// note: Full arrangement: all 145 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(132/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 · fretless bass · "Bass"
const bass = note(`<
  A@8 B@2 C@2 D@2 E@4 D@2 F@8 C@6 D@2 E@4 D@2 F@8 G@8 H@2 I@8 J@4 K@8 L@2 D@2 F@8 G@8 M@4 N O P@2 Q@4 N O P@2 Q@4 N O
  P@2 Q@4 N O P@2 R@8 S@5
>`.pickRestart({
  A: "[~@16 e2@2 g2@4 a2@5 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ e3@2 a3@3 ~ g3@5 ~ e3@2 g3@3 ~ f#3@5 ~ e2@2 g2@3 ~ a2@5 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ e3@2 a3@3 ~ g3@5 ~ e3@2 g3@3 ~ f#3@5 ~ e2@2 g2@3 ~ a2@5 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ e3@2 a3@3 ~ g3@5 ~ e3@2 g3@3 ~ f#3@5 ~ e2@2 g2@3 ~ a2@5 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ e3@2 a3@3 ~ g3@2]/8",
  B: "[~@4 e3@2 g3@3 ~ f#3@5 ~ e2@2 g2@3 ~ a2@5 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2]/2",
  C: "[a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ e2@2 g2@3 ~ a2@5 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2]/2",
  D: "[a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2 b2@3 ~ c3@5 ~ c3@2 c3@3 ~ c3@2 c3@3 ~ c3@2 c3@3 ~ c3@2]/2",
  E: "[c3@3 ~ c3@2 c3@3 ~ c3@2 c3@3 ~ e2@2 g2@3 ~ a2@5 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ e3@2 a3@3 ~ g3@5 ~ e3@2 g3@3 ~ f#3@5 ~ e2@2 g2@3 ~ a2@5 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2]/4",
  F: "[c3@3 ~ c3@2 c3@3 ~ c3@2 c3@3 ~ a2@2 b2@3 ~ g2@5 ~ g2@2 g2@3 ~ g2@2 g2@3 ~ g2@2 g2@3 ~ g2@5 ~ g2@2 g2@3 ~ g2@2 g2@3 ~ g2@2 a2@3 ~ d3@5 ~ d3@2 d3@3 ~ d3@2 d3@3 ~ d3@2 d3@3 ~ d3@5 ~ d3@2 d3@3 ~ a2@2 d3@3 ~ e3@2 f#3@3 ~ g3@11 ~ f#3@12 d3@11 ~ a2@2 c#3@3 ~ d3@2 e3@3 ~ a2@5 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2]/8",
  G: "[a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ e3@2 f#3@3 ~ g3@11 ~ f#3@2 f#3@10 d3@8 d3@3 ~ a2@2 c#3@3 ~ d3@2 e3@3 ~ a2@5 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2]/4",
  H: "[a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ e3@2 f#3@3 ~ g3@11 ~ f#3@12 d3@2]/2",
  I: "[~@10 a2@2 c#3@3 ~ d3@2 e3@3 ~ a2@39 ~@4 e2 g2@3 ~ a2@39 ~@4 e2 g2@3 ~ a2@20 a2@3 ~ a2@15 ~@3 a2@2 b2@3 ~ c3@15 ~@3 g2@2 c3@3 ~ c3@2]/8",
  J: "[c3@11 ~@5 a2@2 b2@3 ~ g2@15 ~@3 e2@2 g2@3 ~ g2@15 ~@3 e2@2 g2@3 ~ a2@15 ~@3 e3@2 a3@3 ~ g3@2]/4",
  K: "[~@4 e3@2 g3@3 ~ f#3@5 ~ e2@2 g2@3 ~ a2@15 ~@5 a2@3 ~ a2@15 ~@3 a2@2 b2@3 ~ c3@15 ~@3 g2@2 c3@3 ~ c3@15 ~@3 a2@2 b2@3 ~ g2@15 ~@3 e2@2 g2@3 ~ g2@15 ~@3 e2@2 g2@3 ~ d3@15 ~@3 a2@2 d3@3 ~ d3@2]/8",
  L: "[~@10 d3@2 f#3@3 ~ g3@2 a3@3 ~ a2@5 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2]/2",
  M: "[a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ e3@2 f#3@3 ~ g3@11 ~ f#3@12 d3@11 ~ a2@2 c#3@3 ~ d3@2 e3@3 ~ a2@5 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2]/4",
  N: "a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2 b2@3 ~ c3@2", O: "c3@3 ~ c3@2 c3@3 ~ c3@2 c3@3 ~ c3@2 c3@3 ~ c3@2",
  P: "[c3@3 ~ c3@2 c3@3 ~ c3@2 c3@3 ~ a2@2 b2@3 ~ g2@5 ~ g2@2 g2@3 ~ g2@2 g2@3 ~ g2@2 g2@3 ~ g2@2]/2",
  Q: "[g2@3 ~ g2@2 g2@3 ~ g2@2 g2@3 ~ g2@2 a2@3 ~ d3@5 ~ d3@2 d3@3 ~ d3@2 d3@3 ~ d3@2 d3@3 ~ d3@5 ~ d3@2 d3@3 ~ d3@2 f#3@3 ~ g3@2 a3@3 ~ a2@5 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2@2]/4",
  R: "[~@4 g2@2 g2@3 ~ g2@2 g2@5 ~ g2@3 ~ a2@41 ~ e2@2 g2@3 ~ a2@41 ~ e2@2 g2@3 ~ a2@41 ~ e2@2 g2@3 ~ a2@26]/8",
  S: "[~@16 e2@2 g2@3 ~ a2@41 ~ e2@2 g2@3 ~ a2@41 ~@9]/5",
})).s("gm_fretless_bass").gain(0.66)

// chords · overdriven guitar · "Guitar 1"
const overdriven_guitar = note(`<
  A@2 B@6 C@8 D@4 E@6 F G H@2 I@8 D@4 J@7 K@8 L@8 ~@15 M@4 J@7 K@8 N@2 O P@32 ~@11
>`.pickRestart({
  A: "[~@18 [g3,d4,g4]@3 ~ [a3,e4,a4]@15 ~@3 e4@2 a4@3 ~ g4@2]/2", // G5 A5
  B: "[~@4 e4@2 g4@4 f#4@5 ~ d4@2 [g3,d4,g4]@4 [a3,e4,a4]@15 ~@3 e4@2 a4@3 ~ [g4,b4]@5 ~@3 b4@3 ~ [f#4,a4]@5 ~ f#4@2 [g3,d4,g4]@3 ~ [a3,e4,a4]@15 ~@3 e4@2 [a4,c#5]@3 ~ [g4,b4]@5 ~ d4@2 [g4,b4]@3 ~ [f#4,a4]@5 ~ f#4@2 [g3,d4,g4]@3 ~ [a3,e4,a4,c#5]@15 ~@3 e4@2 [a4,c#5]@3 ~ [g4,b4]@2, ~@52 g4@5 ~@87]/6", // G5 A5 G F#m G5 A5 A G …
  C: "[~@4 [g4,b4]@2 [g4,b4]@3 ~ [f#4,a4]@5 ~ f#4@2 g3@3 ~ [a3,e4,a4]@44 [a3,d4,g4]@3 ~ [a3,e4,a4]@45 ~@3 [c4,e4,g4]@45 ~@3 [a3,e4,a4]@15 ~@3 e4@2 c#5@3 ~ b4@2]/8", // G F#m A5 Dsus4 A5 C A5
  D: "[~@4 g4@2 b4@3 ~ a4@5 ~@3 b4 g4 d4 a3 [a3,e4,a4]@47 ~ [d4,g4,b4]@26]/4", // A5 G
  E: "[~@22 [g3,b3,d4,g4,b4]@45 ~@3 [a3,d4,a4,d5,f#5]@38 c5@2 b4@2 g4@2 b4@4 [d4,g4]@8 [d4,g4]@3 ~ [d4,f#4]@8 [d4,f#4]@3 ~ d4@2]/6", // G D G5 D
  F: "~@6 d4@5 ~ c#4@3 ~ d4@2 c#4@3 ~ a3@2", G: "~@10 [e4,a4]@5 ~ a3@2 [e4,a4]@3 ~ [g4,b4]@2",
  H: "[~@6 [g4,b4]@4 [f#4,a4]@7 ~ f#4@4 [e4,a4]@17 ~ e4@2 f#4@3 ~ a4@2, ~@11 a3@13]/2", // G F#m A5
  I: "[~@6 e4@3 ~ f#4@2 [d4,g4,d5]@5 ~ [d4,g4,d5]@3 ~ [a3,e4,a4]@44 [a3,d4,g4]@3 ~ [a3,e4,a4]@45 ~@3 [c4,e4,g4]@45 ~@3 [a3,e4,a4]@15 ~@3 e4@2 c#5@3 ~ b4@2]/8", // G5 A5 Dsus4 A5 C A5
  J: "[~@22 [g3,b3,d4,g4,b4]@45 ~@3 [a3,d4,a4,d5,f#5]@38 c5@2 b4@2 g4@2 b4@4 [d4,g4]@8 [d4,g4]@3 ~ [d4,f#4]@8 [d4,f#4]@3 ~ d4@8 d4@5 ~ c#4@3 ~ d4@2 c#4@3 ~ a3@2]/7", // G D G5 D
  K: "[~@6 [a3,e4,a4]@28 ~@2 b4 ~ a4 ~ g4@2 a4@3 ~ [d4,g4]@8 [d4,g4]@4 [d4,f#4]@7 ~ [d4,f#4]@4 d4@8 d4@5 ~ c#4@4 d4@2 c#4@3 ~ a3@8 [a3,e4,a4]@28 ~@2 b4 a4 ~@2 g4@2 a4@4 [d4,g4]@8 [d4,g4]@4 [d4,f#4]@7 ~ [d4,f#4]@4 d4@8 d4@5 ~ c#4@4 d4@2 c#4@3 ~ a3@2]/8", // A5 G5 D A5 G5 D
  L: "[~@6 [a3,e4,a4]@28 ~@2 b4 a4 ~@2 g4@2 a4@4 [d4,g4]@10 ~@2 f#4@5 ~ g4@2 f#4@3 ~ [a3,d4,a4,d5]@14 c#4@3 ~ d4@2 e4@3 ~ [a3,e4,a4]@44 [d4,g4,b4]@3 ~ [a3,e4,a4]@44 g3@3 ~@3, ~@58 d4@11 ~@123]/8", // A5 G5 D5 A5 G A5
  M: "[~@22 [a3,e4,a4]@45 ~@3 [d4,g4,b4]@26]/4", N: "[~@6 [a3,e4,a4]@28 ~@2 b4 a4 ~@2 g4@2 a4@4 [d4,g4]@2]/2",
  O: "~@10 f#4@5 ~ g4@2 f#4@3 ~ [a3,d4,a4,d5]@2, ~@10 d4@11 ~@3", // D5
  P: "[~@11 [a3,e4,a4]@22 ~@2 [c4,e4,g4]@22 ~@2 [g3,d4,g4]@22 ~@2 [d4,a4,d5]@13]/8", // A5 C G5 D5
})).s("gm_overdriven_guitar").gain(0.4).pan(0.3)

// chords · electric guitar clean · "Guitar 2"
const electric_guitar_clean = note("<~@64 A@8 B@8 C ~@64>".pickRestart({
  A: "[~@22 [a3,e4,a4]@39 ~@9 b4@39 ~@5 d4@2 ~@2 g4@39 ~@5 d4@2 ~@2 a4@15 ~@3 a3@2 [a4,c#5]@3 ~ [g4,b4]@2, ~@64 c4@40 ~@8 g3@45 ~@3 a3@21 ~@11, ~@66 d4@39 ~@11 e4@39 ~@9 e4@15 ~@13, ~@68 g4@39 ~@85]/8", // A5 A G
  B: "[~@4 a3@2 [g4,b4]@3 ~ [f#4,a4]@5 ~@7 a4@39 ~@9 b4@39 ~@5 d4@2 ~@2 g4@38 a4@4 g4@2 d4@4 [d4,a4]@20 a4@3 ~ b4@2, ~@16 a3@41 ~@7 c4@40 ~@8 g3@45 ~@35, ~@18 e4@39 ~@9 d4@39 ~@11 e4@39 ~@31 d4@6, ~@68 g4@39 ~@85]/8", // G F#m D5
  C: "~@4 a4@2 d4@4 a4@5 ~ b4@7 ~",
})).s("gm_electric_guitar_clean").gain(0.5).pan(0.7)

// other · harmonica · "Paul's Ba"
const harmonica = note(`<
  ~@16 A@2 B@2 C@2 D@2 ~@3 E@2 ~@9 A@2 B@2 C@2 D@2 ~@3 F@2 ~@2 F@2 ~@2 F@2 ~@32 F@2 ~@2 F@2 ~@2 F@2 ~@44
>`.pickRestart({
  A: "[~@18 d5@3 ~ d5@11 ~ d5@9 ~@5]/2", B: "[~@16 d5@2 d5@3 ~ d5@11 ~ d5@9 ~@5]/2", C: "[~@22 d5@11 ~ d5@9 ~@5]/2",
  D: "[~@12 d5@3 ~ d5@2 d5@3 ~ d5@11 ~ d5@9 ~@5]/2",
  E: "[~@4 c#5@2 c#5@2 c#5@2 c#5@5 ~ c#5@2 c#5@2 c#5@2 d5@11 ~ c#5@13 ~]/2",
  F: "[~@4 c#5@2 c#5@2 c#5@2 c#5@5 ~ c#5@2 c#5@2 c#5@2 d5@11 ~ c#5@14]/2",
})).s("gm_harmonica").gain(0.5).pan(0.9)

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

// drums · snare
const snare = s("sd").struct(`<
  ~ A B A C B@3 D B A B@4 C E B C@2 B@2 A B F@2 G@4 H B@2 C I B@11 J D G K F D G@2 F L G K M J K G H K F ~ N ~ N ~ N ~ N
  ~ N ~ N ~ N ~@2 B@2 A C B@3 O H K G F H G@2 D L K G J K J B A B I C B@3 A C B A B@3 H B A B@5 P B@4 I B C Q B@2 A B@2
  A B F B D
>`.pickRestart({
  A: "~@3 x ~@4 x!2 ~ x", B: "~@3 x ~@5 x ~ x", C: "~ x ~ x", D: "x ~@2 x!3 ~@2 x!2 ~@2", E: "~@3 x ~ x ~ x ~ x!2 ~",
  F: "x!12", G: "~@3 x ~ x ~@3 x ~ x", H: "~@2 x!3 ~ x!2 ~ x ~@2", I: "~@3 x ~@4 x!2 ~@2", J: "x ~@2 x ~ x!3 ~ x!3",
  K: "~@3 x ~ x ~@3 x ~@2", L: "x ~@3 x!8", M: "x!3 ~ x!6 ~@2", N: "~@11 x", O: "x!10 ~@2", P: "~@3 x!2 ~@4 x ~@2",
  Q: "x ~@3 x!2 ~@6",
})).gain(0.26)

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

// drums · low tom
const low_tom = s("lt").struct("<~@30 A ~@27 B ~@3 A ~@17 C ~@7 C A ~@3 A ~@24 A ~@15 D ~@10>".pickRestart({
  A: "~@5 x ~@5 x", B: "~@3 x ~@7 x", C: "~@11 x", D: "~@10 x!2",
})).gain(0.52)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@4 A ~@2 B ~@9 B ~ B ~ B ~@9 C ~@3 C ~@5 C ~@43 C@2 B ~@26 C ~@6 C A ~@2 D ~ C B ~@3 E ~@3 A ~ B ~ B ~@4
>`.pickRestart({
  A: "~ x ~@10", B: "~ x ~@4", C: "~@7 x ~@4", D: "~ x ~@5 x ~@4", E: "~@2 x ~@4 x ~@4",
})).gain(0.33)

// drums · mid tom
const mid_tom = s("mt").struct("<~@30 A ~@31 A ~@25 A@2 ~@3 A ~@24 A ~@15 B ~@10>".pickRestart({
  A: "~@5 x", B: "~@2 x",
})).gain(0.52)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A ~@10 A@2 ~ A@2 ~@13 A@2 ~@49 A ~@21 A@2 ~@4 A ~@13 B ~@4 A ~ A ~@11
>`.pickRestart({
  A: "~@11 x", B: "~@9 x ~ x",
})).gain(0.39)

// drums · high tom
const high_tom = s("ht").struct("<~@30 A ~@27 B ~@3 A ~@26 A ~@3 A ~@24 A ~@15 C ~@10>".pickRestart({
  A: "~@2 x", B: "~@5 x", C: "~ x",
})).gain(0.52)

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

// drums · ride
const ride = s("rd").struct(`<
  ~@26 A@2 B A ~@18 A C ~@2 A@2 ~@2 A C ~@2 C B ~ C ~@26 C B ~@2 A B ~@2 C A ~ C ~@43
>`.pickRestart({
  A: "x!4", B: "x ~@2 x ~@3 x ~ x ~@2", C: "x ~@2 x ~@2 x ~@2 x ~ x",
})).gain(0.52)

// drums · tambourine
const tambourine = s("tb").struct("<~@65 [x!4]!16 ~@64>").gain(0.66)

stack(
  bass, overdriven_guitar, electric_guitar_clean, harmonica, kick, snare, snare_soft, low_tom, hihat, hihat_soft,
  mid_tom, open_hat, high_tom, crash, ride, tambourine
)

More by The Tragically Hip