Strudelify

Body Talk

Imagination

KeyC minorTempo88 bpm
0:00/0:00
// Body Talk — Imagination
// 88 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 77 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(88/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 2 · "SYN BASS 2"
const bass = note(`<
  A B C B C B C B D E D F G H I J K E D F G H I J K E D F G H I J K L M L N L O P Q E D F G H I J K L M L N L O P Q E D
  F G H I J K J K J K J K J K R S ~@2
>`.pickRestart({
  A: "~@7 bb2", B: "c3@3 c3@3 bb1@2 c2@3 c2@3 c2@2", C: "d2@3 d2@3 f2@2 g2@3 g2@3 bb2@2",
  D: "d2@3 d2@3 f2@2 g2@3 g2@3 bb1@2", E: "c2@2 ~ c2@3 bb1@2 c2@2 ~ c2@2 ~ c2@2",
  F: "c2@2 ~ c2@2 ~ bb1@2 c2@3 c2@2 ~ c2@2", G: "d2@2 ~ d2@3 f2@2 g2@3 g2@2 ~ g2@2",
  H: "ab2@2 ~ ab2@2 ~ g2@2 ab2@2 ~ ab2@2 ~ ab2@2", I: "g2@3 g2@3 f2@2 g2@2 ~ g2@3 bb2@2",
  J: "c3@2 ~ c3@3 bb1@2 c2@2 ~ c2@2 ~ c2@2", K: "d2@3 d2@3 f2@2 g2@2 ~ g2@3 bb1@2", L: "ab1@5 ~ ab1@2 bb1@5 ~ bb1@2",
  M: "eb2@5 ~ eb2 ~ eb2@2 ~ eb2 bb1@2 eb2@2", N: "eb2@5 ~@3 eb2@2 ~ eb2 bb1@2 eb2@2", O: "eb2@5 ~@3 eb2@5 ~ eb2@2",
  P: "d2 c2 bb1 ab1", Q: "g1@4 f1@4 eb1@4 d1@3 ~", R: "c3@2 ~ c3@3 bb1@2 c2@2 ~ c2@2 ~ c2@2, ab1@5 ~@11",
  S: "d2@3 d2@3 f2@2 ~@8",
})).s("gm_synth_bass_2").gain(0.5)

// chords · piano · "A.PIANO 2"
const piano = note("<~@8 A B C@2 D@2 E F@2 ~@25 G H I@4 ~@29>".pickRestart({
  A: "~@10 g5 ~@3 eb5@2, ~@11 g5@5", B: "d5@2 eb5 c5@7 g5 ~@3 eb5@2, ~@11 g5@5",
  C: "[d5@6 ~ d5@5 ~@2 f5@2 f5@6 eb5 d5 c5@5 ~@2 eb5, ~@6 c5@6 d5@11 ~@6 c5@3, ~@13 eb5@9 ~@8 d5@2]/2",
  D: "[eb5@2 d5 ~ d5@2 ~@4 g5@2 ~@4 d5@2 eb5 c5@7 ~@4 c5@2, ~@6 c5@6 g5@7 ~@8 eb5@5, ~@4 b4@2 ~ eb5@2 ~@4 c5@2 ~]/2",
  E: "~@6 bb6 ~@8 d6, c7@7 eb6, ~@7 bb6@9, ~@3 g6, ~@13 f6@3",
  F: "[d6@6 ~@2 c6@15 ~@9, ~@6 eb6@17 ~@9, ~@7 d6@16 ~@9]/2", G: "~@7 d6 ~@6 bb5@2, ~ eb6, ~@5 d6@3, ~@3 c6", H: "g5",
  I: "[~ g5@2 f5 g5@2 f5 g5@2 f5 g5@17 ~@15 g5@2 g5@2 f5 g5@6 ~@11, f5@3 ~@25 c7@6 eb6 d6 c6 d6 eb6 d6 c6 bb5@6 ~@17, ~@29 bb6@18 ~@17, ~@30 g6@2 g6@15 ~@17, ~@31 f6@2 f6@14 ~@17]/4",
})).s("gm_piano").gain(0.64)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note("<~@5 A@4 B C@7 B C@7 B C@7 ~@8 B C@7 ~@8 B C@16 D ~@2>".pickRestart({
  A: "~@2 [c4,eb5] ~@2 [bb3,d5] ~@2 [c4,eb5] ~@2 [bb3,d5] ~@2 [c4,eb5] ~", // Cm Bb Cm Bb Cm
  B: "~@2 [c4,eb5] ~@2 d5 ~@2 eb5 ~@2 d5 ~@2 eb5 ~", C: "~@2 eb5 ~@2 d5 ~@2 eb5 ~@2 d5 ~@2 eb5 ~",
  D: "~@2 eb5 ~@2 d5 ~@10",
})).s("gm_electric_guitar_muted").gain(0.45)

