Strudelify
Locomotion cover art

1993

Locomotion

Grand Funk Railroad

KeyD majorTempo130 bpm
0:00/0:00
// Locomotion — Grand Funk Railroad
// 130 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 8 baritone sax (copy of ch 6 "sax vocal lead" baritone sax)
// note: Full arrangement: all 90 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(130/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, A@4 for four bars: edit a riff to change every repeat.

// chords · baritone sax · "sax"
const baritone_sax = note("<A@3 B@2 C D ~@2 E@2 ~@8 F@2 G@2 F@2 H@2 C ~@3 E@2 ~@8 I J K@3 L M N ~@41>".pickRestart({
  A: "[~@5 [d2,a2,d3]@10 ~]/3", B: "[[d2,a2,d3]@15 ~]/2", C: "[d2,a2,d3]", D: "[b2,d3,f#3]@13 ~@3",
  E: "[[d2,a2,d3]@5 ~@3]/2", F: "[[d2,a2,d3]@7 ~]/2", G: "[[g2,d3,b3]@29 ~@3]/2", H: "[[a2,e3,c#4]@7 ~]/2",
  I: "~@10 d4@2 f#4 ~ a4 ~", J: "a4@4 g4@3 ~ e4@2 ~ e4@2 ~ b3@2, ~@5 d4 ~@2",
  K: "[d4@2 e4@2 ~@7 d4 e4@2 d4@5 ~@8 b4@3 a4@5 ~@8 f#4@3 e4 ~, ~@27 a4 ~@20]/3", L: "f#4 e4 d4@4 ~@4 d4@2 f#4@2 a4@2",
  M: "b4@3 ~ a4@3 f#4 a4 ~ a4@3 ~ a4@2", N: "~@2 a4@2 g4 ~ g4 ~ f#4@2 d4 ~@5",
})).s("gm_baritone_sax").gain(0.57)

// other · soprano sax · "sax"
const soprano_sax = note("<~@49 A B C@3 D E F ~@33>".pickRestart({
  A: "~@10 d4@2 f#4 ~ a4 ~", B: "a4@3 ~ g4@3 ~ e4@2 d4@2 e4@2 b3@2",
  C: "[d4@2 e4@3 ~@6 d4 e4@2 d4@5 ~@8 a4 b4@2 a4@6 ~@7 f#4@3 e4@2]/3", D: "f#4 e4 d4@5 ~@3 d4@2 f#4@2 a4@2",
  E: "b4@3 ~ a4@3 f#4 a4 ~ a4@3 ~ a4@2", F: "~@2 a4@2 g4 ~ g4 ~ f#4@2 d4 ~ e4@3 ~",
})).s("gm_soprano_sax").gain(0.57)

// chords · baritone sax · "sax 2"
const baritone_sax_2 = note("<~@41 A@2 B@4 C@2 D@2 E@4 F@2 G ~@3 H@2 ~@27>".pickRestart({
  A: "[~@4 [d2,a2,d3]@23 ~@5]/2", B: "[[g2,d3,b3]@28 ~@3 [d2,a2,d3]@27 ~@6]/4", C: "[[a2,e3,c#4]@29 ~@3]/2",
  D: "[~@4 [d2,a2,d3]@25 ~@3]/2", E: "[[g2,d3,b3]@28 ~@2 [d2,a2,d3]@27 ~@7]/4", F: "[[a2,e3,c#4]@3 ~]/2",
  G: "[d2,a2,d3]", H: "[[d2,a2,d3]@11 ~@5]/2",
})).s("gm_baritone_sax").gain(0.65)

