Strudelify

Do They Know It's Christmas

Band Aid

KeyC majorTempo116 bpm
0:00/0:00
// Do They Know It's Christmas — Band Aid
// 116 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 109 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(116/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 · acoustic bass
const bass = note(`<
  ~@19 A@2 B C A@2 B C A@2 B C A B D C A B D C A B D C A@2 B C A@2 B C A@2 B C A B D C A E F G F G H G A E@2 D A E@2 D A
  E@2 D A E@2 D A E@2 D A E@2 D A E@2 D A E@2 D A E@2 D A E@2 D I J
>`.pickRestart({
  A: "c2 ~ c2!3 ~ c2!3 ~ c2!3 ~ c2!2", B: "f2 ~ f2!3 ~ f2!3 ~ f2!3 ~ f2!2", C: "g2 ~ g2!3 ~ g2!3 ~ g2!3 ~ g2!2",
  D: "d2 ~ d2!3 ~ d2!3 ~ d2!3 ~ d2!2", E: "f2 ~ f2!3 ~ f2!2 c2 ~ c2!3 ~ c2!2", F: "a2", G: "g2", H: "f2", I: "c2",
  J: "c3@3 ~@13",
})).s("gm_acoustic_bass").gain(0.48)

// other · synth brass 2
const synth_brass_2 = note(`<
  ~@4 A B C D A E F G H@2 I J@2 K@3 L M N O@2 P@2 Q R S T U@2 V W X@2 Y Z AA@2 AB@2 AC AD AE@3 AF AG@4 AH@2 AI@2 AJ AK
  AL ~ AM ~ AN ~ AJ AK AO ~@41
>`.pickRestart({
  A: "~@8 c4@2 ~ c4@2 ~ a4@2", B: "~ a4@8 ~@7", C: "~@7 a4 ~ f4@2 ~ a4@2 e4@2", D: "~ g4 ~ g4@2 ~ a4@5 ~@5",
  E: "~ a4@7 ~@6 a4@2", F: "a4@2 g4@2 g4@4 ~@3 g4@3 e4@2", G: "g4!2 a4@3 ~@3",
  H: "[~@6 g4@2 a4@2 ~ c5@2 ~ d5@10 ~@3 c5@2 ~ e5@2]/2", I: "~@2 d5@5 ~@5 c5@2 g4@2",
  J: "[c5@2 c5@4 d5@6 c5@2 a4@7 ~@7 a4@2 c5@2]/2", K: "[d5@6 c5@2 c5@2 d5@3 ~ e5@6 ~ g4@2 e5@2 ~ e5@2 ~@2 d5@13 ~@5]/3",
  L: "~@8 e5@2 ~ d5@2 ~ c5@2", M: "c5 ~@3", N: "~@8 d5@3 ~ d5@3 d5", O: "[d5@2 e5@2 ~ e5@15 ~@4 c5@2 ~ c5@3 d5@2]/2",
  P: "[c5@9 ~ c5@3 ~ d5@8 g4@4 d5@3 ~ g4@2]/2", Q: "d5@2 ~ e5@3 e5@10", R: "~@8 e5@4 d5@3 ~",
  S: "c5@3 ~ c5@3 ~ c5@3 ~ d5@2 b4@2", T: "~@2 a4@7 ~ c5 ~ c5 ~ c5 ~", U: "[c5@4 d5@6 c5@2 g4@2 a4@9 ~@5 c5 ~ c5 ~]/2",
  V: "c5@3 ~ c5@3 ~ c5@4 d5@2 b4@2", W: "~@2 a4@2 g4@6 ~@3 c5@2 ~", X: "[c5@2 d5@6 c5@2 g4@4 a4@9 ~@5 c5 ~ c5 ~]/2",
  Y: "c5 ~ c5@3 ~ c5@3 ~ d5@3 ~ b4@2", Z: "~ a4@2 ~ g4@7 ~ c5 ~ c5 ~",
  AA: "[c5@2 d5@3 ~ c5@5 ~ g4 ~ a4@5 ~@7 f5@2 ~@2 f5 ~]/2",
  AB: "[f5@3 ~ f5@3 ~ f5@3 ~ e5@2 d5@6 ~@2 e5@2 f5@5 ~ e5@2]/2", AC: "e5@3 ~", AD: "~@12 c5 ~ c5 ~",
  AE: "[c5@3 ~ c5 ~ c5@4 d5@4 b4@4 a4@2 g4@6 a4@4 a4@4 g4@3 ~ g4@8 ~@2]/3", AF: "~@13 c5 ~@2",
  AG: "[c5 ~ c5@3 ~ c5@4 d5@4 b4@4 a4@4 g4@4 a4@4 g4@12 ~@4 d5@8 c5@5 ~ c5@3 c5]/4",
  AH: "[~@2 c5@4 c5@4 d5@4 b4@8 ~@6 c5@3 ~]/2", AI: "[c5@2 d5@2 c5 g4@2 a4@4 ~@5]/2", AJ: "f5 e5 c5 g4",
  AK: "f5 e5 c5 d5", AL: "c5@13 ~@3", AM: "e5@3 ~ e5@3 ~ e5@3 ~@5", AN: "e5@3 ~ e5@3 ~ e5@4 ~@4", AO: "c5@11 ~@5",
})).s("gm_synth_brass_2").gain(0.49)

