Strudelify

Cygnus X-1

Rush

KeyE majorTempo90 bpm
0:00/0:00
// Cygnus X-1 — Rush
// 90 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 107 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(90/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.

// other · pad new age
const pad_new_age = note(`<
  ~@3 A@4 B@2 C@4 D@2 E@3 F G H I@2 J K L M N O ~ P Q@2 R@2 S T D@2 E@3 F G H I@2 J K L M N O U@2 J K L M N O ~ V W X Y
  Z AA AB AC AD ~@7 F AE H I@2 J AF L M N O AG@2 J AF L M N O AG@2 J AF L M N O AG@2
>`.pickRestart({
  A: "[~@5 e4@4 d#4 c#4 b3!2 g#3!2 f#3@2 ~@4 e4@4 d#4 c#4 b3@2 c#4 ~@2]/4", B: "[~@5 e4!2 e4@2 d#4!4 b3!2 ~]/2",
  C: "[~@5 e4!2 e4@2 d#4 c#4 d#4 c#4 b3 f#4@3 ~@4 e4!2 e4@2 c#4!2 d#4 b3!3 ~]/4",
  D: "[~@5 e4!2 e4@2 d#4 c#4 d#4 c#4 b3!2 ~]/2", E: "[~ e4!4 d#4!2 d#4@2 c#4!2 d#4 c#4 b3 f#4@3 e4 d#4 d#4@4 ~]/3",
  F: "~@4 b3 c#4 d#4 e4", G: "~ [c#4,e4] e4 ~ [c#4,e4] [c#4,f#4] e4 ~", H: "~ [c#4,e4] [e4,f#4] g#4 f#4 e4!2 c#4",
  I: "[~ f#4!2 f#4@2 f#4!2 f#4@2 f#4!2 g#4 f#4 e4 b4 ~]/2", J: "~@5 g#4!3", K: "f#4!2 e4!2 ~ f#4@2 ~", L: "~@5 g#4!2 ~",
  M: "~ g#4!2 f#4!2 e4!2 ~", N: "~@5 g#4!2 f#4", O: "~ g#4!2 e4!2 f#4!2 ~", P: "~ e4!2 c#4!2 b3 f#4 ~",
  Q: "[~@5 e4!2 e4@2 d#4!2 d#4@2 b3!2 ~]/2", R: "[~@2 e4 e4@2 e4!2 e4@2 d#4 c#4 d#4 c#4 b3 f#4@2]/2",
  S: "~ g#4 ~@3 e4!3", T: "~ c#4!2 d#4 b3!3 ~", U: "[b4 ~@2 g#4@2 e4@4 e4!2 c#4!2 b3 f#4 ~]/2",
  V: "~ e4!2 c#4@2 b3!2 ~", W: "f#4 g#4 f#4 e4 c#4 b3!2 ~", X: "[b3,f#4] g#4 f#4 e4 c#4 b3!2 ~",
  Y: "~@2 c#4 b3@2 c#4 ~@2", Z: "~@2 f#4 e4@2 f#4 ~@2", AA: "f#4!3 g#4 e4!3 ~", AB: "[b3,f#4] f#4!2 g#4 e4!2 ~ g#4",
  AC: "f#4 ~ g#4 f#4@2 g#4 f#4 e4", AD: "b4", AE: "f#4 [c#4,e4] e4 ~ [c#4,e4] [c#4,f#4] e4 ~", AF: "f#4!2 e4!2 ~ f#4@3",
  AG: "[b4 ~@2 g#4@2 e4@4 e4!2 c#4@2 b3 f#4 ~]/2",
})).s("gm_pad_new_age").gain(0.31).pan(0.2)

// other · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~@3 A ~ A ~ B@2 C@2 D@2 B@2 E@2 F G@2 H I@2 J K J L A M N O C@2 B@2 P@2 B@2 Q@2 F G@2 H I@2 J K J L A M N O J K J L A
  M N O R@2 S T U@2 V W X@3 J X@3 Y@2 H I@2 J K Z L J AA N O J K Z L J AA N O J K Z L J AA N O
