Strudelify
Heirlooms cover art

A Christmas Album

Heirlooms

Amy Grant

KeyF majorTempo100 bpm
0:00/0:00
// Heirlooms — Amy Grant
// 100 bpm, 3/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 107 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/3)

// 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 · fretless bass · "Fretless Bs."
const bass = note(`<
  ~@57 A B C D E F G H I J K L M N O P Q R S T U R V W X Y@2 Z AA AB AC AD AE AF AG AH AI AJ@2 Z ~@2 AK AL AM AN AO@4
>`.pickRestart({
  A: "~@5 c2", B: "f2@5 ~ f2 ~ f2@3 ~", C: "f2@14 ~@2 f2@5 ~@3", D: "f2@9 ~@3 f2@2 ~@2 f2@7 ~",
  E: "bb1@13 ~@3 bb1@4 c2@4", F: "f2@11 ~ f2@3 ~ f2@7 ~", G: "f2@15 ~ f2@6 ~@2", H: "f2@11 ~ f2@2 ~@2 f2@8",
  I: "bb1@9 ~ bb1@2", J: "g2@10 ~@2 g2@2 ~@2 g2@7 ~", K: "g2@2 bb1", L: "e2@5 d2", M: "c2 f2 e2",
  N: "f2@11 ~ f2@3 ~ f2@8", O: "eb2@10 ~@2 eb2@3 ~ eb2@8", P: "d2@7 ~ d2@4", Q: "db2", R: "c2@11 ~ c2@3 ~ c2@7 ~",
  S: "c2@14 ~@2 c2@7 ~", T: "c2@10 ~@2 c2@3 ~ c2@6 ~@2", U: "c2@7 ~ c2@3 ~", V: "c2@5 ~ c2@2 f2@4", W: "db2@11 ~",
  X: "db2@23 ~", Y: "[f2@39 ~ f2@8]/2", Z: "c2@23 ~", AA: "c2 f2 c3", AB: "f3 c3 bb2 a2@2 g2", AC: "a2 g2 f2 c2 g1 f1",
  AD: "eb2@5 bb2", AE: "eb3@5 eb2", AF: "d2@5 a2", AG: "d3@4 a2@4 d2@7 ~ d2@8", AH: "db2@5 ab2",
  AI: "db3 ab2 db2@2 ~ c2", AJ: "[f2@43 ~@5]/2", AK: "f2@23 ~", AL: "f2@5 c2", AM: "f2@11 ~", AN: "f2",
  AO: "[f3@9 bb2@4 a2@4 ~ g2@4 a2@5 ~@10 f1@39 ~@20, ~@27 f2@43 ~@26]/4",
})).s("gm_fretless_bass").gain(0.39)

