Strudelify

Swamp Thing

Spyro Gyra

KeyA majorTempo132 bpm
0:00/0:00
// Swamp Thing — Spyro Gyra
// 132 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 70 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(132/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.

// other · banjo
const banjo = note("<~@4 A B C D A E C D A F C D G H I J K L M N O P Q R S ~@11 T F C D ~@23 U@2 ~>".pickRestart({
  A: "e4@2 e4!4 a3@2 e4!4 e4@2 a3!2", B: "e4@2 e4!4 a3@2 e4!4 e4@2 e4!2", C: "e4 ~ e4!4 a3@2 e4!5 a3!3",
  D: "e4 e4@2 e4!9 ~@2 e4 ~", E: "e4 ~ e4!10 e4@4", F: "e4@2 e4!4 a3@2 e4!4 e4@4",
  G: "e4!2 a3 e4!2 a3 e4!3 a3 e4 a3 e4 ~ a3 ~", H: "e4!2 a3@2 e4 ~ e4 ~ e4 ~ e4 ~ e4@2 a3@2",
  I: "e4 ~ e4@2 e4 ~ e4 ~ e4 ~ e4 ~ a3 ~@3", J: "e4 ~ a3 e4 ~ a3 e4 ~ e4 ~ e4 ~ a3@2 e3@2",
  K: "e4!2 a3 e4!2 ~ e4!2 a3 e4!2 a3 e4!2 a3!2", L: "c5 a3 e4 a3 e4 a3 e4!2 a3 e4@2 a3 e4!2 a3@2",
  M: "c5 e4 a3 e4!2 ~ e4!2 a3 e4!2 a3 e4!2 a3!2", N: "e4 ~ a3 e4!2 a3 e4 a3 e4!2 a3@2 a3 ~ e3!2",
  O: "a4@2 e4@2 a3@2 ~ a3 ~ e4 ~ a3 a3@2 e3 ~", P: "~ a3 ~ a3 e4 ~ a3 e4!2 a3 a4 e4!2 a4 ~@2",
  Q: "e4@2 e4!2 e4@2 e4@2 a3@2 ~ a3!2 ~ e3 ~", R: "e4 a3 e4!2 a3@2 a3 ~ a3!3 ~ a3@2 e3 ~", S: "e3!2 ~@6",
  T: "e4@2 e4!4 a3@2 e4!4 e4@2 a3 ~", U: "[~@9 g3@2 ~@5, ~@7 g3@2 ~@7, ~@15 b3@4 ~@13, ~@4 a3 ~@3]/2",
})).s("gm_banjo").gain(0.22)

// other · banjo · soft notes
const banjo_soft = note("<~@17 A B C D ~ D E ~@4 F ~@39 G ~>".pickRestart({
  A: "~@5 a3 ~ e4 ~ a3 ~ a3 ~@4", B: "~ e4 ~@3 a3 ~ e4 ~ a3 ~ a3 ~@4", C: "~ e4 ~@5 e4 ~ a3 ~ e4 ~@4", D: "~@5 a3 ~@10",
  E: "~ e4 ~@11 a3 ~@2", F: "~@2 e3 e3@3 ~@2", G: "~@3 a3, ~@3 b3@3 g3@4 g3@4 ~@2, ~@4 a3@3 b3@4 b3@4 ~, ~@2 a3 ~",
})).s("gm_banjo").gain(0.13)

