Strudelify

Boogieman

Victoria Williams

KeyF majorTempo160 bpm
0:00/0:00
// Boogieman — Victoria Williams
// 160 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 55 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(160/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 · "A.PIANO 1"
const piano = note("<A@4 B C D E F@4 G@2 H I J@2 K L@3 M@3 N O P@5 Q@2 R@2 S@2 M@3 N T U@5 Q@2 V W@3 ~>".pickRestart({
  A: "f2 ~@2 f2 [ab2,d3]@3 a2 c3@3 f2 d3@3 c3", B: "[f4,a4,c5,d5,f5]@2 ~ f2 [ab2,d3]@3 a2 c3@3 f2 d3@3 c3, f2 ~@15",
  C: "f2 ~ [g4,ab4,c5] f2 [ab2,d3,ab4,c5]@2 ab4 [a2,g4,c5] [c3,ab4,c5]@3 f2 [d3,d4]@3 [c3,c4], ~@4 g4 ~@3 g4@2 ~ f4@2 ~@3", // Abmaj7 Dm7b5 Am7 Fm D C
  D: "[f4,c5]@2 ~ bb2 db3@3 ~ f3@3 bb2 g3@3 f3, bb2 ~@3 g3 ~@2 d3@3 ~@6", // F5
  E: "bb2 ~@2 [bb2,g5,ab5,c6] [db3,ab5,c6]@3 [g5,ab5,c6] [f3,c6]@3 [bb2,f5] [g3,d5]@3 [f3,c5], ~@4 [g3,g5] ~@2 d3@3 ~@6, ~@4 [g5,ab5] ~@3", // C7 Dbmaj7 Abmaj7 F5 Bb5 G5 F5 G …
  F: "[[f5,c6]@2 ~ f2 [ab2,d3]@3 a2 c3@3 f2 d3@3 c3 a5@2 ~ c6 [ab2,d3,d6]@2 ~ a2 c3@3 [f2,c5] ~ d5@2 c3 c2 e5@2 c2 [eb2,a2,e5]@3 e2 [g2,d5]@3 c2 [a2,d5]@3 g2 c2@3 c3 [d2,c5]@3 d3 [eb2,bb4]@3 eb3 e2@3 [e3,bb4], f2 ~@14 ab5@2 ~@6 [c6,f6]@4 ~@4 eb5@2 ~@2 c6@2 ~@2 eb5@2 ~@2 bb5@2 ~@2 db5@2 ~@2 a5@2 ~@2 g5@2 ~@2 g5@2 ~@3, ~@16 f2 ~@2 f2@4 ~@5 d3@3 ~@17 c5@2 ~@14]/4", // F5 Abdim F5 A G5 D5 D7 Eb5 …
  G: "[[ab5,c6]@3 [f2,f5] [ab2,d3,d5]@3 [a2,c5] [c3,ab5]@3 f2 [d3,d5]@3 c3 f2 a5@2 [f2,c6] [ab2,d3,d6]@3 a2 c3@3 f2 [d3,d6]@3 [c3,c6], g5@2 ~@6 c6@5 ~@10 f6@8 ~, f2 ~@7 g5 ~@2 f5@2 ~@2 ab5@2 ~@6 c6@4 ~@5]/2", // Ab F Abdim Am Fm D F5 Abdim …
  H: "[ab6,c7]@3 [bb2,f6] [db3,g3,d6]@2 c6 d3 g5@2 f5 bb2 [g3,d5]@2 ~ f3, g6 ~@6 c5, bb2 ~@7 [f3,ab5,c6]@4 ~@4", // Ab Bb5 G G5 Fm
  I: "[bb2,g4] ~@2 bb2 [db3,d4]@3 c4 ab4 a4@2 [bb2,c5] [g3,d5]@3 [f3,c5], c5@4 g3 ~@2 d3@4 ~@5, ab4@3 f4@2 ~@3 f3@3 ~@5", // Eb Dmaj7 Bbsus2 G5 F5
  J: "[f5@3 f2 ab2@3 f5 [c3,a5,c6]@3 [f2,c5] [d3,ab5,b5]@3 c3 c2 ~@2 [c2,g5,ab5,c6] [g5,ab5,c6] ~@2 [e2,g5,ab5,c6] [g2,ab5,c6]@3 [c2,f5] [a2,d5]@3 [g2,c5,d5], f2 ~@2 c5@2 ~@10 [g5,a5,bb5]@3 ~@6 g5@2 ~@6, ~@4 d3 ~@2 a2@3 ~@10 [eb2,a2]@3 ~@9]/2", // F F5 Abdim Abmaj7 C Abmaj7 F5 D5 …
  K: "f2 ~@2 [f2,c5] [ab2,d3,g4]@3 a2 c3@2 ~ f2 [d3,d5]@3 [c3,f5], f5@4 ~@4 a4@7 ~, ~@2 d5@2 ~@3 ab4@2 ~ c5@2 ~@4", // F5 G D F5
  L: "[[f2,f4]@3 f3 [g2,g4]@3 g3 [ab2,ab4]@3 [ab3,ab5] ~@4 [bb2,bb4] ~@4 bb4 bb5 ~@7 bb4!2 ~ [bb4,bb5]@2 bb2 [f3,g3] ~@2 [d3,bb4] ~ b4@2 [bb2,f4] ~ [c5,g5]@2 [f3,f4], ~@3 f5@2 ~@2 g5@2 ~@3 [a2,a4]@5 ~@2 bb2@4 bb5 f3@3 bb5 g3@3 bb5 bb2@3 ~@13, ~@15 a3@2 ~ bb5@2 db3@16 db3@3 ~@9, ~@19 bb4 bb5@2 bb4 d3@13 ~@4 f3@3 ~ g3@3 ~, ~@20 g3@4 bb4 bb5 bb4 bb2 bb4 bb5@2 f3@5 ~@3 g5@4 ~@5]/3", // F G Ab Bb Fsus2 Gm Bb5 C5 …
  M: "[f2 [bb4,d5]@2 [f2,f4] [ab2,d3,ab4]@3 a2 [c3,f4]@3 f2 ~ c4@2 c3 f2 a3@2 f2 [ab2,d4]@3 a2 c3@3 f2 [d3,d4]@3 c3 bb2 ~@2 [bb2,g4,ab4,c5] [g3,g4,ab4] ~@2 [d3,g4,ab4,c5] [f3,ab4,c5]@3 [bb2,f4] [g3,d4]@3 [f3,c4], ~@4 c5@7 ~ d3@3 ab3@2 ~@3 d3 ~@15 [db3,c5]@3 ~@9, ~@7 a4@2 ~@2 d4@2 ~@6 c4@2 ~@2 f4@7 ~ c4@2 ~@7 g4@2 ~@6]/3", // Bb F Abdim F5 Abdim D C7 Abmaj7 …
  N: "[bb2,g5,ab5,c6] ~ [g5,ab5,c6] bb2 [db3,ab5,c6]@2 [g5,ab5,c6] d3 [f3,ab5,c6]@3 [bb2,f5] [g3,d5]@3 [f3,c5], ~@4 [g3,g5] ~@3 g5@2 ~@6", // C7 Abmaj7 Dbmaj7 Abmaj7 Fm Bb5 G5 F5 …
  O: "c3 ~@2 c3 [a3,eb6,g6] c6 ~ [e3,bb5] g5 [gb5,c6] ~ [c3,f5] [eb5,g5] c5 ~ [g3,bb4], ~@4 eb3@3 ~ g3@3 ~ a3@3 ~", // Am7b5 Edim Gbdim F5 Eb Gm
  P: "[g4 [gb4,c5] ~ [c3,f4] [eb4,g4] c4 ~ [d3,bb3] [g3,c4] ~@2 eb3 ~ g3@2 e3 f2 ~@16 f5 ~@14 [bb2,f5,f6]@3 ~@13 [bb2,g6,ab6,c7] ~@2 [bb2,g6,ab6,c7] [g3,g6,ab6,c7] ~@2 [g6,ab6,c7] [f3,g6,ab6,c7]@3 [bb2,f6] [g3,d6]@3 [f3,c6], c2@4 d2@4 eb2@3 f3@2 ~@2 ab3@2 ~@2 f4@5 c3@3 c4@13 [c3,a4,a5]@3 [f2,c5,c6] [d3,d5] d6@2 [c3,a4]@2 ~@3 db3@4 [f3,a5]@2 c6 bb2 [g3,d6]@2 c6 f3@2 ~@15, ~@12 e2@3 ~ a3@19 f4@14 ~@2 [f5,f6]@14 ~@15, ~@19 f2 d3@3 a2@8 [c3,f4,f5] f2 f4 f5 f2 [ab2,d3,g4,g5]@3 [a2,ab4,ab5]@10 ~@2 bb2@2 [g5,g6]@12 ~@15, ~@20 ab2@7 f2 d3 d4@20 ~@3 g3@3 [d3,ab5]@10 ~@3 db3@3 d3@3 ~@6]/5", // Gbdim F5 Eb Gm C5 Bb5 C7 Abmaj7 …
  Q: "[[f2,ab5] a5 ~ f2 [ab2,d3]@3 a2 c5 [a5,c6]@2 [f2,c5] [ab5,b5] ~@2 c3 c2 ~@2 [c2,g5] a2 [g5,ab5] ~ [e2,c6] c6 g5 ~ c2 ~ d5@2 [g2,c5], c6@2 ~@6 c3@3 ~ d3@3 g5@3 ~@2 eb2@3 ~ [g2,ab5]@3 f5@2 ~@3, ~@28 a2@3 ~]/2", // Fm Abdim Am F5 Abm C5 Abmaj7 C …
  R: "[f2 [f5,c6]@2 [f2,f4] d3 [a4,c5]@2 [a2,f5] ~ b4@2 [f2,f5] ~ f5 ~ [c3,ab4] [c4,a4]@3 ~ d3 d5@2 a2 c3@3 f2 d3@3 c3, ~@4 [ab2,eb4]@4 [c3,d4,ab4]@4 [d3,db4,g4]@4 f2 ~@2 [f2,c5]@2 ~@11, ~@12 bb4@2 ~ f5@3 ~@2 ab2@3 [f4,a4,c5,f5]@8 ~]/2", // F5 F Am Dm F Fm F Ab5 …
  S: "[[bb2,f4,g4,bb4,d5] [c4,d4,e4,a4] ~@3 bb4 bb5 ~@7 bb4!2 ~ [bb4,bb5]@2 bb2 [f3,g3] ~@2 [d3,bb4] ~ b4@2 [bb2,f4] ~ [c5,g5]@2 [f3,f4], ~@2 bb5@2 db3@11 bb5 bb2@3 ~@13, ~@3 bb2@4 bb5 f3@3 bb5 g3@8 ~@3 g5@4 ~@5, ~@3 bb4 bb5@2 bb4 d3@13 db3@3 ~@9, ~@4 g3@4 bb4 bb5 bb4 bb2 bb4 bb5@2 f3@5 ~@4 f3@3 ~ g3@3 ~]/2", // Gm7 Am Bb Fsus2 Gm Bb5 C5 F
  T: "[c3,eb6,g6] c6 ~ [c3,bb5] [a3,g5] [gb5,c6] ~ [e3,f5] [eb5,g5] c5 ~ [c3,bb4] g4 [gb4,c5] ~ [g3,f4], ~@4 eb3@3 ~ g3@3 ~ a3@3 ~", // Cm C7 A7 Gbdim Fmaj7 Eb C7 Gbdim …
  U: "[[eb4,g4] c4 ~ [c3,bb3] [g3,c4] [gb3,c4] ~ [d3,f3,c4] eb2@3 eb3 ~ g3@2 e3 f2 ~@16 f5 ~@14 [bb2,f5,f6]@3 ~@13 [bb2,g6,ab6,c7] ~@2 [bb2,g6,ab6,c7] [g3,g6,ab6,c7] ~@2 [g6,ab6,c7] [f3,g6,ab6,c7]@3 [bb2,f6] [g3,d6]@3 [f3,c6], c2@4 d2@4 eb3 ~@2 f3@2 ~@2 ab3@2 ~@2 f4@5 c3@3 c4@13 [c3,a4,a5]@3 [f2,c5,c6] [d3,d5] d6@2 [c3,a4]@2 ~@3 db3@4 [f3,a5]@2 c6 bb2 [g3,d6]@2 c6 f3@2 ~@15, ~@12 e2@3 ~ a3@19 f4@14 ~@2 [f5,f6]@14 ~@15, ~@19 f2 d3@3 a2@8 [c3,f4,f5] f2 f4 f5 f2 [ab2,d3,g4,g5]@3 [a2,ab4,ab5]@10 ~@2 bb2@2 [g5,g6]@12 ~@15, ~@20 ab2@7 f2 d3 d4@20 ~@3 g3@3 [d3,ab5]@10 ~@3 db3@3 d3@3 ~@6]/5", // Eb C7 C5 Gbdim Dm7 Bb5 C7 Abmaj7 …
  V: "f2 [f5,c6]@2 ~ [ab6,c7] f6 ~ [eb6,g6] [c6,f6] [b5,f6] ~ [bb5,f6] [ab5,f6] f5 ~ eb5", // F5 Ab Eb F5 Bdim Bb5 Db
  W: "[[f5,a5,f6] ~@3 g2@3 f2@2 ~@3 bb2@3 a2@2 ~@3 c2@2 ~ f1@25]/3", // F
})).s("gm_piano").gain(0.71)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@4 A@2 B@2 A C D E A@2 B@2 A D A F B@2 A@2 B@2 D E A@2 B@2 A D A@2 B@2 A@2 B@2 D E A@2 B@2 A D G H@3 ~
>`.pickRestart({
  A: "f1@3 f1 ab1@3 a1 c2@3 f1 d2@3 c2", B: "bb1@3 bb1 db2@3 d2 f2@3 bb1 g2@3 f2",
  C: "f1@3 f1 ab1@3 a1 c2@3 f1 d2@3 a1", D: "c2@3 c2 eb2@3 e2 g2@3 c2 a2@3 g2", E: "c1@3 c2 d1@3 d2 eb1@3 eb2 e1@3 e2",
  F: "f1@3 f2 g1@3 g2 ab1@3 ab2 a1@3 a2", G: "f1@3 ~@13", H: "[~@4 g2 ~@2 f2@3 ~@2 d2@3 c2@3 ~@2 c2@2 ~ f1@25]/3",
})).s("gm_electric_bass_finger").gain(0.36)

// chords · trumpet
const trumpet = note("<~@12 A B ~ C ~@2 B@2 ~@7 D E B ~ C ~@4 F ~@6 D E B ~ C ~@3 G@3 ~>".pickRestart({
  A: "[f5,a5,c6,d6,f6]@3 ~@13, b5 ~@15", B: "[f5,a5,c6,d6,f6]@3 ~@4 [f5,a5,c6,d6,f6]@5 ~@4",
  C: "[ab5,bb5,d6,f6]@3 ~@4 [ab5,bb5,d6,f6]@5 ~@4", D: "[c5,c6] [d5,d6] [eb5,eb6] [e5,e6]",
  E: "[f5,a5,c6,d6,f6]@3 ~@13", F: "[ab5,bb5,d6,f6]@3 ~@13",
  G: "[~@4 [d5,g5]@3 [c5,f5]@3 ~@2 [g5,bb5]@3 [f5,a5]@3 ~@2 [bb5,d6]@3 [a5,c6]@25]/3", // G5 F5 Gm F Bb Am
})).s("gm_trumpet").gain(0.32)

// bass · baritone sax · "BARITONSAX"
const bass_2 = note("<~@12 A B ~ B ~@2 B@2 ~@7 C A ~@7 D ~@6 C A B ~ E ~@3 F G@2 ~>".pickRestart({
  A: "f2@3 ~@13", B: "f2@3 ~@3 f2@5 ~@5", C: "c2 d2 eb2 e2", D: "bb2 ~@3", E: "f2@3 ~@3 f2@4 ~@6",
  F: "~@4 bb2@2 a2@3 ~@3 d3@2 c3@2", G: "[~@4 c2@2 f2@25 ~]/2",
})).s("gm_baritone_sax").gain(0.6)

// drums · kick
const kick = s("bd").struct("<~@2 A@2 B@9 C B C B@2 C@2 B@9 C B C B@13 C B C B@2 D E F G ~>".pickRestart({
  A: "x ~@6 x!2 ~@7", B: "x!2", C: "x ~@6 x ~@8", D: "x", E: "~@4 x ~@2 x ~@4 x ~@2 x", F: "~@4 x ~@2 x ~@8",
  G: "~@15 x",
})).gain(0.34)

// drums · snare
const snare = s("sd").struct("<~@4 [~ x ~ x]!46 x ~@2 [~@7 x] ~>").gain(0.29)

// drums · hihat
const hihat = s("hh").struct("<~@4 [x!4]!49 ~@2>").gain(0.29)

// drums · crash
const crash = s("cr").struct("<~@4 A ~@7 A B ~ B ~@2 B@2 ~@8 A B ~ B ~@4 A ~@7 A B ~ B ~@3 C@2 ~@2>".pickRestart({
  A: "x", B: "x ~@6 x ~@8", C: "~@4 x ~@2 x ~@8",
})).gain(0.29)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@4 [x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x]!49 ~@2>").gain(0.99)

stack(piano, bass, trumpet, bass_2, kick, snare, hihat, crash, cabasa)