Strudelify
Shape Of My Heart cover art

1998 · Ten Summoner's Tales

Shape Of My Heart

Sting

KeyF♯ minorTempo87 bpm
0:00/0:00
// Shape Of My Heart — Sting
// 87 bpm, 4/4, key F# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 2/4 at bar 48, 4/4 at bar 49, 2/4 at bar 87, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 97 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(87/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 · acoustic guitar nylon · "acoustic guitar"
const acoustic_guitar_nylon = note(`<
  ~ A B C D E F G H A B C D E F G H A B C D E F G H A B C D E F G H A B C D E F G H A B C D E F G I@2 J K L M L N@2 O P
  Q@3 R S T U@2 V@3 R S T U@2 V@3 R S T U@2 W@4 X Y Z AA AB@2 AC@2 AD ~
>`.pickRestart({
  A: "a4@2 f#3 ~@2 a4@2 e3 g#4@2 e3 c#4@2 g#4@3", B: "f#4@2 d3 b3@2 f#4@2 d3 [c#3,f#4]@2 b3 c#3 [c#3,f4]@4",
  C: "a4@2 f#3 d4@2 a4@2 e3 g#4@2 e3 c#4@2 g#4@2 d3", D: "f#4@2 d3 b3@2 f#4@2 d3 [c#3,f#4]@2 b3 c#3 [c#3,f4]@2 ~ c#3",
  E: "d3@2 b3 f#4@2 b3@2 a4@2 ~ f#4@2 b3@3 a2", F: "[b3,e4]@2 ~ [a3,e4]@4 a2 c#3@2 g#3@2 f4@2 g#3@2",
  G: "[a3,f#4]@6 [a3,f#4]@9 ~@2 f#4@9 ~@6, ~@15 f#3@12 ~@5, ~@16 [b3,c#4]@11 ~@5", H: "~ f#4@27 ~@4, [f#3,a3,c#4]@7 ~",
  I: "[~ f#4@6 ~@2 [a3,f#4]@7 ~@2 f#4@5 ~@2 f#4@5 ~@2 [a3,c#4,f#4]@6 ~@3 f#4@4 ~@3 [f#3,b3,c#4,f#4]@7 ~ [f#3,b3,c#4,f#4]@7 ~, [f#3,a3,c#4]@8 f#3@19 ~@37, ~@8 c#4@7 ~ e3@6 ~@2 [e3,a3,c#4]@6 ~ d3@6 ~@2 d3@6 ~@19, ~@17 [a3,c#4]@7 ~@16 [a3,c#4]@5 ~@19]/2", // D F#m F#sus4 F#m A
  J: "~ b3@6 ~@2 [b3,c#4,f#4]@6 ~ [f#3,b3,c#4,f#4]@6 ~@2 [f#3,b3,c#4]@7 ~, [f#3,c#4,f#4]@3 ~ f#3@3 ~@9", // Bsus2 F#sus4 F#5
  K: "~@8 e4@2 c#3 g#3@2 e4@2 b2", L: "d#4@2 b2 g#3@2 d#4@2 a2 c#4@2 a2 f#3@2 c#4@2 a2",
  M: "[g#2,c#4]@2 f#3 g#2 [g#2,c4]@4 e4@2 c#3 a3@2 e4@2 b2", // C#5 G#
  N: "[[g#2,c#4]@2 f#3 g#2 [g#2,c4]@3 g#2 a2@2 f#3 c#4@2 f#3@2 e4@3 c#4@2 f#3@4 a3 ~@2 [b2,e3,g#3]@4 c3]/2", // C#5 G# E
  O: "g#2@2 d#3@2 c4@2 d#3@2 [e3,g#3,c#4]@3 [e3,g#3,c#4]@3 e4@2", P: "[g#3,c#4,g#4]!2 [g#3,c#4,e4,g#4]!2",
  Q: "[b3@8 [g#3,b3,e4,g#4]@8 [e3,a3,c#4,f#4]@8 [e3,a3,c#4,f#4]@7 ~@2 f#4@14 ~ c#4@32 ~@4 f#3@2 ~@4 a4@4 e3@2, ~@31 d#3@16 [a2,e3]@32 ~@17, ~@32 [g#3,c#4]@15 ~@49]/3", // E F#m7 A5 C#5
  R: "g#4@2 e3 c#4@2 g#4@3 f#4@2 d3 b3@2 f#4@2 d3", S: "[c#3,f#4]@2 b3 c#3 [c#3,f4]@4 a4@2 f#3 d4@2 a4@2 e3",
  T: "g#4@2 e3 c#4@2 g#4@2 d3 f#4@2 d3 b3@2 f#4@2 d3",
  U: "[[c#3,f#4]@2 b3 c#3 [c#3,f4]@2 ~ c#3 d3@2 b3 f#4@2 b3@2 a4@2 ~ f#4@2 b3@3 a2 [b3,e4]@2 ~ [a3,e4]@4 a2]/2", // F#5 C# E5 A5
  V: "[c#3@4 g#3@4 f4@4 g#3@4 [a3,f#4]@6 [a3,f#4]@9 ~@2 f#4@9 ~@7 f#4@27 ~@4 a4@4 f#3@2 ~@4 a4@4 e3@2, ~@31 f#3@12 ~@5 [f#3,a3,c#4]@28 ~@20, ~@32 [b3,c#4]@11 ~@53]/3", // D F#m Bsus2
  W: "[c#3@4 g#3@4 f4@4 g#3@4 [a3,f#4]@6 [a3,f#4]@9 ~@2 f#4@9 ~@6 a3 [a3,f#4]@7 ~ f#4@5 ~@3 f#4@6 ~ [c#4,f#4]@5 ~@3 [f#3,a3,c#4,f#4]@6 ~@2 [a3,c#4,f#4]@5 ~@3 [b3,c#4,f#4]@6 ~@2 [f#3,b3,c#4,f#4]@5 ~@4 f#4@5 ~@2 f#4@5 ~@3, ~@31 f#3@12 ~@5 [f#3,c#4]@8 f#3@20 ~@11 f#3@5 ~@3 f#3@7 ~@10 [f#3,a3,c#4]@6 ~ [f#3,a3,c#4]@6 ~@3, ~@32 [b3,c#4]@11 ~@13 [a3,c#4]@8 [e3,a3,c#4]@7 e3@6 ~@51]/4", // D F#5 F#m Bsus2 F#sus4 F#5 F#m Bsus2 …
  X: "[a3,c#4,f#4]@6 ~@2 [a3,c#4,f#4]@5 ~@3 [a3,c#4,f#4]@5 ~@3 [a3,c#4,f#4]@4 ~@4, ~@7 e3@4 ~@4 f#3@5 ~@3 f#3@5 ~@4", // F#m
  Y: "[a3,b3,c#4,f#4]@5 ~@2 [g#3,b3,c#4]@7 ~@2 [g#3,c#4,f#4]@6 ~@2 [g#3,c#4]@6 ~@2, ~@23 b3@6 ~@3", // F#m C#7 C#sus4 C#5
  Z: "[g#3,c#4,f#4]@6 ~@2 [g#3,b3,c#4,f#4]@6 ~@2 [g#3,b3,c#4]@6 ~@2 [g#3,c#4]@5 ~@3", // C#sus4 G#m7 C#7 C#5
  AA: "a4@4 ~ f#3@2 c#4@4 a4@4 e3@2 g#4@4 e3@2 ~ c#4@4 g#4@4",
  AB: "[d3@2 f#4@4 ~ d3@2 b3@4 f#4@4 ~ d3@2 [c#3,f#4]@4 ~ b3@2 c#3@2 [c#3,f4]@9 a4@5 f#3@2 ~ d4@4 a4@5 e3@2 ~ g#4@4 e3@2]/2", // F#5 C#
  AC: "[~ c#4@4 g#4@5 d3@2 ~ f#4@5 d3@2 b3@5 ~ f#4@9 ~ f#4@11 ~@4 f4@11 ~@2, ~@35 b3@11 ~ c#3@15 ~@2, ~@49 g#3@14 ~]/2",
  AD: "~@18 f#5@7 ~@7, ~@5 f#3@22 ~@5, ~@6 c#4@21 ~@5, ~@7 [a3,f#4]@21 ~@4, ~@17 [a4,c#5]@8 ~@7", // D A
})).s("gm_acoustic_guitar_nylon").gain(0.36).pan(0.7)

