Strudelify

Veni Jesu

M. Cherubini

KeyE♭ majorTempo96 bpm
0:00/0:00
// Veni Jesu — M. Cherubini
// 96 bpm, 3/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/74325; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 41 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(96/3)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · choir aahs · "Bass"
const bass = note("<~@4 A B C D E F G F A B C H I J K D ~@5 L A@2 M N O K D ~@2 P D ~@2 P Q>".pickRestart({
  A: "eb3@2 eb3", B: "c3@2 c3", C: "bb2@2 bb2", D: "eb3 ~@2", E: "c3!2 ~", F: "bb2!2 ~", G: "eb3@3 eb3 g3 eb3",
  H: "eb3@2 ~", I: "c4", J: "bb3@4 g3 ab3", K: "bb3@2 bb2", L: "~ eb3!2", M: "eb3 ~ eb3", N: "d3 ~ d3", O: "c3 ~ ab3",
  P: "~ bb2!2", Q: "eb3",
})).s("gm_synth_bass_1").gain(0.3)

// chords · church organ · "Organ"
const church_organ = note(`<
  A B C D E F G H I J K L E F M H N O P Q R S T U V W R X Y Z AA AB AC AD AE AF AG AD AE AF AH
>`.pickRestart({
  A: "~@8 eb3@8 [ab3,f4]@3 [g3,eb4]@2 [ab3,f4]@3, eb2, [g3,eb4]@2 eb3", // Db Cm Db Cm
  B: "~@2 eb3@2 [g4,bb4] [eb4,g4], eb2, [bb3,g4]@2 eb3", C: "~@2 eb3@2 [bb3,g4] [g3,eb4], eb2, [g3,eb4]@2 eb3",
  D: "[ab2,eb3,ab3,c4] [eb2,eb3,g3,bb3] ~", E: "[eb3,bb3,eb4,g4]@2 [eb3,bb3,eb4,g4]",
  F: "[c3,c4,eb4,g4]@2 [c3,c4,eb4,g4]", G: "[bb2,eb4,g4]@4 ab4 f4, ~@2 [bb2,d4]", H: "[eb3,eb4,g4,bb4]@2 ~",
  I: "[c3,g3,eb4]!2 ~", J: "[bb2,bb3,d4,f4]!2 ~",
  K: "[eb3,bb3,eb4,g4]@3 [eb3,g3,eb4] [eb3,g3,eb4,bb4] [eb3,bb3,eb4,g4]", L: "[eb4,g4] [d4,f4] ~, [bb2,bb3]@2 ~",
  M: "[bb2,eb4,g4]@4 ab4 f4, ~@2 d4", N: "[c4,eb4,ab4,eb5]", O: "[bb3,eb4,g4,eb5]@4 [g3,bb3] [ab3,c4], ~@2 [eb4,eb5]",
  P: "[bb3,g4,eb5]@2 [bb2,ab3,f4,d5]", Q: "[eb3,g3,eb4,eb5] [bb4,g5]!2",
  R: "eb2@2 ~ [ab4,f5] [eb3,g4,eb5]@2, [bb4,g5] ~, ~ eb3 ~", S: "[eb2,g4,eb5] [eb3,ab4,f5] [eb3,bb4,g5]",
  T: "[bb2,ab4,f5] [bb3,f5,ab5]!2", U: "bb2@2 ~ [eb5,g5] [bb3,d5,f5]@2, [f5,ab5] ~, ~ bb3 ~",
  V: "[bb2,d5,f5] [bb3,eb5,g5] [bb3,f5,ab5]", W: "[eb2,eb5,g5] [eb3,bb4,eb5,g5]!2",
  X: "eb2@2 ~ [bb4,d5] [c5,eb5] [ab4,c5], [ab4,c5] ~, ~ eb3!2", Y: "[eb3,g4,bb4] ~ [eb3,eb4,g4,bb4]",
  Z: "[d3,f4,ab4,bb4] ~ [d3,f4,g4,b4]", AA: "[c3,eb4,g4,c5] ~ [ab2,ab3,ab4,f5]",
  AB: "[bb2,bb3,g4,eb5]@2 [bb2,bb3,f4,bb4,d5]", AC: "[eb2,eb3,g4,bb4,eb5] [bb4,g5]!2",
  AD: "~@3 [ab4,f5] [bb3,f4,d5]@2, [bb4,g5] ~, ~ bb3 ~", AE: "[eb3,g4,eb5] [g4,bb4]!2",
  AF: "~ [bb2,bb3] [bb2,bb3,f4,ab4], [g4,bb4]@2 ~", AG: "[eb3,bb3,eb4,g4] [bb4,g5]!2", AH: "[eb3,bb3,eb4,g4]@2 ~",
})).s("gm_church_organ").gain(0.3)

stack(bass, church_organ)