Strudelify
Shipwrecked cover art

1997 · Calling All Stations

Shipwrecked

Genesis

KeyF♯ majorTempo88 bpm
0:00/0:00
// Shipwrecked — Genesis
// 88 bpm, 4/4, key F# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 93 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(88/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(`<
  ~@4 A B A B A B A B C D C E F G H I A B A B A B A B C D C E F G H I A B A B A B A B A B A B A B A B J A K L A@3 M A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B N
>`.pickRestart({
  A: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~", B: "f#1 ~ f#1@2 b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~",
  C: "a#1@5 ~ a#1 ~ a#1@3 ~ a#1@2 c#2@2", D: "d#2@5 ~ d#2 ~ d#2@4 g#1@4", E: "d#2@6 d#2@4 c#2@2 g#1@3 ~",
  F: "a#1@5 ~ a#1@4 a#1@2 c#2@4", G: "d#2@5 ~ d#2@6 f#1@4", H: "g#1@6 g#1 ~ g#1@8",
  I: "a#1@5 ~ a#1 ~ a#1@4 d#2@2 c#2@2", J: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1@2",
  K: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1@2 f#1 ~ f#1 ~", L: "f#1 ~ f#1 ~ f#1 ~ f#1@2 f#1 ~ f#1 ~ f#1 ~ f#1 ~",
  M: "f#1 c#2 g#2 c#2 f#1 c#2 f#1 c#2", N: "f#1@3 ~@13",
})).s("gm_fretless_bass").gain(0.35)

// other · alto sax
const alto_sax = note(`<
  ~@11 A B@2 C@2 D E F G H I H J K L M N O P Q R S@2 T U V W X Y Z L AA AB AC AD AE@2 AF AG@2 AH ~@2 AI@2 AJ AK AL AM AN
  ~@6 AO AP AQ AR AS AT AU AV AW AX ~ AY AZ@2 BA@2 BB BC ~ BD BE H BF BG BH BI
