Strudelify
Wheel of Fortune cover art

Happy Nation

Wheel of Fortune

Ace of Base

KeyC♯ minorTempo96 bpm
0:00/0:00
// Wheel of Fortune — Ace of Base
// 96 bpm, 4/4, key C# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 91 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(96/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 · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@3 A B C B D E F@2 G H I J K L M L N O ~ P ~ Q ~ P ~ R G S G J T L M U V W X Y Z R G AA I J AB L M U V AC ~@7 AD AE
  AF AG AH AE AI AJ J AK AL AM AN AO AP G AQ G AR AJ AS AT AU I AS G AQ G AV AW AX
>`.pickRestart({
  A: "~@3 e3", B: "f#3", C: "g#3 c#3", D: "g#3@8 c#3@7 ~", E: "f#3@15 ~", F: "[g#3@18 ~@6 b2!2 c#3 ~@3 e3@2]/2",
  G: "f#3 ~ e3 ~ d#3 ~ c#3 ~ b2!3 ~@3 b2!2", H: "c#3 ~@7 b2!2 c#3 ~@3 e3@2", I: "f#3 ~ e3@2 d#3 ~ c#3 ~ b2!3 ~@3 b2!2",
  J: "c#3@2 ~@6 f#2 ~ f#2!2 ~ f#2 f#2@2", K: "e2@2 e2@2 e2@2 ~@2 d#2!2 ~ d#2 d#2@2 d#2@2",
  L: "c#2@3 ~@5 f#2 ~ f#2!2 ~ f#2 f#2@2", M: "e2 ~ e2 ~ e2@2 ~@2 d#2!2 ~ d#2 d#2@2 d#2@2",
  N: "e2@2 e2@2 e2 ~@3 d#2 ~ d#2!2 ~ d#2 d#2@2", O: "g#2@3 ~@5 b2@2 c#3@4 e3@2", P: "~@4 b2 c#3@2 e3",
  Q: "~@8 b2@2 c#3@4 e3 ~", R: "~@8 b2!2 c#3 ~@3 e3@2", S: "c#3@2 ~@6 b2!2 c#3 ~@3 e3@2",
  T: "e2 ~ e2@2 e2@2 ~@2 d#2!2 ~ d#2!2 ~ d#2@2", U: "c#2@3 ~@5 f#2@2 f#2!2 ~ f#2 f#2@2",
  V: "e2@2 e2@2 e2 ~@3 d#2 ~ d#2!2 ~ d#2!2 ~", W: "g#2@3 ~@5 b2@2 c#3@2 ~@2 e2@2", X: "f#2 ~@7", Y: "~@4 b2 c#3 ~ e2",
  Z: "f#2@3 ~@13", AA: "c#3 ~@7 b2!2 c#3@2 ~@2 e3@2", AB: "e2@2 e2@2 e2@2 ~@2 d#2!2 ~ d#2!2 ~ d#2@2", AC: "g#2@3 ~@13",
  AD: "~@8 b2 c#3!2 ~@3 e3@2", AE: "f#3@2 e3@2 d#3@2 c#3@2 b2!3 ~@3 b2!2", AF: "c#3@2 ~@6 b2 c#3 c#3@2 ~@2 e3@2",
  AG: "f#3@2 e3 ~ d#3 ~ c#3 ~ b2!3 ~@3 b2!2", AH: "c#3@2 ~@6 b2 c#3!2 ~@3 e3@2", AI: "c#3@2 ~@6 b2!2 c#3@2 ~@2 e3@2",
  AJ: "f#3@2 e3 ~ d#3 ~ c#3 ~ b2!2 b2@2 ~@2 b2!2", AK: "e2 ~ e2@2 ~@4 d#2!2 ~ d#2 d#2@2 d#2@2",
  AL: "c#2@2 ~@6 f#2 ~ f#2 f#2@2 f#2 f#2@2", AM: "e2 ~ e2@2 ~@4 d#2 ~ d#2!2 ~ d#2 d#2@2",
  AN: "c#2@2 ~@6 f#2 ~ f#2!2 ~ f#2!2 ~", AO: "e2 ~ e2@3 ~@3 d#2 ~ d#2!2 ~ d#2 d#2@2", AP: "g#2@4 ~@4 b2!2 c#3 ~@3 e3!2",
  AQ: "c#3@2 ~@6 b2!2 c#3@2 ~@2 e3!2", AR: "c#3@2 ~@6 b2 ~ c#3 ~@3 e3!2", AS: "c#3 ~@7 b2!2 c#3 ~@3 e3!2",
  AT: "f#3 ~ e3 ~ d#3 ~ c#3 ~ b2!2 b2@2 ~@2 b2!2", AU: "c#3@2 ~@6 b2 c#3 c#3@2 ~@2 e3!2",
  AV: "c#3 ~@7 b2!2 c#3@2 ~@2 e3!2", AW: "f#3 ~ e3 ~ d#3 ~ c#3 ~ b2!2 b2@2 ~@4", AX: "~@6 b2!2 c#3@3 ~@5",
})).s("gm_electric_bass_finger").gain(0.36)

// other · whistle
const whistle = note(`<
  ~@4 A B A B C D ~@4 E@2 F@2 G H I@8 ~@4 E@2 F@2 G H ~@8 E@2 F@2 G H J@8 ~@8 E@2 K@2 L M N ~@16
