Strudelify

Hip Hug-Her

Booker T. & The MG's

KeyB♭ majorTempo108 bpm
0:00/0:00
// Hip Hug-Her — Booker T. & The MG's
// 108 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 63 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.

// bass · electric bass finger · "El Bass"
const bass = note(`<
  ~ A B C B@3 C B@3 C B@2 D E D F B C B@2 G@2 H@2 B C B@3 C B@3 C B@2 I J K A B C B@3 C B@2 G@2 H@2 B C B@3 C B@2 K
>`.pickRestart({
  A: "~@10 d2@2 eb2@2 f2 g2", B: "bb2@2 bb1@8 d2 ~ eb2 ~ f2 g2", C: "bb2@2 bb1@8 d2 ~ eb2@2 f2 g2",
  D: "eb3@2 eb2@8 g2 ~ ab2 ~ bb2 c3", E: "eb3@2 eb2@8 g2 ~ ab2@2 bb2 c3", F: "eb3@2 eb2@8 d2 ~ eb2 ~ f2 g2",
  G: "[bb2@14 db2@11 ~ db2@2 eb2@2 db2@2]/2",
  H: "[gb2@2 gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2@2 db2 ~ eb2@10 ~@2 d2@2 eb2@2 f2 g2]/2",
  I: "f2@2 f2@2 f2@2 f2 ~ f2@2 f2 ~ f2 ~ e2 ~", J: "eb2@2 eb2 ~ eb2 ~ eb2 ~ eb2!2 g1@2 ab1@2 a1 ~", K: "bb1 ~@7",
})).s("gm_electric_bass_finger").gain(0.45)

// chords · rock organ · "Rock Orga"
const rock_organ = note(`<
  A B C D E F G H I J G H I K L M N J G H I J O@2 P@2 C D E Q C D E Q C D E Q R S T U V H I J G H I J O@2 W@2 X Y Z AA X
  Y Z AA AB
>`.pickRestart({
  A: "bb5@3 ~ ab5@3 ~ eb5@3 ~ db5@3 ~, ab5 ~@7 e5 ~@7", B: "[eb5,g5] ~",
  C: "~@4 db5 d5@2 [d5,f5] [ab4,bb4,d5,f5] ~@7, ~@2 [bb4,f5] ~@5", D: "~@4 [ab5,db6]@3 ~ [f5,bb5] ~@7",
  E: "~@4 db5 d5@2 d5 [ab4,bb4,d5,f5] ~@7, ~@2 f5 ~@5", F: "~@4 [ab5,db6]@3 bb5 [f5,bb5] ~ db6 d6 ~ eb6@2 ~",
  G: "f6@3 ~ d6@3 ~ bb5@3 ~ f5@2 g5 ~, ~@4 db6 ~@11", H: "[ab5,db6] ~ [ab5,db6]@2 g5@3 ~ [f5,bb5]@4 [eb5,ab5]@3 ~",
  I: "[f5,bb5] [d5,f5] ~@6, e5 ~ db5 ~@13", J: "~@10 db6 d6 ~ eb6@2 ~", K: "~@10 gb6 g6@2 ab6@2 ~",
  L: "bb6@3 ~ g6@3 ~ eb6@3 ~ bb5@2 c6 ~, ~@4 gb6 ~@11", M: "[db6,f6] ~ [db6,f6]@2 [c6,eb6]@4 [bb5,db6]@4 [ab5,c6]@3 ~",
  N: "[bb5,db6]@2 bb5 ~@5, a5 ~@3 gb5 ~@11", O: "[f6@13 ~ [ab5,db6]@15 ~@3, e6 ~@31]/2",
  P: "[[e6,ab6]@4 [eb6,gb6]@3 ~ [db6,e6]@3 ~ [eb6,gb6] ~ [g5,bb5,db6]@10 ~@8]/2", Q: "~@4 [ab5,db6]@3 bb5 [f5,bb5] ~@7",
  R: "[f5,a5,c6]", S: "g5@15 ~", T: "bb5@4 ab5@4 e5 ~@3 db5@3 ~, ab5 ~@15",
  U: "[eb5,g5]@9 ~ f6@2 ~ [eb6,g6]@2 ~, ~@10 db6 ~@5", // Eb
  V: "[f6,bb6]@4 [d6,f6]@3 ~ [bb5,d6]@3 ~ f5@2 [g5,c6] ~, ~@4 db6 ~@3 db6 ~@7", // Bb5 Dm Bb C5
  W: "[[e6,ab6]@4 [eb6,gb6]@3 ~ [db6,e6]@3 ~ [eb6,gb6] ~ [g5,bb5,db6]@10 [ab6,bb6]!2 ~ [ab6,bb6]!2 ~ [ab6,bb6] ~]/2", // E Ebm Dbm Ebm Gdim Absus2
  X: "[ab5,bb5,db6,d6,f6] ~@3 [ab5,bb5,d6,f6]@2 ~@2 [ab5,bb5,db6,d6,f6] ~ [ab5,bb5,db6,d6,f6] ~@5, ~@4 db6 ~@11", // Bb7
  Y: "[ab5,bb5,db6,d6,f6] ~ [ab5,bb5,d6,f6] ~ [bb5,eb6,g6] ~ [ab5,d6,f6]@4 ~@6, ~@6 db6 ~@9", // Bb7 Eb Ddim
  Z: "~@4 [db6,d6,f6] ~@3 [ab5,bb5,db6,d6,f6] ~ [ab5,bb5,d6,f6] ~@5, ~@2 [ab5,bb5] ~@5", // Db Bb7 Absus2
  AA: "[bb5,ab6]@2 [bb5,ab6] ~ [bb5,eb6,g6] ~ [ab5,bb5,d6,f6]@7 ~@3, [e6,g6] ~@5 db6 ~@9", // Bb7 Eb Bb7 Em
  AB: "[ab5,bb5,bb6]@3 ~@13, [db6,eb6,ab6] ~@15", // Absus2 Dbsus2
})).s("gm_rock_organ").gain(0.22)

