Strudelify

Seven Seas

Echo & The Bunnymen

KeyF majorTempo129 bpm
0:00/0:00
// Seven Seas — Echo & The Bunnymen
// 129 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 120 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(129/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@4 A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C D E@2 F A B@2 C G H I J G K B@2 A B@2 C A B@2 C D E@2 F A B@2 C G
  H I J G K B@2 A B@2 C D E B C D L B C A B@2 C A B@2 C G H I J G K B@2 G H I J G K B@2 G K B@2 G K B@2 M ~@7
>`.pickRestart({
  A: "f1@2 ~@2 f1 ~ f1 ~@3 f1 ~ f1 ~@3 c1 ~ f1 ~@3 f1 ~", B: "f1 ~@3 f1 ~ f1 ~@3 f1 ~ f1 ~@3 c1 ~ f1 ~@3 f1 ~",
  C: "f1 ~@3 f1 ~ f1 ~@3 f1 ~ f1 ~@3 c1 ~ f1 ~ f1 ~@3", D: "bb1@2 ~@2 bb1 ~ bb1 ~@3 bb1 ~ bb1 ~@3 f1 ~ bb1 ~@3 bb1 ~",
  E: "bb1 ~@3 bb1 ~ bb1 ~@3 bb1 ~ bb1 ~@3 f1 ~ bb1 ~@3 bb1 ~",
  F: "bb1 ~@3 bb1 ~ bb1 ~@3 bb1 ~ bb1 ~@3 f1 ~ bb1 ~ bb1 ~@3",
  G: "bb1 ~@3 bb1 ~ bb1 ~@3 bb1 ~ bb1 ~@3 f1 ~ bb1 ~@3 f1 ~", H: "c2 ~@3 c2 ~ c2 ~@3 c2 ~ c2 ~@3 g1 ~ c2 ~@3 g1 ~",
  I: "f1@2 ~@2 f1 ~ f1 ~@3 f1 ~ f1@2 ~@2 c1 ~ f1 ~@3 c1 ~", J: "d1 ~@3 d1 ~ d1 ~@3 d1 ~ d1 ~@3 d1 ~ d1 ~@3 d1 ~",
  K: "c2 ~@3 c2 ~ c2 ~@3 c2 ~ c2@2 ~@2 g1 ~ c2 ~@3 g1 ~", L: "c2 ~@3 c2 ~ c2 ~@3 c2 ~ c2 ~@3 g1 ~ c2 ~@3 c2 ~",
  M: "f1@11 ~",
})).s("gm_acoustic_bass").gain(0.45)

// chords · drawbar organ · "ORGAN 1"
const drawbar_organ = note("<~@3 A@4 B@5 ~@108>".pickRestart({
  A: "[~@23 f2@9, ~@5 [c3,f3]@19]/4", B: "[~@69 f2@49 ~@2, ~@7 [c3,f3]@32 ~]/5",
})).s("gm_drawbar_organ").gain(0.45)

// chords · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~@20 A@8 B@4 C@4 D E F@3 G H@2 I@7 J@4 K@5 D E F@3 G H@2 L@6 M@4 N@2 O@8 D E F@3 G H@2 D E F@3 G H@2 P Q R@3 E S@2 T
  ~@7
>`.pickRestart({
  A: "[[a4,c5]@95 ~, f4]/8", B: "[[bb4,d5]@47 ~]/4", C: "[[a4,c5]@95 ~]/4", D: "bb4@10 ~@6 bb4@5 ~@3, [f4,d5]@11 ~",
  E: "[g4,c5,e5]@11 ~", F: "[[f4,a4,c5]@22 ~@2 f4@23 [f4,bb4,d5]@23 ~@2, ~@23 [a4,d5]@23 ~@26]/3", G: "[g4,c5,e5]@7 ~",
  H: "[[f4,a4,c5]@47 ~]/2", I: "[f4,a4,c5]/7", J: "[~@23 [f4,bb4,d5]@73]/4", K: "[~@23 [f4,a4,c5]@95 ~@2]/5",
  L: "[[a4,c5]@47 ~ d5@23 ~, f4@71 ~, ~@95 bb4@46 ~@3]/6", // Am
  M: "[[f4,a4,c5]@23 ~ [f4,d5]@11 ~ [g4,e5]@11 ~, ~@47 bb4@22 ~@2 c5@22 ~@3]/4", N: "[f4,a4,c5]/2",
  O: "[[f4,a4,c5]@95 ~]/8", P: "[f4,bb4,d5]@11 ~", Q: "[g4,c5,e5]@23 ~", R: "[[a4,c5]@45 ~@3 [bb4,d5]@23 ~, f4@35 ~]/3",
  S: "[[a4,c5]@15 ~]/2", T: "[f4,a4,c5]@19 ~@5",
})).s("gm_rock_organ").gain(0.4)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@19 A B@2 ~@29 A B@2 ~@66>".pickRestart({
  A: "~@2 [eb3,eb5] [e3,e5]", B: "[[f3,f5]@43 ~@5]/2",
})).s("gm_string_ensemble_1").gain(0.45)