// chords · acoustic guitar nylon · "acoustic guitar" · soft notes
const acoustic_guitar_nylon_2 = note(`<
  ~ A ~@2 B C D E@2 A ~@2 B C D E@2 A ~@2 B C D E@2 A ~@2 B C D E@2 A ~@2 B C D E@2 A ~@2 B C D E@2 ~ F ~@9 G@2 ~@3 H I
  ~ J@2 ~@3 H I ~ J@2 ~@3 H I ~ K@2 L@2 M@2 ~@4 N O ~
>`.pickRestart({
  A: "~@3 c#4@2 ~@11", B: "~@14 c#3 ~", C: "~@9 a4 ~@6", D: "~@2 [b3,e4] ~@13", E: "[~@31 c#3@29 ~@4]/2",
  F: "~@24 f#4@7 ~", G: "[~@17 e4@31 ~@6 c#4@4 ~@6, ~@15 g#3@32 ~@17]/2", H: "~@6 c#3 ~@9", I: "~ a4 ~@8 [b3,e4] ~@5",
  J: "[~@15 c#3@29 ~@10 c#4@4 ~@6]/2", K: "[~@40 a3@5 ~@19, ~@15 c#3@29 ~@20]/2", L: "[~@31 e3@6 ~@27]/2",
  M: "[~@8 f#4@6 ~@2 b3@6 ~@2 f#4@6 ~ b3@6 ~@12 f#4@5 ~@3 f#4@4 ~@3, ~@56 b3@5 ~@3]/2", N: "~ c#3@12 ~@19",
  O: "~@4 c#3@23 ~@5",
})).s("gm_acoustic_guitar_nylon").gain(0.15).pan(0.7)

