Strudelify

Rain

Alabama

KeyC majorTempo120 bpm
0:00/0:00
// Rain — Alabama
// 120 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 65 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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.

// other · electric guitar clean · "Lead Guitar"
const electric_guitar_clean = note(`<
  A B A B C D E F E G E H I J K L I M N O C D E F E G E H I J K L I M N P Q R S T U V W X Y Z AA E AB E AB E AB I J K L
  I M N P I M N AC
>`.pickRestart({
  A: "c4@2 c4 e4 d4@2 e4@2", B: "c4 f4 e4 d4", C: "c4@2 e4 g4 e4@2 g4 b4", D: "d4 a4 f4 c5 f5 d5 b4 g4",
  E: "c4@2 e4 g4 e4@2 b4 g4", F: "d4 a4 f4 c5 g4 b4 d5 g4", G: "d4 a4 c5 f4 g4 b4 f4 d5", H: "d4 c5 a4 f4 g4 d5 f5 b4",
  I: "f4@2 c5 a4 f4@2 a4 c5", J: "e4@2 b4 g4 e4@2 g4 b4", K: "d4 a4 f4 c5 d4 c5 a4 f4", L: "e4@2 b4 g4 e4@2 b4 g4",
  M: "a4@2 e5 a4 g4@2 d5 b4", N: "c4@4 ~@4 a4@3 g4@2 f4@3", O: "e4@3 g4 a4 g4 f4@2", P: "e4!2 f4 g4",
  Q: "f4@2 a4 c5 g4@2 f4@2", R: "e4 c4 e4 ~ a4 e4 b3 c4", S: "d4 a4 f4 c5 g4 d5 b4 f5", T: "c4@2 e4 g4!2 f5 c4 b4",
  U: "f4@2 a4 c5 g4 d5 f4 c5", V: "e4@2 g4 b4 a4@2 c5 e5", W: "d4@2 a4 b4 c5@2 d5@2",
  X: "b4@3 g4@2 b4@3 d5@3 b4@2 g4@3", Y: "d5@3 b4@2 g4@3 g4@4 g4@2 b4@2", Z: "c4@2 g4 e4 e4@2 b4 g4",
  AA: "d4 c5 f4 a4 g4 b4 f5 d5", AB: "d4 a4 f4 c5 g4 b4 f5 d5", AC: "g4 e4 [c4,e4,g4]@2",
})).s("gm_electric_guitar_clean").gain(0.05).pan(0.7)

// chords · acoustic guitar steel · "Guitar"
const acoustic_guitar_steel = note(`<
  A B A B C D C E C F G H I J K J I L M N C D C E C F G H I J K J I L M O P Q R S P Q T U V C D C E C F G H I J K J I L
  W X I L W Y
>`.pickRestart({
  A: "[e2,g2] [g2,b2]", B: "[f2,a2]@2 [g2,b2] [f2,b2]",
  C: "[c3,e3,g3]@2 [g2,c3,e3] [c3,e3,g3] [e3,g3,b3]@2 [b2,e3,g3]@2", // C Em
  D: "[d3,a3,c4]@6 ~ d3 [g3,b3,d4]@4 [f2,b3,d4]@4, ~@3 [c3,f3,a3] ~@4", // D7 G Bdim F
  E: "[f3,a3,c4]@6 ~ d3 [b3,d4,f4]@4 [f2,b3,d4]@4, ~@3 [c3,f3,a3] ~@4", // F Bdim F
  F: "[f3,a3,c4]@4 [c3,d3,f3]@2 ~ d3 [g3,b3,d4]@4 [f2,b3,d4]@4, ~@3 [f3,a3,c4] ~@4", // F Dm7 G Bdim F
  G: "[c3,e3,g3]@3 [g2,c3,e3] [e3,g3,b3]@2 [b2,e3,g3]@2", // C Em
  H: "[f3,a3,c4]@4 [c3,d3,f3]@2 ~ d3 [b3,d4,f4]@4 [f2,b3,d4]@4, ~@3 [f3,a3,c4] ~@4", // F Dm7 Bdim F
  I: "[f3,a3,c4]@3 [c3,f3,a3] [f3,a3,c4]@2 [c3,f3,a3]@2", J: "[e3,g3,b3]@3 [b2,e3,g3] [e3,g3,b3]@2 [b2,e3,g3]@2",
  K: "[d3,f3,a3]@6 ~ d3 [f3,a3,c4]@4 [d3,f3,a3]@4, ~@3 [c3,f3,a3] ~@4", // Dm F Dm F
  L: "[a2,c3,e3]@3 [e2,a2,c3] [g2,b2,d3]@3 [d2,g2,b2]", M: "[c3,e3,g3]@3 [g2,c3,e3] [f2,a2,c3]@3 [c2,f2,a2]",
  N: "[c3,e3,g3]@3 [g2,c3,e3] [d2,f2,a2]@2 [g2,b2,d3]@2", O: "[g2,c3,e3]!2 [b2,d3,f3] [e3,g3,b3]",
  P: "[f3,a3,c4]@3 [c3,f3,a3] [g3,b3,d4]@2 [f3,a3,c4]@2", Q: "[e3,g3,b3]@3 [b2,e3,g3] [a3,c4,e4]@2 [e3,a3,c4]@2",
  R: "[d3,f3,a3]@6 ~ a3 [b3,d4,f4]@4 [f3,b3,d4]@4, ~@3 [c3,d3,f3] ~@4", // Dm Bdim Dm7
  S: "[c3,e3,g3]@3 [g2,c3,e3] [b3,d4,f4]@2 [e3,g3,b3]@2", T: "[f3,a3,c4] ~@3", U: "[g3,b3,d4] ~@3",
  V: "[g3,b3,d4] ~ [g3,b3,d4] [d3,g3,b3]", W: "[c3,e3,g3]@3 [c3,e3,g3] [f2,a2,c3]@3 [c2,f2,a2]",
  X: "[c3,e3,g3]!2 [b2,d3,f3] [e3,g3,b3]", Y: "[c3,e3,g3]@3 [g2,c3,e3] [c3,e3,g3]@4",
})).s("gm_acoustic_guitar_steel").gain(0.05).pan(0.6)

