Strudelify

Scarborough Fair

Paul Simon

KeyA minorTempo75 bpm
0:00/0:00
// Scarborough Fair — Paul Simon
// 75 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 47 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(75/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 · piano · "Lead (Low)"
const piano = note("<~@2 A B C D E F G H@2 I ~@9 J@2 ~@3 K L A B C D E F G M G M G N O P ~@5>".pickRestart({
  A: "a2@5 ~ a2@2 e3@2 e3@3 ~ e3@2", B: "b2@3 c3 b2@2 a2@10", C: "~@2 e3 g3 a3@3 g3", D: "e3@3 f#3@3 d3@2 e3@8",
  E: "a3@5 ~ a3@2 g3@6 e3@2", F: "e3@5 d3 c3@2 b2@2 g2@6", G: "a2@3 e3 d3@3 c3", H: "[b2@3 a2@3 g2@2 a2@10 ~@14]/2",
  I: "~@10 b3 ~ a3@2 ~@2", J: "[~@15 g3@2 f3 [b2,c3,d3,e3] a2 ~@5 [g#3,a3] ~ b3 ~@4]/2", K: "~@14 b3 a3",
  L: "g3@3 a3@3 b3@2 a3@8", M: "b2@3 a2@3 g2@2 a2@8", N: "b2@3 a2@3 g2@2 a2@7 ~", O: "a2@3 e3 ~@4", P: "b2@3 ~@13",
})).s("gm_piano").gain(0.64)

// other · piano · "Lead (Low)" · soft notes
const piano_soft = note("<~@22 A ~@17 B C D E D E F>".pickRestart({
  A: "~@3 [e2,f2,g2] ~@12", B: "~@4 d3@3 c3", C: "~@3 a2@3 g2@2 a2@7 ~", D: "a2@3 e3 d3@3 c3",
  E: "b2@3 a2@3 g2@2 a2@7 ~", F: "a2@3 ~@5",
})).s("gm_piano").gain(0.29)

// bass · fretless bass · "Bass"
const bass = note(`<
  A B A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA B C D E F G H AB AC Y AC AD AE ~@5
>`.pickRestart({
  A: "a1!2 ~@11 e1 g1 a1", B: "g2!2 ~@5 g2 a1 a1@2 ~@5", C: "c2!2 ~@11 g1 c2!2", D: "c2@3 ~ d2@3 ~ a1!2 ~@5 e2",
  E: "a1!2 ~@3 e1 a1 c2!2 c2@2 ~@5", F: "c2!2 ~@5 g2!3 ~@3 d2 g2 b2", G: "a1!2 ~@3 e1 a1 c2 g2 g2@2 ~@5",
  H: "e2!2 ~@5 e2 a1 a1@2 ~@5", I: "a1!2 ~@5 c2 ~ c2 b1 a1 g1@2 b1 g1", J: "a1!2 ~@5 c2 ~ c2 b1 a1 g1@2 b1 ~",
  K: "a1!2 ~@3 a1 b1 c2 ~ c2 b1 a1 g1@2 a1 ~", L: "g2!2 ~@3 b1 g2!2 a1!2 ~@5 a1",
  M: "c2!2 ~@3 c2 g1 e1 ~ e1 f1 ~ g1@2 c2!2", N: "c2@3 ~ d2!2 ~@2 a1!2 ~@3 e1 a1 c2", O: "a1!2 ~@3 e1 a1 c2!3 ~@5 c2",
  P: "c2!2 ~@5 g2 b1 b1@2 ~@5", Q: "a1!2 ~@5 e2 g2!2 ~@3 b1 g2!2", R: "e2 e2@2 ~@5 a1 a1@2 ~@5", S: "a1@7 a1 a1@7 ~",
  T: "g2@7 g2 a1@6 ~ a1", U: "c2@7 c2 c2@6 ~ c2", V: "c2@4 d2@4 a1@6 ~ a1", W: "a1@6 ~ a1 c2@7 c2",
  X: "c2@6 ~ c2 g2@6 ~ g2", Y: "a1@6 ~ a1 g2@7 g2", Z: "e2@6 ~ e2 a1@7 a1", AA: "a1 a1@6 ~@6 e1 g1 a1",
  AB: "a1!2 ~@5 a1 g2@6 ~ g2", AC: "e2@6 ~ e2 a1@6 ~ a1", AD: "a1@6 ~ a1 g2@6 ~@2", AE: "e2@6 ~@2 a1@6 ~ a1",
})).s("gm_fretless_bass").gain(0.5)

