Strudelify

Right Down The Line

Gerry Rafferty

KeyE minorTempo132 bpm
0:00/0:00
// Right Down The Line — Gerry Rafferty
// 132 bpm, 4/4, key E 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: duplicate parts dropped: ch 8 pan flute (copy of ch 7 pan flute)
// note: Full arrangement: all 151 bars on a 16-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.

// chords · drawbar organ
const drawbar_organ = note(`<
  ~ A B C D A B C D A E C D B F G H@2 A B C D A B C D A E C D B F G H@2 A B C D A B C D A E C D B F G H@2 I J K L M N
  O@2 J K L M N A B C D A B C D A E C D B F G H@2 A B C D A B C D A E C D B F G H@2 I J K L M N O@2 J K L M N A B C D A
  B C D A E C D B F G H@2 I J K L M N O@2 J K L M N O@2 J K L M ~@3
>`.pickRestart({
  A: "[a3,e4,a4,c5]", B: "[g3,d4,g4,b4]", C: "[e3,e4,g4,b4]", D: "[c3,e4,g4,c5]", E: "[g3,d4,g4,b4]@15 ~",
  F: "[d3,d4,f#4,a4]", G: "[e3,e4,g4,b4] [d3,d4,g4,b4]", H: "[[c3,e4,g4,c5]@31 ~]/2", I: "[e4,a4,c#5]",
  J: "[f#4,a4,c#5]", K: "[f#4,a4,d5]", L: "[f#4,a4,b4,d#5]", M: "[e4,g#4,b4,e5]", N: "[e4,g4,c5]",
  O: "[[e4,a4,c5]@31 ~]/2", // Am
})).s("gm_drawbar_organ").gain(0.09).pan(0.4)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~ A B C D A B C D A E C F B G C F@2 A B C D A B C D A E C F B G C F@2 A B C D A B C D A E C F B G C F@2 ~@13 A B C D A
  B C D A E C F B G C F@2 A B C D A B C D A E C F B G C F@2 ~@13 A B C D A B C D A E C F B G C F@2 ~@22
>`.pickRestart({
  A: "~@4 [e4,a4,c5]@2 [e4,a4,c5] ~@9", B: "~@4 [d4,g4,b4]@2 [d4,g4,b4] ~@9", C: "~@4 [e4,g4,b4]@2 [e4,g4,b4] ~@9",
  D: "~@4 [e4,g4,c5] ~ [e4,g4,c5] ~@9", E: "~@4 [d4,g4,b4] ~ [d4,g4,b4] ~@9", F: "~@4 [e4,g4,c5]@2 [e4,g4,c5] ~@9",
  G: "~@4 [d4,f#4,a4]@2 [d4,f#4,a4] ~@9", // D
})).s("gm_electric_guitar_clean").gain(0.16).pan(0.7)

// chords · piano
const piano = note(`<
  ~@51 A B C D E F G H@2 I J K L M ~@33 A N C D E F G H@2 I J K L M ~@17 B C D O F G H@2 C J K L M P Q C J K L ~@3
>`.pickRestart({
  A: "~@3 g2 c3 d3 e3 g3", B: "[e4,a4]@3 ~, a3", C: "[f#4,a4,c#5]@13 ~@3, f#3", D: "[d4,f#4,a4]@13 ~@3, d3",
  E: "[a3,d#4,f#4,b4]@13 ~@3, d#3", F: "[e3,d4,e4,g#4,b4]", G: "[c4,e4,g4,c5]@13 ~@3, c3@15 ~",
  H: "[~@2 c4 a3 b3 c4 a3 ~@3 c4 a3 b3 c4 d4 e4, [e4,a4,c5]@14 c4@5 ~@13, ~@4 [e4,a4,c5]@3 ~]/2", // Am
  I: "[f#3,f#4,a4], c#5@13 ~@3", J: "[d4,f#4,a4]@7 ~, d3", K: "[d#4,f#4,b4]@3 ~, d#3", L: "[e4,g#4,b4]@7 ~, e3",
  M: "[c3,e4,g4,c5]@15 ~", N: "[c#4,e4,a4]@3 ~, a3", O: "[a3,d#4,f#4]@13 ~@3, d#3, b4 ~@15", P: "[a3,e4,a4,c5]",
  Q: "[e4,a4,c5]@3 ~, a3", // Am
})).s("gm_piano").gain(0.16).pan(0.2)

// bass · electric bass pick
const bass = note(`<
  A B C D E F G H I J G K L M N O P Q R S T E U V W I J V X Y M N Z P AA R S T E U V W I J V X Y M N AB P AA AC AD AE AF
  AG AH AI AJ AK AL AM AN AO R S T E U V W I J V X Y M N AB P Q R S T E U V W I J AP X Y M N AB P AA AC AD AE AF AG AH
  AI AJ AK AL AM AN AO R S T E U V W I J V X Y M N AB P AA AC AD AQ AF AG AH AR AS AK AL AF AT AO AR AU AD AV AF AW ~@3
