Strudelify

Jerkin Back and Forth

Devo

KeyG majorTempo139 bpm
0:00/0:00
// Jerkin Back and Forth — Devo
// 139 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: Full arrangement: all 107 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(139/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.

// bass · synth bass 1 · "Synth Bass"
const bass = note(`<
  ~ A B C D E F E F E F E G H I J K L M A N C D E F E F E F E G O P Q R S T U@2 E F E F E F E F E F H I J K L M A N C V
  E F E F E F E F O P Q R S T U@2 E F E F E F E G H I J K L M W N C D H I J K L X W B C V Y Z ~ AA
>`.pickRestart({
  A: "e2@4 e2@4 g2@3 ~ g2@4", B: "a2@3 ~ a2@4 a#2@2 b2 ~ b2@2 a#2@2", C: "b2 ~ b2@2 a#2@2 b2 ~ b2@2 a#2@2 b2 ~ b2@2",
  D: "a#2@2 b2 ~ b2@2 a#2@2 b2 ~ b2@2 a#2@2 b2@2", E: "e2 ~ e2@2 ~@4 g2 ~ g2@2 ~@4",
  F: "b2 ~ b2@2 ~@4 d2 ~ d2 ~ d2@2 ~@2", G: "b2 ~ b2@2 ~@4 d2 ~ d2 ~ d2 ~@3",
  H: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2@2 g2@2", I: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2@2 a2@2",
  J: "b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2@2 a2@2", K: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2@2 c#3@2",
  L: "d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3@2 b2@2", M: "a2 ~ a2 ~ a2 ~ a2 ~ a2@2 g2@2 f#2@2 f2@2",
  N: "a2@4 a2@4 a#2@2 b2 ~ b2@2 a#2@2", O: "c2 ~ c2 ~ c2@2 c2 ~ c2 ~ c2 ~ c2 ~ c2@2",
  P: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~", Q: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2@2 d2@2",
  R: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~", S: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2@2",
  T: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2@2", U: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~",
  V: "a#2@2 b2 ~ b2@2 a#2@2 b2 ~ b2@2 a#2@2 b2 ~", W: "e2@3 ~ e2@4 g2@3 ~ g2@4",
  X: "a2@2 a2 ~ a2 ~ a2 ~ a2@2 g2@2 f#2@2 f2@2", Y: "b2@2 a#2@2 b2 ~ b2@2 a#2@2 b2 ~ b2@2 a#2@2", Z: "e2 ~@7",
  AA: "e2!2 ~ e2 ~ e2@3 ~@8",
})).s("gm_synth_bass_1").gain(0.31)

