Strudelify

It's Been A Long Long Time

Jack Melendez

KeyA♭ majorTempo83 bpm
0:00/0:00
// It's Been A Long Long Time — Jack Melendez
// 83 bpm, 4/4, key Ab major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 4 "Alto Sax" named as a reed, played on alto sax (its electric guitar clean patch is not one)
// note: duplicate parts dropped: ch 14 "Electric Guitar [Tablature]" electric guitar jazz (copy of ch 13 "Guitar" electric guitar jazz)
// note: Transcription provider: pdmx. https://musescore.com/score/5878607; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 57 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(83/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.

// other · tremolo strings · "Violin"
const tremolo_strings = note(`<
  ~ A B C D E F G H I J K L M N O D E P Q R S T U V W X Y Z AA AB AC AD@2 AE AF AG AH AI AJ AK AL AM AN AO AP ~@2 AQ AR
  AS ~@2 AT AU AV AW
>`.pickRestart({
  A: "eb4@8 ab4@5 f4@5 f4@2 g4@2 a4@2 bb4 c5 ~ db5 eb5 f5 ~ g5", B: "ab5@5 f5@3 db5@5 g5@3 eb5@5 c5@3 f5@5 db5@3",
  C: "bb4@5 eb5@3 c5@5 ab4@3 f4@8 g4@8", D: "ab5 g5", E: "f5@21 ~@11", F: "~@5 eb5@3 c5@3 ab4@2 f4@3 gb4@8 c5@8",
  G: "a4@5 bb4@3 g5@13 f5@3 eb5@3 db5@2 c5@3", H: "bb4 a4", I: "ab4@16 g4@13 ~@3",
  J: "~@5 c6@3 db6@3 g5@2 eb5@3 db5@8 g5@8", K: "d5@5 eb5@3 c6@24", L: "c5 eb5",
  M: "bb5@5 c6@3 bb5@3 c6@2 bb5@3 a5@5 c6@3 eb6@5 f6@3", N: "bb5@2 e6 db6",
  O: "ab5@5 bb5@3 ab5@2 bb5@2 ab5@2 bb5@2 g5@13 ~@3", P: "bb4 db5", Q: "c5@21 ~@11",
  R: "~@5 g5@3 a5@5 e5@3 g5@5 d5@8 e5@3", S: "c5@5 d5@3 a4@2 c5@2 f4@2 a4@2 d4@8 e4@8", T: "g4 bb4", U: "a4 e5",
  V: "g5@16 e5@5 f5@3 g5@5 a5@3", W: "c6@8 b5 a5 g5 f5 ~ e5 d5 c5 c5@8 ~@8", X: "c5@5 d5@8 c5@3 a5@16",
  Y: "c5@5 d5@8 c5@3 ab5@16", Z: "c5", AA: "c5 e5", AB: "c5@16 b4@13 e5@3", AC: "a5 g5", AD: "[e4@16 e4@13 gb4@35]/2",
  AE: "d5 db5", AF: "c5@16 b4@13 ~@3", AG: "f4 d4", AH: "c4 ~", AI: "e5 bb5", AJ: "bb5 a5", AK: "d4 f4", AL: "f4",
  AM: "c6 b5", AN: "a5@21 ~@11", AO: "gb5 f5", AP: "e5@21 ~@11", AQ: "~@13 c6@3 b5@5 ab5@3 g5@8", AR: "eb5 gb5",
  AS: "eb5", AT: "f5@16 f5@5 g5@3 f5@5 d5@3", AU: "bb5@5 a5@3 ab5@5 g5@8 f5@3 eb5@5 d5@3", AV: "g4@5 bb4@8 a4@3 d5@16",
  AW: "bb5@5 a5@3 g5@5 f5@19",
})).s("gm_tremolo_strings").gain(0.4)

