Strudelify
Double Vision cover art

Double Vision

Double Vision

Foreigner

KeyA minorTempo120 bpm
0:00/0:00
// Double Vision — Foreigner
// 120 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 78, 4/4 at bar 78) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 101 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Guitar 2.
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.

// chords · overdriven guitar · "kb /guitar"
const overdriven_guitar = note(`<
  A B A C D E D F@2 G H I J K@2 L M N O I P Q R S T U V@3 U W@2 X Y Z AA AB AA AC AD E AE C AE E AE AF G H I J K@2 L M N
  O I P Q R S T U V@3 U W@2 X Y Z AA AB AA AC AG@2 AH@2 AI@2 AJ@2 AK@2 AL AM AN@2 AL AO AP@2 AL AM AN@2 AL AQ
>`.pickRestart({
  A: "[g4,b4]@3 ~@3 [g3,c4]@8 ~@2", B: "~@2 a3 ~ [g3,c4] ~ b3 ~ [a3,d4] ~ [g3,c4]@4 ~@2",
  C: "~@2 a3 ~ [g3,c4] ~ a3 ~ [a3,d4]@5 ~@3", D: "[g4,b4,e5]@3 ~@3 [g3,c4]@8 ~@2",
  E: "~@2 a3 ~ [g3,c4] ~ a3 ~ [a3,d4] ~ [g3,c4]@4 ~@2", F: "[~@2 a3 ~ [g3,c4] ~ a3 ~ [a3,d4]@19 ~@5]/2",
  G: "[a3,e4,a4] ~ g4 ~ g4 ~ g4 ~ [a3,e4] ~ c4 ~@3 [a3,d4]@2", H: "~@2 c4 ~ d4 ~ c4 ~ [a3,e4]@5 ~@3",
  I: "e3@3 ~ a3@3 ~ g3@3 ~ d3@3 ~", J: "~@2 [e3,a3] ~ [e3,a3] ~ [d3,g3] ~ [e3,a3] ~ [e3,a3] ~ [e3,a3] ~ [d3,g3] ~",
  K: "[[e3,a3] ~ a3 ~ a3 ~ c4@3 ~ d4 ~ d4 ~ a3@3 ~ g4@3 ~ [a3,e4,a4]@9 ~, ~@7 e4@4 ~@5]/2", // A5
  L: "f3@3 ~ c4@3 ~ b3@3 ~ g3@3 ~", M: "[e3,a3] ~ [e3,a3] ~ [e3,a3] ~ [d3,g3] ~ [e3,a3] ~ [e3,a3] ~ [e3,a3] ~ g4 ~",
  N: "[a3,e4,a4] ~ g4 ~ g4 ~ g4 ~ [a3,e4] ~ d4 ~ c4@3 ~", O: "[a3,e4] ~ c4 ~ d4 ~ c4 ~ [a3,e4]@5 ~@3",
  P: "~@2 [e3,a3] ~ [e3,a3] ~ [d3,g3] ~ [e3,a3] ~ [e3,a3] ~ [e3,a3] ~ c5 ~", // A5 G5 A5
  Q: "[e4,a4,c5] ~ a4 ~ c5 ~ c5 ~ [a3,e4,a4]@3 ~ g4 ~ e4 ~", R: "[a3,e4]@4 g4@3 ~ e4 d4 c4@4 ~@2, a4@3 ~@5 a3@5 ~@3",
  S: "f4@3 ~ c5@3 ~ b4@3 ~ g4@3 ~", T: "[a3,e4,a4] ~ [a3,e4,a4] ~ [a3,e4,a4] ~ [a3,e4,a4] ~ [a3,e4,a4] ~@7",
  U: "[f4,a4,d5]@3 ~ c5 ~ [f4,a4,d5]@3 ~@3 a3 ~ d4 ~, ~@5 d4@2 ~", // Dm
  V: "[f4 ~ c5 ~ [f4,a4,d5]@3 ~ [f4,a4,d5]@3 ~ d5 ~ d5@2 ~@2 c5@4 ~@4 c4 ~ a3 ~ c4 ~@3 c4 ~ a3 ~ c4 ~@3 c4 ~ a3 ~ e4 ~, ~@14 e4@7 ~@3 e4@16 e4@6 ~@2, ~@14 a4 ~ g4@5 ~@27]/3", // Dm
  W: "[f4 ~ c5 ~ [f4,a4,d5]@3 ~ [f4,a4,d5]@3 ~ d5 ~ d5@2 ~@2 c5@4 ~@2 e4 ~ c4 ~ a3 ~ c4 ~, ~@14 e4@7 ~@11, ~@14 a4 ~ g4@5 ~@11]/2", // Dm
  X: "e4 ~ a3 ~ c4 ~ e4 ~ c4 ~ a3 ~ c4 ~ e4 ~", Y: "[a4,c5,f5]@3 ~@5 f4 ~ c4 ~ a3 ~ c4 ~",
  Z: "f4 ~ c4 ~ a3 ~ f4 ~ [e4,g4,c5] ~ c5 ~ [e4,g4,c5]@3 ~", AA: "[f4,a4,e5]@4 ~@2 [f4,a4,d5]@3 ~ [f4,a4,d5]@4 ~@2",
  AB: "f4 ~ d4 ~ a3 ~ f4 ~ [e4,g4,c5]@2 ~ [e4,g4,c5]@2 [e4,g4,c5]@2 ~", AC: "~@2 c5 ~ d5 ~ c5 ~ e5 ~ d#5 ~ d5 ~ c5 ~",
  AD: "[g4,b4,e5]@3 ~ a4 ~ [e4,g4,c5]@5 ~@5", AE: "[g4,b4,e5]@3 ~@3 [g3,c4]@5 ~@5",
  AF: "~@4 [g3,c4,e4]@3 ~ [a3,d4,f#4]@5 ~@3", // C D
  AG: "[[g4,e5] ~ [f#4,d#5] ~ [f4,d5] ~ [e4,c5] ~ [g4,b4,e5]@3 ~ a4 ~ [e4,g4,c5]@5 ~@7 a3 ~ [g3,c4] ~ a3 ~]/2", // C D#m Dm C Em C C5
  AH: "[[a3,d4] ~ [g3,c4]@4 ~@2 [g4,b4,e5]@3 ~@3 [g3,c4]@5 ~@7 a3 ~ [g3,c4] ~ a3 ~]/2", // D5 C5 Em C5
  AI: "[[a3,d4]@5 ~@3 [g4,b4,e5]@3 ~@3 [g3,c4]@5 ~@7 a3 ~ [g3,c4] ~ a3 ~]/2", // D5 Em C5
  AJ: "[[a3,d4] ~ [g3,c4]@4 ~@2 [g4,b4,e5]@3 ~@3 [g3,c4]@5 ~@7 a3 ~ c4 ~ a3 ~]/2", // D5 C5 Em C5
  AK: "[e4 ~ d#4 ~ d4 ~ c4 ~ [f4,a4,d5]@21 ~@3]/2", AL: "[f4,a4,e5]@3 ~ d5 ~ d5@3 ~ c5@4 ~@2, ~@6 [e4,a4]@7 ~@3",
  AM: "~@2 c4 ~ a3 ~ c4 ~@3 c4 ~ a3 ~ c4 ~, e4", AN: "[~@2 c4 ~ a3 ~ e4 ~ [f4,a4,d5]@21 ~@3, e4@3 ~@13]/2",
  AO: "e4 ~ c4 ~ a3 ~ c4 ~ a3@3 ~ b3@3 ~", AP: "[c4@3 ~ e4@3 ~ [f4,a4,d5]@21 ~@3]/2", AQ: "e4 ~ c4 ~ a3 ~ c4 ~@9",
})).s("gm_overdriven_guitar").gain(0.51)

