Strudelify

Real Love

Stansfield Lisa

KeyG minorTempo86 bpm
0:00/0:00
// Real Love — Stansfield Lisa
// 86 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 109 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(86/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 · "A.PIANO 2"
const piano = note(`<
  A B C D C D C D E D C D C D C D C D C F ~@7 A D C D C D C D C D C F ~@11 A D C D C D C D C ~@16 A D C D C D C D C D C
  D C D C D C G H G I G J K L G M N L G O K P Q
>`.pickRestart({
  A: "~@11 [c2,c3] ~ [d2,d3] [bb1,bb2] [c2,c3]", B: "[g1,g2]@8 ~ [c2,c3] ~ [d2,d3] [bb1,bb2] [c2,c3] [g1,g2]@2",
  C: "[f1,f2]@11 [c2,c3] ~ [d2,d3] [bb1,bb2] [c2,c3]", D: "[g1,g2]@9 [c2,c3] ~ [d2,d3] [bb1,bb2] [c2,c3] [g1,g2]@2",
  E: "[f1,f2]@10 ~ [c2,c3] ~ [d2,d3] [bb1,bb2] [c2,c3]", F: "[g1,g2]@7 ~",
  G: "[c2,c3]@5 ~ [c2,c3]@3 ~ [eb2,eb3] [d2,d3] [bb1,bb2] [c2,c3] [g1,g2]@2", // C Eb D Bb C G
  H: "[f1,f2]@5 ~ [f1,f2]@5 [f1,f2] [bb1,bb2] [c2,c3] [d2,d3] [eb2,eb3]", // F Bb C D Eb
  I: "[f1,f2]@5 ~ [f1,f2]@5 f1 [c2,c3] [d2,d3] [eb2,eb3] [f2,f3]", // F C D Eb F
  J: "[f1,f2]@5 ~ [f1,f2]@5 f2 [bb1,bb2] [c2,c3] [d2,d3] [eb2,eb3]", // F Bb C D Eb
  K: "[c2,c3]@5 ~ [c2,c3]@4 [eb2,eb3] [d2,d3] [bb1,bb2] [c2,c3] [g1,g2]@2", // C Eb D Bb C G
  L: "[f1,f2]@5 ~ [f1,f2]@4 ~ [f1,f2] [c2,c3] [d2,d3] [eb2,eb3] [f2,f3]", // F C D Eb F
  M: "[f1,f2]@6 [f1,f2]@4 ~ [f1,f2] [bb1,bb2] [c2,c3] [d2,d3] [eb2,eb3]", // F Bb C D Eb
  N: "[c2,c3]@6 [c2,c3]@4 [eb2,eb3] [d2,d3] [bb1,bb2] [c2,c3] [g1,g2]@2", // C Eb D Bb C G
  O: "[f1,f2]@5 ~ [f1,f2]@4 ~ [f1,f2] [bb1,bb2] [c2,c3] [d2,d3] [eb2,eb3]", // F Bb C D Eb
  P: "[f1,f2]@5 ~ [f1,f2]@5 [f1,f2] [c2,c3] [d2,d3] [eb2,eb3] [f2,f3]", Q: "[g1,g2]@15 ~",
})).s("gm_piano").gain(0.36).pan(0.3)

// bass · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  ~@9 A B C D C D C D A B C D C D E F G D@2 A B C D C D C D A B C D C D C D C D E F G D@2 A B C D C D C D A B C D C D C
  D C D C D E F G D@2 A B C D C D C D A B C D C D C D H D H D H D H D H D H D H D H D I
>`.pickRestart({
  A: "g1@3 g1 ~@2 g1!2 ~@8", B: "f1@2 ~ f1 ~@3 f1 ~ f1!3 ~@4", C: "g1@2 ~ g1 ~@2 g1!2 ~@8",
  D: "f1@3 f1 ~@3 f1 ~ f1!3 ~@4", E: "c1@3 c1 ~@2 c1!2 ~@8", F: "d1@3 d1 ~@3 d1 ~ d1!3 ~@4",
  G: "eb1@2 ~ eb1 ~@2 eb1!2 ~@8", H: "c2@3 c2 ~@2 c2!2 ~@8", I: "g1@15 ~",
})).s("gm_synth_bass_2").gain(0.49)

// chords · pad warm · "WARM PAD"
const pad_warm = note(`<
  ~@9 A B A B C B C B ~@6 D E F@3 A B A B C B C B ~@2 G H I J I J K L D E F@3 A B A B C B C B ~@8 G M N O D E F@3 A B A
  B C B C B A B A B C B C B P Q P Q P Q P Q P Q P Q P Q P R S
