Strudelify
Save Your Love cover art

1997 · Dynasty

Save Your Love

Kiss

KeyA minorTempo145 bpm
0:00/0:00
// Save Your Love — Kiss
// 145 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 3 "Paul" distortion guitar (copy of ch 2 "Ace" distortion guitar); ch 6 "Ace" distortion guitar (copy of ch 5 "Ace" distortion guitar)
// note: Full arrangement: all 165 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(145/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.

// bass · electric bass pick · "Gene"
const bass = note(`<
  A@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 F G H I@2 J K L K J K L K J K L K J K L M N B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 F G H
  I@2 J K L K J K L K J K L K J K L M N B@2 O@2 P@2 Q@2 B@2 O@2 R@2 S@2 B@2 O@2 R@2 S@2 B@2 O@2 R@2 T@2 F G H I@2 J K L
  K J K L K J K L K J K L M U V W X W Y Z AA Z J K L K J K L AB J K L K J K L AB J K L K J K L AB V
>`.pickRestart({
  A: "[e1@2 e1@2 ~@4 e1@2 e1@2 ~@3 e3@3 d3@3 b2@3 e2@2 ~@2 e2@4]/2", B: "[a1@3 a1]/2", C: "[g2 a2@11 a2@4]/2",
  D: "[a2 a1@11 a1@4]/2", E: "[g2 a2@11 a2@2 e2@2]/2", F: "a1@4 ~ g1!2 ~", G: "c2@4 ~ d2!2 ~", H: "e2@4 ~ e2!2 ~",
  I: "a1/2", J: "a1!5 ~ g1 ~", K: "c2!5 ~ g1 ~", L: "d2!5 ~ g1 ~", M: "e1!2 ~@2 e1!2 ~@2",
  N: "e3@3 d3@2 b2@3 e2@2 ~@2 e2@4", O: "[g1@3 g1]/2", P: "[d2@3 d2]/2", Q: "[a1@12 c2 a1 g1 e1]/2", R: "[d2@3 g1]/2",
  S: "[a1@13 g1@3]/2", T: "a1!8", U: "e3@3 d3@2 b2@3 e2@3 e2@2 g1@3", V: "a1!3 ~@5", W: "c2!3 ~@5", X: "d2!3 ~@5",
  Y: "a1!3 ~@3 g1 ~", Z: "c2!3 ~@3 g1 ~", AA: "d2!3 ~@3 g1 ~", AB: "e1!5 ~ e1 ~",
})).s("gm_electric_bass_pick").gain(0.64)

