Strudelify

Chung Kuo

Vangelis

KeyD♭ majorTempo100 bpm
0:00/0:00
// Chung Kuo — Vangelis
// 100 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 124 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(100/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 · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note(`<
  A@7 B@7 C@2 D@5 E@8 F@4 G@4 H@2 I@2 J@2 K@2 J@2 K@2 J@2 K@2 H@2 I@2 J@2 K@2 J@2 K@2 J@2 K@2 H@2 I@2 J@2 K@2 J@2 K@2
  J@2 K@2 H@2 I@2 J@2 K@2 J@4 K@4 L@4 K@4 M@8 ~@7
>`.pickRestart({
  A: "[~@169 bb4@37 ~@3 eb5@38 ~ [g4,d5,g5]@8 ~@2 [g2,g4,d5,g5]@8 ~@2 [bb2,bb4,d5,f5]@56 ~@4 [g2,g4,d5,g5]@8, ~ g2@7 g2@4 g2@3 ~@13, ~@90 c4@38 ~@3 f4@37 ~@168]/7", // G5 Bb G5
  B: "[~@2 [g2,g4,d5,g5]@8 ~ [bb2,bb4,d5,f5]@19 ~ g4@29 g4@11 ~ g4@11 ~ d5@12 d5@12 d5@12 d5@12 d5@12 [g4,d5]@12 [g4,d5]@12 ~@168, ~@5 g2@51, ~@31 d5@53 g4@59 ~@193]/7", // G5 Bb G5
  C: "[~@5 db4@19, ~@5 db3@27, ~@17 f3@79, ~@3 ab3@13]/2",
  D: "[~@7 [a2,e3,a3,db4,e4]@7 [b2,eb3,b3,eb4]@6, b2@43 ~@77, ~ eb3@86 ~@153, ~ [b3,eb4]@43 ~@76]/5", // A B
  E: "[~ [db3,f3,ab3,db4]@15]/8", F: "[[db3,ab3,db4]@95 ~ [eb3,ab3,b3,eb4]@95 ~, f3]/4",
  G: "[[db3,ab3,db4]@95 ~ [eb3,ab3,b3,eb4]@95 ~, f3@7 ~]/4", H: "[[db3,gb3,bb3,db4]@95 ~]/2",
  I: "[[eb3,gb3,a3,eb4]@95 ~]/2", J: "[[db3,f3,ab3,db4]@95 ~]/2", K: "[[eb3,ab3,b3,eb4]@95 ~]/2",
  L: "[db3,f3,ab3,db4]/2", M: "[[f3,ab3,db4]@239 ~@145, [db2,db3]]/8",
})).s("gm_synth_strings_2").gain(0.09).pan(0.2)

// bass · lead 2 sawtooth · "SAW WAVE"
const bass = note("<~@25 A@88 ~@7 B@4>".pickRestart({
  A: "db2 ~@11 b1 ~@3", B: "[~@12 db2@179 ~]/4",
})).s("gm_lead_2_sawtooth").gain(0.3)

// other · pad new age · "FANTASIA"
const pad_new_age = note(`<
  ~@29 A@2 B@2 C@4 D@2 E@2 F G H@6 I@4 J@4 F G K@2 L@2 M@2 L@2 N@2 ~@9 O P Q R@3 ~ D@2 E@2 F G S@2 L@2 ~@2 T@2 ~ U V@2
  ~@2 W@3 ~@16