// other · alto sax
const alto_sax = note(`<
  A B C@2 D E F G H I J K L M N O D E P Q R S T U V ~ W X Y Z AA AB AC@2 P AD AE AF ~ AG ~@2 AH AI AJ AK AL ~@4 AM AN AO
  AP AQ AR
>`.pickRestart({
  A: "c4@5 eb4@3 f4@5 eb4@3 c4@5 eb4@3 g4@5 f4@3", B: "bb3@8 bb3@5 d4@19",
  C: "[ab4@13 g4@11 f4@13 eb4@11 d4@8 db4@8]/2", D: "ab4 g4", E: "f4@21 ~@11",
  F: "~@5 eb4@3 c4@3 ab3@2 f3@3 gb3@8 c4@8", G: "a3@5 bb3@3 g4@13 f4@3 eb4@3 db4@2 c4@3", H: "bb3 a3",
  I: "ab3@16 g3@13 ~@3", J: "~@5 c5@3 db5@3 g4@2 eb4@3 db4@8 g4@8", K: "d4@5 eb4@3 c5@24", L: "c4 eb4",
  M: "bb3@5 c4@3 bb3@3 c4@2 bb3@3 a3@5 c4@3 eb4@5 f4@3", N: "bb3@2 e4 db4",
  O: "ab3@5 bb3@3 ab3@2 bb3@2 ab3@2 bb3@2 g3@13 ~@3", P: "d4 db4", Q: "c4@21 ~@11",
  R: "~@5 g4@3 a4@5 e4@3 g4@5 d4@8 e4@3", S: "c4@5 d4@3 a3@2 c4@2 f3@2 a3@2 d3@8 e3@8", T: "g4 bb4", U: "a4 e5",
  V: "g4@16 e4@5 f4@3 g4@5 a4@3", W: "c4@5 d4@8 c4@3 a4@16", X: "c4@5 d4@8 c4@3 ab4@16", Y: "c4", Z: "c4 ab4",
  AA: "c4@16 b3@13 e4@3", AB: "a4 g4", AC: "[c4@16 db4@13 d4@35]/2", AD: "c4@16 b3@13 ~@3", AE: "a3 g4", AF: "e4 ~",
  AG: "d4@5 db4@3 d4@5 c4@3 bb4@8 a4@8", AH: "c5 b4", AI: "a4@21 ~@11", AJ: "gb4 f4",
  AK: "~@5 c4@3 c4@5 c4@3 d4@5 d4@3 f4@5 f4@3", AL: "a5", AM: "bb4@5 d5@3 f5@3 bb4@2 a4@7 ~ d5@3 f5@5 a4@3",
  AN: "g4@5 a4@3 g4@3 a4@2 g4@7 ~ f5@3 f5@5 f5@3", AO: "f4@16 f4@5 g4@3 f4@5 d4@3",
  AP: "bb4@5 a4@3 ab4@5 g4@8 f4@3 eb4@5 d4@3", AQ: "bb4@5 d5@8 c5@3 f5@16", AR: "bb4@5 a4@3 g4@5 f4@19",
})).s("gm_alto_sax").gain(0.3)

// other · piano
const piano = note("<A B C@2 D E F G H I J K L M N O D E P Q R S ~@35>".pickRestart({
  A: "f3@5 ab3@3 c4@5 ab3@3 g3@5 bb3@3 c4@5 b3@3", B: "ab3@8 ab3@5 a3@19", C: "[f4@13 eb4@11 d4@13 c4@11 c4@8 bb3@8]/2",
  D: "ab4 g4", E: "f4@21 ~@11", F: "~@5 eb4@3 c4@3 ab3@2 f3@3 gb3@8 c4@8", G: "a3@5 bb3@3 g4@13 f4@3 eb4@3 db4@2 c4@3",
  H: "bb3 a3", I: "ab3@16 g3@13 ~@3", J: "~@5 c4@3 db4@3 g3@2 eb3@3 db3@8 g3@8", K: "d4@5 eb4@3 c5@24", L: "c4 eb4",
  M: "bb3@5 c4@3 bb3@3 c4@2 bb3@3 a3@5 c4@3 eb4@5 f4@3", N: "bb3@2 e4 db4",
  O: "ab3@5 bb3@3 ab3@2 bb3@2 ab3@2 bb3@2 g3@13 ~@3", P: "ab3 g3", Q: "f3@16 ab3@5 ab3@3 c4@5 c4@3",
  R: "d4@3 ~@2 g3@3 a3@5 e3@3 g3@5 d3@8 e3@3", S: "c4@5 d4@3 a3@2 c4@2 f3@2 a3@2 d3@8 e3@8",
})).s("gm_piano").gain(0.25)

