Strudelify

Phenomena

Goblin

KeyC minorTempo120 bpm
0:00/0:00
// Phenomena — Goblin
// 120 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 117 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 · "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 · slap bass 1 · "SlapBass"
const bass = note(`<
  ~@48 A B C D A B C D E F E G E F E G H I H J K L H M E F E G E F E G H I H J K L H M ~@8 E F E G E F E G E F E G ~@9
>`.pickRestart({
  A: "c2", B: "g1@7 ~", C: "c2@15 ~", D: "g2", E: "c2@2 ~ c2 d2@2 ~ eb2 ~ eb2 ~ c2 g2@3 ~",
  F: "g1@2 ~ g1 a1@3 bb1 ~ bb1 ~ g1 d2@2 g1 ~", G: "g1@2 ~ g1 a1@2 ~ bb1 ~ bb1 ~ g1 d2@2 g1@2",
  H: "db2@2 ~ db2 db2@2 ~@2 db2@2 ~ db2 db2@2 ~@2", I: "g2@2 ~ g2 g2@3 ~ g2@2 ~ g2 g2@2 ~@2",
  J: "bb2@2 ~ bb2 bb2@2 ~@2 bb2@2 ~ bb2 bb2@3 ~", K: "db2@2 ~ db2 db2@3 ~ db2@2 ~ db2 db2@3 ~",
  L: "g2@2 ~ g2 g2@2 ~@2 g2@2 ~ g2 g2@2 ~@2", M: "bb2 ~@3 bb2@2 ~@3 bb2!7",
})).s("gm_slap_bass_1").gain(0.52).pan(0.4)

// chords · brass section · "Brass01"
const brass_section = note("<~@65 A ~ B ~ C ~ D ~@9 A ~ B ~ C ~ D ~@29>".pickRestart({
  A: "[d4,g4]!2 ~ [d4,g4]@2 [d4,g4]!2 ~ [d4,g4]!2 ~ g4@2 [d4,g4]!3, ~@11 d4 ~@4", // G5
  B: "[g4,bb4]!2 ~ bb4@2 [g4,bb4]!2 ~ [g4,bb4]!2 ~ bb4@2 [g4,bb4]!3, ~@3 g4 ~@7 g4 ~@4", // Gm
  C: "[d4,g4]!2 ~ [d4,g4] ~ [d4,g4]!2 ~ [d4,g4]!2 ~ g4@2 [d4,g4]!3, ~@11 d4 ~@4", // G5
  D: "[g4,bb4] ~@3 [g4,bb4] ~@4 [g4,bb4]!3 [g4,bb4]@2 ~@2", // Gm
})).s("gm_brass_section").gain(0.57).pan(0.2)

// other · piano · "Piano03"
const piano = note(`<
  A@2 B C A@2 B C D@2 E@2 D@2 E@2 A@2 F@2 A@2 B C A@2 B C D@2 E@2 D@2 E@2 A@2 F@2 ~@77
>`.pickRestart({
  A: "c5 g5 c6 c5 g5 c6 g5 c6", B: "g4 d5 g5 g4 d5 g5 ab4 g5", C: "g4 d5 g5 ab4 d5 g5 g4 g5",
  D: "ab4 eb5 ab5 ab4 eb5 ab5 ab4 ab5", E: "bb4 f5 bb5 bb4 f5 bb5 bb4 bb5", F: "g5 c6 g5 c6 g5 c6 g5 c6",
})).s("gm_piano").gain(0.36).pan(0.7)

// other · piano · "Piano01"
const piano_2 = note("<~@20 A@2 B C A@2 B D E@2 F G E@2 F H I@2 ~@49 J ~@29>".pickRestart({
  A: "[c4@26 ~@2 c4@3 ~]/2", B: "g3@10 ~@2 ab3@3 ~", C: "g3@5 ~ ab3@2 ~@2 ab3 ~ g3@4",
  D: "g3@5 ~ ab3@2 ~@2 ab3@2 g3@3 ~", E: "[ab3@14 ~ ab3]/2", F: "bb3@15 ~", G: "d4@10 bb3@2 d4@3 ~", H: "d4@5 bb3 d4@2",
  I: "c4/2", J: "[bb3,bb4] ~@3 [bb3,bb4] ~@4 [bb3,bb4]!4 ~@3",
})).s("gm_piano").gain(0.2).pan(0.2)

