Strudelify

Linus and Lucy

Vince Guaraldi

KeyA♭ majorTempo181 bpm
0:00/0:00
// Linus and Lucy — Vince Guaraldi
// 181 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 2 "Piano" piano (copy of ch 3 "Fretless Bass" fretless bass)
// note: Full arrangement: all 92 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(181/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.

// chords · piano · "Piano Lead"
const piano = note(`<
  ~@3 A@2 B@4 C@6 B@4 D@5 E F E F E G H@3 B@4 I@7 J@2 K L M N O P Q R S T U V W X Y Z AA AB B@4 I@7 J@2 ~@4 AC AD AE@6
  ~@3
>`.pickRestart({
  A: "[~@7 [c4,ab4]@2 [eb4,bb4] [ab4,c5]@2 [ab4,c5] [eb4,bb4] [c4,ab4]@2]/2", // Fm Eb5 Ab Eb5 Fm
  B: "[[eb4,bb4]@3 [c4,ab4]@4 [c4,ab4]@2 [eb4,bb4] [ab4,c5]@2 [ab4,c5]@10 ~ [c4,ab4]@2 [eb4,bb4] [ab4,c5]@2 [ab4,c5] [eb4,bb4] [c4,ab4]@2]/4", // Eb5 Fm Eb5 Ab Fm Eb5 Ab Eb5 …
  C: "[[eb4,bb4]@3 [c4,ab4]@4 [eb4,ab4]@4 [eb4,bb4] [eb4,bb4]@10 ~ [c4,ab4]@4 [eb4,bb4] [eb4,bb4]@10 ~ [c4,ab4]@2 [eb4,bb4] [ab4,c5]@2 [ab4,c5] [eb4,bb4] [c4,ab4]@2]/6", // Eb5 Fm Ab5 Eb5 Fm Eb5 Fm Eb5 …
  D: "[[eb4,bb4]@3 [c4,ab4]@4 [eb4,ab4]@4 [eb4,bb4] [eb4,bb4]@10 ~ [c4,ab4]@4 [eb4,bb4] [eb4,bb4]@10 ~ ab4]/5", // Eb5 Fm Ab5 Eb5 Fm Eb5
  E: "[db3,db5,f5,ab5,db6]!3 [eb3,eb5,ab5,eb6] ~ [eb5,ab5] f5 [f5,ab5]", // Db Ab5 Fm
  F: "[eb5,ab5] f5 [f5,ab5] [eb5,ab5] [f5,ab5]!2 ~ f3, ~@3 [eb5,ab5]", // Ab5 Fm Ab5 Fm Ab5
  G: "[eb5,ab5] f5 [f5,ab5] [eb5,ab5] [f5,ab5]!2 [eb5,ab5]@2", // Ab5 Fm Ab5 Fm Ab5
  H: "[[eb4,ab4]@14 ~ [c4,ab4]@2 [eb4,bb4] [ab4,c5]@2 [ab4,c5] [eb4,bb4] [c4,ab4]@2]/3", // Ab5 Fm Eb5 Ab Eb5 Fm
  I: "[[eb4,bb4]@3 [c4,ab4]@4 [eb4,ab4]@4 [eb4,bb4] [eb4,bb4]@10 ~ [c4,ab4]@4 [eb4,bb4] [eb4,bb4]@10 ~ [eb4,ab4]@4 [eb4,bb4] [eb4,bb4]@10 ~ [c4,ab4]]/7", // Eb5 Fm Ab5 Eb5 Fm Eb5 Ab5 Eb5 …
  J: "[~@3 [eb4,bb4] [eb4,bb4]@12]/2", K: "~@8 eb5@3 [ab3,d4,gb4] eb5@3 [g3,db4,f4]",
  L: "g5@4 g5@3 [g3,db4,f4] eb5@3 bb4 g4@3 [g3,db4,f4]", // Gm7b5
  M: "bb4@3 [db4,f4] ~@3 [g3,db4,f4,eb5] g5@3 eb5 ~@3 [f3,b3,eb4]", N: "f5@4 f5@3 [f3,b3,eb4] db5@3 ab4 ~@4",
  O: "[f3,b3,eb4]@4 ~@3 [f3,b3,eb4,c5] eb5 e5 ~ f5 gb5 g5 ~ [e3,bb3,d4,c5]", // Fm7b5 F7 Em7b5
  P: "eb5 e5@6 [e3,bb3,d4] f5@3 c5 ab4@3 [f3,b3,eb4]", Q: "db5@4 bb4@3 b4 bb5@3 [f3,b3,eb4,ab5] g4@3 [g3,db4,f4,bb4]",
  R: "eb5@3 g5@2 eb5@2 [g3,db4,f4] ~@3 [g3,db4,f4] ~@4, ~ g5", // Gm7b5
  S: "[ab3,d4,gb4]@4 ~@3 [ab3,d4,gb4] f5 gb5 ~ [ab3,d4,gb4,g5]@4 [g3,db4,f4], ~ bb5", // Abm7b5 Gm7b5
  T: "[g5,bb5]@4 [f5,bb5]@3 [g3,db4,f4] f5 gb5 g5@5 [g3,db4,f4], ~ bb5", // Gm Bb5 Gm7b5
  U: "[g5,bb5]@4 [f5,bb5]@3 f5 gb5@2 g5 [g3,db4,f4,f5] eb5@3 [f3,b3,eb4,db5], ~@7 bb5@4 ~@5", // Gm Bb5 Gm7b5 Fm7b5
  V: "bb4@3 b4 bb5@3 [f3,b3,eb4,ab5] eb5 c5 ~ ab4@4 [f3,b3,eb4,db5]", // Fm7b5
  W: "~ ab4 ~ db5 f5 ab5 ~ db6 f6 db6 ~ [f3,b3,eb4,ab5] f5 e5 f5 [e3,bb3,d4,gb5]", // Fm7b5 Daug
  X: "g5@3 eb5 ~@3 eb5 e5@3 [e3,bb3,d4] c5@3 [f3,b3,eb4,ab4], ~@7 g5@5 ~@4", // Em7b5 Fm7b5
  Y: "f4@4 f5@3 eb5 db5@3 [f3,b3,eb4,ab4] d5@3 [gb3,c4,e4,gb5]", // Fm7b5 Gbm7b5
  Z: "a5@4 gb5@3 d5 a4@3 [gb3,c4,e4,bb4] eb5@3 [g3,db4,f4,g5]", AA: "f5@3 eb5 bb4@3 [g3,db4,f4,g4] eb5@3 bb4 g4@4",
  AB: "[c4,ab4] [eb4,bb4] [ab4,c5]@2 [ab4,c5] [eb4,bb4] [c4,ab4]@2", // Fm Eb5 Ab Eb5 Fm
  AC: "~ ab3 bb3 c4 ab4 bb4 c5 [c5,ab5], ~ c3@3 ~ eb4@2 ~, ~@2 eb3@2 c4@3 ~", // Fm
  AD: "bb5 db6@3 [ab5,c6]@2 [eb5,bb5] [c5,ab5]", // Ab Eb5 Fm
  AE: "[[eb5,bb5]@3 [c5,ab5]@12 [eb5,bb5]@4 [c5,ab5]@12 [eb5,bb5]@4 [c5,ab5]@13]/6", // Eb5 Fm Eb5 Fm Eb5 Fm
})).s("gm_piano").gain(0.64)

