Strudelify

Rock Wit'cha

Bobby Brown

KeyD majorTempo77 bpm
0:00/0:00
// Rock Wit'cha — Bobby Brown
// 77 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 87 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(77/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@4 A B C D E F G H A B C D E F I A B C D J F I K B L M N O P Q R F G H A B C D E F I A B C D E F S T K B L M U V P Q
  A B C D E F G H K B L M U V P Q K B L M U V P Q W@2
>`.pickRestart({
  A: "e1@4 ~@2 e2 e1 ~ e1@3 ~ e1 e2@2", B: "f#1@2 ~ f#1 ~@2 b1@6 ~ a1 b1 a1",
  C: "e1@3 e2@2 e1 e2 ~@2 e1 ~ e1 ~ e1 b1 e2", D: "f#1@2 ~ f#1 ~@2 b1@6 ~ b1 ~ b1",
  E: "e1@3 e2@2 e1 e2 ~@2 b1 ~ e1 e2@2 e1@2", F: "f#1@3 f#1 ~@2 b1@6 ~ b1 a1 b1", G: "e1@3 e2 ~@2 e1@6 ~ e1 ~@2",
  H: "g1@2 ~ g1 ~@2 a1@8 ~@2", I: "a1@2 ~ a1@2 ~ g#1@7 g#1 ~@2", J: "e1@3 e2@2 e1 e2 ~@2 b1 ~ e1 e2@2 e1 ~",
  K: "g1@4 ~@2 g2 g1 ~ g1@3 ~ g1 g2@2", L: "g1@3 g2@2 g1 g2 ~@2 g1 ~ g1 ~ g1 b1 g2",
  M: "f#1@2 ~ f#1 ~@2 a1@4 a1@3 d2 a1 a2", N: "g1@3 g2@2 g1 g2 ~@2 b1 ~ g1 g2@2 g1@2",
  O: "f#1@3 a#1@2 ~ b1@4 b1@4 b1 ~", P: "e1 f#1 g1 g#1", Q: "a1@4 a2@5 a1 a2@2 a1@2 a2 ~",
  R: "e1@3 e2@2 e1 e2 ~@2 b1 ~ e1 e2@2 e1@2, b1 ~@15", S: "e1 ~@5 e1@2 f#1@2 ~@2 f#1@2 ~@2",
  T: "a#1@5 ~ a1@6 a2@2 a1@2", U: "g1@3 g2@2 g1 g2 ~@2 b1 ~ g1 g2@2 g1@2, b1 ~@15", V: "f#1@3 a#1@2 ~ b1@4 b1@3 ~ b1 ~",
  W: "[d2@7 ~]/2",
})).s("gm_acoustic_bass").gain(0.72)

// chords · piano · "A.PIANO 2"
const piano = note(`<
  ~@4 A B C D C E C F G@2 H@2 I@2 J G@2 H@2 I@2 K L B M N M O A P C E C F G@2 H@2 I@2 J G@2 H@2 I@2 Q R L B M N M O A P
  A B C D C E C F L B M N M O A P L B M N M O A P S@2
>`.pickRestart({
  A: "[e3,g3,b3,d4,f#4]@15 ~", B: "[f#3,a3,c#4,e4]@5 ~ [b2,b3,d4,f#4]@8 ~@2", C: "[e3,g3,b3,d4,f#4]@7 ~",
  D: "[f#3,a3,c#4,e4]@2 ~ [b2,b3,d4,f#4]@4 ~", E: "[f#3,a3,c#4,e4]@4 ~@2 [b2,b3,d4,f#4]@9 ~",
  F: "[g2,d3,g3,b3,d4,f#4]@5 ~ [a2,e3,a3,d4]@9 ~", // Gmaj7 Asus4
  G: "[b3@9 a3 ~@4 f#3 ~ [f#3,a3,c#4,e4]@5 ~ [b2,b3,d4,f#4]@8 ~@2, [e3,d4,f#4]@15 ~@17, g3@3 g3@3 ~@2, ~@5 b3@5 ~@6]/2", // F#m7 Bm D
  H: "[e3@5 ~@3 [f#3,a3,c#4,e4]@2 ~ [b2,b3,d4,f#4]@4 ~, [g3,b3,d4,f#4]@7 ~@9, ~@5 e3@5 ~@6]/2", // F#m7 Bm Gmaj7
  I: "[b3@10 ~@6 [f#3,a3,c#4,e4]@4 ~@2 [b2,b3,d4,f#4]@9 ~, [e3,g3,d4,f#4]@7 ~@9, ~@5 b3@5 ~@6]/2", // F#m7 Bm Em7
  J: "[e3,g3,c4,d4]@5 ~ [g#3,c4,d4,f#4]@9 ~", K: "[e3,g3,c4,d4,g4]@5 ~ [g#3,c4,d4,f#4]@9 ~", L: "[g3,b3,d4,f#4]@15 ~",
  M: "[g3,b3,d4,f#4]@7 ~", N: "[f#3,a3,c#4,e4]@5 ~ [a3,c4,d4,g4]@6 [a3,c4,d4,f#4]@3 ~",
  O: "[f#2,f#3,a#3,c#4]@5 ~ [f#3,b3,d4]@8 ~@2", P: "~@10 a4@5 ~, [g3,a3,d4]@15 ~",
  Q: "[e3,g3,b3,d4,f#4] ~@5 [e3,g3,b3,d4,f#4] ~ [c#3,f#3,a3,c#4,e4] ~@7", // Em7 F#m7
  R: "[a#2,f3,a#3,c4,d4,f4,a4]@6 ~@6 a4@3 ~, ~@6 [a2,e3,g3,b3,d4,f#4]@9 ~", S: "[[d3,f#3,a3,c#4,e4]@7 ~]/2",
})).s("gm_piano").gain(0.64)

// chords · vibraphone
const vibraphone = note(`<
  ~@4 A B C D A E F G H I H I H I ~ H I H I H I ~ A B C ~ A ~ J K A E F G H I H I H I ~ H I H I H I ~@2 A B C ~ A ~ J K
  A B C D A E F G A B C ~ A ~ J K A B C ~ A ~ J K ~@2
