Strudelify
All That She Want's cover art

Happy Nation

All That She Want's

Ace of Base

KeyC♯ minorTempo96 bpm
0:00/0:00
// All That She Want's — Ace of Base
// 96 bpm, 4/4, key C# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 7 "ALTO SAX" alto sax (copy of ch 6 "TENOR SAX" tenor sax)
// note: Full arrangement: all 88 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(96/4)

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

// bass · synth bass 1 · "SYN BASS 1"
const bass = note(`<
  ~@4 A B C D E F G H ~@8 E F I D E F I D J F K D E F G H ~@9 E F L D E F L D M N@2 O@2 P O Q E F I D E F L D R@2 S@3 P
  N Q N@2 S T ~@7
>`.pickRestart({
  A: "c#2@2 ~ c#2 e2@2 f#2@2 c#2!2 ~@6", B: "~@7 b1", C: "c#2!2 ~ c#2 e2@2 f#2@2 c#2!2 ~@4 g#2!2",
  D: "f#2 g#2 ~@4 e2!2 f#2!2 ~@4 b1@2", E: "c#2@2 ~ c#2 e2@2 f#2 ~ c#2!2 ~@4 c#2!2", F: "b1!2 ~@4 b1!2 f#2!2 ~@4 b1@2",
  G: "c#2@3 c#2 e2@2 f#2 ~ c#2!2 ~@4 g#2!2", H: "f#2 g#2 ~@4 e2!2 f#2!2 ~@6",
  I: "c#2@2 ~ c#2 e2@2 f#2 ~ c#2!2 ~@4 g#2!2", J: "c#2@2 ~ c#2 e2 ~ f#2 ~ c#2!2 ~@4 c#2!2",
  K: "c#2@3 c#2 e2@2 f#2@2 c#2!2 ~@4 g#2!2", L: "c#2@2 ~ c#2 e2@2 f#2@2 c#2!2 ~@4 g#2!2",
  M: "c#2 ~ c#2 ~@3 c#2 ~ g#1@4 b1@2 c2 ~", N: "c#2 ~ c#2 ~@3 c#2@2 g#1@4 b1@2 c2@2",
  O: "c#2 ~ c#2 ~@3 c#2@2 g#1@3 ~ b1@2 c2 ~", P: "c#2 ~ c#2 ~@3 c#2@2 g#1@3 ~ b1@2 c2@2",
  Q: "c#2 ~ c#2 ~@3 c#2 ~ g#1@3 ~ b1@2 c2@2", R: "c#2 ~ c#2 ~@3 c#2 ~ g#1@4 b1@2 c2@2",
  S: "c#2 ~ c#2 ~@3 c#2@2 g#1@4 b1@2 c2 ~", T: "c#2 ~ c#2 ~ c#2 ~ c#2 ~ c#2 ~ c#2 ~ c#2 ~@3",
})).s("gm_synth_bass_1").gain(0.32)

// other · tenor sax
const tenor_sax = note("<~@3 A ~@15 A ~@3 A ~@20 A ~@3 A ~@39>".pickRestart({
  A: "~@10 g#2!2 b2 c#3 ~ c#3",
})).s("gm_tenor_sax").gain(0.58).pan(0.7)

// other · whistle
const whistle = note(`<
  A B A C ~@3 D E F E G ~@16 A B A H A B A H ~@25 I J I H I J I H A B A H A B A H ~@11
>`.pickRestart({
  A: "c#5@2 c#5@4 c#5@2 e5 c#5 e5@2 c#5@2 c#5@2", B: "c#5@2 c#5@4 c#5@2 f#5 c#5 f#5@2 c#5@2 e5@2",
  C: "b4 b4@2 b4!2 ~@3", D: "~@10 c#7!6", E: "~@12 g#6 ~ a6 ~", F: "b6@2 d#6!2 ~ d#6 e6 ~ f#6@2 c#7!6",
  G: "b6@2 d#6!2 ~ d#6 g#6 ~ f#6@2 ~@6", H: "c#5 ~@7", I: "c#5@2 c#5@2 c#5@2 c#5@2 e5 c#5 e5@2 c#5@2 c#5@2",
  J: "c#5@2 c#5@2 c#5@2 c#5@2 f#5 c#5 f#5@2 c#5@2 e5@2",
})).s("gm_whistle").gain(0.44).pan(0.2)