// chords · electric guitar muted · "guitar"
const electric_guitar_muted = note(`<
  ~@5 A B A B C D A B E F G H I@2 A@2 E@2 J K L ~ M B A N A B A O E P E H Q R A@2 E S M T U L A@2 E@2 A@2 V L A W A O A
  B A X E P G H Y@2 Z W Z W AA@2 A W Z AB AC AD A AB AE AB AF@2 ~
>`.pickRestart({
  A: "~@2 [d4,f#4,a4,d5]!2 ~@2 [d4,f#4,a4,d5] ~", B: "~@2 [d4,f#4,b4,d5]!2 ~@2 [d4,f#4,b4,d5] ~",
  C: "~@4 [d4,f#4,a4,d5]@2 ~ d5@2 ~@4 d5@2 ~, ~@3 [d4,f#4,a4] ~@2 [d4,f#4,a4] ~", // D
  D: "~@4 [b4,d5]@2 [d4,f#4,b4,d5]@2 ~@4 [d4,f#4,b4,d5]@3 ~, ~@3 [d4,f#4]@2 ~@11", // Bm D
  E: "~@2 [d4,g4,b4,d5]!2 ~@2 [d4,g4,b4,d5] ~", // G
  F: "~@4 [e4,g4,b4,e5]@2 [e4,g4,b4,e5]@2 ~@4 [g4,b4,e5]@3 ~, ~@11 e4@3 ~@2", // Em
  G: "~@4 [g4,b4,d5]@2 [d4,g4,b4,d5]@2 ~@4 [d4,g4,b4,d5]@3 ~, ~@3 d4@2 ~@11", // G
  H: "~@4 [e4,g#4,b4,e5]@2 [e4,g#4,b4,e5]@2 ~@4 [e4,g#4,b4,e5]@3 ~", // E
  I: "[~@4 [d4,f#4,a4,d5]@2 [d4,f#4,a4,d5]@2 ~@4 [e4,a4,c#5]@8 [e4,a4,c#5]@2 [e4,a4,c#5]@2 ~@4 [e4,a4,c#5]@3 ~]/2", // D A
  J: "~@4 [d4,f#4,a4,d5]@2 [d4,f#4,a4,d5]@2 ~@5 d5@2 ~, ~@6 [d4,f#4,a4] ~", // D
  K: "~@5 d5 [d4,f#4,a4,d5]@2 ~@4 [d4,f#4,a4,d5]@2 ~@2, ~@2 [d4,f#4,a4] ~@5", // D
  L: "~@2 [e4,a4,c#5,e5]!2 ~@2 [e4,a4,c#5,e5] ~", // A
  M: "~@2 [f#4,a4,d5] [d4,f#4,a4,d5] ~@2 [d4,f#4,a4,d5] ~, ~@3 d4@2 ~@11", // D
  N: "~@5 d5 [d4,f#4,b4,d5]@2 ~@4 [d4,f#4,b4,d5]@2 ~@2, ~@2 [d4,f#4,b4] ~@5", // Bm
  O: "~@3 d4 [f#4,b4,d5]@2 [d4,f#4,b4,d5]@2 ~@4 [d4,f#4,b4,d5]@2 ~@2", P: "~@2 [e4,g4,b4,e5]!2 ~@2 [e4,g4,b4,e5] ~",
  Q: "~@2 [d4,f#4,a4,d5]!2 ~@2 [e4,a4,c#5,e5]@2", R: "~@4 [e4,a4,c#5,e5] ~ [e4,a4,c#5,e5]@2 ~@4 [e4,a4,c#5,e5]@2 ~@2",
  S: "~@5 d5 [d4,g4,b4,d5]@2 ~@4 [g4,b4,d5]@2 ~@2, ~@4 [d4,g4,b4]@2 ~@5 d4@2 ~@3", // G
  T: "~@2 [d4,f#4,a4,d5]!2 ~@2 d5 ~, ~@11 [d4,f#4,a4]@2 ~@3", // D
  U: "~@4 [e4,a4,c#5] ~ [e4,a4,c#5,e5]@2 ~@4 [e4,a4,c#5,e5]@2 [e4,a4,c#5,e5]@2", // A
  V: "~@2 [c#5,e5] [e4,a4,c#5,e5] ~@2 [e4,a4,c#5,e5]!2, ~@3 [e4,a4]@2 ~@11", // C#m A A5
  W: "~@4 [d4,f#4,b4,d5] ~ [d4,f#4,b4,d5]@2 ~@4 [d4,f#4,b4,d5] ~@3", // Bm
  X: "~@2 [b4,d5] [d4,f#4,b4,d5] ~@2 [d4,f#4,b4,d5] ~, ~@3 [d4,f#4]@2 ~@11", // Bm D
  Y: "[~@4 [d4,f#4,a4] d5 [d4,f#4,a4,d5]@2 ~@4 [e4,a4,c#5,e5]@6 ~@2 [e4,a4,c#5,e5]@2 [e4,a4,c#5,e5]@2 ~@4 [e4,a4,c#5,e5]@2 ~@2]/2", // D A
  Z: "~@4 [d4,f#4,a4,d5] ~ [d4,f#4,a4,d5] ~@5 [d4,f#4,a4,d5]@2 ~@2", // D
  AA: "[~@3 [d4,f#4,a4] d5 ~ [d4,f#4,a4,d5]@2 ~@4 [e4,a4,c#5,e5]@6 ~@2 [e4,a4,c#5,e5]@2 [e4,a4,c#5,e5]@2 ~@4 [e4,a4,c#5,e5]@2 ~@2]/2", // D A
  AB: "~@4 [d4,f#4,b4,d5] ~ [d4,f#4,b4,d5]@2 ~@4 [d4,f#4,b4,d5]@2 ~@2", // Bm
  AC: "~@4 [d4,f#4,a4,d5] ~ [d4,f#4,a4,d5]@2 ~@4 [e4,a4,c#5,e5]@4", // D A
  AD: "~@4 [e4,a4,c#5,e5] ~ [e4,a4,c#5,e5]@2 ~@4 [e4,a4,c#5,e5]@3 ~", // A
  AE: "~@4 [d4,f#4,a4,d5] ~ [d4,f#4,a4,d5]@2 ~@4 [f#4,a4,d5]@2 ~@2, ~@11 d4@2 ~@3", // D
  AF: "[~@4 [d4,f#4,a4,d5] ~ [d4,f#4,a4,d5]@2 ~@4 [e4,a4,c#5,e5]@6 ~@2 [e4,a4,c#5,e5] ~ [e4,a4,c#5,e5]@2 ~@4 [e4,a4,c#5,e5]@2 ~@2]/2", // D A
})).s("gm_electric_guitar_muted").gain(0.16)

