Strudelify
Invisible Touch cover art

1986 · Invisible Touch

Invisible Touch

Genesis

KeyF majorTempo131 bpm
0:00/0:00
// Invisible Touch — Genesis
// 131 bpm, 4/4, key F major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 123 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(131/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 · electric bass finger · "Bass Gtr"
const bass = note(`<
  ~ A B C D A B C D E F G H I J K L M@2 N O N P Q R A B C D A B C D E F G H I J K L M@2 N O N P Q R A B C D A B C D S T
  S T S T S T A B C D A B C D E F G H I J K L M@2 N O N P Q R U V W X U Y Z AA U V W X U Y Z AA U V W X U Y Z AA U V W X
  U Y Z AB@3
>`.pickRestart({
  A: "f1@3 ~ f1@3 ~@9", B: "f1@3 ~ f1@2 ~@5 d2 f2 d2 c2 d2, ~@5 c2 ~@2", C: "f1@3 ~ f1@3 ~@7 f1 ~", D: "d2@8 c2@5 ~@3",
  E: "d2@2 ~ d2@4 ~", F: "bb1@3 bb1@5", G: "a1@5 ~ a1@8 ~@2", H: "f2@3 ~ g2@2 ~@2 a2@2 c3 ~ f3@3 ~",
  I: "d2@4 ~@2 d2@7 ~@3", J: "bb1@4 ~@2 bb1@6 ~@2 bb1 ~", K: "a1@4 ~@2 a1@7 ~@3", L: "c2@4 ~@2 d2@6 e2@3 ~",
  M: "g2 ~ g2 ~ g2 ~ g2 ~", N: "bb1@4 c2@2 d2@5 ~ d2@4", O: "f2@4 g2@2 a2@6 c3@3 ~", P: "f2@4 g2@2 f2@5 ~ f2 f1@3",
  Q: "bb1@3 ~ bb1@2 bb1@2 ~@8", R: "bb1 ~ bb1 ~ c2 ~ c2 ~", S: "eb1@3 ~ eb2@2 ~@2 eb2@2 ~@2 eb2@2 eb1@2",
  T: "eb2@2 ~@2 eb2@2 ~@2 eb2@2 bb1@2 db2@2 db2 eb2", U: "g1@3 ~ g1@2 ~@10", V: "g1@3 ~ g1@2 ~@4 d2 e2 g2 e2 d2 e2",
  W: "g1@3 ~ g1@3 ~@7 g1 ~", X: "e2@4 d2@3 ~", Y: "g1@2 ~@2 g1@2 ~@4 d2 e2 g2 e2 d2 e2", Z: "g1@3 ~ g1@2 ~@8 g1 ~",
  AA: "e2@3 ~ d2@2 ~@2", AB: "[e2@3 ~ d2@3 g1@11 ~@6]/3",
})).s("gm_electric_bass_finger").gain(0.58)

// other · pad poly · "Polysynth"
const pad_poly = note("<~@73 A B C D A E F G H@2 I J I J K@2 ~@34>".pickRestart({
  A: "a4@3 bb4", B: "c5 f4", C: "e4", D: "c4@15 ~", E: "c5 f5", F: "e5", G: "c5", H: "d5/2", I: "bb4", J: "a4",
  K: "[bb4@23 ~ c5@2 ~@2 c5@2 ~@2]/2",
})).s("gm_pad_poly").gain(0.29).pan(0.3)

// chords · marimba · "Marimbat"
const marimba = note("<~@57 A B C D A B E F ~@58>".pickRestart({
  A: "[eb4,eb5,bb5,c7] [eb4,gb6] bb6 eb6 ab6 [eb3,eb5,bb5,db6] [bb3,gb5,db6,bb6] [eb4,eb5,bb5,eb6] c7 [eb4,f6] ab6 [eb3,db6] [eb4,bb6] [eb4,eb5,bb5,eb6] [f5,c6,ab6] [gb5,db6]", // Cm7 Ebm Eb7 Gb Eb5 Ebsus2 Eb7 Eb5 …
  B: "[eb4,c7] [eb4,f6] [f5,c6,bb6] [eb5,bb5,eb6] ab6 [eb3,db6] [bb3,ab4,eb5,bb6] [eb4,eb6] c7 [eb4,f6] ab6 [eb3,db6] [eb4,bb6] [eb4,eb6] ab6 db6", // Cm Ebsus2 Fsus4 Eb5 Eb7 Ebsus4 Eb Ebsus2 …
  C: "[eb4,bb4,eb5,c7] [eb4,f6] bb6 eb6 ab6 [eb3,bb4,eb5,db6] [bb3,db5,gb5,bb6] [eb4,bb4,eb5,eb6] c7 [eb4,f6] ab6 [eb3,db6] [eb4,bb6] [eb4,bb4,eb5,e6] [c5,f5,ab6] [db5,gb5,db6]", // Cm7 Ebsus2 Eb7 Gb Eb5 Ebsus2 Eb7 Eb5 …
  D: "[eb4,c7] [eb4,f6] [c5,f5,bb6] [bb4,eb5,eb6] ab6 [eb3,db6] [bb3,eb4,bb4,bb6] [eb4,eb6] c7 [eb4,f6] ab6 [eb3,db6] [eb4,bb6] [eb4,eb6] ab6 db6", // Cm Ebsus2 Fsus4 Eb5 Eb7 Eb5 Eb Ebsus2 …
  E: "[eb4,bb4,eb5,db6,c7] [eb4,db5,f6] [f5,bb6] [eb5,eb6] ab6 [eb3,bb4,eb5,db6] [bb3,db5,gb5,bb6] [eb4,bb4,eb5,eb6] c7 [eb4,f6] ab6 [eb3,db6] [eb4,bb6] [eb4,bb4,eb5,e6] [c5,f5,ab6] [db5,gb5,db6]", // Eb7 Db Bb5 Eb Eb7 Gb Eb5 Ebsus2 …
  F: "[eb4,c7] [eb4,f6] [c5,f5,bb6] [bb4,eb5,eb6] ab6 [eb3,db6] [bb3,eb4,bb4,bb6] [eb4,eb6] c7 [eb4,f6] ab6 [eb3,db6] [eb4,bb6] eb4 ~@2", // Cm Ebsus2 Fsus4 Eb5 Eb7 Eb5 Eb Ebsus2 …
})).s("gm_marimba").gain(0.24).pan(0.7)

