Strudelify

What Does It Take

Junior Walker

KeyF majorTempo106 bpm
0:00/0:00
// What Does It Take — Junior Walker
// 106 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 101 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(106/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 · percussive organ · "Organ"
const percussive_organ = note(`<
  ~@17 A@2 B@2 C@2 D@2 E@2 F G ~@12 A@2 B@2 C@2 D@2 E@2 F G ~@20 A@2 B@2 C@2 D@2 E@2 F G ~@16
>`.pickRestart({
  A: "[[g4,bb4,d5,f5,a5]@13 ~@3]/2", B: "[[f4,c5,e5,g5]@29 ~@3, a4 ~]/2", C: "[~@3 bb4@10 ~@3, [g4,d5,f5,a5]@27 ~@5]/2",
  D: "[[f4,a4,c5,e5,g5]@23 ~@9]/2", E: "[[g4,bb4,d5,f5,a5]@11 ~@5]/2", F: "[f4,a4,c5,e5,g5]@15 ~",
  G: "[c5,e5,g5] ~@3 [bb4,d5,f5] ~@3 [bb4,d5,f5] ~@3 [bb4,d5,f5] ~@3", // C Bb
})).s("gm_percussive_organ").gain(0.4)

// bass · fretless bass · "Bass"
const bass = note(`<
  ~ A B C D E F G H E F G H B I G J E F G H E F G H B I G J E F G H E F G H K I G J E F G H E F G H B I G J E F G H E F
  G H E F G H E F G H B I G J E F G H E F G H B I G J E F G H E F G H E F G H E F G H
>`.pickRestart({
  A: "d2@6 g1@5 ~ d2@2 g1@2", B: "d2@5 ~ g1@6 d2@2 g1@2", C: "c2@5 ~ f1@5 ~ c2@2 f1@2", D: "c2@5 ~ f1@5 ~ c2@2 f1 ~",
  E: "d2@3 g1@3 d2 g1", F: "d2@5 ~ g1@9 ~", G: "c2@5 ~ f1@6 c2@2 f1@2", H: "c2@3 f1@4 ~", I: "d2@3 g1@3 d2 ~",
  J: "~@2 c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~", K: "d2@5 ~ g1@6 d2@2 g1 ~",
})).s("gm_fretless_bass").gain(0.64)

// chords · piano
const piano = note(`<
  ~ A B C D E@2 F@2 E@2 F@2 G@2 F H E@2 F@2 E@2 F@2 G@2 F I E@2 F@2 E@2 F@2 G@2 F I E@2 F@2 E@2 F@2 G@2 F H E@2 F@2 E@2
  F@2 E@2 F@2 E@2 F@2 G@2 F H E@2 F@2 E@2 F@2 G@2 F I E@2 F@2 E@2 F@2 E@2 F@2 E@2 F J
>`.pickRestart({
  A: "d3@6 g2@5 ~ d3@2 g2@2", B: "d3@5 ~ g2@6 d3@2 g2@2", C: "c3@5 ~ f2@5 ~ c3@2 f2@2", D: "c3@5 ~ f2@5 ~ c3@2 f2 ~",
  E: "[g4,bb4,d5,f5] ~ [g4,bb4,d5,f5] ~ [g4,bb4,d5,f5] ~ [g4,bb4,d5,f5] ~ [g4,bb4,d5,f5] ~ [g4,bb4,d5,f5] ~ [g4,bb4,d5,f5] ~ [g4,bb4,d5,f5] ~", // Gm7
  F: "[f4,a4,c5,e5] ~ [f4,a4,c5,e5] ~ [f4,a4,c5,e5] ~ [f4,a4,c5,e5] ~ [f4,a4,c5,e5] ~ [f4,a4,c5,e5] ~ [f4,a4,c5,e5] ~ [f4,a4,c5,e5] ~", // Fmaj7
  G: "[f4,bb4,d5,f5] ~ [f4,bb4,d5,f5] ~ [f4,bb4,d5,f5] ~ [f4,bb4,d5,f5] ~ [f4,bb4,d5,f5] ~ [f4,bb4,d5,f5] ~ [f4,bb4,d5,f5] ~ [f4,bb4,d5,f5] ~", // Bb
  H: "[c4,bb4,d5,f5] ~@3 [c4,bb4,d5,f5] ~@3 [c4,bb4,d5,f5] ~@3 [c4,bb4,d5] ~@3, ~@6 f5 ~", // Bb Gm
  I: "[c4,bb4,d5,f5] ~@3 [c4,bb4,d5,f5] ~@3 [c4,bb4,d5,f5] ~@3 [c4,bb4,d5,f5] ~@3", // Bb
  J: "[f4,a4,c5,e5] ~ [f4,a4,c5,e5] ~ [f4,a4,c5,e5] ~ [f4,a4,c5,e5] ~ [f4,a4,c5,e5] ~@7", // Fmaj7
})).s("gm_piano").gain(0.26)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@4 A ~@31 B ~@23 B ~@7 B ~@23 B ~@8>".pickRestart({
  A: "~@12 x!2 ~@2", B: "~@8 x!4 ~@4",
})).gain(0.15)

// drums · clap
const clap = s("cp").struct("<~@5 [~ x ~ x]!27 [~ x ~@2]!2 [~ x ~ x]!66 [~ x ~@2]>").gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<[~ x!3] [~ x ~ x]!4 [x!4]!27 [x!2 ~ x] [x!4]!67 [x!3 ~]>").gain(0.5)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@5 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A C
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2", C: "~ x ~ x ~@4",
})).gain(0.15)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@6 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2
>`.pickRestart({
  A: "~@7 x",
})).gain(0.5)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@5 [x!16]!13 [x!5 ~ x!10] [x!16]!13 [x!5 ~@2 x ~ x!3 ~ x!3] [x!16]!67 [x!9 ~@7]>")
  .gain(0.15)

// drums · congas
const congas = s("conga:13").struct("<~@5 A@31 B A@23 B A@7 B A@23 B A@7 C>".pickRestart({
  A: "~ x ~@4 x ~", B: "~ x ~@3 x ~ x", C: "~ x ~@6",
})).gain(1.59)

// drums · congas
const congas_2 = s("conga:33").struct("<~@5 A@27 B A@3 C A@23 C A@7 C A@23 C A@7 D>".pickRestart({
  A: "~@2 x!2 ~ x ~@2", B: "~@2 x ~@2 x ~@2", C: "~@2 x!2 ~@2 x ~", D: "~@2 x!2 ~@4",
})).gain(1.59)

stack(
  percussive_organ, bass, piano, kick, snare, snare_soft, clap, hihat, hihat_soft, open_hat, crash, tambourine, congas,
  congas_2
)