Strudelify

Always

Pet Shop Boys

KeyG majorTempo128 bpm
0:00/0:00
// Always — Pet Shop Boys
// 128 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 123 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(128/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · brass section · "Brass Synth"
const brass_section = note(`<
  ~@2 A B C D A B C D A B C D@3 A ~@15 A B C D A B C E ~@16 A B C D A B C E ~@28 A B C D A B C D A B C D A B C D A B C D
  A B C D A B C D@2 F G
>`.pickRestart({
  A: "[d4,g4,b4] ~@7", B: "[d4,f#4,a4]!4 ~@2 [d4,f#4,b4] ~", C: "[b3,e4,g4] ~@7", D: "[c4,e4,g4]!4 ~@2 [d4,f#4,a4] ~",
  E: "[c#4,e4,a4]!4 ~@2 [c4,e4,g4] ~", F: "[c4,e4,g4]!4 ~@2 [d4,f#4,a4,a5] ~", G: "[d4,g4,b4,b5] ~@7",
})).s("gm_brass_section").gain(0.42)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@2 A B C D A B C D A B C D@3 E ~@7 F G H I J K L M N O P Q R O P S F G H I J K L M T U V W T U V W A B C D A B C X F
  G H I J Y Z M T U V W T U V AA AB AC AD R AE AF AG R AE AF AG AH A B C D A B C D A B C D A B C D A B C D A B C D A B C
  D@3 E
>`.pickRestart({
  A: "[g4,b4], b5 ~@7", B: "a5!4 ~@2 b5 ~, [d4,f#4]", C: "[g4,b4], g5 ~@7", D: "g5!4 ~@2 [f#4,a4]@2, [e4,g4]@6 a5 ~",
  E: "[g4,b4,b5] ~@7", F: "[c4,e4,g4,c5]@15 ~", G: "g3@11 ~ b3@4, [d4,g4,b4]@15 ~",
  H: "[c4,e4,g4,c5]@11 ~ [b3,d4,g4,b4]@4", I: "[a3,c4,e4,a4]@7 ~ g3@4 e3@4, ~@8 [b3,d4,g4]@7 ~",
  J: "[d3,a3,d4,f#4]@15 ~", K: "~@2 g3!2 a3!2 b3!2", L: "c4@5 ~@3", M: "[a#3,d4,f4]@8 [c4,e4,g4]@7 ~",
  N: "[d4,g4,b4]@13 ~@3", O: "[d4,f#4,a4]@13 ~@3", P: "[e4,g4,b4]@7 ~ [d4,f#4,b4]@7 ~",
  Q: "[c4,e4,g4]@11 ~ [d4,f#4,a4]@4", R: "[d4,g4,b4]@15 ~", S: "[c#4,e4,a4]@11 ~ [c4,e4,g4]@3 ~",
  T: "[g3,g4,b4]@7 ~ [f#3,f#4,a4]@7 ~", U: "[e3,e4,g4]@7 ~ [d3,d4,f#4]@7 ~", V: "[c3,c4,e4]@7 ~ [b2,b3,d4]@7 ~",
  W: "[a2,a3,c4]@7 ~ [d3,d4,f#4]@7 ~", X: "a5!4 ~@2 [e4,g4]@2, [e4,a4]@6 g5 ~", Y: "~@2 [g3,g4]!2 [a3,a4]!2 [b3,b4]!2",
  Z: "[c4,c5]@5 ~@3", AA: "a2@11 ~ e3@4, [a3,c4]@15 ~", AB: "[d3,d4,f#4,a4]@15 ~",
  AC: "~@2 g3!2 a3!2 b3!2, [d4,g4,b4]@13 ~@3", AD: "[c4,e4,g4,c5]@7 ~ [d4,f#4,a4]@7 ~", AE: "[d4,f#4,a4]@15 ~",
  AF: "~@2 g3!2 a3!2 b3!2, [d4,g4,b4]@15 ~", AG: "[c4,e4,g4,c5]@7 ~ [d4,f#4,a4,d5]@7 ~",
  AH: "[a#3,d4,f4,a#4]@8 [c4,e4,g4,c5]@7 ~", // A# C
})).s("gm_synth_strings_1").gain(0.39)

// bass · synth bass 2
const bass = note(`<
  ~@2 A B C D A B C D A B C D@3 A B C D A B C E F A G H B A I J A B C D A B C E F A G H B A I J K L M N K L M N A B C D
  A B C E F A G H B A I J ~@4 K L M O P Q R Q P Q R Q P Q R J A B C D A B C D A B C D A B C D A B C D A B C D A B C D@3
  S
