Strudelify

Abendlied

Josef Rheinberger

KeyF majorTempo70 bpm
0:00/0:00
// Abendlied — Josef Rheinberger
// 70 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/4879422; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 50 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(70/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 · trumpet · "C Trompete"
const trumpet = note(`<
  ~@7 A B C D E F G H I J K L M N@2 O@3 P Q@2 R S T U ~@2 V W X Y Z ~ AA AB AC AD AE AF ~@4
>`.pickRestart({
  A: "~@3 f4, ~ g4@2 ~, ~ c5", B: "e4@2 ~@4 d4 eb4, c5!2, ~ c4@2 ~", C: "d4 bb3, d5", D: "[a3,c5]", E: "~ g4 bb4 d5",
  F: "d5 a4", G: "bb4 d5", H: "~ eb4 g4 bb4, g5", I: "bb4 f4, f5", J: "[g4,eb5]", K: "[gb4,d5]", L: "~ d5@2 d5",
  M: "d5 g4 a4 bb4", N: "[c5@5 bb4 c5 [g4,d5], ~@5 g4@2 ~]/2", O: "[g4 c4 d4 eb4 f4@6 [f4,d5]@2, eb5@5 ~]/3",
  P: "~ c4!2 [c4,c5], c5@3 ~", Q: "[[g4,c5]@2 c5@2 ~ a4 g4 [f4,c5], ~@2 c4@3 ~@3, ~@4 c5@3 ~]/2", R: "[e4,c5]",
  S: "~ [e4,c5] [f4,d5] [g4,e5]", T: "[f4,f5] [g4,f5]", U: "[g4,f5] [g4,e5]", V: "~ a4@2 a4",
  W: "a4 d4 e4 [f4,d5], ~ d5@2 ~", X: "c5 d5 e5 f5, e4 a4", Y: "f5 e5, g4", Z: "f4 ~, f5 ~@3",
  AA: "~ [f4,a4] [e4,g4]@2", AB: "f4 ~", AC: "~ c5 bb4 [a4,f5]", AD: "f5 e5 d5 [g4,e5], g4@3 ~", AE: "[f4,f5]!2",
  AF: "[a4,e5] [f4,d5]", // A5 Dm
})).s("gm_trumpet").gain(0.4)

// chords · trumpet · "C Trompete" · soft notes
const trumpet_soft = note("<A B C D E F G H ~@30 I J K ~@5 L M N@2>".pickRestart({
  A: "[f4,c5]@3 [f4,c5]", B: "[e4,c5]", C: "~ [e4,c5] [f4,d5] [g4,e5]", D: "[f4,f5] [g4,f5]", E: "[g4,f5] [g4,e5]",
  F: "d5@3 d5", G: "c5!2", H: "c5 ~", I: "~ f5 e5 d5", J: "c5 ~ bb4 [a4,c5], ~ c5@2 ~", K: "[g4,bb4] ~@3",
  L: "[e4,c5]@2 bb4 a4, ~ c4", M: "[c4,g4]", N: "[[c4,f4]@19 ~@13]/2",
})).s("gm_trumpet").gain(0.2)

// other · trombone · "Posaune"
const trombone = note(`<
  ~@2 A B C ~@4 D E F G H I@3 J ~@5 K L M@2 N O P B C ~@2 Q R S T U ~@2 V W X G Y ~@4
>`.pickRestart({
  A: "~@3 e4", B: "d4!4", C: "c4 e4", D: "~ bb3 d4 f4", E: "f4 c4", F: "eb4@4 d4@2 c4 bb3", G: "a3 d4", H: "d4!2",
  I: "[bb3@4 eb4@6 eb4@2 d4@6 c4 bb3 a3@4]/3", J: "d4", K: "~ f4@2 f4", L: "f4 bb3 c4 d4",
  M: "[e4@4 f4@6 e4 d4 e4@4]/2", N: "f4 ~", O: "c4@3 c4", P: "e4@3 e4", Q: "~ f4@2 e4", R: "d4@3 d4", S: "e4 f4",
  T: "c4@3 bb3", U: "a3 ~", V: "~ f4 e4 d4", W: "c4!2", X: "c4", Y: "c4 d4",
})).s("gm_trombone").gain(0.4)

// other · trombone · "Posaune" · soft notes
const trombone_soft = note("<~ A B ~@36 C D E ~@4 F G H@2>".pickRestart({
  A: "c4@3 c4", B: "e4@3 ~", C: "g3 a3", D: "bb3@3 c4", E: "d4 ~@3", F: "e4 f4", G: "c4@3 bb3", H: "[a3@19 ~@13]/2",
})).s("gm_trombone").gain(0.2)

// chords · tuba · "Euphonium"
const tuba = note(`<
  ~@5 A B C D E F G H I J@2 K L ~@2 M N O@2 P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK ~@4
>`.pickRestart({
  A: "~ g3@2 f3", B: "e3 c3 f3 [f3,a3], ~ g3@2 ~", C: "e3 c3 [f3,a3] a3, bb3 ~", D: "[g3,bb3] [f3,a3]", E: "[bb2,bb3]",
  F: "~ f3 a3 c4, f2", G: "c4 g3", H: "gb3", I: "~ g2 bb2 [d3,bb3], g3@3 ~",
  J: "[eb3@4 ~@3 d3, bb3@3 bb3, ~@4 bb2@3 ~]/2", K: "g3 a3, c3", L: "[d3,a3]", M: "~ d4@2 d4", N: "d4 g3 a3 bb3",
  O: "[~ c3@2 c3 c3 f3 g3 a3, c4]/2", P: "bb3@4 bb3@3 a3, ~ bb2", Q: "g3@2 f3 [c3,a3], c3@3 ~", R: "bb3@6 a3 g3, c3",
  S: "[f2,a3] ~", T: "~ c4 bb3 [a2,a3], a2@3 ~", U: "[c3,g3]@3 [c3,c4]", V: "[d3,a3]!2 [g3,b3]!2", W: "[c3,g3] [c3,c4]",
  X: "~ g3@2 g3", Y: "g3 c3 d3 [e3,c4], ~ c4@2 ~", Z: "[f3,c4] ~ g3 a3, ~ f3@3", AA: "[bb2,bb3]!2",
  AB: "[c3,bb3]@2 a3 f3, ~ c3", AC: "[c3,c4]", AD: "[d3,f3] ~", AE: "~ f3", AF: "bb2@2 ~ g3, g3@3 ~, ~ c3",
  AG: "[d3,f3]@2 g3 f3", AH: "~ c3 ~ a3, e3 f3", AI: "[c3,c4]@3 [c3,c4]", AJ: "[d3,f3] [d3,a3]", AK: "[a2,a3] [bb2,d3]",
})).s("gm_tuba").gain(0.4)

// chords · tuba · "Euphonium" · soft notes
const tuba_soft = note("<~ A B C D ~@33 E F ~@6 G H I@2>".pickRestart({
  A: "[a2,a3]@3 [a2,a3]", B: "[c3,g3]@3 [c3,c4]", C: "[d3,a3]!2 [g3,b3]!2", D: "[c3,g3] [c3,c4]", E: "~ [d3,f3]",
  F: "e3 ~", G: "[c3,g3] [c3,a3]", H: "[c3,c4]", I: "[[f2,c3]@19 ~@13]/2",
})).s("gm_tuba").gain(0.2)

stack(trumpet, trumpet_soft, trombone, trombone_soft, tuba, tuba_soft)