Strudelify
The Look cover art

1989 · Look Sharp!

The Look

Roxette

KeyA majorTempo100 bpm
0:00/0:00
// The Look — Roxette
// 100 bpm, 4/4, key A major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// 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): overdriven guitar, distortion guitar.
setcpm(100/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 · fretless bass · "bass"
const bass = note(`<
  ~@2 A B C D E D A F E D A F G H G I J K L M N K L M N E D A F E D A F G H G I J K L M N K L M N O P Q R Q S T U V W@2
  A B C D K L M N K L M N K L M N K L M N M N X@2 K L M N K L M N K L M N K L M N X@2
>`.pickRestart({
  A: "g1@3 ~ g1@4 ~ c2 c2@2 c2@3 ~", B: "d2@3 ~ d2@4 ~ c2 c2@2 c2@2 d2@2", C: "g1@3 ~ g1@4 ~ e2 e2@2 e2@2 d2@2",
  D: "c2@3 ~ c2@4 ~ d2 d2@2 d2@3 ~", E: "g1@3 ~ g1@4 ~ g1 g1@2 g1@2 b1@2", F: "d2@3 ~ d2@4 ~ c2 c2@2 c2@2 b1@2",
  G: "e1@3 ~ e1@4 ~ c2 c2@2 c2@3 ~", H: "g1@3 ~ g1@4 ~ d2 d2@2 d2@2 c2@2", I: "g1@3 ~ g1@4 ~ d2 d2@2 d2@2 d2@2",
  J: "d2@3 ~ d2@4 ~ d2 d2@2 d2@2 d2@2", K: "a1@3 ~ a1@4 ~ d2 d2@2 d2@3 ~", L: "e2@3 ~ e2@4 ~ d2 d2@2 d2@2 e2@2",
  M: "a1@3 ~ a1@4 ~ f#2 f#2@2 f#2@2 e2@2", N: "d2@3 ~ d2@4 ~ e2 e2@2 e2@3 ~", O: "g1@3 ~ g1@4 ~ g1 g1@2 g1@2 g1@2",
  P: "d2@3 ~ d2@4 d2@3 ~ d2@4", Q: "e2", R: "d3@6 g2 f#2", S: "b2@4 b2 a2 g2 f#2", T: "c2", U: "g2", V: "b2",
  W: "d1@3 ~ d1@3 ~ d1@3 ~ d1@3 ~", X: "[a1@31 ~]/2",
})).s("gm_fretless_bass").gain(0.45)

// chords · acoustic guitar steel · "guitar"
const acoustic_guitar_steel = note(`<
  ~@2 A B C D E F G H E F G H I J I J K L M N O L M N O E F G H E F G H I J I J K L M N O L M N O E K ~@7 K@2 A B C D L
  M N O L M N O L M N O L M N O N O P@2 L M N O L M N O L M N O L M N O P@2
>`.pickRestart({
  A: "[d4,g4]@2 [g3,b3,d4,g4]@2 [g3,b3,d4,g4]@2 [g3,b3,d4,g4]!4 [g3,c4,e4,g4]@2 [g3,c4,e4,g4]@2 [g3,c4,e4,g4]!2", // G5 G C
  B: "[f#3,a3,d4,f#4]@2 [f#3,a3,d4,f#4]@2 [f#3,a3,d4,f#4]@2 [f#3,a3,d4,f#4]!4 [g3,c4,e4,g4]@2 [g3,c4,e4,g4]@2 [g3,c4,e4,g4]!2", // D C
  C: "[g3,b3,d4,g4]@2 [g3,b3,d4,g4]@2 [g3,b3,d4,g4]@2 [g3,b3,d4,g4]!4 [g3,b3,e4,g4]@2 [g3,b3,e4,g4]@2 [g3,b3,e4,g4]!2", // G Em
  D: "[g3,c4,e4,g4]@2 [g3,c4,e4,g4]@2 [g3,c4,e4,g4]@2 [g3,c4,e4,g4]!4 [f#3,a3,d4,f#4]@2 [f#3,a3,d4,f#4]@2 [f#3,a3,d4,f#4]!2", // C D
  E: "[g3,b3,d4,g4]@4 [g3,b3,d4,g4]@5 [g3,b3,d4,g4] [g3,b3,d4,g4]@2 [g3,b3,d4,g4]@2 [g3,b3,d4,g4]!2", // G
  F: "[g3,c4,d4,g4]@4 [g3,c4,d4,g4]@2 [g3,c4,d4,g4]!2 [f#3,a3,d4,f#4]@4 [f#3,a3,d4,f#4]@2 [f#3,a3,d4,f#4]!2", // Gsus4 D
  G: "[g3,b3,d4,g4]@4 [g3,b3,d4,g4]@5 [g3,c4,d4,g4] [g3,c4,d4,g4]@2 [g3,c4,d4,g4]@2 [g3,c4,d4,g4]!2", // G Gsus4
  H: "[f#3,a3,d4,f#4]@4 [f#3,a3,d4,f#4]@5 [g3,c4,d4,g4] [g3,c4,d4,g4]@2 [g3,c4,d4,g4]@2 [g3,c4,d4,g4]!2", // D Gsus4
  I: "[e3,g3,b3,e4]@4 [e3,g3,b3,e4]@5 [g3,c4,e4,g4] [g3,c4,e4,g4]@2 [g3,c4,e4,g4]@2 [g3,c4,e4,g4]!2", // Em C
  J: "[g3,b3,d4,g4]@4 [g3,b3,d4,g4]@5 [f#3,a3,d4,f#4] [f#3,a3,d4,f#4]@2 [f#3,a3,d4,f#4]@2 [f#3,a3,d4,f#4]!2", // G D
  K: "[f#3,a3,d4,f#4]@4 [f#3,a3,d4,f#4]@5 [f#3,a3,d4,f#4] [f#3,a3,d4,f#4]@2 [f#3,a3,d4,f#4]@2 [f#3,a3,d4,f#4]!2", // D
  L: "[e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]!4 [a3,d4,f#4,a4]@2 [a3,d4,f#4,a4]@2 [a3,d4,f#4,a4]!2", // A5 A D
  M: "[g#3,b3,e4,g#4]@2 [g#3,b3,e4,g#4]@2 [g#3,b3,e4,g#4]@2 [g#3,b3,e4,g#4]!4 [a3,d4,f#4,a4]@2 [a3,d4,f#4,a4]@2 [a3,d4,f#4,a4]!2", // E D
  N: "[a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]@2 [a3,c#4,e4,a4]!4 [a3,c#4,f#4,a4]@2 [a3,c#4,f#4,a4]@2 [a3,c#4,f#4,a4]!2", // A F#m
  O: "[a3,d4,f#4,a4]@2 [a3,d4,f#4,a4]@2 [a3,d4,f#4,a4]@2 [a3,d4,f#4,a4]!4 [g#3,b3,e4,g#4]@2 [g#3,b3,e4,g#4]@2 [g#3,b3,e4,g#4]!2", // D E
  P: "[[a3,c#4,e4,a4]@31 ~]/2", // A
})).s("gm_acoustic_guitar_steel").gain(0.36).pan(0.3)

// other · overdriven guitar · "guitar motif"
const overdriven_guitar = note("<~@2 A B@2 C@2 ~@22 D C@2 ~ D C@2 ~@23 A B@2 E ~@20 F G@14 H ~@2>".pickRestart({
  A: "g3@4 g3@4 d3!3 ~ d3@2 a3@2", B: "[b3@2 a3@2 a3@2 g3@2 g3 a3 a3@2 a3@2 g3@13 ~ g3@2 a3@2]/2",
  C: "[b3@2 a3@2 a3@2 g3@2 g3 a3 a3@2 a3@2 g3@8 ~@10]/2", D: "g3@4 g3@4 d3!3 ~ g3@2 a3@2",
  E: "b3@2 a3@2 a3@2 g3@2 g3 a3 a3@2 a3@2 ~@2", F: "a3@4 a3@4 e3!3 ~ e3@2 b3@2",
  G: "[c#4@2 b3@2 b3@2 a3@2 a3 b3 b3@2 b3@2 a3@13 ~ a3@2 b3@2]/2", H: "c#4@2 b3@2 b3@2 a3@2 a3 b3 b3@2 b3@2 ~@2",
})).s("gm_overdriven_guitar").gain(0.55).pan(0.3)

// chords · overdriven guitar
const overdriven_guitar_2 = note(`<
  ~@2 A B C D ~@2 E@2 ~@2 E@2 ~@5 F D G H F D G H ~@2 E@2 ~@2 E@2 ~@5 F D G H F D G H ~@9 I@2 A B C D F D G H F D G H F
  D G H F D G H G H ~@2 F D G H F D G H F D G H F D G H ~@2
>`.pickRestart({
  A: "b2@4 ~@5 [c3,e3] ~@6", B: "~@9 [g2,c3,e3,g3] ~@6", C: "~@9 e3 ~@6", D: "~@9 [a2,d3,f#3,a3] ~@6",
  E: "~@9 e3 e3@2 e3@4", F: "c#3@4 ~@5 [d3,f#3] ~@6", G: "~@9 f#3 ~@6", H: "~@9 [b2,e3,g#3,b3] ~@6",
  I: "~@2 [a2,d3,f#3,a3] ~", // D
})).s("gm_overdriven_guitar").gain(0.54).pan(0.3)

// chords · distortion guitar
const distortion_guitar = note(`<
  ~@2 A B C D ~@13 E D F G E D F G ~@13 E D F G E D F G H I ~@7 I@2 A B C D E D F G E D F G E D F G E D F G F G ~@2 E D
  F G E D F G E D F G E D F G ~@2
>`.pickRestart({
  A: "b3@4 ~@5 [c4,e4] ~@6", B: "~@9 [g3,c4,e4,g4] ~@6", C: "~@9 e4 ~@6", D: "~@9 [a3,d4,f#4,a4] ~@6",
  E: "c#4@4 ~@5 [d4,f#4] ~@6", F: "~@9 f#4 ~@6", G: "~@9 [b3,e4,g#4,b4] ~@6", H: "~@2 [b3,d4,g4,b4] ~",
  I: "~@2 [a3,d4,f#4,a4] ~", // D
})).s("gm_distortion_guitar").gain(0.3).pan(0.8)

// other · brass section
const brass_section = note(`<
  ~@18 A B@2 C D E@2 F ~ G ~@11 A B@2 C D E@2 F ~@15 A B@2 C D E@2 F D B@2 C D E@2 F H F H F ~@9 I J@6 K F ~
>`.pickRestart({
  A: "~@6 d5!2", B: "[e5@7 ~ f#5@2 e5@2 d5@2 e5@8 a4@2 d5@2 d5 ~ d5@2 c#5 b4]/2", C: "a4@5 ~@3", D: "~@6 c#5 d5",
  E: "[e5@7 ~ f#5@2 e5@2 d5@2 e5@8 a4@2 d5 ~ d5 ~ d5@2 c#5 b4]/2", F: "a4@15 ~", G: "d5 ~@15",
  H: "~@6 a4@2 d5 ~ d5 ~ d5@2 c#5 b4", I: "~@6 a4 b4", J: "[c#5@2 b4@2 b4@2 a4@2 a4 b4 b4@2 b4@2 a4@13 ~ a4@2 b4@2]/2",
  K: "c#5@2 b4@2 b4@2 a4@2 a4 b4 b4@2 b4@2 ~@2",
})).s("gm_brass_section").gain(0.51).pan(0.8)

// chords · string ensemble 1 · "strings1"
const string_ensemble_1 = note("<~@50 A B A C D E F G@2 ~@42>".pickRestart({
  A: "[b4,e5] ~ [e4,g4] ~ [b4,e5] ~ [e4,g4] ~ [b4,e5] ~ [e4,g4] ~ [b4,e5] ~ [e4,g4] ~", // E5 Em E5 Em E5 Em E5 Em
  B: "[a4,d5] ~ [d4,f#4] ~ [a4,d5] ~ [d4,f#4] ~ [a4,d5] ~ [d4,f#4] ~ [a4,d5] ~ [d4,f#4] ~", // D5 D D5 D D5 D D5 D
  C: "[b4,d#5] ~ [d#4,f#4] ~ [b4,d#5] ~ [d#4,f#4] ~ d#5@2 c#5@2 b4@2 d#5@2", // B D#m B D#m
  D: "e5 ~ [e4,g4] ~ [c5,e5] ~ [e4,g4] ~ [c5,e5] ~ [e4,g4] ~ [c5,e5] ~ [e4,g4] ~", // Em C Em C Em C Em
  E: "[b4,d5] ~ [d4,g4] ~ [b4,d5] ~ [d4,g4] ~ d5@2 c5@2 b4@2 a4@2", F: "b4", G: "d4/2",
})).s("gm_string_ensemble_1").gain(0.37).pan(0.3)

// chords · string ensemble 2 · "low strings"
const string_ensemble_2 = note("<~@50 A B C@2 D@5 ~@42>".pickRestart({
  A: "[e4,g4,b4]", B: "[d4,f#4,a4]", C: "[[e4,g4] [d#4,f#4], b4]/2",
  D: "[[e4,c5]@16 ~@32 a4@31 ~, g4@31 f#4@47 ~@2, ~@16 d4@63 ~, ~ b4@2 ~@2]/5", // C
})).s("gm_string_ensemble_2").gain(0.2).pan(0.7)

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

// drums · snare
const snare = s("sd").struct(`<
  A B C@3 D C@3 E C@3 F C@4 G C@7 H C@3 E C@3 F C@4 G C@7 H C G ~@7 A B C@3 G C@7 H C@7 H C H ~ B C@7 H C@7 H ~ B
>`.pickRestart({
  A: "~@4 x ~@2 x ~@4 x ~@3", B: "~@4 x ~@2 x ~@2 x ~ x!3 ~", C: "~ x ~ x", D: "~@4 x ~@7 x ~ x!2",
  E: "~@4 x ~@7 x!2 ~@2", F: "~@2 x ~@2 x!2 ~", G: "~ x!2 ~", H: "~@4 x ~@7 x!4",
})).gain(0.68)

// drums · low tom
const low_tom = s("lt").struct("<~@9 A ~@8 B ~@11 A ~@8 B ~@22 B ~@7 B ~@9 B ~@9 B ~@7 B ~@2>".pickRestart({
  A: "~@15 x", B: "~@3 x",
})).gain(0.61)

// drums · hihat
const hihat = s("hh").struct("<A B C@48 ~@7 A B C@22 ~ B C@16 ~ B>".pickRestart({
  A: "~ x!7", B: "x!5 ~@3", C: "x!8",
})).gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct("<~@9 A ~@8 B ~@11 A ~@8 B ~@22 B ~@7 B ~@9 B ~@9 B ~@7 B ~@2>".pickRestart({
  A: "~@7 x", B: "~@11 x ~@4",
})).gain(0.68)

// drums · crash
const crash = s("cr").struct(`<
  A ~ A ~@7 A ~@8 A ~@7 A ~@3 A ~@8 A ~@7 A ~ A ~@6 A ~ A ~@3 A ~@7 A ~@9 A ~ A ~@7 A ~@7 A ~
>`.pickRestart({
  A: "x",
})).gain(0.41)

// drums · ride
const ride = s("rd").struct("<A B ~@55 A B ~@22 C B ~@16 C B>".pickRestart({
  A: "~ x!3", B: "x!3 ~", C: "x!4",
})).gain(0.34)

// drums · tambourine
const tambourine = s("tb").struct("<~@19 A@8 ~@13 A@10 ~@13 A@18 ~@2 A@16 ~@2>".pickRestart({
  A: "x!16",
})).gain(0.07)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@2 [x!16]!17 ~@8 [x!16]!13 ~@19 [x!16]!4 ~@38>").gain(0.34)

stack(
  bass, acoustic_guitar_steel, overdriven_guitar, overdriven_guitar_2, distortion_guitar, brass_section,
  string_ensemble_1, string_ensemble_2, kick, snare, low_tom, hihat, mid_tom, crash, ride, tambourine, cabasa
)

More by Roxette