Strudelify

Small Town

John Mellencamp

KeyB majorTempo124 bpm
0:00/0:00
// Small Town — John Mellencamp
// 124 bpm, 4/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 3 "Bass" named as a bass, played on electric bass finger (its acoustic guitar steel patch is not one)
// note: Full arrangement: all 79 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(124/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 · electric bass finger · "Bass"
const bass = note(`<
  ~ A B A B C@2 D E F G H I J K L M N K O P C@2 D E F G H I J K L M N K O Q R S@2 T U V@2 W X Y Z AA Z AB AC@2 Z AB AD
  AE AF AG Z AB Z AB AH@2 AF AG AI K AJ K AI K AJ K AI K AJ AK
>`.pickRestart({
  A: "[d#3,f#3,b3]@3 ~ [d#3,f#3,b3]@3 ~ [f#3,a#3,c#4]@2 b3@2 a#3@2 [e3,g#3,b3]@2", // B F# E
  B: "[e3,g#3,b3]@3 ~ [e3,g#3,b3]@3 ~ [e3,g#3,b3]@2 [f#3,a#3,c#4]@4 b3@2", // E F#
  C: "[[d#3,f#3,b3]@3 ~@5 f#2@5 ~@3 [e3,g#3,b3]@3 ~ [e3,g#3,b3]@3 ~ [e2,e3,g#3,b3]@2 [f#2,f#3,a#3,c#4]@4 b3@2, b2@7 ~@7 e2@9 ~@9]/2", // B E F#
  D: "[d#3,f#3,b3]@3 ~ [e3,b3]@3 ~ [f#3,a#3,c#4]@2 b3@2 a#3@2 [e2,e3,g#3,b3]@2, b2@7 ~ f#2@5 ~@3", // B E5 F# E
  E: "g#3@3 ~ [e3,g#3,b3]@3 ~ [e2,e3,g#3,b3]@2 [f#2,f#3,a#3,c#4]@4 b3@2, e2@7 ~@9", // E F#
  F: "[d#3,f#3,b3]@3 ~ [d#3,f#3,b3]@3 ~ [f#3,a#3,c#4]@2 b3@2 a#3@2 [e2,e3,g#3,b3]@2, b2@7 ~ f#2@5 ~@3", // B F# E
  G: "[e3,g#3,b3]@3 ~ [e3,g#3,b3]@3 ~ [e2,e3,g#3,b3]@2 f#2@2 g#2@2 [b2,b3]@2, e2@7 ~@3 [f#3,a#3,c#4]@4 ~@2", // E B F#
  H: "[c#3,e3,g#3,c#4]@3 ~ [e3,g#3,c#4]@2 c#3@2 [c#3,e3,g#3,c#4]@2 [c#3,e3,g#3,c#4]@4 c#3@2", // C#m
  I: "[f#3,a#3]@3 ~ [f#3,a#3]@2 [f#2,f#3,b3]@2 [f#2,f#3,b3]@2 [f#2,g#3]@5 ~, f#2 ~@3", // F# B5 F#sus2
  J: "[d#3,f#3,b3]@3 ~ [d#3,f#3,b3]@3 ~ f#2@7 ~", // B
  K: "[e3,g#3,b3]@3 ~ [e3,g#3,b3]@3 ~ [e2,e3,g#3,b3]@2 [f#2,f#3,a#3,c#4]@4 b3@2, e2@7 ~@9", // E F#
  L: "[d#3,f#3,b3]@3 ~ [d#3,f#3,b3]@3 ~ [f#3,a#3,c#4]@2 b3@2 a#3@2 [e3,g#3,b3]@2, ~@8 f#2@7 ~", // B F# E
  M: "e3@3 ~ [e3,g#3,b3]@3 ~ [e2,e3,g#3,b3]@2 [f#2,f#3,a#3,c#4]@4 b3@2, e2@7 ~@9", // E F#
  N: "[e3,b3]@3 ~ [d#3,f#3,b3]@3 ~ f#2@7 ~", // E5 B
  O: "[c#3,d#3,g#3,c#4]@5 ~ c#3@2 [c#3,d#3,g#3,c#4]@2 [c#3,d#3,g#3,c#4]@4 c#3@2", // C#sus2
  P: "[f#2,f#3,g#3]@2 [f#2,f#3,g#3]@2 [f#2,f#3,g#3]@2 [f#2,f#3,g#3]@2 [f#2,f#3,g#3]@3 ~@5", // F#sus2
  Q: "[f#2,f#3,a#3] f#2 [f#3,a#3] [f#2,f#3,b3]!2 [f#3,a#3]!2 [f#2,f#3,b3]", // F# B5 F# B5
  R: "[f#2,f#3,b3] [f#3,a#3]!2 [f#2,f#3,b3]!2 [f#2,f#3,c#4] ~@2", S: "e2@5 ~ b1@2 b1@5 ~ d#2@2",
  T: "g#3@3 ~ d#2@5 ~ a#1@2 ~@4", U: "f2@5 ~ f2@2 f2@2 f2@2 f2@2 d#2@2", V: "d#2@5 ~ a#1@2 a#1@5 ~ d2@2",
  W: "d#2@5 ~ a#1@2 a#1@5 ~ d#2@2", X: "f2@5 ~ f2@2 f2@2 f2@4 f2@2", Y: "f#2 f#2@2 f#2!2 f#2@2 f#2",
  Z: "b2@7 ~ f#3@3 ~ d#3@2 e3@2", AA: "e3@15 ~", AB: "[b2,e3]@15 ~", AC: "[b2@7 ~ f#3@3 ~ d#3@2 e3@17 ~]/2",
  AD: "b2@7 ~ f#2@5 ~ e2@2", AE: "e2@15 ~", AF: "c#3@15 ~", AG: "f#2@15 ~",
  AH: "[~@8 f#3@3 ~ d#3@2 e3@2 e3@15 ~, b2@31 ~]/2",
  AI: "[d#3,f#3,b3]@3 ~ [e3,b3]@3 ~ [f#2,f#3,c#4]@2 b3@2 a#3@2 [e2,e3,g#3,b3]@2", AJ: "b2@7 ~ [d#3,f#3,b3]@3 ~ f#2@3 ~",
  AK: "[e2,g#3]@15 ~", // E
})).s("gm_electric_bass_finger").gain(0.42)

