Strudelify

Don't Leave Me

Blackstreet

KeyD minorTempo84 bpm
0:00/0:00
// Don't Leave Me — Blackstreet
// 84 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 78 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(84/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.

// other · acoustic guitar steel · "STEELSTRGR"
const acoustic_guitar_steel = note(`<
  ~ A@2 B ~ A@2 C@2 A@2 B ~ A@2 B ~@9 A@2 C@2 A@2 B ~ A@2 B ~@9 A@2 C@2 A@2 B ~ A@2 B ~@9 A@2 C@2 A@2 B ~ A@2 B ~@2
>`.pickRestart({
  A: "[~@2 d4@2 c4!2 a3@2 g3!2 a3@2 g3!2 f3@6 ~@12]/2", B: "~@6 f4 e4@2 d4 c4@6", C: "[~@6 f4 e4@2 d4 c4@14 ~@8]/2",
})).s("gm_acoustic_guitar_steel").gain(0.35)

// bass · synth bass 2 · "SYNTHBASS2"
const bass = note(`<
  ~ A B C D E B F G A B C D A B C D A B C D A B C D E B F G A B C D A B C D A B C D A B C D E B F G A B C D A B C D A B
  C D A B C D E B F G A B C D A B C D ~
>`.pickRestart({
  A: "d2@12 gb1@3 ~", B: "g1@3 d2", C: "c2@3 e1", D: "~@8 f2@4 eb2@3 ~, f1@11 ~@5", E: "~@12 gb1@3 ~, d2",
  F: "~@12 e1 ~@3, c2", G: "f1@2 f2 eb2",
})).s("gm_synth_bass_2").gain(0.5)

// chords · piano · "PIANO3"
const piano = note(`<
  ~@8 A B@2 C@2 B@2 D@2 B@2 C@2 B@2 D@2 ~@3 A B@2 C@2 B@2 D@2 B@2 C@2 B@2 D@2 ~@3 A B@2 C@2 B@2 D@2 B@2 C@2 B@2 D@2 ~@3
  A B@2 C@2 B@2 D@2 ~
>`.pickRestart({
  A: "~@8 d4 e4 d4 e4 d4 e4 d4 e4",
  B: "[[d3,d4] [e3,e4] [f3,f4] [e3,e4] [d3,d4] ~ [a2,a3] ~@3 [gb2,c4,d4,gb4]@4 ~@8 [g3,g4] [a3,a4] [bb3,bb4] [a3,a4] [g3,g4] ~ [e3,e4] ~ [c3,c4] ~, ~@7 [g2,d4]@9, ~@7 [bb3,a4]@5 ~@4]/2", // D E F E D A D7 G …
  C: "[[c3,c4] [d3,d4] [e3,e4] [d3,d4] [c3,c4] ~ [g2,g3] ~@3 [c3,c4,e4,g4]@4 [c4,d4,f4,bb4]@4 [c4,f4,a4]@3 [d2,c4] [e2,d4,gb4,a4]@4 [a2,g3,db4,f4,g4]@6, ~@7 f2@4 ~@5]/2", // C D E D C G C Bb …
  D: "[[c3,c4] [d3,d4] [e3,e4] [d3,d4] [c3,c4] ~ [g2,g3] ~@3 [c3,c4,e4,g4]@4 [c4,d4,f4,bb4]@4 [c4,f4,a4]@3 [d2,c4] d4@2 d4 e4 d4 e4 d4 e4 d4 e4, ~@7 f2@4 [e2,gb4,a4]@2 [a2,g3,db4,f4,g4]@3]/2", // C D E D C G C Bb …
})).s("gm_piano").gain(0.4)

// chords · epiano2 · "ELECPIANO2"
const epiano2 = note(`<
  ~@5 A@5 B@2 C@2 D@2 E ~@8 A@5 B@2 C@2 D@2 E ~@8 A@5 B@2 C@2 D@2 E ~@8 A@5 B@2 C@2 D@2 E ~
>`.pickRestart({
  A: "[d4@3 e4@3 f4@3 a4@3 g4@3 a4@3 g4@3 a4@3 g4@3 d4@2 e4 ~ g4@2 ~ g4@2 ~@8 c4 d4 ~ c5@2 bb4@2 a4@2 g4 f4@6 [d4,f4,a4] ~ [d4,f4,a4]@7 ~@11]/5", // Dm
  B: "[~@4 [d4,g4,c5] ~ [d4,g4,bb4]@5 ~ [d4,f4,a4] ~ [e4,g4]@12 ~ g4 e4 ~ [d4,f4,bb4]@2, ~@14 c4@11 ~ c4@2 ~@4]/2", // Csus2 Gm Dm Em Bb
  C: "[~@2 [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~ [c4,e4,g4]@3 ~ [d4,f4,a4]@10 ~@8]/2", // Dm C Dm
  D: "[~@4 [d4,g4,c5] ~ [d4,f4,bb4]@6 [d4,f4,a4] ~ [c4,e4,g4]@11 ~@2 g4 e4 ~ [d4,f4,bb4]@2, ~@13 c4 ~@2]/2", // Csus2 Bb Dm C Bb
  E: "~@2 [d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~ [c4,e4,g4]@3 ~ [d4,f4,a4]@2", // Dm C Dm
})).s("gm_epiano2").gain(0.35)

