Strudelify

Harper Valley PTA

Jeannie C. Riley

KeyB minorTempo115 bpm
0:00/0:00
// Harper Valley PTA — Jeannie C. Riley
// 115 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 82 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(115/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 · tenor sax · "Sax"
const tenor_sax = note(`<
  ~ A B C D@2 E F G@2 H I J K L M@3 B C D@2 E F G@2 H I J K L M@3 B C D@2 E F G@2 H I J K L M@3 B C D@2 E F G@2 H I J K
  L M@3 B C D@2 E F G@2 H I J K L N@3
>`.pickRestart({
  A: "~@5 a3!2 f#3", B: "b3 a3!2 f#3 b3 a3!2 f#3", C: "b3@2 a3@2 a3@2 f#3@2 b3@2 a3@5 ~",
  D: "[f#3@21 ~@5 d3@2 e3@2 f#3@2]/2", E: "g3 f#3 g3 f#3 g3 f#3 g3 f#3",
  F: "g3@2 f#3@2 g3@2 f#3@2 g3@2 f#3@2 g3@2 ~ f#3", G: "[g3@11 ~@3 a3!2]/2", H: "b3@2 a3@3 ~ a3@2 a3@2 a3@2 a3@2 f#3@2",
  I: "b3@2 a3@2 a3!4 b3@2 a3@5 ~", J: "d3", K: "~@6 f#3!2", L: "g3 f#3@2 g3@2 ~ f#3@2 g3@2 f#3@2 g3@2 g#3@2",
  M: "[a3@2 a3@2 a3@2 b3@2 f3@2 e3@3 ~ d3@26 ~@2 a3@2 a3@2 f#3@2]/3",
  N: "[a3@2 a3@2 a3@2 b3@2 f3@2 e3@3 ~ d3@26 ~@8]/3",
})).s("gm_tenor_sax").gain(0.2).pan(0.3)

// other · electric guitar clean · "Guitar"
const electric_guitar_clean = note(`<
  A B C@2 D@2 ~@2 E F G H ~ I J K ~ L C@2 D@2 ~@2 E F G H ~ I J K ~ L C@2 D@2 ~@2 E F G H ~ I J K ~ L C@2 D@2 ~@2 E F G
  H ~ I J K ~ L C@2 D@2 ~@2 E F G H ~ I J K ~ M
>`.pickRestart({
  A: "~ [a3,b3,d4,f#4] ~ [a3,b3,d4,f#4]", B: "~ [a3,b3,d4,f#4] ~@2", C: "[d4@15 ~]/2", D: "[c4@11 ~@3 d4@12 ~@6]/2",
  E: "~@4 [a#3,b3] d4 ~ f4, ~@14 e4 ~", F: "~@2 d4@11 ~@3", G: "d4@3 ~ c#4@3 ~", H: "b3@3 ~ c#4@4",
  I: "c4@2 d4@3 ~ e4@5 ~ f#4@3 ~", J: "b3@13 ~@3", K: "c#4", L: "a3 b3@4 ~@3", M: "f#3 ~",
})).s("gm_electric_guitar_clean").gain(0.72).pan(0.1)