>`.pickRestart({
  A: "~@7 e2", B: "a1@4 ~@2 a2@2 ~@2 e2@2 ~@2 a1 ~", C: "g1@4 ~@2 g2@2 ~@2 d2@3 g1 ~@2", D: "e2 ~@2 e2 ~ b1 ~ e1",
  E: "c2@3 ~@3 c3@2 ~@2 g2@2 ~@2 c2 ~", F: "a1@3 ~@3 a2@2 ~@2 e2@2 ~@2 b1 ~", G: "g2@4 ~@2 g2@2 ~@2 d2@2 ~@2 g1 ~",
  H: "e2@5 ~ e2@3 ~ b1@2 ~@2 e1@2", I: "c2@3 ~@3 c3@2 ~@2 g2@2 ~ c2 ~@2", J: "a1@4 ~@2 a2@2 ~@2 e2@2 ~ a1 ~@2",
  K: "e2@4 ~@2 e2@2 ~@2 b1@2 ~ e1@2 ~", L: "c2@2 ~ g2 ~ c3 ~ g2", M: "g2@2 ~ g2 ~ d2 ~ g2",
  N: "d2@4 ~@2 d3@2 ~@2 a2@2 ~@2 d2 ~", O: "e2@4 ~@2 e2@2 d2@3 ~@3 d2 ~", P: "c2@4 ~@2 c3@2 ~@2 g2@2 ~@2 c2 ~",
  Q: "c2@4 ~@2 c3@3 ~ g2@3 ~ d2 ~", R: "a1@4 ~@2 a2@2 ~@2 e2 ~@3 a1 ~", S: "g2@4 ~@2 g2@2 ~@2 d2@2 ~ g1 ~@2",
  T: "e2@2 ~ e2 ~ b1 ~ e2", U: "a1@4 ~@2 a2@2 ~@2 e2@2 ~@2 b1 ~", V: "g1@4 ~@2 g2@2 ~@2 d2@2 ~@2 g1 ~",
  W: "e2@2 ~ e2 ~ b1 ~ e1", X: "e2@4 ~@2 e2@2 ~@2 b1@2 ~ e2@2 ~", Y: "c2@4 ~@2 g2@2 ~@2 c3@2 ~@2 g2 ~",
  Z: "e2@4 ~@2 e2 ~ d2@4 ~@2 d2@2", AA: "c2@4 ~@2 c3@2 ~@2 g2@3 ~ d2 ~", AB: "e2@4 ~@2 e2 ~ d2@4 ~@2 d2 ~",
  AC: "a2@5 ~ a2@5 ~ a2@2 g2@2", AD: "f#2@5 ~ f#2@5 ~ f#2@2 e2 ~", AE: "d2@5 ~ d2@6 ~@2 b1@2",
  AF: "d#2@5 ~ d#2@5 ~ d#2@2 b1@2", AG: "e2@5 ~ e2@5 ~ e2@2 d2 ~", AH: "c2@4 ~@2 g2@2 ~@2 c3@3 ~ g2 ~",
  AI: "a1@4 ~@2 e2@2 ~@2 a2@2 ~@2 e2 ~", AJ: "a1@2 ~ a1@2 ~ a2 g2", AK: "f#2@5 ~ f#2@6 f#2@2 e2 ~",
  AL: "d2@4 ~@2 d2@6 ~@2 d2 ~", AM: "d#2@4 ~@2 d#2@5 ~ d#2@2 b1@2", AN: "e2@4 ~@2 e2@5 ~ e2@2 d2@2",
  AO: "c2@5 ~ c2@5 ~ c2@2 b1 ~", AP: "g1@4 ~@2 g2@2 ~@2 d2@3 ~ g1 ~", AQ: "d2@5 ~ d2@7 ~ b1@2",
  AR: "a1@4 ~@2 e2@2 ~@2 a2@4 e2 ~", AS: "a1@4 ~@2 a1@5 ~ a2@2 g2@2", AT: "e2@5 ~ e2@5 ~ e2@2 d2@2",
  AU: "a1@5 ~ a1@5 ~ a2@2 g2@2", AV: "d2@4 ~@2 d2@7 ~ d2 ~", AW: "e2@5 ~ e2@5 ~@5",
})).s("gm_electric_bass_pick").gain(0.11)

// chords · harpsichord
const harpsichord = note(`<
  ~@52 A B C D E F G H I J K L M ~@34 N B C D E F G H I J K L M ~@17 O B C P E F G H B J K L M Q R B J K L ~@3
