Strudelify
The Crystal Ship cover art

1967 · The Doors

The Crystal Ship

The Doors

KeyF majorTempo97 bpm
0:00/0:00
// The Crystal Ship — The Doors
// 97 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 60 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(97/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.

// bass · fretless bass
const bass = note(`<
  ~@3 A B C D E F G H I J K L M N B O P N O Q R H A S A T U V W X Y Z AA M F AB AC F AD AE I AF AG AH AI A M AJ AK AL AJ
  AM AN H AO@2 ~
>`.pickRestart({
  A: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2@2", B: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2@2 a1 ~",
  C: "bb1 ~ bb1 ~ bb1 ~ bb1 bb0 bb1 ~ bb1 ~ bb1@2 c2 ~", D: "db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2@2",
  E: "f2 ~ f2 ~ f2 ~ f2 f1 f2 ~ f2 ~ f2@2 a1 ~", F: "bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1@2",
  G: "c2 c1 c2 ~ c2 ~ c2 ~ bb1 ~ bb1@2 bb1 ~ bb1 bb0", H: "f2 ~ f2@2 f2 ~ f2 f1 eb2 eb1 eb2 ~ eb2 ~ eb2 ~",
  I: "f2 ~ f2@2 f2 ~ d2 ~ eb2 ~ eb2@2 eb2 ~ e2 ~", J: "f2 ~ f2@2 f2 ~ c2 ~ db2 db1 db2 ~ db2 ~ db2 ~",
  K: "a1 ~ a1@2 a1 ~ d2 ~ eb2 ~ eb2@2 eb2 ~ eb2 eb1", L: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2@2",
  M: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 c1 c2 c1 c2!2", N: "f2 ~ f2 ~ f2 ~ f2@2 f2 ~ f2 ~ f2 ~ f2 ~",
  O: "bb1 ~ bb1 ~ bb1 ~ bb1@2 bb1 ~ bb1 ~ bb1 ~ bb1 ~", P: "db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2@2 e2 ~",
  Q: "c2 c1 c2 ~ c2 ~ c2 ~ bb1 ~ bb1@2 bb1 ~ e2 ~", R: "f2 ~ f2@2 f2 ~ f2 f1 eb2 ~ eb2@2 eb2 ~ e2 ~",
  S: "f2 ~ f2 ~ f2 ~ f2@2 f2 ~ f2@2 f2 ~ f2 ~", T: "eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2@2",
  U: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2@2 d2 ~", V: "eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2@2 e2 ~",
  W: "f2 f1 f2 ~ f2 ~ f2 ~ db2 ~ db2@2 db2 ~ db2 db1", X: "ab2 ~ ab2@2 ab2 ~ ab2 ab1 eb2 ~ eb2@2 eb2 ~ eb2 eb1",
  Y: "c2 ~ c2 ~ c2 ~ c2@2 c2 ~ c2 ~ c2 ~ c2 c1", Z: "c2 ~ c2 ~ c2 ~ c2 c1 c2 ~ c2 ~ c2@2 e2 ~",
  AA: "f2 ~ f2 ~ f2 ~ f2@2 f2 ~ f2 ~ f2 ~ f2 f1", AB: "db2 ~ db2 ~ db2 ~ db2 ~ db2 ~ db2 db1 db2 db1 db2!2",
  AC: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2@2 a1 ~", AD: "c2 c1 c2 ~ c2 ~ c2 ~ bb1 bb0 bb1 ~ bb1 ~ bb1 ~",
  AE: "f2 f1 f2 ~ f2 ~ f2 ~ eb2 ~ eb2@2 eb2 ~ e2 ~", AF: "f2 ~ f2@2 f2 ~ f2 f1 db2 ~ db2@2 db2 ~ ab1 ~",
  AG: "a1 a0 a1 ~ a1 ~ a1 ~ eb2 ~ eb2@2 eb2 ~ b1 ~", AH: "c2 ~ c2 ~ c2 ~ c2@2 c2 ~ c2 ~ c2 ~ c2 ~",
  AI: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2@2 e2 ~", AJ: "bb1 ~ bb1 ~ bb1 ~ bb1@2 bb1 ~ bb1 ~ bb1 ~ bb1 bb0",
  AK: "db2 ~ db2 ~ db2 ~ db2@2 db2 ~ db2 ~ db2 ~ db2 db1", AL: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 f1 f2 f1 f2!2",
  AM: "c2 ~ c2@2 c2 ~ a1 ~ bb1 ~ bb1@2 bb1 ~ bb1 bb0", AN: "f2 ~ f2@2 f2 ~ d2 ~ eb2 eb1 eb2 ~ eb2 ~ eb2 ~",
  AO: "[eb2 ~ eb2 ~ f2@28]/2",
})).s("gm_fretless_bass").gain(0.48)