// bass · slap bass 1 · "bass"
const bass = note(`<
  A@3 B A@3 C D E@2 F E@3 G E@3 F E@3 H I J K L M J K L N O P Q R Q S A@3 B A@3 T E@2 F E@3 G E@3 F E@3 H I J K L M J K
  L N O P Q R Q S U A@3 V A@2 W X Y Z AA AB Y Z AC AD Y Z AA AB Y Z AE
>`.pickRestart({
  A: "[a1,a2]@3 ~ [a1,a2]@3 ~ [a1,a2]@3 ~ [a1,a2]@3 ~", B: "[a1,a2]@3 ~ [a1,a2]@3 ~ e2 ~ d2 ~ c2 ~ b1 ~",
  C: "[a1,a2]@3 ~ [a1,a2]@3 ~@9", D: "d2 d3 d2 ~ d2 ~ d2 d3 d2 ~ d2@4 ~@2", E: "a1@3 ~ c2@3 ~ a1@3 ~ c2@3 ~",
  F: "a2@3 ~ d3@3 ~ c3@3 ~ g2@3 ~", G: "f1@3 ~ c2@3 ~ b1@3 ~ g1@3 ~", H: "f2@3 ~ c3@3 ~ b2@3 ~ g2@3 ~",
  I: "a1 ~ c2 ~ d2 ~ e2 ~ a2 ~@7", J: "d2@3 ~@3 c2 ~ d2@3 ~@5", K: "~@2 c2 ~ d2@3 ~ e2 ~ e2 ~ d2 ~ c2 ~",
  L: "a1@3 ~@3 a1 ~ a1@3 ~@5", M: "~@2 g1 ~ a1@3 ~ g1 ~ a1 ~ b1 ~ c2 ~", N: "~@2 g1 ~ a1@3 ~ g1 ~ a1 ~ c2 ~ e2 ~",
  O: "f2@3 ~@3 c3 ~ d3@3 ~@5", P: "~@2 f3 ~ c3@3 ~ c3@3 ~ c2@3 ~", Q: "d2@3 ~@3 a2 ~ d3@3 ~@5",
  R: "~@2 g2 ~ d3@3 ~ g2@3 ~ c2@3 ~", S: "~@2 c2 ~ d2 ~ c2 ~ e2 ~ d#2 ~ d2 ~ c2 ~",
  T: "[a1,a2]@3 ~ [c2,c3]@3 ~ [d2,d3]@3 ~ d2@3 ~", U: "e2 ~ d#2 ~ d2 ~ c2 ~ [a1,a2]@3 ~ [a1,a2]@3 ~",
  V: "e2 ~ d2 ~ c2 ~ b1 ~ [a1,a2]@3 ~ [a1,a2]@3 ~", W: "[a1,a2]@3 ~ [a1,a2]@3 ~@3 a1 ~ c2 ~ a1 ~",
  X: "e2 ~ d#2 ~ d2 ~ c2 ~ d2@3 ~@3 c2 ~", Y: "d2@3 ~@7 c2 ~ d2@3 ~", Z: "e2 ~ d2 ~ c2 ~ b1 ~ a1@3 ~@3 g1 ~",
  AA: "a1@3 ~@7 g1 ~ a1@3 ~", AB: "g1 ~ a1 ~ b1 ~ c2 ~ d2@3 ~@3 c2 ~", AC: "a1@3 ~@5 a1@3 ~ b1@3 ~",
  AD: "c2@3 ~ e2@3 ~ d2@3 ~@3 c2 ~", AE: "a1@3 ~@13",
})).s("gm_slap_bass_1").gain(0.51)

