Strudelify

Best I Can

Rush

KeyD majorTempo150 bpm
0:00/0:00
// Best I Can — Rush
// 150 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 81 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 · [...]/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 A B C D A B C D E F G H E F G I J K A B C D A B C D A B C D A B C D E F G H E F G I J K L M L M L M L M N@2
  A B C D A B C D A B C D A B C O@2 P Q R@2 S
>`.pickRestart({
  A: "[e3,a3]@3 [a3,d4] ~@2 [e3,a3]@2", B: "[d3,g3]@2 ~ [g3,c4] ~@2 [d3,g3]@2", C: "[a3,d4,f#4]@3 a3 [a3,d4,f#4]@4",
  D: "f3 e3 d#3 d3@5", E: "[e3,a3,c#4]", F: "[f#3,b3,d#4]@7 [d4,g4]", G: "[d4,g4]@3 [d4,g4]",
  H: "~@3 [a4,d5,f#5] ~ [a4,d5,f#5]@2 [e3,a3,c#4]", I: "[a3,d4,f#4]@3 [a3,d4,g4]@2 [a3,d4,e4]@3",
  J: "[a3,d4,f#4]@7 [a3,d4]", K: "[a3,d4,f#4]@3 g4", L: "d3!3 ~@2 d3 ~ [e3,b3]", M: "~ [e3,b3,e4]!3 [e3,b3,e4]@2 ~@2",
  N: "[a3,d4,f#4]", O: "f3 e3 d#3 d3@3 [a3,d4] ~", P: "c3 b2 a#2 a2@3 [e3,a3] ~", Q: "c3 b2 a#2 a2 c3 b2 a#2 a2",
  R: "[f3 e3 d#3 [a3,d4,f#4]@13]/2", S: "[a3,d4,f#4] ~@7",
})).s("gm_distortion_guitar").gain(0.36).pan(0.6)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~ A B C D A B C D A B C D E F G H E F G I J K A B C D A B C D A B C D A B C D L F G H E F G I J K M N M N M N M O P Q
  A B C D A B C D A B C D A B C R@2 S T U@2 V
>`.pickRestart({
  A: "a2@3 e2 ~ e2 a2 g#2", B: "g2 d3 ~ c2 ~ g1 c2 c#2", C: "d2@3 a1 d2@4", D: "f2 e2 d#2 d2@2 f#2 g2 g#2",
  E: "e2@3 e2 ~ e2 ~ e2", F: "b1@3 b1 ~ b1 e2 f#2", G: "g2!2 f#2 g2 ~ g2 ~ g2", H: "b1 c2 d2 d3 ~ d3 g2 a2",
  I: "d2 d3 a2 c3@2 b2 a2@2", J: "d2@3 d2 ~ g2 ~ c2", K: "d2@3 d2 ~ f#2 g2 g#2", L: "a1@3 a1 ~ a1 ~ a1",
  M: "[d2,a2] a2!2 [a1,e2,a2] ~ [d2,a2] ~ e2", N: "~ e1!3 e2@2 e1@2", O: "~ g#2 a2 a#2 b2 d3 d#3 e3", P: "d2@7 c2",
  Q: "d2@5 f#2 g2 g#2", R: "f2 e2 d#2 d2@3 d3 ~", S: "c2 b1 a#1 a1@3 a2 ~", T: "c2 b1 a#1 a1 c2 b1 a#1 a1",
  U: "[f2 e2 d#2 [d2,d3]@13]/2", V: "[d2,d3] ~@7",
})).s("gm_electric_bass_finger").gain(0.5).pan(0.3)

// drums · kick
const kick = s("bd").struct("<~ A@12 B@9 C A@13 B@14 ~ B ~ D ~@5 A@6 B@3 A@6 B@3 ~@4>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@3 x ~@2", C: "~ x ~@6", D: "~@3 x ~@7 x ~@4",
})).gain(0.8)

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

// drums · low tom
const low_tom = s("lt").struct("<A ~@21 A ~@29 B ~@2 C ~@2 D ~@22>".pickRestart({
  A: "~@14 x!2", B: "~@3 x", C: "~@11 x!5", D: "~ x",
})).gain(0.8)

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

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

// drums · open hat
const open_hat = s("oh").struct("<~ A@12 B@9 C A@12 ~ B@13 ~@5 D ~@4 A@5 ~ B@3 A@5 ~ B@3 ~@4>".pickRestart({
  A: "~@5 x ~@2", B: "~@3 x ~@3 x", C: "~@3 x ~@4", D: "~@11 x ~ x ~@2",
})).gain(0.8)

// drums · high tom
const high_tom = s("ht").struct("<A ~@21 B ~@32 C D E F ~@18 G H ~@2>".pickRestart({
  A: "~@2 x!2", B: "~@10 x!2 ~@4", C: "x ~ x!3 ~@11", D: "~@12 x!2 ~@2", E: "~@3 x", F: "~@6 x!2",
  G: "x ~ x ~@5 x!4 ~@4", H: "x!5 ~@11",
})).gain(0.8)

// drums · crash
const crash = s("cr").struct("<~ A ~@21 A ~@32 B A ~@20 C ~ A>".pickRestart({
  A: "x", B: "x!2 ~@14", C: "~ x",
})).gain(0.8)

stack(distortion_guitar, bass, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash)

More by Rush