Strudelify

It Came Upon a Midnight Clear Away in a Manger

Renee Rosnes

KeyB minorTempo94 bpm
0:00/0:00
// It Came Upon a Midnight Clear   Away in a Manger — Renee Rosnes
// 94 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 45 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(94/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.

// chords · epiano1 · "E.PIANO 1"
const epiano1 = note("<~@11 A B C D E F G H I J K L@2 M@2 N@2 O P Q R@2 S T U V W X Y Z AA AB AC AD>".pickRestart({
  A: "~@18 [a4,a#4] b4@2 d5 ~@2", B: "e5 f#5@8 d5@2 e5 ~@3 d5@2 e5 ~@3 d5@2 e5, [d4,f#4]@13 ~@11",
  C: "~@18 b4@2 ~ d5 ~@2, ~@4 [d#4,g4]@3 ~", D: "e5 f#5@2 g5 ~ f#5 ~@2 g5 ~@2 f#5@4 d5 ~@2 d5@3 e5 ~ [a4,b4], [d4,f#4]",
  E: "~@8 [d4,f#4] ~@2 [d#4,g4]@11 ~@2", // D D#
  F: "~@6 e5 f#5@2 [a5,d6] ~@2 a5@3 b5 ~ e5 f#5 ~@5, [d4,f#4]@2 ~, ~@3 d6 ~@2 d6@3 ~@3", // D5 D
  G: "~@20 [a5,a#5] b5 [c6,d6] ~", H: "[f#4,e6]@2 ~ d6 ~ e6 a5 a#5 a5 g5 ~ a5 ~@12, d4 ~@7",
  I: "~@6 [d4,f#4]@2 [d4,f#4] ~@2 [d4,f#4] ~@6 [f#5,g#5] ~ g5 f#5@2 ~, ~@7 [d#4,g4]@3 ~@2", // D F#sus2 D#
  J: "f#5 ~ g5 f#5@2 b4 f#5@2 ~ f#5@2 b4 f#5@2 g5 f#5@2 b4 f#5@2 g5 f#5@2 b4, ~@4 g5 ~@7",
  K: "f#5 ~@2 f#5@2 b4 f#5@2 g5 a5 ~ [g5,a5] f#5 [f#5,g5] ~ d5 e5 ~ b4@2 [d4,f#4] a4@2 g4, ~ g5 ~@10", // Gsus2 Gmaj7 D
  L: "[a4 a#4 ~ f#4 ~ f#4@2 a4@2 d4@8 ~ [d4,f#4]@2 ~@3 [d4,f#4]@9 ~ [d4,f#4] ~@2 [d#4,g4]@6 [a#4,b4,a#5,b5] ~@2 [d#4,g4,d5] ~@2, ~@2 b4@2 ~@41 d6@2 ~]/2", // D D# Bmaj7 D#maj7
  M: "[~@3 f#6@2 f#5 f#6 [f#5,f#6] f#5 f#6 f#5 f#6 [f#5,f#6] f#5 f#6 f#5 f#6 f#5 f#6 f#5 f#6 f#5 f#6 f#5 ~ f#5 ~@4 [d4,f#4] ~ g6 f#6 ~ g6 f#6 g6 f#6 d6 ~ a5 g5@2 [d4,f#4] a5@2 e5, ~ [d4,f#4]@8 ~@7, ~@3 f#5 ~@20 f#6@2 ~@22]/2", // F# D
  N: "[a5@2 a#5 b5@2 f#5 d5@2 [d4,f#4] e5@2 f#5 ~@5 [d4,f#4] ~@5 [d4,f#4]@2 ~ [d4,f#4] ~@2 [d4,f#4] ~@2 [d4,f#4] ~@2 [d#4,g4]@4 [a#4,a#5,b5] b4 [d#4,g4] [a4,a5]@2 [d#4,g4] [b4,b5]@2 ~, ~@6 b4@11 ~@7]/2", // D D# Bmaj7 D# A D# B
  O: "e5 f#5 ~ [d5,b5]@2 ~ [d5,b5] ~ [d4,f#4] e5 [f#5,g#5] ~ [d5,b5]@2 ~ [d5,b5]@2 b4 e5 f#5 [d4,f#4] [d5,b5]@2 ~, [d4,f#4,b5]@2 ~@7 b5@2 ~@7 b5@2 ~@4", // G D F#sus2 G D G Bm
  P: "[d5,b5]@2 b4 e5 f#5 [d4,f#4,g#5] [d5,b5]@2 ~ [d5,b5]@2 b4 e5 f#5 [d4,f#4] [e5,b5]@2 ~ e5 f#5 [d4,f#4,d5,e5] [e5,b5]@2 d5, ~@3 b5@2 ~@7 b5@2 ~@4 b5@2 ~@4", // G G#m7b5 G D E5 D E5
  Q: "~@8 [d4,f#4] [e5,e6]@2 [d5,d6] ~@10 f#4 d4", // D E D
  R: "[~@2 f#5 ~@2 e5 ~@2 d5 ~ c#5 d5 b4@2 c#5 ~ e5 ~ b4 c#5 [d4,f#4] ~ f#4@7 ~ [d4,f#4]@2 ~ [c4,g4] ~ [d4,f#4] ~@8 e5 f#5@2 [d4,f#4], ~@12 c#5 ~@2 d5@2 ~@4 a4@2 ~@10 d#4@2 ~@8 b5@3 ~@2]/2", // D C5 D
  S: "[d5,b5]@2 ~ b4@2 ~ d5@2 ~ e5 ~@10 d#5 e5 a5 b5", T: "e6@2 ~ f#6 ~ g6 ~ a6 ~ e6 f#6 ~ d6@5 [d4,f#4]@2 e6@2 ~ e6@2",
  U: "b5 ~@2 d6 ~ d6@2 a5 ~ a5 ~ b5 ~ b5 f#5 ~ f#5@2 g5 ~ g5 ~ [d4,f#4]@2, ~@2 b5@2 ~@3 f#4@5 ~@10 d#5 ~, ~@8 d4@5 ~@11", // D
  V: "d#5 ~ f#5@2 e5@2 ~@6 a#4 a4 g4 a4@2 [d4,f#4] g4@2 f#4 ~@2 d#4, ~@4 d#5 ~@5 a4@2 ~@12, ~@11 e5@2 ~@11", // D
  W: "e4 ~ f#4 g4 ~ a4 b4 ~ [d4,f#4] b4 ~ c5 d#5 ~ e5 g#5 ~ b5 c6 ~ d6 d#6 ~ e6", // D
  X: "f#6 ~ g6 a6 ~ a#6 b6@2 b5 b6 b5 b6 b5 b6 b5 b6 b5 b6 [d4,b5] b6 d#4 [c4,g4] d4@2, ~@9 f#4 b5@2, ~@21 b6@2 ~, ~@22 f#4 ~", // G C5
  Y: "~@2 e6 f#6@2 [d4,f#4] d6 e6 d6 b5 ~ a5 ~@2 [d4,f#4] f#5@2 e5 b5 ~@2 f#5 ~ d5, ~ b6 ~ b6 ~ e6 ~@4 a5 ~", // D
  Z: "e5 ~ f#5 b4@2 [d4,f#4] e5 ~ a4@2 d5 ~ g4@2 [d4,f#4] c#5@2 f#4 ~@2 b4 ~ e4@2", // D
  AA: "d4 ~@10 a4 ~@2 f#4 g4 ~ a4 b4 ~ c#5 [c5,d5] [d5,e5] ~", // Csus2 Dsus2
  AB: "f#5@2 d5 e5 f#5 ~ [f5,g5] a5 ~ b5 c#6 ~ d6 a5 ~ b5 c#6 ~ d6 e6 ~ f#6 g6 ~", // Fsus2
  AC: "~ a6 ~@2 [e6,f#6] ~ d6 ~ b5 ~ e6 ~ a5 a#5 e6@2 ~@2 [a5,e6]@2 ~ [a5,e6]@2 g5, ~ f#4@10 ~ e6@2 a5 ~@9, ~ d4@5 ~@6", // Esus2 A5
  AD: "[a5,e6]@2 b5 e5@2 ~@19", // A5
})).s("gm_epiano1").gain(0.43)

