Strudelify
Hymn cover art
KeyE majorTempo66 bpm
0:00/0:00
// Hymn — Barclay James Harvest
// 66 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 87 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 25.
setcpm(66/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, A@4 for four bars: edit a riff to change every repeat.

// bass · fretless bass
const bass = note(`<
  ~@7 A@2 B C D E@2 F@2 G F H F I J K@2 ~@4 L@2 M N M F O I P Q M@2 L@2 M R M F O S T Q M@2 U@2 V W@2 X W Y Z AA U W U@2
  V W@2 X W Y Z AA U W V X AB W@3 U@2 V L ~
>`.pickRestart({
  A: "[~ e1@5 e1@2]/2", B: "e2 e1", C: "e3 e2@2 e2", D: "e1@7 e1", E: "[e2@15 ~]/2", F: "e1 e2",
  G: "~@2 e2@2 e1!2 e2@2, e1@3 ~@5", H: "e1@4 e2 e1 e2!2", I: "e1@4 e2@3 e2", J: "e1@2 e2@2 e1@2 e2!2",
  K: "[e1@3 ~ e2@12]/2", L: "e1", M: "e1@3 e1 e2@4", N: "e1@3 e1 e2@3 e2", O: "e1@3 e2 e2@3 e2", P: "e2@3 ~ e2@3 e1",
  Q: "e2@3 e2 e2@4", R: "e1@6 e1 ~ e2@6 e2@2", S: "e1@3 ~ e2@3 e2", T: "e2@3 ~ e1@3 e1", U: "e1@5 ~ e1@2 e1@7 ~",
  V: "e1@5 ~ e1@2 e2@5 ~ e2@2", W: "e1@5 ~ e1@2 e1@5 ~ e1@2", X: "e2@5 ~ e2@2 e1@5 ~ e1@2", Y: "e1@5 ~ e1@2 e2@7 ~",
  Z: "e1@7 ~", AA: "e2@7 ~", AB: "e1@5 ~ e1@2 e1@4 ~@2 e1@2",
})).s("gm_fretless_bass").gain(0.36)

// chords · string ensemble 2
const string_ensemble_2 = note(`<
  A B@3 C D E F C D E F G@2 H@2 C D E F C D E F G@2 H@2 C D E F C D E C G@2 I@8 E C G@2 J@8 E C G@2 J@8 E C G@2 K@10 L@3
>`.pickRestart({
  A: "[g#3,g#4] [a3,a4]", B: "[[g#3,g#4] [a3,a4] [g#3,g#4] [a3,a4] [g#3,g#4] [a3,a4], b3]/3", C: "[g#3,b3,g#4]",
  D: "[a3,c#4,a4] [g#3,b3,g#4]", E: "[a3,c#4,a4]", F: "[g#3,g#4] [a3,a4], b3", G: "[a3,c#4,a4]/2",
  H: "[[g#3,g#4] [a3,a4] [g#3,g#4] [a3,a4], b3]/2", // G# A G# A
  I: "[[g#3,g#4] [a3,a4] [g#3,g#4] [a3,a4] [g#3,b3,g#4]@2 [a3,c#4,a4] [g#3,b3,g#4] [a3,c#4,a4]@2 [g#3,b3,g#4] [a3,a4] [g#3,b3,g#4]@2 [a3,c#4,a4] [g#3,b3,g#4], e5, b3 ~@3]/8", // G# A G# A G#m A G#m A …
  J: "[[g#3,g#4] [a3,a4] [g#3,g#4] [a3,a4] [g#3,b3,g#4]@2 [a3,c#4,a4] [g#3,b3,g#4] [a3,c#4,a4]@2 [g#3,g#4] [a3,a4] [g#3,b3,g#4]@2 [a3,c#4,a4] [g#3,b3,g#4], e5, b3@2 ~@3 b3 ~@2]/8", // G# A G# A G#m A G#m A …
  K: "[[g#3,g#4] [a3,a4] [g#3,g#4] [a3,a4], [b3,e5]]/2", L: "[[g#3,g#4]@2 [a3,a4]@2 [g#3,g#4]@5 ~@3, [b3,e5]@2 ~]/3",
})).s("gm_string_ensemble_2").gain(0.16)

// other · electric guitar jazz
const electric_guitar_jazz = note(`<
  ~@4 A@2 B@2 C D E F G H I ~ J K L M N O P Q R S T ~ U V W@2 X V Y Z AA@3 ~ U AB AC M AD O AE@2 AF@2 T ~ AG@2 AH@2 AI
  AJ AK AL AM AN AO ~ AP@2 AQ@2 AR AS AT AU AV AW T ~@12
>`.pickRestart({
  A: "[~@4 b3!2 b3@6 ~ b3!2 c#4@3 b3@2 a3@2 b3@6 ~ g#3 g#3@2]/2",
  B: "[a3 g#3 a3@2 a3 g#3 a3 g#3 a3 a3@2 g#3 a3 g#3 e3@10 ~@8]/2", C: "~@3 b3 b3@2 b3@2 b3@3 ~ b3 b3@3",
  D: "c#4@2 b3@2 a3@2 b3@8 g#3 ~", E: "a3@2 g#3 a3@3 g#3 a3@3 b3 ~ c#4@2 b3@2", F: "b3 a3 g#3@12 g#3@2",
  G: "a3@2 g#3 a3@3 a3 g#3 a3 g#3 e3@6", H: "~@9 g#3 a3 g#3 a3@2 a3@2", I: "a3 g#3 e3@12 ~@2",
  J: "~@3 b3!2 b3@2 ~ b3@6 b3 ~", K: "c#4 b3 a3 b3@4 ~", L: "a3@2 a3 a3@3 a3 a3@3 a3 a3@2 g#3@2 ~", M: "g#3@9 ~@7",
  N: "~@3 b3!2 b3@2 ~ b3@5 ~ b3@2", O: "c#4@2 b3@2 a3@2 b3@8 ~ g#3", P: "a3@2 a3 a3@3 a3 a3@3 b3 c#4@3 b3@2",
  Q: "b3 a3 g#3@11 ~@3", R: "a3@2 a3 a3@2 ~ a3 ~ a3 g#3 e3@6", S: "~@11 g#3 a3@2 a3@2", T: "a3 g#3 e3@10 ~@4",
  U: "~@3 b3!2 ~ b3@2 b3@5 ~ b3@2", V: "c#4@2 b3@2 a3@2 b3@7 ~ g#3 ~",
  W: "[a3@2 g#3 ~ a3 ~ g#3 a3@3 g#3 a3@2 ~ g#3 g#3@13 ~@4]/2", X: "~@3 b3!2 ~ b3 ~ b3@5 ~ b3 ~",
  Y: "a3@2 g#3 ~ a3@2 g#3 a3@3 b3 c#4@3 b3 ~, ~@7 g#3 ~@8", Z: "b3 a3 g#3@6 ~@6 g#3@2",
  AA: "[a3 ~ a3 ~ a3 ~ a3 a3@2 g#3 e3@8 ~@10 a3 ~ a3 a3@2 g#3 e3@7 ~@7]/3", AB: "[a#3,b3,c#4] ~ b3@2 a3@2 b3@8 g#3 ~",
  AC: "a3@2 g#3 a3@3 g#3 a3@3 g#3 [a3,b3]@2 g#3@2 ~, ~@3 g#3 ~@12", AD: "~@3 b3!2 ~ b3 b3@7 b3@2",
  AE: "[a3@2 g#3 a3@3 ~@2 a3@2 b3 c#4@3 b3 b3@2 a3 g#3@8 ~@5 g#3]/2",
  AF: "[a3@2 a3 a3@3 a3@2 a3 g#3 e3@12 ~@5 a3!2 ~ a3@2]/2",
  AG: "[~@4 b3!2 b3@3 ~@5 b3 c#4@3 b3@2 a3@2 b3@7 g#3 g#3@2]/2",
  AH: "[a3 g#3 a3 g#3 a3 g#3 a3 g#3 a3 a3@2 g#3 a3 g#3 e3@8 ~@10]/2", AI: "~@4 b3 ~ b3 ~ b3@3 ~ b3 b3@2 ~",
  AJ: "c#4@2 b3@2 a3@2 b3@7 ~ g#3@2", AK: "a3@2 b3 c#4@3 b3 a3@3 b3 c#4@3 b3@2", AL: "b3 a3 g#3@10 ~@2 g#3@2",
  AM: "a3@2 b3 c#4@3 b3@2 a3 g#3 e3@6", AN: "~@9 a3!2 g#3 a3 g#3 a3 g#3", AO: "a3 g#3 e3@8 ~@6",
  AP: "[~@4 b3!2 b3@6 ~ b3!2 c#4@3 b3@2 a3@2 [g#3,a3] ~@7 g#3 ~, ~@11 b3@4 ~]/2", // Amaj7
  AQ: "[a3 g#3 a3@2 a3 g#3 a3 g#3 a3 a3@2 g#3 a3 g#3 e3@8 ~@10]/2", AR: "~@3 b3!2 ~ b3@2 b3@4 b3 b3@3",
  AS: "c#4@2 ~ c4 a3@2 b3@8 g#3 ~, ~ b3 ~@6", AT: "a3@2 g#3 a3@3 g#3 a3@3 b3@2 c#4@2 b3@2, ~@7 g3 ~@8",
  AU: "b3 a3 g#3@11 ~ e3 ~", AV: "f#3@2 g#3 a3@3 g#3@2 a3 g#3 e3@6", AW: "~@10 a3 ~ a3 ~ a3@2",
})).s("gm_electric_guitar_jazz").gain(0.33)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@37 A B@2 C D E F C D E C G@3 F C D E F C D E C G@3 H C D E F C D E C G@3 H F H F H F H F H F I@2
>`.pickRestart({
  A: "~ [a4,b4]@3, ~ e4@2 ~", B: "[g#4@8 a4@8 g#4@8 a4@7 ~, e4, b4@7 ~]/2", C: "g#4", D: "a4 g#4", E: "a4", F: "g#4 a4",
  G: "[~@3 e5@2 f#5@3 g#4@2 a4@2, ~ a6@2 ~]/3", H: "g#4@8 a4@7 ~", I: "[[g#4,e6]@15 ~]/2",
})).s("gm_string_ensemble_1").gain(0.24).pan(0.6)

// other · pad new age
const pad_new_age = note("<~ [~@2 a7!2] [~@3 a7] [~@3 e7] ~@83>").s("gm_pad_new_age").gain(0.25).pan(0.7)

// other · trombone
const trombone = note("<~@50 A@2 B C D E B F G B H@2 I J K L@3 B M N ~ O@2 P@4 Q@2 R@4 S@2 ~>".pickRestart({
  A: "g#4 a4", B: "g#4@15 ~", C: "a4@8 g#4@7 ~", D: "a4@15 ~", E: "g#4 b3 e4 f#4", F: "a4 ~", G: "a4@2 e4 f#4",
  H: "[a4@5 b4 c#5@2]/2", I: "~ e5, b4@13 ~@3", J: "~@4 b4@3 b4 e5@4 c#5@4", K: "b4", L: "[~@9 b3 e4 f#4, e4@13 ~@3]/3",
  M: "a4 g#4", N: "e4@15 ~", O: "[~ c#5, e4]/2", P: "[~@8 e4@28 b4 [e4,b4] b4 [e4,b4] e5@15 ~@8 b4, ~ a4 ~@6]/4",
  Q: "[e4@4 e5@9 ~@3]/2", R: "[~@4 b4 [e4,b4] b4 [e4,b4] e5@15 ~@9]/2", S: "[~@6 b4!2 e5@16 ~@8]/2",
})).s("gm_trombone").gain(0.3)

// other · trombone · soft notes
const trombone_soft = note("<~@57 [~ g#4] ~@16 [g#4 ~] [g#4@8 a4@7 ~] ~@11>").s("gm_trombone").gain(0.17)

// other · harmonica · C#m F#m Amaj7
const harmonica = note(`<
  ~@3
  [~@14 b4 [c#5,d#5,e5]]
  [[f#5,g#5,a5] ~@15, b5@15 ~]
  ~@11
  [[g#5,a5] ~@15, b5@15 ~]
  ~@3
  [[g#5,a5] ~@15, b5@15 ~]
  ~@66
>`).s("gm_harmonica").gain(0.11).pan(0.6)

// other · timpani
const timpani = note("<~@16 A ~@3 A ~@7 A ~@3 A ~@16 B A C A ~@8 B A C A ~@8 B A C A C A C A C A C A ~@2>".pickRestart({
  A: "e2 ~@15", B: "~@9 e2!7", C: "~@11 e2!5",
})).s("gm_timpani").gain(0.17).pan(0.6)

// other · timpani · soft notes
const timpani_soft = note("<~@49 A ~ B ~@9 A ~ B ~@9 A ~ B ~ B ~ B ~ B ~ B ~@3>".pickRestart({
  A: "~@8 e2 ~@7", B: "~@8 e2!3 ~@5",
})).s("gm_timpani").gain(0.08).pan(0.6)

// chords · church organ
const church_organ = note(`<
  ~@26 A@8 B C D@2 A@8 B C D@2 E@2 C F B G C F B C D@2 E@2 C F B G C F B C D@2 E@10 H@2 ~
>`.pickRestart({
  A: "[g#3 a3 g#3 a3 g#3@2 a3 g#3 a3@2 g#3 a3 g#3@2 a3 g#3, [b3,e4]]/8", B: "a3", C: "g#3", D: "a3/2",
  E: "[g#3 a3 g#3 a3, [e3,b3,e4]]/2", F: "a3 g#3", G: "g#3 a3", H: "[b3 [b3,e5], [e3,e4], g#3 ~@3]/2",
})).s("gm_church_organ").gain(0.11).pan(0.4)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A B@3 C D E B C D F B E@2 B@2 C D E B C D E B E@2 B@2 C D E B C D E G E@2 B@2 C D E B C D E G E@2 B@2 C D E B C D E G
  E@2 B@2 C D E B C D E G E@2 B@11 H@2
>`.pickRestart({
  A: "[e2,e3,g#3,b3,e4]@4 [e2,e3,g#3,b3,e4]@2 [e2,e3,g#3,b3,e4]!2 [e2,e3,a3,b3,e4]!8", // E Esus4
  B: "[e2,e3,g#3,b3,e4]@2 [e2,e3,g#3,b3,e4]!2 [e2,e3,g#3,b3,e4]@2 [e2,e3,g#3,b3,e4]!2 [e2,e3,a3,b3,e4]!8", // E Esus4
  C: "[e2,e3,g#3,b3,e4]@2 [e2,e3,g#3,b3,e4]!2 [e2,e3,g#3,b3,e4]@2 [e2,e3,g#3,b3,e4]!9 ~", // E
  D: "[e2,e3,a3,c#4,e4]@2 [e2,e3,a3,c#4,e4]!2 [e2,e3,a3,c#4,e4]@2 [e2,e3,a3,c#4,e4]!2 [e2,e3,g#3,b3,e4]!8", // A E
  E: "[e2,e3,a3,c#4,e4]@2 [e2,e3,a3,c#4,e4]!2 [e2,e3,a3,c#4,e4]@2 [e2,e3,a3,c#4,e4]!10", // A
  F: "[e2,e3,a3,c#4,e4]@2 [e2,e3,a3,c#4,e4]!2 [e2,e3,a3,c#4,e4]@2 [e2,e3,a3,c#4,e4]!2 [e3,a3,c#4,e4] [e2,e3,a3,c#4,e4]!7", // A
  G: "[e2,e3,g#3,b3,e4]@2 [e2,e3,g#3,b3,e4]!2 [e2,e3,g#3,b3,e4]@2 [e2,e3,g#3,b3,e4]!10", // E
  H: "[[e3,g#3,b3,e4]@7 ~, e2 ~@15]/2", // E
})).s("gm_acoustic_guitar_steel").gain(0.23)

// drums · kick
const kick = s("bd").struct("<~@16 A ~@3 A ~@5 B C@21 D E C@10 D E C@10 D E C@11 A ~>".pickRestart({
  A: "x", B: "x!3 ~", C: "x!2", D: "x ~ x!2", E: "x!4",
})).gain(0.44)

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

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  ~@38 A B A B A B A B A B A B@5 A B@5 A B A B@3 A B@5 A B A B A B A B A B A B A C ~
>`.pickRestart({
  A: "x!8", B: "x!7 ~", C: "x",
})).gain(0.34)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@39 A ~ A ~ A ~ A ~ A ~ A@5 ~ A@5 ~ A ~ A@3 ~ A@5 ~ A ~ A ~ A ~ A ~ A ~ A ~@3
>`.pickRestart({
  A: "~@7 x",
})).gain(0.34)

// drums · crash
const crash = s("cr").struct("<~@50 A ~ A ~@9 A ~ A ~@9 A ~ A ~ A ~ A ~ A ~ A@2 ~>".pickRestart({
  A: "x",
})).gain(0.34)

// drums · tambourine
const tambourine = s("tb").struct("<~@26 A@24 B C D@8 E F G D@5 C D@5 G D@8 C D H ~>".pickRestart({
  A: "~@4 x!2 ~@6 x!2 ~@2", B: "~@2 x!12 ~@2", C: "x ~ x!12 ~@2", D: "x ~ x!13 ~", E: "x ~ x ~ x!3 ~ x ~ x ~ x!3 ~",
  F: "x ~@3 x!3 ~ x ~ x ~ x!2 ~@2", G: "~@2 x!13 ~", H: "x",
})).gain(0.1)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@26 A@24 B@2 ~@9 B ~@6 B ~@14 B ~@3>".pickRestart({
  A: "~@3 x ~@3 x", B: "~@7 x",
})).gain(0.05)

// drums · triangle
const triangle = s("triangles:35").struct("<~@37 x ~@49>").gain(2.54)

stack(
  bass, string_ensemble_2, electric_guitar_jazz, string_ensemble_1, pad_new_age, trombone, trombone_soft, harmonica,
  timpani, timpani_soft, church_organ, acoustic_guitar_steel, kick, snare, pedal_hat, open_hat, crash, tambourine,
  tambourine_soft, triangle
)