Strudelify

First Love: Original Composition for String Quartet

Estelle Luong

KeyD♭ majorTempo90 bpm
0:00/0:00
// First Love: Original Composition for String Quartet — Estelle Luong
// 90 bpm, 6/8, key Db major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (3/4 at bar 1, 6/8 at bar 15) are rendered on a constant 6/8 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/2832651; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 111 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(90/3)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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.

// other · violin · "Violin I"
const violin = note(`<
  ~@4 A@2 ~@4 B@5 C@6 D@5 E@2 F@2 G@2 H@2 G@2 I@7 J@3 ~@2 K L M N O@2 P@2 ~@33 Q R S T U@2 V W X O Y Z AA AB AC AD AE AF
  AG AH ~@2
>`.pickRestart({
  A: "[~@3 f5 eb5 [a4,f5]@6 ~]/2", B: "[~@4 bb4 ~ db5 ~ eb5 ~ f5@42 db4@2 eb4@2 f4@2 ab4@2]/5",
  C: "[bb4 ab4 c5@5 db5 ab4@6 ~@3 bb4@3 db5@3 eb5@3 f5@5 ab5 eb5@4]/6",
  D: "[~ f5 d5@6 ~@3 f5@3 gb5@6 f5 d5 eb5 bb5@2 bb5!2 gb5 ab5 bb5]/5", E: "[gb5 ab5 bb5 gb5 ab5 bb5@3 ~@4]/2",
  F: "[~@2 ab4@3 eb4@3 ab5@2 bb5@2]/2", G: "[gb5@2 [gb4,eb5]@3 [gb4,eb5]@2 [gb4,eb5] ab5@2 f5@2]/2",
  H: "[c5@2 [ab4,c5]@3 [ab4,c5]@2 [ab4,c5] ab5@2 bb5@2]/2", // Ab
  I: "[c5@4 [ab4,c5]@6 [ab4,c5]@4 [ab4,c5]@2 ~@2 [eb4,gb4] ~ [f4,ab4] ~ [gb4,bb4]@6 bb4@12 ~@2 [f4,ab4] ~ [gb4,bb4] ~ [ab4,c5]@6 c5@12 ~@2 [eb4,gb4] ~ [f4,ab4] ~ [gb4,bb4]@6 bb4@8]/7", // Ab Ebm Fm Gb Fm Gb Ab Ebm …
  J: "[~@6 [f4,ab4] ~ [gb4,bb4] ~ [ab4,c5]@6 f5@12 ~@8]/3", K: "b4", L: "b4 db5", M: "bb4", N: "bb4 b4", O: "ab4",
  P: "bb4/2", Q: "~ eb5 f5 db5@3", R: "f4", S: "~ eb5 f5 c5@3", T: "~ bb4 c5 db5@3", U: "db5", V: "f5", W: "f5 ab5",
  X: "c5@5 db5", Y: "~ bb4", Z: "db5 eb5", AA: "f5@5 ab5", AB: "eb5@5 f5", AC: "d5", AD: "~ f5", AE: "gb5",
  AF: "f5 d5 eb5 bb5@2 bb5", AG: "bb5 gb5 ab5 bb5 gb5 ab5", AH: "bb5 gb5 ab5 bb5@3",
})).s("gm_violin").gain(0.25)

// other · violin · "Violin I" · soft notes
const violin_soft = note(`<
  A B@3 C ~@52 D ~@2 E F G H I J K L M N O P ~@2 Q R S@3 T U V W X@2 Y Z S@2 ~@22
>`.pickRestart({
  A: "~@5 db4", B: "[eb4 f4 ab4 bb4 ab4 c5@9 ~@3 bb4]/3", C: "c5 db5 eb5 ~@3", D: "~ a4", E: "c5@5 db5", F: "ab4",
  G: "~ bb4", H: "db5 eb5", I: "f5@5 ab5", J: "eb5@5 f5", K: "d5", L: "~ f5", M: "gb5", N: "f5 d5 eb5 bb5@2 bb5",
  O: "bb5 gb5 ab5 bb5 gb5 ab5", P: "bb5 gb5 ab5 bb5@3", Q: "ab4!2", R: "bb4", S: "eb4", T: "~ eb5 f5 db5@3", U: "f4",
  V: "~ eb5 f5 c5@3", W: "~ bb4 c5 db5@3", X: "db5", Y: "f5", Z: "[g4,bb4]",
})).s("gm_violin").gain(0.15)

