Strudelify

Long Train Runnin'

The Doobie Brothers

KeyD minorTempo117 bpm
0:00/0:00
// Long Train Runnin' — The Doobie Brothers
// 117 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 110 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(117/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 · electric guitar jazz
const electric_guitar_jazz = note(`<
  A B@7 C B@4 D@2 B@2 E F B@5 G D@2 B@2 E F B@2 H@2 I J D@2 B@2 E F B@5 G D@2 B@2 E F B@2 H@2 I J D@2 B@2 E F B@2 K L M
  N D@2 B@2 O@4 B@7 C B@3 C B@3 C B@3 C B@3 C B@3 C P
>`.pickRestart({
  A: "~@14 d3!2",
  B: "[c4,a4] [d4,bb4]@2 [d3,d4,f4,bb4,d5]!2 ~ d3!4 [d3,d4,f4,bb4,d5]@2 [d3,d4,f4,bb4,d5] [d3,c4,f4,a4,d5]@3, [d3,f4,d5]@3 ~@13", // F Gm Bb Dm7 Dm
  C: "[g3,c4,a4,f5]@2 [g3,c4,a4,f5] [g3,c4,a4,f5]@2 [g3,c4,a4,f5] [g3,c4,a4,f5]@2 [g3,c4,a4,f5] [g3,c4,a4,f5]@2 [g3,c4,a4,f5]!4 g3", // F
  D: "~@2 [g3,bb3,eb4]@2 ~ [g3,bb3,eb4]@2 ~ [g3,bb3,eb4]@2 ~ [g3,bb3,eb4]@2 c3 [g3,bb3,eb4]@2, c3@3 ~", // Eb
  E: "~@9 eb4@2 bb3@2 ~ bb3@2, eb3@5 bb3@3 ~@5 eb4@3, ~@2 g4@4 eb3@9 ~, ~@3 eb4@4 ~ g4@8",
  F: "~@9 d4@2 a3@2 ~ a3 ~, d3@5 bb3@2 ~@6 d4@2 ~, ~@2 g4@4 d3@9 ~, ~@3 d4@4 ~ gb4@7 ~",
  G: "[c4,a4] [d4,bb4] ~ [d3,d4,f4,bb4,d5]!2 ~ d3!4 [d3,d4,f4,bb4,d5]@2 [d3,d4,f4,bb4,d5] [d3,c4,f4,a4,d5]@3, [d3,f4,d5]@3 ~@13", // F Gm Bb Dm7 Dm
  H: "[f3,bb3,d4]@2 ~@12 [e3,a3,db4] ~", I: "[f3,bb3,d4] ~@13 [e3,a3,db4] ~",
  J: "[f3,bb3,d4]@2 ~ [f3,bb3,d4]@2 ~ [f3,bb3,d4]@2 ~ [f3,bb3,d4]@2 ~ [f3,bb3,d4]@3 ~", // Bb
  K: "[f3,bb3] ~ d3 ~ [d3,f3,bb3] ~@2 d3 [f3,bb3] ~@2 d3 [f3,bb3] ~ [e3,a3] ~", // Bb5 Bb Bb5 A5
  L: "[f3,bb3] ~ d3!2 [f3,bb3] ~ d3!2 [f3,bb3] ~@2 d3 [f3,bb3] d3 [e3,a3]@2", // Bb5 A5
  M: "[f3,bb3] ~@2 d3 [f3,bb3] ~ d3!2 [f3,bb3] ~ d3!2 [f3,bb3] d3 [e3,a3] d3", // Bb5 A5
  N: "[f3,bb3]@2 d3 [f3,bb3]@2 d3 [f3,bb3] ~ d3 [f3,bb3] ~ d3 [f3,c4] bb3 f3 ~", // Bb5 F5
  O: "[~ [eb4,g4]@13 ~@3 g4@6 ~@2 gb4@5 ~@3 [bb3,eb4]@28 ~ g3!2, [eb3,bb3]@14 ~ d3@7 ~ d3@7 ~ c3@29 ~@4, ~@16 [bb3,d4]@7 ~ [a3,d4]@6 ~@2 g3@28 ~@4]/4", // Eb Eb5 Bb D5
  P: "[c4,f4,bb4]@2 ~ [c4,f4,bb4]!2 ~@11", // Fsus4
})).s("gm_electric_guitar_jazz").gain(0.22).pan(0)

