Strudelify

Purple People Eater

Sheb Wooley

KeyF minorTempo145 bpm
0:00/0:00
// Purple People Eater — Sheb Wooley
// 145 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 7 "Strings (BB)" named as a string part, played on string ensemble 1 (its drawbar organ patch is not one)
// note: Full arrangement: all 52 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(145/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.

// bass · acoustic bass · "Bass    (BB)"
const bass = note(`<
  ~@2 A B C D E F G H I J A K I L A M A B N D E O P Q I R A S I R A M A B L D E O G T I J A U V O A W X Y
>`.pickRestart({
  A: "ab2@3 ~ ab2@3 ~ eb2@4 f2 ~ ab2 ~", B: "ab2@3 ~ ab2@3 ~ eb2@4 f2 ~ eb2 ~", C: "ab2@3 ~ c3@4 eb3@4 c3 ~ g2 ~",
  D: "eb2@3 ~ eb2@3 ~ bb1@4 c2 ~ g2 ~", E: "ab2@4 c2@4 eb2 ~ eb2@2 f2@2 eb2@2", F: "ab2@4 c3@4 eb3@2 eb3 ~ eb3@4",
  G: "db2@4 f1@4 ab1 ~ ab1@2 bb1@2 d2@2", H: "eb2@4 c2@4 bb1 ~ bb1@2 c2@2 bb2@2", I: "eb2@3 ~ eb2@3 ~ bb1@4 c2 ~ eb2 ~",
  J: "ab2@3 ~ c3@4 eb3@4 c3 ~ f2 ~", K: "eb2@3 ~ g2@4 bb2@4 g2 ~ c2 ~", L: "ab2@3 ~ c3@4 eb3@4 c3 ~ eb3 ~",
  M: "bb1@3 ~ db2@4 f2@4 db2 ~ f2 ~", N: "ab2@3 ~ c3@4 eb3@4 c3 ~ c2 ~", O: "ab2@4 c3@4 eb3@2 eb3 ~ f2@4",
  P: "db2@4 f1@4 ab1 ~ ab1@2 bb1@2 f2@2", Q: "eb2@4 c2@4 bb1 ~ bb1@2 c2@2 g2@2", R: "ab2@3 ~ c3@4 eb3@4 c3 ~ c3 ~",
  S: "eb2@3 ~ g2@4 bb2@4 g2 ~ g2 ~", T: "eb2@4 g2@4 bb2@2 bb2 ~ g2@4", U: "eb2@4 db2@3 ~ c2@4 g2@3 ~",
  V: "eb2@4 g1@4 bb1 ~ bb1@2 c2@2 eb2@2", W: "bb1@3 ~ bb1@3 ~ f1@4 g1 ~ f2 ~",
  X: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ b2 ~ c3@2", Y: "ab2",
})).s("gm_acoustic_bass").gain(0.64)

