Strudelify

Voyage Voyage

Desireless

KeyG♯ minorTempo120 bpm
0:00/0:00
// Voyage Voyage — Desireless
// 120 bpm, 4/4, key G# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 1 "VIBRAPHONE" vibraphone (copy of ch 2 "A.PIANO 1" piano); ch 5 "SYNTHBRASS" synth brass 1 (copy of ch 3 "BRASS" brass section)
// note: Full arrangement: all 134 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 · piano · "A.PIANO 1"
const piano = note("<~@46 A B A B C D ~@38 A B A B C D ~@38>".pickRestart({
  A: "[g#5,g#6] ~ [f#5,f#6] ~ [g#5,g#6] ~ [d#5,d#6] ~ [f#5,f#6] ~ [g#5,g#6] ~@3 [f#5,f#6] ~", // G# F# G# D# F# G# F#
  B: "[g#5,g#6] ~ [b5,b6] ~@13", // G# B
  C: "[g#5,g#6] ~ [f#5,f#6] ~ [g#5,g#6] ~ [d#5,d#6] ~ [f#5,f#6] ~ [g#5,g#6] ~@3 [g#5,g#6] ~", D: "[f#5,f#6] ~@15",
})).s("gm_piano").gain(0.5).pan(0.7)

// chords · brass section · "BRASS"
const brass_section = note("<~@52 A@4 B@2 A@6 B@2 A@4 C@2 B D ~@22 A@4 B@2 A@4 C@2 B D ~@24>".pickRestart({
  A: "~@2 [d#4,g#4,b4] ~ [d#4,g#4,b4] ~ [d#4,g#4,b4] ~@3 [d#4,g#4,a#4] ~ [d#4,g#4,b4] ~ [d#4,g#4,a#4] ~", // G#m D#sus4 G#m D#sus4
  B: "~@2 [c#4,f#4,a#4] ~ [c#4,f#4,a#4] ~ [c#4,f#4,a#4] ~@3 [c#4,f#4,g#4] ~ [c#4,f#4,a#4] ~ [c#4,f#4,g#4] ~", // F# C#sus4 F# C#sus4
  C: "~@2 [e4,g#4,b4] ~ [e4,g#4,b4] ~ [e4,g#4,b4] ~@3 [e4,g#4,a#4] ~ [e4,g#4,b4] ~ [e4,g#4,a#4] ~", // E A#m7b5 E A#m7b5
  D: "[c#4,f#4,a#4] ~@15", // F#
})).s("gm_brass_section").gain(0.5).pan(0.6)

// chords · synth strings 2 · "SYN STRING"
const synth_strings_2 = note(`<
  A@4 B@2 A@6 B@2 A@6 B@2 A@4 C@2 D@2 E F G H E F G I E F G H E F G I J@2 K@2 L@2 M@4 N@2 M@6 N@2 M@4 O@2 P@2 Q R S@2 E
  F G T E F G H E F G I J@2 K@2 L@2 A@4 B@2 A@4 C@2 D@2 Q R S@2 E F G T E F G H E F G I Q R S@2 E F G U
>`.pickRestart({
  A: "[b4 a#4 b4 a#4, [d#4,g#4]]/2", B: "[a#4 g#4 a#4 g#4, [c#4,f#4]]/2", C: "[e4,g#4,b4]/2",
  D: "[[f#4,g#4,a#4,c#5]@19 ~@13]/2", E: "[e3,e4,g#4,b4]", F: "[c#3,c#4,e4,g#4]", G: "[f#3,c#4,f#4,a#4]",
  H: "[d#3,d#4,f#4,a#4]", I: "[d#3,d#4,g4,a#4]", J: "[b4 a#4 b4@2, [d#4,g#4]]/2", K: "[b4 a#4 b4@2, [g#3,d#4,g#4]]/2",
  L: "[~ g#4 ~@2, [f#3,f#4,a#4,c#5]@19 ~@13]/2", M: "[b4 a#4 b4 a#4, [g#3,d#4,g#4]]/2",
  N: "[a#4 g#4 a#4 g#4, [f#3,c#4,f#4]]/2", O: "[g#3,e4,g#4,b4]/2", P: "[[f#3,f#4,g#4,a#4,c#5]@19 ~@13]/2",
  Q: "[g#3,e4,g#4,b4]", R: "[e3,c#4,e4,g#4]", S: "[[c#4,f#4,a#4] [d#4,f#4,a#4], f#3]/2", T: "[g3,d#4,g4,a#4]",
  U: "[g3,d#4,g4,a#4] ~@3", // D#
})).s("gm_synth_strings_2").gain(0.42)

