Strudelify

Keep on Movin'

Soul II Soul

KeyC majorTempo105 bpm
0:00/0:00
// Keep on Movin' — Soul II Soul
// 105 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 80 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(105/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 · pad poly · "POLYSYNTH"
const pad_poly = note(`<
  A B A C A B A C D E F G D H I J K L M N O L M P Q R S T Q U S V K L M N O L M P Q R S T Q U S W@2 X Y X Z AA Z AB AC
  AD AE AF AG AD AE AH AC AD AE AF AG AD AE AH AC AD AE AF AG AD AE AH
>`.pickRestart({
  A: "d#4@2 [f#4,a#4,c5,d#5] ~ c4@2 [f#4,a#4,c5,d#5] ~@3 [f#4,a#4,c5,d#5] ~@3 [f#4,a#4,c5,d#5] ~", // Cm7b5
  B: "~@2 [f#4,a#4,c5,d#5] ~@3 [d#3,f#4,a#4,c5,d#5] ~ f#3 ~ [d#4,f#4,a#4,c5,d#5] ~ c4@2 [f#4,a#4,c5,d#5] ~", // Cm7b5
  C: "~@2 [f#4,a#4,c5,d#5] ~@3 [d#3,f#4,a#4,c5,d#5] ~ f#3 ~ [d#4,f#4,a#4,c5,d#5] ~ c4 ~ [f#4,a#4,c5,d#5] ~", // Cm7b5
  D: "d#4@2 [f#4,a#4,c5,d#5] ~ c4@2 [f#4,a#4,c5,d#5] ~@3 [f#4,a#4,c5] ~@3 [f#4,a#4,c5,d#5] ~, ~@5 d#5 ~@2", // Cm7b5
  E: "d4@2 [f4,a#4,c#5,d5] ~ a#3 ~ [f4,a#4,d5] ~@3 [f4,a#4,d5] ~@3 [f4,a#4,d5] ~, ~@3 f3 ~@4", // A#
  F: "f4@2 [a4,d5,f5] ~ d4@2 [a4,d5,f5] ~@3 [a4,d5,f5] ~@3 [a4,d5,f5] ~", // Dm
  G: "e4@2 [g4,c5,e5] ~ c4 ~ [g3,g4,c5,e5] ~@3 [g4,c5,e5] ~@3 [g4,c5,e5] ~", // C
  H: "d4@2 [f4,a#4,d5] ~ a#3 ~ [f4,a#4,d5] ~@3 [f4,a#4,d5] ~@3 [f4,a#4,d5] ~, ~@3 f3 ~@4", // A#
  I: "f4@2 [a4,d5,f5] ~ d4 ~ [a4,d5,f5] ~@3 [a4,d5,f5] ~@3 [a4,d5,f5] ~", // Dm
  J: "[c4,g4,c5,e5] ~ [c4,g4,c5,e5] ~ [d4,a4,d5,f5] ~ [e4,a#4,e5,g5]@6 ~@4", // C Dm Edim
  K: "~@2 [f3,a3,c4,f4,a4,c5] ~@3 [f3,a3,c4,f4,a4,c5] ~@3 [f3,a#3,d4,f4,a#4,c#5,d5] ~@3 [g3,c4,e4,g4,c5,e5] ~", // F A# C
  L: "~@2 [g3,c4,e4,g4,c5,e5] ~@3 [g3,c4,e4,g4,c5,e5] ~@3 [a3,c4,f4,a4,d5,f5] ~@3 [g3,c4,e4,g4,c5,e5] ~", // C Dm7 C
  M: "~@2 [f3,a#3,d4,f4,a#4,d5] ~@3 [f3,a#3,d4,f4,a#4,d5] ~@3 [f3,a#3,d4,f4,a#4,d5] ~@3 [f3,a#3,d4,f4,a#4,d5] ~", // A#
  N: "~@2 [f3,d4,f4,a#4,d5] ~@3 [f3,a#3,d4,f4,a#4,d5] ~@3 [g3,c4,e4,g4,c5,e5] ~@3 [g3,c4,e4,g4,c5,e5] ~, ~ a#3 ~@6", // A# C
  O: "~@2 [f3,a3,c4,f4,a4,c5] ~@3 [f3,a3,c4,f4,a4,c5] ~@3 [f3,a#3,d4,f4,a#4,d5] ~@3 [g3,c4,e4,g4,c5,e5] ~", // F A# C
  P: "~@2 [f3,a#3,d4,f4,a#4,d5] ~@3 [f3,a#3,d4,f4,a#4,d5] ~@3 [g3,c4,e4,g4,c5,e5] ~@3 [g3,c4,e4,g4,c5,e5] ~", // A# C
  Q: "[d#4,d#6]@2 [f#4,a#4,c5,d#5] ~ [c4,c6]@2 [f#4,a#4,c5,d#5] ~@3 [f#4,a#4,c5] ~@3 [f#4,a#4,c5,d#5] ~, ~@5 d#5 ~@2", // D# Cm7b5 C Cm7b5
  R: "[d4,d6]@2 [f4,a#4,c#5,d5] ~ [a#3,a#5] ~ [f4,a#4,d5] ~@3 [f4,a#4,d5] ~@3 [f4,a#4,d5] ~, ~@6 [f3,f5]@3 ~@7", // D A# F
  S: "[f4,f6]@2 [a4,d5,f5] ~ [d4,d6]@2 [a4,d5,f5] ~@3 [a4,d5,f5] ~@3 [a4,d5,f5] ~", // F Dm D Dm
  T: "[e4,e6]@2 [g4,c5,e5] ~ [c4,c6] ~ [g3,g4,c5,e5] ~@3 [g4,c5,e5] ~@3 [g4,c5,e5] ~, ~@6 g5@3 ~@7", // E C
  U: "[d4,d6]@2 [f4,a#4,d5] ~ [a#3,a#5] ~ [f4,a#4,d5] ~@3 [f4,a#4,d5] ~@3 [f4,a#4,d5] ~, ~@6 [f3,f5]@3 ~@7", // D A# F
  V: "[g4,c5,e5,e6] ~ [g4,c5,e5,e6] ~ [d4,a4,d5,f5,f6] ~ [e4,a#4,e5,g5,g6]@6 ~@4, c4!2 ~@6", // C Dm Edim
  W: "[[g4,c5,e5] ~ [g4,c5,e5] ~ [d4,a4,d5,f5] ~ [e4,a#4,e5,g5]@6 [a#4,e5,g5] ~@3 f2@12 f2@3 ~, c4!2 ~@5 [c5,f5,g#5]@3 ~@6]/2", // C Dm Edim Fm
  X: "a#2@11 ~ a#2@3 ~", Y: "f2@11 ~ f2@3 ~", Z: "g2@11 ~ g2@3 ~", AA: "c3@11 ~ c3@3 ~",
  AB: "[f3,a#3,d4,f4,a#4,d5] ~ [c3,g3,c4,e4,g4,c5,e5] ~ [c3,g3,c4,e4,g4,c5,e5]@3 ~ [c3,g3,c4,e4,g4,c5,e5] ~ [d3,a3,d4,f#4,a4,d5,f#5] ~ [d3,a3,d4,f#4,a4,d5,f#5]@4, a#2@2 ~@2 d#5 ~@11", // A# C D
  AC: "~@2 [g3,b3,d4,g4,b4,d5] ~@3 [g3,b3,d4,g4,b4,d5] ~@3 [g3,c4,e4,g4,c5,d#5,e5] ~@3 [a3,d4,f#4,a4,d5,f#5] ~", // G C D
  AD: "~@2 [a3,d4,f#4,a4,d5,f#5] ~@3 [a3,d4,f#4,a4,d5,f#5] ~@3 [b3,d4,g4,b4,e5,g5] ~@3 [a3,d4,f#4,a4,d5,f#5] ~", // D Em7 D
  AE: "~@2 [g3,c4,e4,g4,c5,e5] ~@3 [g3,c4,e4,g4,c5,e5] ~@3 [g3,c4,e4,g4,c5,e5] ~@3 [g3,c4,e4,g4,c5,e5] ~", // C
  AF: "~@2 [g3,e4,g4,c5,e5] ~@3 [g3,c4,e4,g4,c5,e5] ~@3 [a3,d4,f#4,a4,d5,f#5] ~@3 [a3,d4,f#4,a4,d5,f#5] ~, ~ c4 ~@6", // C D
  AG: "~@2 [g3,b3,d4,g4,b4,d5] ~@3 [g3,b3,d4,g4,b4,d5] ~@3 [g3,c4,e4,g4,c5,e5] ~@3 [a3,d4,f#4,a4,d5,f#5] ~", // G C D
  AH: "~@2 [g3,c4,e4,g4,c5,e5] ~@3 [g3,c4,e4,g4,c5,e5] ~@3 [a3,d4,f#4,a4,d5,f#5] ~@3 [a3,d4,f#4,a4,d5,f#5] ~", // C D
})).s("gm_pad_poly").gain(0.36).pan(0.6)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  A B A C A B A C A D E F A G E H I J K L M J N O A D E F A G E H I J K L M J N O A D E F A G E H P Q R Q S T S U V W X
  Y Z W AA AB V W X Y Z W AA AB V W X Y Z W AA AB