// chords · church organ · "pipe organ"
const church_organ = note(`<
  ~@3 A B C D E F G H@2 I J K@2 A B C D E F G H@2 L M N O P Q R S T U A B C D E F G H@2 I J K@2 A B C D E F G H@2 V@2 ~
>`.pickRestart({
  A: "[f3,ab3,c4]", B: "[c3,eb3,g3]", C: "[bb3,d4,f4]", D: "[db3,f3,ab3]", E: "[f3,a3,c4]", F: "[bb2,d3,f3,ab3]",
  G: "[c3,e3,g3] [bb3,d4,f4]", H: "[f3,a3,c4] [eb3,g3,bb3]", I: "[f3,a3,c4] [db3,f3,ab3]",
  J: "[ab3,c4,eb4] [eb3,g3,bb3]", K: "[c3,e3,g3,bb3]",
  L: "[f2,f3]@2 f3@2 [f2,c3] ~ [f2,c3,c4]@4 f3@2 [c3,a3]@2 [f2,c3,c4]@2, c3 ~@3 a3@2 ~@6 f2 ~@3", // F F5 F F5
  M: "[f2,c3,f3] f3 [f2,c3,a3] c4@2 f3 [f2,c3,a3] [f2,c3,c4], ~@3 [f2,c3]@3 ~@2", // F5 F F5
  N: "[f3,ab3] [e3,g3] [f3,ab3] [f3,ab3]@2 [e3,g3] [f3,ab3]@2, c4", // Fm Em Fm Em Fm
  O: "[g3,bb3] [bb3,eb4] [eb4,g4] [g4,bb4]@2 [eb4,g4] [bb3,eb4]@2", // Gm Eb5 Eb Gm Eb Eb5
  P: "[f4,ab4] [c4,g4] [f4,ab4] [g4,bb4] [ab4,c5] [g4,bb4] [f4,ab4] [ab4,c5]", // Fm C5 Fm Gm Ab Gm Fm Ab
  Q: "[g4,bb4] [eb4,g4] [g4,bb4] [bb4,eb5]@2 [g4,bb4] [bb4,eb5]@2", // Gm Eb Gm Eb5 Gm Eb5
  R: "[f3,ab3] c3 [f3,ab3] c3 [f3,ab3] db3 [f3,ab3] db3", S: "[ab3,c4] eb3 [ab3,c4] [g3,bb3]@2 [f3,ab3] [g3,bb3]@2",
  T: "[g3,bb3,c4] c3 [g3,bb3,c4] c3 [g3,bb3,c4] c3 [g3,bb3,c4] c3", // C7
  U: "[e3,bb3,c4] c3 [e3,bb3,c4] c3 [e3,bb3,c4] c3 [e3,bb3,c4] c3", V: "[f2,c3,c4,f4,a4,c5]/2",
})).s("gm_church_organ").gain(0.22).pan(0.8)

// chords · piano · Fm Ab Gm Fm Gm C7
const piano = note(`<
  ~@31
  [[f3,ab3] c3 [f3,ab3] c3 [f3,ab3] db3 [f3,ab3] db3]
  [[ab3,c4] eb3 [ab3,c4] [g3,bb3]@2 [f3,ab3] [g3,bb3]@2]
  [[g3,bb3,c4] c3 [g3,bb3,c4] c3 [g3,bb3,c4] c3 [g3,bb3,c4] c3]
  [[e3,bb3,c4] c3 [e3,bb3,c4] c3 [e3,bb3,c4] c3 [e3,bb3,c4] c3]
  ~@25
>`).s("gm_piano").gain(0.5).pan(0.2)

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

// drums · rim
const rim = s("rim").struct("<[x!2] [x!4] ~@58>").gain(0.35)

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

// drums · low tom
const low_tom = s("lt").struct("<~@15 A ~@7 A ~@7 B ~@15 C ~@12>".pickRestart({
  A: "~@12 x!4", B: "~@7 x", C: "~@2 x!6",
})).gain(0.4)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@15 [~@8 x!2 ~@6] ~@7 [~@8 x!2 ~@6] ~@7 [~@13 x ~@2] ~@28>").gain(0.45)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@6 A@3 ~ B ~@2 A ~@3 C A ~@5 D ~@2 C A C ~@3 C B ~@3 A ~@3 E ~ C ~@5 A ~@6 D ~@2
>`.pickRestart({
  A: "~@3 x ~@4", B: "~@2 x ~@3 x!2", C: "~@15 x", D: "~ x ~@2", E: "~ x!3",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@15 [~@4 x!2 ~@10] ~@7 [~@4 x!2 ~@10] ~@36>").gain(0.45)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@3 A@12 B A@7 B A@23 B A@9 C ~@2>".pickRestart({
  A: "x!4", B: "x!8", C: "x!2 ~@2",
})).gain(0.4)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@3 [x!4]!44 [x!8] [x!4]!9 x ~@2>").gain(2.01)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<~@3 [~ x ~ x ~ x ~ x]!44 ~ [~ x ~ x ~ x ~ x]!9 [~ x ~@6] ~@2>").gain(1.26)

// drums · shaker
const shaker = s("sh").struct("<~@3 [x!4]!54 x ~@2>").gain(0.4)

stack(
  bass, church_organ, piano, kick, rim, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash, tambourine, cabasa,
  cabasa_soft, shaker
)

More by The Doors