>`.pickRestart({
  A: "e4@4 ~@2 d#4@3 ~@7", B: "[e4@4 ~@2 d#4@3 ~@5 b3@6 ~@2 f#3@7 ~@3]/2",
  C: "[e4@4 ~@2 d#4@6 ~@2 b3@6 ~@2 f#3@7 ~@3]/2", D: "[e4@4 ~@2 d#4@3 ~@5 b3@6 ~@4 f#3@4 ~@4]/2",
  E: "[e4@4 ~@2 b3@3 ~@5 b3@6 ~@2 f#3@7 ~@3]/2", F: "b3@4 ~@2 b3@3 ~@3 b3@3 ~",
  G: "[b3@4 ~@2 b3 ~@7 b3@6 ~@2 b3@7 ~@3]/2", H: "b3@4 ~@2 b3@7 ~@3", I: "[d#4@4 ~@2 d#4@6 ~@2 c#4@6 ~@2 d#4@7 ~@3]/2",
  J: "e4@4 ~@2 d#4@7 ~@3", K: "b3@4 ~@2 b3@3 ~@7", L: "e4@4 ~@2 c#4@7 ~@3", M: "e4@4 ~@2 b3 ~@5 d#4@3 ~",
  N: "g#4@4 ~@2 d#4@3 ~@7", O: "c#4@4 ~@2 f#3@7 ~@3", P: "[e4@4 ~@2 d#4@3 ~@5 b3@6 ~@4 f#3@7 ~]/2",
  Q: "[e4 ~@5 b3@3 ~@5 b3@6 ~@2 f#3@7 ~@3]/2", R: "d#4@4 ~@2 a3@7 ~@3", S: "g#3@3 ~@3 f#3@3 ~@3 b3@3 ~",
  T: "b3@3 ~@3 b3@3 ~ d#4@5 ~", U: "d#4@4 ~@2 c#4@7 ~@3", V: "d#4@3 ~@3 d#4@7 ~@3", W: "g#4@4 ~@2 f#4@7 ~@3",
  X: "e4@4 ~@2 d#4@5 ~ d#4@3 ~", Y: "[e4@4 ~@2 d#4 ~@7 b3@6 ~@2 b3@7 ~@3]/2", Z: "f#4@4 ~@2 d#4@7 ~@3",
  AA: "e4@4 ~@2 b3 ~ b3 ~@3 d#4@3 ~",
})).s("gm_acoustic_guitar_steel").gain(0.35)

// other · acoustic guitar steel
const acoustic_guitar_steel_2 = note(`<
  ~@3 A ~ A ~ B@4 C@2 D@2 E@2 F G@2 H I@2 A H A J A K L M N@2 B@6 O@2 F G@2 H I@2 A H A J A K L M A H A J A K L M P@2 Q
  R S@2 T U V@3 A V@3 W X H I@2 A H A J A K L Y A H A J A K L Y A H A J A K L Y
>`.pickRestart({
  A: "b3@4 ~@2 b3@7 ~@3", B: "[b3@4 ~@2 b3@3 ~@5 g#3@6 ~@12]/2", C: "[b3@4 ~@2 b3@3 ~@5 g#3@6 ~@4 f#3@3 ~@5]/2",
  D: "[b3@4 ~@2 b3@3 ~@5 g#3@6 ~@2 g#3@3 ~@7]/2", E: "[b3@4 ~@2 f#3@3 ~@5 g#3@6 ~@2 g#3@3 ~@7]/2",
  F: "g#3@4 ~@2 f#3@3 ~@3 f#3@3 ~", G: "[g#3@4 ~@2 f#3 ~@7 g#3@6 ~@2 f#3@7 ~@3]/2", H: "g#3 ~@3",
  I: "[[a#3,c4]@4 ~@2 [a#3,c4]@6 ~@2 b3@6 ~@2 b3@7 ~@3]/2", J: "[b3,c#4]@4 ~@2 b3@7 ~@3", K: "b3@4 ~@8 b3@3 ~",
  L: "e4@4 ~@2 b3@3 ~@7", M: "[f#3,b3] ~@3", N: "[b3@2 ~ b3@3 ~ g#3@3 ~@6]/2", O: "[b3 ~@5 f#3@3 ~@5 g#3@6 ~@12]/2",
  P: "b3 ~@3", Q: "e3@3 ~@9 f#3@3 ~", R: "g#3@3 ~@7 b3@5 ~", S: "b3@4 ~@2 a3@7 ~@3", T: "[a#3,c4]@4 ~@2 [a#3,c4]@7 ~@3",
  U: "[c#4,e4]@4 ~@2 d#4@7 ~@3", V: "b3@4 ~@2 b3@5 ~ b3@3 ~", W: "b3@4 ~@2 b3 ~@7 g#3 ~", X: "g#3@4 ~@2 f#3@7 ~@3",
  Y: "[g#3,b3] ~@3", // G#m
})).s("gm_acoustic_guitar_steel").gain(0.35)

// bass · synth bass 1
const bass = note(`<
  A@7 B C D E F@2 B E B E F G H@2 I J E@2 G K E@2 G K B C D E F@2 B E B E F G H@2 I J E@2 G K E@2 G K E@2 G K E@2 G L
  H@2 M N H O P Q B E R S B E R G H T I J E@2 G K E@2 G U E@2 G K E@2 G U E@2 G K E@2 G U
