Strudelify
Avalon cover art

Avalon

Avalon

Roxy Music

KeyC majorTempo137 bpm
0:00/0:00
// Avalon — Roxy Music
// 137 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 146 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(137/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 · piano · "A.PIANO 1"
const piano = note(`<
  ~@68 A B C B C B D@2 E B F B G B F B ~@10 H I J I K I L M H I J I K I L M H I J I K I L M H I J I K I L M H I J I K I
  L M H I J I K I L M ~@4
>`.pickRestart({
  A: "[g2,d3]@7 ~", B: "[c3,g3]", C: "[g2,d3]", D: "[~@16 g1@15 ~, [g2,d3]@31 ~]/2", E: "[f3,c4]@15 ~", F: "[a#2,f3]",
  G: "[f3,c4]", H: "c4@3 [c4,f4,a4]@5, f3@15 ~", I: "~@3 [c4,e4,g4]@5, [c3,g3]", J: "~@3 [a#3,d4,f4]@5, [a#2,f3]",
  K: "c4@3 [c4,f4,a4]@5, f3", L: "~@6 [a#3,d4,f4]@9 ~, [a#2,f3]", M: "~@6 [c4,e4,g4]@9 ~, [c3,g3]",
})).s("gm_piano").gain(0.21)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@5 A B@2 C@2 D E F G H E I J D E F G H E I J K L M@2 N L O P@2 D E F G H E I J D E F G H E I J K L M@2 N L O Q R S T
  S U S V S W S T S U S V S X D E F G H E I Y K L M@2 N L O Q R@2 D E F G H E I Y D E F G H E I Y D E F G H E I Y D E F
  G H E I Y D E F G H E I Y D E F G H E I Y ~@4
>`.pickRestart({
  A: "~@4 d2 f2 g2 f2", B: "[[g1,g2]@31 ~]/2", C: "[[g1,g2]@14 a1 g1]/2", D: "f1@3 f2 ~@2 a#1 b1", E: "c2",
  F: "a#1@3 d2@3 a#1@2", G: "c2@6 d2 f2, a#1 ~@15", H: "f1@6 f2@3 ~@2 a1 a#1@2 b1@2", I: "a#1@6 d2 a#1",
  J: "c2@4 ~ d2 f2 ~", K: "d#2@2 ~ d#3@5, ~ d#2@3", L: "c#2 ~ g#2 c#3@5, ~ c#2@7", M: "[~@2 g2 c3@13, c2]/2",
  N: "~@2 a#2 d#3@5, d#2", O: "c2@7 f1", P: "[g1@30 g1 ~]/2", Q: "g1@5 ~ g1@9 ~", R: "g1 ~ g1@3 ~ g1@9 ~",
  S: "g1 ~ g1@3 ~ g1@6 a1@2 g1@2", T: "c2@6 f1@5 ~ f#1@4", U: "c2@7 ~", V: "c2@3 ~ c2 ~ f1@6 f#1@4", W: "c2@3 ~",
  X: "g1 ~@7", Y: "c2@4 ~@2 c2 d2",
})).s("gm_electric_bass_finger").gain(0.54)

// chords · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note(`<
  ~@2 A@2 ~@2 B@4 C D E ~ C D E ~ C D E ~ C D E ~ F@4 G@5 C D E ~ C D E ~ C D E ~ C D E ~ F@4 G@5 ~@16 C D E ~ C D E ~
  F@4 H@6 ~@8 C D E ~ C D E ~ C D E ~ C D E ~ C D E ~ C D E ~ C D E ~ C D E ~ C D E ~ C D E ~@5
