Strudelify
That's Me cover art

Arrival

That's Me

ABBA

KeyG majorTempo129 bpm
0:00/0:00
// That's Me — ABBA
// 129 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 106 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(129/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
const piano = note(`<
  A B@2 C A B@2 D E@2 F G H I J K L@2 M N O P Q R S T U V@2 D W@2 X@2 H I J K L@2 M N O P Q R S T Y Z AA AB AC@2 AD AE
  AF AG AH AI AJ@2 X@2 H I J K L@2 AK N S AL@3 S AM@2 AN AO AP AQ AR AS AT L@2 AK N O AU AV R S T AW AN AO AP AQ AR AS
  AT AX@2
>`.pickRestart({
  A: "[f#4,a#4]@2 c#4 [f#4,a#4]@2 c#4 [f#4,a#4]@2 [d#4,f#4,b4]@2 ~@4 f#2@2, ~@4 f#2@3 ~, ~@5 [d#4,f#4,b4]@3", // F# B
  B: "[[f#4,a#4]@2 c#4 [f#4,a#4]@2 c#4 ~@10 [f#4,a#4]@2 c#4 [f#4,a#4]@2 c#4 [f#4,a#4]@2 [d#4,f#4,b4]@2 ~@4 f#2@2, f#2@4 ~@3 f#2@5 f#2@3 ~, ~@3 [d#4,f#4,b4]@5 ~@5 [d#4,f#4,b4]@3]/2", // F# B
  C: "[f#4,a#4]@2 c#4 [f#4,a#4]@2 c#4 [d#4,f#4,b4]@10, f#2 ~", // F# B
  D: "[f#4,a#4]@2 c#4 [f#4,a#4]@2 c#4 [f#4,a#4]@2 [f#2,c#3,a#3]@4 [c#3,g#3,b3]@4, f#2 ~", // F# C#7
  E: "[[c#4,f#4,a#4]@2 ~ [f#4,a#4]@2 ~ [f#2,f#4,a#4]@2 [d#4,f#4,b4]@2 ~@4 [c#2,f#2]@2 [f#4,a#4]@2 ~@3 c#4 [f#2,f#4,a#4]@2 a#3@2 a#3@2 g#3@4, a#3@4 a#3 [g#3,b3] ~@2, f#2@3 ~ f#2@3 ~ f#2@3 ~ f#2@4, ~@2 c#4@3 c#4@13 c#4@2 ~@12, ~@10 [d#4,f#4,b4]@6 ~@3 [f#4,a#4]@2 ~@11]/2", // F# B F#5 F# G#m B F#
  F: "[d#4,g4,b4]@2 c#4 [d#4,g4,b4]@2 c#4 [d#2,d#4,g4,b4]@2 [b3,d#4,g4]@2 ~@4 d#2@2, g2@3 ~ g2@3 ~, ~@5 [b3,d#4,g4]@3", // D#aug Baug
  G: "[d#4,g4,b4]@2 c#4 [d#4,g4,b4]@2 c#4 [d#2,d#4,g4,b4]@2 d#4@2 d#4@2 d#4@2 d#4@2, g2@3 ~ [g3,b3]@4, ~@2 g2!2", // D#aug G
  H: "e4@3 d#4 d#2@3 d#2, [d#2,g3,a#3] [g3,a#3,d#4]", // D#
  I: "e4@3 d#4 [d#2,d#4]@2 c#4 b3, [d#2,g3,a#3,c#4] [g3,a#3], ~@3 d#2", // D# D#7 Gm
  J: "c#4 b3@2 g#2 g#2@4, [g#2,g#3]@3 [g#3,b3,d#4]@5", K: "g#2@3 g#2 [b3,d#4,f#4]@2 [b3,d#4,f#4]@2, ~ g#2",
  L: "[f#4@3 f4 c#3@3 g#2 c#3@3 c#3 f#4@2 f4@2, [c#3,g#3,c#4]@2 [g#3,c#4,f4]@3 ~ [c#3,g#3,c#4]@2]/2", // C#5 C# C#5
  M: "[b2,d#4]@3 ~ [b2,f4] f4@2 f#4, b3@4 ~ [b2,c#4]@3", // B Bdim Bsus2
  N: "[b2,f#4]@3 [f#2,g#4] [b2,b3,d#4,g#4]@2 [f#2,b2,b3,d#4]@2, d#4 ~", // B5 F#sus2 G#m B
  O: "a#4@2 ~ c3 ~ [d#4,f#4] [g#3,d#4]@2, d#4 ~, c3@3 ~ c3@4, ~ g#4 ~@2", // D#m G#5
  P: "f4 d#4 c#4@4 c#3@2 b4@2 b4@2 b4@2 b4@2, [c#3,g#3]@3 ~ [c#3,f4]@4", // C#5 C#
  Q: "b4@2 ~ d3 ~@3 d3, f4@3 [a#3,f4], d3@3 ~ d3@3 ~, ~ a#4@2 ~", // A#5
  R: "[d#4,f#4]@2 d#4 d#3 d#3@2 [d#3,g3,a#3,d#4]@2, [d#3,a#3]@3 [d#4,g4,a#4]@3 ~@2", // D#m D# D#5 D#
  S: "b4!8, [g#2,b3,g#4] [a#2,c#4,g#4] [b2,d#4,g#4] [c3,e4,g#4]", // G#m A#m7 G#m Caug
  T: "[c#3,f4,g#4,b4]@2 [c#3,g#3,b3,f4]@2 ~@2 [a#3,c#4,f#4]!2", // C#7 F#
  U: "[f#4,a#4]@2 c#4 [f#4,a#4]@2 c#4 [f#4,a#4]@2 [d#4,f#4,b4]@2 ~@4 f#2@2, f#2@4 f#2@3 ~, ~@5 [d#4,f#4,b4]@3", // F# B
  V: "[[f#4,a#4]@2 c#4 [f#4,a#4]@2 c#4 ~@2 b2@2 c#3@2 d#3@2 ~@2 [f#4,a#4]@2 c#4 [f#4,a#4]@2 c#4 [f#4,a#4]@2 [d#4,f#4,b4]@2 ~@4 f#2@2, f#2@4 ~@3 f#2@5 f#2@3 ~, ~@3 [d#4,f#4,b4]@5 ~@5 [d#4,f#4,b4]@3]/2", // F# B
  W: "[[c#4,f#4,a#4]@2 ~ [f#4,a#4]@2 ~ [f#2,f#4,a#4]@2 [d#4,f#4,b4]@2 ~@4 c#2@2 [f#4,a#4]@2 ~@3 c#4 [f#2,f#4,a#4]@2 a#3@2 a#3@2 g#3@4, a#3@4 a#3 [g#3,b3] ~@2, f#2@3 ~ f#2@3 ~ f#2@3 ~ f#2@4, ~@2 c#4@3 c#4@13 c#4@2 ~@12, ~@10 [d#4,f#4,b4]@6 ~@3 [f#4,a#4]@2 ~@11]/2", // F# B F# G#m B F#
  X: "[[d#4,g4,b4]@2 c#4 [d#4,g4,b4]@2 c#4 [d#2,d#4,g4,b4]@2 [b3,d#4,g4]@2 ~@4 d#2@2 [d#4,g4,b4]@2 c#4 [d#4,g4,b4]@2 c#4 [d#2,d#4,g4,b4]@2 d#4@2 d#4@2 d#4@2 d#4@2, [d#3,g3]@5 ~ [g3,b3]@2, b3@4 ~ b3@5 ~@6, g2@3 ~ g2@3 ~ g2@3 ~ g2@2 g2@2, ~@5 [d#4,g4]@3 ~@8]/2", // D#aug Baug D#aug D# G D#
  Y: "[f#4,a#4]@2 c#4 [f#4,a#4]@2 c#4 [f#4,a#4]@2 [d#4,f#4,b4]@4 ~@2 f#2@2, f#2@4 f#2@3 ~, ~@3 [d#4,f#4,b4]", // F# B
  Z: "[f#4,a#4] c#4 [f#2,d#4,f#4,b4] [c#4,f#4,a#4]@2 g#4@2 f#4, f#2@2 ~ f#2@5", // F# B F#
  AA: "f4!3 a#2 ~ [d4,f4]@2 [f4,g#4], [a#2,d4]@3 [d4,f4]@2 ~@3, ~ a#2", // Dm Fm A# Dm
  AB: "[f4,g#4]@2 [f4,g#4] a#2 ~@2 [d4,f4]@2, a#2@3 [d#4,f#4]@3 ~@2, ~ a#2", // Fm Dm D#m
  AC: "[d#4@3 f4 f4@2 f#4 a#2 d#3@3 d#3 d#3@3 d#3, [f#2,d#3]@4 [d#3,g#3]@3 [a#3,f#4]@3 ~@6]/2", // D#m G#5 D#m
  AD: "d#4@3 f4 [g#2,f4]@3 [d#2,f#4], [g#2,c4] c#4", AE: "[c4,d#4,f#4]!2 [g#2,g#3,c4,f4] [f#2,g#2,c4,d#4], g#2 ~",
  AF: "[g#2,d#4] a#2 b2 c#3@5, [g#3,b3]@3 ~, ~ c#4@5 ~@2", AG: "g#2 a#2 b2 ~ [d#4,f#4] [c#4,f4] ~@2, ~@3 c#3@5",
  AH: "[g#2,d#4,f#4] a#2 b2 c#3@5, ~ [c#4,f4]@5 ~@2", AI: "g#2 a#2 b2 ~ [f#2,a#3]@2 [c#3,g#3,b3]@2, ~@3 c#3@3 ~@2",
  AJ: "[[c#4,f#4,a#4]@2 ~ [f#4,a#4]@2 ~ [f#2,f#4,a#4]@2 [d#4,f#4,b4]@2 ~@4 c#2@2 [f#4,a#4]@2 ~@3 c#4 [f#2,f#4,a#4]@2 a#3@2 a#3@2 g#3@4, a#3@5 [g#3,b3] ~@2, f#2@3 ~ f#2@3 ~ f#2@3 ~ f#2@4, ~@2 c#4@3 c#4@13 c#4@2 ~@12, ~@10 [d#4,f#4,b4]@6 ~@3 [f#4,a#4]@2 ~@11]/2", // F# B F# G#m B F#
  AK: "[b2,d#4]@3 [b2,f4] f4@3 f#4, b3 [b2,c#4]", // B Bdim Bsus2
  AL: "[[c#3,f4,g#4,b4]@2 [c#3,g#3,b3,f4]@2 ~@2 [a#3,c#4,f#4] ~ f#2@3 f#2 ~ f4 f#4 ~ d#2@3 d#2 d#2@4, ~@7 [a#3,c#4,f#4]@3 ~@2 f#2@4 ~@8, ~@15 [a#3,c#4,g4]@5 ~@4]/3", // C#7 F# Gdim
  AM: "[[c#3,f4,g#4,b4]@2 [c#3,g#3,b3,f4]@2 ~@2 [a#3,c#4,f#4] ~ f#2@3 f#2 f#2@3 f#2, ~@7 [a#3,c#4]@9, ~@7 f#4@3 ~@6]/2", // C#7 F# A#m
  AN: "f#2@3 f#2 f#2@3 f#2, [a#3,c#4]", AO: "d#2@3 d#2 ~@3 d#2, [g3,b3,d#4]@3 [d#3,g3], ~@4 d#2@3 ~",
  AP: "d#2@3 d#2 d#2@3 d#2, [g3,b3,d#4]", AQ: "d#2@3 d#2 d#2@3 d#2, [g3,a#3,c#4,e4] [g3,a#3,c#4,d#4]",
  AR: "d#2@3 d#2 d#2@3 d#2, [c#4,g4,b4] [c#4,g4,a#4]", // C#m7b5 Gdim
  AS: "g#2@3 g#2 [b3,d#4,b4]@2 ~ g#2, ~@4 g#2@3 ~, ~@3 [b3,d#4,a#4]", // B Bmaj7
  AT: "g#2@3 g#2 [g#2,b3,d#4,f#4]@2 [g#2,b3,d#4,f#4]@2, [b3,d#4] ~", // G#m7 B
  AU: "f4 d#4 c#4@4 c#3@2 b4@2 b4@2 b4@2 b4@2, g#3 ~, c#3@3 ~ [c#3,f4]@4", // C#
  AV: "~@3 d3 a#4@2 ~ d3, f4@3 [a#3,f4], d3@3 ~ d3@3 ~, ~ b4 ~@2", AW: "f#2@3 f#2 f#2@3 f#2",
  AX: "[f#4@3 f4 c#3@3 g#2 ~@8, [c#3,g#3,c#4]@2 [g#3,c#4,f4]@3 ~@3]/2", // C#5 C#
})).s("gm_piano").gain(0.29).pan(1)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@7 A B C D E F G H@2 I J K L M J N O P Q R S@2 T B C D E F G H@2 I J K L M J N O P Q R U V@2 W X Y Z AA@3 AB B C D E
  F G H@2 I J AC L P Q C AD P Q AE@2 AF@4 AG AH I J AC L M J N O P Q AE@2 AF@4 AG AH I ~
