Strudelify

Serenade to Spring

Rolf Lovland

KeyA majorTempo45 bpm
0:00/0:00
// Serenade to Spring — Rolf Lovland
// 45 bpm, 6/8, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Transcription provider: pdmx. https://musescore.com/score/3745866; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 55 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(45/3)

// 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 · cello · "Violoncello"
const cello = note(`<
  ~ A B C D E B F G H ~@9 I J K L M J N O P Q R S T Q R S U B C D V B F G W J K L M J N O X Y Z@2
>`.pickRestart({
  A: "~@10 c#3 d3", B: "e3@2 a3@2 e3@2 d3@4 b2 c#3", C: "d3@2 b3@2 d3@2 c#3@4 a2 b2", D: "c#3 a3 f#3 e3@2 d#3",
  E: "e3@6 e3@2 ~@2 c#3 d3", F: "d3 b3 d3 c#3@2 e3", G: "a3@2 c#4@2 a3@2 f#3@2 d4@3 b3", H: "g#3@4 g#3 a3 a3@4 ~@2",
  I: "e3@6 e3@4 e3!2", J: "a3@2 g#3@2 e3@2 d3@4 e3 f#3", K: "g#3@3 f#3 e3@2 c#3@4 d3 e3", L: "f#3@2 f#3 e3@2 d3",
  M: "d#3@6 f3@2 ~@2 a3 g#3", N: "g#3@3 f#3 g#3@2 a3@4 a3!2", O: "b3@3 a3 f#3@2 e3@2 e3@2 d3@2", P: "d3@3 c#3@2 ~",
  Q: "c#3 d3", R: "e3", S: "f#3 g#3", T: "e3@5 ~", U: "e3@6 e3@4 c#3 d3", V: "e3@8 ~@2 c#3 d3",
  W: "g#3@4 g#3 a3 a3@4 e3!2", X: "d3@6 c#3@4 b2 c#3", Y: "~ d3@7 c#3@2 b2@5 a2@5 b2@4", Z: "[~ g#2@5 a2@29 ~@13]/2",
})).s("gm_cello").gain(0.25)

// chords · piano · "피아노"
const piano = note(`<
  A B C D E F G H I J ~@10 K L M N O P Q R S T U F S T V W S T U F S T V W K L M N O P Q X ~@3
>`.pickRestart({
  A: "a2 e3 a3 b3 c#4 a3 b2 f#3 b3 d4 b3@2, ~ e3@2 ~ f#3@2", B: "a2 e3 a3 c#4 e4 a3 a2 f#3 a3 d4 f#4@2, ~ e3@2 ~ f#3@2",
  C: "a2 e3 a3 c#4 e4 a4 b2 f#3 a3 d4 f#4 a4, ~ e3@2 ~ f#3@2",
  D: "e2 b2 g#3 b3 d4 g#4 a2 e3 a3 c#4 e4 a4, ~ b2@2 ~ e3@2",
  E: "f#2 c#3 f#3 a3 c#4 f#4 b2 f#3 a3 c#4 d#4@2, ~ c#3@2 e4 f#3@2",
  F: "e3 b3 e4 g#4 b4 e5 e2 b2 e3@4, ~@4 b3@8 [b4,g#5]@11 ~", // E
  G: "a2 e3 a3 c#4 e4 a4 b2 f#3 d5 c#5 b4 a4, ~ e3@2 ~ f#3@2",
  H: "e2 e3 b3 d4 e4 g#4 a2 e3 c#5 b4 a4 g#4, ~ e3@2 ~ e3@2",
  I: "c#3 a3 [a3,e4,c#5]@2 a3!2 d3 a3 [a3,f#4,d5]@2 a3!2, ~@2 [c#4,a4] ~@2 [d4,b4]", // A D F#m G
  J: "g#2 e3 b4 c#5 e3!2 a2 ~@5, ~ e3 d5 ~@3", K: "a2 e3 a4@2 e5@2 [f#4,d5]@4 [f#4,d5] c#5, [e4,c#5]@4 a3@8 a2@11 ~",
  L: "g#2 e3 e4@2 e5@2 [a2,e4,c#5]@4 c#5 e5, [e4,b4] g#3@2 ~@2 g#2", // A E5
  M: "f#2 c#3 ~ b4 c#5@2 [e4,c#5]@2 [f#4,d5]@2 [d4,f#4]@2, [f#4,a4]@4 f#3@8 b2@11 ~", // C#m D F#m
  N: "g#2 d#3 ~ a#3 c4 f#4 c#3@2 d#3@2 [c#4,f4] c#4, [c4,d#4,g#4] g#3@2 [c#4,f4]@2 f3", // C# G# C#
  O: "f#3 c#4 g#4 a4 e4 c#4 b2 f#3 c#4 d4 f#4 a4, [f#4,a4]@2 c#4@3 ~ d4@2 f#3@4", // F#m
  P: "e2 b2 ~ a4 b4 e4 a2 e3 a3@2 a2@2, [d4,g#4]@4 e3@4 e2@4 [e4,a4,c#5]@11 ~", // Ddim A
  Q: "b2 f#3 ~ c#4 d4 f#4 [b3,d4,a4]@4 g#4@2, [f#4,d5]@4 b3@8 [e2,e3]@11 ~", // Bm7 D E
  R: "a2@2 e3@2 ~@4 b3@2 d4@2 [a2,a3,c#4]@11 ~, [d4,e4,a4] ~@2, ~ a3@2 ~@3", // A Dsus2
  S: "~ [e5,c#6]@2 ~ [f#5,d6]@2, a4@11 ~ a4@11 ~", T: "~ [d5,b5]@2 ~ [e5,c#6]@2, g#4@11 ~ a4@11 ~",
  U: "~ [c#5,a5]@2 ~ [b4,g#5]@2, f#4@11 ~ g#4@11 ~", V: "~ [c#5,a5]@2 ~ [d5,b5]@2, f#4@11 ~ b4@11 ~",
  W: "~@2 [b4,g#5]@4 [c#5,a5] g#5 e5 d5 b4 g#4, e4@11 ~ a3@11 ~", // E F#m
  X: "a2 e3 ~@2 b3 d4 [a2,a3,c#4]@6, [d4,e4,a4] ~@2, ~ a3@2 ~@3", // A Dsus2
})).s("gm_piano").gain(0.39)

