Strudelify
I'm a Marionette cover art

The Album

I'm a Marionette

ABBA

KeyG majorTempo148 bpm
0:00/0:00
// I'm a Marionette — ABBA
// 148 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 2/4 at bar 37, 4/4 at bar 37, 2/4 at bar 43, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: ch 6 "Orchestra" named as a string part, played on string ensemble 1 (its brass section patch is not one)
// note: Full arrangement: all 150 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(148/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 · "Treble Clef"
const piano = note(`<
  ~@17 A@4 B@3 C@2 D@2 E@2 F G H I G H J@2 K L@2 K M@2 N@2 C@2 D@2 B@3 O P O P O P O P O P O P O P O P O P O P O P O P O
  P O P O P O P O P O P C@2 D@2 E@2 F G H I G H J@2 K L@2 K M@2 N@2 C@2 D@2 E@2 F G H I G H J@2 K L@2 K M@2 Q@8 R@3 S@8
>`.pickRestart({
  A: "[e4@2 b4 f#4@5 ~@2 e4 f#4 g4 a4 g4 f#4, [g3,b3]]/2", // G
  B: "[e4@2 g4 f#4@3 [f#3,e4]@2 g4 f#4@3 e4@2 g4 ~ g3@2 [g3,b3,f#4]@6, [g3,c4] a3 b3 ~, ~@2 f#3 g3 ~@2, ~@5 f#4 ~@2]/3", // F#7 Gmaj7 C5
  C: "[e4@2 b4 ~ g3@3 ~@3 e4 f#4 g4 a4 g4 f#4, b3@7 ~@9, g3@4 ~@3 [g3,b3]@9, ~@3 f#4@5 ~@8]/2", // G
  D: "[e4@2 b4 ~ g3 [g3,b3]@2 ~@3 e4 f#4 g4 a4 g4 f#4, b3@5 ~@11, g3@4 ~@3 [g3,b3]@9, ~@3 f#4@5 ~@8]/2", // G
  E: "[e4@2 g4 f#4@3 [f#3,e4]@2 f#3@4 g4 f#4@3, [g3,c4]@3 a3@3 ~@2]/2", F: "g3 [g3,b3,f#4]@3",
  G: "c4 f#4!3 f#4@2 c4 f#4", H: "f#4!2 f#4@2 g4@2 a4@2", I: "f#4", J: "[b4 a4 g4 f#4@9 a#3 e4!3]/2",
  K: "e4@2 a#3 e4!3 e4@2", L: "[f4@2 g4@2 e4@8 a#3 e4!3]/2", M: "[f4@2 g4@2 a4 g4 f4 e4@9]/2",
  N: "[c4 f#4!4 g4 a4 [d#4,f#4,c5]@5 b4@2 g4@2, ~@3 [b3,d#4]]/2", O: "[g3,b3,e4]@3 [a3,c#4,f#4]@5",
  P: "[b3,d4,g4]@3 [a3,c#4,f#4]@5", // G F#m
  Q: "[c4@2 f#4@2 f#4@2 f#4@2 f#4@2 g4@2 a4@2 [d#4,f#4,c5]@23 ~ [b3,d#4,g4,b4]@21 e4@5 b4@2 f#4@16 e4@2 f#4@2 g4@2 ~ a4@2 g4@2 f#4@2 e4@5 b4@2 f#4@16 e4@2 ~ f#4@2 g4@2 a4@2 g4, ~@59 [g3,b3]@36 [g3,b3]@33]/8", // Cdim Baug G
  R: "[~@2 f#4@2 e4@5 g4@2 f#4@12 ~ [f#3,e4]@5 g4@2 f#4@17, ~@4 [g3,c4]@19 ~ a3@24, ~@29 f#3@19]/3", // F#7 C5
  S: "[~@5 e4@5 g4@2 ~ f#4@101 ~@14, ~@5 [g3,b3]@108 ~@15]/8", // G
})).s("gm_piano").gain(0.51)