// chords · piano · "Piano   (BB)"
const piano = note(`<
  ~@2 A B@2 C B@2 D E F G A H F I A J K B@2 F B@2 L H F G A H C I A J K B@2 F B@2 L H F G A H F G A M N O
>`.pickRestart({
  A: "[ab4,c5,eb5,ab5] ~@5 c5@5 ~ db5@4, ~@4 ab4@11 ~, ~@3 [eb5,ab5]@5", // Ab Ab5
  B: "[[ab4,c5,eb5,ab5] ~@5 c5@5 ~ db5@4 c5@2 eb5@2 ~@2 ab5@2 ~@4 bb5@2 ab5 ~, ~@4 ab4@11 ~ ab4@14 ~@2, ~@6 ab5@14 ~@2 eb5 ~@3 [eb5,ab5]@4 ~@2, ~@6 eb5@11 ~@3 c5@11 ~]/2", // Ab Ab5
  C: "[bb3,eb4,g4,db5] ~@5 eb4@4 bb3@2 f4@2 bb3 ~, ~@4 bb3@5 ~@7, ~@3 [g4,db5]@5", // Eb7 Gdim
  D: "[f4,ab4,db5,f5] ~@5 ab4@4 f4@2 bb4@2 f4 ~, ~@4 f4@5 ~@7, ~@3 [db5,f5]@5", // Db
  E: "eb4@4 ~@2 eb4@4 bb3@2 f4 ~ bb3 ~, [g4,db5]@15 ~, bb3@3 ~ bb3@4 ~@8", // Gdim
  F: "[bb3,eb4,g4,db5] ~@5 eb4@5 ~ f4@4, ~@4 bb3@11 ~, ~@3 [g4,db5]@5", // Eb7 Gdim
  G: "c5@2 eb5@2 ~@2 ab5@2 ~@4 bb5@2 ab5 ~, ab4@7 ~, ab5@5 ~ eb5 ~@3 [eb5,ab5]@4 ~@2, eb5 ~@3 c5@11 ~", // Ab5
  H: "eb4@2 g4@2 ~@2 db5@2 ~@4 c5@2 bb4 ~, bb3@7 ~, db5@5 ~ g4 ~@3 [g4,db5]@4 ~@2, g4 ~@3 eb4@11 ~", // Gdim
  I: "c5@4 ~@2 c5@4 ab4@2 db5 ~ ab4 ~, [eb5,ab5]@15 ~, ab4@3 ~ ab4@4 ~@8", // Ab5
  J: "f4@2 ab4@2 ~@2 db5@2 ~@4 c5@2 bb4 ~, bb3@7 ~, db5@5 ~ ab4 ~@3 [ab4,db5]@4 ~@2, ab4 ~@3 f4@11 ~", // Db5
  K: "[ab4,c5,eb5,ab5] ~@5 c5@4 ab4@2 db5@2 ab4 ~, ~@4 ab4@5 ~@7, ~@3 [eb5,ab5]@5", // Ab Ab5
  L: "[f4,ab4,db5,f5] ~@5 ab4@5 ~ bb4@4, ~@4 f4@11 ~, ~@3 [db5,f5]@5", // Db
  M: "[bb3,f4,ab4,db5] ~@5 f4@5 ~ g4@4, ~@4 bb3@11 ~, ~@3 [ab4,db5]@5", // Bbm7 Db5
  N: "[ab4,c5,eb5,ab5,c6] ~@3 eb8 [ab7,bb7,c8,db8] [eb7,ab7,bb7] [c7,db7] [ab6,bb6] [eb6,ab6,bb6] [c6,db6] [ab5,bb5] [eb5,ab5] [c5,db5] [ab4,bb4]!2", // Ab Dbmaj7 Ebsus4 Dbmaj7 Absus2 Ebsus4 Dbmaj7 Absus2 …
  O: "[ab4,c5,eb5,ab5]", // Ab
})).s("gm_piano").gain(0.15).pan(0.7)

