Strudelify

Nocturne from Two Pieces for Violin and Piano

Lili Boulanger

KeyF majorTempo63 bpm
0:00/0:00
// Nocturne from Two Pieces for Violin and Piano — Lili Boulanger
// 63 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Transcription provider: pdmx. https://musescore.com/score/5961634; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 43 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(63/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 · piano
const piano = note("<~@6 A@7 B@6 C@6 D@6 ~@2 E@8 ~@2>".pickRestart({
  A: "[~@3 c6 ~ c5 ~@5 c6 ~ c5 c5@4 ~ c6 ~ c5 c5@4 ~@4 c4!2 f4@4 ~@3 c4 c4 ~@6 c4 c4 ~@2 c6 ~ c5 ~ c4, [c3,gb4,bb4]@7 c4 [gb4,bb4]@12 bb3@4 ~@8 [a3,e4]@12 c4@2 c5@3 c4 c5@3 ~ c5@2, ~ c4@5 c5@2 c3@4 c6@7 ~ c6@7 ~@11 c5@4 ~@2 [e3,ab3]@8 [e3,ab3,c6]@4, ~@2 c5@2 c6@5 c4@3 e4@8 [db4,e4,a4]@8 ~@4 c4 ~@3 [b3,d4,f4]@16 c4@3 ~, ~@2 [e4,ab4]@3 c5 ab4@8 ~ c5@2 ~ gb3@2 [gb3,bb3]@4 [c3,gb3,bb3]@4]/7", // Cm7b5 Gb A5 E Eaug A Bdim E …
  B: "[~ b3 ~ [e4,gb4,b4] ~ b3 ~ gb3 ~ b3 ~ [e4,gb4,b4] ~ b3 ~@25 a3 ~@7 [gb3,db4], [e2,b2,e3]@8 [e2,b2,e3]@9 gb3 [c4,e4,gb4] gb3 ab4@5 gb3 [c4,e4,gb4]@3 gb3 e4@2 [b1,b2,db4,ab4] [a3,eb4] b1@4 db4 eb4 [a3,e4] [gb3,db4] [b1,a3,e4] [gb3,db4] [a3,e4,b4] [gb3,db4] [a3,e4]@2, gb3@2 [e4,gb4] [b3,e4,gb4] gb3@2 [e4,gb4] b3@8 c4@5 [b2,db3]@4, ~ [e4,gb4]@2 ~ ab4@8 b4@15 gb3 ab4@2 gb4 gb3@5 db4 [a3,eb4] gb4@10, ~@2 b3@2 b4@5 [e4,gb4] b3@2 ab4@2 [e4,gb4] gb3 [d2,a2,d3]@5 gb3 [c4,e4,gb4] gb3 [d2,a2,d3]@10 [db4,ab4] [a3,eb4] [ab4,b5]@12]/6", // Esus2 Gb5 E5 Gbm7b5 Db7 Adim A5 Gb5 …
  C: "[~@16 a3 ~@6 a3 ~@23 [b3,g4], b2@6 gb4 eb4@5 [c4,gb4] [gb3,e4] gb4@4 [c4,g4] [a3,e4] g5@4 [eb4,a4] [b3,g4] f1@6 [eb4,bb4] [bb3,g4] eb1@5 [bb3,g4] [db2,g2,f3,f4,b4] [b3,g4] [db1,f4,b4] [b3,g4] [f4,b4,b5] [b3,g4] [f4,b4]@2, gb3@4 db4 [a3,eb4] db4@4 [c4,gb4] [gb3,e4] e5@4 [c4,g4] [a3,e4] bb1@6 [f2,b2,a3]@6 eb4 [b3,g4] [eb2,bb2,g3]@16, [db4,ab4]@2 b1@5 a3 a2@6 c4 gb3@5 [c4,g4] [a3,e4] c4@4 [eb4,a4] [b3,g4] a5@6 [eb4,bb4] [bb3,g4] bb5@12, ~ [a3,eb4] [db4,ab4] [a3,eb4] [ab4,b5]@4 [e3,c4,gb4] [gb3,e4] a1@5 e4 [g2,e3]@6 g4 e4@5 [eb4,a4] [b3,g4] a4@6 [eb4,bb4] [bb3,g4] [eb4,bb4]@10]/6", // Em Cdim Gb7 C5 A5 Ebdim Em Eb5 …
  D: "[~@30 a4@9 ~@10 [bb3,e4]@9 ~@10 a4@9 ~@10 [bb3,e4]@9 ~@10 a4@8 ~@9 [bb3,e4]@8 ~@22 [a3,d4]@7 ~@8 f4@6 ~@7 [ab3,d4]@6 ~@6 f4@6 ~@6 [a3,d4]@6 ~@6 f4@5 ~@6 [ab3,d4]@5 ~@5 [b3,f4]@6 ~@44, ~@2 [c4,g4,bb4]@76 c2@68 c3@15 [a3,d4]@7 c4@6 c6@13 d4@6 b3@6 c3@23 [b3,f4]@11 [ab3,d4]@11 ~@44, ~@2 [c2,c3]@19 bb3@9 d4@10 c6@38 c3@36 c6@32 [c4,f4]@15 c5@13 [b3,f4]@13 ab3@12 [c4,f4]@12 [a3,c5]@33 ~@44, ~@2 [f4,c5]@19 f4@76 [bb3,e4]@9 d4@8 [db4,a4]@17 [bb3,e4]@80 d4@6 c4@27 ~@44, ~@12 [d4,a4]@9 c5@19 [db4,a4]@19 [bb3,e4]@9 db4@10 [d4,a4]@19 c5@42 [db4,a4]@83 c6@22 ~@44]/6", // Bbdim D5 Abdim D5 Abdim Bdim C7 D5 …
  E: "[~@74 c3@3 ~@12 c5@3 ~@39 c4@3 c4@3 ~@27 db5@28, ~@17 c4@9 [f2,eb4,a4]@3 c3@3 c5@3 c4@3 [g3,eb4]@18 [c4,f4]@3 [c3,bb3]@3 d3@12 [a3,f4,a4]@18 c5@27 b2@27 [f2,bb3]@3 c3@3 d5@40, ~@20 a4@6 b4@21 [c3,d5]@3 [f2,d4,f4,c5]@3 d5@15 [c3,f4]@3 bb2@15 d4@9 c4@3 [f2,b3]@3 b2@6 b3@3 [b4,b5]@12 [f2,bb3,d4]@3 c3@9 c6@3 c4@3 d4@3 c3@3 d4@46, ~@23 bb4@18 [c4,d5]@3 f5@24 [f3,db4,g4]@12 c4@3 c5@3 c6@27 b3@33 e4@42 ~@4, ~@23 c3@3 g4@12 a4@15 c3@3 d4@6 [f3,c4]@3 bb3@9 [f2,c4,c5]@3 c3@21 [ab3,eb4,ab4]@24 [f4,g4]@30 bb4@3 c4@3 c6@3 c4@3 a4@12 ~@16]/8", // F7 Cm F5 C7 Dm Bb5 Csus2 Dm7 …
})).s("gm_piano").gain(0.3)