// bass · electric bass finger · "Bass"
const bass = note(`<
  A B@2 C D@2 E F@2 G H@2 I J@2 K L M@2 N@2 O P M@3 N@2 O P M Q@6 R S@2 T U S@2 V@2 M@2 N@2 O P W M@38 N@2 O P M Q@6 R
  S@2 T U S@2 V@2 M@2 N@2 O P M Q@6 R S@2 T U S@2 X@8 Y@3 Z@8
>`.pickRestart({
  A: "~@11 e1!4 e2", B: "e2!7 d2!4 e1!4 e2", C: "e2!2 ~ e2!5 d2!4 e1!4", D: "e2!8 d2!4 e1!4",
  E: "e2!3 ~ e2!5 d2!4 e1!3", F: "e1 e2!8 d2!4 e1!3", G: "e1 e2!4 ~ e2!4 d2!4 e1!2", H: "e1!2 e2!8 d2!4 e1!2",
  I: "e1!2 e2!4 ~ e2!4 d2!4 e1", J: "e1!3 e2!8 d2!4 e1", K: "e1!3 e2!4 ~ e2!4 d2!4", L: "e1!4 e2!8 d2!4", M: "e2!4",
  N: "d2!4", O: "c2!3 d2", P: "d2!2 e2!2", Q: "c2 g1 c2 g1", R: "c2 g1 a#1 f1", S: "a#1 f1 a#1 f1", T: "a#1 f1 a#1 f#1",
  U: "a#1 f#1 a#1 f1", V: "[c2 f#2!4 g2 a2 b1@5 d#2@4]/2", W: "e2!3 ~",
  X: "[c2@2 f#2@2 f#2@2 f#2@2 f#2@2 g2@2 a2@2 b1@23 ~ d#2@21 e2@36 d2@33]/8", Y: "[~@4 c2@19 ~ d2@24]/3",
  Z: "[~@5 e2@109 ~@14]/8",
})).s("gm_electric_bass_finger").gain(0.4)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@5 A@8 ~ B@3 C@2 D@5 E@2 F@2 G@2 H I J K I J L@2 M N@2 M O@2 P@2 Q@2 R@2 S@3 ~@36 Q@2 T@2 U@2 H I J K I J L@2 M N@2 M
  O@2 P@2 V@2 W@2 X@2 H I J K I J L@2 M N@2 M O@2 Y@8 Z@3 AA@8