>`.pickRestart({
  A: "~@2 c#3!2", B: "f#2@3 f#2 f#2@3 c#2", C: "f#2@3 f#2 f#2@4", D: "g2@3 d#2 g2@3 d#2", E: "g2@3 d#2 g2@2 g2@2",
  F: "d#2@4 d#2@3 d#2", G: "d#2@2 d#2!2", H: "g#2@3 g#2 g#2@4", I: "c#3@4 c#3@3 g#2", J: "c#3@3 c#3 c#3@4",
  K: "~ b2@3 b2 b2@3", L: "b2@3 f#2 b2@2 b2@2", M: "c3@3 c3 c3@4", N: "d3@3 d3 d3@3 d3", O: "d#3@3 d#3 d#3@2 d#3@2",
  P: "g#2 a#2 b2 c3", Q: "c#3!2 ~@2", R: "f#3@4 f#3@3 f#3", S: "[f#3@4 b2 c#3 d#3 f#3@5 f#3@3 f#3]/2", T: "f#3@2 c#3!2",
  U: "f#3@2 f#3 f#3@5", V: "a#2@3 a#2 a#2@4", W: "d#3@4 d#3@3 a#2", X: "d#3@3 d#3 d#3@3 d#3", Y: "g#2@4 g#2@3 d#2",
  Z: "g#2@2 g#2!2", AA: "g#2 a#2 b2 c#3@5", AB: "g#2 a#2 b2 c#3@3 c#3@2", AC: "b2@3 b2 b2@4", AD: "d#2@3 d#2 d#2@4",
  AE: "f#2@3 f#2 f#2@3 f#2", AF: "d#2@3 d#2 d#2@3 d#2", AG: "g#2@3 g#2 g#2@3 g#2", AH: "g#2@3 g#2 g#2@2 g#2@2",
})).s("gm_electric_bass_finger").gain(0.29).pan(0)

// chords · banjo
const banjo = note(`<
  A ~@6 B C@2 D@2 E F G H I@2 J K L M N O P Q R S R T C@2 D@2 E F G H I@2 J K L M N O P Q U V W X Y@2 Z AA AB AC AD B
  AE@2 D@2 E F G H I@2 AF K P AG@3 P AH@2 AI AJ AK AL AM AN AO I@2 AF K L AP AQ O P Q ~ AI AJ AK AL AM AN AO AR@2
