Strudelify

Before

Pet Shop Boys

KeyA minorTempo124 bpm
0:00/0:00
// Before — Pet Shop Boys
// 124 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 128 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(124/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 finger
const bass = note(`<
  ~@4 A B C D A B C D A B C D A B C D E F G H E F G I A B C D A B C J A B C D A B C D E F G H K F G L A B C D M N O P M
  N O Q E F G H K F G I A B C D A B C J E F G H K F G I M N O P M N O P E F G H K F G I E F G H K F G I E F G H K F G I
  E F G H K F G I
>`.pickRestart({
  A: "a1@5 ~ a1 ~ a1@3 g1@3 a1@2", B: "e1@5 ~ a1 ~ a1@3 g1@3 a1@2", C: "e1@5 ~ g1 ~ g1@3 e1@3 g1@2",
  D: "c1@5 ~ c1 ~ c1@3 g1@2 ~ g1@2", E: "c1@5 ~ a0@2 c1@3 a0@3 c1@2", F: "e1@5 ~ a0@2 c1@3 a0@3 c1@2",
  G: "g1@5 ~ a0@2 c1@3 a0@3 c1@2", H: "e1@2 ~ e1@3 d1@2 c1@2 ~ c1@3 d1@2", I: "e1@2 ~ e1@3 d1@2 c1@2 ~ c1@3 g1@2",
  J: "c1@5 ~ c1 ~ c1@3 e1@2 ~ e1@2", K: "a0@5 ~ a0@2 c1@3 a0@3 c1@2", L: "e1@2 ~ e1@3 d1@2 c1@2 ~ c1@3 a0@2",
  M: "d1@4 ~@2 d1 ~ g1@2 ~ a1@3 b1@2", N: "g1@5 ~ d1 ~ g1@2 ~ g1@3 a1@2", O: "e1@5 ~ e1 ~ e1@3 b0@3 d1@2",
  P: "e1@4 ~@2 e1 ~ e1@2 ~ g1@2 ~ e1@2", Q: "e1@4 ~@2 e1 ~ e1@2 ~ g1@2 ~ g1@2",
})).s("gm_electric_bass_finger").gain(0.45)

