Strudelify
Tonight, Tonight, Tonight cover art

1987 · Invisible Touch

Tonight, Tonight, Tonight

Genesis

KeyD majorTempo98 bpm
0:00/0:00
// Tonight, Tonight, Tonight — Genesis
// 98 bpm, 4/4, key D major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 172 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(98/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 · oboe
const bass = note(`<
  ~@4 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 C@2 D@2 E@8 A@2 B@2 A@2 B@2 A@2 B@2 A@2 C@2 D@2 E@8 F G F H I@2 F G F H D@2
  E@6 J@2 ~@17 K L M N@2 O ~@10 P Q E@2 P Q E@2 R S R T@8 U@4 E@36
>`.pickRestart({
  A: "[a#0,a#1]/2", B: "[[a0,a1]@3 [d1,d2]]/2", C: "[c1,c2]/2", D: "[d1,d2]/2", E: "g1/2", F: "g1@3 a#1", G: "c2@3 d2",
  H: "c2", I: "[f1,f2]/2", J: "[g1@15 ~]/2", K: "~@4 e4 d4 c4@2", L: "a3", M: "~@6 a4 g4",
  N: "[f4@2 g4@10 ~@2 a4 c5]/2", O: "d5@2 a4 c5 d5@4", P: "a#1 a1", Q: "f1 d1", R: "a#1 a1 f1 d1", S: "g1", T: "c1",
  U: "d1/2",
})).s("gm_electric_bass_finger").gain(0.48)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  ~@4 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 C@2 D@2 E@2 F@2 E@2 F@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 C@2 D@2 G@2 H@2 G@2 H@2 I
  J I K@3 I J I L@3 G@2 H@2 G@2 M@2 N O P Q R@2 S@4 ~ T@8 U V W@7 V X@4 Y@8 Z AA Z AB AC AD AE AB AC AD AE AF@4 AG@2
  AH@2 AG@2 AH@2 AI@2 AJ@2 AI@2 AJ@2 AI@2 AJ@2 AI@2 AJ@2 AI@2 AJ@2 AI@2 AJ@2 AI@2 AK@2
