Strudelify

Hot Love

T. Rex

KeyG majorTempo128 bpm
0:00/0:00
// Hot Love — T. Rex
// 128 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 103 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(128/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 · piano · "Ac Piano"
const piano = note(`<
  ~@4 A@2 B@2 C D E@2 F G B@2 A@2 B@2 C D E@2 F G B@2 A@2 B@2 C D E@2 F G B@2 H I J K C D E@2 F G B@2 A@2 B@2 C D E@2 F
  G B@2 A@2 B@2 C D E@2 F G L M N A@2 B@2 C D E@2 F G L M N A@2 B@2 C D E@2 F G L M N
>`.pickRestart({
  A: "[[g2,d3,g3]@41 ~@7]/2", B: "[b3@3 ~, g2 ~]/2", C: "[c3,g3,c4,e4]@17 ~ [b2,b3,d4]@5 ~", D: "[a2,e3,a3,c4]@11 ~",
  E: "[[g2,b3,d4]@15 ~]/2", F: "[d3,a3,d4,f#4]@23 ~", G: "[c3,g3,c4,e4]@23 ~",
  H: "[g3,g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4]@2 ~@10", // G
  I: "[g3,g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~ [g4,b4]@2 ~@10, ~@12 g3 ~@11", // G
  J: "[g3,g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~ [g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~ [g4,b4] ~ [g3,g4,b4] ~ [g3,g4,b4] ~, ~@3 g3 ~@5 g3 ~@2", // G
  K: "[g3,g4,b4]@4 ~@2 [g3,g4]@6 [a3,a4]@5 ~ [b3,b4]@4 ~@2", L: "[g2,b3]",
  M: "[d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~", // D5
  N: "[d3,a3,d4] ~@23", // D5
})).s("gm_piano").gain(0.36)

// chords · piano · "Ac Piano" · soft notes
const piano_soft = note(`<
  ~@6 A@2 B ~ C@2 ~@2 A@2 ~@2 A@2 B ~ C@2 ~@2 A@2 ~@2 A@2 B ~ C@2 ~@2 A@2 ~@4 B ~ C@2 ~@2 A@2 ~@2 A@2 B ~ C@2 ~@2 A@2
  ~@2 A@2 B ~ C@2 ~@2 D ~@4 A@2 B ~ C@2 ~@2 D ~@4 A@2 B ~ C@2 ~@2 D ~@2
>`.pickRestart({
  A: "[[g3,d4]@37 ~@11]/2", B: "~@18 g3@5 ~", C: "[g3@15 ~]/2", D: "[g3,d4]",
})).s("gm_piano").gain(0.2)

// bass · acoustic bass · "Ac Bass"
const bass = note(`<
  A B C D E F C D G H C D I J K L E F C D G H C D I J K L E F C D G H C D I J K L M@2 N O G H C D I J K L E F C D G H C
  D I J K L C D C D G H C D I J K P Q C D C D G H C D I J K P Q C D C D G H C D I J K P Q
>`.pickRestart({
  A: "g1@3 ~ d2 ~ e2@3 ~ d2 ~ g1@3 ~ d2 ~ e2@3 ~ d2@2", B: "g1@3 ~ d2 ~ e2@3 ~ d2@2 g1@3 ~ d2 ~ e2@2 ~@2 d2 ~",
  C: "g1@3 ~ d2 ~ e2@3 ~ d2@2 g1@3 ~ d2 ~ e2@3 ~ d2@2", D: "g1@3 ~ d2 ~ e2@3 ~ d2@2 g1@3 ~ d2 ~ e2@3 ~ d2 ~",
  E: "g1@3 ~ g1@2 g1@2 ~@2 g1 ~ g1@2 ~@2 g1 ~ g1@2 ~@2 g1 ~",
  F: "g1@2 ~@2 g1@2 g1@2 ~@2 g1 ~ g1@2 ~@2 g1 ~ g1@2 ~@2 g1 ~", G: "c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ c2@2 ~@2 c2 ~ b1@6",
  H: "a1@2 ~@2 a1 ~ a1@2 ~@2 a1 ~ a1@2 ~@2 a1 ~ a1@2 ~@2 a1 ~",
  I: "d2@2 ~@2 d2 ~ d2@2 ~@2 d2 ~ d2@2 ~@2 d2 ~ d2@2 ~@2 d2 ~", J: "c2@5 ~ b1@5 ~ a1@6 e2@5 ~",
  K: "g1@3 ~ d2@2 e2@3 ~ d2@2 g1@3 ~ d2@2 e2@3 ~ d2@2", L: "g1@3 ~ d2 ~ e2@3 ~ d2@2 g1@3 ~ d2@2 e2@3 ~ d2 ~",
  M: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1@2 ~@10", N: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~",
  O: "g1@3 ~@3 g1@5 ~ a1@4 ~@2 b1@5 ~", P: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~", Q: "d2 ~@7",
})).s("gm_acoustic_bass").gain(0.45)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  A@2 B@2 C@2 D ~ E F D ~ G H I J C@2 D ~ E F D ~ G H I J K@2 D ~ E L D ~ G M N@2 ~@4 O P Q R S T U J K@2 D ~ E F D ~ G
  M V@2 W X Y X Z X AA@2 AB AC AD AE AF W X Y X Z X AA@2 AB AG AD AE AF W X Y X Z X AA@2 AB AG AD AE AH
