Strudelify

Carefree Highway

Gordon Lightfoot

KeyF majorTempo166 bpm
0:00/0:00
// Carefree Highway — Gordon Lightfoot
// 166 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 160 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 28.
setcpm(166/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
const bass = note(`<
  A B C D@2 A E F G H A I J A E F K H L A B C L A B C M K M N O P A B C Q E A B C L A B C D@2 A E F G H A R J A E F K H
  L A B C L A B C M K M N O P A B C Q E A B C L A B C D@2 A E F G H A I J A E F K H L A B C L A B C M K M N O P A B C Q
  E A S C L A B C L A B C M K M N O P A B C Q E A S C L A B C L A B C L A B C L T@3
>`.pickRestart({
  A: "f1", B: "eb1", C: "bb1@3 f1", D: "[c1@5 c1@2 e1]/2", E: "c2", F: "a1", G: "d1 c1", H: "bb0", I: "c2@3 g1",
  J: "c1!2 d1 e1", K: "d1", L: "c1@3 e1", M: "c1@3 c2", N: "bb1 a1", O: "g1", P: "g1@2 g1@3 g1 d1 e1", Q: "c1",
  R: "~@3 g1, c2@3 ~, ~ c3", S: "eb1 ~", T: "[f1@3 ~]/3",
})).s("gm_fretless_bass").gain(0.4)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  A B C D ~@16 E F G H E F G I J K L ~ A B C D ~ A B C M A B C D ~@16 E F G H E F G I J K L ~ A B C D ~ A B C M A B C D
  ~@16 E F G H E F G I J K L ~ A B C D ~ A B C M A B C M A B C M N O P Q ~ A B C D ~ A B C M A B C M A B C M A B C M R@3
>`.pickRestart({
  A: "[c4,f4,a4,c5,f5,a5]@15 ~", B: "[bb3,eb4,g4,bb4,eb5,eb6]@15 ~", C: "[f4,bb4,d5,f5,bb5,f6]@7 ~",
  D: "[g3,c4,f4,c5,g5,c6]@11 ~ [g3,c4,f4,g4,c5,g5]@4", E: "[bb3,eb4,g4,bb4,eb5,g5]@15 ~",
  F: "[f4,bb4,d5,f5,bb5,bb6]@15 ~", G: "[g3,c4,e4,g4,c5,g5]@7 ~", H: "[c4,f4,a4,f5,c6,f6]@11 ~ [c4,f4,a4,c5,f5,c6]@4",
  I: "[a3,d4,f4,d5,a5,d6]@11 ~ [a3,d4,f4,a4,d5,a5]@4", J: "[g3,c4,e4,g4,c5,e5]@15 ~",
  K: "[f4,bb4,d5,f5,bb5,bb6]@8 [c4,f4,a4,c5,f5,f6]@7 ~", L: "[d4,g4,c5,d5,g5,d6]@7 ~",
  M: "[g3,c4,e4,c5,g5,c6]@11 ~ [g3,c4,e4,g4,c5,g5]@4", N: "[a3,d4,f4,a4,d5,f5]@15 ~", O: "[g3,c4,e4,g4,c5,c6]@15 ~",
  P: "[f4,bb4,d5,f5,bb5,f6]@4 [c4,f4,a4,c5,f5,c6]@3 ~", Q: "[d4,g4,c5,g5,d6,g6]@11 ~ [d4,g4,c5,d5,g5,d6]@4",
  R: "[[c4,f4,a4,c5,f5,a5]@17 ~@7]/3", // F
})).s("gm_acoustic_guitar_nylon").gain(0.24)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  A B C D ~@16 B E F G B E F H I J K ~ A B C D ~ A B C F A B C D ~@16 B E F G B E F H I J K ~ A B C D ~ A B C F A B C D
  ~@16 B E F G B E F H I J K ~ A B C D ~ A B C F A B C F A B C F L I M K ~ A B C D ~ A B C F A B C F A B C F A B C F N@3
>`.pickRestart({
  A: "[c4,f4,a4]", B: "[bb3,eb4,g4]", C: "[f4,bb4,d5,f5]", D: "[g3,c4,f4,g4]", E: "[f4,bb4,d5]", F: "[g3,c4,e4,g4]",
  G: "[c4,f4,a4,c5]", H: "[a3,d4,f4,a4]", I: "[g3,c4,e4]", J: "[f4,bb4,d5] [c4,f4,a4]", K: "[d4,g4,c5,d5]",
  L: "[a3,d4,f4]", M: "[f4,bb4,d5,f5] [c4,f4,a4,c5]", N: "[[c4,f4,a4]@3 ~]/3",
})).s("gm_string_ensemble_1").gain(0.26)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A@5 B C D E F G H I J K L M N O P Q@2 R P S@2 T U V W X Y Z Q@2 AA AB AC AD AE AF AG AH AE AI@2 B C D E F G H I J K L
  M N O P Q@2 R P S@2 T U V W X Y Z Q@2 AA AB AC AD AE AF AG AH AE AI@2 AJ C D E AK G H AL AM AN D M N O P Q@2 R P S@2 T
  U V W X Y Z Q@2 AA AB AC AO AP R P Q@2 R P S@2 T U V W X Y Z Q@2 AA AB AC AO AE AF AC AO AE AF AC AO AE AF AC AO AE AF
  AQ@3
