Strudelify

tears in heaven

clapton

KeyC majorTempo76 bpm
0:00/0:00
// tears in heaven — clapton
// 76 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Transcription provider: pdmx. https://musescore.com/score/5867626; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 96 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(76/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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 · violin
const violin = note(`<
  ~ A@2 B C ~@4 D@2 E@2 F@2 G H I J A@2 B C ~@4 D@2 E@2 F@2 G H I J A@2 B C K@3 L M@2 N O P Q ~@3 R@2 S@2 ~@3 T@8 U@7 V
  W X@8 Y@3 Z@2 AA@4 AB
>`.pickRestart({
  A: "[~ g4 e5 c5 d5@2 g5 c5@3 c5 g4 a4@2 c5@2]/2", B: "a4@2 f5 e5 d5@3 c5", C: "c5@3 ~",
  D: "[~@3 g3@3 e4 f4 e4 c4@3 g4@6 g4@3 e4@21 ~@6]/2", E: "[~@2 f4!2 e4 d4 c4 e4@2 d4@3 ~@4]/2", F: "[e4@6 f4 d4@9]/2",
  G: "e4", H: "e4@2 e4 a4", I: "a4@2 a4 f4", J: "g4 ~",
  K: "[~@2 d#5!2 d5@2 a#4 c5@3 c5 a4 c5@3 a#4@4 d5 d#5 c5 g#4 c5]/3", L: "a#4@3 c5 a#4 g#4 f4@2",
  M: "[g4@2 a#4@2 d5@2 a#4 c5@3 g4@2 a4@2 a4 a#4]/2", N: "a#4@3 d5 d#5 c5 g#4 c5", O: "a#4@3 c5!2 g#4 f4@2",
  P: "~@2 g4 a4", Q: "b4@3 c5 d5@2 ~@2", R: "[~@18 g4@41 b4@10 c5@10 d5@10 c5@7]/2",
  S: "[~@3 c5@10 f4@20 ~ a4@10 g4@10 a4@10 b4@10 d5@5 c5@15 ~@2]/2",
  T: "[~@6 c5@20 ~ c5@7 ~@3 c5@10 b4@5 ~@5 b4@20 g4@10 a4@20 ~ a4@7 ~@3 a4@10 g4@10 a4@10 b4@10 g4@10 ~@16 f5@5 f5@10 f5@5 d5@15 b4@10 c5@5 d5@15 ~ c5@15 c5@5 b4@5 b4@10 a4@20 a4@5 b4@10 ~ c5@10 d5@15 ~@5 d5@10 c5@10 b4@10 g4@3]/8",
  U: "[~@2 g4@15 ~ e4@5 e4@45 g4@20 ~ g4@20 f4@20 a4@20 g4@10 a4@10 ~ b4@10 g4@5 g4@20 g4@5 g4@14 ~@6 a#4@15 ~ a#4@15 c5@10 ~@15 f5@5 f5@10 f5@5 d5@15 ~ b4@10 c5@4]/7",
  V: "~ d5@15 c5@15 c5@5 b4@5 g4@7", W: "~@3 a4@20 ~ a4@5 b4@10 c5@9",
  X: "[~ d5@15 ~@5 d5@10 c5@10 ~ c5@30 b4@10 g4@30 ~@21 g4@10 a4@10 b4@10 a4@20 f4@20 ~ g4@20 f4@10 d4@10 e4@30 ~ e4@10 d4@10 b3@10 d4@10 d4@10 f4@20 ~ a4@20 g4@10 a4@8]/8",
  Y: "[~@2 b4@10 g4@5 b4@5 c5@15 ~ a#4@15 a#4@10 ~@15 f5@5 f5@10 f5@5 d5@15 ~ b4@10 c5@5 d5@15]/3",
  Z: "[c5@10 c5@5 c5@5 b4@10 b4@5 a4@20 ~ a4@5 b4@10 c5@10 d5@15]/2",
  AA: "[~@5 d5@10 c5@10 ~ c5@10 c5@10 b4@11 g4@11 a4@21 g4@10 f4@11 e4@21 d4@11 c4@10 b3@21 ~ c4@18]/4",
  AB: "~ e4@14 ~",
})).s("gm_violin").gain(0.2).pan(0.4)