// chords · electric guitar clean · "Guitar  (BB)"
const electric_guitar_clean = note(`<
  ~@2 A@2 B C D@2 E F G B A H C I A J K A B G D@2 E F G B A H C I A J K A B G D@2 E F G B K L M N A O P Q
>`.pickRestart({
  A: "[ab2,c4] ~ [ab2,c4] ~ g3@2 ab3 ~ [ab2,c4] ~ ab2 ~ [ab2,db4] ~ ab2 ~", // Ab Db5
  B: "[ab2,c4] ~ ab2 ~ [ab2,db4] ~ [ab2,c4] ~ ab2 ~ [ab2,c4] ~ [ab2,db4] ~ [ab2,c4] ~", // Ab Db5 Ab Db5 Ab
  C: "[eb2,eb3] ~ [eb2,eb3] ~ [eb2,c3] ~ [eb2,db3] ~@3 [eb3,g3]@6, ~ eb2", // Eb Cm Eb7 Eb
  D: "[[ab2,eb3]@2 ab2 ~ [ab2,f3] ~ ab2 ~ [ab2,eb3] ~ ab2 ~ [ab2,f3] ~ [ab2,eb3]@4 ab2 ~ [ab2,f3] ~ ab2 ~ [ab2,eb3] ~ ab2 ~ [ab2,f3] ~ ab2 ~]/2", // Ab5 Db Ab5 Db Ab5 Db Ab5 Db
  E: "[db3,ab3]@2 db3 ~ [db3,bb3] ~ db3 ~ [db3,ab3] ~ db3 ~ [db3,bb3] ~ [db3,ab3]@2", // Db5 Gb Db5 Gb Db5
  F: "[eb3,bb3]@2 eb3 ~ [eb3,c4] ~ eb3 ~ [eb3,bb3] ~ eb3 ~ [eb3,c4] ~ eb3 ~", // Eb5 Cm Eb5 Cm
  G: "[eb2,eb3] ~ [eb2,eb3] ~ c3@2 db3 ~ [eb2,eb3] ~ eb2 ~ [eb2,f3] ~ eb2 ~", // Eb Ebsus2
  H: "[eb2,eb3] ~ eb2 ~ [eb2,f3] ~ [eb2,eb3] ~ eb2 ~ [eb2,eb3] ~ [eb2,f3] ~ [eb2,eb3] ~", // Eb Ebsus2 Eb Ebsus2 Eb
  I: "[ab2,c4,eb4]@2 ab2@2 g3@2 ab3 ~@5 g3@2 ab3@2, ~@2 c4 ~, ~@5 eb4@3", // Ab
  J: "[bb2,f3] ~ bb2 ~ [bb2,g3] ~ [bb2,f3] ~ bb2 ~ [bb2,f3] ~ [bb2,g3] ~ [bb2,f3] ~", // Bb5 Eb Bb5 Eb Bb5
  K: "[ab2,c4] ~ [ab2,c4] ~ [ab2,g3] ~ [ab2,ab3] ~@3 [c4,eb4]@6, ~ ab2", // Ab Abmaj7 Ab Cm
  L: "[eb2,eb3,g3]@2 eb2@2 c3@2 db3 ~@5 c3@2 db3@2, ~@2 eb3 ~, ~@5 g3@3", // Eb
  M: "[eb3,bb3]@2 eb3 ~ [eb3,c4] ~ eb3 ~ [eb3,bb3] ~ eb3 ~ [eb3,c4] ~ [eb3,bb3]@2", // Eb5 Cm Eb5 Cm Eb5
  N: "[ab2,eb3]@2 ab2 ~ [ab2,f3] ~ ab2 ~ [ab2,eb3] ~ ab2 ~ [ab2,f3] ~ ab2 ~", // Ab5 Db Ab5 Db
  O: "[bb2,f3] ~ [bb2,f3] ~ db3@2 db3 ~ [bb2,f3] ~ bb2 ~ [bb2,g3] ~ bb2 ~", // Bb5 Eb
  P: "[ab2,c4,ab4] ~ [ab2,c4] ~ [ab2,c4] ~ [ab2,c4] ~ [ab2,c4] ~ [ab2,c4] ~ [ab2,c4] ~ [ab2,c4] ~", Q: "[ab2,ab3,c4]",
})).s("gm_electric_guitar_clean").gain(0.14)

// chords · string ensemble 1 · "Strings (BB)"
const string_ensemble_1 = note(`<
  ~@2 A@2 B C D E F G C B A H C I A J A@2 B C D E F G C B A H C I A J A@2 B C D E F G C B A H K E A L M N
>`.pickRestart({
  A: "~@4 [ab2,c4,eb4]@5 ~ [ab2,c4,eb4] ~@5", B: "[ab2,c4,eb4]@5 ~ [ab2,c4,eb4] ~@3 [ab2,c4,eb4] ~@5",
  C: "~@4 [eb2,eb3,g3]@5 ~ [eb2,eb3,g3] ~@5", D: "ab2 ~ [ab2,eb3,ab3] ~@3 c3@4 eb3 ~ ab3@4",
  E: "eb3@6 [ab2,eb3,ab3] ~@3 [ab2,eb3,ab3] ~@3 ab2@2", F: "db3 ~ [db3,ab3,db4] ~@3 f3@4 ab3 ~ db4@4",
  G: "bb3@6 [eb3,bb3,db4] ~@3 [eb3,bb3,db4] ~@3 db3@2", H: "[eb2,eb3,g3]@5 ~ [eb2,eb3,g3] ~@3 [eb2,eb3,g3] ~@5",
  I: "[ab2,c4,eb4]@5 ~ [ab2,c4,eb4] ~@3 [ab2,c4,eb4] ~ ab3@2 c4 ~", // Ab
  J: "[bb2,f3,ab3]@5 ~ [bb2,f3,ab3] ~@3 [bb2,f3,ab3] ~@5", K: "eb3 ~ [eb3,bb3,db4] ~@3 g3@4 bb3 ~ db4@4",
  L: "~@4 [bb2,f3,ab3]@5 ~ [bb2,f3,ab3] ~@5", M: "[ab2,c4,eb4] ~ ab2 ~ ab3@2 c4@2 eb4@2 c4 ~ g3 ~ ab3 ~",
  N: "[ab2,c4,eb4]", // Ab
})).s("gm_string_ensemble_1").gain(0.15).pan(0.1)

