Strudelify
Holy Lamb (Song for Harmonic Convergence) cover art

1987 · Big Generator

Holy Lamb (Song for Harmonic Convergence)

Yes

KeyF♯ majorTempo76 bpm
0:00/0:00
// Holy Lamb (Song for Harmonic Convergence) — Yes
// 76 bpm, 4/4, key F# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (2/4 at bar 1, 4/4 at bar 2) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 12 ocarina (copy of ch 7 ocarina, 0.313 beats late)
// note: Full arrangement: all 65 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(76/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/2 spreads a riff over 2 bars.
// A part's distinct bars are riffs (A, B, C...) played in order, A@4 for four bars: edit a riff to change every repeat.

// other · pad metallic
const pad_metallic = note("<~@9 A B@2 C ~ D@2 E F G H@2 I J ~@33 K@2 ~@3 L M@2 ~>".pickRestart({
  A: "~ a#4@14 ~", B: "[~@2 a#3@19 ~@11]/2", C: "[a#3,d#4]", D: "[g#5@15 ~]/2", E: "b5@15 ~", F: "a#5@15 ~",
  G: "~@3 [f4,g#4]", H: "[[f#4,a#4]@4 g#5@11 ~]/2", I: "f#5@15 ~", J: "f5@7 ~", K: "[a2@29 ~@3]/2", L: "f#4",
  M: "[f4@7 ~]/2",
})).s("gm_pad_metallic").gain(0.34)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  ~@26 A@2 B@2 C@2 D@2 E@2 F@2 G@2 H@2 E@2 F@2 G@2 H@2 E@2 F@2 G@2 H@2 E@2 F@2 G@2 H
>`.pickRestart({
  A: "f#3!4 ~ f#3!6 ~@5", B: "d#3!4 ~ d#3!6 ~@5", C: "c#3!4 ~ c#3!6 ~@5", D: "b2!4 ~ b2!6 ~@5",
  E: "[c#3,f#3]!4 ~ [c#3,f#3]!2 ~ [c#3,f#3]!3 ~@5", F: "[a#2,d#3]!4 ~ [a#2,d#3]!2 ~ [a#2,d#3]!3 ~@5",
  G: "[g#2,c#3]!4 ~ [g#2,c#3]!2 ~ [g#2,c#3]!3 ~@5", H: "[f#2,b2]!4 ~ [f#2,b2]!2 ~ [f#2,b2]!3 ~@5",
})).s("gm_overdriven_guitar").gain(0.25).pan(0.4)

// bass · synth bass 2
const bass = note(`<
  ~@18 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D E F@2 G@2 H@2 I J K F G@2 H@2 I L K F G@2 H@2 M N K F G@2 H@2 M