// chords · piano · soft notes
const piano_soft = note("<A@8 B@5 ~@17 C@6 ~@3 D@4>".pickRestart({
  A: "[~@3 c6 ~ c5 ~@5 c6 ~ c5 ~@5 c6 ~ c5 ~@5 c6 ~ c5 ~@5 c6 ~ c5 ~@5 c6 ~ c5 ~ c4@2 ~@14 c4, c3@8 c3@8 [c3,d5]@6 c5@2 c3@6 c5 c4 [c3,a4]@4 c6@4 c3@4 c6@2 c5@4 ~@14, ~ c4@6 c4@2 c4@6 c4 bb4@4 db5@5 c4@3 c6@4 c5 c4 c5@2 [ab4,b4]@4 c5 c4@3 ab4@8 ~@12, ~@2 c5@3 ~ c5@4 c5@3 ~ c5@3 c4@3 bb4@3 c4 d5@14 c5 c4 a4@16 ~@8, ~@4 c6@7 ~ c6@6 c5@2 c6@4 bb4@2 c5@2 [bb4,db5]@14 c5@2 b4@16 ~@4]/8", // Csus2 F Abm Bbm
  B: "[~@2 c5@3 ~@6 c6 ~ c5 ~@5 c6 ~ c5 ~@5 c6 ~ c5 ~@10, [c3,d4,f4,g4]@8 d4@4 [e4,c6]@4 c3 c4 c5@2 c6@6 c5@3 ~@11, bb3@4 ~@4 g4@16 ~ c4@3 ~@12, ~ c4@6 c4 bb3 c4 c5@2 [db4,a4]@16 c6@7 ~@5, ~@2 [c3,f4] bb3@3 c3@2 ~@2]/5", // Csus4 C Gbm F5
  C: "[~@11 c6@3 ~@3 c5@3 ~@15 c6@3 ~@3 c5@3 ~@3 c4@3 ~@36 [db4,e4]@48 ~@10, ~@2 [c3,f3,d4]@18 c5@6 [g3,bb3]@6 c5@9 ~@3 c5@6 e4@3 a4@6 c4@3 db4@12 e4@3 c3@6 c4@3 bb3@45 ~@13, ~@2 [g3,bb3]@12 [e3,db4]@24 [e3,g3,bb3,db4,c6]@12 ~@3 c3@9 [bb3,e4,g4]@3 c4@9 f2@12 g4@12 ~@46, ~@5 c4@9 [g3,bb3]@9 c4@3 [c3,f3,d4]@24 [f2,d4]@18 a4@3 c3@3 d4@48 ~@22, ~@8 c5@6 c6@15 c4@18 ~@3 [bb3,g4]@6 e4@3 f4@15 [bb3,g4]@3 a4@3 e4@3 f4@39 ~@22]/6", // Dbm Dm7 Gm Dbm C7 Edim Gm Dm7 …
  D: "[~@43 [f1,f2]@3 ~@2, ~@23 c3@3 bb3@3 c3@3 a4@18 [f2,d4,f4,g4]@3 c3@9 [f4,f5]@3 c5@6 c4@3 [f4,c5,f5,a5,f6]@18 ~@4, ~@26 gb4@21 c3@3 [bb2,d3,g3,bb3]@42 ~@4, ~@26 bb4@15 c4@3 [e4,ab4]@48 ~@4, ~@26 f2@6 [bb3,f4]@3 c4@3 c6@21 c4@3 [d4,g4,bb4,g5]@30 ~@4]/4", // F G7 F Gm E Bb5 Gm
})).s("gm_piano").gain(0.15)

stack(piano, piano_soft)