// other · muted trumpet
const muted_trumpet = note("<~@28 A B ~@3 C ~@3 D ~ E ~ F G H ~@2 I J K L M N O P Q R S>".pickRestart({
  A: "~@5 e5@3 e5@5 c5@3 e5@5 e5@3 e5@5 c5@3", B: "e5@5 e5@3 e5@5 c5@3 e5@16", C: "~ d5", D: "~ e5",
  E: "d4@5 db4@3 d4@5 c4@3 bb4@8 a4@8", F: "~@24 g4@3 e4 eb4 d4 ~ db4", G: "~ e5 ~ e5", H: "e5!2 eb5 ~",
  I: "~@16 f4@5 c5@3 db5@2 d5@2 eb5@2 e5@2", J: "f5@5 g5@3 f5@5 g5@3 ab5@5 g5@3 ab5@5 g5@3", K: "f5@5 f5@19 ~@5 d5@3",
  L: "eb5@5 f5@3 eb5@5 f5@3 gb5@5 f5@3 gb5@5 f5@3", M: "eb5@5 eb5@16 ~@11", N: "bb5@8 ~@5 f5@8 ~@11",
  O: "f5@5 g5@3 d5@8 f5@16", P: "f5@5 bb5@8 eb5@3 f5@5 g5@3 f5@5 d5@3", Q: "bb5@5 a5@3 ab5@5 g5@8 f5@3 eb5@5 d5@3",
  R: "g5@5 bb5@7 g5 ab5 a5@2 d6@16", S: "bb5",
})).s("gm_muted_trumpet").gain(0.5)

