Strudelify

Sex and Candy

Marcy Playground

KeyB minorTempo80 bpm
0:00/0:00
// Sex and Candy — Marcy Playground
// 80 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 1 "guitar" electric guitar clean (copy of ch 2 "guitar" electric guitar jazz)
// note: Full arrangement: all 56 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/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.

// chords · electric guitar jazz · "guitar"
const electric_guitar_jazz = note(`<
  A B A C A B A D E F G F G F H I J I J K A B A C A B A D E F G F G F H I J I J I J K L M L M L N O P Q P Q P R@2
>`.pickRestart({
  A: "f#3@2 ~@2 b3@3 [b2,f#3,b3]!2 ~ [b2,f#3]@4 [b2,f#3]!2, b2@7 ~@9, b3@2 ~@3 b3@3, ~@2 f#3@5 ~@9", // B5
  B: "[g2,d3,g3]@2 [g2,d3]@4 [g2,d3]!2 [f#2,c#3,f#3]@2 [f#2,c#3]@4 [f#2,c#3]!2, ~ g3@3 ~ f#3@3", // G5 F#5
  C: "[g2,d3]@2 ~@4 [g2,d3]!2 [f#2,c#3,f#3]@2 [f#2,c#3]@4 [f#2,c#3]!2, g3@2 g3@2 ~ f#3@3, ~ [g2,d3]@2 ~@5", // G5 F#5 G5
  D: "[g2,d3]@2 ~@4 [g2,d3]!2 [f#2,c#3,f#3]@2 [f#2,c#3,f#3]@2 [f#2,c#3,f#3]@2 [f#2,c#3,f#3]@2, g3!2 ~@2, ~ [g2,d3]@2 ~@5", // G5 F#5 G5
  E: "[f#2,c#3,f#3]!3 ~@5", // F#5
  F: "f#3@2 ~@2 b3@3 [b2,f#3,b3]!2 ~ [g2,d3]@4 [g2,d3]!2, b2@7 ~@9, b3 ~@3, ~@2 f#3@5 ~@3 g3@6", // B5 G5
  G: "[a2,e3]@2 ~@4 [a2,e3] ~@9, a3!2 ~@2, ~ [a2,e3]@2 ~@5", // A5
  H: "[a2,e3,a3]@6 [a2,e3,a3]@2 [a2,e3,a3]@2 [a2,e3,a3]@2 [a2,e3,a3]!2 [a2,e3,a3]@2", // A5
  I: "a3@2 ~@2 a2@3 [a2,d3,a3]!2 ~ [a2,e3]@4 [a2,e3]!2, d3@7 ~@9, a2 ~@3, ~@2 a3@5 ~@3 a3@6", // D5 A5
  J: "[b2,f#3,b3]@2 [b2,f#3]@4 [b2,f#3]!2 [g2,d3,g3]@2 [g2,d3]@4 [g2,d3] ~, ~ b3@3 ~ g3@3", K: "[f#2,c#3,f#3]!8",
  L: "~@8 f#3@2 ~@2 b3@3 [b2,f#3,b3], ~@8 b2@7 ~, ~@2 b3 ~, ~@10 f#3@5 ~", // B5
  M: "[b2,f#3,b3] ~ [g2,d3]@4 [g2,d3]!2 [a2,e3]@2 ~@4 [a2,e3] ~, ~ g3@3 a3@2 a3@2, ~@5 [a2,e3]@2 ~", // B5 G5 A5
  N: "[b2,f#3,b3] ~ [g2,d3]@4 [g2,d3]!2 [a2,e3,a3]@6 [a2,e3,a3]@2, ~ g3@3 ~@4", // B5 G5 A5
  O: "[a2,e3,a3]@2 [a2,e3,a3]@2 [a2,e3,a3]!2 [a2,e3,a3]@2 a3@2 ~@2 a2@3 [a2,d3,a3], ~@8 d3@7 ~, ~@2 a2 ~, ~@10 a3@5 ~", // A5 D5
  P: "[a2,d3,a3] ~ [a2,e3]@4 [a2,e3]!2 [b2,f#3,b3]@2 [b2,f#3]@4 [b2,f#3]!2, ~ a3@3 ~ b3@3", // D5 A5 B5
  Q: "[g2,d3,g3]@2 [g2,d3]@4 [g2,d3] ~ a3@2 ~@2 a2@3 [a2,d3,a3], ~@2 g3@6 d3@7 ~, ~@2 a2 ~, ~@10 a3@5 ~", // G5 D5
  R: "[[g2,d3,g3]@2 [g2,d3]@4 [g2,d3] ~ [a2,d3,a3,d4]@24, ~ g3@3 ~@12]/2", // G5 D5
})).s("gm_electric_guitar_jazz").gain(0.42)

