Strudelify

Fooled Around and Fell in Love

Elvin Bishop

KeyF majorTempo113 bpm
0:00/0:00
// Fooled Around and Fell in Love — Elvin Bishop
// 113 bpm, 3/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 112 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(113/3)

// 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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A B C D E F G H A B C D E F G H A B C D E F G H I J K L M N O P Q R S T M N O U V W X Y Z AA AB AC Z@2 AD AE A B C D
  E F G H A B C D E F G H A B C D E F G H I J K L M N O P Q R S T M N O U I J K L M N O P I J K L M N O P AF@2 AG
>`.pickRestart({
  A: "f2@9 ~@4 f2@3", B: "a2@7 ~ c3@4 ~ d3@3", C: "a2@11 ~@2 e2@2 ~", D: "a2@8 e2@2 ~ a2@2 e2@2 ~",
  E: "eb2@9 ~@2 c2@2 d2@2 ~", F: "eb2@9 ~@2 ab1@2 a1@2 ~", G: "bb1@9 ~@2 d2@2 f2@2 ~",
  H: "bb2@6 ~@2 g2@2 ~ f2@2 d2@2 ~", I: "f2@12 ~ f2@2 ~", J: "a2@7 ~ c3@4 ~ d3@2 ~", K: "a2@4 ~ a2@2 ~ g2@4 ~ g2@2 ~",
  L: "e2@4 ~ e2@2 ~ c2@2 ~ d2@2 c2@2 ~", M: "eb2@10 ~ c2@2 d2@2 ~", N: "eb2@10 ~ ab1@2 a1@2 ~",
  O: "bb1@5 bb1@2 ~ d2@4 ~ d2@2 ~", P: "f2@4 ~ f2@2 ~ d2@2 ~ eb2@2 e2@2 ~", Q: "f2@13 a2@2 ~", R: "[f2,c3]@3 ~@13",
  S: "a2@12 ~ e2@2 ~", T: "a2@7 ~ e2@2 ~ a2@2 e2@2 ~", U: "f2@4 ~ f2@2 ~ g2@5 bb2@2 ~", V: "c3@7 ~ g2@7 ~",
  W: "e2@5 d3@2 ~ e3@2 ~ d3@2 c3@2 ~", X: "bb2@7 ~ f2@7 ~", Y: "d2@7 ~ bb1@2 ~ f1@2 gb1@2 ~", Z: "g1@7 ~ g1@7 ~",
  AA: "g1@7 ~ g1@6 ~@2", AB: "g1@7 ~ g1@2 ~ g1@2 bb1@2 ~", AC: "c2@8 c2@7 ~", AD: "g1@7 ~ g1@5 g1@2 ~",
  AE: "c2@4 ~ c2@2 ~ c2@2 ~ c2@2 c2@2 ~", AF: "[f2@29 c3@2 a2]/2", AG: "f2@3 ~@13",
})).s("gm_acoustic_bass").gain(0.57)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~ A@2 B@2 C@2 D E F@2 G@2 H I J K L@2 M@2 N O P Q L@2 M@2 N O R S T@2 M@2 N O R S ~@12 L@2 M@2 N O R S L@2 M@2 N O R S
  L@2 M@2 N O P Q L@2 M@2 N O R S T@2 M@2 N O R S L@2 M@2 N O R S L@2 M@2 N O R S U@3
>`.pickRestart({
  A: "[f5@22 ~@2 c5@3 f5@2 c5@3]/2", B: "[e5@19 ~@2 c6@2 ~ c6@5 g5@2 ~]/2", C: "[eb5@21 bb5@2 ~ bb5@2 ~ a5@2 g5@2 ~]/2",
  D: "~@8 [f4,c5]@7 ~, bb5@3 ~", E: "f4@6 ~@7 bb4@3, ~ f4, ~@11 d5@5",
  F: "[f5@19 a4@2 ~@8 c5@2 ~, c5@18 ~@3 c5@5 ~ a4@4 ~, ~@12 f5@3 ~]/2",
  G: "[[a4,c5]@12 ~@17 c5 ~@2, e5@26 ~ e5@4 ~, ~@13 c5@13 ~@6, ~@21 a4@9 ~@2]/2", H: "[bb4,eb5]@10 ~ c5@2 d5 ~@2",
  I: "~@11 c5@2 bb4 ~@2, eb5@13 ~@3", J: "bb4@11 f4@2 bb4@2 ~, d5@13 ~@3",
  K: "[f4,bb4,d5]@2 ~ [g4,bb4,eb5]@2 [f4,d5]@5 ~ c5@2 f5@2 ~, ~@5 bb4@8 ~@3", // Bb Eb Dm
  L: "[~@21 f5@4 ~@4 c5@2 ~, a5@15 ~ a5@13 ~@3, ~@5 c5@7 ~@7 c5@7 ~@6, ~@8 f5@12 ~@7 f5@4 ~]/2",
  M: "[c5@13 ~@14 g5@2 e5 ~@2, g5@3 ~, e5@11 ~@2 e5@13 ~@6, ~@21 c5@9 ~@2]/2", N: "g5@13 ~@3, eb5@11 ~@5",
  O: "g5@5 g5@5 ~ eb5@3 ~@2", P: "~ c6@5 ~@2 bb5@3 [c6,f6]@2 bb5@2 ~, f6 ~, d6 ~@7",
  Q: "d6@10 ~ c6@2 bb5@2 ~, f6, db6 ~@15", R: "d5@10 ~@3 d5@3, f5",
  S: "~@8 d5@3 ~@2 d5@2 ~, ~@3 d5@4 ~@4 f5@4 ~, ~@5 bb5@10 ~",
  T: "[~@16 a5@3 ~@10 c5@2 ~, a5@15 ~@17, ~@5 c5@7 ~@20, ~@2 f5@3 ~@3]/2", U: "[a5@35 ~@13]/3",
})).s("gm_piano").gain(0.56)