>`.pickRestart({
  A: "d#2 ~ c2 ~@5", B: "~@6 d#1 ~ f#1 ~ d#2 ~ c2@3 ~", C: "~@6 d#1 ~ f#1 ~ d#2 ~ c2@2 ~@2",
  D: "d2@2 ~@2 a#1 ~ f1@2 a#1 ~ f2 ~ d2@2 ~@2", E: "f2 ~ d2 ~@5", F: "e2@3 ~ c2 ~ g1@2 c2 ~ e2 ~ c2@2 ~@2",
  G: "d2@3 ~ a#1 ~ f1@2 a#1 ~ f2 ~ d2@2 ~@2", H: "c2 ~ c2 ~ d2 ~ e2@6 ~@4", I: "f1@3 ~ a1 ~ c2 ~ a#1@3 ~ c2@3 ~",
  J: "a1@2 ~@2 c2 ~ e2 ~ d2@3 ~ c2@3 ~", K: "g1@2 ~@2 a#1 ~ d2 ~ g1@2 ~@2 a#1 ~ d2 ~",
  L: "g1@2 ~@2 a#1 ~ d2 ~ a1@3 ~ c2 ~ e2 ~", M: "f1@4 a1 ~ c2 ~ a#1@2 ~@2 c2@3 ~",
  N: "g1@4 a#1 ~ d2 ~ g1@2 ~@2 a#1 ~ d2 ~", O: "g1@2 ~@2 a#1 ~ d2 ~ a1@4 c2 ~ e2 ~", P: "~@4 f1@7 ~ f1@3 ~",
  Q: "a#1@6 a#1 ~", R: "f1@6 f1 ~", S: "g1@6 g1 ~", T: "c2@6 c2 ~", U: "a#1@2 c2 ~ c2@3 ~ c2@2 d2 ~ d2@4",
  V: "g1@3 ~ b1 ~ d2 ~ c2@3 ~ d2@3 ~", W: "b1@2 ~@2 d2 ~ f#2 ~ e2@3 ~ d2@3 ~",
  X: "a1@2 ~@2 c2 ~ e2 ~ a1@2 ~@2 c2 ~ e2 ~", Y: "a1@2 ~@2 c2 ~ e2 ~ b1@3 ~ d2 ~ f#2 ~",
  Z: "g1@4 b1 ~ d2 ~ c2@2 ~@2 d2@3 ~", AA: "a1@4 c2 ~ e2 ~ a1@2 ~@2 c2 ~ e2 ~",
  AB: "a1@2 ~@2 c2 ~ e2 ~ b1@4 d2 ~ f#2 ~",
})).s("gm_electric_bass_finger").gain(0.71).pan(0.4)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  A@9 B C D A B C E F G H I F J K L A B C D A B C E F G H I F J K L ~@16 M N O P M Q R S M N O P M Q R S M N O P M Q R S
>`.pickRestart({
  A: "~@2 [f#4,a#4,c5,d#5] ~@3 [f#4,a#4,c5,d#5] ~@3 [f#4,a#4,c5,d#5] ~@3 [f#4,a#4,c5,d#5] ~", // Cm7b5
  B: "~@2 [f4,a#4,d5] ~@3 [f4,a#4,d5] ~@3 [f4,a#4,d5] ~@3 [f4,a#4,d5] ~", // A#
  C: "~@2 [a4,d5,f5] ~@3 [a4,d5,f5] ~@3 [a4,d5,f5] ~@3 [a4,d5,f5] ~", // Dm
  D: "~@2 [g4,c5,e5] ~@3 [g4,c5,e5] ~@3 [g4,c5,e5] ~@3 [g4,c5,e5] ~", // C
  E: "[g4,c5,e5] ~ [g4,c5,e5] ~ [a4,d5,f5] ~ [a#4,e5,g5]@6 ~@4", // C Dm Edim
  F: "~@2 [c4,f4,a4]!2 ~@2 [c4,f4,a4] ~@3 [d4,f4,g#4,a#4] ~@3 [e4,g4,c5] ~", // F A#7 C
  G: "~@2 [e4,g4,c5]!2 ~@2 [e4,g4,c5] ~@3 [f4,a4,d5] ~@3 [e4,g4,c5] ~", // C Dm C
  H: "~@2 [d4,f4,g#4,a#4] ~@3 [d4,f4,g#4,a#4] ~@3 [d4,f4,g#4,a#4] [d4,f4,a#4] ~@2 [d4,f4,g#4,a#4] ~", // A#7 A# A#7
  I: "~@2 [d4,f4,g#4,a#4] ~@3 [d4,f4,g#4,a#4] ~@3 [e4,g4,c5] ~@3 [e4,g4,a#4,c5] ~", // A#7 C C7
  J: "~@2 [e4,g4,c5]!2 ~@2 [e4,g4,c5] ~@3 [f4,a#4,d5] ~@3 [e4,g4,c5] ~", // C A# C
  K: "~@2 [d4,f4,a#4] ~@3 [d4,f4,g#4,a#4] ~@3 [d4,f4,a#4]!2 ~@2 [d4,f4,g#4,a#4] ~", // A# A#7 A# A#7
  L: "~@2 [d4,f4,g#4,a#4] ~@3 [d4,f4,g#4,a#4] ~@3 [e4,g4,c5] ~@3 [e4,g4,c5] ~", // A#7 C
  M: "~@2 [d4,g4,b4]!2 ~@2 [d4,g4,b4] ~@3 [e4,g4,a#4,c5] ~@3 [f#4,a4,d5] ~", // G C7 D
  N: "~@2 [f#4,a4,d5]!2 ~@2 [f#4,a4,d5] ~@3 [g4,b4,e5] ~@3 [f#4,a4,d5] ~", // D Em D
  O: "~@2 [e4,g4,a#4,c5] ~@3 [e4,g4,a#4,c5] ~@3 [e4,g4,a#4,c5] [e4,g4,c5] ~@2 [e4,g4,a#4,c5] ~", // C7 C C7
  P: "~@2 [e4,g4,a#4,c5] ~@3 [e4,g4,a#4,c5] ~@3 [f#4,a4,d5] ~@3 [f#4,a4,c5,d5] ~", // C7 D D7
  Q: "~@2 [f#4,a4,d5]!2 ~@2 [f#4,a4,d5] ~@3 [g4,c5,e5] ~@3 [f#4,a4,d5] ~", // D C D
  R: "~@2 [e4,g4,c5] ~@3 [e4,g4,a#4,c5] ~@3 [e4,g4,c5]!2 ~@2 [e4,g4,a#4,c5] ~", // C C7 C C7
  S: "~@2 [e4,g4,a#4,c5] ~@3 [e4,g4,a#4,c5] ~@3 [f#4,a4,d5] ~@3 [f#4,a4,d5] ~", // C7 D
})).s("gm_electric_guitar_clean").gain(0.29).pan(0.2)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note("<~@40 A B C D A E C F@2 ~@31>".pickRestart({
  A: "~@6 d#4@8 f4 ~", B: "d4@3 ~ a#3 ~ f3@7 ~@3", C: "~@6 f4@8 g4 ~", D: "e4@3 ~ c4 ~ g3@6 ~@4",
  E: "d4@3 ~ a#3 ~ f3@6 ~@4", F: "[e4 ~ e4 ~ f4 ~ g4@5 ~ g4 ~ g#4@7 ~@11]/2",
})).s("gm_electric_guitar_muted").gain(0.8)