// other · lead 1 square · "Synth"
const lead_1_square = note(`<
  ~ A B C D E F E F E F E G H I J K L M A N C O E F E F E F E G P Q R S T U V@3 F E F E F E G W F H I J K L M X N C O E
  F E F E F W G P U R S T U V@3 F E F E F W G H I J Y L M A Z C O H AA J AB L AC A B C AD AE AF@2 AG
>`.pickRestart({
  A: "[e3,e4]!2 [g3,g4]!2", B: "[a3,a4]@4 [a3,a4]@4 [a#3,a#4]@2 [b3,b4] ~ [b3,b4]@2 [a#3,a#4]@2",
  C: "[b3,b4] ~ [b3,b4]@2 [a#3,a#4]@2 [b3,b4] ~ [b3,b4]@2 [a#3,a#4]@2 [b3,b4] ~ [b3,b4]@2", // B A# B A# B
  D: "[a#3,a#4]@2 [b3,b4] ~ [b3,b4]@2 [a#3,a#4]@2 [b3,b4] ~ [b3,b4]@2 [a#3,a#4]@2 [b3,b4]@2", // A# B A# B A# B
  E: "e3 ~ e3@2 g3@2 b3@2 g3 ~ g3@2 b3@2 d4@2", F: "b3 ~ b3@2 d#4@2 f#4@2 d3 ~ d3 ~ d3@2 f#3@2",
  G: "b3 ~ b3@2 d#4@2 f#4@2 d3 ~ d3 ~@3 f#3 ~", H: "a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3@2 g3@2",
  I: "e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3@2 a3@2", J: "b3 ~ b3 ~ b3 ~ b3 ~ b3 ~ b3 ~ b3@2 a3@2",
  K: "g3 ~ g3 ~ g3 ~ g3 ~ g3 ~ g3 ~ g3@2 c#4@2", L: "d4 ~ d4 ~ d4 ~ d4 ~ d4 ~ d4 ~ d4@2 b3@2",
  M: "a3 ~ a3 ~ a3 ~ a3 ~ a3@2 g3@2 f#3@2 f3@2", N: "[a3,a4]@4 [a3,a4]@3 ~ [a#3,a#4]@2 [b3,b4] ~ [b3,b4]@2 [a#3,a#4]@2",
  O: "[a#3,a#4]@2 [b3,b4] ~ [b3,b4]@2 [a#3,a#4]@2 [b3,b4] ~ [b3,b4]@2 [a#3,a#4]@2 b4@2, ~@14 b3 ~", // A# B A# B A#
  P: "c3@3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3@2, c5", Q: "d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~, d5",
  R: "c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3@2 d3@2, c5@3 d5", S: "e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~, e5",
  T: "c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3@2, c5@3 e5", U: "d3@2 d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~, d5",
  V: "[a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ e3 ~ e3@2 g3@2 b3@2 g3 ~ g3@2 b3@2 d4@2, a4@11 ~@5]/3",
  W: "e3 ~ e3@2 g3@2 b3@2 g3 ~ g3 ~ b3@2 d4@2", X: "[e3,e4]@4 [e3,e4]@4 [g3,g4]@3 ~ [g3,g4]@4",
  Y: "g3 ~ g3 ~ g3 ~ g3 ~ g3 ~ g3 ~ g3 ~ c#4@2",
  Z: "[a3,a4]@3 ~ [a3,a4]@3 ~ [a#3,a#4]@2 [b3,b4] ~ [b3,b4]@2 [a#3,a#4]@2", // A A# B A#
  AA: "e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3@2 a3@2, ~ e4 b4 e5",
  AB: "g3 ~ g3 ~ a#5@2 b5@2 f#5@2 g5@2 [g3,c#5]@2 [c#4,d5]@2, ~@4 g3 ~ g3 ~ g3 ~ g3 ~@5", // Gdim Dmaj7
  AC: "a3 ~ a3 ~ a3 ~ a3 ~ a3@2 ~@2 f#3@2 f3@2, ~@4 a4@4 e5@3 a5@4 ~, ~@5 g3 ~@2",
  AD: "[a#3,a#4]@2 [b3,b4] ~ [b3,b4]@2 [a#3,a#4]@2 [b3,b4] ~ [b3,b4]@2 [a#3,a#4]@2 [b3,b4] ~", // A# B A# B A# B
  AE: "[b3,b4]@2 [a#3,a#4]@2 [b3,b4] ~ [b3,b4]@2 [a#3,a#4]@2 [b3,b4] ~ [b3,b4]@2 a#4@2, ~@14 a#3 ~", // B A# B A# B
  AF: "[e3@2 ~@13 b4@2 a#4 b4@2 c5@2 c#5 d5@2 d#5 ~ e5@2 ~@3, e4 ~@31]/2", AG: "[e3,e4]!2 ~ [e3,e4] ~ [e3,e4]@2 ~@9",
})).s("gm_lead_1_square").gain(0.48)

// chords · distortion guitar · "Guitar"
const distortion_guitar = note(`<
  ~@13 A B C D E A ~@12 F G H I F J K@2 ~@10 A L C D M A ~@12 F G H I F J N O ~@8 A L C D E A ~@4 A P C D E A ~@7 Q
>`.pickRestart({
  A: "[a3,e4,a4]!2 ~@6", B: "[e3,b3]!2 ~@6, e4 ~@3", C: "[b3,f#4,b4]@2 [b3,f#4,b4] ~@13",
  D: "[g3,d4,g4]@2 [g3,d4,g4] ~@13", E: "[d4,a4,d5]!2 ~@6", F: "[g3,c4,g4]", G: "[a3,d4,a4]@15 ~",
  H: "[g3,c4,g4]@3 [a3,d4,a4]", I: "[b3,e4,b4]@15 ~", J: "[a3,d4,a4]",
  K: "[[e3,a3,e4]@7 ~ [e3,a3,e4]@10 [e3,a3,e4] ~ [e3,a3,e4] ~ [e3,a3,e4] ~ [e3,a3,e4] ~ [e3,a3,e4] ~ [e3,a3,e4] ~ [e3,a3,e4]@2]/2", // A5
  L: "[e3,b3,e4] [e3,b3] ~@6", M: "[d4,a4,d5]@2 [d4,a4,d5] ~@13", N: "[e3,a3,e4]@7 ~ [e3,a3,e4]@8",
  O: "~@2 [e3,a3,e4]@2 [e3,a3,e4] ~ [e3,a3,e4] ~ [e3,a3,e4] ~ [e3,a3,e4] ~ [e3,a3,e4] ~ [e3,a3,e4]@2", // A5
  P: "[e3,b3,e4]@2 [e3,b3] ~@13", Q: "[g#3,b3,e4] [g#3,b3] ~ [g#3,b3,d4,e4] ~ [b3,d4,e4]@2 ~@9, d4@3 ~ g#3@2 ~@10",
})).s("gm_distortion_guitar").gain(0.17)

