Strudelify

Criticize

Alexander O'Neal

KeyB minorTempo114 bpm
0:00/0:00
// Criticize — Alexander O'Neal
// 114 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 132 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(114/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 · synth bass 2
const bass = note(`<
  ~@2 A B A C D@3 C D@3 C D@3 C D@3 C E F E F E F G H D@3 C D@3 C D@3 C D@3 C D@3 C E F E F E F G H E F E F E F G H I J
  ~@2 D@3 C D@3 C D@3 C E F E F E F G H E F E F E F G H ~@6 G H E F E F E F G H E F E F E F G H E F E F E F G K L@2
>`.pickRestart({
  A: "b1@2 a1@2 b1@2 b1 e2 ~ e2 d2@2 b1 f#1!3", B: "b1@2 a1@2 b1@2 b1 e2 ~ e2 d2@2 b1 ~ f#1!2",
  C: "b1@2 a1@2 b1@2 f#1!2 a1!2 d2@2 b1 ~ f#1!2", D: "b1@2 a1@2 b1@2 b1 e2 ~@2 d2@2 b1 ~ f#1!2", E: "g1@3 a1@5",
  F: "b1@2 c#2@2 d2@2 f#1 b1@3 c#2@2 d2@2 b1@2", G: "g1", H: "a1", I: "b1 a1 ~@6", J: "~@4 f#3@4 d3 ~ e3 d3@2 ~@3",
  K: "e1 f#1 g1 g#1 a1 b1 c#2 a1", L: "b1/2",
})).s("gm_synth_bass_2").gain(0.45)

// other · epiano2
const epiano2 = note("<~@2 [~@13 b3 e4 f#4] ~ [d4 ~@13 e4 f#4, ~@13 b3@2 ~] [~ e4 ~ e4 ~@12] ~@126>")
  .s("gm_epiano2").gain(0.35)

// other · electric guitar muted
const electric_guitar_muted = note(`<
  ~ A B A B ~@26 A B A ~@37 A C D ~@24 E F E F E F G H E F E F E F G H E F E F E F G H E F E F E F G I J ~
>`.pickRestart({
  A: "~@12 a2 ~ b2 ~", B: "d3 b2 ~ b2 ~ b2 e3 d3 ~ b2!2 ~ b2 ~@3", C: "d3!2 b2 ~ b2 ~ e3 d3 ~ b2!2 ~ b2 a2 ~@2",
  D: "~@9 e3 d3 ~ d3 ~ b2 ~", E: "~@2 a2!2 b2!2 f#3 ~ d3 e3 ~@4 a2 b2", F: "~ b2 f#3@2 d3@2 ~@3 b2 f#3!2 e3 d3 b2 ~",
  G: "~@2 a2!2 b2!2 ~ f#3 ~ f#3 d3@3 a2 b2 b3", H: "~ b3 f#3@3 ~@2 b3 ~ b3 f#3@4 ~@2",
  I: "~ b3 f#3@3 ~@2 b3 ~ b3 f#3@2 e3@2 f#3@2", J: "b3",
})).s("gm_electric_guitar_muted").gain(0.4).pan(0.3)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  ~@21 A B C D E D C F G ~@19 H I C D E D C F G D C D E D C F G ~@16 D C D E D C F G D C D E D C F G D C D E D C F G D C
  D E D C F G D C D E D C F G D C D E D C F G ~@2
>`.pickRestart({
  A: "~@8 b4@2 c#5@2 d5@2 b4 [g#4,a4,a#4]", B: "[g2,d3,g3]@3 [a2,e3,a3]@5, g4 ~@15", C: "[b2,f#3,b3]",
  D: "[g2,d3,g3]@3 [a2,e3,a3]@5", E: "[a2,e3,a3]@3 [b2,f#3,b3]@5", F: "[g2,d3,g3]", G: "[a2,e3,a3]",
  H: "~@8 b4@2 c#5@2 d5@2 [a#4,b4] [f#4,g4,g#4,a4]", I: "[g2,d3,g3]@3 [a2,e3,a3]@5, f4 ~@15",
})).s("gm_overdriven_guitar").gain(0.25).pan(0.7)

// chords · whistle
const whistle = note(`<
  ~@30 A@3 B C@2 D E F G D E C@2 D H C@2 D H ~@20 I J K L C@2 D E F G D E ~@8 M@2 N O M@2 P Q M@2 N O M@2 P Q M@2 N O
  M@2 P Q M@2 N O M@2 P Q M@2 N O M@2 P Q R@2