// other · french horn · "Horn in F"
const french_horn = note(`<
  A B C@2 D E F G H I J K L M N O D E P Q R ~ S T ~ U V W ~@2 X Y Z AA AB AC AD AE ~@4 AF AG AH AI AJ AK AL AM AN AO AP
  AQ AR AS AT
>`.pickRestart({
  A: "ab3@5 c4@3 eb4@5 c4@3 bb3@5 c4@3 eb4@5 d4@3", B: "bb3@8 bb3@5 d4@19",
  C: "[ab4@13 g4@11 f4@13 eb4@11 d4@8 db4@8]/2", D: "ab4 g4", E: "f4@21 ~@11",
  F: "~@5 eb4@3 c4@3 ab3@2 f3@3 gb3@8 c4@8", G: "a3@5 bb3@3 g4@13 f4@3 eb4@3 db4@2 c4@3", H: "bb3 a3",
  I: "ab3@16 g3@13 ~@3", J: "~@5 c4@3 db4@3 g3@2 eb3@3 db3@8 g3@8", K: "e3@5 f3@3 c4@24", L: "c4 eb4",
  M: "bb3@5 c4@3 bb3@3 c4@2 bb3@3 a3@5 c4@3 eb4@5 f4@3", N: "bb3@2 e4 db4",
  O: "ab3@5 bb3@3 ab3@2 bb3@2 ab3@2 bb3@2 g3@13 ~@3", P: "~@5 d4@3 d4@5 d4@3 ~@5 e4@3 e4@5 e4@3",
  Q: "~@5 c4@3 c4@5 c4@3 d4@5 d4@3 f4@5 f4@3", R: "d4@5 ~@27", S: "g3 bb3", T: "a3 e4", U: "~ c4",
  V: "c4@5 d4@8 c4@3 a4@16", W: "c4@5 d4@8 c4@3 ab4@16", X: "c4@16 b3@13 e4@3", Y: "a4 g4",
  Z: "~@5 g4@3 e4@3 c4@2 a3@3 bb3@8 e4@8", AA: "db4@5 d4@3 b4@13 a4@3 g4@3 f4@2 e4@3", AB: "d4 db4",
  AC: "c4@16 b3@13 ~@3", AD: "~@5 e4@3 f4@3 b3@2 g3@3 f3@8 b3@8", AE: "gb3 ~", AF: "c4 b3", AG: "a3@21 ~@11",
  AH: "gb3 f3", AI: "e3@21 ~@11", AJ: "~@16 f3@5 c3@3 db3@2 d3@2 eb3@2 e3@2",
  AK: "f3@5 g3@3 f3@5 g3@3 ab3@5 g3@3 ab3@5 g3@3", AL: "f3@5 f3@19 ~@5 d3@3",
  AM: "eb3@5 f3@3 eb3@5 f3@3 gb3@5 f3@3 gb3@5 f3@3", AN: "~@5 f3@3 f3@4 ~ f3@3 f3@4 ~ f3@3 f3@4 ~ f3@3",
  AO: "bb3@5 d4@3 f4@3 bb3@2 a3@7 ~ d4@3 f4@5 a3@3", AP: "g3@5 a3@3 g3@3 a3@2 g3@7 ~ f4@3 f4@5 f4@3",
  AQ: "f4@16 f4@5 g4@3 f4@5 d4@3", AR: "bb3@5 a3@3 ab3@5 g3@8 f3@3 eb3@5 d3@3", AS: "bb3@5 d4@8 c4@3 f4@16",
  AT: "bb4@5 a4@3 g4@5 d4@19",
})).s("gm_french_horn").gain(0.35)

// other · trombone
const trombone = note(`<
  A B C ~ D E F G H I J K L M N O D E P Q R ~@4 S ~@4 T U V W X Y Z AA ~@4 AB AC AD AE AF AG AH L AI AJ AK AL AM AN AO
>`.pickRestart({
  A: "eb3@5 f3@3 ab3@5 f3@3 c3@5 g3@3 bb3@5 ab3@3", B: "gb3@8 gb3@5 f3@19", C: "bb3 ~@3", D: "ab3 g3", E: "f3@21 ~@11",
  F: "~@5 eb3@3 c3@3 ab2@2 f2@3 gb2@8 c3@8", G: "a2@5 bb2@3 g3@13 f3@3 eb3@3 db3@2 c3@3", H: "bb2 a2",
  I: "ab2@16 g2@13 ~@3", J: "~@5 c3@3 db3@3 g2@2 eb2@3 db2@8 g2@8", K: "~@21 c3@3 db3@5 d3@3",
  L: "eb3@5 f3@3 eb3@5 f3@3 gb3@5 f3@3 gb3@5 f3@3", M: "eb3@5 eb3@19 ~@5 f2@3",
  N: "db3@5 eb3@3 db3@5 eb3@3 e3@5 eb3@3 e3@5 eb3@3", O: "db3@5 e3@11 eb3@13 ~@3",
  P: "~@5 bb2@3 bb2@5 bb2@3 ~@5 a2@3 a2@5 a2@3", Q: "~@5 eb3@3 eb3@5 eb3@3 f3@5 f3@3 ab3@5 ab3@3", R: "c3@5 ~@27",
  S: "~ c3", T: "c3@16 b2@13 e3@3", U: "a3 g3", V: "~@5 g3@3 e3@3 c3@2 a2@3 bb2@8 e3@8",
  W: "db3@5 d3@3 b3@13 a3@3 g3@3 f3@2 e3@3", X: "d3 db3", Y: "c3@16 b2@13 ~@3", Z: "~@5 e3@3 f3@3 b2@2 g2@3 f2@8 b2@8",
  AA: "gb2 ~", AB: "c4 b3", AC: "a3@21 ~@11", AD: "gb3 f3", AE: "e3@21 ~@11",
  AF: "~@16 f3@5 c3@3 db3@2 d3@2 eb3@2 e3@2", AG: "f3@5 g3@3 f3@5 g3@3 ab3@5 g3@3 ab3@5 g3@3",
  AH: "f3@5 f3@19 ~@5 d3@3", AI: "~@5 f2@3 f2@4 ~ f2@3 f2@4 ~ f2@3 f2@4 ~ f2@3",
  AJ: "bb2@5 d3@3 f3@3 bb2@2 a2@7 ~ d3@3 f3@5 a2@3", AK: "g2@5 a2@3 g2@3 a2@2 g2@7 ~ f2@3 f2@5 f2@3",
  AL: "f3@16 f3@5 g3@3 f3@5 d3@3", AM: "bb3@5 a3@3 ab3@5 g3@8 f3@3 eb3@5 d3@3", AN: "g3@5 bb3@8 a3@3 d4@16",
  AO: "bb2@5 a2@3 a2@5 bb2@19",
})).s("gm_trombone").gain(0.3)

