Strudelify

The Grand Tour

Aaron Neville

KeyC♯ minorTempo100 bpm
0:00/0:00
// The Grand Tour — Aaron Neville
// 100 bpm, 12/8, key C# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 71 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/6)

// 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 J K@2 L@2 M N O B C D E F G H P Q R S T U V W X Y Z AA AB AC AD AE AF AG AF AH AI AJ AK AL X Y AF
  AM AN AB AO AP AQ AR AS AT AU AV AW AX X Y AY AZ@3
>`.pickRestart({
  A: "~@3 c5 c#5 a#4 c5@3 ~@3", B: "~@3 c4 c#4 a#3 c4@6",
  C: "[d#4,f#4,g#4]@3 [d#4,f#4,g#4]@2 c5 d#5@2 c5 [d#4,f#4,g#4]@3", D: "[d#4,f#4]!2 [c#4,f4,g#4] [c4,d#4]",
  E: "[c#4,f4]!2 [c#4,f4,g#4] [c#4,f4]", F: "[c#4,f4] [c#4,f4,g#4] c4 [c#4,f4]", G: "~@3 g#4@2 a#4 [g#4,c5]@5 a#4",
  H: "[g#4,c5] [g4,c5] [g#4,c5]!2", I: "[g#3,c4]!4", J: "[g#3,f4] [g#3,d#4]!2 [c4,d#4]", K: "[c4,d#4]!4",
  L: "[d4,f4]!4", M: "[a#3,g4] [g3,a#3,d#4]@2 [g#3,c4,f4]", N: "[a#3,c#4]!2 [g#3,f4] [a#3,f4], g4 ~",
  O: "[a#3,d#4]@3 c5 c#5 a#4 c5@5 ~", P: "[c#4,g4]!4", Q: "[c#4,g4]!3 [d#4,g4]", R: "[d#4,g#4]!2 [f4,g#4] [g4,a#4]",
  S: "[f4,d#5] [f4,a#4]!2 [f4,g#4]", T: "[d#4,g#4] [d#4,a#4] [d#4,g#4]!2", U: "[d#4,g4] [c#4,g4]!2 [c#4,f4]",
  V: "[c4,d#4] [g#3,c4] [c4,d#4] [d#4,g#4]", W: "[c#4,a4] [b3,g#4] [c#4,a4] [b3,e4]", X: "~@3 c#5 d5 b4 c#5@6",
  Y: "~@3 c#4 d4 b3 c#4@6", Z: "[c#4,e4]!2 [e4,g#4]!2", AA: "[e4,g4]!2 [d4,a4] [e4,c#5]", AB: "[d4,f#4]!4",
  AC: "[d4,f#4]!2 [c#4,f#4] [d4,f#4]", AD: "[c#4,f#4]@3 [c#4,e4]@3 [a4,e5]@2 [b4,e5] [c#5,e5]@2 [d5,e5]",
  AE: "[c#5,e5]@2 [b4,e5] [a4,e5]@2 [f#4,d5] [e4,c#5]@3 [d4,b4]@3", AF: "[c#4,e4]!4",
  AG: "[a3,f#4]@4 e5 b4 [a4,c#5]@3 [a3,f#4]@3", AH: "[c#4,e4]!3 [e4,a4]", AI: "[d#4,f#4]!4", AJ: "[d4,g#4] [a3,c#4]!3",
  AK: "[g#3,b3]@6 [f#4,g#4,b4]@4 [f#4,b4]@2 [e4,b4]@4 [g#4,b4] f#4 e4@4 c#4@2", AL: "b3 [g#3,e4] [a3,e4] [b3,f#4]",
  AM: "[e4,g4]!2 [d4,f#4] [e4,g4]", AN: "[f#4,b4] [d4,a4]!2 [d4,f#4]",
  AO: "[c#4,e4]@3 [c#5,e5]@2 f#5 [c#5,e5]@3 [e4,c#5,e5]@2 f#5", AP: "[c#5,e5] [e4,c#5] [e4,b4] [e4,a4]",
  AQ: "[d4,g#4]!4", AR: "[d4,g#4]!2 [c#4,a4] [f#4,b4]", AS: "[e4,a4]!2 [f#4,a4] [g4,c#5]",
  AT: "[f#4,e5] [f#4,c5] [e4,a4]!2", AU: "[e4,a4]!4", AV: "[e4,g#4] [d4,a4]!2 [d4,b4]",
  AW: "[e4,g#4]@3 [e4,c#5]@6 [c#4,a4]@2 b4", AX: "[b3,g#4]!2 [b3,a4] [f#4,b4]",
  AY: "~@2 e5@4 ~ e5 f#5 ~ e5 c#5 b4 c#5@11", AZ: "[~@5 [e4,a4,b4,c#5,e5]@44 ~@23]/3",
})).s("gm_piano").gain(0.31)

// bass · acoustic bass
const bass = note(`<
  ~ A B C D E F G H C@3 I J K L M N O C D E F G H L M P Q R@2 S T U V W X Y Z AA AB W@3 AC AD AE AF T U V W X AG Z AA AH
  AF AI AJ AK AL@2 W AM@2 AN ~ AO@3
