Strudelify

It Keeps You Runnin'

The Doobie Brothers

KeyG majorTempo130 bpm
0:00/0:00
// It Keeps You Runnin' — The Doobie Brothers
// 130 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 144 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · piano
const piano = note(`<
  ~@16 A B@2 C D ~@3 E F@2 G D ~ H I J ~ K L M ~@2 N O ~ P Q M ~@3 R S@2 ~ T U@2 V W X@2 Y W X@2 Y W X@2 Y W X@2 Y A B@2
  C Z ~@3 E F@2 G D ~ H I J ~ K L M ~@2 N O ~ P Q M ~@3 R S@2 ~ T U@2 V W X@2 Y W X@2 Y W X@2 Y W X@2 Y W X@2 Y W X@2 Y
  W X@2 ~@5
>`.pickRestart({
  A: "~@4 d4@3 ~", B: "[d4@2 c4@3 ~ c4@4 a#3@2 c4@6 d4@2 ~@12]/2", C: "d4@3 ~ c4@2 a#3@2 c4@2 b3@2 c4@2 g3@2",
  D: "b3@3 ~@13", E: "~@8 d4@2 d4@2 d4@3 ~", F: "[f4@3 ~ f4@2 d4 c4 a#3@2 c4@3 ~ c4@4 d4@2 ~@10 d3@2]/2",
  G: "d4!2 c4 a#3 c4 b3 c4 g3", H: "~@7 a#3", I: "a#4@3 ~ b4 g4!2 e4", J: "g4@3 ~ a4@3 ~@9", K: "~@10 f4@3 ~ g4@2",
  L: "a4@3 ~ a#4@2 a4@4 g4@5 ~", M: "g4 f4 d4@2 ~@12", N: "~@2 a#4 b4 a#4 a4!2 g4", O: "g4@5 a4 ~@2",
  P: "~@8 e4@2 g4@3 ~ g4@2", Q: "a#4@3 ~ a4@2 a4@4 g4@5 ~", R: "~@4 e4 g4!3",
  S: "[g4@3 ~ a4@3 ~ f4@3 ~ f4@7 ~ e4@2 d4@2 d4@3 ~ e4@3 ~]/2", T: "~@6 b3!2",
  U: "[b4@5 ~ a4@4 g4@2 a4@6 g4@2 e4@3 ~@9]/2", V: "~@4 a4@3 ~ f4@3 ~ e4@2 d4@2",
  W: "~@4 [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~", // Dm
  X: "[[d4,f4,a4]@3 ~ [e4,g4,b4]@3 ~@5 [d4,f4,a4]@7 ~ [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~]/2", // Dm Em Dm
  Y: "[d4,f4,a4]@3 ~ [e4,g4,b4]@3 ~@9", Z: "g3@3 ~@13",
})).s("gm_piano").gain(0.56)

// chords · piano · soft notes
const piano_soft = note("<~@139 A B C@2 A>".pickRestart({
  A: "[d4,f4,a4]@3 ~ [e4,g4,b4]@3 ~@9", B: "~@4 [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~",
  C: "[[d4,f4,a4]@3 ~ [e4,g4,b4]@3 ~@5 [d4,f4,a4]@7 ~ [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~]/2", // Dm Em Dm
})).s("gm_piano").gain(0.16)

// chords · lead 5 charang
const lead_5_charang = note(`<
  A B A C A B A C A B A C A B A C D E F G A B H C D E F G A B H C I J@2 K A B H C I J@2 K A B H C L@2 M N O P L Q R S@2
  T R S@2 T R S@2 T R S@2 T D E F G A B H C D E F G A B H C I J@2 K A B H C I J@2 K A B H C L@2 M N U P L Q R S@2 T R
  S@2 T R S@2 T R S@2 T R S@2 T R S@2 T R S@2 T R S@2 T
>`.pickRestart({
  A: "~@4 [b3,d4,f4,g4]@3 ~@5 [f#4,b4,d5]@3 ~", B: "~@4 [c#4,a#4]@3 ~ [c4,e4,g4]@3 ~@5",
  C: "~@4 [c#4,a#4]@2 [c4,a4]@2 [b3,d4,g4]@3 ~@5", D: "[d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~",
  E: "[d4,f4,g#4]@3 ~ [d4,f4,a4]@3 ~", F: "[d4,e4,g4]@3 ~ [d4,e4,g4]@3 ~", G: "[d4,d#4,f#4]@3 ~ [d4,e4,g4]@3 ~",
  H: "~@4 [b3,d4,f4,g4]@3 ~@5 [f4,b4,d5]@3 ~", I: "~@4 [a#3,d4,f4]@3 ~ [b3,d4,f4]@3 ~ [b3,d4,f4]@3 ~",
  J: "[[a#3,d4,f4]@3 ~ [a3,c4,e4]@3 ~@5 [a#3,d4,f4]@7 ~ [a#3,d4,f4]@3 ~ [b3,d4,f4]@3 ~ [b3,d4,f4]@3 ~]/2", // A# Am A# Bdim
  K: "[a#3,d4,f4]@3 ~ [a3,c4,e4]@3 ~@9", L: "[d4,g4,b4]@13 ~@3", M: "[c4,g4,a4]@13 ~@3", N: "[c4,f4,a4]@13 ~@3",
  O: "[d#4,f#4,a4,b4]@13 ~@3", P: "[c#4,e4,g4,a4]@3 ~ [d#4,f4,a4,b4]@3 ~", Q: "[d4,f4,a4,b4]@13 ~@3",
  R: "~@4 [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~", // Dm
  S: "[[d4,f4,a4]@3 ~ [e4,g4,b4]@3 ~@5 [d4,f4,a4]@7 ~ [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~]/2", // Dm Em Dm
  T: "[d4,f4,a4]@3 ~ [e4,g4,b4]@3 ~@9", U: "[d#4,f4,a4,b4]@13 ~@3",
})).s("gm_lead_5_charang").gain(0.06)

