Strudelify

Folsom Prison Blues

Johnny Cash

KeyF♯ majorTempo100 bpm
0:00/0:00
// Folsom Prison Blues — Cash Johnny
// 100 bpm, 4/4, key F# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 73 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(100/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
const piano = note(`<
  ~@2 A B@4 C D B@2 E F B@5 C D B@2 E F B@5 C D B@2 E F B@5 C D B@2 E F B@5 C D B@2 E F B@5 C D B@2 E F B G H@3
>`.pickRestart({
  A: "~@3 [f#2,c#3,a#3,c#4,f#4] ~@5 [f#2,a#3,c#4,f#4] ~@5 [f#2,a#3,c#4,f#4] ~@5 [f#2,a#3,c#4,f#4] ~@2", // F#
  B: "~@3 [f#2,f#3,a#3,c#4] ~@5 [f#2,f#3,a#3,c#4] ~@5 [f#2,f#3,a#3,c#4] ~@5 [f#2,f#3,a#3,c#4] ~@2", // F#
  C: "~@3 [b2,f#3,b3,d#4] ~@5 [b2,f#3,b3,d#4] ~@5 [b2,f#3,b3,d#4] ~@5 [b2,f#3,b3,d#4] ~@2", // B
  D: "~@3 [b2,f#3,b3,d#4] ~@5 [b2,f#3,b3,d#4] ~@5 [b2,f#3,b3,d#4] ~@5 [b2,b3,d#4] ~@2", // B
  E: "~@3 [b2,c#3,c#4,f4] ~@5 [c#3,c#4,f4] ~@5 [c#3,c#4,f4] ~@5 [c#3,c#4,f4] ~@2", // C#7 C#
  F: "~@3 [c#3,g#3,c#4,f4] ~@5 [c#3,g#3,c#4,f4] ~@5 [c#3,g#3,c#4,f4] ~@5 [g#3,c#4,f4] ~@2", // C#
  G: "c#3@3 [b3,f4,g#4] ~@5 [c#3,b3,f4,g#4] ~@5 [c#3,b3,f4,g#4] ~@5 [b3,g#4] ~@2, ~@7 f4", // Fdim C#7 E
  H: "[~@3 [a#3,c#4,f#4]@6 ~@3 f#2@6 [f#2,a#3,c#4,f#4]@43 ~@11, f#2@11 ~@61, ~ [a#3,c#4,f#4] ~@6]/3", // F#
})).s("gm_piano").gain(0.3)

