Strudelify

Surfing With the Alien

Joe Satriani

KeyC majorTempo167 bpm
0:00/0:00
// Surfing With the Alien — Joe Satriani
// 167 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 2 "Rythm Gui" overdriven guitar (copy of ch 1 "Rythm Gui" overdriven guitar)
// note: Full arrangement: all 177 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(167/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · overdriven guitar · "Rythm Gui"
const overdriven_guitar = note(`<
  A B C D E B C F G B H I J B K L M B H I J B K L N O P Q R S T U V@2 W X Y B Z AA AB AC AD AC AE AC AF AG AH AI AJ AI
  AK AL AJ AI AM AN AO AN AP AQ AO AN AR AS@2 AT AU B H I J B K L M B H I J B K L N O P Q R S T U V@2 W X Y B Z AA AV
  ~@2 AW B H I AX B K L M B H I AX B K L M B C D AY B C F G B C D AY B C F G B C D AY B C F G B C D AY B C F G B C D AY
  B C F G B C D AY B C F G B C D AY B C F G ~
>`.pickRestart({
  A: "~@7 [g2,d3,g3]", B: "~ [g2,d3,g3] [g2,d3]!6",
  C: "a#2@2 c3@2 [f3,a#3,f4]@2 [c3,g3,c4,e4]@3 ~ [c3,g3]@2 [c3,a3]@2 [c3,f3]@2", // A#5 C C5 F F5
  D: "[c3,a#3]!2 [c3,a3] [c3,f3] [c3,g3]!2 [c3,a3] [c3,g3]", // C7 F F5 C5 F C5
  E: "[e3,a3] [f3,a#3] [e3,a3] ~ [d3,g3]@2 [d3,g3]@3 ~ [d3,g3]@2 e2@2 [g2,d3,g3]@2", // A5 A#5 A5 G5
  F: "[c3,a#3] c3 [c3,a3] [c3,f3] [c3,g3] [d3,g3] [f3,a#3] [d3,g3]", // C7 F F5 C5 G5 A#5 G5
  G: "[g3,c4]@2 [d3,g3]@2 [f3,a#3]@2 [d3,g3]@5 ~ e2@2 [g2,d3,g3]@2", // C5 G5 A#5 G5
  H: "a#2@2 c3@2 [f3,a#3,f4]@2 [c3,g3,c4,e4]@3 ~ [c3,g3]@2 [c3,g3]@2 [c3,g3]@2", // A#5 C C5
  I: "[c3,g3] [c3,g3,c4] [c3,g3]!4 [g3,c4] [a2,d3]", // C5 D5
  J: "[e3,a3] [f3,a#3] [e3,a3] ~ [d3,g3]@2 [g2,d3,g3]@3 ~ [g2,d3,g3]@2 e2@2 [g2,d3,g3]@2", // A5 A#5 A5 G5
  K: "a#2@2 c3@2 [f3,a#3,f4]@2 [c3,g3,c4,e4]@3 ~ [c3,g3]@2 [c3,a3]@2 c3@2", // A#5 C C5 F
  L: "[c3,g3]!2 [c3,a#3] [c3,g3] [c3,g3,c4,e4] [d3,g3] [f3,a#3] [d3,g3]", // C5 C7 C5 C G5 A#5 G5
  M: "[g3,c4]@2 [d3,g3]@2 [f3,a#3]@2 [d3,g3]@3 ~ [g2,d3,g3]@2 e2@2 [g2,d3,g3]@2", // C5 G5 A#5 G5
  N: "[g3,c4]@2 [d3,g3]@2 [f3,a#3]@2 [d3,g3]@3 ~ [g2,d3,g3]@2 e2@2 [e2,b2,e3]@2", O: "~ [e2,b2,e3] [e2,b2]!6",
  P: "[e2,b2]!6 [e2,a2] [c3,g3,c4]", Q: "~ [c3,g3,c4] [c3,g3]!6",
  R: "[c3,g3] [c3,g3,c4,e4] [c3,g3]!2 [c3,g3,c4] a2!2 [g2,d3,g3]", S: "~ [g2,d3,g3] [g2,d3]!3 [g2,d3,g3] [g2,d3]!2",
  T: "[g2,d3,g3]!2 [g2,d3]!2 [g2,d3,g3] [c3,g3,c4] c3 [d3,a3,d4]", U: "~ [d3,a3,d4] [d3,a3]!3 [d3,a3,d4,f#4] [d3,a3]!2",
  V: "[[c3,g3,c4,e4]@2 [d3,a3,d4,f#4]@2 [d3,a3,d4]@2 e2@2 a2 a#2 a2 ~ g2@2 [e2,b2,e3]@8 ~@2 [e2,b2]@2 [e2,b2]@2 [e2,b2]@3 ~]/2", // C D D5 E5
  W: "[e2,b2]!4 e2 g2 a2 [c3,g3,c4]", X: "~ [c3,g3,c4] [c3,a3] [c3,g3]!2 [c3,g3,c4] [c3,a3] [c3,g3]",
  Y: "[c3,g3]@2 [c3,g3,c4,e4]@2 [c3,a3]@2 [c3,g3]@2 [c3,g3,c4,e4]@3 ~ e2@2 [g2,d3,g3]@2", // C5 C F C5 C G5
  Z: "[g2,d3] [g2,d3,g3] [g2,d3]!2 [g2,d3,g3] [g2,d3] a2 [d3,a3,d4]", AA: "~ [d3,a3]!4 [d3,a3,d4]!3",
  AB: "[d3,a3,d4]@3 ~@11 [c#3,g#3,c#4]@2", AC: "~ [c#3,g#3,c#4] [c#3,g#3]!6",
  AD: "[c#3,g#3]!4 [b2,d#3,f#3] [c#3,f3,g#3] [d3,f#3,a3] [c#3,g#3,c#4]", // C#5 B C# D C#5
  AE: "[c#3,g#3]!4 [b2,d#3,f#3] [c#3,f3,g#3] [d3,f#3,a3] [d3,a3,d4]", // C#5 B C# D D5
  AF: "[c#3,g#3]@2 [c#3,g#3]@2 [c#3,g#3]@2 [c#3,g#3]@2 [b2,d#3,f#3]@2 [c#3,f3,g#3]@2 [d3,f#3,a3]@2 [c#3,g#3,c#4]!2", // C#5 B C# D C#5
  AG: "[c#3,g#3,c#4] [c#3,g#3]!7", AH: "[c#3,g#3]!4 [c#3,f3,g#3] [d3,f#3,a3] [e3,g#3,b3] [d#3,a#3,d#4]",
  AI: "~ [d#3,a#3,d#4] [d#3,a#3]!6", AJ: "[d#3,a#3]!4 [c#3,f3,g#3] [d#3,g3,a#3]!2 [e2,b2,e3]",
  AK: "[d#3,a#3]!4 [c#3,f3,g#3] [d#3,g3,a#3] [e3,g#3,b3] [d#3,g3,a#3]", AL: "~ [d#3,a#3]!7",
  AM: "[d#3,a#3]!4 [d#3,g3,a#3] [f3,a3,c4] [f#2,c#3,f#3] [f2,c3,f3]", AN: "~ [f3,c4,f4] [f3,c4]!6",
  AO: "[f3,c4]!4 [d#3,g3,a#3] [f3,a3,c4]!2 [f#2,c#3,f#3]", // F5 D# F F#5
  AP: "[f3,c4]!4 [d#3,g3,a#3] [f3,a3,c4] [f#3,a#3,c#4] [f3,a3,c4]", AQ: "~ [f3,c4]!7", AR: "[f3,c4]!8",
  AS: "[[g3,d4]@3 ~]/2", AT: "[f2,g3,b3,d4]@3 ~", AU: "[e2,g3,b3,d4]@5 ~ [c3,g3,b3,d4]@6 ~@2 [g3,d4]@2",
  AV: "[d3,a3,d4]@3 ~@13", AW: "~@7 [g3,d4,g4]",
  AX: "[e3,a3] [f3,a#3] ~ [e3,a3] [d3,g3]@2 [g2,d3,g3]@3 ~ [g2,d3,g3]@2 e2@2 [g2,d3,g3]@2", // A5 A#5 A5 G5
  AY: "[e3,a3] [f3,a#3] ~ [e3,a3] [d3,g3]@2 [d3,g3]@3 ~ [d3,g3]@2 e2@2 [g2,d3,g3]@2", // A5 A#5 A5 G5
})).s("gm_overdriven_guitar").gain(0.12).pan(0)

