Strudelify

Rock It

Herbie Hancock

KeyC majorTempo112 bpm
0:00/0:00
// Rock It — Herbie Hancock
// 112 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 12 synth brass 1 (copy of ch 7 synth brass 1)
// note: Full arrangement: all 149 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(112/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 · electric bass pick
const bass = note(`<
  ~@12 A B A C A D A E ~ A B A C A D A E ~ F@2 G@18 ~@4 A B A C A D A E ~ A B A C A D A E A B A C A D A E ~@52 H@7 I H@3
  J H@3 I ~@2
>`.pickRestart({
  A: "a1@2 ~ a1 c2 a1 d2 e2 ~ a1 d2!2 ~ a1 c2!2", B: "a1@2 ~ e1 g1!3 a1 ~@8", C: "a1@2 ~@2 g1!3 a1 ~ e1@2 e1!3 g1@2",
  D: "a1@2 ~@2 g1!3 a1 ~@4 f#1@4", E: "a1@2 ~@2 g1!3 a1 ~ e1!5 g1@2", F: "[~@15 c1@2 c1 c1@2 ~@12]/2",
  G: "[c1@4 ~@11 c1@2 c1 c1@2 ~@12]/2", H: "a1@2 g1@2 a1 ~ g1 a1 ~ a1 g1@2 a1!2 g1@2, ~@5 a1@2 ~@9",
  I: "a1@2 g1@2 a1 ~ g1 a1 ~ a1 e1@2 g1!2 g#1@2, ~@5 a1@2 ~@9", J: "a1@2 g1@2 e1!4 ~ e1 f#1@2 g1!2 g#1@2",
})).s("gm_electric_bass_pick").gain(0.4)

// chords · overdriven guitar
const overdriven_guitar = note("<~@2 A ~@6 B ~@2 C ~@8 D ~@8 C ~@23 D ~@8 D ~@67 C ~@17>".pickRestart({
  A: "[a2,e3,a3] ~@3", B: "~@8 [d4,g4,a4,d5]@3 ~ [d4,g4,a4,d5]@4", C: "[a2,e3,a3,e4] ~@3", D: "[a1,a2,e3,a3,e4] ~@3",
})).s("gm_overdriven_guitar").gain(0.56)

// chords · overdriven guitar · soft notes
const overdriven_guitar_soft = note("<~@2 A ~@9 A ~@17 A ~@100 A ~@17>".pickRestart({
  A: "a1 ~@3",
})).s("gm_overdriven_guitar").gain(0.32)

// other · baritone sax
const baritone_sax = note("<~ A ~@117 B@2 C B@5 ~@12 D@8 ~@2>".pickRestart({
  A: "~@10 c6 ~@5", B: "a1 ~@2 a1 ~@7 a1 ~@4", C: "a1@2 ~ a1 ~@7 a1 ~@4", D: "~@5 [a2,a3] ~@10",
})).s("gm_baritone_sax").gain(0.3)

// chords · clavinet
const clavinet = note("<~@111 A@16 ~@3 B C D E F G H I J K@3 L M N L O ~@2>".pickRestart({
  A: "~@12 [d3,g3] [e3,a3] a2 [g3,c4]", B: "~@8 c5 a4 e4 d4@3 c4 d4",
  C: "~ a3 g3 ~ a3 ~ a2 a3 a2 g3 ~ a3 ~@2 [g3,a3,c4,e4]!2", D: "~@4 g3 ~ g3 ~ a3@2 ~ g3 ~@2 [b3,d4]@2",
  E: "~@2 [a3,c4] ~@2 g3 ~@3 g3 ~@2 a3 ~@3", // Am
  F: "~ a3 [b3,d4] [g4,b4] ~ [b3,d4] [d4,g4] ~@2 [e4,g4,b4,c5] ~ [d4,g4,b4] ~@4", // Bm G Bm G5 Cmaj7 G
  G: "[g3,d4] [a3,e4] ~@2 [e3,c4] ~@2 [a3,d#4] ~@3 [e3,c4] ~@2 [g3,d4] ~", // G5 A5 C Adim C G5
  H: "~@8 g3 a3 ~@2 [g3,c4,e4] ~ [a3,d4,f#4] ~", I: "[b3,e4,g4]@2 a2 [a3,d4,f#4] ~ [g3,c4,e4] ~@2 g3 ~ a2 a3 a2 c4 ~@2",
  J: "~@2 [g3,c4] ~ [g3,c4] ~ [g3,c4] ~ [g3,c4] [a3,d4] a2 [g3,c4] ~@4", // C5 D5 C5
  K: "~@2 [f#4,d5] [e4,c5] ~@4 [d4,a4]@2 ~ c4 ~@2 a3 ~", L: "~@2 [f#4,d5] [e4,c5] ~@4 [d4,a4]@2 ~ c4 ~@2 a3 g3",
  M: "~@2 [f#4,d5] e4 ~@4 [c4,g4]@2 ~ c4 ~@2 a3 g3", N: "~@2 [f#4,d5] e4 ~@4 [d4,a4] ~ d4 ~ c4 d4 ~ [a3,c4]",
  O: "~@2 [f#4,d5] e4 ~@6 d4@2 c4 d4 c4 a3", // D
})).s("gm_clavinet").gain(0.59).pan(0.3)