>`.pickRestart({
  A: "[b4,d5,f#5,a5]/3", B: "[e4,f#4,a4,e5]", C: "[f#4,b4]/2", D: "[f#4,b4,d5]@15 ~", E: "[f#4,a4,c#5]", F: "[f#4,b4]",
  G: "a4 g#4 c#5 a4, f#4@15 ~", H: "[f#4,a4,c#5]@15 ~",
  I: "~ [f#3,b3]!2 ~ [f#3,b3] ~ [e3,a3] [f#3,a3,b3] ~ [a3,d4] ~@2 [a3,d4]@2 ~@2", // B5 A5 B7 D5
  J: "~ [f#3,b3]!2 ~ [f#3,b3] ~ [e3,a3] [e3,b3] ~ [a3,d4,e4] ~@2 d4@2 [b3,e4]@2, ~@12 a3 ~@3", // B5 A5 E5 Asus4 E5
  K: "~ [f#3,b3]!2 ~ [f#3,b3] ~ [e3,a3] [e3,b3] ~ [a3,b3,e4] ~@2 [b3,e4] ~ [a3,d4] ~", // B5 A5 E5 Asus2 E5 D5
  L: "~ [a3,d4] ~@2 [a3,d4] ~ [f#3,b3]!2 ~ [f#3,b3] ~ [f#3,b3] ~@4", M: "[b6@2 a6@2 e6@6 f#6 d6@3 e6@2]/2",
  N: "b6 a6 e6@2", O: "d6", P: "b6 a6 e6 d6", Q: "~@6 c#6@9 ~, f#6@15 ~", R: "[[c#4,d4,f#4,a4]@31 ~]/2",
})).s("gm_whistle").gain(0.25).pan(0.7)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@2 A@2 B C A@2 D C A@2 B C A@2 B C A@2 B C E F E F E F G C A@2 B C A@2 B C H@2 B C H@2 B C H@2 B C E F E F E F G C E
  F E F E F G C ~@4 I@4 H@2 B C H@2 B C E F E F E F G J E F E F E F G J E F E F E F G J E F E F E F G J E F E F E F G J
  E F E F E F G J K@2
>`.pickRestart({
  A: "[d4,f#4,b4]/2", B: "[f#4,b4,d5]", C: "[e4,a4,c#5]", D: "[f#4,b4,d5]@15 ~", E: "[d4,g4,b4]@3 [e4,a4,c#5]@5",
  F: "[f#4,a4,c#5]@3 [f#4,b4,d5]@5", G: "[d4,g4,b4]", H: "[[d4,f#4,b4]@31 ~]/2", I: "[[b4,d5,f#5,a5]@15 ~]/4",
  J: "[e4,a4,c#5]@15 ~", K: "[[c#5,d5,f#5,a5]@31 ~]/2",
})).s("gm_synth_strings_1").gain(0.25)

// chords · rock organ · A7 Cmaj7 Em Dmaj7 A7 Dmaj7 A7 Cmaj7 …
const rock_organ = note(`<
  ~@29
  [~@8 [f2,f#2,g2,g#2,a2] [a#2,b2,c3,c#3,d3,d#3,e3,f#3,g3] [a3,b3,c#4,d4,e4,f#4,g4] [a4,b4,c#5,d5,e5,f5,f#5,g5,g#5,a5,a#5] [b5,c6,d#6,e6,f#6,g6] [e5,f#5,g5,a5,b5] [d4,e4,f#4,g4,a4,b4,c#5,d5] [g3,a3,b3,c#4], ~@6 [c#6,d6] ~]
  ~@39
  [~@8 [f2,f#2,g2,g#2,a2] [a#2,b2,c3,c#3,d3,d#3,e3,f#3,g3] [a3,b3,c#4,d4,e4,f#4,g4] [a4,b4,c#5,d5,e5,f5,f#5,g5,g#5,a5,a#5] [b5,c6,d#6,e6,f#6,g6] [e5,f#5,g5,a5,b5] [c#4,d4,e4,f#4,g4,a4,b4,c#5,d5] [g3,a3,b3], ~@6 [c#6,d6] ~]
  ~@62
>`).s("gm_rock_organ").gain(0.35)

