Strudelify

Hello, I Love You

The Doors

KeyD majorTempo120 bpm
0:00/0:00
// Hello, I Love You — The Doors
// 120 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 60 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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.

// bass · electric bass finger
const bass = note("<A B@10 C@2 D@7 E B@6 C@2 D@7 F@3 G@7 H I@11 J ~>".pickRestart({
  A: "~@8 a1 ~ a1 ~ a2 ~ a2 ~", B: "[g1 ~ g1 ~ g2 ~ g2 ~ a1 ~ e2@4 d2@4 b1 c2 b1 a1 g1@2 a1 ~ a1 ~ a2 ~ a2 ~]/2",
  C: "[g1 ~ g1 ~ g2 ~ g2 ~ a1 ~ e2@4 d2@4 b1 c2 b1 a1 g1@2 a1@4 c#2@2 e2@2]/2", D: "g1@2 b1 d2 a1@2 c#2 e2",
  E: "g1@4 b1@2 d2@2 a1 ~ a1 ~ a2 ~ a2 ~", F: "[g1@2 b1 d2 a2@8 a1@8 d2@2 f#2 a2]/3", G: "c2@2 e2 g2 d2@2 f#2 a2",
  H: "c2@2 e2 g2 d2 f2 d2 c#2", I: "c2 b1 c2 c#2 d2 f2 d2 c#2", J: "c2 b1 c2 c#2 ~@4",
})).s("gm_electric_bass_finger").gain(0.64)

// other · lead 2 sawtooth
const lead_2_sawtooth = note(`<
  ~@4 A B@6 C@2 D@2 E@2 D@2 F@2 B@6 C@2 D@2 E@2 G@2 H ~@2 I J@2 K@2 L@2 M@8 N@7
>`.pickRestart({
  A: "~@3 a4 a4@3 a4", B: "[g4!4 c5!3 a4@4 a4 a4@3 a4]/2", C: "[g4!4 c5!3 a4@4 a4 c5@2 c5@2]/2",
  D: "[b4@2 a4@2 c5@3 a4@3 a4!2 c5@2 c5@2]/2", E: "[b4@2 a4@2 c5@3 a4@4 a4 c5@2 c5@2]/2",
  F: "[b4@2 a4@2 c5@3 a4@4 a4 a4@3 a4]/2", G: "[b4@2 a4@2 c5@3 a4@3 a4!2 a5@2 a5@2]/2", H: "a5@2 a5@2 a5@2 a5!2",
  I: "~@2 f5!2", J: "[e5@2 d5@2 f5@3 d5@3 d5!2 f5@2 f5@2]/2", K: "[e5@2 d5@2 f5@3 d5@4 d5 f5@2 f5@2]/2",
  L: "[e5@2 d5@2 f5@3 d5@3 d5!2 a5@2 a5@2]/2",
  M: "[a5@2 a5@2 a5 a5@2 a5@3 d6 d6@7 d6 d6@7 d6 d6@7 d6 d6@7 d6 d6@7 d6 d6@7 d6 d6@5]/8",
  N: "[~@2 d6 d6@7 d6 d6@7 d6 d6@7 d6 d6@7 d6 d6@7 d6 d6@7 ~@6]/7",
})).s("gm_lead_2_sawtooth").gain(0.64)

// other · overdriven guitar
const overdriven_guitar = note("<A B@10 C@2 D@7 E B@6 C@2 D@7 F ~ G H@7 I J@11 K ~>".pickRestart({
  A: "~@8 a2 ~ a2 ~ a3 ~ a3 ~", B: "[g2 ~ g2 ~ g3 ~ g3 ~ a2 ~ e3@4 d3@4 b2 c3 b2 a2 g2@2 a2 ~ a2 ~ a3 ~ a3 ~]/2",
  C: "[g2 ~ g2 ~ g3 ~ g3 ~ a2 ~ e3@4 d3@4 b2 c3 b2 a2 g2@2 a2@4 c#3@2 e3@2]/2", D: "g2@2 b2 d3 a2@2 c#3 e3",
  E: "g2@4 b2@2 d3@2 a2 ~ a2 ~ a3 ~ a3 ~", F: "g2@2 b2 d3 ~@4", G: "~@4 d3@2 f#3 a3", H: "c3@2 e3 g3 d3@2 f#3 a3",
  I: "c3@2 e3 g3 d3 f3 d3 c#3", J: "c3 b2 c3 c#3 d3 f3 d3 c#3", K: "c3 b2 c3 c#3 ~@4",
})).s("gm_overdriven_guitar").gain(0.64)

// chords · electric guitar clean
const electric_guitar_clean = note("<~@36 A@3 ~@21>".pickRestart({
  A: "[~ [a4,e5,a5]@2 [a3,e4,a4]@2 ~]/3", // A5
})).s("gm_electric_guitar_clean").gain(0.64)

// drums · kick
const kick = s("bd").struct(`<
  A B A B A B A B A B A B C D E D E D E D F B A B A B A B C D E D E D E D G ~ C D E D E D E D E D E D E D E D E D E D G
  ~
>`.pickRestart({
  A: "~ x", B: "x!2", C: "~@7 x", D: "~@3 x ~@3 x", E: "~ x ~ x ~@3 x", F: "~ x ~ x!2 ~@3", G: "~ x ~ x ~@4",
})).gain(0.64)

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

// drums · hihat
const hihat = s("hh").struct("<~ A ~ A ~ A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~@32>".pickRestart({
  A: "~ x",
})).gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<A B C B C B C B C B C B C ~@8 B C B C B C B C ~@31>".pickRestart({
  A: "~ x ~@2", B: "~@5 x ~ x", C: "~ x ~@6",
})).gain(0.64)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@2 A ~ A ~ A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~@31>".pickRestart({
  A: "x",
})).gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~ A ~ A ~ A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~@32>".pickRestart({
  A: "~@3 x",
})).gain(0.64)

stack(
  bass, lead_2_sawtooth, overdriven_guitar, electric_guitar_clean, kick, snare, hihat, low_tom, open_hat, mid_tom,
  high_tom
)

More by The Doors