>`.pickRestart({
  A: "~ c#5@13 ~@2, a3, [e4,a4]@3 ~", B: "~ c#5@12 ~@3, f#3, [f#4,a4]@13 ~@3", C: "~ a4@12 ~@3, d3, [d4,f#4]@13 ~@3",
  D: "~ [f#4,b4]@12 ~@3, d#3, [a3,d#4]@13 ~@3", E: "~ [g#4,b4]@14 ~, [e3,d4,e4]",
  F: "~ [g4,c5]@12 ~@3, c3@15 ~, [c4,e4]@13 ~@3", G: "[e4,a4,c5]@15 ~", H: "[e4,a4,c5]@3 ~",
  I: "~ c#5@12 ~@3, [f#3,a4], f#4@13 ~@3", J: "~ a4@12 ~@3, d3, [d4,f#4]@7 ~", K: "~ b4@11 ~@4, d#3, [d#4,f#4]@3 ~",
  L: "~ b4@13 ~@2, e3, [e4,g#4]@7 ~", M: "~ c5@13 ~@2, [c3,e4,g4]@15 ~", N: "[c#4,e4,a4]@3 ~, a3", O: "[e4,a4]@3 ~, a3",
  P: "~ f#4@12 ~@3, d#3, [a3,d#4]@13 ~@3, ~ b4 ~@14", Q: "~ c5@14 ~, [a3,e4,a4]", R: "~ c5@11 ~@4, a3, [e4,a4]@3 ~",
})).s("gm_harpsichord").gain(0.16).pan(0.9)

// chords · pan flute
const pan_flute = note(`<
  ~@18 A B C D E F G H I J K L M N O P ~ A Q R D S T U H V W X Y Z N AA AB ~ AC AD AE AF AG AH AI ~ AJ AK AL AM AN AO AP
  AQ AR AS AT AU AV AW AX AQ AY AZ BA BB BC ~@18 AC AD AE AF AG AH AI ~ AJ AK AL AM AN AO AP BD AR BE AT AU AV AW AX AQ
  AY AZ BA BF AR ~ BG BH BI BJ BK BL@2 ~ BM BN BJ BO BL@2 ~@8