// chords · epiano1 · "E.PIANO 1"
const epiano1_2 = note("<~@12 A B C D E ~ F G ~ H I@2 J@2 K@2 L M N H O ~ P Q R S T U@2 V ~ W ~>".pickRestart({
  A: "[g3,b3]@13 ~@11", B: "~@3 a3@2 ~", C: "[g3,b3]", D: "~@8 [g3,b3] ~@2 a3@10 ~@3", E: "[g3,b3]@2 ~",
  F: "[g3,b3]@5 ~@19", G: "~@6 [g3,b3]@4 ~ [g3,b3] ~@2 a3@5 ~@5", H: "~@20 [g3,b3] ~@3",
  I: "[~@18 [g3,b3]@2 ~@3 [g3,b3]@9 ~ [g3,b3] ~@2 a3@6 ~@3 a3 ~@2]/2", // G
  J: "[~@3 [g3,b3]@24 ~@3 [g3,b3] ~@13 [g3,b3] ~@3]/2", // G
  K: "[~@8 [g3,b3] ~@8 [g3,b3] ~@5 [g3,b3]@2 ~ [g3,b3] ~@2 [g3,b3] ~@2 [g3,b3] ~@2 a3@4 ~@2 a3 ~@2 a3 ~@3]/2", // G
  L: "[g3,b3]@2 ~@6 [g3,b3] ~@11 [g3,b3] ~@3", M: "~@5 [g3,b3] ~@8 [g3,b3] ~@5 g3 b3 ~@2", N: "~@8 [g3,b3] ~@13 g3 b3",
  O: "~@6 [g3,b3]@2 ~ g#3@2 g3 ~@11 [g3,b3], ~@9 b3@4 ~@11, ~@9 a#3 ~@14", P: "~@17 [g3,b3]@3 ~@4",
  Q: "~@8 [g3,b3]@5 ~@9 g3@2", R: "~@17 [g3,b3] ~@6", S: "~@8 [g3,b3] ~@15",
  T: "~@18 [g3,b3]@2 ~ g#3 [g3,b3]@2, ~@22 g#3 ~", U: "~@5 [g3,b3] ~@8 [g3,b3] ~@9", V: "g3 ~@11, b3 ~@23",
  W: "~ b3@5 ~@6, ~ g3@10 ~@13",
})).s("gm_epiano1").gain(0.33)

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~@4 A B A B A B A B A B A B A B C@2 D E F G F H I J I K I L@2 M F N I O I P I Q I R S
>`.pickRestart({
  A: "e2 b1 e1@6", B: "~@2 e1 a1@3 a#1@3 b1@10 ~ b1 d2@2 b1",
  C: "[e2@3 b1@3 e1@20 ~ a1@3 a#1@3 b1@9 f#2 g2 f#2 a1@3, ~@45 d2 ~@2]/2",
  D: "e2@2 b1 e1@3 f#1@2 ~ f#1@3 g1 ~@2 g1@3 a1 ~@2 a1@3", E: "~@2 e1 a1@3 a#1@3 b1@11 e1 d2@2 e2",
  F: "e1@2 ~ e1@3 f#1 ~@2 f#1@3 g1 ~@2 g1@3 a1 ~@2 a1@3",
  G: "~@2 e1 a1@3 a#1@2 ~ b1@4 ~ f#2 ~ [d2,f#2] ~ a1@2 f#1 b1@2 d2, ~@15 g2@2 ~@7", // D
  H: "~@2 e1 a1@3 a#1@2 ~ b1@11 f#1 f#2@2 g2", I: "e1@2 ~ e1@3 f#1 ~@2 f#1@3 g1 ~@2 g1@3 a1 ~@2 a1@2 ~",
  J: "~@2 e1 a1@3 a#1 ~@2 b1@11 f#1 d2@2 e2", K: "~@2 e1 a1@3 a#1@2 ~ b1@8 f#1 f#2 ~ f#2 ~ b1 ~, ~@19 g2@2 a1@2 ~",
  L: "[~@2 e1 a1@3 a#1@2 ~ b1@11 d2@2 e2 e1@2 ~@2 e1@3 f#1 ~@2 f#1@3 g1 ~@2 g1@3 a1@2 ~ a1@2 ~, ~@20 e1 ~@27]/2",
  M: "~@2 e1 a1@2 a#1@2 ~@2 b1@5 f#1 f#2 ~@2 d2@2 b1 ~ e2 ~, ~@8 g2 ~@3, ~@17 f#2@2 ~@2 d2@2 ~",
  N: "~@2 e1 a1@3 a#1@2 ~ b1@7 e1 d2@2 ~ d2@2 e2 ~", O: "~@2 e1 a1@3 a#1@2 ~ b1@7 f#1 ~ f#2 ~ f#2 a1@3, ~@19 g2@2 ~@3",
  P: "~@2 e1 a1@3 a#1 ~@2 b1@5 ~ e2@6 a1@2 b1", Q: "~@2 e1 a1@3 a#1 ~@2 b1@8 e1 d2@2 ~ d2@2 e2",
  R: "~@2 e1 a1@3 a#1@2 ~ b1@4 ~ a1 ~@3 a1@2 ~ a1@2 g1", S: "a1@2 b1 e1@2 ~@19",
})).s("gm_fretless_bass").gain(0.39)

// drums · kick
const kick = s("bd").struct(`<
  A B C D E F A D A B C D E F A D A B C D E F A D A B C D E F A D A B C D E F A D A B C D G
