Strudelify
Superstition cover art

Talking Book

Superstition

Stevie Wonder

KeyG♭ majorTempo101 bpm
0:00/0:00
// Superstition — Wonder Stevie
// 101 bpm, 4/4, key Gb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 103 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(101/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(`<
  ~@4 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC V
  W X Y Z AA AB AC F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC Z AA AB AC Z AA AB AC Z AA AB AC AD@2
>`.pickRestart({
  A: "~@14 ab2 bb2 ~@2 db3 ~@2 eb3 ~@2",
  B: "eb1@2 eb2 eb3 ~ eb2 db3@2 eb3 eb1 ~@2 [db3,gb3] ~@2 eb2 ~ [db3,gb3]@3 eb2 db3 ~@2", // Gb5
  C: "eb1@2 ~ eb3 ~ eb2 db3 ~ eb3 eb2 ~@5 [db3,gb3] ~@2 ab3@2 ~ [db3,gb3] ~ [db3,gb3], ~@18 eb3 ~@5", // Gb5
  D: "eb1 ~ eb2 eb3 ~ eb2 db3 ~ eb3 ~@3 [eb3,gb3] ~@4 [db3,gb3] ~@2 eb2 [db3,gb3] ~@2", // Ebm Gb5
  E: "eb1 ~@2 [db4,gb4] ~@2 eb2 ~@2 eb1 ~ eb2 [db4,gb4] ~@2 eb2 ~ gb4 ~@2 eb2 ab3 ~ bb3", // Gb5
  F: "eb1 ~@2 gb3 ~@5 [db3,gb3] ~@7 eb3 ~@2 eb2 db3 ~ eb3", // Gb5
  G: "eb1@3 [db3,gb3] ~@2 [db3,gb3]@2 ~ eb2 ~@4 eb2 ~@2 eb2 ~@2 eb2 [eb3,ab3] ~ gb3", // Gb5 Ab5
  H: "eb1@2 eb2 [db3,gb3] ~@2 db3 ~@2 [db3,gb3] ~@4 eb2 ~@2 eb3 ~@2 eb2 db3 ~ eb3", // Gb5
  I: "eb1@2 ~ [db3,gb3] ~@2 [db3,gb3] ~@5 [db3,gb3] ~@4 db3 ~@3 [db3,gb3] ~ db3", // Gb5
  J: "eb1@3 [db3,gb3] ~@2 [db3,gb3] ~@2 eb2 ~@7 db3 ~@2 eb2 eb3@2 db3", // Gb5
  K: "eb1 ~ eb2 [db3,gb3] ~@2 [db3,gb3] ~@2 eb2 ~@2 [db3,gb3] ~@4 [eb3,ab3]@3 eb2 [db3,gb3] ~@2", // Gb5 Ab5 Gb5
  L: "eb1@3 [db3,gb3] ~@4 [db3,gb3] eb1 ~@4 eb2 db3 ~@2 eb3 ~ eb2 db3@2 eb3", // Gb5
  M: "eb1@3 [db3,gb3] ~@2 eb2 ~ [db3,gb3] eb1 ~@2 [bb3,db4]@3 ab3 ~@2 gb3 ~@2 ab3 ~ gb3, ~@12 [ab3,a3] ~@11", // Gb5 Bbm Amaj7
  N: "eb1 ~@8 [db3,gb3] ~@2 [db3,gb3] ~@2 eb2 ~ [db3,gb3] ~@2 eb2 [eb3,ab3] ~ [eb3,gb3]", // Gb5 Ab5 Ebm
  O: "eb1 ~@2 [db3,gb3] ~@2 eb2 ~ [db3,gb3] eb1 ~ eb2 [db3,gb3] ~@2 eb2 ~@2 [eb3,ab3]@2 ~ db3@2 ~, ~@21 gb3 ~@2", // Gb5 Ab5
  P: "eb1@2 eb2 [db3,gb3] ~@5 [db3,gb3] ~@2 [db3,gb3] ~@2 eb2 ~ [eb3,ab3]@3 eb2 ~ db3@2, ~@21 gb3@2 ~", // Gb5 Ab5
  Q: "eb1@3 [db3,gb3] ~@2 [db3,gb3] ~@2 eb2 ~@2 [db3,gb3] ~@8 db2 ~@2", // Gb5
  R: "eb1@3 db3 ~@2 [db3,gb3] ~@2 eb2 ~@2 [db3,gb3] ~@2 eb2 ~ [db3,gb3] ~@2 eb2 [eb3,ab3] ~ [db3,gb3]", // Gb5 Ab5 Gb5
  S: "eb1@2 ~ [db3,gb3] ~@2 eb2 ~ gb3 eb1 ~@11 db3@3", // Gb5
  T: "eb1@2 ~ [db3,gb3] ~@2 eb2 ~ gb3 eb1 ~@2 [ab3,a3,bb3] ~@2 [ab3,db4] ~@2 gb3 ~@2 ab3 ~ gb3, ~@6 db4 ~@5", // Gb5 Db5
  U: "eb1@2 ~ [db3,gb3] ~@2 eb2 ~ [db3,gb3] eb1@2 ~ [db3,gb3] ~@2 eb1 ~@8", // Gb5
  V: "bb1 ~@2 bb1 ~@5 bb1 ~@2 b1 ~@2 b1 ~@2 b1 ~@2 b1 ~@2, [d3,ab3]@9 ~@3 [eb3,a3]@10 ~@2", // Ddim Ebdim
  W: "bb1 ~@2 bb1 ~@2 bb1 ~@2 bb1 ~@2 a1 ~@2 a1 ~@2 a1 ~@2 a1 ~@2, [d3,ab3]@10 ~@2 [db3,g3]@9 ~@3", // Ddim Dbdim
  X: "ab1 ~@2 ab1 ~@2 ab1 ~ gb3 [ab1,c3] ~@2 [c3,gb3]@3 ab1 ~ [c3,gb3] ab1 ~@2 ab1 ~@2, [c3,gb3]@7 ~@5 ab1 ~@11", // Ab Cdim
  Y: "[bb1,bb3,bb4] ~@7", Z: "eb1@3 eb2 ~@2 [db3,gb3] ~@2 eb2 ~@2 [db3,gb3]@3 ~ eb2 ~ [eb3,ab3]@2 ~ [db3,gb3] ~@2",
  AA: "eb1@2 ~ [db3,gb3] ~@2 eb2 ~ [db3,gb3] eb1 ~@2 [ab3,a3,bb3] ~@2 [ab3,a3] ~@2 gb3 ~@2 ab3 ~ gb3, ~@4 db4 ~@3", // Gb5 Amaj7
  AB: "eb1 ~@5 [db3,gb3] ~@2 eb2 ~@2 [eb3,ab3]@3 eb2 ~ [db3,gb3] ~@2 eb2 db3 ~ eb3", // Gb5 Ab5 Gb5
  AC: "eb1@2 ~ eb3 ~@2 db3 ~@2 eb3 ~ eb2 [db3,gb3] ~@2 eb2 ~ [db3,gb3] ~@2 eb2 [eb3,ab3] ~@2", // Gb5 Ab5
  AD: "[[eb1,eb2,eb3]@15 ~]/2", // Eb
})).s("gm_piano").gain(0.36)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@5 A B C D A B C D A B C D A B C D A B C D E F G H A B C D A B C D A B C D A B C D A B C D E F G H A B C D E F G H A
  B C D A B C D A B C D A B C D A B C D E F G H A B C D A B C D A B C D A B C D I@2
>`.pickRestart({
  A: "eb1@2 ~ eb2 ~ eb1 db2@2 eb2 eb1@2 ~ gb1 ~ ab1 bb1 ~ db2@3 bb1 eb2 ~ eb2",
  B: "eb1@3 eb2 ~ eb1 db2@2 eb2 ~@2 db2 ab2 ~@2 gb2 ~@2 gb2@3 eb2@2 db2",
  C: "eb1@3 eb2 ~ eb1 db2@2 eb2 eb1@2 ~ gb1 ~ ab1 bb1 ~ db2@3 bb1 eb2 ~ eb2, f1 ~@23",
  D: "eb1@3 eb2 ~ eb1 db2@2 eb2 ~@3 ab2 ~@2 gb2@2 ~ gb2@3 eb2 ~ db2",
  E: "bb1 ~ bb1@2 ~ d2@2 ~ f2@2 ~ bb2 b1@2 eb2 ~@2 gb2 ~@2 b2 ~@2 bb2",
  F: "~@2 f2 ~@2 d2 ~@2 bb1@2 ~ a1@2 ~ db2 ~@2 e2 ~@2 a2 ~@2 ab2",
  G: "ab1 ~ ab2 ab1@2 ~ c2@2 ~ c2@2 ~ db2 ~ ab1 db2 ~@2 d2@2 ~ eb2 ~@2", H: "bb1@2 ~@18 bb1 db2 ~ eb2",
  I: "[eb1@7 ~]/2",
})).s("gm_electric_bass_finger").gain(0.48)