// chords · electric guitar jazz · "guitar" · soft notes
const electric_guitar_jazz_2 = note("<~@8 A@6 ~@14 A@6 ~@8 B ~ B ~ B ~@9>".pickRestart({
  A: "[~@8 [a3,e4] [b3,f#4] [a3,e4]@2 [f3,c4] [f#3,c#4] [e3,b3] [d3,a3]@5 ~@12]/2", // A5 B5 A5 F5 F#5 E5 D5
  B: "[a3,e4] [b3,f#4] [a3,e4]@2 [f3,c4] [f#3,c#4] [e3,b3] [d3,a3]@5 ~@4", // A5 B5 A5 F5 F#5 E5 D5
})).s("gm_electric_guitar_jazz").gain(0.28)

// bass · electric bass finger · "bass"
const bass = note(`<
  A B A B A B A C D E F E F E G H I H I J A B A B A B A C D E F E F E G H I H I H I J K L K L K M N O P O P O Q@2
>`.pickRestart({
  A: "b1@7 b1 b1@2 b1@6", B: "g1@6 g1!2 f#1@2 f#1@6", C: "g1@6 g1!2 f#1@2 f#1@2 f#1@2 f#1@2", D: "f#1!3 ~@5",
  E: "b1@7 b1 g1@2 g1@6", F: "a1@6 a1 ~@9", G: "a1!8", H: "d2@7 d2 a1@2 a1@6", I: "b1@6 b1!2 g1@2 g1@6", J: "f#1!8",
  K: "~@8 b1@7 b1", L: "g1@2 g1@6 a1@6 a1 ~", M: "g1 g1@3 a1!4", N: "a1@2 a1@2 a1@2 a1@2 d2@7 d2",
  O: "a1@2 a1@6 b1@6 b1!2", P: "g1@2 g1@6 d2@7 d2", Q: "[g1 g1@3 d2@12]/2",
})).s("gm_electric_bass_finger").gain(0.72)

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

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@19 [~@2 x!3 ~ x ~] ~@21 [~@2 x!3 ~ x ~] ~@14>").gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct("<~@19 [x!2 ~@6] ~@21 [x!2 ~@6] ~@14>").gain(0.48)

// drums · open hat
const open_hat = s("oh").struct(`<
  A ~@7 B A B A B A C D C E@2 ~ A ~@7 B A B A B A C D C D C E@2 ~ F G F G F H I J I J K E L ~
>`.pickRestart({
  A: "x", B: "~ x ~@2", C: "x!4", D: "x ~ x!6", E: "x!8", F: "~ x", G: "~@3 x", H: "~@2 x!2", I: "x ~ x ~ x ~ x!2",
  J: "x!5 ~ x ~", K: "x ~ x ~ x!4", L: "x!5 ~@3",
})).gain(0.61)

// drums · ride bell
const ride_bell = s("rd").struct("<[x!8]!8 [x!3 ~@5] ~@11 [x!8]!8 [x!3 ~@5] ~@27>").gain(0.61)

stack(electric_guitar_jazz, electric_guitar_jazz_2, bass, kick, snare, hihat, low_tom, mid_tom, open_hat, ride_bell)