Strudelify

Love Is Strange

Mickey & Sylvia

KeyC majorTempo122 bpm
0:00/0:00
// Love Is Strange — Mickey & Sylvia
// 122 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 88 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(122/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 · fretless bass
const bass = note(`<
  A B C D E F C G H I C J C K L M C F H F C I H I L I L F L B A N L I L O C F L D H B L P A N C H C F A Q E M H C H B H
  R L F L P C I S I H I H C@2 I L I C N C@3 R H I A I H T
>`.pickRestart({
  A: "c2@3 c2 g1@2 e1@2", B: "f1@3 f1 g1@2 a1@2", C: "c2@3 c2 c2@3 c2", D: "f1 e1 g1!2", E: "c2@3 c2 c2@2 c2@2",
  F: "f1@3 f1 g1@3 g1", G: "c2@3 c2 c2@2 a1@2", H: "c2@3 c2 c2@4", I: "f1@3 f1 g1@4", J: "f1 e1 g1 d2",
  K: "f1@3 f1 g1@2 b1@2", L: "c2@3 c2 c2@2 e1@2", M: "f1 e1 g1 a1", N: "f1 e1 g1@2", O: "f1!2 g1@2",
  P: "f1@3 f1 g1@2 g1@2", Q: "f1!2 g1 b1", R: "f1!2 g1 a1", S: "c2@3 c2 a1@2 g1@2", T: "c2@3 c2 c2@3 ~",
})).s("gm_fretless_bass").gain(0.36)

// chords · electric guitar jazz · "Jazz Electric"
const electric_guitar_jazz = note(`<
  A B A C A D A E F G H C I C E C F J F K I C I B H L F B A G I M I C A N F O A P E B I Q A R S I A R A D H O A S A N A
  C I C S O A T I G S O I@2 A D S C A C A H E Q I C F U A@2
>`.pickRestart({
  A: "[c4,e4,g4]", B: "[c4,f4,a4] [b3,d4,g4]", C: "[a3,c4,f4] [g3,b3,d4]", D: "[f3,a3,c4] [g3,b3,d4]",
  E: "[c4,e4,g4]@3 [g3,c4,e4]@5", F: "[c4,e4,g4]@3 [c4,e4,g4]@5", G: "[a3,c4,f4] [b3,d4,g4]",
  H: "[g3,c4,e4]@3 [c4,e4,g4]@5", I: "[g3,c4,e4]", J: "[f3,a3,c4]@3 [c4,f4,a4] [b3,d4,g4]@4",
  K: "[a3,c4,f4]@3 [f3,a3,c4] [b3,d4,g4]@4", L: "[f3,a3,c4]@3 [a3,c4,f4] [b3,d4,g4]@4",
  M: "[a3,c4,f4]@3 [a3,c4,f4] [b3,d4,g4]@4", N: "[c4,f4,a4]@3 [a3,c4,f4] [b3,d4,g4]@4", O: "[c4,f4,a4] [g3,b3,d4]",
  P: "[f3,a3,c4]@3 [a3,c4,f4] [g3,b3,d4]@4", Q: "[f3,a3,c4]@3 [f3,a3,c4] [b3,d4,g4]@4",
  R: "[c4,f4,a4]@3 [f3,a3,c4] [g3,b3,d4]@4", S: "[g3,c4,e4]@3 [g3,c4,e4]@5", T: "[f3,a3,c4] [b3,d4,g4]",
  U: "[a3,c4,f4]@3 [a3,c4,f4] [g3,b3,d4]@4", // F G
})).s("gm_electric_guitar_jazz").gain(0.48).pan(0)

