Strudelify
Rio cover art

1982 · Rio

Rio

Duran Duran

KeyE majorTempo131 bpm
0:00/0:00
// Rio — Duran Duran
// 131 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 "SLAP BASS" slap bass 1 (copy of ch 2 "Track 1" fretless bass)
// note: Full arrangement: all 166 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(131/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, A@4 for four bars: edit a riff to change every repeat.

// bass · fretless bass · "Track 1"
const bass = note(`<
  ~ A B C D A B C D A B C D A B C D A B C D A B C D E@2 A F G H A F G H A F G H A F G H A B C D A B C D A B C D A B C D
  A B C D E@2 A F G H A F G H A F G H A F G H I@8 J@8 K L M N K L M N K L M N K L O P A B C D A B C D A B C D A B C D
  E@2 A F G H A F G H A F G H A F G H A F G H A F G H A F G H A F G H Q@2 ~
>`.pickRestart({
  A: "e2@2 ~ e2 b2@2 e3@4 b2@4 e2@2", B: "c2@2 ~ c2 g2@2 c3@4 g2@4 c2@2", C: "a1@2 ~ a1 e2@2 a2@4 e2@4 a1@2",
  D: "c2@2 ~ c2 g2@2 c3@4 c2@4 g2@2", E: "[e2@15 ~]/2", F: "b1@2 ~ b1 f#2@2 b2@4 f#2@3 ~ b1@2",
  G: "d2@2 ~ d2 a2@2 d3@4 a2@3 ~ d2@2", H: "a1@2 ~@4 a1@2 a2 ~ a1@2 a2 ~ a1 ~",
  I: "[c#2@14 a1@11 ~ e2@2 ~@2 f#2@11 ~ e2@2 ~@2 a1@11 ~ b1@2 ~@2 c#2@11 ~ c#2@2 ~@2 a1@12 e2@2 ~@2 f#2@11 ~ e2@2 ~@2 a1@11 ~ b1@2 ~@2 c#2@2]/8",
  J: "[~@10 e2@2 ~@2 f#2@11 ~ e2@2 ~@2 a1@11 ~ b1@2 ~@2 c#2@11 ~ c#2@2 ~@2 c#2@11 ~ e2@2 ~@2 f#2@11 ~ e2@2 ~@2 a1@11 ~ b1 ~@3 c#2@8 ~@2 c#2@2 ~@2 c#2@2 ~@2]/8",
  K: "c#2@2 ~ c#2 c#3@2 b2@4 g#2@4 e2@2", L: "f#1@2 ~ f#1 c#2@2 e2@4 f#2@4 e2@2", M: "a1@2 ~ a1 c#2@2 e2@4 f#2@4 g#2@2",
  N: "c#2@4 ~@2 c#2@2 e2@3 f#2@3 g#2@2", O: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~",
  P: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2@2 ~@2", Q: "e2/2",
})).s("gm_fretless_bass").gain(0.4)

// chords · overdriven guitar · "DISTORTED"
const overdriven_guitar = note(`<
  ~ A B C B A B C B A B C B A B C B A B C B A B C B ~@2 D E F G H E F I H J F K H J F L A B C B A B C B A B C B A B C B
  A B C B ~@2 D E F G H E F I H J F K H J F L ~@50 D E F G H E F I H J F K H J F L D E F G H E F I H J F K H J F L ~@3
>`.pickRestart({
  A: "~@3 [e4,g4,b4]@5", B: "~@6 [e4,g4,c5]@9 ~", C: "~@3 [e4,a4,c#5]@5", D: "e5", E: "b4", F: "d5",
  G: "a4@4 c#5 ~ a4@2, ~@11 b4@2 ~@3", H: "e4@3 e5", I: "a4@4 c#5 b4 a4@2", J: "d#5", K: "c#5@4 c#5 b4 a4@2",
  L: "c#5@7 ~",
})).s("gm_overdriven_guitar").gain(0.18).pan(0.7)

// chords · synth brass 1 · "BRASS SYN"
const synth_brass_1 = note(`<
  ~ A B C B A B C B A B C B A B C B A B C B A B C B ~@18 A B C B A B C B A B C B A B C B A B C B ~@103
>`.pickRestart({
  A: "[e4,b4,e5]!2 ~@14", B: "[g4,c5]!2 ~@14", C: "[e4,a4,e5]!2 ~@14",
})).s("gm_synth_brass_1").gain(0.25).pan(0.7)

