Strudelify

Every Heartbeat

Amy Grant

KeyC majorTempo131 bpm
0:00/0:00
// Every Heartbeat — Amy Grant
// 131 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 124 bars on a 24-step grid, each part at one level. 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.

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~ A B C D A B C D A B C D A B C D E F G H E F I J K L M N O L P Q R S T U A B C D A V C D E F W H E F I J X L M N Y Z
  P AA X Z M AB AC Z P AA AD AE AF AG AH AI AJ AK AL AM AN AO K L M N Y Z P AA K L M N Y Z P Q K Z M N Y Z P AP K L M N
  AQ Z P Q AR U AS ~@8
>`.pickRestart({
  A: "c2@4 a1@2 g1@2 ~@2 g1@3 ~@3 g1@2 a1@2 g1@2 a1@2", B: "c2@3 ~ a1@2 g1@3 ~ g1@3 ~@3 g1@2 a1@2 g1@2 a1@2",
  C: "d2@3 ~ c2@2 d2@3 ~ d1@3 ~ d1 ~ d1@2 g1@2 a1@2 g1@2", D: "d2@3 ~ c2@2 d2@3 ~ d1@3 ~ d1 ~ d1@2 a1@2 c2@2 a1@2",
  E: "d2@4 c2@2 d2@3 ~@7 a1 ~ c2@2 a1@2 c2@2", F: "d2@4 c2@2 d2@3 ~@7 d1 ~ d1@2 g1@2 a1@2",
  G: "a#1@4 a1@2 a#1@3 ~@9 d1@2 g1@2 f1@2", H: "a#1@3 ~ d1@2 f1@2 ~@10 c2 ~ a1 ~ c2 ~",
  I: "c2@2 ~ c2@2 ~ a#1@2 ~ a#1@2 ~", J: "a1 ~ d1 ~ a1 ~ a1@5 ~ g1@4 ~@2 g1@4 ~@2",
  K: "a1@4 ~@2 a1@6 f1@3 ~ f1 ~ f1@2 c2@2 g1@2", L: "e1@4 ~@2 e1@4 ~@2 f1@3 ~ f1@2 e1@2 f1@2 g1@2",
  M: "c2@4 ~@2 c2@5 ~ g1@3 ~ g1 ~ g1@2 c2@2 g1@2", N: "a1@4 ~@2 a1@6 f1@3 ~ f1 ~ f1 ~ a1@2 g1@2",
  O: "c2@5 ~ c2@6 f1@3 ~ f1 ~ f1@2 c2@2 g1@2", P: "f1@4 ~@2 f1@3 ~ f1@2 e1@5 ~ e1@5 ~",
  Q: "f1@4 ~@2 f1@2 e1@2 f1@2 g1@5 ~ g1@2 a1@2 g1@2", R: "a1@3 ~ a1@2 e1@2 ~@2 f1@2 ~@2 e1 ~ e1@2 f1@2 e1@2 a1@2",
  S: "a1@3 ~ a1@2 c2@2 ~@2 f1@2 ~@2 f1 ~ f1@2 a1@2 c2@2 a1@2",
  T: "a1@3 ~ a1@2 e1@2 ~@2 f1@2 ~@2 f1 ~ f1@2 g1@2 a1@2 b1@2",
  U: "a1@3 ~ a1@2 g1@2 ~@2 a1@2 ~@2 g1 ~ e1@2 g1@2 a1@2 g1@2", V: "c2@3 ~ a1@2 g1@2 ~@2 g1@2 ~@4 g1@2 a1@2 g1@2 a1@2",
  W: "a#1@3 ~ a1@2 a#1@3 ~@9 d1@2 g1@2 f1@2", X: "a1@4 ~@2 a1@5 ~ f1@3 ~ f1 ~ f1@2 c2@2 g1@2",
  Y: "c2@4 ~@2 c2@5 ~ f1@3 ~ f1 ~ f1@2 c2@2 g1@2", Z: "e1@4 ~@2 e1@4 ~@2 f1@3 ~ f1 ~ e1@2 f1@2 g1@2",
  AA: "f1@2 ~ f1 e1 f1 g1@2 ~ g1 a1 g1", AB: "a1@4 ~@2 a1@6 f1@3 ~ f1 ~ f1@2 a1@2 g1@2",
  AC: "c2@4 ~@2 c2@6 g1@3 ~ g1 ~ g1@2 c2@2 g1@2", AD: "g1@4 ~@2 g1@4 ~@2 g1@3 ~ d1@2 g1@2 ~@2 g1@2",
  AE: "d1@2 ~ d1@2 ~ d1@2 ~ d1 d2 a1", AF: "g1@4 ~@2 g1@4 ~@2 g1@5 ~ g1@2 c2@2 a1@2",
  AG: "c1@2 ~ c1@2 ~ c1@2 ~ c1 ~ c1", AH: "d1@3 ~ d1@5 ~@3 d1@2 ~@2 d1 ~ c1@2 d1@2 a1@2",
  AI: "a#1@3 ~ a#1@6 ~@2 f1@2 ~@2 a#1@2 a#1@2 a#1@2 f1 ~", AJ: "d1@3 ~ d1@5 ~@3 d2@2 ~@2 d1@2 d2@2 a#1@2 c2@2",
  AK: "a#1@3 ~ a#1@6 ~@2 a#1@2 ~@2 a#1@2 a1@2 f1@2 d2@2", AL: "c2@2 ~@2 c2@13 ~ c2@2 c1@2 c2@2",
  AM: "a#1 ~ a#1@6 ~ a#1 a1 a#1", AN: "a1@4 ~@2 a1@5 ~ a1@4 e1@2 a1@6",
  AO: "~@2 g1@3 ~ g1@3 ~@3 g1@3 ~ g1@2 e1@2 f1@2 g1@2", AP: "f1@4 ~@2 f1 ~ e1@2 f1@2 g1@5 ~ g1@2 a1@2 g1@2",
  AQ: "c2@4 ~@2 c2@6 f1@3 ~ f1 ~ f1@2 c2@2 g1@2", AR: "a1@3 ~ a1@2 g1@2 ~@2 a1@2 ~@2 g1 ~ e1@2 a1@2 e1@2 g1@2",
  AS: "c1 ~@11",
})).s("gm_electric_bass_finger").gain(0.25)

// chords · piano · "A.PIANO 2"
const piano = note(`<
  ~ A@2 B C D@2 E F G H I J K@2 L M N O P Q R@2 S T U V W X Y Z AA AB AC@2 AD@2 AE AF I AG AH@2 L AI AJ O AK AL AM@2 S
  AN AO AP AQ AR AS AT AA AU AV AP AW AX AS AY AZ BA BB BC BD BE BF BG BH BI BJ BK BL BM BN BO BP BQ BR BS BT BU BV BW
  BX BY BZ CA CB CC CD CE CF CG BZ CH CI CJ CK CL CM CN CO CP CQ CR ~@11
