Strudelify

3 libras

A Perfect Circle

KeyG majorTempo152 bpm
0:00/0:00
// 3 libras — A Perfect Circle
// 152 bpm, 3/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 3 "Marimba (Single Staff)" marimba (copy of ch 2 "Marimba (Single Staff)" marimba)
// note: Transcription provider: pdmx. https://musescore.com/score/5967204; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 129 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(152/3)

// 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(`<
  A@3 B A@2 C B A@3 B A@2 C B D@3 E F G H I F G H I F G H I F G H I J K@3 L M@4 K@3 L N@2 O P ~@6 Q@2 K R S T K R S T K
  R S T K R S T M K@3 L M@4 K@3 L M@2 O@2 U V W X U V W X U V W X U V W Y Z@2 AA AB Z AC AD AE Z AF AD AG AH AI@2 D@3 E
>`.pickRestart({
  A: "[a2,b3]!2", B: "[c#3,d#4]!2", C: "[e3,f#4]!2", D: "[d3,e4]!2", E: "[d3,e4,f#4,c#5,e5]@15 ~",
  F: "[a2,b4]@5 [a2,b4]@5 ~ [a2,b4]@5", G: "[e2,e4]@5 [e2,e4]@5 ~ [e2,e4]@5", H: "[b2,b4]@5 [b2,b4]@5 ~ [b2,b4]@5",
  I: "[c3,c5]@5 [c3,c5]@5 ~ [c3,c5]@5", J: "[d#3,d#4]@3 [e3,e4]@2 [f#3,f#4]@3 [g#3,g#4]@3 [a3,a4]@2 [b3,b4]@3",
  K: "[a2,a3,e4,b4,e5]@5 [a2,a3,e4,b4,e5]@5 ~ [a2,a3,e4,b4,e5]@5", // Asus2
  L: "[e2,e3,b4,f#5,b5]@5 [e2,e3,b4,f#5,b5]@5 ~ [e2,e3,b4,f#5,b5]@5", // Esus2
  M: "[c#3,c#4,g#4,d#5,g#5]@5 [c#3,c#4,g#4,d#5,g#5]@5 ~ [c#3,c#4,g#4,d#5,g#5]@5", // C#sus2
  N: "[c#2,c#3,g#4,d#5,g#5]@5 [c#2,c#3,g#4,d#5,g#5]@5 ~ [c#2,c#3,g#4,d#5,g#5]@5", // C#sus2
  O: "[d2,d3,a4,e5,a5]@5 [d2,d3,a4,e5,a5]@5 ~ [d2,d3,a4,e5,a5]@5", P: "[d2,d3,e4,f#4,c#5,e5]@15 ~",
  Q: "[e2,e3]@5 [e2,e3]@5 ~ [e2,e3]@5", R: "[e2,e3,e4,e5,b5]@5 [e2,e3,e4,e5,b5]@5 ~ [e2,e3,e4,e5,b5]@5",
  S: "[b2,b3,f#4,c#5,f#5]@5 [b2,b3,f#4,c#5,f#5]@5 ~ [b2,b3,f#4,c#5,f#5]@5", // Bsus2
  T: "[c3,c4,c5,e5,b5]@5 [c3,c4,c5,e5,b5]@5 ~ [c3,c4,c5,e5,b5]@5", U: "[g#2,g#3,g#4,g#5]@15 ~",
  V: "~@5 [f#2,f#3,f#4,f#5]@3 [e2,e3,e4,e5]@3 ~@5", W: "[f#2,f#3,f#4,f#5] [g2,g3,g4,g5]",
  X: "[e2,e3,e4,e5] [b1,b2,b3,b4]", Y: "a2!2, b4@15 ~", Z: "a2!2", AA: "~ c#3, c#3 ~, ~@5 g#4@10 ~",
  AB: "a2!2, e4@15 ~", AC: "e3@8 ~@3 e4@5, ~ e3", AD: "g#4@3 f#4@2 ~@6 f#4@5, c#3!2, ~@5 e4@5 ~@6",
  AE: "f#4@3 e4@3 ~@2 a2@8, a2 ~", AF: "a2@8 ~@3 e4@5, ~ a2", AG: "a2!2, f#4@15 ~",
  AH: "a2@8 ~@3 f#4@5, e4@5 ~@3, ~ a2", AI: "[e3!2 c#3!2, e4@5 ~@3]/2",
})).s("gm_piano").gain(0.3)

// other · vibraphone
const vibraphone = note(`<
  ~@20 A B C D E F G H I J G H K L G M ~ N O P Q R S T U V W X Y Z AA AB AC AB ~ AB ~ AB ~@2 AD AE AF AG AH AI AJ AK AL
  AM AN AK AL AO AP AK AQ ~ AR AS AT AU R S T U AV AW AX AY AZ BA BB BC AO BD AK AL AO BD AK AL AO BD AK AL AO BD AK AV
  ~@2 BE AB ~ BF BG BH ~ BF BG BI BJ AB ~@5