// chords · pad sweep · "SWEEP PAD"
const pad_sweep = note("<~@48 A B A B C D C ~@25>".pickRestart({
  A: "~ [f3,g#3,c4,d#4]@2 ~", B: "~ [f3,g#3,a#3,d4]@2 ~", C: "~ [g3,a#3,d4,f4]@2 ~", D: "~ [g3,a#3,c4,e4]@2 ~",
})).s("gm_pad_sweep").gain(0.36).pan(0.6)

// drums · kick
const kick = s("bd").struct("<[x!2]!48 [x!4]!6 [x!3 ~] [x!3 ~ x!3 ~] [x!2]!24>").gain(0.48)

// drums · clap
const clap = s("cp").struct(`<
  ~@16
  [~ x ~ x]!7
  [~@4 x ~@7 x ~ x!2]
  ~@8
  [~ x ~ x]!7
  [~@4 x ~@7 x ~ x!2]
  ~@16
  [~ x ~ x]!24
>`).gain(0.48)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!47 [~@2 x ~@3 x!2] ~@6 [~@3 x] [~ x!2 ~@2 x!2 ~] [~ x ~ x]!24>").gain(0.48)

// drums · low tom
const low_tom = s("lt").struct("<~@48 [~ x ~ x]!6 [~ x ~@2] ~@25>").gain(0.48)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@48 [~ x ~ x]!2 ~@30>").gain(0.48)