// other · pizzicato strings
const pizzicato_strings = note("<~@5 A B C D ~@14 A B C D ~@69>".pickRestart({
  A: "g4@2 g4@2 g4@2 g4 ~", B: "c5!4", C: "a4!2 c5!2", D: "b4 a4 b4 g4",
})).s("gm_pizzicato_strings").gain(0.2).pan(0.4)

// other · pizzicato strings · soft notes
const pizzicato_strings_soft = note("<~@58 A B@3 ~@34>".pickRestart({
  A: "~@9 c5@10 c5@10 b4@19", B: "[~ g4@10 g4@10 a4@20 ~ a4@10 a4@10 g4@10 a4@10 b4@10 d5@10 ~@42]/3",
})).s("gm_pizzicato_strings").gain(0.12).pan(0.4)

// other · viola
const viola = note(`<
  ~@2 A B C ~@4 D E F G ~@5 H ~ A B C ~@4 D E F G ~@5 H ~ A B C ~@8 I J K L M@2 N@3 ~@3 O@6 P@3 Q@7 R S T U@6 V@3 W@2
  X@4 Y
>`.pickRestart({
  A: "~ e4 g4@2 e4 d4 c4 g3", B: "a3 c4 c4@2 g3 a3 b3@2", C: "e4@3 ~", D: "e4@3 e4 d4@2 b3@2", E: "c4@3 c4 b3@2 g3@2",
  F: "a3 c4 g4@2", G: "g4@3 a4 b4@2 d5@2", H: "~@18 g3 ~@2 g3@3 g3@9 ~@15", I: "~@2 e4 d4", J: "d4@3 e4 f4@2 ~@2",
  K: "~@15 g3@5 e4@5 d4@5 c4@5 d4@5 ~ d4@7", L: "~@8 g3@5 e4@5 d4@5 c4@5 a3@15 ~@5",
  M: "[a3@5 e4@5 d4@5 c4@10 ~ d4@10 e4@10 f4@10 a4@5 g4@15 ~@5 g3@5 e4@5 d4@5]/2",
  N: "[~ c4@5 d4@15 ~@5 g3@5 e4@5 d4@5 c4@5 a3@15 ~@5 a3@5 e4@5 ~ d4@5 c4@5 d4@15 e4@10 f4@10 a4@5 g4@15 ~@2]/3",
  O: "[~@6 g4@20 ~ g4@7 ~@3 e4@10 d4@5 ~@5 d4@20 d4@10 c4@20 ~ c4@7 ~@3 c4@10 b3@10 c4@10 d4@10 b3@10 ~ c4@40 b3@20 d4@20 ~ c4@20 g4@10 d4@8]/6",
  P: "[~@2 e4@20 d4@10 ~ c4@10 f4@10 g4@10 a4@20 g4@10 g4@5 g4@35 ~@6 g3@5]/3",
  Q: "[e4@5 d4@5 c4@5 d4@5 d4@10 ~@5 g3@5 ~ e4@5 d4@5 c4@5 a3@15 ~@5 a3@5 e4@5 d4@5 c4@10 d4@10 e4@10 ~ f4@10 d4@5 c4@20 c4@5 c4@14 ~@6 g3@15 ~ g3@15 a#3@10 c4@40 d4@41 c4@15 c4@5 d4@12]/7",
  R: "~@3 e4@20 ~@25", S: "~ a4@15 ~@5 a4@20 ~ g4@5 ~", T: "~@2 g4@10 g4@5 ~@7",
  U: "[~@17 g3@2 a3@3 c4@2 d4@3 e4@2 f4@3 g4@2 a4@3 g4@20 ~@5 g4@5 e5@5 d5@5 c5@5 c5@5 c5@15 ~ g4@5 e5@5 d5@5 c5@5 b4@5 a4@5 g4@5 e4@5 g4@5 g4@20 ~@6 g4@2 a4@3 b4@5 c5@5 b4@5 c5@5 b4@5 a4@5 g4@3 f4@3 ~ e4@3 d4@5 c4@5 b3@10 c4@20 ~ g3@3 a3@3 c4@3 ~ d4@10 e4@8]/6",
  V: "[~@2 f4@10 a4@5 g4@35 ~ e4@10 c4@40 d4@41]/3", W: "[c4@10 c4@10 e4@10 e4@5 e4@20 ~@26 a4@15]/2",
  X: "[~@5 a4@20 ~ g4@10 g4@21 e4@11 f4@21 e4@10 d4@11 c4@21 a#3@11 a3@10 g3@21 ~ a3@18]/4", Y: "~ g3@14 ~",
})).s("gm_viola").gain(0.22).pan(0.7)

