Strudelify

Real Love

Jody Watley

KeyC minorTempo113 bpm
0:00/0:00
// Real Love — Jody Watley
// 113 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 83 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(113/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.

// chords · pad new age · "FANTASIA"
const pad_new_age = note("<~@9 A ~ B ~ B ~ A ~ C D C E C D C F ~@16 C D C E C D C G ~@7 H ~@26>".pickRestart({
  A: "[g4,bb4,c5,eb5] ~@23", B: "[ab4,c5,eb5,f5] ~@23",
  C: "[c4,eb4,ab4,c5,eb5] ~@8 c5 ~@2 c6 ~@2 bb5 ~@2 g5 ~@2 eb5 ~@2", D: "[d4,f4,bb4,d5,f5] ~@2 f5 ~@2 g5 ~@17",
  E: "[d4,f4,bb4,d5,f5] ~@8 f5 ~@3 g5 ~ eb5 ~@2 c5 ~@5", F: "[g3,g4,f5] ~@9 f5 ~@2 g5 ~ eb5 ~@2 c5 ~@5",
  G: "[g3,g4,f5] ~@9 f5 ~@3 g5 eb5 ~@2 c5 ~@5", H: "c6 ~@2 bb5 ~@2 g5 ~@2 eb5 f5 ~@2 g5 eb5 ~@2 c5 ~@6",
})).s("gm_pad_new_age").gain(0.42)

// chords · string ensemble 2 · "FANTASIA"
const string_ensemble_2 = note("<~@25 A@2 B@2 C@2 D@2 A@2 B@2 C@2 A@2 ~@42>".pickRestart({
  A: "[[g4,bb4,eb5] ~@47, c5@47 ~]/2", B: "[[c5,f5], [ab4,eb5] ~@47]/2", C: "[[c5,f5]@47 ~, [ab4,eb5] ~@47]/2",
  D: "[[g4,bb4,eb5] ~@47, c5]/2", // Eb
})).s("gm_string_ensemble_2").gain(0.42)

// chords · string ensemble 1 · "FANTASIA"
const string_ensemble_1 = note("<~@49 A@2 B@2 C@2 D@8 ~@2 E@2 B@2 F@2 G@2 E@2 H@4 E@2 I J>".pickRestart({
  A: "[[g4,bb4,eb5] ~@47, c5@47 ~]/2", B: "[[c5,f5], [ab4,eb5] ~@47]/2", C: "[[c5,f5]@47 ~, [ab4,eb5] ~@47]/2",
  D: "[[g4,bb4,eb5] ~@191, c5]/8", E: "[[g4,bb4,eb5] ~@47, c5]/2", F: "[[ab4,eb5] ~@47, c5, f5@23 ~]/2",
  G: "[[g4,bb4,eb5] ~@23 c6 ~@2 bb5 ~@2 g5 ~@2 eb5 f5 ~@2 g5 eb5 ~@2 c5@7, c5@41 ~@7]/2", // Eb
  H: "[[ab4,eb5] ~@47 [ab4,eb5] ~@47, f5@95 ~, c5 c5]/4", I: "c5@3 c5@3 eb5 ~@8 g5 ~@3 bb5 ~ c6 ~@2, ~@7 c5@17",
  J: "[bb4,eb5] ~@11, [g4,c6] ~@23", // Eb5 C5
})).s("gm_string_ensemble_1").gain(0.42)