>`.pickRestart({
  A: "~@10 [g#4,a4] ~ a4@2 g4 ~, ~@12 g#4 ~@3", B: "a4 ~ g4@3 ~ g4@6 ~@4",
  C: "~@2 g4 ~ a4@2 g4 ~ e4@3 ~ d4@2 c4 ~, ~@8 d#4 ~@7", D: "d4 c4 ~@6", E: "~@8 a4@2 a4 ~ a4 ~ a4@2, ~@8 g#4 ~@7",
  F: "~@2 g4@2 ~@2 g4@7 ~@3", G: "~@2 g4 ~ a4@2 g4 ~ e4@3 ~ e4@2 d4@2, ~@8 d#4 ~@7", H: "e4 g4 ~@6",
  I: "~@4 c5@2 g4 ~ a4@2 g4 ~ a4@2 g4 ~, ~@4 b4 ~@3 g#4 ~@3 g#4 ~@3", J: "a4@2 g4@2 ~@2 g4@3 ~@5 g4 ~",
  K: "a4@2 ~ g4@2 ~ e4@5 ~ d4@2 c4 ~, ~@6 d#4 ~@9", L: "c4@4 ~@6 c4 e4@2 ~ g4 ~", M: "g4@3 ~@13",
  N: "~@2 [g#4,a4] ~ f#4 e4 d4@2 ~@8", O: "g4@3 e4@5 d4@6 c4@2, f#4 ~@15", P: "d4 c4@5 ~@2", Q: "a4 g4 ~ g4@3 ~@2",
  R: "~@2 g4 ~ a4@2 g4 ~ e4@4 d4@2 c4 ~, ~@8 d#4 ~@7", S: "~@8 a4@2 ~ a4!2 ~ a4@2, ~@8 g#4 ~@7", T: "~ g4 ~ g4@4 ~",
  U: "~@2 g4@2 a4@2 g4@2 e4@3 ~ e4@2 d4@2, ~@8 d#4 ~@7",
  V: "~@4 c5@2 g4 ~ [g4,g#4] ~ g4 ~ a4@2 g4 ~, ~@4 b4 ~@3 a4@2 ~@2 g#4 ~@3", W: "a4@2 a4 g4@2 ~ a4@3 ~@7, ~@6 g#4 ~@9",
  X: "~@2 g4 ~ a4@2 g4 ~ e4@4 d4@2 c4 ~, ~@4 g#4 ~@3 d#4 ~@7", Y: "d4@2 c4 ~@7 c4 e4 ~@2 g4 ~",
  Z: "g4@5 ~@11, f#4 ~@15", AA: "g4@2 e4@5 ~ d4@6 c4 ~, f#4 ~@15", AB: "d4 c4@7, c#4 ~@15",
  AC: "~@6 c#5 ~ e5@2 ~@2 e5@2 e5 ~, ~@8 d#5 ~@7", AD: "[a4,f#5]@6 [a4,f#5]@6 e5@2 [a4,f#5] ~, f5 ~@11 g#4 ~@3",
  AE: "[f#4,d5]@5 ~ [f#4,d5]@3 ~@5 [f#4,d5] ~, c#5 ~@15", AF: "[f#4,d#5]@5 ~ [f#4,d#5]@5 ~ [f#4,d#5]@3 ~, d5 ~@15",
  AG: "[g#4,e5]@2 [f#4,c#5] ~ [e4,b4] ~ [f#4,c#5]@4 ~@2 [f#4,c#5]@2 [e4,b4] ~, d#5 ~@5 [f4,c5] ~@9", // C#m F#5 E5 F#5 E5 F5
  AH: "[g4,e5]@2 [f4,d5]@2 [e4,c5]@2 ~@4 e5@3 g5@2 ~, ~@10 d#5 ~@5", AI: "g#5 ~ c6@8 ~@6, a5@5 ~@3",
  AJ: "~@5 [g4,e5] [a4,f#5]@6 [g#4,e5] ~ [a4,f#5]@2", AK: "[f#4,d5]@5 ~ [f#4,d5]@3 ~@5 [f#4,d5] ~, [f4,c#5] ~@15",
  AL: "[f#4,d#5]@5 ~ [f#4,d#5]@4 ~@2 [f#4,d#5]@2 ~@2, [f4,d5] ~@15", // D#m Dm
  AM: "[g#4,e5]@2 [f#4,c#5]@2 [e4,b4]@2 [f4,c5] [f#4,c#5]@4 [f#4,c#5]@3 b4 ~, [g4,d#5] ~@15", // C#m F#5 E5 F5 F#5 Cm
  AN: "[c5,e5]@2 [a4,d5] ~ [g4,c5]@4 ~@2 e5@2 ~ g#5 a5@2", AO: "a5@2 c6@7 ~ a5 ~ a5@2 g5 ~",
  AP: "a5@2 ~ g5@2 ~ g5@4 ~@6", AQ: "~@2 g5 ~ a5@2 g5 ~ e5@3 ~ d5@2 c5 ~, ~@8 d#5 ~@7", AR: "d5 c5 ~@6",
  AS: "~@8 [g#5,a5] ~ a5 ~ a5 ~ a5@2", AT: "~ g5 ~ g5@5", AU: "~@2 g5@2 a5@2 g5 d#5 e5@3 ~ e5@2 d5 ~",
  AV: "e5 g5 ~@6, d#5 ~@15", AW: "~@4 c6@2 g5 ~ a5@2 g5 ~ a5@2 g5 ~, ~@4 b5 ~@11",
  AX: "a5@2 g5@3 ~ a5@6 ~@4, ~@6 g#5 ~@9", AY: "d5@2 c5 ~@7 c5 e5@2 ~ g5 ~", AZ: "g5@3 ~@13",
  BA: "~@2 [g#5,a5] ~ f#5 ~ d5@2 ~@8, ~@5 e5@2 ~@9", BB: "g5@2 e5@6 d5@6 c5 ~, f#5 ~@7 c#5 ~@7",
  BC: "d5 c5 ~@6, c#5 ~@15", BD: "~@2 a5@2 g5@2 d#5 e5@5 d5@2 c5 ~", BE: "~@7 g#5 a5 ~ a5 ~ a5 ~ a5@2",
  BF: "g5@2 e5@6 d5@6 c5 ~, f#5 ~@15", BG: "~@10 [f#4,a4]@2 ~ [e4,g#4] a4 ~, ~@10 [e4,g#4] ~@2 f#4@2 ~",
  BH: "[e4,g#4,a4] ~@2 [e4,g#4,a4] ~ [e4,g#4] f#4@2 [f#4,a4]@2 ~ [e4,g#4] [f#4,a4] [e4,g4] [d4,f#4] ~, f#4@2 ~ f#4@2 ~ a4 ~ [e4,g#4] ~@7", // Amaj7 E F#m E F#m Em D E
  BI: "[e4,g4]@2 [d4,f#4]@12 [b3,e4] ~, d4 ~@15", BJ: "[d#4,f#4,a4]@2 [d#4,f#4,a4]@13 ~",
  BK: "~@2 d#5 e5@4 ~ d5@2 c5 ~ e4@2 g4 ~, ~@8 d#5 ~@7", BL: "[[e4,a4,c5]@27 ~@5]/2",
  BM: "~@3 [e4,g#4,a4] ~ [e4,g#4] a4 g#4 [f#4,a4]@2 ~ [e4,g#4,a4] f#4 [e4,g4] [d4,f#4] ~, ~@3 f#4@2 ~ f#4@2 e4 ~@7", // Amaj7 E F#m Amaj7 Em D
  BN: "d4 ~ d4@12 e4 ~, [e4,g4] ~@7, ~ f#4@12 ~@3", BO: "~@2 d#5 e5@3 d#5 ~ c5@2 e4@3 g4@3, ~@7 d5@2 ~@7",
})).s("gm_pan_flute").gain(0.32).pan(0.4)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~ [~@3 x ~@4]!147 ~@3>").gain(0.23)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!146 [~ x ~@2] ~@3>").gain(0.35)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A@2 ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A@2 ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A@2 ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@4
>`.pickRestart({
  A: "~ x ~@6",
})).gain(0.19)

