Strudelify

It's been so long

The Living Tombstone

KeyA♭ majorTempo184 bpm
0:00/0:00
// It's been so long — The Living Tombstone
// 184 bpm, 4/4, key Ab 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 (4/4 at bar 1, 2/4 at bar 130, 4/4 at bar 131) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/766806; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 141 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(184/4)

// 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 · marimba
const marimba = note(`<
  A@2 B@2 C D C E ~@8 F@6 ~@2 G H@2 I@2 J@8 K@2 L M L N L O@3 P M ~ N L O@3 ~ Q R S T U R S T V R S W X R S T Y ~@8 F@6
  ~@2 G H@2 I@2 J@8 K@2 L M L N L O@3 P M ~ N L O@3 ~@21
>`.pickRestart({
  A: "f4", B: "eb4", C: "db4", D: "bb3", E: "c4 ab3",
  F: "[~@4 f4@4 eb4@4 db4@2 ab4@6 f4@4 eb4@4 db4@2 bb4@5 ~ ab4@4 gb4@2 f4@2 db4@2 gb4@6 f4@2 db4@6 db4@2 f4@6 gb4@4 f4@4 db4@2 eb4@6 ~@12]/6",
  G: "~ f4!5 f4@2", H: "[eb4@3 ab3@4 db4@3 db4 eb4@2 f4@2 db4]/2", I: "[eb4 db4 bb3@4 db4 f4@3 gb4@2 f4@2 db4 eb4]/2",
  J: "[~@2 f4@2 gb4@2 f4 eb4@3 db4@8 ~@4 bb3 ab4@3 f4@2 eb4@2 db4 ab4@3 f4@2 eb4@2 db4 bb4@3 ab4@2 gb4 f4 db4 gb4@3 f4 db4@3 db4 f4@3 gb4@2 f4@2 db4 eb4]/8",
  K: "[~@2 f4@2 gb4@2 f4 eb4@3 db4@6]/2", L: "~@3 [bb3,bb4]", M: "[db4,db5]@3 [c4,c5]", N: "[db4,db5]@4 ~@3 [d4,d5]",
  O: "[~@2 [gb4,gb5]@2 ~ gb4!2 f4@3 gb4@2 f4@2 db4 eb4@3 db4@4 ~@2]/3", P: "[bb3,bb4]!2 [f4,f5] ~",
  Q: "~@8 f5@3 db5 c5@3 bb4", R: "bb3 f4 db4 bb3", S: "ab3 gb4 c4 eb4", T: "db4 ab4 f4 eb4",
  U: "c4@4 ab4@4 bb4@3 ab4 gb4@3 f4", V: "c4@4 ab4@4 f4@3 eb4 db4@3 c4", W: "db4 bb4 f4 eb4",
  X: "c4@4 ab4@4 db5@3 c5 bb4@3 eb4", Y: "c5 ab4 f4 c4",
})).s("gm_marimba").gain(0.45)

// other · marimba · soft notes
const marimba_soft = note("<~@8 A B@2 C@6 ~@56 A B@2 C@6 ~@39 D@3 E F@6 G@7 ~@3>".pickRestart({
  A: "bb3 f4!5 f4@2", B: "[eb4@3 ab3@3 ab3 db4@3 db4 eb4@2 f4@2 db4]/2",
  C: "[eb4 db4 bb3@4 db4 f4@3 gb4@2 f4@2 db4 eb4@3 f4@2 gb4@2 f4 eb4@3 db4@8 ~@4 bb3 ab4@3 ~@6]/6",
  D: "[bb3@5 db4@5 f4@5 bb3@5 db4@5 f4@10 ~@4 b3@5 db4@4]/3", E: "~ f4@5 b3@5 db4@5",
  F: "[ab4@5 db4@10 gb4@19 g4@20 f4@19 eb4@5 db4@5 bb3@5 db4@5 f4@3]/6",
  G: "[~@2 bb3@5 db4@5 f4@10 ~@4 b3@5 db4@5 f4@5 b3@5 db4@5 ab4@5 db4@10 gb4@19 g4@20 ~@7]/7",
})).s("gm_marimba").gain(0.25)