// chords · epiano2 · "+DETUNE EP"
const epiano2 = note(`<
  ~@4 A B A B A B A C D E F G H I J K A L A L A L A L A M A M A M A M ~ N O N P N Q R S A L A L A L A T ~@8 A M A M A M
  A M A L A L A L A L ~@11
>`.pickRestart({
  A: "~@2 [c#4,e4,g#4] ~@3 [c#4,e4,g#4] ~@3 [c#4,e4,g#4] ~@3 [c#4,e4,g#4] ~", // C#m
  B: "~@2 [b3,d#4,g#4] ~@3 [b3,d#4,g#4] ~@3 [a3,c#4,f#4] ~@3 [a3,c#4,f#4] ~", // G#m F#m
  C: "~@2 [b3,d#4,g#4] ~@3 [b3,d#4,g#4] ~@9", // G#m
  D: "~@2 [c#4,f4,g#4] ~@3 [c#4,f4,g#4] ~@3 [c#4,f4,g#4] ~@3 [c#4,f4,g#4] ~", // C#
  E: "~@2 [b3,d#4,f#4] ~@3 [b3,d#4,f#4] ~@3 [f#3,a#3,c#4] ~@3 [f#3,a#3,c#4] ~", // B F#
  F: "~@2 [g#3,c#4,f4] ~@3 [g#3,c#4,f4] ~@3 [g#3,c#4,f4] ~@3 [g#3,c#4,f4] ~", // C#
  G: "~@2 [g#3,c4,d#4] ~@3 [g#3,c4,d#4] ~@3 [g#3,c4,d#4] ~@3 [g#3,c4,d#4] ~", // G#
  H: "~@2 [c#4,f4,g#4] ~@3 [c#4,f4,g#4] ~@3 [c#4,f4,g#4] ~@3 [c#4,f4,a#4] ~", // C# A#m
  I: "~@2 [c#4,f#4,a#4] ~@3 [c#4,f#4,a#4] ~@3 [c#4,f#4,a4] ~@3 [c#4,f#4,b4] ~", // F# F#m F#sus4
  J: "~@2 [c#4,f4,g#4] ~@3 [c#4,f4,g#4] ~@3 [c4,d#4,g#4] ~@3 [c4,d#4,g#4] ~", // C# G#
  K: "~@2 [a#3,c#4,f#4] ~@3 [a#3,c#4,f#4] ~@3 [a#3,c#4,f#4] ~@3 [a#3,c#4,f#4] ~", // F#
  L: "~@2 [b3,d#4,g#4] ~@3 [b3,d#4,g#4] ~@3 [a3,c#4,f#4] ~@3 [c#4,f#4,a4] ~", // G#m F#m
  M: "~@2 [b3,d#4,f#4,g#4] ~@3 [b3,d#4,f#4,g#4] ~@3 [a3,c#4,f#4] ~@3 [c#4,f#4,a4] ~", // G#m7 F#m
  N: "~@2 [g#3,c#4,e4] ~@3 [g#3,c#4,e4] ~@3 [g#3,c#4,e4] ~@3 [g#3,c#4,e4] ~", // C#m
  O: "~@2 [f#3,b3,d#4] ~@3 [f#3,b3,d#4] ~@3 [f#3,a3,c#4] ~@3 [f#3,a3,c#4] ~", // B F#m
  P: "~@2 [g#3,b3,d#4] ~@3 [g#3,b3,d#4] ~@3 [g#3,c4,d#4] ~@3 [g#3,c4,d#4] ~", // G#m G#
  Q: "~@2 [a3,c#4,f#4] ~@3 [a3,c#4,f#4] ~@3 [a3,c#4,f#4] ~@3 [a3,c#4,f#4] ~", // F#m
  R: "~@2 [g#3,c#4,e4] ~@3 [g#3,c#4,e4] ~@3 [g#3,b3,d#4] ~@3 [g#3,b3,d#4] ~", // C#m G#m
  S: "~@2 [f#3,a3,c#4] ~@3 [f#3,a3,c#4] ~@9", T: "~@2 [b3,d#4,g#4] ~@3 [b3,d#4,g#4] ~@3 [a3,c#4,f#4] ~@5",
})).s("gm_epiano2").gain(0.51).pan(0.4)

