Strudelify
Hey Ya! cover art

2003 · Speakerboxxx/The Love Below

Hey Ya!

OutKast

KeyG minorTempo158 bpm
0:00/0:00
// Hey Ya! — OutKast
// 158 bpm, 4/4, key G minor. 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 4, 4/4 at bar 5, 2/4 at bar 10, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/5976246; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 98 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(158/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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 · trumpet · "B♭ Trumpet"
const trumpet = note(`<
  A B@3 C@2 D E@2 F@3 B@3 C@2 D E@2 G@6 H@2 I J@2 K@3 L M N O@2 P@2 Q R@3 S@2 T U V P@2 Q W X Y@4 H@2 I J@2 Z@3 AA AB AC
  AD@2 ~@2 AE AF@2 AG AH AI ~ AJ AK@8 AL@3 AM@5
>`.pickRestart({
  A: "~@3 g4", B: "[f4 eb4 d4@2 d4@2 eb4 d4@2 c4 bb3 c4 d4@2 eb4 d4@2 c4 bb3 c4 d4 ~ eb4 ~]/3", C: "[d4@7 ~]/2",
  D: "~@2 g4@2 f4 eb4 d4@2", E: "d4@2 eb4 d4@2 c4 bb3 c4", F: "[d4 eb4 d4@7 ~@2 g4]/3",
  G: "[d4@2 eb4@2 d4@14 ~@2 d5@5 c5 d5@2 c5@14 ~@2 d5@2 c5@2]/6", H: "[bb4@7 ~]/2", I: "d5@5 c5 d5@2", J: "[c5@7 ~]/2",
  K: "[d5@2 c5@2 bb4@14 ~@3 d4!2 db4]/3", L: "d4 bb3 ~ eb4@2 d4 eb4 d4", M: "eb4 f4 ~ d4 eb4 d4 eb4 d4",
  N: "eb4 d4 eb4 d4 f4 d4!3", O: "[d4@2 f4 d4@3 f4 d4@3 f4 d4@2 f4 d4 f4]/2",
  P: "[~ d4!2 db4 d4 bb3 ~ eb4@2 d4 eb4 d4 eb4 f4 ~ d4]/2", Q: "eb4 d4 eb4 d4 eb4 d4 eb4 d4",
  R: "[f4 d4!3 d4@2 f4 d4@3 f4 d4@3 f4 d4@2 f4 d4 f4 ~ d4!2 db4]/3",
  S: "[d4 bb3 ~ bb4@2 a4 g4 a4@2 g4 f4 d4 eb4 d4 ~ d4]/2", T: "eb4 d4 ~ d4 f4 d4 ~ d4", U: "f4 d4 ~ d4 f4 d4 ~@2",
  V: "d4@2 f4!2 g4@2 a4 f4", W: "f4 d4 d4@2 d4 d4@2 bb3", X: "g3 ~", Y: "[~@4 d5@5 c5 d5@2 c5@14 ~@2 d5@2 c5@2]/4",
  Z: "[d5@4 c5@4 bb4@28 ~@4 f4 ~ f4 ~@3 f4 ~]/3", AA: "~@2 f4@2 f4@4 eb4 ~ eb4 ~@3 eb4 ~",
  AB: "~@2 eb4@2 eb4@4 eb4 ~ eb4 ~@3 eb4 ~", AC: "~@2 eb4@2 eb4@4 f4@3 ~ f4@3 ~", AD: "g4 ~ g4 ~@3 g4 ~@3 g4@2 g4@4",
  AE: "f4 ~ f4 ~@3 f4 ~@3 f4@2 f4@4", AF: "eb4 ~ eb4 ~@3 eb4 ~@3 eb4@2 eb4@4", AG: "f4@3 ~ f4@3 ~ g4 ~ g4 ~@3 g4 ~",
  AH: "~@2 g4@2 g4@4 g4 ~ g4 ~@3 g4 ~", AI: "~ g4 g4@2 ~@4", AJ: "~@7 d5@9",
  AK: "[~ c5@2 d5@4 c5@28 ~@4 d5@4 c5@4 bb4@28 ~@4 d5@10 c5@2 d5@4 c5@28 ~@4 d5]/8", AL: "[~@3 c5@4 bb4@28 ~@4 d5@9]/3",
  AM: "[~ c5@2 d5@4 c5@28 ~@4 d5@4 c5@4 b4@28 ~@5]/5",
})).s("gm_trumpet").gain(0.3)

// other · trombone
const trombone = note(`<
  A B C D E@2 F G@2 H I J B C D E@2 F G@2 H I J K C L E M N G@2 O I P B C D E@2 F G@2 H I J B C D E@2 F G@2 Q ~ A K C L
  E M N G@2 O I P B C R S@2 ~@2 F G@2 T U V ~ W X Y Z@8 AA AB@5
>`.pickRestart({
  A: "~@4 bb2@3 bb2", B: "~ bb2 bb2@2 eb3@3 eb3", C: "~ eb3 eb3@2 eb3@3 eb3", D: "~ eb3 eb3@2 c3 ~ f3 ~",
  E: "g3@3 g3 ~ g3 g3@2", F: "bb2@3 bb2 ~ bb2 bb2@2", G: "eb3@3 eb3 ~ eb3 eb3@2", H: "c3 ~ f3 ~ g3@3 g3",
  I: "~ g3 g3@2 g3@3 g3", J: "~ g3 g3@2 bb2@3 bb2", K: "~ bb2 c3 d3 eb3@3 eb3", L: "~ eb3 eb3@2 a2 ~ f3 ~",
  M: "g3@3 g3 ~ f2 g2 a2", N: "bb2@3 bb2 ~ bb2 c3 d3", O: "a2 ~ f3 ~ g3@3 g3", P: "~ f2 g2 a2 bb2@3 bb2",
  Q: "c3 ~ f3 ~@5", R: "~@2 eb3@2 eb3@4 c3@3 ~ f3@3 ~", S: "b3 ~ b3 ~@3 b3 ~@3 b3@2 b3@4",
  T: "c3@3 ~ f3@3 ~ b3 ~ b3 ~@3 b3 ~", U: "~@2 b3@2 b3@4 b3 ~ b3 ~@3 b3 ~", V: "~ b3 b3@2 ~@4", W: "~@7 bb2@6 bb2@2 ~",
  X: "~ bb2@2 c3@2 d3@2 eb3@6 eb3@2 ~", Y: "~ eb3@2 eb3@4 eb3@6 eb3@2 ~",
  Z: "[~ eb3@2 eb3@4 a2@2 ~@2 f3@2 ~@2 g3@6 g3@2 ~@2 g3@2 g3@4 g3@6 g3@2 ~@2 f2@2 g2@2 a2@2 bb3@10 a3@2 bb3@4 bb3@28 ~@4 f3@4 c4@4 g3@25]/8",
  AA: "~@7 bb3@9", AB: "[~ a3@2 bb3@4 bb3@28 ~@4 f3@4 c4@4 d4@28 ~@5]/5",
})).s("gm_trombone").gain(0.3)

stack(trumpet, trombone)