Strudelify

The Sweetest Taboo

Sade

KeyB♭ minorTempo96 bpm
0:00/0:00
// The Sweetest Taboo — Sade
// 96 bpm, 4/4, key A# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 5 "Sax / Melody" named as a reed, played on alto sax (its synth choir patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 98 bars on a 16-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.

// other · piano · "Ac.Piano"
const piano = note("<~@37 A@2 ~@14 B@2 ~@4 A@2 ~@10 B@2 ~@25>".pickRestart({
  A: "[~@13 f4 ab4 [f4,bb4,db5]@3 ~@14]/2", B: "[~@13 f5 ab5 eb5@5 ~@12]/2",
})).s("gm_piano").gain(0.64)

// bass · acoustic bass · "Bass"
const bass = note(`<
  ~@12 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 C D E F C D E F 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 ~@2
>`.pickRestart({
  A: "bb2@3 ab2@3 bb2 ~@5 ab2 ~@3", B: "~@3 ab2@3 bb2 ~@9", C: "bb2 ~@2 bb2 ~ ab2 bb2 ~@8 f2, ~@7 eb2",
  D: "bb2 ~@2 bb2 ~ ab2 bb2 ~@9", E: "eb2@2 ~ eb2 eb3 ~ eb3 ~@9", F: "eb2@2 ~ eb2 eb3 ~ eb3 ~@6 eb3 db3 ~",
})).s("gm_acoustic_bass").gain(0.64)

// chords · slap bass 1 · "Slap bass"
const slap_bass_1 = note(`<
  ~@4 A B A B A B A B ~@8 A B A B A B A B A B A B A B A B A B A B A B ~@8 A B A B A B A B A B A B A B ~@10 C B A B A B A
  B A B A B A B A B A B A B A B ~@2
>`.pickRestart({
  A: "[bb4,db5]@3 [f4,bb4] ~ [eb4,ab4] ~ [db4,f4] [eb4,ab4] ~ [f4,bb4] ~ [bb4,db5]@2 ~@2", // Bbm Bb5 Ab5 Db Ab5 Bb5 Bbm
  B: "[bb4,db5]@2 ~ [f4,bb4] ~ [eb4,ab4] ~ [db4,f4] [eb4,ab4] ~@3 [c5,eb5]@2 ~@2", // Bbm Bb5 Ab5 Db Ab5 Cm
  C: "[bb4,db5]@3 bb4 ~ [eb4,ab4] ~ db4 [eb4,ab4] ~ [f4,bb4] ~ [bb4,db5]@2 ~@2", // Bbm Ab5 Bb5 Bbm
})).s("gm_slap_bass_1").gain(0.09)

// chords · french horn · "Horns"
const french_horn = note("<~@42 A@2 B ~@53>".pickRestart({
  A: "[[bb4,c5,f5]@21 ~@3 [bb4,c5,f5]!2 ~@6]/2", B: "[bb4,db5,f5]!2 ~@14",
})).s("gm_french_horn").gain(0.45)

// other · vibraphone · "Vibes" · Bbm
const vibraphone = note("<~@80 [[bb4,db5] db5 ~ bb4 db5!2 ~ bb4 db5!2 ~ bb4 db5!2 ~ bb4]!16 ~@2>")
  .s("gm_vibraphone").gain(0.17)

// chords · piano · "E.Piano"
const piano_2 = note(`<
  ~@4 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 C@2 D@2 C@2 D@2 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 ~@18
>`.pickRestart({
  A: "[bb3,db4,f4] [ab3,c4,eb4]", B: "[gb3,bb3,db4]@8 [gb3,bb3,db4] ~@3 [ab3,c4,eb4]@4", C: "[bb3,c4,f4]/2",
  D: "[[bb3,db4,f4]@7 ~]/2", // Bbm
})).s("gm_piano").gain(0.41)

// other · pan flute
const pan_flute = note("<~@45 A ~@18 B C D E D F E G ~@26>".pickRestart({
  A: "~@12 ab5 bb5 ab5 bb5", B: "bb3!2 ab3 bb3 ~ [ab3,bb3] ~@2 bb3 ~ ab3 ~ bb3 ~@3",
  C: "bb3!2 ab3 bb3 ~ ab3 ~ bb3 ~ ab3 ~ db4 ~ ab3 ~@2", D: "bb3!2 ab3 bb3 ~ ab3 ~ bb3 ~ ab3 ~ bb3!2 ~ ab3 ~",
  E: "bb3!2 ab3 bb3 ~ ab3 ~ bb3 ~ ab3 ~ bb3 db4 ~ ab3 ~", F: "bb3!2 ab3 bb3 ~ ab3 ~ bb3 ~ ab3 ~ bb3 db4 ~ bb3 ~",
  G: "bb3!2 ab3 bb3 ~ ab3 ~ bb3 ~ ab3 ~ bb3 ab3 ~@3",
})).s("gm_pan_flute").gain(0.1)

// drums · kick
const kick = s("bd").struct("<[x ~@2 x ~@2 x ~@2 x ~@6]!96 ~@2>").gain(0.72)

// drums · rim
const rim = s("rim").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B@11 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@3 A B A B A B@11 ~@2
>`.pickRestart({
  A: "~@2 x ~@2 x ~@2 x ~@7", B: "~@2 x ~@2 x ~@2 x ~ x ~@5",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B@11 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@3 A B A B A B@11 ~@2
>`.pickRestart({
  A: "~@3 x", B: "~@6 x!2",
})).gain(0.72)

// drums · hihat
const hihat = s("hh").struct("<[~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!96 ~@2>").gain(0.64)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<[x!8]!96 ~@2>").gain(0.32)

stack(piano, bass, slap_bass_1, french_horn, vibraphone, piano_2, pan_flute, kick, rim, snare, hihat, hihat_soft)

More by Sade