Strudelify

Curse of the Traveller

Chris Rea

KeyA minorTempo100 bpm
0:00/0:00
// Curse of the Traveller — Chris Rea
// 100 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 115 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/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 · acoustic bass · "Bass"
const bass = note(`<
  ~ A B C D A B C D A B C D A B C D A B C D A B C D E@2 F G H I J@2 K L M@2 K L N@2 K L N@2 K L O@2 P B C D A B C D Q R
  S T U V W X Y@2 A B C D A B C D A B C D A B C D E@2 F G H I J@2 E@2 F G H I J K L M@2 K L N@2 K L N@2 K L Z@2 ~
>`.pickRestart({
  A: "a2 ~ a2 ~ b2 ~@3 c3 ~@7", B: "a2 ~@3 b2 ~@3 c3 ~@7", C: "d3 ~ d3 ~ e3 ~@3 f3 ~@7",
  D: "d3 ~@3 e3 ~@3 f3 ~ e3 ~ d3@3 ~", E: "f3 ~ f3 ~ f3 ~ f3 ~ f3 ~ f3 ~ f3 ~ f3 ~",
  F: "e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ [e3,f3] ~ e3 ~ e3 ~", G: "e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~",
  H: "d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~", I: "d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ b2 ~",
  J: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~", K: "d3 ~ d3 ~ e3 ~@3 f3 ~@5 g2@2", L: "~@2 g2 ~ a2 ~@3 b2@2 ~@6",
  M: "[a2 ~ a2 ~ b2 ~@3 c3 ~@5 a2@6 b2 ~@3 c3 ~ a2 ~ a2 ~ a2 ~]/2",
  N: "[a2 ~ a2 ~ b2 ~@3 c3 ~@5 a2@6 ~@6 a2 ~ a2 ~ a2 ~]/2",
  O: "[a2 ~ a2 ~ b2 ~@3 c3 ~@5 a2@4 a2@2 b2 ~@3 c3 ~@5 a2@2]/2", P: "a2@2 a2@2 b2 ~@3 c3 ~@7",
  Q: "f3@2 ~@2 f3@2 ~@2 f3@5 ~@3", R: "f3@2 ~ f3 f3@2 f3@2 f3@8", S: "d3@3 ~ d3@3 ~ d3@7 ~",
  T: "d3@3 d3 d3@2 d3 ~ d3@6 d3 d#3", U: "e3@4 e3@3 ~ e3@7 ~", V: "e3@2 ~ e3 e3@2 e3 ~ e3@8",
  W: "a2@3 ~ a2@3 ~ a2@5 ~ a2@2", X: "g2@3 ~ g2@3 ~ g2@3 g2 g2@4", Y: "[f2@3 ~ f2@3 ~ f2@20 ~@4]/2",
  Z: "[a2 ~ a2 ~ b2 ~@3 c3 ~@5 a2@17 ~]/2",
})).s("gm_acoustic_bass").gain(0.46)

// other · electric guitar jazz · "Jazz guitar"
const electric_guitar_jazz = note(`<
  ~ A@2 B@2 A@2 C@2 A@2 C@2 A@2 C@2 A@2 C@2 A@2 C@2 D@6 ~@18 A@2 C@2 A@2 C@2 ~@10 A@2 C@2 A@2 C@2 A@2 C@2 A@2 C@2 D@6
  ~@2 D@6 ~@18
>`.pickRestart({
  A: "[a4 e4 b4 e4 c5 a4 e4 a4@2 e4 b4 e4 c5 a4 e4@2]/2",
  B: "[d4@2 a3@2 e4@2 a3@2 f4@2 e4@2 a3@2 d4@4 a3@2 e4@2 a3@2 f4@2 e4@2 d4 ~@3]/2",
  C: "[d4@2 a3@2 e4@2 a3@2 f4@2 d4@2 a3@2 d4@4 a3@2 e4@2 a3@2 f4@2 a3@2 d4 ~@3]/2",
  D: "[~@4 g5@3 ~ g5@4 a5@8 g5@4 g5@4 a5@8 g5@4 g5@4 a5@8 g5@3 ~ g5@4 a5@8 f5@4 f5@4 g5@8 f5@4 f5@4 g5@4]/6",
})).s("gm_electric_guitar_jazz").gain(0.36)

// other · distortion guitar · "Dist.Guitar"
const distortion_guitar = note("<~@49 A@2 B C@5 D@4 E@2 F G H I ~@48>".pickRestart({
  A: "[a5@22 g5 e5 d5@6 b4 [a4,b4]]/2", B: "d5, c#5 ~@15",
  C: "[~@10 a4 c5 ~ d5 ~ e5@3 d5 c5 a4 c5 ~ d5@13 ~@8 e4 ~@2 g4@2 a4 ~ c5 a4@19 ~@9, ~@43 d4@2 ~@35]/5",
  D: "[a5@18 g5 e5 d5@6 c5 a4 c5 c#5 d5@6 c5 a4@27, g#5 ~@63]/4",
  E: "[e6 c6 a5 c6 d6@14 c6 a5 g5 [g#5,a5]@2 ~ g5@2 e5@3 g5 [g#5,a5]@2]/2", F: "a5@15 ~, g#5 ~@15",
  G: "e6@3 [c6,d6] a5 ~ e6@6 d6 c6 a5 ~", H: "c6@3 ~@8 g#5 ~@2 g5@2, ~@3 a5@12 ~", I: "e5@3 ~",
})).s("gm_distortion_guitar").gain(0.56)