// bass · slap bass 2 · "Bass"
const bass = note(`<
  A@2 B C D@2 B E F@2 B G H@2 B E I@2 B G H@2 B E J@2 K@2 L@2 M@2 N@2 O@2 P@2 Q@2 R@2 S@2 T@2 U V W@2 X@2 Y@2 X@2 Z@2
  AA@2 AB@2 AA@2 AC AD@2 AE AF AG B G AH@2 B E I@2 B G AH@2 B E J@2 K@2 L@2 M@2 N@2 O@2 P@2 Q@2 AI ~@3 AG B G AH@2 B E
  I@2 B G AH@2 B E I@2 B C AJ@2 B E F@2 B C AJ@2 B E F@2 B C AJ@2 B E F@2 B C AJ@2 B E F@2 B C AJ@2 B E F@2 B C AJ@2 B E
  F@2 B C AJ@2 B E AK@2
>`.pickRestart({
  A: "[~@7 g1@2 g1!7]/2", B: "a#1 c2 ~ c2@2 c2!3", C: "c2!8",
  D: "[e2 ~ e2 ~ d2@2 d2@4 d2@2 e1@2 g1@4 g1@2 g1@2 g1@2 g1@2 g1@2 g1@2 g1@2]/2", E: "c2!5 d2 ~ d2",
  F: "[~@2 d2@2 ~@2 d2@5 ~ e1@2 g1@4 g1@2 g1@2 g1@2 g1@2 g1@2 g1@2 g1@2]/2", G: "c2!6 ~ a1",
  H: "[e2 ~ e2 ~ d2@2 g1@4 g1@2 e1@2 g1@4 g1@2 g1@2 g1@2 g1@2 g1@2 g1@2 g1@2]/2", I: "[~ d2 ~ d2@2 g1 e1 g1@2 g1!7]/2",
  J: "[~ d2 ~ d2@2 g1 e1 e1@2 e1!7]/2", K: "[e1!7 c2@2 c2!7]/2", L: "[c2!5 a1!2 g1@2 g1!7]/2",
  M: "[g1!5 c2!2 d2@2 d2!7]/2", N: "[c2@2 d2@2 d2@2 e1@2 a1 a#1 a1 ~ g1@2 e1@8 ~@2 e1@2 e1@2 e1@4]/2",
  O: "[e1!5 g1 a1 c2@2 c2!7]/2", P: "[c2!4 c2@2 e1 g1@2 g1!7]/2", Q: "[g1!6 a1 d2@2 d2!7]/2",
  R: "[d2@2 ~@5 c#2@2 c#2!7]/2", S: "[c#2!4 b1 c#2 d2 c#2@2 c#2!7]/2", T: "[c#2!4 b1 c#2 d2 d2@2 c#2!7]/2",
  U: "c#2@2 c#2@2 c#2@2 c#2@2 b1@2 c#2@2 d2@2 c#2!2", V: "c#2!8", W: "[c#2!5 d2 ~ d#2@2 d#2!7]/2",
  X: "[d#2!4 c#2 d#2!2 e1@2 d#2!7]/2", Y: "[d#2!4 c#2 d#2 ~ d#2@2 d#2!7]/2", Z: "[d#2!5 ~ f#1 f1@2 f1!7]/2",
  AA: "[f1!4 d#1 f1!2 f#0@2 f1!7]/2", AB: "[f1!4 d#1 f1 f#1 f1@2 f1!7]/2", AC: "f1!8", AD: "[g1@13 ~@3]/2",
  AE: "f1@13 ~@3", AF: "e1@5 ~ c2@7 ~@3", AG: "~ g1!7", AH: "[~@2 d2 g1@2 g1 e1 g1@2 g1!7]/2", AI: "d2 ~@3",
  AJ: "[~@2 d2 d2@2 d2 e1 g1@2 g1!7]/2", AK: "[~@2 d2@2 ~@2 d2@5 ~ e1@2 g1@4 ~@14]/2",
})).s("gm_slap_bass_2").gain(0.5)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A@2 B A@2 C B A@2 B A@3 D B A@2 B A@3 D A B A@2 B A@2 C B A@2 B A@3 ~ B A B A B A B A@3 B A B A B D A@2 B A B A
  B A E ~ A B D A B A@2 B A D B A@2 B A@2 B D A B A@2 B A@2 D A@2 B A@2 B A E ~@3 B A@2 B A@2 B A@2 B A@2 B A@2 D A@2 B
  A@2 B A@2 B A@2 B A@2 B D A B A@2 B A@2 B A@2 B A@2 B A D B A@2 B A@2 B A@2 B A@2 B A@2 B A@2 B A@2 B@2 E ~
