Strudelify

If Loving You Is Wrong (I Don't Want to Be Right)

Luther Ingram

KeyG majorTempo95 bpm
0:00/0:00
// If Loving You Is Wrong (I Don't Want to Be Right) — Luther Ingram
// 95 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 61 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(95/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 · "Piano (Melody)"
const piano = note(`<
  ~@2 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK V AL X Y AM AN AO AP AQ AI AR
  AK AS AL X Y AT AU AT AU ~@2
>`.pickRestart({
  A: "[g5,b5,e6]@3 ~@9 [g5,b5,e6]@3 ~", B: "[e5,g5,b5]@3 ~@9 [g5,b5,e6]@2 ~@2",
  C: "[b4,e5,g5]@2 [e5,g5] a5 [e5,g5,b5]@3 ~@5 [c5,e5]@2 g5@2", D: "[c5,e5,b5]@3 ~@5 c4@2 g5 e5 e5@2 d5@2",
  E: "[g5,b5,e6]@10 ~@2 [g5,b5,e6]@3 ~", F: "[e5,g5,b5]@10 ~@2 [g5,b5,e6]@3 ~",
  G: "[b4,e5,g5]@2 [e5,g5] a5 [e5,g5,b5]@6 ~@2 [c5,e5]@2 g5@2", H: "[c5,e5,b5]@8 ~@2 g5 e5 e5@2 d5@2", I: "~@15 e5",
  J: "b5@2 ~ b5 a5@2 g5@2 b5@4 ~@2 g5 a5", K: "b5 a5 g5@2 b5@4 ~@6 g5@2", L: "b5 d6@2 d6@2 ~ d6@2 e6!3 a5@2 g5@2 g5",
  M: "b5 a5 g5!2 a5@2 g5!2 g5@6 ~ g5", N: "e6!3 e6@2 d6 b5@2 e6@2 d6 d6@2 ~ b5 d6",
  O: "e6@3 ~ d6@2 d6 d6@2 b5@3 ~@3 b5", P: "g6@2 g6!2 e6@2 d6@2 e6 d6@2 b5@2 a5 g5@2",
  Q: "b5@2 a5 g5!2 g5@2 g5@6 ~@2 g5", R: "e6@2 e6@2 e6@2 ~ e6@2 e6@2 e6@2 d6 b5@2", S: "e6@2 d6 b5 d6@2 d6 d6@5 ~@3 g5",
  T: "e6@2 e6@2 g6@2 e6@2 g6 g6@2 e6@2 d6 b5@2", U: "e6@2 d6 d6@2 d6 b5@6 ~@3 b5",
  V: "g6@2 ~ e6 g6@2 g6 a6@2 g6 e6@2 ~@2 g6!2", W: "e6 d6 d6@2 d6@8 ~@3 b5",
  X: "g6@2 g6 g6@2 g6@2 a6@2 g6 e6@2 ~@2 g6!2", Y: "e6 d6 d6@2 d6@4 ~@8", Z: "b5@2 ~ b5 a5@2 g5@2 b5@4 ~@3 a5",
  AA: "b5 a5 g5@2 b5@2 a5 b5@7 ~@2", AB: "b5!2 d6 b5 d6@2 b5@2 e6@2 e6!2 a5 g5@2 g5", AC: "b5 g5 a5 g5 g5@3 ~",
  AD: "e6@2 e6@2 e6 d6 b5!2 e6@2 d6@3 ~ b5 d6", AE: "e6 d6 d6@2 d6@2 b5 d6 b5@4 ~@2 g6@2",
  AF: "g6@2 g6!2 e6@2 d6@2 e6 d6@2 b5@2 ~ g5@2", AG: "b5@2 a5@2 g5 g5@2 g5@7 ~@2",
  AH: "e6@2 e6@2 e6@2 ~ e6 e6@2 e6@2 e6@3 ~", AI: "e6@2 d6@2 d6@2 d6 d6@5 ~@3 g5",
  AJ: "e6@2 e6@2 g6@2 e6@2 g6!4 e6@2 d6 b5", AK: "e6@2 d6 b5 d6@2 e6 b5@5 ~@3 b5", AL: "e6 d6 d6@2 d6@4 ~@7 b5",
  AM: "e5@3 ~ e5 g5@2 e5 b5@6 ~@2", AN: "b5@3 ~ c6 b5@2 a5 b5@3 ~ g5@2 a5@2", AO: "b5@2 a5@2 g5@2 e5@5 ~ g5@2 a5@2",
  AP: "b5 a5 g5 b5@3 ~@2", AQ: "e6@2 e6@2 e6@2 ~ e6@2 ~ e6@2 e6@3 ~", AR: "e6@2 e6@2 g6@2 e6@2 g6 g6@2 e6 e6@2 d6 b5",
  AS: "g6@2 ~ e6 g6@2 g6 a6@2 g6 ~@4 g6!2", AT: "g6 e6@2 e6@2 e6 d6@2 d6@4 ~@2 g5!2",
  AU: "b5@2 ~ b5@2 b5!2 a5@2 g5@3 ~@4",
})).s("gm_piano").gain(0.72).pan(0.7)

// chords · epiano1 · "Piano  (Rhodes)"
const epiano1 = note(`<
  ~@2 A B A C A D E C F G H I J A K I L M K M N O G I P G H O Q E G R S T E C A I K R U A V D W C X M X R X I Y G I N B
  Z AA
>`.pickRestart({
  A: "[b3,e4,g4]@10 ~@3 g4@2 ~, e2, ~@5 g3@3, ~@11 b3@4 ~, ~@12 e4@3 ~", // Em
  B: "c4@5 ~@2 e4, [c3,b3], e4@3 c4, g4 ~@9 g3@6", // Cmaj7
  C: "[g3,a3,c4,e4]@10 ~@4 e4 ~, a2, ~@5 e3@3, ~@11 g3@2 c4@2 ~, ~@12 a3@3 ~", // Am7
  D: "b3 ~@6 g4, c3, g4@3 [b3,e4], e4@2 b3@2 e4 g3@3, c4 g3@2 c4@5", // E5
  E: "[g3,b3]@13 ~@2 e4, [e2,e4,g4], ~@13 g3@3, ~@7 b3", // G Em
  F: "~@3 c4 ~@3 d#4, [c3,e4,g4] [b2,b3], c4@3 ~@2 f#3@3, ~ g3 a3!2", G: "g4@2 e5 g4, [e2,g3,b3,e4]",
  H: "[b3,d4]@13 ~@2 g4, [g2,g4,b4], ~@13 b3@3, ~@7 d4", I: "[b3,e4,g4]@3 ~ [b3,e4,g4]@4, c3, ~@3 g3@5",
  J: "~ a3 [b2,f#3,a3,b3,d4]@2 ~ c4 ~ d4, [a2,e3,g3,c4] ~ [c3,g3,b3,e4] [b2,f#3,b3,f#4]", // Bm7 Am7 Cmaj7 B5
  K: "e4@5 ~@2 g4, [e2,b3], g4 ~@9 g3@6, ~@3 e4", // E5
  L: "~ a3 [b2,f#3,a3,b3,d4]@2 [c3,g3,c4,e4,g4]@2 ~ b3, [a2,e3,g3,c4] ~@2 [b2,f#3,a3,d4]", // Bm7 C Am7 Bm7
  M: "c4@2 a4 c4, [a2,e3,g3,a3]", N: "[b3,g4]@3 ~ [b3,g4]@4, e2, ~@3 g3@5",
  O: "[b3,c4]@13 ~@2 e4, [c3,e4,g4], ~@13 b3@3, ~@7 c4", P: "b3@5 ~@2 d4, [e2,g3], d4@3 b3, e4 ~@9 e3@6",
  Q: "~ a3 ~ b3 [c3,g3,b3,c4,e4]@2 ~ d4, [a2,e3,g3,c4] [b2,f#3,a3,d4] ~ [b2,f#3,b3,f#4]", // Cmaj7 Am7 Bm7 B5
  R: "[b3,c4,e4,g4]@10 ~@4 g4 ~, c3, ~@5 g3@3, ~@11 b3@2 e4@2 ~, ~@12 c4@3 ~", // Cmaj7
  S: "~ a3 [b2,f#3,a3,b3,d4]@2 ~ e4 [b2,f#3,a3,b3,d4]@2, [a2,e3,g3,c4] ~ [c3,g3,c4,g4] ~", // Bm7 Am7 C5
  T: "a3@5 ~@2 c4, [a2,g3], c4@3 a3, e4 ~@9 e3@6", U: "[g3,b3]@13 ~@2 d4, [e2,d4,e4], ~@13 g3@3, ~@7 b3",
  V: "g4@5 ~@2 b4, [g2,d4], b4 ~@9 b3@6, ~@3 g4", // G5
  W: "[a2,e3,g3,a3,c4]@2 ~ b3 [c3,g3,b3,c4,e4]@2 [b2,f#3,a3,b3,d4]@2, ~ [b2,f#3,a3,d4] ~@2", // Am7 Cmaj7 Bm7
  X: "b3 ~@5 [b3,g4]@2, e2, g4@3 e4@5, e4@2 b3@3 g3@3, ~ g3@3 g4@2 ~@2", Y: "[g3,d4,e4]@3 ~ [g3,d4,e4]@4, e2, ~@3 e3@5",
  Z: "d4@5 ~ e4@2, [b3,g4]@15 ~, e4@3 ~, ~@10 d4@5 ~", AA: "~ c2, [b3,d4,e4,g4]",
})).s("gm_epiano1").gain(0.28).pan(0.9)

// bass · fretless bass · "Bass"
const bass = note(`<
  ~@2 A B A C D E D C F G H I J G K I J L D C A E A E D G H I J G K I J L A C D B D B A G H I J C D C D B D E A G M K M
  N O
>`.pickRestart({
  A: "e2@8 b1@7 ~", B: "c2@8 g1@7 ~", C: "a1@8 e1@7 ~", D: "e2@5 ~ e2@2 b1@5 ~ b1 ~", E: "c2@5 ~ c2@2 g1@5 ~ g1 ~",
  F: "c2@8 b1@6 b1 ~", G: "e2@7 ~ e2@8", H: "g2@7 ~ g2@8", I: "c2@7 ~ c2@8", J: "a1 b1 c2 b1", K: "e2@5 ~ e2 ~ e2@8",
  L: "a1@5 ~ a1@2 e1@5 ~ e1 ~", M: "c2@5 ~ c2 ~ c2@8", N: "c3@3 g2", O: "c2",
})).s("gm_fretless_bass").gain(0.23).pan(0)

// chords · acoustic guitar steel · "Guitar"
const acoustic_guitar_steel = note(`<
  ~@2 A B C D E F G D H C I J K A L B K M L D A B C F N E I O K C@2 J K P E D G O L F Q A R F K M C S A F E F T C O A B
  U@2
>`.pickRestart({
  A: "e4@2 ~@12 g4 ~, b4@7 ~, e3@3 g4@2 b3@3, g4@4 e4@7 ~ e4@4, ~ b3@3 e3@4",
  B: "b3 g3 ~ g3 ~ g3 ~ g3, e4@5 ~@3, c3@3 ~ c3@3 ~, ~@4 b3@5 ~@3 [b3,e4]@4", // E5
  C: "~@2 b3@2 ~@2 b3@2 ~@2 b3@2 ~@3 g4, e3@3 ~ e3@2 g3@2, ~ b4@3, ~@4 [e4,g4]@9 b3@3, ~@7 e4", // Em
  D: "~ e3 ~ e3 ~ e3 ~ e3, a2@7 ~ a2@6 ~@2, ~@2 [g3,c4]@3 ~ [g3,c4]@2", // C5
  E: "~ b3 ~ b3 ~ b3 ~ b3, e3@3 ~ e3@3 ~, ~@4 [e4,g4,b4]@7 ~ [e4,g4,b4]@4", // Em
  F: "~ g3 ~ g3 ~ g3 ~ g3, c3@7 ~ c3@6 ~@2, ~@2 [b3,e4]@3 ~ [b3,e4]@2", // E5
  G: "~ b3 ~ b3 ~@3 b3, e3@7 ~ e3@7 ~, [e4,g4,b4]@2 [e4,g4,b4]@3 b3 [g4,b4]@2, ~@11 e4@5", // Em G
  H: "c4 ~@2 e4 ~@2 b3 d#4, c3 b2, g4@3 ~@5, ~ g3@3 ~ f#3@3, ~ c4 ~ a3",
  I: "~ d3 ~ d3 ~@3 g3, g2@7 ~ g2@8, b3@2 [g3,b3]@3 d3 b3@2, ~@11 g3@3 ~@2", // G
  J: "~@2 g3@2 ~@2 g3@2 ~@5 c4 ~ b3, c3@3 ~ c3@4, ~@2 [b3,e4]@3 g3@3, ~@6 b3 e4", // E5
  K: "[a2,e3,a3,c4] [b2,f#3,b3,d4] [c3,g3,c4,e4] [b2,f#3,b3,d4]", // Am Bm C Bm
  L: "~ b3 ~ b3 ~ b3 ~ b3, [g4,b4]@5 ~ [g4,b4]@2, e3@6 ~@2 e3@7 ~, ~ e4@3", // G
  M: "[g3,c4] e3 ~ e3 ~@3 e3, a2@7 ~ a2@8, ~@2 [g3,c4]@3 e3 c4@2, ~@11 g3@5", // C5
  N: "g3 e3 ~ e3 ~ e3 ~ e3, d4@5 ~@3, e2@3 ~ e2@3 ~, ~@4 g3@5 ~@3 [g3,d4]@4", // G5
  O: "[b3,e4] g3 ~ g3 ~@3 g3, c3@7 ~ c3@8, ~@2 [b3,e4]@3 g3 e4@2, ~@11 b3@5", // E5
  P: "~@2 e3@2 ~@2 e3@2 ~@5 a3 ~ g3, a2@3 ~ a2@4, ~@2 [g3,c4]@3 e3@3, ~@6 g3 c4", // C5
  Q: "~ e3 ~ e3 ~ e3 ~ e3, e2@7 ~ e2@6 ~@2, ~@2 [g3,d4]@3 ~ [g3,d4]@2", // G5
  R: "~ d3 ~ d3 ~ d3 ~ d3, g2@7 ~ g2@6 ~@2, ~@2 [g3,b3]@3 ~ [g3,b3]@2", // G
  S: "g3 e3 ~ e3 ~ e3 ~ e3, c4@5 ~@3, a2@3 ~ a2@3 ~, ~@4 g3@5 ~@3 [g3,c4]@4", // C5
  T: "[g3,d4] e3 ~ e3 ~@3 e3, e2@7 ~ e2@8, ~@2 [g3,d4]@3 e3 d4@2, ~@11 g3@5", // G5
  U: "[~@6 e4@4 ~@2 c4@3 ~ [g3,c4,e4]@16, c3@15 c3@17, ~@2 g3@6 ~@2 g3@5 ~@17, ~@4 c4@7 ~@21]/2", // C
})).s("gm_acoustic_guitar_steel").gain(0.34).pan(0.1)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@2 A B C D A E F G H ~@8 G F I F E C J K ~@8 G F L M E M J K ~@4 L M L M J A J N ~@6
>`.pickRestart({
  A: "g5 b5, e6", B: "~ g6, [b5,e6]", C: "e6@8 g6@4 e6@3 ~, g5@15 ~", D: "c6@8 e6@4 c6@3 ~, g5@15 ~", E: "b5 d6, e6",
  F: "[g5,e6]", G: "g5 a5, c6", H: "[g5,e6] [a5,d#6]", I: "~ e6, [g5,c6]", J: "[b5,e6]", K: "g5 b5, d6", L: "[g5,c6]",
  M: "~ g6, [g5,e6]", N: "[g5,d6]",
})).s("gm_string_ensemble_1").gain(0.22).pan(1)

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

// drums · rim
const rim = s("rim").struct("<A B ~@9 C@3 ~ C@3 ~@8 D C@3 ~ C@3 D ~@3 D ~@4 C@3 ~@9 C ~@2 D ~@2>".pickRestart({
  A: "x!2", B: "x!4", C: "~ x ~ x", D: "~ x ~@2",
})).gain(0.64)

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

// drums · low tom
const low_tom = s("lt").struct("<~@10 A ~@7 A ~@23 A ~@7 B ~@3 A ~ B@2 ~@3>".pickRestart({
  A: "~@7 x", B: "~@14 x!2",
})).gain(0.48)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@2 A ~ B C A ~ D ~ D B E F G B F B D A ~ B C A ~ B F B@3 G B@2 E B A ~ B F A ~ B D B H@2 C A ~ B D A ~ B D B D@2 B I
  ~
>`.pickRestart({
  A: "~@7 x", B: "~ x ~ x ~ x ~ x", C: "~ x ~@6", D: "~@3 x ~@4", E: "~@3 x ~ x ~ x", F: "~ x ~@3 x ~ x",
  G: "~@5 x ~ x", H: "~ x ~@5 x", I: "~@3 x ~ x ~@2",
})).gain(0.24)

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

// drums · open hat
const open_hat = s("oh").struct("<~@12 A ~@13 B ~@6 A ~@4 B ~@11 C ~@5 C@2 ~@3>".pickRestart({
  A: "~ x ~@6", B: "~@3 x ~@4", C: "~@2 x ~@2 x ~@10",
})).gain(0.56)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@5 A ~@4 B ~@7 B ~@3 A ~@3 C ~@7 C ~@3 C ~@3 B ~@3 A ~@3 D ~@3 B ~ D@2 C ~@2
>`.pickRestart({
  A: "~@6 x ~@4 x!2 ~@3", B: "~ x!2 ~", C: "~@11 x ~@4", D: "~@4 x!2 ~@2",
})).gain(0.56)

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

// drums · ride
const ride = s("rd").struct("<~@11 A ~@19 A ~@11 A ~@15 B A>".pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.48)

stack(
  piano, epiano1, bass, acoustic_guitar_steel, string_ensemble_1, kick, rim, snare, low_tom, hihat, hihat_soft, mid_tom,
  open_hat, high_tom, crash, ride
)