Strudelify

Feels So Good (Blacksmith R&B Rub) (feat. Know ?uestion)

Melanie

KeyD majorTempo85 bpm
0:00/0:00
// Feels So Good (Blacksmith R&B Rub) (feat. Know ?uestion) — Melanie
// 85 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 15 choir aahs (copy of ch 13 pan flute); ch 3 voice oohs (copy of ch 13 pan flute)
// note: Full arrangement: all 107 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(85/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · epiano2 · "om"
const epiano2 = note(`<
  ~@2 A@3 B A@3 B A@3 B A@3 B C D E F C D E F C D E F A@3 G A@3 G C D E F C D E F C D E F A@3 G A@3 G H I J G K L M G
  A@3 G A@3 G A@3 G A@3 G A@3 G A@3 G A@3 G A@3 G ~@9
>`.pickRestart({
  A: "[g4,b4,e5]@3 ~ d5@3 ~ [f#4,a4,e5]@2 f#5@2 d5@2 e5@2", // Em F#m7
  B: "[g4,b4,g5]@2 [g4,b4,g5]@2 [f#4,a4,f#5]@2 [f#4,a4,f#5]@2 [e4,g4,e5]@2 [e4,g4,e5]@2 [f#4,a4,f#5]@3 ~", // G F#m Em F#m
  C: "[g3,c#4,e4]@2 a4@5 ~ [f#3,a3,d4,f#4]@3 ~@5", D: "[g3,c#4,e4,a4]@5 ~ [f#3,f#4]@2 [a3,d4]@3 ~@3 c#4@2",
  E: "[g3,e4,a4]@3 ~@3 f#4@2 [f#3,a3,d4]@7 ~", // A7 D
  F: "[g3,b3,d4,f#4,g4]@3 ~ [f#3,a3,d4,f#4]@3 ~ [e3,a3,c#4,e4]@3 ~ [e3,a3,c#4,f#4]@3 ~", // Gmaj7 D A F#m7
  G: "[g4,b4,g5] g5 [f#4,a4,f#5] f#5 [e4,g4,e5] e5 [f#4,a4,f#5] e5", // G F#m Em F#m
  H: "[a4,d5,f#5]@5 ~ [d5,e5]@2 [a#4,c#5,e5]@2 f#5@5 ~", I: "[f#4,c5,e5]@7 ~ [f#4,c5,e5]@2 [a4,f#5]@2 d5@2 [c5,e5]@2",
  J: "[f#4,b4,d5,f#5]@3 ~@3 [d5,e5]@2 [e4,a4,c#5,e5]@2 f#5@2 d5@3 ~", K: "[f#4,b4,d5,f#5]@7 ~ a4@7 ~",
  L: "[f#4,b4,d5,f#5]@7 ~ [g#4,b4,d5,f#5]@7 ~", M: "[f#4,b4,d5,f#5]@5 ~ [d5,e5]@2 [e4,a4,c#5,e5]@2 f#5@2 d5@3 ~",
})).s("gm_epiano2").gain(0.56)

// other · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~@2 A@3 B A@3 B A@3 B A@3 B ~@8 A@3 B A@3 B A@3 B ~@8 A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3
  B A@3 B A@3 B A@3 B A@3 B ~
>`.pickRestart({
  A: "~@4 f#4 e4 d4 e4 b3@3 ~@5", B: "g3@2 b3 d4 f#3@2 a3 c#4 e3@2 g3 b3 f#3@2 a3 c#4",
})).s("gm_acoustic_guitar_nylon").gain(0.56)

// bass · electric bass pick · "Also exclusive to..."
const bass = note(`<
  ~@5 A B@3 C B@3 C B@3 C ~@10 D C B@3 C B@3 C ~@10 D C B@3 C B@3 E F G H E F G H I J ~@2 A B@3 K B@3 K B@3 K B@3 K B@3
  K B@3 K B@3 K B@3 K B@3 C ~