// other · violin · "Violin II"
const violin_2 = note(`<
  ~@4 A@2 ~@3 B@2 C D E@2 C D F@2 G@4 H@5 I@3 J@2 K L M N O@7 P@2 ~@2 Q@2 R S T@2 U@2 V W ~@5 X Y Z AA AB AC AD AE AF ~
  AG Z@2 Y@2 AH AI AJ AK Y AL@2 Z AM Y AH AI AJ AK Y AL@2 Z AN ~@2 AO@2 Y Z AA AB AC AD AE AP ~@2
>`.pickRestart({
  A: "[~@2 eb4 db4 c4 c4@6 ~]/2", B: "ab5 ab4 ~@4", C: "~@3 ab5 ab4 ~", D: "ab5 ab4 ~ ab5 ab4 ~",
  E: "[ab5 ab4 ab4@6 ab3@4]/2", F: "[ab5 ab4 ~ gb5 f5 eb5@2 ab4@4 bb4]/2",
  G: "[ab4 c5 db5@6 c5@6 ~ gb5 f5 eb5@2 d5 d5@2 eb5 d5]/4",
  H: "[c5 bb4 bb4@3 eb5@3 a4@3 ab4@3 gb4@3 f4@3 eb4@3 ab4@3 ~@4]/5", I: "[~@2 f5@3 c5@3 bb4@6 bb4@3 eb5]/3",
  J: "[bb4 eb5 [ab4,c5,f5]@6 [ab4,c5,f5]@3 ab5]/2", K: "f5 ab5 gb4 ab4 bb4 gb4", L: "ab4 bb4 gb4 ab4 bb4 gb4",
  M: "ab4 bb4 ab4 bb4 c5 ab4", N: "bb4 c5 ab4 bb4 c5 ab4",
  O: "[bb4@2 c5@2 bb4@12 ~@2 [eb4,gb4] ~ [f4,ab4] ~ [gb4,bb4]@6 f5@12 ~@2 [f4,ab4] ~ [gb4,bb4] ~ [ab4,c5]@6 bb4@12 ~@2 [eb4,gb4] ~ [f4,ab4] ~ [gb4,bb4]@6 f5@8]/7", // Ebm Fm Gb Fm Gb Ab Ebm Fm …
  P: "[~@6 [f4,ab4] ~ [gb4,bb4] ~ [ab4,c5]@6 ~@8]/2", // Fm Gb Ab
  Q: "~@4 [b4,db5] ~ [b4,db5] ~ [b4,db5] ~ [b4,db5] ~@5 [b4,db5]@2 ~@2 [b4,db5]@2 ~@2", // Bsus2
  R: "~@4 [bb4,db5] ~ [bb4,db5] ~ [bb4,db5] ~ [bb4,db5] ~@5 [bb4,db5]@2 ~@2 [bb4,db5]@2 ~@2", // Bbm
  S: "~@4 [bb4,db5] ~ [bb4,db5] ~ [bb4,db5] ~ [bb4,db5] ~@5 [b4,db5]@2 ~@2 [b4,db5]@2 ~@2", // Bbm Bsus2
  T: "~@4 [ab4,c5] ~ [ab4,c5] ~ [ab4,c5] ~ [ab4,c5] ~@5 [ab4,c5]@2 ~@2 [ab4,c5]@2 ~@2", // Ab
  U: "~@4 [bb4,d5] ~ [bb4,d5] ~ [bb4,d5] ~ [bb4,d5] ~@5 [bb4,d5]@2 ~@2 [bb4,d5]@2 ~@2", V: "d5@2 eb5 f5@2 d5",
  W: "c5@2 eb5 f5@3", X: "ab4 bb4", Y: "db5", Z: "c5", AA: "~ gb5 f5 eb5@2 d5", AB: "d5@2 eb5 d5 c5 bb4", AC: "bb4 eb5",
  AD: "a4 ab4", AE: "gb4 f4", AF: "eb4 ~", AG: "f5 c5", AH: "db5 eb5 f5 db5@3", AI: "eb4", AJ: "db5 eb5 f5 c5@3",
  AK: "f4", AL: "~ bb4 c5 db5@3", AM: "eb5", AN: "c5 eb5", AO: "[~ gb5 f5 eb5@2 ab4@4 bb4 ab4 c5]/2", AP: "eb4 ab4",
})).s("gm_violin").gain(0.3)

// other · violin · "Violin II" · soft notes
const violin_soft_2 = note("<~ A@3 B ~@92 C D ~@12>".pickRestart({
  A: "[c4 db4 c4 bb3 c4 bb3@9 ~@3 ab4]/3", B: "gb4 f4 ~@4", C: "~ db4!2 ~ db4!2", D: "~ ab4!2 ~ ab4!2",
})).s("gm_violin").gain(0.2)