// other · celesta
const celesta = note(`<
  ~@4 A B C D A B C D ~@25 E F G H I J ~@18 E F G H I J ~@22 E F G H I J ~@2 E F G H I J ~ H I J ~ H I J ~@9
>`.pickRestart({
  A: "f4 eb4 c4 ~", B: "bb3@2 c4@3 f3@4 ~@2 f3", C: "ab3@4 bb3@5 ~ c4@8 ~@6", D: "c4@4 ab3@5 f3@9 ~@6",
  E: "c4@4 ~@17 e4@2 ~", F: "f4@5 ~@19", G: "a3 ~@5", H: "bb3 ~@23", I: "c4 ~@11 c5@4 ~@8", J: "f4 ~@23",
})).s("gm_celesta").gain(0.45).pan(0.8)

// other · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note("<~@68 A B C D E F G H I J K L ~@30 K L M ~@7>".pickRestart({
  A: "a4@2 ~@2 b4@2 c5@2 b4@2 bb4@2 f4@3 ~ f4@3 ~ a4@2 bb4@2, ~ bb4@2 ~@9",
  B: "c5@2 b4@2 bb4@2 f4@3 ~ f4@3 ~ a4@2 bb4@2 c5@2 d5@2 e5@2", C: "a4 bb4 b4 c5 a4 bb4 c5 a4 bb4 db5 a4 bb4",
  D: "c5@2 a4@2 bb4@2 d5@2 a4@2 bb4@2 eb5@2 a4@2 bb4@2 ~ bb4@2 ~ a4 ~, ~@9 c5 ~@2",
  E: "f5@2 eb5@2 c5 bb4 c5 eb5 f5 eb5 c5 eb5",
  F: "f5@2 c5@2 eb5@2 f5@2 c5@2 eb5@2 f5@2 c5@2 ~ c5@2 ~ eb5@2 f5@2, ~@8 bb4 ~@3",
  G: "a4 ab4 g4 gb4 g4 gb4 f4 e4 f4 e4 eb4 d4",
  H: "db4@2 eb4@2 d4@2 db4@2 c4@2 d4@2 db4@2 c4@2 b3@2 db4@2 [c4,f4,a4,c5] ~ [bb3,f4,a4] ~", // F Bbmaj7
  I: "[f4,bb4,d5]@2 ~@2 [f4,bb4,d5]@3 ~ c5 ~ a4 ~ [f4,bb4,d5]@3 ~ [f4,bb4]@4 c5@2 a4 ~, ~@8 d5 ~@3", // Bb Bb5
  J: "[g4,c5,e5]@2 ~@2 [g4,c5,e5]@3 ~ c5@2 b4@2 ~ d5@2 e5@2 d5@2 db5@2 ~ c5@2, ~@6 c5 ~@5", // C
  K: "~ f5 gb5 a5 c6 b5 bb5 a5 ab5 g5 gb5 f5", L: "e5 eb5 d5 db5 c5 b4 bb4 a4 ab4 g4 gb4 f4", M: "f4@5 ~@3",
})).s("gm_acoustic_guitar_nylon").gain(0.6).pan(0.2)

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!112 ~@8>").gain(0.5)

// drums · snare
const snare = s("sd").struct("<[~@3 x]!27 [~@8 x!2 ~@2] [~@3 x]!84 ~@8>").gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<[x!5 ~ x!5 ~]!112 ~@8>").gain(0.25)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<[~@5 x ~@5 x]!112 ~@8>").gain(0.15)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  A@3 B A@3 B A@3 C D A@6 C A@11 C A@3 B A@7 E A@7 B A@7 B A@3 B A@3 F A@3 B A@7 E A@3 B A@3 C A@3 B A@3 F A@3 B A@3 C
  A@3 B A@2 C F ~@8
>`.pickRestart({
  A: "~@2 x ~@2 x ~@5 x", B: "~@2 x ~@2 x ~@2 x ~@2 x", C: "~@2 x ~@2 x ~ x!2 ~@2 x", D: "~ x!2 ~@2 x ~@5 x",
  E: "~@2 x ~@2 x ~ x!2 ~ x!2", F: "~ x!2 ~@2 x ~ x!2 ~ x!2",
})).gain(0.4)

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

stack(
  bass, drawbar_organ, rock_organ, string_ensemble_1, celesta, acoustic_guitar_nylon, clap, snare, hihat, hihat_soft,
  low_tom, mid_tom, crash
)