>`.pickRestart({
  A: "a#2/2", B: "a2/2", C: "c3/2", D: "d3/2", E: "[a3,c4]/2", F: "[g3,b3]/2", G: "[a3,c4,a5]/2", H: "[g3,b3,g5]/2",
  I: "[a#3,d4,d5]", J: "[a3,c4,c5]", K: "[c4 f4@2, [a3,c5]]/3", L: "[c4 [f#4,d5]@2, a3, c5@2 ~]/3",
  M: "[[g3,b3,g5]@31 ~]/2", N: "d3", O: "a#2", P: "c3", Q: "a2", R: "g2/2", S: "d2/4",
  T: "[~@3 c5 a#4 b4 e4 [d4,f4], ~ d2@15, ~ d4@11 c5@4, ~ f4@9 g4@4 ~@2]/8", U: "a#4", V: "[e4,g4,c5]",
  W: "[a4 c5 a#4 b4 e4 ~ a#4, d4@4 c5@2 ~, f4@3 g4@2 [d4,f4]@2]/7", X: "[d4,c5,d5]/4",
  Y: "[[d4,f4,a#4,d5,f5,a#5] [e4,e5] [f4,f5]@2 e4@2 [b3,d4,b4]@2, ~ [c4,c5]@5 ~@2, ~ [a4,a5]@3 [g4,d5,g5]@4]/4", // A# E F Bm C A G5
  Z: "[d4,f4,a#4,d5,f5,a#5] [e4,e5] [f4,f5]@2, ~ [c4,a4,c5,a5]@3", AA: "[c4,c5] [b3,b4], [d4,g4,d5,g5]",
  AB: "[a#3,d4,f4,a#4,d5,f5]", AC: "[a3,c4,e4,a4,c5,e5]", AD: "[f4,f5]@3 [g4,g5], [a#3,d4,a#4,d5]",
  AE: "[c4,e4,a4,c5,e5,a5]", AF: "[d2,d4,a4,c5,a5]/4", AG: "[a3,c4,f4,a4,a5]/2", AH: "[g3,b3,e4,g4,g5]/2",
  AI: "[c4,f4,a4,a5,c6]/2", AJ: "[b3,e4,g4,g5,b5]/2", AK: "[[e4,g4,g5,b5], b3@21 ~@11]/2",
})).s("gm_synth_strings_1").gain(0.32).pan(0.3)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  ~@12 A B C D E F G H I J@2 K L M N O P Q R O P ~@5 A B S D T U V W X Y Z AA L M N O P Q R O P ~ AB AC@2 AD@2 ~ AE@2
  AF@3 ~ AG O P Q R O P ~@34 AH AI AJ@2 AK AL AM@2 AN@2 AO AP AQ AR AS AT AU AV AW AX ~@3 N O P Q R O P ~ AG O AY@2 AG O
  AY@2 AG O AY@2 AG O AY@2 AG O AY@2 AG O AY@2 AG O AY@2
>`.pickRestart({
  A: "~@5 c4 d4 c4 d4@2 d4 c4 d4@2 d4 c4", B: "e4@2 d4@3 a3 ~@2", C: "~@14 d4 c4", D: "e4@4 d4@3 ~@9",
  E: "~@6 d4 c4 d4@2 d4 c4 d4@2 d4 c4", F: "e4@2 d4@2 a3 ~@3", G: "~@10 d4@4 d4 c4", H: "e4@4 d4 a3 ~@2",
  I: "~@6 d4 c4 d4@2 d4@2 d4@2 ~@2", J: "[d4 d4@2 ~ d4@3 ~@4 d4!2 d4@2 e4@4 ~@12 g3]/2", K: "e4!3 e4@2 e4@2 d4@5 ~@4",
  L: "f#4", M: "e4@3 ~", N: "~@2 d4!2 a4 ~ d4 f4", O: "~ d4 a4@2 ~@2 a4@2", P: "g4", Q: "~@9 d4!3 f4@2 g4@2",
  R: "a4 ~@2 d4 a4 ~ d4 f4", S: "~@14 d4!2", T: "~@6 d4 c4 d4 c4 d4@2 d4@2 ~ c4",
  U: "d4!2 d4@2 d4@2 d4 c4 e4@4 d4@2 a3@2", V: "~@11 c4 d4 c4 d4 c4", W: "e4@4 c4 a3 ~@2",
  X: "~@5 c4 d4 c4 d4@2 d4@2 c4@2 d4@2", Y: "~@2 d4 c4 d4@2 d4@2 d4@4 d4@2 c4@2", Z: "e4@3 ~@3 g3 e4",
  AA: "e4!3 e4@2 e4@2 e4@5 ~@4", AB: "~ d4!2 f4!2 d4 a4!2",
  AC: "[g4@2 a4@2 ~@5 f4 g4 ~ g4 f4 g4 a4@3 ~@3 c4 d4 f4 f4@2 d4@2 a4@2 a4@2]/2",
  AD: "[g4@2 a4 ~@6 d4 g4 f4 g4 f4 g4 g4@3 f4@2 c4@2 d4@2 ~@8]/2",
  AE: "[~@2 d4@2 e4@4 f4@2 d4@2 a4@2 g4@6 ~@7 g4 f4@2 g4@2]/2",
  AF: "[a4@3 d4@3 d4 ~ f4@2 d4@2 a4@2 g4@6 ~@4 g4 f#4 g4@2 g4@2 g4 a4@13 ~@4]/3", AG: "~@3 d4 a4 ~ d4 f4",
  AH: "~@3 d4 a4 ~ a4 ~ a4 g4@2 f4@3 a4!2", AI: "a4 g4 e4@4 ~@5 e4 e4@2 f4 c4",
  AJ: "[c4@4 e4@4 g4@4 a4@3 g4@3 d4@2 ~@12]/2", AK: "~@3 d4 a4 ~ a4 ~ a4 g4@2 f4@2 a4 g4 f4",
  AL: "a4@4 g4@4 ~@4 e4 f4@2 c4", AM: "[c4@4 e4@4 ~@5 g4 a4 g4@5 ~@11 c4]/2",
  AN: "[a#4@4 a4@4 f4@4 g4@3 g4@5 ~@7 c4 d4!2 f4!2]/2", AO: "~ a#4 a4 g4 f4@2 d4@2", AP: "c4@4 ~@7 f4@2 f4 ~ f4",
  AQ: "e4@2 c4 c4@3 ~@2", AR: "~@8 g4@4 f4 ~ f4@2", AS: "d4@2 ~ a3 c4@3 a3", AT: "~@6 c4 ~ c4@2 d4@2 d4@2 f4@2",
  AU: "g4@2 a4@2 f4@5 ~@3 a4@2 a#4@2", AV: "g4@5 ~@6 c4 d4@2 f4@2", AW: "a4@4 ~@5 a4 ~ a4 a4@2 a4@2", AX: "a4",
  AY: "g4/2",
})).s("gm_overdriven_guitar").gain(0.5)