// chords · distortion guitar · "Ace"
const distortion_guitar = note(`<
  A@2 B@2 C@2 D@2 E F G@2 C@2 D@2 E F H I J K@2 L M N M L M N M L M N M L M N O P B@2 C@2 D@2 E F G@2 C@2 D@2 E F H I J
  K@2 L M N M L M N M L M N M L M N O P Q@2 R@2 S@2 T U Q@2 V@2 W@2 X@2 Q@2 V@2 W@2 X@2 Q@2 V@2 W@2 Y@2 H I J K@2 L M N
  M L M N M L M N M L M N O Z AA AB AC AB AD AE AF AE L M N M L M N AG L M N M L M N AG L M N M L M N AG AA
>`.pickRestart({
  A: "[[e3,b3,e4]@2 [e3,b3,e4]@2 ~@4 [e3,b3,e4]@2 [e3,b3,e4]@2 ~@3 [e3,b3,e4]@3 [e3,b3,e4]@3 [e3,b3,e4]@3 [e3,b3,e4]@2 ~@2 [e3,b3,e4]@4]/2", // E5
  B: "[[a2,e3,a3]@3 [e3,a3,c#4]]/2", C: "[[e3,a3,c#4] [e3,g3,d4]@11 [e3,g3,d4]@4]/2",
  D: "[[e3,g3,d4] [e3,a3,c#4]@11 [e3,a3,c#4]@4]/2", E: "[e3,a3,c#4] [e3,g3,d4]@7", F: "[g3,d4] [g3,e4] [g3,d4] [g3,b3]",
  G: "[[e3,a3,c#4]@3 [e3,a3,c#4]]/2", H: "[a2,e3,a3]@4 ~ [g2,d3,g3]@2 ~", I: "[c3,g3,c4]@4 ~ [d3,a3,d4]@2 ~",
  J: "[e3,b3,e4]@4 ~ [e3,b3,e4]@2 ~", K: "[a2,e3,a3]/2", L: "[a2,e3,a3]!5 ~ [g2,d3,g3] ~",
  M: "[c3,g3,c4]!5 ~ [g2,d3,g3] ~", N: "[d3,a3,d4]!5 ~ [g2,d3,g3] ~", O: "[e3,b3,e4]!2 ~@2 [e3,b3,e4]!2 ~@2",
  P: "[e3,b3,e4]@3 [e3,b3,e4]@2 [e3,b3,e4]@3 [e3,b3,e4]@2 ~@2 [e3,b3,e4]@4", Q: "[[a2,e3,a3]@3 [a3,e4,a4]]/2",
  R: "[[a3,e4,a4] [g3,d4,g4]@11 [g3,d4,g4]@4]/2", S: "[[g3,d4,g4] [f#3,d4,f#4]@11 [g3,d4,g4] [g3,d4,g4]@3]/2",
  T: "[a3,e4,a4]", U: "~ [g3,d4,g4] ~@2 [g3,d4,g4] ~ [g3,d4,g4] ~", V: "[[g3,d4,g4]@3 [g3,d4,g4]]/2",
  W: "[[d3,a3,d4]@12 [g3,d4,g4]!2 ~@2]/2", X: "[[a3,e4,a4]@13 [g3,d4,g4]@3]/2", Y: "[a2,e3,a3]!8",
  Z: "[e3,b3,e4]@3 [e3,b3,e4]@2 [e3,b3,e4]@3 [e3,b3,e4]@3 [e3,b3,e4]@2 [g2,d3,g3]@3", AA: "[a2,e3,a3]!3 ~@5",
  AB: "[c3,g3,c4]!3 ~@5", AC: "[d3,a3,d4]!3 ~@5", AD: "[a2,e3,a3]!3 ~@3 [g2,d3,g3] ~",
  AE: "[c3,g3,c4]!3 ~@3 [g2,d3,g3] ~", AF: "[d3,a3,d4]!3 ~@3 [g2,d3,g3] ~", AG: "[e3,b3,e4]!5 ~ [e3,b3,e4] ~",
})).s("gm_distortion_guitar").gain(0.34).pan(0)

// other · distortion guitar · "Paul"
const distortion_guitar_2 = note("<~@78 [a2!8]!30 ~@57>").s("gm_distortion_guitar").gain(0.42).pan(0.2)

// other · distortion guitar · "Ace"
const distortion_guitar_3 = note("<~@86 A@2 B@2 C@2 D@2 E F G H I@2 J K L M N O P Q R S T U V W@2 ~@50>".pickRestart({
  A: "[~@2 e4 d4 ~@4 e4 d4 ~@4 e4 d4@10 ~ d4@2 e4@2 c4@2]/2",
  B: "[d4@2 c4@2 g3@2 g3@2 g3@2 a3@4 ~@10 e3 g3 a3@2 c4@2 a3@2, ~@7 a2@6 ~@3]/2",
  C: "[e4@6 e4@6 e4@12 d4 e4 d4@2 a3@2 c4@2]/2", D: "[c#4@12 a3@2 g3@12 a3 g3 e3@2 g3@2]/2", E: "a2@12 a2!2 ~ a2",
  F: "a2@8 a2@3 b2@2 c3@3", G: "d3@6 c3 d3", H: "d3@2 e3@6 a4 g4 a4 g4 a4 g4 a4 g4",
  I: "[c5@6 c5@6 c5@12 a4 c5 g4@2 e4@2 g4@2]/2", J: "a4", K: "c5 a4 e4 ~ g4 e4 b3 ~ d4 c4 g3 ~ a3 g3 d3 ~",
  L: "a3@2 a2 a3!2 a2 g3 a2", M: "f#3@2 a2@2 e3 f#3 e3 d3 e3@8", N: "e3 f#3@6 f#3", O: "g3@6 c4@2 d4@2 c4 b3 c4@2 b3@2",
  P: "a3 b3!2 a3 c4!2 a3 d4", Q: "d4 a3 e4!2 a3 f#4!2 a3", R: "g4!2 a3 a4!5", S: "a4!8", T: "g4 e5@7",
  U: "e4 g4 a4@2 a4 g4 e4@2 g4@2 g4@2 ~@2 g4@2", V: "e5@8 g4 a4 e4@2 g4@2 e4 g4", W: "a4/2",
})).s("gm_distortion_guitar").gain(0.64).pan(0.4)