>`.pickRestart({
  A: "[~@125 b4@2 f#4, e4, ~ b3@7]/8", B: "[~@13 b2@2 e3@33]/3", C: "[g3,b3]/2",
  D: "[g3@8 [g3,c4]@3 f#3 f#3@2 g3@2 g3 ~ [g3,b3,d4,g4,b4]@2, b3@10 ~ a3@3 b3@3 ~@3]/5", // C5 G
  E: "[g3@4 g3@3 [g3,b3]@9, b3@7 ~@9]/2", // G
  F: "[[d4,a4]@2 ~@2 g3 ~@3 [d4,a4]@2 d4@2 d4@2 d4@2, b3@5 ~@11, g3@4 ~ [g3,b3]@2 [g3,b3]@9, ~ [d4,a4]!3 ~@4, ~@3 f#4@5 ~@8]/2", // D5 G D5
  G: "[[b3,e4,g4]@2 ~ f#4@3 [f#3,e4]@2 f#3@4 g4 f#4@3, [g3,c4]@3 a3@3 ~@2, ~ b3 ~@6]/2", H: "g3 [g3,b3,f#4]@3",
  I: "c4 f#4!3 f#4@2 c4 f#4", J: "f#4!2 f#4@2 g4@2 a4@2", K: "f#4", L: "[b4 a4 g4 f#4@9 a#3 e4!3]/2",
  M: "e4@2 a#3 e4!3 e4@2", N: "[f4@2 g4@2 e4@8 a#3 e4!3]/2", O: "[f4@2 g4@2 a4 g4 f4 e4@9]/2",
  P: "[c4 f#4!4 g4 a4 [d#4,f#4,c5]@5 b4@2 g4@2, ~@3 [b3,d#4]]/2", // Cdim B
  Q: "[e4@2 ~@2 g3@3 [g3,b3]@9, b3@7 ~@9, g3 ~@3, ~@3 f#4@5 ~@8]/2", // G
  R: "[~@4 g3 [g3,b3]@2 [g3,b3]@9, b3@5 ~@11, g3 ~@3, ~@3 f#4@5 ~@8]/2", // G
  S: "[e4@2 ~ f#4@3 [f#3,e4]@2 g4 f#4@3 e4@2 g4 ~ g3@2 [g3,b3,f#4]@6, [g3,c4] a3 b3 ~, ~@2 f#3 g3 ~@2, ~@5 f#4 ~@2]/3", // F#7 Gmaj7 C5
  T: "[e4@2 b4 ~ g3 [g3,b3]@2 [g3,b3]@9, b3@5 ~@11, g3 ~@3, ~@3 f#4@5 ~@8]/2", // G
  U: "[~@2 g4 f#4@3 [f#3,e4]@2 f#3@4 g4 f#4@3, [g3,c4]@3 a3@3 ~@2]/2", // F#7 C5
  V: "[e4@2 b4 ~ g3@3 [g3,b3]@9, b3@7 ~@9, g3 ~@3, ~@3 f#4@5 ~@8]/2", // G
  W: "[~@2 b4 ~ g3 [g3,b3]@2 [g3,b3]@9, b3@5 ~@11, g3 ~@3, ~@3 f#4@5 ~@8]/2", // G
  X: "[e4@2 g4 f#4@3 [f#3,e4]@2 f#3@4 g4 f#4@3, [g3,c4]@3 a3@3 ~@2]/2", // F#7 C5
  Y: "[c4@2 f#4@2 f#4@2 f#4@2 f#4@2 g4@2 a4@2 [d#4,f#4,c5]@23 ~ [b3,d#4,g4,b4]@21 e4@5 b4@2 f#4@16 e4@2 f#4@2 g4@2 ~ a4@2 g4@2 f#4@2 e4@5 b4@2 f#4@16 e4@2 ~ f#4@2 g4@2 a4@2 g4, ~@59 [g3,b3]@36 [g3,b3]@33]/8", // Cdim Baug G
  Z: "[~@2 f#4@2 e4@5 g4@2 f#4@12 ~ [f#3,e4]@5 g4@2 f#4@17, ~@4 [g3,c4]@19 ~ a3@24, ~@29 f#3@19]/3", // F#7 C5
  AA: "[~@5 e4@5 g4@2 ~ f#4@101 ~@14, ~@5 [g3,b3]@108 ~@15]/8", // G
})).s("gm_string_ensemble_1").gain(0.14)

// other · overdriven guitar · "Guitar Lead"
const overdriven_guitar = note(`<
  ~@44 A@2 B ~@6 C D E@4 F@2 G H I@2 J ~@3 K L M N O@2 P Q R S T U V W X Y Z ~ AA AB@2 ~@19 A@2 AC ~@19 AD@5 ~@14
>`.pickRestart({
  A: "[c4 f#4!4 g4 a4 [d#4,f#4,c5]@5 b4@2 g4@2, ~@3 [b3,d#4]]/2", B: "g3 ~, e4 ~@3", C: "e4@3 ~",
  D: "f#4 g4 d5 c#5@2 b4 g4@2", E: "[f#4@4 ~ g4 a4 b3@5 ~ b3 e4 b4@6 e4 b4 a4@2 e4 a4 g4@2 f#4 e4 d4]/4",
  F: "[f#4@2 g4 d#4@2 f#4 e4@10]/2", G: "e5@3 ~", H: "b4 d5 b4 g4 b4 e4 g4 a4",
  I: "[b4@2 d5@2 a4@2 b4@2 f#4@2 g4@2 b4@2 e4@10 g4 f#4 e4@6]/2", J: "g5@3 ~@13", K: "b3 c4 c#4 e4@3 a4@2",
  L: "a4 b4 g4 f#4@3 e4@2", M: "e4 d#4 d4 c#4@3 a4@2", N: "a#4@2 b4@2 a4@4 g4 f#4 e4@6",
  O: "[b3@2 c4@2 c#4@2 d4@6 b4@2 a#4 ~ g4 ~ b4@2 a#4 a4 g4 ~ e4@2 d#4@2 d4@2 c#4@2, ~@15 a4@3 ~@14]/2",
  P: "b3 c4 c#4 [d4,b4] d5 c5 b4 g4", Q: "a4 g4 a4 b4@2 ~@2 a4", R: "b4 e4!2 e4@4 a#4", S: "c#5 e4!2 e4@4 g4",
  T: "e4 g4 f#4 a4 e4 b4 g4 c5", U: "c#5 e5 e4 ~@4 a4, ~@3 e4@5", V: "b4 g4!2 g4@4 b4", W: "c#5 a4!2 a4@3 ~ a4",
  X: "e4 b3 f#4 c#4 a4 e4 d5 g#4", Y: "e5 c#5 f#5 d5 a5 d5 c#6 d#5", Z: "b5 e5!2 e5@3 ~@2",
  AA: "g4 e4 f#4 g4 a4 f#4 g#4 a4 b4 g#4 a#4 b4 c5 a4 b4 c5",
  AB: "[d5 b4 c#5 d5 e5 c#5 d#5 e5 f5 d5 e5 f5 g5 e5 f#5 g5@5 ~@12]/2", AC: "b3@7 ~, g3 ~, e4 ~@3",
  AD: "[c4@2 f#4@2 f#4@2 f#4@2 f#4@2 g4@2 a4@2 [d#4,f#4,c5]@23 ~ b4@10 g4@11 b3@16 ~@5, ~@38 [b3,d#4]@21 g3@9 ~@12, ~@59 e4@5 ~@16]/5", // Cdim B
})).s("gm_overdriven_guitar").gain(0.35)

// other · string ensemble 1 · "Orchestra"
const string_ensemble_1_2 = note(`<
  ~@31 A B C A B D@2 E F@2 E G@2 ~@52 A B C A B D@2 E F@2 E G@2 ~@9 A B C A B D@2 E F@2 E G@2 ~@19