>`.pickRestart({
  A: "~@14 f#3 g#3", B: "[a#3@2 g#3 g#3@3 a#3 ~ a#3 g#3 g#3@3 ~ a#3@4 d#3 c#3 d#3@7 ~@5]/2",
  C: "[~@4 a#3 ~ a#3@2 b3@2 a#3@2 g#3 ~ g#3@4 f#3@9 ~@3 a#3 g#3]/2", D: "a#3 ~ a#3 ~ a#3 g#3 f#3 a#3@3 g#3@2 ~@2 f#4@2",
  E: "~@2 f4@2 d#4 ~ d#4@9 ~", F: "~@6 a#3@2 b3 ~ a#3 a#3@3 g#3 ~", G: "a#3@11 ~ g#3 ~ g#3 ~", H: "g#3@2 f#3@3 ~@11",
  I: "~@6 a#3@2 b3@2 a#3 a#3@3 g#3 ~", J: "~@14 g#3 ~", K: "a#3@2 ~ a#3@2 ~ a#3 g#3 a#3@5 ~@3",
  L: "c#4@2 b3 ~ b3@2 a#3 a#3@5 ~@4", M: "~@2 c#4 ~ c#4 ~ c#4 d#4@3 c#4 ~ a#3 ~ g#3 ~",
  N: "a#3@2 g#3 f#3@8 ~@3 g#3 a#3", O: "a#3@2 g#3 ~ g#3@2 a#3 a#3@3 g#3 ~ g#3@2 a#3@2",
  P: "b3@2 a#3@2 g#3@2 f#3 f#3@7 ~@2", Q: "~@6 a#3 ~ b3@2 ~ a#3@3 g#3 ~", R: "g#3@2 f#3@7 ~@7",
  S: "[~@4 f4 ~ f4 ~ f4@2 d#4 ~ f4@2 f#4 f4@5 d#4@2 a#3@9 ~]/2", T: "~@6 g#3 a#3 b3@2 a#3@3 ~ g#3 a#3",
  U: "g#3 a#3@10 ~@3 g#3@2", V: "g#3 ~ f#3@3 ~@11", W: "~@6 a#3@2 d#4@2 c#4 c#4@3 a#3@2", X: "d#4@2 c#4@3 ~@11",
  Y: "~@7 g#3", Z: "a#3@2 ~ a#3@2 g#3 a#3 g#3 a#3@4 ~@4", AA: "~@2 c#4 ~ c#4 ~ c#4 d#4@3 c#4@2 a#3@2 g#3 ~",
  AB: "a#3@2 g#3 f#3@9 ~@4", AC: "~@2 a#3@2 c#4 ~ c#4@2 d#4@2 c#4@2 a#3@2 g#3@2", AD: "a#3@2 c#4@7 ~@7",
  AE: "[~@4 a#3 ~ a#3@2 g#3 ~ a#3@3 ~ f#3@6 ~@12]/2", AF: "~@2 a#3@2 c#4@2 a#3 ~ d#4@3 ~ f#4@2 d#4@2",
  AG: "[~@2 c#4@4 b3@3 ~ c#4@3 ~ c#4@15 ~ a#3@2]/2", AH: "~@2 g#3@3 ~ f#3@7 ~@3",
  AI: "[~@4 b3 ~ b3 ~ b3!2 b3@2 a#3@2 b3 c#4@2 ~ f#3@8 ~@4 c#4 ~]/2", AJ: "d#4@2 c#4 ~ c#4@2 b3 c#4@3 b3@3 ~ c#4 d#4",
  AK: "e4@2 d#4 ~ d#4@2 c#4 c#4@3 b3@2 ~@2 c#4 b3", AL: "c#4 ~ c#4 c#4@3 b3 ~ c#4 d#4 c#4@2 ~@2 b3 ~",
  AM: "c#4 ~ c#4 c#4@3 b3 c#4 ~ d#4 ~ c#4@2 ~ d#4 ~", AN: "c#4 f#3@3 ~@4", AO: "~@6 a#3@2 b3 ~ a#3 ~ a#3@2 g#3 ~",
  AP: "g#3 f#3@3 ~@4", AQ: "~@6 a#3@2 c#4@2 b3 b3@3 a#3 ~", AR: "g#3 ~ f#3@6 ~@8", AS: "~@7 b3",
  AT: "c#4 ~ c#4 c#4@2 c#4 b3 c#4@6 ~@3", AU: "c#4@2 b3 ~ b3@2 a#3 a#3@8 ~",
  AV: "~@2 f#4 ~ f#4 ~ f#4 f#4@3 c#4@2 b3 ~ a#3@2", AW: "b3@2 a#3 f#3@3 a#3@2 d#4@2 c#4 ~ c#4@2 a#3 ~",
  AX: "d#4@2 c#4@5 ~@9", AY: "g#3@2 f#3@5 ~@9", AZ: "[~@14 c#4@4 b3 ~ b3@2 a#3 ~ a#3@2 f#3@5 ~]/2",
  BA: "[~@6 d#4@2 c#4@2 b3@2 a#3 b3 a#3@9 ~@9]/2", BB: "~@10 d#4@2 c#4@2 g#3 ~", BC: "g#3 f#3 ~@6",
  BD: "a#3@2 f#3@3 ~@11", BE: "~@7 a#3", BF: "~@8 d#4@2 c#4@2 a#3 ~ g#3 ~", BG: "g#3 f#3@2 ~@5",
  BH: "~@6 g#3 ~ g#3@2 a#3 ~ c#4@2 d#4 ~", BI: "c#4 ~@7",
})).s("gm_alto_sax").gain(0.45)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@4 A@2 B@2 C@2 D@2 E F G F E H I J A@2 B@2 C@2 D@2 E F G F E H I J A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 K L K M N O P Q
  A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 R
>`.pickRestart({
  A: "[[f#3,g#3,c#4]@8 [f#3,a#3,c#4]@5 ~ [f#3,a#3,b3,d#4]@17 ~]/2", // F#sus2 F# Bmaj7
  B: "[[f#3,g#3,c#4]@7 ~ [f#3,a#3,c#4]@5 ~ [f#3,a#3,b3,d#4]@16 ~@2]/2", // F#sus2 F# Bmaj7
  C: "[[f#3,g#3,c#4]@7 ~ [f#3,a#3,c#4]@5 ~ [f#3,a#3,b3,d#4]@17 ~]/2", // F#sus2 F# Bmaj7
  D: "[[f#3,g#3,c#4]@5 ~ [f#3,a#3,c#4]@7 ~ [f#3,a#3,b3,d#4]@16 ~@2]/2", E: "[a#3,c#4,f4]@15 ~", F: "[a#3,d#4,f#4]@15 ~",
  G: "[a#3,c#4,g#4]@15 ~", H: "[a#3,d#4,f#4]@3 [a#3,c#4,f#4]", I: "[b3,d#4,g#4]@15 ~", J: "[c#4,f4,g#4]@15 ~",
  K: "[g#3,b3,e4]", L: "[f#3,b3,d#4]@15 ~", M: "[a#3,c#4,f#4]@15 ~", N: "[b3,e4,g#4]@15 ~", O: "[b3,d#4,f#4]@15 ~",
  P: "[g#3,b3,e4]@15 ~", Q: "[g#3,c#4,f4]@15 ~", R: "[a#3,c#4,f#4]@3 ~@13",
})).s("gm_synth_strings_1").gain(0.16)

