Strudelify
Fortunate Son cover art

1968 · Willy and the Poor Boys

Fortunate Son

Creedence Clearwater Revival

KeyG majorTempo140 bpm
0:00/0:00
// Fortunate Son — Creedence Clearwater Revival
// 140 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 76 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(140/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 · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A B C D E F G H I J K L M N O H M N P Q E F G H I J K L M N P Q M N P Q R S T U R S T U E F G H I J K L M N P Q M N P
  Q M N P Q V W P Q X ~@7
>`.pickRestart({
  A: "a#3 c4 g4@14", B: "g#3 a3 f4@14", C: "f3 g3 e4@14", D: "f3 g3 d4@14",
  E: "~ g4!2 e4 [b3,d4,g4]@2 [b3,d4]@2, [b3,d4]!2 ~@2", F: "a4 g4!2 e4 [a3,g4]@2 [a3,c4]@2, c4 a3 ~@2",
  G: "e4@2 a#4@2 a#3@2 e4 [a#3,g4]", H: "[b3,d4,g4] [b3,d4]!3", I: "~ g4!2 e4 [b3,d4,g4]@2 [b3,d4,g4]@2, [b3,d4] ~@3",
  J: "[c4,a4]@2 g4 e4 [a3,g4]@2 [a3,c4]@2, ~ a3 ~@2", K: "~ e4 g4!6, g3!3 [g3,e4]", L: "[b3,d4,g4]!3 [b3,d4]",
  M: "~ g4 [b3,d4,g4]@2 [b3,d4,g4]@2 [b3,d4]@2", N: "~ a4 [c4,a#4]@2 a4 g4 c4@2, c4 ~ c4 ~",
  O: "~ a#4!2 e4 g4!2 [a#3,e4,g4]@2, e4 a#3!2 ~", P: "~ e4@2 a#4!2 e4 g4!2, ~@2 a#3!2", Q: "[b3,d4]!3 ~", R: "[d4,f4]",
  S: "[c#4,e4]@3 [c#4,e4]", T: "[a3,c4]", U: "[a3,c4] [b3,d4]@7", V: "[g3,d4]@4 e4 [g4,b4]@2 e4",
  W: "[d3,a3,d4]@4 b3 d4@2 b3", X: "~ g4 ~@6",
})).s("gm_acoustic_guitar_steel").gain(0.17).pan(0.2)

// chords · acoustic guitar steel · soft notes
const acoustic_guitar_steel_2 = note("<~@68 A B C D E B C D>".pickRestart({
  A: "~ [b3,d4,g4]!2 [b3,d4]", B: "~ a4 [c4,a#4]@2 a4 g4 c4@2, c4 ~ c4 ~", C: "~ e4@2 a#4!2 e4 g4!2, ~@2 a#3!2",
  D: "[b3,d4]!3 ~", E: "~ g4 [b3,d4,g4]@2 [b3,d4,g4]@2 [b3,d4]@2",
})).s("gm_acoustic_guitar_steel").gain(0.05).pan(0.2)

// bass · fretless bass
const bass = note(`<
  A@3 B C D E F C D E F C G H F C G H F C D E F C D E F C G H F C G H F A@2 I A@3 I A C D E F C D E F C G H F C G H F C
  G H F C G H F J ~@7
>`.pickRestart({
  A: "g2!8", B: "g2@2 g2@2 g2@2 g2@2 a#2 b2 g2@2 g2@2 g2@2", C: "g2!4", D: "f2!4", E: "c3!4", F: "g2@2 g2@2 g2@2 g2 d2",
  G: "[d3,f#3]!4", H: "[c3,g3]!2 c3!2", I: "g2!6 g2@2", J: "g2 ~@3",
})).s("gm_fretless_bass").gain(0.35)

// bass · fretless bass · soft notes
const bass_soft = note("<~@68 A B C D E B C F>".pickRestart({
  A: "~ g2!3", B: "[d3,f#3]!4", C: "[c3,g3]!2 c3!2", D: "g2@2 g2@2 g2@2 g2 d2", E: "g2!4", F: "g2@2 g2@2 g2@2 g2 ~",
})).s("gm_fretless_bass").gain(0.1)

// other · acoustic guitar steel
const acoustic_guitar_steel_3 = note(`<
  A B C D E ~@2 F G ~@2 H I J K L I J M N I ~@2 O I ~@2 P I J M Q I J M R S T U V S T U V I ~@2 O I ~@2 P I J M Q I J M
  R I J M Q I J M R I ~@7
