Strudelify

Vienna

Ultravox

KeyF majorTempo80 bpm
0:00/0:00
// Vienna — Ultravox
// 80 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 11 piano (copy of ch 15 drawbar organ); ch 14 melodic tom (copy of ch 13 taiko drum)
// note: Full arrangement: all 94 bars on a 16-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.

// bass · synth bass 1
const bass = note(`<
  ~@21 A@3 B C D@2 E@18 ~@2 A@3 B C D@2 E@9 F G H I@2 J K L@2 M@2 N@2 O P Q R S@8 T@3 ~@2
>`.pickRestart({
  A: "[bb1,bb2] [f1,f2]", B: "[bb1,bb2] [g1,g2] [bb1,bb2]@2", C: "[f1,f2]", D: "[f1,f2]@15 ~",
  E: "[c2,c3]!2 ~@4 [g1,g2]!2 [c2,c3]!2 ~@6", F: "c2!2 c3!2 c2!2 c3!2 c2!2 c3!2 c2 [c2,c3]!2 c3",
  G: "[g1,c3] g1 g2!2 g1!2 g2!2 g1!2 g2!2 g1!2 ~@2", H: "g1!2 g2!2 g1!2 g2!2 g1!2 g2!2 g1!2 ~@2",
  I: "a1!2 a2!2 a1!2 a2!2 a1!2 a2!2 a1!2 ~@2", J: "bb1!2 bb2!2 bb1!2 bb2!2 bb1!2 bb2!2 bb1!2 ~@2",
  K: "bb1!2 bb2!2 bb1!2 bb2!2 bb1!2 bb2!2 c2!2 ~@2", L: "d2!2 d3!2 d2!2 d3!2 d2!2 d3!2 d2!2 ~@2",
  M: "e2!2 e3!2 e2!2 e3!2 e2!2 e3!2 e2!2 ~@2", N: "f2!2 f3!2 f2!2 f3!2 f2!2 f3!2 f2!2 ~@2",
  O: "g2!2 g3!2 g2!2 g3!2 g2!2 g3!2 g2!2 ~@2", P: "g2!2 g3!2 g2!2 g3!2 g2!2 g3!2 a2!2 ~@2",
  Q: "bb2!2 bb3!2 bb2!2 bb3!2 bb2!2 bb3!2 bb2!2 ~@2", R: "bb2!2 bb3!2 bb2!2 bb3 ~ bb3 bb2!2 ~ bb3!2 bb2 ~",
  S: "[bb2 ~@3 [bb1,bb2]@8 [f1,f2]@8 [bb1,bb2]@8 [f1,f2]@8 [bb1,bb2]@8 [f1,f2]@8 [bb1,bb2]@4 [g1,g2]@4 [bb1,bb2]@8 [f1,f2]@16 [f1,f2]@15 ~ [f1,f2]@15 ~ [f1,f2]!2 ~@4 [c1,c2]!2 [f1,f2]!2 ~@2]/8", // Bb F Bb F Bb F Bb G …
  T: "~@4 [f1,f2]!2 ~@4 [c1,c2]!2 [f1,f2]!2 ~@2", // F C F
})).s("gm_synth_bass_1").gain(0.38)

// other · oboe
const oboe = note(`<
  ~@4 A B ~@2 C D ~ E F G ~ E H I ~ J K L@2 M@2 N@2 ~@4 O P ~ O Q R ~ A F S ~ T U V ~ J K L@2 M@2 N@2 ~@26 W X@6 ~@7
>`.pickRestart({
  A: "~@15 c4", B: "e4 ~ e4 c4 f4@2 e4@8 ~@2", C: "f4@2 f4 ~ f4 ~ f4!2 g4@2 f4 ~ f4@4", D: "e4@2 e4 c4 f4@2 e4@4 ~@6",
  E: "~@15 f4", F: "f4 ~ f4!3 ~ f4!2 g4@2 f4 ~ f4@3 g4", G: "g4 ~ g4 e4 a4@2 g4@5 ~@5",
  H: "f4@2 f4!2 f4@2 f4!2 g4@2 f4 ~ f4@2 g4 ~", I: "g4@2 g4 e4 a4@2 g4@6 ~@4, ~@4 g4 ~@11", J: "~@15 bb5",
  K: "bb5 ~ a5!2 a5@2 g5!2 g5@2 f5 ~ f5@2 g5!2", L: "[g5 ~ f5 e5 f5@16 ~@8 g5 ~ g5 ~]/2",
  M: "[g5 ~ f5 e5 f5@20 g5@8]/2", N: "[a5 g5 f5@20 ~@10]/2", O: "~@15 e4", P: "e4 ~ e4 c4 f4@2 e4@4 ~@6",
  Q: "f4@2 f4 ~ f4 ~ f4!2 g4@2 f4 ~ f4@3 e4", R: "e4@2 e4 c4 f4@2 e4@2 ~@8", S: "g4 ~ g4 e4 a4@2 g4@4 ~@6",
  T: "~@15 a4", U: "a4@2 a4!2 a4@2 g4!2 g4@2 f4@2 f4@2 [g4,c5] ~",
  V: "[g4,c5]@2 [g4,c5] [e4,a4] [a4,d5]@2 [g4,c5]@6 ~@4", W: "~@7 g5",
  X: "[~ g5@2 ~ g5 ~ f5 e5 f5@16 ~@7 g5@3 a5@2 g5 ~ f5 e5 f5@20 g5@8 a5 g5 f5@20 ~@6]/6",
})).s("gm_oboe").gain(0.41)

