Strudelify

Lovin' Whiskey

Rory Block

KeyD majorTempo72 bpm
0:00/0:00
// Lovin' Whiskey — Rory Block
// 72 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 2/4 at bar 6, 4/4 at bar 7, 2/4 at bar 22, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: ch 5 "STEEL GTR" named as a guitar, played on acoustic guitar steel (its piano patch is not one); ch 7 "ORGAN 1" named as an organ, played on drawbar organ (its piano patch is not one); ch 8 "ORGAN 2" named as an organ, played on drawbar organ (its piano patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 64 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): STEEL GTR.
setcpm(72/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.

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A B A B C D E F E G E H I J K L H M H M N O P O P O A Q R P@2 A B A B C D E F E G E H I J K L H M H M N O P O P O A
  Q R P S ~
>`.pickRestart({
  A: "d2@2 d3@2 d2@2 d3@2 b1 b2 ~ b2 ~ b1 b2 ~", B: "e2@2 e3@2 e2@2 e3@2 a1 a2 ~ a2 ~ a1 a2 ~",
  C: "d2@2 d3@2 d2@2 d3@2 c#2 c#3 ~ c#3 ~ c#2 c#3 ~", D: "a1 a2 a1 a2 b1 b2 b1 b2",
  E: "g2 g3 ~ g3 ~ g2 g3 ~ d2@2 d3@2 d2@2 d3@2", F: "d2 d3 ~ d3 ~ d2 d3 ~ b1@2 b2@2 b1@2 b2@2",
  G: "d2 d3 ~ d3@2 d2 d3@2 b1@2 b2@2 b1@2 b2@2", H: "b1 b2 ~ b2 ~ b1 b2 ~ e2@2 e3@2 e2@2 e3@2",
  I: "f#2 f#3 ~ f#3 ~ f#2 f#3 ~ a1@2 a2@2 a1@2 a2@2", J: "a1 a2 ~ a2@2 a1 a2@2 d2@2 d3@2 d2@2 d3@2",
  K: "~ d3 ~ d3@2 d2 d3 d1 d2@2 d3@2 d2@2 d3@2, d2 ~@7", L: "~ d3 ~ d3@2 d2 ~ d1 d2@2 d3@2 d2@2 d3@2, d2 ~@2 d3 ~@4",
  M: "a1 a2 ~ a2 ~ a1 a2 ~ d2@2 d3@2 d2@2 d3@2", N: "c#2 c#3 ~ c#3 ~ c#2 c#3 ~ a1@2 a2@2 a1@2 a2@2",
  O: "b1@2 b2@2 b1@2 b2@2 g2 g3 ~ g3 ~ g2 g3 ~", P: "d2@2 d3 ~ d2@2 d3 ~ d2 d3 ~ d3 ~ d2 d3@2",
  Q: "e2@2 e3@2 e2@2 e3@2 f#2 f#3 ~ f#3 ~ f#2 f#3 ~", R: "a1@2 a2 ~ a1@2 a2 ~ a1 a2 ~ a2 ~ a1 a2@2",
  S: "d2@2 d3 ~ d2@2 d3 ~ d2@8, ~@4 d3@3 ~",
})).s("gm_acoustic_bass").gain(0.64)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~ A B A C D E F@2 G@2 H I J@4 K L I M N O P Q R O S T U V W A B A C D E F@2 G@2 H I J@4 K L I M N O P Q R O S T U V X
  ~
>`.pickRestart({
  A: "[d4,f#4,a4]@2 ~ [f#3,b3,d4]", B: "[e4,g4,b4]@2 ~ [c#4,e4,g4,a4]", C: "[e4,g4,b4]@2 ~ [a3,c#4,e4]",
  D: "~@4 g4@2 b4 ~@5 [a3,c#4,e4]@4, d4@7 ~@9", E: "[c#4,e4,g4,a4] [f#4,b4,d5]",
  F: "[~ g2 [g3,b3,d4]@2 [d4,f#4,a4]@5 d3 [d4,f#4,a4] ~ [f#4,b4,d5]@4]/2", // G D Bm
  G: "[~@4 [g3,b3,d4]@4 d4@10 ~@2 d4 ~ d4@2 [f#4,b4,d5]@8, ~ [f#4,a4]@2 ~, ~@9 d3@3 ~@4]/2", // G Bm F#m
  H: "~@2 g2@2 [g3,b3,d4]@4 ~@4 f#4@2 a4 ~, ~@8 d4@7 ~", I: "~ b2 [f#3,b3,d4]@2 [e4,g4,b4]@4",
  J: "[~@2 f#2@2 [a3,c#4,f#4]@4 e4@7 ~@5 a4@2 c#5 ~@14 a5 d6 ~ d4@11 ~ d4@4 [d4,f#4,a4]@8, ~@4 c#5@6 ~@8 f5 ~@13, ~@4 a4@5 ~@23, ~@16 e4@7 ~ [d3,d4,f4,a4]@14 ~@2 [d3,f#4,a4,d5]@16 ~@8]/4", // F#m D Dm D
  K: "~ [f#3,b3,d4] [e4,g4,b4]@2", L: "~ [c#4,e4,g4,a4] [d4,f#4,a4]@2",
  M: "~@4 [a3,c#4,e4]@4 ~@4 g4@2 b4 ~, ~@8 d4@7 ~", N: "~ c#3 [a3,c#4,e4]@2 [c#4,e4,g4,a4]@4",
  O: "[f#5,b5,d6,f#6]!4 ~ [f#5,b5,d6,f#6] ~ [f#5,b5,d6,f#6] [d5,g5,b5,d6]!4 ~ [d5,g5,b5,d6] ~ [d5,g5,b5,d6]", // Bm G
  P: "[d5,f#5,a5,d6]!4 ~ d3 [d5,f#5,a5,d6]!6 ~ d3 [d5,f#5,a5,d6]!2", // D
  Q: "[f#5,b5,d6,f#6]!4 ~ b2 [f#5,b5,d6,f#6]!2 [d5,g5,b5,d6]!4 ~ g2 [d5,g5,b5,d6]!2", // Bm G
  R: "[d5,f#5,a5,d6]!4 ~ d3 [d5,f#5,a5,d6]!2 [d5,f#5,a5,d6]@4 d5 ~ f#5 a5", // D
  S: "[d5,f#5,a5,d6]!4 ~ [d5,f#5,a5,d6] ~ [d5,f#5,a5,d6] [f#5,b5,d6,f#6]!4 ~ [f#5,b5,d6,f#6] ~ [f#5,b5,d6,f#6]", // D Bm
  T: "[e5,g5,b5,e6]!4 ~ e3 [e5,g5,b5,e6]!2 [c#5,f#5,a5,c#6]!4 ~ f#2 [c#5,f#5,a5,c#6]!2", // Em F#m
  U: "[e5,a5,c#6,e6]!4 ~ [e5,a5,c#6,e6] ~ [e5,a5,c#6,e6]!5 ~ [e5,a5,c#6,e6] ~ [e5,a5,c#6,e6]", // A
  V: "[d5,f5,a5,d6]!4 ~ [d5,f5,a5,d6] ~ d3 [d5,f5,a5,d6]!4 ~ [d5,f5,a5,d6] ~ d3", // Dm
  W: "[d5,f#5,a5,d6]!4 ~ [d5,f#5,a5,d6] ~ [d5,f#5,a5,d6]!5 ~ [d5,f#5,a5,d6] ~ [d5,f#5,a5,d6]", // D
  X: "[d5,f#5,a5,d6]!4 ~ [d5,f#5,a5,d6] ~ [d5,f#5,a5,d6]@9", // D
})).s("gm_piano").gain(0.26)

