Strudelify

Shadow of a Doubt

Roxette

KeyE majorTempo115 bpm
0:00/0:00
// Shadow of a Doubt — Roxette
// 115 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 127 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(115/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.

// other · piano · "Lead"
const piano = note(`<
  ~@15 A@2 B ~ C@3 ~ D E D F G H I J K H I J G ~ L@3 ~ M@4 D N D O P O H Q J K H I R S ~@10 T U@2 ~@5 V W X Y Z AA X Y Z
  W X Y Z AB X AC AD Y ~@7 AE AF AG AF AG AF AG AF AG AH AG AH AG AH AG AI AJ@2 ~@7
>`.pickRestart({
  A: "[~@3 e4 f#4@2 e4 f#4@4 e4 f#4 e4@3]/2", B: "f#4@2 e4 b3@5", C: "[~@3 e4 f#4@2 e4 f#4@4 e4 f#4@2 e4 g4@7 ~@2]/3",
  D: "~@6 d4 ~ d4@3 e4@3 f#4@2", E: "e4@4 c4 ~ c4@10", F: "e4@11 ~@3 d4@2", G: "e4@15 ~", H: "~@6 d4@2 a4@3 g4@3 f#4 ~",
  I: "f#4 e4@7", J: "~@6 d4@2 b3 ~ b3@2 d4@2 b3@2", K: "e4@3 d4 b3@9 ~@3",
  L: "[~@3 e4 f#4@2 e4 f#4@4 e4 f#4@2 e4 f#4@3 e4 b3@5]/3",
  M: "[~@6 e4@2 f#4@4 e4@2 f#4@8 e4@2 f#4@4 a4@2 g4@14 f#4@2 e4@4 b3@9 ~@5]/4", N: "e4@2 c4 c4@4 ~", O: "e4",
  P: "~@7 d4", Q: "f#4@2 e4@13 ~", R: "~@2 f#4@3 ~ f#4 ~ f#4 ~ f#4 ~ f#4@2 a4@2", S: "e4@3 ~", T: "~ e4@2 b4",
  U: "[a4@3 g4@3 f#4@3 e4@2 b3@4 ~]/2", V: "~@14 e4 ~", W: "f#4", X: "~@6 e4@2 b4@3 a4@3 g#4 ~", Y: "g#4 f#4@7",
  Z: "~@6 e4@2 c#4 ~ c#4@2 e4@2 c#4@2", AA: "f#4@3 e4 c#4@11 ~", AB: "f#4@2 ~ c#4@13, ~ e4 ~@6", AC: "g#4@2 f#4@13 ~",
  AD: "~@2 c#5@2 b4@2 a4@2 b4 ~ b4@2 a4@2 g#4 ~", AE: "a4@6 g#4@5 ~ g#4@2 ~@2", AF: "g#4@2 ~ f#4@5",
  AG: "a4@6 g#4@5 ~ g#4@3 ~", AH: "g#4@2 a4 f#4@5", AI: "g#4", AJ: "[f#4@25 ~@7]/2",
})).s("gm_piano").gain(0.44)

// other · electric guitar jazz · "Backup (jazz guitar)"
const electric_guitar_jazz = note(`<
  ~@26 A B C D E F C D E B ~@13 A G C H E F C D I@2 ~@18 J K L M N O L M N K L M N P L Q R M ~@32
>`.pickRestart({
  A: "~@7 d3", B: "e3@15 ~", C: "~@6 d3@2 a3@3 g3@3 f#3 ~", D: "f#3 e3@7", E: "~@6 d3@2 b2 ~ b2@2 d3@2 b2@2",
  F: "e3@3 d3 b2@9 ~@3", G: "e3", H: "f#3@2 e3@13 ~",
  I: "[~@2 f#3@3 ~ f#3 ~ f#3 ~ f#3 ~ f#3@2 ~@2 e3 ~@15, ~@7 a3@7 ~@2]/2", J: "~@14 e3 ~", K: "f#3",
  L: "~@6 e3@2 b3@3 a3@3 g#3 ~", M: "g#3 f#3@7", N: "~@6 e3@2 c#3 ~ c#3@2 e3@2 c#3@2", O: "f#3@3 e3 c#3@11 ~",
  P: "f#3@2 ~ c#3@13, ~ e3 ~@6", Q: "g#3@2 f#3@13 ~", R: "~@2 c#4@2 b3@2 a3@2 b3 ~ b3@2 a3@2 g#3 ~",
})).s("gm_electric_guitar_jazz").gain(0.33)

