Strudelify
Love & Devotion cover art

1995 · Another Night

Love & Devotion

Real McCoy

KeyB♭ minorTempo102 bpm
0:00/0:00
// Love & Devotion — Real McCoy
// 102 bpm, 4/4, key A# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 103 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(102/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 · drawbar organ · "ORGAN 1"
const drawbar_organ = note(`<
  ~@12 A@2 B A ~ A@2 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A ~ A@2 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A ~@4 A@2 B A@3
  B A@3 B A@3 B A@3 B A@3 B A ~
>`.pickRestart({
  A: "~@4 [bb4,db5,f5] ~@7 [bb4,db5,f5] ~@7 [ab4,c5,eb5] ~@7 [ab4,c5,eb5] ~@3", // Bbm Ab
  B: "~@4 [bb4,db5,f5] ~@7 [bb4,db5,f5] ~@7 [bb4,db5,gb5] ~@7 [bb4,db5,gb5] ~@3", // Bbm Gb
})).s("gm_drawbar_organ").gain(0.64).pan(0.8)

// bass · synth bass 1 · "SYN BASS 1"
const bass = note(`<
  ~@12 A B C D ~ A B C D A B C D A B C ~ 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 ~ A B C D A B C D A B C
  D A B C D E F G H A B C D A B C D A B C D A B C D A B C D A B C D ~
>`.pickRestart({
  A: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1@2 ~@2 bb1@3 ~ f1@5 ~ f1@2 ~@4 ab1@2 ~@2",
  B: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1@3 ~ bb1@3 ~ f1@4 ~@2 f1@3 ~@3 ab1@3 ~",
  C: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~@3 bb1@2 ~@2 f1@4 ~@2 f1@3 ~@3 ab1@2 ~@2",
  D: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1@2 ~@2 bb1@3 ~ f1@4 ~@2 f1@4 ~@2 ab1@3 ~",
  E: "bb1@4 ~@2 bb1@4 ~@2 bb1@3 ~ f1@4 ~@2 f1@4 ~@2 ab1@2 ~@2",
  F: "bb1 ~ bb1 ~ bb1 ~ bb1@3 ~@3 bb1@3 ~ f1@4 ~@2 f1@4 ~@2 ab1@2 ~@2",
  G: "bb1@3 ~@3 bb1@4 ~@2 bb1@3 ~ f1@4 ~@2 f1@4 ~@2 ab1@3 ~",
  H: "bb1 ~ bb1 ~ bb1 ~ bb1@4 ~@2 bb1@3 ~ f1@4 ~@2 f1@4 ~@6",
})).s("gm_synth_bass_1").gain(0.64)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  A B C A@2 B C A@2 B C A@2 B C A ~@9 D E F D A B C A@2 B C A@2 B C A@2 B C A ~@9 D E F D A B C A@2 B C A G H I G@2 H I
  G A B C A@2 B C A@2 B C A@2 B C A@2 B C A G H I G@2 H I G ~
>`.pickRestart({
  A: "[bb3,db4,f4] [ab3,c4,eb4]", B: "[gb3,bb3,db4] [ab3,c4,eb4]", C: "[bb3,db4,f4] [bb3,db4,gb4]",
  D: "[bb3,db4,f4]@4 ~@8 [bb3,db4,f4] ~@3 [ab3,c4,eb4]@4 ~@8 [ab3,c4,eb4] ~@3", // Bbm Ab
  E: "[gb3,bb3,db4]@5 ~@7 [gb3,bb3,db4] ~@3 [ab3,c4,eb4]@4 ~@8 [ab3,b3,eb4] ~@3", // Gb Ab Abm
  F: "[bb3,db4,f4]@5 ~@7 [bb3,db4,f4] ~@3 [bb3,db4,gb4]@4 ~@8 [bb3,db4,gb4] ~@3", G: "[bb4,db5,f5] [ab4,c5,eb5]",
  H: "[gb4,bb4,db5] [ab4,c5,eb5]", I: "[bb4,db5,f5] [bb4,db5,gb5]",
})).s("gm_synth_strings_1").gain(0.18).pan(0.7)

// other · brass section · "BRASS 1"
const brass_section = note(`<
  ~@8 A B C D E F G H ~@21 E F G H E F G H ~@21 E F G H E F G H ~@12 A B C D A B C D E F G H E F G H ~