// other · acoustic bass · "Soloist (BB)"
const acoustic_bass = note(`<
  ~@3 A B C D E F G ~@3 H ~ I J K ~ L M N O ~ P Q R S T U ~ L M V W ~ X Y Z AA AB AC ~ AD AE AF AG S AH AI ~@2
>`.pickRestart({
  A: "~@6 bb4 c5 db5 ~ eb5 ~ f5@3 eb5, ~@12 e5 ~@3", B: "c5@2 ~ db5@4 c5 ~@8, ~ eb5 ~@6", C: "~@10 db5!2 eb5!2 f5 eb5",
  D: "f5 gb5 ~ eb5 ~ g5 ab5 gb5@2 f5 ~ eb5@2 f5@2 eb5", E: "c5@4 ~@2 bb4 c5 ab4 ~@2 gb4 ~ e4 ~ bb4",
  F: "~@9 f4 eb4 ab4 ~ f4 ~@2", G: "g3!2 bb3!2 db4!2 f4!2 eb4!2 f4!2 g4!2 ab4!2",
  H: "~ bb4 c5 bb4 eb5 f5 ~ c5 ~ c5 eb5 ~@2 f5 ~ f5", I: "~@7 b4 c5 ~ eb5 ~ db5@2 c5 ~",
  J: "db5 eb5 f5 gb5 ab5 a5 ab5 g5 ~@2 eb5 ~ f5 ~ [a5,bb5] ~", K: "ab5@3 f5@8 ~@5", L: "~@9 c5 bb4 eb5 ~ c5 ~@2",
  M: "gb4 ab4 f4 gb4 ab4 bb4 c5 db5 ~@8", N: "~@7 c5 eb5 c5 f5 c5 gb5 g5 ~@2", O: "d5 eb5@6 f5 eb5 c5 ~ bb4 ~@4",
  P: "~@10 eb4 ~ f4 eb4 b3 ~", Q: "~ bb3 ~ g3 c4 ~@2 eb4 ~ f4 ~@2 gb4 ~ eb4 ab4", R: "~ bb4 f4 ~@13",
  S: "~@7 b3 c4 ~ eb4 ~ db4@2 c4 ~", T: "db4 eb4 f4 gb4 ab4 a4 ab4 g4 ~@6 db5!2", U: "bb4 ~ bb4@3 ~@11",
  V: "~@2 db5 ~@3 eb5 db5 ~@2 db5 c5 ~@2 c5 ~", W: "db5 ~ eb5 ~ e5@2 gb5 ~@9", X: "~@12 db5 d5 f5 e5",
  Y: "~ eb5 ~ eb5!2 ~ eb5 ~ eb5 ~ eb5 ~ eb5 ~ eb5!2", Z: "c5 ~@2 ab4 ~@12",
  AA: "~ eb4 f4 eb4 ab4 bb4 ~ f4 ~ f4 ab4 ~@2 bb4 ~ bb4", AB: "~@2 db5!2 e5 f5 ab5 ~@9",
  AC: "~@6 bb5 a5 ab5 g5 gb5 f5 e5 f5 ~@2", AD: "~@4 eb5 f5 ab5 f5 gb5 bb5 eb5 ~ ab5 ~ gb5 bb5", AE: "~@13 f5 db5 ~",
  AF: "f4 ~ gb4 g4 bb4 a4 ab4 gb4 g4 eb4 ~ e4 f4 db4 ~ d4", AG: "~ eb4 bb3 bb4 ~ bb4 eb4 db4 ~@8",
  AH: "db4 eb4 f4 gb4 ab4 a4 ab4 g4 ~@8", AI: "~@2 bb4!2 db5@2 ~ e5 f5 eb5 ~ db5 ~@2 bb4 ~",
})).s("gm_lead_8_bass_lead").gain(0.22).pan(0.8)