// other · rock organ
const rock_organ = note("<~@37 A B C D E F G H I J ~ K ~ L ~ K ~ K ~ K M N ~ K ~ K ~ K O P ~@12>".pickRestart({
  A: "~@8 [c#4,b4]@2 [d#4,b4]@2 b4@3 ~", // C#7 G#m
  B: "[e4,g#4,b4]@2 b4@2 b4@2 [d#4,f#4,b4]@2 [d#4,f#4,b4]@3 ~ [d#4,f#4,b4] ~ [e4,g#4,b4] b4", C: "[e4,g#4]@7 ~@9",
  D: "[e4,g#4,b4] b4@2 b4 b4@2 [d#4,f#4]@2 b4@2 b4@2 b4@2 d#5@2", E: "[f#4,a#4]@7 ~ c#5@3 ~@3 b4@2",
  F: "[e4,g#4]@3 ~ b4@3 ~ [d#4,f#4]@2 b4@2 b4@3 ~", G: "b4 b4@2 [d#4,f#4] ~ f#4@2 f#4", H: "e4@7 ~@9",
  I: "d#5@2 c#5@2 d#5@11 ~", J: "d#5@15 ~", K: "~@4 g#4 f#4 d#4 b3", L: "e5@3 ~@13", M: "~@2 c#4@4 d#4@4 e4@5 ~",
  N: "~@4 e4@7 ~ d#4@2 b3@2", O: "~@2 c#4@4 d#4@2 d#4@2 e4@5 ~", P: "~@2 d#4 b3 ~@4",
})).s("gm_rock_organ").gain(0.49)

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

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

// drums · clap
const clap = s("cp").struct("<~ x!4 ~@42 x!4 ~@16 x!11 ~>").gain(0.51)

// drums · hihat
const hihat = s("hh").struct("<~ [x!8]!77 ~>").gain(0.51)

// drums · low tom
const low_tom = s("lt").struct("<~ A@19 ~ A@15 ~ A@8 ~@2 A@19 ~ A@11 ~>".pickRestart({
  A: "~@3 x",
})).gain(0.51)

// drums · open hat
const open_hat = s("oh").struct("<~ A@19 ~ A@15 ~ A@8 ~@2 A@19 ~ A@11 ~>".pickRestart({
  A: "~@7 x",
})).gain(0.51)

// drums · high tom
const high_tom = s("ht").struct("<~ A@19 ~ A@15 ~@2 A@7 ~@2 A@19 ~ A@11 ~>".pickRestart({
  A: "x ~@2 x ~@4",
})).gain(0.51)

// drums · crash
const crash = s("cr").struct("<~@20 A ~@15 A B ~@7 A@2 ~@19 A ~@11 C>".pickRestart({
  A: "x!8", B: "x!5 ~@3", C: "x",
})).gain(0.51)

// drums · cowbell
const cowbell = s("cb").struct("<[x!4] ~@78>").gain(0.51)

stack(bass, rock_organ, kick, snare, clap, hihat, low_tom, open_hat, high_tom, crash, cowbell)

More by John Mellencamp