Strudelify

Stereotypes

Blur

KeyB minorTempo110 bpm
0:00/0:00
// Stereotypes — Blur
// 110 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 85 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(110/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 · "Bass"
const bass = note(`<
  ~@3 A B C B C D@2 E F D@2 E F G H I C J K L M N O B C B C D@2 E F D@2 E F G H I C J K L M N O I C J K L M P Q R ~@2 G
  H B C G H I C J K L M N O I C J K L S T U@2 V@3
>`.pickRestart({
  A: "~@7 a1", B: "b1 a2 b2 e1 f#1 ~ c#2 a1", C: "b1@2 a2@2 b2@2 e1@2 f#1@2 e2 f#2 d2@2 a1@2",
  D: "b1@2 a2@2 b2@2 e1@2 f#1 ~ d2!2 b1 ~ a1@2", E: "g#1@2 g#1@2 e2@2 ~ d#2 g1@2 g1@2 d2@2 d2@2",
  F: "f#1@2 f#1@2 c#2@3 c#2 e2@4 c#2@2 a1@2", G: "a1!2 a2!2 a1!2 ~@2", H: "a1!2 a2!2 a1 f#1!2 a1",
  I: "b1 ~ b1@2 b2@2 e1 f1 f#1@2 a2@2 f#2@2 a1@2", J: "b1@2 a2@2 b2@2 e1@2 f#1 ~ b2!2 e2 f#2 a1@2",
  K: "b1 a2 b2@2 g#1!4", L: "e1!4 b1@2 g#1 b1", M: "e2!4 b1!2 g#1 b1", N: "c#2!5 e2 b1 c#2", O: "d2!5 e2 b1 d2",
  P: "e1!4 g1!3 f#1", Q: "f#1!2 ~ e2 f#2!4", R: "e2 f#2!3 ~@4", S: "e2!4 a1 b1 a1 b1", T: "c#2!8",
  U: "[d2@2 d2@2 d2@2 d2@2 e2@2 ~ e2@2 e2@2 e2@2 ~ f#2@2 f#2@3 f#2@3 f#2@2 g2@3 ~]/2",
  V: "[g2@3 g2@3 g2@4 b1@33 ~@5]/3",
})).s("gm_electric_bass_finger").gain(0.41)

// chords · overdriven guitar · "Guitar2"
const overdriven_guitar = note(`<
  A@4 B@6 C D B@2 C D E F B@3 G H@2 I J B@6 C D B@2 C D E F B@3 G H@2 I J B@3 G H@2 K L M A@2 E F N@2 E O B@3 G H@2 I J
  B@3 G H@2 P Q@2 R@3
>`.pickRestart({
  A: "[b3,f#4,b4,d5,a5,d6]@2 [b3,f#4,b4,d5,a5,d6] ~@5", // Bm7
  B: "[b3,f#4,b4,d5,a5,d6]@4 [b3,f#4,b4,d5,a5,d6]@2 ~@2 [f#4,f#5]!4 [f#4,f#5]@2 ~ [b3,f#4]", // Bm7 F# B5
  C: "[g#3,d#4]@2 [g#3,d#4]@2 [g#4,b4]@2 ~ [g#4,b4] [g3,d4]@2 [g3,d4]@2 [g4,a#4]@2 ~ [g4,a#4]", // G#5 G#m G5 Gm
  D: "[f#4,a#4,c#5] [f#4,a#4,b4] [f#4,a#4,c#5] [f#4,a#4,b4] [f#4,a#4,c#5] [f#4,a#4,b4] [f#4,a#4,c#5] [f#4,a#4,b4]", // F# Bmaj7 F# Bmaj7 F# Bmaj7 F# Bmaj7
  E: "[a3,e4,a4,c#5,e5]!6 ~@2", F: "[a3,e4,a4,c#5,e5]!5 f#3!2 a3",
  G: "[b3,f#4,b4,d5,a5,d6]@2 [b3,f#4,b4,d5,a5,d6] ~ [a#4,d5] [g#4,c#5] [f#4,b4] [e4,g#4]", // Bm7 A# C#5 B5 E
  H: "[e4,b4]!2 [e4,c#5] [e4,b4] [b3,f#4]!2 [b3,g#4] [b3,f#4]", I: "[c#4,g#4,c#5,f#5]!4 [c#4,g#4,c#5,f5]!4",
  J: "[d4,a4,d5,f#5]!4 [e4,b4,e5,g#5]!4", K: "[e4,b4]!4 [g3,d4,g4,b4,d5,g5]!4", L: "[f#3,c#4,f#4,a#4,c#5,f#5]!8",
  M: "a#4 c#5 e5 f#5 ~@4", N: "[e5,a5,d6]!16", O: "b4 c#5 b4 c#5 b4 c#5 ~ [a4,c#5]",
  P: "[c#4,g#4,c#5,f#5]@2 [c#4,g#4,c#5,f#5]@2 [c#4,g#4,c#5,f#5]@2 [c#4,g#4,c#5,f#5]@2 ~ f#5 [c#4,g#4,c#5,f#5]@2 ~ f#5 [c#4,g#4,c#5,f#5]@2, ~@4 [c#4,g#4,c#5,f5] ~ [c#4,g#4,c#5,f5] ~", // C#sus4 C#
  Q: "[[d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 [d4,a4,d5,f#5]@2 ~ f#5 g#5 b5@2 g#5@2 ~ f#3@2 f#4@3 e5@3 c#5 b4 a#4@2 b4@2]/2", // D
  R: "[~ b4@2 e5@3 c#5@2 e5@2 [c#5,e5]@4 [d#5,f#5]@29 ~@5, d5 ~@23]/3", // C#m D#m
})).s("gm_overdriven_guitar").gain(0.41).pan(0.7)