// chords · string ensemble 1 · "strings"
const string_ensemble_1 = note(`<
  ~@25 A@2 B@2 C D@2 E ~@8 F@2 G@2 H I@2 J@3 K@6 L M@2 N@2 ~@7 O P@6 Q@2 R@5 S@5 T@2 U V@4 W@2
>`.pickRestart({
  A: "[a3@15 b3@16 c#4@15 ~ c#4@17]/2", B: "[d4@15 c#4@16 b3@32 ~]/2", C: "f#3@31 ~",
  D: "[e3@15 f3@15 ~ f#3@16 g#3@15 ~@2]/2", E: "a3", F: "[a3@15 b3@16 c#4@15 ~ c#4@16 ~]/2",
  G: "[d4@15 c#4@15 ~ b3@32 ~]/2", H: "f#3", I: "[e3@15 f3@15 ~ f#3@16 g#3@17]/2",
  J: "[f#3 ~@2 a3@28 ~ [a3,f#4]@14 ~ [g#3,b3,c#4,f#4]@41 ~@8, ~@31 [f#3,c#4]@15 ~@50]/3", // D G#m7 F#5
  K: "[~@31 d#4@15 ~@30 f#4@3 ~ [a3,c#4,e4]@15 ~@25 d#4@7 ~@4 e4@8 ~ f#4@4 ~ g#4@13 ~@2 a4@16 [b3,e4,g#4]@14 ~@2, ~@17 [g#3,c#4]@29 ~ c#4@15 ~@6 g#4@7 ~@5 g#4@27 ~@37 a4@16 ~@32, ~@47 e4@12 ~ a4@9 ~@39 c#5@12 c#5 ~@71, ~@48 f#3@15 ~ [g#3,c#4]@7 ~ [g#3,c4]@7 ~@16 [g#3,c#4,e4]@16 ~ c#4@15 g#3@13 ~@4 [a3,c#4,e4]@26 ~@22]/6", // A E C#5 G# C#m A
  L: "[a3,d#4,f#4]@8 [a3,c#4,e4]@7 ~", M: "[[g#3,c#4,e4]@15 ~ g#3@26 ~@6 [g#3,c#4,f#4]@14 ~@2]/2",
  N: "[~ [g#3,c#4,e4]@2 ~]/2", O: "~@10 c#4@2 c#5@3 ~, ~@16 a3@15 ~",
  P: "[~ c#4@3 c#5@5 ~@7 c#4@3 ~@5 c#5@3 ~ c#4@20 d4@15 c#4@16 b3@33 f#3@32 e3@15 f3@16 f#3@16 ~, b3@16 ~@3 c#4@9 ~@164]/6",
  Q: "[g#3@16 a3@31 ~ a3@16]/2", R: "[b3@15 c#4@14 ~@2 c#4@17 d4@15 c#4@16 b3@33 f#3@32 e3@15 ~]/5",
  S: "[f3@15 f#3@15 ~ g#3@16 ~ [c#4,f#4]@28 ~@4 [f#3,a3,c#4,f#4]@12 ~@3 [g#3,b3,c#4,f#4]@12 ~@5 [a3,c#4,f#4]@29 ~@3 [c#4,f#4]@12 ~@4, ~@3 a3@2 ~@5]/5", // F#5 F#m G#m7 F#m F#5
  T: "[g#3,b3,c#4,f#4]/2", U: "[f#3,a3]",
  V: "[~@29 g#3@9 ~ [a3,d4]@19 [g#3,d4]@19 [a3,c#4,f#4]@37 ~ [g#3,f4]@10 ~@3, ~@39 f#4@38 ~@37 c#4@12 ~@2]/4", // D5 G#dim F#m C#
  W: "[~@4 [a3,c#4,f#4]@33 ~@27]/2", // F#m
})).s("gm_string_ensemble_1").gain(0.37)