// chords · pad sweep
const pad_sweep = note("<~@36 A@2 ~@109 B@2>".pickRestart({
  A: "[~@3 [c4,f#4,c5,f5]@12 ~]/2", B: "[[a#3,e4,a4]@25 ~@7]/2",
})).s("gm_pad_sweep").gain(0.09)

// other · melodic tom
const melodic_tom = note("<A B ~@18 C ~@41 C ~@16 A ~@47 D@2 E F ~@18>".pickRestart({
  A: "f0!4 b0!4 e1!4 a1!4", B: "d2 f2 ~ d2 f2 ~ d2 f2!2 ~@7", C: "[a#1,g2]!4 [f1,d2]!4 [b0,g#1]!4 [f#0,d#1]!4",
  D: "[c#2,a2]!4 [f#1,d2]!4 [c#1,a1]!4 [f#0,d1]!4", E: "[c#2,a2]!4 [f#1,d2]!4 [c#1,a1]!4 [f#1,d2]!4",
  F: "[g#0,e1]!4 [c#1,a1]!4 [f#1,d2]!4 [b1,g2]!4", // C#m F#m D Em
})).s("gm_melodic_tom").gain(0.45)

// chords · epiano2
const epiano2 = note(`<
  ~@2 A B C D E F G H I J ~ K ~@3 K ~@4 K ~@3 K ~@4 L ~@3 L ~@3 L ~@7 M ~@2 N O P Q ~@12 R S ~@2 T U ~@2 T U ~@4 V W X
  V@2 W V Y V Z V Z AA AB AC AD AE AF AA AG AA AH AI AJ AK AL AA@2 AM AN AO AP AQ AP AQ AP AQ AP AQ AP AQ AP AQ AP AQ AP
  AQ AR AS AT AU AV AW AV AW AX AY AV AZ AV AH AV AY AV AW AV BA BB BC
>`.pickRestart({
  A: "~ d5!4 ~ d5 a3 ~ a3 f#4 c5 a5 ~@2 f6", B: "~@2 a5 ~@2 b4 ~@2 d4 ~ e5 ~ a3 ~@3",
  C: "c5 e4 a3 c4 d4 ~ e4!2 ~ e4!2 g4 a4 ~@2 d6", D: "~@2 a5 ~@2 e5 ~@2 c5 ~ a4 ~ f4 ~@3",
  E: "d5 a4 e4 a3 e4 ~ g3 d3 ~ d3!2 g3 c4 ~@2 c5", F: "~@2 a3 ~@2 e4 ~@2 c3 ~ b3 ~ e2 ~@3",
  G: "c5 c4 f3 a2 f3 ~ [a2,g4] g3 ~ a2 b2 e3 c3 c4 c3 c4", H: "f3 f4 f3 f4 b3 b4 b3 b4 d4 d5 d4 d5 ~@4",
  I: "[a3,b3,e4]!16", J: "[f4,g4,c5]!4 [c#5,d#5,g#5]!2 [f5,g5,c6]!2 ~@8", K: "~@10 a2!2 ~@4", L: "~@10 d1!2 ~@4",
  M: "~@10 c1!2 ~@4", N: "[g#-1,d#0]!2 b-1!2 [g#-1,d#0]!2 b-1!2 [g#-1,d#0]!2 b-1!2 [g#-1,d#0]!2 b-1!2",
  O: "[g#-1,d#0]!2 b-1!2 [g#-1,d#0]!2 b-1!2 ~@8", // G#5
  P: "[g2,a2,d3] c2 [g2,a2,d3] c2 [a1,d2] ~@3 [g2,a2,d3] c2 [g2,a2,d3] c2 [a1,d2] ~@3", // Gsus2 D5 Gsus2 D5
  Q: "[g2,a2,d3] c2 [g2,a2,d3] c2 [g2,a2,d3] c2 [g2,a2,d3] c2 [g2,a2,d3] c2 [g2,a2,d3] c2 [d2,g2] ~@3", R: "~@15 a1",
  S: "a1 ~@15", T: "~@15 c1", U: "c1 ~@15", V: "c7 ~ f6 ~ g1@2 ~ c7 ~ g6 c7 ~ g1@2 ~@2",
  W: "c7 ~ f6 ~ g1@2 ~ c6 ~ [f6,g6,c7] c6 [f6,g6,c7] c6 [f6,g6,c7] c6 [f6,g6,c7]", // Fsus2
  X: "c6 [f6,g6,c7] c6 [f6,g6,c7] [c4,g4]@2 ~ [f6,g6,c7] ~ [f6,g6,c7]!2 ~ g1@2 ~@2, ~@4 d4 ~@11", // Fsus2 C5 Fsus2
  Y: "c7 ~ f6 ~ g1@2 ~ c6 ~ [f6,g6,c7] c6 [f6,g6,c7] c6 [f6,g6,c7] ~@2", // Fsus2
  Z: "c7 ~ f6 ~ g1@2 ~ c6 ~ [f6,g6,c7] c6 ~ c6 ~ [f6,g6,c7] ~", AA: "c7 ~ c6 ~ g1@2 ~ c7 ~@2 c6 ~ g1@2 ~@2",
  AB: "c7 ~ c6 ~ g1@2 ~ c7 ~@2 c6 ~ c5 ~ f#5 ~", AC: "c7 ~ c6 ~ g1@2 ~ c7 ~@2 c7 ~ g1@2 ~@2",
  AD: "c7 ~ c7 ~ g1@2 ~ c7 ~@2 c7 ~@5", AE: "[f6,g6,c7] c6 [f6,g6,c7] c6 g1@2 ~ [f6,g6,c7] ~ c6 [f6,g6,c7] ~ g1@2 ~@2",
  AF: "c7 ~ c7 ~ g1@2 ~ c7 ~@2 c7 ~ g1@2 ~@2",
  AG: "[e6,f6,b6] c6 [e6,f6,b6] c6 [e6,f6,b6] c6 [e6,f6,b6] c6 [e6,f6,b6] c6 [e6,f6,b6] c6 g0@2 ~@2", // E
  AH: "c6 ~ c6 ~@2 c6 ~@2 c6 ~ c6 ~ g1@2 ~@2", AI: "g5 ~ g5 ~ g1@2 ~ g5 ~@2 g5 ~ g1@2 ~@2",
  AJ: "[b4,c5,f#5] ~ [b4,c5,f#5] g4 [b4,c5,f#5] g4 [b4,c5,f#5] g4 [b4,c5,f#5] g4 [b4,c5,f#5] g4 g1@2 ~@2", // B
  AK: "c6!2 d1 ~@2 g5 ~@2 c6!2 d1 ~@2 f5 ~@2", AL: "c6!2 d1 ~@2 f5 ~@2 [f5,g5,c6] c5 [f5,g5,c6] c5 d1@2 ~@2",
  AM: "[c7,c8] ~ c6 a5 c6 ~ [c7,c8] ~ c6 a5 c6 ~ [c7,c8] ~ c6 a5", // C
  AN: "c6 ~ [c7,c8] ~ c6 a5 c6 ~ [c7,c8] ~ [c7,c8] c6 [c7,c8] c6 [c7,c8] c6", AO: "[c6,c7,c8] ~@15",
  AP: "~@2 [g2,a2,d3]@3 ~ [g2,a2,d3] ~ [g2,a2,d3]@3 ~@5", AQ: "~@2 [g2,a2,d3]@2 ~@2 [g2,a2,d3] ~ [g2,a2,d3]@3 ~@5",
  AR: "[g2,a2,d3] ~ [g2,a2,d3]@3 ~ [d3,e3,a3] ~ [d3,e3,a3] ~ [d3,e3,a3] ~ [d3,e3,a3] ~ [d3,e3,a3] ~", // Gsus2 Dsus2
  AS: "[d3,e3,a3] ~@7 [d4,e4,a4] ~ [e3,a3] ~ [e3,a3] ~ [e3,a3] ~", // Dsus2 A5
  AT: "[e3,a3] ~@7 [d4,e4,a4] ~ [e3,a3] ~ [e3,a3] ~ [e3,a3] ~", // A5 Dsus2 A5
  AU: "[g2,a2,d3]@2 ~@6 [d6,g6,c7] g4 [d5,e5,a5] g4 [d5,e5,a5] g4 [d5,e5,a5] g4", // Gsus2 Csus2 Dsus2
  AV: "c7 ~ f6 ~ g1@2 ~ c7 ~@2 c7 ~ g1@2 ~@2", AW: "c7 ~ f6 ~ g1@2 ~ c7 ~@2 c7 ~ c6 ~ g6 ~",
  AX: "c6 [f6,g6,c7] c6 [f6,g6,c7] [c3,d3] ~@2 [f6,g6,c7] ~@2 [f6,g6,c7] ~ g1@2 ~@2, ~@2 g3 ~@5", // Fsus2 Csus2 Fsus2
  AY: "c6 [f6,g6,c7] c6 [f6,g6,c7] [a2,b2,e3]@2 ~ [f6,g6,c7] ~@2 [f6,g6,c7] ~ b5 ~ d#6 ~", // Fsus2 Asus2 Fsus2
  AZ: "[f5,g5,c6] ~ [f5,g5,c6] ~ [f5,g5,c6] ~ [f5,g5,c6] ~ g4 [c5,d5,g5] g4 [c5,d5,g5] g4 [c5,d5,g5] g4 [c5,d5,g5]", // Fsus2 Csus2
  BA: "[g3,a3,c4] ~ [g4,a4,d5] ~ [g4,a4,d5] ~ [g4,a4,d5] ~ [g4,a4,d5] ~ [g4,a4,d5] ~ [g4,a4,d5] ~ [g4,a4,d5] ~", // Am7 Gsus2
  BB: "c1 g-1 c1 g-1 c1 g-1 c1 g-1 c1 g-1 c1 g-1 c1 g-1 c1 g-1", BC: "c1 g-1 c1 g-1 c1 g-1 c1 g-1 ~@8",
})).s("gm_epiano2").gain(0.33)

