Strudelify
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 32-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: 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 P Q R M@2 L@2 M S M F O T U R M@2 V@2 W X Y Z X AA AB AC V AD
  V@2 W X Y Z X AA AB AC V AD AE Z AF X@3 V@2 W 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: "e1@7 ~ e2@6 e2@2",
  Q: "e2@3 ~ e2@3 e1", R: "e2@3 e2 e2@4", S: "e1@12 e1@3 ~ e2@12 e2@4", T: "e1@3 ~ e2@3 e2", U: "e2@3 ~ e1@3 e1",
  V: "e1@10 ~@2 e1@3 ~ e1@14 ~@2", W: "e1@10 ~@2 e1@3 ~ e2@10 ~@2 e2@4", X: "e1@10 ~@2 e1@3 ~ e1@10 ~@2 e1@3 ~",
  Y: "e1@10 ~@2 e1@3 ~ e1@11 ~ e1@4", Z: "e2@10 ~@2 e2@4 e1@10 ~@2 e1@3 ~", AA: "e1@5 ~ e1@2 e2@7 ~", AB: "e1@29 ~@3",
  AC: "e2@29 ~@3", AD: "e1@11 ~ e1@3 ~ e1@10 ~@2 e1@3 ~", AE: "e1@10 ~@2 e1@4 e2@10 ~@2 e2@3 ~",
  AF: "e1@10 ~@2 e1@3 ~ e1@7 ~@5 e1@3 ~",
})).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 ~ AB AC AD M AE AF AG@2 AH@2 AI ~ AJ@2 AK@2
  AL AM AN AO AP AQ AR ~ AS@2 AT@2 AU AV AW AX AY AZ BA ~@12
