Strudelify
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: 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 I A F G H J@8 K@8 L M N O L M N P Q M N P L M R S 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 T@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: "a1@2 ~@4 a1@2 a2 ~ a1@2 a2 ~ a1@2",
  J: "[c#2@14 a1@11 ~ e2@2 ~@2 f#2@12 e2@2 ~@2 a1@12 b1@2 ~@2 c#2@11 ~ c#2@2 ~@2 a1@12 e2 ~@3 f#2@12 e2@2 ~@2 a1@11 ~ b1@2 ~@2 c#2@2]/8",
  K: "[~@10 e2@2 ~@2 f#2@11 ~ e2@2 ~@2 a1@11 ~ b1 ~@3 c#2@11 ~ c#2@2 ~@2 c#2@11 ~ e2@2 ~@2 f#2@11 ~ e2 ~@3 a1@12 b1 ~@3 c#2@8 ~@2 c#2@2 ~@2 c#2@2 ~@2]/8",
  L: "c#2@2 ~ c#2 c#3@2 b2@4 g#2@4 e2@2", M: "f#1@2 ~ f#1 c#2@2 e2@4 f#2@4 e2@2", N: "a1@2 ~ a1 c#2@2 e2@4 f#2@4 g#2@2",
  O: "c#2@5 ~ c#2@2 e2@3 f#2@3 g#2@2", P: "c#2@4 ~@2 c#2@2 e2@3 f#2@3 g#2@2", Q: "c#2 ~@2 c#2 c#3@2 b2@4 g#2@4 e2@2",
  R: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~", S: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2@2 ~@2", T: "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 D A B C D A B C D A B C D A B C D A B C D ~@2 E F G H E F G H E F G H E F G H A B C D A B C D A B C D A B C D
  A B C D ~@2 E F G H E F G H E F G H E F G H I J@8 K@7 L M N O L M N P@2 M Q R@3 S T U V W V X V W V U V W Y X V W Y
  ~@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 Z@2 ~
>`.pickRestart({
  A: "[g4,b4,e5]@15 ~", B: "[g4,c5,e5]@15 ~", C: "[a4,c#5,e5]@15 ~", D: "[g4,c5,e5]", E: "[g#4,b4,e5,g#5,b5,e6]@15 ~",
  F: "[b4,d#5,f#5,b5,d#6]@15 ~", G: "[a4,d5,f#5,a5,d6]@15 ~", H: "[a4,c#5,e5,a5,c#6]@15 ~",
  I: "[g#3,c#4,e4]@13 ~ [a3,c#4,e4]@2", // C#m A
  J: "[~@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]@15 ~ [a#3,c#4,f#4]@2]/8", // F# A C#m A F# A C#m F#
  K: "[~@14 [a3,c#4,f#4]@16 [g#3,c#4,e4]@31 ~ [a#3,c#4,f#4]@15 ~ [a3,c#4,f#4]@15 ~ [g#3,c#4,e4]@17 ~]/7", // F#m C#m F# F#m C#m
  L: "[g#3,c#4,e4,g#4,c#5,e5]@15 ~", M: "[a#3,c#4,f#4,a#4,c#5,f#5]@15 ~", N: "[a3,c#4,f#4,a4,c#5,f#5]@15 ~",
  O: "[g#3,c#4,e4,g#4,c#5,e5]", P: "[g#3,c#4,e4,g#4,c#5,e5]/2", Q: "[a3,c#4,f#4,a4,c#5,f#5]",
  R: "[[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", S: "[a3,c#4,e4,a4,c#5,e5]",
  T: "[e4,b4,e5]", U: "[g3,b3,e4,g4,b4,e5]", V: "[g3,c4,e4,g4,c5,e5]@15 ~", W: "[a3,c#4,e4,a4,c#5,e5]@15 ~",
  X: "[g3,b3,e4,g4,b4,e5]@15 ~", Y: "[g3,c4,e4,g4,c5,e5]", Z: "[e3,b3,e4,b4]/2",
})).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 K L M N O P Q@2 R S T U@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: "~@2 d#5@3 e5@2 ~ d#5@2 ~ c#5@2 b4 ~@2", L: "c#5@10 f#4@3 ~@3", M: "f#4@2 e4 ~@7 f#4@4 e4 ~",
  N: "f#4@3 e4 ~@2 c#4@3 ~ b4!2 c#5!2 b4!2", O: "c#5 ~ e4@4 ~@4 b4!2 [c#5,d5] c#5 b4!2",
  P: "c#5!2 b4 e5@3 ~@6 c#5!3 b4",
  Q: "[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
  R: "c#3@2 ~@8 c#4@2 ~ c#4@2 ~", S: "e4@3 c#4@2 c#4@2 ~ g#4@3 e4@2 e4@2 ~", T: "b4@3 g#4@2 ~ g#4 ~ c#5@3 b4@2 ~ b4@2",
  U: "[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 C D E A F A@3 G H ~@9 I J@3 K@2 L@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: "[c#4,c#5]@3 [c#4,c#5] ~@2 [c#4,c#5] ~@3 [c#4,c#5] ~ c#4 [c#4,c#5] ~@2", // C#
  D: "[c#4,c#5]@2 ~ [c#4,c#5] ~@2 [c#4,c#5] ~@2 c#4 c#5 ~@2 c#4 c#5 ~", // C#
  E: "[c#4,c#5]@2 ~ [c#4,c#5] ~@2 [c#4,c#5] ~@3 [c#4,c#5] ~@2 c#4 c#5 ~", // C#
  F: "[c#4,c#5]@2 ~ [c#4,c#5] ~@2 [c#4,c#5] ~@2 c#4 c#5 ~@2 [c#4,c#5] ~@2", // C#
  G: "[c#4,c#5]@3 [c#4,c#5] ~@2 [c#4,c#5] ~@3 [c#4,c#5] ~@2 [c#4,c#5] ~@2", // C#
  H: "[c#4,c#5]@3 [c#4,c#5] ~@2 [c#4,c#5] ~@3 [c#4,c#5] ~@2 c#4 c#5 ~", // C#
  I: "~ e5@2 [e4,b4,e5] ~@2 [e4,b4,e5] ~@2 [e4,b4,e5] ~@2 [e4,b4,e5] ~ e4 ~, [e4,b4] ~@7", // E5
  J: "[e4,b4,e5]@2 ~ [e4,b4,e5] ~@2 [e4,b4,e5] ~@2 [e4,b4,e5] ~@2 [e4,b4,e5] ~ e4 ~", // E5
  K: "[e4,b4,e5]@2 ~ [e4,b4,e5] ~@2 [e4,b4,e5] ~@2 [e4,b4,e5] ~@3 [e4,b4,e5] ~@2", // E5
  L: "[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 D A B C D A B C D A B C D A B C D A B C D E@2 F G H I F G H I F G H I F G H I A B C D A B C D A B C D A B C D
  A B C D E@2 F G H I F G H I F G H I F G H I ~@48 E@2 F G H I F G H I F G H I F G H I F G H I F G H I F G H I F G H I
  J@2 ~
>`.pickRestart({
  A: "~@6 [e3,b3]@9 ~", B: "~@3 [c3,g3]@5", C: "~@3 [a2,e3]@5", D: "~@6 [c3,g3]@9 ~", E: "[[e3,b3]@31 ~]/2",
  F: "[e3,b3]", G: "[b2,f#3]", H: "[d3,a3]", I: "[a2,e3]@15 ~", J: "[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