>`.pickRestart({
  A: "[[g3,d4,g4,b4]@22 ~ [a#3,c#4,f#4]]/2", B: "[[b3,d4,g4]@7 ~]/2", C: "[g3@47 ~]/2", D: "g2 ~", E: "c3@3 b2",
  F: "a2", G: "d3", H: "c3 ~ a2 e3", I: "~@11 [a#3,f#4]", J: "[b3,g4]@19 ~@5", K: "g3/2", L: "a2@11 ~",
  M: "[c3,c5] ~ a2 [e3,e4]", N: "[g4@7 ~]/2", O: "c3@3 [b2,b5]", P: "a5@3 d3", Q: "[d4,d5,b5]", R: "[b3,b4,g5]",
  S: "[a4,f#5]@4 [b4,g5] [a4,f#5]", T: "[g4,e5]", U: "g2@9 ~@2 [a#3,f#4]",
  V: "[g4@30 [d4,d5,b5]@5 ~ [d4,b5]@5 ~ [d4,d5,b5]@3 ~@3]/2", // G
  W: "[c4,a5]@4 [d4,b5]@2 [c4,a5]@3 ~ b3@9 ~@5, ~@10 g5@7 ~@7", X: "~@4 [d4,b5]@7 ~ [d4,b5]@5 ~ [d4,b5]@5 ~",
  Y: "[c4,a5]@3 ~ [d4,b5]@2 [c4,a5]@3 ~ [b3,g5]@9 ~@5", Z: "[c4,a5]@3 ~ [d4,b5]@2 [c4,a5]@4 g5@11 ~@3, ~@5 a#3@4 ~@3",
  AA: "[[c4,a5]@4 [d4,b5]@2 [c4,a5]@4 [b3,g5]@27 ~@11]/2", AB: "[f#5,a5]", AC: "[e5,g5]", AD: "[b4,d5]@11 ~",
  AE: "[d4,d6] ~ [d4,d6] ~ [d4,d6] ~ [d4,d6] ~ [d4,d6] ~ [d4,d6] ~ [d4,d6] ~ [d4,d6] ~ [d4,d6] ~ [d4,d6] ~ [d4,d6] ~ [d4,d6] ~", // D
  AF: "[d4,d6] ~@5 [b3,b5,d6]@5 ~ [b3,b5,d6]@5 ~ [b3,b5,d6]@4 ~@2", AG: "[e5,g5]@23 ~", AH: "[d4,d6] ~@23",
})).s("gm_string_ensemble_1").gain(0.36)

// chords · string ensemble 1 · "Strings" · soft notes
const string_ensemble_1_soft = note("<~@13 A B ~@10 A B ~@9 C D E@2 ~@4 F G ~@14 C D H@2 ~@39>".pickRestart({
  A: "~ b2 ~@2", B: "g3@5 ~@3", C: "[f#4,a4,d5]", D: "~ [b2,b4] a4 ~", E: "[g3@43 ~@5]/2", F: "[e5,c6]@3 d5",
  G: "[a2,c5]@3 [f#5,d6]", H: "[g3@30 ~@6 d5@5 ~@7]/2",
})).s("gm_string_ensemble_1").gain(0.2)

// other · electric guitar muted · "Mtd Guita"
const electric_guitar_muted = note(`<
  A B C D E F C D G H C D I J C D E F C D G H C D I J C D E F C D G H C D I J C D ~@4 G H C D I J C D E F C D G H C D I
  J C D E F C D G H C D I J C K L E F C D G H C D I J C K L E F C D G H C D I J C K L