// other · pad new age
const pad_new_age = note(`<
  ~@22 A ~ B@4 C@2 D@2 E F ~@16 A ~ B@4 C@2 A ~ B@4 C@2 ~@4 G H I J ~@8 A ~ B@4 C@2 A ~ B@4 C@2 A ~ B@4 C@2 A ~ B@4 C@2
  A ~ B@4 C@2 A ~ B@4 C@2 K ~
>`.pickRestart({
  A: "[b4,b5]@4 [a4,a5]@11 ~", B: "[[b4,b5] [a4,a5]@4 ~@3]/2", C: "[[b4,b5]@4 [a4,a5]@19 ~@9]/2", D: "b3/2", E: "d4",
  F: "[e3,f#4]@15 ~", G: "~@2 [g#4,g#5] ~", H: "[d4,d5]@3 ~ [f#4,f#5]@3 [d4,d5]@2 ~ [g#4,g#5]@3 ~@3",
  I: "[d4,d5]@3 ~ [f#4,f#5]@2 ~ [g#4,g#5]@2 ~@7", J: "[d4,d5]@2 ~@2 [f#4,f#5]@2 ~ [a4,a5]@2 ~ [b4,b5] ~ [b4,b5]@2 ~@2",
  K: "[b4,b5]", // B
})).s("gm_pad_new_age").gain(0.35)

// other · distortion guitar
const distortion_guitar = note("<~@58 A B A C D E F G ~@24 A H I C J K F G ~@34>".pickRestart({
  A: "b4 a4 e4@2", B: "c#5@3 a4@5", C: "c#5@5 d5 c#5 a4 b4@2 c#5@2 d5@2 e5@2", D: "f#5@3 e5@3 f#5@2",
  E: "f#5@2 g5 f#5@2 d5@3", F: "b4", G: "c#5", H: "c#5@3 a4 b4 c#5 d5 e5", I: "f#5 e5 e5@2", J: "f#5@3 e5@3 a5@2",
  K: "a5@2 g5 f#5@2 d5@3",
})).s("gm_distortion_guitar").gain(0.35)

// drums · kick
const kick = s("bd").struct("<[x!2]!130 x ~>").gain(0.45)

// drums · snare
const snare = s("sd").struct("<A@21 B A@11 B A@15 B A@31 C A@48 D ~>".pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!2 ~", C: "~ x!2 ~@2 x!2 ~", D: "x",
})).gain(0.4)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@130 x ~>").gain(0.45)

// drums · open hat
const open_hat = s("oh").struct(`<
  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 C D ~ E C D ~ E A B A B A B A E 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 ~@2
>`.pickRestart({
  A: "~ x ~@14", B: "~ x ~ x ~@12", C: "x", D: "~ x ~@11 x ~@2", E: "~ x ~ x ~@8 x ~@3",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct("<~@2 A ~@11 A ~@54 B ~@3 B ~@8 A ~@23 A ~@23 A ~>".pickRestart({
  A: "x", B: "~@5 x ~@2",
})).gain(0.25)

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

// drums · congas
const congas_2 = s("conga:33").struct("<~@66 [~@6 x ~ x!3 ~@5]!8 ~@58>").gain(1.11)

stack(
  bass, epiano2, electric_guitar_muted, overdriven_guitar, whistle, synth_strings_1, rock_organ, pad_new_age,
  distortion_guitar, kick, snare, hihat, mid_tom, open_hat, crash, congas, congas_2
)