// chords · electric guitar jazz · "Guitar"
const electric_guitar_jazz = note(`<
  A B C ~ D E F G H I@2 J K@2 L M D N O E P Q R S ~@6 T U V W X Y@2 Z AA@2 AB AC T AD AE U AF AG@2 AH AI AJ AK AL AM AN
  AO
>`.pickRestart({
  A: "[ab3,c4,f4,ab4]!2 [ab3,c4,g4,bb4]!2", B: "[gb3,bb3,e4,ab4]!2 [f3,a3,eb4,g4]!2", C: "[bb2,ab3,db4,f4] ~@3",
  D: "[ab3,c4,f4,ab4]!2 [ab2,eb3,g3,c4,eb4,ab4]!2", E: "[ab3,c4,f4,ab4]!4", F: "[ab3,c4,f4,ab4]!2 [a2,eb3,a3,c4]!2",
  G: "[eb3,bb3,db4,g4,bb4]!4", H: "[bb2,f3,bb3,db4,f4,bb4]!2 [bb3,f4,a4,db5]!2",
  I: "[bb2,f3,ab3,db4,f4,bb4]!2 [eb3,bb3,db4,g4,bb4]!2", J: "[ab2,eb3,ab3,c4,eb4,ab4]!4",
  K: "[c3,gb3,bb3,eb4]!2 [f3,a3,eb4,f4]!2", L: "[gb2,a2,e3,ab3]!2 [bb2,ab3,db4,e4]!2",
  M: "[bb2,ab3,db4,eb4]!2 [eb3,bb3,db4,g4,bb4]!2", N: "[c3,g3,bb3,eb4,g4]!2 [f2,c3,eb3,a3,c4,f4]!2",
  O: "[bb2,d3,ab3,c4,f4]!2 [a2,e3,a3,db4,g4]!2", P: "~@3 a4@29, c3, ~ [g3,c4]@31, ~ e4@15",
  Q: "~@3 a4@13 ~@4 g4@12, d3 g2, ~ [a3,c4]@15 ~ [d3,f3]@15, ~ f4@7 ~ b3@7, ~@19 e4@13", R: "[g3,d4]!2 [bb3,f4]!2",
  S: "[a3,e4]!2 [e4,b4]!2", T: "[c4,e4,a4,c5]!2 [c3,g3,b3,e4,g4,c5]!2", U: "[c4,e4,a4,c5]!4",
  V: "[c4,e4,a4,c5]!2 [db3,g3,db4,e4]!2", W: "[g3,d4,f4,b4,d5]!4", X: "[d3,a3,d4,f4,a4,d5]!2 [d4,a4,db5,f5]!2",
  Y: "[d3,a3,c4,f4,a4,d5]!2 [g3,d4,f4,b4,d5]!2", Z: "[c3,g3,c4,e4,g4,c5]!4", AA: "[e3,bb3,d4,g4]!2 [a3,db4,g4,a4]!2",
  AB: "[bb2,db3,ab3,c4]!2 [d3,c4,f4,ab4]!2", AC: "[d3,c4,f4,g4]!2 [g3,d4,f4,b4,d5]!2",
  AD: "[e3,b3,d4,g4,b4]!2 [a2,e3,g3,db4,e4,a4]!2", AE: "[d3,gb3,c4,e4,a4]!2 [db3,ab3,db4,f4,b4]!2",
  AF: "~@3 [bb2,f3,bb3,d4,f4,bb4]", AG: "[d3,ab3,c4,f4]!2 [g3,b3,f4,g4]!2", AH: "[ab2,b2,gb3,bb3]!2 [c3,bb3,eb4,gb4]!2",
  AI: "[c3,bb3,eb4,f4]!2 [f3,c4,eb4,a4,c5]!2", AJ: "[bb3,d4,g4,bb4]!2 [bb2,f3,a3,d4,f4,bb4]!2", AK: "[bb3,d4,g4,bb4]!4",
  AL: "[f3,a3,c4,eb4]!4", AM: "[bb3,bb4]@5 [a3,a4]@3 [ab3,ab4]@5 [g3,g4]@8 [f3,f4]@3 [eb3,eb4]@5 [d3,d4]@3",
  AN: "[g3,bb3,d4,f4]@5 [bb3,d4,f4,a4]@8 [a3,c4,eb4,g4]@3 [d3,f3,a3,c4]@16", // Gm7 Bbmaj7 Am7b5 Dm7
  AO: "[bb3,bb4]@5 [a3,a4]@3 [g3,g4]@5 [bb2,f3,bb3,d4,f4]@19", // Bb A G Bb
})).s("gm_electric_guitar_jazz").gain(0.3)