// chords · piano · "피아노" · soft notes
const piano_soft = note("<~@9 A B C D E F G H I J K ~@32 L@3>".pickRestart({
  A: "~@7 e3 a4 b4 c#5 e5, ~@2 e3", B: "c#3 g#3 c#4 d#4 f4 f#4 g#5@3 c#5 f#5 g#5, g#5@12 g#4@11 ~",
  C: "c#3@2 g#3@2 c#4@4 d#4@4 [f4,a5]@11 ~, a5 ~", D: "a2 e3 a3 c#4 e4 a4 b2 f#3 a3 d4 f#4 a4, ~ e3@2 ~ f#3@2",
  E: "e2 b2 g#3 b3 d4 g#4 a2 e3 a3 c#4 e4 a4, ~ b2@2 ~ e3@2",
  F: "f#2 c#3 f#3 a3 c#4 f#4 b2 f#3 a3 c#4 d#4@2, ~ c#3@2 e4 f#3@2",
  G: "e3 b3 e4 g#4 b4 e5 e2 b2 e3@4, ~@4 b3@8 [b4,g#5]@11 ~", // E
  H: "a2 e3 a3 c#4 e4 a4 b2 f#3 d5 c#5 b4 a4, ~ e3@2 ~ f#3@2",
  I: "e2 e3 b3 d4 e4 g#4 a2 e3 c#5 b4 a4 g#4, ~ e3@2 ~ e3@2",
  J: "c#3 a3 [a3,e4,c#5]@2 a3!2 d3 a3 [a3,f#4,d5]@2 a3!2, ~@2 [c#4,a4] ~@2 [d4,b4]", // A D F#m G
  K: "~@2 [b4,g#5]@4 [c#5,a5] g#5 e5 d5 b4 g#4, e4@11 ~ a3@11 ~", // E F#m
  L: "[~ b2@2 f#3@2 ~@3 c#4@2 d4@2 ~ f#4@2 [b3,d4,a4]@9 ~ g#4@5 a2@2 f#3@2 b3@5 b3@3 d4@2 [a2,a3,c#4,a4]@14 ~@14, ~ [f#4,d5]@5 b3@9 [e2,e3]@14 ~ a4@14 ~@28, ~@15 d4@5 ~@16]/3", // Bm7 A D E
})).s("gm_piano").gain(0.19)

stack(cello, piano, piano_soft)