Strudelify

booty swing

Parov Stelar

KeyD minorTempo115 bpm
0:00/0:00
// booty swing — Parov Stelar
// 115 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5860628; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 76 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(115/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// 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(`<
  A@3 B C@3 D C@3 E F G H I F J H K C@3 L M N M O P M@2 Q R S T S U V U W M@3 X F G H I F J H K C@3 L M N M O P M@2 Q R
  S T S U V U W M@3 Y
>`.pickRestart({
  A: "d2 ~ [a3,d4,f4] ~ f2 ~ [a3,d4,f4] ~ e2 ~ [a3,d4,g4] ~ a1 ~ [a3,d4,g4] ~", // Dm Dsus4
  B: "d2 ~ [a3,d4,f4] ~ f2 ~ [a3,d4,f4] ~ e2 ~ [a3,d4,g4] ~ a1 ~@3", C: "d2 [d3,f3] f2 [d3,f3] e2 [d3,g3] a2 [d3,g3]",
  D: "d2 [d3,f3] f2 [d3,f3] e2 [d3,g3] a1@2", E: "d2 f2 e2 a1",
  F: "[d2,ab5]@2 [d3,f3,g5]@2 g5 f5 [d3,f3]@2 [e2,ab5]@2 g5 ~@2 ab5 [db3,e3,g5]@2, ~@2 f2 ~@2 [db3,e3] a2 ~, ~@11 g5@2 ~@3", // Ddim G7 Dm E Dbdim Dbm
  G: "[d2,ab5]@2 [d3,f3,g5]@2 g5 ~@2 f5 e5 ~@3 a2@2 [db3,e3]@2, ~@2 f2 [d3,f3] e2 [db3,e3] ~@2, ~@5 f5@2 ~@2 f5@2 e5@3 ~@2", // Ddim G7 Dbm Dm Dbm
  H: "[d2,ab5]@2 [d3,f3,g5]@2 g5 f5 [d3,f3]@2 [e2,ab5]@2 g5 ~@2 ab5 g5 f5, ~@2 f2 ~@2 [db3,e3] a2 [db3,e3], ~@11 g5@2 ~@3", // Ddim G7 Dm E Dbm
  I: "d5 a4 [d3,f3,a4]@2 a4 ~ [d3,f3]@2 [e2,e5]@2 [db3,e3,db5]@2 a2@2 [db3,e3]@2, d2 ~ f2 ~@5, ~@5 d5@3 ~@4 g5@4", // Dm E Dbm
  J: "[d2,ab5]@2 [d3,f3,g5]@2 g5 ~@2 f5 e5 ~@2 e5 a2@2 [db3,e3]@2, ~@2 f2 [d3,f3] e2 [db3,e3] ~@2, ~@5 f5@2 ~@2 f5@2 ~ a5@4", // Ddim G7 Dbm Dm Dbm
  K: "d5 a4 [d3,f3,a4]@2 a4 ~ [d3,f3]@2 [e2,e5]@2 [db3,e3,db5]@2 [a2,g5]@2 [db3,e3]@2, d2 ~ f2 ~@5, ~@5 d5@3 ~@8", // Dm E Dbm A7 Dbm
  L: "d2 [d3,f3] f2 [d3,f3] [e2,e3]@2 [a1,a2]@2", M: "d2 d3 f2 f3 e2 e3 a1 a2", N: "d2 d3 f2 f3 e2 e3 a1 ~",
  O: "d2@2 d3@2 f2@2 f3@2 e2@2 e3@2 f5 c6 [a2,d6]@2, ~@6 a1 ~", // D5
  P: "[d2,f5]@2 ~ f5 d5 ~ f3@2 [e2,a4]@2 d5 f5 a5 f5 [a2,d5]@2, ~ d3 f2 ~@2 e3 a1 ~, ~@5 a4@3 ~@8", // Dm A5 D5
  Q: "[e5,f5] [c5,db5,d5,eb5] [ab4,a4,bb4,b4] [e4,f4,gb4,g4] [d3,d4]@4 d2@3 d2@2 d2@3, d3@2 d3@2 eb4 ~@11", // Fmaj7 D
  R: "[d2,d3] [c2,c3]", S: "[b1,b2] [bb1,bb2]", T: "[d2,d3]@4 [c2,c3]@3 [g1,g2]", U: "d2@2 d3 d2 c2@2 c3 c2",
  V: "b1@2 b2 b1 bb1@2 bb2 bb1", W: "~ [b1,b2]@2 [b1,b2]@2 [bb1,bb2] [bb1,bb2]@2", X: "d2 d3 f2 f3 e2@2 a1@2",
  Y: "f3 ~ f3 ~ d3@4 [d2,d3]@3 [d2,d3]@2 [d2,d3]@3", // D
})).s("gm_piano").gain(0.3)

// other · trumpet · "B♭ Trumpet"
const trumpet = note(`<
  ~@3 A B ~ C ~ D ~ C E ~@2 F G ~ H ~ I J ~ C K L@4 M L@2 N ~@4 O P Q R L@2 S T ~@2 F G ~ H ~ I J ~ C K L@4 M L@2 N ~@4
  O P Q R L@3 U