// other · cello
const cello = note("<~@65 A B C@2 D E F G H I J@2 K L K M@2 ~@12>".pickRestart({
  A: "~ g3 e3 bb2", B: "g3@3 ~ g3@4 e3@4 bb2@4", C: "a2@3 ~ f3@4 d3@4 a2@4", D: "bb2@3 ~ g3@4 e3@4 bb2@4",
  E: "bb2 g3 e3 c3", F: "d3@3 ~ a3@4 f3@4 d3@4", G: "a2@3 ~ a3@4 f3@4 d3@4", H: "bb2 bb3 g3 e3",
  I: "bb2@3 ~ bb3@4 g3@4 e3@4", J: "a2 a3 f3 c3", K: "bb3 g3 e3 bb2", L: "bb3 g3 e3 a2",
  M: "[bb3@4 g3@5 e3@5 bb2@5 ~@13]/2",
})).s("gm_cello").gain(0.35).pan(0.2)

// other · cello
const cello_2 = note("<~@65 A B C D E B F G H I J K ~@17>".pickRestart({
  A: "bb3", B: "bb3@3 c4", C: "a3@7 c4", D: "e4@9 ~ f4 [d4,e4] e4@2 d4@2", E: "bb3@12 e4 f4 e4 d4", F: "d4",
  G: "d5@5 f5 e5 d5", H: "g4@5 a4 bb4 d5", I: "d5@5 f5 e5 f5", J: "f5@7 e5", K: "f5",
})).s("gm_cello").gain(0.35).pan(0.8)

// chords · string ensemble 1
const string_ensemble_1 = note("<~@5 A@8 ~@6 B@3 C@6 ~@18 B@3 C@6 ~@6 D@4 ~@5 E F@4 G@2 H@4 I@4 J@8 ~>".pickRestart({
  A: "c7/8", B: "[[d5,bb5]@5 [c5,a5], f5]/3", C: "[[d5,bb5] [c5,a5] [d5,bb5] [c5,a5] [d5,bb5]@2 [c5,a5]@6, f5]/6",
  D: "c7/4", E: "~@3 [c5,c6]", F: "[d5@2 ~ e6, d6@3 ~, ~ [g5,bb5]]/4", G: "[f5,a5,f6]/2", H: "[d6 e6 d6@2, [g5,bb5]]/4",
  I: "[~ [d5,bb5]@2 [c5,a5]@2 [d5,bb5]@2 [c5,a5]@2 [d5,bb5]@2 [c5,a5]@2 [d5,bb5]@3, ~ f5@4 f5@11]/4", // Gm F Gm F Gm F Gm
  J: "[~ [c5,f5,a5]@31]/8", // F
})).s("gm_string_ensemble_1").gain(0.24).pan(0.3)

// other · pad poly
const pad_poly = note("<~ A@6 B@2 C@2 B@2 C@2 D E C@2 F@2 ~@11 G@2 H I C@2 H J C@2 H J C@2 F@2 ~@46>".pickRestart({
  A: "e4/6", B: "[f4@3 a4]/2", C: "[e4@18 f4@2 e4@2 c4@2 d4 f4@3 e4@2 c4@2]/2", D: "f4", E: "c5 b4", F: "d4/2",
  G: "e4/2", H: "f4@3 c5", I: "b4 a4 g4 f4", J: "b4 d5 a4 g4",
})).s("gm_pad_poly").gain(0.32).pan(0.1)