>`.pickRestart({
  A: "~@6 d4 ~@9", B: "[~@6 d4 ~@15 d4 ~@15 d4 ~@15 d4 ~@9, g1@29 ~@3, g2@17 ~@15]/4", C: "~@6 [c4,c5] ~@9",
  D: "~@6 [g3,d4,g4] ~@9", E: "~@6 [f3,c4,f4] ~@9", F: "[f4@47 e4@7 ~@10]/4", G: "[f4@47 [g3,d4]@31 ~@2]/5",
  H: "[f4@23 [g3,d4]@22 ~@3]/6", // G5
})).s("gm_synth_strings_2").gain(0.45).pan(0.6)

// chords · synth strings 2 · "SYN STR 2" · soft notes
const synth_strings_2_soft = note("<~@60 A@3 B@5 C@4 D@4 ~@70>".pickRestart({
  A: "[[g3,b3]@14 ~ [g3,c4]@15 ~ [g3,b3]@16 ~]/3", // G C5 G
  B: "[[g3,c4]@15 ~ d3@15 [g3,c4]@15 ~ [d3,g3,b3]@14 ~@2 c4@14 ~@3, ~@15 [g3,b3]@15 ~@32 [e3,g3]@15 ~@3]/5", // C5 G Em
  C: "[[g3,b3,d4]@15 [g3,c4,e4]@15 ~@2 d4@15 [g3,c4,e4]@16 ~, ~@31 [g3,b3]@15 ~@18]/4", // G C G
  D: "[[g3,b3,d4]@14 ~ [g3,c4,e4]@15 ~ [g3,d4]@30 ~@3, ~@31 b3@21 ~@12]/4", // G C G5
})).s("gm_synth_strings_2").gain(0.2).pan(0.6)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~ A ~@8 B C D ~ B C D ~ B C D ~ B C D ~ E F G H E I G J K B C D ~ B C D ~ B C D ~ B C D ~ E F G H E I G J K L M L N O
  M L N L M L N O M L P B C D ~ B C D ~ E F G H E I G J K@2 B C D ~ B C D ~ B C D ~ B C D ~ B C D ~ B C D ~ B C D ~ B C
  D ~ B C D ~ B C D ~ B C D ~ B C D ~@5
>`.pickRestart({
  A: "d4 ~ d4 d3 ~@12", B: "~@6 c4 ~ f4 ~ f4 ~ c4 ~@3", C: "~@8 c3 ~ d3 ~ e3 ~ d3 ~", D: "~@6 a#3 ~ d4 ~ d4 ~ a#3 ~@3",
  E: "d#3 ~@5 d#3 ~@5 d#3 ~@3", F: "c#3 ~@5 c#3 ~@5 c#3 ~@3", G: "c3 ~@5 c3 ~@5 c3 ~@3", H: "~@6 c3 ~@3 c3 ~ c3 ~ c3 ~",
  I: "c#3 ~@5 c#3 ~@3 c#3 ~ c#3 ~@3", J: "g3 ~@5 g3 ~@3 g3 ~ g3 ~@3", K: "g3 ~@3 g3 ~ g3 ~@3 g3 ~ g3 ~@3",
  L: "d3 ~ g3 ~ d3 ~ d4 ~ g3 ~ d3 ~ g3@2 d3 ~", M: "c4 ~ c4 ~@3 c4 ~ c4 ~ g3 ~ c4 ~ g3 ~", N: "c4 ~@15",
  O: "d3 ~ g3 ~ d3 ~ d4 ~ g3 ~ d3 ~ g3 ~ d3 ~", P: "g3 ~@15",
})).s("gm_electric_guitar_muted").gain(0.35).pan(0.4)

// other · electric guitar muted · "MUTED GTR" · soft notes
const electric_guitar_muted_2 = note(`<
  A ~@25 B C D E F G H I J ~@16 B C D E F G H I J ~@24 B C D E F G H I J@2 ~@52
>`.pickRestart({
  A: "~@14 c4 ~", B: "~@4 d#3 ~@5 d#3 ~@3 d#3 ~", C: "~@4 c#3 ~@5 c#3 ~@3 c#3 ~", D: "~@4 c3 ~@5 c3 ~@3 c3 ~",
  E: "c3 ~@3 c3 ~@3 c3 ~@7", F: "~@4 d#3 ~@3 d#3 ~ d#3 ~@3 d#3 ~", G: "~@3 c#3 ~@4 c#3 ~@5 c#3 ~",
  H: "~@4 c3 ~@5 c3 ~@5", I: "~@4 g3 ~@3 g3 ~@5 g3 ~", J: "~@8 g3 ~@5 g3 ~",
})).s("gm_electric_guitar_muted").gain(0.2).pan(0.4)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@55 A B C D E ~@24 F@5 B C D E ~@53>".pickRestart({
  A: "~@2 f3@3 c4@3 d#4@2 f4@3 f4@3", B: "f4@11 ~ f4@4", C: "c5@5 ~ [a#4,b4] [g#4,a4] g4@8", D: "g4", E: "f#4 f4 ~@14",
  F: "[~@8 g3@4 f3@2 g3@4 g#3@4 a#3@4 c4@4 c4@8 a#3@4 c4@4 c4@20 f3@3 c4@3 d#4@2 f4@3 f4@3]/5",
})).s("gm_overdriven_guitar").gain(0.35).pan(0.7)

