Strudelify

The Holly And The Ivy

Chip Davis

KeyG majorTempo86 bpm
0:00/0:00
// The Holly And The Ivy — Chip Davis
// 86 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 61 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(86/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 · recorder
const recorder = note("<A@2 B C D E F@2 G H@2 I J@2 ~@47>".pickRestart({
  A: "[~@4 g5!3 g5@3 e6@2 d6@2 b5@2]/2", B: "g5!4 g5@2 e6@2", C: "d6@4 d6 c6 b5 a5", D: "g5@2 b5@2 e5!2 d5@2",
  E: "g5 a5 b5 c6 b5@2 a5@2", F: "[g5@10 g5!4 g5@2]/2", G: "e6@2 d6@2 b5@2 g5!2",
  H: "[g5!2 g5@2 e6@2 d6@4 d6 c6 b5 a5 g5@2]/2", I: "b5@2 e5!2 d5@2 g5 a5", J: "[b5 c6 b5@2 a5@2 g5@10]/2",
})).s("gm_recorder").gain(0.2).pan(0.3)

// chords · acoustic guitar nylon · "acoustic guitar 1"
const acoustic_guitar_nylon = note(`<
  ~@7 A B C@3 D@2 E F G@2 H@2 I J@2 K L M@2 N O@2 P@2 Q@2 R S T U ~@23
>`.pickRestart({
  A: "~@2 [g4,d5] [e4,b4]", B: "[c4,g4] [b3,g4] [c4,g4] [d4,a4]",
  C: "[[g4,d5] [e4,b4] [c4,g4] [d4,a4]@2 ~ [g4,d5] [e4,b4]@2 [c4,g4] [d4,a4]@2]/3", // G5 E5 C5 D5 G5 E5 C5 D5
  D: "[[b3,g4] [c4,g4] [d4,a4] [e4,b4]@3 ~@2]/2", E: "g5 a5 b5 c6 b5@2 g5 a5", F: "b5 a5 a5@2 a5 g5 f#5 g5",
  G: "[f#5@2 f#5@2 a5 g5 g5@3 f5 e5 f5 e5@2 e5@2]/2", H: "[e5@3 f5 d5 e5 c5@3 c5@2 c5 c5@3 d5]/2",
  I: "a4 c5 b4@2 ~ b4 d5 g5", J: "[f#5 d5 d6@2 a5 b5 c6@3 c5 e5 g5 f#5 d5 d6@2]/2", K: "a5 g5 g5@2 [b4,d5]@4",
  L: "g5 f#5 d5 a4@3 g5 e5, a4@3 ~@5", M: "[c5@4 g5 f#5 d5 a4@2 ~ g5!3 ~ [g5,g6] ~, ~@10 g6@3 ~@3]/2",
  N: "~@4 g5!2 [g5,g6]!2, g6@3 ~, d6@5 ~@3, g5@3 ~@5, ~@2 b5@3 ~@3", // G
  O: "[[g5,g6] ~ [g5,e6,g6] d6 g5 ~ f#5@2 ~ [b5,c6] b5 a5 g5@2 b5 ~, ~@4 g6@5 ~@7, ~@2 d6@2 d6 ~@3]/2", // G C Cmaj7
  P: "[[c5,e5]!2 [a4,d5] ~ g5 a5 b5 c6 b5 ~ [d5,a5] ~ [c5,g5]@3 g5, ~@6 g5@3 ~@7]/2", // C D5 C5
  Q: "[[d5,g5] f#5 [b4,d5,g5]@3 ~ d5 ~@6 d5 ~ e5, ~@5 b4@3 f#5@2 a4@4 ~@2, ~@7 g5@4 ~@3 g5@2, ~@9 d5@2 ~@5]/2", // G5 G
  R: "c5@2 g5 d6 [g5,g6] ~ [f#5,f#6] ~", S: "d5 g5 [a4,g5,a5] [b4,b5] [g4,b4,d5,g5]@4",
  T: "g6 f#6 d6 ~@4 e6, ~@3 a5@4 ~, ~@3 g6", U: "c6@2 ~@4 d5 a4, ~@2 g5 ~, ~@5 f#5@2 ~",
})).s("gm_acoustic_guitar_nylon").gain(0.2).pan(0.8)

// other · pan flute · "Pan Pipes"
const pan_flute = note("<~@26 A B C D E F G@3 H ~@25>".pickRestart({
  A: "~ g5!3 g5@2 e6@2", B: "d6@2 b5@2 g5!4", C: "g5 e6 d6@2", D: "d6@2 c6 ~ b5@2 a5@2 g5@4 b5@4",
  E: "e5!2 d5@2 g5 a5 b5 c6", F: "b5 a5 g5@2", G: "[g5@2 f#5@2 g5@33 ~ d6@2 g6@4 f#6@4]/3", H: "d6 a5 g5@6",
})).s("gm_pan_flute").gain(0.25).pan(0.6)