// chords · epiano1 · "Piano"
const epiano1 = note(`<
  A@2 B C D@2 E@2 F@3 G H I J K L@3 M N@7 O B P Q@4 R M D@2 S@2 T@2 U V W P J X@3 H Y Z@4 AA@3 V H AB J AC AD@2 H AE@3
  AF@2 S@2 AG G W AH AI AC AJ@2
>`.pickRestart({
  A: "[~@12 d4@3 ~, ~@4 [f#4,a4,d5]@11 ~]/2", B: "~@3 d5@5, ~ a3@7, ~ f#4@3", C: "[d3,c#4,d4,f#4,a4]",
  D: "[~@3 a4, ~ c4@15, ~ f#4@7, ~@3 d5@13]/2", E: "[~@3 d5, f4, ~ b4@15, ~ g4@7, ~@3 b3@13]/2",
  F: "[~@12 g4@3 [a3,f#4]@5 [c#4,f#4]@4, ~ b3@14 ~@9, ~@2 f4@13 ~@9, ~ d5@4 ~@3]/3", G: "[b3,f#4] [c#4,f#4]",
  H: "[d3,d4,f#4,a4]", I: "[c4,d4,f#4,a4]", J: "[b3,d4,f4,g4]", K: "[g3,a3,c#4,e4]",
  L: "[~@4 a4 [a3,d4,f#4,a4]@3, ~ a3@14 ~@9, ~@2 f#4@13 ~@9, ~ d5@4 ~@3]/3", M: "~@3 e5@5, ~ c#4@7, ~ f#4@3",
  N: "[~@12 d5@3 b3@11 ~@4 d5 ~@13 d5@3 ~@2 f#4@2 [c#4,f#4]@5, f#4@15 g4@16 ~@2 b4@14 ~@9, ~ c5@14 ~@11 b3@5 ~@4 b3@12 a3@4 ~@5, ~@2 a4@13 f4@14 f4@2 f4@16 ~@9, ~@3 c4@12 d4@12 d4@4 ~@3 g4@13 ~@9]/7", // F#5
  O: "[b3,f#4]@4 ~ [c#4,f#4]@2 ~", P: "~@3 d5@5, ~ c4@7, ~ f#4@3",
  Q: "[[g2,b3,d4,f4,g4]@7 [c#4,e4,g4,a4]@8 ~@13 d5@4, ~@15 f#4@17, ~@17 a4@15, ~@19 a3@13]/4", R: "[d3,d4,f#4,a4]@7 ~",
  S: "[~@3 g4, ~ b3@15, ~ f4@7, ~@3 d5@13]/2", T: "[~@3 d4, ~ [f4,g4,b4]@3]/2", U: "~ f#4@2 [c#4,f#4]@5, a3@3 ~@5",
  V: "~ f#4@3 ~ f#4@3, b3 c#4", W: "[a3,d4,f#4,a4]",
  X: "[[g3,a3,c#4,e4]@14 [d4,f#4]@28 ~@2 d4@3 f#4, ~@7 [d3,a4]@17, ~@7 a3]/3", Y: "[c#4,d4,f#4,a4]",
  Z: "[~@12 a4@3 b3@11 ~@4 d5@2, ~ c4@14 f4@14 f4@3, ~@2 f#4@13 g4@16 ~, ~@3 d5@12 d4@12 d4@5, ~@13 b3@3]/4",
  AA: "[b3@10 ~@4 d5 ~@2 f#4@2 ~@2 [c#4,f#4]@3, g4@5 ~@3, f4@13 f4@2 ~@9, d4@11 d4@4 ~@9, ~@10 b3@5 a3@4 ~@5]/3", // F#5
  AB: "[d3,c4,d4,f#4,a4]", AC: "[a2,g3,a3,c#4,e4]", AD: "[~@3 d5, f#4, ~ a4@15, ~@3 a3@13]/2",
  AE: "[~@3 e5@4 [c4,d4,f#4,a4]@17, ~ c#4@6 ~@17, ~@2 f#4@5 ~@17]/3", AF: "[~@12 d4@3 ~, ~@4 [f4,g4,b4]@11 ~]/2",
  AG: "~ [a3,f#4]@2 ~@2 [c#4,f#4]@3", AH: "[c4,d4,f#4,a4]@7 ~", AI: "~@3 d5@5, ~ b3@7, ~ f4@3",
  AJ: "[~ d4@19 e4 f#4 e4 ~ d4@2 ~@6, [f#4,a4]@17 ~@3 a4@6 ~@6]/2", // F#m
})).s("gm_epiano1").gain(0.17).pan(0.9)