// other · marimba
const marimba_2 = note(`<
  A B A B A C A D E F G H I J E ~ E F K L I M N O P Q R S T U R S V Q W X Y Z AA AB AC AD AE AF AG AH AC AI AC AD AE AF
  AG AH AC AJ AK AL AM AN AO AL AM AN AP AL AM AN AO AL AM AN AQ E F G H I J E ~ E F K L I M N O P Q R S T U R S V Q W X
  Y Z AA AB AC AD AE AF AG AH AC AI AC AD AE AF AG AH AC AJ AR@6 AS@8 AT@3 ~@3
>`.pickRestart({
  A: "bb2 f3 db3 f3", B: "c3 eb3 f2 c3", C: "c3 f3 f2 c3", D: "c3 eb3 [f2,eb3]@2", E: "[bb2,db3]", F: "[ab2,c3]",
  G: "[db3,f3]", H: "[bb2,eb3]", I: "[db3,gb3]", J: "[c3,eb3]", K: "[d3,f3]!2", L: "[eb3,gb3]", M: "[f3,a3]",
  N: "[bb2,db3] bb2", O: "bb2@4 [bb1,bb2]!4", P: "[bb2,bb3]@2 [bb2,bb3] [f2,f3]", Q: "[ab2,ab3]@2 [ab2,ab3] [bb2,bb3]",
  R: "[db3,db4]@2 [db3,db4] [bb2,bb3]", S: "[c3,c4]@2 [ab2,ab3] [f2,f3]", T: "[bb2,bb3]@2 [bb2,bb3] [eb3,eb4]",
  U: "[c3,c4]@2 [c3,c4] [ab2,ab3]", V: "[bb2,bb3]@2 [bb2,bb3] [db3,db4]", W: "[d3,d4]@2 [f3,f4] [ab3,ab4]",
  X: "[eb3,eb4]@2 [gb2,gb3] [eb2,eb3]", Y: "[gb2,gb3]@2 [bb2,bb3] [db3,db4]", Z: "[f2,f3]@2 [ab2,ab3] [c3,c4]",
  AA: "[bb2,bb3]@2 [db3,db4] [f3,f4]", AB: "[eb3,eb4]@2 ~ [bb2,bb3]", AC: "bb2 bb3 bb2 bb3", AD: "c3 c4 c3 c4",
  AE: "db3 db4 db3 db4", AF: "d3 d4 d3 d4", AG: "eb3 eb4 eb3 eb4", AH: "gb3 gb4 f3 f4", AI: "c3 c4 f3 f4", AJ: "bb2",
  AK: "~@2 db3 g3", AL: "bb2 bb3 db3 db4", AM: "ab2 ab3 c3 c4", AN: "db3 db4 f3 f4", AO: "eb3 eb4 f3 f4",
  AP: "eb3 eb4 ab2 ab3", AQ: "[f2,f3]", AR: "[bb2@15 bb2@24 b2@15 b2@15 db3@10 gb2@17]/6",
  AS: "[~@2 ab2@20 [ab2,ab3]@19 [a2,a3]@10 bb2@15 bb2@24 b2@15 b2@15 db3@8]/8", AT: "[~@2 gb2@19 ab2@20 ~@7]/3",
})).s("gm_marimba").gain(0.3)

// other · marimba
const marimba_3 = note(`<
  A B A B A B A C D E F G H I J ~ D E K D H L M N O P Q R S T Q R U P V W X Y Z AA AB AC AD AE AF AG AH AI AB AC AD AE
  AF AG AH AJ AK AL AM AN AO AL AM AN AP AL AM AN AQ AL AM AN AR D E F G H I J ~ D E K D H L M N O P Q R S T Q R U P V W
  X Y Z AA AB AC AD AE AF AG AH AI AB AC AD AE AF AG AH AJ AS@2 AT@8 AU AV@6 ~@3
>`.pickRestart({
  A: "~ [db3,f3] ~ [db3,f3]", B: "~ [c3,eb3] ~ [c3,eb3]", C: "~ [c3,eb3] [f2,eb3]@2", D: "bb3", E: "[f3,ab3]", F: "db4",
  G: "[gb3,bb3]", H: "[bb3,db4]", I: "[a3,c4]", J: "[f3,bb3]", K: "[bb3,d4] [ab3,d4]", L: "[f3,c4]", M: "[f3,bb3] c2",
  N: "c2 ~", O: "bb2@3 f2", P: "ab2@3 bb2", Q: "db3@3 bb2", R: "c3@3 f2", S: "bb2@3 eb3", T: "c3@3 ab2", U: "bb2@3 db3",
  V: "d3 f3", W: "eb3@3 eb2", X: "gb2@3 db3", Y: "f2@3 c3", Z: "bb2@3 f3", AA: "[eb3,eb4] ~",
  AB: "bb2!2 bb3!2 bb2!2 bb3!2", AC: "c3!2 c4!2 c3!2 c4!2", AD: "db3!2 db4!2 db3!2 db4!2", AE: "d3!2 d4!2 d3!2 d4!2",
  AF: "eb3!2 eb4!2 eb3!2 eb4!2", AG: "gb3!2 gb4!2 f3!2 f4!2", AH: "bb2!2", AI: "c3 c4 f3 f4", AJ: "bb2 ~",
  AK: "~@8 f3@3 db3 c3@3 bb2", AL: "bb2@3 db3 f3@3 bb2 db3@3 f3 bb2@3 a2", AM: "ab2@3 c3 gb3@3 ab2 c3@3 gb3 eb3@3 c3",
  AN: "db3@3 f3 ab3@3 db3 f3@3 ab3 eb3@3 db3", AO: "c3@3 eb3 ab3@3 c3 bb3@3 ab3 gb3@3 f3",
  AP: "c3@3 eb3 ab3@3 c3 f3@3 eb3 db3@3 c3", AQ: "c3@3 eb3 ab3@3 eb3 db4@3 c4 bb3@3 f3", AR: "f3!2",
  AS: "[bb3@15 bb3@15 ~@2]/2", AT: "[~@7 b3@15 b3@15 db4@10 gb3@19 ab3@20 [ab2,ab3]@19 [g2,a3]@10 bb3@13]/8",
  AU: "~ bb3@7", AV: "[~@10 b3@15 b3@15 db4@10 gb3@19 g3@20 ~@7]/6",
})).s("gm_marimba").gain(0.3)