>`.pickRestart({
  A: "~@14 b1 [c2,d2]", B: "e2@3 ~ d2@3 ~ b1@3 ~@3 b1 [c2,d2]", C: "g1!2 f#1!2 e1!2 f#1!2", D: "~@4 d2@3 ~ b1@7 ~",
  E: "g1@2 g1@2 f#1@2 f#1@2 e1@2 e1@2 f#1@2 g2 [a2,b2]", F: "b2@7 ~ f#2@7 ~", G: "d2@5 ~ d3@4 c3@4 a2@2",
  H: "f#2@5 ~ d2@2 a2@7 ~", I: "g1@2 g1@2 f#1@2 f#1@2 e1@2 e1@2 f#1@2 ~ [b1,c2]", J: "d2 ~@15",
  K: "g1@2 g1@2 f#1@2 f#1@2 e1@2 e1@2 f#1@2 b1 [c2,d2]", // Csus2
})).s("gm_electric_bass_pick").gain(0.72)

// other · tubular bells
const tubular_bells = note(`<
  ~@6 A@3 B A@3 B A@3 B ~@12 A@3 B A@3 B ~@12 A@3 B A@3 B ~@17 A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 ~
>`.pickRestart({
  A: "e4@3 ~ d4@3 ~@9", B: "g4@3 ~ f#4@3 ~@9",
})).s("gm_tubular_bells").gain(0.72)

// chords · music box · "Enjoy!"
const music_box = note(`<
  ~@6 A@3 ~ A B@2 ~ A B@2 ~@13 A B@2 ~ A B@2 ~@13 A B@2 ~ A B@2 ~ C D E F G H I J ~@4 A@3 ~ A B@2 ~ A B@2 ~ A B@2 ~ A
  B@2 ~ A B@2 ~ A B@2 ~ A B@2 ~ A B@2 ~@2
>`.pickRestart({
  A: "[e4,b4]@3 ~ [d4,a4]@7 ~@5", B: "[e4,b4]@3 ~ [d4,a4]@11 ~", C: "~@2 a4@3 ~ [f#4,a4]@2 e4@7 ~",
  D: "~@2 a4@4 f#4@2 e4@7 ~", E: "~@2 a4@9 ~ a4@3 ~", F: "f#4@3 ~ f#4@7 ~@5", G: "~@2 a4@4 f#4@2 e4@3 ~@5",
  H: "~@2 a4@4 [f#4,a4]@2 e4@7 ~", I: "~@2 a4@5 ~ f#4@7 ~", J: "a4!2 g4!2 a4!2 b4 a4",
})).s("gm_music_box").gain(0.72)

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

// drums · rim
const rim = s("rim").struct("<~@2 [~@3 x ~@2 x ~]!104 ~>").gain(0.8)

// drums · snare
const snare = s("sd").struct("<~@97 [~@13 x ~ x] ~@9>").gain(0.8)

// drums · clap
const clap = s("cp").struct("<~@10 A@8 ~@12 A@8 ~@12 A@16 ~@8 A@32 ~>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(0.8)

// drums · low tom
const low_tom = s("lt").struct("<~@106 x>").gain(0.8)

// drums · hihat
const hihat = s("hh").struct("<[x!4] ~@17 [~ x ~ x ~ x ~ x]!12 ~@8 [~ x ~ x ~ x ~ x]!12 ~@16 [~ x ~ x ~ x ~ x]!8 ~@33>")
  .gain(0.8)

// drums · crash
const crash = s("cr").struct(`<
  ~@30 A ~@19 A ~@3 A ~@19 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A
>`.pickRestart({
  A: "x",
})).gain(0.8)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@2 [~ x ~@3 x ~@2]!104 ~>").gain(3.65)

// drums · shaker
const shaker = s("sh").struct("<~@2 [~@5 x!2 ~@4 x!5]!104 ~>").gain(0.72)

stack(
  epiano2, acoustic_guitar_nylon, bass, tubular_bells, music_box, kick, rim, snare, clap, low_tom, hihat, crash, cabasa,
  shaker
)