// bass · slap bass 2 · "SLAPBASS 2"
const bass = note(`<
  ~ A B A B A B C B A B A D A B A E F G H I H J K L M B N B A B A@3 B A B A O A P Q R S T U V W X Y B A B A B C B A B A
  B A B C B Y B A B A B C B A B A B A B C B Z AA
>`.pickRestart({
  A: "c2 ~@2 c2 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1 ~ bb1",
  B: "c2 ~@2 bb1 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1 ~ bb1",
  C: "c2 ~@2 c2 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@3 g1 ~ bb1",
  D: "c2 ~ c2 bb1 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1 ~ bb1",
  E: "c2 ~@2 c2 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1 ~@2 bb1@2 c2",
  F: "ab1@2 ~ ab1@3 eb2 ~@2 f2 ~@2 f2@2 ~ g2@3 f2@3 eb2@3", G: "bb1@3 ~@6 g1@2 bb1 ~@2 bb1!2 ~@2 c2@3 bb1@2 ~",
  H: "~@3 ab1@3 eb2@3 f2 ~@2 f2@2 ~ g2@3 f2@3 eb2@2 ~", I: "bb1@2 ~@7 g1 bb1 ~@3 bb1!2 ~@2 c2@3 bb1@2 ~",
  J: "bb1@2 ~@7 g1 bb1 ~@3 bb1!2 ~@2 c2@2 ~ bb1@2 ~", K: "~@3 ab1@3 eb2@2 ~ f2 ~@2 f2@2 ~ g2@3 f2@3 eb2@2 ~",
  L: "g1@2 ~@7 g1 ~@4 g1!2 ~@2 bb1@2 ~ g1 ~ bb1", M: "c2!2 ~ c2 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1@2 bb1",
  N: "c2 ~@2 c2 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1@2 bb1",
  O: "c2 ~@2 bb1 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1@2 bb1",
  P: "c2 ~@2 bb1 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1 ~@2 bb1@2 c2",
  Q: "ab1 ~@2 ab1@2 ~ eb2@3 f2 ~@2 f2@3 g2@3 f2@3 eb2@3", R: "bb1@2 ~@7 bb1 ~@4 g1 bb1 ~@2 c2@3 bb1@2 ~",
  S: "ab1 ~@2 ab1@3 eb2@3 f2 ~@2 f2@3 g2@3 f2@3 eb2@2 ~", T: "bb1@2 ~@7 bb1 ~@4 g1 bb1 ~ g1 c2@3 bb1@2 ~",
  U: "~@3 ab1@3 eb2@3 f2 ~@2 f2@3 g2@3 f2@3 eb2@2 ~", V: "bb1@2 ~@8 bb1 ~@3 g1 bb1 ~@2 c2@3 bb1@2 ~",
  W: "~@3 ab1@3 eb2@3 f2 ~@2 f2@2 ~ g2@3 f2@2 ~ eb2@2 ~", X: "g1@3 ~@6 g1 ~@3 g1!2 ~@2 bb1@3 ~ g1@2 ~, ~@17 g1 ~@6",
  Y: "c2@2 ~ c2 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1 ~ bb1", Z: "c2 ~@2 c2 ~@2 eb2 c2@6 ~@2 g2@3 ~ bb2 ~ g2 ~@2",
  AA: "c2 ~@7",
})).s("gm_slap_bass_2").gain(0.42)

// chords · brass section · "BRASS 1"
const brass_section = note(`<
  ~@9 A ~ B ~ B ~ A ~ C D E D C D C F A ~ B ~ B ~ A ~ A ~ G ~ B ~ A ~ C H C D C D C I J ~ K ~ K ~ J ~@9 J ~ K ~ K ~ J ~
  J ~ K ~ K ~ J ~ L M
>`.pickRestart({
  A: "[g4,bb4,c5,eb5,c6] ~@7", B: "[ab4,c5,eb5,f5,c6] ~@7", C: "[c4,eb4,ab4,c5,eb5] ~@7", D: "[d4,f4,bb4,d5,f5] ~@7",
  E: "[c4,eb4,ab4,c5,eb5] ~@7, bb3 ~@23", F: "~@9 c5 ~@2 f5@3 eb5 c5@7 ~, g4@11 ~, ~@3 g3@8 ~",
  G: "[ab4,c5,eb5,c6] ~@7, f5 ~@23", H: "[d4,f4,bb4,d5,f5] ~@7, c4 ~@23",
  I: "~@9 c5 ~@2 f5@3 eb5 c5@6 ~@2, g4@11 ~, ~@3 g3@8 ~", J: "[c4,g4,bb4,c5,eb5] ~@7", K: "[eb4,ab4,c5,eb5,f5] ~@7",
  L: "c5 ~@2 c5 ~@2 eb5 c5@4 ~@4 g5@4 bb5 ~ c6@3", M: "[g4,bb4,c5,eb5] ~@7",
})).s("gm_brass_section").gain(0.8)

