Strudelify

Can't Help Myself

Four Tops

KeyG majorTempo123 bpm
0:00/0:00
// Can't Help Myself — Four Tops
// 123 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 63 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(123/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 · piano
const piano = note(`<
  A@3 B C@2 D E F@2 G H C@2 D E F@2 G H C@2 D E F@2 G H A@5 B C@2 D E F@2 G H C@2 D E F@2 G H C@2 D E F@2 G H A@3 B I
>`.pickRestart({
  A: "c4 ~ g3@2 a3@2 c4@4 g3@2 a3@2 c4 ~", B: "c5 ~ g4@2 a4@2 c5@4 g4@2 a4@2 c5 ~", C: "[g3,c4,e4]@2 ~ [g3,c4,e4]@4 ~",
  D: "[g3,b3,d4]@2 ~ [g3,b3,d4]@4 ~", E: "[g3,b3,d4]@4 ~@2 [g3,b3,d4]@3 ~ [g3,b3,d4] ~ [g3,b3,e4]@3 ~",
  F: "[a3,d4,f4]@2 ~ [a3,d4,f4]@4 ~", G: "[a3,c4,f4]@2 ~ [a3,c4,f4]@4 ~",
  H: "[g3,b3,d4,g4]@3 ~ [g3,b3,d4,g4]@3 ~ [g3,b3,d4,g4] ~ [a3,d4,a4]@4 ~@2", I: "[g3,c4,e4] ~@3",
})).s("gm_piano").gain(0.64)

// bass · fretless bass
const bass = note(`<
  A@6 B@2 C D E F A@2 B@2 C D E F A@2 B@2 C D E F A@8 B@2 C D E F A@2 B@2 C D E F A@2 B@2 C D E F A@4 G
>`.pickRestart({
  A: "c3 ~ g2@2 a2@2 c3@4 g2@2 a2@2 c3 ~", B: "g2 ~ d2@2 e2@2 g2@4 d2@2 e2@2 g2 ~",
  C: "d2 ~ a1@2 c2@2 d2@4 a1@2 c2@2 d2 ~", D: "d2 ~ a1 ~ c2 ~ d2@3 ~ d2 ~ e2@3 ~",
  E: "f2 ~ c2 ~ d2 ~ f2@3 ~ c2 ~ d2 ~ f2 ~", F: "g2 ~ a2 ~ b2 ~ g2 ~ f2 ~ g2 ~ a2 ~ b2 ~", G: "c2 ~@3",
})).s("gm_fretless_bass").gain(0.64)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  A@2 B C ~ D E@2 F G H I ~ D E@2 F G H I ~ D E@2 F G H I ~@2 A@2 B C ~ D E@2 F G H I ~ D E@2 F G H I ~ D E@2 F G H I
  A@2 B C J
>`.pickRestart({
  A: "c4 ~ g3@2 a3@2 c4@4 g3@2 a3@2 c4 ~", B: "c5 ~ g4@2 a4@2 c5@4 g4@2 a4@2 c5 ~",
  C: "c6 ~ g5@2 a5@2 c6@4 g5@2 a5@2 c6 ~", D: "~@4 g4@3 ~ c5@3 ~ e5@3 ~", E: "[[g4,b4,d5]@27 ~@5]/2",
  F: "~@4 f5@3 ~ e5@3 ~ d5@3 ~, [d4,f4]@11 ~@5", G: "[d4,f4,a4]@11 ~@5", H: "~@4 f5@3 ~ e5@3 ~ d5@3 ~, [f4,a4]@11 ~@5",
  I: "[g4,b4,g5]@3 ~ [g4,b4,g5]@3 ~ [g4,g5] ~ [a4,a5]@4 ~@2", J: "[c4,c5,c6] ~@3",
})).s("gm_string_ensemble_1").gain(0.56)

// other · baritone sax
const baritone_sax = note(`<
  ~@5 A B@2 ~ C D E ~ F G H ~ I J K L M N O ~ P Q R S T U@3 V W X ~ Y ~ Z AA AB ~ AC AA AD ~ AE AA AF ~ AG AH@2 AI AJ ~
  AK ~ AA AL AM@2
