Strudelify

Ain't Nobody

Chaka Khan

KeyA♭ majorTempo104 bpm
0:00/0:00
// Ain't Nobody — Chaka Khan
// 104 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 103 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(104/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 · "Ac Piano"
const piano = note(`<
  ~ A@4 B@2 C@2 B@2 C@2 D E F G B@2 C@2 B@2 C@2 D E F G H@2 I@2 H@2 A@4 B@2 C@2 B@2 C@2 D E F G H@2 I@2 H@2 I@2 J K L M
  J K L M J K L M J K L M J K L M H@2 I@2 H@2 I@2 H@2 I@2 H@2 I@2 H@2 I@2 H@2 I@2
>`.pickRestart({
  A: "~@4 [bb3,eb4,gb4] ~ [bb3,eb4,gb4] ~ [ab3,db4,f4]@8", // Ebm Db
  B: "[~@4 [bb3,eb4,gb4] ~ [bb3,eb4,gb4] ~ [ab3,db4,f4]@10 ~@2 [bb3,eb4,gb4] ~ [bb3,eb4,gb4] ~ [ab3,db4,f4]@2 ~@4 [bb3,eb4,gb4]!2, eb2@15 ~]/2", // Ebm Db Ebm Db Ebm
  C: "[~@4 [bb3,eb4,gb4] ~ [bb3,eb4,gb4] ~ [ab3,db4,f4]@7 [bb3,eb4,gb4] ~@4 [bb3,eb4,gb4] ~ [bb3,eb4,gb4] ~ [ab3,db4,f4]@5 ~ [bb3,eb4,gb4]!2, b2@29 ~@3]/2", // Ebm Db Ebm Db Ebm
  D: "~@4 [bb3,eb4,gb4] ~ [bb3,eb4,gb4] ~ [ab3,db4,f4]@7 [bb3,eb4,gb4], bb2@15 ~", // Ebm Db Ebm
  E: "~@4 [bb3,eb4,gb4] ~ [bb3,eb4,gb4] ~ [ab3,db4,f4]@8, b2@7 ~ db3@6 ~@2", // Ebm Db
  F: "~@4 [bb3,eb4,gb4] ~ [bb3,eb4,gb4] ~ [ab3,db4,f4]@6 ~ [bb3,eb4,gb4], eb2@15 ~", // Ebm Db Ebm
  G: "~@3 eb2 [bb3,eb4,gb4] ~ [bb3,eb4,gb4] ~ [ab3,db4,f4]@4 ~ [ab3,db4,f4] ~ [bb3,eb4,gb4]", // Ebm Db Ebm
  H: "[~@4 [eb4,gb4,bb4] ~@3 [db4,f4,ab4]@3 [db4,f4,ab4] ~ gb2 ~ ab2@5 [b3,eb4,ab4] ~@3 [b3,eb4,gb4]@2 ~ [b3,eb4,gb4] ~ [db4,f4,ab4] ~ [eb4,gb4,bb4], eb2@11 ~@21]/2", // Ebm Db Abm B Db Ebm
  I: "[~@4 [eb4,gb4,bb4] ~@3 [db4,f4,ab4]@2 ~ [db4,f4,ab4] gb2@2 ~@6 [b3,eb4,ab4] ~@3 [b3,eb4,gb4]@2 ~ [b3,eb4,gb4] ~ [db4,f4,ab4] ~ [eb4,gb4,bb4], eb2@12 ~@3 ab2@9 ~@8]/2", // Ebm Db Abm B Db Ebm
  J: "eb2@2 ~ ab3 f4@2 db4 eb4 ~ eb4 bb3 ~ ab3 ~ ab3 ~", K: "~@2 ab2 ~ [gb3,b3,eb4]@4 db3 ~ db3 ~ [ab3,db4,f4]@3 ~",
  L: "eb2 ~@2 ab3 f4@2 db4 eb4 ~ eb4 bb3 ~ db4 eb4 ~ ab3, ~@4 ab3 ~@11",
  M: "ab2 ~@3 [gb3,b3,eb4]@2 ab2 gb3 ~ [ab3,db4] ~ [ab3,db4] ~@3 [bb3,eb4]", // B Db5 Eb5
})).s("gm_piano").gain(0.4)