// bass · electric bass finger · "bass"
const bass = note(`<
  ~ A B A B C D E D F D E G H I J K L@2 M N O H P Q R S T D Q D U V Q G H W X Y Z@2 AA N O AB P AC AD AE P AF AG H P AH
  AD AE P AI AJ AK P D P AL AM AN AO Y AP@2 AQ AR AS AT AU@2 AV AW AX AY AZ@2 BA BB BC BD BE@2 BF
>`.pickRestart({
  A: "d2@4 ~@2 d2 ~ d2@5 ~@3", B: "d2@4 ~@2 d2 ~ d2@3 ~ a2@3 ~", C: "d2@5 ~ d2@2 a2@5 ~@2 a2, c2 ~@15",
  D: "b2@2 ~ b2 f#2@2 b2@2", E: "d2@4 ~@2 d2@2 a2@3 ~ d2@2 a2@2", F: "d2@5 ~ d2 ~ d2@5 ~ a2 ~",
  G: "b2@4 ~@2 b2@2 a2@3 ~ f#2@3 ~", H: "g2@5 ~ g2@2 d2@4 g2@4", I: "e2@4 ~@2 e2@2 b2@4 e2@3 ~",
  J: "g2@5 ~ d2@2 g2@3 ~ f#2@3 ~", K: "e2@5 ~ e2@2 g#2@4 b2@3 ~, f2 ~@15",
  L: "[a2@4 ~@2 a2 ~ a2@2 ~@2 a2@7 ~ a2@3 ~ f#2@3 ~ e2@3 ~]/2", M: "d2@5 ~ d2@2 a2@7 ~", N: "d2 e2 f2 f#2",
  O: "g2@5 ~ g2@2 d2@5 ~ d2@2", P: "d2@5 ~ d2@2 a2@4 ~@2 a2@2", Q: "d2@5 ~ d2@2 a2@4 d2@4", R: "a2@2 ~ a2 e3@2 ~ e3",
  S: "a2@5 ~ a2@2 b2@4 c#3@3 ~", T: "d3@5 ~ d2 ~ d2@5 ~ d2@2", U: "d2@5 ~ d2 ~ d2@5 ~ d2@2",
  V: "b2@4 ~@2 b2 ~ b2@5 ~ b2@2", W: "e2@5 ~ e2@2 b2@4 ~@2 b2@2", X: "g2@5 ~ g2@2 d2@5 ~@3",
  Y: "e2@4 ~@2 e2@2 b2@3 ~ b2@3 ~", Z: "[d3@4 ~@2 d3@2 ~@4 a2@7 ~ a2@3 ~ b2@3 ~ c#3@4]/2", AA: "d3@4 d2@2 f#2 a2",
  AB: "g2@5 ~ g2@2 f#2@3 ~ e2@3 ~", AC: "d3 d2 f#2 g2", AD: "a2@5 ~ a2@2 e2@4 ~@2 e2@2", AE: "a2@4 g2@4 f#2@3 ~ e2@4",
  AF: "d3@5 ~ d3@2 b2@4 a2@3 ~", AG: "g2@3 ~ g2 ~ g2@2 d2@4 e2@2 d2@2", AH: "d2@4 ~@2 d2@2 a2@5 ~ d2@2",
  AI: "b2@4 ~@2 b2@2 f#2@3 ~ b2@3 ~", AJ: "d2@4 ~@2 d2@2 a2@4 ~@2 a2 ~", AK: "b2@4 ~@2 b2 ~ f#2 ~ f#2@2 b2@2 f#2@2",
  AL: "b2@4 ~@2 b2@2 f#2@3 ~ f#2@4", AM: "g2@5 ~ g2@2 d2@5 ~ d2 ~", AN: "e2@4 ~@2 e2@2 b2@5 ~ b2@2",
  AO: "g2@5 ~ g2@2 d3@3 ~ g2@4", AP: "[d3@3 ~@3 d3@2 a2@2 ~@2 a2@7 ~ a2@3 ~ b2@3 ~ c#3@4]/2",
  AQ: "d3@5 ~ d3 ~ d3@5 ~ d3@2", AR: "b2@4 ~@2 b2 ~ b2@2 a2@2 f#2@2 e2@2", AS: "d2@2 ~ d2 f#2@2 a2@2",
  AT: "b2@5 ~ b2 ~ b2@4 a2@3 ~", AU: "[d2@4 ~@2 d2@2 f#2@2 ~@2 a2@8 a2@2 ~@2 a2@2 f#2@2 e2@3 ~]/2",
  AV: "d2@4 ~@2 d2 ~ d2@4 f#2@2 a2 ~", AW: "b2@5 ~ b2@2 d3@2 b2@2 a2@4", AX: "d2@4 ~@2 d2@2 d3@4 b2@3 ~",
  AY: "a2@3 ~ a2@2 d3@2 b2@2 a2 ~ f2@3 ~", AZ: "[d2@4 ~@2 d2@2 f#2@2 ~@2 a2@8 a2@3 ~ b2@2 a2@2 f#2@2 e2@2]/2",
  BA: "d2@5 ~ d2@2 a2@4 d2@3 ~", BB: "b2@4 ~@2 b2@3 ~ a2@2 f#2@2 e2@2", BC: "d2@5 ~ d2@2 a2@3 ~ d2@3 ~",
  BD: "b2@2 ~ b2 a2 f#2 e2@2", BE: "[d2@4 ~@2 d2@2 f#2@2 ~@2 a2@7 ~ a2@3 ~ b2@2 a2 ~ [f2,f#2] ~ [e2,f2] ~]/2",
  BF: "d2 ~",
})).s("gm_electric_bass_finger").gain(0.28)

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