>`.pickRestart({
  A: "g#5@3 f#5@2 e5@3 f#5@3 ~@5", B: "e5@5 f#5@5 ~ f#5@5", C: "f#5@5 e5@3 e5@3 ~@5", D: "~@5 b4@3 b4@3 b4@2 b4@3",
  E: "g#5@5 f#5@5 ~ f#5@5", F: "g#5@3 f#5@2 e5@5 ~ f#5@5", G: "g#5 a5", H: "e5 b4", I: "g#5 f#5",
  J: "e5@5 f#5@5 ~ e5@5", K: "g#5", L: "g#5@3 f#5@2 e5@3 f#5@3 g#5@2 a5@3", M: "~ [b3,b4]",
  N: "b4@3 b4@3 ~@2 b4@3 b4@3 ~@2", O: "b4@5 b4@3 b4@3 ~@2 b4@3", P: "b4@3 g#4@2 f#4@5 ~@6",
  Q: "~@3 d#5@2 d#5@3 d#5@3 ~@5", R: "c#5 g#4", S: "~@5 g#4@5 ~ d#5@5", T: "c#5 b4", U: "~@5 b4@3 d#5@3 ~@5",
  V: "b4@5 g#4@5 ~@6", W: "b4 g#4", X: "b4@3 c#5@2 b4@5 ~@6", Y: "~@3 b4@2 b4@3 b4@3 b4@3 ~@2",
  Z: "b4@3 a4@3 ~@5 g#4@2 f#4@3", AA: "f#4@3 g#4@3 ~@5 d#4@5", AB: "e4", AC: "~@8 b3@3 b3@5", AD: "~@8 e4@3 e4@3 ~@2",
  AE: "g#4@8 g#4@3 ~@5", AF: "f#4@5 e4@5 ~ f#4@5", AG: "f#4@5 e4@3 e4@3 ~@5", AH: "~@5 b3@3 b3@3 ~@5",
  AI: "g#4@3 f#4@2 e4@3 f#4@3 ~@5", AJ: "f#4@5 e4@5 ~ e4@5", AK: "f#4 g4", AL: "e4 b3",
  AM: "g#4@3 f#4@2 e4@3 f#4@3 e4@5", AN: "e4@5 f#4@3 e4@3 ~@5", AO: "g#4", AP: "~@5 f#4@3 e4@3 e4@5", AQ: "[e4,e5]",
  AR: "b4@5 b4@3 b4@3 ~@5", AS: "b4@5 b4@3 b4@3 ~@2 g#4@3", AT: "b4@3 b4@2 b4@3 ~@8", AU: "~@5 d#5@5 ~ d#5@5", AV: "b4",
  AW: "~@5 c#5@5 ~ b4@5", AX: "c#5@5 d#5@5 ~ c#5@2 b4@3", AY: "~@5 d#5@3 c#5@3 b4@5", AZ: "c#5", BA: "~@5 d#5@5 ~ e5@5",
  BB: "e5", BC: "~@5 e5@3 e5@3 ~@5", BD: "~@5 f#4@3 e4@3 ~@5", BE: "~@5 g#4@11", BF: "~@11 e4@5",
  BG: "g#4@3 f#4@2 e4@5 ~ f#4@5", BH: "f#4@3 e4@3 ~@10", BI: "f#4", BJ: "e4@11 f#4@5",
})).s("gm_vibraphone").gain(0.3)

// other · xylophone
const xylophone = note(`<
  ~@20 A B C D E F G H I J G H K L G M ~ N O P Q R S T U V W X Y Z AA AB AC AD ~ AD ~ AD ~@2 AE AF AG C AH A AI AJ H AK
  AL AJ H K AM AJ AN ~ AO AP AQ AR R S T U AS AT AU AV AW AX AD AY K AZ AJ H K AZ AJ H K AZ AJ H K AZ AJ AS ~@2 BA AB ~
  BB F BC ~ BB F BD BE AB ~@5
