Strudelify
Beautiful Life cover art

1995 · The Bridge

Beautiful Life

Ace of Base

KeyC minorTempo135 bpm
0:00/0:00
// Beautiful Life — Ace of Base
// 135 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 9 "#Chs.Orga" drawbar organ (copy of ch 5 "SynVox" synth choir)
// note: Full arrangement: all 122 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(135/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.

// chords · piano · "A.Piano"
const piano = note(`<
  A B C D E F@2 ~@4 G H I J K H I J K L M N O L M N ~ H I J K H I J K H I J K L M N O L M N ~ H I J K H I J K H I J K H
  I J K ~@4 P Q R S H I J K H I J T U@2 V@2 W@2 X@2 ~@8 H I J K H I J K H I J K H I J K H I J K H I Y Z AA ~
>`.pickRestart({
  A: "[c4,eb4,g4]@8 [c4,eb4,g4]@2 ~ [c4,eb4,f4]@3 [c4,eb4,g4]@2, c3", // Cm F7 Cm
  B: "[c4,f4,ab4]@5 ~ [c4,f4] ab4 c5@2 ab4@2 f4@2 c4 ~, f3@15 ~", // Fm F5
  C: "[d4,f4,bb4]@8 [d4,f4,bb4]@3 [c4,f4,bb4]@3 [d4,f4,bb4]@2, bb2@15 ~", D: "[eb3,eb4,g4,bb4]@7 ~ [d3,d4,g4,b4]@8",
  E: "[c4,eb4,g4]@7 ~ [c4,eb4,g4]@3 [c4,eb4,f4]@3 [c4,eb4,g4]@2, c3", // Cm F7 Cm
  F: "[[c4,f4,ab4]@9 ~ g4@2 ab4@2 [bb2,bb3,d4,f4]@18, f3@13 ~@19]/2", G: "[eb3,g3,bb3]@3 ~ [d3,f3,bb3]@3 ~",
  H: "[c4,eb4,g4]@2 ~@2 [c4,eb4,g4]@3 ~ [c4,eb4,g4]@3 ~ [c4,eb4,g4] ~ [c4,f4,ab4]@2", // Cm Fm
  I: "~@2 [c4,f4,ab4]@2 ~@2 [c4,f4,ab4]@2 ~@2 [c4,f4,ab4]@3 ~ [c4,f4,ab4] ~", // Fm
  J: "[bb3,d4,f4]@3 ~ [bb3,d4,f4]@2 ~@2 [bb3,d4,f4]@3 ~ [bb3,d4,f4]@2 [bb3,eb4,g4]@2", // Bb Eb
  K: "~@2 [g3,bb3,eb4]@2 ~@2 [g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~ [g3,b3,d4]@2", // Eb G
  L: "[eb3,g3,c4]@3 ~ [eb3,g3,c4]@6 ~@2 [eb3,g3,c4] ~ [g3,c4,eb4]@2", // Cm
  M: "~@2 [g3,c4,eb4]@3 ~ [ab3,c4,eb4]@3 ~ [ab3,c4,eb4]@3 ~ [ab3,c4,eb4]@2", // Cm Ab
  N: "[f3,bb3,d4]@3 ~ [f3,bb3,d4]@7 ~ [f3,bb3,d4]@2 [g3,c4,d4]@2", // Bb Gsus4
  O: "~@2 [g3,c4,d4]@3 ~ [g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~ [g3,b3,d4]@2", // Gsus4 G
  P: "[eb4,g4,c5]@2 ~@2 [eb4,g4,c5]@2 ~@2 [eb4,g4,c5]@3 ~ [eb4,g4,c5] ~ [f4,ab4,c5]@2", // Cm Fm
  Q: "~@2 [f4,ab4,c5]@2 ~@2 [f4,ab4,c5]@2 ~@2 [f4,ab4,c5]@2 ~@2 [f4,ab4,c5] ~", // Fm
  R: "[d4,f4,bb4]@2 ~@2 [d4,f4,bb4]@2 ~@2 [d4,f4,bb4]@3 ~ [d4,f4,bb4] ~@3", S: "[d4,g4,c5]@7 ~ [d4,g4,b4]@7 ~",
  T: "~@2 [g3,bb3,eb4]@2 ~@2 [g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~ [bb3,d4,f4]@2", // Eb G Bb
  U: "[[c4,eb4,g4]@2 ~@2 [c4,eb4,g4]@2 ~@8 [c4,f4,ab4]@2 ~@2 [c4,f4,ab4]@2 ~@2 [b3,d4,g4]@2 ~@2 [b3,d4,g4]@2 ~@2 [b3,d4,g4] ~, [c2,c3]@3 [d2,d3]]/2", // Cm Fm G C D
  V: "[[g3,c4,eb4]@2 ~@2 [g3,c4,eb4]@2 ~@8 [c4,f4,ab4]@2 ~@2 [c4,f4,ab4]@2 ~@2 [b3,d4,g4]@2 ~@2 [b3,d4,g4]@3 ~ [b3,d4,g4] ~, [eb2,eb3]@3 [f2,f3]]/2", // Cm Fm G Eb F
  W: "[[c4,eb4,g4]@2 ~@2 [c4,eb4,g4]@2 ~@8 [c4,f4,ab4]@2 ~@2 [c4,f4,ab4]@2 ~@2 [b3,d4,g4]@2 [ab2,ab3]@2 ~ [g2,g3]@3 [b3,d4,g4] ~, [g2,g3]@12 ~ [b3,d4,g4] ~ [f2,f3]]/2", // Cm Fm G Ab G F
  X: "[[g3,c4,eb4]@2 ~@2 [g3,c4,eb4]@2 [c2,c3] ~@7 [ab4,c5,eb5]@2 ~@2 [ab4,c5,eb5]@2 ~@2 [g4,b4,d5]@2 ~@2 [g4,b4,d5]@2 ~@2 [g4,b4,d5]@2, g2 ~ [c2,c3]@6]/2", // Cm C Ab G C
  Y: "[bb3,d4,f4]@3 ~ [bb3,d4,f4]@3 ~ [bb3,d4,f4]@3 ~ [bb3,d4,f4]@2 [bb3,eb4,g4]@2", // Bb Eb
  Z: "[g1,g2,d4,g4,c5] [b0,b1,d4,g4,b4]", AA: "[c1,c2,c4,eb4,g4]",
})).s("gm_piano").gain(0.36).pan(0.4)