// other · synth drum
const synth_drum = note(`<
  A ~ B ~@6 C D E F G D H I J K J L J M N O P Q R S R S T L U V I W G X Y I Z K J L J AA AB AC P AD R S R S AE L AF ~@6
  AG AH AI AJ AK AJ AK AL AM AH AI AJ AK AJ AK AL AN ~@2
>`.pickRestart({
  A: "~@5 bb5 ~@18", B: "~@18 bb5 ~ bb5 ~@3", C: "ab5 ~@2 bb5 ~@2 ab5 ~@2 bb5 ~@2 ab5 ~@2 ab5 bb5 ~@7",
  D: "ab5 ~@2 bb5 ~@2 ab5 ~@2 bb5 ~@2 ab5 ~@5 bb5 ~@4 ab5", E: "~@18 ab5 ~@2 bb5 ~@2",
  F: "ab5 ~@5 bb5 ~@4 ab5 ~@9 ab5 ~@2", G: "bb5 ~@2 ab5 ~@2 bb5 ~@2 ab5 ~@2 bb5 ~@4 ab5 ~@5 bb5", H: "~@21 bb5 ~ bb5",
  I: "ab5 ~@23", J: "~@3 ab5 ~@2 bb5 ~@2 ab5 ~@2 bb5 ~@5 ab5 ~@5", K: "bb5 ~@2 bb5 ~ ab5 ~@18", L: "bb5 ~@23",
  M: "bb5 ~@2 bb5 ~ ab5 ~@14 bb5 ab5 ~ bb5", N: "ab5 ~@2 ab5 ~ bb5 ~@3 ab5 ~ bb5 ~@7 bb5 ~ ab5 ~ ab5",
  O: "bb5 ~@2 bb5 ab5 ~@13 ab5 ~@5", P: "bb5 ~@8 ab5 ~@2 bb5 ~@2 ab5 ~@2 bb5 ~@2 ab5 ~@2",
  Q: "bb5 ~@5 ab5 ~@11 ab5 ~@5", R: "bb5 ~@11 ab5 ~@2 bb5 ~@2 ab5 ~@2 bb5 ~@2", S: "ab5 ~@5 bb5 ~@11 ab5 ~@5",
  T: "bb5 ~@12 ab5 ~ ab5 ~ bb5 ~ ab5 ~@4", U: "ab5 ~@2 bb5 ~@2 ab5 ~@2 bb5 ~@2 ab5 ~@2 bb5 ~ ab5 ~@6",
  V: "bb5 ~@2 ab5 ~@2 bb5 ~@2 ab5 ~ bb5 ab5 ~@5 bb5 ~@5", W: "~@21 ab5 ~@2",
  X: "ab5 ~@2 bb5 ~@2 ab5 ~@2 bb5 ~@2 ab5 ~@2 bb5 ~@2 ab5 ~@5", Y: "bb5 ~@20 bb5 ~ bb5",
  Z: "~@3 ab5 ~@2 bb5 ~@2 ab5 ~@2 bb5 ~@6 ab5 ~@4", AA: "bb5 ~@2 bb5 ~ ab5 ~@14 bb5 ~ ab5 bb5",
  AB: "ab5 ~@2 ab5 ~ bb5 ~@3 ab5 ~ bb5 ~@8 bb5 ab5 ~ ab5", AC: "~ bb5 ~ bb5 ~ ab5 ~@13 ab5 ~@4",
  AD: "~ bb5 ~@4 ab5 ~@11 ab5 ~@5", AE: "bb5 ~@11 ab5 ~@2 ab5 bb5 ~@2 ab5 ~@4", AF: "~@2 db6 ~@21", AG: "~@18 gb5 ~@5",
  AH: "ab5 ~@8 gb5 ~@2 ab5 ~@2 gb5 ~@2 ab5 ~@2 gb5 ~@2", AI: "ab5 ~@5 gb5 ~@11 gb5 ~@5",
  AJ: "ab5 ~@11 gb5 ~@2 ab5 ~@2 gb5 ~@2 ab5 ~@2", AK: "gb5 ~@5 ab5 ~@11 gb5 ~@5",
  AL: "ab5 ~@11 ab5 ~@2 ab5 ~ gb5 ~@2 ab5 ~@3", AM: "gb5 ~@17 gb5 ~@5", AN: "gb5 ~@23",
})).s("gm_synth_drum").gain(0.56)