>`.pickRestart({
  A: "c4 f#4!3 f#4@2 c4 f#4", B: "f#4!2 f#4@2 g4@2 a4@2", C: "f#4", D: "[b4 a4 g4 f#4@9 a#3 e4!3]/2",
  E: "e4@2 a#3 e4!3 e4@2", F: "[f4@2 g4@2 e4@8 a#3 e4!3]/2", G: "[f4@2 g4@2 a4 g4 f4 e4@9]/2",
})).s("gm_string_ensemble_1").gain(0.34)

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

// drums · rim
const rim = s("rim").struct("<~@8 A ~@2 B ~@34 C@4 ~@3 C@36 ~@61>".pickRestart({
  A: "~ x ~ x ~ x ~ x ~@8", B: "~@5 x ~ x ~ x ~ x ~@4", C: "~ x ~ x",
})).gain(0.12)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  ~@8 A B C@2 D C@2 E C@7 F C@6 F ~@5 G ~@9 C@6 H I C@6 J K C@5 L C@27 M ~@12 N ~@2 I C@5 F ~@32
>`.pickRestart({
  A: "~@13 x!3", B: "x!5 ~ x!10", C: "x!16", D: "x!6 ~ x!9", E: "x!7 ~ x!8", F: "x!5 ~@11", G: "~ x",
  H: "x!5 ~@7 x ~@3", I: "~@4 x!12", J: "x!8 ~@2 x!2 ~@2 x!2", K: "~@2 x!2 ~@2 x!10", L: "~@2 x!14", M: "x!4 ~@8 x ~@3",
  N: "~@3 x",
})).gain(0.12)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@21 A B C D C@3 A B C ~@13 E B F@4 A B C D C@39 A B C ~@13 E B G@4 A B C ~@13 E ~ H I ~@15
>`.pickRestart({
  A: "x ~@2 x", B: "~ x", C: "~ x ~ x", D: "x!2 ~ x", E: "x!8", F: "x!2", G: "x!4", H: "~@6 x ~ x ~ x!3 ~ x!2",
  I: "x ~ x!3 ~ x!3 ~@7",
})).gain(0.12)

// drums · open hat
const open_hat = s("oh").struct("<~@60 A B ~@5 C ~@5 D ~@3 D ~@7 D ~@64>".pickRestart({
  A: "~@8 x!2 ~@2 x!2 ~@2", B: "x!2 ~@2 x!2 ~@10", C: "x!2 ~@14", D: "x",
})).gain(0.12)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@23 A B C@3 D E C ~@13 F E ~@6 A B C@39 D E C ~@13 F E B C@3 A ~ C ~@13 F ~ G ~@16
>`.pickRestart({
  A: "~@3 x", B: "x!2 ~ x", C: "~ x ~ x", D: "x ~@2 x", E: "~ x", F: "x!8", G: "~@3 x ~@4",
})).gain(0.12)

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

stack(
  piano, bass, string_ensemble_1, overdriven_guitar, string_ensemble_1_2, kick, rim, pedal_hat, mid_tom, open_hat,
  high_tom, crash
)

More by ABBA