// other · overdriven guitar · "OVERDRIVE" · soft notes · Cm Bmaj7 F5 Cm Bmaj7 F5
const overdriven_guitar_soft = note(`<
  ~@59
  [~ e4 [c4,c#4,d#4] [a#3,b3] [c3,f3] ~@11]
  ~@32
  [~ e4 [c4,c#4,d#4] [a#3,b3] [c3,f3] ~@11]
  ~@53
>`).s("gm_overdriven_guitar").gain(0.15).pan(0.7)

// other · alto sax
const alto_sax = note(`<
  ~@94 A@2 B C D@2 E F G ~@3 H@2 I J K L@2 ~@3 M N O@2 ~@2 P@3 Q@2 R@3 S@3 T U@5 ~@7
>`.pickRestart({
  A: "[~@4 c4 ~@3 d4 ~@3 f4@2 g4@16 ~@2]/2", B: "~@4 c4 ~@3 d4@2 ~@2 f4@4", C: "c4@7 ~",
  D: "[~@4 c4 ~@3 d4@2 ~@2 f4@2 g4@13 ~@3 c4 ~]/2", E: "c5 ~ c5@2 ~@2 a#4 ~ a#4@2 ~@2 a4 ~ a4@2",
  F: "~@2 g4 ~ g4@2 ~@2 f4 ~ f4@2 ~@2 d4@2", G: "c4@5 ~@3", H: "[~@6 c4 ~ f4@4 g4 ~ e4@7 ~@11]/2",
  I: "~@6 g3 ~ a3@3 ~ a#3 ~ g3@2", J: "~ a3 ~@2 f3@4 g3@2 ~@2 a3@2 ~@2", K: "f3@5 ~@11",
  L: "[~@7 g3 a3@3 ~ g3 ~ f3@4 ~@14]/2", M: "a4@3 ~ f4@2 ~@2 c4@3 ~ a4@2 g4@2, ~@12 g4 ~@3",
  N: "~@2 f4@3 ~ g4@3 ~ a4@2 ~ c5@2 ~", O: "[c5@9 ~@7]/2",
  P: "[~@8 f4@3 ~ g4 ~ e4@13 ~ f4 ~ d4@14 ~@2 c4 ~, ~@8 e4 ~@39]/3",
  Q: "[[e4,f4] ~@2 f4 ~@2 f4 ~ a4@2 ~@2 a4 ~ a4@15 ~@3, ~@14 g4 ~@17]/2", // Fmaj7
  R: "[~@4 f3 ~ g3 ~ f4 ~ d4 ~ d4@9 ~ c4 ~ f4 ~ d4 ~ c4 ~ f4@4 d4@2 c4 ~ f4 ~ f4@2 ~@6, ~@12 c4 ~@35]/3",
  S: "[~@6 f4 ~ a4@4 a#4 ~ g4@13 g#4 a4 ~ f4@16 d4 e4]/3", T: "f4@3 e4@2 c4@2 a3",
  U: "[c4@6 c5 ~ c5@4 d5 ~ c5@5 ~ a4 ~ a4@6 f4 e4 f4@5 ~ c4 ~ c4@5 ~ a3 ~ a3@6 f3 ~ f3@5 ~ c3 ~ c3@9 ~@9]/5",
})).s("gm_alto_sax").gain(0.4).pan(0.3)