// bass · fretless bass · "bass"
const bass = note(`<
  ~ A B C B D E F G H I J K L M N O H P C Q R E N S J T U V W E X O Y Z AA AB R M AC S AD AE AD AF W E AG S AH AI AJ AK
  AL AM AN AO AP AQ@2 AR@2 AS AT AU@3 AV AW@2 AX@2 AY@3 AV AZ@2 BA BB BA BC@2 BD BE BF BG BH BI@2 BJ BK@4 BL@2
>`.pickRestart({
  A: "f#2@7 ~ e2@8", B: "b1@16 ~@8 c#2@7 ~", C: "f#2@14 ~@2 e2@15 ~", D: "d2@26 ~@2 c#2@2 a1 ~",
  E: "a1@15 ~ c#2@14 ~@2", F: "d2@15 ~ g#1@15 ~", G: "f#1@27 ~@5", H: "f#2@15 ~ e2@16", I: "b1@17 ~@7 c#2@7 ~",
  J: "f#2@15 ~ e2@15 ~", K: "b1@17 ~@7 c#2@6 ~@2", L: "d2@14 ~ b1", M: "a1@15 ~ c#2@15 ~",
  N: "d2@12 b1@2 a1@2 g#1@15 ~", O: "f#1@3 ~", P: "b1@19 ~@5 c#2@6 ~@2", Q: "b1@9 ~@3 c#2@3 ~", R: "d2@25 ~@5 a1 ~",
  S: "f#1@25 ~@7", T: "b1@20 ~@4 c#2 ~ c#2@6", U: "f#2@16 e2@15 ~", V: "b1@17 ~@5 c#2 ~ c#2@2 ~@2 c#2@2 ~@2",
  W: "d2@26 ~@4 a1 ~", X: "d2@7 ~ g#1@8", Y: "f#2@15 ~ e2@14 ~@2", Z: "b1@22 ~@2 c#2@7 ~", AA: "f#2@13 ~@3 e2@14 ~@2",
  AB: "b1@8 ~@4 c#2@3 ~", AC: "d2@11 ~ b1@2 a1@2 g#1@14 ~@2", AD: "f#2@7 ~ e2@7 ~", AE: "b1@19 ~@3 c#2 ~ c#2@7 ~",
  AF: "b1@21 ~@3 c#2 ~ c#2@2 ~@2 c#2 ~", AG: "d2@7 ~ g#1@7 ~", AH: "d2@6 a1@2 a1@4 g#2@3 g#2",
  AI: "g#2@3 g#2 g#2@8 g#2@4", AJ: "g#1@4 g#2@4 c#2@7 b1", AK: "b1@7 a1 f#1@8", AL: "~@3 g#1 g#1@4 c#2@7 b1",
  AM: "b1@7 a1 f#1@7 g#1", AN: "g#1@4 g#1@4 a1@7 a1", AO: "a1@6 g#2 f#2 e2@7 e2", AP: "g#2 a1", AQ: "[d2 c#2@2 a1]/2",
  AR: "[g#1@16 a1@32 f#2@13 ~@3]/2", AS: "e2@7 ~ b1@8", AT: "~@8 c#2@6 ~@2 f#2@11 ~@5",
  AU: "[e2@13 ~@3 b1@19 ~@5 c#2@5 ~@3 d2@25 ~@5 b1 ~ b1@2 ~@2 a1@11 ~]/3", AV: "c#2@15 ~ d2@12 b1@2 a1@2",
  AW: "[g#1@16 f#1@24 ~@8 f#2@15 ~]/2", AX: "[e2@15 ~ b1@21 ~@3 c#2@6 ~@2 f#2@14 ~@2]/2",
  AY: "[e2@14 ~@2 b1@21 ~@3 c#2@6 ~@2 d2@26 ~@4 a1 ~ a1@15 ~]/3", AZ: "[g#1@16 f#1@27 ~@5 f#2@15 ~]/2",
  BA: "e2@15 ~ b1@16", BB: "~@6 c#2 ~ c#2@7 ~ f#2@14 ~@2",
  BC: "[~@6 c#2 ~ c#2@2 ~@2 c#2@2 ~@2 d2@28 ~@2 a1 ~ a1@15 ~]/2", BD: "c#2@14 ~@2 d2@13 ~@3", BE: "g#1@14 ~@2 f#1@15 ~",
  BF: "~@8 d2@7 ~", BG: "g#1@7 ~ f#1@8", BH: "~@4 d2@3 ~", BI: "[g#1@39 ~ g#2@6 ~@2 g#2@7 ~ g#2@7 ~]/2",
  BJ: "f#2@15 ~@2 e2@15", BK: "[~@2 b1@19 ~@8 c#2@8 ~ f#2@17 ~@3 e2@16 ~@3 b1@23 ~@14 c#2@14]/4",
  BL: "[~@4 f#1@43 ~@17]/2",
})).s("gm_fretless_bass").gain(0.36)