// chords · lead 2 sawtooth
const lead_2_sawtooth = note(`<
  ~@23 A@2 B C A@2 B D E F C G E F H I J K H I L@2 M N O@2 M N O@2 M N P Q H N ~@8 R S T C R S T U V@6 W@24 X@3 Y
>`.pickRestart({
  A: "c3/2", B: "f3", C: "d3", D: "g3", E: "c3", F: "f3 g3 a3@2", G: "b3", H: "[d3,a3]", I: "[d3,b3]", J: "[e3,c4]",
  K: "[c3,f3] [e3,g3] [f3,a3]@2", L: "[~ e4, [e3,g3,c4]]/2", M: "[f3,a3]", N: "[g3,b3]", O: "[c3,g3]/2", P: "[c3,g3]",
  Q: "[c3,f3]", R: "c3@3 d3 e3@2 c3@2", S: "f3@6 e3 d3 e3@4 c3@4", T: "f3 g3 e3 c3", U: "d3@15 [c4,e4]",
  V: "[c3@5 ~@3 e3@3 ~ c3@3 ~ f3@6 e3 d3 e3@4 c3@3 ~ f3@4 g3@3 ~ e3@4 c3@3 ~ d3@15 [c4,e4,g4]@16 [c4,f4,a4]@8 [c4,e4,g4]@8 [c4,f4,a4], ~@5 [d4,f4]@2 [e4,g4]@4 [c4,e4]@4 c4@16 c4@16 [d4,f4]@16 ~@33, ~@6 d3@2 ~@7 f4@8 e4@8 f4@8 e4@8 ~@49]/6", // C F C F Dm Em C Dm
  W: "[~@7 [c4,e4,g4]@8 [a3,d4,f4]@16 [c4,e4,g4]@16 [c4,f4,a4]@8 [c4,e4,g4]@8 [c4,f4,a4]@8 [c4,e4,g4]@8 [a3,d4,f4]@16 [c4,e4,g4]@16 [c4,f4,a4]@8 [c4,e4,g4]@8 [c4,f4,a4]]/8", // C Dm C F C F C Dm …
  X: "[~@7 [c4,e4,g4]@8 [a3,d4,f4]@16 [e3,g3,c4]@16 ~]/3", Y: "[e4,g4,c5]@3 ~@13",
})).s("gm_lead_2_sawtooth").gain(0.3).pan(0.4)

// bass · shanai
const bass_2 = note("<~ A ~ B ~ C D E B F D E B F D E G H D ~@90>".pickRestart({
  A: "c2@9 ~@7", B: "c2 ~", C: "f1@7 ~@9", D: "g1 ~", E: "c2@3 ~@5", F: "f1@3 ~@5", G: "f1 ~", H: "d2@3 ~@5",
})).s("gm_electric_bass_finger").gain(0.4).pan(0.3)