// chords · rock organ · "E.Organ"
const rock_organ = note("<~@83 A@2 B@2 C@2 D@2 A@2 B@2 C@2 E ~@17>".pickRestart({
  A: "[a4,c5,e5,a5]/2", B: "[g4,b4,d5,g5]/2", C: "[f4,a4,c5,f5]/2", D: "[e4,a4,c5,e5]/2", E: "[e4,a4,c5,e5]@15 ~",
})).s("gm_rock_organ").gain(0.36)

// chords · piano · "E.Piano"
const piano = note(`<
  ~ A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 C@2 D@2 A@2 E F G@2 E F G@2 E F G@2 E F G@2 A@2 B@2 A@2 B@2 H@2
  I@2 J@2 K L M@2 N@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 C@2 D@2 A@4 C@2 D@2 O@2 F G@2 E F G@2 E F G@2 E F P@3
>`.pickRestart({
  A: "[a3,c4,e4]/2", B: "[a3,d4,f4]/2", C: "[g3,b3,d4]/2", D: "[f3,a3,c4]/2", E: "[d4,f4,a4]", F: "[d4,g4,b4]",
  G: "[a3,c4,e4,a4]/2", H: "[[a4,c5,e5], e4@11 ~@5]/2", I: "[f4,a4,c5]/2", J: "[g#4,b4,e5]/2", K: "[a4,c5,e5]",
  L: "[g4,b4,d5]", M: "[[f4,a4,c5]@29 ~@3]/2", N: "[a4,c5,e5]/2", O: "[~ [d4,f4,a4], [a3,c4,e4]]/2",
  P: "[[a3,e4,a4]@7 [a3,e4,a4,c5,e5]@16 ~, c4@2 ~]/3", // A5 Am
})).s("gm_piano").gain(0.41)

// chords · piano · "E.Piano"
const piano_2 = note("<~@6 A@2 ~@24 B@2 ~@2 B@2 ~@2 B@2 ~@2 B@2 ~@51 B@2 ~@2 B@2 ~@2 B@2 ~@2 B@2 ~@4>".pickRestart({
  A: "[~@4 [c5,e5] [d5,f5] [e5,g5] [e5,g5]@2 [d5,f5]@6 ~]/2", // C Dm Em Dm
  B: "[~@4 e5 [d5,f5] [e5,g5] [e5,g5]@2 [d5,f5]@6 ~, ~@8 c5 ~@23]/2", // Dm Em Dm
})).s("gm_piano").gain(0.46)

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

// drums · snare
const snare = s("sd").struct("<~ A@47 B A@17 ~ A@15 C A@30 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@4 x ~@5 x!2 ~@4",
})).gain(0.46)

// drums · low tom
const low_tom = s("lt").struct("<~@8 [~@7 x] ~@57 [~@10 x!2 ~@2 x ~] ~@48>").gain(0.46)

// drums · hihat
const hihat = s("hh").struct(`<
  A B C B C B C B C B C B@7 C B@6 ~@8 B@15 D B C B@6 ~@10 B C B@7 C B@5 E ~@15 B@15 ~@2
>`.pickRestart({
  A: "~@10 x!3 ~@3", B: "x!8", C: "x!7 ~", D: "x ~ x ~ x ~ x ~ x ~ x!3 ~@3", E: "x ~ x ~ x ~ x ~ x ~ x!3 ~ x ~",
})).gain(0.41)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 [~@7 x!2 ~ x ~ x ~ x ~] ~@57 [~@3 x] ~@45 [~@7 x] ~@2>").gain(0.46)

// drums · open hat
const open_hat = s("oh").struct("<A ~ A ~ A ~ A ~ A ~ A ~@7 A ~@29 A ~ A ~@17 A ~@7 A ~@5 B ~@32>".pickRestart({
  A: "~@7 x", B: "~@11 x ~@2 x ~",
})).gain(0.41)

// drums · high tom
const high_tom = s("ht").struct("<~@8 [~@7 x!2 ~ x ~ x ~@3] ~@57 [~@9 x ~@6] ~@48>").gain(0.46)

// drums · crash
const crash = s("cr").struct("<~@67 x ~@44 [~@7 x] ~@2>").gain(0.46)

// drums · ride
const ride = s("rd").struct("<~@25 [x!8]!8 ~@24 [x!8]!9 ~@17 [x!8]!15 ~@17>").gain(0.46)

stack(
  bass, electric_guitar_jazz, distortion_guitar, rock_organ, piano, piano_2, kick, snare, low_tom, hihat, mid_tom,
  open_hat, high_tom, crash, ride
)

More by Chris Rea