Strudelify

Cool Night

Paul Davis

KeyC majorTempo107 bpm
0:00/0:00
// Cool Night — Paul Davis
// 107 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 94 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(107/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 C B C D E F G H I J E K L M N O P Q R E F C S T U V W C M C X Y F G H I J E K L M N O P Q R E F C S T U V W C M C
  X Y K L M N O P Q R Z AA AB AC AD AE AF AG AA AB AC AD AE AF AG AA AB AC AD AE AF AG AH@3
>`.pickRestart({
  A: "~@4 c2 ~ c2 ~", B: "g1@5 ~ g1 ~ g1@5 ~ g1@2", C: "d2@4 ~@2 d2 ~ d2@5 ~ d2@2", D: "c2@5 ~ c2 ~ c2@5 ~ c2@2",
  E: "f2@5 ~ f2 ~ f2@2 c2@2 f1@3 ~", F: "g1@4 ~@2 g1 ~ g1@5 ~ g1@2", G: "d2@4 ~@2 d2 ~ d2@7 ~", H: "g1@5 ~ g1 ~ g1@8",
  I: "d2@4 ~@2 d2 ~ d2@6 ~@2", J: "c2@5 ~ c2 ~ c2@6 ~@2", K: "g1@4 ~@2 g1 ~ g1@7 ~", L: "d2@5 ~ d2 ~ d2@7 ~",
  M: "g1@5 ~ g1 ~ g1@7 ~", N: "d2@4 ~@2 d2@2 a1@4 d2@3 ~", O: "e2@5 ~ e2@2 d2@4 g1@3 ~", P: "c2@4 ~@2 c2 ~ c2@5 ~ g1@2",
  Q: "c2@5 ~ c2 ~ c2@4 a#1@4", R: "g#1@5 ~ g#1 ~ g#1@5 ~ g#1@2", S: "g1@5 ~ g1 ~ g1@6 ~@2",
  T: "d2@5 ~ d2 ~ d2@5 ~ d2@2", U: "c2@4 ~@2 c2 ~ c2@5 ~ c2 ~", V: "f2@4 ~@2 f2@2 c2@2 f2@2 f1@3 ~",
  W: "d#2@4 ~@2 d#2 ~ d#2@5 ~ d#2 ~", X: "c2@5 ~ c2 ~ c2@3 ~ g1@2 c2@2", Y: "d#2@7 ~ f2@7 ~",
  Z: "f1@2 f2 f1 g2 g1 g2 g1", AA: "a1@4 ~@2 a1 ~ a1@5 ~ a1@2", AB: "e2@4 ~@2 e2 ~ e2@5 ~ e2@2",
  AC: "a1@5 ~ a1 ~ a1@6 ~@2", AD: "e2@5 ~ e2 ~ e2@5 ~ e2@2", AE: "f#2@6 f#1@2 e2@4 a1@3 ~",
  AF: "d2@4 ~@2 d2 ~ d2@4 ~@2 d2 ~", AG: "g2@5 ~ g2 ~ g2@2 d2@2 g1@3 ~", AH: "[a1@11 ~@5]/3",
})).s("gm_acoustic_bass").gain(0.64)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  A B@2 C@3 D E F G H I J E F G K L M N O P Q R S T U V W X Y Z@2 AA E F G H I J E F G K L M N O P Q R S T U V W X Y Z@2
  AA E F G K L M N O AB AC AD AE AF AG AH AI AC AD AE AF AG AH AI AC AD AE AF AG AH AI AJ@3
>`.pickRestart({
  A: "~@8 [d#3,a#3,d#4] ~@3 [d#3,g3,a#3,d#4] ~@3, ~@4 g3 ~@3", // D#5 D#
  B: "[~@12 [g3,a#3,d4]@3 ~ a3@8 ~@4 [f4,a4]@4, g2@4 [f4,a4]@3 ~, [g3,a#3,d4]@3 ~ c4@4, ~@10 d3@5 [d3,f3]@17, ~@13 a3@3]/2", // Gm F Gm Dm
  C: "[~@12 a#3@3 ~ a3@6 ~@2 [c4,f4,a4]@7 d#3 [g3,c4,d#4,g4]@15 ~, [g2,d4]@16 ~@15 c3@16 ~, a#3@3 ~ [c4,f4,a4]@2 ~@6, g3@5 g3@3 ~@3 a3@5 ~@8, ~@8 d3@7 [d3,f3]@17 ~@16]/3", // F Cm G5 F Dm
  D: "[f3,a#3,d4]@7 ~ [f3,a3,c4]@7 ~", E: "[g2,d3,g3,a#3]", F: "[d3,a3,c4,f4]", G: "[g2,g3,a#3,d4]",
  H: "[d3,f3,a3,c4,f4,a4], d4 ~@15", I: "[c3,g3,c4,d#4,g4]", J: "[f3,a#3,d4] [f3,a3,c4]", K: "[d3,a3,c4,f4,a4]@7 ~",
  L: "[e3,g3,b3,e4]@7 ~ [d3,a3,c4,f4,a4]@4 [g2,g3,b3,d4]@3 ~", // Em Dm7 G
  M: "g3@2 ~@3 d#4 ~ a#3, c3, d#4@5 ~ [d#4,f4]@2, a#3@4 a#3@3 ~, ~@3 g3@5", // D#sus2
  N: "[c3,g3,d#4]@8 c4@2 ~@2 [a#2,f3,a#3,d4]@3 ~, [a#3,g4]@5 ~@3, ~ [c3,g3,d#4]", // Cm A# D# Cm
  O: "d#3@6 ~@4 g#3@2 [g#3,c4,d#4]@3 ~, [g#2,a#3]@15 ~, d#4@3 ~, g#3@5 ~@3, ~@8 d#3@7 ~", // G# G#sus2
  P: "a#3@6 ~@4 c4@5 ~, [f2,c3,f4]@7 ~, c4@4 a#3@3 ~, f3@2 ~ f3@4 ~", Q: "g3@5 g3 [g3,a#3,d4]@2, g2, [a#3,d4]@3 ~",
  R: "[c4,f4,a4]@3 [c4,f4,a4], [d3,a3]", S: "g3@5 ~ a#3@2, [g2,d4], a#3@3 ~, ~@5 g3@3",
  T: "a3@5 ~ [c4,f4,a4]@2, d3, [c4,f4,a4]@3 ~, ~@5 a3@3", U: "~@5 d#4@3, [c3,g3,g4], d#4@5 ~@3, c4!2, ~@3 d#3@5",
  V: "[f3,a#3,d4]@4 [f3,a3,c4]@3 ~", W: "[d#3,a#3,d4,g4,a#4,d5,f5]@15 ~",
  X: "~@5 f4 ~ d4, [d3,a3], a4@3 [f4,a4], f4 c4, c4@3 f3@5", Y: "~@3 g4, [g2,a#3,d4], g3!2, ~@3 d3@2 d3@3",
  Z: "[~@15 d#3 c4@3 ~@7 d#4@5 ~, d3@12 c4@2 g3@2 d#4@6 c4@2 d4@7 ~, a3@8 c4@2 a3@5 c3@16 ~, [c4,f4,a4]@8 [f4,a4]@8 g4@15 ~, ~@6 f3@10 ~@3 g3@12 ~]/2", // F
  AA: "[d#2,d#3,g3,a#3]@4 [f2,f3,a3,c4]@3 ~", AB: "[g3,a#3,d#4]@5 ~ [g3,a#3,d#4] ~ [a3,c4,f4]@3 ~ [a3,c4,f4]@3 ~",
  AC: "a3@5 a3 [a3,c4,e4]@2, a2, [c4,e4]@3 ~", AD: "[d4,g4,b4]@3 [d4,g4,b4], [e3,b3]",
  AE: "[a2,a3,c4]@10 a3@2 c4 ~@3, e4@3 ~", AF: "b3@9 ~ b3@2 [d4,g4,b4] ~@3, [e3,d4,g4,b4]@3 ~",
  AG: "[f#3,a3,c#4,e4]@7 ~ [e3,g3,b3,d4]@3 ~ [f#3,a3,c#4,e4]@3 ~", AH: "[a3,c4,f4]@15 ~",
  AI: "[g3,c4,e4]@7 ~ [g3,b3,d4]@6 ~@2", AJ: "[[a2,e3,a3,c4,e4]@11 ~@5]/3",
})).s("gm_epiano2").gain(0.56)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~ A B A C D@2 E ~@5 F G@2 H I J@2 K L F M F M N@2 O P F Q R S E ~@5 F G@2 H I J@2 K L F M F M N@2 O P F Q R S F G@2 H
  I J@2 K T U V W X Y Z AA U V W X Y Z AA U V W X Y Z AA AB@3