// chords · synth strings 1 · "STRING SY"
const synth_strings_1 = note(`<
  ~ A B C B A B C B A B C B A B C B A B C B A B C B ~@2 D E F G D E F G D E F G D E F G A B C B A B C B A B C B A B C B
  A B C B ~@2 D E F G D E F G D E F G D E F G H I@7 J@8 K L M K@2 L M N@2 L M O@3 P Q R S P S R S P S R S P S R S P S
  ~@2 D E F G D E F G D E F G D E F G D E F G D E F G D E F G D E F G T@2 ~
>`.pickRestart({
  A: "[g4,b4,e5]@15 ~", B: "[g4,c5,e5]@15 ~", C: "[a4,c#5,e5]@15 ~", D: "[g#4,b4,e5,g#5,b5,e6]@15 ~",
  E: "[b4,d#5,f#5,b5,d#6]@15 ~", F: "[a4,d5,f#5,a5,d6]@15 ~", G: "[a4,c#5,e5,a5,c#6]@15 ~",
  H: "[g#3,c#4,e4]@13 ~ [a3,c#4,e4]@2", // C#m A
  I: "[~@14 [a#3,c#4,f#4]@15 ~ [a3,c#4,e4]@15 ~ [g#3,c#4,e4]@15 ~ [a3,c#4,e4]@15 ~ [a#3,c#4,f#4]@15 ~ [a3,c#4,e4]@15 ~ [g#3,c#4,e4]@2]/7", // F# A C#m A F# A C#m
  J: "[~@14 [a#3,c#4,f#4]@15 ~ [a3,c#4,f#4]@16 [g#3,c#4,e4]@31 ~ [a#3,c#4,f#4]@15 ~ [a3,c#4,f#4]@16 [g#3,c#4,e4]@17 ~]/8", // F# F#m C#m F# F#m C#m
  K: "[g#3,c#4,e4,g#4,c#5,e5]@15 ~", L: "[a#3,c#4,f#4,a#4,c#5,f#5]@15 ~", M: "[a3,c#4,f#4,a4,c#5,f#5]@15 ~",
  N: "[g#3,c#4,e4,g#4,c#5,e5]/2", O: "[[g#3,c#4,e4,g#4,c#5,e5]@31 ~ [f#4,a#4,c#5,f#5]@14 c#4 ~, ~@31 a#3@15 ~@2]/3",
  P: "[a3,c#4,e4,a4,c#5,e5]@15 ~", Q: "[e4,b4,e5]", R: "[g3,b3,e4,g4,b4,e5]@15 ~", S: "[g3,c4,e4,g4,c5,e5]@15 ~",
  T: "[e3,b3,e4,b4]/2", // E5
})).s("gm_synth_strings_1").gain(0.14)

// other · alto sax · "SAXOPHONE"
const alto_sax = note("<~@88 A B@2 C@2 D@2 E F G H I J G K L M N O P@2 Q R S T@5 ~@49>".pickRestart({
  A: "~@10 c#4 ~@2 e4@2 ~", B: "[f#4@25 ~ e4@2 ~ g#4@3]/2", C: "[f#4@13 c#4@11 ~@2 g#4@2 ~ b4@2 ~]/2",
  D: "[d#5@14 e5@3 c#5@14 ~]/2", E: "c#5@13 a4 b4@2", F: "g#4@13 ~@3", G: "~@2 d#5@3 e5 ~@2 d#5@3 c#5@2 b4 ~@2",
  H: "c#5@6 g#4 f#4 e4 c#4 ~@6", I: "~@2 d#5@3 e5 ~@2 f#5@6 e5 d#5", J: "c#5@15 ~", K: "c#5@10 f#4@3 ~@3",
  L: "f#4@2 e4 ~@7 f#4@4 e4 ~", M: "f#4@3 e4 ~@2 c#4@3 ~ b4!2 c#5!2 b4!2", N: "c#5 ~ e4@4 ~@4 b4!2 [c#5,d5] c#5 b4!2",
  O: "c#5!2 b4 e5@3 ~@6 c#5!3 b4",
  P: "[c#5@6 g#4 f#4 e4@6 f#4@4 e4 ~ c#4 e4 c#4 b3 c#4 b3 g#3 b3 g#3 [f3,f#3] g#3 f#3]/2", // F#maj7
  Q: "c#3@2 ~@8 c#4@2 ~ c#4@2 ~", R: "e4@3 c#4@2 c#4@2 ~ g#4@3 e4@2 e4@2 ~", S: "b4@3 g#4@2 ~ g#4 ~ c#5@3 b4@2 ~ b4@2",
  T: "[e5@67 ~@13]/5",
})).s("gm_alto_sax").gain(0.6).pan(0.4)