>`.pickRestart({
  A: "[~@8 b3 ~ b3 ~ b3@12 ~@2 b3 ~ b3@2 c#4@5 ~ b3@4 a3@4 b3@13 ~ g#3 ~ g#3@4]/2",
  B: "[a3@2 g#3@2 a3@3 ~ a3@2 g#3@2 a3@2 g#3@2 a3@2 a3@4 g#3 ~ a3@2 g#3@2 e3@20 ~@16]/2",
  C: "~@6 b3 ~ b3@3 ~ b3@3 ~ b3@7 ~ b3@2 b3@6", D: "c#4@4 b3@4 a3@4 b3@15 ~ g#3@2 ~@2",
  E: "a3@4 g#3 ~ a3@6 g#3 ~ a3@6 b3@3 ~ c#4@4 b3@3 ~", F: "b3 a3 g#3@12 g#3@2",
  G: "a3@4 g#3@2 a3@5 ~ a3@2 g#3 ~ a3@2 g#3@2 e3@12", H: "~@18 g#3@2 a3@2 g#3@2 a3@3 ~ a3@3 ~", I: "a3 g#3 e3@12 ~@2",
  J: "~@6 b3 ~ b3 ~ b3@4 ~@2 b3@11 ~ b3@3 ~", K: "c#4 b3 a3 b3@4 ~",
  L: "a3@3 ~ a3 ~ a3@5 ~ a3 ~ a3@5 ~ a3 ~ a3@4 g#3@5 ~", M: "g#3@9 ~@7", N: "~@6 b3 ~ b3 ~ b3@5 ~ b3@10 ~@2 b3@4",
  O: "c#4@4 b3@4 a3@4 b3@16 ~@2 g#3 ~", P: "a3@3 ~ a3 ~ a3@5 ~ a3 ~ a3@6 b3 ~ c#4@5 b3@4 ~", Q: "b3 a3 g#3@11 ~@3",
  R: "a3@3 ~ a3 ~ a3@5 ~ a3@3 ~ a3@2 g#3@2 e3@12", S: "~@21 g#3@2 ~ a3@3 ~ a3@3 ~", T: "a3 g#3 e3@10 ~@4",
  U: "~@6 b3 ~ b3@3 ~ b3@3 ~ b3@11 ~ b3@4", V: "c#4@4 b3@4 a3@4 b3@13 ~@3 g#3@3 ~",
  W: "[a3@4 g#3@3 ~ a3@3 ~ g#3 ~ a3@5 ~ g#3 ~ a3@5 ~ g#3 ~ g#3@25 ~@9]/2",
  X: "~@6 b3 ~ b3@2 ~@2 b3@3 ~ b3@11 ~ b3@2 ~@2", Y: "a3@4 g#3@3 ~ a3@4 g#3 ~ a3@6 b3@2 c#4@6 b3@3 ~, ~@14 g#3 ~@17",
  Z: "b3 a3 g#3@6 ~@6 g#3@2",
  AA: "[a3@3 ~ a3@3 ~ a3@3 ~ a3 ~ a3@4 g#3@2 e3@15 ~@21 a3@3 ~ a3 ~ a3@4 g#3@2 e3@14 ~@14]/3",
  AB: "~@6 b3 ~ b3@3 ~ b3@3 ~ b3@10 ~@2 b3@4", AC: "[a#3,b3] ~@3 b3@4 a3@4 b3@15 ~ g#3@3 ~, c#4 ~@7",
  AD: "a3@4 g#3 ~ a3@6 g#3 ~ a3@6 g#3 ~ a3@4 g#3@4 ~@2, ~@6 g#3 ~@15 b3 ~@9", AE: "~@6 b3 ~ b3@3 ~ b3 ~ b3@13 ~ b3@4",
  AF: "c#4@4 b3@4 a3@4 b3@15 ~@3 g#3@2",
  AG: "[a3@4 g#3@2 a3@6 ~@4 a3@4 b3@2 c#4@5 ~ b3 ~ b3@4 a3@2 g#3@15 ~@11 g#3 ~]/2",
  AH: "[a3@3 ~ a3 ~ a3@5 ~ a3@3 ~ a3@2 g#3@2 e3@24 ~@10 a3 ~ a3@3 ~ a3@3 ~]/2", AI: "a3@2 g#3@2 e3@19 ~@9",
  AJ: "[~@8 b3 ~ b3 ~ b3@6 ~@10 b3@2 c#4@6 b3@4 a3@4 b3@14 g#3 ~ g#3@4]/2",
  AK: "[a3@2 g#3 ~ a3@2 g#3 ~ a3@2 g#3 ~ a3@2 g#3 ~ a3 ~ a3@3 ~ g#3@2 a3@2 g#3@2 e3@15 ~@21]/2",
  AL: "~@8 b3@3 ~ b3@3 ~ b3@7 ~ b3 ~ b3@5 ~", AM: "c#4 b3 a3 b3@3 ~ g#3", AN: "a3@2 b3 c#4@3 b3 a3@3 b3 c#4@3 b3@2",
  AO: "b3@2 a3@2 g#3@19 ~@5 g#3@3 ~", AP: "a3@4 b3@2 c#4@6 b3@4 a3@2 g#3@2 e3@11 ~",
  AQ: "~@18 a3 ~ a3@2 g#3 ~ a3@2 g#3 ~ a3@2 g#3 ~", AR: "a3 g#3 e3@8 ~@6",
  AS: "[~@8 b3 ~ b3 ~ b3@13 ~ b3 ~ b3 ~ c#4@6 b3@4 a3@3 ~ [g#3,a3] ~@15 g#3@2 ~@2, ~@44 b3@15 ~@5]/2", // Amaj7
  AT: "[a3@2 g#3@2 a3@3 ~ a3@2 g#3 ~ a3@2 g#3 ~ a3 ~ a3@3 ~ g#3 ~ a3@2 g#3@2 e3@17 ~@19]/2",
  AU: "~@6 b3 ~ b3@3 ~ b3@3 ~ b3@7 ~ b3 ~ b3@6", AV: "c#4@4 ~@2 c4@2 a3@4 b3@15 ~ g#3@3 ~, ~@4 b3@5 ~@23",
  AW: "a3@4 g#3@2 a3@6 g#3 ~ a3@6 b3@4 c#4@4 b3@3 ~, ~@14 g3 ~@17", AX: "b3 a3 g#3@11 ~ e3 ~",
  AY: "f#3@4 g#3@2 a3@6 g#3@4 a3@2 g#3@2 e3@11 ~", AZ: "~@20 a3@3 ~ a3@3 ~ a3@3 ~", BA: "a3 g#3 e3@11 ~@3",
})).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("<~ [~@16 a7@7 ~ a7@8] [~@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 M N O ~ P@2 Q@4 R@2 S@4 T@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: "g#4@31 ~", N: "a4 g#4", O: "e4@15 ~", P: "[~ c#5, e4]/2",
  Q: "[~@16 e4@56 b4 ~ e4 b4!2 e4 ~ b4 e5@30 ~@17 b4, ~ a4 ~@6]/4", R: "[e4@16 e5@35 ~@13]/2",
  S: "[~@8 b4 ~ e4 b4!2 e4 ~ b4 e5@30 ~@18]/2", T: "[~@12 b4 ~@2 b4 e5@32 ~@16]/2",
})).s("gm_trombone").gain(0.3)

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

// other · harmonica
const harmonica = note("<~@3 A B ~@10 C B ~@2 C B ~@66>".pickRestart({
  A: "~@28 b4@2 c#5 [d#5,e5,f#5,g#5]", B: "b5@31 ~, a5 ~@31", C: "~@31 g#5",
})).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 ~@31", B: "~@19 e2!13", C: "~@21 e2!11",
})).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: "~@16 e2!3 ~@13", B: "~@16 e2!5 ~@11",
})).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(`<
  ~@14 A@2 B ~@3 A ~@5 A@2 C ~@3 A ~@5 A@2 C ~@3 A ~@5 A@2 C ~@3 A ~@5 A@2 C ~@3 A ~@5 A@2 C A C A C A C A C D@2