// drums · open hat
const open_hat = s("oh").struct("<~@15 A B C@4 ~@10 A B C@4 ~@10 A ~@6 A ~ B C@4 ~@3 B C@4 ~@3 B C@4 ~@3>".pickRestart({
  A: "~@3 x", B: "~ x ~@5 x", C: "~@7 x",
})).gain(0.48)

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

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

// drums · cowbell
const cowbell = s("cb").struct("<~@16 A ~@3 A ~@11 A ~@3 A ~@43>".pickRestart({
  A: "x",
})).gain(0.48)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct(`<
  ~@16 A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~@18 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
>`.pickRestart({
  A: "~@10 x!2 ~@4",
})).gain(3.06)

// drums · agogo bells
const agogo_bells_2 = s("agogo:4").struct(`<
  ~@16 A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~@18 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
>`.pickRestart({
  A: "~@12 x!3 ~",
})).gain(3.06)

// drums · shaker
const shaker = s("sh").struct("<~@48 [x!2]!7 ~@25>").gain(0.48)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct(`<
  ~@24 A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@12 x ~ x!2",
})).gain(0.7)

// drums · woodblocks
const woodblocks_2 = s("woodblock:4").struct(`<
  ~@24 A ~ A ~ A ~ A ~@9 B ~ B ~ B ~ B ~@9 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "x!4 ~@6 x ~@5", B: "x!4 ~@12",
})).gain(0.7)

stack(
  pad_poly, bass, electric_guitar_clean, electric_guitar_muted, pad_sweep, kick, clap, snare, low_tom, hihat, mid_tom,
  open_hat, crash, tambourine, cowbell, agogo_bells, agogo_bells_2, shaker, woodblocks, woodblocks_2
)