Strudelify

Walkin' After Midnight

Patsy Cline

KeyC majorTempo95 bpm
0:00/0:00
// Walkin' After Midnight — Patsy Cline
// 95 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 57 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(95/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · electric bass finger · "Electric Bass"
const bass = note(`<
  ~ A B A C D@2 E F D B A G D@2 H F A B D I E J D@2 H@2 D K A L H F M B D G D B A I E J D@2 E J D N A L H F M O D P
>`.pickRestart({
  A: "c2@3 a2@3 g2@3 e2@2 g2", B: "f1 a1 g1 b1", C: "c2@6 e2@6 g1@7 b1@5", D: "c2@3 e2@3 g2@3 e2@2 g2",
  E: "f1@3 d2@3 c2@3 a1@2 c2", F: "f1 a1 c2 e2", G: "c2 e2 g1 b1", H: "f1@3 a1@3 c2@3 a1@2 c2", I: "c2 a#1 a1 g1",
  J: "f1@6 a1@5 ~ c2@6 a1@6", K: "g1 a1 a#1 b1", L: "c2@6 e2@5 ~ g2@6 e2@6", M: "c2!2 a1 g1",
  N: "g1@3 e2@3 d2@3 b1@2 d2", O: "f1@6 a1@6 g1@7 b1@5", P: "g1@5 ~ g2@4 c2@6 ~@2 c2@5 ~",
})).s("gm_electric_bass_finger").gain(0.52)

// chords · piano
const piano = note(`<
  ~ A B C D E F G H I B A D E F G H I B A J K L A M K L A N E F O H I B A D A B I P K L I Q K L I R E F G H A B S T
>`.pickRestart({
  A: "~@4 [e3,g3,c4]@3 ~@3 [e3,g3,c4]@2 ~@4 [e3,g3,c4]@3 ~@3 [e3,g3,c4]@2, c2 g2", // C
  B: "~@4 [f3,a3,c4] ~@5 [f3,a3,c4]@2 ~@4 [f3,g3,b3,d4] ~@5 [f3,g3,b3,d4]@2", // F G7
  C: "~@4 [e3,g3,c4]@3 ~@3 [e3,g3,c4]@3 ~@3 [e3,g3,c4]@3 ~@3 [e3,g3,c4]@2", // C
  D: "~@4 [e3,g3,c4] ~@5 [e3,g3,c4]@2 ~@4 [f3,g3,b3,d4] ~@5 [f3,g3,b3,d4]@2", // C G7
  E: "~@4 [e3,g3,c4] ~@5 [e3,g3,c4]@2 ~@4 [e3,g3,c4]@2 ~@4 [e3,g3,c4]@2", // C
  F: "~@4 [e3,g3,c4]@2 ~@4 [e3,g3,c4]@2 ~@4 [e3,g3,c4]@2 ~@4 [e3,g3,c4] ~", // C
  G: "~@4 [f3,a3,c4]@4 ~@2 [f3,a3,c4]@4 ~@2 [f3,a3,c4]@3 ~@3 [f3,a3,c4]@2", // F
  H: "~@4 [f3,a3,c4] ~@5 [f3,a3,c4]@2 ~@4 [e3,g3,c4] ~@5 [e3,g3,c4]@2", // F C
  I: "~@4 [e3,g3,c4]@4 ~@2 [e3,g3,c4]@4 ~@2 [e3,g3,c4]@3 ~@3 [e3,g3,c4]@2", // C
  J: "~@4 [g3,a#3,c4,e4]@3 ~@3 [g3,a#3,c4,e4]@3 ~@3 [g3,a#3,c4,e4]@3 ~@3 [g3,a#3,c4,e4]@2", // C7
  K: "~@4 [f3,a3,c4] ~@5 [f3,a3,c4]@2 ~@4 [f3,a3,c4]@2 ~@4 [f3,a3,c4]@2", // F
  L: "~@4 [f3,a3,c4]@2 ~@4 [f3,a3,c4]@2 ~@4 [f3,a3,c4]@2 ~@4 [f3,a3,c4] ~", // F
  M: "~@4 [g3,a#3,c4,e4]@3 ~@3 [g3,a#3,c4,e4]@2 ~@4 [g3,a#3,c4,e4]@3 ~@3 [g3,a#3,c4,e4]@2, c2 g2", // C7
  N: "~@4 [f3,g3,b3,d4]@3 ~@3 [f3,g3,b3,d4]@3 ~@3 [f3,g3,b3,d4]@3 ~@3 [f3,g3,b3,d4]@2", // G7
  O: "~@4 [f3,a3,c4]@3 ~@3 [f3,a3,c4]@3 ~@3 [f3,a3,c4]@3 ~@3 [f3,a3,c4]@2", // F
  P: "~@4 [g3,a#3,c4,e4]@4 ~@2 [g3,a#3,c4,e4]@4 ~@2 [g3,a#3,c4,e4]@3 ~@3 [g3,a#3,c4,e4]@2", // C7
  Q: "~@4 [g3,a#3,c4,e4]@2 ~@4 [g3,a#3,c4,e4]@3 ~@3 [g3,a#3,c4,e4]@3 ~@3 [g3,a#3,c4,e4]@2", // C7
  R: "~@4 [f3,g3,b3,d4]@4 ~@2 [f3,g3,b3,d4]@4 ~@2 [f3,g3,b3,d4]@3 ~@3 [f3,g3,b3,d4]@2", // G7
  S: "c5@2 ~@2 c5@2 g4@2 ~@4 e4@4 g4@2 a4@2 ~@2 g4 ~, [e3,c4]@8 ~@4 [e3,c4]@9 ~@3", // C
  T: "[e3,c4,g4,c5] ~@4 [e3,c4,e5,g5,c6]@7", // C
})).s("gm_piano").gain(0.2)