// other · pad poly · "POLYSYNTH"
const pad_poly = note(`<
  ~@4 A@16 B@2 C@2 D@2 E@2 F@2 E@2 F@2 A@12 B@2 C@2 D@2 E@2 F@2 E@2 F@2 G H G H I@2 G H G H J@2 E@2 F@2 E@2 K@2 ~@10 L M
  ~@4 N O@2 P@2 Q@2 R S T U V W X@4 ~@19 Y Z@3 AA@2 AB@2 AA@2 AB@2 AA@2 AB@2 AA@2 AB@2 AA@2 AB@2 AA@2 AB@2 AA@2 AB@2
  AA@2 AB@2 AA@2 AC@2
>`.pickRestart({
  A: "[a#3 a3, d4]/4", B: "[a#3,d4]/2", C: "[c4,e4]/2", D: "[d4,f#4]/2", E: "[f4,a4,c5]/2", F: "[e4,g4,b4]/2",
  G: "[f4,a4]", H: "[e4,g4]", I: "[f4,a4]/2", J: "[f#4,a4]/2", K: "[[e4,g4,b4]@31 ~]/2",
  L: "d4 a4 d5 a5 f4 c5 f5 c6 d4 a4 d5 a5 c4 g4 c5 g5", M: "d4 a4 d5 a5 f4 c5 f5 c6 ~@8", N: "~@5 d5 e5 f5",
  O: "[e5@13 c5@2 d5]/2", P: "[a4@2 g4@2 f4@8 g4 a4 g4 f4]/2", Q: "[g4@2 f4@2 d4@8 c5@2 a#4 a4]/2",
  R: "g4@2 f4@2 g4@2 a4 g4", S: "f4 e4 f4 g4 e4@2 d4@2", T: "c4", U: "~ d4 e4 f4 g4 a4 g4 f4", V: "g4",
  W: "~ a4 a#4 c5 d5 c5 a#4 g4", X: "[~@2 d4 c4 a#3 a3 d3@2, a4]/4", Y: "d4 c4", Z: "[a#3@2 a3 g3 d3@8, [g5,d6]]/3",
  AA: "c5/2", AB: "b4/2", AC: "[b4@21 ~@11]/2",
})).s("gm_pad_poly").gain(0.4).pan(0.8)

// other · pad poly · "POLYSYNTH" · soft notes
const pad_poly_soft = note(`<
  ~@87
  [d4 a4 d5 a5 f4 c5 f5 c6 d4 a4 d5 a5 c4 g4 c5 g5]!3
  ~
  [~@8 d4 a4 d5 a5 c4 g4 c5 g5]
  [d4 a4 d5 a5 f4 c5 f5 c6 d4 a4 d5 a5 c4 g4 c5 g5]!2
  ~@78
>`).s("gm_pad_poly").gain(0.16).pan(0.8)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar_2 = note(`<
  ~@7 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~ B@2 C@2 ~@11 A@2 ~@2 A@2 ~@2 A@2 ~ B@2 C@2 ~@18 D@2 ~@41 E F G H E F G H I J I K L K
  L K L K L D@4 ~@36
>`.pickRestart({
  A: "[~@5 [f4,f5]@4 ~@7]/2", B: "[~ [g4,g5]@11 ~@4]/2", C: "[d3,a3,d4]", D: "[d3,a3,d4]/2",
  E: "[a#2,f3,d4] [a2,f3,c4]", F: "[c3,f3,c4] [d3,a3]", G: "[d3,g3,c4]", H: "[d3,g3,b3]",
  I: "[a#2,f3,d4] [a2,f3,c4] [c3,f3,c4] [d3,a3]", J: "c4 b3, [d3,g3]", K: "[f3,a#3,d4]", L: "[e3,a3,c4]",
})).s("gm_overdriven_guitar").gain(0.4).pan(0.7)

