Strudelify

Chances

Roxette

KeyA♭ majorTempo118 bpm
0:00/0:00
// Chances — Roxette
// 118 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 137 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(118/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 · synth strings 2
const synth_strings_2 = note(`<
  ~@8 A B C D A B C D E F G H E F G H I J K L I J K M ~ E L G N I O G N O G M P Q R E F G H E F G H I J K L I J K M ~ E
  L G N I O G N O G M P Q R A B C D A B C D A B C D I J K M ~ E L G N I O G N E L G N I O G N O G S@8 A B C D T@4 ~@8
>`.pickRestart({
  A: "[c3,f3]@13 ~@3", B: "[bb2,eb3]@13 ~@3", C: "[g2,c3]@13 ~@3", D: "[ab2,db3]@13 ~@3", E: "[ab3,c4]@13 ~@3",
  F: "bb3@13 ~@3", G: "[c4,eb4]@13 ~@3", H: "[db4,f4]@13 ~@3", I: "c4@13 ~@3", J: "[bb3,eb4]@13 ~@3", K: "g3@13 ~@3",
  L: "[ab3,db4]@13 ~@3", M: "ab3@13 ~@3", N: "[eb4,g4]@5 ~ eb4@8 ~@2", O: "db4@13 ~@3", P: "[f4,ab4]@13 ~@3",
  Q: "[eb4,ab4]@13 ~@3", R: "[eb4,g4]@5 ~@3",
  S: "[~@16 f4@13 ~@19 g4@16 [c3,f3]@13 ~@3 [bb2,eb3]@13 ~@3 [g2,c3]@13 ~@3 [ab2,db3]@13 ~@3, ab3@3 ~@5, ~ ab4@2 ~@5, ~ eb4@3]/8", // F5 Eb5 C5 Db5
  T: "f4/4",
})).s("gm_synth_strings_2").gain(0.38).pan(0.4)

// bass · fretless bass
const bass = note(`<
  ~@8 A B C D A B C D A B C D A B C D A B C D A B C D ~ A D E B A D E B F G A D E B A B C D A B C D A B C D A B C D ~ A
  D E B A D E B F G A D E B ~@8 A B C D A B C D ~ A D E B A D E B A D E B A D E B F G A D E B ~@20
>`.pickRestart({
  A: "f2!8", B: "eb2!8", C: "c2!8", D: "db2!8", E: "ab2!8", F: "bb2!8", G: "c2!4 eb2!4",
})).s("gm_fretless_bass").gain(0.35).pan(0.4)

// other · overdriven guitar
const overdriven_guitar = note(`<
  A@3 B@2 A@2 B@2 A@2 B@2 A@2 C@2 ~@26 A@3 D@2 ~@30 A@3 B@2 A@2 B@2 A@2 B@2 A@2 C@2 ~@22 A@3 B@2 A@2 B@2 A@2 B@2 A@2 E
  F@4
>`.pickRestart({
  A: "c4 c4@2 c4@2 c4 eb4 c4 eb4 f4 ~@6",
  B: "[db4 db4@2 db4@2 db4 eb4 db4 eb4@2 f4@2 eb4@2 ~@2 c4 c4@2 c4@2 c4 eb4 c4 eb4 f4 ~@6, ~@7 f4@4 ~@5]/2",
  C: "[db4 db4@2 db4@2 db4 eb4 db4 eb4@2 f4@2 eb4@2 f4@8 ~@10]/2",
  D: "[c4 c4@2 c4@2 c4 eb4 c4 eb4@2 f4@2 eb4@2 f4@8 ~@10]/2", E: "db4 db4@2 db4@2 db4 eb4 db4 eb4@2 f4@2 eb4@2 f4@2",
  F: "[ab4 f4 eb4 f4@24 ~@5]/4",
})).s("gm_overdriven_guitar").gain(0.38).pan(0.2)

// chords · overdriven guitar
const overdriven_guitar_2 = note(`<
  ~@12 A B C D ~@17 E F G H I J G H J G K L M N ~@17 E F G H I J G H J G K L M N ~@17 E F G H I J G H E F G H I J G H J
  G O@4 ~@20
>`.pickRestart({
  A: "[c3,f3]@13 ~@3", B: "[bb2,eb3]@13 ~@3", C: "[g2,c3]@13 ~@3", D: "[ab2,db3]@13 ~@3", E: "[ab3,c4]@13 ~@3",
  F: "[ab3,db4]@13 ~@3", G: "[c4,eb4]@13 ~@3", H: "[eb4,g4]@5 ~ eb4@8 ~@2", I: "c4@13 ~@3", J: "db4@13 ~@3",
  K: "ab3@13 ~@3", L: "[f4,ab4]@13 ~@3", M: "[eb4,ab4]@13 ~@3", N: "[eb4,g4]@5 ~@3",
  O: "[~@16 f4@13 ~@19 g4@16, ab3@3 ~, ~ ab4@2 ~, ~ eb4]/4",
})).s("gm_overdriven_guitar").gain(0.31).pan(0.7)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@15 A ~@7 B ~@8 C ~@13 A ~@7 B ~@8 C ~@13 A ~@3 A ~@3 A ~@3 A ~@4 C ~@21 A ~@20
>`.pickRestart({
  A: "~@15 x", B: "~@12 x!2 ~@2", C: "~@13 x ~@2",
})).gain(0.72)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@32 A ~@7 B ~@22 A ~@7 B ~@22 A ~@7 B ~@7 B ~@26>".pickRestart({
  A: "~@7 x", B: "~@15 x",
})).gain(0.48)

// drums · hihat
const hihat = s("hh").struct("<~@4 A@28 ~ A@30 ~ A@14 ~@4 A@12 ~ A@34 ~@8>".pickRestart({
  A: "x!16",
})).gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@15 A ~@7 B ~@8 C ~@13 A ~@7 B ~@8 C ~@13 A ~@3 A ~@3 A ~@3 A ~@4 C ~@21 A ~@20
>`.pickRestart({
  A: "~@13 x ~@2", B: "~@11 x ~@4", C: "~@5 x ~@2",
})).gain(0.72)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@32 A ~@7 B ~@22 A ~@7 B ~@22 A ~@7 B ~@7 B ~@26>".pickRestart({
  A: "~@11 x ~@4", B: "~@13 x ~@2",
})).gain(0.48)

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

stack(
  synth_strings_2, bass, overdriven_guitar, overdriven_guitar_2, kick, snare, low_tom, low_tom_soft, hihat, mid_tom,
  mid_tom_soft, crash
)

More by Roxette