// chords · electric guitar clean · "Electric Guitar"
const electric_guitar_clean = note(`<
  ~ A B A C A D E F A B A C A D E F A B A G E H A G E H A I A D E F A B A C A B A G E H A G E H A I A D E F A B J K
>`.pickRestart({
  A: "~@6 [c4,g4] ~@11 [c4,g4]@2 ~@4", B: "~@6 [a3,f4] ~@11 [b3,f4] ~@5", C: "~@6 [c4,g4] ~@11 [b3,f4] ~@5",
  D: "~@6 [c4,g4] ~@11 [c4,g4] ~@5", E: "~@6 [a3,f4] ~@11 [a3,f4]@2 ~@4", F: "~@6 [a3,f4] ~@11 [c4,g4] ~@5",
  G: "~@6 [a#3,e4] ~@11 [a#3,e4]@2 ~@4", H: "~@6 [a3,f4] ~@11 [a3,f4] ~@5", I: "~@6 [b3,f4] ~@11 [b3,f4]@2 ~@4",
  J: "~@6 [e4,c5] ~@11 [e4,c5] ~@5", K: "[e4,c5] ~@9 [e4,c5]@7 ~@7",
})).s("gm_electric_guitar_clean").gain(0.29)

// chords · electric guitar jazz · "Steel Guitar"
const electric_guitar_jazz = note(`<
  A B C D E ~ F ~@2 G ~ H I ~ J ~@2 K ~ L M ~@3 N ~@3 O P Q ~@2 K ~@2 R S T U V ~@3 W ~@3 X Y Z ~@2 AA ~ AB AC
>`.pickRestart({
  A: "~@8 [b3,d4,g4] [c4,e4,a4]@2 [e4,g4,c5]", // G Am C
  B: "[g4,c5,e5]@3 ~ [e4,g4,c5]@12 ~@2 [d4,f4,a4] ~ [e4,g4,a#4]@2 [e4,g4,b4]@2", // C Dm Edim Em
  C: "[f4,a4,c5]@4 ~@2 [a4,c5,d#5] ~@3 [f4,b4,d5]@9 ~@3 [d4,f4,c5] ~", // F Adim Bdim Dm7
  D: "[e4,g4,c5]@10 ~@2 [c4,e4,g4]@3 ~ [d4,f4,a4]@2 [e4,g4,c5]@6", // C Dm C
  E: "[g4,c5,e5]@3 ~@3 [g4,c5,e5]@2 ~@2 [f4,b4,d5]@10 ~@4", F: "~@6 [c4,e4,g4]@4 [d4,f4,a4]@2 [e4,g4,c5]@7 ~@5",
  G: "~@3 [c4,e4,g4] [d4,f4,a4] [e4,g4,c5] [g4,c5,e5]@2 [e4,g4,c5]@3 ~", // C Dm C
  H: "~@12 [d4,f4,a4] ~ [e4,g4,a#4] [e4,g4,b4]@2 ~ [e4,g4,c5]@6", I: "[g4,c5,d#5]@3 [g4,c5,e5] ~ [f4,b4,d5]@4 ~@3",
  J: "~@8 [c4,e4,g4]@2 [d4,f4,a4]@2 [e4,g4,c5]@7 ~@5", // C Dm C
  K: "~@3 [c4,e4,g4] [d4,f4,a4] [e4,g4,c5] [g4,c5,e5]@2 [e4,g4,c5]@2 ~@2", // C Dm C
  L: "~@6 [d4,f4,a4]@2 [e4,g4,a#4] [e4,g4,b4]@2 ~ [e4,g4,c5]@7 ~@5", // Dm Edim Em C
  M: "[g4,a#4,d#5] [g4,a#4,e5]@4 ~ [g4,a#4,e5]@2 ~@2 [g4,a#4,e5]@5 ~ [f4,a4,d5]@2 [e4,g4,c5]@5 ~", // D# Edim Dm C
  N: "[e4,g4,c5]@5 ~ [e4,g4,b4]@2 ~@2 [e4,g4,a#4]@12 ~@2", O: "~@9 [d4,f4,b4]@3 [f4,b4,d5]@8 ~@4",
  P: "~@2 [d4,f4,a4] [e4,g4,c5]@2 ~", Q: "~@10 [f#4,c5,d#5]@2 ~ [g4,c5,e5] ~@2 [e4,g4,c5]@6 ~@2",
  R: "~@9 [b3,d4,g4] [c4,e4,a4] [e4,g4,c5]", // G Am C
  S: "[g4,c5,e5]@4 [e4,g4,c5]@12 ~@2 [d4,f4,a4] ~ [e4,g4,a#4] [e4,g4,b4]@2 ~", // C Dm Edim Em
  T: "[f4,a4,c5]@5 ~ [a4,c5,d#5] ~@3 [f4,b4,d5]@10 ~@2 [d4,f4,c5] ~", // F Adim Bdim Dm7
  U: "[e4,g4,c5]@10 ~@2 [c4,e4,g4]@4 [d4,f4,a4]@2 [e4,g4,c5]@5 ~", // C Dm C
  V: "[g4,a#4,e5]@2 ~ [g4,a#4,e5]@3 [f4,a4,d5]@2 [e4,g4,c5]@4", W: "~@8 [e4,g4,c5] ~ [e4,g4,b4] ~ [e4,g4,a#4]@9 ~@3",
  X: "~@3 [f4,b4,d5]@5 [b4,d5,f5]@4", Y: "[g4,c5,e5]@11 ~@13",
  Z: "~@6 [g3,c4,e4,f4,g4] ~ [d4,f4,a4]@2 [e4,g4,c5]@2 [f4,a4,d5]@4 [e4,g4,c5]@3 ~@5", // C Dm C Dm C
  AA: "~@4 [c4,e4,g4] [d4,f4,a4] [e4,g4,c5]@3 ~@3", AB: "~@6 [c4,e4,g4]@4 [d4,f4,a4]@2 [e4,g4,c5]@6 [g4,c5,e5]@5 ~",
  AC: "~ [e4,g4,c5]@3 [e4,g4,a#4]@2 [c4,e4,g4]@2 ~@2 [e4,g4,c5]@10 ~@4", // C Edim C
})).s("gm_electric_guitar_jazz").gain(0.47)

