Strudelify

Close to You

Maxi Priest

KeyE♭ minorTempo96 bpm
0:00/0:00
// Close to You — Maxi Priest
// 96 bpm, 4/4, key D# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 102 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(96/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A B C D A B C D A B C D E F G H E F G H I J K L K L M I J K L K N E F G H E F G H I J K L K L M I J K L K N E F G H
  E F G H A B C D A B C D A B C D E F G H E F G H E F G H E F G H E F G H E F G H O@3
>`.pickRestart({
  A: "eb2@2 gb2 ~@2 gb2 bb1@2 ~ db2 ~@8 bb1@2 db2 ~@2 db2",
  B: "eb2@2 gb2 ~@2 gb2 bb1 ~@2 db2 ~@5 bb1@2 db2 eb2@2 db2 bb1 ~@2",
  C: "ab1 ~ ab1 ~@2 ab1 ab2 ~@2 ab1@2 ~@9 ab2 ab1@2 ab2", D: "bb1 ~ bb1 ~@2 bb1 bb2 ~@2 bb1@2 ~@9 bb1 db2@3",
  E: "eb2@2 gb2@2 ~ gb2 eb2 ~@2 bb1@5 ~ bb1 ~@4 bb1 bb2@2 ~", F: "ab1@5 ab2 ~@3 ab1@9 ~@2 ab1 ab2@3",
  G: "bb1@5 bb2 ~@3 bb2@5 bb1 bb2 ~@2 bb2@2 ~ bb1@2 ~", H: "eb2@3 ~@2 db2 ~@3 eb2@4 ~ db2 ~@3 eb2@2 db2 bb1@2 ~",
  I: "eb2 ~@4 eb2 ~@3 eb2@9 ~@2 eb2 bb1@2 ~", J: "db2 ~@4 db2 ~@3 db2@9 ~@2 db2 ~@3",
  K: "b1 ~@4 b1 ~@3 b1@11 gb1 b1 ~@2", L: "db2 ~@4 db2 ~@3 db2@5 ab1 db2 ~@2 db2@2 ab1 db2@2 ~",
  M: "eb2 ~@4 eb2 ~@2 bb1 eb1@4 ~ eb1 bb1@2 ~ eb2@2 bb1 eb1@2 ~", N: "bb1@4 ~ bb2 ~@3 bb1@11 bb2 bb1 ~@2",
  O: "[eb1@49 ~@23]/3",
})).s("gm_acoustic_bass").gain(0.72)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  ~ A B C D A B C E A B C F G H I J G H I J K L M N M N O K L M N M P G H I J G H I J K L M N M N O K L M N M P G H I J
  G H I J Q@2 R S T U V W T U V W G H I J G H I J G H I J G H I J G H I J G H I J X@2 ~
>`.pickRestart({
  A: "eb3@2 gb3 ~@2 gb3 bb2@2 ~ db3 ~@8 bb2@2 db3 ~@2 db3",
  B: "eb3@2 gb3 ~@2 gb3 bb2 ~@2 db3 ~@5 bb2@2 db3 eb3@2 db3 bb2 ~@2",
  C: "ab2 ~ ab2 ~@2 ab2 ab3 ~@2 ab2@2 ~@9 ab3 ab2@2 ab3",
  D: "bb2 ~ bb2 ~@2 bb2 bb3 ~@2 bb2@2 ~@9 [bb2,ab3] [db3,ab3]@2 gb3", // Bb7 Db5
  E: "bb2 ~ bb2 ~@2 bb2 bb3 ~@2 bb2@2 ~@9 bb2 db3@3",
  F: "bb2 ~ bb2 ~@2 bb2 bb3 ~@2 bb2@2 ~ [eb4,eb5]@5 ~@3 bb2 db3@3, ~@9 [f4,f5]@2 ~", // Eb F
  G: "[eb3,bb3,db4,eb4,gb4,bb4]@3 [bb2,f3,ab3,db4,f4]@5", H: "[ab2,gb3,ab3,b3,eb4,gb4]@11 ~", I: "[bb2,f3,ab3,db4,f4]",
  J: "[eb3,bb3,db4,gb4,bb4]@7 ~", K: "[eb3,bb3,db4,bb4], gb4@11 ~", L: "[ab3,db4,f4]@7 ~",
  M: "[gb3,b3,eb4,gb4], bb3@3 ~", N: "[db3,ab3,db4,f4]@7 ~", O: "[eb3,gb3,bb3,eb4,gb4]@11 ~",
  P: "[b3,d4,gb4,ab4]@2 [eb4,f4,eb5] f4, ~@6 [ab3,bb3,d4]@5 ~, ~@9 f5@2 ~", // Abm7b5 Ebsus2 Bb7
  Q: "[eb3@2 gb3 ~@2 gb3 bb2@2 ~ db3 ~@8 bb2@2 db3 ~@2 db3 eb3@2 gb3 ~@2 gb3 bb2 ~@2 db3 ~@5 bb2@2 db3 eb3@2 db3 bb2 ~@2, [eb4,gb4,bb4]@11 ~, eb5@7 ~]/2", // Ebm
  R: "ab2 ~ ab2 ~@2 ab2 ab3 ~@2 ab2@2 ~@9 ab3 ab2@2 ab3, [ab4,eb5]@23 ~, b4@7 ~", // Ab5
  S: "bb2 ~ bb2 ~@2 bb2 bb3 ~@2 bb2@2 ~@9 [bb2,ab3] [db3,ab3]@2 gb3, bb4@5 ~", T: "[eb3,bb3,eb4,gb4,bb4]@23 ~",
  U: "[eb3,bb3,eb4,gb4]", V: "[ab3,b3,eb4]", W: "[bb3,d4,gb4]@6 [bb3,d4,f4]@5 ~", X: "[eb3,bb3,db4,gb4,bb4]/2",
})).s("gm_epiano2").gain(0.59)

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

