Strudelify

On the Down Low

Brian McKnight

KeyD♭ majorTempo93 bpm
0:00/0:00
// On the Down Low — Brian McKnight
// 93 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 76 bars on a 48-step grid, each part at one level. Source detail keeps the original performance.
setcpm(93/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 · electric bass finger
const bass = note(`<
  ~@2 A@2 B C D E F G H I F G H I F G H J K G H J K G H J K L M N O L M N O L M P@8 Q@24 R@5
>`.pickRestart({
  A: "[~@6 db2@37 ~@2 ab1@2 ~]/2", B: "db2@4 ~@6 ab1@3 ~@9 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~",
  C: "db2@3 ~@7 ab1@3 ~@9 b1 ~ gb2@4 ~@2 g2@4 ~@2 ab2@3 ~ gb2@2 ab1@5 ~",
  D: "db2@3 ~@7 ab1@2 ~@10 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~",
  E: "db2@3 ~@7 ab1@3 ~@9 b1@2 gb2@4 ~@2 g2@4 ~@2 ab2@3 ~ gb2@2 ab1@4 ~@2",
  F: "db2@4 ~@6 ab1@3 ~@9 b1@4 ~@13 ab1@2 ~ db2@3 ab1 ~@2",
  G: "db2@3 ~@6 ab1@3 ~@9 b1 ~@2 gb2@4 ~@2 g2@4 ~@2 ab2@3 gb2@3 ab1@5 ~",
  H: "db2@3 ~@6 ab1@2 ~@10 b1@4 ~@14 ab1@2 ~ db2@3 ab1 ~@2",
  I: "db2@3 ~@6 ab1@3 ~@9 b1@2 ~ gb2@4 ~@2 g2@4 ~@2 ab2@3 ~ gb2@2 ab1@4 ~@2",
  J: "db2@3 ~@6 ab1@3 ~@9 b1@2 ~ gb2@4 ~@2 g2@4 ~@2 ab2@3 gb2@2 ~ ab1@4 ~@2",
  K: "db2@4 ~@5 ab1@3 ~@9 b1@4 ~@14 ab1@2 ~ db2@3 ab1 ~@2",
  L: "db2@3 ~@6 ab1@3 ~@9 b1 ~@2 gb2@4 ~ g2@4 ~@3 ab2@3 gb2@2 ab1@5 ~@2",
  M: "db2@3 ~@6 ab1@2 ~@10 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~@2",
  N: "db2@3 ~@6 ab1@3 ~@9 b1@2 ~ gb2@4 ~ g2@4 ~@3 ab2@3 gb2@2 ab1@4 ~@3",
  O: "db2@4 ~@5 ab1@3 ~@9 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~@2",
  P: "[db2@3 ~@6 ab1@3 ~@9 b1@2 ~ gb2@4 ~ g2@4 ~@2 ab2@3 ~ gb2@2 ab1@4 ~@2 db2@4 ~@6 ab1@3 ~@9 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~ db2@3 ~@7 ab1@3 ~@9 b1 ~ gb2@4 ~@2 g2@4 ~@2 ab2@3 ~ gb2@2 ab1@5 ~ db2@3 ~@7 ab1@2 ~@10 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~ db2@3 ~@7 ab1@3 ~@9 b1@2 gb2@4 ~@2 g2@4 ~@2 ab2@3 ~ gb2@2 ab1@4 ~@2 db2@4 ~@6 ab1@3 ~@9 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~ db2@3 ~@7 ab1@3 ~@9 b1 ~ gb2@4 ~@2 g2@4 ~@2 ab2@3 ~ gb2@2 ab1@5 ~ db2@3 ~@7 ab1@2 ~@10 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~ db2]/8",
  Q: "[~@9 ab1@3 ~@9 b1@2 gb2@4 ~@2 g2@4 ~@2 ab2@3 ~ gb2@2 ab1@4 ~@2 db2@4 ~@6 ab1@3 ~@9 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~ db2@3 ~@7 ab1@3 ~@9 b1 ~ gb2@4 ~@2 g2@4 ~@2 ab2@3 ~ gb2@2 ab1@5 ~ db2@3 ~@7 ab1@2 ~@10 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~ db2@3 ~@7 ab1@3 ~@9 b1@2 gb2@4 ~@2 g2@4 ~@2 ab2@3 ~ gb2@2 ab1@4 ~@2 db2@4 ~@6 ab1@3 ~@9 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~ db2@3 ~@7 ab1@3 ~@9 b1 ~ gb2@4 ~@2 g2@4 ~@2 ab2@3 ~ gb2@2 ab1@5 ~ db2@3 ~@7 ab1@2 ~@10 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~ db2]/8",
  R: "[~@9 ab1@3 ~@9 b1@2 gb2@4 ~@2 g2@4 ~@2 ab2@3 ~ gb2@2 ab1@4 ~@2 db2@4 ~@6 ab1@3 ~@9 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~ db2@3 ~@7 ab1@3 ~@9 b1 ~ gb2@4 ~@2 g2@4 ~@2 ab2@3 ~ gb2@2 ab1@5 ~ db2@3 ~@7 ab1@2 ~@10 b1@4 ~@14 ab1@2 db2@3 ~ ab1 ~ db2@3 ~@7 ab1@3 ~@9 b1@2 gb2@4 ~@2 g2@4 ~@2 ab2@3 ~ gb2@2 ab1@4 ~@3]/5",
})).s("gm_electric_bass_finger").gain(0.41)

// chords · electric guitar jazz
const electric_guitar_jazz = note("<~@4 A@34 B@7 C@24 D@7>".pickRestart({
  A: "[[bb3,db4,eb4,gb4]@11 ~@5]/2", // Ebm7
  B: "[[bb3,db4,eb4,gb4]@66 ~@29 [bb3,db4,eb4,gb4]@66 ~@30 [bb3,db4,eb4,gb4]@66 ~@30 [bb3,db4,eb4,gb4]@49]/7", // Ebm7
  C: "[~@47 [bb3,db4,eb4,gb4]@66 ~@30 [bb3,db4,eb4,gb4]@66 ~@30 [bb3,db4,eb4,gb4]@66 ~@30 [bb3,db4,eb4,gb4]@49]/8", // Ebm7
  D: "[~@47 [bb3,db4,eb4,gb4]@66 ~@30 [bb3,db4,eb4,gb4]@66 ~@30 [bb3,db4,eb4,gb4]@66 ~@31]/7", // Ebm7
})).s("gm_electric_guitar_jazz").gain(0.51)

// chords · pad new age
const pad_new_age = note("<~@20 A@3 B C@3 D ~@16 E@4 F@2 G@2 ~@16 E@4 F@2 G@2>".pickRestart({
  A: "[~@6 [ab4,db5]@3 ~@3 [gb4,db5]@2 ~@4 [d4,e4,db5]@2 ~@4 [gb4,db5]@2 ~@4 [ab4,db5]@2 ~@4 [gb4,db5]@17 ~ [ab4,db5]@4 ~@2 [gb4,db5]@4 ~@2 [e4,db5]@4 ~@2 [gb4,db5]@2 ~@4 [ab4,db5] ~@5 [gb4,db5]@17 ~ ab4@5 ~ [gb4,db5]@4 ~@2 [e4,db5]@4 ~@2 [gb4,db5]@2 ~@4 [ab4,db5]@2 ~@4 [gb4,db5]@9 gb4@2 ~, ~@34 db5 ~@13]/3", // Db5 Gb5 Dbm Gb5 Db5 Gb5 Db5 Gb5 …
  B: "db5@3 e4@3 [gb4,db5]@3 e4@2 ~ db5@2 ~@4 [gb4,db5]@18 ~@12, ~@12 ab4 ~@35", // Gb5
  C: "[~@6 [ab4,db5]@4 ~@2 [gb4,db5]@4 ~@2 [e4,db5]@4 ~@2 [gb4,db5]@2 ~@4 [ab4,db5]@2 ~@4 [gb4,db5]@17 ~ [ab4,db5]@4 ~@2 [gb4,db5]@3 ~@3 [e4,db5]@4 ~@2 [gb4,db5]@2 ~@4 [ab4,db5]@2 ~@4 [gb4,db5]@16 ~@2 [ab4,db5]@3 ~@3 [gb4,db5]@3 ~@3 [e4,db5]@3 ~@3 [gb4,db5]@3 ~@3 [ab4,db5]@2 ~@4 [gb4,db5]@9 [gb4,db5]@3]/3", // Db5 Gb5 Dbm Gb5 Db5 Gb5 Db5 Gb5 …
  D: "e4@3 ~@3 [e4,gb4]@2 ~@4 [ab4,db5]@2 ~@4 [gb4,db5]@15 ~@15, ~@3 db5@2 ~@19", // Esus2 Db5 Gb5
  E: "[~@5 [ab4,db5]@3 ~@3 [gb4,db5]@2 ~@4 [d4,e4,db5]@2 ~@4 [gb4,db5]@2 ~@4 [ab4,db5]@2 ~@4 [gb4,db5]@17 ~ [ab4,db5]@4 ~@2 [gb4,db5]@4 ~@2 [e4,db5]@4 ~@2 [gb4,db5]@2 ~@4 [ab4,db5] ~@5 [gb4,db5]@17 ~ ab4@5 ~ [gb4,db5]@4 ~@2 [e4,db5]@4 ~@2 [gb4,db5]@2 ~@4 [ab4,db5]@2 ~@4 [gb4,db5]@9 ~ gb4@2 db5@3 ~ e4@2 [gb4,db5]@4 e4@2 db5@2 ~@4 [gb4,db5]@18 ~@13, ~@101 db5@3 ~@51 ab4 ~@36]/4", // Db5 Gb5 Dbm Gb5 Db5 Gb5 Db5 Gb5 …
  F: "[~@5 [ab4,db5]@4 ~@2 [gb4,db5]@4 ~@2 [e4,db5]@4 ~@2 [gb4,db5]@2 ~@4 [ab4,db5]@2 ~@4 [gb4,db5]@17 ~ [ab4,db5]@4 ~@2 [gb4,db5]@3 ~@3 [e4,db5]@4 ~@2 [gb4,db5]@2 ~@4 [ab4,db5]@2 ~@4 [gb4,db5]@13]/2", // Db5 Gb5 Dbm Gb5 Db5 Gb5 Db5 Gb5 …
  G: "[~@5 [ab4,db5]@3 ~@3 [gb4,db5]@3 ~@3 [e4,db5]@3 ~@3 [gb4,db5]@3 ~@3 [ab4,db5]@2 ~@4 [gb4,db5]@9 ~ [gb4,db5]@2 e4@3 ~@3 [e4,gb4]@2 ~@4 [ab4,db5]@2 ~@4 [gb4,db5]@15 ~@16, ~@53 db5@4 ~@39]/2", // Db5 Gb5 Dbm Gb5 Db5 Gb5 Esus2 Db5 …
})).s("gm_pad_new_age").gain(0.36)

// chords · epiano1
const epiano1 = note(`<
  A B C D E B E B E B E B E B E B E B E B E B E B E B E B E B E B E B E B E B E B F@36
>`.pickRestart({
  A: "[db2,ab2,db3]@5 ~@7 [ab3,db4,eb4,gb4]@33 ~@3", B: "[db2,ab2,db3] ~ [ab3,db4,e4]@6",
  C: "[db2,ab2,db3]@3 ~@3 [ab3,db4,eb4,gb4]@17 ~", D: "[db2,ab2,db3]@6 ~@6 [ab3,db4,e4]@22 ~@2 [ab3,db4,gb4]@11 ~",
  E: "~@4 [ab3,db4,eb4]@11 ~", F: "[~@11 [ab3,db4,eb4]@33 ~@3 [db2,ab2,db3]@6 ~@6 [ab3,db4,e4]@36 ~]/2",
})).s("gm_epiano1").gain(0.46)

// drums · kick
const kick = s("bd").struct("<~@4 A@4 B@3 A B@3 A B@13 C@3 D C@3 D C@2 E F@28 ~@8>".pickRestart({
  A: "x ~@14 x ~@2 x ~ x!2 ~@2", B: "x ~@9 x ~ x!3 ~", C: "x ~@28 x ~@6 x ~@2 x ~ x ~@6",
  D: "x ~@29 x ~@5 x ~@2 x ~ x ~@6", E: "x ~@28 x ~@5 x ~@3 x ~ x ~@5 x", F: "~@29 x ~@5 x ~@3 x ~ x ~@5 x",
})).gain(0.46)

// drums · clap
const clap = s("cp").struct("<~@4 [~ x ~ x]!35 [~@12 x ~@22 x ~@12] [~@11 x ~@23 x ~@12]!28 [~@11 x ~@36] ~@7>")
  .gain(0.46)

// drums · snare
const snare = s("sd").struct("<~@4 [~ x ~ x]!35 [~@12 x ~@22 x ~@12] [~@11 x ~@23 x ~@12]!28 [~@11 x ~@36] ~@7>")
  .gain(0.46)

// drums · low tom
const low_tom = s("lt").struct("<~@4 x!35 [x ~@46 x] [~@47 x]!28 ~@8>").gain(0.51)

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

// drums · open hat
const open_hat = s("oh").struct("<~@4 [~@7 x]!25 [~@41 x ~@6]!39 ~@8>").gain(0.36)

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

stack(bass, electric_guitar_jazz, pad_new_age, epiano1, kick, clap, snare, low_tom, hihat, open_hat, crash)

More by Brian McKnight