// chords · clavinet
const clavinet = note(`<
  A@4 B@2 A@2 C A@3 B@2 A@2 C A@3 B@2 A@2 C A D E F G H I J K H I J L H I J M H I J L N@4 O P Q N@3 O@2 N@2 Q N@3 O@2
  N@2 Q R S T U G H I J K H V J L H I J M H V J L N@4 O P N R N R O W N R Q R S T U G H I J M H I J L H I J M H I J L H
  I J M H I J X
>`.pickRestart({
  A: "~@2 [d#5,g#5,b5] ~@3 [d#5,g#5,b5] ~@3 [d#5,g#5,a#5] ~ b4 ~ [d#5,g#5,a#5] ~", // G#m D#sus4
  B: "~@2 [c#5,f#5,a#5] ~@3 [c#5,f#5,a#5] ~@3 [c#5,f#5,g#5] ~ a#4 ~ [c#5,f#5,g#5] ~", // F# C#sus4
  C: "[d#5,g#5,b5] ~ [d#5,g#5,b5] ~@3 [d#5,g#5,b5] ~@3 [d#5,g#5,a#5] ~ b4 ~ [d#5,g#5,a#5] ~", // G#m D#sus4
  D: "[e5,g#5,b5] ~ [e5,g#5,b5] ~@3 [e5,g#5,b5] ~@3 [e5,g#5,a#5] ~ b4 ~ [e5,g#5,a#5] ~", // E A#m7b5
  E: "~@2 [e5,g#5,b5] ~@3 [e5,g#5,b5] ~@3 [e5,g#5,a#5] ~ b4 ~ [e5,g#5,a#5] ~", // E A#m7b5
  F: "[c#5,f#5,g#5,a#5] ~ [c#5,f#5,g#5,a#5] ~@3 [c#5,f#5,g#5,a#5] ~@3 [c#5,f#5,g#5,a#5] ~@3 [c#5,f#5,g#5,a#5] ~", // F#
  G: "[c#5,f#5,g#5,a#5] ~@15", H: "~ [b4,e5,g#5]!7 ~@2 [b4,e5,g#5]!2 ~@4",
  I: "~ [g#4,c#5,e5]!7 ~@2 [g#4,c#5,e5]!2 ~@2 [g#4,c#5,e5]!2", J: "~ [a#4,c#5,f#5]!7 ~@2 [a#4,c#5,f#5]!2 ~@4",
  K: "~ [a#4,d#5,f#5]!7 ~@2 [a#4,d#5,f#5]!2 ~@2 [a#4,d#5,f#5]!2", L: "~ [a#4,d#5,g5]!7 ~@2 [a#4,d#5,g5]!2 ~@4",
  M: "~ [a#4,d#5,f#5]!7 ~@2 [a#4,d#5,f#5]!2 ~@4", // D#m
  N: "~@2 [b4,d#5,g#5,b5] b4!3 [b4,d#5,g#5,b5] b4 ~@2 [a#4,d#5,g#5,a#5] a#4 ~@2 [a#4,d#5,g#5,a#5] a#4", // G#m D#sus4
  O: "~@2 [a#4,c#5,f#5,a#5] a#4!3 [a#4,c#5,f#5,a#5] a#4 ~@2 [g#4,c#5,f#5,g#5] g#4 ~@2 [g#4,c#5,f#5,g#5] g#4", // F# C#sus4
  P: "[c#5,f#5,a#5] ~@15", // F#
  Q: "[d#5,g#5,b5] ~ [b4,d#5,g#5,b5] b4!3 [b4,d#5,g#5,b5] b4 ~@2 [a#4,d#5,g#5,a#5] a#4 ~@2 [a#4,d#5,g#5,a#5] a#4", // G#m D#sus4
  R: "~@2 [b4,d#5,g#5,b5] b4!3 [b4,d#5,g#5,b5] b4 a#4 ~ [a#4,d#5,g#5,a#5] a#4 b4 ~ [a#4,d#5,g#5,a#5] a#4", // G#m D#sus4
  S: "[e5,g#5,b5] ~ [b4,e5,g#5,b5] b4!3 [b4,e5,g#5,b5] b4 ~@2 [a#4,e5,g#5,a#5] a#4 ~@2 [a#4,e5,g#5,a#5] a#4", // E A#m7b5
  T: "~@2 [b4,e5,g#5,b5] b4!3 [b4,e5,g#5,b5] b4 a#4 ~ [a#4,e5,g#5,a#5] a#4 b4 ~ [a#4,e5,g#5,a#5] a#4", // E A#m7b5
  U: "[c#5,f#5,g#5,a#5] ~ [a#4,c#5,f#5,g#5,a#5] a#4!3 [a#4,c#5,f#5,g#5,a#5] a#4 ~@2 [g#4,c#5,f#5,g#5,a#5] g#4 ~@2 [g#4,c#5,f#5,g#5,a#5] g#4", // F#
  V: "~ [g#4,c#5,e5]!7 ~@2 [g#4,c#5,e5]!2 ~@4", // C#m
  W: "~@2 [a#4,c#5,f#5,a#5] a#4!3 [a#4,c#5,f#5,a#5] a#4 g#4 ~ [g#4,c#5,f#5,g#5] g#4 a#4 ~ [g#4,c#5,f#5,g#5] g#4", // F# C#sus4
  X: "~ [a#4,d#5,g5]!7 ~@8", // D#
})).s("gm_clavinet").gain(0.5).pan(0.2)