// drums · crash
const crash = s("cr").struct("<~@52 A ~@7 A ~@38 A ~@7 A ~@21 A@2 ~@6 A ~@6 A ~@6>".pickRestart({
  A: "x",
})).gain(0.31)

// drums · cowbell
const cowbell = s("cb").struct("<~ x!147 ~@3>").gain(0.19)

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

// drums · woodblocks
const woodblocks = s("woodblock:5").struct(`<
  ~ A ~ B ~ C@2 A D E ~ E B ~ B ~@2 A@2 ~ B ~ C@2 A D E ~ E B ~ B ~@2 A@2 ~ B ~ C@2 A D E ~ E B ~ B ~@2 A ~@13 A ~ B ~
  C@2 A D E ~ E B ~ B ~@2 A@2 ~ B ~ C@2 A D E ~ E B ~ B ~@2 A ~@13 A ~ B ~ C@2 A D E ~ E B ~ B ~@2 A@2 ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~@3
>`.pickRestart({
  A: "~ x ~@2", B: "~@5 x ~@2", C: "~@3 x", D: "~@7 x", E: "~ x ~@6",
})).gain(0.28)

// drums · woodblocks
const woodblocks_2 = s("woodblock:4").struct(`<
  ~ A@2 B C ~@3 D C E ~ F G ~@2 F@2 A@2 B C ~@3 D C E ~ F G ~@2 F@2 A@2 B C ~@3 D C E ~ F G ~@2 F@2 ~@13 A@2 B C ~@3 D C
  E ~ F G ~@2 F@2 A@2 B C ~@3 D C E ~ F G ~@2 F@2 ~@13 A@2 B C ~@3 D C E ~ F G ~@2 F@2 A@19 ~@3
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@2 x ~@4 x", C: "~@3 x", D: "~@2 x!2 ~@4", E: "~ x", F: "~ x ~@6", G: "~@2 x ~@2 x!2 ~",
})).gain(0.28)

stack(
  drawbar_organ, electric_guitar_clean, piano, bass, harpsichord, pan_flute, kick, kick_soft, snare, hihat, hihat_soft,
  crash, cowbell, claves, woodblocks, woodblocks_2
)

More by Gerry Rafferty