>`.pickRestart({
  A: "[g5,d6]@15 ~", B: "a5@15 ~", C: "[f5,a5,c6]@15 ~", D: "[d#5@16 ~@8 c6@7 ~, [a#5,d6]@25 ~@7, ~@16 f5@15 ~]/2",
  E: "f4@15 ~", F: "[g4,a#4,d5]@15 ~", G: "[[a4,c5]@15 g4@17, f4@7 ~@9]/2", H: "d4@7 ~",
  I: "[e4,e5]@8 [d4,d5]@4 [e4,e5]@3 ~", J: "[c4@7 d4]/2", K: "d#4@7 ~", L: "f5@7 ~, c5 ~", M: "[d4,f4,a4,c5]",
  N: "[g4@15 ~ f4@8 [a4,c5]@7 ~, [a#4,d5]@23 ~ g4 ~@7]/2", O: "[d#4,g4,a#4,d5,f5]@15 ~", P: "[f4,a4,c5]@15 ~",
  Q: "[d4,f4,a4,c5]@15 ~", R: "[g4,a#4,d#5]@15 ~", S: "[a#3,d#4]@8 [c4,f4]@7 ~", T: "[d#4,d#5]@8 [f4,f5]@7 ~",
  U: "[c5,c6]", V: "[e4,g4,b4,d5,b5]", W: "[a4,c5,e5,c6,e6]", X: "[e4,g4,d5,g6], [b4,b5]@7 ~",
  Y: "[c#5,e5,a5]@7 ~ [b4,d5,g5]@3 ~ [c#5,e5,a5]@3 ~", Z: "[f5,a5,c6,f6]@15 ~", AA: "[g5,c6,e6]@7 ~ [g5,b5,d6]@7 ~",
  AB: "[e6@11 ~@5]/3",
})).s("gm_string_ensemble_2").gain(0.32)

// chords · string ensemble 2 · "SLOWSTRING" · soft notes
const string_ensemble_2_soft = note("<~ A B C D ~ E ~@14 F ~@5 G ~@20 F ~@5 G ~@36 H@3>".pickRestart({
  A: "[a#4,d5]@15 ~", B: "[c5,f5,c6]@15 ~", C: "[a#4,d5]", D: "c5@15 ~", E: "~@8 a5@7 ~", F: "f4@7 ~", G: "~@8 f4@7 ~",
  H: "[[e5,a5]@11 ~@5]/3", // A5
})).s("gm_string_ensemble_2").gain(0.18)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  A B C@2 D E@3 F@2 G@2 H@5 I@3 J K B C@2 D L@2 M@4 N@3 F@2 G@2 H@5 I@3 J K B C@2 O P@2 M@4 Q@6 I@3 J R S T@2 U V W X S
  T@2 U V W X S T@2 U V W X Y@2 ~
>`.pickRestart({
  A: "~@8 [g3,a#3,d#4]@2 ~@2 [g3,a#3,d#4] ~@3", B: "[g3,a#3,d4]@3 ~",
  C: "[~ [a3,a4] [a#3,a#4] [a3,a4] [a#3,a#4] [a3,a4] [g3,g4] [d3,d4]@6 ~@3]/2", // A A# A A# A G D
  D: "~@2 [a3,a4]@2 [a#3,a#4]@2 [a3,a4]@2 [a#3,a#4]@2 [a3,a4]@4 [g3,g4] ~", // A A# A A# A G
  E: "[[g3,g4]@9 ~ [f3,f4]@11 ~@9 [d4,g4] ~ [g2,d3,g3]@13 ~@3, ~@31 a#3@14 ~@3]/3", // G F G5
  F: "[~@8 [g2,d3,g3,a#3]@7 ~, ~@7 g4@8 ~, ~@15 d4@15 ~@2]/2", // Gm
  G: "[~@8 [c4,d#4,g4]@7 ~, ~@7 d#3@8 ~, ~@15 [c3,g3]@15 ~@2]/2", H: "[~@15 d4@31 ~ d4@32 ~, ~@7 g4@16 g4@16 ~]/5",
  I: "[~@8 c3@5 ~@2 c4@5 [g3,c4,d#4]@4, b3@8 [g3,c4]@5 c3 g3@6 ~@4, g3@2 [d#4,g4]@3 ~, e4@3 e4@7 ~@2, ~ d4@4 ~]/3", // Cm C5 D#
  J: "[g#2,g#3,c4,d#4]@13 ~@3", K: "c3@4 ~@8 f2@3 ~, [c4,f4]@15 ~, f2@10 a#3@5 ~, a#3@8 f3@7 ~, f3@6 c3@9 ~",
  L: "[[g3,g4]@9 ~ [f3,f4]@11 ~@9 [d4,g4] a#3]/2", M: "[d4@15 [d3,d4]@16 ~, [g3,a#3] ~]/4",
  N: "[~@32 [g2,d3,g3]@13 ~@3, g3@31 a#3@14 ~@3, g4@10 [d4,g4]@5 ~, ~@5 [f3,f4]@16 ~@3]/3", // G5 F
  O: "[a3,c4,f4]@9 ~@3 c4@2 a3@2, ~@10 f4@5 ~", P: "[[g3,g4]@9 ~ [f3,f4]@11 ~@9 [d4,g4] a#3, d#4@3 ~@13]/2",
  Q: "[~@31 a#3@31 ~ d4@32 ~, g3 ~@2, g4@15 [d4,g4]@16 g4@16 ~, ~@5 [f3,f4]@16 ~@27]/6", // G5 F
  R: "[g3,a#3,d#4]@5 ~ [g3,a#3,d#4] ~ [a3,c4,f4]@3 ~ [a3,c4,f4]@2 ~@2", S: "[a3,c4,e4]@3 ~",
  T: "[~ [b3,b4] [c4,c5] [b3,b4] [c4,c5] [b3,b4] [a3,a4] [e3,e4]@6 ~@3]/2", // B C B C B A E
  U: "[b3,d4,g4]@9 ~@3 d4@2 b3@2, ~@10 g4@5 ~", // G
  V: "~@6 c#4@2 [e3,g3,b3,d4]@4 [a3,c#4,e4]@3 ~, e4 ~, c#4@3 ~@5, a3!2 ~@2, ~ f#3@3 ~@4", // Em7 A
  W: "a3@3 ~@3 d4@2, f4@5 f4@3, d4@2 d4 ~, ~@3 a3@5", X: "[c4,e4]@4 [b3,d4]@3 ~", Y: "[[a3,c4,e4]@11 ~@5, a2@5 ~@3]/2",
})).s("gm_electric_guitar_muted").gain(0.47)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  A B C D E F G H I J K L M N I J K O P Q R S B C D E F G B C D E F T H I ~ K U ~ N ~ J K O P Q R S B C D E F G B C D E
  V W X Y Z AA AB P Q R AC AD ~ AE AF AG AH AI AJ AK AE AF AG AH AI AJ AK AE AF AG AH AI AL@2 ~
