Strudelify

I Got the Hook Up

Master P

KeyF majorTempo80 bpm
0:00/0:00
// I Got the Hook Up — Master P
// 80 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 69 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/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.

// chords · epiano1
const epiano1 = note(`<
  ~ A B C D E F C D A B C D E F C D A B C D E F C D A B C D E F C D A B C D E F C D A B C D E F C D ~@4 E F C D A B C D
  E F C D A B C G
>`.pickRestart({
  A: "~@2 f4@4 ~@2 [e4,g4,c5,e5,g5]@7 ~, [bb4,d5,f5,a5]@7 ~@9, d4@5 ~@11", // C Bbmaj7
  B: "c6@2 bb5@2 a5@2 ~@2 [f4,a4,d5,f5,a5,d6]@6 g5 ~, [d4,f4,a4,e5,g5]@3 ~@5", // Dm
  C: "~@2 [f4,bb4]@5 ~ [e4,g4,c5,e5,g5]@6 ~@2, [d4,d5,f5,a5]@7 ~@9", // Bb5 C Dm
  D: "~@2 f4@4 ~@2 [a4,d5,f5]@4 ~@2 [d5,g5] ~, [d4,g4,a4,c5,e5]@7 ~ f4@6 f5@2", // Dm G5 Am7
  E: "[d4,f4,bb4,d5,f5]@7 ~ [e4,g4,c5,e5,g5]@7 ~, a5 ~@15", // Bb C
  F: "c6@2 bb5@2 a5@2 ~@2 [f4,a4,d5,f5,a5,d6]@6 g5 a5, [d4,f4,a4,e5,g5]@3 ~@5", // Dm
  G: "~ f4@2 ~ [a4,d5,f5]@2 ~@2, [d4,g4,a4,c5,e5]@7 ~ f4@6 ~@2", // Dm Am7
})).s("gm_epiano1").gain(0.36)

// other · string ensemble 2
const string_ensemble_2 = note(`<
  ~ A B C D E@2 C D ~@12 E@2 C D A B C D ~@12 A B C D E@2 C D ~@4 E@2 C D A B C D E@2 C D A B C D
>`.pickRestart({
  A: "[a4,a5] ~", B: "~ [c5,c6]@3 [f4,f5]@4", C: "[a4,a5] [g4,g5]", D: "[e4,e5]@8 [f4,f5]@7 ~",
  E: "[[a4,a5]@4 [g4,g5]@5 [c5,c6]@3 [f4,f5]@4]/2", // A G C F
})).s("gm_string_ensemble_2").gain(0.24).pan(0.6)

// other · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~ A@2 B@2 C@2 B@2 A@2 B@2 C@2 B@2 A@2 B@2 C@2 B@2 A@2 B@2 C@2 B@2 A@2 B@2 C@2 B@2 A@2 B@2 C@2 B@2 A@2 B@2 C@2 B@2 A@2
  B@2 C@2 B@2 A@2 D@2
>`.pickRestart({
  A: "[f4@2 c4 f4@3 c4 f4@3 c4 f4@3 c4 f4@4 f4@3 c4 f4@3 c4 f4@3 c4 f4]/2",
  B: "[~@3 f4@3 c4 f4@3 c4 f4@3 ~ f4@3 c4 f4@3 c4 f4@3 ~ f4@3 c4 f4]/2",
  C: "[f4@2 c4 f4@3 c4 f4@3 c4 f4@3 c4 f4@3 ~ f4@3 c4 f4@3 c4 f4@3 c4 f4]/2",
  D: "[~@3 f4@3 c4 f4@3 c4 f4@3 ~ f4@3 c4 f4@3 c4 f4@3 ~ f4@3 ~@2]/2",
})).s("gm_acoustic_guitar_steel").gain(0.31)

// other · acoustic guitar steel · soft notes
const acoustic_guitar_steel_2 = note(`<
  ~@2 A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A
  B C ~ A B C ~ A B C
>`.pickRestart({
  A: "~@2 c4 ~@13", B: "~@2 c4 ~@11 c4 ~", C: "~@10 c4 ~@5",
})).s("gm_acoustic_guitar_steel").gain(0.21)

// other · flute
const flute = note(`<
  ~ A B@2 C@2 B@2 D ~@12 E B@2 F@2 B@2 D ~@12 G B@2 C@2 B@2 D ~@4 E B@2 F@2 B@2 C@2 B@2 F@2 B@2 ~
>`.pickRestart({
  A: "~@3 d4@5", B: "[~@13 e4@11 ~@8]/2", C: "[~@7 e4@5 ~@4]/2", D: "~@7 e4", E: "e4 ~",
  F: "[~@11 d4@5, ~@7 e4@5 ~@4]/2", G: "~@3 d4@5, e4 ~",
})).s("gm_flute").gain(0.4)

// bass · synth bass 2
const bass = note(`<
  ~ 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 B A B A B A B A B A B A B A B A B A B A B A B ~@4 A B A B A B A B
  A B A B A B A B
>`.pickRestart({
  A: "bb2@5 ~@3 c3@6 ~@2", B: "a2@6 ~@2 d3@5 ~@3",
})).s("gm_synth_bass_2").gain(0.4)

// bass · piano
const bass_2 = note(`<
  ~ A B C D A B C D ~ E ~ F ~ E ~ F ~ B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D ~@4 A B C D A B C D
  A B C D A B C G
>`.pickRestart({
  A: "bb1@7 ~ a1!2 ~ a1@2 ~@3", B: "c2@5 ~@3 d2!2 ~ d2 ~@2 c2@2", C: "bb1@7 ~ a1!2 ~ a1@3 ~@2",
  D: "c2@4 ~@4 d2!2 ~ d2@2 ~ c2@2", E: "~@8 d2!2 ~ d2 ~@4", F: "~@8 d2!2 ~ d2@2 ~@3", G: "c2@4 ~@4 d2!2 ~ d2@2 ~@3",
})).s("gm_piano").gain(0.4)

// chords · piano · A
const piano = note("<~ [[a3,a4]@3 ~@13] ~@67>").s("gm_piano").gain(0.31)

// chords · piano · soft notes · Dm
const piano_soft = note("<~ [[d4,f4]@3 ~@13] ~@67>").s("gm_piano").gain(0.15)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B
  A C A B A C A B A D
>`.pickRestart({
  A: "x ~@7 x!2 ~ x ~@4", B: "x ~@6 x!3 ~@3 x ~ x", C: "x ~@6 x!3 ~ x ~ x ~ x", D: "x ~@6 x!3 ~ x ~ x ~@2",
})).gain(0.64)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B
  A ~ A B A ~ A B A ~
>`.pickRestart({
  A: "~@15 x", B: "~@11 x ~@4",
})).gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<~@46 [~@3 x ~@12] ~@22>").gain(0.32)

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

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

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

// drums · shaker
const shaker = s("sh").struct("<~ [~@10 x!2 ~@2 x!2]!67 [~@10 x!2 ~@4]>").gain(0.48)

stack(
  epiano1, string_ensemble_2, acoustic_guitar_steel, acoustic_guitar_steel_2, flute, bass, bass_2, piano, piano_soft,
  kick, kick_soft, low_tom, hihat, open_hat, crash, shaker
)