// bass · fretless bass
const bass = note(`<
  ~@3 A B C@2 D E C@2 D E F G H I J K H L C@2 D E F G H I J K H L M@2 N O F@2 H I P Q R L C@2 D E F G H I J K H L M@2 N
  O F@2 H I P Q R L S@3 T F@2 H I U V W@2 ~@2 A B C@2 D E C@2 D E C@2 D E C@2 D E C@2 D E C@2 D E X
>`.pickRestart({
  A: "~@15 g2", B: "bb2 ~ g2 ~ f2@3 c2 d2 ~ f2@2 d2 c2 bb1 ~", C: "g1@7 c2 d2 ~ f2@3 d2 g2@2",
  D: "g1@6 ~ c2 d2 ~ f2@3 d2 g2@2", E: "g1@6 ~ c2 d2 ~ f2 d2 gb2 ~ g2 ~", F: "c2@4 ~@3 f2 g2 ~ bb2@3 g2 c3@2",
  G: "c2@4 ~@3 f2 g2 ~ bb2@2 ~ g2 c3@2", H: "g1@4 ~@3 c2 d2 ~ f2@2 ~ d2 g2@2", I: "g1@4 ~@3 c2 d2@2 f2 d2 gb2 ~ g2 ~",
  J: "eb2@3 ~ eb2@3 bb1 eb2@3 ~ eb2@3 ~", K: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ c2 ~ d2@2",
  L: "g1@4 ~@3 c2 d2 ~ f2 d2 gb2 ~ g2 ~", M: "g1@2 ~@11 g1 f1@2", N: "g1@2 ~@11 g1 f1 ~",
  O: "g1 ~@6 g1 ~ g1 a1@2 bb1 ~ d2 ~", P: "eb2@3 ~ eb2@3 bb1 eb2 ~ eb2@3 bb1 eb2@2",
  Q: "d2@2 d2 ~ d2 ~ d2 ~ d2 ~ d2@2 c2 ~ d2@2", R: "g1@4 ~@3 c2 d2 ~ f2@3 d2 g2@2",
  S: "g1@2 ~@2 g1@2 ~@2 g1@2 ~@2 g1 ~ gb1@2", T: "g1 ~ g1 ~ a1@2 ~ a1 bb1 ~ bb1 ~ d2@2 g1 ~", U: "eb2@15 ~",
  V: "d2!2, eb2 ~@15", W: "[c2@15 ~]/2", X: "g1@2 ~ g1!2 ~@11",
})).s("gm_fretless_bass").gain(0.54)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A B@7 C B@4 D E B@2 F G B@6 D E B@2 F G B@2 H@2 I J D E B@2 F G B@6 D E B@2 F G B@2 H@2 I J D E B@2 F G B@2 K@2 L J D
  E B@2 M@2 N@2 B@7 C B@3 C B@3 C B@3 C B@3 C B@3 C O