>`.pickRestart({
  A: "f#1 ~ f#2!2 f#1 f#2!2 f#1 f#2!2 f#1 ~@5", B: "d#1 ~ d#2!2 d#1 d#2!2 d#1 d#2!2 d#1 ~@5",
  C: "c#1 ~ c#2!2 c#1 c#2!2 c#1 c#2!2 c#1 ~@5", D: "b0 ~ b1!2 b0 b1!2 b0 b1!2 b0 ~@5",
  E: "b0 ~ b1!2 b0 b1!2 b0 b1!2 b0 ~ [f#1,f#2]@4", F: "f#1@3 f#1 f#1@2 ~@2", G: "d#1@3 d#1 d#1@2 ~@2",
  H: "c#1@5 ~ c#1@2 c#1@4 ~@4", I: "b0@5 ~ b0@2 b0@4 ~@4", J: "b0 c#1 d#1 ~", K: "f#1 f#1@2 f#1 f#1@2 ~@2",
  L: "b0@3 b0 b0@2 b0@2", M: "b0 c#1 d#1 f1", N: "f#1 g#1 a#1 b1",
})).s("gm_synth_bass_2").gain(0.45).pan(0.6)

// other · music box
const music_box = note(`<
  ~@23
  [~@6 c#5 ~ c#5 d#5 ~@2 c#5 ~@3]
  ~
  [~@4 b5 ~@11]
  ~@24
  [g#6 f#6 c#6 a#6 f#6 c#6 b6 f#6 c#6 a#6 f#6 c#6 g#6 f#6 c#6 f#6]!14
  [g#6 f#6 c#6 a#6 f#6 c#6 b6 f#6 c#6 a#6 f#6 c#6 g#6 ~@3]
>`).s("gm_music_box").gain(0.22).pan(0.6)

// other · music box · soft notes
const music_box_soft = note(`<
  ~@22
  [~@11 g#5 d#6 g#5 b5 ~]
  [d#6 g#5 b5 c#6 ~@2 f#6 ~@2 g#6 ~@2 f#6 ~ b5 d#6]
  [b5 d#6 f#5 b5 ~@2 b5 ~ f#5 f#6 d#6 ~ b5 ~@2 d#6]
  [b5 f#5 ~@3 d#6 ~@4 b5 d#6 ~@4]
  ~@39
>`).s("gm_music_box").gain(0.1).pan(0.6)

// chords · acoustic guitar steel · D#m C# B5 D#m C# B5
const acoustic_guitar_steel = note(`<
  [~ [a#3,f#4]@2 [a#3,f#4] [a#3,f#4]@2 [a#3,f#4]!3 [a#3,f#4]@2 [a#3,f#4]@5]!6
  [~ [g#3,f4]@2 [g#3,f4] [g#3,f4]@2 [g#3,f4]!3 [g#3,f4]@2 [g#3,f4]@5]!2
  [~ [b3,f#4]@2 [b3,f#4] [b3,f#4]@2 [b3,f#4]!3 [b3,f#4]@2 [b3,f#4]@5]!2
  [~ [a#3,f#4]@2 [a#3,f#4] [a#3,f#4]@2 [a#3,f#4]!3 [a#3,f#4]@2 [a#3,f#4]@5]!4
  [~ [g#3,f4]@2 [g#3,f4] [g#3,f4]@2 [g#3,f4]!3 [g#3,f4]@2 [g#3,f4]@5]!2
  [~ [b3,f#4]@2 [b3,f#4] [b3,f#4]@2 [b3,f#4]!3 [b3,f#4]@2 [b3,f#4]@5]!2
  ~@47
>`).s("gm_acoustic_guitar_steel").gain(0.07).pan(0.4)

// chords · acoustic guitar steel
const acoustic_guitar_steel_2 = note(`<
  A@4 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 E@2 D@2 A@2 B@2 E@2 D@2 A@2 B@2 E@2 D@2 A@2 B@2 E@2 D@2 ~@15
>`.pickRestart({
  A: "[f#2,a#2,c#3,f#3,a#3,f#4]@2 [f#2,a#2,c#3,f#3,a#3,f#4] [f#2,a#2,c#3,f#3,a#3,f#4]@2 [f#2,a#2,c#3,f#3,a#3,f#4]!3 [f#2,a#2,c#3,f#3,a#3,f#4]@2 [f#2,a#2,c#3,f#3,a#3,f#4]@6", // F#
  B: "[f#2,a#2,d#3,f#3,a#3,f#4]@2 [f#2,a#2,d#3,f#3,a#3,f#4] [f#2,a#2,d#3,f#3,a#3,f#4]@2 [f#2,a#2,d#3,f#3,a#3,f#4]!3 [f#2,a#2,d#3,f#3,a#3,f#4]@2 [f#2,a#2,d#3,f#3,a#3,f#4]@6", // D#m
  C: "[g#2,c#3,f3,g#3,f4]@2 [g#2,c#3,f3,g#3,f4] [g#2,c#3,f3,g#3,f4]@2 [g#2,c#3,f3,g#3,f4]!3 [g#2,c#3,f3,g#3,f4]@2 [g#2,c#3,f3,g#3,f4]@6", // C#
  D: "[f#2,b2,d#3,f#3,b3,f#4]@2 [f#2,b2,d#3,f#3,b3,f#4] [f#2,b2,d#3,f#3,b3,f#4]@2 [f#2,b2,d#3,f#3,b3,f#4]!3 [f#2,b2,d#3,f#3,b3,f#4]@2 [f#2,b2,d#3,f#3,b3,f#4]@6", // B
  E: "[f2,g#2,c#3,f3,g#3,f4]@2 [f2,g#2,c#3,f3,g#3,f4] [f2,g#2,c#3,f3,g#3,f4]@2 [f2,g#2,c#3,f3,g#3,f4]!3 [f2,g#2,c#3,f3,g#3,f4]@2 [f2,g#2,c#3,f3,g#3,f4]@6", // C#
})).s("gm_acoustic_guitar_steel").gain(0.24).pan(0.6)

// chords · acoustic guitar nylon · F#5
const acoustic_guitar_nylon = note("<~@20 [~@2 [c#4,f#4]!14] [[c#4,f#4]!5 ~@11] ~@43>")
  .s("gm_acoustic_guitar_nylon").gain(0.24)

// other · pizzicato strings
const pizzicato_strings = note("<~@18 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 ~@31>".pickRestart({
  A: "f#4 ~ f#5!2 f#4 f#5!2 f#4 f#5!2 f#4 ~@5", B: "d#4 ~ d#5!2 d#4 d#5!2 d#4 d#5!2 d#4 ~@5",
  C: "c#4 ~ c#5!2 c#4 c#5!2 c#4 c#5!2 c#4 ~@5", D: "b3 ~ b4!2 b3 b4!2 b3 b4!2 b3 ~@5",
})).s("gm_pizzicato_strings").gain(0.27)

// chords · drawbar organ · F# C#sus4 D#m D#sus2 D#m G#7 C# C#sus2 …
const drawbar_organ = note(`<
  ~@34
  [[c#5,f#5,a#5]@3 [c#5,f#5,g#5]]!2
  [[d#5,f#5,a#5]@3 [d#5,f5,a#5]]
  [[d#5,f#5,a#5]@3 [d#5,f#5,g#5]]
  [[c#5,f5,g#5]@3 [c#5,d#5,g#5]]!2
  [[b4,d#5,f#5]@7 [b4,c#5,f#5]]
  [[b4,d#5,f#5]]
  ~@23
>`).s("gm_drawbar_organ").gain(0.1)

// chords · synth strings 1
const synth_strings_1 = note("<~@42 A@2 B C D@2 E F A@2 B C D@2 E F A@2 B C D@2 G>".pickRestart({
  A: "[c#4,f#4,a#4]@12 [c#4,f#4,g#4]@3 ~", B: "[d#4,f#4,a#4]@11 ~ [d#4,f4,a#4]@3 ~",
  C: "[d#4,f#4,a#4]@11 ~ [d#4,f#4,g#4]@3 ~", D: "[c#4,f4,g#4]@11 ~ [c#4,d#4,g#4]@4", E: "[b3,d#4,f#4]@7 [b3,c#4,f#4]",
  F: "[b3,d#4,f#4]", G: "[b3,d#4,f#4]@7 ~",
})).s("gm_synth_strings_1").gain(0.12)

// drums · snare
const snare = s("sd").struct("<~@32 [~@9 x!7] [x!16] [x!2 ~ x] [~ x ~ x]!22 [x!2 ~ x] [~ x ~ x]!6 [~ x ~@2]>")
  .gain(0.11)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@31 [~@12 x!4] [x!9 ~@7] ~@32>").gain(0.08)

// drums · low tom
const low_tom = s("lt").struct("<~@26 A ~ B ~ A C ~@2 D@31>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~ x", D: "x ~@5 x ~ x!2 ~@6",
})).gain(0.34)

// drums · splash
const splash = s("cr").struct("<~@34 [x!8]!30 [x!6 ~@2]>").gain(0.26)

stack(
  pad_metallic, overdriven_guitar, bass, music_box, music_box_soft, acoustic_guitar_steel, acoustic_guitar_steel_2,
  acoustic_guitar_nylon, pizzicato_strings, drawbar_organ, synth_strings_1, snare, snare_soft, low_tom, splash
)

More by Yes