>`.pickRestart({
  A: "~@14 b1 c#2", B: "e2@4 ~@2 e2@6 ~@2 b1 c#2", C: "e2@4 ~@2 e2 ~ e2@4 ~@2 e2 b1", D: "e2@4 ~@2 e2@6 ~ b1 c#2 ~",
  E: "e2@4 ~@2 e2@6 ~@2 e2 b1", F: "c#2@4 ~@2 c#2@6 ~@2 c#2 b1", G: "c#2@4 ~@2 c#2@6 ~@2 c#3 b2",
  H: "a2@4 ~@2 a2@6 ~@2 a2 e2", I: "g#2@4 ~@2 g#2@3 ~ g#2 ~ g#2 ~ g#2 ~", J: "a2@4 ~@2 b2@5 ~ e2 c#2 b1 c#2",
  K: "a2@4 ~@2 a2@6 ~@2 a2 b2", L: "a2@4 ~@2 a2@6 ~@2 e2 f#2", M: "b1@4 ~@2 c#2@6 ~@2 c#2 ~",
  N: "c#2@4 ~@2 c#2@5 ~ c#2 ~ e2 c#2", O: "a2@4 ~@2 a2@6 ~@2 a2 ~", P: "g#2@4 ~@2 g#2 a2 c3@3 ~ g#2@3 ~",
  Q: "a2@4 ~@2 b2 ~ b2 ~ c#3 ~ b2 ~ c#3 ~", R: "e2@4 ~@2 e2@6 ~@2 c#2 b1", S: "c#2@4 ~@2 c#2@5 ~ e2 c#2 b1 c#2",
  T: "a2@4 ~@2 a2@6 ~@2 a2 f#2", U: "a2@4 ~@2 a2 ~ a2@4 ~@2 a2 b2",
})).s("gm_synth_bass_1").gain(0.35)

// other · string ensemble 1
const string_ensemble_1 = note("<~@70 A B C D E B F G H ~@28>".pickRestart({
  A: "~@6 b5 c#6 b5@2 c#6@2 d#6@2 e6@2", B: "g#5@2 a5 g#5 f#5 g#5@2 a5", C: "g#5@4 a5@2 g#5@2 f#5@2 e5 f#5 g#5@2 a5@2",
  D: "g#5@2 a5 g#5 f#5 g#5!2 a5", E: "g#5 a5 b5 a5 g#5 f#5 g#5@3 ~ e5 f#5 g#5@3 ~",
  F: "g#5@4 a5@2 g#5@2 f#5@2 e5 f#5 g#5@3 ~", G: "g#5@4 a5@2 g#5@2 f#5@2 g#5@2 g#5@2 a5 g#5",
  H: "f#5 e5 d#5 c#5 b4@5 ~@7",
})).s("gm_string_ensemble_1").gain(0.24)

// other · distortion guitar
const distortion_guitar = note(`<
  ~@23 A ~ B ~ A ~ C ~@17 A ~ A ~ A ~ D ~ A ~ A ~ A ~ E ~@21 F@2 G ~ H@2 I ~ J@2 K ~ J@2 L ~ J@2 M ~ J@2 N ~
>`.pickRestart({
  A: "~@2 g#5@2 f#5 ~@11", B: "~ g#5@3 f#5 ~@11", C: "~ b5 g#5@3 e5@2 ~", D: "~@2 g#5@2 f#5 ~ g#5 ~@9",
  E: "~ b5 g#5@3 e5@3", F: "[~@2 g#5@2 f#5@4 b5@13 ~@11]/2", G: "~ g#5 f#5@3 ~@3",
  H: "[~@2 g#5@2 f#5@2 ~@2 b5@13 ~@11]/2", I: "~ b5 g#5@4 ~@2", J: "[~@2 f#5@4 ~@2 b5@13 ~@11]/2",
  K: "~@2 g#5@2 f#5@9 ~@3", L: "g#5@5 ~ f#5@3 ~ e5@3 ~@3", M: "g#5", N: "~@2 b5@13 ~",
})).s("gm_distortion_guitar").gain(0.26)

// drums · kick
const kick = s("bd").struct(`<
  ~@7 A@15 B A@7 B A@11 B A@3 B A@3 B A@3 B A@3 B A B C A@4 B A@3 B A@3 B A@3 B A@3 B A@3 B A B A B A@3 B A@2 C B A@3 B
  A@4
>`.pickRestart({
  A: "x ~@2 x ~@3 x", B: "x ~@2 x ~@4", C: "x ~@2 x ~ x ~@2",
})).gain(0.24)

// drums · snare
const snare = s("sd").struct(`<
  ~ A@5 B A@15 C A@7 B A@11 B A@3 B A@3 B A@3 B A@3 B A B D A@4 B A@3 E A@3 C A@3 B A@3 C A@3 B A@3 B A@3 B A@2 D B A@3
  B A@4
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~ x!2", C: "~@4 x ~@7 x!4", D: "~@4 x ~@4 x ~@2 x ~ x!2", E: "~@2 x ~@3 x!2",
})).gain(0.29)

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

// drums · crash
const crash = s("cr").struct(`<
  ~@7 A ~@15 A ~@7 A ~@11 A ~@3 A ~@3 A ~@3 A ~@3 A ~ B A ~@4 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~ A ~@3 A ~ B A@2 ~@3
  A ~ A ~
>`.pickRestart({
  A: "x", B: "x ~@2 x ~ x ~@2",
})).gain(0.24)

// drums · guiro
const guiro = s("guiro:0").struct("<[~@3 x] ~@106>").gain(6.21)

stack(
  pad_new_age, acoustic_guitar_steel, acoustic_guitar_steel_2, bass, string_ensemble_1, distortion_guitar, kick, snare,
  hihat, crash, guiro
)

More by Rush