// other · clavinet
const clavinet = note(`<
  ~@4 A B C D E B C D E F C D E B C D E F C D E G H I J F C D E B C D E F C D E F C D E F C D E G H I J F C D E G H I J
  F C D E B C D E F C D E F C D E F C D E G H I J F C D E F C D E F C D E F C D E K@2
>`.pickRestart({
  A: "~@14 ab2 bb2 ~ ab2 db3 ~@2 eb3 ~@2", B: "~@3 eb3 ~@2 db3@2 eb3 eb2 ~@2 [db3,gb3] ~@2 eb2 ~ eb3 ~@2 eb2 db3@2 eb3",
  C: "eb2 ~@2 eb3 ~@2 db3@2 eb3 eb2 ~@2 bb2@2 ~ db3 ~ [a2,bb2] ab2@2 gb2 ab2@2 gb2, ~@12 a2 ~@11", // Bbmaj7
  D: "eb2@2 ~ eb3 ~ eb2 db3 ~ eb3 eb2 ~@2 [db3,gb3] ~@4 [db3,gb3] ~@3 [db3,gb3]@3", // Gb5
  E: "eb2@2 ~ eb3 ~@2 db3@2 ~ eb3 ~@2 ab2 ~@2 a2 ~ bb2 ~@2 db3 ~@2 eb3",
  F: "eb2@2 ~ eb3 ~@2 db3@2 eb3 eb2 ~@2 [db3,gb3] ~@2 eb2 ~ eb3 ~@2 eb2 db3@2 eb3", // Gb5
  G: "[bb1,ab3,d4]@3 bb1 ~ [ab3,d4] bb1 ~@2 bb1 ~@2 [a3,eb4]@3 b1 ~ [a3,eb4] b1 ~@2 b1 ~@2, ~@12 b1 ~@11", // Bb7 Abdim Adim
  H: "[ab3,d4]@3 bb1 ~ [ab3,d4] bb1 ~@2 bb1 ~@2 a1 ~@2 a1 ~ [g3,db4] a1 ~@2 a1 ~@2, bb1 ~@10 [g3,db4]@5 ~@8", // Abdim Gdim
  I: "ab1@3 [gb3,c4] ~@2 ab1 ~ [gb3,c4] ~@2 ab1 [gb3,c4]@3 ab1 ~ [gb3,c4] ~@2 [gb3,c4] ~@3", // Gbdim
  J: "[d4,gb4]@3 ~@17 db2 db3 ~ eb3", K: "[[ab3,bb3,db4,eb4]@43 ~@5]/2",
})).s("gm_clavinet").gain(0.45).pan(0.2)

