Strudelify
The Sign cover art

1993 · The Sign

The Sign

Ace of Base

KeyG majorTempo98 bpm
0:00/0:00
// The Sign — Ace of Base
// 98 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 76 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(98/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 · synth bass 2 · "Bass"
const bass = note(`<
  ~@4 A@3 B A@2 C D ~ E F E F E F G H I J I J I J I J ~ K@3 L M F E F E F G H I J I J I J I J ~ K@3 N O K P Q R J@3 I J
  I J I J I J I J I ~@2
>`.pickRestart({
  A: "g1@2 ~ g1@2 ~ a#1@2 ~ a#1!3 c2@2 d2@2", B: "g1@2 ~ g1@2 ~ a#1@2 ~ a#1 ~@2 a1@2 g#1@2",
  C: "g1@3 g1@2 ~ a#1@2 ~ a#1!3 c2@2 d2@2", D: "g1@2 ~ g1@2 ~ a#1@2 ~ a#1@2 ~ a1@2 f1@2",
  E: "~@4 [g1,g2]!4 [e1,e2] ~ [e1,e2] ~@5", F: "~@4 [g1,g2]!4 [d1,d2] ~ [d1,d2] ~ [e1,e2] ~ [a1,a2] ~",
  G: "~@4 [g1,g2]!4 [a1,a2] ~ [a1,a2] ~@5", H: "~@4 [d1,d2]!5 ~ [d1,d2] ~ [e1,e2] ~ [a1,a2] ~",
  I: "~ [g1,g2] ~ [g1,g2] [g1,g2]@2 [a1,a2]@2 [e1,e2]@3 ~ [e1,e2]@4", J: "~@7 [f#1,f#2]",
  K: "g1@2 ~ g1@2 ~ a#1@2 ~ a#1@2 ~ c2@2 d2@2", L: "g1@2 ~ g1@3 g1@2 d#1@3 ~ d1@3 ~", M: "~@4 g1!4 e1 ~ e1 ~@5",
  N: "g1@2 ~ g1@2 ~ a#1@2 ~ a#1@2 ~ a1@2 g#1@2", O: "g1@3 g1@2 ~ a#1@2 ~ a#1@2 ~ c2@2 d2@2",
  P: "g1@2 ~ g1@2 ~ a#1@2 ~ a#1@3 c2@2 d2@2", Q: "g1@2 ~ g1@2 ~ a#1@2 ~ a#1@2 ~ a1 ~@3", R: "~@7 f#1",
})).s("gm_synth_bass_2").gain(0.4)

// other · ocarina
const ocarina = note("<~@3 A B@7 C D ~@17 B@3 E@2 ~@16 B@8 ~@17>".pickRestart({
  A: "~@14 d#5 ~", B: "g5@2 f5 ~ g5@2 f5 a#5@3 g5 ~ f5 g5 ~@2", C: "g5@2 ~ g5@2 ~ g5@2 d#6@4 d6@4", D: "c6@2 d6 ~",
  E: "[g5@2 ~ g5@2 ~ g5@2 d#6@4 d6@8 ~@12]/2",
})).s("gm_ocarina").gain(0.17)

// chords · string ensemble 2 · "Strings"
const string_ensemble_2 = note("<~@21 A@8 ~@13 A@8 ~@13 A@10 B@2 ~>".pickRestart({
  A: "[d5 ~ c5 [a4,d5,f#5], g5@3 ~, b4 ~, ~ e5@2 ~]/2", B: "[d5@2 ~@2 c5@2 [a4,d5,f#5] ~, g5@3 ~, b4 ~, ~ e5@2 ~]/2",
})).s("gm_string_ensemble_2").gain(0.07)