// bass · synth bass 1 · "Synth.Bas"
const bass = note(`<
  ~@10 A B C D E F C D E F G@2 H I G@2 H ~ C D E F C D E F C D E F G@2 H I G@2 H ~ C D E F C D E F C D E F C D E F ~@8 C
  D E F C D E F ~@16 C D E F C D E F C D E F C D E F C D E F C D E J K ~
>`.pickRestart({
  A: "~@2 [bb1,bb2] ~ [bb1,bb2] ~ [f1,f2] ~ [f1,f2] ~ [d1,d2] ~ [d1,d2] ~ [eb1,eb2] ~", // Bb F D Eb
  B: "[eb1,eb2] ~@3 [eb1,eb2] ~@3 [d1,d2] ~@3 [d1,d2] ~@3", // Eb D
  C: "[c1,c2] ~ [c2,c3] ~ [c2,c3] ~ [g1,g2] ~ [g1,g2] ~ [eb1,eb2] ~ [eb1,eb2] ~ [c1,c2] ~", // C G Eb C
  D: "[c1,c2] ~ [c1,c2] ~ [c1,c2] ~ [c1,c2] ~ [c1,c2] ~ [c1,c2] ~ [c1,c2] ~ [c1,c2] ~", // C
  E: "[bb0,bb1] ~ [bb1,bb2] ~ [bb1,bb2] ~ [f1,f2] ~ [f1,f2] ~ [d1,d2] ~ [d1,d2] ~ [eb1,eb2] ~", // Bb F D Eb
  F: "[eb1,eb2] ~@3 [eb1,eb2] ~ [g1,g2] ~ [g1,g2] ~ [g1,g2] ~ [g1,g2] ~ [g1,g2] ~", // Eb G
  G: "[c2,c3] ~ [c2,c3] ~ [c2,c3] ~ [c2,c3] ~ [c2,c3] ~ [c2,c3] ~ [c2,c3] ~ [c2,c3] ~", // C
  H: "[bb1,bb2] ~ [bb1,bb2] ~ [bb1,bb2] ~ [bb1,bb2] ~ [bb1,bb2] ~ [bb1,bb2] ~ [bb1,bb2] ~ [bb1,bb2] ~", // Bb
  I: "[g1,g2] ~ [g1,g2] ~ [g1,g2] ~ [g1,g2] ~ [g1,g2] ~ [g1,g2] ~ [g1,g2] ~ [g1,g2] ~", J: "[g1,g2,g3] [b0,b1,b2]",
  K: "[c1,c2,c3] ~@3", // C
})).s("gm_synth_bass_1").gain(0.4)