>`.pickRestart({
  A: "[~@14 db6@6 c6@5 ~ db6@11 ~ ab5@58]/2", B: "[~@14 b5@6 bb5@5 ~ b5@11 ~ ab5@58]/2",
  C: "[~@14 db6@6 c6@5 ~ db6@11 ~ ab5@59 ~@13 b5@6 bb5@5 ~ b5@11 ~ ab5@58]/4",
  D: "[~@14 gb5@6 f5@5 ~ gb5@11 ~ db5@58]/2", E: "[~@14 gb5@6 f5@5 ~ gb5@11 ~ db5@37 ~@17 ab5@4]/2",
  F: "~@2 f6@5 eb6@5 ~ eb6@6 db6@5 ~ db6@6 bb5@5 ~ bb5@6 ab5@5", G: "~ ab5@34 ~@13",
  H: "[~@2 gb5@8 f5@10 eb5@6 eb5@71 ~@13 db5@6 c5@5 ~ db5@11 ~ ab4@59 ~@13 b4@6 bb4@5 ~ b4@11 ~ ab4@58]/6",
  I: "[~@14 db5@6 c5@5 ~ db5@11 ~ ab4@59 ~@13 b4@6 bb4@5 ~ b4@11 ~ ab4@58]/4",
  J: "[~@14 gb4@6 f4@5 ~ gb4@11 ~ db4@59 ~@13 gb4@6 f4@5 ~ gb4@11 ~ db4@41 ~@13 ab5@4]/4",
  K: "[~ gb5@4 f5@5 eb5@3 eb5@28 ~@7]/2", L: "[~@2 db5@81 ~@13]/2", M: "[~@2 b5@6 bb5@9 ab5@6 ~@2 ab5@58 ~@13]/2",
  N: "[~@2 b5@6 bb5@9 ab5@6 ~@2 ab5@70 ~]/2", O: "ab6@6 eb6@6 db6@12 ~@11 ab5@12 ~, ~@8 eb6@3 ~@5, ~@29 db6@11 ~@8",
  P: "eb6@47 ~", Q: "~ ab5 eb6@3 ~ eb6@2, ~@30 ab5@11 ~@7",
  R: "[db6@58 ~@38 b5@47 ~, ~@30 db6@10 ~@5 db6@5 ~@22, ~@72 eb6@23 ~@49]/3", S: "[~ gb5@4 f5@5 eb5@3 eb5@35]/2",
  T: "[~ b4@4 bb4@5 ab4@3 ab4@28 ~@7]/2", U: "~@2 b5@7 bb5@9 ab5@6 ~@2 b5@7 bb5@9 ab5@6", V: "[~ db6@95]/2",
  W: "[~@2 b4@8 bb4@10 ab4@6 ab4@117 ~]/3",
})).s("gm_pad_new_age").gain(0.35).pan(1)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  ~@80 A@2 B C D E F E F G H I J K@3 L M@3 N O@2 P Q R@3 ~@5 S@2 T U V W X@3 ~@2
>`.pickRestart({
  A: "[~@21 ab3@23 ~ db4@50 ~]/2", B: "ab4@12 db4@11 ~ eb4@17 ~ db4@5 ~", C: "ab4@47 ~", D: "eb4@23 ~ ab3@23 ~",
  E: "gb3 db4", F: "gb4@23 ~ db5@23 ~", G: "ab4 f4", H: "db4@12 eb4@12 ab4@12 db4@11 ~", I: "eb4 ab3",
  J: "ab3@24 ab3@23 ~", K: "[db4@119 ~ f4@23 ~]/3", L: "eb4 db4", M: "[b3@5 ab3]/3", N: "b3@47 ~", O: "[db4@95 ~]/2",
  P: "~ [db4,f4]", Q: "[ab3,eb4] [db3,db4]", R: "[[eb3,eb4]@11 ~]/3", S: "db3/2", T: "ab3", U: "db4", V: "eb4", W: "g4",
  X: "bb4/3",
})).s("gm_lead_2_sawtooth").gain(0)

// other · lead 8 bass lead · "BASS&LEAD"
const lead_8_bass_lead = note("<~@7 A@4 B@7 C D ~@79 E@2 ~@23>".pickRestart({
  A: "[~@30 d7@95 ~@2 c7@65]/4",
  B: "[a6@11 f6@9 e6@11 d6@10 g6@9 db6@10 c6@10 b5@10 gb6@9 bb5@10 a5@10 ab5@10 e6@9 g5@10 gb5@10 f5@10 f6@10 d6@11 db6@10 c6@11 e6@9 b5@11 bb5@10 a5@9 eb6@9 ab5@10 g5@10 gb5@10 db6@9 e5@10 eb5@10 d5@10 c6@9 c5@10]/7",
  C: "b4@10 bb4@10 db6@9 g5@10 gb5@9", D: "f5@11 ~@37", E: "[[ab5,db6]@7 ~]/2",
})).s("gm_lead_8_bass_lead").gain(0.15).pan(1)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@19 A@7 ~@3 B@8 C@6 D@8 E@6 F G H@4 I@2 J@2 K@2 L@4 M N O@3 ~@7 P@4 Q@2 R@2 J@2 ~@2 S@2 ~ T U@2 ~@2 V@3 W X@5 ~@5 Y@4
  ~