// chords · acoustic guitar steel · "Guitar"
const acoustic_guitar_steel = note(`<
  A@2 B C@5 D@3 E@2 F@3 G@2 H@2 I@2 J@4 K L@2 M@2 N O@2 P Q R@4 S@2 T@4 U V W@3 X Y@2 J@4 Z AA AB AC AD AE@4 AF I@2 AG@4
  AH AI AJ@3 AK AL@2
>`.pickRestart({
  A: "[[d4,f#4]@2 d4 ~@10 d4@3, d3@7 f#3 d3@8, ~@2 f#4@2 f#3 d4@4 f#3 d4@2 a3@4, ~@3 a3@4 a3@4 f#3@5, ~@3 d4@2 f#4@11]/2", // D
  B: "~@7 d4, d4 a3@2 a3, ~ f#3@4 f#3@3, ~@3 d4@4 ~",
  C: "[[c#4,f#4]@2 c#4 ~@2 [c#4,f#4]@2 ~@14 c4@2 [b3,f4]@3 b3 ~@10 b3@3, d3@7 d3@8 a3@4 f#3@4 ~@4 g3@2 b3@4 f3 b3@2 g3@4, ~@2 f#4@2 f#3@3 ~@2 f#3@7 d3@7 g2@8 f3 g2@8, ~@3 a3@4 c4@3 a3 c4@6 f#3 c4@2 a3@3 ~@4 b3 f3@3 g3@4 f3@5, ~@3 c#4@2 ~@2 f#4@16 ~@3 f4@3 f4@11]/5", // F#5 Bdim
  D: "[~@28 f3@2 d4@6 f#4@4 ~@6 a3 ~, g2@13 g2@2 ~@9, ~@2 f3@25 ~@3 [d3,f#3,a3]@10 [d3,f#3,c#4]@8, ~ g3@6 ~@5, ~ b3@4 ~@3]/3", // D Dmaj7
  E: "[~@2 d4 ~@3 d4 ~@8 a3, [d3,f#3,a3,b3]@3 [d3,f#3,a3,c#4]@4 [d3,f#4]@9, ~@7 d4@4 d4@5, ~@9 f#3@7, ~@10 a3@5 ~]/2", // Bm7 Dmaj7 D
  F: "[~@3 c4@4 ~@2 f3 ~@3 b3@2 ~@2 c#3 ~@3 a2 ~ e3, d3@14 g2@16 a2@9 ~@9, ~ f#3@6 ~@3 g3@5 ~@4 g3@5, ~@4 a3@10 ~@8 f3@8 ~@6 [c#3,e3]@7 ~ c#3@4]/3", // C#m
  G: "[~ f#3 ~@9 a3@2 ~@2 d4, d3@17 ~ d3@14, ~@4 a3@15 ~@9 a3@4, ~@6 f#3@13 ~ f#3@4 ~@2 f#3@6, ~@10 d4@19 ~@3]/2",
  H: "[~@3 d4@4 ~@2 f#3 ~@3 d3 ~ a3, d3@14 d3@9 ~@9, ~@2 f#3@11 ~@7 [f#3,a3]@7 ~ f#3@4, ~@2 a3@5 ~@4 c#4@5]/2", // F#m
  I: "[~@15 f#3, f#4, d3@7 a3@4 f#3@2 c4@3, c4@2 a3 c4@6 f#3 c4@2 a3@4, ~ f#3@7 d3@8]/2",
  J: "[~@13 b3@2 ~@16 f3, f4@15 f4@14 b3@3, g2@7 g3@4 f3@4 ~@2 f3@7 g2@8, b3@2 g3 b3@6 f3 b3@2 g3@3 b3@3 g3 b3@6 f3 b3@2 g3@4, ~ f3@7 g2@7 g2@8 g3@4 f3@4 ~]/4",
  K: "~@6 a3 ~@7 a3 ~, [d3,f#3,d4] [d3,f#3,c#4]", // D Dmaj7
  L: "[b3 ~ a3 c#4@2 ~ a3 ~@8 f#3, d4@6 d4@8 ~@4 f#3@11 ~@3, ~ f#3@2 ~@2 f#3@2 d3@8 ~, ~@5 a3@3, ~@11 d4@5]/2",
  M: "[~ f#3 ~@3 c4@2 ~@8 f3, d3@7 g2@8 ~, ~@2 a3@5 ~@3 g3@6, ~@6 f#3@8 ~@4 f3@11 ~@3, ~@11 b3@5]/2",
  N: "~@7 g3, g3 e3@2 e3, ~ c#3@4 c#3@3, ~@3 g3@4 ~",
  O: "[~@15 a3, d3@13 d3@3, ~@2 f#3@25 ~ f#3@4, ~ a3@6 ~, ~@3 d4@12 ~]/2", P: "~@3 d4@5, d3, ~ f#3@7, ~ a3@3",
  Q: "~@7 c#4, c#4 a3@2 a3, ~ f#3@4 f#3@3, ~@3 c#4@4 ~",
  R: "[~@13 a3@2 [b3,f4]@3 b3 ~@10 b3@3, d3@17 ~ d3@12 g2@16 f3@2 g2@16, ~@2 f#3@17 ~@3 f#3@8 ~@8 g3@4 b3@8 f3@2 b3@4 g3@8, ~@2 a3@9 ~@8 b3 f3@3 g3@4 f3@5, ~@3 c4@11 ~@4 f4@3 f4@11]/4", // Bdim
  S: "[~@2 f3@2 ~@6 g2@2 ~@2 g3@4 ~@4 g3@3 ~@5 g3@2, g2@3 b3@13, ~@4 [f3,g3]@7 ~ f3@6 g2@7 ~ g2@6, ~@20 f3@5 ~@3 f3@4]/2", // Fsus2
  T: "[d4@4 f#4@4 c#4@2 ~@2 a3@2 [d3,f#3,b3]@8 a3 ~ [d3,f#3,c#4]@6 ~@8 d4@8 ~@16 f#3@2, [d3,f#3,a3]@8 d4@6 ~@20 f#3@12 ~@4 f#3@11 ~@3, ~@5 f#3@2 ~@8 d3@8 d3@8 ~, ~@18 a3@5 ~@3 a3@6, ~@27 c4@5]/4", // Bm Dmaj7 D
  U: "~@7 f3, g2@7 ~, ~@2 f3@11 ~@3, ~ g3@3, ~@3 b3@5", V: "~@7 e3, [a2,c#4], g3@3 g3@5, ~ c#3@7, ~@2 e3@5 ~",
  W: "[~@13 d4@2 ~@4 d4@5, f#4@5 ~@3, d3@7 a3@4 f#3@4 ~@2 f#3@7, d4@2 a3 d4@6 f#3 d4@2 a3@3 ~@3 a3@6, ~ f#3@7 d3@7 d3@9]/3",
  X: "~@3 c#4@5, d3, ~ f#3@7, ~ a3@3",
  Y: "[~@2 f#3@2 ~@6 d3@2 ~@2 a3@4 ~@4 a3@3 ~@5 a3@2, d3@3 c4@13, ~@4 [f#3,a3]@7 ~ f#3@6 d3@7 ~ d3@6, ~@20 f#3@5 ~@3 f#3@4]/2", // F#m
  Z: "d4@2 ~@2 a3@2 [d3,f#3,c#4]@8 a3 ~, f#4@3 ~@5, ~ f#3@2 ~@5", AA: "b3 ~ a3@2 c#4 ~ a3@2, d4!2, ~ f#3@3 ~ f#3@3",
  AB: "~@7 f#3, d3@7 ~, ~@2 f#3@11 ~@3, ~ a3@3, ~@3 d4@5", AC: "~@7 a3, [d3,f#4], c4@3 c4@5, ~ f#3@7, ~@2 a3@5 ~",
  AD: "~@3 b3@5, g2, ~ f3@7, ~ g3@3",
  AE: "[~@6 g3@8 ~@16 f#3@2 ~@6 d4@8 f#3 ~@15 d4@2, a2@14 ~@6 a3@13 ~@3 a3@10 ~@8 d4@6 a3@4, ~@2 c#3@11 ~ d3@16 ~@2 d3@14 ~@4 d3@14, ~@4 e3@10 ~@4 f#3@11 ~@5 f#3@10 ~@8 f#3@6 f#3@6, ~@22 d4@15 ~@9 d4@8 f#4@10]/4",
  AF: "[c#4,f#4]@2 c#4 ~@4 [f#3,a3], d3, ~@2 f#4@2 f#3@3 ~, ~@3 a3@4 ~, ~@3 c#4@2 [c#4,f#4]@3", // F#5 F#m F#5
  AG: "[~@13 b3@2 ~@16 b3, b3@4 g3@8 g3@10 f3@8 ~@4 f3@17 ~@3 f3@10, ~ f3@4 f3@4 f3 b3@2 g3@3 ~@3 g3@9 ~@2 g3@3, ~@3 b3@4 b3@3 f4@5 ~@4 b3@11 ~@2, ~@16 g2@14 g2@19 ~ g2@14]/4",
  AH: "[d3,f#3,d4]@6 [d3,f#3,c#4]@8 a3 ~", AI: "~@6 a3 ~@7 a3 ~, [d3,f#3,b3] [d3,f#3,c#4]",
  AJ: "[~@3 d4@4 ~@4 c4@4 ~@8 b3, d3@7 d3@8 ~@2 g2@7, ~ f#3@6 ~@2 f#3@6 f3@3 f3@3 f3@3, ~@2 a3@5 ~@3 a3@5 b3@4 f4@5, ~@19 b3@3 g3@2]/3",
  AK: "~@6 e3 d3, g3 e3@2 ~, ~ c#3@4 c#3@2 ~, ~@3 g3@4 ~",
  AL: "[~@4 d4@5 ~@5 f#3@6 ~@4 [d3,d4]@2 ~@6, ~ d3@19 ~@12, ~ f#3@4 d4@5 ~@6, ~@4 a3@14 ~@2 a3@7 ~@5]/2", // D
})).s("gm_acoustic_guitar_steel").gain(0.21).pan(0.1)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note("<~@80 A@2>".pickRestart({
  A: "[[a5,f#6]@25 ~@7]/2", // D
})).s("gm_string_ensemble_1").gain(0.24).pan(1)

