Strudelify

China

Tori Amos

KeyD majorTempo80 bpm
0:00/0:00
// China — Amos, Tori
// 80 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 103 bars on a 48-step grid, each part at one level. Source detail keeps the original performance.
setcpm(80/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(`<
  ~ A B C D E F G H I@2 J D K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF C D E F G H I@2 J D K L M N O P Q R S T U
  V W X Y Z AA AB AC AD AE AF C D E F G H I@2 J D K AG ~@24
>`.pickRestart({
  A: "[d2,a2]@3 ~@3 [d2,a2]@9 ~@3 [d2,a2]@2 ~@4 [d2,a2]@2 ~@4 [d2,a2]@10 ~@2 [d2,a2]@2 ~@4", // D5
  B: "[d2,a2]@2 ~@4 [d2,a2]@10 ~@2 [d2,a2]@2 ~@4 [d2,a2]@3 ~@3 [d2,a2]@10 ~@2 [d2,a2]@2 ~@4", // D5
  C: "[d2,a2]@2 ~@4 [d2,a2]@10 ~@2 [d2,a2]@2 ~@4 [d2,a2]@2 ~@4 [d2,a2]@9 ~@3 [d2,a2]@2 ~@4", // D5
  D: "[d2,a2] ~@2 [d2,a2]@5 ~ [d2,a2] ~@2 [d2,a2] ~@2 [d2,a2]@5 ~ [d2,a2] ~@2", // D5
  E: "[d2,a2]@2 ~@4 [d2,a2]@9 ~@3 [d2,a2]@2 ~@4 [d2,a2]@2 ~@4 [d2,a2]@11 ~ [d2,a2]@2 ~@4", // D5
  F: "[d2,a2]@2 ~@4 [d2,a2]@10 ~@2 [d2,a2]@3 ~@3 [d2,a2]@2 ~@4 [d2,a2]@10 ~@2 [d2,a2]@5 ~", // D5
  G: "[g2,d3]@3 ~@3 [g2,d3]@10 ~@2 d3@2 ~@4 d3@3 ~@2 [g2,d3]@10 ~@3 [g2,d3]@2 ~@4, ~@17 g2@2 ~@4 g2@3 ~@22", // G5
  H: "[g2,d3]@2 ~@4 [g2,d3]@12 ~@6 d3@18 g2@5 ~", // G5
  I: "[[d2,a2]@3 ~@3 [d2,a2]@10 ~@2 [d2,a2]@2 ~@4 [d2,a2]@2 ~@4 d2@9 ~@3 [d2,a2]@18 f#2@12 g2@12 [a1,a2]@11 ~, ~@29 a2@10 ~@57]/2", // D5 A
  J: "[d2,a2]@3 ~@3 [d2,a2]@10 ~@2 [d2,a2]@3 ~@3 [d2,a2]@3 ~@3 [d2,a2]@10 ~@2 [d2,a2]@3 ~@3", // D5
  K: "[d2,a2]@3 ~@3 [d2,a2]@11 ~ [d2,a2]@3 ~@3 [d2,a2]@3 ~@3 [d2,a2]@10 ~@2 [d2,a2]@2 ~@4", // D5
  L: "[d2,a2]@3 ~@3 [d2,a2]@10 ~@2 [d2,a2]@3 ~@3 [d2,a2]@3 ~@3 [d2,a2]@10 ~@2 [d2,a2]@5 ~", // D5
  M: "d3@3 ~@3 [g2,d3]@10 ~@2 [g2,d3]@2 ~@4 [g2,d3]@2 ~@4 [g2,d3]@10 ~@2 [g2,d3]@3 ~@3", // G5
  N: "[g2,d3] ~@2 [g2,d3]@6 ~@3 d3@9 g2@3", // G5
  O: "[d2,a2]@3 ~@3 [d2,a2]@10 ~@2 [d2,a2]@2 ~@4 [d2,a2]@3 ~@3 [d2,a2]@11 ~ [d2,a2]@2 ~@4", // D5
  P: "[d2,a2]@2 ~@4 [d2,a2]@9 ~@3 [d2,a2]@6 f#2@12 g2@12", Q: "[a1,a2]@17 ~ [a1,a2]@29 ~",
  R: "[g1,g2]@5 ~ [g1,g2]@4 b2@2 c#3@2 d3@2", // G
  S: "[d2,a2]@2 ~@4 [d2,a2]@10 ~@2 [d2,a2]@3 ~@3 [d2,a2]@3 ~@3 [d2,a2]@10 ~@2 [d2,a2]@4 ~@2", // D5
  T: "[d2,a2]@2 ~@4 [d2,a2]@10 ~@2 [d2,a2]@3 ~@3 [d2,a2]@6 f#2@12 g2@6", // D5
  U: "[a1,a2]@16 ~@2 [a1,a2]@16 ~@2 [a1,a2]@11 ~", V: "[g1,g2]@16 ~@2 [g1,g2]@16 ~@2 [g1,g2]@11 ~", W: "[b1,b2]@47 ~",
  X: "[b1,b2]@16 ~@2 [b1,b2]@11 ~ [f#1,f#2]@12 [g1,g2]@6", Y: "[a1,a2]@8 ~ [a1,a2]@14 ~",
  Z: "[g1,g2]@8 ~ [g1,g2]@6 b2@3 c#3@3 d3@3", // G
  AA: "[d2,a2]@3 ~@3 [d2,a2]@10 ~@2 [d2,a2]@3 ~@3 [d2,a2]@3 ~@3 [d2,a2]@9 ~@3 [d2,a2]@3 ~@3", // D5
  AB: "[d2,a2]@3 ~@3 [d2,a2]@10 ~@2 [d2,a2]@3 ~@3 [d2,a2]@6 f#2@12 g2@6", AC: "[a1,a2]", AD: "[g1,g2]@47 ~",
  AE: "e1@5 e2 f#2 g2, e2@7 ~@5", AF: "a2@11 ~ a2@3 ~, a1@15 ~",
  AG: "[d2,a2]@3 ~@3 [d2,a2]@10 ~@2 [d2,a2]@3 ~@3 [d2,a2]@3 ~@21", // D5
})).s("gm_piano").gain(0.48)

// chords · piano
const piano_2 = note(`<
  A@2 B@6 C@6 D@7 E@2 F G@2 H@4 I@6 J@4 C@6 D@7 E@2 F G@2 H@4 K@8 L@6 M@2 N@4 O@8 P@2 Q@8 R@3
>`.pickRestart({
  A: "[~@47 [d3,f#3,a3]@49]/2", B: "[~@23 [d3,f#3,a3]@48 [d3,f#3,a3]@48 [g3,b3,d4]@25]/6",
  C: "[~@47 [d3,f#3,a3]@96 [d3,f#3,a3]@95 ~ d3@49, ~@119 [f#3,a3]@25]/6", // D F#m
  D: "[~@47 [g3,b3,d4]@95 [d3,f#3,a3]@96 [a3,c#4,e4]@48 [g3,b3,d4]@49 f#3]/7", E: "[[d3,a3]@31 ~]/2", F: "[a3,c#4,e4]",
  G: "[[g3,b3,d4]@47 [b3,d4,f#4]@49]/2", // G Bm
  H: "[~@33 d4@12 ~ a3@36 a3@13 [g3,b3,d4]@48 [d3,f#3,a3]@49, ~@17 b3@28 e4@50 ~@97, ~@23 c#4@25 ~@48]/4", // G D
  I: "[~@35 a3@12 [a3,c#4,e4]@48 [g3,b3,d4]@48 [e3,g3,b3]@48 [a3,c#4,e4]@46 ~@2 [d3,f#3,a3]@49, ~@23 d3@24 ~@241]/6", // A G Em A D
  J: "[~@45 [f#3,a3] [d3,f#3,a3]@96 [g3,b3,d4]@50]/4", // F#m D G
  K: "[~@35 a3@12 [a3,c#4,e4]@48 [g3,b3,d4]@48 [e3,g3,b3]@48 a3@48 [d3,f#3,a3]@95 [d3,f#3,a3]@50, ~@23 d3@24 ~@144 [c#4,e4]@53 ~@140]/8", // A G Em D C#m
  L: "[~@46 b3@47 ~@25 g3@25 [d3,f#3,a3]@95 ~ d3@49, ~@23 d4@48 ~@73, ~@23 g3@36 ~@60 [f#3,a3]@25, ~@31 b3@17 ~@48]/6", // D F#m
  M: "[~@15 [d3,a3]@17, ~@10 d3@35 ~@51, ~@22 a3@23 ~@51, ~@11 f#3@21]/2", // D5
  N: "[~@17 d3@6 [g3,b3,d4]@42 [g3,b3,d4]@6 [d3,f#3,a3]@24 d3, ~@5 a3@18 ~@73]/4", // G D
  O: "[~@34 f#3@11 ~ [a3,e4]@49 [g3,b3,d4]@48 d3@77 ~@6 a3@12 ~ [a3,c#4,e4]@48 [g3,b3,d4]@47 [e3,g3,b3]@50, ~@10 f#3@24 ~@11 c#4@50 ~@48 a3@83 ~@158, ~@23 a3@23 ~@97 f#3@96 ~@145, ~@220 d3@19 ~@145]/8", // A5 G A G Em
  P: "[[a3,c#4,e4]@46 ~ [d3,a3]@47 d3@2, ~@23 f#3@25]/2", // A D5
  Q: "[~@47 [d3,a3]@47 [d3,f#3,a3]@49 g3@83 g3@13 d3@72 ~@12 a3@11 ~ [b3,d4]@49, ~@11 f#3@24 f#3@59 ~@145 f#3@96 ~@49, ~@23 a3@24 ~@96 [b3,d4]@96 a3@84 ~@11 g3@50, ~@311 d3@24 ~@49]/8", // D5 D Bm
  R: "[~@35 g3@12 [d3,f#3,a3]@76 ~@21, ~@23 b3@24 ~@97]/3", // D
})).s("gm_piano").gain(0.36)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@3 A B C@6 ~@2 D@7 E@3 F@6 G@4 H@2 I@2 J@6 ~@2 K@8 L@5 M@4 N@5 O@2 P@4 Q@2 R@2 S@6 T U@7 ~@2 V@2 ~@2 W@4 X@2
>`.pickRestart({
  A: "~@35 g5@6 f#5@7", B: "a4", C: "[~@35 g5@5 f#5@6 ~ a4@48 b4@48 g4@47 f#4@93 ~@5]/6",
  D: "[~@35 g5@6 f#5@6 a4@48 b4@42 c#5@6 d5@36 b4@12 a4@71 ~ f#4@11 g4@12 a4@38 a5@12]/7",
  E: "[g5@47 f#5@35 d5@12 ~ a4@49]/3",
  F: "[b4@17 a4@30 g4@48 e5@18 c#5@18 b4@12 d5@24 f#5@12 g5@12 a5@48 g5@47 ~ g5]/6",
  G: "[~@8 f#5@9 e5@6 a4@48 f#5@12 g5@12 a5@30 e5@6 d5@6 c#5@6 b4@48 ~]/4", H: "[b4@35 c#5@6 d5@5 c#5@47 ~@3]/2",
  I: "[~@35 g5@6 f#5@6 a4@45 ~@4]/2",
  J: "[~@36 g5@6 f#5@5 a4@48 b4@43 c#5@5 d5@43 e5@5 f#5@35 g5@7 f#5@5 ~ a4@46 ~@3]/6",
  K: "[~@35 g5@6 f#5@6 a4@47 b4@43 c#5@6 d5@36 b4@12 a4@35 g5@7 f#5@6 a4@45 ~@2 a4@19 b4@6 a4@24 g4@24 g5@8 f#5@8 ~ e5@7 g5]/8",
  L: "[~@8 f#5@7 d5@8 a4@69 ~@3 a4@12 b4@8 a4@28 g4@48 e5@11 d5@7 c#5@12 b4@12 c#5@7]/5",
  M: "[~@6 b4@4 c#5@6 ~ d5@6 f#5@23 ~ a4@48 g4@41 ~@7 g5@9 f#5@7 e5@7 g5@9 f#5@17]/4",
  N: "[~@5 e5@5 f#5@6 d5@7 e5@9 f#5@7 g5@7 a5@49 g5@47 ~ e5@30 f#5@6 g5@11 ~ a5@44 ~@5]/5",
  O: "[~@35 g5@6 f#5@6 a4@48 ~]/2", P: "[~@35 g5@6 f#5@6 a4@35 g4@7 a4@6 b4@36 c#5@11 d5@37 e5@13]/4",
  Q: "[f#5@35 d5@11 a4@40 ~@10]/2", R: "[~@35 g5@6 f#5@6 a4@43 ~@6]/2",
  S: "[~@35 a4@6 g5@6 f#5@12 a4@23 ~ g4@5 a4@6 b4@43 c#5@6 d5@43 e5@5 f#5@53 a4@6 d5@6 e5@6 f#5@14 g5@12]/6", T: "a5",
  U: "[g5@46 ~ g5@8 f#5@7 e5@7 g5@10 f#5@52 g5@12 a5@30 g5@5 f#5@6 e5@7 d5@36 b4@48 c#5@6 d5@6 c#5@47 ~@2]/7",
  V: "[~@35 g5@6 f#5@5 ~ a4@45 ~@4]/2", W: "[~@35 g5@6 f#5@5 ~ a4@48 b4@42 c#5@6 d5@37 b4@12]/4", X: "[a4@25 ~@7]/2",
})).s("gm_string_ensemble_1").gain(0.12)

// drums · rim
const rim = s("rim").struct("<[x!4] ~@102>").gain(0.04)

stack(piano, piano_2, string_ensemble_1, rim)

More by Tori Amos