// chords · piano
const piano = note(`<
  ~@4 A@8 B C D C D C E F G H I H I H I H I B A@4 C D C D C D F G H I H I H I H I B A@7 J H I H I H I H I H I H I H I H
  K ~
>`.pickRestart({
  A: "~@2 [d4,g4,a#4] ~@3 [d4,g4,a#4] ~@3 [a#3,d#4,g4] ~@3 [c4,f4,a4] ~", B: "[c4,e4,g4] [a3,d4,f#4]",
  C: "~@2 [b3,d4,g4] ~@3 [b3,d4,g4] ~@3 [b3,e4,g4] ~@3 [b3,e4,g4] ~", // G Em
  D: "~@2 [a3,c4,g4] ~@3 [a3,c4,g4] ~@3 [a3,d4,f#4] ~@3 [a3,d4,f#4] ~", // Am7 D
  E: "~@2 [a3,c4,e4,g4] ~@3 [a3,c4,g4] ~@3 [a3,d4,f#4] ~@3 [a3,d4,f#4] ~", // Am7 D
  F: "~@2 [b3,d4,g4] ~@3 [b3,d4,g4] ~@3 [c4,e4,a4] ~@3 [c4,e4,a4] ~", // G Am
  G: "~@2 [a3,d4,f#4] ~@3 [a3,d4,f#4] ~@3 [a3,d4,f#4] ~@3 [a3,d4,f#4] ~", // D
  H: "~@2 [d4,g4,b4] ~@3 [d4,g4,b4] ~@3 [e4,g4,b4] ~@3 [e4,g4,b4] ~", // G Em
  I: "~@2 [e4,g4,c5] ~@3 [e4,g4,c5] ~@3 [a3,d4,f#4] ~@3 [a3,d4,f#4] ~", // C D
  J: "~@2 [d4,g4,a#4] ~@3 [d4,g4,a#4] ~@3 [a#3,d#4,g4] ~@5", K: "~@2 [e4,g4,c5] ~@3 [e4,g4,c5] ~@3 [a3,d4,f#4] ~@5",
})).s("gm_piano").gain(0.4)

// other · whistle
const whistle = note("<~@72 A@4>".pickRestart({
  A: "[~@8 d6@55 ~]/4",
})).s("gm_whistle").gain(0.09)

// drums · kick
const kick = s("bd").struct("<A B C B D@8 E D@16 E D@3 F D@16 E D@7 E G@3 H D@11 E ~>".pickRestart({
  A: "x ~ x!3 ~ x!2", B: "x!4", C: "x ~ x!3 ~ x ~", D: "x ~@2 x!2 ~ x ~ x ~@2 x!2 ~ x ~",
  E: "x ~@2 x!2 ~ x ~ x ~@2 x!2 ~@3", F: "x", G: "x!2", H: "x ~ x!6",
})).gain(0.72)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!33 ~ [~ x ~ x]!28 [~@4 x ~ x ~ x ~ x ~ x ~ x!2] [~ x ~ x]!12 ~>").gain(0.56)

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!33 ~ [~ x ~ x]!41 ~>").gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<[~@5 x ~@2]!33 ~ [~@5 x ~@2]!41 ~>").gain(0.32)

// drums · tambourine
const tambourine = s("tb").struct("<A@3 B A@8 B A@16 B A@3 ~ A@16 B A@7 B A@15 B ~>".pickRestart({
  A: "x!16", B: "x!13 ~@3",
})).gain(0.24)

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

// drums · bongos
const bongos = s("bongo:4").struct("<~@7 A ~@12 A ~@8 B ~ C A ~@8 A ~@8 B ~ C ~ D ~ C ~@5 E ~@7 D ~@5>".pickRestart({
  A: "~@14 x!2", B: "~@15 x", C: "~ x!2 ~ x ~@2 x ~@2 x ~ x ~ x!2", D: "~@7 x!2 ~ x ~ x!2 ~@2",
  E: "~@7 x!2 ~ x ~ x ~@2 x",
})).gain(0.84)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<A@12 B A@16 B A@3 ~ A@16 B A@7 B A@15 B ~>".pickRestart({
  A: "x!16", B: "x!13 ~@3",
})).gain(0.23)

// drums · shaker
const shaker = s("sh").struct("<[x!2 ~ x!2 ~@3]!33 ~ [x!2 ~ x!2 ~@3]!41 ~>").gain(0.4)

stack(
  bass, ocarina, string_ensemble_2, piano, whistle, kick, snare, clap, open_hat, tambourine, crash, bongos, woodblocks,
  shaker
)

More by Ace of Base