Strudelify
KeyB♭ majorTempo92 bpm
0:00/0:00
// Cordelia — The Tragically Hip
// 92 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 94 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(92/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 B A B A@2 B C A@2 B A D A D A E A D F G H G H G H G H I J I J I K I L@2 G L G H G H I J I J I K I M A B A B A@2 B C
  A@2 B A D A D A E A D N G H G H I J I J I K I L@2 G L@3 G L@3 G M
>`.pickRestart({
  A: "g1@13 ~@3", B: "bb1@3 ~ f1@3 ~", C: "g1@11 ~@3 f1@2", D: "bb1@3 ~ c2@3 ~", E: "bb1@6 ~@2 c2@3 ~ f1@3 ~",
  F: "g1@2 ~ f2 ~@2 c2@3 ~ bb1@2 bb1 c2 ~@2", G: "g1@2 ~ g1 ~ e1 f1@2 g1 f1 g1@2 bb1@2 g1 f1",
  H: "g1@2 ~ g1 ~ e1 f1@2 g1 f1 bb1@2 g1@3 ~", I: "eb2 d2 ~ c2 bb1 e2 f2@3 ~ f1 g1 bb1@2 g1 f1",
  J: "g1@2 ~ g1@2 e1 f1@2 g1 f1 bb1@2 g1@3 ~", K: "bb1@2 ~ bb1 g1@2 c2@3 ~ f1 g1 bb1 g1 bb1@2",
  L: "g1@2 ~ g1@2 e1 f1@2 bb1!2 f1@2 g1@3 ~", M: "g2@2 ~ f2 ~@2 c2@3 ~ bb1@2 bb1 c2 ~@2",
  N: "g2 f2@2 f2 ~ bb1 c2@3 ~ f1 g1 bb1@2 f1 g1",
})).s("gm_fretless_bass").gain(0.51)

// chords · electric guitar clean · "Guitar 1"
const electric_guitar_clean = note(`<
  A B A B A@2 C D@2 E F@3 G@2 H@2 I@2 J K@4 L M N M O P Q R S T O K@3 U L M N M O P Q R S T O J A B A B A@2 C D@2 E F@3
  G@2 H@2 I@2 V L W N X O P Q R S T O K@3 U Y Z AA AB K@3 AC