>`.pickRestart({
  A: "[~@45 [b3,b4]@79 ~@14 [db4,db5]@197 ~]/7", // B Db
  B: "[~@12 db6@5 c6@5 ~ db6@12 ab5@65 ~@8 b5@5 bb5@5 ~ b5@12 ab5@65 ~@8 db6@5 c6@5 ~ db6@12 ab5@65 ~@8 b5@5 bb5@5 ~ b5@12 ab5@61]/8",
  C: "[~@12 gb5@5 f5@5 ~ gb5@12 db5@67 ~@6 gb5@5 f5@5 ~ gb5@12 db5@47 ~@8 ab5@5 f6@5 ~ eb6@5 ~ eb6@5 ~ db6@5 ~ db6@5 ~ bb5@5 ~ bb5@5 ~ ab5@5 ~ ab5@42 ~@7]/6",
  D: "[gb5@7 ~ f5@9 eb5@6 ~ eb5@77 ~@7 db6@5 c6@5 ~ db6@12 ab5@65 ~@8 b5@5 bb5@5 ~ b5@12 ab5@65 ~@8 db6@5 c6@5 ~ db6@12 ab5@61]/8",
  E: "[~@12 b5@5 bb5@5 ~ b5@12 ab5@65 ~@8 gb5@5 f5@5 ~ gb5@12 db5@65 ~@8 gb5@5 f5@5 ~ gb5@12 db5@46 ~@9 ab5@6]/6",
  F: "f6@5 eb6@5 ~ eb6@6 db6@5 ~ db6@6 bb5@5 ~ bb5@6 ab5@6 ~", G: "ab5@43 ~@5",
  H: "[gb5@8 f5@9 eb5@6 ~ eb5@65 ~@6 db6@89 ~@8]/4", I: "[b5@7 bb5@9 ab5@6 ~ ab5@65 ~@8]/2", J: "[db6@11 ~]/2",
  K: "[b5@7 bb5@9 ab5@6 ~ ab5@70 ~@3]/2",
  L: "[~@17 f4@6 gb4@12 db4@65 ~@8 gb4@5 f4@6 gb4@12 db4@46 ~@9 [ab4,ab5]@6, ~@3 gb4@2 ~@43]/4", // Ab
  M: "[f5,f6]@6 [eb5,eb6]@5 ~ [eb5,eb6]@6 [db5,db6]@5 ~ [db5,db6]@6 [bb4,bb5]@5 ~ [bb4,bb5]@6 [ab4,ab5]@6", // F Eb Db Bb Ab
  N: "ab5@47 ~, ab4 ~@7", O: "[[gb4,gb5]@8 ~@9 [eb4,eb5]@6 ~ [eb4,eb5]@84 ~@36, ~@4 [f4,f5]@7 ~@61]/3",
  P: "[~@12 gb5@5 f5@5 ~ gb5@12 db5@67 ~@6 gb5@5 f5@5 ~ gb5@12 db5@47 ~@8 ab5@6]/4",
  Q: "[f6@5 eb6@5 ~ eb6@5 ~ db6@5 ~ db6@5 ~ bb5@5 ~ bb5@5 ~ ab5@5 ~ ab5@42 ~@7]/2",
  R: "[gb5@7 ~ f5@9 eb5@6 ~ eb5@71 ~]/2", S: "[b5@8 bb5@9 ab5@6 ~ ab5@65 ~@7]/2",
  T: "b5@8 bb5@9 ab5@6 b5@8 bb5@9 ab5@8", U: "db6/2", V: "[b5@8 bb5@9 ab5@6 ~ ab5@116 ~@4]/3",
  W: "~ [b3,b4]@7 [bb3,bb4]@9 [ab3,ab4]@6 ~@2 [b3,b4]@7 [bb3,bb4]@9 [ab3,ab4]@7", X: "[~ [db4,db5]@239]/5",
  Y: "[~@24 bb5@152 ~ bb5@14 ~]/4",
})).s("gm_string_ensemble_2").gain(0.3).pan(0)

// chords · brass section · "BRASS 1"
const brass_section = note("<~ A@6 B@5 ~@112>".pickRestart({
  A: "[~@42 [c3,c4]@38 ~@3 [f3,f4]@37 ~ [bb3,bb4]@36 ~@4 [eb4,eb5]@38 ~ [g4,d5,g5]@8 ~@2 [g4,d5,g5]@8 ~@2 [bb4,d5,f5]@56 ~@4 [g4,d5,g5]@8]/6", // C F Bb Eb G5 Bb G5
  B: "[~@2 [g4,d5,g5]@8 ~ [bb4,d5,f5]@18 ~@2 [d4,bb4,d5]@176 ~@33]/5", // G5 Bb Gm
})).s("gm_brass_section").gain(0.3).pan(0.3)

// other · synth strings 2 · "SYN STR 2"
const synth_strings_2_2 = note("<~@69 A@4 B C D@6 ~@27 E F@2 ~@13>".pickRestart({
  A: "[~@18 db2@32 ~@16 db2@23 ~@4 ab2@3, ~@12 gb2@10 ~ gb2@18 ~@67 gb2@9 ~@2 gb2@17 ~@56, ~@17 f2@11 ~@85 f2@11 ~@68]/4",
  B: "f3@6 eb3@5 ~ eb3@6 db3@5 ~ db3@6 bb2@5 ~ bb2@6 ab2@6", C: "ab2 ~@7",
  D: "[gb2@8 f2@9 eb2@7 ~@72 db2@102 eb4@89 ~, ~@25 eb2@83 ~@180]/6", E: "~ b2@7 bb2@9 ab2@6 ~@3 b2@7 bb2@9 ab2@6",
  F: "[db3@95 ~]/2",
})).s("gm_synth_strings_2").gain(0.4).pan(0.2)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@2 A B C D E F G ~@10 H@7 ~@98>".pickRestart({
  A: "~@14 b5@3 ~@6 b5@3 ~@22", B: "~@5 b5@3 ~@6 b5@3 ~@27 b5@3 ~", C: "~@6 b5@3 ~@27 b5@3 ~@7 b5@2",
  D: "~@28 b5@3 ~@7 b5@3 ~@7", E: "~@20 b5@3 ~@6 b5@3 ~@16", F: "~@11 b5@3 ~@6 b5@3 ~@25", G: "~@2 b5@3 ~@7 b5@3 ~@33",
  H: "[~@11 db4@17, ~@2 b2@6 db3@13, ~@17 eb3@48 f3@103, ~@36 b3@95 ab3@205, ~@38 eb4@95 ~@203]/7",
})).s("gm_string_ensemble_1").gain(0.3)

// chords · string ensemble 1 · "STRINGS" · soft notes
const string_ensemble_1_soft = note("<~@16 A@4 ~@104>".pickRestart({
  A: "[~@48 e4@43 ~@5, ~ b2@29 a2@29 ~@5, ~@5 eb3@87 e3@86 ~@14, ~@4 b3@43 a3@43 ~@6, ~@9 eb4@86 db4@87 ~@10]/4",
})).s("gm_string_ensemble_1").gain(0.15)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1_2 = note("<~ A@6 B@5 ~@112>".pickRestart({
  A: "[~@42 c3@38 ~@3 f3@37 ~ bb3@37 ~@3 eb4@38 ~ [g3,g4]@8 ~@2 [g3,g4]@8 ~@2 [bb3,f4]@56 ~@4 [g3,g4]@8]/6", // G Bb5 G
  B: "[~@2 [g3,g4]@8 ~ [bb3,f4]@18 ~@2 [g3,d4]@175 ~@34]/5", // G Bb5 G5
})).s("gm_string_ensemble_1").gain(0.3).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~ [~@7 x] [~@17 x ~@6] [~@25 x ~@22] [~@17 x ~@30] [~ x ~@4] [x ~@4 x] ~@117>").gain(0.3)

// drums · snare
const snare = s("sd").struct(`<
  ~@16
  [~@37 x!2 ~ x ~ x ~ x ~ x ~]
  [x ~ x ~ x!2 ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~@2 x ~@3 x ~@3 x ~@2 x ~@11]
  ~@2
  [~@18 x ~@2 x ~ x ~@2 x ~ x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~]
  [~ x ~@3 x ~@2 x ~@3 x ~@3 x ~@3 x ~@3 x ~@23]
  ~@102