// bass · fretless bass
const bass = note(`<
  A@8 B@8 C@8 D E D E D F G@8 H@8 ~ I J K L M N O P Q R S T U V W X Y@8 B@8 Z@2 ~ F AA@5 AB@4
>`.pickRestart({
  A: "[ab1 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1]/8",
  B: "[~ eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 b1@2 gb2 b2 b1 gb2 b2@2 b1@2 gb2 ab2 b1 gb2 ab2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1]/8",
  C: "[~ eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 b1@2 gb2 b2 b1 gb2 b2@2 b1@2 gb2 ab2 b1 gb2 ab2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1]/8",
  D: "db2!3 eb2 ~@4", E: "~@7 f2", F: "~@7 eb2",
  G: "[ab1 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 b1]/8",
  H: "[~ gb2 b2 b1 gb2 b2@2 b1@2 gb2 ab2 b1 gb2 ab2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 b1@2 gb2 b2 b1 gb2 b2@2 b1@2 gb2 ab2 b1 gb2 ab2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1]/8",
  I: "eb2 g2 ab2 a2", J: "bb2 b2 c3 eb3", K: "db3!2 b2 bb2", L: "ab2 bb2 f2 db2", M: "c2!2 e2 c2", N: "db2 f2 ab2 db3",
  O: "eb3 d3 db3 c3", P: "b2 bb2 ab2 g2", Q: "eb2 f2 g2 eb2", R: "f2 d2 eb2 e2", S: "db2 f2 gb2 g2", T: "ab2 a2 bb2 b2",
  U: "c3 g2 c2 ab2", V: "db3 ab2 db2 a2", W: "d3 a2 d2 bb2", X: "eb3@2 bb2@2 eb2@2 bb2 eb2",
  Y: "[ab1 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 b1@2 gb2 b2 b1 gb2 b2@2 b1@2 gb2 ab2 b1 gb2 ab2@2 ab1]/8",
  Z: "[~ eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1]/2",
  AA: "[ab1 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1@2 eb2 f2 ab1 eb2 f2@2 ab1@2 eb2 ab2 ab1 eb2 ab2@2 ab1]/5",
  AB: "[~ eb2 f2 ab1 eb2 f2@2 ab1@21 ~@4]/4",
})).s("gm_fretless_bass").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A C ~ D@16 A B A B A B A B A B
  A B A B A B A C ~@2 A B A B A C ~@3
