Strudelify
KeyG majorTempo133 bpm
0:00/0:00
// Bad Time — Grand Funk Railroad
// 133 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 91 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(133/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.

// other · overdriven guitar · "GT.SOLO"
const overdriven_guitar = note("<~@67 A@2 B@2 C@2 D@2 ~@16>".pickRestart({
  A: "[a3@6 c4 b3@2 g3@2 b3@5]/2", B: "[c4@12 e4@2 d4@10 f4 e4 d4@2 e4@2 f4@2]/2",
  C: "[g4@3 g4@2 f4@3 [e4,f4] e4 d4@2 e4@2 d4@8 d4@2 [e4,f4] ~ d4@2 e4@2 f4@2]/2", // Fmaj7
  D: "[g4@2 f4@2 [e4,f4] e4 d4@2 e4@2 d4@2 c4@2 b3@18]/2", // Fmaj7
})).s("gm_overdriven_guitar").gain(0.72).pan(0.6)

// other · piano
const piano = note("<~@35 A@6 B@2 ~@16 A@6 B@2 ~@16 A@6 C@2>".pickRestart({
  A: "[~@2 [c5,c6] [a4,a5] [c5,c6] [e5,e6]@2 [d5,d6]@8 ~]/2", // C A C E D
  B: "[~@2 [c5,c6] [a4,a5] [c5,c6] [e5,e6]@2 [d5,d6]@5 [g3,g4] [b3,b4]@3]/2", C: "[a4,a5]/2",
})).s("gm_piano").gain(0.46).pan(0.3)

// chords · overdriven guitar · "GT.FUZZ"
const overdriven_guitar_2 = note(`<
  ~@14 A B C B C B C B C B C B D E F G H G H G I B C B C B C B C B C B C B C B D E F G H G H G I B C B C B C B C B C B C
  B C B D E F G H G H G I B C B C B C J@2
>`.pickRestart({
  A: "[d3,g3] ~@6 [g3,b3]", B: "[f3,a3]@8 [f3,a3] ~@3 [f3,a3] ~@3", C: "[g3,b3]@6 ~ [g3,b3]",
  D: "[g3,b3]@8 [d3,g3] ~@3 [d3,g3] ~@3", E: "[g3,c4]", F: "[e3,a3]", G: "[a3,d4]", H: "[c3,f3]",
  I: "[d3,g3] ~ [d3,g3]@6", J: "[f3,a3]/2",
})).s("gm_overdriven_guitar").gain(0.29).pan(0.8)

// chords · percussive organ · "ORGAN"
const percussive_organ = note(`<
  ~@14 A B C B C B C B C B C B C D E B@5 F B C B C B C B C B C B C B C B C D E B@5 F B C B C B C B C B C B C B C B C D E
  B@5 F B C B C B C G@2
>`.pickRestart({
  A: "[g5,b5,d6] ~@7", B: "~@2 [f5,a5,c6] ~@3 [f5,a5,c6] ~", C: "~@2 [g5,b5,d6] ~@3 [g5,b5,d6] ~",
  D: "~@2 [e5,g5,c6] ~@3 [e5,g5,c6] ~", E: "~@2 [e5,a5,c6] ~@3 [e5,a5,c6] ~", F: "[g5,b5,d6] ~@3 [g5,b5,d6]@12",
  G: "[f5,a5,c6]/2", // F
})).s("gm_percussive_organ").gain(0.17)

// chords · electric guitar clean · "GT.CHORD"
const electric_guitar_clean = note(`<
  ~@14 A B C B C B C B C B C B C D E B F B F B G B C B C B C B C B C B C B C B C D E B F B F B G B C B C B C B C B C B C
  B C B C D E B F B F B G B C B C B C H@2
>`.pickRestart({
  A: "[b3,d4,g4] ~@7", B: "~@4 [c4,f4,a4] ~@5 [c4,f4,a4] ~@5", C: "[b3,d4,g4]@7 ~@3 [b3,d4,g4] ~@5",
  D: "~@4 [c4,e4,g4] ~@5 [c4,e4,g4] ~@5", E: "[c4,e4,a4]@7 ~@3 [c4,e4,a4] ~@5", F: "[c4,f4,a4]@7 ~@3 [c4,f4,a4] ~@5",
  G: "[b3,d4,g4] ~@3 [b3,d4,g4]@10 ~@2", H: "[~ a4@15, a3, ~ [c4,f4]@31]/2",
})).s("gm_electric_guitar_clean").gain(0.27).pan(0.3)

