Strudelify
Good Vibrations cover art

1991 · Music For The People

Good Vibrations

Marky Mark

KeyA♭ majorTempo121 bpm
0:00/0:00
// Good Vibrations — Marky Mark
// 121 bpm, 4/4, key Ab major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 12 "Slap Bass" slap bass 1 (copy of ch 11 "Fingered Bass" electric bass finger)
// note: Full arrangement: all 134 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(121/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · electric bass finger · "Fingered Bass"
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 ~@4 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 ~@8 A B A B A B A B ~@4 A B A B A B A B ~@4 A B A B A B A B A B A B ~@8 A B A B A B A B A B A B A B A B C
>`.pickRestart({
  A: "~@2 ab1@2 ~ ab1@2 ~ bb1@2 ~ bb1@2 ~ bb1@2", B: "~@2 gb1@2 ~ gb1@2 ~ ab1@2 ~ ab1@2 ~ ab1@2", C: "bb1 ~@7",
})).s("gm_electric_bass_finger").gain(0.8)

// chords · piano
const piano = note(`<
  ~@9 A B C B A B A B C B A B C B A B ~@8 A B A B C B A B C B A B ~@8 A B A B C B A B C B A B ~@16 C B A B A B C B A B C
  B A B A B C B A B D E F G H I J K A B C B A B A B C B A B C B A L M N O G H I J K P
>`.pickRestart({
  A: "~@2 [ab3,c4,eb4]@2 ~ [ab3,c4,eb4]@2 ~ [ab3,db4,f4]@2 ~ [ab3,db4,f4]@2 ~ [ab3,db4]@2, ~@14 f4 ~", // Ab Db Db5
  B: "~@2 [gb3,bb3,db4]@2 ~ [gb3,bb3,db4]@2 ~ [ab3,c4,eb4]@2 ~ [ab3,c4,eb4]@2 ~ [ab3,c4,eb4]@2", // Gb Ab
  C: "~@2 [ab3,c4,eb4]@2 ~ [ab3,c4,eb4]@2 ~ [ab3,db4,f4]@2 ~ [ab3,db4,f4]@2 ~ [ab3,db4,f4]@2", // Ab Db
  D: "~@2 [ab3,c4,eb4,bb4]@2 ~ [ab3,c4,eb4,bb4]@2 ~ [ab3,bb3,db4,f4,bb4]@2 ~ [ab3,bb3,db4,f4,bb4]@2 ~ [ab3,db4,f4]@2, ~@2 bb3 ~@2 bb3 ~@8 [bb3,bb4] ~", // Ab Bbm7 Db Bb
  E: "~@2 [gb3,bb3,db4,bb4]@2 ~ [bb3,bb4] bb3 ~ [ab3,bb3,bb4] [ab3,ab4]!2 [f3,ab3,f4] [ab3,ab4]@2 [ab3,c4,eb4]@2, ~@5 [gb3,db4]@2 ~ [c4,eb4]@2 ~ [c4,eb4]@2 ~ [bb3,bb4] ~", // Gb Bb Absus2 Ab Fm Ab Gb5 Cm …
  F: "~@2 [ab3,c4,eb4,bb4]@2 ~ [ab3,bb3,c4,eb4,bb4]@2 f3 [ab3,db4,f4,ab4]@2 bb3 db4 db5@2 [eb4,f4,eb5] ~, ~@2 bb3 ~@7 bb4@2 db4 ~@3, ~@11 [ab3,f4]@2 ~ [ab3,db4]@2", // Ab Db Ebsus2 Db Db5
  G: "[e4,e5]@2 [gb3,bb3,db4,eb5]@2 db4 bb3 [bb3,bb4] ~ [ab3,c4,eb4]@2 eb4 ~ db4@2 [ab3,c4,eb4]@2, ~@2 eb4 ~ db5@2 ~ [e4,e5]@4 [ab3,c4,eb4]@2 ~ [bb3,bb4] ~, ~@5 [gb3,db4]@2 ~@3 eb5@2 db5 ~@3", // E Ebm7 Bb Ab E Ab Bb Gb5
  H: "[eb5,eb6] eb5 [eb5,eb6]!2 eb5 eb6 ~@2 [ab3,db4,f4]@2 ~@2 [eb5,eb6] [db5,db6] [ab3,db4,bb4,bb5]@2, ~@2 [ab3,c4,eb4]@2 ~ [ab3,c4,eb4]@2 eb6@3 ~ [ab3,db4,f4]@2 ~ f4 ~, ~@3 eb5@2 [e5,e6] ~@2", // Eb Db Eb Db Bbm7 Ab Db E
  I: "~@2 [gb3,bb3,db4]@2 eb5 db5 bb4 ~ db5 bb4 ab4 [eb4,f4] eb4 db4 [ab3,c4,eb4]@2, ~@2 e5 ~@2 [gb3,bb3,db4]@2 ~ [ab3,c4,eb4]@2 ~ [ab3,c4]@2 ~ bb3 ~", // Gb Ebsus2 Ab Gb Ab
  J: "f3!2 [ab3,c4,eb4]@2 ~@2 db4@2 [ab3,db4,eb4,f4]@2 f4 ~ ab4@2 [ab3,db4,f4,bb4]@2, ~@2 bb3 ~@5, ~@5 [ab3,c4,eb4]@2 ~@4 [ab3,db4,f4]@2 ~@3", // Ab Db Bbm7 Ab Db
  K: "[bb3,bb4] ~ db5 [eb4,eb5] [e4,e5] [gb3,bb3,db4]@2 [ab4,ab5] [bb4,bb5] [db5,db6] ~ [eb5,eb6] [e5,e6] [f5,f6] ~ [ab5,ab6], ~@2 [gb3,bb3,db4]@2 ~ [f4,f5] ~@2 [ab3,c4,eb4]@2 ~ [ab3,c4,eb4]@2 ~ [ab3,c4,eb4]@2", // Bb Eb E Gb Ab Bb Db Eb …
  L: "~@2 [gb3,bb3,db4]@2 ~ [gb3,bb3,db4]@2 ~ [ab3,c4,eb4]@2 [e3,e4] ~ [f3,f4] ~ [ab3,c4,eb4]@2, ~@11 [ab3,c4,eb4]@2 ~ ab4 ~", // Gb Ab E F Ab
  M: "[bb3,bb4] ~ [ab3,c4,eb4]@2 [bb3,bb4] ab3 [ab3,ab4] ~ [ab3,db4,f4]@2 [db4,db5] ~ [bb3,bb4] ~ [ab3,db4]@2, ~@2 ab4 ~@2 [c4,eb4]@2 ~ [bb3,bb4] ~@2 [ab3,db4,f4]@2 ~ [f4,ab4] ~", // Bb Ab Bb Ab Db Bb Db5 Cm …
  N: "~ [f3,f4] [gb3,ab3,bb3,db4]@2 [bb3,bb4] ~ c4@2 [ab3,c4,eb4]@2 [db4,db5] c4 [c4,c5]@2 [ab3,c4,eb4]@2, ~@2 ab4 ~@2 [gb3,bb3,db4]@2 ~@4 [ab3,eb4]@2 ~@3, ~@6 c5 ~@7 ab4 ~", // F Gb Bb Ab Db C Ab Gb …
  O: "~@2 [ab3,c4,eb4,bb4]@2 ~ [ab3,bb3,c4,eb4,bb4]@2 f3 [ab3,db4,f4,ab4]@2 bb3 db4 db5@2 [ab3,db4,f4]@2, ~@2 bb3 ~@7 bb4@2 db4 ~ [eb4,eb5] ~, ~@11 [ab3,f4]@2 ~@3", // Ab Db Eb Db
  P: "[bb3,db4,f4,bb4,db5,f5]@3 ~@13, [bb5,db6,f6,bb6] ~@15", // Bbm
})).s("gm_piano").gain(0.8)

// chords · piano · "Piano fattener"
const piano_2 = note(`<
  ~@9 A B C B A B A B C B A B C B A B ~@8 A B A B C B A B C B A B ~@8 A B A B C B A B C B A B ~@16 C B A B A B C B A B C
  B A B A B C B A B D E F G H I J K A B C B A B A B C B A B C B A L M N F G H I J K O