>`.pickRestart({
  A: "a6", B: "g#6 e6", C: "f#6@6 g#6 f#6 e6@6 f#6 e6", D: "d#6@7 ~", E: "[~ a6@2 g#6]/2", F: "[e6@8 a6@15 ~ g#6@8]/2",
  G: "e6@5 ~ d#6 e6 f#6@5 g#6@2 f#6", H: "~ e6@4 f#6@2 e6 d#6@8",
  I: "[~@8 [g#5,c#6,e6]@16 [f#5,b5,d#6]@15 ~ [g#5,e6]@15 ~ b5@15 ~ [g#5,c#6]@16 [f#5,b5]@15 ~ [c#6,e6]@16 f#6@8, ~@52 g#5@7 ~@5]/8", // C#m B C#m C#5 B5 C#m
  J: "[~@8 [g#5,c#6,e6]@16 [f#5,b5]@15 ~ [g#5,c#6,e6]@16 [f#5,b5,d#6]@15 ~ [g#5,c#6,e6]@16 [f#5,b5,d#6]@15 ~ [g#5,e6]@15 ~ [f#5,b5]@8]/8", // C#m B5 C#m B C#m B C#m B5
  K: "[e6 a6@2 g#6]/2", L: "e6@6 d#6 e6 f#6@6 g#6 f#6", M: "e6@6 f#6 e6 d#6@7 ~", N: "g#6@3 ~@13",
})).s("gm_whistle").gain(0.13)

// other · whistle · soft notes
const whistle_soft = note("<~@20 A ~ B@5 C@2 ~@9 A ~@13 A D@2 ~@3 E@3 ~@30>".pickRestart({
  A: "g#6@3 ~@13", B: "[~@8 c#6@16 [f#5,d#6]@15 ~ e6@15 ~ d#6@15 ~@9]/5", C: "[~@8 [b5,d#6]@13 ~@11]/2",
  D: "[~ d#6@2 ~]/2", E: "[~@2 c#6@4 d#6@3 ~@3]/3",
})).s("gm_whistle").gain(0.09)

// other · percussive organ · "ORGAN 2"
const percussive_organ = note(`<
  ~@10 A B C D E ~@13 A B C D E ~@5 A B F D A B C D E ~@13 A B G D H B G D I ~@5 J K A D A D A D A D A D A D A L M
>`.pickRestart({
  A: "~@4 b3 c#4 ~ e3", B: "f#3@3 ~@13", C: "~@2 c#5 ~ c#4 c#5 ~ c#4 b3@2 [a#3,c#4] ~@3 e3@2", D: "f#3 ~@7",
  E: "~@2 c#5 ~ c#4 c#5 ~ c#4 ~@8", F: "~@2 c#4 ~@2 c#5 c#4 ~ b3@2 c#4@2 ~@2 e3@2",
  G: "~@2 c#4 c#5 ~ c#4 c#5 ~ b3@2 c#4 ~@3 e3@2", H: "~@2 c#4 c#5 ~ c#4 c#5 ~ b3@2 c#4@2 ~@2 e3@2",
  I: "~@2 c#4 c#5 ~ c#4 c#5 ~@9", J: "~@8 b3@2 c#4 ~@3 e3@2", K: "f#3 ~@15", L: "f#3 ~@3 b3 ~@3",
  M: "~@6 [b2,b3]!2 [c#3,c#4]@2 ~@6", // B C#
})).s("gm_percussive_organ").gain(0.4)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<A@4 B C B D B E@2 ~@80>".pickRestart({
  A: "[[g#3,c#4,e4]@8 [a3,c#4]@8 [b3,d#4]@15 ~ [g#3,c#4,e4]@8 [f#3,a3,c#4]@8 [f#3,b3,d#4]@15 ~, c#3, ~@8 f#3@23 ~@33]/4", // C#m A B C#m F#m B
  B: "[f#3,a3,c#4]", C: "[c4,d#4]@7 ~ [c#4,e4]@7 ~, g#3@15 ~", D: "[g#3,c4,d#4]@7 ~ [g#3,c#4,e4]@7 ~",
  E: "[[g#3,c4,d#4]@5 ~@3]/2", // G#
})).s("gm_string_ensemble_2").gain(0.3)

// other · acoustic guitar nylon · "A.GUITAR"
const acoustic_guitar_nylon = note(`<
  ~@6 A B C D ~@6 E@2 F G H ~@13 E@2 F G H ~@9 E@2 F G H ~@17 I@2 F J K ~@16
