Strudelify

Abba-Esque (Take a Chance On Me)

Erasure

KeyA majorTempo122 bpm
0:00/0:00
// Abba-Esque (Take a Chance On Me) — Erasure
// 122 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 129 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(122/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 1 · "SYNTH BASS"
const bass = note(`<
  ~@3 A@3 B@3 C A D E D F B@3 A G B G H G I A J G K A@2 L M L@2 M G B N ~ O A@2 B@3 C A D E D F B@3 A G B G H G I A J G
  K A@2 L M L@2 M G B N ~ P@2 Q@13 R S A@3 B@3 C A@4 F B@3 A@5 B@3 C A@4 F B@3 A@2 T
>`.pickRestart({
  A: "d2 ~ d2!3 ~ d2!3 ~ d2!3 ~ d2!2", B: "a1 ~ a1!3 ~ a1!3 ~ a1!3 ~ a1!2", C: "a1 ~ a1!3 ~ a1!2 d2 ~ d2!3 ~ d2!2",
  D: "d2 ~ d2!7 ~ d2!3 ~ d2!2", E: "d2!5 ~ d2!3 ~ d2!3 ~ d2!2", F: "d2 ~ d2!3 ~ d2!2 a1 ~ a1!3 ~ a1!2",
  G: "e2 ~ e2!3 ~ e2!3 ~ e2!3 ~ e2!2", H: "a1 ~ a1!3 ~ a1!3 ~ a1!6", I: "e2!5 ~ e2!3 ~ e2!3 ~ e2!2",
  J: "d2 ~ d2!3 ~ d2!3 ~ d2!6", K: "e2 ~ e2!3 ~ e2!3 ~ e2!6", L: "b1 ~ b1!3 ~ b1!3 ~ b1!3 ~ b1!2",
  M: "g1 ~ g1!3 ~ g1!3 ~ g1!3 ~ g1!2", N: "e2 ~ e2!3 ~ e2!3 ~ e2!3 ~ a1@2", O: "~@2 d2!3 ~ d2!3 ~ d2!3 ~ d2!2",
  P: "d4 ~ d4!3 ~ d4!3 ~ d4!3 ~ d4!2", Q: "d3 ~ d3!3 ~ d3!3 ~ d3!3 ~ d3!2", R: "d3 ~ d3!3 ~ d3!3 ~ d3!6",
  S: "d3 ~ d3!3 ~ d3!3 ~@7", T: "d2@3 ~@13",
})).s("gm_synth_bass_1").gain(0.36)