>`.pickRestart({
  A: "~@2 [ab3,c4,eb4]@2 ~ [ab3,c4,eb4]@2 ~ [ab3,db4,f4]@2 ~ [ab3,db4,f4]@2 ~ [ab3,db4]@2, ~@14 f4 ~", // Ab Db Db5
  B: "~@2 [gb3,bb3,db4]@2 ~ [gb3,bb3,db4]@2 ~ [ab3,c4,eb4]@2 ~ [ab3,c4,eb4]@2 ~ [ab3,c4,eb4]@2", // Gb Ab
  C: "~@2 [ab3,c4,eb4]@2 ~ [ab3,c4,eb4]@2 ~ [ab3,db4,f4]@2 ~ [ab3,db4,f4]@2 ~ [ab3,db4,f4]@2", // Ab Db
  D: "~@2 bb4@2 ~ bb4@2 ~ [bb3,bb4]@2 ~ [bb3,bb4]@2 ~ [bb3,bb4] ~, ~@2 bb3 ~@2 bb3 ~@10", // Bb
  E: "~@2 [bb3,bb4]@2 ~ bb4 bb3 ~ [bb3,bb4] [ab3,ab4]!2 [f3,f4] [ab3,ab4]@2 [bb3,bb4] ~", // Bb Ab F Ab Bb
  F: "~@2 bb4@2 ~ [bb3,bb4]@2 f3 [ab3,ab4]@2 bb4@2 db5@2 [eb4,eb5] ~, ~@2 bb3 ~@5 f4 ~ bb3 ~ db4 ~@3", // Bb Ab Eb
  G: "[e4,e5]@2 eb5@2 [db4,db5]@2 [bb3,bb4] [e4,e5]@3 [eb4,eb5]@2 db4@2 [bb3,bb4] ~, ~@2 eb4 ~@9 db5 ~@3", // E Db Bb E Eb Bb
  H: "[eb5,eb6] eb5 [eb5,eb6]!2 ~ [eb5,eb6] ~ eb6@3 [e5,e6]@2 [eb5,eb6] [db5,db6] [bb4,bb5]@2, ~@3 eb5@2 ~@3", // Eb E Eb Db Bb
  I: "~@2 e5 ~ eb5 db5 bb4 ~ db5 bb4 ab4 f4 eb4 db4 bb3 ~", J: "f3!2 ab3@2 bb3@2 db4@2 eb4@2 f4@2 ab4@2 bb4@2",
  K: "[bb3,bb4] ~ [db4,db5] [eb4,eb5] [e4,e5] [f4,f5] ~ [ab4,ab5] [bb4,bb5] [db5,db6] ~ [eb5,eb6] [e5,e6] [f5,f6] ~ [ab5,ab6]", // Bb Db Eb E F Ab Bb Db …
  L: "~@10 [e3,e4] ~ [f3,f4] ~ [ab3,ab4] ~", // E F Ab
  M: "[bb3,bb4] ~ [ab3,ab4] ~ [bb3,bb4] ~ [ab3,ab4] ~ [bb3,bb4] ~ [db4,db5] ~ [bb3,bb4] ~ [ab3,ab4] ~", // Bb Ab Bb Ab Bb Db Bb Ab
  N: "~ [f3,f4] ab3@2 [bb3,bb4] ~ c4@2 ~@2 [db4,db5] ~ [c4,c5]@2 [ab3,ab4] ~, ~@2 ab4 ~@3 c5 ~@9", // F Bb Db C Ab
  O: "[bb5,db6,f6,bb6] ~@15, [bb4,db5,f5] ~@7", // Bbm
})).s("gm_piano").gain(0.8)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A B A B A B A B A ~ 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 A B A B C D C@3 D C@2 A B A B A B A B ~@4 A B A B A B A B C@4 A B A B A B A B A B A B ~@4 C@4 A B A B A B A B A B
  A B A B A B E
>`.pickRestart({
  A: "x!2", B: "x ~@2 x!2 ~@3", C: "x ~@4 x ~ x", D: "x ~ x ~@2 x ~ x", E: "x",
})).gain(0.8)