// chords · rock organ · "Rock Orga" · soft notes
const rock_organ_soft = note(`<
  ~@2 A B C B ~ D ~@3 D ~ E ~@2 F ~@2 D ~@4 G@2 A B C B A B C B A B C B ~ H I J ~ D ~@3 D ~@4 G@2 ~ K ~ L ~ K ~ L M
>`.pickRestart({
  A: "~@4 ab4@2 ~ [ab4,bb4] ~@8", B: "~@7 f5 ~@8", C: "~@4 [ab4,bb4]@2 ~ [ab4,bb4,f5] ~@8", D: "~@4 c6@3 ~@9",
  E: "~@10 f6 ~@5", F: "~@5 [f5,g5] ~@10", G: "[~@7 f5@5 ~@4]/2", H: "[eb5,bb5]@15 ~", I: "~@8 eb5@3 ~@5",
  J: "~@11 d6 ~@4", K: "~@4 c6 ~@11", L: "~ f6!2 ~@13", M: "~ [d6,f6]@2 ~@13",
})).s("gm_rock_organ").gain(0.13)

// chords · piano · "Piano Sol"
const piano = note("<A B ~@26 C@2 D E F G H I J K L M A B ~@12 N@2 O P ~ Q R S ~>".pickRestart({
  A: "bb4@3 ~ ab4@3 ~ [eb4,bb4]@3 ~ db4@3 ~, ab4 ~@7 e4 ~@7", B: "eb4 ~",
  C: "[~@4 [d4,ab4,db5]@13 ~@9 [eb4,ab4]@2 ~ [eb4,ab4]@2 ~, ~@2 bb2@16 ~@8 e4 ~@2 e4 ~@2]/2", // Db Ab5
  D: "db4@2 ~@2 bb3@2 ~ bb3 ~@6 ab3 ~", E: "ab3 bb3 ~@2 bb3 ~@2 [ab3,db4]@2 ~ ab3 ~@5",
  F: "ab5 ~@2 [ab5,db6] ~@2 [f5,bb5] ~@7 [ab3,g4]@2, ~@14 [bb3,eb4] ~", // Db5 Bb5 Abmaj7 Eb5
  G: "db4 d4 bb2 ~ ab3 ~@3 bb2 ~ bb5!2 db6 bb5 eb6 ~, f4 ~@7",
  H: "[e6,f6,g6,ab6] ~ f6 [f6,ab6] ~ ab6 f6!5 [f6,ab6]!3 ~@2, bb5@13 ~@3", // Fm
  I: "[f6,ab6]@2 bb5 ~ [f6,ab6]@2 ~ [bb5,e6] ~ bb5 [bb5,eb6,ab6] ~ [bb5,db6] ~ bb5 ~, [bb5,e6] ~@3 [bb5,e6] ~@2 ab6@2 ~@7", // Fm Bbdim Ebsus4 Bbm Bbdim
  J: "ab5 bb5 ~@9 bb3 ~ bb2 [bb3,eb4,g4,ab4] ~", K: "[bb3,d4,f4] ~ bb2 ~ bb2 ~@3 bb2 ~ bb4 ~ db5@2 eb5 ~, ab3 ~@7",
  L: "[e5,g5] f5 ab5 ~ [f5,ab5] ~ [f5,ab5] ~ [e5,f5] ~ [f5,ab5] ~ ab5@2 eb5@2, ab5@2 ~@6 ab5@2 ~@2 e5 ~@3", // Em Fm Fmaj7 Fm
  M: "~@2 db5 ~ ab5 db5 bb4 ~ db5 bb4 ab4 ~ bb4 ab4 f4 ~, ~@2 eb5 ~@5",
  N: "[bb2@22 [eb4,ab4]@3 ~ [eb4,ab4]@2 ~ [eb4,ab4]@2 ~, ~@22 [d4,e4] ~@3 e4 ~@2 e4 ~@2]/2", // Ab5 Dsus2
  O: "db4 d4@4 ~@11, ab4@15 ~", P: "~@4 [ab4,db5]@2 ~ [ab4,db5]@2 bb2 [f4,bb4] ~ [eb4,ab4] ~ [f4,bb4] ~",
  Q: "~@8 [eb4,e4,f4] ~ [eb4,ab4] ~ [d4,eb4] ~@2 [db4,e4,ab4], ~@4 ab4 ~ ab4 ~", R: "~ [bb3,ab4] ~@2 bb3@8 ~@4",
  S: "ab3 bb3 ~@2 bb3@2 ~@2 bb3 ~@3 bb3 ~@3",
})).s("gm_piano").gain(0.35)