>`.pickRestart({
  A: "~@14 d3!2",
  B: "[c4,a4] [d4,bb4]@2 [g3,d4,f4,bb4,d5]!2 ~ g3!4 [g3,d4,f4,bb4,d5]@2 [g3,d4,f4,bb4,d5] [g3,c4,f4,a4,d5]@3, [g3,f4,d5]@3 ~@13", // F Gm Gm7 Dm7 G7
  C: "[g3,c4,f4]@2 [g3,c4,f4] [g3,c4,f4]@2 [g3,c4,f4]!2 [g3,c4,f4]@2 [g3,c4,f4] [g3,c4,f4]@2 [g3,c4,f4] [g3,c4,f4]@2 g3", // Csus4
  D: "c3@2 bb3 g3 c3 d4@2 ~@4 bb3@2 c3 g3 bb3, ~@7 c3@2 ~ c3@2 ~@4, ~@2 eb4 ~",
  E: "~@4 c3 g3@2 ~ bb3 g3 ~ eb4@2 c3 bb3@2, c3@3 bb3@2 ~@2 c3@2 ~ c3@2 ~@4, ~ eb4@3 ~@4",
  F: "[eb3,bb3] ~@3 [g4,bb4,eb5]@2 ~ [g4,bb4,eb5] [eb3,bb3] ~@3 [g4,bb4,eb5]@4, ~@2 [eb3,bb3]@5 ~@3 [eb3,bb3]@5 ~", // Eb5 Eb Eb5 Eb Eb5
  G: "[d3,g3] ~@3 [d4,g4,bb4]@2 ~ [d4,g4,bb4] [d3,a3] ~@3 [c4,gb4,a4]@3 ~, ~@2 [d3,g3]@4 ~@4 [d3,a3]@5 ~", // G5 Gm D5 Gbdim G5 D5
  H: "[bb3,d4,g4] ~@6 [a3,db4,gb4]", I: "[bb3,d4,g4] ~@7",
  J: "[bb3,d4,g4]@2 f3 ~ f3 ~ [f3,bb3,d4,g4]@2 f3 ~ f3 ~ [bb3,d4,g4]@2 f3 ~, f3 ~@2 [bb3,d4,g4]@2 ~@4 [bb3,d4,g4]@3 f3 ~@3", // Gm Gm7 Gm
  K: "[bb3,d4,g4]@2 ~@2 [bb3,d4,g4] ~@3 [bb3,d4,g4] ~@3 [bb3,d4,g4] ~ [a3,db4,gb4]@2", // Gm Gbm
  L: "[bb3,d4,g4]@2 ~@2 [bb3,d4,g4] ~@3 [bb3,d4,g4] ~@3 [bb3,d4,g4] ~@3", // Gm
  M: "[~ [g4,bb4,eb5]@13 ~@3 d5@6 ~@2 [a4,d5]@7, bb3@14 ~ bb3@7 ~@2 [a3,gb4]@8, ~@16 g4@7 ~@9, ~@16 bb4@5 ~@11]/2", // Eb D5 D
  N: "[~ [eb4,g4,bb4]@27 ~@2 d3!2, g3@7 ~]/2", O: "[d4,f4,bb4,d5]@2 ~ [d4,f4,bb4,d5]!2 ~@11",
})).s("gm_acoustic_guitar_steel").gain(0.22).pan(1)

// chords · rock organ
const rock_organ = note("<~@17 A B C ~@9 A B C ~@9 A B C ~@9 A B C ~@9 A B C ~@42>".pickRestart({
  A: "[eb5,g5,bb5]", B: "[d5,g5,bb5] [d5,gb5,a5]", C: "[g5,bb5] ~@7, d5 ~@15",
})).s("gm_rock_organ").gain(0.32)

// other · acoustic guitar steel
const acoustic_guitar_steel_2 = note(`<
  ~@5 A B C D A B C E F G H I J K L I A B C E F G H I J K L I ~@4 F G H I J K L I A B C E F G H I J K L I ~@4 F G H I J
  K L I ~@4 F G H I ~@2 M@2 ~@4 A B C D A B C D A B C D A B C D N@3 O P N@2 Q R