// chords · string ensemble 1 · "Strings 1"
const string_ensemble_1 = note("<~@45 A@3 B@6 A@3 C@4>".pickRestart({
  A: "[[f#4,a4] [e4,g4] [f#4,a4] [g4,b4]]/3", B: "[[a4,c#5] [f#4,a4] [g4,b4] [e4,g4]@2 c4 f#4 [g4,b4], ~@5 a4@2 ~]/6",
  C: "[[f#4,a4]@3 [e4,g4]@3 [f#4,a4]@3 [g4,b4]@6 ~]/4", // F#m Em F#m G
})).s("gm_string_ensemble_1").gain(0.11).pan(0.4)

// chords · string ensemble 1 · "Strings 1" · soft notes
const string_ensemble_1_soft = note("<~@20 A@7 ~@34>".pickRestart({
  A: "[~@3 [g4,b4] [f#4,a4]@3 [e4,g4,c5]@3 [d4,f#4,a4]@3 [g4,b4]@3 [f#4,a4]@3 [e4,g4,c5]@3 [d4,f#4,a4]@3 ~@3, ~@12 d4@15 ~@25 d4@24 ~@36]/7", // G F#m C D G F#m C D
})).s("gm_string_ensemble_1").gain(0.04).pan(0.4)

// other · tubular bells · "bells"
const tubular_bells = note("<~@36 A@2 B C D E F G H I J@2 K L M N@2 O P@2 Q R S@3>".pickRestart({
  A: "[[g4,g5]@3 [g4,g5]@3 [g4,g5]@2]/2", B: "~ [g4,g5]!4 ~ [e5,e6] ~", C: "[d5,d6] ~ [b4,b5] ~ [g4,g5]!4",
  D: "[g4,g5] ~ [e5,e6] [d5,d6] [d5,d6]@4", E: "[d5,d6] [c5,c6] [b4,b5] [a4,a5] [g4,g5] ~ [b4,b5] ~",
  F: "[e4,e5]!2 [d4,d5] ~ [g4,g5] [a4,a5] [b4,b5] [c5,c6]", G: "[b4,b5] ~ [a4,a5] ~ [g4,g5]@2 ~ [g4,g5]",
  H: "[g4,g5] [f#4,f#5] [g4,g5]@6", I: "f#5 d5 a4@3 d5 g5 e5",
  J: "[c5@6 g5@2 f#5@2 d5@2 ~@4 d5@2 ~@2 [b4,b5]@2 [c5,c6]@2 [b4,b5]@3 ~ [b4,b5]@2 [g4,g5] [a4,a5], ~@6 a4@3 ~@7]/2", // B C B G A
  K: "[b4,b5]@2 [a4,a5] ~ [a4,a5]@3 ~ [a4,a5]@2 [g4,g5] ~ [f#4,f#5]@2 [g4,g5]@2", // B A G F# G
  L: "[f#4,f#5]@2 [f#4,f#5]@2 [a4,a5] [g4,g5] [g4,g5]@2", // F# A G
  M: "[g4,d5,g5]@2 [f4,d5,f5]@2 [e4,c5,e5]@2 [f4,f5]@2 [e4,c5,e5]@3 ~ [e4,c5,e5]@3 ~", // G5 Dm C F C
  N: "[[e4,e5]@3 f5 [d4,d5] [e4,e5] b4 a4 ~@2 [c4,c5]@2 [c5,c6]@3 [d5,d6], c5@5 ~ f4 ~@5 [c4,c5]@8 ~@12]/2", // E D E C D C
  O: "[a4,a5] [c5,c6] a5 g5 g5@2 d5 g5", // A C
  P: "[[f#5,a5]@2 ~@2 d6@4 a5@2 b5 ~ c6@6 e5@2 c5@2 g5@2 f#5@2 ~@2 d6@4, ~@2 d5@4 ~@6 e5@3 ~@11 d5@4 ~@2]/2", // F#m
  Q: "a5@2 g5 ~ g5@4 [b4,d5]@5 ~@3", R: "g5@2 f#5@2 d5@2 a4@5 ~ g5@2 e5@2",
  S: "[c5@6 ~@2 g5@2 f#5@2 d5@2 a4@5 ~ g5@4 [b4,d5]@16 ~@8]/3", // Bm
})).s("gm_tubular_bells").gain(0.24).pan(0.8)

stack(recorder, acoustic_guitar_nylon, pan_flute, string_ensemble_1, string_ensemble_1_soft, tubular_bells)