// bass · fretless bass · "Bass" · soft notes
const bass_soft = note("<~@10 A@2 ~@8 B ~@19 C D E F E F G>".pickRestart({
  A: "~@5 a1 b1 ~@9", B: "~@15 f2", C: "~@15 g2", D: "~@7 e2 ~@8", E: "a1@6 ~ a1 g2@6 ~ g2", F: "e2@6 ~ e2 a1@6 ~ a1",
  G: "a1@3 ~@5",
})).s("gm_fretless_bass").gain(0.21)

// chords · epiano2 · "Comp Left"
const epiano2 = note(`<
  A B A B C D E F G B H@2 I J K D L F M J I N O D L P Q R A B C D E F G B S T E R U N V ~@4
>`.pickRestart({
  A: "~@4 [c4,e4] d4 ~@3 [c4,e4] ~ d4@5", B: "[e4,g4] [c4,e4]", C: "[c4,e4,g4]@11 ~@3 g4@2, ~@11 c4@5, ~@13 e4@3",
  D: "[e4,g4] [f#4,a4] [c4,e4]@2", E: "[c4,e4]!2 ~@9 [e4,g4]@5", F: "[e4,g4]@8 d4!2 ~@6",
  G: "~@3 [c4,e4,a4]@5 ~@3 [e4,g4,b4]@5", H: "[[c4,e4]@13 ~@2 e4@14 ~@2 e4, ~@13 c4@16 ~ c4@2]/2",
  I: "[c4,e4]@11 ~@3 e4@2, ~@13 c4@3", J: "~@3 [e4,g4,b4]@5 [c4,e4]!2 ~@6", K: "~@3 [c4,e4,g4]@12 ~",
  L: "[c4,e4]@8 ~@3 [e4,g4,c5]@5, ~@5 c4@3", M: "~@3 [c4,e4]@5 ~@3 [e4,g4]@5", N: "e4!2 ~@6 [c4,e4]!2 ~@6",
  O: "[c4,e4]@11 ~@3 g4 ~, g4@13 e4@2 ~, ~@11 c4@4 ~", P: "[c4,e4]!2 ~@9 [g4,b4,d5]@5, ~@5 d4@3",
  Q: "[c4,e4]@8 ~@3 [e4,g4]@5", R: "~@3 [e4,g4]@5 ~@3 [c4,e4]@5", S: "~@3 [c4,e4]@5 e4!2 ~@6",
  T: "[e4,g4]@8 [c4,e4]!2 ~@6", U: "[c4,e4]!2 ~@6 e4!2 ~@6", V: "~ [c4,e4] ~@7 e4 ~@6",
})).s("gm_epiano2").gain(0.25).pan(0.2)

// chords · epiano2 · "Comp Left" · soft notes
const epiano2_soft = note("<A ~ A ~@2 B C D ~@7 B ~ D ~@5 B ~@4 A ~@2 B C D ~@8 E F G F H>".pickRestart({
  A: "~@7 c4 ~@8", B: "c4 d4 ~@2", C: "~@11 c4@5", D: "c4 ~", E: "~@8 e4 ~@7", F: "e4!2 ~@6 [c4,e4]!2 ~@6",
  G: "~ [c4,e4] ~@6 e4!2 ~@6", H: "~ [c4,e4] ~@14",
})).s("gm_epiano2").gain(0.1).pan(0.2)