// chords · harpsichord
const harpsichord = note(`<
  ~ A@2 B@7 C D E F G H I@3 J@2 K L@2 M@2 N@2 O P Q R@2 S T U V W X Y Z@4 AA@2 AB AC AD AE AF D E AG G AH AI@2 AJ AK
  AL@3 AM AN AO AP AQ AR AS AT AU@2 AV AW AX AY AZ BA BB BC BD BE@2 BF@4 BG BH BI@2 BJ BK BL@2 BM@3 BN BO BP BQ BR@4
>`.pickRestart({
  A: "[~@41 a4@4 [g4,a5]@3, ~@21 [d4,f5]@25 ~@2, ~@21 a4@16 [f4,a5]@9 ~@2, ~@25 f4@8 g4@12 ~@3, ~@29 [e4,g5]@17 ~@2]/2", // Gsus2 Dm F Em
  B: "[~@19 a5@2 ~@20 bb4@4 ~@20 a5@4 ~@20 g5@4 ~@16 [g4,bb4,db5]@8 ~@47 c5@4, ~ a4@20 [e4,g5]@24 [eb4,bb5]@16 [f4,c6]@8 [d4,f5,bb5]@24 [db3,f5]@24 c3@25 [g3,bb4]@4 c4@4 g4@5 c5@4 [c3,g5]@9, ~@5 bb4@12 bb4@5 ~@3 bb4@8 bb4@8 ~@8 bb4@21 ~@7 bb4@16 ~@8 f4@16 a4@8 c4@4 f4@39, ~@9 d5@13 ~@7 a5@16 ~@12 g4@13 ~@3 f4@20 ~@4 db4@20 g4@4 a3@47, ~@13 [f4,bb5]@9 ~@7 c5@8 [c5,bb5]@8 ~@8 a4@17 ~@15 [c5,a5]@8 db5@16 ~@8 c5@16 g4@5 a4@30]/7", // Gdim Em Eb5 F5 Bb Db Gm C5 …
  C: "~@20 f4@3 ~, f2@23 ~, a3@12 a3@11 ~, ~@4 c3@19 ~, ~@8 c4@8 [f3,c4]@7 ~", // F5
  D: "~@5 c3, [f2,g4], bb3 [bb3,a4]@2, ~ g3@5", E: "~@5 [a3,f4], f2, a3@3 f4 f3@2, ~ c3@5, ~ c4@2",
  F: "~@5 bb3, f2, g4 c4, ~ g3@5, ~ bb3 g4", G: "~@20 [a3,f4]@3 ~, f2@23 ~, a3@16 f3@7 ~, ~@4 c3@19 ~, ~@2 f4@3 ~",
  H: "~@5 c3, [f2,bb3,g4], ~ g3@5, ~ [c4,a4]@2", // Gm7 F
  I: "[~@17 c5, f2@4 c4@4 [bb3,d4]@4 c5 c3 a3 c4 f4@2, a3@3 a3@3 [f2,g4] g3@11, ~ c3@4 f4@5 g4 bb4@7, ~ c4 f3@4 [f2,g4,a4]@3]/3", // Bb Fsus2 F
  J: "[~@20 [f4,a4]@3 ~, [g3,c5]@8 g4@2 bb4@8 c4@5 ~, bb4@12 f4@11 ~ [f4,a4]@8 a3@14 ~@2, g4@8 c4@15 ~@5 f3@18 ~@2, ~@4 bb3@19 ~ f2@22 ~@2]/2", // F C5 F
  K: "~@2 f5, [bb2,d4,bb4], ~ f3@5, ~ [bb3,e5]@2", // Bb Bbdim
  L: "[~@5 c5 ~@5 d5, a4@16 f4@8 [f2,g4,bb4,c5]@4 f3@4 [bb4,f5]@15 ~, [f2,g4]@12 c4@35 ~, c5@8 a3@39 ~, ~@4 c3@43 ~]/2", // Fsus4 Bb5 Fsus2
  M: "[~@4 f5@2 ~@5 [bb4,d5], [f2,e4]@6 [d3,f4,bb4,d5,f5]@2 bb3 f4 [c5,e5]@2, e5 c5 a4@4, a4 [a3,a5]@5, ~ c3@11]/2", // Bb Fmaj7 Bb C A
  N: "[~@11 f3, g2@6 [f3,bb4] d4 [a4,c5] d4 [bb4,d5]@2, g4!2 g3@4, ~ d4@3 [bb4,d5] [a4,c5] g4@6, ~ d3@3]/2", // Bb5 Am Bb Am
  O: "~@5 d3, [e3,c5]@23 ~, g4@8 [e4,g4]@8 [e4,g4]@7 ~, ~@4 c4@8 c4@11 ~", // C Em
  P: "~@16 [e3,bb4,g5,bb5]@7 ~, [c3,c5,c6]@23 ~, ~@4 c4@19 ~, ~@8 [d3,f5]@15 ~", // Edim C Dm
  Q: "~@5 a5, a5@5 ~, f5@16 f5@7 ~, ~@8 f4@15 ~, ~@12 a4@11 ~",
  R: "[~@5 bb4, [eb3,c6]@11 a5@13, ~ a5@4 f5 ~@6, ~ f4@2 [bb2,bb3,f5,bb5]@3, ~ f5 a4 ~ f4@2]/2", // Cm Bb5
  S: "~@2 g4, [db3,bb4,f5], g4@2 ~, ~ bb3@5, ~ [db4,a4]@2", // Bbm Gbm
  T: "~@20 c4@3 ~, [c3,a4,c5]@23 ~, ~@4 c4@12 a3@7 ~, ~@8 f4@15 ~, ~@12 f3@11 ~", // F
  U: "~@5 a3, [c3,a4], ~ c4@5, ~ [bb3,g4]@2, ~@2 f4", V: "~@5 d4, [c2,c3,f4], ~ d4@4 ~, ~ g4@2, ~@2 bb3",
  W: "~@2 [d4,bb4], [c2,c3,g4], ~ bb3@2 bb3@3, ~ a4@2", // Gm C5
  X: "c4@8 ~@12 a4@3 ~, [c2,c3]@23 ~, a4@16 g4@7 ~, f4@12 f4@11 ~, ~@8 c4@15 ~", // C
  Y: "~@2 [a4,c5], [c3,f4], a4@2 ~, ~ c4@2 c4@3, ~ [g4,bb4]@2", // Am F5 Gm
  Z: "[~@32 bb4@8 [bb4,g5]@8 c5@16 ~@24 [a4,f5]@7 ~, db3@16 bb4@8 [db3,f4,db5]@24 f5@20 [a4,f5]@12 [bb4,g5]@15 ~, bb4@12 f4@8 c5@28 [c3,a3,c6]@47 ~, f4@8 db4@24 [db4,f5]@17 ~@15 f4@31 ~, ~@4 bb3@45 ~@15 c5@8 [c5,a5]@23 ~]/4", // Eb Dm Db Dm Eb F Db F
  AA: "[~@44 c3@3 ~, c3@20 g3@27 ~, f4@8 [bb4,f5]@4 f4@11 ~ g4@8 f4@15 ~, bb4@8 bb3@15 ~ c3@16 [e4,g4]@7 ~, ~@4 g3@12 [bb4,f5]@7 ~ bb4@23 ~]/2", // Bb5 Em Bb5
  AB: "~@20 f4@3 ~, f2@16 c4@7 ~, f4@12 a3@11 ~, ~@4 c3@19 ~, ~@8 f3@15 ~",
  AC: "~@5 [bb3,g4], f2, [bb3,g4]@5 ~, ~ [c4,a4]@2", AD: "~@5 a4, [f2,f4], a3@2 [f3,a3], ~ c3@5, ~ c4@2",
  AE: "d4 ~ [c3,g4,c5], [f2,bb3], g4@2 ~, ~ [d4,bb4]@2", // C5 Bb5 Gm
  AF: "~@20 c4@3 ~, f2@23 ~, a3@12 f3@11 ~, ~@4 c3@19 ~, ~@8 c4@8 a3@7 ~", AG: "~@5 bb3, f2, g4 c4, bb3!2 g4, ~ g3@5",
  AH: "~@5 c3, [f2,g4]@23 ~, bb3@8 [bb3,a4]@15 ~, ~@4 g3@19 ~", // Fsus2 Bbmaj7
  AI: "[~@44 d5@3 ~, f2@20 f4@4 g4@4 bb3@4 d4@4 g4@4 bb4@7 ~, a3@12 a3@35 ~, ~@4 c3@43 ~, ~@8 c4@8 c4@31 ~]/2",
  AJ: "~@8 f4@2 c5 ~, [f2,g4,a4,c5]@11 ~, ~@2 c3@9 ~, ~@4 a3@7 ~, ~@6 c4@5 ~", // F
  AK: "~@5 bb4, [f2,g4,c5]@2 f4, bb4 d4, ~ f3@5, ~ bb3@2", // Fsus2
  AL: "[~@68 c5@3 ~, [f2,a4]@28 f3@4 [bb3,e5]@8 f5@4 c4@12 a3@8 f4@7 ~, f4@12 c4@12 [d3,d4,bb4]@24 [f2,g4,a4]@23 ~, ~@4 f3@12 f4@32 c5@12 c4@11 ~, ~@8 a3@40 ~@4 c3@19 ~]/3", // F Bbdim Gm F
  AM: "~@5 d5, [f2,c5], bb4 [bb4,f5]@2, ~ f3@5, ~@2 c3", AN: "~@2 [a4,f5], [f2,e4,e5], a4@2 ~, ~ [a3,c5,a5]@2",
  AO: "~@5 [bb4,d5], [f2,f5]@2 [c5,e5], [bb4,d5] f4, f4 bb3@2, ~ f3@5", // Bb F C Bb
  AP: "~@5 [a4,c5], g2@2 [g3,bb4,d5], g4 g4@2, ~ d4@5, ~ d3", AQ: "~@5 f3, g4, f3@2 [bb4,d5], bb4 d4, ~ d4 [a4,c5]@4",
  AR: "~@5 d3, [e3,c5], g4 [e4,g4]!2, ~ c4@2 c4@3", // C Em
  AS: "~@8 [d3,f5]@7 ~ [e3,bb4,g5,bb5]@8, [c3,c5,c6]@5 ~@3, ~@4 c4@11 ~@9", AT: "~@5 f5, [f3,a5], f5@5 ~, a4!2, ~ f4!2",
  AU: "[~@10 f5 ~@9 bb4@4, [eb3,c6]@23 ~ [bb2,f5,bb5]@24, ~@2 a5@9 a5@13, ~@8 f4@15 ~@5 bb3@20, ~@8 f5@8 a4@7 ~@9 d4@16]/2", // Cm Bb5
  AV: "~@2 g4, [db3,bb4], g4@2 ~, ~ bb3@5, ~ [db4,a4]@2", AW: "~@5 c4, [c2,c3,a4,c5], ~ c4@3 a3@2, ~ f4@2, ~ f3",
  AX: "~@20 a3@3 ~, [c3,a4]@16 f4@7 ~, ~@4 c4@19 ~, ~@8 g4@15 ~, ~@12 bb3@11 ~", // F
  AY: "bb3!2 bb3@2 ~ d4, [c2,c3,f4], ~ g4@2, ~@2 bb3", AZ: "~@2 [d4,bb4], [c3,g4], ~ bb3@2 bb3@3, ~ a4@2",
  BA: "c4@2 ~@3 a4, [c2,c3], a4@2 g4, f4!2, ~ c4@2", // C
  BB: "~@2 [a4,c5], [c3,f4]@23 ~, a4@2 ~, ~ c4@2 c4@3, ~@8 [g4,bb4]@15 ~", // Am F5 Gm
  BC: "~@5 c5, db3@16 bb4@7 ~, bb4@12 f4@11 ~, f4@8 db4@15 ~, ~@4 bb3@19 ~",
  BD: "~ bb4 [bb4,g5], [db3,f4,db5], ~ bb3@5, ~ [db4,f5]@2", // Eb Db
  BE: "[c5@16 ~@24 [a4,f5]@7 ~, [c3,a3,c6]@47 ~, f5@20 [a4,f5]@12 [bb4,g5]@15 ~, ~@16 f4@31 ~, ~@16 c5@8 [c5,a5]@23 ~]/2", // Dm F Dm Eb F
  BF: "[~@12 f4@4 ~@24 [e4,g4]@8 ~@44 f4@3 ~, c3@23 ~ [c3,bb4]@24 a3@8 f3@12 f4@4 [a3,g4]@4 a4@4 c5@4 a4@4 g4@7 ~, f4@8 [bb4,f5]@8 [f4,bb4,f5]@7 ~ g4@16 ~@8 f4@12 a3@4 c4@31 ~, bb4@8 bb3@15 ~@9 f4@16 f2@47 ~, ~@4 g3@16 g3@29 ~@3 c3@43 ~]/4", // Em C7 A7 Bb5
  BG: "~@20 g4@3 ~, eb2@23 ~, f4@16 [a3,f4]@7 ~, ~@8 f3@15 ~, ~@12 c4@11 ~", // Dm
  BH: "~@5 eb3, a4!2, a3 [a3,c5]@2, ~ bb4@5, ~@2 f4", // Am
  BI: "[~@5 a5 ~@4 [f5,d6]@2, a4@2 [d4,g5,e6], d3@2 d4@2 f5@3 a3@5, f5 e5@5, ~ a3@4 d4 [d3,a5,f6]@6]/2", // Dm Em7 Dm
  BJ: "~@2 [eb4,f5,db6], db3, [f5,db6]@2 ~, ~ bb3@5, ~ [db4,eb5,c6]@2", // Db Cm
  BK: "~@2 [bb4,d5,bb5], [g4,f5,db6], ~ [ab4,eb5,c6]@2", BL: "[c3,a3,f5,a5]/2", BM: "[[bb3,g4]@2 ~, c3@61 ~@11]/3",
  BN: "~@5 f3, [f2,a3]@23 ~, ~@4 c3@19 ~, ~@8 c4@15 ~, ~@16 f4@7 ~", // F
  BO: "~@5 [c3,bb3,g4], f2, [bb3,g4]@5 ~, ~ f3@5, ~ [c4,a4]@2", // C7 Eb F
  BP: "~@20 f3@3 ~, f2@23 ~, [a3,f4]@12 f3@4 [a3,f4]@7 ~, ~@4 c3@19 ~, ~@8 c4@15 ~", // Dm
  BQ: "~@16 [c3,bb3,g4]@7 ~, f2@23 ~, [bb3,g4]@2 ~, ~@4 g3@19 ~, ~@8 [c4,a4]@15 ~", // C7 Eb F
  BR: "[~@18 a5@9 ~@10 f2@48 ~@11, f4@9 [a3,f5,a5,c6,f6]@16 ~@7, f2@3 c5@8 ~@5, a3@9 f5@4 c3@48 ~@35, ~@4 c3@5 a4@48 ~@39]/4", // F
})).s("gm_harpsichord").gain(0.48)