// bass · electric guitar jazz · "JAZZ GTR"
const bass_2 = note(`<
  ~@11 A B C D E@2 F G H I J K L M N O P M Q R S T U V T W X Y@2 Z@3 AA AB AC AD AE AF B C D E@2 F G H I J K L M N O P M
  Q R S T U V T W X Y@2 ~@7 AG AH AI AH@3 AI AJ AI AK AI AL AM AN@2 AO AP B AQ AR AI AS AN@2 AT AU AV AI AL AM AN@2 AO
  AP B AQ AR AI AS AN@2 AT AU AV AW
>`.pickRestart({
  A: "~@8 d2@2 ~ d2 a1 ~ b1 ~", B: "d2@2 ~ d2 a1@2 b1 ~ d2@2 ~ d2 a1@2 b1@2",
  C: "d2@2 ~ d2 a1@2 b1 ~ d2@2 ~ d2 a1 ~ b1@2", D: "d2@2 ~ d2 a1@2 b1 ~ a1@2 ~ a1 e1@2 f#1 ~",
  E: "a1@2 ~ a1 e1 ~ f#1 ~ a1@2 ~ a1 e1 ~ f#1 ~", F: "a1@2 ~ a1 e1 ~ f#1 ~ a1 ~@2 a1 e1 ~ a1 ~",
  G: "d2@2 ~ d2 a1 ~ b1@2 d2@2 ~ d2 a1@2 d2@2", H: "e2 ~@2 e2 b1 ~ d2@2 e2@2 ~ e2 b1@2 e2@2",
  I: "a1@2 ~ a1 e1@2 f#1 ~ a1@2 ~ a1 e1@2 a1@2", J: "e2@2 ~ e2 b1 ~ d2@2 e2@2 ~ e2 b1@2 e2@2",
  K: "a1 ~@2 a1 e1@2 f#1@2 a1 ~@2 a1 e1@2 a1 ~", L: "e2 ~@2 e2 b1@2 d2@2 e2 ~@2 e2 b1 ~ d2@2",
  M: "e2 ~@2 e2 b1@2 d2@2 e2@2 ~ e2 b1@2 e2 ~", N: "d2 ~@2 d2 a1@2 b1@2 d2 ~@2 d2 a1 ~ b1@2",
  O: "d2 ~@2 d2 a1@2 b1@2 d2 ~@2 d2 a1@2 d2@2", P: "e2@2 ~ e2 b1@2 d2@2 e2@2 ~ e2 b1@2 d2@2",
  Q: "d2 ~@2 d2 a1@2 b1@2 d2@2 ~ d2 a1@2 b1@2", R: "d2@2 ~ d2 a1@2 b1@2 d2 ~@2 d2 a1@2 d2@2",
  S: "b1@2 ~ b1 f#1@2 a1 ~ b1@2 ~ b1 f#1@2 b1 ~", T: "g1@2 ~ g1 d1@2 e1@2 g1 ~@2 g1 d1@2 g1@2",
  U: "b1@2 ~ b1 f#1@2 a1 ~ b1 ~@2 b1 f#1@2 a1@2", V: "b1@2 ~ b1 f#1@2 a1@2 b1@2 ~ b1 f#1@2 b1@2",
  W: "e2@2 ~ e2 b1@2 d2@2 e2 ~@2 e2 b1@2 e2@2", X: "a1 ~@2 a1 e1@2 g1 ~ a1 ~@2 a1 e1@2 a1@2",
  Y: "[e2 ~@2 e2 b1@2 d2@2 e2@2 ~ e2 ~@2 a1@15 ~@3]/2", Z: "d2@2 ~ d2 a1@2 b1@2 d2@2 ~ d2 a1@2 b1@2",
  AA: "a1 ~@2 a1 e1@2 f#1@2 a1 ~@2 a1 e1 ~ f#1@2", AB: "a1 ~@2 a1 e1 ~ f#1@2 a1 ~@2 a1 e1 ~ f#1@2",
  AC: "a1@2 ~ a1 e1 ~ f#1 ~ a1 ~@2 a1 e1 ~ f#1 ~", AD: "a1 ~@2 a1 e1 ~ f#1 ~ d2@2 ~ d2 a1@2 b1@2",
  AE: "d2@2 ~ d2 a1@2 b1@2 d2@2 ~ d2 a1 ~ b1 ~", AF: "d2@2 ~ d2 a1@2 b1 ~ d2@2 ~ d2 a1 ~ b1 ~", AG: "~@11 a1@2 ~ b1 ~",
  AH: "d2@2 ~ a1@2 ~ b1@2 d2@2 ~ a1@2 ~ b1 ~", AI: "d2@2 ~ a1@2 ~ b1 ~ d2@2 ~ a1@2 ~ b1 ~",
  AJ: "d2@2 ~ a1@2 ~ b1@2 d2@3 a1@2 ~ b1 ~", AK: "d2@2 ~ a1@2 ~ b1@2 d2@2 ~@6",
  AL: "d2@2 ~ d2 a1@2 b1@2 d2@2 ~ a1@2 ~ b1 ~", AM: "d2@2 ~ a1@2 ~ b1 ~ d2@2 ~ a1@2 ~ d2@2",
  AN: "a1@2 ~ e1@2 ~ f#1 ~ a1@2 ~ e1@2 ~ f#1 ~", AO: "a1@2 ~ e1@2 ~ f#1 ~ a1@2 ~ e1@2 ~ a1 ~",
  AP: "a1@2 ~ e1@2 ~ a1 ~ d2@2 ~ d2 a1 ~ b1@2", AQ: "d2@2 ~ d2 a1@2 b1 ~ d2@2 ~ a1@2 ~ b1 ~",
  AR: "d2@2 ~ a1@2 ~ b1 ~ d2@2 ~ d2 a1@2 b1@2", AS: "d2@2 ~ a1@2 ~ d2@2 a1@2 ~ e1@2 ~ f#1 ~",
  AT: "a1@2 ~ e1@2 ~ a1 ~ a1@2 ~ e1@2 ~ a1 ~", AU: "d2@2 ~ d2 a1 ~ b1@2 d2@2 ~ d2 a1@2 b1 ~",
  AV: "d2@2 ~ d2 a1@2 b1@2 d2@2 ~ d2 a1@2 b1 ~", AW: "d2@3 ~@5",
})).s("gm_electric_guitar_jazz").gain(0.5)

// other · piano · "STRINGS"
const piano = note("<c#-1!2 ~@127>").s("gm_piano").gain(0.05)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@48 A@8 ~@33 B@5 C@8 A@8 ~ C@8 A@8 ~@2>".pickRestart({
  A: "[~ a5@15]/8", B: "[~@3 a5@14 ~@3]/5", C: "a5/8",
})).s("gm_string_ensemble_1").gain(0.3)