// chords · acoustic guitar steel · "Guitar" · soft notes
const acoustic_guitar_steel_2 = note(`<
  ~@5 A ~ B ~ C ~ D ~@2 E ~@4 F ~ A ~ B ~ C ~ D ~@2 E ~@4 G ~@2 H I ~@2 J ~@3 A ~ B ~ C ~ D ~@2 E ~@4 G ~@4
>`.pickRestart({
  A: "~ f3@5 ~@3 f4@3 ~ g3@3", B: "~ d3@5 ~@3 g3@3 ~ g3@3", C: "~ d3@3 ~ a3 ~@3 f4@3 ~ g3@3",
  D: "~ d3@3 ~ a3 ~@3 g3@3 ~ g3@3", E: "~ c4@5 ~@3 d3@3 ~ c3@3", F: "~@9 c3@3 ~ f3@3", G: "~@9 g2@3 ~ c3@3",
  H: "~ c4@5 ~@3 g3@3 ~ g3@3", I: "~@9 g3@3 ~ c3@3", J: "~ d3@3 ~@12",
})).s("gm_acoustic_guitar_steel").gain(0.03).pan(0.6)

// bass · electric bass finger · "Bass"
const bass = note(`<
  A B A B C D C E C D C F G H I H J K L M C D C E C D C F G H I H J K L N O P D N O P Q R S C D C E C D C F G H I H J K
  T U V W X Y
>`.pickRestart({
  A: "c2 e2", B: "d2 g2", C: "c2@3 c2 e2@3 e2", D: "d2@3 d2 g1@2 a1 b1", E: "d2 e2 f2 g2@2 g1 a1 b1",
  F: "d2@2 a2@2 g2@2 d2 g2", G: "f2@3 c3@3 f2@2", H: "e2@3 b2@3 e2@2", I: "d2@3 a2@3 d2@2", J: "f2 e2 d2 c2",
  K: "a1@3 a1 g1@2 a1 b1", L: "c2@3 c2 f2@3 f2", M: "c2@3 c2 d2@2 g2@2", N: "c2!2 d2 e2", O: "f2@3 f2 g2@2 f2@2",
  P: "e2@2 e2@2 a1@2 b1 c2", Q: "d2@3 d2 f#2 a2@2 d2", R: "g2 f2", S: "e2 d2", T: "c2@3 g2 f2@2 a2 b2", U: "c3!2 d3 e3",
  V: "f3 e3 d3 c3", W: "a2@3 a2 g2@2 a2 b2", X: "c3@3 c3 f2@3 f2", Y: "c2",
})).s("gm_electric_bass_finger").gain(0.14).pan(0.4)