// bass · synth bass 1 · "SYN BASS 1"
const bass = note(`<
  A B@2 C D ~@11 E@3 F E@3 F E@3 G E@3 F E@3 F E@3 F E@3 F H I@3 J ~@11 E@3 F E@3 K ~@2
>`.pickRestart({
  A: "~@2 a1@2 a1!2 g1 a1 g1 a1!2 g1 a1!2 g1 a1", B: "g1 a1!2 g1 a1!2 g1 a1 g1 a1!2 g1 a1!2 g1 a1",
  C: "g1 a1!2 g1 a1!2 g1 a1 g1 a1!2 g1 a1!2 g1 e1", D: "a1@3 ~@13",
  E: "e2 [e2,b2] [a2,e3] [e2,b2] e2 [e2,b2] [a2,e3] [e2,b2] e2 [e2,b2] [a2,e3] [e2,b2] e2 [e2,b2] [a2,e3] [e2,b2]", // E5 A5 E5 A5 E5 A5 E5 A5 …
  F: "d2 [d2,a2] [g2,d3] [d2,a2] d2 [d2,a2] [g2,d3] [d2,a2] d2 [d2,a2] [g2,d3] [d2,a2] d2 [d2,a2] [g2,d3] [d2,a2]", // D5 G5 D5 G5 D5 G5 D5 G5 …
  G: "d2 [d2,a2] [g2,d3] [d2,a2] d2 [d2,a2] [g2,d3] [d2,a2] d2 [d2,a2] [g2,d3] [d2,a2] d2 [d2,a2] [g2,d3] [e2,b2]", // D5 G5 D5 G5 D5 G5 D5 G5 …
  H: "e1@2 f#1@2 f#1!2 e1 f#1 e1 f#1!2 e1 f#1!2 e1 f#1", I: "e1 f#1!2 e1 f#1!2 e1 f#1 e1 f#1!2 e1 f#1!2 e1 f#1",
  J: "a1", K: "g1@3 ~@13",
})).s("gm_synth_bass_1").gain(0.27)

// chords · ocarina
const ocarina = note("<~@28 A ~@3 A ~ A ~ A ~ A ~@31>".pickRestart({
  A: "[a3,c4,e4,a4,b4] ~", // Am
})).s("gm_ocarina").gain(0.02)

// other · pad new age · "FANTASIA"
const pad_new_age = note("<~@28 [~@6 a4!2] [a4!2 ~@6] ~@40>").s("gm_pad_new_age").gain(0.46).pan(1)

// chords · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  ~@8 A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B C ~@7 A@3 B ~@8 A@3 B A@3 B A@3 B A@3 D ~@2
>`.pickRestart({
  A: "[a2,e3] ~@5 [a2,e3] ~@3 [a2,e3] ~@5", B: "[g2,d3] ~@5 [g2,d3] ~@3 [g2,d3] ~@5", C: "[a2,e3] ~@15",
  D: "[g2,d3] ~@15", // G5
})).s("gm_lead_2_sawtooth").gain(0.12).pan(0)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth_2 = note(`<
  ~@32
  [a5 d6 a5 c6 g5 b5 e5 e6]!3
  [g5 d6 a5 c6 g5 b5 e5 e6]
  [a5 d6 a5 c6 g5 b5 e5 e6]!3
  [g5 d6 a5 c6 g5 b5 e5 e6]
  ~@30
>`).s("gm_lead_2_sawtooth").gain(0.2).pan(0.4)

// bass · synth bass 1 · "SYN BASS 1"
const bass_2 = note("<A B@2 C D ~@25 E ~ F ~ F ~ G ~ E ~@5 H@4 I ~@21>".pickRestart({
  A: "g1@2 a1@2 a1!2 g1 a1 g1 a1!2 g1 a1!2 g1 a1", B: "g1 a1!2 g1 a1!2 g1 a1 g1 a1!2 g1 a1!2 g1 a1",
  C: "g1 a1!2 g1 a1!2 g1 a1 g1 a1!2 g1 a1!2 g1 e1", D: "a1 ~@7", E: "a1@6 a1@5 ~@5", F: "a1@3 a1@2 ~@3",
  G: "a1@6 a1@3 ~@7", H: "e1 f#1!2 e1 f#1!2 e1 f#1 e1 f#1!2 e1 f#1!2 e1 f#1", I: "a1@3 ~@13",
})).s("gm_synth_bass_1").gain(0.16)

// other · distortion guitar · "DISTORTION"
const distortion_guitar = note(`<
  ~@8 A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B C ~@7 A@3 B C ~@7 A@3 B A@3 B A@3 B A@3 D ~@2