// chords · piano · "A.PIANO 1" · soft notes
const piano_soft = note(`<
  ~@7 A B ~@2 C@2 ~ D ~@2 E@2 ~@2 F G H ~ E@2 ~@2 F G I J E@2 ~@2 F G I J ~@12 E@2 ~@2 F G I J E@2 ~@2 F G I J E@2 ~@2 F
  G H ~ E@2 ~@2 F G I J E@2 ~@2 F G I J E@2 ~@2 F G I J E@2 ~@2 F G I J ~@3
>`.pickRestart({
  A: "~@8 bb4@7 ~", B: "bb4@3 ~, d5 ~", C: "[~@13 a4@6 ~@13]/2", D: "bb4@5 ~@3", E: "[~@15 c5@3 ~@14]/2",
  F: "~@13 eb5@3, ~@11 bb4@4 ~", G: "~@3 eb5@7 ~@6", H: "~@8 c6 ~@7", I: "~@11 d5 ~@4", J: "bb5 ~@3",
})).s("gm_piano").gain(0.32)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~ A@2 B A C@2 D E A@2 B A C@2 D E A@2 B A C@2 D E A@2 B A C@2 D E A ~ B A C@2 D E F G H@2 I J K L I M N O A@2 B A C@2
  D E A@2 B A C@2 D E A@2 B A C@2 D E A@2 B A C@2 D E A ~ B A C@2 D E A@2 B A C@2 D E A@2 B A C@2 D E ~@3
>`.pickRestart({
  A: "~@4 [a5,c6] ~@3", B: "~@4 c6 ~@3", C: "~@4 [g5,c6] ~@3", D: "~@4 [bb5,c6] ~@3", E: "~@4 [bb5,d6] ~@3",
  F: "g5@4 ~@7 c6@5, c6@5 ~@3, ~@5 g5@10 ~", G: "c6@4 ~ c6@3 g5@3 ~@2 g5@2 ~, g5@8 ~@3 c6@4 ~",
  H: "[f5@4 ~ f5@7 ~@9 bb5@5 ~ [f5,bb5]@2 f5 ~@2, bb5@15 ~ bb5@5 ~@11, ~@13 f5@5 ~ f5@7 ~@6]/2", // Bb5
  I: "g4@3 bb4@2 d5@3 g5@3 d5@2 bb4@3", J: "gb4@3 bb4@2 d5@2 ~ gb5@3 d5@2 bb4@2 ~",
  K: "f4@2 ~ bb4@2 d5@2 ~ f5@3 d5@2 bb4@3", L: "e4@3 g4@2 c5@3 e5@3 c5@2 g4@2 ~",
  M: "gb4@3 bb4@2 d5@3 gb5@3 d5@2 bb4@2 ~", N: "f4@3 bb4@2 d5@3 f5@3 d5@2 bb4@3",
  O: "g4@3 ~@2 e5@3 g5@3 e5@2 c6@2 ~, ~@3 c5@5 ~@8",
})).s("gm_acoustic_guitar_steel").gain(0.41)

// chords · percussive organ · "ORGAN 2"
const percussive_organ = note(`<
  ~ A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 F@2 G@2 H@3 I H@3 J A@2 B@2 C@2 D@2
  A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 K@3