// other · oboe
const oboe = note(`<
  A B ~@41 C ~@11 D ~ E ~ D ~ E ~@2 D ~ E ~ D ~ E F D ~ E ~ D ~ E A ~@32 G ~@3 H ~ I ~ H ~ H ~ H ~ H ~@22
>`.pickRestart({
  A: "[c2,g2] c2 g2 d2 a2 d2 a2 e2 b2 e2 b2 f2 c3 f2 d3!2", B: "e3 ~ d3 e3 ~ d3 ~@10", C: "~@10 c6 c5 ~@2 c6 c5",
  D: "~@10 [g4,g5] ~@3 [g4,g5] ~", E: "~@14 g4!2", F: "~@10 g4 ~@5", G: "~@7 c4", H: "~@7 g3", I: "~@7 [g3,c4]",
})).s("gm_oboe").gain(0.5)

// other · synth drum
const synth_drum = note("<~@2 A B A@3 B A C ~@19 D ~@50 E@28 ~@3 F@16 ~@22>".pickRestart({
  A: "g3 ~@5 a2 ~@9", B: "g3 ~@5 a2 ~@7 a3 ~", C: "g3 ~@5 d4 ~@9",
  D: "~@8 [a3,e4]!2 [c3,g3]!2 [a2,d3]!2 [c2,f#3] [c2,f2]", E: "c3 ~@5 c3 ~@9", F: "c4 ~@5 c4 ~@9",
})).s("gm_synth_drum").gain(0.4)

