Strudelify

Uncle Walter

Ben Folds Five

KeyE♭ majorTempo147 bpm
0:00/0:00
// Uncle Walter — Ben Folds Five
// 147 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 95 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(147/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(`<
  A@4 B C D@2 B E F ~ G@2 H I@3 J@2 K L@2 M@4 A@4 B C D@2 B E F ~ G@2 H I@3 J@2 K L@2 N@3 O P Q R S@3 T@2 U B C D@2 B E
  F ~ G@2 H I@3 J@2 K L@2 N@3 V@2 A@4 W X Y Z
>`.pickRestart({
  A: "[[bb3,d4,f4]@3 ~ [bb3,d4,f4]@3 ~ [bb3,d4,f4] ~ [bb3,d4,f4]@3 ~ [ab3,c4,eb4,f4]@6 [ab3,c4,eb4,f4]@4 [ab3,c4,eb4,f4]@2 [ab3,c4,eb4,f4]@4 [bb3,eb4]@6 [bb3,eb4]@4 [ab3,c4,eb4]@2 [ab3,c4,eb4]@4 [g3,bb3,eb4]@4 [ab3,eb4]@2 [a3,eb4]@2 bb3@4 b3@2 c4@2 db4@2, ~@27 eb4@3 ~@2]/4", // Bb Fm7 Eb5 Ab Eb Ab5 Adim
  B: "[d4,ab4,bb4]@2 [d4,ab4,bb4] [bb4,d5,f5]@3 c5 bb4", C: "[c4,eb4,f4,ab4]@2 [c5,eb5,g5] [c5,eb5,g5]@3 ~ eb5",
  D: "[[bb4,eb5,f5] eb5 [bb4,eb5,f5] g5 [ab4,c5,f5] [ab4,eb5]@2 [g4,bb4,eb5]@2 [ab4,eb5] [a4,eb5] [bb4,eb5]@2 b4 c5 bb4]/2", // Bbsus4 Fm Ab5 Eb Ab5 Adim Eb5
  E: "[c4,eb4,f4,ab4]@2 [c5,eb5,g5] [eb5,g5]@3 ~ eb5, ~@3 c5@4 ~", // Fm7 Cm Eb
  F: "[bb4,eb5,f5] eb5 [bb4,eb5] g5 [ab4,c5,f5] [ab4,c5,eb5]@2 [g4,bb4,eb5], ~ f5 ~@2", // Bbsus4 Eb5 Fm Ab Eb
  G: "[[eb4,ab4,d5]@2 eb5 [d4,g4,bb4]@4 bb5 bb5!2 ab5 g5 f5 bb4!3, ~@7 [c5,eb5]@4 [bb4,d5]@2 ~@3]/2", // Ab Gm Cm Bb
  H: "[g4,bb4] f5 [bb4,d5,g5] [bb4,d5,f5]@2 [g4,bb4,eb5]@3, eb5 ~@3", // Gm Bb Eb
  I: "[~ bb4 [bb4,d5,g5] f5 [g4,bb4,eb5] d5 [g4,bb4,d5] [eb4,ab4,d5]@2 [eb4,ab4,c5]@2 [d4,g4,bb4]@2 [g4,bb4,d5] c5 [eb4,ab4,c5]@2 [eb4,ab4] eb5 [g4,bb4]@4 c5, ~@17 c5@2 ~@5]/3", // Gm Eb Gm Ab Gm Ab Ab5 Gm
  J: "[[c5,eb5,ab5]@2 [ab4,c5,f5] eb5 [ab4,c5,eb5] f5 [ab4,c5,g5] [g4,bb4,eb5]@2 [g4,bb4,eb5]@2 [bb4,eb5,f5]@2 [bb4,eb5,g5]@2 [d5,g5,bb5]]/2", // Ab Fm Ab Abmaj7 Eb Bbsus4 Eb Gm
  K: "g5 [ab4,d5,g5] g5 [ab4,d5,f5]!2 [f4,ab4,d5]!2 [eb4,g4,c5]", // G Ddim Cm
  L: "[[eb4,g4,c5]@2 [eb4,g4,bb4] [eb4,g4,bb4]@4 [ab4,d5,g5]@2 [ab4,d5,g5]!2 [ab4,d5,f5]!2 [f4,ab4,d5]!2 [eb4,g4,c5]]/2", // Cm Eb G Ddim Cm
  M: "[[eb4,g4,c5]@2 [g4,bb4,eb5]!3 f5 g5 [c5,eb5,g5]@2 [c5,eb5,ab5]@2 [c5,eb5,ab5]@2 [c5,eb5,g5]@2 [c5,eb5,bb5]@2 [c5,eb5,g5]@3 [ab4,c5,eb5]@2 c5 [d4,g4,c5]@2 [d4,g4,bb4]@6 ~]/4", // Cm Eb Cm Ab Cm Cm7 Cm Ab …
  N: "[[eb4,g4,c5]@2 [g4,bb4,eb5]!3 f5 g5 [c5,eb5,g5]@2 [c5,eb5,ab5]@2 [c5,eb5,ab5]@2 [c5,eb5,g5]@2 [c5,eb5,bb5]@2 [c5,eb5,g5]@3 [ab4,c5,eb5]@2 c5 [d4,g4,c5]]/3", // Cm Eb Cm Ab Cm Cm7 Cm Ab …
  O: "[d4,g4,c5] [d4,g4,bb4]@6 ~", P: "~ f5!2 eb5!2 bb4!2 [ab4,db5,f5], ab4@5 ~@3, db5 ~",
  Q: "g5 f5!2 eb5!2 bb4!3, ab4@5 ~@3, db5 ~", R: "[eb4,g4] f5 [g4,c5,f5]@2 [g4,c5,eb5]@4, bb4@3 ~@5",
  S: "[[g4,c5,eb5]@3 [g4,c5,eb5]!2 eb5 f5 [b4,f5,g5]@2 [b4,f5,g5]@2 [ab4,c5,f5]@4 [d4,f4,b4]@2 [b4,d5,g5]@2 [b4,d5,f5]@4 ~]/3", // Cm G7 Fm Bdim G Bdim
  T: "[~ eb5@2 [ab4,c5,f5]@2 [c5,eb5,g5]@2 [c5,eb5,bb5]@2 [c5,eb5,g5]@2 [c4,eb4,bb4]@2 [c4,eb4,bb4]@3]/2", // Fm Cm Cm7 Cm Cm7
  U: "[gb3,c4,f4]!2 ~@2", V: "[[d4,g4,c5] [d4,g4,bb4]@15]/2",
  W: "~ [db5,gb5,bb5] [d5,g5,bb5]@2 [db5,gb5,bb5] [d5,g5,bb5]@3", X: "bb5 eb5 [ab4,d5,eb5] [ab4,eb5,f5,bb5] ~@3 eb5",
  Y: "bb5 eb6 [bb5,eb6] [a5,eb6] [ab5,eb6]!2 db5 [db5,g5,bb5]", Z: "~@3 [eb6,bb6,eb7]@2 ~@3",
})).s("gm_piano").gain(0.64)

// bass · electric bass finger
const bass = note(`<
  A@4 B C D@2 B C D@2 E@2 F@4 G@6 H@2 I A@4 B C D@2 B C D@2 E@2 F@4 G@6 H@2 I J K L@2 M@2 N O P B C D@2 B C Q@2 E@2 F@4
  G@6 H@2 R@2 S T U@2 V W X Y
