Strudelify
Joyride cover art

Joyride 30th Anniversary Edition

Joyride

Roxette

KeyA majorTempo108 bpm
0:00/0:00
// Joyride — Roxette
// 108 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 4 "A.PIANO 1" named as a piano, played on piano (its acoustic guitar nylon patch is not one)
// note: Full arrangement: all 106 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(108/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 · pad new age · "FANTASIA"
const pad_new_age = note(`<
  A B C D@2 ~@2 E F G H I J@2 ~ K L M N@8 O@2 P@2 Q R S T@2 ~ U V W X@6 Y@6 Z@5 AA@4 AB@8 ~@7 AC AD AE AF AG AH AI@5
  AJ@6 AK@6 ~@8
>`.pickRestart({
  A: "~@14 [a4,a6] ~", B: "[a4,a6]@3 ~@3 [a4,a6] ~ [g4,g6]@2 ~@4 [g4,g6] ~",
  C: "[f#4,f#6] ~ [d4,d6]@4 [e4,e6]@2 ~@2 [a3,a5] ~ [a3,a5] ~ [a3,a5]!2", D: "[[b3,b5]@2 [c#4,c#6]@17 ~@13]/2",
  E: "~@2 [a3,a5]!3 ~ [a3,a5] ~ [b3,b5]@2 [c#4,c#6]@2 ~@4", F: "~@2 [a3,a5]!3 ~ [a3,a5] ~ [f#3,f#5]@2 [e3,e5]@2 ~@4",
  G: "~@2 [a3,a5]!3 ~ [a3,a5]@2 [b3,b5]@2 [c#4,c#6]@2 ~@4", // A B C#
  H: "~@2 [a3,a5] [f#3,f#5] [a3,a5] ~ [a3,a5]@2 [f#3,f#5]@2 [e3,e5] ~@5", // A F# A F# E
  I: "~@2 [a3,a5] ~ [a3,a5]!4 [b3,b5]@2 [a3,a5]@2 ~@4", // A B A
  J: "[~ [f#3,f#5] [a3,a5] [f#3,f#5] [a3,a5]@2 [f#3,f#5]@2 [a3,a5]@2 [f#3,f#5]@2 [d4,d6]@2 [c#4,c#6]@6 ~@12]/2", // F# A F# A F# A F# D …
  K: "~ [e3,e5] [a3,a5]!3 ~ [a3,a5]@2 [b3,b5]@2 [c#4,c#6]@2 ~@4", // E A B C#
  L: "~ [f#3,f#5] [a3,a5] [f#3,f#5] [a3,a5] ~ [a3,a5]@2 [f#3,f#5]@2 [e3,e5]@2 ~@4", // F# A F# A F# E
  M: "~@2 [a3,a5]!6 [b3,b5]@2 [c#4,c#6]@2 ~@4", // A B C#
  N: "[~@2 [a4,a6] [f#3,f#4,f#5,f#6] [a3,a5] [a3,a4,a5,a6]!3 [f#3,f#5]@2 [e4,e6]@3 ~@5 [a3,a5]!3 ~ [a3,a5]!2 [b3,b5] ~ [a3,a5]@4 ~@3 [a3,a5]!2 [f#3,f#5] [a3,a5]!4 [d4,d6]@3 ~ [e4,e6]@2 [c#4,c#6]@6 ~@22 [c#4,c#6] ~ [c#4,c#6] ~ [e4,e6]@8 ~@6 [c#4,c#6]@2 [d4,d6]@8 [a3,a5]@3 ~ [a3,a5]@2 [d4,d6]@2 [c#4,c#6]@7 ~@11, ~ [a3,a5] ~@2 [f#4,f#6]@60, ~@10 [e3,e5] ~@117]/8", // A F# A F# E A B A …
  O: "[~@10 [c#4,c#6] ~ [c#4,c#6]@2 [e4,e6]@6 ~@6 [b3,b5]@3 ~ [c#4,c#6]@2]/2", // C# E B C#
  P: "[[d4,d6]@2 [a3,a5] ~ [a3,a5]@17 ~@5 [a3,a4,a5,a6] ~ [a3,a5]@2 [g4,g6]@2, ~@7 [a4,a6], ~@30 [g3,g5] ~]/2", // D A G A G
  Q: "[a3,a5]@2 ~@4 [a3,a4,a5,a6] ~ [g3,g5]@3 ~@3 [g3,g5]@2, [a4,a6] ~@13 [g4,g6] ~", // A G A G
  R: "[f#3,f#5]@2 [e3,e5]@6 ~ [a3,a5]!2 ~ [a3,a5] ~ [a3,a5]!2, [f#4,f#6] ~ [e4,e6] ~@13", // F# E A F# E
  S: "[d4,d6]@2 [e4,e6]@9 ~ [e4,e6]@2 [a3,a5]@2, [b3,b5]@12 [b3,b5] ~@3, ~@2 [c#4,c#6] ~@13", // D E A B C#
  T: "[~@8 [a3,a5]@3 ~ [a3,a5]@2 [a3,a5]@4 [e3,e5]@10 ~@4, ~@18 [a3,a5] ~@13]/2", // A E A
  U: "~@2 [a2,a3,a4,a5]!2 [a2,a3,a4,a5]@2 [a2,a3,a4,a5] ~ [b2,b4]@2 [c#3,c#5]@3 ~@3, ~@7 [a2,a4]@9", // A B C# A
  V: "~@2 [a3,a5] [f#2,f#3,f#4,f#5] [a2,a4]@2 [a2,a4] ~ [f#2,f#4]@2 [e2,e4]@6, ~@2 [a2,a4]@2 [a3,a5] ~ [a3,a5]@10, ~@7 [a2,a4]@9, ~@10 [e3,e5] ~@5", // A F# A F# E A E
  W: "~@2 [a2,a4] [a2,a3,a4,a5] [a2,c#4,a4,c#6]@2 [a2,a3,c#4,a4,a5,c#6] [a3,a5] [b2,b4]@2 [e4,e6]@3 ~@3, ~@7 [a2,a4]@9, ~ [b3,b5], ~@8 [d4,d6] ~ [c#3,c#5] ~@5", // A B E A B D C#
  X: "[~@3 [f#2,f#3,f#4,f#5] [a2,a3,a4,a5]!3 [a3,a5] [f#2,f#4]@2 [e2,e3,e4,e5] ~@7 [a3,a5]@2 ~ [a3,a5]@2 ~ [a3,a5]@2 [a3,a5]@2 [b3,b5]@2 [a3,a5] ~@3 [f#3,f#5] [a3,a5]@2 [f#3,f#5] [a3,a5]@2 [d4,d6] ~ [d4,d6] [d4,d6]@3 [e4,e6]@2 [c#4,c#6]@4 ~@6 [e4,e6]@2 [c#4,c#6] [b3,b5] [a3,a5]@2 ~@10 [c#4,c#6] ~ [c#4,c#6]@2 [e4,e6]@4 ~@10 [a3,a5] ~ [a3,a5]@2, ~@2 [a2,a4]@2 ~@3 [a2,a4]@89, ~@8 [f#3,f#5]@26 ~@60 [d4,d6] ~]/6", // F# A F# E A B A F# …
  Y: "[~@4 [f#3,f#5]@2 [a3,a5]@4 [a3,a5]@4 [a3,a5]@2 [c#4,c#6]@6 ~@20 [c#4,c#6] ~ [c#4,c#6]@2 [b3,b5]@6 ~@12 [d4,d6] ~@3 [f#4,f#6] ~@3 [e4,e6]@4 [d4,d6] ~@3 [d4,d6] ~@3 [a3,a5] ~@5 [a3,a5,a6] ~ a6 ~ [g3,g4,g5,g6] ~, ~@4 [a3,a5] ~ [f#3,f#5]@90, ~@10 [d3,d5] ~@5 [a3,a5] ~@73 a4@2 [a3,a4,a5]@4]/6", // F# A C# B D F# E D …
  Z: "[[a3,a5]@2 ~@4 [a3,a5,a6] ~ [g3,g5]@3 ~@3 [g3,g5]@2 [f#3,f#5]@2 [e3,e5]@6 ~ [a3,a5]!2 ~ [a3,a5] ~ [a3,a5]!2 [d4,d6]@2 [e4,e6]@9 ~ [e4,e6]@2 [a3,a5]@2 ~@8 [a3,a5]@3 ~ [a3,a5]@2 [a3,a5]@4 [e3,e5]@7 ~ [a3,a4,a5]@2 [a3,a5]@2 [g3,g5]@2, a6 ~@5 a4@68 a6 ~ a6 ~@3, ~@14 [g4,g6] ~ [f#4,f#6] ~ [e4,e6] ~@13 [b3,b5]@12 [b3,b5] ~@21 [a3,a5] ~@13, ~@34 [c#4,c#6] ~@41 a4@4]/5", // A G F# E A D E A …
  AA: "[[a3,a5]@2 ~@4 [a3,a5,a6] ~ [g3,g5]@3 ~@3 [g3,g5]@2 [f#3,f#5]@2 [e3,e5]@6 ~ [a3,a5]!2 ~ [a3,a5] ~ [a3,a5]!2 [d4,d6]@2 [e4,e6]@8 [e4,e6]@2 [c#4,e4,c#6,e6] [b3,b5] [a3,a5]@2 ~@8 [f#4,f#6]@4 [a3,a5]@2 [e4,e6]@2, a6 ~@5 a4@58, ~@14 [g4,g6] ~ [f#4,f#6] ~ [e4,e6] ~@13 [b3,b5]@13 ~@11 [a3,a5] ~@5 [a3,a5] ~, ~@34 [c#4,c#6] ~@29]/4", // A G F# E A D E C#m …
  AB: "[~ [e3,e5]@5 ~@8 a4@50, ~ [a3,a5]@63, ~@2 [c#4,c#6] ~@25 a6@2 ~@98]/8", AC: "~@7 [a3,a5]",
  AD: "[d4,d6] ~ [d4,d6] ~ [d4,d6] ~ [d4,d6]@2 [e4,e6]@4 [d4,d6]@3 ~", // D E D
  AE: "[d4,d6] ~ [d4,d6] ~ [d4,d6]@2 [a3,a5]@2 [e4,e6]@4 [d4,d6]@2 [a3,a5] ~", // D A E D A
  AF: "[c#4,c#6] ~ [c#4,c#6] ~ [c#4,c#6]@2 [a3,a5] ~ [d4,d6]@4 [c#4,c#6]@3 ~", // C# A D C#
  AG: "[c5,c7] [b4,b6] a6 [f#4,f#6] [b4,b6]@2 [a4,a6]@2, ~ a4@2 ~", // C B F# B A
  AH: "a6@2 a4@3 [a4,a6] [a3,a5] [g3,g5], ~@4 a6@4 ~@2 [a3,a5] ~ a4@4, ~@12 a6 ~ [g4,g6] ~", // A G A G
  AI: "[[a3,a5]@2 ~@2 [a3,a5] ~ [a3,a5,a6] ~ [g3,g5]@3 ~ [g3,g5] ~ [g3,g5]@2 [f#3,f#5]@2 [e3,e5]@2 [f#3,f#5] ~ [e3,e5]@2 ~ [a3,a5]!2 ~ [a3,a5] ~ [a3,a5]!2 [d4,d6]@2 [e4,e6]@9 ~ [e4,e6]@2 [a3,a5]@2 ~@8 [a3,a5]@3 ~ [a3,a5]@2 [a3,a5]@4 [e3,e5]@4 ~@8 [a3,a5]@2, a6 ~@5 a4@74, ~@14 [g4,g6] ~ [f#4,f#6] ~ [e4,e6] ~@13 [b3,b5]@12 [b3,b5] ~@21 [a3,a5] ~@13, ~@34 [c#4,c#6] ~@45]/5", // A G F# E F# E A D …
  AJ: "[[a3,a5]@2 ~@4 [a3,a5,a6] ~ [g3,g5]@3 ~@3 [g3,g5]@2 [f#3,f#5]@2 [e3,e5]@6 ~ [a3,a5]!2 ~ [a3,a5] ~ [a3,a5]!2 [d4,d6]@2 [e4,e6]@9 ~ [e4,e6]@2 [a3,a5]@2 ~@8 [a3,a5]@3 ~ [a3,a5]@2 [a3,a5]@4 [e3,e5]@10 ~@14 [a3,a5]@2 [a3,a5]@2 [g3,g5]@2, a6 ~@5 a4@90, ~@14 [g4,g6] ~ [f#4,f#6] ~ [e4,e6] ~@13 [b3,b5]@12 [b3,b5] ~@21 [a3,a5] ~@29, ~@34 [c#4,c#6] ~@61]/6", // A G F# E A D E A …
  AK: "[[a3,a5]@2 ~@4 [a3,a5,a6] ~ [g3,g5]@3 ~@3 [g3,g5]@2 [f#3,f#5]@2 [e3,e5]@6 ~ [a3,a5]!2 ~ [a3,a5] ~ [a3,a5]!2 [d4,d6]@2 [e4,e6]@8 [e4,e6]@2 [c#4,e4,c#6,e6] [b3,b5] [a3,a5]@2 ~@8 [f#4,f#6]@4 [a3,a5]@2 [e4,e6]@4 [a3,c#4,a5,c#6] ~@21 a4@4 [a4,a6]@2 ~@2, a6 ~@5 a4@82 a6@2 ~@6, ~@14 [g4,g6] ~ [f#4,f#6] ~ [e4,e6] ~@13 [b3,b5]@13 ~@11 [a3,a5] ~@5 [a3,a5] ~@3 [e3,e5]@10 ~@20, ~@34 [c#4,c#6] ~@61]/6", // A G F# E A D E C#m …
})).s("gm_pad_new_age").gain(0.5)