>`.pickRestart({
  A: "e3@3 ~ e3@3 ~ c3@2 e3 ~ c3@2 ~@2", B: "[~@15 a3@4 ~ g3@2 g3@3 ~@7]/2", C: "e3@3 ~@9 f3 ~@3",
  D: "~ f3 ~ d3@2 ~@2 c3@3 ~@6", E: "g3 ~@3 g3@2 ~@2 g3@2 a3@2 ~@4", F: "e3 ~ e3 ~ e3@3 ~ c3@3 ~@5",
  G: "g3@3 ~@3 g3@3 ~@3 e3@3 ~", H: "g3@3 ~ e3 ~ g3@3 ~@7", I: "f3 d3 ~@2 d3 ~@3", J: "d3@2 c3 ~@3 c3@3 ~@7",
  K: "g3@2 g3@4 g3 ~ g3@2 a3@5 ~", L: "e3@3 ~ e3@2 ~@2 c3 ~@7", M: "e3 ~ e3@3 ~ c3@3 ~@3 e3 ~@3",
  N: "a3@2 ~@2 e3 ~ g3@3 ~@3 e3@3 ~", O: "g3@3 ~ e3 g3@2 ~@9", P: "~@4 e3@3 ~@5 e3@3 ~", Q: "~@12 e3@3 ~",
  R: "g3 ~@3 g3@2 ~@2 g3@2 a3@5 ~", S: "e3@6 ~@2 c3 ~ c3 ~@5", T: "e3@2 ~@4 e3@2 c3@2 ~@2 c3 ~ e3@2",
  U: "[~@2 e3 ~ e3 ~ e3 ~ c3 ~ c3 ~@3 c3 e3@3 e3 ~ e3 ~ e3 ~ c3 ~@3 a3 ~@2 e3@2 ~ e3 ~ e3 ~ e3 ~ c3 ~@3 g3 ~ e3@2]/3",
  V: "~@2 e3 ~@2 e3!2 ~ c3 ~@3 g3 ~ e3@2", W: "~@6 e3 ~ c3 ~ e3 ~ c3 ~@3", X: "~@2 e3 ~ e3@3 ~@9",
  Y: "g3@3 ~ e3@2 g3@2 ~@8, a3 ~@15", Z: "e3@2 ~@2 e3@2 ~@2 e3@3 ~@5", AA: "~@7 e3", AB: "g3 ~ g3 ~ g3 a3@2 ~",
  AC: "e3 ~ e3 ~ e3@3 ~ c3 ~ e3 ~ c3 ~@3", AD: "~ [e3,g3] ~@2 e3 ~ g3@3 ~@7", AE: "~@4 e3@5 ~@7",
  AF: "g3@2 ~@2 g3@2 ~@2 g3@2 a3@3 ~@3", AG: "~@5 e3 g3 ~", AH: "[g3@2 e3 ~ e3 ~ g3@2 ~@6 e3 g3@2 ~@3 e3@2 g3@2 ~@8]/2",
  AI: "~@12 g3@3 ~", AJ: "~ f3@3 d3@2 ~@2 e3@3 ~@5", AK: "g3@3 ~ g3@2 ~@2 g3@2 a3@4 ~@2",
  AL: "~@2 e3 ~ d3 ~ d3 ~ c3 ~@5 e3 ~", AM: "[~@2 e3 ~ d3 ~ d3 ~ c3 ~@5 e3@4 e4 ~ e4 ~@3 c4 ~ d4 ~ c4@2 ~@2]/2",
})).s("gm_baritone_sax").gain(0.59).pan(0.4)

// drums · kick
const kick = s("bd").struct("<[x ~@4 x ~ x]!3 [x ~@6 x] [x ~@4 x ~ x]!29 [x ~@6 x] [x ~@4 x ~ x]!27 [x ~@6 x] x>")
  .gain(0.72)

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

// drums · hihat
const hihat = s("hh").struct("<[x!8]!62 x>").gain(0.72)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 [~@7 x] ~@29 [~@7 x] ~@27 [~@7 x] ~>").gain(0.72)

// drums · high tom
const high_tom = s("ht").struct("<~@3 [~@12 x!2 ~@2] ~@29 [~@12 x!2 ~@2] ~@27 [~@12 x!2 ~@2] ~>").gain(0.72)

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

stack(piano, bass, string_ensemble_1, baritone_sax, kick, snare, hihat, mid_tom, high_tom, crash)

More by Four Tops