// bass · synth bass 2 · "SynthBass"
const bass = note(`<
  ~ A B A B A B C@2 A B C@2 D E F G A B C@2 A B C@2 D E F G H I J K H I A B A B A B C@2 A B C@2 D E F G H I J K H I J K
  L M N M L M N M L M N M L M N M L M N M H I J K H I J K H I J K H I J K H I J K H I J K
>`.pickRestart({
  A: "eb1 eb2 eb1 eb2 ~@7 bb1 ~ bb1 ~ bb1", B: "eb1 eb2 eb1 eb2 ~@11 bb1", C: "b1 b2 b1 b2 ~@7 bb2 ~ bb2 ab2 gb2",
  D: "bb1 bb2 bb1 bb2 ~@9 bb1 ab1 bb1", E: "b1 b2 b1 b2 ~@3 db3 db2 db3 ~ db2 db1 db2 d1 d2",
  F: "eb1 eb2 eb1 eb2 ~@7 eb2 ~ eb2 db2 eb2", G: "eb1 eb2 eb1 eb2 ~@7 eb2 ab1 bb1 db2 eb2",
  H: "eb1 eb2 eb1 eb2 ~@7 gb1 ~ gb1 ~ gb1", I: "ab1 ab2 ab1 ab2 ~@7 b1 ~ db2 ~ eb2",
  J: "eb1 eb2 eb1 eb2 ~@7 gb2 gb1 gb2 ~@2", K: "ab1 ab2 ab1 ab2 ~@4 b1@2 ~ b1 ~ db2 ~ eb2",
  L: "eb1 ~@10 eb2 ~ eb2 db2 bb1", M: "ab1 ~@6 ab1 db2 ~@5 db2 eb2", N: "eb1 ~@6 eb1 ~@3 eb2 ~ eb2 db2 bb1",
})).s("gm_synth_bass_2").gain(0.54)

// chords · epiano2 · "Rhodes"
const epiano2 = note(`<
  ~ A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C D E F E D A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C D E F C D E F
  G H G I G H G I G H G I G H G I G H G I C D E F C D E F C D E F C D E F C D E F C D E F
>`.pickRestart({
  A: "[~@4 [eb4,gb4,bb4] ~@3 [db4,f4,ab4]@10 ~@2 [eb4,gb4,bb4] ~@3 [db4,f4,ab4]@7 [eb4,gb4,bb4]]/2", // Ebm Db Ebm Db Ebm
  B: "[~@4 [eb4,gb4,bb4] ~@3 [db4,f4,ab4]@10 ~@2 [eb4,gb4,bb4] ~@3 [db4,f4,ab4]@6 ~ [eb4,gb4,bb4]]/2", // Ebm Db Ebm Db Ebm
  C: "~@4 [gb4,bb4,eb5] ~ [gb4,bb4,eb5] ~ [f4,ab4,db5]@2 ~ [f4,ab4,db5] ~@4", // Ebm Db
  D: "~@4 [eb4,gb4,b4] ~@3 [eb4,gb4,b4]@2 ~ [eb4,gb4,b4] ~ [f4,ab4,db5] ~ [gb4,bb4,eb5]", // B Db Ebm
  E: "~@4 [gb4,bb4,eb5] ~@3 [f4,ab4,db5]@2 ~ [f4,ab4,db5] ~@4", // Ebm Db
  F: "~@4 [eb4,gb4,b4] ~@3 [eb4,gb4,bb4]@2 ~ [eb4,gb4,bb4] ~ [f4,ab4,db5] ~ [gb4,bb4,d5,eb5]", // B Ebm Db Ebm
  G: "[eb3,ab3,db4,f4]@15 ~", H: "[ab2,gb3,b3,eb4]@7 ~ [db3,ab3,db4,f4]@7 ~",
  I: "[ab2,gb3,b3,eb4]@8 [db3,ab3,db4,f4]@7 ~", // Abm7 Db
})).s("gm_epiano2").gain(0.29)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~ A B A B ~@11 C D@2 E@2 F@2 G@2 ~@2 H@2 I@2 J@2 K@2 L@4 M@2 N@2 O@2 N@2 ~ P Q R I@2 J@2 I@2 J@2 ~@9 S ~ S ~ S ~ S ~ S
  ~ R T@8 U@2 V@2 W@2 X@2 Y@2 Z@4 V@2
