Strudelify

sunshine adagio in d minor

John Murphy

KeyG majorTempo120 bpm
0:00/0:00
// sunshine adagio in d minor — John Murphy
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5935248; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 115 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 · string ensemble 1 · "Violins"
const string_ensemble_1 = note(`<
  A@4 B@2 C@2 B@2 D@2 E@2 F@2 G@2 H I J K L M N@2 O@2 P@2 Q@2 R@2 S@2 P@2 Q@2 A@4 B@2 C@2 T@2 O@2 U@2 V@2 W@2 X@2 Y@2
  Z@2 AA@2 AB@2 AC@2 AD@2 N@2 O@2 P@2 Q@2 R@2 S@2 P@2 Q@2 R@2 S@2 P@2 Q@2 R@2 S@2 P@2 AE@2 AF@2 AG@2 AH@2 AI@2 AJ@3
>`.pickRestart({
  A: "g3/2", B: "b3/2", C: "a3/2", D: "c4/2", E: "d4/2", F: "[d4,f#4]/2", G: "[~ f#4, [b3,e4,g4]]/2", H: "[c4,e4,g4]",
  I: "[c4,e4,g4,a4]", J: "[b3,d4,g4,b4]", K: "[b3,d4,g4,a4]", L: "[a3,d4,f#4,g4]", M: "[a3,d4,f#4]",
  N: "[b3,e4,g4,e5,g5]/2", O: "[c4,e4,g4,c5,e5,c6]/2", P: "[b3,d4,g4,d5,g5,d6]/2", Q: "[a3,d4,f#4,a4,f#5,a5,f#6]/2",
  R: "[b3,e4,g4,e5,g5,g6]/2", S: "[~ [a4,a6], [c4,e4,g4,c5,e5,c6,g6]]/2", T: "[a5 g5, [b3,e4,g4,e5]]/2",
  U: "[b3,d4,g4,d5,g5,b5]/2", V: "[a3,d4,f#4,a4,f#5,b5]/2", W: "[e3,g3,b3]/2", X: "[e3,g3,c4]/2", Y: "[g3,b3,d4]/2",
  Z: "[a3,d4,f#4]/2", AA: "[b3,e4,g4]/2", AB: "[~ a4, [g3,c4,e4]]/2", AC: "[b3,d4,g4,b4]/2",
  AD: "[~ a4, [a3,d4,f#4,b4]]/2", AE: "[a3,d4,f#4,a4,f#5,a5,d6]/2", AF: "[a6 g6, [b3,e4,g4,e5,g5]]/2",
  AG: "[c4,e4,g4,c5,e5,c6,g6,c7]/2", AH: "[b3,d4,g4,d5,g5,d6,d7]/2", AI: "[a3,d4,f#4,a4,f#5,a5,d6,f#7]/2", AJ: "g3/3",
})).s("gm_string_ensemble_1").gain(0.3)

// chords · piano · "Contrabasses"
const piano = note(`<
  A@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 F@2 G@2 H@2 I@2 F@2 J@2 C@2 I@2 F@2 J@2 C@2 I@2 K@2 L@2 M@2 N@2 O@2 P@2 Q@2 R@2 F@2
  J@2 C@2 I@2 F@2 J@2 C@2 I@2 F@2 J@2 C@2 I@2 K@2 S@2 M@2 T@2 F@2 J@2 C@2 I@2 U@2 V@2 W@2 X@2 U@2 V@2 W@2 X@2 Y@3
>`.pickRestart({
  A: "e1/2", B: "c2/2", C: "g1/2", D: "d2/2", E: "e2/2", F: "[e1,e2]/2", G: "[c1,c2]", H: "g1", I: "[d1,d2]/2",
  J: "[c1,c2]/2", K: "[b3 g3 b3 g3 b3 g3 b3 g3 b3 g3 b3 g3 b3 g3 b3 g3, [e1,e2]]/2",
  L: "[c4 g3 c4 g3 c4 g3 c4 g3 c4 g3 c4 g3 c4 g3 c4 g3, c2]/2",
  M: "[b3 g3 b3 g3 b3 g3 b3 g3 b3 g3 b3 g3 b3 g3 b3 g3, [g1,g2]]/2", // G
  N: "[b3 f#3 b3 f#3 b3 f#3 b3 f#3 b3 f#3 b3 f#3 b3 f#3 b3 f#3, [d2,f#2]]/2", // D
  O: "[[b3,g4] e4 [b3,g4] e4 [b3,g4] e4 [b3,g4] e4 [b3,g4] e4 [b3,g4] e4 [b3,g4] e4 [b3,g4] e4, [e1,e2,e3]]/2", // Em E
  P: "[[c4,g4] e4 [c4,g4] e4 [c4,g4] e4 [c4,g4] e4 [c4,g4] e4 [c4,g4] e4 [c4,g4] e4 [c4,g4] e4, [c1,c2,c3]]/2", // C5 C
  Q: "[[d4,b4] g4 [d4,b4] g4 [d4,b4] g4 [d4,b4] g4 [d4,b4] g4 [d4,b4] g4 [d4,b4] g4 [d4,b4] g4, [g1,g2], d3 d3]/2", // G
  R: "[[d4,b4] f#4 [d4,b4] f#4 [d4,b4] f#4 [d4,b4] f#4 [d4,b4] f#4 [d4,b4] f#4 [d4,b4] f#4 [d4,b4] f#4, [d1,d2,f#2]]/2", // G D
  S: "[c4 g3 c4 g3 c4 g3 c4 g3 c4 g3 c4 g3 c4 g3 c4 g3, [c1,c2]]/2", // C
  T: "[b3 f#3 b3 f#3 b3 f#3 b3 f#3 b3 f#3 b3 f#3 b3 f#3 b3 f#3, [d1,d2,f#2]]/2", // D
  U: "[[e4,b4] g4 [e4,b4] g4 [e4,b4] g4 [e4,b4] g4 [e4,b4] g4 [e4,b4] g4 [e4,b4] g4 [e4,b4] g4, [e1,e2,e3]]/2", // E5 E
  V: "[[e4,c5] g4 [e4,c5] g4 [e4,c5] g4 [e4,c5] g4 [e4,c5] g4 [e4,c5] g4 [e4,c5] g4 [e4,c5] g4, [c1,c2,c3]]/2", // C
  W: "[[g4,d5] b4 [g4,d5] b4 [g4,d5] b4 [g4,d5] b4 [g4,d5] b4 [g4,d5] b4 [g4,d5] b4 [g4,d5] b4, [g1,g2], d3 d3]/2", // G5 G
  X: "[[f#4,d5] b4 [f#4,d5] b4 [f#4,d5] b4 [f#4,d5] b4 [f#4,d5] b4 [f#4,d5] b4 [f#4,d5] b4 [f#4,d5] b4, [d1,d2,f#2], d3 d3]/2", // D
  Y: "[e1,e2]/3", // E
})).s("gm_piano").gain(0.45)

// drums · kick
const kick = s("bd").struct("<~@56 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@21 B@20 ~@3>".pickRestart({
  A: "x!2 ~@6", B: "x!8",
})).gain(0.3)

// drums · snare
const snare = s("sd").struct("<~@64 [x!8]!24 ~@27>").gain(0.3)

// drums · crash
const crash = s("cr").struct("<~@19 [~@8 x!8] x ~@94>").gain(0.15)

stack(string_ensemble_1, piano, kick, snare, crash)