Strudelify
Voulez Vous cover art

Voulez-Vous

Voulez Vous

ABBA

KeyF majorTempo127 bpm
0:00/0:00
// Voulez Vous — ABBA
// 127 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 distortion guitar (copy of ch 2 lead 5 charang); ch 8 pad warm (copy of ch 11 pad halo)
// note: Full arrangement: all 173 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(127/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 · fretless bass
const bass = note(`<
  ~@7 A B@8 C@12 D@2 C D@3 C E F@4 C E F@4 C E F@2 B@8 C@12 D@2 C D@3 C E F@4 C E F@4 C@2 D@2 C D@3 C E F@4 C E F@4 C E
  F@2 B@8 C@2 F@4 C E F@4 C E F@4 C E F@4 C E F@4 C E F@4 C E F@2 ~@3 A B@8 G
>`.pickRestart({
  A: "~@7 e1", B: "f1 f2 f1 f2 f1 f2 f1 e1", C: "bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 bb1 bb2 bb1 bb2",
  D: "f1@2 f2@2 f1@2 f2@2 f1@2 f2@2 f1 f2 f1 f2", E: "bb1@2 bb2@2 bb1@2 bb2@2 bb1@2 bb2@2 db2 db3 db2 db3",
  F: "eb2@2 eb3@2 eb2@2 eb3@2 eb2@2 eb3@2 eb2 eb3 eb2 eb3", G: "[f1,f2] ~@7",
})).s("gm_fretless_bass").gain(0.31)

// other · lead 5 charang
const lead_5_charang = note(`<
  A B A B A B A B A B A B A B A B ~@34 A B A B A B A B ~@54 A B A B A B A B ~@44 A B A B A B A B ~
>`.pickRestart({
  A: "a4 bb4 a4 bb4 a4 bb4 a4@4 f4@4 eb4@2", B: "bb3 c4 eb4 f4 bb3 c4 eb4 f4 f3@2 gb3@2 f3@2 ~@2",
})).s("gm_lead_5_charang").gain(0.4).pan(0.6)

// other · pad poly
const pad_poly = note(`<
  ~@4 A B A B A B A B A B A B ~@24 A B ~@4 A B ~@6 A B A B ~@24 A B ~@4 A B ~@12 A B ~@4 A B ~@6 A B A B ~@12 A B ~@4 A
  B ~@4 A B ~@4 A B ~@4 A B ~@2 A B A B A B A B A B A B ~
>`.pickRestart({
  A: "f4!4 f5!4 gb5!3 f5!3 eb5!2", B: "f3!4 f4!4 gb4!3 f4!3 eb4!2",
})).s("gm_pad_poly").gain(0.28)

// chords · piano
const piano = note(`<
  ~@15 A@8 B@5 ~@11 C@2 ~@4 C@2 ~@10 A@8 B@5 ~@11 C@2 ~@4 C@2 ~@12 C@2 ~@4 C@2 ~@10 D@3 ~@3 C@2 ~@4 C@2 ~@4 C@2 ~@4 C@2
  ~@4 C@2 ~@4 C@2 ~@16
>`.pickRestart({
  A: "[~@16 [f4,bb4]@15 ~ [db4,gb4]@15 ~ [f4,bb4]@15 ~ [db4,gb4]@15 ~ [f4,bb4]@15 ~ [db4,gb4]@15 ~ [f4,bb4]@15 [gb3,bb3], ~@15 [bb3,db4]@16 [gb3,bb3]@16 [bb3,db4]@16 [gb3,bb3]@16 [bb3,db4]@16 [gb3,bb3]@16 [bb3,db4]@16 ~]/8", // Bb5 Gb5 Bb5 Gb5 Bb5 Gb5 Bb5 Gb …
  B: "[[db4,gb4]@8 f4@7 ~ [f4,bb4]@15 ~ [db4,gb4]@15 ~ [f4,bb4]@15 ~ [db4,gb4]@8 f4@8, ~@15 [bb3,db4]@16 [gb3,bb3]@16 [bb3,db4]@16 [gb3,bb3]@10 ~@7]/5", // Gb5 Bb5 Gb5 Bb5 Gb5 Bbm Gb Bbm …
  C: "[~@16 [f4,bb4]@15 ~, ~@15 [bb3,db4]@16 ~]/2", // Bb5 Bbm
  D: "[~@16 [f4,bb4]@15 ~ [db4,gb4]@8 f4@8, ~@15 [bb3,db4]@16 [gb3,bb3]@10 ~@7]/3", // Bb5 Gb5 Bbm Gb
})).s("gm_piano").gain(0.31).pan(0.3)