// chords · epiano2 · "Piano"
const epiano2 = note(`<
  A B A B C D E F C G H I J K L M N O P Q C D E F C G H I J K L M N O P R S T U V W T X Y Z AA AB AC AD AE AF AG AH AI
  AJ AK AL N AM AN AO AP AQ AR AS
>`.pickRestart({
  A: "c3 e3", B: "d3 g3", C: "c3@3 c3 [b3,e4]@2 [g3,b3]@2, [c4,e4]@4 e3@3 ~", D: "[a3,c4]@2 ~@2 g2@2 a2 b2, d3@3 ~@5",
  E: "c3@3 c3 [b3,e4]@2 [g3,b3]@2, [e3,g3]@4 e3@3 ~", F: "d3 e3 f3 ~@3 a2 b2, [a3,c4]@3 ~@5, f3 ~@3",
  G: "[a3,c4] ~@3 g2@2 a2 b2, d3@3 ~@5", H: "[e3,g3]@2 ~ c3 [e4,g4]@2 [b3,e4]@2, c3@3 ~ e3@3 ~, ~ [e4,g4] ~@2",
  I: "d3@2 a3@2 g3@2 d3 g3, [c4,f4]@3 ~@5", J: "f3@3 c4@3 f3@2, a3", K: "[e3,b3]@3 ~@3 e3@2",
  L: "[d3,a3]@3 ~@3 d3@2, c4, ~@3 a3@5", M: "[e3,b3]@3 ~@3 e3@2, g3", N: "f3 e3 d3 c3, [c4,f4]!2",
  O: "[c4,e4]@4 g2@2 a2 b2, a2@3 ~ [b3,d4]@4", P: "c3@6 c3@2 [f4,a4]@3 [e4,g4]@3 ~@2, [g3,c4]@4 f3@3 ~",
  Q: "[c3,c4,e4]@3 ~ [f4,a4] ~ [g3,d4,f4]@2, ~@2 d3 ~", R: "[c3,c4,e4]!2 [d3,b3,f4] [e3,a#3,g4]",
  S: "[a3,f4] ~@2 f3 [g3,g4]@2 [f3,f4]@2, f3@3 ~@5", T: "[e3,e4]@2 e3@2 a2@2 b2 c3",
  U: "d3@3 d3 g2@2 a2 ~, [a3,c4]@4 [g3,b3]@3 ~", V: "c3 [c3,c4] [d3,b3] [e3,a#3]",
  W: "[a3,f4] ~@2 f3 g3@2 [f3,f4]@2, f3@3 g4@3 ~@2", X: "d3@3 d3 f#3 a3@2 ~, [c4,f4]",
  Y: "[g4,b4]@3 ~@5 [g4,d5]@3 [g4,b4]@2 ~@3, g3 f3", Z: "[g4,d5]@3 ~@5 [g4,b4,d5]@4 ~@4, e3 d3",
  AA: "[c4,e4]@4 [b3,e4]@2 ~ e3, c3@3 ~ e3@3 ~, ~@3 [g3,b3]", AB: "[a3,c4]@2 ~ d3 g2@2 a2 ~, d3@3 [f3,b3]@5",
  AC: "[e3,g3]@4 [b3,e4]@2 ~ e3, c3@3 ~ e3@3 ~, ~@3 [g3,b3]", // Em E5 G
  AD: "f3@2 f3 g3@2 g2 a2 ~, [a3,c4]@3 [b3,d4,f4]@5, d3 ~@7", AE: "c3@3 ~ [b3,e4]@2 ~ e3, ~@4 e3@3 ~, ~@3 [g3,b3]",
  AF: "d3@3 d3 [g3,b3] ~ a2 ~, [a3,c4]@2 g2 ~", AG: "~@2 [e4,g4]@2 [e4,g4]@2 ~ e3, c3@3 ~ e3@3 ~, ~@3 [b3,e4]",
  AH: "d3@2 ~@2 g3@2 d3 ~, [c4,f4]@3 [b3,f4]@5, ~ a3 ~@2", AI: "f3@3 ~@3 f3@2, a3", AJ: "[e3,b3]@3 ~@3 e3@2, ~@3 b3@5",
  AK: "[d3,a3]@3 ~@3 d3@2, c4", AL: "[e3,b3]@3 ~@3 e3@2, g3, ~@3 b3@5", AM: "a2@3 a2 g2@2 a2 ~, [c4,e4] [b3,d4]",
  AN: "[c3,g3]@6 ~@2 [f3,f4,a4]@3 ~ a3@2 b3@2, c4@8 ~@3 [e4,g4]@2 ~@3", AO: "[c4,e4]!2 [b3,d4,f4] [a#3,e4,g4]",
  AP: "f4 e4 d4 c4, a3", AQ: "a3@3 a3 g3@2 a3 ~, [c4,e4] d4, ~@4 b3@3 ~",
  AR: "g3@8 [f4,a4]@3 [e4,g4]@2 ~ f3@2, c4@3 ~ f3@3 ~", AS: "[c3,c4,e4]",
})).s("gm_epiano2").gain(0.1).pan(0.2)