>`.pickRestart({
  A: "g2@2 ~@2 d3 ~ e3@3 ~ d3@2 g2@3 ~ d3@2 e3@3 ~ d3@2", B: "g2@3 ~ d3@2 e3@3 ~ d3@2 g2@3 ~ d3 ~ e3@3 ~ d3@2",
  C: "g2@3 ~ d3 ~ e3@3 ~ d3@2 g2@3 ~ d3 ~ e3@3 ~ d3@2", D: "g2@3 ~ d3 ~ e3@3 ~ d3@2 g2@3 ~ d3 ~ e3@3 ~ d3 ~",
  E: "g2@2 ~@2 g2 ~ g2@3 ~ g2@2 g2@3 ~ g2@2 g2@3 ~ g2@2", F: "g2@3 ~ g2@2 g2@3 ~ g2@2 g2@3 ~ g2 ~ g2@3 ~ g2@2",
  G: "c3@2 ~@2 c3 ~ c3@3 ~ c3@2 c3@3 ~ c3@2 b2@3 ~ b2@2", H: "a2@3 ~ a2@2 a2@3 ~ a2@2 a2@3 ~ a2 ~ a2@3 ~ a2@2",
  I: "d3@2 ~@2 d3 ~ d3@3 ~ d3@2 d3@3 ~ d3@2 d3@3 ~ d3@2", J: "c3@3 ~ c3@2 b2@3 ~ b2@2 a2@3 ~ a2 ~ e3@3 ~ e3@2",
  K: "[d3,a3] ~ d3 ~ d3 ~ e3@2 d3 ~ d3@2 [d3,a3] ~ d3 ~ d3 ~ e3@2 d3 ~ d3 ~, ~@6 a3 ~@11 a3 ~@5", L: "[d3,a3] ~@11",
})).s("gm_electric_guitar_muted").gain(0.4)

// drums · kick
const kick = s("bd").struct("<A@40 B@2 C@2 A@31 C@2 A@11 C@2 A@11 C B>".pickRestart({
  A: "x ~@4 x!2 ~@4 x", B: "x", C: "x!4",
})).gain(0.45)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@40 A B C ~@32 D ~@12 D ~@12 D ~>".pickRestart({
  A: "~@2 x!2 ~@8", B: "~ x!2 ~@9", C: "~ x!5 ~@6", D: "~ x!2 ~ x ~@7",
})).gain(0.39)

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!40 ~@4 [~ x ~ x]!31 ~@2 [~ x ~ x]!11 ~@2 [~ x ~ x]!11 ~@2>").gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@43 [~@3 x] ~@59>").gain(0.64)

// drums · hihat
const hihat = s("hh").struct("<A@15 B A@11 B A@11 B ~@4 A@7 B A@11 B A@11 ~@2 A@11 ~@2 A@11 ~@2>".pickRestart({
  A: "x ~ x!2 ~ x!2 ~ x!2 ~ x", B: "~@2 x!2 ~ x!2 ~ x!2 ~ x",
})).gain(0.45)

// drums · mid tom
const mid_tom = s("mt").struct("<~@43 [~ x] ~@59>").gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~@43 [~ x ~@2] ~@59>").gain(0.64)

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

stack(
  piano, piano_soft, bass, string_ensemble_1, string_ensemble_1_soft, electric_guitar_muted, kick, snare, snare_soft,
  clap, low_tom, hihat, mid_tom, high_tom, crash
)

More by T. Rex