>`.pickRestart({
  A: "db6@3 bb5", B: "ab5", C: "~@10 [db3,db5]@2 [ab3,ab5]@2 [gb3,gb5] ~", D: "[eb4@7 f4]/2", E: "[gb4@7 f4]/2",
  F: "[eb4@3 f4]/2", G: "[gb4@30 [bb4,bb5] ~]/2",
  H: "[~@16 eb5@2 ~@2 gb4@4 ab4@4 bb4@2 [db5,db6] [eb5,eb6], eb4@20 gb5 ~@3 ab5 ~@3 bb5 ~@3]/2", I: "[eb4 ab4@2 b4]/2",
  J: "[bb4@2 ab4@5 gb4]/2", K: "[eb4 ab4@2 gb4]/2", L: "[[eb4,eb5]@31 ~]/4",
  M: "[[gb3,bb3,eb4]@3 [ab3,db4], eb2, ~@12 f3@3 ~]/2", N: "[[gb3,bb3,eb4]@3 [ab3,db4,f4], b2]/2",
  O: "[[gb3,bb3,eb4]@3 [f3,ab3,db4], eb2]/2", P: "[b2,bb3,eb4] [db3,ab3,db4,f4]", Q: "[eb2,gb3,bb3,eb4]",
  R: "[eb3,eb5] ~@3 [gb3,gb5] ~@3 [ab3,ab5] ~@3 [ab3,ab5] [bb3,bb5] [db4,db6] [eb4,eb6]", // Eb Gb Ab Bb Db Eb
  S: "[bb3,bb5] ~@3 [ab3,ab5] ~@3 [gb3,gb5] ~@3 [db3,db5] [eb3,eb5] [gb3,gb5] [eb3,eb5]", // Bb Ab Gb Db Eb Gb Eb
  T: "[bb5@8 ab5@16 b5@8 bb5@8 ab5@16 gb5@4 ab5@3 ~ [bb3,bb5]@8 [ab3,ab5]@16 [b3,b5]@8 [bb3,bb5]@8 db4@7 eb4@17, eb5, ~@13 ab5@3]/8", // Bb Ab B Bb
  U: "[bb5 [ab4,ab5]@2 [gb4,b5]]/2", V: "[[eb4,bb5] ab5@2 gb5, ~ ab4@3]/2", W: "[[eb4,bb5] [ab4,ab5]@2 [gb4,b5]]/2",
  X: "[[eb4,bb5]@8 [ab4,ab5]@16 ~ gb5@7, ~@24 gb4@7 ~]/2", Y: "[[bb3,bb5] [ab3,ab5]@2 [b3,b5]]/2",
  Z: "[[bb3,bb5]@8 db4@7 ~@17 bb5@8 [ab4,ab5]@16 [gb4,b5]@8, ~ ab5@3 ~@4, ~@15 eb4@25 ~@24]/4", // Bb Ab B5
})).s("gm_string_ensemble_1").gain(0.25)

// other · synth brass 1 · "SynthBras"
const synth_brass_1 = note(`<
  ~ A B A B ~@30 C D@3 E@2 F@2 G@2 H@2 ~@2 I J ~@8 K L K L K L K L K L K L K L K L K L K M ~@23 N