>`.pickRestart({
  A: "b4 g5@7", B: "a#4 f5@7", C: "f4 g4 e5@14", D: "f4 g4 d5@14", E: "[g3,d4,g4]",
  F: "~@2 [f4,a#4] [g4,b4]@2 e4 g4 b3", G: "g3", H: "~@2 b3 g3 [d4,g4] f4 [d4,g4] b3", I: "[g3,d4]", J: "d3!2 f3 d4@5",
  K: "c4@2 e4 c5@3 b4 a4", L: "g4@2 a#3@2 g3!2 b3@2", M: "c4 d#4 e4 c5@3 b4 a4", N: "g4@2 f4@2 e4 d4 a#3 g4",
  O: "~@2 b3 g3 g4 e4 g4 b3", P: "~@2 [f4,a#4] [g4,b4]@2 f4 g4 b3", Q: "g4@2 b4@2 a4 g4 e4 g4", R: "g4 b3 [b3,d4]@2",
  S: "[d5,f5]", T: "[c#5,e5]@3 [c#5,e5]", U: "[a4,c5]", V: "[a4,c5] [b4,d5]@7",
})).s("gm_acoustic_guitar_steel").gain(0.4).pan(0.8)

// other · acoustic guitar steel · soft notes · G5 Bm
const acoustic_guitar_steel_4 = note(`<
  ~@69
  [d3!2 f3 d4@5]
  [c4 d#4 e4 c5@3 b4 a4]
  [g4@2 b4@2 a4 g4 e4 g4]
  [[g3,d4]]
  [d3!2 f3 d4@5]
  [c4 d#4 e4 c5@3 b4 a4]
  [g4 b3 [b3,d4]@2]
>`).s("gm_acoustic_guitar_steel").gain(0.15).pan(0.8)

// chords · distortion guitar
const distortion_guitar = note(`<
  A@4 B C D B@2 C D E F G H I F G H I B C D B@2 C D E F G H I F G H I J@4 K@4 B C D B@2 C D E F G H I F G H I F G H I F
  G H I L ~@7
>`.pickRestart({
  A: "[~@4 a#3 g3@23 a#3 g3@3]/4", B: "[g3,d4,g4]!2 ~ [g3,d4,g4] ~ [g3,d4,g4]@2 e3",
  C: "[f3,c4,f4]!2 ~ [f3,c4,f4] ~ [f3,c4,f4]@2 [f3,c4,f4]", D: "[g3,c4,g4]!2 ~ [g3,c4,g4] ~ [g3,c4,g4]@2 [g3,c4,g4]",
  E: "[g3,d4,g4]!2 ~ [g3,d4,g4] ~ [g3,d4,g4]@2 [e3,c4,e4]", F: "[g3,d4,g4]!2 ~ [g3,d4,g4] ~ [g3,d4,g4]@2 [d3,a3,d4]",
  G: "[d3,a3,d4]!2 ~ [d3,a3,d4] ~ [d3,a3,d4]@2 [d3,a3,d4]", H: "[c3,g3,c4]!2 ~ [c3,g3,c4] ~ [c3,g3,c4]@2 [c3,g3,c4]",
  I: "[g3,d4,g4]!2 ~ [g3,d4,g4] ~ [g3,b3,d4,g4]!3", J: "g3!8", K: "g3", L: "[g3,d4,g4]!2 ~@6",
})).s("gm_distortion_guitar").gain(0.12).pan(0.4)

// chords · distortion guitar · soft notes
const distortion_guitar_soft = note("<~@68 A B C D E B C F>".pickRestart({
  A: "~@3 [g3,d4,g4] ~ [g3,d4,g4]@2 [d3,a3,d4]", B: "[d3,a3,d4]!2 ~ [d3,a3,d4] ~ [d3,a3,d4]@2 [d3,a3,d4]",
  C: "[c3,g3,c4]!2 ~ [c3,g3,c4] ~ [c3,g3,c4]@2 [c3,g3,c4]", D: "[g3,d4,g4]!2 ~ [g3,d4,g4] ~ [g3,b3,d4,g4]!3",
  E: "[g3,d4,g4]!2 ~ [g3,d4,g4] ~ [g3,d4,g4]@2 [d3,a3,d4]", F: "[g3,d4,g4]!2 ~ [g3,d4,g4] ~ [g3,b3,d4,g4]!2 ~",
})).s("gm_distortion_guitar").gain(0.05).pan(0.4)

// drums · kick
const kick = s("bd").struct(`<
  A B A B A B A B A B A B A B A B A B A C A B A D A B A B A B A E A B A F C D C@3 D C G A B A H A B A B A B A D A B A F
  G A B A I J K L ~@8
>`.pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "x ~@2 x!3 ~ x", C: "x!2 ~ x!3 ~ x", D: "x!2 ~ x ~ x ~ x", E: "~@4 x!2 ~@2",
  F: "~ x!2 ~ x!2 ~@2", G: "~@9 x ~@6", H: "~ x ~@6", I: "x ~@2 x!3 ~@2", J: "x ~@2 x!2 ~@3", K: "x!2 ~ x ~@4",
  L: "~@7 x",
})).gain(0.36)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@64 A@2 ~@2 B C B D B C B E>".pickRestart({
  A: "~@7 x", B: "x ~@2 x!2 ~@2 x", C: "x ~@2 x!3 ~ x", D: "x!2 ~ x!3 ~ x", E: "x!2 ~ x ~ x ~@2",
})).gain(0.1)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@19 A ~@6 B ~@8 C ~@7 D ~@15 C D ~@15>".pickRestart({
  A: "~@2 x!6", B: "~@5 x ~@2", C: "~@3 x", D: "~@7 x",
})).gain(0.31)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@71 [~@2 x!6] ~@4>").gain(0.1)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@66 [~ x ~@6] ~ [~ x ~ x!3 ~ x] [x!8]!4 [x!7 ~] [x!8] [x!2 ~@6]>").gain(0.1)

// drums · mid tom
const mid_tom = s("mt").struct("<~@35 A ~@7 B ~@3 C ~@11 A B ~@15>".pickRestart({
  A: "~@3 x ~@2 x ~", B: "~@13 x ~@2", C: "~@4 x!2 ~@2",
})).gain(0.41)

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

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@71 [x!4] ~ [~@7 x] ~ [~ x ~@2]>").gain(0.15)

// drums · high tom
const high_tom = s("ht").struct("<~@35 x ~@11 [~ x ~@2] ~@11 x ~@16>").gain(0.41)

// drums · ride
const ride = s("rd").struct(`<
  A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@7 A ~@3 A ~ A ~@3 A ~ A ~@3 A ~@7 A ~@4 A ~@6 A ~@3 A ~@3
>`.pickRestart({
  A: "x",
})).gain(0.36)

// drums · tambourine
const tambourine = s("tb").struct("<~@19 A ~@16 A ~ A@3 ~ A ~@33>".pickRestart({
  A: "x!8",
})).gain(0.36)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@71 [x!8] ~@4>").gain(0.15)

stack(
  acoustic_guitar_steel, acoustic_guitar_steel_2, bass, bass_soft, acoustic_guitar_steel_3, acoustic_guitar_steel_4,
  distortion_guitar, distortion_guitar_soft, kick, kick_soft, snare, snare_soft, low_tom, low_tom_soft, hihat,
  hihat_soft, mid_tom, open_hat, open_hat_soft, high_tom, ride, tambourine, tambourine_soft
)

More by Creedence Clearwater Revival