// other · brass section · "Brass"
const brass_section = note(`<
  ~@17 A B A B A B A B C D E F A B A B A B A B A B A B A B A B A B A B C D E F A B A B C D E F A B A B A B A B A B A B A
  B A B A B A B C D E F G H@4 I@3 J K L M N O@3 ~@2
>`.pickRestart({
  A: "~@3 [eb4,eb5] ~@4 [eb4,eb5] ~@3 [gb3,gb4] ~ [ab3,ab4] [bb3,bb4] ~ [db4,db5]@3 [bb3,bb4] [eb4,eb5] ~ [eb4,eb5]", // Eb Gb Ab Bb Db Bb Eb
  B: "~@3 [eb4,eb5] ~@2 [db4,db5] ~ [eb4,eb5] ~@3 [bb4,bb5] ~@2 [ab4,ab5] ~@2 [gb4,gb5] ~@5", C: "f4@2 ~ gb4@2 ~",
  D: "f4@7 ~@5 e4@7 ~@5", E: "[eb4,eb5]@23 ~", F: "~ gb4@3 ~@20, [gb5,bb5] ~@5", G: "[eb3,eb4] ~@5 [eb4,eb5]@16 ~@2",
  H: "[[db4,db5]@2 ~@4 [c4,c5]@2 ~@4 [bb3,bb4]@6 [c4,c5] ~@2 eb3@26 ~ db3@2 ~@4 c3@3 ~@3 bb2@4 ~@2 c3 ~@5 [eb4,eb5]@18 ~@6, ~@21 eb4@46 ~@2 eb3@14 ~@13]/4", // Db C Bb C Eb
  I: "[[db4,db5]@3 ~@3 [c4,c5]@2 ~@4 [bb3,bb4]@6 [c4,c5] ~@2 [eb3,eb4]@47 ~@4]/3", J: "f4@5 ~ gb4@5 ~",
  K: "f4@10 ~@2 eb4@9 ~@3", L: "f4@9 ~@3 gb4@10 ~@2", M: "f4@5 ~ eb4@4 ~@2", N: "[eb4,eb5]@11 ~",
  O: "[[db4,db5]@4 ~@2 [c4,c5]@3 ~@3 [bb3,bb4]@5 ~ [c4,c5] ~@2 [eb3,eb4]@33 ~@18]/3", // Db C Bb C Eb
})).s("gm_brass_section").gain(0.29)