>`.pickRestart({
  A: "[a3,d4,f4]@15 ~", B: "[g3,bb3,eb4]", C: "[a3,d4,f4]", D: "[g3,bb3]@15 ~", E: "[a3,c4]@15 ~",
  F: "[d4@8 eb4@15 ~, bb3@47 ~]/3", G: "[d4,f4]@15 ~", H: "[eb4,g4]@15 ~", I: "[f4,a4]@15 ~", J: "[g4,bb4]@15 ~",
  K: "[a4,d5]@15 ~", L: "~@9 bb5@6 ~, [c5,eb5]@15 ~", M: "[eb4,g4]", N: "[f4,a4]", O: "[g4,bb4]", P: "[eb3,g3,bb3,d4]",
  Q: "[f3,a3,c4]", R: "[f3,a3,c4]@15 ~", S: "[g3,d4]@15 ~",
})).s("gm_pad_warm").gain(0.22).pan(0.2)

// other · epiano1 · "E.PIANO 1"
const epiano1 = note(`<
  ~@9 A ~ B ~ B ~ B ~@12 B ~ B ~ B ~ B ~@16 B ~ B ~ B ~ B ~@18 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ A ~ B ~ B ~ B ~ B
  ~ B ~@2
>`.pickRestart({
  A: "~@4 g4@4 d4@5 ~@3", B: "~@2 g4@2 d4@3 ~",
})).s("gm_epiano1").gain(0.45)

// chords · synth brass 2 · "SYNBRASS 2"
const synth_brass_2 = note(`<
  ~@9 A B C D C B A E ~@6 F G H I@2 A B C D C B A J@2 ~@9 F G H I@2 A B C D C B A K@3 ~@10 F G H I@2 A B C D C B A E A B
  C D C B A L@3 ~@2 M ~@3 N ~@3 O ~@4
>`.pickRestart({
  A: "[bb3,d4]", B: "[bb3,eb4]@15 ~", C: "[bb3,d4]@15 ~", D: "[g3,bb3,c4]", E: "[g3,bb3,c4]@15 ~", F: "[c3,eb3,g3,bb3]",
  G: "[d3,f3,a3,c4]", H: "[eb3,g3,bb3,d4]", I: "[[f3,g3,bb3,eb4]@15 ~]/2", J: "[[g3,bb3,c4]@8 ~ f4 ~ f4!2 f4@15 ~@4]/2",
  K: "[[g3,bb3,c4]@8 ~@3 f4!2 f4@33 ~@2]/3", L: "[[g3,bb3,c4]@9 ~ f4 ~@2 f4@27 ~@8]/3",
  M: "bb4@2 g4 [d4,e4,f4] [a3,b3,c4] [d3,e3,f3,g3] c3 ~@9", N: "bb4@4 a4 [e4,f4,g4] ~@10", O: "bb4@2 g4 [e4,f4] ~@12",
})).s("gm_synth_brass_2").gain(0.16).pan(0.9)

// chords · pad halo · "HALO PAD"
const pad_halo = note("<~@19 A B A C ~@15 A B A C A C D E ~@21 A B A C ~@38>".pickRestart({
  A: "[a3,bb3,d4,f4]", B: "[g3,bb3,c4,eb4]", C: "[bb3,c4,eb4,g4]", D: "[bb3,d4,f4,a4]", E: "[c4,eb4,g4,bb4]",
})).s("gm_pad_halo").gain(0.22).pan(0.6)

// other · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@9 A ~ B C@2 ~ A ~@10 D E F ~ B C@2 ~ A ~@14 D E F ~ B G@2 ~ A ~@16 D E F ~ B G@2 ~ A ~@3 B G@2 ~ A H@2 ~@16
>`.pickRestart({
  A: "[a4,d5]@3 ~", B: "[a4,d5]@5 ~@3", C: "[~@4 [a4,d5]@3 ~, ~@15 d4@13 ~@4]/2", D: "~@14 [eb4,eb5]!2",
  E: "[eb4,eb5]@2 [d4,d5]!2 [d4,d5]@2 [c4,c5]!2 [c4,c5]@2 [bb3,bb4]!2 [a3,a4] [bb3,bb4]@3", F: "[a3,a4]@5 ~@11",
  G: "[~@11 [f4,f5]!2 [f4,f5]@14 ~@5]/2", H: "[~@10 [f4,f5]@3 [f4,f5]@17 ~@2]/2",
})).s("gm_electric_guitar_clean").gain(0.3).pan(0.7)