>`.pickRestart({
  A: "x ~@3 x!2 ~@2", B: "x ~@3 x!2 ~ x", C: "x ~@3 x!3 ~", D: "x!2 ~ x!2 ~@3", E: "x",
})).gain(0.57)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@2 A ~@2 A ~@3 A ~@2 A ~@4 A ~@2 A ~@5 A ~@2 A ~@3 A ~@2 A ~@31 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@5 A ~@2
  A ~@5 A ~@2 A ~@2 A ~@2 A ~@2 A ~@5 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A
  ~@2 A ~@2 A ~@2 A ~@2 A ~@3
>`.pickRestart({
  A: "~@7 x ~@8",
})).gain(0.29)

// drums · low tom
const low_tom = s("lt").struct("<~@174 [~@6 x!2] ~@2>").gain(0.64)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@2 A@2 ~ A@2 ~@2 A@2 ~ A@3 ~@2 A@2 ~ A@4 ~@2 A@2 ~ A@2 ~@2 A@2 ~ A@3 ~@2 B C B C B C B C@3 B C B C B ~ C@2 B C B C B
  C ~@6 A@2 ~ A@2 ~ A@2 ~ A@2 ~ A ~@2 A@2 ~ A@2 ~@2 A ~ A@2 ~ A@2 ~@4 A@2 ~ A@2 ~ A@2 ~ A@2 ~ A@2 ~@2 A ~ A@2 ~ A@2 ~
  A@2 ~ A@2 ~ A ~@2 A@2 ~ A@2 ~ A@2 ~ A@2 ~ A@2 ~ A@2 ~ A@2 ~ A@2 ~ A@2 ~ A@2 ~ A@2 ~ A@2 ~ A ~@3