// other · piano · "A.PIANO 2"
const piano_2 = note("<A B C D E@2 F@4 G@6 H I J K@2 L M N O P Q R S@2 T A B C D E@2 F@4 U@4 V@2 ~@17>".pickRestart({
  A: "~@13 a4 b4 d5", B: "d5 b4 d5 b4 f#5 b4!2 d5", C: "~@6 b4 a4@5 ~ a4 b4 a4",
  D: "d5@2 b4@2 d5@2 b4@2 d5@2 b4 d5@3 f#5@2", E: "[~@6 c#5 b4 c#5 b4 a4@14 ~@8]/2",
  F: "[~@5 a4 b4 d5 d5@2 b4@2 d5@2 b4 e5@3 b4@2 b4@3 a4 d5@2 b4@2 d5@2 d5 d4@5 ~ a4 b4 a4 d5@2 b4@2 d5@2 b4 d5@3 b4@2 d5@3 b4 d5@2 b4@2 d5@2 d5@2]/4",
  G: "[d4@4 ~ a4 b4 d5 d5@2 b4@2 d5@2 b4 d5@3 e5@2 ~ a4 b4 a4 d5@2 b4@2 d5@2 d5 a4@5 ~ a4 b4 a4 d5@2 b4@2 d5@2 b4 d5@5 ~@2 f5 e5@13 ~@2 g4 f#4 g4 f#4 d5@14 ~@8]/6",
  H: "~@5 a4 b4 d5 d5@2 b4@2 d5@2 b4@2", I: "f#5@2 b4@2 b4@2 d5@2 ~@5 a4 b4 a4",
  J: "a4@4 ~ a4 b4 a4 d5@2 b4@2 d5@2 b4@2", K: "[d5@2 b4 d5@3 a4 b4 d5@2 b4@2 f5@2 e5 e5@9 ~@6 f#5@2]/2",
  L: "e5@2 e5@6 ~@5 a4 b4 d5", M: "d5@2 b4@2 d5@2 b4 e5@3 b4@2 b4@3 a4", N: "d5@2 b4@2 d5@2 d5 d4@5 ~@2 a4@2",
  O: "d5@2 b4@2 d5@2 b4 d5@3 b4@2 d5@3 b4", P: "d5@2 b4@2 d5@2 d5@2 d4@4 ~@2 d5 e5",
  Q: "f#5@2 f#5@2 f#5@2 d5@2 d5!2 e5@2 ~ b4 d5 b4", R: "d5@2 b4@2 d5@2 d5 e5@5 ~ a4 b4 a4",
  S: "[d5@2 b4@2 d5@2 b4 d5@7 f#5 e5@13 ~@2 g4 f#4]/2", T: "g4 f#4 d5@14",
  U: "[d4@4 ~ a4 b4 d5 d5@2 b4@2 d5@2 b4 d5@3 e5@2 ~ a4 b4 a4 d5@2 b4@2 d5@2 d5 a4@5 ~ a4 b4 a4 d5@2 b4@2 d5@2 b4 d5@5 ~@2 f5 e5@9]/4",
  V: "[~@6 g4 f#4 g4 f#4 d5@14 ~@8]/2",
})).s("gm_piano").gain(0.61)

