Strudelify

Quiet Life

Ray Davies

KeyD majorTempo131 bpm
0:00/0:00
// Quiet Life — Ray Davies
// 131 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 6 "SAW WAVE" lead 2 sawtooth (copy of ch 5 "CLAVINET" clavinet); ch 8 "CLEAN GTR" electric guitar clean (copy of ch 7 "CLEAN GTR" electric guitar clean)
// note: Full arrangement: all 63 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(131/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 · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note("<~@16 A@2 B@2 C@3 ~ D@2 E@2 F@4 G@2 H@3 I J@2 ~@16 D@2 B@2 C@3>".pickRestart({
  A: "[c5@4 ~@6 c5 ~ c5 ~ c5@4 b4@4 g4@4 a4@4 e4 ~]/2", B: "[e4@3 a4@2 ~ a4@3 ~ e4@12 e4@5 ~@5]/2",
  C: "[c5@4 ~@6 c5 ~ c5 ~ c5@4 b4@4 g4@3 ~ g4@12 d4@8 ~@2]/3", D: "[c5@4 ~@6 c5 ~ c5 ~ c5@4 b4@4 g4@4 a4@5 ~]/2",
  E: "[e4@4 a4 ~ a4@3 ~ e4@12 e4@6 ~@4]/2", F: "[c5@4 ~@6 c5 ~ c5 ~ c5@4 b4@3 ~ g4@4 g4@12 d4@18 ~@8]/4",
  G: "[~@6 [e4,b4]@5 ~ b4 ~ [e4,b4]@8 [e4,b4]@6 e4@4]/2", // E5
  H: "[~@4 c5 ~ c5@4 a4@3 ~ g4@4 a4@4 b4@5 ~ b4 ~ b4@6 ~@8 b4@4]/3", I: "b4 c5",
  J: "[d4@10 d4@10 [a3,a4]@8 [c4,c5] ~ [c4,c5]@2]/2", // A C
})).s("gm_lead_2_sawtooth").gain(0.24)

// other · lead 2 sawtooth · "SAW WAVE" · soft notes
const lead_2_sawtooth_soft = note("<~@15 A B ~@3 B ~@3 B ~@3 B ~@3 C ~@23 B ~@3 B ~@2>".pickRestart({
  A: "~@15 a3", B: "e4 ~@3", C: "~@12 e4 ~@3",
})).s("gm_lead_2_sawtooth").gain(0.14)

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~@8 A@2 B@2 C@2 D@2 E@2 F G H@2 D@2 I@2 J G H@2 D@2 K L M N O P Q ~ R@2 S@2 T@2 U@2 R@2 V@2 T@2 U@2 W@2 J X H@2 Y
>`.pickRestart({
  A: "[a1@2 ~@2 a1 ~ d2 e2 g2!2 a1 ~ c2 ~ d2@4 d2 ~@4 g2 a2 ~ a2 ~ f#2@3 ~]/2",
  B: "[a1@2 ~@2 a1 ~ d2 ~ g2@2 a1 ~ c2 ~ d2@6 ~@6 e1@6, ~@23 e2@9]/2",
  C: "[a1@2 ~@2 a1 ~ d2 e2 g2!2 a1 ~ c2 ~ d2@4 d2 ~@5 a2@4 g2@2 b2 ~]/2",
  D: "[a1@2 ~@2 a1 ~ d2 ~ g2@2 a1 ~ c2 ~ d2@6 ~@6 d2@2 e2@4]/2",
  E: "[a1@2 ~@2 a1 ~ d2 e2 g2!2 a1 ~ c2 ~ d2@4 d3 ~@4 e2 g2 ~ a2@2 d2@2 e2 ~]/2",
  F: "a1@2 ~@2 a2 ~@3 a2@2 a1 ~ c2 ~ c#2@2, ~@3 c2@2 ~@3", G: "d2@2 ~@2 e2 e1@3",
  H: "[a1@2 ~@2 a1@2 e2@2 g2@2 a1 ~ c2 ~ d2@4 d2 ~@5 a2@4 g2@2 b2 ~]/2",
  I: "[a1@2 ~@2 a1 ~ d2 e2 g2 ~ a1 ~ c2 ~ d2@4 d3 ~@4 e2 g2 ~ a2@2 d2@2 e2 ~]/2",
  J: "a1@2 ~@2 a1 ~ c2@2 a2@2 a1 ~ c2 ~ c#2@2", K: "c3@3 ~ c3@2 ~@2", L: "b2@3 ~ b2@2 ~@2", M: "a2@3 ~ a2@2 ~@2",
  N: "g2@3 ~ g2@2 ~@2", O: "d3@3 ~ d3@2 f2@2", P: "~@2 f2@3 ~ f2@2 f2@3 ~ f2@4", Q: "b2@3 b2",
  R: "[a1@2 ~@2 a1 ~ c2 ~ g2@2 a1@2 c2 ~ d2@4 d2 ~@4 g2 a2 ~ a2 ~ f#2@3 ~]/2",
  S: "[a1@2 ~@2 a1 ~ d2 ~ g2@2 a1 ~ c2 ~@13 e1@6, ~@7 e2@9]/2",
  T: "[a1@2 ~@2 a1@2 c2 ~ g2 ~ a1 ~ c2 ~ d2@4 d2 ~@5 a2@4 g2@2 b2 ~]/2",
  U: "[a1@2 ~@2 a1 ~ c2@2 g2@2 a1 ~ c2 ~ d2@6 ~@6 d2@2 e2@4]/2",
  V: "[a1@2 ~@2 a1 ~ d2 ~ g2@2 a1 ~ c2 ~@6 d2 ~@6 e1@3 [e1,e2]@2 ~, ~@14 e2@15 ~@3]/2", // E
  W: "[a1@2 ~@2 a1 ~ d2 e2 g2!2 a1 ~ c2 ~ d2@4 d3 ~@4 g2 a2 ~ a2@2 d2@2 f#2@2]/2", X: "d2@2 ~@3 e1@3, ~ e2",
  Y: "a1@2 ~@2 a1 ~ d2 ~ g2@2 a1 ~ c2 ~@3",
})).s("gm_fretless_bass").gain(0.25)

// bass · fretless bass · "FRETLESS" · soft notes
const bass_soft = note(`<
  ~@10 A ~@3 A ~@4 B ~@2 A ~ C ~@2 B ~@2 A ~ D E F G H ~@2 I ~@2 A ~@7 A ~@8 B ~@2 A