// other · distortion guitar · "DISTORTION" · A5
const distortion_guitar = note("<~@37 [~@7 e2 g2 a2!2 e2 g2@2 [a2,e3]@2] ~@68>")
  .s("gm_distortion_guitar").gain(0.5).pan(0.7)

// chords · piano · "A.PIANO 1"
const piano = note("<~@36 [~@6 d4 c#4, ~@3 a3] ~ [~@6 d4 c#4, ~@3 a3] ~@67>").s("gm_piano").gain(0.5).pan(0.2)

// other · piano · "A.PIANO 2" · C#maj7
const piano_2 = note("<~@71 [~@14 b4 [c5,c#5]] [d5 ~ d5 ~ c#5 ~ c5 ~ b4@5 ~ f#4@2] [~@2 f#4 ~ g4 ~ g#4 ~ a4@7 ~] ~@32>")
  .s("gm_piano").gain(0.5).pan(0.9)

// chords · string ensemble 1 · "+ORCHESTRA"
const string_ensemble_1 = note("<~ A B ~@13 C D ~@16 E@2 ~@24 E@2 ~@27 F E@2 ~@4 E@2 ~@8>".pickRestart({
  A: "a5@3 a5 g5@3 g5", B: "f#5@2 d5@4 e5@9 ~", C: "~@2 a5 e5", D: "a4@15 ~",
  E: "~ e6 d6 c#6 ~ e6 d6 c#6, a6@7 ~ a6@7 ~", F: "~ d6 c#6 a5 ~ d6 c#6 a5, a6@7 ~ a6@7 ~",
})).s("gm_string_ensemble_1").gain(0.5).pan(0.2)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~ A B@9 C D B@6 C D B E F G B E H I J K L B C B@2 ~@4 C D B E F G B E H I J K L B C B K L B C B@2 M@2 B@2 M@2 B N O P
  Q C B R C@2 B S ~ K T B U B K T B U B@2 K T B U B@2 M@2 B@4 V@2