// drums · kick
const kick = s("bd").struct(`<
  ~@58 A@2 B A B C B@2 D A B A B A B A E F E F E F A@3 ~@3 B A B@2 G B H A@2 ~@12
>`.pickRestart({
  A: "x", B: "x ~@4 x", C: "x ~ x ~@2 x", D: "x ~@3 x!2", E: "x ~@2 x!2 ~", F: "x!2 ~@3 x", G: "x!2", H: "x ~@2 x ~ x",
})).gain(0.8)

// drums · hihat
const hihat = s("hh").struct("<[~@7 x] [~@5 x ~@7 x ~@10] ~@56 x ~@3 x ~@44>").gain(0.56)

// drums · open hat
const open_hat = s("oh").struct("<~@57 [~@5 x] ~@3 [~@5 x] ~@45>").gain(0.8)

// drums · tambourine
const tambourine = s("tb").struct("<~@66 A B A B ~@4 A B A B A B A B ~@9 C ~ C ~@13>".pickRestart({
  A: "~ x", B: "~ x ~@4", C: "x!2 ~ x ~@2",
})).gain(0.8)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@90 [~@3 x!2 ~] ~ [~ x!2 ~@3] [~@5 x] ~@13>").gain(4.06)

// drums · guiro
const guiro = s("guiro:0").struct("<~@80 [~@4 x!2] ~@10 [~ x ~] ~ [~ x ~] ~@13>").gain(16.9)