// chords · electric guitar clean · "LEAD GUIT"
const electric_guitar_clean = note(`<
  A B C D E F G H I J K L M N D E F G H I J K L M O P Q R S T U V W X Y Z D E F G H I J K L M O P Q R S T U V W X Y Z D
  E F G H I J K L M AA AB AC@3
>`.pickRestart({
  A: "~@15 c#3@2 ~ c#3 ~@2 c#3 ~@2", B: "f3@5 ~ f3@6 c#3@6 g2@6", C: "f#2@5 ~",
  D: "f#2 ~@2 f#3 ~@5 f#3 ~@5 f#3 ~@4 f#3 c#3 ~@2", E: "~@3 f#3 ~@5 f#3 ~@5 f#3 ~@4 f#3 c#3 ~@2",
  F: "~@3 f#2 ~@5 f#2 ~@5 f#3 ~@4 f#3 c#3@2 ~", G: "f#2 ~@2 f#3 ~@5 f#3 ~@5 f#2@3 g#2@3 a#2@2 ~",
  H: "b2 ~@2 b2 ~@5 b2 ~@5 b2 ~@5 b2 ~@2", I: "~@3 [b2,f#3,b3] ~@5 [b2,f#3,b3] ~@5 [b2,f#3,b3] ~@5 [b2,f#3,b3] ~@2",
  J: "~@3 f#3 ~@5 f#3 ~@5 f#3 ~@4 f#3 c#3@2 f#2", K: "~@3 f#3 ~@5 f#3 ~@5 f#3 ~@5 f#3 ~@2",
  L: "~@3 [c#3,f3] ~@5 [c#3,f3] ~@5 [c#3,f3,g#3] ~@5 [c#3,f3,g#3] ~@2", // C#
  M: "~@3 [c#3,f3,g#3] ~@5 [c#3,f3,g#3] ~@5 [c#3,f3,g#3] ~@5 c#3 ~@2", // C#
  N: "~@3 f#2@5 ~ f#3 ~ f#3 ~@3 f#3@6 f#2@2 ~, ~@12 f#2@7 ~@5",
  O: "~@3 f#2@5 ~ f#3 ~ f#3 ~@3 f#3@6 [f#2,a4]@3, ~@12 f#2@7 ~@5", P: "a#4@3 c#5@2 ~ e5@3 c#5 ~ e5@4 c#5@5 ~ a4@3",
  Q: "a#4@3 c#5@2 ~ e5@3 c#5 ~ e5@10 a4@3", R: "a#4@3 c#5@2 ~ e5@3 c#5 e5@4 ~ c#5@6 a4@3",
  S: "a#4@3 c#5@2 ~ e5@2 ~ c#5 ~ e5@4 c#5@6 ~@3",
  T: "~@9 [f#4,b4]@3 ~@5 [f#4,b4]@3 ~ [f#4,b4]@3, b3@4 b4@5 ~@15, ~@3 d#4@2 f#4@4 ~@6 d#4@5 d#4@4, ~@7 d#4@5 b3@12", // B5
  U: "~@3 d#4 ~@3 f#4, b3@3 ~ d#4@2, ~ a4@3 a4@4, ~@8 f#4@4 ~@3 f#4@6 ~@3, ~@19 b3@5",
  V: "~@18 c#4@2 ~ c#4@3, f#3@7 f#3@5 f#3@12, ~@3 [a#3,c#4]@6 c#4@9 ~@2 f#4@4, ~@3 a#3@2 a#3@3", // A#m
  W: "f#3@3 [c#4,f#4] ~@4 [c#4,f#4]@2 a#3 ~@4 f#3@3 [c#4,f#4]@2 ~ f#3 ~@2, ~@2 [a#3,c#4,f#4] ~", // F#5 F#
  X: "c#3 ~@2 b3 ~@3 b3, ~ b3@2 ~ c#3@4, ~ g#4@2 ~ g#4@2, ~@7 f4@6 ~@2 b3@2 ~@2 f4@5",
  Y: "~@10 b3@2 ~@3 b3@2 ~ a2@2 ~ g#2@2 ~, c#3@5 g#4@8 ~@11, ~@3 b3@6 f4@4 ~@4 f4@2 ~@5, ~ c#3 b2 ~",
  Z: "f#2@9 c#3 ~@2 c#3@3 f#3@6 ~@3, ~@11 f#2@2 ~@11",
  AA: "~@3 f#2@5 ~ f#3 ~ f#3 ~@3 c#3 ~@2 c#3 ~@2 [f#2,c#3]@2 ~, ~@12 f#2@7 ~@5, ~@5 f#3@2 ~", // F#5
  AB: "f3@4 ~@2 f3@5 ~ c#3@6 a2@6",
  AC: "[~@15 a#3@3 [a#3,c#4,f#4]@46 ~@8, f#2@8 ~, ~@8 a#3@7 ~@57, ~ c#4 ~@6, ~@2 f#4 ~@9]/3", // F#
})).s("gm_electric_guitar_clean").gain(0.3)