// other · electric guitar clean · "STRAT GUI"
const electric_guitar_clean = note("<~@97 A@2 B A@2 B A@9 ~@9 C@4 D@2 E@2 ~@37>".pickRestart({
  A: "[c#4,c#5]@2 ~ [c#4,c#5] ~@2 [c#4,c#5] ~@3 [c#4,c#5] ~@2 [c#4,c#5] ~@2", // C#
  B: "[c#4,c#5]@2 ~ [c#4,c#5] ~@2 [c#4,c#5] ~@3 [c#4,c#5] ~ c#4 [c#4,c#5] ~@2", // C#
  C: "[e4,b4,e5]@2 ~ [e4,b4,e5] ~@2 [e4,b4,e5] ~@2 [e4,b4,e5] ~@2 [e4,b4,e5] ~ e4 ~", // E5
  D: "[e4,b4,e5]@2 ~ [e4,b4,e5] ~@2 [e4,b4,e5] ~@2 [e4,b4,e5] ~@3 [e4,b4,e5] ~@2", // E5
  E: "[e4,b4,e5]@2 ~ [e4,b4,e5] ~@2 [e4,b4,e5] ~@3 [e4,b4,e5] ~@2 [e4,b4,e5] ~@2", // E5
})).s("gm_electric_guitar_clean").gain(0.16).pan(0.7)

// chords · distortion guitar · "DISTORTED"
const distortion_guitar = note(`<
  ~ A B C B A B C B A B C B A B C B A B C B A B C B D@2 E F G H E F G H E F G H E F G H A B C B A B C B A B C B A B C B
  A B C B D@2 E F G H E F G H E F G H E F G H ~@48 D@2 E F G H E F G H E F G H E F G H E F G H E F G H E F G H E F G H
  I@2 ~
>`.pickRestart({
  A: "~@6 [e3,b3]@9 ~", B: "~@3 [c3,g3]@5", C: "~@3 [a2,e3]@5", D: "[[e3,b3]@31 ~]/2", E: "[e3,b3]", F: "[b2,f#3]",
  G: "[d3,a3]", H: "[a2,e3]@15 ~", I: "[e2,b2]/2",
})).s("gm_distortion_guitar").gain(0.19).pan(0.3)

// drums · kick
const kick = s("bd").struct("<~ A@25 ~ B@16 A@21 ~ B@16 C D@15 A@16 D@16 A ~ B@16 D@16 A ~@2>".pickRestart({
  A: "x", B: "x ~@2 x ~ x ~@2", C: "x ~@4 x ~ x", D: "~@5 x ~ x",
})).gain(0.5)

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

// drums · low tom
const low_tom = s("lt").struct("<[~@14 x!2] ~@111 [~ x!6 ~] ~@53>").gain(0.45)

// drums · hihat
const hihat = s("hh").struct(`<
  A B@24 C D B@36 C D B@16 E F@15 B@15 ~ G H@7 G H@3 G H@3 C D B@16 G H@3 G H@3 G H@3 G H@3 ~@3
>`.pickRestart({
  A: "x!4", B: "~@2 x ~ x ~ x ~ x ~ x ~ x ~ x!2", C: "x!7 ~ x!8", D: "x!9 ~ x!6", E: "~@2 x ~ x!9 ~ x!2",
  F: "x!3 ~ x!9 ~ x!2", G: "~ x!7", H: "x!8",
})).gain(0.4)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~ A@24 B C A@36 B C A@16 D E@15 A@15 ~@17 B C A@16 ~@19>".pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2", B: "~@7 x ~@8", C: "~@9 x ~@6", D: "~ x ~ x ~@9 x ~@2", E: "~@3 x ~@9 x ~@2",
})).gain(0.15)

// drums · mid tom
const mid_tom = s("mt").struct("<[~@14 x!2] ~@111 [~ x!6 ~] ~@53>").gain(0.45)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A@24 ~@2 B@7 A B@7 A@21 ~@2 B@7 A B@7 A C@16 A@15 ~ D E@7 D E@3 D E@3 ~@2 B@7 A B@7 F D E@3 D E@3 D E@3 D E@3 ~@3
>`.pickRestart({
  A: "x", B: "x ~@4 x ~@2", C: "~@5 x ~ x", D: "~ x!3", E: "x!4", F: "x ~@4 x ~ x",
})).gain(0.4)

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

stack(
  bass, overdriven_guitar, synth_brass_1, synth_strings_1, alto_sax, electric_guitar_clean, distortion_guitar, kick,
  snare, low_tom, hihat, hihat_soft, mid_tom, open_hat, crash
)

More by Duran Duran