Strudelify

Body Rock

Moby

KeyF♯ majorTempo108 bpm
0:00/0:00
// Body Rock — Moby
// 108 bpm, 4/4, key F# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 5 "Bass guitar (right)" electric bass finger (copy of ch 4 "Bass guitar (left)" fretless bass)
// note: Full arrangement: all 91 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(108/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 · distortion guitar
const distortion_guitar = note(`<
  ~@3 A B C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@3 C B@2 ~@8 B C B@3 C B@2 ~@9 B C B@3 C B@3 C B@3 C
  B@2 ~@2
>`.pickRestart({
  A: "~@8 e2 a2!2 g2 a2 f#2 f2 e2", B: "e2 f#2@2 f#2 f#2@2 ~ f#2 e2 f#2 ~ f#2 f#2@2 ~ f#2",
  C: "e2 f#2@2 f#2 f#2@2 ~@2 e2 f#2 ~ f#2 f#2@2 ~ f#2",
})).s("gm_distortion_guitar").gain(0.54).pan(0.3)

// other · distortion guitar · soft notes
const distortion_guitar_soft = note(`<
  ~@52
  [e2 f#2@2 f#2 f#2@2 ~ f#2 e2 f#2 ~ f#2 f#2@2 ~ f#2]
  [e2 f#2@2 f#2 f#2@2 ~@2 e2 f#2 ~ f#2 f#2@2 ~ f#2]
  [e2 f#2@2 f#2 f#2@2 ~ f#2 e2 f#2 ~ f#2 f#2@2 ~ f#2]!2
  ~@35
>`).s("gm_distortion_guitar").gain(0.32).pan(0.3)

// other · electric guitar jazz · "Other guitar"
const electric_guitar_jazz = note(`<
  ~@4 A@6 B C ~@8 D E D E D E D E F G@4 H@2 I D E D E D E D E D E D E J@4 ~@4 F G@4 H@2 K L M@2 N O@3 P@2 D E D E D E D
  E D E D E D E D E Q@2
>`.pickRestart({
  A: "[~@6 g#4 a4@14 ~@11]/2", B: "~@6 g#4 a4@6 a4@2 g#4", C: "g4 f#4 f4 e4 ~@12",
  D: "f4 f#4 ~ f#4 f#4@2 ~@2 f4 f#4 ~ f#4 a4@2 ~ c#4", E: "f4 f#4 ~ f#4 f#4@2 ~@2 f4 f#4 ~ f#4!2 e4 c#4 e4",
  F: "[c#4,f#4]!16", G: "[[c#4,f#4]!6 g#4 a4@14 [c#4,f#4]!11]/2", H: "[[c#4,f#4]!6 g#4 a4@14 ~ g#4 a4@6 a4@2 g#4]/2",
  I: "g4 f#4 f4 e4 [c#4,f#4]!12", J: "f#4@2 ~ f#4 f#4@2 ~ f#4 f#4@2 ~ f#4 f#4@2 ~ f#4",
  K: "g4 f#4 f4 e4 [c#4,f#4]!11 [c#4,f#4,g#4]", L: "a4@6 a4@2 g#4 g4 f#4 f4 e4 ~@3",
  M: "[~@4 c#4@3 ~@3 f#3@4 a3@16 ~@2]/2", N: "b3@7 ~", O: "[b3@14 ~ [c#3,c#4]@16 [e3,e4]@14 ~@3]/3",
  P: "[[f#3,f#4,b4]@13 ~ [f#3,f#4,b4]@18]/2", Q: "a4/2",
})).s("gm_electric_guitar_jazz").gain(0.39).pan(0.7)

// bass · fretless bass · "Bass guitar (left)"
const bass = note(`<
  ~@12 A@9 B C@2 A B C@2 A D A D A D A D A B C@2 A B C@2 E@4 F G F H ~@4 A D A D A D A D I ~@8 A B C@2 A B C@2 A B C@2 A
  B C@2 I ~
>`.pickRestart({
  A: "f#1@3 f#1 f#1@3 f#1", B: "a1@3 a1 a1@3 a1", C: "b1@3 b1 b1@3 b1", D: "f#1@3 f#1!2 e2!2 c#2", E: "f#1@5 e2@3",
  F: "e1 f#1@2 f#1 f#1@2 ~ f#1 e1 f#1 ~ f#1 f#1@2 ~ f#1", G: "e1 f#1@2 f#1 f#1@2 ~@2 e1 f#1 ~ f#1 f#1@2 ~ f#1",
  H: "f#2", I: "f#1 ~",
})).s("gm_fretless_bass").gain(0.49).pan(0)

