Strudelify
Vibeology cover art

1992 · Spellbound

Vibeology

Paula Abdul

KeyD♭ majorTempo117 bpm
0:00/0:00
// Vibeology — Paula Abdul
// 117 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 2 "SYN BASS 1" synth bass 1 (copy of ch 3 "SYN BASS 2" synth bass 2)
// note: Full arrangement: all 147 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(117/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 · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  A@36 B@4 A@4 B@4 A@8 B@4 C@8 D@2 E@4 A@4 B@8 A@8 B@4 C@8 D@2 E@4 B@4 ~@4 F G ~@8 H@4 E@4 B@8 I
>`.pickRestart({
  A: "[eb1@3 gb1 ~ eb1 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 ab1@4 db1@2 c1@2 bb0@2]/4",
  B: "[eb1@3 gb1 ~ eb1 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 ab1@3 ~ db1@2 c1@2 bb0@2]/4",
  C: "[eb1@3 gb1 ~ eb1 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 gb1@3 ~ db1@2 c1@2 b0@5 ab1 ~ b0 ab1@4 db1@2 c1@2 eb1@2]/8",
  D: "[~@3 gb1 ~ eb1 gb1@4 db1@2 c1@2 b0@5 ab1 ~ b0 ab1@4 db1@2 c1@2 bb0@2]/2",
  E: "[eb1@3 gb1 ~ eb1 gb1@4 db1@2 c1@2 b0@5 ab1 ~ b0 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 gb1@4 db1@2 c1@2 b0@5 ab1 ~ b0 ab1@4 db1@2 c1@2 bb0@2]/4",
  F: "eb1@3 ~@13", G: "eb1@3 gb1 ~ eb1 ab1@4 db1@2 c1@2 eb1@2",
  H: "[eb1@3 gb1 ~ eb1 gb1@3 ~ db1@2 c1@2 b0@5 ab1 ~ b0 ab1@4 db1@2 c1@2 eb1@5 gb1 ~ eb1 gb1@4 db1@2 c1@2 b0@5 ab1 ~ b0 ab1@4 db1@2 c1@2 bb0@2]/4",
  I: "eb1@3 eb1 ~@12",
})).s("gm_synth_bass_2").gain(0.28).pan(0.3)

// chords · piano · "A.PIANO 2"
const piano = note(`<
  ~@28 A B C B A B C B ~@20 D@2 E@2 F@2 G@2 H@2 I B C B A B C B J K J L M N O P ~@12 D@2 E@2 F@2 G@2 H@2 A B C B I B C B
  J K J L ~@6 A B C B A B C B A B C B I B C B ~@9