// other · acoustic bass · "Soloist (BB)" · soft notes
const acoustic_bass_soft = note("<~@6 A B C ~@10 D ~@2 E ~ F G H ~ I ~@2 D ~ J ~@4 K ~@4 L M N ~@3 O ~@2>".pickRestart({
  A: "~@2 f5 ~@13", B: "~@12 eb4 ~ f4 ~", C: "~@15 bb3", D: "~@15 f4", E: "~@13 ab4 ~@2", F: "~@11 b3 ~@4",
  G: "~@11 eb4 ~@4", H: "db4 ~@15", I: "~@15 eb5", J: "~@3 c5 bb4 ~@3 c5 ~@3 bb4@2 ~@2", K: "~ bb4 ab4 ~@13",
  L: "~@11 f5 ~ f5 ~@2", M: "~@15 [gb4,bb4]", N: "~ eb4 ~@14", O: "~@6 bb4 ~@5 bb4 ~@3",
})).s("gm_lead_8_bass_lead").gain(0.14).pan(0.8)

// drums · kick
const kick = s("bd").struct("<~@2 [x!2]!48 [x!4] x>").gain(0.6)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@2 A B@2 A B A B A B A B@6 A B A@2 B A B A B A B@6 A B A@2 B A B A B@3 A B A@3 ~@2
>`.pickRestart({
  A: "~@5 x ~ x", B: "~@5 x ~@2",
})).gain(0.36)

// drums · rim
const rim = s("rim").struct("<[x!2] [x!4] ~@50>").gain(0.42)

// drums · snare
const snare = s("sd").struct("<~@2 A@4 B@3 C A@10 D@2 B@4 A D A@8 E C B F B@2 A@3 D B G H A I J>".pickRestart({
  A: "~@2 x!2 ~@2 x ~", B: "~ x ~ x", C: "~@2 x!3 ~ x!3 ~ x!3 ~ x ~", D: "x!5 ~ x ~@5 x ~@3",
  E: "~@2 x!3 ~ x!3 ~ x!3 ~@3", F: "x!5 ~@7 x ~@3", G: "~@2 x!3 ~@7 x ~@3", H: "~@2 x!3 ~ x ~@5 x ~@3", I: "~ x!7",
  J: "x",
})).gain(0.6)

// drums · clap
const clap = s("cp").struct("<~@2 A B@2 A@5 B A B@6 A B A@6 B A B@6 A B A@6 B@3 A@5 B C>".pickRestart({
  A: "~@2 x!2 ~@2 x ~", B: "~@2 x!2 ~@4", C: "x",
})).gain(0.48)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@2 A ~@2 B ~@5 C ~@6 A ~ D@2 ~@3 B ~ D ~@6 A ~@4 D ~ B ~@3 D ~ B ~ A E F
>`.pickRestart({
  A: "~@15 x", B: "~@7 x", C: "~@14 x!2", D: "~@12 x!4", E: "~@6 x!2", F: "x",
})).gain(0.54)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@2 A ~@2 B ~@5 B ~@6 A ~ C@2 ~@3 B ~ C ~@6 A ~ D ~@2 C ~ B ~@3 C ~@2 A@2 E ~
>`.pickRestart({
  A: "~@10 x!3 ~ x ~", B: "~@10 x!3 ~@3", C: "~@8 x!4 ~@4", D: "~@7 x", E: "~@3 x!3 ~@2",
})).gain(0.48)

// drums · open hat
const open_hat = s("oh").struct("<~@2 A ~@2 A ~@5 B@2 ~@2 B ~@2 B C B ~@6 B ~@5 C ~@9 B C B ~@2 B ~@3>".pickRestart({
  A: "~@3 x ~@3 x", B: "~@7 x", C: "~@3 x ~@4",
})).gain(0.54)

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

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

// drums · ride
const ride = s("rd").struct("<~@6 A B@3 ~@12 B@4 ~@12 A@2 B@2 ~@4 A B ~@4>".pickRestart({
  A: "~ x ~ x!3 ~ x", B: "x!2 ~ x!3 ~ x",
})).gain(0.42)

// drums · tambourine
const tambourine = s("tb").struct("<~@2 [x!8]!48 [x ~ x!14] x>").gain(0.36)

// drums · congas
const congas = s("conga:18").struct("<~@47 [~@6 x!3 ~@7] ~@4>").gain(1.54)

stack(
  bass, piano, electric_guitar_clean, string_ensemble_1, acoustic_bass, acoustic_bass_soft, kick, kick_soft, rim, snare,
  clap, low_tom, hihat, mid_tom, open_hat, high_tom, crash, ride, tambourine, congas
)