// bass · fretless bass · "Bass"
const bass = note(`<
  A@2 B@3 C D@4 B@3 E F G B@5 C D@4 B@3 E F G B@5 C D@4 B@3 E F G B@5 C D@4 B@3 E F G B@5 C D@4 B@3 E F G B H
>`.pickRestart({
  A: "d3 ~ a2 ~", B: "d3@3 ~ [f#3,a3]@3 ~ a2@3 ~ [f#3,a3]@3 ~", C: "d3@3 ~ [f#3,c4]@3 ~ d3@3 ~ [f#3,c4]@3 ~",
  D: "g2@3 ~ [f3,b3]@3 ~ d2@3 ~ [f3,b3]@3 ~", E: "d3@3 ~ [f#3,a3]@3 ~ d3@3 ~ [f#3,a3]@3 ~",
  F: "g2@3 ~ [d3,f3]@3 ~ g2@3 ~ [d3,f3]@3 ~", G: "a2@3 ~ [e3,g3]@3 ~ a2@3 ~ [e3,g3]@3 ~", H: "[d2,a2] ~",
})).s("gm_fretless_bass").gain(0.39).pan(0)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~ A ~@15 B ~@7 B ~@7 C ~@15 A ~@7 C ~@24>".pickRestart({
  A: "~ x!4 ~ x ~", B: "~@13 x!2 ~", C: "~@7 x",
})).gain(0.64)