// other · tubular bells
const tubular_bells = note(`<
  ~ A ~ A ~@15 A ~@18 B C D E F ~@2 G H I ~ G H I ~ G J I K G H I ~@5 L M N ~@3 N ~@2 K N ~ O K N ~ O K N ~ O K N ~ O K
  N ~ O K N ~ O K N ~ O K N ~ O K P Q
>`.pickRestart({
  A: "c5@3 ~@5", B: "b5 c6 d6 f6", C: "e6 ~@3", D: "f6 e6 d6 c6", E: "a5 ~@3", F: "b5 c6 d6 ~", G: "[a4,a5]",
  H: "[b4,b5]", I: "[e5,e6]", J: "[b4,b5] [c5,c6] [d5,d6] [f5,f6]", K: "[f5,f6] [e5,e6] [d5,d6] [c5,c6]", L: "[f5,f6]",
  M: "[g5,g6]", N: "[c5,c6]", O: "[a5,a6] [g5,g6] [f5,f6] [e5,e6]", P: "f5 e5 d5 c5", Q: "[c5,c6]@3 ~@13",
})).s("gm_tubular_bells").gain(0.3).pan(0.7)

// other · taiko drum
const taiko_drum = note(`<
  ~
  [c3 ~ c3!3 ~ e5 ~ e5!2 ~@2 f4 ~ f4!2]!19
  [c3 ~ c3!2 ~@2 e5 ~ e5 ~@3 f4 ~ f4!2]
  [c3 ~ c3 ~@3 e5 ~ e5 ~@3 f4 ~ f4 ~]
  [c3 ~ c3 ~@3 e5 ~@5 f4 ~@3]
  ~@86
>`).s("gm_taiko_drum").gain(0.25).pan(0.4)

// other · taiko drum · soft notes
const taiko_drum_soft = note(`<
  ~
  [~@10 e5 ~@5]!19
  [~@4 c3 ~@4 e5!2 ~@5]
  [~@3 c3!2 ~@4 e5!2 ~@4 f4]
  [~@3 c3!2 ~@3 e5!3 ~@3 f4!2]
  ~@86
>`).s("gm_taiko_drum").gain(0.15).pan(0.4)

// other · lead 1 square
const lead_1_square = note(`<
  ~@29 A B C A@2 B C A@2 B C A@2 B D@2 A B E F A B E F A B E G H B I J K L M N O P I J Q R I J Q R I J Q R I J Q R I J Q
  R I J Q R I J Q R I J Q R I J Q R I J Q R S ~
>`.pickRestart({
  A: "[f5,a5]", B: "[g5,b5]", C: "[g5,c6]", D: "[~@3 c6, [g4,c5], ~ e5@3, ~ f5]/2", E: "[e5,g5]", F: "f5 e5 d5 c5",
  G: "[c5,f5]", H: "[d5,a5]", I: "e5@3 f5 g5@2 c5@2", J: "a5@6 g5 f5 g5@4 c5@4", K: "[a4,e5]", L: "[g4,d5]",
  M: "e5 g5, a4", N: "d5@2 c5 b4, g4", O: "a4@3 c5, f4", P: "b4@2 c5 d5, g4", Q: "a5 c6 g5 c5", R: "d5", S: "c5@15 ~",
})).s("gm_lead_1_square").gain(0.27).pan(0.3)

// bass · slap bass 1 · A C G A C G
const bass_3 = note(`<
  ~@61
  [[a1,a2]@5 ~@9 [c2,c3] ~]
  [[g1,g2]@2 [g1,g2]@3 ~@9 [g1,g2] ~]
  [[a1,a2]@2 [a1,a2]@3 ~@9 [c2,c3] ~]
  [[g1,g2] ~ [g1,g2]@3 ~@11]
  ~@44
>`).s("gm_slap_bass_1").gain(0.35).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~@19 [x!2]!42 [x!2 ~ x ~@4]!4 [x!2]!42 [x ~@4 x ~ x] x>").gain(0.72)