// other · xylophone · A D A E A
const xylophone = note("<~@9 [~@8 [a2,a3] [a3,a4] [d3,d4] ~ [a2,a3] [a3,a4] [e3,e4] [a2,a3]] ~@139>")
  .s("gm_xylophone").gain(0.25)

// other · synth strings 2 · Dm Fsus2 Cmaj7 Fmaj7 Asus2 Dsus2 Gsus2 D5
const synth_strings_2 = note(`<
  ~@49
  [~@2 c3 [d3,f3] e3 [f3,g3] a3 [b3,c4] d4 [e4,f4] g4 [a4,b4] c5 [d5,e5] f5 [g5,a5]]
  [[d5,a5] ~@7]
  ~@98
>`).s("gm_synth_strings_2").gain(0.45)

// other · synth strings 2 · soft notes
const synth_strings_2_soft = note("<~@45 A@4 ~@100>".pickRestart({
  A: "[~ [g4,b4,c5,d#5]@7]/4", // Cm
})).s("gm_synth_strings_2").gain(0.2)

// drums · kick
const kick = s("bd").struct(`<
  ~@2 A@8 B C D E D E D E D E B D E D E D E D E ~ F G F G F G F G F G F G F G F G F G F G B H I J D E D E D E D E B D E
  D E D E D E D E D E D E D E ~@13 K L K L K L K L K L K L K L K L I J M F N F N F N F N F N F N F N F N B@4 O@16 B H
>`.pickRestart({
  A: "x ~@2 x ~@4", B: "x!16", C: "x!8 ~@2 x ~@2 x ~@2", D: "x ~@2 x ~@2 x!2 ~@8", E: "x ~@4 x!3 ~@8",
  F: "x ~@5 x!2 ~@8", G: "x ~ x ~@2 x!3 ~@8", H: "x!9 ~@7", I: "x!5 ~@3 x!5 ~@3", J: "x!13 ~@3", K: "x ~@5 x!2 ~@7 x",
  L: "~@3 x ~@4", M: "~@14 x!2", N: "x ~ x ~@2 x!3 ~@7 x", O: "x ~ x ~@3 x!2 ~ x!2 ~@5",
})).gain(0.48)

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