>`.pickRestart({
  A: "a2 ~@5 a2 ~@3 a2 ~@5", B: "g2 ~@5 g2 ~@3 g2 ~@5", C: "a2 ~@15", D: "g2 ~@15",
})).s("gm_distortion_guitar").gain(0.47).pan(0.4)

// other · synth drum
const synth_drum = note("<~@30 A B C D ~ E F G ~ H ~@30>".pickRestart({
  A: "~@15 a3", B: "g3 a3 e3 g3 a3 e3 g3 a3 c4 a3 c4 d4 a3 ~ g3 a3", C: "~@15 e3",
  D: "g3 a3 e3 ~ g3 a3 ~ c4 d4 a3 c4 d4 a3 g3 a3 c4", E: "a3 c4 ~ g3 a3 d4 ~ a3 e4 g4 d4 ~ d4 ~ c4 a3", F: "~@15 c4",
  G: "d4 a3 g3 a3 c4 d4 ~ a3 d4 e4 g4 ~ d4 c4 a3 g3", H: "a3 g3 e3 c4 ~ a3 g3 d4 ~ c4 a3 e4 ~ c4 a3 g3",
})).s("gm_synth_drum").gain(0.26)

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

// drums · clap
const clap = s("cp").struct("<~@8 A B A B A B A C ~@36 D E@2 F D E@2 C ~@10>".pickRestart({
  A: "x!3 ~ x!3 ~", B: "x!3 ~ x!4", C: "x", D: "x ~@2 x ~@2 x ~", E: "x ~@2 x ~ x!2 ~", F: "x ~ x!2 ~ x!2 ~",
})).gain(0.24)

// drums · clap · soft notes
const clap_soft = s("cp").struct("<~@52 A B C D A B C ~@11>".pickRestart({
  A: "~ x!2 ~ x!2 ~@2", B: "~ x!2 ~ x ~@2 x", C: "~ x!2 ~ x ~@3", D: "~ x ~@2 x ~@2 x",
})).gain(0.12)

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

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

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@43 [~@11 x!2 ~ x!2] ~@26>").gain(0.32)

// drums · open hat
const open_hat = s("oh").struct("<A@4 ~@8 A@3 ~ A@32 ~@8 A@3 ~ A@7 ~@3>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(0.28)

// drums · high tom
const high_tom = s("ht").struct("<~@4 x ~@38 [~@11 x ~@4] ~@26>").gain(0.4)

// drums · ride
const ride = s("rd").struct("<[~ x ~ x ~ x ~ x]!4 ~@40 [~ x ~ x ~ x ~ x]!4 ~@22>").gain(0.4)

// drums · china
const china = s("cr").struct("<~@4 x ~@10 x ~@32 x ~@21>").gain(0.24)

// drums · congas
const congas = s("conga:18").struct("<~@14 [~@15 x] ~@43 [~@15 x] ~@11>").gain(0.77)

// drums · triangle
const triangle = s("triangles:30").struct("<[~@9 x ~@6]!4 ~@8 [~@9 x ~@6]!3 ~ [~@9 x ~@6]!32 ~@12 [~@9 x ~@6]!7 ~@3>")
  .gain(1.75)

// drums · triangle
const triangle_2 = s("triangles:35").struct("<[~@5 x!2 ~]!4 ~@8 [~@5 x!2 ~]!3 ~ [~@5 x!2 ~]!32 ~@12 [~@5 x!2 ~]!7 ~@3>")
  .gain(1.75)

// drums · shaker
const shaker = s("sh").struct("<~@16 [x!16]!32 ~@12 [x!16]!7 ~@3>").gain(0.2)

stack(
  banjo, banjo_soft, bass, ocarina, pad_new_age, lead_2_sawtooth, lead_2_sawtooth_2, bass_2, distortion_guitar,
  synth_drum, kick, clap, clap_soft, snare, hihat, low_tom, mid_tom, open_hat, high_tom, ride, china, congas, triangle,
  triangle_2, shaker
)

More by Spyro Gyra