Strudelify

Emotion Detector

Rush

KeyB♭ majorTempo150 bpm
0:00/0:00
// Emotion Detector — Rush
// 150 bpm, 4/4, key Bb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 108 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(150/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 · distortion guitar · "Guitar"
const distortion_guitar = note(`<
  A B C D@2 B C E@2 F@4 G@3 H I@2 J K L@2 J H B C M@2 B C N O P Q R S P Q R S P Q R S T Q R S T Q R S U V@5 W X Y@3 H
  I@2 J K L@2 J Z B C AA@2 B C N O P Q R S P Q R S P Q R S T Q R S T Q R S P Q R S AB@3
>`.pickRestart({
  A: "~@14 f4 g4", B: "a4 g4 f4 d4, bb3", C: "e4 g4, c4", D: "[f4@8 d5@8 c5@6 d5@8 f4 g4, d4]/2", E: "[d4,f4]/2",
  F: "[bb3,c4,d4,f4,g4]/4", G: "[bb3,c4,d4,f4,g4]/3", H: "bb2 f3 bb3 c4@2 f4@3",
  I: "[bb2@2 bb3 f4@2 bb3@2 c4@2 g3 c4 d4@2 c4@3]/2", J: "bb2@2 f3 f4@2 d4@3", K: "bb3 c4 a4 a3 g4 g3 f4@2",
  L: "[d3@2 bb3 f4@2 bb3@2 c4@2 g3 c4 d4@2 c4@3]/2", M: "[f4@4 d5@4 c5@3 d5@5, d4]/2", N: "f4 e4, d4", O: "d4 e4 f4 g4",
  P: "[c4,e4,g4]!3 [c4,e4,g4]@5", Q: "[c4,f4,a4] [d4,g4,b4]", R: "[d4,f4,a4,d5]", S: "[e4,a4,c5] [d4,g4,b4]",
  T: "[c4,e4,g4]", U: "d3@2 bb3 f4@2 bb3@2 c4", V: "[c3 g3 c4 d4@2 c4@2 [bb3,c4,d4,f4]@33]/5", W: "[bb3,c4,d4,f4]",
  X: "bb3 c4 a4 a3 g4 g3 f4 f3", Y: "[d3@2 bb3 f4@2 bb3@2 c4@2 g3 c4 d4@2 c4@2 [bb3,c4,d4,f4]@9]/3",
  Z: "bb2@2 f3@2 bb3@2 c4@4 f4@4 f4 g4", AA: "[f4@8 d5@8 c5@2 a4@2 f4@2 d5@4 d5@4 f4 g4, d4]/2",
  AB: "[[c4,e4,g4]!3 [c4,e4,g4]@21]/3", // C
})).s("gm_distortion_guitar").gain(0.28).pan(0.3)

// chords · pad poly · "Synth"
const pad_poly = note(`<
  ~ A B C@2 A B D@2 E@4 F@3 ~ G@4 H@2 G@2 A B C@2 A B I ~@2 J K L ~ J K L ~ J K L M J K L M J K L N O@5 P Q R@3 ~ G@4
  H@2 G@2 A B C@2 A B I ~@2 J K L ~ J K L ~ J K L M J K L M J K L ~ J K L S@3
>`.pickRestart({
  A: "bb3", B: "c4", C: "d4/2", D: "[d4,f4]/2", E: "[bb3,c4,d4,f4,g4]/4", F: "[bb3,c4,d4,f4,g4]/3", G: "bb4/2",
  H: "d5/2", I: "d4", J: "[c4,f4,a4] [d4,g4,b4]", K: "[d4,f4,a4,d5]", L: "[e4,a4,c5] [d4,g4,b4]", M: "[c4,e4,g4]",
  N: "d5", O: "[c5@7 [bb4,c5,d5,f5]@33]/5", P: "[bb4,c5,d5,f5]", Q: "bb4", R: "[d5@5 [bb4,c5,d5,f5]@3]/3",
  S: "[~ [c4,e4,g4]@7]/3", // C
})).s("gm_pad_poly").gain(0.32).pan(1)