>`.pickRestart({
  A: "[[c4,f4,a4]@2 ~@2 [bb3,eb4,g4]@2 bb3@2 [bb3,d4,f4]@2 ~@2 [c4,f4,g4]@2 [c4,g4]@2 ~@3 e2, f2@3 eb4@3 c2@2 [c4,e4,g4]@2, ~ [c4,a4]@3 bb2@3 f4@3, ~@2 f4@4 g4@4 [bb3,d4]@7 c2@3, ~@4 eb2@6 f4 f2@8 ~]/5", // F Eb Bb Csus4 C5 C F Bb
  B: "a4 [f4,a4,c5]@3 [f4,a4,c5]@2 a4@2, f2", C: "[e4,g4,c5] d5 f4 g4, c3", D: "[db4,e4,a4]@4 a4 [db4,e4,g4]@3, a2",
  E: "[d2,a3,d4,f4]@4 ~@3 c4, ~ c2", F: "[bb3,d4] f4 [d4,f4,bb4] bb4, bb1", G: "[c4,f4,a4] g4 [a3,c4,f4] g4, f2",
  H: "[f3,g3,c4]@2 ~ g2, c3@3 ~, ~ [c4,f4,g4]", I: "c2@2 c2@2 d2@2 ~ c4, [c4,e4,g4]@3 e2",
  J: "[c4,f4,a4]@2 c5 [f4,a4,c5]@3 c5@2, f2", K: "[e4,g4,d5]@2 c5 f4@3 g4@2, c3",
  L: "[db4,e4,a4] bb4 [db4,e4,a4] g4, a2", M: "[a3,d4,f4]!2, d2", N: "d4 [bb3,d4,f4]@3 [d4,f4,bb4]@2 bb4@2, bb1",
  O: "a4 [c4,e4,g4]@3 f4@2 [e2,e4]@2, c2@3 ~", P: "[a3,c4,f4]@2 [c4,f4,a4] [f4,a4,c5], f2",
  Q: "[[eb4,g4,d5]@4 [bb3,eb4,a4] g4 ~@2 [bb3,d4]@4 d4@2 [f2,f4]@2, eb2@4 bb2@3 ~, ~@3 f4@3 bb3@2]/2", // Ebmaj7 Eb Bb F
  R: "[c4,e4,a4] g4 f4@4 [e2,c4,e4,g4]@2, c2@3 ~", // Am C
  S: "[[eb4,g4,d5]@4 [bb3,eb4,a4] g4 ~@2 [bb3,d4]@4 d4 ~ f2@2, eb2@4 bb2@3 ~, ~@3 f4@3 bb3@2, ~@13 f4@3]/2", // Ebmaj7 Eb Bb
  T: "[c4,e4,a4] g4 [c4,e4,a4]@4 ~ c4, c2@3 c3", U: "[d4,f4,a4] a4 bb4 a4, d2",
  V: "g4 eb4 c4@4 c4!2, c2@3 c3, ~@2 e4@3 ~@3", W: "[bb3,d4,a4]@2 [bb3,d4,a4]@2 [c4,f4,a4] g4@3, bb2 a2",
  X: "f4 [c4,d4,g4]!3, g2", Y: "g2@2 ~@3 g2 d2 e2, [b3,d4,g4]!2, ~@2 g2@3 ~@3", Z: "~@2 [c4,f4,a4] [f4,a4,c5], f2",
  AA: "[c4,e4,a4] g4 f4@3 d4 c4@2, c2", AB: "~@2 [c4,e4,a4] g4 f4 [c4,e4,g4]@3, c3", AC: "[a3,c4,f4] [c4,f4,a4], f2",
  AD: "[bb3,eb4,g4]!2, eb2", AE: "[bb3,d4,f4]@2 ~ f2, bb2@3 ~, ~ [bb3,d4,f4]",
  AF: "[c4,e4,g4]@2 ~ e2, c2@3 ~, ~ [c4,e4,g4]", AG: "[c4,f4,a4]!2, f2", AH: "[eb4,g4,bb4]!2, eb2",
  AI: "[[c4,f4,g4]@2 [c4,f4,g4]@2 ~ c2@2 e2, c2@5 ~@3, ~ [c4,e4,g4]]/2", AJ: "[f4,a4] c5 [f4,a4,c5] a4, f2",
  AK: "[bb3,d4]@2 f4 [d4,f4,bb4]@3 bb4@2, bb1", AL: "c2@2 c2@2 d2@2 c4!2, [c4,e4,g4]@3 e2",
  AM: "a4 [f4,a4,c5]@3 [f4,a4,c5]@2 c5@2, f2", AN: "[e4,g4,d5] c5 f4 g4, c3", AO: "[eb2,bb3,eb4,g4] [bb3,eb4,g4]",
  AP: "[bb3,d4,f4]@2 [bb3,d4] [f2,bb3,d4,f4], bb2@3 ~", AQ: "[[f2,a3,c4,f4]@3 ~]/3",
})).s("gm_acoustic_guitar_steel").gain(0.52)

// chords · string ensemble 2
const string_ensemble_2 = note("<~@4 A ~@26 B ~@4 A ~@8 A ~@14 C ~@11 B ~@40 B ~@4 A ~@16 B ~@24>".pickRestart({
  A: "[g3,c4,e4,g5,c6]", B: "[d4,g4,b4,d6,g6]", C: "[c4,f4,a4,c6,f6]",
})).s("gm_string_ensemble_2").gain(0.2)

// chords · electric guitar muted
const electric_guitar_muted = note(`<
  ~@5 A ~@2 B C ~@7 C D ~@27 A ~@2 B C ~@7 E@8 ~@21 A ~@2 F@3 ~@2 A ~@4 G ~@59