// drums · snare
const snare = s("sd").struct(`<
  A B A B A B A B A B A B C A@7 D A B A B A B A B A B A B C A@7 D A B A B A B A B A B A B C A@7 D A@11 C A@7 D A@7 D A@7
  C ~@3
>`.pickRestart({
  A: "~ x ~ x", B: "~@3 x ~@3 x ~ x ~@2", C: "~@6 x ~@15 x!2", D: "~@6 x ~@16 x",
})).gain(0.69)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  A B A B C B C B C D E ~ F ~ G ~ G ~ G ~ H I ~ J ~ E ~ E ~ E ~ E ~ F ~ G ~ G ~ G ~ H I ~ J ~ E ~ E ~ E ~ E ~ F ~ G ~ G
  ~ G ~ H ~ G ~ G ~ G ~ G ~ G ~ K ~ G ~ G ~ G ~ H ~ G ~ G ~ G ~ H ~ G ~ G ~ G ~ K ~@3
>`.pickRestart({
  A: "~@8 x ~@2 x ~@5 x ~@3 x ~ x", B: "~@8 x!2 ~ x ~@12", C: "~@11 x ~@5 x ~@3 x ~ x", D: "~ x ~",
  E: "~@11 x ~@5 x ~@5 x", F: "~@11 x ~@2 x ~@4 x ~@4", G: "~@14 x ~@8 x", H: "~@14 x ~@3 x ~ x!2 ~@2",
  I: "~@8 x ~@2 x ~@11 x", J: "~@8 x ~@2 x ~@5 x ~@5 x", K: "~@18 x!4 ~@2",
})).gain(0.14)

// drums · clap
const clap = s("cp").struct("<~@12 A B@8 ~@12 A B@8 ~@12 A B@8 ~@39>".pickRestart({
  A: "~@3 x", B: "~ x ~ x",
})).gain(0.69)

// drums · low tom
const low_tom = s("lt").struct("<~@12 [~@3 x] ~@20 [~@3 x] ~@20 [~@3 x] ~@47>").gain(0.69)

// drums · hihat
const hihat = s("hh").struct(`<
  A@64 B A B A B A B A B A@3 B A B A B A C A B A B A B A C A B A B A B A@2 ~@3
>`.pickRestart({
  A: "x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x", B: "x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~@2 x ~ x!2 ~ x!2 ~@2",
  C: "x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~@2 x ~ x!2 ~@2 x ~@2",
})).gain(0.21)

// drums · open hat
const open_hat = s("oh").struct("<~@99 x ~@2>").gain(0.69)

// drums · tambourine
const tambourine = s("tb").struct(`<
  A B A B A B A B A B A B A@2 B A B A B A B A B A B A B A B A B A B A@2 B A B A B A B A B A B A B A B A B A B A@2 B A B
  A B A B ~@39
>`.pickRestart({
  A: "x ~ x!2 ~ x!2 ~ x!2 ~ x ~@2 x!2 ~ x!2 ~ x!2 ~ x", B: "x ~ x!2 ~ x!2 ~@2 x ~ x ~@2 x!2 ~ x!2 ~ x!2 ~ x",
})).gain(0.21)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@13 A B A B A B A B ~@13 A B A B A B A B ~@13 A B A B A B A B C D C D C D C D C D C D C D C D C D C D C D C D C D C D
  C D C D C D C D ~@3
>`.pickRestart({
  A: "~@3 x ~@10 x!2 ~@8", B: "~@8 x ~@2 x ~@8 x ~@3", C: "~ x ~@3 x ~@2", D: "~@8 x ~@2 x ~@12",
})).gain(2.21)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  ~@13 A B A B A B A B ~@13 A B A B A B A B ~@13 A B A B A B A B C D C D C D C D C D C ~ C D C D C D C ~ C D C D C D C ~
  C D C D C D C ~@4
>`.pickRestart({
  A: "~@9 x ~ x ~@12", B: "~@9 x ~@11 x ~ x", C: "~@11 x ~@12", D: "~@7 x",
})).gain(2.21)

// drums · shaker
const shaker = s("sh").struct(`<
  A@63 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 ~@3
>`.pickRestart({
  A: "x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x", B: "~@2 x ~@5 x ~@3 x ~@4 x ~@2 x!2 ~ x",
  C: "~@2 x!2 ~@8 x ~@4 x ~@6",
})).gain(0.21)

stack(bass, epiano2, kick, snare, snare_soft, clap, low_tom, hihat, open_hat, tambourine, congas, congas_2, shaker)