// chords · epiano1 · "E.PIANO 1"
const epiano1 = note(`<
  ~@5 A B C B D E@5 A B F E G@2 E@2 A B ~ E H@2 E@2 A B I J I K I L ~@2 D E H@2 E@2 A B I J I K I L ~@2 D E H@2 E@2 A B
  A B A B A B A B A M ~@2
>`.pickRestart({
  A: "[bb3,c4,eb4,f4]@2 [c4,eb5] [bb3,d4,eb4,f4] ~ [bb3,d5] [eb3,g3,bb3,c4,f4]@2 [c4,eb5] ~ [eb3,g3,bb3,eb4] [bb3,d5] [eb3,g3,c4,f4]@2 [bb3,c4,eb4,eb5] ~", // Bbsus4 Cm Bb Cm7 Cm Eb Bb Cm …
  B: "[g3,bb3,c4,eb4,f4]@2 [c4,eb5] [f3,bb3,d4,eb4] ~ [bb3,d5] [eb3,g3,c4,f4]@2 [c4,eb5] ~ [eb3,g3,bb3,eb4] [bb3,d5] [eb3,g3,c4,f4]@2 [bb3,c4,eb4,eb5] ~", // Cm7 Cm Bb Cm Eb Bb Cm Cm7
  C: "[bb3,c4,eb4,f4]@2 [c4,eb5] [bb3,d4,eb4,f4] ~ [bb3,d5] c4@2 [c4,eb5] ~ [eb3,g3,bb3,eb4] [bb3,d5] [eb3,g3,c4,f4]@2 [bb3,c4,eb4,eb5] ~, ~@3 [eb3,g3,bb3,f4]@2 ~@3", // Bbsus4 Cm Bb Cm Eb Bb Cm Cm7 …
  D: "~@2 [c4,eb5] ~@2 d5 ~@2 eb5 ~@2 d5 ~@2 eb5 ~", E: "~@2 eb5 ~@2 d5 ~@2 eb5 ~@2 d5 ~@2 eb5 ~",
  F: "~@2 [c4,eb5] ~@2 d5 ~@2 eb5 ~@2 d5 ~@2 eb5 ~, ~@6 eb6@9 ~, ~@7 [g6,bb6]@9", // Cm Gm
  G: "[~@2 eb5 ~@2 d5 ~@2 eb5 ~@2 d5 ~@2 eb5 ~@3 eb5 ~@2 d5 ~@2 eb5 ~@2 d5 ~@2 eb5 ~, ~@7 eb6@11 ~@14, ~@4 [g6,bb6]@5 ~@7]/2", // Gm
  H: "[~@2 eb5 ~@2 d5 ~@2 eb5 ~@2 d5 ~@2 eb5 ~@3 eb5 ~@2 d5 ~@2 eb5 ~@2 d5 ~@2 eb5 ~, ~@8 [eb6,g6]@11 ~@13, ~@9 bb6@10 ~@13]/2", // Eb
  I: "~@2 [eb4,ab4,c5] ~@2 [eb4,ab4,c5] ~@2 [f4,bb4,d5] ~@2 [f4,bb4,d5] ~@2 [f4,bb4,d5] ~", // Ab Bb
  J: "~@2 [g4,bb4,eb5] ~@2 [g4,bb4,eb5] ~@2 [g4,bb4,eb5] ~@2 [g4,bb4,eb5] ~@2 [eb4,g4,bb4] ~", // Eb
  K: "~@2 [g4,bb4,eb5] ~@2 [g4,bb4,eb5] ~@2 [g4,bb4,eb5] ~@3 [eb4,g4,bb4] ~@3", // Eb
  L: "~@2 [g4,bb4,eb5] ~@2 [g4,bb4,eb5] ~@2 [g4,bb4,eb5] ~@2 [g4,bb4,eb5] ~@2 [g4,bb4,eb5] ~", // Eb
  M: "[g3,bb3,c4,eb4,f4]@2 [c4,eb5] [f3,bb3,d4,eb4] ~ [bb3,d5] [eb3,g3,c4,f4]@3 ~@7", // Cm7 Cm Bb Cm
})).s("gm_epiano1").gain(0.32)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@13 A B C@2 ~@4 A B D@2 ~@4 A B E@2 F@2 G@2 H@2 I J ~@4 A B E@2 F@2 G@2 H@2 I J ~@4 A B K@2 L@2 M@6 N@2 ~@2
>`.pickRestart({
  A: "[c4,eb4,ab4] [d4,f4,bb4]", B: "[eb4,g4,c5] [d4,f4,bb4]",
  C: "[~@6 [ab4,ab5]@4 g4@6 ab4@6 ~@4 [g4,g5] ~@5, c4@3 [d4,bb4], eb4@16 f4@15 ~, g4@10 g5 ~@11 [ab4,ab5]@4 ~@6]/2", // Ab G Gm Ab
  D: "[~@6 [ab4,ab5]@4 g4@6 ab4@6 ~@4 [g4,g5] ~@5, c4@24 [d4,bb4]@7 ~, eb4@16 f4@15 ~, g4@10 g5 ~@11 [ab4,ab5]@4 ~@6]/2", // Ab G Gm Ab
  E: "[~@6 [ab4,ab5]@4 g4@6 ab4@6 ~@4 [g4,g5] ~ ab5@2 bb5@2, c4@3 [d4,bb4], eb4 f4, g4@10 g5 ~@11 [ab4,ab5]@4 ~@6]/2", // Ab G Gm Ab
  F: "[c5@4 c5@4 d5@4 d5@4 eb5@3 eb5@4 eb5@4 ~ eb5@4, [eb4,ab4] bb4@3, c6@2 ~@2 c6 ~@3 f4@8 g4@16, ~@8 d6 ~@3 d6 ~@3 eb6 ~@2 eb6 ~@3 eb6 ~@4 eb6 ~@3]/2", // Ab5
  G: "[c5@4 c5@4 d5@4 d5@3 ~ eb5@3 eb5@4 ~ eb5@4 eb5@4, [eb4,ab4] bb4@3, c6 ~@3 c6 ~@3 f4@8 [eb4,g4]@15 ~, ~@8 d6 ~@3 d6 ~@3 eb6 ~@2 eb6 ~@4 eb6 ~@3 eb6 ~@3]/2", // Ab5 Eb
  H: "[c5@4 c5@4 d5@4 d5@3 ~ eb5@3 eb5@4 ~ eb5@4 eb5@4, [eb4,ab4] bb4@3, c6 ~@3 c6 ~@3 f4@8 g4@15 ~, ~@8 d6 ~@3 d6 ~@3 eb6 ~@2 eb6 ~@4 eb6 ~@3 eb6 ~@3]/2", // Ab5
  I: "[f5,f6] ~@3 [f5,f6] ~@3 [f5,f6] ~@3 [eb5,eb6] ~@3, [f4,ab4,d5]", // F Eb Ddim
  J: "[d5,d6] [eb5,eb6] [d5,d6] [eb5,eb6] [d5,d6] [eb5,eb6] [d5,d6] [eb5,eb6], [eb4,g4,c5]@15 ~", // D Eb D Eb D Eb D Eb …
  K: "[~@6 [ab4,ab5]@4 g4@6 ab4@6 ~@6 f5@2 eb5 ~, c4@3 [d4,bb4], eb4 f4, g4@10 g5 ~@11 [ab4,ab5]@4 ~@6]/2", // Ab Gm Ab
  L: "[~@6 d6@4 c6 ~@15 [d5,d6] ~@5, c4@3 [d4,bb4], [eb4,g4] f4, ~@2 ab4 ~, ~@11 [eb5,eb6]@2 ~@3]/2", // D Gm Eb
  M: "[~@3 [ab4,ab5]@2 g4@3 ab4@3 ~ [d4,bb4]@4, c4@3 ~, eb4 f4, g4@10 g5 ~@11 [ab4,ab5]@4 ~@6]/2", // Ab Gm Ab
  N: "[~@3 [ab4,ab5]@2 g4@3 ab4@3 [ab4,ab5]@2 ~@3, c4@3 ~, eb4 f4, g4@10 g5 ~@21]/2", // Ab
})).s("gm_string_ensemble_2").gain(0.33)

// drums · kick
const kick = s("bd").struct("<[~@11 x ~@2 x ~] [x!4]!73 [x!2 ~@2] ~@2>").gain(0.57)

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

// drums · clap
const clap = s("cp").struct("<~ [~ x ~ x]!73 [~ x ~@2] ~@2>").gain(0.64)

// drums · hihat
const hihat = s("hh").struct("<[~@3 x] [x!16]!73 [x!8 ~@8] ~@2>").gain(0.57)

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

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

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

// drums · tambourine
const tambourine = s("tb").struct("<~ [x!16]!73 [x!8 ~@8] ~@2>").gain(0.36)

stack(
  bass, piano, electric_guitar_muted, epiano1, string_ensemble_2, kick, snare, clap, hihat, mid_tom, open_hat, crash,
  tambourine
)

More by Imagination