// other · epiano1 · "ELECPIANO1"
const epiano1 = note("<~@5 A@5 B@4 C@3 ~@8 A@5 B@4 C@3 ~@8 A@5 B@4 C@3 ~@8 A@5 B@4 C@3 ~>".pickRestart({
  A: "[d4@3 e4@3 f4@3 a4@3 g4@3 a4@3 g4@3 a4@3 g4@3 d4@2 e4 ~ g4@2 ~ g4@2 ~@8 c4 d4 ~ c5@2 bb4@2 a4@2 g4 f4@6 [d4,f4,a4] ~ [d4,f4,a4]@7 ~@11]/5", // Dm
  B: "[~@4 bb4 ~ bb4@6 a4 ~ g4@14 d4@2 bb4@6 a4 ~ a4@6 g4 ~ a4@14 ~@4]/4",
  C: "[~@4 bb4 ~ bb4@6 a4 ~ g4@14 d4@2 bb4@6 a4 ~ a4@6 g4 ~ a4@2]/3",
})).s("gm_epiano1").gain(0.4)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@9 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@4 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@4 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@4 A@2
  B@2 A@2 B@2 ~
>`.pickRestart({
  A: "[~@5 [gb3,c4,d4,gb4]@2 [g3,bb3,d4,a4]@9]/2", // D7 Gm
  B: "[~@5 [e3,c4,e4,c5]@2 [d4,bb4]@2 [c4,a4]@2 [e3,d4,gb4,a4]@2 [db4,f4,g4]@3, ~@7 [f3,f4]@4 ~@2 a3@2 ~]/2", // C Gm F D Gm7b5 F
})).s("gm_string_ensemble_2").gain(0.4)

// other · harmonica
const harmonica = note("<~@56 A B C@2 D E F G H I J@3 ~@9>".pickRestart({
  A: "~@12 d5 e5 f5 g5", B: "a5 ~@3 g5 ~@3 f5 ~@3 e5 ~@3",
  C: "[d5@3 c5 d5 c5 a4 g4@7 d5 c5@3 a4 g4@3 d5 c5@3 a4 g4@5]/2",
  D: "g4 ~ c5 d5 g4 e5 g4 [f5,g5] g4 [g5,a5] ~ a5@2 g5 f5 e5, ~ a4@2 ~@13", // Fsus2 Gsus2
  E: "~@2 e5 f5 g5 ~ g5 ~ g5 f5 e5 f5 ~ g5 ~ a5", F: "~ bb5 ~ c6@3 bb5 a5 ~@4 c6 ~@3",
  G: "[b5,c6] bb5 ~ a5 ~ g5 ~ f5@3 g5 ~@5", H: "~@2 d5 e5 f5 ~@3 g5@3 ~ g5 [f5,g5] e5@2", I: "f5@2 g5 ~@3 d5 ~@9",
  J: "[c5 d5 e5 f5 ~ g5 ~ a5@4 ~ a5 g5 f5 g5 g5 ~ g5 ~@7 a5 bb5 ~ c6 ~ d6@2 c6 bb5 a5 bb5 a5 g5 a5 g5 f5 g5@4 f5 ~, ~@5 f5 ~@10]/3",
})).s("gm_harmonica").gain(0.45)

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

// drums · rim
const rim = s("rim").struct(`<
  ~@9 A B A B A B A B A B A B A B A B ~@4 A B A B A B A B A B A B A B A B ~@4 A B A B A B A B A B A B A B A B ~@4 A B A
  B A B A B ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!2 ~",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct(`<
  ~@9 A B A C A B A C A B A C A B A C ~@4 A B A C A B A C A B A C A B A C ~@4 A B A C A B A C A B A C A B A C ~@4 A B A
  C A B A C ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!2 ~", C: "~@2 x ~@2 x ~@2",
})).gain(0.45)

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

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

// drums · ride
const ride = s("rd").struct(`<
  ~@9 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@4
>`.pickRestart({
  A: "~@7 x",
})).gain(0.35)

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

stack(
  acoustic_guitar_steel, bass, piano, epiano2, epiano1, string_ensemble_2, harmonica, kick, rim, snare, hihat, open_hat,
  ride, crash
)

More by Blackstreet