>`.pickRestart({
  A: "g#5@3 f#5@2 e5@3 f#5@3 ~@5", B: "e5@5 f#5@5 ~ f#5@5", C: "f#5@5 e5@3 e5@3 ~@5", D: "~@5 b4@3 b4@3 b4@2 b4@3",
  E: "g#5@5 f#5@5 ~ f#5@5", F: "g#5@3 f#5@2 e5@5 ~ f#5@5", G: "g#5 a5", H: "e5 b4", I: "g#5 f#5",
  J: "e5@5 f#5@5 ~ e5@5", K: "g#5", L: "g#5@3 f#5@2 e5@3 f#5@3 g#5@2 a5@3", M: "~ [b4,b5]",
  N: "b5@3 b5@3 ~@2 b5@3 b5@3 ~@2", O: "b5@5 b5@3 b5@3 ~@2 b5@3", P: "b5@3 g#5@2 f#5@5 ~@6",
  Q: "~@3 d#5@2 d#5@3 d#5@3 ~@5", R: "c#6 g#5", S: "~@5 g#5@5 ~ d#6@5", T: "c#6 b5", U: "~@5 b5@3 d#6@3 ~@5",
  V: "b5@5 g#5@5 ~@6", W: "b5 g#5", X: "b5@3 c#6@2 b5@5 ~@6", Y: "~@3 b5@2 b5@3 b5@3 b5@3 ~@2",
  Z: "b5@3 a5@3 ~@5 g#5@2 f#5@3", AA: "f#5@3 g#5@3 ~@5 d#5@5", AB: "e5", AC: "~@8 b5@3 b5@5", AD: "e6",
  AE: "~@8 e5@3 e5@3 ~@2", AF: "g#5@8 g#5@3 ~@5", AG: "f#5@5 e5@5 ~ f#5@5", AH: "~@5 b4@3 b4@3 ~@5",
  AI: "f#5@5 e5@5 ~ e5@5", AJ: "f#5 g5", AK: "g#5@3 f#5@2 e5@3 f#5@3 e5@5", AL: "e5@5 f#5@3 e5@3 ~@5",
  AM: "~@5 e5@3 d5@3 d5@5", AN: "[e5,e6]", AO: "b5@5 b5@3 b5@3 ~@5", AP: "b5@5 b5@3 b5@3 ~@2 g#5@3",
  AQ: "b5@3 b5@2 b5@3 ~@8", AR: "~@5 d#6@5 ~ d#6@5", AS: "b5", AT: "~@5 c#6@5 ~ b5@5", AU: "c#6@5 d#6@5 ~ c#6@2 b5@3",
  AV: "~@5 d#6@3 c#6@3 b5@5", AW: "c#6", AX: "~@5 c#6@5 ~ e6@5", AY: "~@5 e6@3 e6@3 ~@5", AZ: "~@5 f#5@3 e5@3 ~@5",
  BA: "~@5 g#5@11", BB: "~@11 e5@5", BC: "f#5@3 e5@3 ~@10", BD: "f#5", BE: "e5@11 f#5@5",
})).s("gm_xylophone").gain(0.3)

// other · glockenspiel
const glockenspiel = note(`<
  ~@20 A B C D E F G H I J G H K L G M ~ N O P Q R S T U V W X Y Z AA AB AC AD ~ AD ~ AD ~@2 AE AF AG AH AI AJ AK AL AM
  AN AO AL AM AP AQ AL AR ~ AS AT AU AV R S T U AW AX AY AZ BA BB AD BC AP BD AL AM AP BD AL AM AP BD AL AM AP BD AL AW
  ~@2 BE AB ~ BF F BG ~ BF F BH BI AB ~@5