// drums · snare
const snare = s("sd").struct(`<
  ~ A B A B A@7 C A C A D A@3 B A B A@3 E A@7 C A C A C A B A B A B A B A B A B A B A B A D A@7 C A C A D A@3 C A@5 C A
  C A C A C A C A D ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@4 x!7", C: "~ x ~@2", D: "x!3 ~@13", E: "~ x!2 ~@13",
})).gain(0.72)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@12 A ~ A ~ B ~@9 B ~@7 C ~ A ~ C ~@17 B ~@7 C ~ B ~ B ~@3 B ~@5 C ~@3 C ~ A ~@3 B ~
>`.pickRestart({
  A: "~@10 x!2 ~@4", B: "~@9 x!3 ~@4", C: "~@11 x ~@4",
})).gain(0.72)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@16 A ~@9 A ~@29 A ~@9 A ~ A ~@3 B ~@15 A ~>".pickRestart({
  A: "~@6 x!3 ~@7", B: "~ x",
})).gain(0.72)

// drums · high tom
const high_tom = s("ht").struct("<~@16 A ~@9 A ~@29 A ~@11 A ~@19 A ~>".pickRestart({
  A: "~@3 x!3 ~@10",
})).gain(0.72)

// drums · crash
const crash = s("cr").struct(`<
  ~@3 A ~ A ~@10 A ~@4 A ~ A ~@17 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A@2 ~@11 A ~@20 A
>`.pickRestart({
  A: "x",
})).gain(0.64)

stack(
  baritone_sax, soprano_sax, baritone_sax_2, electric_guitar_muted, bass, kick, snare, low_tom, hihat, mid_tom,
  high_tom, crash
)

More by Grand Funk Railroad