// chords · epiano2 · "Piano" · soft notes
const epiano2_soft = note(`<
  ~@4 A B A C A D A E ~ F ~ F ~ G H I A B A C A D A E ~ F ~ F ~ G H ~ J K L@2 M N O P Q R S R T R U@2 V W ~ X ~@2 S Y
  ~@2 Z AA ~
>`.pickRestart({
  A: "~@7 e3", B: "~@3 [f3,b3]@5, ~@3 d3 ~@4", C: "~@3 g3@2 g2 ~@2, ~@3 [b3,d4,f4]@5",
  D: "~@3 [g3,b3]@2 [f3,b3]@3, ~@3 d3 ~@4", E: "~@3 [b3,f4]@5", F: "~@3 b3@5", G: "~@3 a2 ~@4",
  H: "~@7 f3, ~@13 [d4,f4]@3", I: "~@3 [c3,e4,g4] ~ [e4,g4] ~@2", J: "~ c5@3 ~@4", K: "~@3 [a3,c4,e4]@3 ~@2",
  L: "[~@7 [g3,c4]@3 ~@6, ~@7 b2 ~@8]/2", M: "~ a4@2 ~@5", N: "~@3 [a3,c4,e4]@5", O: "~@7 d3",
  P: "~@3 [d4,g4]@2 [g4,b4]@3 ~@5 [d4,g4]@3", Q: "~@3 [g4,b4]@2 [d4,g4]@3 ~@8", R: "~@3 c3 ~@4", S: "~@7 b2",
  T: "~ e3 ~@5 b2", U: "[~@7 [e3,g3]@3 ~ c3 ~@4, ~@7 b2 ~@8]/2", V: "~@7 g3", W: "~@3 c4@3 ~@2", X: "~@3 a3@5",
  Y: "~@6 g3@2 ~@5 [d4,f4]@3", Z: "~@7 b3", AA: "~@6 c4@2 ~@5 [d4,f4]@3",
})).s("gm_epiano2").gain(0.07).pan(0.2)

// drums · kick
const kick = s("bd").struct("<~@4 A@12 B@2 A@14 B@2 A@10 ~ A@8 ~@6 A@2 ~@2 A ~>".pickRestart({
  A: "x", B: "x!2",
})).gain(0.26)

// drums · snare
const snare = s("sd").struct(`<
  ~@3 A B C@7 D@4 E F G H C@8 D@4 E F I H J@2 ~@5 K ~ L C L C L C L C ~@4 M@2 ~ N O@2 ~ P
>`.pickRestart({
  A: "~@5 x!3", B: "~@2 x ~ x ~ x!2 ~@2 x ~ x ~ x ~", C: "~@2 x ~ x ~ x ~ x!3 ~ x ~ x ~", D: "~@2 x!6",
  E: "~@2 x!2 ~@2 x!2", F: "~@4 x ~ x ~@5 x ~ x!2", G: "~@6 x ~ x!3 ~ x!3 ~", H: "~@4 x ~ x!3 ~ x!3 ~ x ~",
  I: "~@6 x ~ x!2 ~@2 x!2 ~@2", J: "~@4 x ~@7 x!2 ~@2", K: "x!2 ~@2 x ~@3 x!2 ~@2 x!2 ~@2", L: "~ x!7",
  M: "x ~ x ~ x ~@3 x ~ x ~ x!2 ~@2", N: "~@4 x ~@3 x!2 ~@2 x!2 ~@2", O: "x ~@3 x ~@3 x ~@3 x!2 ~@2", P: "x!4 ~@4",
})).gain(0.15)

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

// drums · open hat
const open_hat = s("oh").struct("<~@37 [~ x] ~@27>").gain(0.23)

// drums · crash
const crash = s("cr").struct("<~@4 A@12 B@2 A@14 B@2 A@10 ~ A@8 ~@6 A@2 ~@2 A C>".pickRestart({
  A: "x", B: "x!2", C: "~ x",
})).gain(0.26)

stack(
  electric_guitar_clean, acoustic_guitar_steel, acoustic_guitar_steel_2, bass, epiano2, epiano2_soft, kick, snare,
  snare_soft, open_hat, crash
)

More by Alabama