>`.pickRestart({
  A: "a5@13 ~@3", B: "g#5@8 e5@7 ~", C: "f#5@6 g#5 f#5 ~ e5@5 f#5 e5", D: "d#5", E: "[~@8 a5@15 ~ g#5@7 ~]/2",
  F: "e5@6 d#5 e5 f#5@5 g#5@2 f#5", G: "e5@5 f#5@2 e5 d#5@8", H: "g#5@3 ~@13", I: "[~@8 a5@15 ~ g#5@8]/2",
  J: "e5@5 f#5@2 e5 d#5@7 ~", K: "g#5 ~@7",
})).s("gm_acoustic_guitar_nylon").gain(0.28)

// other · brass section · "BRASS 1"
const brass_section = note("<~@10 A ~@17 B C@2 D@2 ~@5 A ~@3 A ~@17 A E@2 D@2 F@2 G@2 ~@22>".pickRestart({
  A: "~@8 [c#5,c#6] ~@7", B: "~@4 [c#5,c#6] ~@3", C: "[~@15 e4@3 d#4 ~ c#4 ~ b3 ~@9]/2",
  D: "[~@12 d#4@3 e4@3 d#4 ~ c#4 ~ b3 ~@9]/2", E: "[~@15 e4@3 d#4 ~ c#4@2 b3 ~@9]/2",
  F: "[~@15 e4@3 d#4@2 c#4@2 b3 ~@9]/2", G: "[~@12 d#4@3 e4@2 ~ d#4 ~ c#4 ~ b3 ~@9]/2",
})).s("gm_brass_section").gain(0.36)

// chords · pizzicato strings · "PIZZICATO"
const pizzicato_strings = note(`<
  ~@10 A B C B D E F G F H I B J B J B J B J B C B D K F G F H L ~@3 M B C B D E F G F H I B J B J B J B J B C B C B C B
  D N F G O P I B J B J B J B Q B R B S B J T U