// other · pad poly
const pad_poly_2 = note(`<
  ~ A@8 ~@10 B@3 C@2 D E@3 A@8 ~@10 B@3 C@2 D E@3 A@8 ~@2 F@2 G@2 H I J@2 K@2 L@2 F M H N O@4 P@8 ~
>`.pickRestart({
  A: "c2/8", B: "[bb1@5 f1]/3", C: "bb1 f1", D: "bb1 g1 bb1 g1", E: "f1/3",
  F: "g2!2 d3 g3 g2!2 d3 g3 g2!2 d3 g3 g2!2 d3 g3", G: "a2!2 e3 a3 a2!2 e3 a3 a2!2 e3 a3 a2!2 e3 a3",
  H: "bb2!2 f3 bb3 bb2!2 f3 bb3 bb2!2 f3 bb3 bb2!2 f3 bb3", I: "bb2!2 f3 bb3 bb2!2 f3 bb3 bb2!2 f3 bb3 c3!2 g3 c4",
  J: "d3!2 a3 d4 d3!2 a3 d4 d3!2 a3 d4 d3!2 a3 d4", K: "e3!2 bb3 e4 e3!2 bb3 e4 e3!2 bb3 e4 e3!2 bb3 e4",
  L: "f3!2 c4 f4 f3!2 c4 f4 f3!2 c4 f4 f3!2 c4 f4", M: "g2!2 d3 g3 g2!2 d3 g3 g2!2 d3 g3 a2!2 e3 a3",
  N: "bb2!2 f3 bb3 bb2!2 f3 ~ bb3 bb2!2 ~ f3 bb3 bb2 ~",
  O: "[bb2 f3 bb3 ~ bb1@8 f1@8 bb1@8 f1@8 bb1@8 f1@8 bb1@4 g1@4 bb1@4]/4", P: "[g1 f1@31]/8",
})).s("gm_pad_poly").gain(0.38).pan(0.7)

// other · taiko drum
const taiko_drum = note(`<
  ~ A@24 ~@6 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@4 A ~ A ~ A ~ A ~@20 B ~ B ~@2 C D@2 E ~@2
>`.pickRestart({
  A: "~@12 g1!2 ~@2", B: "g1!2 ~@14", C: "~@14 g1 ~", D: "~ g1 ~@12 g1 ~", E: "~ g1 ~@14",
})).s("gm_taiko_drum").gain(0.5).pan(0.8)

// chords · drawbar organ
const drawbar_organ = note("<~@19 A@2 B@3 C D@3 ~@18 A@2 B@3 C D@3 ~@26 E F@2 G H@8 ~>".pickRestart({
  A: "[d6,f6,bb6]/2", B: "[d6,f6,bb6]!2 [d6,f6,a6]!2", C: "[d6,f6,bb6]!4", D: "[f6,a6,c7]/3",
  E: "~ [d6,f6,bb6]!2 [d6,f6,a6]", F: "[d6,f6,a6] [d6,f6,bb6]!2 [d6,f6,a6]", G: "[d6,f6,a6] [d6,f6,bb6]!3",
  H: "[[d6,f6,bb6] [f6,a6,c7]@12 [f6,a6,c7]@19]/8", // Bb F
})).s("gm_drawbar_organ").gain(0.48).pan(0.9)

// drums · kick
const kick = s("bd").struct(`<
  ~
  [x ~@5 x ~ x!2 ~@6]!63
  [x!4]!16
  [x ~@3 x ~@4 x ~@4 x ~]
  [~@4 x ~@5 x ~ x!2 ~@2]!11
  ~@2
>`).gain(0.44)

// drums · snare
const snare = s("sd").struct("<~@28 A@24 ~@3 A@9 B@16 C D E@3 F ~@2 G E@3 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~ x ~ x ~ x ~ x", C: "~ x ~ x ~@2 x ~", D: "~ x ~@6 x ~@7", E: "x!2", F: "x", G: "~ x",
})).gain(0.44)

// drums · hihat
const hihat = s("hh").struct(`<
  A ~@28 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@4 B ~ B ~ B ~ B ~@20 C ~ C ~@8
>`.pickRestart({
  A: "x!4", B: "~@3 x", C: "x",
})).gain(0.38)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@28 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@4 A ~ A ~ A ~ A ~ A ~@18 B ~ B ~@4 C@3 ~@2
>`.pickRestart({
  A: "~@13 x ~@2", B: "~ x ~@14", C: "~ x ~@2",
})).gain(0.27)

// drums · crash
const crash = s("cr").struct("<~@85 [~ x ~@2]!3 ~@6>").gain(0.38)

stack(
  bass, oboe, cello, cello_2, string_ensemble_1, pad_poly, pad_poly_2, taiko_drum, drawbar_organ, kick, snare, hihat,
  open_hat, crash
)