>`.pickRestart({
  A: "~@3 d#4 f4 c#4 d#4@3 ~@3", B: "~@3 d#3 f3 c#3 d#3@3 g#2@3", C: "g#2@5 g#2 d#2@5 d#2", D: "g#2@5 g#1 a#1@3 c2@3",
  E: "c#2@5 c#2 g#1@6", F: "c#2@5 c#2 c#2@6", G: "g#1@5 g#1 d#2@5 d#2", H: "g#2 d#2 f2 g2", I: "g#2@5 f2 d#2@3 c2@3",
  J: "a#1@5 a#1 f2@6", K: "a#1@5 a#1 a#1@6", L: "d#2@5 d#2 a#1@6", M: "d#2@2 f2 g2",
  N: "~@3 d#4 f4 c#4 d#4@3 ~@3, g2 ~", O: "~@3 d#3 f3 c#3 d#3@6", P: "g#2@2 a#1 c2", Q: "c#2@6 c#2@2 c2 c#2@2 d2",
  R: "d#2!2", S: "g#1!2", T: "e2!2 f#2 g#2", U: "~@3 e4 f#4 d4 e4@6", V: "~@3 e3 f#3 d3 e3@3 c#3@3",
  W: "a2@5 a2 e2@5 e2", X: "a2@5 a1 b1@3 c#2@3", Y: "d2@3 d2@2 d2 a1@4 ~@2", Z: "d2@5 d2 d2@6", AA: "a1@5 a1 e2@5 e2",
  AB: "a2 e2!2 g#2", AC: "a2@5 f#2 e2@3 c#2@3", AD: "b1@5 b1 f#2@6", AE: "b1@5 b1 b1@6", AF: "e2@5 e2 b1@6",
  AG: "d2@5 d2 a1@6", AH: "a2!2 g#2 f#2", AI: "e2@2 f#2 g#2", AJ: "a2@2 b1 c#2", AK: "d2@6 d2@2 c#2 d2@2 d#2",
  AL: "e2!2", AM: "[e2@3 e2@3 f#2@3 g#2@6 e4 f#4 d4 e4@6]/2", AN: "~@3 e3 f#3 d3 e3@6", AO: "[~@5 [a2,a3]@44 ~@23]/3",
})).s("gm_acoustic_bass").gain(0.31)

// other · piano
const piano_2 = note(`<
  ~@4 A B ~ C D ~ E ~ F ~@7 A B ~ C D G H I J K ~@6 L M N O ~ P Q P R M S T ~@3 P U V W X ~ W Y Z W@3 AA ~@7
>`.pickRestart({
  A: "~@8 a#4@2 g4@2 g#4 c5@3 a#4@2 g#4@2 f4@4, ~@13 a#4 ~@10", B: "~@10 f4 g#4@5 f4@2 ~@6, ~@11 g4 ~@12",
  C: "~@23 g#4", D: "d#5@2 a#4 d#5@2 a#4 d#5@2 a#4@2 ~@2, a#4 ~@23", E: "~@5 d#4 g#4@2 f4 a#4@2 g4",
  F: "~@10 g#4@2 c5@3 ~ [d#4,g#4]@3 ~@5", G: "g4 a#4@3 a#4@2 ~@4 a#4@2 ~@4 a#4@2 ~@4 a#4@2, ~ g#4 ~@22",
  H: "~@5 g4 ~@2 g4 ~@2 g#4", I: "~@2 g#4 ~ c5 a#4 ~@2 a#4 ~@2 c5", J: "~@2 b4 ~@8 a#4",
  K: "~@2 a#4 ~@2 g#4 ~@2 g#4 ~@2 g4", L: "~@8 b4 ~@2 a4", M: "~@2 a4 ~@2 a4 ~@2 a4 c#5 b4 a4",
  N: "~@4 a4@2 ~@4 a4@2 ~@4 [f#4,a4]@3 ~@5", O: "~@5 a4 ~@6", P: "~@2 f#4 ~@2 f#4 ~@2 f#4 ~@2 f#4",
  Q: "~@2 a4 [a3,f#4]@2 ~@3 a4 ~@2 a4", R: "~@2 f#4 ~@2 f#4 ~@2 f#4 ~@2 a4", S: "~@2 a4 ~@2 f#4 ~@2 f#4 ~@2 f#4",
  T: "~@2 g#4 ~@9", U: "~@2 a4 ~@2 a4 ~@2 g#4 ~@2 a4", V: "~@4 b4@2 a4 c#5@3 b4@2 ~@4 a4@2 ~@4 a4@2, ~@7 b4 ~@16",
  W: "~@2 a4 ~@2 a4 ~@2 a4 ~@2 a4", X: "~@2 b4 ~@9", Y: "~@2 a4 ~@2 a4 ~@2 b4 ~@2 b4",
  Z: "~@2 b4 ~@2 b4 ~@2 b4 ~@2 c#5", AA: "~@2 a4 ~@2 a4 [e4,g#4]@2 a4 ~@3",
})).s("gm_piano").gain(0.31)

// drums · kick
const kick = s("bd").struct("<~@3 A@14 B ~ A@14 B ~ A@14 B ~ A@14 B ~@5>".pickRestart({
  A: "x ~@4 x!2 ~@5", B: "x",
})).gain(0.48)

// drums · rim
const rim = s("rim").struct("<~@2 A B@14 ~ A B@14 ~ A B@14 ~ A B@14 ~@6>".pickRestart({
  A: "~@3 x", B: "~ x ~ x",
})).gain(0.48)

// drums · hihat
const hihat = s("hh").struct("<~@3 A@14 ~@2 A@14 ~@2 A@14 ~@2 A@14 ~@6>".pickRestart({
  A: "~@2 x ~@5 x ~@2 x",
})).gain(0.64)

stack(piano, bass, piano_2, kick, rim, hihat)

More by Aaron Neville