>`.pickRestart({
  A: "x ~@10 x!2 ~@10 x", B: "x ~ x ~@8 x!2 ~@2 x ~@8", C: "x ~@10 x!2 ~@8 x!3", D: "x ~@10 x!2 ~@2 x ~@8",
  E: "x ~@10 x!2 ~@11", F: "x!6 ~@5 x!2 ~@2 x ~@8", G: "x",
})).gain(0.39)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!44 ~>").gain(0.33)

// drums · clap
const clap = s("cp").struct("<~ A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3>".pickRestart({
  A: "~@3 x",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B C
>`.pickRestart({
  A: "x ~ x!2 ~@2 x ~@2 x ~@5 x ~@2 x ~@2 x ~@2", B: "~@6 x ~@2 x ~ x!2 ~ x!2 ~@2 x ~@4 x", C: "x",
})).gain(0.5)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A C A B A B A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~@5 x ~@2 x ~@3 x ~ x ~@2 x ~@2 x ~@3", B: "x ~@2 x ~ x ~@18", C: "~@3 x ~ x ~@18",
})).gain(0.17)

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

// drums · china
const china = s("cr").struct("<~@4 A ~@3 A ~@6 B A ~@2 C A ~@2 D ~ D ~ D ~@6 A ~@3 A ~@3 E@2 A>".pickRestart({
  A: "x", B: "~@7 x", C: "~@3 x", D: "~@23 x", E: "~ x ~ x",
})).gain(0.22)