// drums · snare
const snare = s("sd").struct(`<
  ~@19 A@23 B A ~ A@13 ~ A C D@5 ~ A@3 E F A@6 G A@3 H A@3 I A@3 J A@3 K A@3 L A@3 M A@2 N O P ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@5 x!11", C: "~@4 x ~@3 x!2 ~ x!2 ~@3", D: "~ x", E: "~@4 x ~@3 x!2 ~@2 x!2 ~@2",
  F: "x!2 ~@2 x ~@7 x ~@3", G: "~@4 x ~@7 x ~ x!2", H: "~@4 x!2 ~@6 x!4", I: "~@4 x!2 ~@10", J: "~ x ~@2",
  K: "~@4 x ~@2 x!9", L: "~@4 x ~@3 x!3 ~ x!4", M: "~@4 x!3 ~@5 x ~ x!2", N: "~@4 x ~@7 x!2 ~@2",
  O: "x ~ x ~ x!2 ~ x ~@3 x!5", P: "~@2 x!2",
})).gain(0.72)

// drums · low tom
const low_tom = s("lt").struct("<~@44 A ~@13 B ~@7 C ~@7 D ~@7 E ~@3 D ~@22>".pickRestart({
  A: "~@13 x!3", B: "~@12 x!2 ~@2", C: "~@12 x!3 ~", D: "~@14 x!2", E: "~@4 x!2 ~@2",
})).gain(0.56)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@19 A@23 B C D E A@2 F A@3 G H A@3 F I A G ~@5 J A@3 K L A@2 M A@3 M A@3 N A@3 O A@3 M A@3 M A@3 M A@3 P A@3 M Q ~
>`.pickRestart({
  A: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", B: "~@3 x!2 ~ x!3 ~ x!3 ~ x!2", C: "x ~ x!3 ~ x!3 ~ x!2 ~@4", D: "~@3 x ~@12",
  E: "~@2 x!3 ~ x!3 ~ x!3 ~ x!2", F: "x ~ x!3 ~ x!3 ~ x!3 ~@3", G: "x ~ x!3 ~ x!3 ~@3 x!2 ~@2",
  H: "x ~@3 x ~ x!3 ~ x!3 ~ x!2", I: "~@3 x ~@3 x ~@3 x ~@3 x", J: "~@15 x", K: "x ~ x!3 ~@4 x ~@2 x!2 ~@2",
  L: "x ~@2 x!2 ~ x!3 ~ x!3 ~ x!2", M: "x ~ x!3 ~ x!4 ~@2 x!2 ~@2", N: "x!2 ~@4 x!4 ~@2 x!2 ~@2",
  O: "x ~ x!3 ~ x!4 ~@3 x ~@2", P: "x ~ x!3 ~@3 x!2 ~@2 x!2 ~@2", Q: "~ x!3",
})).gain(0.56)

// drums · mid tom
const mid_tom = s("mt").struct("<~@44 A ~@13 B ~ C ~@5 D ~@7 E ~@11 F ~@3 G ~@18>".pickRestart({
  A: "x!2 ~@2 x ~ x!4 ~@2 x ~@3", B: "~@4 x!2 ~ x!3 ~@6", C: "~@14 x!2", D: "~@4 x!2 ~ x!4 ~@5", E: "~@8 x!2 ~@6",
  F: "~@12 x!2 ~@2", G: "~@6 x!3 ~ x!6",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@42 A B C ~@3 D ~@3 E F ~@3 D G ~ E ~@4 G@2 ~@3 H F ~@2 E ~@3 E ~@3 I ~@3 E ~@3 E ~@3 E ~@3 E ~@3 H ~@3 E ~@2
>`.pickRestart({
  A: "x", B: "~@6 x!2", C: "~@2 x ~ x ~ x!2", D: "~@7 x", E: "~@5 x ~ x", F: "~ x ~@6", G: "x!4", H: "~@3 x ~ x ~ x",
  I: "~ x ~@3 x ~ x",
})).gain(0.48)

// drums · crash
const crash = s("cr").struct(`<
  ~@19 A ~@23 A ~ A ~@13 A ~ B@4 A ~ A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A@2
>`.pickRestart({
  A: "x", B: "x!2",
})).gain(0.48)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@19 [~@2 x!2 ~@4]!42 ~@5 [~@2 x!2 ~@4]!41 ~@2>").gain(2.03)

stack(
  bass, synth_brass_2, lead_2_sawtooth, bass_2, tubular_bells, taiko_drum, taiko_drum_soft, lead_1_square, bass_3, kick,
  snare, low_tom, hihat, mid_tom, open_hat, crash, cabasa
)

More by Band Aid