>`.pickRestart({
  A: "~@7 a4", B: "ab4@2 a4@2 ~@2 d4@2 g4@2 e4 g4@4 ~", C: "a4 a4@2 a4@3 f4@2 g4 g4@2 g4@3 e4@2",
  D: "~ a4@2 f4 a4@2 f4@2 g4@2 e4@2 g4@3 ~", E: "f4@2 f4@2 f4@2 f4@2 f4@2 e4 d4 g4@3 d4", F: "~@13 ab4 g4 f4",
  G: "d4 a3 a3@2 a3 d4@3 e4@2 db4@2 g4@4", H: "~@8 e4 f4@2 e4 a4@4", I: "~@15 a4",
  J: "a4@2 f4@2 a4@2 f4@2 g4@2 e4 g4@3 e4@2", K: "f4@2 f4@2 f4@2 f4@2 f4@2 e4 d4 ~@4", L: "f5@4 d5@2 ~@6 f4 c5 d5@2",
  M: "f5@3 f5 d5 a4@3 a4@2 d5 f5 a5 f5 d5@2", N: "~@8 a3@3 a3@2 a3@3", O: "a4 a4@2 f4@3 a4@2 g4@2 g4@2 e4@4",
  P: "f4@2 d4@2 f4@2 d4 f4@2 d4 f4@4 a4 f4", Q: "a4@2 f4@2 a4@2 a4 f4 g4@2 g4@2 e4@4",
  R: "f4@2 d4@2 f4@2 f4@2 f4!2 d4@2 d4@4", S: "f5@4 d5@2 a4!2 ~@4 f4 c5 d5@2", T: "f5@2 d5 ~@5",
  U: "f4 ~ f4 ~ d4@4 d4@3 d4@2 d4@3",
})).s("gm_trumpet").gain(0.4).pan(0.3)

// other · trumpet · "B♭ Trumpet" · soft notes
const trumpet_soft = note("<~@32 A B C B ~@28 A B C B ~@8>".pickRestart({
  A: "d5 c5", B: "b4 bb4", C: "d5@4 c5@3 g4",
})).s("gm_trumpet").gain(0.2).pan(0.3)

// bass · acoustic bass · "Basse acoustique"
const bass = note("<~@11 A@13 B@4 A B@2 C D E F E G H G H B@4 A@12 B@4 A B@2 C D E F E G H G H B@3 ~>".pickRestart({
  A: "d2 f2 e2 a1", B: "~@2 e2 a1", C: "~@8 d2@3 d2@2 d2@3", D: "d2 c2", E: "b1 bb1", F: "d2@4 c2@3 g1",
  G: "d2@4 d2 c2@3", H: "b1@4 b1 bb1@3",
})).s("gm_acoustic_bass").gain(0.3)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@36 [x ~@2 x ~ x ~@2] [x ~@2 x ~@4] ~@30 [x ~@2 x ~ x ~@2] [x ~@2 x ~@4] ~@6>")
  .gain(0.15)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@36
  [~@2 x!2 ~@2 x ~]
  [~@3 x!2 ~ x ~@9]
  ~@30
  [~@2 x!2 ~@2 x ~]
  [~@3 x!2 ~ x ~@9]
  ~@6
>`).gain(0.2)

// drums · hihat
const hihat = s("hh").struct("<~@12 [x!8]!8 ~@24 [x!8]!8 ~@24>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@23 A ~@15 B ~@15 A ~@15 B ~@3 C>".pickRestart({
  A: "~@13 x!2 ~", B: "x ~@3 x ~@4 x!2 ~@2 x ~@2", C: "x",
})).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@21 A ~ B ~ A ~@3 A ~@11 A ~@11 A ~ B ~ A ~@3 A ~@11 A ~@2>".pickRestart({
  A: "~@9 x ~ x ~ x ~ x", B: "~@10 x!2 ~@4",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@24 A ~@14 B ~@16 A ~@14 B ~@3 C>".pickRestart({
  A: "x", B: "~@3 x ~ x!2 ~", C: "~ x ~@2",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct(`<
  ~@11 A ~@8 B C B D E C B@3 C B ~@6 F B G B C B H ~@8 B C B D E C B@3 C B ~@6 F B G B C H I
>`.pickRestart({
  A: "~@12 x ~ x!2", B: "x!8", C: "x!6 ~ x", D: "~@8 x!2 ~@2 x ~@3", E: "~ x!7", F: "~@4 x!4", G: "x!2 ~@6", H: "x!7 ~",
  I: "x",
})).gain(0.4)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@36 [x!8] [x!4 ~@4] ~@30 [x!8] [x!4 ~@4] ~@6>").gain(0.2)

stack(
  piano, trumpet, trumpet_soft, bass, kick, kick_soft, snare, snare_soft, hihat, mid_tom, open_hat, crash, ride,
  ride_soft
)