// other · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note("<~@41 c#4 [f#3 a3] g#3 ~@44>").s("gm_synth_strings_1").gain(0.44).pan(0.2)

// chords · synth brass 1 · "SYNBRASS 1" · C#5 G#5 B5 C5 C#5
const synth_brass_1 = note(`<
  ~@57
  [[c#3,g#3] ~ [c#3,g#3] ~@3 [c#3,g#3] ~ [g#2,d#3]@4 [b2,f#3]@2 [c3,g3]@2]!3
  [[c#3,g#3] ~ [c#3,g#3] ~@13]
  ~@27
>`).s("gm_synth_brass_1").gain(0.44).pan(0.8)

// other · vibraphone
const vibraphone = note("<A B A C ~@24 A B A D A B A D ~@33 A B A D A B A D ~@11>".pickRestart({
  A: "c#6@2 c#6@4 c#6@2 e6 c#6 e6@2 c#6@2 c#6@2", B: "c#6@2 c#6@4 c#6@2 f#6 c#6 f#6@2 c#6@2 e6@2",
  C: "b5 b5@2 b5!2 ~@3", D: "c#6 ~@7",
})).s("gm_vibraphone").gain(0.29).pan(0)

// drums · kick
const kick = s("bd").struct("<A@3 B C@7 D C@24 A E@3 F C@3 B C@7 B C@27 G ~@7>".pickRestart({
  A: "x ~@2 x ~@2 x ~ x ~@2 x ~@4", B: "x ~@2 x ~@2 x ~ x ~@7", C: "x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~",
  D: "x ~@2 x ~@2 x ~ x ~@3 x ~@3", E: "~ x ~ x", F: "~ x ~@2", G: "x",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct("<~@4 A@7 B A@25 ~@3 C A@3 B A@7 B A@27 ~@8>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@12 x!2 ~@2",
})).gain(0.39)

// drums · hihat
const hihat = s("hh").struct("<~@3 A B@7 C B@24 D B@3 E B@3 F B@7 F B@27 G ~@7>".pickRestart({
  A: "~ x", B: "x!16", C: "x!9 ~@3 x ~@3", D: "x!7 ~", E: "x!12 ~@4", F: "x!9 ~@7", G: "x",
})).gain(0.33)

// drums · crash
const crash = s("cr").struct("<~@4 A ~@7 A ~@7 A ~@7 A ~@8 A ~@7 A ~@7 A ~@7 A ~@7 A ~@18>".pickRestart({
  A: "x",
})).gain(0.33)

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

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@4 A@7 ~ A@24 ~ A@7 ~ A@7 ~ A@27 ~@8>".pickRestart({
  A: "~@7 x",
})).gain(1.41)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<~@53 [x!3 ~@3 x!5 ~ x ~ x!2]!8 ~@27>").gain(0.32)

stack(
  bass, tenor_sax, whistle, epiano2, synth_strings_1, synth_brass_1, vibraphone, kick, snare, hihat, crash, tambourine,
  cabasa, woodblocks
)

More by Ace of Base