>`).gain(0.1)

// drums · low tom
const low_tom = s("lt").struct("<~ A B C D E F G ~@116>".pickRestart({
  A: "~@7 x", B: "~@17 x ~@6", C: "~@25 x ~@22", D: "~@17 x ~@30", E: "~ x ~@4", F: "x ~@4 x", G: "~@31 x ~@16",
})).gain(0.3)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@16
  [~@37 x!2 ~ x ~ x ~ x ~ x ~]
  [x ~ x ~ x!2 ~ x ~ x ~ x ~ x ~ x ~ x ~@2 x ~ x ~@2 x ~@3 x ~@3 x ~@2 x ~@11]
  ~@2
  [~@18 x ~@2 x ~ x ~@2 x ~ x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~]
  [~ x ~@3 x ~@2 x ~@3 x ~@3 x ~@3 x ~@3 x ~@23]
  ~@102
>`).gain(0.1)

// drums · crash
const crash = s("cr").struct("<~ A B C D E F G H ~@8 I ~@3 J ~@102>".pickRestart({
  A: "~@7 x", B: "~@14 x ~@8 x ~@10 x ~@13", C: "~@5 x ~@8 x ~@10 x ~@18 x ~@3", D: "~@6 x ~@10 x ~@18 x ~@9 x ~",
  E: "~@4 x ~@9 x ~@4 x ~@4", F: "x ~@19 x ~@8 x ~@10 x ~@7", G: "~@11 x ~@8 x ~@10 x ~@16", H: "~ x ~@4 x ~@17",
  I: "~@3 x", J: "~ x",
})).gain(0.3)

stack(
  synth_strings_2, bass, pad_new_age, lead_2_sawtooth, lead_8_bass_lead, string_ensemble_2, brass_section,
  synth_strings_2_2, string_ensemble_1, string_ensemble_1_soft, string_ensemble_1_2, kick, snare, low_tom, open_hat,
  crash
)

More by Vangelis