// chords · guitar harmonics · "GTHARMONIC"
const guitar_harmonics = note(`<
  ~@7 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~ B@2 ~@13 A@2 ~@2 A@2 ~@2 A@2 ~ B@2 ~@122
>`.pickRestart({
  A: "[~@5 a3@4 ~@7]/2", B: "[~ g3@11 ~@4]/2",
})).s("gm_guitar_harmonics").gain(0.01)

// chords · guitar harmonics · "GTHARMONIC" · soft notes
const guitar_harmonics_soft = note(`<
  ~@7 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~ B@2 ~@13 A@2 ~@2 A@2 ~@2 A@2 ~ B@2 ~@122
>`.pickRestart({
  A: "[~@5 f3@4 ~@7]/2", B: "[~ e3@11 ~@4]/2",
})).s("gm_guitar_harmonics").gain(0)

// other · pad poly · "POLYSYNTH"
const pad_poly_2 = note("<~@80 A B C D E@2 ~@6 F@6 G H ~ I@2 J@2 K L M N O@4 ~@19 P Q R@2 ~@36>".pickRestart({
  A: "~@2 d3 ~ e3@2 ~@4 d3 ~ e3 ~@3", B: "~@2 f3 ~ g3@2 ~@4 f3 ~ g3 ~@3", C: "~@2 g3 ~ a#3@2 ~@4 g3 ~ a#3 ~@3",
  D: "~@2 d4 ~ e4@2 ~@4 d4 ~ e4@2 f4@2", E: "g4/2", F: "[~@4 a5@21 a#5 c6 d6@2 a#5 a5 g5@17]/6", G: "e5 f5 e5 d5@5",
  H: "d5 a4 g4 f4@5", I: "[~ a5 g5 f5 e5 f5 d5@7 a5 g5 f5]/2", J: "[e5 f5 g5@6]/2", K: "~ c5 d5 e5 f5 g5 f5 e5",
  L: "f5", M: "~ d5 e5 f5 g5 a5 g5 f5", N: "e5", O: "[~@2 d4 c4 a#3 a3 d3@2, ~ a5@7, ~ d6@3]/4", P: "d3 c3",
  Q: "a#2@2 a2 g2", R: "d2/2",
})).s("gm_pad_poly").gain(0.3).pan(0)

// other · pad poly · "POLYSYNTH" · soft notes
const pad_poly_soft_2 = note(`<
  ~@80
  [~@3 e3 ~@2 f3 ~@4 e3 ~@4]
  [~@3 g3 ~@2 a3 ~@4 g3 ~@4]
  [~@3 a#3 ~@2 c4 ~@4 a#3 ~@4]
  [~@3 e4 ~@2 f4 ~@4 e4 ~@4]
  ~@88
>`).s("gm_pad_poly").gain(0.15).pan(0)

// other · melodic tom · "MELO TOM 1"
const melodic_tom = note(`<
  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 ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@93
>`.pickRestart({
  A: "~@2 [f2,f5] ~@2 d6 ~@2 d#7 ~@2 d6 ~@4", // F
})).s("gm_melodic_tom").gain(0.4)

// other · melodic tom · "MELO TOM 1" · soft notes
const melodic_tom_soft = note("<A ~ A ~ A ~ A ~ A ~ A ~@161>".pickRestart({
  A: "~@3 [f2,f5] ~@2 d6 ~@2 d#7 ~@2 d6 ~@3", // F
})).s("gm_melodic_tom").gain(0.24)