>`.pickRestart({
  A: "[bb2@2 g3 f3 d3 c3 bb2 ab2@3 f3 eb3 c3 bb2 ab2 g2@2 g2 g3@2 f2 f2@2 eb2@2 f2 gb2 g2@2 ab2 a2 bb2]/4",
  B: "bb2@2 bb2@2 bb3@4 bb2@2 bb2 ~@3 bb2@2", C: "ab2@2 ab2@2 ab3@4 ab2@2 ab2 ~@3 ab2@2",
  D: "[g2@2 g2@2 f2 f2@2 eb2@2 f2 gb2 g2@2 ab2 a2 bb2]/2",
  E: "[f2@2 ab2 a2 bb2 [d2,d3] [e2,e3] [f2,f3]@2 ab2 a2 bb2@2 [eb2,eb3] [e2,e3] [f2,f3]]/2", // D E F Eb E F
  F: "[[eb2,eb3]@2 bb2 c3 bb2 g2 f2 [eb2,eb3]@2 ab2 a2 bb2@2 [eb2,eb3] [e2,e3] [f2,f3]@3 ab2 a2 bb2 [eb2,eb3] [e2,e3] [f2,f3]@2 ab2!2 bb2@2 [eb2,eb3] [f2,f3] [g2,g3]]/4", // Eb E F Eb E F Eb F …
  G: "[ab2@2 ab2@2 g2 f2 eb2 eb2@2 f2 gb2 g2@2 ab2 a2 bb2@3 ~@5 eb2@2 f2 gb2 g2@2 ab2 a2 bb2@3 ~@5 eb2@2 f2 gb2 g2@2 ab2 a2 bb2]/6",
  H: "[f2@2 f2@2 g2 g2@2 ab2@5 ab2@2 ab2@2]/2", I: "bb2", J: "bb2@3 f3 f3@3 bb2", K: "bb2@3 f3 f3@3 eb3",
  L: "ab2@3 eb3 eb3@3 ab2", M: "g2@3 d3 d3@3 g2", N: "f2!8", O: "ab2!8", P: "ab2!2 ~@2",
  Q: "[g2@2 g2@2 f2 f2@2 eb2@2 ~@7]/2", R: "bb2/2", S: "bb2!2 g3 f3 [bb2,d3] c3 bb2 [ab2,bb2], ~@4 bb3@4 ~@2 bb2 ~@5",
  T: "ab2!2 f3 eb3 [ab2,c3] bb2 ab2 [g2,ab2], ~@4 ab3@4 ~@2 ab2 ~@5", // Ab Abmaj7
  U: "[g2!2 [g2,g3]@2 f2 f2@2 ~@2 f2 gb2 g2@2 ab2 a2 bb2, ~@7 eb2@8 ~]/2", V: "~ bb3 ab4 bb3 g4 bb4 f4 eb4",
  W: "ab3 eb4 e4 [ab3,f4] ~@4", X: "g4@2 g4 gb4 f4 f4@2 eb4", Y: "~ bb3 c4 eb4@2 ~@3",
})).s("gm_electric_bass_finger").gain(0.64)

// other · trumpet · "Bb Trumpet 1"
const trumpet = note(`<
  ~@4 A B C@2 A B D E F G H I J K L M N O P Q R S T ~@4 A B C@2 A B D E F G H I J K L M N O P Q R S U V W X Y Z AA AB AC
  ~@8 E F G H I J K L M N O P Q R S U ~@8 AD