// other · vibraphone
const vibraphone = note(`<
  A B A C A B A D ~@8 E F G H I J E K L M N O L O N O L M P Q R S L T U V W X Y Z U AA U V W X Y Z AB AC AD AE AF AG AH
  AE AF AG AI AE AF AG AH AE AF AG AJ ~@8 E F G H I J E K L M N O L O N O L M P Q R S L T U V W X Y Z U AA U V W X Y Z
  AB AC ~@20
>`.pickRestart({
  A: "bb4 db5", B: "c5 f4", C: "c5 f5", D: "c5 [f4,f5]", E: "[f4,bb4]", F: "[eb4,ab4]", G: "[bb4,db5] [ab4,db5]",
  H: "[bb4,eb5]", I: "[bb4,db5]", J: "[c5,eb5]", K: "~@4 [db4,bb4]!4", L: "[bb3,bb4]", M: "[ab3,ab4]", N: "[db4,db5]",
  O: "[c4,c5]", P: "[d4,d5] [f4,f5]", Q: "[eb4,eb5]", R: "[gb4,gb5]", S: "[f4,f5]", T: "[eb4,eb5]@2 ~ [bb3,bb4]",
  U: "[bb3,bb4]!2", V: "[c4,c5]!2", W: "[db4,db5]!2", X: "[d4,d5]!2", Y: "[eb4,eb5]!2", Z: "[gb4,gb5] [f4,f5]",
  AA: "bb3 eb4 bb4 db5 f5 bb4 f4 eb4", AB: "[bb4,bb5]!2", AC: "bb4 ~", AD: "eb4@2 db4@2 eb4@2 g4@2 db4@3 f4 g4@3 bb4",
  AE: "[bb3,bb4] [db4,db5]", AF: "[ab3,ab4] [c4,c5]", AG: "[db4,db5] [f4,f5]", AH: "[eb4,eb5] [f4,f5]",
  AI: "[eb4,eb5] [ab3,ab4]", AJ: "[c4,c5] [f4,f5]",
})).s("gm_vibraphone").gain(0.3)

// other · vibraphone · soft notes
const vibraphone_soft = note("<~@8 A B C D E F G B ~@57 A B C D E F G B ~@40 H@8 ~ I@8 ~@3>".pickRestart({
  A: "[bb4,f5]", B: "[eb4,eb5]", C: "[ab4,ab5]", D: "[gb4,gb5]", E: "[bb4,bb5]", F: "[a4,a5]", G: "[f4,f5]",
  H: "[bb4@15 bb4@24 b4@15 b4@15 [db4,db5]@10 [gb4,gb5]@19 g4@20 ~@10]/8", // Db Gb
  I: "[~@3 bb4@15 bb4@24 b4@15 b4@15 [db4,db5]@10 [gb4,gb5]@19 g4@20 ~@7]/8", // Db Gb
})).s("gm_vibraphone").gain(0.2)

// bass · electric bass finger · "Electric Bass"
const bass = note(`<
  ~@22 A B C D E F C F E F C D G H I J C K C F E L H M N O N P Q R S M N C T U V G W U V G X Y Z AA AB Y Z Y ~@15 A B C
  D E F C F E F C D G H I J C K C F E L H M N O N P Q R S M N C ~@20
>`.pickRestart({
  A: "~ bb1", B: "bb1@2 ~@2 bb1!4", C: "bb1", D: "ab1", E: "db2", F: "c2", G: "db2 f2", H: "eb2", I: "gb1", J: "f1",
  K: "eb2@3 ~", L: "d2", M: "gb2 f2", N: "bb1!2", O: "c2 c3 f2 f3", P: "c2!2", Q: "db2!2", R: "d2!2", S: "eb2!2",
  T: "~ f2", U: "bb1 db2", V: "ab1 c2", W: "eb2 f2", X: "eb2 ab1", Y: "bb1 db2 eb2 db2",
  Z: "~@3 eb2 ab2@3 eb2 ab2@3 eb3 eb3@3 db3", AA: "db2 eb2 f2 eb2", AB: "~@3 eb2 ab2@3 eb2 a2@3 eb3 eb3@3 db3",
})).s("gm_electric_bass_finger").gain(0.25)

// bass · electric bass finger · "Electric Bass" · soft notes
const bass_soft = note("<~@121 A@8 ~ B@8 ~@3>".pickRestart({
  A: "[bb1@39 b1@29 ~ db2@10 gb1@19 ab1@20 ~@10]/8", B: "[~@3 bb1@39 bb1@29 ~ db2@10 gb1@19 g1@20 ~@7]/8",
})).s("gm_electric_bass_finger").gain(0.15)

stack(marimba, marimba_soft, marimba_2, marimba_3, vibraphone, vibraphone_soft, bass, bass_soft)