// drums · low tom
const low_tom = s("lt").struct("<~@11 [~@10 x ~@2 x ~@2] ~@39 [~@9 x ~@2 x ~@3] [~ x ~ x] [~@3 x] ~@95>").gain(0.56)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  ~@12 A B A B A B A B ~ A B A B A B A B ~ A@20 ~@4 A B A B A B A B ~ A B A B A B A B A B A B A B A B ~@32 A@16 ~@4 A@16
  ~@2
>`.pickRestart({
  A: "x!16", B: "x!13 ~ x!2",
})).gain(0.32)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@13 A ~ A ~ A ~ A ~@2 A ~ A ~ A ~ A ~@26 A ~ A ~ A ~ A ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@70
>`.pickRestart({
  A: "~@13 x ~@2",
})).gain(0.24)

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

// drums · cowbell
const cowbell = s("cb").struct("<~ [~@3 x] ~@147>").gain(0.48)

// drums · bongos
const bongos = s("bongo:4").struct("<~@12 A@8 ~ A@8 ~ B@20 ~@4 A@8 ~ A@16 ~@13 C@16 ~@23 D@16 ~@2>".pickRestart({
  A: "~@4 x ~@4 x ~@2 x ~@3", B: "~@5 x ~@8 x ~", C: "x ~ x!2", D: "x ~ x ~@5 x ~@2 x ~@4",
})).gain(1.89)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@12 A@8 ~ A@8 ~ B@20 ~@4 A@8 ~ A@16 ~@13 C@16 ~@41>".pickRestart({
  A: "x ~ x ~@5 x ~@2 x ~@4", B: "x ~ x ~@4 x ~ x ~@6", C: "~@6 x ~@2 x ~ x ~@2 x ~",
})).gain(1.89)

// drums · congas
const congas = s("conga:18").struct("<~@131 [~@3 x ~@3 x]!16 ~@2>").gain(2.05)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@13 A ~@3 A ~@4 A ~@3 A ~@28 A ~@3 A ~@4 A ~@3 A ~@3 A ~@3 A ~@72>".pickRestart({
  A: "~@12 x!2 ~@2",
})).gain(4.06)

// drums · shaker
const shaker = s("sh").struct("<~@36 [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x] ~@112>").gain(0.64)

stack(
// … 4 more lines

More by Herbie Hancock