// chords · acoustic guitar steel · "RHYTHM GU"
const acoustic_guitar_steel = note(`<
  ~@2 A B@4 C@2 D@2 E@2 F B@4 C@2 D@2 E@2 F B@4 C@2 D@2 E@2 F B@4 C@2 D@2 E@2 F B@4 C@2 D@2 E@2 F B@4 C@2 D@2 E@2 F G
  H@3
>`.pickRestart({
  A: "~@3 [f#3,a#3,c#4]@5 ~@7 f#3@3 f#3@2 ~ [f#3,a#3,c#4] ~@2, [f#2,c#3]@4 [f#2,c#3]@2 [f#2,c#3]@4 [f#2,c#3] ~, ~@3 [f#3,a#3,c#4]@2 [a#3,c#4]@2 ~", // F# F#5 F# A#m
  B: "[~@3 f#3@3 f#3@2 ~@7 f#3@3 f#3@2 ~@7 f#3@3 f#3@2 ~@7 f#3@3 f#3@2 ~@7 f#3@3 f#3@2 ~@7 f#3@3 f#3@2 ~@7 f#3@3 f#3@2 ~@13 [f#3,a#3,c#4]@3, f#2@12 [f#2,c#3]@8 [f#2,c#3]@4 [f#2,c#3]@8 [f#2,c#3]@4 [f#2,c#3]@8 [f#2,c#3]@4 [f#2,c#3]@8 [f#2,c#3]@4 [f#2,c#3]@7 ~ [f#2,c#3]@4 [f#2,c#3]@8 [f#2,c#3]@4 [f#2,c#3]@6 [f#2,c#3]@6, c#3@7 ~ c#3@4 ~@15 c#4@6 [f#3,c#4]@6 ~@6 [f#3,a#3,c#4]@6 ~@6 [f#3,a#3,c#4]@6 ~@6 [f#3,a#3,c#4]@6 ~@6 [f#3,a#3,c#4]@6 [f#3,a#3,c#4]@6 ~@3, ~ [a#3,c#4]@2 [f#3,a#3,c#4]@2 [a#3,c#4]@2 [f#3,a#3,c#4]@2 a#3@4 [a#3,c#4]@2 ~@2 [a#3,c#4]@2 ~@2 [a#3,c#4]@2 ~@2 [a#3,c#4]@2 ~@5]/4", // F# F#5 F# A#m F# A#m F# A#m
  C: "[~@3 b3@3 b3@2 ~@19 b3@3 b3@2 ~@13 [b3,d#4,f#4]@3, [b2,f#3]@4 [b2,f#3]@2 [b2,f#3]@3 [b2,f#3]@3 [b2,f#3]@4 b2@2 b2@3 [b2,f#3]@3, ~ f#4@8 [d#4,f#4]@2 [b3,d#4,f#4]@2 [b3,d#4,f#4]@2 ~, ~@3 d#4@6 [b3,d#4]@6 [b3,d#4]@6 [b3,d#4]@6 ~@5 f#3@10 ~@6]/2", // B B5 D#m B
  D: "[~@3 a#3@3 a#3@2 ~@7 a#3@3 a#3@2 ~@7 a#3@3 a#3@2 ~@7 a#3@3 a#3@3 [a#3,c#4,f#4]@3, [f#2,c#3]@2 [f#2,c#3] [f#2,c#3]@2 [f#2,c#3] c#3@3 ~@3, ~ [c#4,f#4]@2 [a#3,c#4,f#4]@2 [c#4,f#4]@2 [a#3,c#4,f#4]@2 [c#4,f#4]@2 [a#3,c#4,f#4]@2 [c#4,f#4]@2 ~, ~@6 f#2@2 f#2 [f#2,c#3]@3]/2", // F# F#5 F# F#5 F# F#5 F# F#5
  E: "[~@3 [c#4,f4,g#4]@6 [c#3,c#4,f4,g#4]@6 [c#3,c#4,f4,g#4]@5 ~@7 b3@3 b3@3 b3@3 ~@3 c#4@3 c#4@3 [c#4,f4,g#4]@3, c#3@9 ~@11 c#3@4 c#3@9 [c#3,f4]@6 c#3@9, ~ b3@8 ~@3 b3@4, ~@7 [c#4,g#4]@6 ~@3, ~@7 f4@2 f4@2 ~@2 [f4,g#4]@2 ~]/2", // C# C#5 Fm
  F: "~@3 f#3@3 f#3@2 ~@7 f#3@3 f#3@2 ~ [f#3,a#3,c#4]@2 ~, [f#2,c#3]@8 [f#2,c#3]@4 c#3@11 ~, ~ [a#3,c#4]@2 [f#3,a#3,c#4]@2 [a#3,c#4]@2 ~, ~@12 f#2@8 f#2@3 ~", // F# F#5 A#m F# A#m
  G: "~@3 c#4@3 c#4@2 ~ c#4@3 c#4@3 c#4@3 c#4@3 [c#4,f4,g#4]@3, c#3@8 c#3@7 c#3@9, ~ [f4,g#4]@2 [f4,g#4]@2 [f4,g#4]@2 ~", // C# Fm
  H: "[~@3 a#3@3 a#3@2 ~ [a#3,c#4,f#4]@3 [f#2,a#3,c#4,f#4]@3 [f#2,a#3,c#4,f#4]@3 [f#2,a#3,c#4,f#4]@38 ~@16, f#2@2 f#2 ~@15, ~ [c#4,f#4]@2 ~@21]/3", // F# F#5
})).s("gm_acoustic_guitar_steel").gain(0.3)