>`.pickRestart({
  A: "bb3 ~ bb3 ~ bb3 ~ bb3 ~@3 ab3 ~@3 bb3 ~@15 f3 ~",
  B: "ab3 ~ bb3 ~ bb3 ~ bb3 ~@3 db4 ~@3 c4 ~@3 ab3 ~@3 f3 ~@7 f3 ~",
  C: "ab3 ~ bb3 ~ bb3 ~ bb3 ~@3 ab3 ~@3 bb3 ~@15 f3 ~", D: "ab3 ~ bb3 ~ bb3 ~ bb3 ~@3 db4 ~@3 c4 ~@3 bb3 ~@3 ab3 ~@9",
  E: "bb4 ~ bb4 ~ bb4 ~ bb4 ~@3 ab4 ~@3 bb4 ~@15 f4 ~",
  F: "ab4 ~ bb4 ~ bb4 ~ bb4 ~@3 db5 ~@3 c5 ~@3 ab4 ~@3 f4 ~@7 f4 ~",
  G: "ab4 ~ bb4 ~ bb4 ~ bb4 ~@3 ab4 ~@3 bb4 ~@15 f4 ~", H: "ab4 ~ bb4 ~ bb4 ~ bb4 ~@3 db5 ~@3 c5 ~@3 bb4 ~@3 ab4 ~@9",
})).s("gm_brass_section").gain(0.67).pan(0)

// other · pan flute
const pan_flute = note(`<
  ~@4 A B A B ~@4 A B A B ~@13 A B A B A B A B ~@21 A B A B A B A B ~@12 A B A B A B A B ~@17
>`.pickRestart({
  A: "bb4 ~ db5 ~ f5 ~@3 bb4 ~ db5 ~ f5 ~@3 bb4 ~ db5 ~ f5 ~@3 bb4 ~ db5 ~ f5 ~@3", B: "bb4 ~ db5 ~ f5 ~@27",
})).s("gm_pan_flute").gain(0.35).pan(0.2)

// other · pan flute · soft notes
const pan_flute_soft = note(`<
  ~@5 A ~ A ~@5 A ~ A ~@14 A ~ A ~ A ~ A ~@22 A ~ A ~ A ~ A ~@13 A ~ A ~ A ~ A ~@17
>`.pickRestart({
  A: "~@8 bb4 ~ db5 ~ f5 ~@3 bb4 ~ db5 ~ f5 ~@3 bb4 ~ db5 ~ f5 ~@3",
})).s("gm_pan_flute").gain(0.12).pan(0.2)

// other · brass section · "BRASS 1"
const brass_section_2 = note(`<
  ~@8 A B C D E F G H ~@21 E F G H E F G H ~@21 E F G H E F G H ~@12 A B C D A B C D E F G H E F G H ~