// chords · pad new age · "Fantasia"
const pad_new_age = note(`<
  ~@9 A@3 B C D E F G@2 H B H I J K ~@8 A@3 B C D E F G@2 H B H I J K ~@8 L@8 ~@8 A@3 B C D E F G@2 H B M I J K N O N O
  N O N O N O N O N O N O N O N O N O N O N O N O N O N P@3
>`.pickRestart({
  A: "[[d4,f4]@15 ~ [bb3,d4,f4]@15 ~ [c4,e4]@16, a4@47 ~]/3", B: "[c4,f4,a4]", C: "[d4,f4,a4]",
  D: "[d4,f4,a4], bb3@7 ~", E: "[c4,e4,a4]", F: "[c4,e4,g4]@15 ~", G: "[[b3,d4,g4]@15 ~]/2", H: "[d4,f4,bb4]",
  I: "[c4,f4,a4]@15 ~", J: "[bb3,d4,f4]@15 ~", K: "[bb3,d4,f4]@7 ~ [c4,f4,g4]@3 ~ [c4,e4,g4]@3 ~",
  L: "[[eb3,db4,f4,ab4]@127 ~]/8", M: "[d4,f4,bb4], g4 ~@15", N: "[d4,g4,c5]@12 [d4,g4,b4]@3 ~",
  O: "[c4,e4,g4]@11 ~ [d4,gb4,a4]@3 ~", P: "[[c4,e4,g4]@11 ~ [gb4,a4]@2 [g3,g4]@19 ~@15, ~@4 d4@7 ~@5]/3",
})).s("gm_pad_new_age").gain(0.22).pan(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~ A@2 B A@3 B A B@17 A B A B A B A B@17 A B A B A B A C@8 B A B A B A B A B@17 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 B D ~@2
>`.pickRestart({
  A: "x!2 ~@2", B: "x ~ x ~@4 x", C: "x ~ x ~ x!2 ~ x", D: "x ~ x ~@3 x!2",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct("<~ A@3 B A@3 B C@16 A@8 C@16 A@8 C@8 A@8 C@16 A@31 D ~@2>".pickRestart({
  A: "~ x ~@2", B: "~@4 x ~@7 x!3 ~", C: "~ x ~ x", D: "~@4 x ~@5 x!5 ~",
})).gain(0.5)

// drums · clap
const clap = s("cp").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@9 A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3
>`.pickRestart({
  A: "~ x ~@2",
})).gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<~@2 A ~ A ~ A ~ A ~@114>".pickRestart({
  A: "~@7 x",
})).gain(0.45)

// 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 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 C@8
  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 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 ~@2
>`.pickRestart({
  A: "~@2 x!6", B: "x!8", C: "x!12 ~ x ~ x",
})).gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<A ~ B ~ B ~ B ~ B ~@114>".pickRestart({
  A: "~@12 x!3 ~", B: "~@12 x!2 ~@2",
})).gain(0.35)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@9 A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A B ~@2
>`.pickRestart({
  A: "x", B: "~@13 x ~@2",
})).gain(0.45)

// drums · high tom
const high_tom = s("ht").struct("<[~@8 x!3 ~@5] ~@122>").gain(0.35)

// drums · crash
const crash = s("cr").struct("<~@120 [~@7 x] ~@2>").gain(0.45)

// drums · cowbell
const cowbell = s("cb").struct("<~@57 A B A B A B A B ~@58>".pickRestart({
  A: "~@2 x!4 ~@2 x ~ x!2 ~@4", B: "~@2 x!2 ~ x ~@2 x ~ x!2 ~@4",
})).gain(0.4)

stack(
  bass, pad_poly, marimba, pad_new_age, kick, snare, clap, low_tom, hihat, mid_tom, open_hat, high_tom, crash, cowbell
)

More by Genesis