// bass · electric bass finger · "FINGERDBAS"
const bass_2 = note(`<
  ~ A B A B A B C B A B A D A B A E F G H I H J K L M B N B A B O A@2 B A B O P A Q R S T U V W X Y O B A B A B C B A B
  A B A B C B O B A B A B C B O B A B A B C B Z AA
>`.pickRestart({
  A: "c2 ~@2 c2 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1 ~ bb1",
  B: "c2 ~@2 bb1 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1 ~ bb1",
  C: "c2 ~@2 c2 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@3 g1 ~ bb1",
  D: "c2 ~ c2 bb1 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1 ~ bb1",
  E: "c2 ~@2 c2 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1 ~@2 bb1@2 c2",
  F: "ab1 ~@2 ab1@3 eb2 ~@2 f2 ~@2 f2@2 ~ g2@3 f2@3 eb2@3", G: "bb1 ~@8 g1@2 bb1 ~@2 bb1!2 ~@2 c2@3 bb1@2 ~",
  H: "~@3 ab1@3 eb2@3 f2 ~@2 f2@2 ~ g2@3 f2@3 eb2@2 ~", I: "bb1 ~@8 g1 bb1 ~@3 bb1!2 ~@2 c2@3 bb1@2 ~",
  J: "bb1 ~@8 g1 bb1 ~@3 bb1!2 ~@2 c2@2 ~ bb1@2 ~", K: "~@3 ab1@3 eb2@2 ~ f2 ~@2 f2@2 ~ g2@3 f2@3 eb2@2 ~",
  L: "g1 ~@8 g1 ~@4 g1!2 ~@2 bb1@2 ~ g1 ~ bb1", M: "c2!2 ~ c2 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1@2 bb1",
  N: "c2 ~@2 c2 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1@2 bb1",
  O: "c2!2 ~ c2 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1 ~ bb1",
  P: "c2 ~@2 bb1 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1@2 ~ g1@2 bb1",
  Q: "c2 ~@2 bb1 ~@2 c2 ~@2 c2 ~@2 c2 ~ bb1!2 ~@2 bb1 ~@2 bb1@2 c2",
  R: "ab1 ~@2 ab1@2 ~ eb2@3 f2 ~@2 f2@3 g2@3 f2@3 eb2@3", S: "bb1 ~@8 bb1 ~@4 g1 bb1 ~@2 c2@3 bb1@2 ~",
  T: "ab1 ~@2 ab1@3 eb2@3 f2 ~@2 f2@3 g2@3 f2@3 eb2@2 ~", U: "bb1 ~@8 bb1 ~@4 g1 bb1 ~ g1 c2@3 bb1@2 ~",
  V: "~@3 ab1@3 eb2@3 f2 ~@2 f2@3 g2@3 f2@3 eb2@2 ~", W: "bb1 ~@9 bb1 ~@3 g1 bb1 ~@2 c2@3 bb1@2 ~",
  X: "~@3 ab1@3 eb2@3 f2 ~@2 f2@2 ~ g2@3 f2@2 ~ eb2@2 ~", Y: "g1 ~@8 g1 ~@3 g1!2 ~@2 bb1@3 ~ g1@2 ~, ~@17 g1 ~@6",
  Z: "c2 ~@2 c2 ~@2 eb2 c2@6 ~@2 g2@3 ~ bb2 ~ g2 ~@2", AA: "c2 ~@23",
})).s("gm_electric_bass_finger").gain(0.42)

// other · brass section · "BRASS 1"
const brass_section_2 = note("<~@32 A ~@23 B C D@2 E C F@2 G ~@7 B ~@7 H ~@2>".pickRestart({
  A: "~@3 [c4,c5] ~@4 [c4,c5] ~@3 [c4,c5] ~@3 c5 c4 ~@2 [c4,c5]!2 ~ [c4,c5]", // C
  B: "~@3 [c4,c5] ~@3 [c4,c5] ~@4 [c4,c5] ~@3 [c4,c5] ~@2 c5 ~ [c4,c5]!2 ~", // C
  C: "~@9 [g3,g4] ~@2 [bb3,bb4] c5 ~ [bb3,bb4] [g3,g4] ~@4 [g3,c4,g4,bb4,c5] ~@2, ~@4 c4 ~@3", // G Bb G C7
  D: "[~@7 [f3,f4] ~ [g3,g4] ~@2 [c4,c5]@3 [bb3,bb4] [g3,g4] ~@4 [d4,d5]@27, ~@12 bb3 ~@8 [db4,db5] ~@26]/2", // F G C Bb G D Db
  E: "~@18 [g3,c4,g4,bb4,c5]!2 ~@4", // C7
  F: "[~@7 [f3,f4] ~ [g3,g4] [f3,f4] ~ [c4,c5]@3 [bb3,bb4] [g3,g4] ~@4 [db4,db5] ~@26, ~@7 d5@9, ~@21 d4@25 ~@2]/2", // F G F C Bb G Db
  G: "[g3,c4,g4,bb4,c5]!2 ~@22", H: "~@3 [c4,c5] ~@3 [c4,c5] ~@4 [c4,c5] ~@3 [c4,c5] ~@2 [c4,c5] ~ [c4,c5]!2 ~",
})).s("gm_brass_section").gain(0.8)