// other · electric guitar muted · "Muted Guitar"
const electric_guitar_muted = note(`<
  ~@5 A@2 B C D@2 E@2 F G H I J K L M N O P Q R S T U V W X Y D@2 E@2 F G H I J K L M N O P Q R S T U V W X Y R S T U
  D@6 E@2 F G H I J K L M N O P Q R S T U V W X Y D@8 ~@6
>`.pickRestart({
  A: "[~@3 db3 ~@2 eb3 ~@5 eb3 ~@5 eb3 ~@2 db3 ~ eb3@4 db3 ~@2 eb3 ~@2 db3 ~@2 gb3 ~@2 ab3 ~@2 gb3 ~@2 db3 ~@2]/2",
  B: "eb3@2 ~ db3 ~@2 eb3 ~@2 db3 ~@2 eb3 ~@2 db3 ~@2 eb3 ~@4 ab3",
  C: "~@2 [gb3,ab3] ab3 ~@2 gb3 ~@2 eb3 ~@2 eb3 ~@5 eb3 ~@2 db3 ~@2", // Gbsus2
  D: "[~@3 eb3 ~@5 eb3 ~@2 eb3 ~@5 eb3 ~@4 gb3@4 eb3 ~@2 eb3 ~@2 db3 ~@2 eb3 ~@2 db3 ~@2 eb3 ~ db3 ab3 ~ gb3]/2",
  E: "[~@3 db3 ~@2 eb3 ~@2 db3 ~@2 eb3 ~@2 db3 ~@2 gb3 ~ eb3 ab3 ~ gb3@4 eb3 ~@2 db3 ~@2 eb3 ~@2 ab3 ~@2 ab3 ~ gb3 ab3 ~ gb3 eb3 ~ gb3]/2",
  F: "~@3 db3 ~@2 eb3 ~@2 db3 ~@2 eb3 ~@2 db3 ~@2 gb3 ~ eb3 ab3 ~ gb3",
  G: "~@3 db3 ~@2 eb3 ~ db3 eb3 ~@2 gb3 ~@2 eb3 ~@2 ab3 ~ gb3 eb3 ~ gb3",
  H: "~@2 eb3 ~@2 gb3 ~@2 ab3 ~@2 gb3 ~@2 eb3 ~@2 db3 ~@2 db3 eb3 ~ db3",
  I: "~@2 eb3 ~@2 gb3 ~@2 eb3 ab3 ~@2 gb3 ~@2 eb3 ~@2 db3 ~@2 eb3 ~@2",
  J: "~@3 eb3 ~@2 db3 ~ eb3 ~@3 eb3 ~@4 gb3 ~@2 eb3 ab3 ~ gb3",
  K: "~@3 eb3 ~@2 db3 ~@2 eb3 ~@2 gb3 ~@2 ab3 ~@2 gb3 ~@2 db3 ~ eb3",
  L: "~@2 db3 eb3 ~@2 db3 ~@2 eb3 ~@2 gb3 ~@2 ab3 ~@2 gb3 ~@2 db3 ~ eb3",
  M: "~@2 db3 eb3 ~@2 db3 ~@2 eb3 ~@2 bb3 ~@2 ab3 ~@2 gb3 ~@2 db3 ~ eb3",
  N: "~@2 db3 eb3 ~@2 db3 ~@2 eb3 ~@2 gb3 ~@2 ab3 ~@2 gb3 ~@4 eb3",
  O: "~@2 db3 eb3 ~@2 db3 ~@2 eb3 ~@2 bb3 ~@2 ab3 ~@2 gb3 ~@2 ab3 ~ gb3", P: "~@3 eb3 ~@4 db3 eb3 ~@2 db3 ~@4 eb3 ~@6",
  Q: "~@3 db3 ~ eb3 ~@2 db3 eb3 ~@2 ab3 ~@2 gb3 ~@2 ab3 ~ gb3 eb3 ~@2",
  R: "~@2 bb3 ~@2 bb3 ~@2 bb2 ~@3 b2 ~ b3 ~@2 b3 ~@2 b2 ~@2 bb3",
  S: "bb2 ~ bb3 ~@2 bb3 ~@2 bb2 ~@2 a3 a2 ~ a3 ~@2 a3 ~@2 a2 ~@2 ab3",
  T: "ab2 ~ ab3 c3 ~@2 db3 ~@2 d3 ~@2 eb3 ~@2 gb3 ~@2 ab3 ~@2 a3 ~@2", U: "bb3 ~@23",
  V: "~@3 eb3 ~@4 db3 eb3 ~ gb3 ~@2 db3 eb3 ~ gb3 ~@3 ab3 ~ gb3",
  W: "~@2 db3 eb3 ~@2 eb3 ~@2 db3 ~@4 db3 eb3 ~@2 gb3 ~@5", X: "~@2 db3 eb3 ~@4 db3 eb3 ~@2 gb3 ~@4 ab3 ~@3 gb3 ~@2",
  Y: "~@2 db3 eb3 ~@4 db3 eb3 ~@5 gb3 ~@2 ab3 ~ gb3 eb3 ~ gb3",
})).s("gm_electric_guitar_muted").gain(0.32).pan(0.8)