>`.pickRestart({
  A: "[[g4,e5]@35 ~ d5@3 ~ c5@2 a4@6]/2", B: "[f4,c5]@17 ~ a4@4 c4 ~", C: "e4@2 g4@2 a4@2 c5 ~, c4@10 ~@2 e4@9 ~@3",
  D: "[[g4,e5]@18 d5@2 c5 a4@3]/2", E: "[f4,c5]@17 ~ a4@4 g4@2", F: "[c4,a4]@11 ~",
  G: "~@6 e4@4 g4 ~ g4@4 ~@2 g4@4 ~@2, c4@6 e4@5 ~", H: "g4@5 ~ g4@6 a4@11 ~, e4",
  I: "~@5 e4 d4@3 c4@3, d4@3 ~@5, ~ a4@2 ~@3", J: "~@2 d4@3 e4 d4@3 c4@2 ~",
  K: "[~@6 e4@3 ~ g4 ~ g4@6 e4@6 f4@6 e4@6 d4@6 c4@4 ~@2, c4@3 ~]/2", L: "[d4,f4]@3 c5@2 e4 d4@3 c4@3",
  M: "~@4 d4@6 e4@2 d4@6 c4@5 ~, a3@7 ~", N: "d4@5 ~ a3@4 c4 ~ c4@6 d4@6, f4@23 ~", O: "e4@3 a3@2 g3 a3@3 c4@3",
  P: "~@6 e4@2 d4 c4@3, d4 ~, ~@3 a4@5 ~@4", Q: "e4@6 d4@4 ~@2 d4@3 ~ c4@4 ~@4, a3@7 ~",
  R: "[d4@6 d4@3 ~ c4@2 d4@6 c4@5 ~ e4@4 d4@4 c4@3 ~ c4@10 ~@2, a3@23 ~]/2",
  S: "c4@3 ~ c4@3 ~ [c4,d4]@2 ~@2 e4@4 ~@2 e4@4 ~@2, ~@4 c4@3 ~", // Csus2
  T: "g4@3 ~ g4@4 a4@2 ~@2 c5@6 a4@2 ~@4, e4@11 ~ e4@8 ~@4", U: "e4@6 g4@4 ~@2 g4@5 ~ g4@4 ~@2, c4@10 ~@2 b3@11 ~",
  V: "g4@2 ~ g4@3 [c4,a4]@5 ~, b3@5 ~@7", W: "e4@6 g4@4 ~@2 g4@6 a4@3 ~@3, c4@10 ~@2 b3@9 ~@3",
  X: "d5@3 c5@2 ~ [c4,a4]@5 ~, e4@5 ~@7", Y: "~@6 c5@4 ~@2 b4@5 ~ a4@4 g4 ~, e4@11 ~ d4@10 ~@2",
  Z: "g4@4 ~@2 g4@4 e4@2 [c4,a4]@7 ~@3 g4@2, d4@5 ~@7", AA: "c5@2 ~@2 c5 ~ c5@3 ~ a4@2 [g4,c5]@6 a4@4 g4@2, a4 ~@2",
  AB: "c5@4 ~@2 c5@3 ~@3 [g4,c5]@8 ~@4, a4 ~", // C5
  AC: "[a3@4 c4@3 ~ d4@3 ~@7 c4@3 ~ d4 ~ d4@4 c4@2 g3@16 ~@2, ~@12 g4@35 ~]/2",
  AD: "[a3@4 c4@3 ~ d4@4 ~@6 c4@3 ~ d4 ~ c4@3 ~ d4@2 g3@14 ~@4, ~@4 g4@11 ~]/2",
  AE: "~@6 e4@3 ~ g4 ~ g4@4 ~@2 g4@4 ~@2, c4@11 ~ e4@10 ~@2", AF: "g4@4 ~@2 g4@6 a4@11 ~, e4@23 ~",
  AG: "~@4 d4@5 ~ e4@2 d4@6 c4@4 ~@2", AH: "[~@6 e4@3 ~ g4 ~ g4@5 ~ e4@6 f4@6 e4@6 d4@6 c4@4 ~@2, c4@35 ~@13]/2",
  AI: "~@4 d4@5 ~ e4@2 d4@5 ~ c4@4 ~@2, a3@7 ~", AJ: "d4@6 a3@3 ~ c4 ~ c4@6 d4@6, f4@23 ~",
  AK: "~@6 a4@5 ~ e4@4 d4@2 c4@4 ~@2, d4 ~", AL: "e4@6 d4@4 ~@2 d4@3 ~ c4@6 ~@2, a3@11 ~",
  AM: "[d4@4 ~@2 d4@3 ~ c4@2 d4@6 c4@6 e4@4 d4@4 c4@2 ~@2 c4@8 ~@4, a3@15 ~]/2",
  AN: "g4@3 ~ g4@4 a4@3 ~ c5@5 ~ a4@2 ~@4, e4@11 ~ e4@8 ~@4", AO: "e4@6 g4@5 ~ g4@4 ~@2 g4@4 ~@2, c4@11 ~ b3@10 ~@2",
  AP: "g4@4 ~@2 g4@6 [c4,a4]@11 ~, b3@5 ~@7", AQ: "e4@3 g4@2 ~ g4@3 a4@3, c4@10 ~@2 b3@9 ~@3",
  AR: "d5@5 ~ c5@4 ~@2 a4@11 ~, e4@10 ~@2 c4@9 ~@3", AS: "~@6 c5@4 ~@2 b4@5 ~ a4@4 g4 ~, e4@5 ~ d4@5 ~",
  AT: "g4@4 ~@2 g4@3 ~ e4@2 [c4,a4]@8 ~@2 g4@2, d4@3 ~@5", AU: "c5@5 ~ c5@3 ~@3 [g4,c5]@8 ~@4, a4@5 ~@7",
  AV: "e4@6 g4@4 ~@2 g4@5 ~ g4@4 ~@2, c4@5 ~ b3@5 ~", AW: "e4@5 ~ g4@5 ~ g4@6 a4@6, c4@10 ~@2 b3@9 ~@3",
  AX: "d5@6 c5@5 ~ [c4,a4]@10 ~@2, e4@5 ~@7", AY: "g4@4 ~@2 g4@3 ~ e4@2 [c4,a4]@7 ~@3 g4@2, d4@5 ~@7",
  AZ: "c5@2 ~@2 c5 ~ c5@3 ~ a4@2 [g4,c5]@6 a4@3 ~ g4@2, a4 ~@2", // C5
  BA: "c5@4 ~@2 c5@4 ~@2 g4@3 ~ a4@2 g4@6, a4@11 ~ c5@9 ~@3", BB: "a#4@10 ~@2 a#4@9 ~@3, d4@5 ~",
  BC: "a4@5 a#4 a4@6, d4@11 ~", BD: "~@6 a#4@6 c5@5 ~ a#4@3 ~ a4@2, d4@11 ~", BE: "g4@6 a4@6 g4@7 ~@5, e4@11 ~",
  BF: "[f4,a4]@6 d4@5 ~ f4@2 ~ f4@2 ~ g4@6", BG: "f4@6 g4@6 f4@5 ~ f4@3 ~ g4 ~, d4@3 ~@5",
  BH: "[f4,a4]@6 d4@5 ~ f4@2 ~@2 f4@2 g4@6", BI: "f4@6 g4@3 ~ f4@4 ~@10, d4@7 ~@5",
  BJ: "e4@3 g4 ~@2 g4@3 ~ f4 ~ g4@3 ~ f4@2 ~@6, c4@11 ~ c4@6 ~@6", BK: "a4@3 ~ g4@4 f4@3 ~ f4@9 ~@3, d4@7 ~",
  BL: "g4@3 ~ g4@4 a4@4 c5@4 ~@2 c5@4 ~@2, c4@5 ~ e4@5 ~", BM: "c5@3 ~ c5@2 ~@2 c5@2 ~@2 c5@5 ~@7, [d4,g4]@5 ~",
  BN: "e4@3 ~ g4 ~ g4@4 ~@2 g4@4 ~@2 g4@4 ~@2, c4@9 ~@3 b3@10 ~@2", BO: "g4@3 ~@3 g4@3 ~ e4@2 [c4,a4]@7 ~@5, b3@3 ~@5",
  BP: "e4@6 g4@4 ~@2 g4@6 a4@3 ~ g4@2, c4@5 ~ b3@4 ~@2", BQ: "d5@5 ~ c5@4 ~@2 [c4,a4]@9 ~@3, e4@5 ~@7",
  BR: "c5@3 ~ c5@3 ~ c5@2 ~@2 b4@3 ~ a4@4 g4@2 ~@2, e4@11 ~ d4@10 ~@2",
  BS: "g4@2 ~@2 g4@3 ~ e4@4 [c4,a4]@6 ~@4 g4@2, d4 ~@2", BT: "c5@2 ~@2 c5@2 ~@4 g4@2 [g4,c5]@5 ~ a4@4 g4@2, a4@5 ~@7",
  BU: "c5@4 ~@2 c5@3 ~@3 [g4,c5]@7 ~@5, a4@11 ~@13", BV: "e4@4 g4 ~ g4@4 ~@2 g4@4 ~@2 g4@4 ~@2, c4@5 ~ b3@5 ~",
  BW: "g4@4 ~@2 g4@3 ~ e4@2 c4@9 ~@3, b3@9 ~@3 a4@7 ~@5", BX: "e4@5 ~ g4@4 ~@2 [b3,g4]@6 a4@3 ~ g4@2, c4@3 ~@5",
  BY: "d5@6 c5@4 ~@2 [c4,a4]@9 ~@3, e4@5 ~@7", BZ: "c5@3 ~ c5@3 ~ c5@2 ~@2 b4@3 ~ a4@3 ~ g4@2 ~@2, e4@5 ~ d4@5 ~",
  CA: "g4@3 ~ g4@3 ~ e4@4 [c4,a4]@7 ~@3 g4@2, d4@3 ~@5", CB: "a4@4 c5 ~ a4@3 ~ g4@2 [g4,c5]@6 a4@3 ~ g4@2, c5 ~@11",
  CC: "c5@4 ~@2 c5@3 ~@3 [g4,c5]@7 ~@5, a4@5 ~@7", CD: "e4@3 ~ g4 ~ g4@4 ~@2 g4@4 ~@2 g4@4 ~@2, c4@3 ~ b3@3 ~",
  CE: "g4@3 ~@3 g4@3 ~ e4@2 c4@9 ~@3, b3@3 ~ a4@2 ~@2", CF: "e4@5 ~ g4@4 ~@2 g4@6 a4@3 ~ g4@2, c4@9 ~@3 b3@8 ~@4",
  CG: "d5@5 ~ c5@4 ~@2 [c4,a4]@8 ~@4, e4@5 ~@7", CH: "g4@3 ~ g4@3 ~ e4@4 [c4,a4]@6 ~@4 g4@2, d4 ~@2",
  CI: "a4@4 c5@2 a4@4 g4 ~ [g4,c5]@6 a4@4 g4@2, c5 ~@11", CJ: "c5@4 ~@2 c5@3 ~@3 [g4,c5]@8 ~@4, a4@11 ~@13",
  CK: "e4@3 ~ g4 ~ g4@4 ~@2 g4@5 ~ g4@4 ~@2, c4@9 ~@3 b3@10 ~@2", CL: "g4@4 ~@2 g4@3 ~ e4@2 c4@8 ~@4, b3@3 ~ a4@2 ~@2",
  CM: "e4@6 g4@4 ~@2 [b3,g4]@6 a4@3 ~ g4@2, c4@5 ~@7", CN: "d5@3 c5@2 ~ [c4,a4]@4 ~@2, e4@5 ~@7",
  CO: "c5@3 ~ c5@3 ~ c5@2 ~@2 b4@3 ~ a4@3 ~ g4@2 ~@2, e4@10 ~@2 d4@11 ~",
  CP: "g4@2 ~@2 g4@3 ~@3 e4@2 [c4,a4]@7 ~@3 g4@2, d4 ~@2", CQ: "[a4,c5]@3 ~ c5@2 a4@4 g4 ~ [g4,c5]@6 a4@4 g4@2",
  CR: "c5@4 ~@2 c5@3 ~@3 [g4,c5]@9 ~@3, a4@5 ~@7", // C5
})).s("gm_piano").gain(0.42)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  ~ A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C@2 D@2 C@2 E F G H G I G H J K A@6 B@2 A@2 B@2 C@2 D@2 C@2 E F G H G I G H J K G H
  G I G H J K L M L N O@2 D@2 N P N Q G H G I G H J K G H G I G H J K G H G I G H J K G H G I G H J K A@2 ~@9
>`.pickRestart({
  A: "[c4,e4,g4]/2", B: "[c4,f4,a4]/2", C: "[c4,d4,f4,a4]/2", D: "[a#3,d4,f4,a4]/2", E: "[c4,e4,g4] [a#3,e4,g4]",
  F: "[a3,c4,e4,g4] [g3,c4,e4]", G: "[c4,e4,g4] [d4,g4,b4]", H: "[e4,g4,b4] [c4,f4,a4]", I: "[c4,e4,g4] [c4,f4,a4]",
  J: "[c4,f4,a4] [c4,e4,g4]", K: "[c4,f4,a4] [c4,d4,g4]", L: "[d4,g4,a#4]", M: "[d4,f#4,a4]", N: "[c4,e4,g4]",
  O: "[d4,f4,a4]/2", P: "[a#3,d4,f4]", Q: "[c4,d4,g4]",
})).s("gm_epiano2").gain(0.25).pan(0.7)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@17 A@6 B C ~@6 D@2 ~@12 E@6 F G ~@6 D@2 ~@6 D@2 ~@18 D@2 ~@6 D@2 ~@6 D@2 ~@6 D@2 ~@11
>`.pickRestart({
  A: "[~ d4@143, d5@143 ~]/6", B: "[e4,e5]@23 ~", C: "[g4,g5]@23 ~",
  D: "~@2 [c5,c6]@2 ~@2 [c5,c6]@5 ~@3 [c5,c6]@2 ~@2 [c5,c6]@5 ~", E: "[d4,d5]/6", F: "[e4,e5]", G: "[g4,g5]",
})).s("gm_string_ensemble_1").gain(0.27).pan(0.4)

// other · brass section · "BRASS 1"
const brass_section = note("<~@62 A ~ B@2 C D ~@22 A ~ B@2 C D ~@2 A ~ B@2 C D ~@2 A ~ B@2 C D ~@12>".pickRestart({
  A: "~@14 [e4,e5] ~@3 [e4,e5] ~ [f4,f5] ~ [g4,g5] ~", B: "[~@18 [d3,d4]@3 ~ [c3,c4]@13 ~@13]/2",
  C: "~@16 [e3,e4]@3 ~ [d3,d4]@3 ~", D: "[c3,c4] ~",
})).s("gm_brass_section").gain(0.2).pan(0.3)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note("<~@33 A@2 B@8 ~@70 C@2 D ~@8>".pickRestart({
  A: "[~@5 d3 ~@2 d3@16, ~ g2@7, ~@2 c3 g3@9, ~@7 c3@17]/2",
  B: "[~@10 d3@2 ~@26 c3@2 ~@2 [g3,c4]@3 ~ [a3,d4] ~@145, ~@4 c3@2 g3@13 ~@77, ~@7 c3@12 ~ c3@76, ~ d3@11]/8", // C5 D5
  C: "[~@14 c3@26 ~@2 [g3,c4]@3 ~ [a3,d4] ~, ~@4 c3@3 ~@17, ~@6 g3@13 ~@5]/2", D: "[g3,c4] ~@23",
})).s("gm_electric_guitar_clean").gain(0.16).pan(0.7)

// drums · kick
const kick = s("bd").struct("<~ [x!2]!114 x ~@8>").gain(0.3)

// drums · snare
const snare = s("sd").struct("<[~@9 x!3] [~@3 x ~ x ~@3 x ~@2]!114 ~@9>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<[~@3 x] [~ x ~@2 x ~ x!3 ~ x!2]!114 ~@9>").gain(0.23)

// drums · open hat
const open_hat = s("oh").struct("<~ [~@3 x ~ x ~@6]!114 ~@9>").gain(0.2)

// drums · crash
const crash = s("cr").struct("<~@115 [x!2 ~@4] ~@8>").gain(0.2)

// drums · tambourine
const tambourine = s("tb").struct("<~ [x ~ x ~@6 x ~@2]!114 ~@9>").gain(0.27)

stack(
  bass, piano, epiano2, string_ensemble_1, brass_section, electric_guitar_clean, kick, snare, hihat, open_hat, crash,
  tambourine
)

More by Amy Grant