>`.pickRestart({
  A: "~@3 x ~@4", B: "x!2 ~@2", C: "x",
})).gain(0.29)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@2 A ~@2 A ~@2 B A ~@2 A ~@4 A ~@2 A ~@5 A ~@2 A ~@2 B A ~@2 A ~@34 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@5 A ~@2 A
  ~@5 A ~@2 A ~@2 A ~@2 A ~@2 A ~@5 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2 A ~@2
  A ~@2 A ~@2 A ~@2 A ~@3
>`.pickRestart({
  A: "~@7 x", B: "~@4 x!3 ~",
})).gain(0.5)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@6 B ~@6 A ~@8 C A ~@6 B ~@6 A ~@9 A ~@7 A ~@7 C ~@4 A ~@2 A ~@5 A ~@5 A ~@5 A ~@5 A ~@2 A ~@5 A ~@2 A D A E F E
  A G ~@4 A H ~@4 A I ~ J ~@2 A B ~ A ~@2 A ~ K ~@3 A E ~@13 A ~@2 A ~@2 J ~@2 L ~@2 A ~ A@2 ~
>`.pickRestart({
  A: "x", B: "~@7 x", C: "~@15 x", D: "~ x ~@6", E: "~ x", F: "~@7 x ~@8", G: "~@3 x ~@4", H: "~ x ~@5 x", I: "~ x ~@2",
  J: "x ~@2 x", K: "~@5 x ~@2", L: "x ~@2 x ~@4",
})).gain(0.57)

// drums · ride
const ride = s("rd").struct("<~@41 A B A B A B A B@3 A B A B A ~ B@2 A B A B A B ~@112>".pickRestart({
  A: "x!2 ~ x!5", B: "x!8",
})).gain(0.5)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@41 A ~ A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@113>".pickRestart({
  A: "~ x ~@2",
})).gain(0.29)

// drums · tambourine
const tambourine = s("tb").struct("<~@41 [~ x ~ x]!15 ~ [~ x ~ x]!8 ~@109 [~ x ~ x] x ~>").gain(0.64)

stack(
  overdriven_guitar, bass, kick, snare, snare_soft, low_tom, hihat, hihat_soft, open_hat, crash, ride, ride_soft,
  tambourine
)

More by Joe Satriani