// drums · kick
const kick = s("bd").struct(`<
  ~ A@9 B A C A B A C A B A C A B A C A B D E A B A C A B A C A B A C A B A C A B A C A B D E A B A C A B D E A B A C A
  B A C A B A C A B A C A B A C A B D E A B A C A B A C A B A C A B A C F ~
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x!4", C: "x ~ x!3 ~ x ~", D: "x ~@4 x ~@3 x ~@7 x ~@5 x", E: "~@23 x", F: "x",
})).gain(0.64)

// drums · clap
const clap = s("cp").struct("<~ A@26 ~@2 A@22 ~@2 A@6 ~@2 A@22 ~@2 A@16 ~@2>".pickRestart({
  A: "~ x ~ x",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct("<~ A@26 B C A@22 B C A@6 B C A@22 B C A@16 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2 x ~ x ~", C: "x ~@8 x ~@4 x ~@9",
})).gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@27 A B ~@22 A B ~@6 A B ~@22 A B ~@18>".pickRestart({
  A: "~@7 x", B: "~@5 x",
})).gain(0.52)

// drums · hihat
const hihat = s("hh").struct(`<
  A B C@3 B C@3 D E@3 D E@3 D E@3 D E@3 D E ~@2 D E@3 D E@3 D E@3 D E@3 D E@3 D E ~@2 D E@3 D E ~@2 D E@3 D E@3 D E@3 D
  E@3 D E@3 D E ~@2 D E@3 D E@3 D E@3 D E@3 ~@2
>`.pickRestart({
  A: "x!4", B: "~@3 x ~@2 x ~ x!2 ~@2 x ~@2 x ~@2 x ~@2 x ~ x", C: "x ~@2 x ~@2 x ~ x!2 ~@2 x ~@2 x ~ x!2 ~@2 x ~@2",
  D: "~ x!7", E: "x!8",
})).gain(0.45)

// drums · mid tom
const mid_tom = s("mt").struct("<~@27 A B ~@22 A B ~@6 A B ~@22 A B ~@18>".pickRestart({
  A: "~@5 x", B: "~@5 x!2 ~",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 B ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 B ~@3 A ~@3 B ~@3 A ~@3 A ~@3 A ~@3 A ~@3
  A ~@3 B ~@3 A ~@3 A ~@3 A ~@3 A ~@3
>`.pickRestart({
  A: "~@17 x ~@6", B: "~ x!5 ~@2",
})).gain(0.45)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~ A@3 ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~ A@3 ~@3 A ~ A@3 ~@3 A ~@3 A ~@3 A ~@3 A
  ~@3 A ~ A@3 ~@3 A ~@3 A ~@3 A ~@3 A ~