>`.pickRestart({
  A: "g1@2 g2!2 g1@2 g2!2 g1@2 g2!2 g1@2 g2!2", B: "d1@2 d2!2 d1@2 d2!2 d1@2 d2!2 d1@2 d2!2",
  C: "e1@2 e2!2 e1@2 e2!2 d1@2 d2!2 d1@2 d2!2", D: "c1@2 c2!2 c1@2 c2!2 c1@2 c2!2 d1@2 d2!2",
  E: "a0@2 a1!2 a0@2 a1!2 a0@2 a1!2 a0@2 a1!2", F: "c1@2 c2!2 c1@2 c2!2 c1@2 c2!2 c1@2 c2!2",
  G: "c1@2 c2!2 c1@2 c2!2 c1@2 c2!2 b0@2 b1!2", H: "a0@2 a1!2 a1@2 a2!2 g1@2 g2!2 e1@2 e2!2",
  I: "c1@2 c2!2 c1@2 c2!2 d1@2 d2!2 d1@2 d2!2", J: "a#0@2 a#1!2 a#0@2 a#1!2 c1@2 c2!2 c1@2 c2!2",
  K: "g1 g2 g1 g2 f#1 f#2 f#1 f#2", L: "e1 e2 e1 e2 d1 d2 d1 d2", M: "c1 c2 c1 c2 b0 b1 b0 b1",
  N: "a0 a1 a0 a1 d1 d2 d1 d2", O: "a0 a1 a0 a1 a0 a1 a0 a1", P: "d1 d2 d1 d2 d1 d2 d1 d2",
  Q: "g1 g2 g1 g2 g1 g2 g1 g2", R: "c1 c2 c1 c2 d1 d2 d1 d2", S: "g1 ~@7",
})).s("gm_synth_bass_2").gain(0.42)

// drums · kick
const kick = s("bd").struct("<[x!4]!122 x>").gain(0.56)

// drums · snare
const snare = s("sd").struct("<~ [~@3 x] [~ x ~ x]!70 ~@3 [~@3 x] [~ x ~ x]!45 [~@4 x ~@7 x ~ x!2] x>").gain(0.42)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@5 A ~@7 A@3 ~@15 A ~@15 A ~@7 A ~@7 A ~@7 A ~@10 A ~@3 A ~@3 A@2 ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A@3 B
>`.pickRestart({
  A: "~@12 x!4", B: "x",
})).gain(0.42)

// drums · hihat
const hihat = s("hh").struct("<[x!8]!2 [x!16]!73 [x!15 ~] [x!16]!46 ~>").gain(0.42)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@5 A ~@7 A@3 ~@15 A ~@15 A ~@7 A ~@7 A ~@7 A ~@10 A ~@3 A ~@3 A@2 ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A@3 ~
>`.pickRestart({
  A: "~@8 x!4 ~@4",
})).gain(0.42)

// drums · open hat
const open_hat = s("oh").struct("<~@75 [~@15 x] ~@47>").gain(0.42)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@5 A ~@7 A@3 ~@15 A ~@15 A ~@7 A ~@7 A ~@7 A ~@10 A ~@3 A ~@3 A@2 ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A@3 ~
>`.pickRestart({
  A: "x!8 ~@8",
})).gain(0.42)

// drums · congas
const congas = s("conga:13").struct("<[~@2 x ~@2 x ~ x ~ x ~ x ~@2 x!2]!72 ~@4 [~@2 x ~@2 x ~ x ~ x ~ x ~@2 x!2]!46 ~>")
  .gain(0.9)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<[x ~ x ~@4 x ~ x ~ x ~@4]!72 ~@4 [x ~ x ~@4 x ~ x ~ x ~@4]!46 x>").gain(1.79)

// drums · agogo bells
const agogo_bells_2 = s("agogo:4").struct("<[~@4 x!2 ~@6 x ~ x ~]!72 ~@4 [~@4 x!2 ~@6 x ~ x ~]!46 ~>").gain(1.79)

// drums · woodblocks
const woodblocks = s("woodblock:4").struct("<~@6 A ~@13 A ~@3 A ~@7 A ~@3 A ~@86>".pickRestart({
  A: "x!16",
})).gain(0.61)

stack(
  brass_section, synth_strings_1, bass, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, congas, agogo_bells,
  agogo_bells_2, woodblocks
)

More by Pet Shop Boys