// other · brass section · "BRASS 1"
const brass_section_3 = note("<~@32 A ~@23 B C D@2 E C F@2 G ~@7 B ~@7 H ~@2>".pickRestart({
  A: "~@3 [c5,c6] ~@4 [c5,c6] ~@3 [c5,c6] ~@3 c6 c5 ~@2 [c5,c6]!2 ~ [c5,c6]", // C
  B: "~@3 [c5,c6] ~@3 [c5,c6] ~@4 [c5,c6] ~@3 [c5,c6] ~@2 c6 ~ [c5,c6]!2 ~", // C
  C: "~@9 [g4,g5] ~@2 [bb4,bb5] c6 ~ [bb4,bb5] [g4,g5] ~@4 [g4,c5,g5,bb5,c6] ~@2, ~@4 c5 ~@3", // G Bb G C7
  D: "[~@7 [f4,f5] ~ [g4,g5] ~@2 [c5,c6]@3 [bb4,bb5] [g4,g5] ~@4 [d5,d6]@27, ~@12 bb4 ~@8 [db5,db6] ~@26]/2", // F G C Bb G D Db
  E: "~@18 [g4,c5,g5,bb5,c6]!2 ~@4", // C7
  F: "[~@7 [f4,f5] ~ [g4,g5] [f4,f5] ~ [c5,c6]@3 [bb4,bb5] [g4,g5] ~@4 [db5,db6] ~@26, ~@7 d6@9, ~@21 d5@25 ~@2]/2", // F G F C Bb G Db
  G: "[g4,c5,g5,bb5,c6]!2 ~@22", H: "~@3 [c5,c6] ~@3 [c5,c6] ~@4 [c5,c6] ~@3 [c5,c6] ~@2 [c5,c6] ~ [c5,c6]!2 ~",
})).s("gm_brass_section").gain(0.5)

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

// drums · snare
const snare = s("sd").struct(`<
  ~ A B A C A B A D A@7 E A@7 F A@7 F A@7 F A@7 G A@7 E A@7 E A@7 E A@7 E H I
>`.pickRestart({
  A: "~ x ~ x", B: "~@5 x!2 ~@11 x ~@5", C: "~@6 x ~@10 x!2 ~@5", D: "~@6 x ~@4 x!2 ~ x!2 ~@2 x ~ x!2 ~@2",
  E: "~@6 x ~@11 x ~ x!2 ~@2", F: "~@3 x ~@3 x ~ x ~@2", G: "~@6 x ~@7 x!2 ~@2 x ~@5",
  H: "x ~@2 x ~@2 x!2 ~@7 x ~@3 x ~ x ~@2", I: "x",
})).gain(0.6)

// drums · hihat
const hihat = s("hh").struct("<~ A B@27 A B@19 A B@7 A B@7 A B@7 A B@7 A ~>".pickRestart({
  A: "x!2 ~ x!3 ~ x", B: "x!8",
})).gain(0.42)

// drums · mid tom
const mid_tom = s("mt").struct("<~@2 [~ x ~@2] ~@80>").gain(0.54)

// drums · open hat
const open_hat = s("oh").struct("<~ A ~@27 A ~@19 A ~@7 A ~@7 A ~@7 A ~@7 A ~>".pickRestart({
  A: "~ x ~ x",
})).gain(0.48)

// drums · crash
const crash = s("cr").struct("<~@82 x>").gain(0.6)

stack(
  pad_new_age, string_ensemble_2, string_ensemble_1, bass, brass_section, synth_drum, bass_2, brass_section_2,
  brass_section_3, kick, snare, hihat, mid_tom, open_hat, crash
)

More by Jody Watley