// chords · tinkle bell · "TINKLEBELL" · F5
const tinkle_bell = note(`<
  ~@60
  [[c8,f8] ~ [c8,f8] ~ [c8,f8] ~ [c8,f8] ~ [c8,f8] ~ [c8,f8] ~ [c8,f8] ~ [c8,f8] ~]!12
  ~@100
>`).s("gm_tinkle_bell").gain(0.16)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note("<~@60 A B A B C D A B A B ~@10 E@33 ~@59>".pickRestart({
  A: "d4 ~@3 d4 ~@3 d4 ~ e4 ~ f4 ~ d4 ~", B: "~@2 d4 ~@3 d4 ~@3 e4 ~ f4 ~@3", C: "c4 ~@3 c4 ~@3 d4 ~ e4 ~ f4 ~ d4 ~",
  D: "~@2 c4 ~@3 d4 ~@3 e4 ~ f4 ~@3", E: "~@2 d3 e3 e3@2 f3 ~@3 d3 e3!2 ~@3",
})).s("gm_electric_guitar_muted").gain(0.4).pan(0.3)

// bass · slap bass 2 · "SLAPBASS 2"
const bass_2 = note("<~@79 [~@15 d1] [~ d1 ~@5 d1 ~ d1 ~@5 d1]!32 [~ d1 ~@5 d1 ~ d1 ~@6] ~@59>")
  .s("gm_slap_bass_2").gain(0.4)

// other · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note("<~@26 A B C D A B C E ~@18 A B C D A B C D ~@12 A B C D A B C E ~@92>".pickRestart({
  A: "c4@7 c4", B: "c4@4 c4@10 b3 c4", C: "b3@7 b3", D: "b3@2 b3@5 b3", E: "b3@2 b3@5 ~",
})).s("gm_acoustic_guitar_nylon").gain(0.32).pan(0.3)

// drums · kick
const kick = s("bd").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 A B A
  B A B A B A B A B A B A B A B A B A B A C D@33 E@2 F ~ E@2 F ~ E F E@4 G@3 H I G@2 F@2 G@2 J K G@2 J K G@2 L M G N@2 O
  G@2 P H G N Q F G@3 R G N Q F G@3 R
>`.pickRestart({
  A: "x ~ x ~@12 x", B: "x ~ x ~@4 x!2 ~ x ~@5", C: "x ~ x ~@4 x!2 ~ x ~@4 x", D: "~ x ~@5 x ~ x ~@5 x", E: "x!2",
  F: "x!2 ~@6", G: "x ~@2 x ~@4 x ~@2 x ~@4", H: "x", I: "~ x ~@6", J: "x ~@2 x ~@4 x ~@2 x ~@3 x", K: "~ x ~@14",
  L: "x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~", M: "~@3 x ~@5 x ~@6", N: "x ~@2 x ~@4 x ~@2 x ~@2 x ~", O: "~@3 x ~@4",
  P: "~@2 x!2 ~@3 x", Q: "x ~@2 x ~@6 x ~@5", R: "x ~@2 x ~@4 x ~@2 x ~ x ~@2",
})).gain(0.48)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<A B A B A B A B A B A B ~@160>".pickRestart({
  A: "~ x ~ x ~@12", B: "~ x ~ x ~@5 x ~ x ~@4",
})).gain(0.08)

// drums · rim
const rim = s("rim").struct("<~@11 A ~@7 A ~@25 A ~@34 B@56 ~@36>".pickRestart({
  A: "~@8 x!4 ~@4", B: "~ x ~@5 x ~ x ~@5 x",
})).gain(0.32)

// drums · snare
const snare = s("sd").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 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 D ~@17 E F@12 G ~ F@3 H F@2 I ~ F ~ F J F@2 K F@2 L ~ F@2 M N O P Q M O P R
  S O T@2 U O@2 V W O@2 X Y O@2 Z ~ O P O AA O@2 Z ~ O P O AA
>`.pickRestart({
  A: "~@8 x ~@2 x ~@4", B: "~ x", C: "~@8 x ~@2 x ~@3 x", D: "~ x ~@14", E: "~@3 x", F: "~ x ~ x",
  G: "~@2 x ~@2 x ~@10", H: "~@5 x ~@10", I: "~ x ~@4 x ~ x ~ x ~@5", J: "~@4 x ~@3 x!2 ~@6", K: "~@4 x ~@7 x ~ x!2",
  L: "x!2 ~@2 x ~@3", M: "~@2 x!2 ~@4", N: "~@4 x!2 ~ x ~@8", O: "~@4 x ~@4 x ~@2 x ~@3", P: "~@4 x ~@4 x ~@2 x!2 ~@2",
// … 104 more lines

More by Genesis