// other · synth strings 1 · "Syn.Strin"
const synth_strings_1 = note(`<
  A B C D A E@2 F ~@3 G H I J K H I J K L M N O L M N P H I J K H I J K Q I R S L M N O L M N P H I J K H I J K Q I R S
  Q I R S ~@8 H I J K H I J K A T U@2 V@4 ~@8 H I J K H I J K H I J K H I J K H I J K H I J W X ~
>`.pickRestart({
  A: "[eb4,g4,c5]", B: "[f4,ab4,c5]", C: "[d4,f4,bb4]", D: "[eb4,g4,bb4] [d4,g4,b4]",
  E: "[[f4,ab4,c5]@7 [d4,f4,bb4]@9]/2", F: "[g2,b3,d4,g4,b4]", G: "[g4,g5]@15 ~",
  H: "c5@2 eb5@2 c5@2 eb5@2 c5@2 eb5@2 c5 ~ c5@2", I: "~ c5 ~ c5 ~ c5 ~ c5", J: "d5 bb4 d5 bb4 d5 bb4 d5 eb5",
  K: "~ eb5 ~ d5 ~ d5 ~ d5", L: "[eb3,g3,c4,eb4,g4,c5]", M: "[f3,ab3,c4,f4,ab4,c5]", N: "[f3,bb3,d4,f4,bb4,d5]",
  O: "[c4,c5] [b3,b4], [g3,d4,g4,d5]", P: "[g3,c4,g4,c5]@3 [b3,b4]@5, [d4,d5]",
  Q: "g5@2 eb5@2 g5@2 eb5@2 g5@2 eb5@2 g5 ~ ab5@2", R: "f5 d5 f5 d5 f5 d5 f5 g5", S: "~ eb5 ~ d5 ~ d5 eb5 d5",
  T: "[f4,ab4,c5] [g4,b4,d5]", U: "[[g4,c5,eb5]@3 [ab4,c5,f5]]/2", V: "[[c5,eb5,g5]@63 ~]/4",
  W: "[d4,g4,c5] [d4,g4,b4]", X: "[c3,eb3,g3,c4]",
})).s("gm_synth_strings_1").gain(0.19)

// other · pad sweep · "#Converge"
const pad_sweep = note("<~@7 A ~@71 B@2 ~@41>".pickRestart({
  A: "[b3,b4]", B: "[~@7 [c4,c5]@14 ~@11]/2",
})).s("gm_pad_sweep").gain(0.48)

// other · lead 1 square · "Sq.Wave"
const lead_1_square = note(`<
  ~@8 A B C D E B C D E B C D ~@8 E B C D E B C D E B C D ~@8 E B C D E B C D E B C D E B C D ~@8 E B C D E B C D ~@8 E
  B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C ~@3
>`.pickRestart({
  A: "eb4!8 c4!7 ~", B: "d4!4 f4!4 c4!8", C: "d4!2 bb4!2 f4!2 d4 bb3 d4 bb3!2 f3 bb3!2 d4!2",
  D: "eb4!2 bb4!2 g4!2 eb4!2 bb3!2 g3!2 bb3!2 eb4!2", E: "eb4!8 c4!8",
})).s("gm_lead_1_square").gain(0.18)

// other · lead 2 sawtooth · "Saw Wave"
const lead_2_sawtooth = note(`<
  ~@12 A ~ B ~ A ~ B ~@9 A ~ B ~ C ~ B ~ A ~ B ~@9 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ D ~ A ~ D ~ A ~ B ~ A ~ B ~@17 A
  ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~@3
>`.pickRestart({
  A: "g5 eb5 g5 eb5 g5 eb5 g5 eb5", B: "f5 d5 f5 d5 f5 d5 f5 g5", C: "g5 eb5 g5 eb5 g5 eb5 g5 ~",
  D: "f5 d5 f5 d5 f5 d5 f5 eb5",
})).s("gm_lead_2_sawtooth").gain(0.2)

// drums · kick
const kick = s("bd").struct("<~@11 A@16 B A@19 B A@16 C ~@7 A@15 ~ A@7 C A@24 C ~>".pickRestart({
  A: "x!4", B: "x ~@6 x", C: "x",
})).gain(0.62)

// drums · clap
const clap = s("cp").struct("<~@12 A@15 ~ A@19 ~ A@16 ~@4 A@3 ~ A@15 ~@9 A@24 ~@2>".pickRestart({
  A: "~ x ~ x",
})).gain(0.44)

// drums · hihat
const hihat = s("hh").struct("<~@12 A@15 ~ A@19 ~ A@16 ~@8 A@8 B@7 ~ B@8 A@24 ~@2>".pickRestart({
  A: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2", B: "x!8",
})).gain(0.31)

// drums · open hat
const open_hat = s("oh").struct("<~@12 A@15 ~ A@36 ~@8 A@8 ~@16 A@24 ~@2>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(0.31)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~ B ~ C D@14 A D@19 C@2 D@15 A ~@7 C D@6 ~@16 A C D@3 C D@3 C D@3 C D@3 C D@3 C D C E A ~
>`.pickRestart({
  A: "x", B: "~@15 x", C: "x!2 ~ x ~ x ~ x", D: "~ x ~ x ~ x ~ x", E: "x!2 ~ x!3 ~ x",
})).gain(0.37)

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

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

// drums · shaker
const shaker = s("sh").struct("<~@12 A@15 ~ A@19 ~ A@16 ~@8 A@8 ~@16 A@24 ~@2>".pickRestart({
  A: "~ x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~",
})).gain(0.31)

stack(
  piano, bass, synth_strings_1, pad_sweep, lead_1_square, lead_2_sawtooth, kick, clap, hihat, open_hat, crash,
  tambourine, tambourine_soft, shaker
)

More by Ace of Base