>`.pickRestart({
  A: "g#6@3 f#6@2 e6@3 f#6@3 ~@5", B: "e6@5 f#6@5 ~ f#6@5", C: "f#6@5 e6@3 e6@3 ~@5", D: "~@5 b5@3 b5@3 b5@2 b5@3",
  E: "g#6@5 f#6@5 ~ f#6@5", F: "g#6@3 f#6@2 e6@5 ~ f#6@5", G: "g#6 a6", H: "e6 b5", I: "g#6 f#6",
  J: "e6@5 f#6@5 ~ e6@5", K: "g#6", L: "g#6@3 f#6@2 e6@3 f#6@3 g#6@2 a6@3", M: "~ [b5,b6]",
  N: "b6@3 b6@3 ~@2 b6@3 b6@3 ~@2", O: "b6@5 b6@3 b6@3 ~@2 b6@3", P: "b6@3 g#6@2 f#6@5 ~@6",
  Q: "~@3 d#7@2 d#7@3 d#7@3 ~@5", R: "c#7 g#6", S: "~@5 g#6@5 ~ d#7@5", T: "c#7 b6", U: "~@5 b6@3 d#7@3 ~@5",
  V: "b6@5 g#6@5 ~@6", W: "b6 g#6", X: "b6@3 c#7@2 b6@5 ~@6", Y: "~@3 b6@2 b6@3 b6@3 b6@3 ~@2",
  Z: "b6@3 a6@3 ~@5 g#6@2 f#6@3", AA: "f#6@3 g#6@3 ~@5 d#6@5", AB: "e6", AC: "~@8 b6@3 b6@5", AD: "e7",
  AE: "~@8 e7@3 e7@3 ~@2", AF: "g#7@8 g#7@3 ~@5", AG: "f#7@5 e7@5 ~ f#7@5", AH: "f#7@5 e7@3 e7@3 ~@5",
  AI: "~@5 b6@3 b6@3 ~@5", AJ: "g#7@3 f#7@2 e7@3 f#7@3 ~@5", AK: "f#7@5 e7@5 ~ e7@5", AL: "f#7 g7", AM: "e7 b6",
  AN: "g#7@3 f#7@2 e7@3 f#7@3 e7@5", AO: "e7@5 f#7@3 e7@3 ~@5", AP: "g#7", AQ: "~@5 f#7@3 e7@3 e7@5", AR: "[e6,e7]",
  AS: "b6@5 b6@3 b6@3 ~@5", AT: "b6@5 b6@3 b6@3 ~@2 g#6@3", AU: "b6@3 b6@2 b6@3 ~@8", AV: "~@5 d#7@5 ~ d#7@5", AW: "b6",
  AX: "~@5 c#7@5 ~ b6@5", AY: "c#7@5 d#7@5 ~ c#7@2 b6@3", AZ: "~@5 d#7@3 c#7@3 b6@5", BA: "c#7", BB: "~@5 c#7@5 ~ e7@5",
  BC: "~@5 e7@3 e7@3 ~@5", BD: "~@5 f#7@3 e7@3 ~@5", BE: "~@5 g#6@11", BF: "~@11 e6@5", BG: "f#6@3 e6@3 ~@10",
  BH: "f#6", BI: "e6@11 f#6@5",
})).s("gm_glockenspiel").gain(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~@20 A@16 B C D C D C D C D C D C D C D C ~ E ~ E ~ E ~ E D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C
  D C D C@4 D C D C D C D C D C D C ~@8 A@6 ~@6
>`.pickRestart({
  A: "x!2", B: "x ~@7 x ~@2 x ~ x ~@2", C: "x ~@7 x ~@2 x ~@4", D: "~@8 x ~@2 x ~@4", E: "x",
})).gain(0.3)

// drums · rim
const rim = s("rim").struct("<~@20 [x ~@4 x ~@5 x ~@4]!16 [x ~@4 x ~@10] ~@72 [x ~@4 x ~@5 x ~@4]!14 ~@6>").gain(0.3)

// drums · snare
const snare = s("sd").struct(`<
  ~@36 A ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@9 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@2 B ~ B ~ B
  ~ B ~ B ~ B ~ B ~@21
>`.pickRestart({
  A: "~@11 x ~ x ~@2", B: "x",
})).gain(0.3)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@52 A ~ A ~ A ~ A ~@70>".pickRestart({
  A: "x",
})).gain(0.2)

// drums · splash
const splash = s("cr").struct("<~@94 [x ~@4 x ~@5 x ~@4]!15 ~@20>").gain(0.4)

stack(piano, vibraphone, xylophone, glockenspiel, kick, rim, snare, snare_soft, splash)