// chords · lead 2 sawtooth · "Chorus"
const lead_2_sawtooth = note(`<
  ~@23 A B C D E F G D E F G D E F G H I ~@21 E F G D E F G D E F G D E F G H I ~@37 E F G D E F G D E F G D E F G H J
  ~@8 E F G D E F G K E F G D E F G K E F G D E F G K ~
>`.pickRestart({
  A: "c4", B: "b3", C: "a3@3 ~", D: "[c4,e4] [g3,c4] ~@2 [c4,e4] [g3,c4] ~@2", E: "[c4,e4]", F: "[b3,d4]",
  G: "[a3,c4]@3 ~", H: "[e4,g4]@4 ~@3 e4", I: "g4@3 f#4@2 e4@3 g4@4 g4@4", J: "g4@3 f#4@2 e4@3 g4@3 g4@4 ~",
  K: "a4 g4 e4 a4",
})).s("gm_lead_2_sawtooth").gain(0.56)

// drums · kick
const kick = s("bd").struct(`<
  ~@2 A@16 B@3 C ~ D@16 E A@16 B@3 ~@2 D@16 E A@7 F A@7 G A@7 G A@6 H I G@3 ~@2 D@16 ~ D@3 J D@3 J D@24 ~
>`.pickRestart({
  A: "x ~@4 x ~ x", B: "x ~@4 x ~@2", C: "x", D: "~@2 x ~@3 x ~@2 x ~ x ~@2 x ~", E: "~ x", F: "x ~@2 x ~@4", G: "x!2",
  H: "x!8", I: "x!4 ~@4", J: "~@2 x ~@3 x ~@2 x!3 ~@2 x ~",
})).gain(0.64)

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

// drums · low tom
const low_tom = s("lt").struct("<~@21 A B ~@16 C ~@19 D ~@17 C ~@7 E ~@24 F@3 D ~@17 G ~@33>".pickRestart({
  A: "~@3 x!2 ~@2 x", B: "x ~ x ~@3 x!2 ~@6 x!2", C: "~@3 x ~ x ~@10", D: "~@4 x!2 ~@4 x!2 ~@4", E: "~@7 x",
  F: "~@7 x ~@8", G: "~@11 x ~ x ~@2",
})).gain(0.64)

// drums · hihat
const hihat = s("hh").struct("<~@2 A B@15 ~@22 A B@15 ~@22 A B@6 C A B@6 D A B@6 D A B@5 ~@57>".pickRestart({
  A: "~ x!7", B: "x!8", C: "x", D: "x!5 ~@3",
})).gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct("<~ A ~@20 B ~@16 C ~@19 D E ~@16 C ~@7 F ~@24 G@3 D E ~@16 H ~@33>".pickRestart({
  A: "~@2 x ~@2 x ~@10", B: "~@10 x!6", C: "~@3 x ~@12", D: "~@2 x!4 ~@2 x!4 ~@4", E: "~@8 x!8", F: "~@5 x!3",
  G: "~@3 x ~@4", H: "~@5 x ~@2 x ~@2 x ~@4",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@23 A@16 ~@22 A@16 ~@8 B ~@29 A@16 ~ A@32 ~>".pickRestart({
  A: "x!4", B: "~ x ~@2",
})).gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<A B ~@20 C ~@36 D E ~@24 F ~@27 D E ~@16 G ~@33>".pickRestart({
  A: "~@15 x", B: "~ x ~@6", C: "~@8 x!4 ~@4", D: "~@2 x!2 ~@4 x!2 ~@6", E: "x!8 ~@8", F: "~@5 x ~@2",
  G: "~@3 x ~ x ~@10",
})).gain(0.64)

// drums · crash
const crash = s("cr").struct(`<
  ~@2 A ~@15 A@4 ~ A ~@16 A ~@15 A@3 ~@2 A ~@16 A ~@7 A ~@6 B A ~@6 B A ~@5 A ~ C@3 ~@2 A ~@16 A ~@3 A ~@3 A ~@7 A ~@7 A
  ~@7 D
>`.pickRestart({
  A: "x", B: "~@5 x ~@2", C: "x ~@4 x ~@2", D: "x!3 ~@5",
})).gain(0.64)

// drums · bongos
const bongos = s("bongo:4").struct(`<
  ~@23 A B@15 ~@22 A B@15 ~@38 A B@15 ~ A B@3 A B@3 A B@7 A B@7 A B@7 ~
>`.pickRestart({
  A: "~ x!3", B: "x!4",
})).gain(1.68)

stack(
  bass, distortion_guitar, distortion_guitar_2, distortion_guitar_3, lead_2_sawtooth, kick, snare, low_tom, hihat,
  mid_tom, open_hat, high_tom, crash, bongos
)

More by Kiss