// other · viola · soft notes
const viola_soft = note("<~@13 A B C D E F ~@12 A B C D E F ~@59>".pickRestart({
  A: "c5 a4", B: "e4@2 f#4@2 g#4 a4 b4@2", C: "c5 c4", D: "c#4@3 c#4 b3 a3@3", E: "d4", F: "d4 ~@3",
})).s("gm_viola").gain(0.15).pan(0.7)

// other · pizzicato strings
const pizzicato_strings_2 = note("<~@5 A B C D ~@14 A B C D ~@14 E F G H E F G I J ~@8 K L@3 ~@34>".pickRestart({
  A: "e4!2 d4!2", B: "e4!2 g4!2", C: "c4!2 e4!2", D: "g4 f4 g4 d4", E: "~@2 d#4 g4 ~@2 a#3 d4",
  F: "~@2 c4 d#4 ~@2 a3 c4", G: "d4 ~ a#3 d4 c4 ~ c4 d#4", H: "d4 ~ g3 a#3 f3 ~ a#3 d4", I: "d4 ~ g3 a#3 f3 ~ g#3 c4",
  J: "d4@3 ~@5", K: "~@9 e4@10 e4@10 d4@19", L: "[~ d4@10 d4@10 c4@20 ~ c4@10 c4@10 b3@10 c4@10 d4@10 f4@10 ~@42]/3",
})).s("gm_pizzicato_strings").gain(0.22).pan(0.7)