// chords · synth strings 1 · "Chords (syn strings)"
const synth_strings_1 = note(`<
  ~@5 A B C B A B C B D@2 E@2 D@2 E@2 D@2 B C B C A B C B A B C B D@2 E@2 D@2 E@2 D@2 B C B F@2 A B C B A B C B C B D@2
  C B G@2 C B H@2 A B C B A B C B I J K J I J B J I J B J I J B J I L B J I J B J I J B J I J M J I J B J I J B J I J B
  J I J B N ~
>`.pickRestart({
  A: "[e3,g3,b3]", B: "[d3,f#3,a3]", C: "[c3,e3,g3]", D: "[e3,g3,b3]/2", E: "[e3,a3,c4]/2", F: "[c3,e3,g3]/2",
  G: "[[g3,b3], e3@7 ~]/2", H: "[c3,e3,g3,b3]/2", I: "[f#3,a3,c#4]", J: "[e3,g#3,b3]", K: "[f#3,a3], d3@3 ~",
  L: "[g#3,b3], e3@3 ~", M: "[d3,f#3,a3]@3 ~", N: "[g#3,b3]",
})).s("gm_synth_strings_1").gain(0.29)

// bass · electric bass finger · "Fingered bass"
const bass = note(`<
  ~@5 A B C B A B C B A@2 D@2 A@2 D@2 A@2 B C B C A B C B A B C B A@2 D@2 A@2 D@2 A@2 B C B C@2 A B C B A B C B C B A@2
  C B A@2 C B C@2 A B C B A B C B E A B A E A B A E A B A E A B A E A B A E A B A E A B A E A B A E A B A E A B A E A B
  A ~@5
>`.pickRestart({
  A: "e1@2 e1!3 ~ e1 ~@2 e1!2 ~ e1@2 ~@2", B: "d1@2 d1!3 ~ d1 ~@2 d1!2 ~ d1@2 ~@2",
  C: "c1@2 c1!3 ~ c1 ~@2 c1!2 ~ c1@2 ~@2", D: "a1@2 a1!3 ~ a1 ~@2 a1!2 ~ a1@2 ~@2",
  E: "f#1@2 f#1!3 ~ f#1 ~@2 f#1!2 ~ f#1@2 ~@2",
})).s("gm_electric_bass_finger").gain(0.44)

// bass · electric bass finger · "Fingered bass" · soft notes
const bass_soft = note(`<
  ~
  [e3 d3@2 b2 e3@2 d3@2 b2@2 d3@2 b2@2 d3@2]!4
  ~@117
  [f#1@2 f#1!3 ~ f#1 ~@2 f#1!2 ~ f#1@2 ~@2]
  [e1@2 e1!3 ~ e1 ~@2 e1!2 ~ e1@2 ~@2]
  [d1@2 d1!3 ~ d1 ~@2 d1!2 ~ d1@2 ~@2]
  [e1@2 e1!3 ~ e1 ~@2 e1!2 ~ e1@2 ~@2]
  ~
>`).s("gm_electric_bass_finger").gain(0.24)

// chords · overdriven guitar · "Driven guitar"
const overdriven_guitar = note(`<
  ~@5 A B C B A B C B D@2 ~@8 B C B A@2 B C B A B C B D@2 ~@8 B C B D@2 A B C B A B C B E ~@19 F G B G F G B H@2 G B G F
  G B H@2 G B G F G B H@2 G B G F G B H@2 G B G F G B H@2 G B I ~@5
>`.pickRestart({
  A: "[e3,g3,b3]", B: "[d3,f#3,a3]", C: "[c3,e3,g3]", D: "[e3,g3,b3]/2", E: "[c3,e3,g3]@3 ~", F: "[f#3,a3,c#4]",
  G: "[e3,g#3,b3]", H: "[~ [f#3,a3,c#4], [e3,g#3,b3]]/2", I: "[g#3,b3]",
})).s("gm_overdriven_guitar").gain(0.26)