>`.pickRestart({
  A: "x ~@2 x ~@4", B: "x ~@2 x ~ x ~@2", C: "x ~@2 x ~ x ~ x", D: "x ~@6 x!2 ~@7",
})).gain(0.36)

// drums · rim
const rim = s("rim").struct("<~@47 [~ x ~ x]!16 ~@29>").gain(0.36)

// drums · snare
const snare = s("sd").struct("<[~ x ~@2]!46 ~@17 [~ x ~@2]!18 ~@2 [~ x ~@2]!6 ~@3>").gain(0.4)

// drums · hihat
const hihat = s("hh").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B C@6 A B A B A B A B A B A B A B A B ~ D@16 A B A B A B A B A B A B A B
  A B A B ~@2 A B A B A B ~@3
>`.pickRestart({
  A: "~ x ~@2 x!2 ~@2", B: "~ x ~@2 x ~ x!2", C: "x!4", D: "~ x ~ x",
})).gain(0.36)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B@15 C ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~@3
>`.pickRestart({
  A: "~@5 x ~@2", B: "x ~@6 x!2 ~@6 x", C: "x ~@6 x!2 ~@7",
})).gain(0.36)

// drums · crash
const crash = s("cr").struct(`<
  ~@3 A ~@3 A ~@5 A ~@3 A ~@6 B ~ B ~ B ~ C A ~@3 A ~@9 A ~@17 C ~@2 A ~@3 A ~@3 A ~@5 A ~@7 A ~@3
>`.pickRestart({
  A: "~@7 x", B: "~@3 x ~@4", C: "x",
})).gain(0.28)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@7 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@18 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~@3 A ~ A ~ A ~@4
>`.pickRestart({
  A: "~@6 x!2",
})).gain(1.83)

stack(piano, bass, kick, rim, snare, hihat, open_hat, crash, cabasa)

More by Vince Guaraldi