Strudelify

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, A@4 for four bars: edit a riff to change every repeat.

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@3 A B C B C D E@2 F G F H I J I J K L ~ M ~ M ~ M ~ N F G F H I J I O K P Q R S N F G F H I J I O K T ~@7 U V W X Y
  V G F H Z AA AB J AB AC F AD F AE F AD AF AG F AH F AD F AI AJ AK
>`.pickRestart({
  A: "~@3 e3", B: "f#3", C: "g#3 c#3", D: "f#3@15 ~", E: "[g#3@18 ~@6 b2!2 c#3 ~@3 e3@2]/2",
  F: "f#3 ~ e3 ~ d#3 ~ c#3 ~ b2!3 ~@3 b2!2", G: "c#3 ~@7 b2!2 c#3 ~@3 e3@2", H: "c#3@2 ~@6 f#2 ~ f#2!2 ~ f#2 f#2@2",
  I: "e2 ~ e2 ~ e2@2 ~@2 d#2!2 ~ d#2 d#2@2 d#2@2", J: "c#2@3 ~@5 f#2 ~ f#2!2 ~ f#2 f#2@2",
  K: "e2@2 e2@2 e2 ~@3 d#2 ~ d#2!2 ~ d#2!2 ~", L: "g#2@3 ~@5 b2@2 c#3@4 e3@2", M: "~@4 b2 c#3@2 e3",
  N: "~@8 b2!2 c#3 ~@3 e3@2", O: "c#2@3 ~@5 f#2@2 f#2!2 ~ f#2 f#2@2", P: "g#2@3 ~@5 b2@2 c#3@2 ~@2 e2@2", Q: "f#2 ~@7",
  R: "~@4 b2 c#3 ~ e2", S: "f#2@3 ~@13", T: "g#2@3 ~@13", U: "~@8 b2 c#3!2 ~@3 e3@2",
  V: "f#3@2 e3@2 d#3@2 c#3@2 b2!3 ~@3 b2!2", W: "c#3@2 ~@6 b2 c#3 c#3@2 ~@2 e3@2",
  X: "f#3@2 e3 ~ d#3 ~ c#3 ~ b2!2 b2@2 ~@2 b2!2", Y: "c#3@2 ~@6 b2 c#3!2 ~@3 e3@2",
  Z: "e2 ~ e2@2 ~@4 d#2!2 ~ d#2 d#2@2 d#2@2", AA: "c#2@2 ~@6 f#2 ~ f#2 f#2@2 f#2 f#2@2",
  AB: "e2 ~ e2@2 ~@4 d#2 ~ d#2!2 ~ d#2 d#2@2", AC: "g#2@4 ~@4 b2!2 c#3 ~@3 e3!2", AD: "c#3@2 ~@6 b2!2 c#3@2 ~@2 e3!2",
  AE: "c#3@2 ~@6 b2 ~ c#3 ~@3 e3!2", AF: "f#3 ~ e3 ~ d#3 ~ c#3 ~ b2!2 b2@2 ~@2 b2!2",
  AG: "c#3@2 ~@6 b2 c#3 c#3@2 ~@2 e3!2", AH: "c#3 ~@7 b2!2 c#3 ~@3 e3!2", AI: "c#3 ~@7 b2!2 c#3@2 ~@2 e3!2",
  AJ: "f#3 ~ e3 ~ d#3 ~ c#3 ~ b2!2 b2@2 ~@4", AK: "~@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 ~ [g#5,c#6,e6]@16 f#6@8]/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: "[~@8 d#6@15 ~@9]/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 B D ~@13 A B C B D ~@5 A B E B A B C B D ~@13 A B F B G H F B I ~@5 J B A B A B A B A B A B A B A K L
>`.pickRestart({
  A: "~@4 b3 c#4 ~ e3", B: "f#3 ~@7", C: "~@2 c#5 ~ c#4 c#5 ~ c#4 b3@2 [a#3,c#4] ~@3 e3@2",
  D: "~@2 c#5 ~ c#4 c#5 ~ c#4 ~@8", E: "~@2 c#4 ~@2 c#5 c#4 ~ b3@2 c#4@2 ~@2 e3@2",
  F: "~@2 c#4 c#5 ~ c#4 c#5 ~ b3@2 c#4 ~@3 e3@2", G: "~@2 c#4 c#5 ~ c#4 c#5 ~ b3@2 c#4@2 ~@2 e3@2", H: "f#3@3 ~@13",
  I: "~@2 c#4 c#5 ~ c#4 c#5 ~@9", J: "~@8 b3@2 c#4 ~@3 e3@2", K: "f#3 ~@3 b3 ~@3", L: "~@6 [b2,b3]!2 [c#3,c#4]@2 ~@6",
})).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 E@2 F G I ~@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: "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 E F G F H K ~@3 A 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 L F G F M I B J B J B J B N B J B J B J O P
>`.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] ~", K: "[g#4,c5,d#5] ~@7",
  L: "~@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#
  M: "~@2 [g#4,b4,e5] ~@3 [g#4,b4,e5] ~@3 [g4,a#4,d#5] ~@3 [g4,a#4,d#5] ~", // E D#
  N: "~@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
  O: "~@2 [f#4,a4,c#5] ~@3 [f#4,a4,c#5] ~ [f#4,b4,d#5] ~@7", P: "~@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