>`.pickRestart({
  A: "[f#4,a#4] ~@7", B: "~@2 [f#3,a#3] [g#3,b3]",
  C: "[[c#4,f#4,a#4]@2 ~ [f#4,a#4]@2 ~ [f#4,a#4]@2 [d#4,f#4,b4]@2 [d#4,f#4,b4]@6 [f#4,a#4]@2 ~@3 c#4 [f#4,a#4]@2 a#3@2 a#3@2 g#3@4, a#3@16 a#3@3 [f#4,a#4]@2 ~@11, ~@2 c#4@3 c#4@13 c#4@2 [g#3,b3]@4 f#3@4 ~@4]/2", // F# B F# G#m
  D: "[[d#4,g4,b4]@2 c#4 [d#4,g4,b4]@2 c#4 [d#4,g4,b4]@2 [b3,d#4,g4]@2 [d#4,g4]@6 [d#4,g4,b4]@2 c#4 [d#4,g4,b4]@2 c#4 [d#4,g4,b4]@2 d#4@2 d#4@2 d#4@2 d#4@2, [d#3,g3]@5 ~ [g3,b3]@2, b3@4 ~ b3@5 ~@6]/2", // D#aug Baug D# D#aug D# G
  E: "e4@3 d#4 [g3,a#3,d#4]@4, [g3,a#3] ~", F: "e4@3 d#4 d#4@2 c#4 b3, [g3,a#3,c#4] [g3,a#3]",
  G: "c#4 b3@2 [g#3,b3,d#4]@5, g#3@3 ~@5", H: "~@2 [b3,d#4,f#4]!2",
  I: "[f#4@3 f4 [g#3,c#4,f4]@6 ~@2 f#4@2 f4@2, [g#3,c#4] ~@2 [g#3,c#4]]/2", J: "~ d#4@3 f4 f4@2 f#4, ~ b3@4 c#4@3",
  K: "f#4@3 g#4 [b3,d#4,g#4]@2 [f#3,b3,d#4]@2, d#4 ~", L: "a#4@2 g#4@2 ~ [d#4,f#4] [g#3,d#4]@2, d#4 ~",
  M: "f4 d#4 c#4@4 ~@2 b4@2 b4@2 b4@2 b4@2, g#3@3 ~ f4@4", N: "b4 a#4@2 [a#3,f4], f4@3 ~",
  O: "[d#4,f#4]@2 d#4 [d#4,g4,a#4]@3 [g3,a#3,d#4]@2, a#3@3 ~@5", P: "b4!8, [b3,g#4] [c#4,g#4] [d#4,g#4] [e4,g#4]",
  Q: "[f4,g#4,b4]@2 [g#3,b3,f4]@2 ~@2 [a#3,c#4,f#4]!2", // Fdim F#
  R: "[f#4,a#4]@2 c#4 [f#4,a#4]@2 c#4 [f#4,a#4]@2 [d#4,f#4,b4]@2 [d#4,f#4,b4]@6", // F# B
  S: "[f#4,a#4]@2 c#4 [f#4,a#4]@2 c#4 [d#4,f#4,b4]@10", // F# B
  T: "[f#4,a#4]@2 c#4 [f#4,a#4]@2 c#4 [f#4,a#4]@2 [f#3,a#3]@4 [g#3,b3]@4", // F# G#m
  U: "[f#4,a#4]@2 c#4 [f#4,a#4]@2 c#4 [f#4,a#4]@2 [d#4,f#4,b4]@4 [d#4,f#4,b4]@4", // F# B
  V: "[f#4,a#4] c#4 [d#4,f#4,b4] [c#4,f#4,a#4]@2 g#4@2 f#4", W: "f4!3 [d4,f4]@2 [d4,f4]@2 [f4,g#4], d4@3 ~@5",
  X: "[f4,g#4]@2 [f4,g#4] [d#4,f#4]@3 [d4,f4]@2", Y: "[d#4@3 f4 f4@2 f#4 [a#3,f#4]@3 ~@6, f#3@4 g#3@3 ~@9]/2",
  Z: "d#4@3 f4 f4@3 f#4, c4 c#4", AA: "[c4,d#4,f#4]!2 [g#3,c4,f4] [f#3,c4,d#4]", AB: "d#4 c#4@5 ~@2, [g#3,b3]@3 ~",
  AC: "~@4 [d#4,f#4] [c#4,f4] ~@2", AD: "[d#4,f#4] [c#4,f4]@5 ~@2",
  AE: "[[c#4,f#4,a#4]@2 ~ [f#4,a#4]@2 ~ [f#4,a#4]@2 [d#4,f#4,b4]@2 [d#4,f#4,b4]@6 [f#4,a#4]@2 ~@3 c#4 [f#4,a#4]@2 a#3@2 a#3@2 g#3@4, a#3@16 a#3@3 [f#4,a#4]@2 ~@11, ~@2 c#4@3 c#4@13 c#4@2 [g#3,b3]@4 f#3@8]/2", // F# B F# G#m
  AF: "d#4@3 f4 f4@3 f#4, b3 c#4",
  AG: "[[f4,g#4,b4]@2 [g#3,b3,f4]@2 ~@2 [a#3,c#4,f#4] [a#3,c#4,f#4]@3 ~@3 f4 f#4 [a#3,c#4,g4]@5 ~@4]/3", // Fdim F# Gdim
  AH: "[[f4,g#4,b4]@2 [g#3,b3,f4]@2 ~@2 [a#3,c#4,f#4] [a#3,c#4]@9, ~@7 f#4@3 ~@6]/2", AI: "[f#3,a#3,c#4]",
  AJ: "[g3,b3,d#4]@3 [d#3,g3]", AK: "[g3,b3,d#4]", AL: "[g3,a#3,c#4,e4] [g3,a#3,c#4,d#4]",
  AM: "[c#4,g4,b4] [c#4,g4,a#4]", AN: "~@2 [b3,d#4,b4] [b3,d#4,a#4]", AO: "[b3,d#4]@2 [b3,d#4,f#4]!2",
  AP: "f4 d#4 c#4@4 ~@2 b4@2 b4@2 b4@2 b4@2, g#3 f4", AQ: "~ b4 a#4 [a#3,f4], f4@3 ~",
  AR: "[f#4@3 f4 [g#3,c#4,f4]@6 ~@6, [g#3,c#4] ~@3]/2", // C# C#5
})).s("gm_banjo").gain(0.08).pan(0)

// other · electric guitar clean · "Guitar"
const electric_guitar_clean = note("<~@24 A B ~@20 A B ~@8 C@3 D ~@12 A B ~@2 A B ~@16 A B ~@10>".pickRestart({
  A: "g#2 a#2 b2 c3", B: "c#3!2 ~@2", C: "g#2 a#2 b2 c#3@5", D: "g#2 a#2 b2 c#3@3 ~@2",
})).s("gm_electric_guitar_clean").gain(0.18).pan(0)

// drums · kick
const kick = s("bd").struct("<~@4 A@21 B A@21 B A@25 B A@3 B A@17 B A@9 ~>".pickRestart({
  A: "x!4", B: "x",
})).gain(0.19).pan(0)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@4 A@3 B A@17 C A@21 C A@25 C A@3 C A@17 C A@9 ~>".pickRestart({
  A: "x!4", B: "x!2 ~@2", C: "x",
})).gain(0.12).pan(0)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@3 A B@19 C A ~ B@3 C B@7 C B@7 C@2 D B C B@3 C B@4 C@2 B@7 C B@3 C@2 D B@3 D B@3 C B C B C B@7 C@2 D B@3 C B C B@3 ~
>`.pickRestart({
  A: "~@8 x ~ x!3 ~ x ~", B: "x!2", C: "x ~@7 x ~ x!3 ~ x ~", D: "x",
})).gain(0.15).pan(0)

// drums · open hat
const open_hat = s("oh").struct("<~@4 A@3 B A@17 ~ A@21 ~ A@25 ~ A@3 ~ A@17 ~ A@9 ~>".pickRestart({
  A: "~@5 x ~@2", B: "~@4 x!3 ~",
})).gain(0.12).pan(0)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@8 A@17 B ~@4 A@17 B ~@12 A@13 B A@3 B A@17 B A@9 ~>".pickRestart({
  A: "x!8", B: "x",
})).gain(0.62).pan(0)

// drums · guiro
const guiro = s("guiro:4").struct("<~@25 A ~@21 A ~@25 A ~@3 A ~@17 A ~@10>".pickRestart({
  A: "~ x ~@2",
})).gain(4.11).pan(0)

stack(piano, bass, banjo, electric_guitar_clean, kick, pedal_hat, mid_tom, open_hat, cabasa, guiro)

More by ABBA