// chords · distortion guitar
const distortion_guitar = note(`<
  A@2 B@2 A@2 B@2 A@2 B@2 C D E F E G H I A@2 B@2 A@2 B@2 C D E F E G H I A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 J K L M N O P
  Q A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 R
>`.pickRestart({
  A: "[[f#2,c#3,f#3,c#4,f#4]@4 [c#4,f#4]@2 [f#2,c#3,f#3] ~ [f#2,c#3,f#3,c#4,f4] ~ [f#2,c#3,f#3,c#4,f#4]@3 ~ [b2,f#3]@6 [a#3,d#4]@2 [b2,f#3] ~ [b2,f#3,g#3,c#4] ~ [b2,f#3,a#3,d#4]@3 ~ [b2,f#3,g#3,c#4] ~, ~@14 [a#3,d#4]@5 ~@13]/2", // F#5 F#maj7 F#5 B5 D#5 B5 Bsus2 Bmaj7 …
  B: "[[f#2,c#3,f#3]@4 [c#4,f#4]@2 [f#2,c#3,f#3] ~ [f#2,c#3,f#3,c#4,f4] ~ [f#2,c#3,f#3,c#4,f#4]@3 ~ [b2,f#3]@6 [a#3,d#4]@2 [b2,f#3] ~ [b2,f#3,g#3,c#4] ~ [b2,f#3,a#3,d#4]@3 ~ [b2,f#3,g#3,c#4] ~, [c#4,f#4]@3 ~@11 [a#3,d#4]@5 ~@13]/2", // F#5 F#maj7 F#5 B5 D#5 B5 Bsus2 Bmaj7 …
  C: "[a#2,f3,a#3]@9 ~ [a#2,f3,g#3] ~ [a#2,f3,a#3]@2 ~@2", D: "[d#3,f#3,a#3]@13 ~ g#3@2",
  E: "[a#2,f3,a#3]@9 ~ [a#2,f3,a#3] ~@3 [a#2,f3,a#3] ~", F: "[d#3,f#3,a#3]@11 ~@3 [d#3,g#3]@2",
  G: "[d#3,f#3,a#3]@13 ~ [c#3,f#3]@2", H: "[g#2,d#3,g#3]@13 ~ [g#2,d#3,g#3]@2",
  I: "[a#2,f3,a#3]@9 ~ [a#2,f3,g#3] ~ [a#2,f3,g#3] ~ [a#2,f3,g#3] ~", // A#5 A#7
  J: "[g#3,b3,e4]@2 ~@4 [g#3,b3,e4] ~@3 [g#3,b3,e4] ~@3 [g#3,b3,e4] ~", K: "[f#3,b3,d#4]",
  L: "~@4 [g#3,b3,e4] ~@5 [g#3,b3,e4] ~@3 [g#3,b3,e4]@2", M: "[a#3,c#4,f#4]@15 ~",
  N: "~@4 [b3,e4,g#4] ~@5 [b3,e4,g#4] ~@3 [b3,e4,g#4] ~", O: "[b3,d#4,f#4]@15 ~",
  P: "~@2 [g#3,b3,e4] ~@3 [g#3,b3,e4] ~@3 [g#3,b3,e4] ~@3 [g#3,b3,e4]@2", Q: "[g#3,c#4,f4]@15 ~",
  R: "[f#3,c#4,f#4,a#4] ~@7", // F#
})).s("gm_distortion_guitar").gain(0.29).pan(0.6)

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

// drums · rim
const rim = s("rim").struct("<[~ x ~ x]!4 ~@8 [~ x ~ x]!7 [~ x ~@2] ~@8 [~ x ~ x]!7 [~ x ~@2] ~@57>").gain(0.5)

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

// drums · pedal hat
const pedal_hat = s("hh").struct("<A@3 B ~@48 C D@2 E C E C F ~@33>".pickRestart({
  A: "x!3 ~ x ~ x!5 ~@3 x ~", B: "x ~ x ~ x ~ x!5 ~@3 x ~", C: "~ x ~ x!3 ~ x!3 ~ x!3 ~ x",
  D: "x!2 ~ x!3 ~ x!3 ~ x!3 ~ x", E: "x!2 ~ x!3 ~ x!3 ~ x!3 ~@2", F: "x!2 ~ x!3 ~ x!3 ~@6",
})).gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~@11 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~>".pickRestart({
  A: "~@7 x",
})).gain(0.35)

// drums · open hat
const open_hat = s("oh").struct("<[~@3 x]!4 ~@51 [~@15 x] ~ [~@15 x] ~ [~@11 x ~@4] ~@33>").gain(0.35)

// drums · high tom
const high_tom = s("ht").struct("<~@11 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~>".pickRestart({
  A: "~@15 x",
})).gain(0.45)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@52 A@8 B@15 C B@7 D B@3 C B@3 C ~>".pickRestart({
  A: "x!16", B: "~ x ~ x", C: "~@2 x ~@2 x!2 ~", D: "~@2 x ~@2 x!3",
})).gain(0.3)

// drums · shaker
const shaker = s("sh").struct("<~@4 [x!8]!88 ~>").gain(0.25)

stack(
  bass, alto_sax, synth_strings_1, distortion_guitar, kick, rim, snare, pedal_hat, mid_tom, open_hat, high_tom, crash,
  tambourine, shaker
)

More by Genesis