>`.pickRestart({
  A: "bb4 ~ bb4 ~ bb4 ~ bb4 ~@3 ab4 ~@3 bb4 ~@15 f4 ~",
  B: "ab4 ~ bb4 ~ bb4 ~ bb4 ~@3 db5 ~@3 c5 ~@3 ab4 ~@3 f4 ~@7 f4 ~",
  C: "ab4 ~ bb4 ~ bb4 ~ bb4 ~@3 ab4 ~@3 bb4 ~@15 f4 ~", D: "ab4 ~ bb4 ~ bb4 ~ bb4 ~@3 db5 ~@3 c5 ~@3 bb4 ~@3 ab4 ~@9",
  E: "bb5 ~ bb5 ~ bb5 ~ bb5 ~@3 ab5 ~@3 bb5 ~@15 f5 ~",
  F: "ab5 ~ bb5 ~ bb5 ~ bb5 ~@3 db6 ~@3 c6 ~@3 ab5 ~@3 f5 ~@7 f5 ~",
  G: "ab5 ~ bb5 ~ bb5 ~ bb5 ~@3 ab5 ~@3 bb5 ~@15 f5 ~", H: "ab5 ~ bb5 ~ bb5 ~ bb5 ~@3 db6 ~@3 c6 ~@3 bb5 ~@3 ab5 ~@9",
})).s("gm_brass_section").gain(0.51).pan(1)

// drums · kick
const kick = s("bd").struct("<~@8 A@20 B A@28 B A@16 ~@4 A@24 ~>".pickRestart({
  A: "x!4", B: "x!2",
})).gain(0.64)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@8 A@8 ~ A@11 ~ A@16 ~ A@11 ~ A@16 ~@4 A@24 ~>".pickRestart({
  A: "~@2 x ~@4 x ~@2 x ~@4 x",
})).gain(0.43)

// drums · clap
const clap = s("cp").struct("<~@8 A@8 ~@13 A@16 ~@13 A@16 ~@4 A@24 ~>".pickRestart({
  A: "~ x ~ x",
})).gain(0.71)

// drums · snare
const snare = s("sd").struct("<~@8 A@8 ~ A@28 ~ A@28 ~@4 A@24 ~>".pickRestart({
  A: "~ x ~ x",
})).gain(0.71)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@8 A@8 ~ A@28 ~ A@28 ~@4 A@24 ~>".pickRestart({
  A: "~@15 x",
})).gain(0.29)

// drums · hihat
const hihat = s("hh").struct("<~@16 A ~@11 B ~@16 A ~@11 B ~@45>".pickRestart({
  A: "x!4", B: "~ x ~ x ~ x ~ x",
})).gain(0.57)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@28 [x!4] ~@28 [x!4] ~@45>").gain(0.14)

// drums · open hat
const open_hat = s("oh").struct("<~@8 A@8 ~ A@11 ~ A@16 ~ A@11 ~ A@16 ~@4 A@24 ~>".pickRestart({
  A: "x!3 ~ x!4",
})).gain(0.43)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@8 A@8 ~ A@11 ~ A@16 ~ A@11 ~ A@16 ~@4 A@24 ~>".pickRestart({
  A: "~@3 x ~@4",
})).gain(0.29)

// drums · tambourine
const tambourine = s("tb").struct("<~@8 A@8 ~ A@11 ~ A@16 ~ A@11 ~ A@16 ~@4 A@24 ~>".pickRestart({
  A: "x ~@2 x!2 ~@3 x ~@3 x ~@3 x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@3",
})).gain(0.29)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@8 A@8 ~ A@11 ~ A@16 ~ A@11 ~ A@16 ~@4 A@24 ~>".pickRestart({
  A: "~@7 x ~@3 x ~@3 x ~@15 x",
})).gain(0.21)

// drums · splash
const splash = s("cr").struct("<~@28 [~@3 x] ~@28 [~@3 x] ~@45>").gain(0.71)

// drums · shaker
const shaker = s("sh").struct("<~@8 A@8 ~ A@11 B A@16 ~ A@11 B A@16 ~@4 A@24 ~>".pickRestart({
  A: "x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x", B: "x!8",
})).gain(0.57)

// drums · rim
const rim = s("rim").struct("<~@8 A@8 B ~@12 A@16 B ~@12 A@16 ~@4 A@24 ~>".pickRestart({
  A: "x ~ x ~@5 x ~@5 x ~@5 x ~@3 x ~@5 x!2", B: "x!4",
})).gain(0.57)

stack(
  drawbar_organ, bass, synth_strings_1, brass_section, pan_flute, pan_flute_soft, brass_section_2, kick, kick_soft,
  clap, snare, snare_soft, hihat, hihat_soft, open_hat, open_hat_soft, tambourine, tambourine_soft, splash, shaker, rim
)

More by Real McCoy