>`.pickRestart({
  A: "~ e4@7 ~@24", B: "~ e4@14 ~@17", C: "~ e4@3 ~@28", D: "[~ e4@56 ~@7]/2",
})).s("gm_acoustic_guitar_steel").gain(0.2).pan(0.8)

// chords · acoustic guitar steel
const acoustic_guitar_steel_2 = 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: "~ e4@7 [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]@2 [e2,e3,a3,b3,e4]@2 [e2,e3,a3,b3,e4]@2 [e2,e3,a3,b3,e4]@2 [e2,e3,a3,b3,e4]@2 [e2,e3,a3,b3,e4]@2 [e2,e3,a3,b3,e4]@2 [e2,e3,a3,b3,e4]@2, [e2,e3,g#3,b3] ~@3", // E Esus4 E
  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]@4 [e2,e3,g#3,b3,e4]@2 [e2,e3,g#3,b3,e4]@2 [e2,e3,g#3,b3,e4]@4 [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,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,g#3,b3,e4]@3 ~", // 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: "~@8 x ~@3 x!5 ~@7 x ~@7", E: "~@8 x ~@3 x!5 ~ x ~ x ~ x ~ x ~@7",
})).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 B A B A B A B A B A B A B A B A@8 C D E@8 F G H E@5 D E@5 H E@8 D E I ~
>`.pickRestart({
  A: "~@8 x!3 ~@13 x!3 ~@5", B: "~@8 x!2 ~@14 x!2 ~@6", C: "~@4 x ~ x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~ x ~ x!3 ~@5",
  D: "x ~@3 x ~ x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~ x ~ x!3 ~@5",
  E: "x ~@3 x ~ x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~ x ~ x!3 ~ x ~@3", F: "x ~@3 x ~@3 x!3 ~ x ~@3 x ~@3 x ~@3 x!3 ~ x ~@3",
  G: "x ~@7 x!3 ~ x ~@3 x ~@3 x ~@3 x!3 ~@5", H: "~@4 x ~ x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~ x ~ x!3 ~ x ~@3", I: "x",
})).gain(0.1)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@26 A B A B A B A B A B A B A B A B A@3 C@23 D C@16 ~@2>".pickRestart({
  A: "~@11 x!2 ~@14 x!2 ~@3", B: "~@10 x!3 ~@13 x!3 ~@3", C: "~@11 x ~@15 x ~@4", D: "~@11 x ~@15 x!2 ~@3",
})).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, acoustic_guitar_steel_2, kick, snare, pedal_hat, open_hat,
  crash, tambourine, tambourine_soft, triangle
)