// bass · lead 8 bass lead · "Synth Bass"
const bass = note(`<
  ~ A B C@2 A B D@2 ~@25 E F G ~ E F G ~ E F G H E F G H E F G A B C I A B C@2 A B C@2 ~@17 E F G ~ E F G ~ E F G H E F
  G H E F G ~ E F G J@3
>`.pickRestart({
  A: "g1", B: "a1", C: "bb1", D: "bb1/2", E: "f1 g1", F: "d2", G: "a1 g1", H: "c2", I: "f2", J: "[~ c2@7]/3",
})).s("gm_lead_8_bass_lead").gain(0.32).pan(0.7)

// bass · electric bass finger · "Bass"
const bass_2 = note(`<
  ~ A B C@2 A B D@2 A E F G H I J C A B C@2 A B C@2 A B C@2 A B C@2 K L M N K L M N K L M N O L M N O L M N A B F P Q R
  S C A B T C A B C@2 A B C@2 A B C@2 A B C@2 K L M N K L M N K L M N O L M N O L M N K L M N K ~@2
>`.pickRestart({
  A: "g1@3 g1@3 g1@2", B: "a1@3 a1@3 a1@2", C: "bb1@3 bb1@3 bb1@2", D: "bb1/2", E: "a1@2 ~@3 a1 g1 a1",
  F: "bb1@3 bb1@2 bb1!3", G: "f2!4 f2@2 f2@2", H: "g1@2 ~@3 g1!3", I: "a1@2 ~ a1@2 a1 g1 a1", J: "bb1@2 ~@3 bb1 a1 g1",
  K: "c2!3 c2@5", L: "f1 g1", M: "d2@2 d2@3 d2 d2@2", N: "a1 g1", O: "c2@2 c2@3 c2 c2@2", P: "f2!2 a2 f2 g2 f2 a2 f2",
  Q: "g1@2 ~ g1 ~ g1!3", R: "a1@2 ~ a1 ~ a1 g1 a1", S: "bb1@2 ~ bb1 ~ bb1!3", T: "bb1@3 bb1 ~ bb1 a1 bb1",
})).s("gm_electric_bass_finger").gain(0.8).pan(0.7)

// chords · pad new age · "Synth"
const pad_new_age = note("<A B C D@2 B C E@2 ~@99>".pickRestart({
  A: "~@14 f4 g4", B: "a4 g4 f4 d4, bb3", C: "e4 g4, c4", D: "[f4@8 d5@8 c5@6 d5@8 f4 g4, d4]/2", E: "[d4,f4]/2",
})).s("gm_pad_new_age").gain(0.4).pan(0)

// drums · kick
const kick = s("bd").struct("<~ A@31 ~@3 A@2 ~@2 A@2 ~ A@10 ~ A@28 ~@2 A@22 ~@3>".pickRestart({
  A: "~ x",
})).gain(0.8)

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

// drums · low tom
const low_tom = s("lt").struct("<~@32 [~@15 x] ~@73 [~@8 x!8] x>").gain(0.8)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@5 A ~@26 B ~@8 C ~@10 D ~@28 E F G ~@21 H ~@2>".pickRestart({
  A: "x", B: "~@12 x!3 ~", C: "~@15 x", D: "~@12 x!4", E: "x!4 ~@4", F: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2", G: "x!2 ~@2",
  H: "~@4 x!2 ~@10",
})).gain(0.8)

// drums · high tom
const high_tom = s("ht").struct("<~@4 A ~@27 B ~@8 C ~@10 D ~@52 E ~@2>".pickRestart({
  A: "~@14 x!2", B: "~@8 x!4 ~@4", C: "~@8 x ~ x ~ x!3 ~", D: "~@4 x!2 ~@2", E: "x!4 ~@12",
})).gain(0.8)

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

stack(distortion_guitar, pad_poly, bass, bass_2, pad_new_age, kick, snare, low_tom, hihat, mid_tom, high_tom, crash)

More by Rush