// chords · electric guitar jazz · "+HAWAIIGTR"
const electric_guitar_jazz = note(`<
  ~@19 A@4 B@2 C D E F@2 G E H@3 ~@9 A@4 B@2 C D E F@2 G E H@3 I J I K L M N O P Q P R@2 S T@2 ~@8 D E F@2 G E H@3 ~@53
>`.pickRestart({
  A: "[~@8 e4@2 f4@2 g4@2 f4@30 e4@2 f4@13 ~@5]/4", B: "[~@16 c4@15 ~, ~@15 [f3,a#3]@16 ~]/2", C: "[g3,c4]@3 ~",
  D: "~@12 [d#4,g4,a#4] ~@3, [d#3,a#3]", E: "~@12 [c#4,f4,g#4] ~@3, [c#3,g#3]", F: "[[c3,g3]@29 ~@3]/2",
  G: "~@12 [d#4,g4,a#4] ~@3, [d#3,a#3]@15 ~", H: "[[c3,g3]@14 ~@2 g3@31 ~, ~@15 [g2,d3]@31 ~@2]/3",
  I: "[g2,d3] ~@5 [g2,d3]@10", J: "[c3,g3]", K: "~@10 [a3,c4,f4] ~@2 [a3,c4,f4] ~@2, [c3,g3]@15 ~",
  L: "[g2,d3,a3,c4,f4] ~@5 [g2,d3]@10", M: "~@10 [a3,c4,f4] ~@2 c4 [a3,f4] ~, [c3,g3]",
  N: "[g2,d3,a3,c4] f4 ~@2 [c4,f4] ~ [g2,d3]@10", O: "[c3,g3]@13 ~@3",
  P: "[g2,d3] ~@3 [d4,g4,b4] ~@7 [d4,g4,b4] ~@3, ~@3 [g2,d3]@5", // G5 G G5
  Q: "~@4 [e4,g4,c5] ~@5 [a3,c4,f4] ~ [e4,g4,c5] [a3,c4,f4] ~@2, [c3,g3]@15 ~", // C F C F C5
  R: "[~@4 [e4,g4,c5] ~@7 [e4,g4,c5] ~@7 [c4,a4] ~@7 [c4,a4] ~@3, [c3,g3]@12 [a3,f4]@19 ~]/2", // C F C5 Dm
  S: "~@4 [e4,g4,c5] ~@5 [a3,c4,f4] ~ [e4,g4,c5] ~ [a3,c4,f4] ~, [c3,g3]@7 ~", // C F C F C5
  T: "[[g2,d3] [a3,c4,f4] ~@2 [d4,g4,b4] ~@7 [d4,g4,b4] ~@7 [d4,g4,b4] ~@7 [d4,g4,b4] ~@3, ~@3 [g2,d3]@13]/2", // G5 F G G5
})).s("gm_electric_guitar_jazz").gain(0.15).pan(0.7)

// chords · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz_2 = note(`<
  ~ A ~@3 B@2 ~@2 C@2 ~@2 D@2 ~@2 E@2 ~@2 D@2 ~@11 C@2 ~@2 D@2 ~@2 E@2 ~@5 F ~@28 G ~@3 F ~@13 G ~@3 F ~@3 G ~@3 F ~@3 G
  ~@3 F ~@3 G ~@3 F ~@3 G ~@3 F ~@3 G ~@3 F ~@3 G ~
>`.pickRestart({
  A: "~@5 c4@9 ~@2, ~@4 [d4,f4,a4]@9 ~@3", B: "[~@7 [c4,d4,f4,a4]@9]/2", C: "[~@11 [f4,a4,c5]@11 ~@10]/2",
  D: "[~@9 [f4,a4,c5]@10 ~@13]/2", E: "[~@2 [f4,a4,c5]@3 ~@3]/2", F: "~@2 [f4,a4,c5]@5 ~", G: "~@3 [f4,a4,c5]@5",
})).s("gm_electric_guitar_jazz").gain(0.1).pan(0.2)

// chords · electric guitar clean · "+CHORUS GT"
const electric_guitar_clean = note(`<
  ~@26 A B C@2 D B E F@2 ~@2 G H I J K L I L M N I N K J A B C@2 D B E F@2 ~@8 O P Q R S T Q U ~@2 G H I J K L V B C@2 D
  B E F@2 ~@3 G H I J K L W ~ G H I J K L W ~ G H I J K L W ~ G H I J K L W ~ G H I J K L ~@12
>`.pickRestart({
  A: "[d#3,a#3,d#4,f4,a#4]@13 ~@3", B: "[c#3,g#3,c#4,d#4,g#4]@7 ~", C: "[[c3,g3,c4,f4,g4]@23 ~@9]/2",
  D: "[d#3,a#3,d#4,f4,a#4]@7 ~", E: "[c3,g3,c4,f4,g4]@7 ~", F: "[[g2,d3,g3]@25 ~@7]/2", G: "[a#3,c4,f4]@13 ~@3",
  H: "[c4,d4,g4]@7 ~", I: "[f3,c4,f4,a4]@7 ~", J: "[c3,g3,c4,d4,g4]@13 ~@3", K: "[a#2,f3,a#3,c4,f4]@7 ~",
  L: "[c3,g3,c4,d4,g4]@7 ~", M: "[a#2,f3,a#3,c4,f4]@15 ~, b3 ~@15", N: "[c3,g3,c4,d4,g4]@15 ~", O: "[g3,d4]@15 ~",
  P: "[c4,e4,g4]@11 ~ [a3,c4,f4]@2 ~@2", Q: "[b3,d4,g4]@11 ~ [a3,c4,f4]@2 ~@2", R: "[g3,c4,e4]@15 ~",
  S: "[g3,b3,d4]@15 ~", T: "[g3,c4,e4]@5 ~ [a3,c4,f4] ~", U: "[b3,d4,g4]", V: "[d#3,a#3,d#4,f4,a4,a#4]@13 ~@3",
  W: "[f4,a4]@7 ~", // F
})).s("gm_electric_guitar_clean").gain(0.03).pan(0.1)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A ~ A@2 ~ B A@16 C@9 D E A@13 F C@9 D@17 E A@5 G C@10 D@9 E A@6 D E A@6 D E A@6 D E A@6 D E A@6 ~@4
>`.pickRestart({
  A: "x", B: "~@7 x", C: "x!2", D: "x ~@2 x!2 ~@3", E: "x ~@2 x ~@4", F: "~ x!2 ~@5", G: "x ~@4 x ~@2",
})).gain(0.45)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@6 A ~ B ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@14 A ~ A ~ A ~ A ~ A ~@32 A ~ A ~@23 A ~ A ~@5 A ~ A ~@5 A ~ A ~@5 A ~ A
  ~@5 A ~ A ~@5