// other · cello
const cello = note(`<
  ~@3 A B C D E F C G H I J K L M N O ~@2 A B C D E F C G H I J K L M N O P@3 Q ~@8 R S T@4 ~@3 U V@8 W@2 X@2 Y@6 Z AA
  AB@3 AC@4 AD@3 AE@6 AF
>`.pickRestart({
  A: "f3!3 a3 g3@2 g3!2", B: "c3@6 e3 f3 g3@4 ~@4", C: "c4@3 c4 b3@2 g3@2", D: "a3@3 a3 g3 f3 e3 c3", E: "f3 a3 c4 a3",
  F: "b3@6 a3@2 g3@4 ~@2 g3 a3", G: "a3@3 a3 g3@2 e3@2", H: "f3 a3 c4 g3", I: "b3@3 a3 g3@2 g#3@2", J: "a3",
  K: "g#3@2 a3@2 b3 c4 d4@2", L: "g3", M: "a3@2 g3 e3", N: "d3@2 e3 f3", O: "g3@12 ~@6 g3 ~@2 g3@3 g3@18 ~@6",
  P: "[c3 d3 e3 f3 g3 a3 b3 c4@4 ~ e3 f3 g3 a3@3 f3 a3 g3@2 g3@2]/3", Q: "c3@3 c3 c3@3 ~", R: "~@2 c3 d3",
  S: "g2@3 g2 g2@2 ~@2", T: "[c4@30 c4@10 ~ b3@20 g3@20 f3@30 a3@10 ~ g3@10 a3@10 b3@10 g3@10 ~@30]/4",
  U: "~@19 c4@10 b3@19",
  V: "[~ g3@20 f3@20 ~ a3@20 g3@15 a3@5 b3@10 g3@10 c3@20 ~@11 c4@10 b3@20 g3@20 f3@20 ~ a3@20 g3@15 a3@5 b3@10 g3@10 ~ f3@20 a3@20 g3@41 c3@20 b2@18]/8",
  W: "[~@2 a2@20 g2@20 ~ d2@10 e2@10 f2@10 f#2@10 g2@10 ~@3]/2", X: "[~@2 g2@25 ~ c3@10 c3@20 c3@10 b2@10 b2@18]/2",
  Y: "[~@3 b2@10 f2@10 f2@20 f2@10 g2@10 a2@10 ~ b2@10 g2@10 c2@15 ~@5 c2@14 ~@6 c3@15 ~ c3@15 e3@10 f3@40 g3@15 ~ g3@5 g3@20 g3@20 g3@5 g3@7]/6",
  Z: "~@3 a3@20 ~@25", AA: "~ d3@10 e3@10 f3@10 f#3@10 ~ g3@5 ~",
  AB: "[~@4 g3@20 g2@10 c3@10 c3@20 ~@11 b3@10 b3@20 b3@10 a3@10 a3@19]/3",
  AC: "[~@2 f3@10 g3@20 a3@10 b3@10 c4@10 c4@20 ~ g3@10 g3@10 g3@20 g2@10 f2@10 f2@20 ~ f2@10 g2@10 a2@8]/4",
  AD: "[~@2 b2@10 g2@10 c3@15 ~ c3@15 g3@10 f3@40 g3@10 ~ g3@10 g3@20]/3",
  AE: "[c3@10 c3@10 g3@10 g3@5 a3@20 ~@26 d3@10 e3@10 f3@10 f#3@10 ~ g3@10 g2@21 g2@11 c4@21 b3@10 a3@11 g3@21 f3@11 e3@10 d3@21 ~ c3@18]/6",
  AF: "~ c3@14 ~",
})).s("gm_cello").gain(0.24).pan(0.9)

// other · pizzicato strings
const pizzicato_strings_3 = note("<~@41 A B C D A B C E F ~@46>".pickRestart({
  A: "d#3 a#3 d#3 ~ a#2 f3 a#2 ~", B: "c3 g3 c3 ~ a2 f3 a2 ~", C: "a#2 f3 a#2 ~ g#2 d#3 g#2 ~",
  D: "g2 d3 g2 ~ a#2 f3 a#2 ~", E: "g2 d3 g2 ~ c3 f3 c3 ~", F: "a#2@3 ~@5",
})).s("gm_pizzicato_strings").gain(0.29).pan(0.9)

// other · pizzicato strings · soft notes
const pizzicato_strings_soft_2 = note("<~@54 A B C@3 ~@37>".pickRestart({
  A: "~@9 c3@5 c3@10", B: "~ c3@10 g2@10 g2@20 g2@7",
  C: "[~@3 f2@10 f2@20 ~ f2@10 g2@10 a2@10 b2@10 g2@10 c3@20 ~@40]/3",
})).s("gm_pizzicato_strings").gain(0.19).pan(0.9)