>`.pickRestart({
  A: "~@10 d3 d4@2 ~ g3@2, g1@13 ~@3, ~ d4 d3 g3 d4 ~@3, ~@3 g3@2 d4@2 d3@2 g3@2 ~@5",
  B: "~@10 f3 c4@2 ~ g3@2, bb1@13 ~@3, ~ g3@2 g3@2 c4@2 f3@2 g3@2 ~@5, ~ c4 f3 g3 c4 ~@3",
  C: "~@10 d3 d4@2 ~ g3@2, bb1@3 ~ f1@3 ~, ~ d4 d3 g3 d4 ~@3, ~@3 g3@2 d4@2 d3@2 g3@2 ~@5",
  D: "[~@3 d3 ~ g3@2 ~@2 d3 f3@2 g3@2 ~@12 d3 d4@2 ~ d3@2, g1@13 ~@3 g1@13 ~@3, ~@2 g3@2 ~@4 f3@2 ~@5 g3@2 ~ d4@2 d3@2 g3@2 d4@2 ~@6, ~@19 g3@2 d4@2 d3@2 g3@2 ~@5]/2",
  E: "~@7 d3 g4@2 ~ f4@3 d4@2, g1@13 ~@3, ~ d4 d3 g3 ~@4, ~@3 g3@2 d4@2 ~@9",
  F: "[c4@2 c4@2 ~ g3@2 ~ g3@2 c4 g3 f3 g3@5 g3 d3@2 g3@2 ~ eb3 d3 eb3@2 g3@2 g2 ~@3 g3 f3 d3 g3 f3 d3 ~@2 g3 f3 c3 f3 g3@2, bb1@6 ~@2 f1@6 ~@17 g3@2 ~@15, ~@16 bb1@3 ~ c2@3 ~]/3",
  G: "[~@2 g3 d3@2 g3@2 ~ f3 d3 f3@2 g3@2 g2 ~@3 g3 f3 bb2 g3 bb2 ~@3 g3 f3 c3@2 g3@2, g2@13 ~@2 g3@2 ~@6 g3@2 ~@7, ~@8 bb1@3 ~ c2@3 ~]/2",
  H: "[~@2 g3 d3 g2 g3@2 g3 bb3 g3 bb3@2 g3@2 g2 ~ bb2@2 g3 f3 ~ g3@2 ~ bb2 ~ g3@2 f2@2 g3@2, g1@13 ~@2 g3@2 ~@3 bb2@3 g3@2 c3@2 ~@5]/2",
  I: "[g2@2 g3 d3 g2 g3@2 ~ f3 d3 f3@2 g3@2 g2 ~ bb2@2 g3 f3 bb2 ~ bb2@2 c3@6 ~@2, ~@15 g3@2 ~@4 g3@9 ~@2]/2",
  J: "[f3,d4,f4,bb4]@2 ~ [f3,c4,f4,a4]@2 ~ [f3,c4,g4]@3 ~ [f3,c4,f4]@2 ~ [g3,d4,g4] ~@2, ~@12 [f3,c4,f4]@3 ~", // Bb F Fsus2 F5 G5 F5
  K: "f3 g3!2 f3 g3!2 bb2 c3 f2@2 g2@2 [d3,g3]@3 ~", L: "[g2,d3]@5 ~ [bb2,f3,bb3]@2", M: "[g2,d3,g3]@13 ~@3",
  N: "[g2,d3,g3]@12 [bb2,f3,bb3]@3 ~", O: "[eb3,bb3,eb4]@5 ~ [f3,c4,f4]@6 [f3,c4,f4]@3 ~",
  P: "[g2,d3,g3]@6 ~@2 [f3,bb3] [e3,a3] [d3,g3]@2 [g2,d3,g3,d4,g4]@3 ~", // G5 Bb5 A5 G5
  Q: "[eb3,bb3,eb4]@3 ~ [g2,d3,g3]@2 [f3,c4,f4]@10", R: "[g2,d3,g3]@8 ~@2 d3@2 [g3,d4,g4]@3 ~",
  S: "[eb3,bb3,eb4]@5 ~ [f3,c4,f4]@8 ~@2", T: "[f3,bb3,d4]@2 ~ [f3,bb3,d4] [eb3,g3]@2 [g3,c4,e4]@6 [g3,c4,e4]@3 ~",
  U: "f3 g3!2 f3 g3!2 bb2 c3 f2@2 g2@2 bb2 [bb2,c3] g2@2", V: "g3 f3@2 d3 ~ bb2 c3@3 ~ f2 g2 bb2!2 g2 f2",
  W: "[g2,d3,g3]@8 ~@2 [bb2,f3] [g2,d3]@2 ~ [g2,d3]@2", X: "[g2,d3,g3]@6 ~@2 [c4,f4] [d4,g4] [d4,g4]@2 [d4,g4]@3 ~",
  Y: "f3 g3!2 f3 [f3,c4,f4]@2 ~@2 f2@2 g2@2 [d3,g3]@3 ~, ~@3 [g3,d4,g4]@3 ~@2", // F5 G5
  Z: "f3 g3!2 f3 g4 f4 bb2 c3 f2@2 g2@2 [d3,g3]@3 ~, ~@3 d4@3 ~@2", AA: "g3 f3 d3 c3 bb3@2 [g2,d3,g3]@8 ~@2",
  AB: "c3 d3 f3 g3 [f3,c4,f4]@2 [g3,d4,g4]@8 ~@2", AC: "~@3 f3 ~@2 c3@3 ~ bb2@2 ~ c3 ~@2, g3@12 bb2@3 ~",
})).s("gm_electric_guitar_clean").gain(0.51).pan(0.9)

// chords · overdriven guitar · "Guitar 2"
const overdriven_guitar = note(`<
  ~@20 A B C D E F E F G H G E I J K H L@2 F M L F E N O P Q R S K T ~@19 U E F V L R Q W H P X Y H F E L E@4 L F H ~