// bass · drawbar organ · "ORGAN 1"
const bass_2 = note(`<
  ~ A B A B C D E A E A E F G H I@2 F H F H J K I K I K A L M I@2 A B A B C D E A E A E F G H I@2 F H F H J K I K I K A
  L M I N ~
>`.pickRestart({
  A: "d2 b2", B: "e2 a2", C: "d2 c#2", D: "a2 b2", E: "g2 d2", F: "b2 e2", G: "f#2 a2", H: "a2 d2", I: "d2!2",
  J: "c#2 a2", K: "b2 g2", L: "e2 f#2", M: "a2!2", N: "d2",
})).s("gm_drawbar_organ").gain(0.41)

// chords · drawbar organ · "ORGAN 2"
const drawbar_organ = note(`<
  ~ A B A C D E F@4 G H I@4 H J H K L M N M N M A O P Q N A B A C D E F@4 G H I@4 H J H K L M N M N M A O P Q N ~
>`.pickRestart({
  A: "[f#3,a3,d4] [f#3,b3,d4]", B: "[g3,b3,e4] [g3,a3,c#4]", C: "[g3,b3,e4] [a3,d4,e4]", D: "[g3,b3,d4] [a3,c#4,e4]",
  E: "[g3,a3,c#4] [f#3,b3,d4]", F: "[[g3,b3,d4] [f#3,a3,d4]@2 [f#3,b3,d4]]/2", G: "[g3,b3,d4] [f#3,a3,d4]",
  H: "[f#3,b3,d4] [g3,b3,e4]", I: "[[f#3,a3,c#4] [a3,d4,e4]@2 [f3,a3,d4]@2 [f#3,a3,d4]@2 [f#3,a3,d4]]/4",
  J: "[g3,a3,c#4] [f#3,a3,d4]", K: "[a3,d4,e4] [g3,b3,d4]", L: "[a3,c#4,e4] [g3,a3,c#4]", M: "[f#3,b3,d4] [g3,b3,d4]",
  N: "[f#3,a3,d4]", O: "[g3,b3,e4] [f#3,a3,c#4]", P: "[a3,d4,e4]", Q: "[f3,a3,d4]",
})).s("gm_drawbar_organ").gain(0.2)

// drums · kick
const kick = s("bd").struct("<~ A@5 B C@15 A@15 B C@15 A@9 D ~>".pickRestart({
  A: "x ~@3 x ~@2 x!2 ~@3 x!4", B: "x ~@3 x ~@2 x!2 ~@3 x ~@2 x", C: "x ~@3 x!5 ~@3 x ~@2 x", D: "x ~@3 x ~@2 x ~@8",
})).gain(0.56)

// drums · rim
const rim = s("rim").struct("<~ [x!8]!61 [x!4 ~@4] ~>").gain(0.33)

// drums · rim · soft notes
const rim_soft = s("rim").struct("<~ [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!61 [~ x ~ x ~ x ~ x ~@8] ~>").gain(0.22)

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

// drums · clap
const clap = s("cp").struct("<~ [~ x ~ x]!61 [~ x ~@2] ~>").gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<~ [x!16]!61 [x!8 ~@8] ~>").gain(0.33)

// drums · crash
const crash = s("cr").struct("<~ A ~@4 B ~@9 B ~@5 A ~@9 A ~@4 B ~@9 B ~@5 A ~@10>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.45)

// drums · tambourine
const tambourine = s("tb").struct("<~ [x!8]!61 [x!4 ~@4] ~>").gain(0.5)

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

// drums · cowbell
const cowbell = s("cb").struct("<~ A@5 B C@15 A@15 B C@15 A@9 D ~>".pickRestart({
  A: "x ~ x ~@3 x!3 ~ x ~@5", B: "x ~ x ~@3 x!3 ~ x ~@3 x!2", C: "x ~ x ~@5 x ~ x ~@3 x!2", D: "x ~ x ~@3 x!2 ~@8",
})).gain(0.5)

stack(
  bass, piano, piano_2, bass_2, drawbar_organ, kick, rim, rim_soft, snare, clap, hihat, crash, tambourine,
  tambourine_soft, cowbell
)