// other · orchestra hit · "OrchHit"
const orchestra_hit = note("<~@52 A B C B ~@31 D E@4 ~@16 F@2 G H I F@2 ~ J>".pickRestart({
  A: "[c3,c5]@3 ~@11 [c4,c6] ~, [g2,g4] ~@15", B: "[g3,g5]@3 ~@11 [g2,g4] ~", C: "[c3,c5]@3 ~@11 [c4,c6] ~",
  D: "[bb3,bb4] ~@3 [bb3,bb4] ~@4 [bb3,bb4]!3 [bb3,bb4]@2 ~@2", E: "[c2,c3]/4", F: "[c3,c4,c5] ~@7",
  G: "[c3,c4,c5]@2 ~@4 [c3,c4,c5] ~ [c3,c4,c5]@2 ~@6", H: "[c3,c4,c5] ~@7 [c3,c4,c5] ~ [c3,c4,c5] ~@5",
  I: "[c3,c4,c5]@3 ~@13", J: "[c3,c4,c5]@2 ~@4 [c3,c4,c5] ~ [c3,c4,c5]@3 ~@5",
})).s("gm_orchestra_hit").gain(0.56).pan(0.2)

// other · overdriven guitar · "Overdrive"
const overdriven_guitar = note("<~@94 A@2 B C D E@2 F G H G I G H ~@9>".pickRestart({
  A: "[~@2 c6@6 b5 bb5@2 a5@2 ab5@2 g5@2 gb5@2 f5@2 e5@2 eb5@2 d5@2 db5@2 d5 db5 b4]/2", B: "c5@4 g5@2 ~ g5, g4@5 ~@11",
  C: "~ g5 ~ bb5@2 g5 bb5 c6 ~ c6 bb5 g5 bb5 c6 eb6 [d4,c6], d4@5 ~@11", // D7
  D: "~ c6 eb6 c6 f6 eb6 c6 eb6 f6 eb6 c6 bb5!2 g5 bb5 [eb4,c6], eb4@5 ~@11", // Cm
  E: "[~ c6 bb5 g5 ~ gb5 g5 bb5 ~ g5 gb5 g5 ~@4 c5@12 eb5@4, d4@6 ~@7 g5@3 ~@16, ~@7 d4@2 ~@7]/2",
  F: "d5@4 g4@5 g4 ~ g4 gb4 g4 gb4 g4", G: "c5@3 eb5", H: "d5@4 g5@11 ~", I: "d5@4 g4@4 ~ g4 ~ g4 gb4 g4 gb4 g4",
})).s("gm_overdriven_guitar").gain(0.46).pan(0.9)

// other · timpani
const timpani = note("<~@19 A B ~@18 C D ~@6 C D ~@67 E>".pickRestart({
  A: "g2!14 [g2,ab2] [a2,bb2]", B: "c3 ~@3, b2 ~@15", C: "[g2,a7]!14 [g2,ab2,a7] [a2,bb2,a7]",
  D: "[b2,a7] ~@15, c3 ~@3", E: "c-1 ~@5 c-1 ~ c-1 ~@7",
})).s("gm_timpani").gain(0.36).pan(0.9)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@41 A ~ B ~ A ~@19 C ~ C ~ C ~ D ~@9 C ~ C ~ C ~ D ~@3 E ~@3 B ~@3 B ~@7 E F G F G F G ~@3
>`.pickRestart({
  A: "~@7 x", B: "~@9 x ~ x!3 ~ x", C: "x!2 ~ x ~@4 x!2 ~@2 x!2 ~ x", D: "x ~@3 x ~@4 x!2 ~ x!2 ~ x",
  E: "x ~@2 x ~@2 x ~@2 x ~ x!3 ~ x", F: "~ x!2 ~ x!2 ~ x ~ x!5 ~ x", G: "~ x!2 ~ x!2 ~ x ~ x!2 ~ x!4",
})).gain(0.42)

// drums · hihat
const hihat = s("hh").struct("<~@48 [x!4]!8 ~@61>").gain(0.42)

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

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

// drums · crash
const crash = s("cr").struct("<x ~@19 x ~@19 x ~@3 x ~@72>").gain(0.42)

stack(
  bass, brass_section, piano, piano_2, orchestra_hit, overdriven_guitar, timpani, kick, snare, low_tom, hihat, mid_tom,
  open_hat, crash
)