// chords · electric guitar jazz · "Jazz Electric"
const electric_guitar_jazz_2 = note(`<
  A B A B A B C D E F E F E F A B E F E F E F A B E F E F E F A B E F E F E F A G H@3 I J K L M N O N O N O L D P Q P Q
  P Q P Q R S R S T@2 C D R S R S T@2 U@2 N O N O N O L V
>`.pickRestart({
  A: "~ c4 a3 g3 a3 c4 a3 g3", B: "[a4,c5,f5]@2 [a4,c5,f5]!2 [a4,c5,f5]@2 [a4,c5,f5]@4 ~@2 [b4,d5,g5]@4",
  C: "c5@2 c5@2 c5@2 d#5 ~", D: "g5@4 f5 d#5 c5 a#4",
  E: "~@2 c3 [e3,g3] c4@2 [c3,e3,g3,c4]@4 [c3,e3,g3,c4]@2 ~@2 [c3,e3,g3,c4]@2", // Em C
  F: "~@2 c3 [f3,a3] d4@2 [c3,f3,a3,d4]@4 [d3,g3,b3,e4]@2 ~@2 [d3,g3,b3,e4]@2", // F Dm7 Em7
  G: "[a4,c5,f5]@2 [a4,c5,f5]!2 [a4,c5,f5]@2 [a4,c5,f5]@2 [b4,d5,g5]@4 [b4,d5,g5]@4", // F G
  H: "[c5@2 ~@2 c5@2 ~@2 c5@2 ~@2 c5@2 c5@4 c5@4 c5@4 g4@2 a#4@6 c5@2 a#4@2 g4@2 f4@2 g4@4 f4 [c4,d#4]]/3", // Cm
  I: "a#3 c4 d#4 f4@2 g4 c5 ~", J: "~ d#4@2 c4 e4 c4 ~ c4", K: "g4!2 c5 ~@2 d#4 c4@2", L: "c5 ~ c5@2 c5@2 d#5 ~",
  M: "f#5@4 f5 d#5 c5 a#4", N: "~@6 c4 [e4,g4] d5@2 c#5@2 c5@4", O: "~@6 g4 [b4,d5] g5@2 f#5@2 f5@4",
  P: "~@2 c4 [e4,g4] c5@2 [c4,e4,g4,c5]@4 [c4,e4,g4,c5]@2 ~@2 [c4,e4,g4,c5]@2", // Em C
  Q: "~@2 c4 [f4,a4] d5@2 [c4,f4,a4,d5]@4 [d4,g4,b4,e5]@2 ~@2 [d4,g4,b4,e5]@2", R: "~@11 g5@2 g5@3", S: "g5 ~",
  T: "[~@7 f5@5 ~@4]/2", U: "[~@4 c5@2 ~@2 c5@2 g4@2 ~@2 g4@4 g4@2 c5@2 g4@4 f4 d#4 c4@2 a#3@2]/2",
  V: "g5@4 f5 d#5 c5 ~",
})).s("gm_electric_guitar_jazz").gain(0.29).pan(0.9)

// chords · acoustic guitar steel · "Steel String"
const acoustic_guitar_steel = note(`<
  A B A B A B C ~ A B D B A B A B A B A E D B A B A B A E A B A B A B D E D B A E A E D B A B C ~ A B A B A B C ~ A B A
  B A B A B A B A E A B C ~ A B A B D B C ~ D E A B A E C ~
>`.pickRestart({
  A: "[c3,g3,c4]@2 [c3,g3,c4] [c3,g3,c4]@3 [c3,g3,c4]@2", B: "[f2,c3,f3]@2 [f2,c3,f3]!2 [g2,d3,g3]@2 [g2,d3,g3]@2",
  C: "[c3,g3,c4] ~@3", D: "[c3,g3,c4] [c3,g3,c4]@3", E: "[f2,c3,f3]!2 [g2,d3,g3]@2",
})).s("gm_acoustic_guitar_steel").gain(0.48).pan(0.8)

// other · string ensemble 1 · "Choir Aahs"
const string_ensemble_1 = note(`<
  ~@8 A B C D A E F G A B C H C I F G A B C J A I F G A B C J A I F ~@17 K L M N O P Q ~@9 R S T U V W F ~@9
>`.pickRestart({
  A: "g4@4 e4@2 c5 g4", B: "a4 ~@3", C: "~@6 c5 g4", D: "a4@2 ~ g4", E: "a4@2 ~@2 f4!2 g4!2", F: "e4 ~@3",
  G: "~@2 f4 g4", H: "a4 ~", I: "a4@2 ~ e4 f4!2 g4!2", J: "a4@4 f4!2 g4@2", K: "g4 a4@2 g4 ~@4",
  L: "~ f4 e4 d4!2 c4 d4!2", M: "e4 e4@3 ~@4", N: "~@4 c4@2 c4 d4", O: "d4 e4 d4@2 ~@4", P: "~@4 c4@2 d4 f4",
  Q: "g4@2 f4 e4 d4 e4@2 ~", R: "g4!2", S: "~@4 f4@2 a4 f4", T: "g4 e4", U: "~@2 f4 a4", V: "g4@3 e4 e4@4",
  W: "~@4 f4@3 g4",
})).s("gm_string_ensemble_1").gain(0.57).pan(0.2)

// drums · kick
const kick = s("bd").struct("<A@6 B ~ A@38 B ~ A@6 B ~ A@14 B ~ A@6 B ~ A@6 ~@2>".pickRestart({
  A: "x!2", B: "x",
})).gain(0.35)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  A B A@2 C B ~@2 A B C@2 B A@2 B@2 A C A C A C B@2 C A B@2 A C A@2 C A@2 C@3 B A C@2 B A B ~@2 A@2 C A B@2 ~@2 B A B
  A@4 C@2 A@2 B@2 A ~@2 C B A B@2 A ~@2 A C B C A C D ~
>`.pickRestart({
  A: "~@3 x ~@4", B: "~@3 x ~@3 x", C: "~@7 x", D: "x",
})).gain(0.2)

// drums · snare
const snare = s("sd").struct("<A@6 ~@2 A@38 ~@2 A@6 ~@2 A@14 ~@2 A@6 ~@2 A@6 ~@2>".pickRestart({
  A: "~ x ~ x",
})).gain(0.45)

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

stack(
  bass, electric_guitar_jazz, electric_guitar_jazz_2, acoustic_guitar_steel, string_ensemble_1, kick, kick_soft, snare,
  hihat
)