// chords · piano · "Piano Sol" · soft notes
const piano_soft = note("<~@30 A B ~ C D E ~@2 F G ~@16 H ~@6>".pickRestart({
  A: "~@2 bb3 ~@13", B: "~@10 db4 ~@5", C: "ab3@2 ~@12 bb5 ~", D: "~ ab6 ~@2 [f6,ab6] f6 ab6!3 ~ ab6 ~@3 bb5 ~",
  E: "~@6 bb5 ~ f6 ~@7", F: "~@13 eb5 ~@2", G: "~@2 ab5 ~@13", H: "~@5 d4@4 ~@7, ~@2 ab3@5 ~",
})).s("gm_piano").gain(0.19)

// drums · kick
const kick = s("bd").struct("<~@2 A@20 B C D ~ A@14 E F A@8 B C D ~ G@2 H G@3 H G E>".pickRestart({
  A: "x ~ x ~@4 x!2 ~ x ~@4 x", B: "x ~@3 x!2 ~ x", C: "~@2 x!2", D: "x ~@3 x ~@2 x", E: "x", F: "~@3 x ~@4",
  G: "x!2 ~@2 x!2 ~@2", H: "x ~@3 x!2 ~@2",
})).gain(0.48)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@22 A ~ B ~@25 A ~ B ~ C D E D C D E D ~>".pickRestart({
  A: "~@7 x ~@8", B: "~ x ~@6", C: "~@15 x", D: "~@7 x ~@6 x ~", E: "~@2 x ~@4 x ~@7 x",
})).gain(0.24)

// drums · snare
const snare = s("sd").struct("<~ A B@21 C B A B@14 D A B@9 C B A B@8 D>".pickRestart({
  A: "~ x", B: "~ x ~ x", C: "~@4 x!8 ~@4", D: "x",
})).gain(0.6)

// drums · low tom
const low_tom = s("lt").struct("<~@23 [~@12 x!4] ~@27 [~@12 x!4] ~@11>").gain(0.48)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@2 A B C D A B C D A B C D A B C D A B C D A E A F A B C D A B C D A B C D A B G H A B C D A B C D A E A F I J C K I
  J C K ~
>`.pickRestart({
  A: "~ x!3", B: "x ~ x ~ x ~ x!2", C: "x ~ x ~ x!3 ~", D: "x ~ x ~ x!4", E: "x!2 ~@6", F: "x", G: "~@2 x!2",
  H: "x!2 ~@2", I: "~ x!2 ~ x!4", J: "x!3 ~ x!3 ~", K: "x!3 ~ x!4",
})).gain(0.54)

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

// drums · open hat
const open_hat = s("oh").struct("<~@24 [~@7 x] ~@27 [~@7 x] ~@10>").gain(0.6)

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

stack(
  bass, rock_organ, rock_organ_soft, piano, piano_soft, kick, kick_soft, snare, low_tom, hihat, hihat_soft, open_hat,
  crash
)

More by Booker T. & The MG's