// chords · epiano1
const epiano1 = note(`<
  ~@4 A B C D E B F D A B C D E B F D A B C D E B F D A B C D E B F G A B C D E B F D A B C D E B F D A B C D H I J K H
  L M N A B C D E B F G A B C D E B F D A B C D E B F D H I J K H L M N A B C D E B F G A B C D E B F G A B C D E B F G
  A B C D E B F O
>`.pickRestart({
  A: "[f2,e3,f3,a3,c4] ~@7 [e3,f3,a3,c4]@3 [f2,e3,f3,a3] ~@2 [f2,e3,f3,a3] ~, ~@8 f2 ~@7", // Fmaj7
  B: "[e3,f3,a3,c4]@2 ~@4 f2 ~ [e3,f3,a3,c4]@3 [f2,f3,a3,c4] ~@2 [f2,e3,f3,a3,c4] ~, f2 ~@7 f2 ~@2 e3@2 ~@3", // Fmaj7 F Fmaj7
  C: "[e3,g3,b3]@2 ~@6 [e3,g3,b3]@3 [e3,g3,b3]@2 ~ [e2,e3,g3,a3,b3] ~, e2 ~@7 e2 ~@2 e2 ~@4", // Em
  D: "[e3,g3,a3,c4]@2 ~@4 c2 ~ [e3,g3,a3,c4]@3 [c2,e3,g3,a3,c4] ~ c2 [e3,g3,a3,c4]@2, c2 ~@7 c2 ~@5 e2 ~", // Am7
  E: "[f2,e3,f3,a3,c4] ~@5 f2 ~ [e3,f3,a3]@3 [f2,e3,f3,a3] ~ f2 [f2,e3,f3,a3] ~, ~@8 f2 ~@7", // Fmaj7
  F: "[e3,g3,b3]@2 ~@4 e2 ~ [e3,g3,b3]@3 [e3,g3,b3]@2 e2 [e2,e3,g3,a3,b3] ~, e2 ~@7 e2 ~@2 e2 ~@4", // Em
  G: "[e3,g3,a3,c4]@2 ~@4 c2 ~ [e3,g3,a3,c4]@3 [e2,e3,g3,a3,c4] ~ e2 [e3,g3,a3,c4]@2, c2 ~@7 c2 ~@5 e2 ~", // Am7
  H: "[d2,f3,g3,a3,c4] ~@5 d2 ~ [f3,g3,a3,c4]@2 ~ [d2,f3,g3,a3,c4] ~@2 [d2,f3,g3,a3,c4] ~, ~@8 d2 ~@7", // Dm7 F Dm7
  I: "[g2,d3,g3,a3,b3] ~@5 d2 ~ [d3,g3,a3,b3]@2 ~ [g2,d3,g3,a3,b3] ~@2 [g2,d3,g3,a3,b3] ~, ~@8 g2 ~@7", // G
  J: "[e2,e3,g3,a3,c4] ~@5 e2 ~ [e3,g3,a3,c4]@2 ~ [b1,e3,g3,a3,c4] ~@2 [d2,e3,g3,a3,c4] ~, ~@8 e2 ~@7", // Am7 Cmaj7 Am7
  K: "[e2,d3,e3,g3,b3] ~@5 e2 ~ [d3,e3,g3,b3]@2 ~ [g2,d3,e3,g3,b3] ~ e2 [e2,d3,e3,g3,b3] ~, ~@8 e2 ~@7", // Em7
  L: "[g2,d3,g3,a3,b3] ~@5 d2 ~ [d3,g3,a3,b3]@2 ~ [g2,d3,g3,a3,b3] ~@2 [a2,d3,g3,a3,b3] ~, ~@8 g2 ~@7", // G
  M: "[e2,e3,g3,a3,c4] ~@5 e2 ~ [e3,g3,a3,c4]@2 ~ [b1,e3,g3,a3,c4] ~ b1 [d2,e3,g3,a3,c4] ~, ~@8 e2 ~@7", // Am7 Cmaj7 Am7
  N: "[e2,d3,e3,g3,b3] ~@5 [e2,e3] ~ [e3,g3,b3,d4]@2 ~ [g2,e3,g3,b3,d4] ~@2 [e2,e3,g3,b3,d4] ~, ~@8 e2 ~@7", // Em7 E Em7
  O: "[e3,g3,a3,c4]@2 ~@4 c2 ~ [e3,g3,a3,c4]@3 [e2,e3,g3,a3,c4] ~ e2 [e3,g3,c4]@2, c2 ~@7 c2 ~@5 [e2,a3] ~", // Am7 C A5
})).s("gm_epiano1").gain(0.29).pan(0.3)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@4 A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C D E F G D
  E F G A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C D E F G D E F G A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C
  A@2 B C A@2 B C
>`.pickRestart({
  A: "[e3,f3,a3,c4]/2", B: "[e3,g3,b3]", C: "[e3,g3,a3,c4]", D: "[d4,f4,a4]", E: "[d4,g4,b4]", F: "[e4,a4,c5]",
  G: "[e4,g4,b4]", // Em
})).s("gm_synth_strings_1").gain(0.21)

// other · lead 1 square
const lead_1_square = note(`<
  ~@4 A B A C A B A C ~@16 A B A C A B A C ~@16 A B A C ~@8 A B A C A B A C ~@24 A B A C A B A C A B A C A B A C A B A C
  A B A C A B A C A B A C