// chords · synth brass 1 · "Solo Synth"
const synth_brass_1 = note("<~@38 A B C D E F E G H I J ~@25 K L M N O P Q R S ~@24>".pickRestart({
  A: "~@10 d5@2 d5 ~ d5@2", B: "e5@2 d5@2 b4 a4 g4 e4, d#5 ~@15",
  C: "b4@2 b3@2 ~@2 b3@2 ~@2 [d#5,e5] ~ e5 ~ e5 ~, a#4 ~@15", D: "e5!2 d5@2 b4 a4 g4 e4, d#5 ~@15",
  E: "b4@2 b3@3 ~ b3@2 ~@2 [f#5,g5] ~ g5 ~ g5 ~, a#4 ~@15", F: "g5@2 e5@2 d5 b4 a4 g4, f#5 ~@15",
  G: "[f#5,g5] ~ g5@2 e5 ~ e5@2 d5@2 b4@2 a4@2 g4@2", H: "b4@2 b3@2 ~@2 b3@3 ~ d4 ~ d4@2 e4@2, a#4 ~@15",
  I: "~@2 e4 ~ g4 ~@3", J: "b3@2 ~@2 b4@2 d4@2 ~@2 d4 ~@2 e4@2 ~, ~@6 d4 ~", K: "~@5 d5!3",
  L: "e5@2 b4 ~ b4 ~ b4 c#5 d5@2 g4 ~ g4 ~ g4 ~, d#5 ~@15", M: "b4@2 d4@2 ~@2 d4 ~@3 d5 ~ d5 ~ d5 ~, a#4 ~@15",
  N: "e5@2 d5@2 b4 a4 g4 e4, d#5 ~@7 a#4 ~@7", O: "b4@2 b3 ~@3 b3 ~@3 [f#5,g5] ~ g5 ~ g5 ~, a#4 ~@15",
  P: "[e5,f#5]@2 [e5,g5] ~ [e5,g5] ~ [e5,g5] ~ f#5@2 [d5,g5] ~ [d5,g5] ~ [d5,g5] ~, ~@8 d5 ~@7", // Esus2 Em G5
  Q: "f5@2 [b4,f#5] ~@3 [b4,f#5] ~@3 d5!2 f#5 ~ [d5,f#5] ~, b4 ~@9 f#5@2 ~@4", // B5 D
  R: "[b4,e5]@4 [b4,e5]@4 [d5,g5]@2 [b4,e5]@2 [d5,g5] ~ [d5,a5] ~", // E5 G5 E5 G5 D5
  S: "a#5 ~ a5@2 g5 ~ [b4,e5]@3 ~ d5 ~ d5@2 e5 ~, d5@5 ~@11", // E5
})).s("gm_synth_brass_1").gain(0.31)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@2 A B@2 ~ C@2 D ~ C@2 D ~ E ~ E ~ E ~ A B@2 ~ C@2 D ~ C@2 D ~@9 C@2 D ~ C@2 D ~@3 E ~ E ~ E ~ A B@2 ~ C@2 D ~ C@2 D
  ~@9 C@2 D ~ C@2 D ~ E ~ E ~ E ~ A B@2 F@6 ~ A B@3 ~@3
>`.pickRestart({
  A: "~@4 x!4", B: "x!8", C: "x", D: "x ~@4 x!2 ~", E: "x ~@6 x", F: "~@7 x",
})).gain(0.36)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@5 A@9 ~ A ~ A ~@5 A@8 ~@8 A@8 ~@2 A ~ A ~ A ~@5 A@8 ~@8 A@9 ~ A ~ A ~@5 B ~ B ~ B ~@8 C
>`.pickRestart({
  A: "~@7 x", B: "~@3 x", C: "x!2 ~ x ~ x ~@10",
})).gain(0.31)

// drums · open hat
const open_hat = s("oh").struct("<~@2 A ~@17 A ~@35 A ~@33 A ~@16>".pickRestart({
  A: "~@3 x ~@4",
})).gain(0.31)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@5 A@3 ~ A@3 ~@11 A@3 ~ A@3 ~@9 A@3 ~ A@3 ~@13 A@3 ~ A@3 ~@9 A@3 ~ A@3 ~@25
>`.pickRestart({
  A: "~@3 x",
})).gain(0.36)

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

stack(
  bass, lead_1_square, distortion_guitar, synth_brass_1, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash
)

More by Devo