>`.pickRestart({
  A: "~@8 [g3,a#3,d#4] ~@3 [g3,a#3,d#4] ~@3", B: "[g3,a#3,d4]@6 ~@2 [f3,a3,a4] ~@3 [g3,a#3,a#4]@4", C: "[f3,a3,a4]@3 ~",
  D: "~@8 [f3,a3,a4] ~@3 [g3,a#3,a#4]@4", E: "[f3,a3,a4]@13 ~@3", F: "[d#3,g3,a#3]@6 ~@2 [a#3,d4] ~@3 [c4,d#4]@4",
  G: "[f3,a#3,d4]@7 ~ [f3,a3,c4]@7 ~", H: "~@3 [g3,a#3]", I: "[f3,a3]@15 ~", J: "[g3,a#3]@10 ~@2 [g3,a#3] ~@3",
  K: "[f3,a3]@3 ~", L: "[d#3,g3,a#3]@9 ~@3 [a#3,d4] ~@3", M: "[a#3,d4]@4 [a3,c4]@3 ~", N: "[d3,g3,a#3]@5 ~ [g3,a#3]@2",
  O: "[e3,g3,b3,e4]@7 ~ d4 ~@3 e4@2 ~@2", P: "[g3,a#3,d#4]@11 ~@5", Q: "~@3 d#4 d4@2 a#3@2",
  R: "c4@8 d#4 ~@3 [a#3,d4]@2 ~@2, ~ c4", S: "[f3,c4]@3 ~", T: "[d#3,g3]@8 [f3,a3]@7 ~", U: "[d#3,g3,a#3]@9 ~@7",
  V: "~@8 [g3,g4]@4 [a#3,a#4]@2 [g3,g4] ~", W: "[c4,c5]@2 ~@2 [c4,c5]@3 ~ [f3,f4]@2 ~@2 [g3,g4]@2 ~@2",
  X: "[a#3,a#4]@7 ~", Y: "~ [a3,a4] [a#3,a#4] [a3,a4] [a#3,a#4] [a3,a4] [a#3,a#4] [g3,g4]",
  Z: "[f3,f4]@2 [d3,d4] d5@4 ~, ~@3 d4 ~@4", AA: "~ [d4,d5] [c4,c5] [a#3,a#4] [a3,a4] [d3,d4] [f3,f4] [a3,a4]",
  AB: "[b3,b4]@8 [a3,a4]@4 [b3,b4]@3 ~", AC: "[d#3,g3,a#3]@8 [f3,a3,c4]@7 ~",
  AD: "[a3,c4,e4]@6 c5@2 [g3,b3,b4] ~ c5@2 [a3,c4]@4, ~@6 c5 ~", AE: "~@8 [g3,b3,b4] ~@3 [a3,c4,c5]@4",
  AF: "[g3,b3,b4]@13 ~@3", AG: "[a3,c#4,e4]@7 ~ [g3,b3,d4] ~@3 [a3,c#4,e4]@2 ~@2", AH: "f4@15 ~",
  AI: "[c4,e4]@7 ~ [b3,d4]@7 ~", AJ: "[a3,c4,e4]@6 ~@2 [g3,b3,b4] ~@3 [a3,c4,c5]@4", AK: "[g3,b3,b4]@3 ~",
  AL: "[[a3,c4]@13 ~@3]/2", // Am
})).s("gm_acoustic_guitar_steel").gain(0.56)

// drums · kick
const kick = s("bd").struct("<A B@20 C D@11 ~ B@14 C D@11 E D@4 F D@2 C D@21 E G ~@2>".pickRestart({
  A: "~@5 x ~ x", B: "x!2", C: "x ~@3 x ~@2 x", D: "x ~@2 x!2 ~@3", E: "x ~@2 x!3 ~@2", F: "x ~@2 x!3 ~ x", G: "x",
})).gain(0.74)

// drums · snare
const snare = s("sd").struct("<A B@32 ~ B@26 C B@4 D B@24 E ~@3>".pickRestart({
  A: "~@2 x!2", B: "~ x ~ x", C: "~@4 x ~@3 x ~@3 x ~ x!2", D: "~ x!3", E: "~@4 x ~@3 x ~@3 x!4",
})).gain(0.74)

// drums · hihat
const hihat = s("hh").struct("<~ [x!4]!32 [~ x ~ x] [x!4]!57 ~@3>").gain(0.74)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~ A@20 B A@5 B A@5 ~ A@14 B A@5 B A@5 C A@4 B A@2 B A@22 ~@3>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2", C: "~ x ~@3 x ~ x",
})).gain(0.22)

// drums · open hat
const open_hat = s("oh").struct("<~@21 A ~@5 A ~@5 B ~@14 A ~@5 A ~@5 C ~@4 A ~@2 A ~@22 B ~@2>".pickRestart({
  A: "~@7 x", B: "x", C: "~@3 x ~@4",
})).gain(0.74)

// drums · ride
const ride = s("rd").struct("<~ A ~@20 A ~@4 B A ~@4 B A ~@14 A ~@4 B A ~@5 A ~@4 A ~@2 C@21 D A ~@2>".pickRestart({
  A: "x", B: "x!2", C: "x!4", D: "x!3 ~",
})).gain(0.74)

stack(
  bass, epiano2, string_ensemble_2, string_ensemble_2_soft, electric_guitar_muted, acoustic_guitar_steel, kick, snare,
  hihat, hihat_soft, open_hat, ride
)

More by Paul Davis