// other · string ensemble 2 · "Strings"
const string_ensemble_2 = note(`<
  ~@20 A B C B A B C B ~@8 A B C B A B C B ~@4 D E D E ~@21 A B C B A B C B A B C B A B C B ~@2
>`.pickRestart({
  A: "[c#5,c#6]", B: "[b4,b5]", C: "[a#4,a#5]", D: "[f#3,b3,f#4]@3 ~", E: "[f#3,c#4,e4]@3 ~",
})).s("gm_string_ensemble_2").gain(0.35)

// chords · piano · Esus2 Amaj7
const piano = note(`<
  ~@48
  [~@3 a5@2 b5!2 ~ c#6@2 e6@2 e6@2 ~@2, ~ [e5,f#5]@2 ~@13, ~ g#5 ~@6]
  [~@6 g#6@2 ~@5 e6@2 ~, ~ [g#6,a6]@2 c#7@2 a6@2 ~ f#6@2 a6@2 f#6@2 ~@2, ~@2 b6@2 b6@2 ~@3 g#6@2 g#6@2 ~@3]
  [~ a6@2 ~ f#6@2 ~ e6@2 ~ e6@2 ~ b5@2 ~, g#6@2 ~ g#6@2 ~ c#6@2 ~ f#6@2 ~ c#6@2 ~@2]
  [c#6@2 b5@2 ~ b5@2 ~@3 g#5@2 g#5@2 e5@2, ~@2 a5 ~ c#6 ~@3, ~@9 a5@2 ~@5]
  ~@39
>`).s("gm_piano").gain(0.64)

// other · guitar harmonics
const guitar_harmonics = note(`<
  ~@52
  [e2 f2 f#2 g2 g#2 a2 a#2 b2]
  [c3 c#3 d3 d#3 e3 f3 f#3 g3]
  [g#3@2 a3@2 a#3@2 b3@2 c4@2 d4@2 e4 c4 e3 b2]
  [g#2 a2 b2 d#3 g3 c4 e4 f4 f#4@2 f4@2 e4 c#4 b3 g#3]
  ~@35
>`).s("gm_guitar_harmonics").gain(0.24).pan(0.3)

// drums · kick
const kick = s("bd").struct("<A@12 B@39 ~ A@3 B@9 ~@9 B@16 C ~>".pickRestart({
  A: "x ~@4 x ~@2", B: "x ~@2 x!3 ~@2", C: "x",
})).gain(0.59)

// drums · snare
const snare = s("sd").struct(`<
  ~@10 A B C D C D C D E F C D C D C D E F C D C D C D E F C D C D C D E F C D C D C D C G ~@3 F C D C D C D E F ~@8 G C
  D C D C D E F C D C D C D E F A ~
>`.pickRestart({
  A: "x", B: "x!16", C: "x ~@2 x!2 ~@4 x!2 ~ x ~@2 x", D: "~@4 x ~@4 x!2 ~ x ~@2 x", E: "x ~@2 x!2 ~@4 x!2 ~@3 x!2",
  F: "x!2 ~@2 x ~@2 x!9", G: "~@2 x ~ x!12",
})).gain(0.59)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<[~@3 x!2 ~@4 x ~@2 x ~@2 x]!12 ~@40 [~@3 x!2 ~@4 x ~@2 x ~@2 x]!3 ~@36>").gain(0.35)

// drums · low tom
const low_tom = s("lt").struct("<~@65 [x ~@4 x ~@2]!8 ~@18>").gain(0.35)

// drums · hihat
const hihat = s("hh").struct("<A@12 B@39 ~ A@3 B@9 ~@9 B@16 C ~>".pickRestart({
  A: "x ~@4 x!2 ~", B: "x!16", C: "x",
})).gain(0.59)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@65 [x!16]!8 ~@18>").gain(0.29)

stack(
  distortion_guitar, distortion_guitar_soft, electric_guitar_jazz, bass, string_ensemble_2, piano, guitar_harmonics,
  kick, snare, snare_soft, low_tom, hihat, hihat_soft
)

More by Moby