Strudelify
KeyG majorTempo112 bpm
0:00/0:00
// Magnificat — Maitrise de Notre Dame de Paris
// 112 bpm, 3/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/147629; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 133 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(112/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.

// chords · church organ · "Organ"
const church_organ = note(`<
  A@3 B C@2 ~@8 D@5 E@5 ~@8 D@5 E@5 ~@8 D@5 E@5 ~@8 D@5 E@5 ~@8 D@5 E@5 ~@8 D@5 E@5 ~@8 D@5 F@6
>`.pickRestart({
  A: "[[b2,g4,d5]@5 [e4,c5]@5 ~ b4@5 ~@5 [f#2,f#3]@21 ~ [g2,g3,d4,b4]@5, [g2,g3]@7 ~@9, ~@5 c3@11 d3@32, ~@11 d4@32 ~@5, ~@16 a4@27 ~@5]/3", // G C F# G
  B: "[c2,c3,c4,e4,c5]@5 [d2,d3,b4]@5 ~ [c2,f#2,f#3,a4]@5, ~@5 d4@11", // C G F#dim
  C: "[[g2,c4]@5 [g2,b3]@21 ~@6, [d2,g3,g4]@27 ~@5]/2", // C5 G G5
  D: "[[b2,g3,b3]@32 [b2,d4]@5 [c3,c4,e5]@5 ~ [b3,g4]@10 [a3,f#4]@27, [g4,d5]@37 ~@6 [d3,d5]@37]/5", // Em Bm C Em D G5 D
  E: "[[a2,d3,a3,f#4]@32 [g2,g3,b3,g4]@5 [c3,c4,a4,e5]@5 ~ [b3,g4]@5 [a3,f#4]@11 [g2,g3,g4,b4]@15 ~@6, d5@37 ~@6 [d3,d5]@16 ~@21]/5", // D G Am Em D G D
  F: "[[a2,d3,a3,f#4]@32 [g2,g3,b3,g4]@5 [c3,c4,a4,e5]@5 ~ [b3,g4]@5 [a3,f#4]@11 [g2,g3,g4,b4]@27 ~@10, d5@37 ~@6 [d3,d5]@16 ~@37]/6", // D G Am Em D G D
})).s("gm_church_organ").gain(0.48)

// chords · church organ · "Organ" · soft notes
const church_organ_soft = note(`<
  ~@6 A@6 B@2 ~@10 A@6 B@2 ~@10 A@6 B@2 ~@10 A@6 B@2 ~@10 A@6 B@2 ~@10 A@6 B@2 ~@10 A@6 B@2 ~@11
>`.pickRestart({
  A: "[[g3,d4,g4,b4]@21 [b2,g4,d5]@11 [c3,e4,c5]@5 b4@5 ~@17 [g2,g3]@21 [d2,d4,b4]@5 [c2,c3,e4,c5]@5 ~ [d2,d3,d4,b4]@5, g2@37 d4@43 ~@16, ~@21 g3@16 d3@48 ~@11, ~@37 [f#2,f#3]@21 ~@38, ~@43 a4@37 ~@16]/6", // G C G C G F#
  B: "[[d3,f#3,d4,a4]@11 [g2,g3,b3,g4]@16 ~@5]/2", // D G
})).s("gm_church_organ").gain(0.32)

stack(church_organ, church_organ_soft)