>`.pickRestart({
  A: "~@7 x", B: "x",
})).gain(0.2)

// drums · rim
const rim = s("rim").struct(`<
  ~@5 A B@6 C D B@11 C E F@8 E B@2 C B@2 D B@6 G F B E F@9 B@4 C B@2 F B@4 C B@2 E B@2 C B@3 H E F@9 E@3 I E@5 B@2 C B@4
  E B@2 C B@4 E B@2 C B@4 E B@2 C B@4 E B@2 C B@4 ~@4
>`.pickRestart({
  A: "~ x ~ x!4 ~", B: "~ x", C: "~@4 x ~@2 x", D: "~ x!2 ~", E: "~@3 x", F: "~@3 x ~@2 x ~", G: "~@2 x!2",
  H: "x!2 ~ x", I: "~@4 x!3 ~",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct("<~@5 [~ x ~ x!4 ~] ~@28 [~@3 x] ~@24 [~@3 x] ~@86>").gain(0.2)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@6 A B C D E@2 F G H D I F J C J C J K J K@3 A K B D J D L E@2 F G H D I F J C J C J K J K@3 A K B D J D L@2 K A K B
  D J D L K A K B D J D E@2 F G H D I F K@2 A K B D J D J L E@10 F G H D M N E@2 F G H D M N E@2 F G H D M N E@2 F G H D
  M N E@2 F G H D M N ~@4
>`.pickRestart({
  A: "x!3 ~ x ~ x!2", B: "x ~ x ~ x!4", C: "x ~ x ~ x!3 ~", D: "x!3 ~ x!4", E: "x ~ x ~ x ~ x!2", F: "x ~ x!6",
  G: "~ x!6 ~", H: "x ~ x!3 ~ x!2", I: "x!5 ~ x ~", J: "x!8", K: "x!7 ~", L: "x!6 ~@2",
  M: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2", N: "x ~ x!5 ~",
})).gain(0.25)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@6 A B@2 C D@2 E F G C H ~@2 C ~ I ~@4 J@2 A J B C ~ C ~ D@2 E F G C H ~@2 C ~ I ~@4 J@2 A J B C ~ C ~@2 J A J B C ~
  C ~ J A J B C ~ C D@2 E F G C H ~ J@2 A J B C ~ C ~@2 D@10 E F G C ~@2 D@2 E F G C ~@2 D@2 E F G C ~@2 D@2 E F G C ~@2
  D@2 E F G C ~@6
>`.pickRestart({
  A: "~@3 x ~ x ~@2", B: "~ x ~ x ~@4", C: "~@3 x ~@4", D: "~ x ~ x ~ x ~@2", E: "~ x ~@6", F: "x ~@6 x",
  G: "~ x ~@3 x ~@2", H: "~@5 x ~ x", I: "~ x ~ x ~@3 x", J: "~@7 x",
})).gain(0.15)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@7 A B ~@8 C ~ B ~@3 B ~ B ~@8 D ~@7 C ~ B ~@3 B ~ B ~@8 D@2 ~@7 D ~@14 C ~@9 D ~@15 C ~@7 C ~@7 C ~@7 C ~@7 C ~@4
>`.pickRestart({
  A: "~@15 x", B: "~@7 x", C: "~ x ~@6", D: "~@3 x",
})).gain(0.3)
// … 72 more lines

More by Roxy Music