// bass · synth bass 2
const bass_2 = note("<A B C D C E@2 F G H@2 I J K@2 ~@32 H@2 I J K@2 ~@48>".pickRestart({
  A: "a2@3 ~ a1@3 ~ a2@3 ~ a1@3 ~", B: "a2@3 ~ a1@3 ~ a2@3 ~ a2@3 ~", C: "a1@3 ~ a2@3 ~ a1@3 ~ a2@3 ~",
  D: "a1@3 ~ a2@3 ~ e2 ~ d2 ~ c2 ~ b1 ~", E: "[a1,a2]@3 ~ [a1,a2]@3 ~ [a1,a2]@3 ~ [a1,a2]@3 ~",
  F: "[a1,a2]@3 ~ [a1,a2]@3 ~@9", G: "d2 d3 d2 ~ d2 ~ d2 d3 d2 ~ d2@4 ~@2", H: "a1@3 ~ c2@3 ~ a1@3 ~ c2@3 ~",
  I: "a1@3 ~ d3@3 ~ c3@3 ~ g2@3 ~", J: "a1@3 ~ c3@3 ~ a2@3 ~ c3@3 ~", K: "a2@3 ~ c3@3 ~ a2@3 ~ c3@3 ~",
})).s("gm_synth_bass_2").gain(0.41)

// drums · ride
const ride = s("rd").struct("<[~ x ~ x]!30 ~@17 [~ x ~ x]!21 ~@33>").gain(0.51)

stack(overdriven_guitar, bass, bass_2, ride)

More by Foreigner