>`.pickRestart({
  A: "~@7 e2 ~@8", B: "~@7 [d2,d#2] ~@8", C: "~@9 g2 ~@6", D: "~@6 c3 ~@5 b2@3 ~", E: "~@6 b2 ~@5 a#2@3 ~",
  F: "~@6 a2 ~@5 g#2@3 ~", G: "~@6 g2 ~@5 f#2@3 ~", H: "~@6 d3 ~@9", I: "~@3 a2@5",
})).s("gm_fretless_bass").gain(0.14)

// other · slap bass 2 · "SLAPBASS 2"
const slap_bass_2 = note("<~@13 A ~ B ~ C ~@3 A ~ B ~ C ~@3 A ~ B ~@13 A ~ D ~@5 A ~ B ~ C ~@3 A ~>".pickRestart({
  A: "~@8 a3@4 g3@2 b3 ~", B: "~@5 [g3,g4]@3", C: "~@2 c3 ~@13", D: "~@5 [d3,g3]@3",
})).s("gm_slap_bass_2").gain(0.28)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@8 A@2 B@2 C@2 D@2 E@8 F@2 E@2 F@2 G@2 ~@8 E@8 F@2 E@2 F@2 G@2 E@6 H
>`.pickRestart({
  A: "[~@14 [d4,f#4,a4]@5 ~@3 [b3,d4,g4]@7 ~@3]/2", B: "[~@14 [d4,f#4,a4,d5]@5 ~@3 [b3,d4,g4]@8 ~@2]/2",
  C: "[~@7 [d4,d5]@3 ~ [b3,d4,g4]@4 ~, ~@7 [f#4,a4]@2 ~@7]/2", // D G F#m
  D: "[~@14 [d4,a4,d5]@5 ~@3 [b3,d4,g4]@10, ~@14 f#4@3 ~@15]/2", E: "[~@7 [f#4,a4,d5]@3 ~ [b3,d4,g4]@3 ~@2]/2",
  F: "[~@14 [f#4,a4,d5]@5 ~@3 [b3,d4,g4]@6 ~@4]/2", G: "[~@14 [f#4,a4,d5]@5 ~@3 [b3,d4,g4]@5 ~@5]/2",
  H: "~@14 [f#4,a4,d5] ~", // D
})).s("gm_electric_guitar_clean").gain(0.12).pan(0.1)