// other · electric guitar clean · "CLEAN GTR" · soft notes
const electric_guitar_clean_2 = note(`<
  ~@8 A@2 B@2 ~@2 C@2 ~@13 B@2 ~@2 C@2 ~@17 B@2 ~@2 C@2 ~@19 B@2 ~@2 C@2 ~@2 B@2 ~@2 C@2 ~@18
>`.pickRestart({
  A: "[~@15 d4@12 ~@5]/2", B: "[~@15 d4@11 ~@6]/2", C: "[~@15 d4@13 ~@4]/2",
})).s("gm_electric_guitar_clean").gain(0.2).pan(0.7)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@9 A B A C D B E F ~@6 G@5 A B A C D B E F ~@2 H@4 I J K L G@5 A B A C D B E F ~@8 M@3 ~ G@5 A B A C D B E F A B A C
  D B E F ~@17
>`.pickRestart({
  A: "[a4,a5]", B: "[bb4,bb5]@12 [d5,d6]@3 [bb4,c5,bb5,c6]", C: "g5", D: "a5", E: "[a4,a5]@15 ~",
  F: "~@8 [bb5,d6]@7 ~, g5", G: "[g4,g5] ~@3 [g4,g5] ~@3 [g4,g5] ~@3 [g4,g5] ~@3", H: "[[g3,g4]@15 [c4,c5]]/4",
  I: "[d4,d5]@15 ~", J: "[eb4,eb5]@3 [bb3,bb4]", K: "[f4,f5]", L: "bb3@15 ~",
  M: "[[g4,g5]@36 [d4,d5]@3 ~ [d4,d5]@4 [c5,c6]@4]/3", // G D C
})).s("gm_string_ensemble_2").gain(0.49).pan(0.6)

// other · string ensemble 2 · "SLOWSTRING" · soft notes
const string_ensemble_2_soft = note(`<
  ~@12 A B ~@2 A ~@14 A B ~@2 A ~@9 C ~@8 A B ~@2 A ~@11 D ~@8 A B ~@2 A ~@3 A B ~@2 A ~@17
>`.pickRestart({
  A: "g4", B: "a4", C: "bb4@15 ~", D: "[bb4,bb5]@15 ~",
})).s("gm_string_ensemble_2").gain(0.27).pan(0.6)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@92 A B A C A B A C A B A C A B A C D>".pickRestart({
  A: "[d4,d6] ~@2 [d4,d6] ~@2 [d4,d6] ~@3 [d4,d6] ~@2 [d4,d6] ~@2", // D
  B: "[c4,c6] ~@2 [c4,c6] ~@2 [c4,c6] ~@3 [c4,c6] ~ [bb3,bb5] [c4,c6] [d4,d6] [eb4,eb6]", // C Bb C D Eb
  C: "[c4,c6] ~@2 [c4,c6] ~@2 [c4,c6] ~@3 [c4,c6] ~ [c4,c6] [d4,d6] [eb4,eb6] [f4,f6]", D: "[g4,g6]@15 ~",
})).s("gm_string_ensemble_1").gain(0.44).pan(0.7)

// other · flute · Dsus2 F Fmaj7 Csus2 Bbmaj7 Csus2
const flute = note(`<
  ~@9
  [a4@2 f4 [d4,e4] [bb3,b3,c4] [f3,a3] ~@10]
  ~@3
  [a4@2 [e4,f4] [c4,d4] [f3,a3,bb3] [c3,d3] ~@10]
  ~@95
>`).s("gm_flute").gain(0.16).pan(0.4)

// other · flute · soft notes · Csus2 Bbmaj7
const flute_soft = note("<~@9 [~@6 [c3,d3] [a2,bb2] ~@8] ~@3 [~@6 [a2,bb2] ~@9] ~@95>")
  .s("gm_flute").gain(0.11).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~@9 [x ~@2 x ~@3 x ~ x!3 ~@4]!99 x>").gain(0.49)

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

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A B C D E F G H I J K L M N O P I J K L M N Q R Q S Q I J K L M N O P I J K L M N K L M N Q R Q S Q I J K L M N O P
  I J K L M N O P K L M N Q R Q S Q I J K L M N O P I J K L M N O P I J K L M N O P I J K L M N O P ~
>`.pickRestart({
  A: "x ~ x!3 ~@2 x!2 ~ x!3 ~ x!2", B: "x ~@3 x ~ x!3 ~@2 x!2 ~ x!2", C: "x ~ x!5 ~ x!5 ~ x!2",
  D: "x ~ x!4 ~ x!2 ~ x!6", E: "x!5 ~ x!3 ~ x!3 ~ x ~", F: "x ~ x!3 ~ x!3 ~ x!3 ~@2 x", G: "x ~ x!3 ~ x!7 ~ x!2",
  H: "x ~ x!3 ~ x!10", I: "x!2 ~ x!2 ~@2 x ~ x ~ x!3 ~@2", J: "x!6 ~ x ~ x ~ x!3 ~@2", K: "x!2 ~ x!5 ~ x ~ x!3 ~@2",
  L: "~ x!5 ~ x ~ x ~ x!3 ~@2", M: "~ x!4 ~@2 x ~ x ~ x!3 ~@2", N: "~ x ~ x!5 ~ x ~ x!3 ~@2",
  O: "~ x ~ x!3 ~ x ~ x ~ x!3 ~@2", P: "~ x!7 ~ x ~ x!3 ~@2", Q: "x!14 ~@2", R: "x!9 ~@2 x!3 ~@2", S: "x!10 ~ x!3 ~@2",
})).gain(0.38)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~ A B C D E F G H I J K L M N O P I J K L M N ~ Q ~ R ~ I J K L M N O P I J K L M N K L M N ~ Q ~ R ~ I J K L M N O P
  I J K L M N O P K L M N ~ Q ~ R ~ I J K L M N O P I J K L M N O P I J K L M N O P I J K L M N O P ~
