Strudelify

Love Don't Live Here Anymore

Rose Royce

KeyB minorTempo85 bpm
0:00/0:00
// Love Don't Live Here Anymore — Rose Royce
// 85 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 synth bass 1 (copy of ch 2 synth bass 1)
// note: Full arrangement: all 86 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 27.
setcpm(85/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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.

// bass · synth bass 1
const bass = note(`<
  A B@8 C ~@7 D E F G H I D E J K D E L M D@5 E F G H I D E J K D E L M D@5 E F G H I D E J K D E L M D E J K D E J K D
  E J K D E J N O@3
>`.pickRestart({
  A: "~@14 e1 a1", B: "b1@6 e1 a1 b1!2 ~@4 e1 a1", C: "b1@3 ~", D: "b1@6 e1 f#1 b1!2 ~@4 e1 f#1",
  E: "b1@6 e1 f#1 b1!2 ~@4 f#1 ~", F: "g1!2 g1@3 ~ d2!2 g1@2 ~@4 d2 e2", G: "g1!2 g1@2 ~ g1 d2 e2 g1@2 ~@4 d2 e2",
  H: "g1!3 ~@2 g1 d2 e2 g1@3 ~@3 d2 e2", I: "g1!2 g1@2 ~ g1 d2 e2 g1@2 ~@2 g1 ~ a1 ~",
  J: "g1!4 ~ d2 g2 ~ g2@3 d2 g2@2 f#2@2", K: "e2 b1 e1 ~@2 b1 e2@2 e2!2 e2@4 ~ f#1",
  L: "g1@4 ~ d2 g2 ~ g2@3 d2 g2 ~ f#2 ~", M: "e2 b1 e1 ~@2 b1 e2@2 e2@4 ~@2 f#1 ~",
  N: "e2 b1 e1 ~@2 b1 e2@2 e2!2 e2@5 ~", O: "[f#1 b1@32 ~@15]/3",
})).s("gm_synth_bass_1").gain(0.4).pan(0.7)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~@5 A@6 B C A@2 B C A@2 B@4 A@2 B C A@2 B C A@6 B@4 A@2 B C A@2 B C A@6 B@4 A@2 B C A@2 B C A@2 B@2 A@2 B@2 A@2 B@2
  A@2 B D E ~@2
>`.pickRestart({
  A: "[a3,c#4,e4]!16", B: "[b3,d4,f#4]!16", C: "[g3,b3,e4]!16", D: "[b3,d4,f#4]!13 ~ [b3,d4,f#4]!2",
  E: "[b3,d4,f#4] [a3,c#4,e4] ~@14", // Bm A
})).s("gm_acoustic_guitar_nylon").gain(0.15).pan(0)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@9 A B C ~ A B C ~ A B C D C D A B C ~ A B C ~ E F G H A B C D C D A B C ~ A B C ~ E F G H A B C D C D A B C ~ A B C
  ~ A B C D A B C D A B C D A B C I J ~@2
>`.pickRestart({
  A: "~@14 f#4 ~", B: "~@10 f#4 ~@3 f#4 ~", C: "g3 ~ g3 ~ g3 ~ g3 ~ g3 ~@3 g3 ~ g3 ~",
  D: "[g3,e4] ~ [g3,e4] ~ [g3,e4] ~ [g3,e4] ~ [g3,e4] ~ [e4,g4] ~ [g3,e4] ~ [g3,e4] ~", E: "~@2 f#4 ~@7 f#4 ~@5",
  F: "~@4 f#4 ~@3 f#4 ~@7", G: "f#3 ~@5 f#3 ~@3 f#4 ~@5", H: "f#4 ~@7 f#4 ~@3 f#4 ~@3",
  I: "[g3,e4] ~ [g3,e4] ~ [g3,e4] ~ [g3,e4] ~ [g3,e4] ~ [e4,g4] ~ [g3,e4] ~@2 [g3,e4]", J: "~ f#3 ~@14",
})).s("gm_electric_guitar_clean").gain(0.17).pan(1)

