Strudelify

hooked on a feeling

Blue Swede

KeyA majorTempo132 bpm
0:00/0:00
// hooked on a feeling — Blue Swede
// 132 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 20, 4/4 at bar 21, 2/4 at bar 49, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/492286; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 65 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(132/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.

// other · tuba · "Euphonium"
const tuba = note(`<
  ~@9 A B@2 C D E@2 F@2 ~ G H I J K L M N O P@7 Q R S@6 T U V@2 W X ~ Y ~ Z ~ AA ~ AB AC AD AE AF AG AH AI AJ
>`.pickRestart({
  A: "~ c#3@7", B: "[~ d3@6 e3@8 ~]/2", C: "d3", D: "e3 ~ e3@6", E: "[~@2 c#4@2 e4 f#4 ~ e4@3 ~@6]/2",
  F: "[~@2 a3@2 c#4 a3 ~ b3@4 e4@4 ~]/2", G: "d4!2", H: "e3 ~ e3 ~@5", I: "~@10 e3!2 e3@2 e3@2", J: "f#3 b3 f#3 e3 ~@4",
  K: "~@10 d3!2 d3@2 d3@2", L: "f#3 a3 f#3 d3 ~@4", M: "~ a3", N: "a3 ~", O: "~@4 e3!2 ~ f#3",
  P: "[~ b3 e4 ~ a3@3 a3@3 ~@2 g#3@3 g#3@3 ~@2 [g3,a3]@3 [g3,a3]@3 ~@2 [f#3,a3]@3 [f#3,a3]@3 ~@2 [d3,a3]@3 [d3,a3]@3 ~@2 [c#3,a3]@3 [c#3,a3]@3 ~@2 [b2,a3]@3 [b2,a3]]/7", // Gsus2 F#m D5 F#m B7
  Q: "[b2,a3]@3 [b2,a3] [e3,a3] ~ [e3,a3] ~", R: "[e3,a3] ~ [e3,a3] ~@5",
  S: "[~@5 c#3@7 ~ d3@6 e3@8 ~ d3@8 e3 ~ e3@6 ~@2 c#4@2]/6", T: "e4 f#4 ~ e4@3 ~@2", U: "~@3 a3",
  V: "[c#4 a3 ~ b3@4 e4@4 ~@5]/2", W: "~ d4", X: "d4@4 e3 ~ e3 ~", Y: "~@2 e3!2 e3@2 e3@2 f#3@2 b3@2 f#3@2 e3@2",
  Z: "~@2 d3!2 d3@2 d3@2 f#3@2 a3@2 f#3@2 d3@2", AA: "a3!2", AB: "e3!2 ~ f#3 ~ b3 e4 ~", AC: "a3@3 a3@3 ~@2",
  AD: "g#3@3 g#3@3 ~@2", AE: "[g3,a3]@3 [g3,a3]@3 ~@2", AF: "[f#3,a3]@3 [f#3,a3]@3 ~@2", AG: "[d3,a3]@3 [d3,a3]@3 ~@2",
  AH: "[c#3,a3]@3 [c#3,a3]@3 ~@2", AI: "[b2,a3]@3 [b2,a3] [b2,a3]@3 [b2,a3]",
  AJ: "[e3,a3] ~ [e3,a3] ~ [e3,a3] ~ [e3,a3] ~", // A5
})).s("gm_tuba").gain(0.3)

// bass · trombone · "Bass Trombone"
const bass = note("<~@12 A B C D E D C F G@8 H@7 I ~@4 J@8 K C@3 E@2 C E D C@3 E@2 C L M>".pickRestart({
  A: "b2", B: "e3 ~ e3@6", C: "a2", D: "e3", E: "d3", F: "d3!2",
  G: "[e2 ~ e2 ~ a2@8 a2@8 a2@8 d3@8 d3@8 a2@8 d3@8 e3@4]/8", H: "[~@4 a2@8 a2@8 a2@8 d3@8 d3@8 a2@8 e2@3 e2]/7",
  I: "e2@3 e2 e3@4", J: "[~@4 b2@8 e3 ~ e3@6 a2@8 e3@8 d3@8 e3@8 a2@8 d3@4]/8", K: "d3@4 e2 ~ e2 ~",
  L: "e2@3 e2 e2@3 e2", M: "e3 ~",
})).s("gm_trombone").gain(0.3)

// bass · trombone · "Bass Trombone" · soft notes
const bass_soft = note("<~@8 A B C D ~@24 E@5 ~@24>".pickRestart({
  A: "~ e2@7", B: "~ a2@7", C: "~ e2@6 e2", D: "e2@7 ~", E: "[~@5 e2@7 ~ a2@7 ~ e2@6 e2 e2@7 ~@5]/5",
})).s("gm_trombone").gain(0.2)

stack(tuba, bass, bass_soft)