Strudelify

Fantasy Girl

.38 Special

KeyE majorTempo175 bpm
0:00/0:00
// Fantasy Girl — .38 Special
// 175 bpm, 3/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 175 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(175/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.

// chords · overdriven guitar · "Guitar 1"
const overdriven_guitar = note(`<
  A B A C D@4 A B A C D@4 A B A B D@4 A B A B D@4 E F A@2 G H I@4 J@2 K L M@2 N O J@2 K L P@4 A B A B D@4 A B A B D@4 E
  F A@2 G H I@4 J@2 K L M@2 N O J@2 K L P@4 A B A B D@4 A B A B D@4 E F A@2 G H I@4 Q@2 R S T@2 N O Q@2 R S T@2 N O Q@2
  R S T@2 N O Q@2 R S T@2 N O Q@2 R S T@2 N O Q@2 R S T@2 N O U
>`.pickRestart({
  A: "[e3,g#3,b3]", B: "[e3,a3,b3]@3 ~@2 [e3,a3,b3]@11", C: "b2@3 c#3@2 e3@3 e3@3 f#3@2 g#3@3",
  D: "[[b3,d#4,f#4]@8 [b3,d#4,f#4]@3 ~@2 [a3,d#4,f#4]@19]/2", E: "[c#4,e4,g#4]@5 [c#4,e4,g#4]@5 ~@6",
  F: "[a3,c#4,e4]@5 [a3,c#4,e4]@5 ~@6", G: "[a3,c#4,e4]", H: "[g#3,b3,e4]", I: "[b3,d#4,f#4]/2",
  J: "[e3,g#3,b3]@5 [e3,g#3,b3]@5 ~@6", K: "[d3,f#3,a3]@5 [d3,f#3,a3]@5 ~@6", L: "[c#3,e3,a3]@5 [c#3,e3,a3]@5 ~@6",
  M: "[b2,d#3,f#3]/2", N: "a2@5 c#3@5 ~ e3@5", O: "b2@5 d#3@5 ~ f#3@5", P: "[b2,d#3,f#3]@5 [b2,d#3,f#3]@5 ~@6",
  Q: "[e3,g#3,b3]@5 [e3,g#3,b3]@3 ~@8", R: "[d3,f#3,a3]@5 [d3,f#3,a3]@3 ~@8", S: "[c#3,e3,a3]@5 [c#3,e3,a3]@3 ~@8",
  T: "[b2,d#3,f#3]@5 [b2,d#3,f#3]@3 ~@8", U: "[e3,g#3,b3]@5 ~@11",
})).s("gm_overdriven_guitar").gain(0.26).pan(0.3)

// bass · electric bass finger · "Bass"
const bass = note(`<
  A@4 B@4 A@4 B@4 C@4 D@4 C@4 D@4 E F C@2 F G D@4 C@2 H F D@2 I J C@2 H E D@4 C@4 D@4 C@4 D@4 E F C@2 F G D@4 C@2 H F
  D@2 I J C@2 H E D@4 C@4 D@4 C@4 D@4 E F C@2 F G D@4 K@2 L M N@2 I J K@2 L M N O I J K@2 L M N O I J K@2 L M N O I J
  K@2 L M N O I J K@2 L M N O I J P
>`.pickRestart({
  A: "e2/2", B: "b1/2", C: "e2", D: "b1", E: "c#2", F: "a1", G: "g#1", H: "d2", I: "a1@5 c#2@5 ~ e2@5",
  J: "b1@5 d#2@5 ~ f#2@5", K: "e2@5 e2@3 b1@3 c#2@2 b1@3", L: "d2@5 d2@3 ~@8", M: "a1@5 a1@3 a1@3 b1@2 c#2@3",
  N: "b1@5 b1@3 ~@5 f#1@3", O: "b1@5 b1@3 ~@8", P: "e2@5 ~@11",
})).s("gm_electric_bass_finger").gain(0.2)