// chords · overdriven guitar · "Driven guitar" · soft notes
const overdriven_guitar_soft = note("<~@121 A B C D E@2>".pickRestart({
  A: "e3", B: "[f#3,a3,c#4]", C: "[e3,g#3,b3]", D: "[d3,f#3,a3]", E: "[e3,g#3,b3]/2",
})).s("gm_overdriven_guitar").gain(0.13)

// other · piano
const piano_2 = note(`<
  ~@4 A B ~@6 A B ~@16 A B ~@2 A B ~@17 A B ~@26 C D ~@2 C D ~@2 C D ~@2 C D ~@6 C D ~@6 C D ~@2 C D ~@12
>`.pickRestart({
  A: "~@2 [b1,b2] [d2,d3]", B: "[e2,e3]@9 ~@7", C: "~@2 [c#2,c#3] [e2,e3]", D: "[f#2,f#3]@9 ~@7",
})).s("gm_piano").gain(0.34)

// other · alto sax · "Saxophone"
const alto_sax = note("<~@57 A B@2 C@2 D@2 E@3 F G@2 ~@57>".pickRestart({
  A: "~@7 f#4", B: "[e4@7 b4]/2", C: "[e4@29 ~ d5@2, ~@29 b4@2 ~]/2", D: "[e5@30 d5 b4]/2",
  E: "[a4@4 d5@3 ~@31 g5 f#5 e5 f#5 g5@6, ~@7 b4@35 ~@6]/3", F: "a5@13 ~ a5@2, ~@13 g5@2 ~", G: "b5/2",
})).s("gm_alto_sax").gain(0.32)

// other · pad new age · "Fantasia"
const pad_new_age = note("<~@40 [e4 f#4 g4 d5] [b4@11 ~@5] ~@23 [e4 f#4 g4 d5] [b4@11 ~@5] ~@60>")
  .s("gm_pad_new_age").gain(0.29)

// drums · kick
const kick = s("bd").struct(`<
  ~@5 A@9 B A@7 C A@3 ~ A@9 C A@7 C A@3 ~@2 A@3 B A@14 B ~ A@7 B A@3 B A@7 B A@11 B A@25
>`.pickRestart({
  A: "x!2", B: "x", C: "x ~@6 x ~@8",
})).gain(0.29)

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

// drums · low tom
const low_tom = s("lt").struct("<~@8 A ~@30 B ~@8 A C ~@28 A ~@31 A ~@16>".pickRestart({
  A: "~@8 x!7 ~", B: "~@6 x!2 ~ x!2 ~ x ~@3", C: "~@6 x!2 ~ x!2 ~ x ~ x ~",
})).gain(0.29)

// drums · hihat
const hihat = s("hh").struct(`<
  ~
  [x!16]!12
  [~@6 x!10]
  [x!16]!110
  [x!2 ~ x!7 ~ x!5]
  [x!2 ~@2 x!2 ~ x ~ x ~@2 x!2 ~ x]
  ~
>`).gain(0.29)

// drums · open hat
const open_hat = s("oh").struct("<[~@7 x] ~@126>").gain(0.29)

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

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@6 A ~@3 B ~@17 A ~@3 A ~@18 A ~@3 A ~@3 A ~@4 A ~@8 A ~@3 A ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@27
>`.pickRestart({
  A: "~@8 x!7 ~", B: "~@8 x ~ x ~ x!3 ~",
})).gain(0.24)

// drums · triangle
const triangle = s("triangles:35").struct("<~ [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!124 [~@4 x!3 ~] ~>").gain(2.12)

stack(
  piano, electric_guitar_jazz, synth_strings_1, bass, bass_soft, overdriven_guitar, overdriven_guitar_soft, piano_2,
  alto_sax, pad_new_age, kick, snare, low_tom, hihat, open_hat, crash, tambourine, triangle
)

More by Roxette