// drums · kick
const kick = s("bd").struct(`<
  ~
  [x ~ x!2 ~ x!2 ~ x!2 ~ x]!3
  [x ~ x!2 ~ x!2 ~ x!2 ~@2]
  [x ~ x!2 ~ x!2 ~ x!2 ~ x]!51
  [x ~ x!2 ~ x ~@2 x!2 ~@2]
>`).gain(0.72)

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

// drums · low tom
const low_tom = s("lt").struct("<~@56 [~@2 x]>").gain(0.56)

// drums · hihat
const hihat = s("hh").struct("<~ [x!4]!55 [x!2 ~ x]>").gain(0.8)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 [~@9 x!3] ~@51 [~@7 x ~@4]>").gain(0.56)

// drums · open hat
const open_hat = s("oh").struct("<~@12 A ~@7 A ~@7 A ~@7 A ~@3 A ~@13 A ~@2>".pickRestart({
  A: "~@11 x",
})).gain(0.8)

// drums · high tom
const high_tom = s("ht").struct("<~@4 [~@6 x!3 ~@3] ~@52>").gain(0.56)

// drums · crash
const crash = s("cr").struct("<~ A ~@3 A ~@7 A ~@7 A ~@7 A ~@7 A ~@18 B>".pickRestart({
  A: "x", B: "x ~@2 x",
})).gain(0.56)

// drums · tambourine
const tambourine = s("tb").struct("<~@21 [~ x ~ x]!7 ~@13 [~ x ~ x]!7 ~@9>").gain(0.8)

stack(
  bass, piano, electric_guitar_clean, electric_guitar_jazz, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom,
  crash, tambourine
)

More by Patsy Cline