// drums · tambourine
const tambourine = s("tb").struct(`<
  A B A B A B A B A B A B A B A B A B A B A C A B A B A B A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~@8 x!2 ~ x!2 ~@2 x ~ x ~@3 x ~ x", B: "x ~@5 x ~@2 x ~@5 x!2 ~@3 x!2 ~@2", C: "x ~@5 x ~@2 x ~@5 x!2 ~@4 x ~@2",
})).gain(0.39)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~@5 x", B: "~@8 x ~@2 x ~@12",
})).gain(0.22)

// drums · cowbell
const cowbell = s("cb").struct(`<
  A B A B A B A B A B A B A B A B A B A B A C A B A B A B A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~@9 x ~ x ~@12", B: "~@9 x ~@10 x ~@3", C: "~@3 x ~@4",
})).gain(0.28)

// drums · cowbell · soft notes
const cowbell_soft = s("cb").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@11 x ~@12",
})).gain(0.11)

// drums · congas
const congas = s("conga:18").struct(`<
  A B A B A B A B A B A B A B A B A B A B A C A B A B A B A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~@11 x ~@12", B: "~@17 x ~@2 x ~@3", C: "~@17 x ~@6",
})).gain(1.25)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  A B A B A B A B A B A B A B A B A B A B A ~ A B A B A B A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "~@5 x", B: "~@7 x",
})).gain(1.25)

// drums · congas · soft notes
const congas_soft = s("conga:33").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@23 x",
})).gain(0.54)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~
>`.pickRestart({
  A: "~@7 x",
})).gain(2.54)

stack(
  epiano1, epiano1_2, bass, kick, snare, clap, hihat, hihat_soft, open_hat, china, tambourine, tambourine_soft, cowbell,
  cowbell_soft, congas, congas_2, congas_soft, cabasa
)