>`.pickRestart({
  A: "~@2 a3 bb3@2 g4@3 f4@3 d4@5", B: "~@2 a3 bb3 ~ g4@3 f4@3 d4@5", C: "~@2 a3 bb3@2 g4@3 f4@2 ~ d4@5",
  D: "~@2 a3 bb3@2 f4@3 ~@8", E: "~@2 a3 bb3@10 ~@3", F: "c3 g3 c4@2 g3 d4@2 g3 eb4@2 g3 d4@2 g3 c4@2",
  G: "c3 g3 c4@2 g3 d4@2 g3 eb4@2 g3 d4@2 g3 eb4 ~", H: "d3 ~ a3 bb3@2 g4@2 ~ f4@3 d4@5",
  I: "d3@2 a3 bb3 ~ g4@2 ~ f4@2 ~ d4@4 ~", J: "eb3 eb4 bb3 g3 eb4 bb3 g3 eb4 bb3 g3 eb4 bb3 g3 eb4 bb3 g3",
  K: "d3 d4 bb3 g3 d4 bb3 g3 d4 d3 d4 a3 gb3 ~ a3 gb3 d4, ~@6 d4 ~", L: "d3 ~ a3 bb3 ~ g4@2 ~ f4@2 ~ d4@4 ~",
  M: "[~@8 f3@2 ~@2 bb3@3 [bb3,c4,eb4]@2 bb3 c4@2 ~ bb3@11, ~@5 g3@11, ~@9 eb4@7]/2", // Cm7
  N: "g2@2 [f3,bb3]@2 g2 [g3,c4]@2 g2 [f3,bb3]@2 g2 [g3,c4]@2 g2 [f3,bb3]@2", // Bb5 C5 Bb5 C5 Bb5
  O: "g2@2 ~@2 g2 f4@2 g2 f3@2 g2 [f3,f4]@2 g2 [f3,c4]@2, ~@2 [f3,c4]@5 ~ c4@4 ~@4", // F F5
  P: "g2 ~ [f3,bb3]@2 g2 [g3,c4]@2 g2 [f3,bb3]@2 g2 [g3,c4]@2 g2 [f3,bb3]@2", // Bb5 C5 Bb5 C5 Bb5
  Q: "~@3 c4 f3 f4 c4 f3 f4 c4 f3 ~ c4 [f3,g3] f4 c4, g2, ~@2 f4@2 ~@7 f4@2 ~@3", R: "[f3,bb3]@2 ~ [f3,c4]!2 ~@11",
})).s("gm_acoustic_guitar_steel").gain(0.4)

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

// drums · clap
const clap = s("cp").struct("<~@5 [~ x ~ x]!72 ~@8 [~ x ~ x]!24 ~>").gain(0.62)

// drums · snare
const snare = s("sd").struct("<~@4 A@32 B A@23 B A@7 C D@3 E A@4 ~@7 A@25 F>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@2 x!2 ~ x!6", C: "~@4 x ~@7 x!2 ~@2", D: "x!4", E: "x!16", F: "x ~@2 x!2 ~@11",
})).gain(0.62)

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

// drums · open hat
const open_hat = s("oh").struct("<~@5 A@31 B A@23 B A@8 C D E ~ A@4 ~@8 A@24 ~>".pickRestart({
  A: "~ x ~@6", B: "~@2 x ~@2 x ~@10", C: "~ x!3 ~@4", D: "x ~@4 x ~@2", E: "x ~@6 x",
})).gain(0.56)

// drums · crash
const crash = s("cr").struct(`<
  ~@5 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A B
  ~@6 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@4
>`.pickRestart({
  A: "x", B: "x!2",
})).gain(0.5)

// drums · ride
const ride = s("rd").struct("<~@79 x ~@30>").gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<~@5 [~ x ~ x]!72 ~@8 [~ x ~ x]!24 ~>").gain(0.56)

// drums · congas
const congas = s("conga:13").struct("<~@5 [~ x ~@3 x ~@2]!72 ~@8 [~ x ~@3 x ~@2]!24 ~>").gain(1.99)

// drums · congas
const congas_2 = s("conga:18").struct("<~@5 [~@6 x!2 ~@8]!72 ~@8 [~@6 x!2 ~@8]!24 ~>").gain(1.99)

// drums · congas
const congas_3 = s("conga:33").struct("<~@5 [~@14 x!2]!72 ~@8 [~@14 x!2]!24 ~>").gain(1.99)

stack(
  electric_guitar_jazz, bass, acoustic_guitar_steel, rock_organ, acoustic_guitar_steel_2, kick, clap, snare, hihat,
  open_hat, crash, ride, tambourine, congas, congas_2, congas_3
)

More by The Doobie Brothers