// chords · pad new age · "FANTASIA"
const pad_new_age = note("<~@19 A B A C@2 D@2 E@2 F@2 ~@3 G ~@22 A B A C@2 D@2 E@2 F@2 ~@3 G ~@58>".pickRestart({
  A: "[e5,e6] ~@15", B: "[a4,a5] ~@15", C: "[[a4,a5] ~@15 [e4,b4,e5]@2 ~@14, ~@15 [e3,b3,g4]@3 ~@14]/2",
  D: "[~@16 [d4,f#4,a4,d5]@3 ~@13, ~@15 [d3,a3]@3 ~@14]/2", E: "[~@16 [b3,e4,b4,e5]@3 ~@13, ~@15 [e3,g4]@4 ~@13]/2",
  F: "[~@16 [d4,f#4,a4,d5]@3 ~@13, ~@7 d3@2 ~@7, ~@15 a3@4 ~@13]/2", G: "~@9 f#5 d6 b6 ~@4, ~@4 b4 ~@3",
})).s("gm_pad_new_age").gain(0.24)

// other · pizzicato strings · "PIZZICATO"
const pizzicato_strings = note(`<
  ~@11 A B C D E F G H I J K L K@2 M@2 K@2 M N O P Q R S T U V W X Y@2 Z AA Z AB AC AD B C D E F G H I J K L K@2 M@2 K@2
  M N O P Q R S T U AE@2 AF AG AH@2 AI@2 AH AI@3 AH@3 AI@3 AH AJ AK AJ AL AM AN AO AP AQ AR AQ AS AT@2 AU AV AJ@2 AK AJ
  AL AM AN AO AP AQ AR AQ AS AT@2 AU AV AJ AW
>`.pickRestart({
  A: "~@8 d4@3 d5 ~@2 d5 ~", B: "~@2 d5 ~@2 d5 ~ d5 d4@2 ~ d5 ~@2 d5 ~", C: "~@2 d5 ~@2 d5 ~@2 d4@3 d5 ~@2 d5 ~",
  D: "~@2 d5 ~@2 d5 ~@2 a3@3 a4 ~@2 a4 ~", E: "~@2 a4 ~@2 a4 ~ a4 a3@3 a4 ~@2 a4 ~",
  F: "~@2 a4 ~@2 a4 ~@2 a3@3 a4 ~@2 a4 ~", G: "~@2 a4 ~@2 a4 ~ a4 ~@2 a4 ~@2 a4 ~ a4",
  H: "d4@3 d5 ~@2 d5 ~@3 d5 ~@2 d5 ~ d5", I: "e4@2 ~ e5 ~@2 e5 ~@3 e5 ~@2 e5 ~@2",
  J: "a4 ~@2 a4 ~@2 a4 ~@3 a4 ~@2 a4 ~@2", K: "e5 ~@2 e5 ~@2 e5 ~@3 e5 ~@2 e5 ~@2",
  L: "a4 ~@2 a4 ~@2 a4 ~@3 a4 ~@2 a4@3", M: "d5 ~@2 d5 ~@2 d5 ~@3 d5 ~@2 d5 ~@2",
  N: "d5 ~@2 d5 ~@2 d5 ~@3 d5 ~@2 d5 ~ d5", O: "b4 ~ b5 ~ b5 b4 ~ b5 ~@2 b4 b5 ~ b4 b5 ~",
  P: "g4 ~ g5 ~ g5 g4 ~ g5 ~ g5 g4 g5 ~ g4 g5 ~", Q: "b4 ~ b5 ~ b5 b4 b5!2 ~ b4 ~ b5 ~ b4 b5 ~",
  R: "b4 b5!2 ~ b4 b5 ~ b5 ~ b4 ~ b5 ~ b4 b5 ~", S: "g4 ~ g5 ~ g5 g4 ~ g5 ~@2 g4 g5 ~ g4 g5 g4",
  T: "e4 ~ e5 ~@2 e5 ~@2 e5 ~@5 b4 a4", U: "b4 c#5 b4 a4 b4 c#5 b4 a4 b4@2 a4@4 ~@2",
  V: "~@2 e5 ~@2 e5 ~@2 e5 ~@2 e5 ~@2 b5 a5", W: "b5 c#6 b5 a5 b5 c#6 b5 a5 b5@2 a5@4 ~@2",
  X: "~@3 d5 ~@2 d5 ~@3 d5 ~@2 d5 ~@2", Y: "d4@3 d5 ~@2 d5 ~@3 d5 ~@2 d5 ~@2", Z: "a3@3 a4 ~@2 a4 ~@3 a4 ~@2 a4 ~@2",
  AA: "a3@3 a4 ~@2 a4 ~@3 a4 ~@2 a4 ~ a4", AB: "~@2 a4 ~@2 a4 ~ a4 d4@3 d5 ~@2 d5 ~",
  AC: "~@2 d5 ~@2 d5 ~ d5 d4@3 d5 ~@2 d5 ~", AD: "~@2 d5 ~@3 d5 ~ d4@3 d5 ~@2 d5 ~",
  AE: "[~@2 e5 ~@2 e5 ~@2 e5 ~@2 e5 ~@2 a4@9 ~@9]/2", AF: "d3 ~ d3@2 ~@12", AG: "d3 ~ d3 ~@13", AH: "d3 ~@15",
  AI: "d3 ~@7", AJ: "d4@2 d5 ~@2 d5 ~@2 d5 ~@2 d5 ~@2 d5 ~", AK: "d4 ~ d5 ~@2 d5 ~@2 d5 ~@2 d5 ~@2 d5 ~",
  AL: "a3@2 a4 ~@2 a4 ~@2 a4 ~@2 a4 ~@2 a4!2", AM: "a3 ~ a4 ~@2 a4 ~@2 a4 ~@2 a4 ~@2 a4!2",
  AN: "a3 ~ a4 ~@2 a4 ~@2 a4 ~@2 a4 ~@2 a4 ~", AO: "~@2 a4 ~@2 a4 ~ a4 d4@2 d5 ~@2 d5 ~@2",
  AP: "d5 ~@2 d5 ~@2 d5!2 d4@2 d5 ~@2 d5 ~@2", AQ: "d5 ~@2 d5 ~@2 d5 ~ d4@2 d5 ~@2 d5 ~@2",
  AR: "d5 ~@2 d5 ~@2 d5 ~ d4 ~ d5 ~@2 d5 ~@2", AS: "d5 ~@2 d5 ~@2 d5 ~ a3@2 a4 ~@2 a4 ~@2",
  AT: "a4 ~@2 a4 ~@2 a4!2 a3 ~ a4 ~@2 a4 ~@2", AU: "a4 ~@2 a4 ~@2 a4 ~@3 a4 ~@2 a4 ~ a4",
  AV: "d4@2 d5 ~@2 d5 ~@2 d5 ~@2 d5 ~@2 d5!2", AW: "d4 ~@7",
})).s("gm_pizzicato_strings").gain(0.4)

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