>`.pickRestart({
  A: "bb3 c4 d4 f4@2 d4 c4 bb3", B: "ab3@2 g4 g4@2 ~@2 eb4", C: "[f4@2 f4@2 f4@2 g4@2 f4@2 eb4@4 eb4@5 ~@11 bb3 ~]/2",
  D: "f4@2 f4@2 f4@2 g4@2 f4@2 eb4 ~ eb4 ~ eb4 ~", E: "~@2 c4 ~ g4 ~ f4 ~ eb4 ~ d4@4 ~@2",
  F: "[ab3,bb3,d4]@3 ~ [bb3,eb4] ~ bb3@4 ~@4 [c4,eb4,bb4] ~", // Bb7 Eb5 Cm7
  G: "[c4,eb4,bb4] ~ [c4,eb4,bb4] ~ [d4,ab4] ~ [c4,d4,g4] ~ [bb3,d4,f4] ~ bb3 ~ bb3 ~ bb3 ~", // Cm7 Ddim Csus2 Bb
  H: "[bb3,eb4,g4] ~ [c4,f4] ~ [d4,g4] ~ [c4,f4]@3 ~ [bb3,eb4] ~ [bb3,eb4]@3 ~", // Eb F5 G5 F5 Eb5
  I: "~@2 bb3 ~ [bb3,d4,g4] ~ [c4,d4,f4] ~ [bb3,eb4] ~ [bb3,d4] ~ [bb3,d4] ~ [bb3,d4] ~", // Gm Dm7 Eb5 Bb
  J: "d4 ~ [ab3,c4] ~@7 [g4,bb4,d5] ~ [f4,ab4,c5]@3 ~", // Ab Gm Fm
  K: "~@2 [eb4,ab4,c5] ~ [ab4,c5,eb5] ~ [ab4,c5,eb5] ~ [g4,bb4,d5]@3 ~ [f4,ab4,c5]@3 ~", // Ab Gm Fm
  L: "[c4,eb4,ab4]@3 ~ [ab3,c4,f4] ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,d4,f4] ~ [ab3,eb4,g4] ~ [bb3,eb4] ~", // Ab Fm Ab Ddim Abmaj7 Eb5
  M: "~@2 [eb4,eb5]@3 ~ [f4,f5]@3 ~ [g4,g5]@3 ~ [bb4,bb5] ~", // Eb F G Bb
  N: "[g4,g5] ~ [g4,g5] ~ [g4,g5] ~ [f4,f5] ~ [f4,f5] ~ [d4,d5] ~ [d4,d5] ~ [c4,c5] ~", // G F D C
  O: "[c4,c5]@3 ~ [bb3,eb4,eb5] ~ [bb3,f4,f5]@3 ~ [g4,g5]@3 ~ [bb3,bb4,bb5] ~", // C Eb5 Bb5 G Bb
  P: "~@2 [g4,g5] ~ [g4,g5] ~ [f4,f5] ~ [f4,f5] ~ [d4,d5] ~ [d4,d5] ~ [c4,c5] ~", // G F D C
  Q: "[c4,c5]@3 ~ [bb3,bb4] ~ [bb3,bb4]@4 ~@4 g4@2", R: "~@2 ab4@3 ~ ab4@3 ~ g4@3 ~ bb4@2",
  S: "~@2 g4@4 ~@2 eb4@3 ~ c4 ~ c4@2", T: "~ bb3@2 ~@5", U: "c4 ~ bb3@4 ~@10",
  V: "~@2 [f4,ab4,f5] ~ [f4,ab4,f5] ~ [eb4,g4,eb5] ~ [eb4,g4,eb5] ~ [bb3,bb4] ~ [bb3,bb4] ~ [f4,ab4,f5] ~", // Fm Eb Bb Fm
  W: "[f4,ab4,f5] ~ [f4,ab4,f5] ~ [f4,ab4,f5] ~ [eb4,g4,eb5] ~ [eb4,g4,eb5] ~ [bb3,bb4] ~ [bb3,bb4] ~ [bb3,bb4] ~", // Fm Eb Bb
  X: "[bb3,eb4,bb4] ~ [f4,ab4,f5] ~ [f4,ab4,f5]@3 ~@9", // Eb5 Fm
  Y: "~@6 [eb4,g4,eb5]@3 ~ [eb4,g4,eb5] ~ [f4,c5,f5] ~ [g4,b4,g5]@2", // Eb F5 G
  Z: "~@2 [g4,b4,g5]@3 ~ [f4,ab4,f5]@3 ~ [c4,f4,c5]@3 ~ [b3,f4,b4]@2", AA: "~@2 [g4,b4,g5]@3 ~ [f4,b4,f5]@4 ~@6",
  AB: "~@2 [eb4,eb5]@3 ~ [f4,f5]@3 ~ [g4,g5]@3 ~ [bb4,bb5]@2", AC: "~@2 [g4,g5]@3 ~ [bb3,bb4]@3 ~ [bb3,bb4]@4 ~@2",
  AD: "~@3 [eb4,bb4,eb5]@2 ~@3", // Eb5
})).s("gm_trumpet").gain(0.52)

// drums · kick
const kick = s("bd").struct("<A@4 B@16 ~ B ~ B@3 ~ A@4 B@22 ~ C@6 D@2 E B@7 F B@14 ~@2 A@4 C@3 F>".pickRestart({
  A: "x ~@3 x!2 ~@2", B: "x ~@3 x!2 ~ x", C: "x ~@2 x!2 ~@3", D: "x!8", E: "~@7 x", F: "x",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct("<A@20 ~ A ~ A@3 ~ A@26 ~ A@6 B@2 ~ A@7 ~ A@14 ~@2 A@7 C>".pickRestart({
  A: "~ x ~ x", B: "x!8", C: "~ x ~@2",
})).gain(0.64)

// drums · clap
const clap = s("cp").struct("<[x!2]!4 ~@23 [x!2]!4 ~@56 [x!2]!4 ~@4>").gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@54 [~@5 x ~ x]!6 ~@2 [~@7 x] ~@32>").gain(0.64)

// drums · pedal hat
const pedal_hat = s("hh").struct("<A@20 B A B A@3 ~ A@26 ~ A@6 ~@3 A@7 C A@14 ~@2 A@4 C ~@3>".pickRestart({
  A: "x!8", B: "~ x!3", C: "x",
})).gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 A@16 ~ A ~ A@3 ~@5 A@22 ~@9 B A@7 ~ A@14 ~@10>".pickRestart({
  A: "x ~ x ~ x!2 ~ x", B: "~@3 x",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@54 [~ x ~@5 x]!6 ~@35>").gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~@4 A@16 ~ A ~ A@3 ~@5 A@22 ~ B C B C B C ~@2 D A@7 ~ A@14 ~@10>".pickRestart({
  A: "x ~@3 x!2 ~ x", B: "x ~ x!4 ~@2", C: "~@2 x!4 ~@2", D: "~@2 x ~@2 x ~@2",
})).gain(0.64)

// drums · china
const china = s("cr").struct(`<
  A@3 B C ~ C ~ C ~ C ~ C ~ C ~ C ~ C D C E ~ E C ~ C A@3 B C ~ C ~ C ~ C ~ C ~ C ~ C ~ C D C E C E C ~ C@2 ~ C ~ C ~@2
  F G C ~ C ~ C ~ C@3 ~ C ~ C ~ C D C E C E C ~ C ~ A@3 B C ~ C H