// drums · hihat
const hihat = s("hh").struct(`<
  A ~@7 B C D E D E F E ~ D G D H E I J ~ K L M N O P A B Q P R A S T D U V W P A@3 R X Y A@2 Z AA AB AC AD AA AE AA AF
  AG AH AB@2 AI AB AJ AK AL AM AJ AN AB AO AP AQ AR AS AT AU A AV AW AA AI AD P AX AY AZ ~@6
>`.pickRestart({
  A: "x!4", B: "~@10 x!2 ~@4", C: "x ~@7 x ~@5 x ~ x ~@8 x ~@6", D: "x ~@2 x!2 ~@3 x ~@3 x ~@3",
  E: "x ~@5 x ~ x ~@7 x ~@8 x ~@6", F: "~ x ~@4 x ~@2 x ~@6 x ~@8 x ~@6", G: "x ~@6 x ~ x ~@7 x ~@7 x ~@6",
  H: "x ~@6 x ~ x ~@7 x ~@6 x ~@7", I: "~ x ~@4 x ~ x ~@7 x ~@8 x ~@6", J: "x ~@5 x ~@2 x ~@7 x ~@7 x ~@6",
  K: "~ x ~@7 x ~@7 x ~@7 x ~@6", L: "x ~@8 x ~@7 x ~@7 x ~@3 x ~ x", M: "~ x ~@6 x ~@6 x ~@9 x ~@6",
  N: "x ~@7 x ~@8 x ~@6 x ~@7", O: "~ x ~@6 x ~@7 x ~@8 x ~@6", P: "x ~@7 x ~@7 x ~@8 x ~@6",
  Q: "~ x ~@2 x ~@3 x ~@3 x ~@3", R: "~ x ~@6 x ~@7 x ~@7 x ~@7", S: "x ~@5 x ~ x ~@8 x ~@7 x ~@6",
  T: "~ x ~@4 x ~ x ~@8 x ~@7 x ~@6", U: "~ x ~@30", V: "~ x ~@6 x ~@8 x ~@7 x ~@6",
  W: "~ x ~@6 x ~@8 x ~@6 x ~@3 x ~ x ~", X: "x!3 ~", Y: "~ x!3", Z: "x ~@8 x ~@6 x ~@6 x ~ x ~@6",
  AA: "x ~@7 x ~@7 x ~@5 x ~@2 x ~@6", AB: "x ~@3 x ~@3 x ~@2 x!2 ~@3", AC: "x ~@8 x ~@7 x ~@4 x ~ x ~@7",
  AD: "x ~@2 x!2 ~@3 x ~@2 x!2 ~@3", AE: "~ x ~@7 x ~@6 x ~@8 x ~@6", AF: "x ~@8 x ~@7 x ~@3 x ~@3 x ~@3 x ~@2",
  AG: "~ x ~@3 x ~@3 x ~@11 x ~@3 x ~@4 x ~", AH: "x ~@6 x ~ x ~@6 x ~@5 x ~ x ~@7", AI: "x ~@7 x ~@8 x ~@4 x ~ x ~@7",
  AJ: "x ~@8 x ~@6 x ~@5 x ~ x ~@7", AK: "x ~@7 x ~@8 x ~@14", AL: "~@16 x ~@6 x!2 ~@7",
  AM: "x ~@7 x ~@8 x ~@5 x ~ x ~@6", AN: "x ~@8 x ~@7 x ~@4 x ~@2 x ~@6", AO: "~ x ~@7 x ~@7 x ~@4 x ~ x ~@7",
  AP: "~ x ~@6 x ~@7 x ~@5 x ~ x ~@7", AQ: "x!2 ~@2", AR: "~@17 x ~@6 x ~@7", AS: "~ x ~@7 x ~@6 x ~@7 x ~@7",
  AT: "x ~@8 x ~@2 x ~ x ~ x ~@7 x ~@7", AU: "x ~@8 x ~@7 x ~@5 x ~ x ~@6", AV: "x ~@7 x ~@8 x ~@7 x ~@6",
  AW: "~ x ~@7 x ~@6 x ~@5 x ~ x ~@7", AX: "x ~@8 x ~@6 x ~@7 x ~@7", AY: "x ~@8 x ~@6 x ~@15", AZ: "~ x ~@7 x ~@22",
})).gain(0.41)

// drums · open hat
const open_hat = s("oh").struct("<~@8 [~@3 x] ~@23 [~@3 x] ~@56 [~@21 x ~@10] ~@7>").gain(0.41)

// drums · ride
const ride = s("rd").struct("<~@16 A ~@7 B ~@7 B ~@43 C ~@20>".pickRestart({
  A: "x", B: "~ x ~@30", C: "~@17 x ~@14",
})).gain(0.41)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@9 [x!16]!23 x [x!16]!15 x [x!16]!41 ~@7>").gain(1.56)

stack(acoustic_guitar_nylon, acoustic_guitar_nylon_2, string_ensemble_1, bass, hihat, open_hat, ride, cabasa)

More by Sting