// drums · rim
const rim = s("rim").struct("<~@93 [~@3 x] ~@35>").gain(0.5)

// drums · snare
const snare = s("sd").struct("<~@11 [~ x ~ x]!28 ~ [~ x ~ x]!36 ~ [~ x ~ x]!51 ~>").gain(0.5)

// drums · clap
const clap = s("cp").struct("<~@11 [~ x ~ x]!28 ~ [~ x ~ x]!36 ~ [~ x ~ x]!51 ~>").gain(0.5)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@11 A B@26 C ~ B@5 D B@29 C ~ B@16 E B@5 D B@2 F B@5 F B D B@5 D B@2 F B@5 F B D G
>`.pickRestart({
  A: "~@8 x!8", B: "x!16", C: "x!13 ~ x ~", D: "x!15 ~", E: "x!13 ~@3", F: "x!7 ~ x!8", G: "x",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct(`<
  ~@11 A ~@11 B ~@7 B ~@6 C ~ B ~@7 A ~@11 B ~@7 B ~@6 C ~ B ~ B ~@14 B ~@7 A ~@8 B ~@7 A ~@9
>`.pickRestart({
  A: "~ x", B: "x", C: "~@7 x",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct(`<
  ~@11 A B@7 C B@15 D B@2 E ~ B@16 C B@15 D B@2 F ~ B@11 G B@4 H B@4 I B@3 J B@4 K B@2 L B@4 I B@3 J B@4 K B@2 L ~
>`.pickRestart({
  A: "~@8 x!8", B: "x!16", C: "x!8 ~ x!7", D: "x!5 ~ x!10", E: "x!13 ~ x ~", F: "x!11 ~ x ~ x ~", G: "x!13 ~ x!2",
  H: "x!9 ~ x ~ x!4", I: "x!11 ~ x!4", J: "x!7 ~ x!8", K: "x!3 ~ x!12", L: "x!15 ~",
})).gain(0.1)

// drums · ht
const ht = s("ht").struct("<~@76 [~@2 x!3 ~@3 x ~@2 x ~@2 x ~] ~@52>").gain(0.4)

stack(
  bass, bass_2, piano, string_ensemble_1, pad_new_age, pizzicato_strings, kick, rim, snare, clap, hihat, crash, ride, ht
)

More by Erasure