// drums · hihat
const hihat = s("hh").struct(`<
  A ~ A@3 B A B A C A@5 B A D A B A@3 B A D A@7 E A@3 B A B A C A B A@5 ~ A@3 B A@3 F A B A B A@3 C A B A@5 ~ A B A@5 ~
>`.pickRestart({
  A: "x!8", B: "x!7 ~", C: "x!5 ~@3", D: "x!2 ~@6", E: "x ~ x!2 ~@8 x ~ x ~", F: "x ~ x!2 ~@8 x ~@3",
})).gain(0.56)

// drums · mid tom
const mid_tom = s("mt").struct("<~@17 A ~@7 A ~@7 B ~@23 B ~@24>".pickRestart({
  A: "~@11 x!2 ~@3", B: "~@3 x ~ x!2 ~",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@5 A ~ A ~@7 A ~ B ~ A ~@3 A ~ B ~@7 B ~@3 A ~ A ~ A ~ A ~@9 A ~@3 C ~ A ~ A ~@5 A ~@7 A ~@6
>`.pickRestart({
  A: "~@7 x", B: "~ x ~@2", C: "~@2 x ~@4 x",
})).gain(0.48)

// drums · high tom
const high_tom = s("ht").struct("<~@17 A ~@7 A ~@7 A ~@23 A ~@24>".pickRestart({
  A: "~ x",
})).gain(0.72)

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

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3 A
  ~ A ~ A ~@3 A ~ A ~ A ~@2
>`.pickRestart({
  A: "~@3 x",
})).gain(0.72)

stack(
  tenor_sax, electric_guitar_clean, epiano1, acoustic_guitar_steel, string_ensemble_1, bass, kick, snare, low_tom,
  hihat, mid_tom, open_hat, high_tom, crash, tambourine
)