// bass · electric bass pick · "BASS"
const bass = note(`<
  ~ A B C D E F G H I J K L M C D E F G H I J K L M C D E F G H I J K L M C D E F G H I J K L M C D E F G H I J K L M C
  D E F G H I J K L M K N@3
>`.pickRestart({
  A: "c#3@6 g#2@5 ~ c#3@6 g#2@6", B: "f#3 c#3 f#3 c#3", C: "f#2 c#3 f#3 c#3", D: "f#2@6 c#3@5 ~ f#3@5 ~ c#3@6",
  E: "f#2@6 c#3@6 f#3@5 ~ c#3@5 ~", F: "f#2@5 ~ c#3@5 ~ f#3@6 c#3@4 ~@2", G: "b2@5 ~ f#2@5 ~ b2@6 f#2@5 ~",
  H: "b2@6 f#2@5 ~ b2@6 f#2@5 ~", I: "f#3@5 ~ c#3@5 ~ f#3@5 ~ c#3@5 ~", J: "f#3@5 ~ c#3@5 ~ f#3@5 ~ c#3@3 f#2@3",
  K: "c#3@5 ~ g#2@5 ~ c#3@6 g#2@5 ~", L: "c#3@6 g#2@5 ~ c#3@5 ~ g#2@5 ~", M: "f#3@5 ~ c#3@5 ~ f#3@6 c#3@5 ~",
  N: "[f#3@2 c#3@2 f#2 c#3 f#2@13 ~@5]/3",
})).s("gm_electric_bass_pick").gain(0.35)

// drums · kick
const kick = s("bd").struct(`<
  ~@2
  [x!4]!33
  [x ~@5 x ~@5 x ~@5 x ~@4 x]
  [x!4]!21
  [x ~@5 x ~@5 x ~@5 x ~@4 x]
  [x!4]!12
  [x ~@5 x ~@5 x ~@4 x!2 ~@5]
  ~@2
>`).gain(0.5)

// drums · rim
const rim = s("rim").struct("<~@2 A@22 B ~@11 A@10 B ~@11 A@10 B ~@4>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct("<~@24 A B@11 ~@10 A B@11 ~@10 A B C ~@2>".pickRestart({
  A: "~@23 x", B: "~ x ~ x ~ x ~ x", C: "~ x ~ x ~ x ~@2",
})).gain(0.5)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@24 A ~@10 B ~@10 A ~@10 B ~@10 A ~ C ~@2>".pickRestart({
  A: "~@20 x!3 ~", B: "~@5 x", C: "~@7 x ~@4",
})).gain(0.1)

// drums · hihat
const hihat = s("hh").struct("<~@2 A@22 B A@21 B A@21 B A C ~@2>".pickRestart({
  A: "x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x", B: "~@2 x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x",
  C: "x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x ~@9",
})).gain(0.15)

// drums · open hat
const open_hat = s("oh").struct("<A ~@23 B ~@21 B ~@21 B ~ C ~@2>".pickRestart({
  A: "~@5 x ~ x", B: "x", C: "~@3 x",
})).gain(0.5)

// drums · crash
const crash = s("cr").struct("<~@70 [~@3 x] ~@2>").gain(0.5)

// drums · ride
const ride = s("rd").struct("<~@25 [x!4]!11 ~@11 [x!4]!11 ~@11 [x!4] [x!3 ~] ~@2>").gain(0.5)

stack(
  piano, electric_guitar_clean, acoustic_guitar_steel, bass, kick, rim, snare, snare_soft, hihat, open_hat, crash, ride
)

More by Johnny Cash