// drums · rim
const rim = s("rim").struct("<~@65 x ~ x!3 ~ x!2 ~@61>").gain(0.64)

// drums · snare
const snare = s("sd").struct(`<
  A B@7 A B@3 ~ B@3 A B@15 A B@3 A B@15 A B@3 A B@8 C@3 D E C@2 D ~@4 B@4 ~@3 A B@14 A@2 B@8 ~@4 B@11 A B@8 F
>`.pickRestart({
  A: "x!16", B: "~ x ~ x", C: "x!7 ~ x!7 ~", D: "x!7 ~ x!8", E: "~ x!6 ~ x!7 ~", F: "x",
})).gain(0.8)

// drums · clap
const clap = s("cp").struct("<~ [~ x ~ x]!11 ~ [~ x ~ x]!120 x>").gain(0.8)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A@2 B C B C B@2 C A@2 ~ C B C B@2 C A@2 B C B C B@2 C A@2 B C B C B@2 C A@2 B C B C B@2 C A@2 B C B C B@2 C A@2 B C
  B C B@2 C A@2 B C B C B@2 C ~@4 B C B@2 ~@4 C B C B@2 C A@2 B C B C B@2 C A@2 B C B C B@2 C ~@4 B C B@2 C A@2 B C B C
  B@2 C A@2 B C B C ~
>`.pickRestart({
  A: "x!2 ~ x!2 ~@5 x ~ x ~ x ~", B: "x ~@3 x!2 ~ x ~@4 x!4", C: "x ~ x ~ x ~@3 x!2 ~@4 x!2",
})).gain(0.72)

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

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  ~ A B C ~ A ~ B ~ A@2 C ~ A C B ~@2 A ~ A D C B A C B E ~ F ~ C ~ C ~ C ~ G C@2 ~ H ~ G C I ~ C ~ I A C ~ J C K ~ C A
  B ~ C ~ C ~ C ~ K ~ A ~@7 C ~ C ~@5 A C B C B ~ A ~ L ~@2 C M C G C K ~ C ~ G C@3 ~@4 C ~ B ~ C ~@2 C B A ~ B A ~ C@2
  K ~@4
>`.pickRestart({
  A: "~ x ~@6", B: "~ x ~ x ~@4", C: "~@3 x ~@4", D: "~ x!2 ~@3 x ~@9", E: "~ x ~@3 x ~@10", F: "~ x ~@3 x!2 ~@9",
  G: "~ x ~@4 x ~@9", H: "~@5 x!2 ~@9", I: "~@5 x ~@10", J: "~ x!2 ~@2 x!2 ~@9", K: "~@2 x ~@2 x!2 ~@9",
  L: "~ x!2 ~@13", M: "~ x ~@14",
})).gain(1.62)

stack(bass, piano, piano_2, kick, rim, snare, clap, hihat, cabasa, cabasa_soft)