>`.pickRestart({
  A: "~ [d5,e5,a5,d6,e6,a6] ~@2 [d5,e5,a5,d6,e6,a6]!2 ~ [d5,e5,a5,d6,e6,a6] [b3,b4]!2 [c#4,c#5] ~ [d4,d5] ~ [e4,e5] ~", // Dsus2 B C# D E
  B: "[c#4,c#5] ~ [b3,b4] [a3,a4]@3 ~@10", // C# B A
  C: "~@4 [d5,e5,a5,d6,e6,a6]!2 ~ [d5,e5,a5,d6,e6,a6] [b3,b4]!2 [c#4,c#5] ~ [d4,d5] ~ [e4,e5] ~", // Dsus2 B C# D E
  D: "[a4,a5]@3 [a4,a5]@4 ~@9", E: "[c#4,c#5]@2 [b3,b4] [a3,a4]@7 ~@6",
  F: "~ [d4,d5,e5,a5,d6,e6,a6] [c#4,c#5] [a3,a4] [d5,e5,a5,d6,e6,a6]!2 ~ [d5,e5,a5,d6,e6,a6] ~ [b3,b4]!2 [c#4,c#5] [d4,d5] ~ [e4,e5] ~", // Dsus2 C# A Dsus2 B C# D E
  G: "[f#4,f#5]@3 [d4,d5]@2 ~ [a4,a5]@8 ~@2", H: "[e5,a5] ~@2 [d5,e5,a5] ~@12, d5 ~@7",
  I: "[e4,a4,c#5] ~@2 [e4,a4,c#5] ~@2 [f#4,b4,d5]@7 ~@3", // A Bm
  J: "[f#4,f#5]@2 [e4,e5] [d4,d5] [f#4,f#5]@2 [e4,e5] [d4,d5] [f#4,f#5]@2 [e4,e5] [d4,d5] [f#4,f#5] ~@3", // F# E D F# E D F# E …
  K: "[f#4,f#5]@2 [e4,e5] [d4,d5] [f#4,f#5]@2 [e4,e5] [d4,d5] [f#4,f#5]@2 [e4,e5] [d4,d5] [f#4,f#5]@2 ~@2", // F# E D F# E D F# E …
})).s("gm_vibraphone").gain(0.5)

// other · synth drum
const synth_drum = note("<~ A B@10 ~@14 B@3 ~ B ~ B@6 ~@15 B@3 ~ B ~ B@13 ~ B ~ B@5 ~ B ~ B@2 ~@2>".pickRestart({
  A: "~@13 a3 d4 e4", B: "a4 a3 d4 e4 ~ a3 d4 f#4 ~ c#4 ~ d4 ~ a3 d4 e4",
})).s("gm_synth_drum").gain(0.48)

// other · synth drum · soft notes
const synth_drum_soft = note("<~@2 A@10 ~@14 A@3 ~ A ~ A@6 ~@15 A@3 ~ A ~ A@13 ~ A ~ A@5 ~ A ~ A@2 ~@2>".pickRestart({
  A: "~@8 a3 ~@7",
})).s("gm_synth_drum").gain(0.32)

// drums · kick
const kick = s("bd").struct("<[x ~@4 x!2 ~ x ~@7]!51 [x ~@4 x!2 ~ x ~@3 x ~@3] [x ~@4 x!2 ~ x ~@7]!33 x ~>").gain(0.71)

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

// drums · clap
const clap = s("cp").struct("<[~ x ~@6]!51 ~ [~ x ~@6]!33 ~@2>").gain(0.71)

// drums · low tom
const low_tom = s("lt").struct("<~@52 [~@3 x] ~@31 [~@14 x!2] ~@2>").gain(0.71)

// drums · hihat
const hihat = s("hh").struct("<[x!4]!85 ~@2>").gain(0.71)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A C A@3 B A B ~@2 A@3 C A@3 B A B A B A B A B A@6 B A B ~@2 A@3 B A@3
  C A@3 B A@2 ~@2 A@3 C A@2 ~@4
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~@3 x ~ x", C: "~ x ~ x ~ x ~@2",
})).gain(0.21)

// drums · mid tom
const mid_tom = s("mt").struct("<~@52 [~@5 x ~@2] ~@31 [~@7 x ~@4 x!2 ~@2] ~@2>").gain(0.71)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@25 A ~@6 B@2 ~@3 A ~@12 C D C ~@6 B@2 ~@7 A ~@6 B@2 ~@3 A ~@2 B@2 E ~
>`.pickRestart({
  A: "~@7 x", B: "~ x ~ x ~ x ~ x", C: "~@13 x ~ x", D: "~ x ~@14", E: "x",
})).gain(0.71)

// drums · high tom
const high_tom = s("ht").struct("<~@84 [~ x ~@2] ~@2>").gain(0.71)

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

// drums · ride
const ride = s("rd").struct("<~@51 [x ~ x!2] ~@33 x ~>").gain(0.71)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<[x!8]!85 ~@2>").gain(2.9)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<[~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!85 ~@2>").gain(0.72)

stack(
  bass, piano, vibraphone, synth_drum, synth_drum_soft, kick, snare, clap, low_tom, hihat, hihat_soft, mid_tom,
  open_hat, high_tom, crash, ride, cabasa, cabasa_soft
)

More by Bobby Brown