Strudelify
It Came Upon a Midnight Clear   Away in a Manger cover art

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.
// note: The whole transcription plays 12 ms ahead of the beat; the grid follows it, so its parts stay together.
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, A@4 for four bars: 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@2 Y Z AA AB AC>".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 g5 f#5 d5 ~ e5 b4@2 [d4,f#4] a4@2 g4, ~ g5 ~@10", // Gsus2 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#5,f#6] 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] [b4,b5] [d#4,g4] [a4,a5]@2 [d#4,g4] [b4,b5]@2 ~, ~@6 b4@11 ~@7]/2", // D D# A# B 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 b5@2 [d4,f#4,f#5,g#5] [d5,b5]@2 ~ [d5,b5]@2 b4 e5 f#5 [d4,f#4] [e5,b5]@2 ~ e5 f#5 [d5,e5] [e5,b5]@2 d5, ~@3 e5 ~@8 b5@2 ~@4 b5@2 ~ [d4,f#4] ~@2", // G G#m7b5 G D E5 Dsus2 E5 D
  Q: "~@8 [d4,f#4] [e5,e6]@2 [d5,d6] ~@11 [d4,f#4]", // D E D
  R: "[~@2 f#5 ~@2 e5 ~@2 d5 ~@2 [c#5,d5] b4@2 c#5 d5@2 e5 b4 c#5 [d4,f#4] a4@2 f#4@7 [d4,f#4]@2 ~ [c4,g4] ~ [d4,f#4] ~@8 e5 f#5@2 [d4,f#4], ~@12 c#5 ~@20 d#4@2 ~@9 b5@3 ~]/2", // Dmaj7 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 ~ b5@2 d6 ~@2 a5 ~ a5 ~ b5 ~ b5 f#5 ~ f#5@2 g5 ~ g5 ~ [d4,f#4]@2, ~@6 d6@2 [d4,f#4]@5 ~@9 d#5 ~", // D
  V: "d#5 ~ f#5@2 ~ d#5 ~@6 a#4 a4 g4 a4@2 [d4,f#4] g4@2 f#4 ~@2 d#4, ~@4 e5@2 ~@5 [a4,e5]@2 ~@11", // D A5
  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 ~@2 b5 b6 b5 b6 b5 b6 b5 b6 b5 b6 [d4,b5] b6 ~ [c4,d#4,g4] f#4 d4@2 ~ e6 f#6@2 [d4,f#4] d6 e6 d6 b5 ~ e6@2 ~ [d4,f#4] f#5@2 e5 b5 ~@2 f#5 ~ d5, ~@7 b6@2 ~@9 f#4@2 b5@4 ~@11 a5 ~@8 a5@2 ~@2, ~@21 b6@2 ~@3 b6@2 ~@2 b6@2 ~@16]/2", // G Cm D
  Y: "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
  Z: "d4 ~@10 a4 ~@2 f#4 g4 ~ a4 b4 ~ c#5 [c5,d5] ~ [d5,e5]", // Csus2 Dsus2
  AA: "f#5@2 d5 e5 ~ f#5 [f5,g5] a5 ~ b5 c#6 ~ d6 ~ a5 b5 c#6 ~ d6 e6 ~ f#6 g6 ~", // Fsus2
  AB: "~@2 a6 ~ e6 f#6 d6 ~ b5 ~ e6 ~ a5 a#5 ~ e6@2 ~ [a5,e6]@2 ~ [a5,e6]@2 g5, ~@2 [d4,f#4]@10 e6@2 ~ a5 ~@8", // A5 D
  AC: "[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@2 U 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] ~@6 [g3,b3] ~@2",
  N: "~@8 [g3,b3] ~@14 [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!2 g3@2 ~@4 [g3,b3] ~@8 [g3,b3] ~@9, ~@11 b3 ~@12]/2", U: "~@5 [g3,b3] ~@8 [g3,b3] ~@9",
  V: "g3 ~@11, b3 ~@23", W: "~ [g3,b3]@5 ~@6",
})).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 A C D E F G H I F J F K F L F M F N F O F P F Q F R S
>`.pickRestart({
  A: "e2 b1 e1@6", B: "~@2 e1 a1@3 a#1@3 b1@10 ~ b1 d2@2 b1", C: "~@3 a1@3 a#1@3 b1@9 f#2 g2 f#2 a1@3, ~@21 d2 ~@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@2 ~",
  G: "~@2 e1 a1@3 a#1@2 ~ b1@4 ~ f#2 ~ f#2 d2 a1@2 f#1 b1@2 d2, ~@15 g2@2 ~@7",
  H: "e1@2 ~ e1@3 f#1 ~@2 f#1@3 g1 ~@2 g1@3 a1 ~@2 a1@3", I: "~@2 e1 a1@3 a#1@2 ~ b1@11 f#1 f#2@2 g2",
  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 a1@2 b1, ~@19 g2@2 ~@3",
  L: "~@2 e1 a1@3 a#1@2 ~ b1@11 e1 d2@2 e2",
  M: "~@2 e1 a1@2 ~ a#1@2 ~ b1@5 f#1 f#2 ~@2 d2@2 b1 d2@2 e2, ~@8 g2 ~@3, ~@17 f#2@2 ~@5",
  N: "~@2 e1 a1@3 a#1@2 ~ b1@8 e1 d2@2 ~ d2@2 e2", O: "~@2 e1 a1@3 a#1@2 ~ b1@8 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 ~@2 a1 ~@2 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 ~@3 A 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
)