// other · tremolo strings
const tremolo_strings = note("<~@5 A@6 B@2 C@2 B@2 ~@2 D E F G H I J@2 I H K L M N O P ~@14 M N O P ~@33>".pickRestart({
  A: "[[a5,c#6,e6]@31 ~]/6", B: "d6/2", C: "e6/2", D: "~ b4 c#5 d5", E: "e5 f#5 g5 a5", F: "b5 c#6 d6 e6",
  G: "f#6@2 g6@2 a6@3 b6", H: "a5", I: "e6", J: "[b5@15 f#6]/2", K: "f#6", L: "b5@12 f#6 b5 c#6 d6",
  M: "e6 c#6 d6 e6 c#6 a5 b5 c#6 a5 e5 f#5 g5 a5 g5 f#5 e5", N: "d5 c#5 b4 a4 b4 c#5 d5 e5 f#5 e5 d5 c#5 d5 e5 f#5 g5",
  O: "a5 b5 c#6 d6 e6 f#6 g6 a6 g6 f#6 e6 d6 c#6 b5 a5 g5", P: "f#5 e5 d5 c#5 b4 a4 b4 c#5 d5 e5 f#5 g5 a5 b5 c#6 d6",
})).s("gm_tremolo_strings").gain(0.25)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@5 A@5 B C@2 D@2 C@2 D@2 E@2 C@2 F G H I F G J@2 K L M N O P Q R S@2 T P U V W X Y Z K L M N O P Q AA AB@2 T P AC AD
  O AE AF AG T AH AI AJ O AE AF AG T AH AI AJ O AE AF AK AL@3
>`.pickRestart({
  A: "b5 [b5,c#6] c#6 [b5,c#6] b5 [b5,c#6] c#6 [b5,c#6] b5 [b5,c#6] c#6 [b5,c#6] b5 [b5,c#6] c#6 [b5,c#6]", // Bsus2
  B: "b5 [b5,c#6] c#6 [b5,c#6] b5 ~@11", C: "d4/2", D: "e4/2", E: "[d4@31 ~]/2", F: "e4", G: "a4", H: "f#4@15 ~",
  I: "f#4", J: "d4", K: "~@8 d4 ~ d4@2 c#4@2 ~@2", L: "~@4 d4!2 c#4 ~", M: "~@10 c#4 d4 e4 f#4 g4 a4",
  N: "g4 f#4 e4 d4 c#4 b3 c#4 d4 e4 f#4 g4 a4 b4 c#5 d5 e5", O: "e6", P: "c#6", Q: "d6@12 f#6 d6 e6 f#6",
  R: "e6@12 f#6 d6 e6 f#6", S: "[b5@28 f#6 d6 e6 f#6]/2", T: "e6@15 d6", U: "d6@15 c#6", V: "b5@7 f#6",
  W: "e6 f#6 e6@14", X: "a5", Y: "f#6", Z: "b5@12 f#6 b5 c#6 d6", AA: "e6@15 ~", AB: "[e6@28 f#6 d6 e6 f#6]/2",
  AC: "b5@15 c#6", AD: "d6@12 f#6 g6 f#6 d6", AE: "a6 e6@2 a5", AF: "b5 d6@3", AG: "f#6@6 d6@2 d6@4 f#6 g6 f#6 d6",
  AH: "c#6 b5 a5@14", AI: "f#6@13 e6 d6 c#6", AJ: "d6 c#6 b5@14", AK: "f#6@6 d6@2 d6@4 f#6 ~ g6 f#6",
  AL: "[d6 c#6@32 ~@15]/3",
})).s("gm_string_ensemble_1").gain(0.25).pan(0.3)

// chords · string ensemble 1
const string_ensemble_1_2 = note(`<
  ~@5 A@6 ~ B C@2 D@2 C@2 E@4 C@2 D@2 C@2 F@2 ~@4 C@2 E@4 C@2 D@2 C@2 F@2 ~@4 C@2 E@4 C@2 D@2 C@2 F@2 C@2 F@2 C@2 F@2
  C@2 F@2 C@2 F@2 G@3
>`.pickRestart({
  A: "[[a4,c#5,e5]@47 ~]/6", B: "~@7 [b3,d4,f#4]", C: "[a3,c#4,e4]/2", D: "[g3,b3,d4]/2", E: "[g3,b3,d4]/4",
  F: "[g3,b3,d4]", G: "[~ [a3,c#4,e4]@32 ~@15]/3",
})).s("gm_string_ensemble_1").gain(0.25).pan(0.3)

// other · string ensemble 2
const string_ensemble_2 = note(`<
  ~@5 A@6 ~ B C@2 D E F@2 G@4 F@2 D E F@2 D E H I J K F@2 G@4 F@2 D E F@2 D E H I J K F@2 G@4 F@2 D E F@2 D E F@2 D E
  F@2 D E F@2 D E F@2 D E L@3