// bass · contrabass
const bass = note("<~@12 A B C D E F G ~@11 A B C D E F G ~@12 H I ~@36 J@2 K@6 L>".pickRestart({
  A: "~@3 e2", B: "a2", C: "e2", D: "c2", E: "a1@2 a1 c#2", F: "d2@2 e2 f2", G: "g2@12 ~@6 g2 ~@2 g2@3 g2@18 ~@6",
  H: "~@2 c2 d2", I: "g2@3 g1 g1@2 ~@2", J: "[~@15 f2@40 g2@10 ~ g2@10 g2@10 b2@10]/2",
  K: "[c3@10 c3@10 e2@10 e2@5 a1@20 ~@26 d2@10 e2@10 f2@10 f#2@10 ~ g2@10 g1@21 c2@11 f2@21 e2@10 d2@11 c2@21 a#1@11 a1@10 g1@21 ~ f1@18]/6",
  L: "~ c2@14 ~",
})).s("gm_contrabass").gain(0.22)

// bass · acoustic bass
const bass_2 = note(`<
  A B C D E F G H I J K L M ~@6 B C D E F G H I J K L M ~@6 B C D N O P Q R O P Q S T U V W@3 X Y@3 Z@6 ~@4 AA@2 AB@7
  AC@4 AD@4 AE@2 ~@8
>`.pickRestart({
  A: "~@14 g2 a2", B: "c3 b2", C: "a2 g2", D: "f2 g2", E: "c2@6 e2 f2 g2@4 ~@2 g2 a2", F: "c3@4 g2@3 g2",
  G: "a2@4 e2@3 e2", H: "f2@4 c2@3 c2", I: "g1@2 g1@4 g2@2 g2@6 g2 a2", J: "c3!2 g2!2", K: "a2@2 a2@2 e2@3 e2",
  L: "f2!2 c2 e2", M: "g2 g2@2 g2 g2@2 ~@2", N: "c2@6 c2@2 c2@6 c2 d2", O: "d#2 d2", P: "c2 f2", Q: "a#2 g#2",
  R: "g2 a#1", S: "g2 f2", T: "a#1 ~@3", U: "~@14 g1 a1", V: "c2@10 c2@20 c2@10 ~ b1@7",
  W: "[~@3 b1@20 g1@10 a1@10 a1@20 f1@10 ~ g1@10 a1@10 b1@10 g1@10 c2@10 c2@20]/3", X: "~ c2@10 g1@10 g1@20 g1@7",
  Y: "[~@3 f1@10 f1@20 ~ f1@10 g1@10 a1@10 b1@10 g1@10 c2@10 c2@10 ~@11 c2@10 g1@10 g1@9]/3",
  Z: "[~ b1@10 g1@10 f2@20 ~ f2@10 f2@10 g2@20 d2@10 g1@10 c2@10 ~ c2@20 c2@10 g1@20 b1@10 g1@10 f2@15 ~ f2@5 f2@10 f2@10 g2@41 ~@23]/6",
  AA: "[~@14 c2@5 c2@10 c2@5 b1@5 b1@9]/2",
  AB: "[~@3 b1@10 a1@10 a1@20 f1@10 g1@10 a1@10 ~ b1@10 g1@10 c2@15 c2@5 c2@14 ~@6 c2@15 ~ c2@10 ~@5 e2@10 f2@15 f2@15 f2@10 g2@15 ~ g2@15 a2@5 b2@5 c3@20 b2@10 g2@10 ~ a2@15 ~@5 g2@10 e2@9]/7",
  AC: "[~ d2@10 e2@10 f2@10 f#2@10 ~ g2@20 g1@20 c2@10 c2@20 ~ c2@10 b1@10 b1@20 b1@10 a1@10 a1@19]/4",
  AD: "[~@2 f1@10 g1@20 a1@10 b1@10 c2@10 c2@20 ~ c2@10 b1@10 b1@20 g1@10 f1@10 f1@20 ~ f1@10 g1@10 a1@8]/4",
  AE: "[~@2 b1@10 g1@10 c2@15 ~ c2@5 c2@20 ~@33]/2",
})).s("gm_acoustic_bass").gain(0.22)

stack(
  violin, pizzicato_strings, pizzicato_strings_soft, viola, viola_soft, pizzicato_strings_2, cello, pizzicato_strings_3,
  pizzicato_strings_soft_2, bass, bass_2
)