// bass · electric bass finger · "BASS"
const bass = note(`<
  ~@14 A B C D E F G F G F G F H I J K L M L N O D P D P D P D P F G F G F G F H I J K L M L N O D P D P D P D P F G F G
  F G F H I J K L M L N O D P D P D P Q@2
>`.pickRestart({
  A: "~@12 a2@3 ~", B: "d2@5 ~ d2@2 a1@5 ~ d2@2", C: "g1@5 ~ d2@2 g1@3 ~ a1@3 ~", D: "d2@5 ~ d2@2 a1@3 ~ a1@2 d2@2",
  E: "g1@3 ~ d2@2 g2@3 ~ a1@2 g1@3 ~", F: "d2@6 d2@2 a1@3 ~ a1@2 d2@2", G: "g1@3 ~ g1@2 g2@2 g1@2 a1@2 g1@2 a1@2",
  H: "g1@3 ~ g1@2 g2@2 g1@2 g1@2 g1@2 a1@2", I: "c2@5 ~ c2@2 g1@3 ~ c2@2 g1@2", J: "a1@5 ~ a1@2 e1@2 e1@2 a1@2 e1@2",
  K: "d2@6 d2@2 a1@3 ~ d2@2 c2@2", L: "f2@5 ~ c2@2 f1@2 f1@2 g1@2 a1@2", M: "d2@3 ~ d2@2 a1@2 ~@2 a1@2 d2@2 c2@2",
  N: "d2@5 ~ d2@2 a1@2 a1@2 d2@2 a1@2", O: "g1 ~ g1@5 a1", P: "g1@5 ~ g2@2 g1@2 g1@2 a1@2 g1@2", Q: "d2/2",
})).s("gm_electric_bass_finger").gain(0.35)

// bass · synth bass 2 · "BASS"
const bass_2 = note("<~@4 A@2 ~ B C ~@82>".pickRestart({
  A: "[~@4 c3 d3@3 d#3 ~ e3@11 ~@11]/2", B: "~@10 a2 ~ d3@3 e3", C: "~ f3@11 ~@4",
})).s("gm_synth_bass_2").gain(0.38)

// chords · acoustic guitar steel · "GT.PICK"
const acoustic_guitar_steel = note("<~@2 A@5 B@7 C ~@76>".pickRestart({
  A: "[~@8 e4@23 ~@2 e4@23 ~@2 [c4,e4]@22, ~@6 [c3,e3]@25 [c3,e3]@25 a2@24, ~@7 [g3,c4]@24 ~ [g3,c4]@24 ~ [e3,a3]@23]/5", // C C5 A5
  B: "[~@8 f4@23 ~ [c4,f4]@33 ~@2 f4@23 ~@2 g4@20, ~@6 [d3,f3]@25 [f3,a3]@34 [d3,f3]@25 [g2,d3]@22, ~@7 [a3,c4]@24 ~@35 [a3,c4]@24 ~ [g3,b3]@21]/7", // F5 Dm F Dm G5 Am G
  C: "[g3,b3,d4,g4] ~@7", // G
})).s("gm_acoustic_guitar_steel").gain(0.37).pan(0.6)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@18 A ~@14 A ~@23 A ~@16 B ~@6 A ~@9>".pickRestart({
  A: "~@7 x", B: "~@14 x!2",
})).gain(0.71)

// drums · hihat
const hihat = s("hh").struct(`<
  A B ~@12 C D E@2 F D E@2 G D E@2 H D E D I D E J K D E@6 H D E@2 G D E@2 H D E L H D M J K D E@6 D ~@8 D E L H D M J K
  D E@4 N ~@2
>`.pickRestart({
  A: "~@3 x", B: "~@3 x ~@5 x ~@5 x", C: "x!4", D: "~ x!7", E: "x!8", F: "x!4 ~@4", G: "x!6 ~@2", H: "x!3 ~ x ~ x ~",
  I: "x!5 ~ x ~", J: "~ x!4 ~@3", K: "x", L: "~ x!6 ~", M: "x!5 ~ x!2", N: "x!7 ~",
})).gain(0.43)

// drums · mid tom
const mid_tom = s("mt").struct("<~@18 A ~@14 B ~@23 B ~@16 C ~@6 B ~@9>".pickRestart({
  A: "~@3 x", B: "~@13 x ~@2", C: "~@12 x!2 ~@2",
})).gain(0.71)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@14 A ~@7 A ~@3 B ~@3 C ~@11 B ~@3 A ~@6 A D ~ E ~@20 A D ~ E ~@7 A ~@2
>`.pickRestart({
  A: "~@7 x", B: "~@3 x ~ x ~@2", C: "~@5 x ~ x", D: "~@3 x ~ x ~ x", E: "~@5 x ~@2",
})).gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~@18 [~@5 x ~@2] ~@55 [~@10 x!2 ~@4] ~@16>").gain(0.71)

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

// drums · ride
const ride = s("rd").struct("<~@67 [~ x!3] [x!4]!3 [~ x!3] [x!4]!3 ~@16>").gain(0.64)

stack(
  overdriven_guitar, piano, overdriven_guitar_2, percussive_organ, electric_guitar_clean, bass, bass_2,
  acoustic_guitar_steel, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash, ride
)

More by Grand Funk Railroad