// other · pad halo
const pad_halo = note("<~@16 A B C@2 ~@38 A B C@2 ~@111>".pickRestart({
  A: "f4", B: "gb4@5 ab4@2 gb4", C: "[f4@3 db4@3 bb3@10]/2",
})).s("gm_pad_halo").gain(0.48).pan(0.7)

// bass · synth bass 1
const bass_2 = note("<~@122 A@4 B C A@4 ~@2 A@4 B C A@4 B ~ A@4 B C A@4 B C A@2 ~@13>".pickRestart({
  A: "eb3!16", B: "bb2!16", C: "bb2!12 db3!4",
})).s("gm_synth_bass_1").gain(0.31)

// drums · kick
const kick = s("bd").struct("<~@4 [x!4]!168 x>").gain(0.35)

// drums · snare
const snare = s("sd").struct(`<
  ~@8 A@3 B A@3 C A@3 D A@3 B A@3 E A@7 F A@10 G@2 A@5 B A@3 H A@3 D A@3 B A@11 F A@10 G@2 A@7 I A@4 G@2 A@4 G@2 A@9 I
  ~@6 J@2 ~@4 A@2 ~@4 J@2 ~@4 J A ~@4 J@2 ~@4 J@2 ~@6 A@3 B A@3 C ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x!2 ~@2", C: "~@4 x ~@6 x ~ x!2 ~", D: "~@4 x ~@4 x ~@2 x ~ x ~", E: "~@2 x ~@3 x!2",
  F: "~@4 x ~@3 x!8", G: "~@4 x ~@2 x ~ x ~@2 x ~@3", H: "~@4 x ~@6 x!4 ~", I: "~@4 x ~@7 x!4", J: "~@7 x ~ x ~@6",
})).gain(0.35)

// drums · clap
const clap = s("cp").struct(`<
  ~@36 A B A B A B A B A B A B A B A B A B A B A B ~@20 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 ~@2 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 ~@2 A B A B ~@9
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!2 ~",
})).gain(0.35)

// drums · hihat
const hihat = s("hh").struct("<~@7 [~@15 x] [~ x!2 ~ x ~ x ~@2 x ~ x ~ x ~ x]!164 ~>").gain(0.35)

// drums · open hat
const open_hat = s("oh").struct("<~@7 [~@7 x] [x ~@2 x ~ x ~ x!2 ~ x ~ x ~ x ~]!164 ~>").gain(0.23)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@3 A ~@3 A ~@3 A ~@11 A ~@7 A ~@5 A ~@3 A ~ A ~ A ~@7 A ~@11 A ~@7 A ~@3 A ~ A ~@3 A ~ A ~@7 A ~@3 A ~ A ~@3 A
  ~ A ~ A ~@7 A ~ A ~@9 A B A ~@5 A ~@4 B A ~@5 A ~@7 A ~ A ~ A ~@3 A ~@3 A
>`.pickRestart({
  A: "x", B: "~ x",
})).gain(0.35)

stack(bass, lead_5_charang, pad_poly, piano, pad_halo, bass_2, kick, snare, clap, hihat, open_hat, crash)

More by ABBA