>`.pickRestart({
  A: "~ a1!2 ~ a1 ~ a1!3 ~ a1 ~ a1 ~ a1 ~", B: "a1 ~ a1 ~ a1 ~ a1!3 ~ a1 ~ a1 ~ a1 ~",
  C: "d2 ~ d2 ~ d2 ~ d2!3 ~ d2 ~ d2 ~ d2 ~", D: "b1 ~ b1 ~ b1 ~ b1!3 ~ b1 ~ b1 ~ b1 ~",
  E: "a1 ~ a1 ~ a1 ~ a1!3 ~ a1 ~ a1 ~ g#1@2", F: "e1 ~ e1 ~ e1 ~ e1!3 ~ e1 ~ e1 ~ e1 ~",
  G: "d1 ~ d1 ~ d1 ~ d1!2 d1@2 f#1@2 g1@2 g#1@2", H: "e1 ~ e1 ~ e1 ~ e1!3 ~ e1 ~ e1 ~ a1 ~",
  I: "d2 ~ d2 ~ d2 ~ d2!3 ~ d2 ~ d2 ~ a1 ~", J: "d2 ~ d2 ~ d2 ~ d2!3 ~ d2 ~ d2 ~ c#2@2",
  K: "a1 ~ a1 ~ a1 ~ a1 ~ g1 ~ g1 ~ g1 ~ g1 ~", L: "d2 ~ d2 ~ d2 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~",
  M: "d2 ~ d2 ~ f#1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~", N: "a1 ~ a1 ~ a1 ~ a1!3 ~ e1 ~ g1 ~ a1 ~",
  O: "a1 ~ a1 ~ a1 ~ a1!3 ~ a1 ~ a1 ~ e1 ~", P: "g1 ~ a1 ~ a1 ~ a1!3 ~ a1 ~ a1 ~ a1 ~",
  Q: "g1 ~ g1 ~ g1 ~ g1!3 ~ g1 ~ g1 ~ g1 ~", R: "a1 ~ a1 ~ b1 ~ b1!2 c2 ~ c2 ~ c#2 ~ c#2 ~", S: "a1 ~@7",
  T: "d1 ~ d1 ~ d1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~", U: "d1 ~ d1 ~ d1 ~ d1!3 ~ d1 ~ d1 ~ d1 ~", V: "[a1@31 ~]/2",
})).s("gm_electric_bass_finger").gain(0.5)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@2 A B C B D B@7 E B@3 C B@9 ~ F B C B G B H I J K L B@3 M B@5 N O B C B@2 P B C B G B Q B C B G B M B@7 R B@2 C ~ S
  B C B@2 P B@5 E B@3 T B U B C B@2 ~@4
>`.pickRestart({
  A: "~@9 x!2 ~ x!4", B: "~ x ~ x", C: "~@4 x ~@7 x ~ x!2", D: "~@4 x ~@2 x ~ x!2 ~ x!4", E: "~@4 x ~@2 x!4 ~ x!4",
  F: "~@2 x ~ x ~ x ~ x ~ x ~ x ~ x!2", G: "~@4 x ~@7 x ~@2 x", H: "~@4 x ~@3 x!8", I: "~@4 x ~@2 x ~ x ~@2 x ~@2 x",
  J: "~@4 x ~@2 x ~ x ~@2 x ~@3", K: "~@4 x ~@2 x ~ x ~@2 x ~ x!2", L: "~@4 x ~@2 x ~ x ~ x!5", M: "~@4 x ~@7 x!4",
  N: "~@14 x!2", O: "~@2 x ~ x ~ x!2 ~ x!2 ~ x!4", P: "~@4 x ~@4 x ~@2 x ~ x!2", Q: "~@4 x ~@3 x ~@2 x ~@2 x ~",
  R: "~@4 x ~@3 x!3 ~ x!4", S: "~@8 x!3 ~ x!4", T: "~@4 x ~@4 x ~@2 x ~@2 x", U: "~@4 x ~@3 x ~@2 x ~@2 x!2",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@3
  [~@2 x!3 ~ x!2 ~@2 x!3 ~ x!2]!76
  x
  ~
  [~@2 x!3 ~ x!2 ~@2 x!3 ~ x!2]!22
  [~@2 x!3 ~ x!2 ~@2 x!3 ~@3]
  ~@2
>`).gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@3 [x!2]!76 ~@2 [x!2]!23 ~@2>").gain(0.5)

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

// drums · ride
const ride = s("rd").struct("<~@101 [~@14 x!2] ~@4>").gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<~@3 A@2 ~@25 A@6 ~@15 A@17 ~@13 A@21 ~@4>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(0.5)

stack(
  pad_new_age, distortion_guitar, piano, piano_2, string_ensemble_1, bass, kick, snare, hihat, open_hat, crash, ride,
  tambourine
)

More by Roxette