>`.pickRestart({
  A: "[[a4,c5,f5]@15 ~]/2", B: "[[a4,c5,e5]@29 ~@3]/2", C: "[[bb4,eb5,g5]@15 ~]/2", D: "[[bb4,d5,f5]@31 ~]/2",
  E: "[[a4,c5,f5]@19 ~@13]/2", F: "[[e5,g5,c6]@31 ~]/2", G: "[[d5,f5,bb5]@15 ~]/2",
  H: "[[d5,g5]@15 ~ [d5,gb5]@15 ~ [d5,f5]@15 ~, bb5@47 ~]/3", I: "[c5,e5,g5]@15 ~", J: "[e5,g5,c6]",
  K: "[[a4,c5,f5]@35 ~@13]/3", // F
})).s("gm_percussive_organ").gain(0.4)

// chords · flute
const flute = note(`<
  ~ A B C D E F G H ~@18 C I ~@2 J K ~@2 C I ~@2 J K ~@22 C I ~@2 J K ~@10 C I ~@2 J K ~@2 C I ~@2 J K ~@2 C I ~@2 J K
  ~@2 C I ~@2 J K ~@3
>`.pickRestart({
  A: "[a5,c6]@7 ~ [f5,a5]@7 ~", B: "[c5,f5]@7 ~ [a5,c6]@7 ~", C: "[a5,c6]@7 ~ [e5,a5]@7 ~", D: "[c5,e5]@11 ~@5",
  E: "[g5,c6]@7 ~ [eb5,g5]@7 ~", F: "[bb4,eb5]@4 [g5,c6]@3 ~", G: "[f5,bb5]@4 [f5,c6]@3 ~",
  H: "[f5,d6]@2 ~ [g5,eb6]@2 [f5,d6]@10 ~", I: "[c5,e5]@7 ~", J: "[f5,bb5,c6]@8 [f5,c6]@7 ~",
  K: "[f5,d6]@2 ~ [g5,eb6]@2 [f5,d6]@8 ~@3", // Dm Cm Dm
})).s("gm_flute").gain(0.29)

// drums · kick
const kick = s("bd").struct("<~ A@3 B A@29 C A@51 C A@22 D ~ D>".pickRestart({
  A: "x ~@4 x ~@7 x ~@2", B: "x ~@4 x ~@5 x ~ x ~@2", C: "x ~@12 x ~@2", D: "x",
})).gain(0.61)

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

// drums · low tom
const low_tom = s("lt").struct(`<
  A ~@22 B C ~@6 B C ~ B ~@4 B C ~@6 B C ~@2 B C ~@22 B C ~@6 B C ~ B ~@4 B C ~@6 B C ~@6 B C ~ D ~
>`.pickRestart({
  A: "~@8 x ~@2 x ~ x ~@2", B: "~@13 x ~@2", C: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2", D: "~@15 x",
})).gain(0.61)

// drums · hihat
const hihat = s("hh").struct(`<
  [~@8 x ~@2 x ~ x ~@2]
  [x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2]!33
  [x ~@12 x ~@2]
  [x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2]!51
  [x ~@12 x ~@2]
  [x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2]!22
  ~@2
  x
>`).gain(0.53)

// drums · mid tom
const mid_tom = s("mt").struct("<~@34 [~@2 x!2] ~@51 [~@11 x ~@4] ~@23 [~@13 x ~@2] ~>").gain(0.69)

// drums · high tom
const high_tom = s("ht").struct("<~@34 [~@4 x!2 ~@10] ~@51 [~@4 x!2 ~@2 x ~@7] ~@25>").gain(0.69)

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

// drums · ride
const ride = s("rd").struct("<~ A@33 ~ A@51 ~ A@22 B C ~>".pickRestart({
  A: "~ x", B: "~@7 x ~@3 x ~@3 x", C: "~@3 x ~@4 x ~@7",
})).gain(0.53)

stack(
  bass, piano, piano_soft, acoustic_guitar_steel, percussive_organ, flute, kick, snare, low_tom, hihat, mid_tom,
  high_tom, crash, ride
)