Strudelify
Hey, Hey Helen cover art

Abba

Hey, Hey Helen

ABBA

KeyD majorTempo118 bpm
0:00/0:00
// Hey, Hey Helen — ABBA
// 118 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (2/4 at bar 1, 4/4 at bar 2) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 97 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(118/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · electric bass finger · "Bass"
const bass = note(`<
  ~@3 A@2 B@2 C@2 D@4 E@3 F G H I J K L M N O P M N O Q A@2 R S@3 E@3 F G H I J K L M N O P M N O T M T M T M T U V ~@8
  W X M Y M X M Y M X M Y M X M Y M X M Y M X M Y M ~
>`.pickRestart({
  A: "[~@5 g2 a2 d3@3 ~@3 d3 ~ a2]/2", B: "[g2@3 ~@2 g2 a2 d3@3 ~@3 d3 ~ a2]/2",
  C: "[g2@5 ~@5 g2@2 a2@2 d3@6 ~@6 d3@2 ~@2 a2@2]/2",
  D: "[g2@3 ~@2 g2 a2 d3@3 ~@2 a2 a2@2 g2@4 ~@2 g2 a2 d3@3 ~@3 d3 ~ a2]/4",
  E: "[g2@3 ~@2 g2 a2 d3@3 ~@2 a2 a2@2 g2@2 g2!7]/3", F: "d2@2 [d3,f#3] d2 d2@2 [d3,f#3]@2",
  G: "a2@2 [c#3,e3] a2!2 a2@3", H: "c2@3 g2 c2@2 c2@2", I: "e2@2 [e3,g3] e2 e2@2 [e3,g3]@2", J: "g2@2 g3 g2!2 g2@3",
  K: "g2@2 g3 g2!2 g2@2 g2", L: "d3@3 a2!2 a2@3", M: "g2@2 g2@2 f3 a3 c3 e3", N: "d3 [f#3,a3] a2 [f#3,a3]",
  O: "g2@2 [g3,b3]@2 f3 a3 c3 e3", P: "d3@3 d3@2 a2 a2@2", Q: "d3 ~@3", R: "g2@3 ~@2 g2 a2 d3",
  S: "[d3@2 ~@2 a2 a2@2 g2@4 ~@2 g2 a2 d3@3 ~@3 d3 ~ a2]/3", T: "d3@3 d3 a2 a2@3", U: "g2@2 g2@2 e3 a3 c3 e3",
  V: "d3 ~@7", W: "~@2 a2!6", X: "d3@3 d3 a2 a2@2 a2", Y: "d3@3 d3 a2@2 a2@2",
})).s("gm_electric_bass_finger").gain(0.45)

// chords · distortion guitar · "Guitar"
const distortion_guitar = note(`<
  ~@3 A@2 B@10 C@4 D@3 E F G F E F G F H A@2 B@6 C@4 D@3 E F G F E F G F E F G F E F G F ~@10 E F G F E F G F E F G F E
  F G F E F G F E F G F ~
>`.pickRestart({
  A: "[~@5 [d3,g3] [e3,a3] [a3,d4]@5 ~ [a3,d4] ~ [e3,a3]]/2", // G5 A5 D5 A5
  B: "[[d3,g3]@4 ~ [d3,g3] [e3,a3] [a3,d4]@5 ~ [a3,d4] ~ [e3,a3]]/2", // G5 A5 D5 A5
  C: "[[d3,g3]@4 ~ [d3,f#3] [e3,g3] [f#3,a3]@7 [f#3,a3] [e3,a3]@3 [e3,g3]@2 [d3,f#3] [c#3,e3]@2 [e3,g3]@9]/4", // G5 D Em F#m A5 Em D C#m …
  D: "[[e3,b3]@5 [e3,g3] [f#3,a3] [g3,b3]@6 [g3,b3]@4 [f#3,a3] [e3,g3]@2 [d3,f#3]@4]/3", E: "[d3,f#3]@3 [c#3,e3]@5",
  F: "[d3,b3]", G: "[d3,f#3]", H: "[d3,f#3] ~@3",
})).s("gm_distortion_guitar").gain(0.21).pan(0.2)

// drums · kick
const kick = s("bd").struct("<A@15 B A@5 B A@7 B A@9 B A@5 B A@7 B A@7 B A@9 B A@7 B A@7 B A@7 B ~>".pickRestart({
  A: "x ~@3 x!2 ~ x", B: "x ~@6 x",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct("<A@15 B A@5 B A@7 B A@9 B A@5 B A@7 B A@7 B A@9 B A@7 B A@7 B A@7 B ~>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@2 x!2 ~@3 x!3 ~",
})).gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<~@15 A ~@5 A ~@7 A ~@9 A ~@5 A ~@7 A ~@7 A ~@9 A ~@7 A ~@7 A ~@7 A ~>".pickRestart({
  A: "~@5 x ~@2",
})).gain(0.5)

// drums · crash
const crash = s("cr").struct("<~@16 A ~@5 A ~@7 A ~@9 A ~@5 A ~@7 A ~@7 A ~@9 A ~@7 A ~@7 A ~@8>".pickRestart({
  A: "x",
})).gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<[x!4]!96 ~>").gain(0.45)

stack(bass, distortion_guitar, kick, snare, low_tom, crash, tambourine)

More by ABBA