// bass · acoustic bass
const bass = note(`<
  A B C ~ D@2 E D F D G H I J K L D M N O P@2 Q R S T ~@4 U@2 V U W U X Y Z AA AB AC U AD AE AF ~@11
>`.pickRestart({
  A: "ab2!2 g2!2", B: "gb2!2 f2!2", C: "bb2 ~@3", D: "ab2 ~ eb2 ~", E: "ab2 ~ a2 ~", F: "bb2 ~ f2 ~", G: "bb2 ~ eb2 ~",
  H: "ab1 ~ c2 eb2", I: "ab2 ~ c2 ~", J: "gb2 ~ f2 f1", K: "gb1 ~ bb1 ~", L: "e2 ~ eb2 ~", M: "c2 ~ f2 ~",
  N: "bb1 ~ a1 ~", O: "ab1 c2 eb2 ab2", P: "[c3 g3@2 g3@2 g2@3]/2", Q: "g1!2 bb1!2", R: "a1!2 e2!2",
  S: "g2@8 g2@8 e2@5 f2@3 g2@5 a2@3", T: "c2", U: "c3 ~ g2 ~", V: "c3 ~ db3 ~", W: "d3 ~ a2 ~", X: "d3 ~ g2 ~",
  Y: "c2 ~ e2 g2", Z: "c3 ~ e2 ~", AA: "bb2 ~ a2 a1", AB: "bb1 ~ d2 ~", AC: "ab2 ~ g2 ~", AD: "e2 ~ a2 ~",
  AE: "d2 ~ db2 ~", AF: "c2 e2 g2 c3",
})).s("gm_acoustic_bass").gain(0.3)

stack(tremolo_strings, alto_sax, piano, muted_trumpet, french_horn, trombone, electric_guitar_jazz, bass)