// bass · synth bass 2
const bass = note(`<
  A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C D E F A@2 B@2 G D E F A@2 H@2 I J I K A@2 L@2 I J I K A@2 M@2 N E O P Q R S T I U I
  V W X W Y I U I V W X W Z C D E F A@2 B@2 G D E F A@2 H@2 I J I K A@2 L@2 I J I K A@2 M@2 N E O P Q R S T I U I V W X
  W Y I U I V W X W AA I U I V W X W Y I U I V W X W AA
>`.pickRestart({
  A: "[g1@5 ~ d2@2 e2@3 ~ g2@6 d2@2 e2@3 ~ g2@3 ~ d2@2 e2@2]/2",
  B: "[g1@5 ~ d2@2 e2@3 ~ g2@6 d2@2 e2@3 ~ g1@3 ~ d2@2 c2@2]/2", C: "b1@5 ~ f2@2 b2@2 f2@2 b1@3 ~",
  D: "a#1@5 ~ f2@2 a#2@2 f2@2 b1@3 ~", E: "a1@5 ~ e2@2 a2@2 e2@2 a1@3 ~", F: "c#1@5 ~ c#2@2 g#2@2 e2@2 a1@3 ~",
  G: "b1@5 ~ f#2@2 b2@2 f#2@2 b1@3 ~", H: "[g1@5 ~ d2@2 e2@3 ~ g2@6 d2@2 e2@3 ~ g1@3 ~ d2@2 a#1@2]/2",
  I: "c2@5 ~ c2@2 g1@5 ~ g1@2", J: "c2@5 ~ c2@2 g1@3 ~ a1@2 a#1@2", K: "c2@5 ~ g1@2 c2@2 g1@2 c#2@2 d2@2",
  L: "[g1@5 ~ d2@2 e2@3 ~ g2@6 d2@2 e2@3 ~ g1@2 g1@2 d2@2 a#1@2]/2",
  M: "[g1@5 ~ d2@2 e2@3 ~ g2@6 d2@2 e2@3 ~ g1@2 g1@2 d2@2 d#2@2]/2", N: "e2@5 ~ e2@2 b1@3 ~ e2@2 b1@2",
  O: "d2@5 ~ d2@2 a1@3 ~ b1@2 c2@2", P: "d2@5 ~ d2@2 a#1@3 ~ c2@3 ~", Q: "b1@6 ~@2 b1@3 ~ f#2@2 b1@2",
  R: "c#2@5 ~ c2@2 d#2@5 ~ d2@2", S: "e2@3 ~ e2 b2 e2 c#2", T: "d2@5 ~ d2@2 d2@2 a2@2 d2@2 b1@2",
  U: "c2@5 ~ c2@2 g1@3 ~ g#1@2 a1@2", V: "c2@5 ~ g1@2 c2@2 g1@2 d2@2 d#2@2", W: "e2@5 ~ e2@2 b1@5 ~ b1@2",
  X: "e2@5 ~ e2@2 b1@3 ~ d2@2 b1@2", Y: "e2@2 e1@2 f1@3 ~ g1@2 g#1@2 a1@2 b1@2", Z: "g1@5 ~ g1@2 a1@3 ~ a1@3 ~",
  AA: "g1@5 ~ g1@2 a1@3 ~ b1@3 ~",
})).s("gm_synth_bass_2").gain(0.48)

// other · shakuhachi
const shakuhachi = note("<~@48 A@2 B@2 C@2 D E ~@48 A@2 B@2 C@2 D E ~@32>".pickRestart({
  A: "[f#4@13 ~@3]/2", B: "[d4@13 ~@3]/2", C: "[f#4@21 ~@3 g4@8]/2", D: "e4@13 ~@3", E: "d4@13 ~@3",
})).s("gm_shakuhachi").gain(0.48)

// drums · kick
const kick = s("bd").struct("x").gain(0.42)

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

// drums · snare
const snare = s("sd").struct("<~@21 A ~ A ~@5 A ~ A@17 ~@8 A@16 ~@5 A ~ A ~@5 A ~ A@17 ~@8 A@32>".pickRestart({
  A: "~ x",
})).gain(0.6)

// drums · hihat
const hihat = s("hh").struct("x ~ x!3 ~ x!2").gain(0.48)

// drums · cabasa
const cabasa = s("cabasa:4").struct("~ x ~ x").gain(2.13)

stack(piano, piano_soft, lead_5_charang, bass, shakuhachi, kick, rim, snare, hihat, cabasa)

More by The Doobie Brothers