// bass · synth bass 1 · "SYNTH BASS"
const bass = note(`<
  A@4 B@2 A@6 B@2 A@6 B@2 A@4 C@2 B D E F G H E F G I E F G H E F G I A@4 B D A@4 B@2 A@6 B@2 A@4 C@2 B D E F G H E F G
  I E F G H E F G I A@4 B D A@4 B@2 A@4 C@2 B D E F G H E F G I E F G H E F G I E F G H E F G J
>`.pickRestart({
  A: "g#1@2 b2 ~ g#1@2 b2 ~ g#1@2 a#2@2 b2@2 a#2@2", B: "f#1@2 a#2 ~ f#1@2 a#2 ~ f#1@2 g#2@2 a#2@2 g#2@2",
  C: "e1@2 b2 ~ e1@2 b2 ~ e1@2 a#2@2 [e1,b2]@2 a#2@2", D: "f#1 ~@7", E: "e1@2 e2 ~ e1@2 e2 ~ e1@2 f#1@2 g#1@2 f#1@2",
  F: "c#1@2 c#2 ~ c#1@2 c#2 ~ c#1@2 d#1@2 e1@2 d#1@2", G: "f#1@2 f#2 ~ f#1@2 f#2 ~ f#1@2 g#1@2 a#1@2 g#1@2",
  H: "d#1@2 d#2 ~ d#1@2 d#2 ~ d#1@2 f1@2 f#1@2 d#1@2", I: "d#1@2 d#2 ~ d#1@2 d#2 ~ d#1@2 f1@2 g1@2 d#1@2",
  J: "d#1@2 d#2 ~ d#1@2 d#2 ~ d#1@2 ~@6",
})).s("gm_synth_bass_1").gain(0.72)

// drums · kick
const kick = s("bd").struct("<A@29 B A@21 B A@21 B A@21 B A@13 B A@24>".pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x",
})).gain(0.8)

// drums · snare
const snare = s("sd").struct(`<
  A@7 B A@21 ~ A@7 C A@7 B A@5 ~ A@21 ~ A@7 C A@7 B A@5 ~ A@13 ~ A@7 C A@7 C A@7 D
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~ x!2", C: "~@4 x ~@5 x!6", D: "~ x ~@2",
})).gain(0.8)

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

// drums · high tom
const high_tom = s("ht").struct("<~@23 [~@10 x!2 ~@4] ~@43 [~@10 x!2 ~@4] ~@35 [~@10 x!2 ~@4] ~@30>").gain(0.72)

stack(piano, brass_section, synth_strings_2, clavinet, bass, kick, snare, hihat, high_tom)