>`.pickRestart({
  A: "c4", B: "~ [g3,e4,g4]", C: "f4", D: "[g3,e4]", E: "[~ g3@7, f4, ~ e4 ~@6]/8", F: "[~ e4 f4@2 ~@2, ~ g3@5]/3",
  G: "e4",
})).s("gm_electric_guitar_muted").gain(0.2)

// chords · string ensemble 1
const string_ensemble_1_2 = note("<~@53 A ~@23 B ~@8 B ~@7 A ~@45 B ~@19>".pickRestart({
  A: "[g3,c4] ~@15, e4@7 ~", B: "[g3,c4,e4]@7 ~",
})).s("gm_string_ensemble_1").gain(0.2)

// drums · kick
const kick = s("bd").struct("<x!157 ~@3>").gain(0.36)

// drums · rim
const rim = s("rim").struct("<[~ x]!157 ~@3>").gain(0.36)

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

// drums · low tom
const low_tom = s("lt").struct("<~@4 [~@3 x] ~@67 [~@3 x] ~@62 [~@5 x!2 ~] ~@24>").gain(0.32)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 A ~@26 B ~@13 B ~@26 A ~@13 B ~@26 B ~@4 C ~@41>".pickRestart({
  A: "~@4 x!2 ~@2", B: "~@4 x!3 ~", C: "~@2 x!2",
})).gain(0.32)

// drums · high tom
const high_tom = s("ht").struct("<~@4 A ~@26 A ~@13 A ~@26 A ~@13 A ~@26 A ~@21 B ~@24>".pickRestart({
  A: "~ x ~@2", B: "~ x!2 ~",
})).gain(0.32)

// drums · splash
const splash = s("cr").struct("<~@157 x ~@2>").gain(0.36)

stack(
  bass, acoustic_guitar_nylon, string_ensemble_1, acoustic_guitar_steel, string_ensemble_2, electric_guitar_muted,
  string_ensemble_1_2, kick, rim, hihat, low_tom, mid_tom, high_tom, splash
)

More by Gordon Lightfoot