// chords · epiano2 · "Comp Right"
const epiano2_2 = note(`<
  A B C B D E F G H I J@2 K L M E N G O P K Q R E N S T U C B D E F G H I V W X U Y Z AA ~@4
>`.pickRestart({
  A: "~@4 g3 [g3,b3] ~ a3 ~ g3 ~ [g3,b3]@5, ~ c3@15, ~ e3@2 e3@5", B: "g2 a2",
  C: "~@4 g3 [g3,b3] ~ a3 ~ g3 ~ [g3,b3]@5, a2, ~ c3@15, ~ e3@2 e3@5", D: "~@9 g3@7, c3", E: "c3 d3 a2@2",
  F: "a3!2 ~@8 g3@6, ~@9 c3@7", G: "c3@8 [g3,b3]!2 ~@6", H: "~ a3@3 ~ b3@3, ~ a2@7 ~ g2@7", I: "e2 a2",
  J: "[a3@9 ~@20 a3@3, a2@27 a2@5, ~@9 e3@19 e3@4, ~@11 a3@18 ~@3]/2", K: "a3@9 ~@2 a3@5, a2, ~@9 e3@7",
  L: "~@2 b3@6 a3!2 ~@6, ~ g2@7 ~@8", M: "~@2 g3@13 ~, ~ c3@15", N: "a2@8 ~ c3@7", O: "~ e3@3 ~ g3@3, ~ a2@7 ~ g2@7",
  P: "~@2 b3@6 a3!2 ~@6, ~ e2@7 ~@8", Q: "[g3,b3]!2 ~@6 a3!2 ~@6", R: "~@9 g3@6 ~, c3@15 ~", S: "g3!2 ~@7 g2@7",
  T: "a2@4 ~ g3@3, ~@9 g2@7", U: "~ g3@3 ~ e3@3, ~ e2@7 ~ a2@7", V: "~@2 e3@6 [g3,b3]!2 ~@6, ~ a2@7 ~@8",
  W: "e2@8 a3!2 ~@6", X: "a3!2 ~@8 g3@6, ~@9 g2@7", Y: "a3!2 ~@6 [g3,b3]!2 ~@6", Z: "[g3,b3]!2 ~@7 a3 ~@6",
  AA: "~ a3 ~@14",
})).s("gm_epiano2").gain(0.25).pan(0.9)

// chords · epiano2 · "Comp Right" · soft notes
const epiano2_soft_2 = note(`<
  A B A B ~ C ~ D ~ B E ~@4 C F D G ~@4 C F ~ H I A B ~ C ~ D ~ B J K L I ~ M N O P O Q
>`.pickRestart({
  A: "~@3 g3 ~@3 g3 ~@8", B: "[g3,b3] [e3,a3]", C: "g3 a3 [e3,a3]@2", D: "g3 ~", E: "~@2 e3@7 ~@7", F: "[e3,a3] ~",
  G: "~@3 a3@5 ~@3 b3@5", H: "[e3,a3]@8 ~@3 b3@5", I: "~@3 b3@5 ~@3 a3@5", J: "~@3 a3@5 ~@8", K: "[g3,b3] ~",
  L: "~@11 b3@5", M: "~@8 a3 ~@7", N: "~@8 [g3,b3]!2 ~@6", O: "[g3,b3]!2 ~@6 a3!2 ~@6", P: "~ a3 ~@6 [g3,b3]!2 ~@6",
  Q: "~ a3 ~@14",
})).s("gm_epiano2").gain(0.1).pan(0.9)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@40
  [~@7 x ~@7 x]
  [~@7 x]
  [x ~@6 x!2 ~@6 x]
  [x ~@6 x]
  [x ~@6 x!2 ~@6 x]
  [x ~@6 x]
  x