>`.pickRestart({
  A: "x",
})).gain(0.45)

// drums · ride
const ride = s("rd").struct("<~@101 [~@6 x ~@8 x ~@7 x] ~>").gain(0.39)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@25 A@4 B C D B A@4 B C D B A@4 B C D B A@4 B C D B A@4 B C D B A@4 B C D B A@4 B C D B A@4 B C D B@2 C D B@2 C D B@2
  C D B ~@2
>`.pickRestart({
  A: "~ x ~ x", B: "x!4", C: "x ~@2 x ~@2 x ~@4 x!2 ~@5 x ~@5", D: "x ~@5 x ~@5 x ~ x ~@3 x ~@2 x ~ x",
})).gain(0.52)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct(`<
  ~@29 A B C A ~@4 A B C A ~@4 A B C A ~@4 A B C A ~@4 A B C A ~@4 A B C A ~@4 A B C A ~@4 A B C A@2 B C A@2 B C A@2 B C
  A ~@2
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~@3 x ~ x ~ x", C: "~ x ~ x ~ x ~@2",
})).gain(0.26)

stack(
  piano, bass, clavinet, brass_section, electric_guitar_muted, kick, clap, snare, low_tom, hihat, mid_tom, open_hat,
  crash, ride, tambourine, tambourine_soft
)

More by Stevie Wonder