// chords · distortion guitar · "Lead Guitar"
const distortion_guitar = note(`<
  A@2 B C D@2 ~@2 A@2 B C D@2 ~@2 A@4 E@2 F G A@4 E@2 F G H I A@2 J K L@2 M@2 N O P Q R S T U N O P Q L@4 A@4 E@2 F G
  A@4 E@2 F G H I B@2 J K V@2 M@2 N O P Q R S T U N O P Q L@4 W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AJ H I A@2 J K
  L@2 M@2 AL AM AN AO AP AQ AR AS AL AT AN AO AP AQ AR AS N O P Q R AU T U N O P Q R AU T U N O P Q R AU T U N O P Q R
  AU T U AV
>`.pickRestart({
  A: "[e3,g#3,b3]/2", B: "[e3,g#3,b3]", C: "e3@3 f#3@2 g#3@3 b3@3 c#4@2 e4@3", D: "[[d#4,f#4,b4]@27 ~@5]/2",
  E: "[b3 b3, [d#3,f#3]]/2", F: "[e3,g#3]@3 [f#3,a3]@2 [g#3,b3]@3 [g#3,b3]@3 [a3,c#4]@2 [b3,d#4]@3",
  G: "[d#4,f#4] [b3,d#4]", H: "[c#3,e3,g#3]@5 [c#3,e3,g#3]@3 ~@8", I: "[a2,c#3,e3]@5 [a2,c#3,e3]@3 ~@8",
  J: "[a2,c#3,e3]", K: "[g#2,b2,e3]", L: "[b2,d#3,f#3]/2", M: "[b2,d#3,f#3]!2",
  N: "[e3,g#3,b3]@5 [e3,g#3,b3]@3 ~@3 [a4,b4]@2 [a4,b4]@3", O: "[a4,b4]@3 [g#4,b4]@2 [g#4,b4]@3 [g#4,b4]@3 ~@5",
  P: "[d3,f#3,a3]@5 [d3,f#3,a3]@3 ~@8", Q: "[c#3,e3,a3]@5 [c#3,e3,a3]@3 ~@8",
  R: "[b2,d#3,f#3]@5 [b2,d#3,f#3]@3 ~@3 [e4,f#4]@2 [e4,f#4]@3", S: "[e4,f#4]@3 [d#4,f#4]@2 [d#4,f#4]@3 [d#4,f#4]@3 ~@5",
  T: "a2@5 c#3@5 ~ e3@5", U: "b2@5 d#3@5 ~ f#3@5", V: "[b2,d#3,f#3]", W: "g#4!2", X: "g#4@8 g#4@3 f#4@2 c#4@3", Y: "e4",
  Z: "g#4@5 e4@5 ~ f#4@5", AA: "f#4@11 d#4@2 c#4@3", AB: "b3", AC: "g#3@3 a3@2 b3@3 b3@3 c#4@2 d#4@3",
  AD: "f#4@8 d#4@5 b4@3", AE: "e5 b4", AF: "c#5@8 b4@5 a4@3", AG: "g#4@5 a4@3 b4@8",
  AH: "g#4@3 a4@2 b4@3 g#4@3 a4@2 b4@3", AI: "d#5 b4", AJ: "b4", AK: "b4@3 c#5@2 b4@3 f#5@3 c#5@2 d#5@3",
  AL: "[e4,a4]@3 [e4,a4]@2 [e4,g#4]@3 [e4,a4]@3 [e4,a4]@2 [e4,g#4]@3", AM: "[e4,g#4]@5 ~@11",
  AN: "[d4,f#4]@5 [d4,f#4]@3 ~@8", AO: "[c#4,e4]@5 [c#4,e4]@3 ~@8",
  AP: "[b3,e4]@3 [b3,e4]@2 [b3,d#4]@3 [b3,e4]@3 [b3,e4]@2 [b3,d#4]@3", AQ: "[b3,d#4]@3 ~@13", AR: "a3@5 c#4@5 ~ e4@5",
  AS: "b3@5 d#4@5 ~ f#4@5", AT: "e4@5 ~@11, g#4@3 ~@13", AU: "[e4,f#4]@3 [d#4,f#4]@3 ~@2 [d#4,f#4]@5 ~@3",
  AV: "[e3,g#3,b3]@5 ~@11", // E
})).s("gm_distortion_guitar").gain(0.38).pan(0.7)

// other · celesta · "Harmonics"
const celesta = note("<~@5 A B@2 ~@5 A B@2 ~@159>".pickRestart({
  A: "~ f#5", B: "b5/2",
})).s("gm_celesta").gain(0.22).pan(0.7)

// drums · kick
const kick = s("bd").struct(`<
  A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~@3 A ~ B A C ~ C@3 ~@3 C ~ C@3 ~ A@21 ~ A@3 ~ B A C ~ C@3
  ~@3 C ~ C@3 ~ A@2 C@16 A@8 D E D E A@6 D E A@39
>`.pickRestart({
  A: "x", B: "x!2", C: "x ~@4 x ~@10", D: "~@5 x ~@7 x ~@2", E: "~@5 x ~@10",
})).gain(0.52)

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

// drums · hihat
const hihat = s("hh").struct("<A@132 ~@2 A@6 ~@2 A@6 ~@2 A@6 ~@2 A@6 ~@2 A@6 ~@3>".pickRestart({
  A: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2",
})).gain(0.52)

// drums · mid tom
const mid_tom = s("mt").struct("<~@33 A ~@3 A ~@11 B ~@25 A ~@3 A ~@11 B ~@25 A ~@3 A ~@53>".pickRestart({
  A: "~@8 x ~@2 x ~ x ~@2", B: "x ~@4 x ~@5 x ~@4",
})).gain(0.52)

// drums · open hat
const open_hat = s("oh").struct("<~@126 [~ x] ~@7 [~ x] ~@40>").gain(0.52)

// drums · crash
const crash = s("cr").struct(`<
  A ~@3 A ~@3 A ~@3 A ~@19 B@2 A ~ B@2 A ~ C A@2 ~ A@3 ~ A@3 ~ A@3 ~@19 A@3 ~ A@3 ~ C A@2 ~ A@3 ~ A@3 ~ A@3 ~@3 A ~@15
  A@59
>`.pickRestart({
  A: "x", B: "x ~@4 x ~@10", C: "x!2",
})).gain(0.52)

// drums · high tom
const high_tom = s("ht").struct("<~@32 A ~@3 A ~@11 B ~@25 A ~@3 A ~@11 B ~@25 A ~@3 A ~@54>".pickRestart({
  A: "~@8 x ~@2 x ~ x ~@2", B: "x ~@4 x ~@5 x ~@4",
})).gain(0.52)

stack(overdriven_guitar, bass, distortion_guitar, celesta, kick, snare, hihat, mid_tom, open_hat, crash, high_tom)

More by .38 Special