>`).gain(0.18)

// drums · rim
const rim = s("rim").struct("<[~ x ~ x]!9 ~ [~ x ~ x] ~ [~ x ~ x]!7 ~@9 [~ x ~ x]!7 ~@12>").gain(0.48)

// drums · snare
const snare = s("sd").struct("<~@9 A ~ B ~@7 C D@7 C ~@7 A D B D E D F D ~@4>".pickRestart({
  A: "~@4 x!2 ~ x ~ x!2 ~ x!2 ~@2", B: "~@4 x ~@7 x!2 ~@2", C: "~@11 x!2 ~@3", D: "~ x ~ x",
  E: "~@4 x!2 ~ x ~ x!2 ~ x ~@3", F: "~@4 x!3 ~",
})).gain(0.36)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@19 A@9 ~@8 A ~ A@3 B A C D C E>".pickRestart({
  A: "~@13 x ~@2", B: "~@7 x ~@5 x ~@2", C: "~@7 x!2 ~ x ~ x!2 ~@2", D: "~@4 x ~@7 x!2 ~@2", E: "~ x ~@2",
})).gain(0.18)

// drums · clap
const clap = s("cp").struct("<~@9 A ~ A ~@7 A@9 ~@7 A@8 B ~@3>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.3)

// drums · clap · soft notes
const clap_soft = s("cp").struct("<~@9 A ~ A ~@7 A@9 ~@7 A@8 B C@2 D>".pickRestart({
  A: "~@13 x ~@2", B: "~@12 x!2 ~@2", C: "~@4 x ~@7 x!2 ~@2", D: "~ x ~@2",
})).gain(0.18)

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

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@11 A ~@7 B ~@7 B ~@9 A ~@3 C ~ C ~ C ~>".pickRestart({
  A: "~@11 x ~@4", B: "~@7 x ~@8", C: "~@3 x ~@4",
})).gain(0.42)

// drums · open hat
const open_hat = s("oh").struct("<A@7 B A ~ A C A B A@5 D ~@7 D A@5 B A ~@2 E ~@9>".pickRestart({
  A: "~ x ~@6", B: "~@2 x ~@4 x ~@8", C: "~ x ~@2 x ~@11", D: "~@2 x ~@12 x", E: "~ x ~@2",
})).gain(0.42)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@37 A ~@3 B ~ B ~ B ~>".pickRestart({
  A: "~ x ~@14", B: "~@7 x",
})).gain(0.24)

// drums · high tom
const high_tom = s("ht").struct("<~@9 A ~ B ~@7 C ~@7 C ~@7 A ~ B ~ A ~ D ~ D ~ D ~>".pickRestart({
  A: "~@11 x ~@2 x ~", B: "~ x", C: "~ x ~@2", D: "~@3 x ~@12",
})).gain(0.42)

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

// drums · congas
const congas = s("conga:13").struct("<[~@2 x ~@2 x ~@6 x!2 ~@2]!38 [~@2 x ~@2 x ~@6 x ~@3]!3 [~@2 x ~@2 x ~@10] ~@5>")
  .gain(1.15)

// drums · congas · soft notes
const congas_soft = s("conga:13").struct(`<
  ~@38
  [~@13 x ~@2]!3
  [~@12 x!2 ~@2]
  [~@2 x ~@2 x ~@6 x!2 ~@2]!4
  [~@2 x ~@2 x ~@10]
>`).gain(0.58)

// drums · congas
const congas_2 = s("conga:18").struct("<A B@35 A B C D@2 E F ~@4>".pickRestart({
  A: "~ x ~@4 x!2 ~@3 x ~@2 x!2", B: "x!2 ~@4 x!2 ~@3 x ~@2 x!2", C: "x!2 ~@4 x!2 ~@3 x ~@2 x ~",
  D: "x ~@6 x ~@3 x ~@2 x ~", E: "x ~@6 x ~@6 x ~", F: "x",
})).gain(1.15)

// drums · congas · soft notes
const congas_soft_2 = s("conga:18").struct(`<
  ~@38
  [~@15 x]
  [~ x ~@4 x ~@8 x]!2
  [~ x ~@4 x ~@4 x ~@3 x]
// … 35 more lines

More by Paul Simon