// other · distortion guitar · "DISTORTION"
const distortion_guitar = note("<~@40 A@2 B C@2 D@5 E F G H I J ~@7>".pickRestart({
  A: "[~@4 c5@13 b4 ~ a4 b4 a4 ~ g4 a4 g4 f#4@2 g4 f#4 ~ e4]/2",
  B: "f#4 e4 d4 ~@2 d4 ~ c4 d4 c4 ~ b3 c4 b3 ~ a3, ~@2 e4 ~@5", C: "[c4@10 d4@4 d4@13 b3@5]/2",
  D: "[c4@10 d4@4 e4@4 g4@7 f#4@3 ~ g4@2 f#4@2 g4 f#4 g4 f#4 g4 [f#4,g4]!2 f#4 [f#4,g4] g4 [f#4,g4]!2 f#4 g4@5 ~@11 d5@17 ~]/5", // Gmaj7
  E: "e5", F: "g5@10 f#5@2 g5 f#5 [f#5,g5]!2", G: "g5@2 f#5 [f#5,g5]!5 e5@8", H: "d5@6 c5@2 d5@2 ~ c5@3 b4@2", I: "b4",
  J: "e5@13 ~@3",
})).s("gm_distortion_guitar").gain(0.23).pan(0.6)

// chords · overdriven guitar · "OVERDRIVE" · G5
const overdriven_guitar = note("<~@47 g3 [~ [g4,d5,g5]@3] ~@6 [e4@13 ~@3] ~@7>")
  .s("gm_overdriven_guitar").gain(0.3).pan(0.2)

// other · pad metallic · "METAL PAD"
const pad_metallic = note("<~@32 A B C D E A B ~@24>".pickRestart({
  A: "[f3,f4]", B: "[e3,e4]", C: "[d3,d4]", D: "[c3,c4]", E: "[g3,g4]",
})).s("gm_pad_metallic").gain(0.13).pan(0.7)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@32 A B C D@2 E@2 ~@24>".pickRestart({
  A: "c6", B: "b5", C: "a5", D: "g5", E: "[a5@15 b5@17]/2",
})).s("gm_string_ensemble_2").gain(0.3).pan(0.3)

// other · pad warm · "WARM PAD"
const pad_warm = note(`<
  A B@2 C A D@3 A E F@2 A G@3 A B@2 C A D@3 A E F@2 A G@3 ~@8 A B@2 C A D@3 A E F@2 A G@3 A B@2 C A H@2
>`.pickRestart({
  A: "a3", B: "[d4@8 b3@7 c4@16 ~]/2", C: "d4 g3", D: "[d4@7 b3@8 c4@16 d4@8 g3@8 ~]/3", E: "d4@7 b3@8 ~",
  F: "[c4@15 d4@9 g3@8]/2", G: "[d4@7 b3@8 c4@16 d4@8 ~ g3@8]/3", H: "[d4@7 b3@8 c4@16 ~]/2",
})).s("gm_pad_warm").gain(0.3).pan(0.6)

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

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

// drums · hihat
const hihat = s("hh").struct(`<
  ~@8 A@7 B A@3 C A@3 D A@3 E A@3 D F@2 G H G@3 ~ A@3 E A I A B A@3 E A@3 B A@3 C A@3
>`.pickRestart({
  A: "~ x!3 ~ x!7 ~ x!3", B: "~ x ~@14", C: "~ x!3 ~ x!7 ~@2 x ~", D: "~ x!3 ~ x!7 ~@4", E: "~ x!3 ~ x!7 ~ x!2 ~",
  F: "x!12 ~ x!3", G: "x!4 ~ x!7 ~ x!3", H: "x!4 ~ x!7 ~@4", I: "~ x!3 ~ x ~ x!5 ~ x!3",
})).gain(0.3)

// drums · open hat
const open_hat = s("oh").struct("<~@8 x!24 ~@7 x!6 [x ~@2 x ~@4] x!17>").gain(0.3)

// drums · crash
const crash = s("cr").struct("<~@32 x ~@3 x ~@26>").gain(0.25)

stack(
  lead_2_sawtooth, lead_2_sawtooth_soft, bass, bass_soft, slap_bass_2, electric_guitar_clean, distortion_guitar,
  overdriven_guitar, pad_metallic, string_ensemble_2, pad_warm, snare, snare_soft, hihat, open_hat, crash
)