>`.pickRestart({
  A: "[c#5@47 ~]/6", B: "~@14 e2 ~", C: "b2", D: "g2", E: "e2", F: "b2/2", G: "g2/2",
  H: "e5 c#5 d5 e5 c#5 a4 b4 c#5 a4 e4 f#4 g4 a4 g4 f#4 e4", I: "d4 c#4 b3 a3 b3 c#4 d4 e4 f#4 e4 d4 c#4 d4 e4 f#4 g4",
  J: "a4 b4 c#5 d5 e5 f#5 g5 a5 g5 f#5 e5 d5 c#5 b4 a4 g4", K: "f#4 e4 d4 c#4 b3 a3 b3 c#4 d4 e4 f#4 g4 a4 b4 c#5 d5",
  L: "[~ b2@32 ~@15]/3",
})).s("gm_string_ensemble_2").gain(0.3).pan(0.7)

// other · lead 8 bass lead
const lead_8_bass_lead = note(`<
  ~@5 A@2 B C ~@2 D E ~@2 F G H ~@2 I ~@4 F G J ~ K E ~@7 I L ~@3 F G M ~ K E M ~@5 N O ~@4 F G P ~ K E P ~ F G P ~ K E
  P ~ F G P ~ K E Q@3
>`.pickRestart({
  A: "[e5@2 f#5@3 e6@3 c#6@14 b5@2 c#6@3 d6@3 e6@2]/2", B: "c#6 d6 c#6@12 a5 f#5", C: "a5@3 f#5@5",
  D: "~@2 f#5@2 d5@3 b4", E: "d5@3 b4@5", F: "~ b4 d5 a5", G: "f#5@3 d5@3 b4@2", H: "a4@3 ~", I: "e5@3 f#5 f#5@4",
  J: "a4@9 ~@7", K: "~ f#5 d5 b4", L: "~@7 b4 e5 f#5 ~ f#5@5", M: "a4@15 ~", N: "~@15 b4",
  O: "e5@2 f#5@5 b4 e5@2 f#5@6", P: "a4", Q: "[~ c#5@32 ~@15]/3",
})).s("gm_lead_8_bass_lead").gain(0.4)

// other · synth drum
const synth_drum = note("<~@2 A ~ A ~@26 B@4 ~@14 B@4 ~@16 B@2 ~@2 B@2 ~@2 B@2 ~@2 B C ~@3>".pickRestart({
  A: "~@12 c6 ~@3", B: "~@2 c6 ~ c6!3 ~ c6!2 ~ c6 ~@2 c4 ~", C: "~@2 c6 ~ c6!3 ~ c6!2 ~ c6 ~@3 c4",
})).s("gm_synth_drum").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~@17
  [~ x ~ x]!18
  [x ~@7 x ~@2 x!2 ~ x ~]!6
  [~ x ~ x]!12
  [x ~@7 x ~@2 x!2 ~ x ~]!29
  [x ~@7 x ~@2 x!2 ~@2 x]
  [~ x ~@14]
  ~@2
>`).gain(0.5)

// drums · rim
const rim = s("rim").struct("<~@35 [~ x ~@2]!6 ~@12 [~ x ~@2]!30 [~ x ~@14] ~@2>").gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<~@58 A ~@15 B ~@3 C ~@3 A ~@3>".pickRestart({
  A: "~@15 x", B: "~@7 x", C: "~@6 x!2",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~@3 A@14 B@6 C@12 B@7 C@11 B@29 D E ~@2>".pickRestart({
  A: "~@7 x", B: "x!16", C: "x!11 ~ x!4", D: "x!13 ~ x!2", E: "x",
})).gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~@58 A ~@3 B ~@3 B ~@7 C ~@3 D ~@3 E ~@3>".pickRestart({
  A: "~@12 x!3 ~", B: "~@6 x!2", C: "~@8 x ~@2 x ~ x ~@2", D: "~@4 x ~@2 x ~ x!2 ~@5", E: "~@8 x ~@2 x ~@2 x ~",
})).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct("<~@23 [~@11 x ~@4]!12 ~@7 [~@11 x ~@4]!11 ~@30 [~ x ~@14] ~@2>").gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@48 A ~@9 B ~@3 C ~@3 D ~@7 E ~@3 F ~@3 E ~@3>".pickRestart({
  A: "~@6 x ~ x ~ x!3 ~ x ~", B: "~@6 x!3 ~ x ~@5", C: "~@8 x!2 ~ x ~@4", D: "~@6 x ~ x ~ x!2 ~@4", E: "~@5 x!2 ~@9",
  F: "x!4 ~@12",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@35 A@6 ~@12 A@6 B A@3 B A@3 B A@7 B A@3 B A@3 C ~@2>".pickRestart({
  A: "~@3 x", B: "x ~@2 x", C: "~ x ~@14",
})).gain(0.4)

// drums · triangle
const triangle = s("triangles:35").struct("<~@3 [~@3 x]!80 ~@3>").gain(2.59)

stack(
  bass, acoustic_guitar_nylon, electric_guitar_clean, tremolo_strings, string_ensemble_1, string_ensemble_1_2,
  string_ensemble_2, lead_8_bass_lead, synth_drum, kick, rim, low_tom, hihat, mid_tom, open_hat, high_tom, ride,
  triangle
)

More by Rose Royce