// other · lead 2 sawtooth · "Synth"
const lead_2_sawtooth = note(`<
  A@4 B@4 ~@2 C D E@2 C F ~@8 G H ~@6 C D E@2 C F ~@8 G H ~@4 I J K@3 ~@4 L@2 ~@8 G H ~@6 G M@5
>`.pickRestart({
  A: "b4 b5 b4 [b4,f#5] [b4,f5] [b4,e5] [b4,d#5] [b4,d5]", B: "b4 a4 b4 b3 a4 g#4 a4 g#4", C: "g#5!4 g5!4",
  D: "f#5!4 e5 f#5 d#6 d6", E: "[b4,d6] [b4,b5] [b4,d6] [b4,b5] [b4,f#5] [b4,e5] [b4,d#6] [b4,d6]",
  F: "f#5!4 e5 f#5 ~@2", G: "c#5", H: "d5 e5", I: "g#4 b4 e5!2 d#5 b4 f#4 b4", J: "g#4 ~ [b4,e5] e5 d#5 b4 f#4 b4",
  K: "[g#4 b4 e5!2 g4 b4 f#4 ~ f#5@2 f#5@2 e5@2 d#6 d6 b5 a#5 a5 g#5 ~@4, ~@7 g4@13 ~@4]/3",
  L: "[b5!8 b5!8, b4@7 c#5]/2", M: "[d5@8 e5@10 c#5@10 d5@6 ~ e5@7 d#5@33 ~@5]/5",
})).s("gm_lead_2_sawtooth").gain(0.3).pan(0.2)

// chords · distortion guitar · "Guitar1"
const distortion_guitar = note("<~@26 A@4 ~@21 B C D E@2 F ~@16 A@3 ~@9>".pickRestart({
  A: "~@2 [a5,d6]@2 ~@2 [a5,c#6] ~", B: "~@5 f#5!2 g#5", C: "d5 ~ b4 ~ g#4@2 b4 d#5", D: "~ b4 ~ g#4@3 b4 ~",
  E: "[e4@2 f#4 d4 ~ b3 ~ a#3@3 f#3@2 a#3@4]/2", F: "a#3 c#4 e4 f#4 ~@4",
})).s("gm_distortion_guitar").gain(0.64).pan(0.3)

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

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

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@21 A ~@21 A ~@7 A ~@16 A ~@7 A ~@8>".pickRestart({
  A: "~@4 x!4",
})).gain(0.41)

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

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@10 A@2 ~@2 A@2 ~ B ~@7 B ~@6 A@2 ~@2 A@2 ~ B ~@7 B ~@12 B ~@3 B ~@7 B ~@12
>`.pickRestart({
  A: "~@3 x ~@3 x", B: "~@3 x",
})).gain(0.41)

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

// drums · ride
const ride = s("rd").struct("<~@22 A@2 ~@20 A@2 ~@6 A@2 ~@15 A@2 ~@6 A@2 ~@6>".pickRestart({
  A: "x!8",
})).gain(0.41)

stack(
  bass, overdriven_guitar, lead_2_sawtooth, distortion_guitar, kick, snare, hihat, mid_tom, open_hat, high_tom, crash,
  ride
)

More by Blur