>`.pickRestart({
  A: "[bb3,db4,gb4,bb4]@2 ~ [bb3,gb4,bb4]@2 ~ [b3,eb4,gb4,b4]@3 [b3,eb4,gb4,b4]@2 ~ [bb3,db4,gb4]@2 [bb3,db4,gb4]@2, ~@3 db4 ~@8 bb4 ~@3", // Gb Ebm B Gb
  B: "[ab3,b3,eb4,ab4]@2 ~ [ab3,b3,eb4,ab4]@3 [a3,db4,gb4]@3 [a3,db4,gb4]@2 ~ [ab3,db4,f4]@2 [ab3,c4,f4] ~", // Abm Gbm Db Fm
  C: "[bb3,db4,gb4,bb4]@2 ~ [bb3,db4,gb4,bb4]@2 ~ [b3,eb4,gb4,b4]@3 [b3,eb4,gb4,b4]@2 ~ [bb3,db4,gb4,bb4] ~ [bb3,db4,gb4] ~", // Gb B Gb
  D: "[[bb3,bb4]@8 [ab3,ab4]@2 [gb3,gb4]@4 [f3,f4]@17 ~]/2", // Bb Ab Gb F
  E: "[[ab3,ab4]@7 ~ [gb3,gb4]@2 [f3,f4]@4 [eb3,eb4]@16 ~@2]/2", // Ab Gb F Eb
  F: "[[bb3,bb4]@8 [ab3,ab4]@2 [gb3,gb4]@3 ~ [f3,f4]@17 ~]/2", // Bb Ab Gb F
  G: "[[ab3,ab4]@8 [gb3,gb4]@2 [f3,f4]@4 [bb2,ab3,bb3,d4,f4]@17 ~]/2", H: "[a2,g3,a3,db4,e4]/2",
  I: "[bb3,db4,gb4,bb4]@2 ~ [bb3,gb4,bb4]@2 ~ [b3,eb4,gb4,b4]@3 [b3,eb4,gb4,b4]@2 ~ [bb3,db4,gb4]@2 [bb3,db4,gb4] ~, ~@3 db4 ~@8 bb4 ~@3", // Gb Ebm B Gb
  J: "eb1@3 ~@8 db2 ~ db2 ~@2", K: "~@9 eb2 ~ eb2 ~ db2 ~@2", L: "~@7 eb1 ~ db2 ~ eb2 ~ db2 ~@2",
  M: "eb1@3 ~@6 bb2 [db3,gb3] bb2 [db3,gb3] c3 ~@2", N: "~@9 db2 ~ eb2 ~ db2 ~@2", O: "eb1@3 ~@8 bb2 [db3,gb3] c3 ~@2",
  P: "~@9 db2 ~ db2 ~ eb2 ~@2",
})).s("gm_piano").gain(0.35).pan(0.3)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@56 A@2 B@2 C@2 D@2 E@2 ~@28 A@2 B@2 C@2 D@2 E@2 ~@43>".pickRestart({
  A: "[[bb3,bb4]@8 [ab3,ab4]@2 [gb3,gb4]@4 [f3,f4]@17 ~]/2", // Bb Ab Gb F
  B: "[[ab3,ab4]@7 ~ [gb3,gb4]@2 [f3,f4]@4 [eb3,eb4]@16 ~@2]/2", // Ab Gb F Eb
  C: "[[bb3,bb4]@8 [ab3,ab4]@2 [gb3,gb4]@3 ~ [f3,f4]@17 ~]/2", // Bb Ab Gb F
  D: "[[ab3,ab4]@8 [gb3,gb4]@2 [f3,f4]@4 [bb2,ab3,bb3,d4,f4]@17 ~]/2", E: "[a2,g3,a3,db4,e4]/2",
})).s("gm_string_ensemble_2").gain(0.25).pan(0.4)

// drums · kick
const kick = s("bd").struct("<[x!4]!146 [x ~@2 x ~@12]>").gain(0.5)

// drums · snare
const snare = s("sd").struct("<~@3 [~@8 x!8] [x!16]!142 [x ~@2 x ~@12]>").gain(0.15)

// drums · clap
const clap = s("cp").struct("<~@8 A@20 ~@8 A@20 B@10 A@8 B@30 A@8 B@4 A@22 B@8 ~>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.3)

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

// drums · low tom
const low_tom = s("lt").struct("<~@116 [x ~@2 x!2 ~ x ~ x ~ x ~ x ~@3]!4 ~@27>").gain(0.35)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@5 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 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 ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@15 x",
})).gain(0.3)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@4 A@4 ~@16 A@4 ~@24 A@4 ~@60 B C D E A@2 ~@24 F>".pickRestart({
  A: "~ x ~ x", B: "x ~ x ~ x ~ x!2", C: "x!8", D: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2", E: "x!3 ~ x ~ x ~ x!7 ~",
  F: "x ~@2 x ~@12",
})).gain(0.3)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct(`<
  ~@116
  [~ x!3 ~ x!3 ~ x!3 ~ x ~ x]
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2]
  [~@3 x ~ x ~ x ~@7 x]
  ~@27
>`).gain(0.15)

stack(bass, piano, string_ensemble_2, kick, snare, clap, hihat, low_tom, open_hat, crash, tambourine, tambourine_soft)

More by Paula Abdul