// drums · guiro
const guiro_2 = s("guiro:4").struct("<~@67 A ~ A ~@5 A ~ A ~ A ~ A ~ B ~ B ~@5 A ~ A ~@13>".pickRestart({
  A: "x", B: "~ x ~",
})).gain(16.9)

// drums · claves
const claves = s("clave:2").struct("<~@67 A ~ A ~ B ~ B ~ A ~ A ~ A ~ A ~ B ~ B ~@5 B ~ B ~@13>".pickRestart({
  A: "~ x ~", B: "~@4 x!2",
})).gain(3.92)

// drums · triangle
const triangle = s("triangles:30").struct("<~@66 A ~ A ~@5 A ~ A ~ A ~ A ~@9 A ~ A ~@14>".pickRestart({
  A: "~ x ~@4",
})).gain(6.97)

// drums · triangle
const triangle_2 = s("triangles:35").struct("<~@66 A ~ A ~@5 A ~ A ~ A ~ A ~@9 A ~ A ~@11 B ~@2>".pickRestart({
  A: "~ x ~", B: "~@13 x ~@10",
})).gain(6.97)

stack(bass, harpsichord, kick, hihat, open_hat, tambourine, cabasa, guiro, guiro_2, claves, triangle, triangle_2)

More by Amy Grant