>`.pickRestart({
  A: "~@6 e4 ~ a4@3 e4 ~@2 b3@2", B: "c4 ~@5 e4 ~ c5@3 b4 ~@2 e4 ~", C: "c4 ~@5 e4 ~ b4@3 g4 ~@2 a4 ~",
})).s("gm_lead_1_square").gain(0.34).pan(0.4)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@4 A B@2 C@2 D@2 E F ~@7 A B@2 C@2 D@2 G ~@16 A B@2 C@2 D@2 G ~@12 A B@2 C@2 D@2 G ~@8 A B@2 C@2 D@2 G ~@8 A B@2 C@2
  D@2 H A B@2 C@2 D@2 H A B@2 C@2 D@2 H A B@2 C@2 D@2 H
>`.pickRestart({
  A: "a5@14 g5 e5", B: "[c6@10 c6 d6 e6@2 d6@16 c6 a5]/2", C: "[c6@6 e5 ~ g5@5 ~ a5@16 g5 e5]/2",
  D: "[c6@10 c6 d6 e6@2 d6@16 d6 a5]/2", E: "g6@6 e6 c6 e6@3 g5 c6 g5 c6@2", F: "a5@13 ~@3",
  G: "g6@6 e6 c6 e6@3 g5 c6 g5 ~@2", H: "g6@6 e6 c6 e6@3 g5 c6 a5 c6 ~",
})).s("gm_string_ensemble_1").gain(0.22).pan(0.7)

// drums · kick
const kick = s("bd").struct(`<
  ~@2 A B C D C E C D C D C D C E C D C D C D C E C D C D C D C E C D C D C D C E C D C D C D C E C D C D C D C E C D C
  D C D C E C D C D C D C E C D C D C D C E C D C D C D C E C D C D C D C E C D C D C D C E C D C D C D C E C D C D C D
  C E C D C D C D C E
>`.pickRestart({
  A: "~@6 x ~ x ~@2 x ~@2 x ~", B: "x ~@5 x ~ x ~@2 x ~@2 x ~", C: "x!4", D: "x ~ x ~ x ~ x!2", E: "x ~ x ~ x!4",
})).gain(0.5)

// drums · clap
const clap = s("cp").struct("<~@2 [~ x ~ x]!126>").gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<[x!2] [x!4] [~@3 x ~@3 x ~@3 x ~@3 x]!126>").gain(0.05)

// drums · open hat
const open_hat = s("oh").struct("<~@2 [~ x ~ x ~ x ~ x]!126>").gain(0.35)

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

// drums · ride bell
const ride_bell = s("rd").struct("<~@2 [x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~]!126>").gain(0.2)

// drums · bongos
const bongos = s("bongo:4").struct(`<
  ~@2 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B
>`.pickRestart({
  A: "~@6 x!3 ~ x ~ x ~@3", B: "~@6 x!2 ~ x!2 ~ x ~@3",
})).gain(0.65)

// drums · bongos · soft notes
const bongos_soft = s("bongo:4").struct(`<
  ~@2 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B
>`.pickRestart({
  A: "~@9 x ~@6", B: "~ x",
})).gain(0.39)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@2 [~@11 x ~@4]!126>").gain(0.65)

// drums · congas
const congas = s("conga:18").struct("<~@2 [x ~ x ~@8 x ~@2 x!2]!126>").gain(1.11)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  ~@2 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B
>`.pickRestart({
  A: "~@4 x ~@2 x!2 ~@7", B: "~@4 x ~ x!3 ~@7",
})).gain(1.11)

// drums · congas · soft notes
const congas_soft = s("conga:33").struct(`<
  ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@3 x ~@4",
})).gain(0.79)

// drums · shaker
const shaker = s("sh").struct("<~@2 [x!16]!126>").gain(0.35)

// drums · lt
const lt = s("lt").struct("<~@4 A@8 ~@16 A@8 ~@16 A@4 ~@8 A@8 ~@8 A@8 ~@8 A@32>".pickRestart({
  A: "~@2 x!2 ~@6 x!2 ~@4",
})).gain(0.5)

stack(
  bass, epiano1, synth_strings_1, lead_1_square, string_ensemble_1, kick, clap, hihat, open_hat, crash, ride_bell,
  bongos, bongos_soft, bongos_2, congas, congas_2, congas_soft, shaker, lt
)

More by Pet Shop Boys