>`.pickRestart({
  A: "[bb3,d4,g4]@2 bb4 ~ [bb3,d4,g4,bb4] ~@5 [bb3,d4,g4] ~@5, g2 ~@15", // Gm
  B: "~@2 [d4,g4,bb4] ~ [d4,g4,bb4] ~ bb3@2 [d4,g4,bb4]@2 [d4,g4,bb4] ~@5", C: "[g3,d4]@3 ~ [g3,d4] ~@5 [g3,d4] ~@5",
  D: "~@4 [bb3,g4,d5]@2 ~@2 [bb3,g4]@2 [bb3,g4] ~@5", E: "~@2 [g3,d4]@2 ~@2 [g3,d4]@2 ~@4 [g3,d4] ~@3",
  F: "~@2 [bb3,d4,g4,bb4] ~@3 [bb3,d4,g4,bb4] ~@3 [bb3,g4] ~@3 bb3 ~", // Gm Eb
  G: "~@2 [g3,eb4]@3 ~@5 [a3,c4,f4,a4] ~@3 [a3,c4,f4,a4] ~", H: "~@2 [g3,d4] ~@3 [g3,d4] ~@3 [g3,d4] ~@3 [g3,d4] ~",
  I: "~@2 [g3,bb3,eb4,g4] ~@3 [g3,bb3,eb4,g4] ~@3 [a3,c4,f4,a4] ~@3 [a3,c4,f4,a4] ~", // Eb F
  J: "~@2 [f3,d4]@3 ~@5 [g3,c4,e4,g4] ~ [g3,c4,e4,g4] ~@3", // Dm C
  K: "~@2 [g3,eb4] ~ [g3,eb4]@2 ~@4 [a3,c4,f4,a4] ~@3 [a3,c4,f4,a4] ~", // Cm F
  L: "~@2 g2 ~ [bb3,g4] ~ g2 ~ [bb3,g4] ~ g2 ~ bb3 ~ g4 ~", // Eb
  M: "~@2 [bb3,d4,g4,bb4] ~@3 [bb3,d4,g4] ~@3 [bb3,d4,bb4] ~ g2 ~ [bb3,d4,g4] ~", // Gm Bb Gm
  N: "~@2 [g3,bb3,eb4,g4] ~@3 [g3,bb3,eb4,g4] ~@3 [a3,c4,f4,a4] ~ [a3,c4,f4,a4] ~@3", // Eb F
  O: "~@2 g2 b3 [d4,g4,b4]@2 g2@2 [d4,g4,b4] ~ g2 ~ [d4,g4,b4] ~@3", // G
  P: "~@2 [g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~@5 [a3,f4]@3 ~@3", // Eb Dm
  Q: "~@2 [b3,d4,g4,b4] ~@3 [b3,d4,g4] ~@3 [b3,d4,b4] ~ g2 ~ [b3,d4,g4] ~", // G Bm G
  R: "~@2 [g3,eb4] ~ [g3,eb4]@2 ~@4 [a3,f4] ~ [a3,f4]@2 ~@2", S: "~@2 [f3,d4]@3 ~@5 [g3,e4]@3 ~@3",
  T: "~@2 [f3,bb3,d4,f4] ~@3 [a3,c4,f4,a4] ~@3 [a3,c4,f4,a4] ~@3 [b3,d4,g4,b4] ~", // Bb F G
  U: "[f3,d4]@2 ~@2 [a3,f4]@2 ~@4 [a3,f4] ~ [b3,g4]@2 ~@2", // Dm Em
  V: "~@2 [bb3,d4,g4,bb4] ~@3 [bb3,d4,g4,bb4] ~@3 [bb3,d4,g4,bb4] ~@3 [bb3,d4,g4,bb4] ~", // Gm
  W: "~@2 [g3,bb3,eb4,g4] ~ [g3,bb3,eb4,g4] ~@5 [a3,c4,f4,a4] ~ [a3,c4,f4,a4] ~@3", // Eb F
  X: "~@2 [f3,bb3,d4,f4] ~ [f3,bb3,d4,f4] ~@5 [g3,c4,e4,g4] ~ [g3,c4,e4,g4] ~@3", // Bb C
  Y: "~@2 [g3,eb4]@3 ~@5 [a3,f4] ~ [a3,f4]@2 ~@2", // Cm Dm
})).s("gm_overdriven_guitar").gain(0.31).pan(0.1)

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

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

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

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

// drums · open hat
const open_hat = s("oh").struct("<~@31 A B C ~@3 C D ~@8 B C B ~@22 C B C ~@7 C ~@5 B C ~@4>".pickRestart({
  A: "~@9 x ~ x ~@4", B: "~@5 x ~@2", C: "~@7 x", D: "~@5 x!2 ~",
})).gain(0.36)

// drums · high tom
const high_tom = s("ht").struct("<~@85 [~@4 x!2 ~@10] ~@7 [~@4 x!2 ~@10]>").gain(0.41)

// drums · crash
const crash = s("cr").struct("<~@24 A ~@6 B ~@7 A ~@31 A ~@13 B A ~@3 A ~@2 B>".pickRestart({
  A: "x", B: "~@7 x",
})).gain(0.41)

// drums · ride
const ride = s("rd").struct("<[x!4]!19 ~ [x!4] [x ~@2 x!2 ~ x ~] [x!4] ~@28 [x!4]!19 ~@24>").gain(0.51)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@20 [~ x ~ x ~ x ~ x] [~ x!2 ~@2 x ~ x] [~ x ~ x ~ x ~ x] ~@71>").gain(0.31)

// drums · tambourine
const tambourine = s("tb").struct("<~@20 [~ x ~ x]!3 ~@71>").gain(0.46)

stack(
  bass, electric_guitar_clean, overdriven_guitar, kick, snare, hihat, hihat_soft, open_hat, high_tom, crash, ride,
  ride_soft, tambourine
)

More by The Tragically Hip