>`.pickRestart({
  A: "x ~ x ~ x ~ x!2", B: "x!4", C: "x", D: "~ x ~ x ~ x ~ x", E: "x ~@6 x", F: "x!8", G: "x!2 ~@2", H: "~@3 x ~@4",
})).gain(0.64)

// drums · ride bell
const ride_bell = s("rd").struct("<~@20 A ~@26 A ~@6 B@6 ~ C D ~@16 A ~@11 B@4>".pickRestart({
  A: "x", B: "~ x ~@2", C: "x!2", D: "x!2 ~@2",
})).gain(0.64)

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

// drums · congas
const congas = s("conga:13").struct("<~@54 [x!2 ~@6]!6 [x!8]!2 ~@29 [x!2 ~@6]!4>").gain(2.05)

// drums · congas
const congas_2 = s("conga:33").struct("<~@54 [~ x]!6 [x!8]!2 ~@29 [~ x]!3 ~>").gain(2.05)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~@4 A@22 ~@5 A@22 ~ B@6 ~@3 A@7 ~ A@14 ~@6 B@3 C>".pickRestart({
  A: "~ x ~@2", B: "~@5 x ~@2", C: "~@3 x ~@4",
})).gain(4.08)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@54 [x!8]!6 ~@31 [x!8]!3 [x!3 ~@5]>").gain(3.24)

// drums · whistle
const whistle = s("ballwhistle:1").struct("<~@54 [~@7 x]!6 ~@31 [~@7 x]!3 [~@3 x ~@4]>").gain(0.83)

// drums · whistle
const whistle_2 = s("ballwhistle:0").struct("<~@62 [x!2 ~@2] ~@32>").gain(0.83)

// drums · guiro
const guiro = s("guiro:4").struct("<~@62 [~ x ~@2] ~@32>").gain(13.52)

stack(
  piano, bass, trumpet, kick, snare, clap, low_tom, pedal_hat, mid_tom, open_hat, high_tom, china, ride_bell, bongos,
  congas, congas_2, agogo_bells, cabasa, whistle, whistle_2, guiro
)

More by Ben Folds Five