>`.pickRestart({
  A: "~ x ~@3 x!2 ~@2 x ~@3 x ~@2", B: "~ x!3 ~ x ~@3 x!2 ~@2 x ~@2", C: "~ x ~@5 x ~@5 x ~@2",
  D: "~ x ~@4 x ~@2 x ~@6", E: "~@5 x ~@3 x ~@3 x ~ x", F: "~ x ~@3 x ~@3 x ~@3 x!2 ~", G: "~ x ~@3 x ~@7 x ~@2",
  H: "~ x ~@3 x ~@10", I: "~@2 x ~@2 x!2 ~ x ~ x ~@5", J: "~@3 x!3 ~@2", K: "~ x ~@2 x!2 ~@2", L: "x ~@2 x!3 ~@2",
  M: "x ~@4 x!2 ~ x ~ x ~@5", N: "x!2 ~@2 x!2 ~@2", O: "x!2 ~ x!3 ~@2", P: "x ~@3 x!2 ~@2", Q: "~@9 x!2 ~@5",
  R: "~@5 x ~@2",
})).gain(0.22)

// drums · open hat
const open_hat = s("oh").struct("<~@9 [~@7 x]!99 x>").gain(0.38)

// drums · crash
const crash = s("cr").struct(`<
  ~@23 A ~@3 A@2 ~@17 A ~@3 A@2 ~@7 A ~@7 A ~@3 A ~@3 A@2 ~@3 A ~@3 A ~@2 B A ~@3 A ~@2 B A ~@3 A ~@2 B A ~@4
>`.pickRestart({
  A: "x", B: "~ x ~@2",
})).gain(0.27)

// drums · tambourine
const tambourine = s("tb").struct("<~@9 [~ x ~ x ~ x ~ x]!99 ~>").gain(0.33)

// drums · congas
const congas = s("conga:13").struct(`<
  ~ A@8 B C@7 B C@10 B C@7 B C@14 B C@7 B C@16 B C@7 B C@7 B C@7 B C@7 ~
>`.pickRestart({
  A: "~@7 x ~@8", B: "~@13 x!2 ~", C: "~@13 x!3",
})).gain(1.05)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~ A B C B@4 A D E D F G H F H D E D F G H D F G H@2 D E D F G H F H D E D F G H D F G H D F G H@2 D E D F G H F H D E
  D F G H F H D F G H D F G H@2 D E D F G H F H D E D F G H F H D E D F G H F H D E D F G H F H ~
>`.pickRestart({
  A: "~@5 x ~@6 x ~@3", B: "x ~@4 x ~@6 x ~@3", C: "x ~@4 x ~@10", D: "~@3 x ~@3 x ~ x ~ x ~@4",
  E: "~@3 x ~ x ~ x ~ x ~ x ~@4", F: "~ x ~ x ~ x ~ x ~ x ~ x ~@4", G: "~ x ~ x ~@3 x ~@3 x ~@4",
  H: "~ x ~ x ~@3 x ~ x ~ x ~@4",
})).gain(1.05)

// drums · congas · soft notes
const congas_soft = s("conga:18").struct(`<
  ~@3 A ~@4 B C ~ C ~@5 C ~ C ~@3 C ~@4 C ~ C ~@5 C ~ C ~@3 C ~@3 C ~@4 C ~ C ~@5 C ~ C ~@5 C ~@3 C ~@4 C ~ C ~@5 C ~ C
  ~@5 C ~ C ~@5 C ~ C ~@6
>`.pickRestart({
// … 51 more lines

More by Stansfield Lisa