>`.pickRestart({
  A: "~@10 [g#4,c#5,e5] ~@3 [g#4,c#5,e5]@2", B: "~@2 [f#4,a4,c#5] ~@3 [f#4,a4,c#5] ~@3 [f#4,b4,d#5] ~@3 [f#4,b4,d#5] ~",
  C: "~@2 [g#4,c#5,e5] ~@3 [g#4,c#5,e5] ~@3 [g#4,c#5,e5] ~@3 [g#4,c#5,e5] ~", // C#m
  D: "~@2 [g#4,c#5,e5] ~@3 [g#4,c#5,e5] ~@3 [f#4,a4,c#5] ~@3 [f#4,a4,c#5] ~", // C#m F#m
  E: "~@2 [f#4,a4,c#5] ~@3 [f#4,a4,c#5] ~@3 [c5,d#5]@2 ~@2 [g#4,c5,d#5] ~, ~@10 g#4 ~@5", // F#m Cm G#
  F: "~@2 [g#4,c#5,e5] ~@3 [g#4,c#5,d#5] ~@3 [f#4,a4,c#5] ~@3 [f#4,a4,c#5] ~", // C#m G#sus4 F#m
  G: "~@2 [g#4,c#5,e5] ~@3 [g#4,c#5,e5] ~@3 [g#4,c5,d#5] ~@3 [g#4,c5,d#5] ~", // C#m G#
  H: "~@2 [g#4,b4,e5] ~@3 [g#4,b4,e5] ~@3 [a#4,d#5] ~@3 [g4,a#4,d#5] ~, ~@5 g4 ~@2", // E D#5 D#
  I: "[g#4,c5,d#5]@2 ~@8 [g#4,c#5,e5] ~@3 [g#4,c#5,e5] ~", // G# C#m
  J: "~@2 [f#4,b4,d#5] ~@3 [f#4,b4,d#5] ~@3 [g#4,c#5,e5] ~@3 [g#4,c#5,e5] ~", // B C#m
  K: "~@2 [f#4,a4,c#5] ~@3 [f#4,a4,c#5] ~@3 [g#4,c5] ~@3 [g#4,c5,d#5] ~, ~@5 d#5 ~@2", L: "[g#4,c5,d#5] ~@7",
  M: "~@10 [g#4,c#5] ~@3 [g#4,c#5,e5]@2, ~@5 e5 ~@2", // C#5 C#m
  N: "~@2 [f#4,a4,c#5] ~@3 [f#4,a4,c#5] ~@3 [g#4,c5,d#5] ~@3 [g#4,c5,d#5] ~", // F#m G#
  O: "~@2 [g#4,c#5,e5] ~@3 [g#4,c#5,d#5] ~@3 [f#4,a4,c#5]@2 ~@2 [f#4,a4,c#5] ~", // C#m G#sus4 F#m
  P: "~@2 [g#4,b4,e5] ~@3 [g#4,b4,e5] ~@3 [g4,a#4,d#5] ~@3 [g4,a#4,d#5] ~", // E D#
  Q: "~@2 [f#4,b4,d#5] ~@3 [f#4,b4,d#5] ~@3 [g#4,c#5,e5]@2 ~@2 [g#4,c#5,e5] ~", // B C#m
  R: "~@2 [f#4,b4,d#5] ~@3 [f#4,b4] ~@3 [g#4,c#5] ~@3 [g#4,c#5,e5] ~, ~@3 d#5 ~ e5 ~@2", // B B5 C#5 C#m
  S: "~@2 [f#4,b4,d#5] ~@3 [f#4,b4,d#5] ~@3 [g#4,c#5] ~@3 [g#4,c#5,e5] ~, ~@5 e5 ~@2", // B C#5 C#m
  T: "~@2 [f#4,a4,c#5] ~@3 [f#4,a4,c#5] ~ [f#4,b4,d#5] ~@7", U: "~@4 [g#4,c#5,e5] ~@3",
})).s("gm_pizzicato_strings").gain(0.25)

// drums · kick
const kick = s("bd").struct("<~@10 A B@9 C D E D E D E D F B@9 G B@3 G B@9 H ~ I ~ I ~ I ~ J B@28 K L>".pickRestart({
  A: "~@2 x!2", B: "x!4", C: "x ~@7 x!7 ~", D: "~ x ~ x", E: "~@4 x ~@3 x!7 ~", F: "~ x!3", G: "x ~ x!2",
  H: "x ~@7 x!4 ~ x!2 ~", I: "~@8 x!4 ~ x!2 ~", J: "~@3 x ~@3 x!2 ~@3 x ~@3", K: "x!3 ~", L: "~ x",
})).gain(0.48)

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

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

// drums · tambourine
const tambourine = s("tb").struct("<~@10 A B@9 C D@7 E B@9 F B@3 F B@9 C D@7 E B@13 F B@14 G H>".pickRestart({
  A: "~@5 x ~ x", B: "~ x ~ x ~ x ~ x", C: "x ~@7 x!8", D: "x!16", E: "x!8 ~@2 x ~@3 x ~", F: "x ~@4 x ~ x",
  G: "~@2 x ~@3 x ~ x!8", H: "x!9 ~@7",
})).gain(0.48)

// drums · congas
const congas = s("conga:13").struct("<~@20 A ~@17 A ~@13 A ~@4 B@2 C D ~@13 E ~@16>".pickRestart({
  A: "~ x ~ x!2 ~@11", B: "~@6 x!2 ~@8", C: "~@6 x!2 ~@7 x", D: "~@5 x!3 ~@8", E: "~ x ~@2 x ~@11",
})).gain(1.79)

// drums · congas · soft notes
const congas_soft = s("conga:13").struct("<~@74 [~@3 x ~@12] ~@16>").gain(1.02)

// drums · congas
const congas_2 = s("conga:18").struct("<~@20 A ~@17 A ~@13 A ~@3 B C@2 D E ~@13 F ~@16>".pickRestart({
  A: "~@5 x ~@10", B: "~@9 x ~@5 x", C: "~ x ~@7 x ~@5 x", D: "~@9 x ~@6", E: "~ x ~@14", F: "~@3 x ~@4",
})).gain(1.79)

// drums · congas · soft notes
const congas_soft_2 = s("conga:18").struct("<~@56 [~@7 x]!3 ~@32>").gain(1.02)

// drums · congas
const congas_3 = s("conga:33").struct("<~@20 A ~@17 A ~@13 A ~@3 B C@2 D E ~@13 F ~@16>".pickRestart({
  A: "~@3 x ~@4", B: "~@3 x", C: "~ x ~ x", D: "~ x ~@2 x ~@7 x ~@3", E: "~@3 x!2 ~@11", F: "~@7 x ~@8",
})).gain(1.79)

// drums · congas · soft notes
const congas_soft_3 = s("conga:33").struct("<~@59 [~@7 x] ~@31>").gain(1.02)

stack(
  bass, whistle, whistle_soft, percussive_organ, string_ensemble_2, acoustic_guitar_nylon, brass_section,
  pizzicato_strings, kick, snare, hihat, tambourine, congas, congas_soft, congas_2, congas_soft_2, congas_3,
  congas_soft_3
)

More by Ace of Base