// other · cello · "Violoncello"
const cello = note(`<
  ~ A B@2 C D ~@2 E F G H@4 I@2 J K L M N O@2 P Q R S@3 T U V W T U V X@5 Y@4 ~@2 Z AA AB AC AD AE AF AG ~ AH AD@2 AI AJ
  AK AL AM AN AO AP AK AQ AR AS AT AU AV AW AX@2 AY@2 AZ@2 BA@2 BB@2 BC@2 AY BD AZ AD BA@2 BB@2 BE BF BG BH BI BF BJ BK
  AP AK BL BM@2 AT ~
>`.pickRestart({
  A: "~@5 bb2", B: "[f3 c4 ab3@6 ~@4]/2", C: "~@5 f2", D: "c3 c4 a3@3 ~", E: "~@4 db3 ~ db3 ~ db3 ~ db3 ~",
  F: "db3 ~ db3 ~ db3 ~ db3 ~ db3 ~ db3 ~", G: "db3 ~ db3 ~ gb3 ~ gb3 ~ gb3 ~ gb3 ~",
  H: "[gb3 ~ gb3 ~ gb3@12 [ab2,gb3]@24 ~@8]/4", I: "[~@2 db2@3 db2@2 eb2 f2 c3 f3 g3]/2", J: "ab3 f3 eb2 bb2 gb3 eb2",
  K: "bb2 gb3 ab2 eb3 ab3 ab2", L: "eb3 ab3 db2 ab2 db3 db2", M: "ab2 db3 f2 c3 f3 f2", N: "c3 f3 bb2 f3 bb3 c4",
  O: "[d4 f4 bb3@3 d2@3 eb2 bb2 gb3 eb2]/2", P: "bb2 gb3 d2 bb2 gb3 db2", Q: "bb2 gb3 c2 gb2 c3 c2",
  R: "gb2 c3 c2 ab2 c3 c2", S: "[ab2@2 c3@2 [ab2,c3]@24 eb2 ~ eb2 ~ eb2 ~ eb2 ~]/3",
  T: "eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~", U: "eb2 ~ eb2 ~ f2 ~ f2 ~ f2 ~ f2 ~", V: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~",
  W: "f2 ~ f2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~", X: "[f2 ~ f2 ~ c3@12 [c3,ab3]@12 db3@12 [d3,bb3]@12 ~@8]/5",
  Y: "[~ eb3@3 f3@3 f3@3 ab3@2]/4", Z: "ab2!3", AA: "ab2!2", AB: "eb2!2", AC: "[eb3,gb3]", AD: "f2!2", AE: "f3!2",
  AF: "bb2!2", AG: "[bb2,f3]", AH: "~@3 f3 c3 f2", AI: "db2@3 db2@2 eb2", AJ: "f2 c3 f3 g3 ab3 f3",
  AK: "eb2 bb2 gb3 eb2 bb2 gb3", AL: "ab2 eb3 ab3 ab2 eb3 ab3", AM: "db2 ab2 db3 db2 ab2 db3", AN: "f2 c3 f3 f2 c3 f3",
  AO: "bb2 f3 bb3 c4 d4 f4", AP: "bb3 d2", AQ: "d2 bb2 gb3 db2 bb2 gb3", AR: "c2 gb2 c3 c2 gb2 c3",
  AS: "c2 ab2 c3 c2 ab2 c3", AT: "[ab2,c3]", AU: "ab2", AV: "bb2!6", AW: "bb2 f3 bb3 c4 db4 bb3",
  AX: "g2 eb3 bb3 c4 db4 bb3", AY: "gb2 eb3 bb3 c4 db4 bb3", AZ: "f2 db3 ab3 bb3 c4 ab3", BA: "eb2 bb2 eb3 f3 c4 ab3",
  BB: "ab2 eb3 ab3 bb3 c4 ab3", BC: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~", BD: "gb2!2", BE: "eb2 ab2", BF: "db3@3 db3@2 eb3",
  BG: "f3@3 f3@2 gb3", BH: "eb3@3 eb3@2 eb3", BI: "gb3@3 gb3@2 gb3", BJ: "f3@3 f3@2 f3", BK: "bb2@3 bb2@2 bb2",
  BL: "d2 bb2 gb3 db2 ~@2", BM: "c2 gb2 c3 c2 ~@2",
})).s("gm_cello").gain(0.3)

stack(violin, violin_soft, violin_2, violin_soft_2, cello)