>`.pickRestart({
  A: "~@4 db5 eb5 gb5 ab5 ~@3 bb5 ~ bb5 f5 db5", B: "~@4 db5 eb5 gb5 ab5 ~@8",
  C: "eb3 bb3 eb3 db4 eb3 eb4 eb3 db4 eb3 bb3 eb3 db4 eb3 eb4 eb3!2",
  D: "~ eb3 bb3 db4 eb3 eb4 eb3 db4 eb3 bb3 eb3 db4 eb3 eb4 eb3!2",
  E: "[[eb3,bb3,eb4]@27 ~ [db3,ab3,db4] ~ [db3,ab3,db4] ~]/2", // Eb5 Db5
  F: "[[db3,ab3,db4] [eb3,bb3,eb4]@23 ~@2 [gb3,db4,gb4] ~@2 [gb3,db4,gb4] ~@2]/2", // Db5 Eb5 Gb5
  G: "[[eb3,bb3,eb4]@28 [db3,ab3,db4] ~ [db3,ab3,db4] ~]/2", // Eb5 Db5
  H: "[[db3,ab3,db4] [eb3,bb3,eb4]@23 ~ [gb3,db4,gb4] ~@2 [gb3,db4,gb4] ~@3]/2", I: "[db3,ab3,db4] [eb3,bb3,eb4]@14 ~",
  J: "[eb3,eb4]!2 ~@2 [gb3,gb4]!2 ~@2 [ab3,ab4]!2 ~@2 [ab3,ab4] bb3 [db4,db5] [eb4,eb5]", K: "~@11 eb4 db4 eb4 gb4 ab4",
  L: "~@4 ab4 gb4 eb4 db4 ~@4 db4 eb4 gb4 eb4", M: "[gb3,b3,eb4]@7 ~ [ab3,db4,f4]@7 ~", N: "~@13 [db4,db5] ~ [eb4,eb5]",
})).s("gm_synth_brass_1").gain(0.22)

// other · electric guitar muted · "Mtd Guita"
const electric_guitar_muted = note("<~ A@4 ~@30 A@4 ~@20 B C D E F C D E F C D E F C D E F C D E ~@23 G>".pickRestart({
  A: "eb2 bb2 db3 eb3 ~ eb3 eb2 bb2 db3 eb3 ~ eb3 eb2 bb2 db3 eb3",
  B: "eb2 eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3 ~ eb3", C: "~ ab2 ~ ab2 ~ ab2 ~ db3 ~ db3 ~ db3 ~ db3 ~ eb3",
  D: "eb2 eb3 ~ eb3 ~ eb3 ~ eb3 eb2 eb3 ~ eb3 ~ db3 ~ eb3", E: "ab2 ~ ab2 ~ ab2!2 ~ db3 ~ db3 ~ db3 ~ db3 ~ eb3",
  F: "~ eb3 ~ eb3 ~ eb3 ~ eb3 db4 ~ db4 ~ db4 ~@3", G: "~@11 db3 ~ db3 ~ eb3",
})).s("gm_electric_guitar_muted").gain(0.29)

// drums · kick
const kick = s("bd").struct("<~ [x!4]!102>").gain(0.54)

// drums · rim
const rim = s("rim").struct("<[x!4] ~@102>").gain(0.42)

// drums · snare
const snare = s("sd").struct("<~@102 [~@15 x]>").gain(0.6)

// drums · clap
const clap = s("cp").struct("<~ [~ x ~ x]!102>").gain(0.54)

// drums · low tom
const low_tom = s("lt").struct("<~@28 A ~@21 A ~@21 A B ~ C D C E ~@16 F G H I J K F L>".pickRestart({
  A: "~@14 x!2", B: "~ x ~@14", C: "~ x ~@2", D: "~@9 x ~ x ~@4", E: "~@12 x!4", F: "~ x ~ x", G: "~@4 x ~@7 x ~@2 x",
  H: "~ x ~@2 x ~@7 x ~@3", I: "~ x ~@2 x ~@2 x ~ x ~@2 x ~ x ~", J: "~ x ~@2 x ~@4 x ~@2 x ~@3",
  K: "~@4 x ~@2 x ~ x ~@2 x ~ x ~", L: "~@4 x ~@3 x ~@2 x ~ x ~@2",
})).gain(0.54)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A B C D A B C D A B C D A B C D A B C D A B C D A B C E F B C D A B A B C D A B C D A B C D A B C E F B C D F B C D
  A B C D A B C D A B C D A B C D A B C D F B C D F B C D F B C D F B C D F B C D F B C D
>`.pickRestart({
  A: "x!4 ~@7 x!5", B: "x!4 ~@5 x ~ x!2 ~ x!2", C: "x!4 ~@7 x!3 ~ x", D: "x!4 ~ x ~ x ~ x ~ x!5", E: "x!4 ~ x ~ x ~@8",
  F: "~@2 x!2 ~@7 x!5",
})).gain(0.42)

// drums · mid tom
const mid_tom = s("mt").struct("<~@28 A ~@21 A ~@21 B ~@2 C ~ C D ~@16 E@5 C@2 ~>".pickRestart({
  A: "~@12 x!2 ~@2", B: "~@13 x ~@2", C: "~@3 x ~@12", D: "~@7 x!4 ~@5", E: "~@3 x ~@7 x ~@4",
})).gain(0.48)

// drums · high tom
const high_tom = s("ht").struct("<~@28 A ~@21 A ~@21 B ~@2 C ~ C D ~@16 E@7 C>".pickRestart({
  A: "~@9 x!3 ~@4", B: "~@9 x ~ x ~@4", C: "~ x ~@6", D: "~ x!6 ~@9", E: "~ x ~@3 x ~@2",
})).gain(0.48)

// drums · crash
const crash = s("cr").struct("<~@29 A ~@21 A ~@3 A ~@23 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3>".pickRestart({
  A: "x",
})).gain(0.54)

stack(
  piano, bass, epiano2, string_ensemble_1, synth_brass_1, electric_guitar_muted, kick, rim, snare, clap, low_tom, hihat,
  mid_tom, high_tom, crash
)

More by Chaka Khan