Strudelify

Nothing Broken But My Heart

Celine Dion

KeyE majorTempo85 bpm
0:00/0:00
// Nothing Broken But My Heart — Celine Dion
// 85 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 109 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(85/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 · fretless bass · "bass"
const bass = note(`<
  ~@2 A B C B C B C B D E F G H I J K L M N M O M P Q R S T R T R T R U V F G H I J K L M N M O M P Q R S W X Y Z AA AB
  AC AD AE AF AG AH AG AI AJ AK AG AI AJ AK AL AG AM AN AH AG AI AJ AK AG AM AN AH AG AI AJ AO@3 ~@7 AP AQ N AQ AR AQ N
  AS AT AU@2
>`.pickRestart({
  A: "e2", B: "a2", C: "g2", D: "b2@5 ~ b2@10", E: "a2@15 ~", F: "e1@4 ~@2 e1@8 ~ e1", G: "f#1@5 ~ f#1@10",
  H: "e1@4 ~@2 e1@8 e2 e1", I: "f1@4 ~@2 f1@7 f2 f1@2", J: "e1@4 ~@2 e1@5 ~ e2 d2 c2 a1", K: "g1@5 ~ g1@8 ~ g1",
  L: "a1@2 ~ a1@5", M: "g1@3 a1@5", N: "b1@3 c#2@5", O: "b1@6 c#2@6 d2 c#2 a1@2", P: "b1@3 c#2@4 d2",
  Q: "e1@5 ~ e1@4 g1@6", R: "a1", S: "d1@15 ~", T: "g1", U: "b1@5 ~ b1@10", V: "a1@15 ~", W: "f1@4 ~@2 f1@8 ~ f1",
  X: "e1@2 ~ e1@5", Y: "f1@5 ~ f1@9 d1", Z: "e1@5 ~ e1@8 d1 e1", AA: "f1@5 ~ f1@8 ~ f1", AB: "e1@5 ~ e1@8 ~ e1",
  AC: "a1@5 ~ a1@7 ~ a1@2", AD: "b1@4 b1 ~ b1 ~ b1 ~ b1 ~ b1@4", AE: "~@2 a1@3 ~ b1@10", AF: "c#2@3 d#2@5, b1 ~@15",
  AG: "a1@3 b1@5", AH: "c#2@6 d#2@6 e2 d#2 b1@2", AI: "c#2@3 d#2@4 e2", AJ: "f#1@5 ~ f#1@4 a1@6", AK: "b1",
  AL: "e1@3 ~", AM: "c#2@3 d#2@5", AN: "a1@3 b1@5, d#2 ~@15", AO: "b1/3", AP: "~@7 c#2", AQ: "g#1@3 a1@5",
  AR: "b1@6 c#2@7 ~ c#2@2", AS: "f#1@3 g#1@5", AT: "b1@5 ~ b1@4 c#2@6", AU: "[e1@15 ~, f1 ~@31]/2",
})).s("gm_fretless_bass").gain(0.25)

// chords · epiano2 · "rhodes 1"
const epiano2 = note(`<
  A@3 B C D C E C D F G@3 H I J K L M N M O P@2 Q R S C D C E C D F G@3 H I J K L M N M O P@2 Q R S T U T U T V W X Y Z
  AA AB AC@2 AD AE AC@2 AD AE ~ AA Z AF AB AC@2 AD AE AA Z AF AB AC@2 AG@4 AH AI AH AJ AH AI AK AL AH AI AH AJ AH AI AK
  AL AM@2
>`.pickRestart({
  A: "[b5 a5@2 g5@2 f#5@2 ~@2 a4@2 e4@2 f#4 e4 ~ [g4,b4] [f#4,a4]@2 g4@2 f#4@3, e4 a3 e3, ~@14 e5@16 d4@17 ~, ~@38 e4@9 ~]/3", // G F#m
  B: "[a3,d4,e4]", C: "[g3,b3,d4,f#4]", D: "[a3,c#4,e4]", E: "~@3 a4@5, [a3,c#4,e4]",
  F: "[c#4,e4]@5 ~ [d4,f#4]@9 ~, a3@15 ~", // C#m D
  G: "[~@8 [g3,b3,d4]@8 ~@5 d4@3, [a3,c#4]@14 g4@19 ~@15, e4@3 e4 ~@8, ~@5 d4@3 ~@8 [a3,b3,c#4,e4]@8]/3", // G A
  H: "[g3,b3,d4,g4]", I: "[a3,c4,f4]", J: "~@5 c4@3, [g3,b3,d4,g4]", K: "b3@7 b3, [d4,g4]",
  L: "b3@2 ~ g4, g4@3 ~, d4@5 d4@3, ~ b3", M: "[g3,b3,d4,a5]@3 [a3,c#4,e4,e5]@5",
  N: "[a3,d4,f#4,d5]@5 ~ e5@4 f#5@2 g5@4, ~@6 [a3,c#4,e4]@9 ~", // D A
  O: "[a3,d5]@6 e5@4 f#5@2 e5@2 d5 ~, [d4,f#4]@4 ~@2 [a3,c#4,e4]@9 ~", // D5 D A
  P: "[[g3,b3,d4,d5]@5 ~ d5@4 c#5@2 ~@4 [a3,d4,f#4]@5 ~ d5@4 c#5@2 d5@3 ~, ~@6 [a3,c#4,e4]@9 ~@7 [a3,c#4,e4]@9 ~, ~@12 d5@9 ~@11]/2", // G D A
  Q: "[g4,b4,b5] [f#4,a4,a5]@2 [b3,d4,g4,g5]@2 [a3,d4,f#5]@3, d4@5 ~@5 f#4@4 ~@2", R: "[a3,d4,e4,e5]@15 ~",
  S: "[e3,f#3,a3,d4,d5]@15 ~", T: "[a3,c4,f4,g4]@15 ~", U: "[g3,c4,d4,g4]@15 ~", V: "[g3,d4,g4], c4@7 ~",
  W: "[g3,a3,b3,d4]@7 ~", // G
  X: "[a3,b3,c#4,e4]@6 [a3,b3,c#4,e4] ~ [a3,b3,c#4,e4] ~ [a3,b3,c#4,e4] ~ [a3,b3,c#4,e4] ~ [a3,b3,c#4,e4] ~", // A
  Y: "~ [a3,c#4,e4] ~ [b3,d#4,f#4,f#5]@5, b5@3 ~@5", Z: "[b3,e4,g#4,e5]@5 ~ f#5@4 g#5@2 a5@4, ~@6 [b3,d#4,f#4]@9 ~",
  AA: "[a3,c#4,e4,b5]@3 [b3,d#4,f#4,f#5]@5", AB: "[b3,e5]@6 f#5@4 g#5@2 f#5@2 e5 ~, [e4,g#4]@4 ~@2 [b3,d#4,f#4]@9 ~",
  AC: "[[a3,c#4,e4,e5]@5 ~ e5@4 d#5@2 ~@4 [b3,e4,g#4]@5 ~ e5@4 d#5@2 e5@3 ~, ~@6 [b3,d#4,f#4]@9 ~@7 [b3,d#4,f#4]@9 ~, ~@12 e5@9 ~@11]/2", // A E B
  AD: "[a4,c#5,c#6] [g#4,b4,b5]@2 [c#4,e4,a4,a5]@2 [b3,e4,g#5]@3, e4@5 ~@5 g#4@4 ~@2", AE: "[b3,e4,f#4,f#5]@15 ~",
  AF: "[a3,c#4,e4,b5]@3 [b3,d#4,f#4,f#5]@5, a5 ~@15", // A B
  AG: "[[a4,c#5,c#6]@2 [g#4,b4,b5]@4 [c#4,e4,a4,a5]@4 [b3,e4,g#4]@5 ~ f#4@3 f#4@3 f#4@4 g#4@2 f#4@2 e4@2 f#4@3 f#4@3 f#4@4 g#4@2 f#4@2 e4@2 b4@3 f#5@2 ~ f#5@4 ~@2 f#5@2 e5@2, e4@5 ~@5 g#5@50 ~@4, ~@16 [b3,e4]@15 ~ [f#2,b2]@30 ~@2]/4", // A G#m A E E5 B5
  AH: "[g#3,b3,d#4,c#5]@6 e4@7 e4@3, ~@3 [a3,c#4,b4]@5", AI: "~@3 b4@3 [b3,c#4,e4,g#4]@10, [b3,d#4,f#4]@3 ~@5",
  AJ: "~@3 b4@3 ~@8 b4@2, [b3,d#4,f#4]@3 [b3,c#4,e4,g#4]@5", // B C#m7
  AK: "[f#2,f#3,a3,c#4,a4]@3 e4@4 e4, ~@3 [g#2,g#3,b3,g#4]@5", // F#m G#m
  AL: "[b2,b3,e4,f#4]@6 f#4@4 g#4@5 ~, ~@6 [c#3,b3,e4]@9 ~", AM: "[[e3,f#3,g#3,b3,e4]@15 ~]/2",
})).s("gm_epiano2").gain(0.3)

// other · string ensemble 2 · "strings"
const string_ensemble_2 = note(`<
  A@2 B C ~@15 D E D F G@2 B H I ~@15 D E D F G@2 B H I J@2 K@2 L@2 M N O P O Q R@2 S T R@2 S T ~ O P U Q R@2 S T O P U
  Q R@2 S V@3 ~@8 W@4 X@2 Y Z@3
>`.pickRestart({
  A: "[~@5 f#6@2 e6@9, b6@15 ~@17, ~@2 a6@13 ~@17, ~@6 g6@9 ~@17]/2", B: "b5 a5@2 g5@2 f#5@3", C: "e5@15 ~",
  D: "a5@3 e5@5", E: "d5@5 ~ e5@4 f#5@2 g5@4", F: "d5@6 e5@4 f#5@2 e5@2 d5 ~",
  G: "[d5@5 ~ d5@4 c#5@2 d5@9 ~ d5@4 c#5@2 d5@3 ~]/2", H: "e5@7 ~", I: "d5@7 ~", J: "[[f4,a4] [d4,g4], c5@31 ~]/2",
  K: "[[f4,a4]@4 ~@3 b4, c5@7 ~, ~ [d4,g4]]/2", L: "[[f4,a4]@15 ~ g4@16, c5, ~@8 d4@7 ~]/2", M: "[g4,b4]",
  N: "[a4,c#5]", O: "b5@3 f#5@5", P: "e5@5 ~ f#5@4 g#5@2 a5@4", Q: "e5@6 f#5@4 g#5@2 f#5@2 e5 ~",
  R: "[e5@5 ~ e5@4 d#5@2 e5@9 ~ e5@4 d#5@2 e5@3 ~]/2", S: "c#6 b5@2 a5@2 g#5@3", T: "f#5@7 ~", U: "b5@3 f#5@5, a5 ~@15",
  V: "[f#5@47 ~]/3", W: "[b5@63 ~]/4", X: "b5/2", Y: "a5@5 g#5@8 ~ e5@2", Z: "[f#5@10 ~@5 e5@33, ~@5 g#5@19]/3",
})).s("gm_string_ensemble_2").gain(0.2).pan(0.3)

// other · distortion guitar · "solo"
const distortion_guitar = note("<~@51 A B@2 C D@2 E F G ~@49>".pickRestart({
  A: "~@13 c4 f4 g4", B: "[a4@13 ~ b4@6 c5@2 g4@6 d4@2 c4@2]/2", C: "a4@4 c5@2 g5@7 g5 f5@2",
  D: "[g5@3 ~ g5@2 d5@8 c5@17 ~]/2", E: "~@10 e5@3 c5 g4 f4", F: "e4", G: "~ c#5 e5 b5@5",
})).s("gm_distortion_guitar").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A B A C A B A C A B A C A B@2 C D C E C F G B D A B A C A B A C A B A C A B H C D C E C F E I B@4 A B D@2 J K D C
  E C F E D C F E L M C F C E C F E L C F C E C F E L ~@10 N O N O N O N O P ~
>`.pickRestart({
  A: "x ~@5 x ~@8 x", B: "x ~@2 x ~@4", C: "x ~@5 x ~@3 x ~@2 x!2 ~", D: "x ~@2 x ~ x ~@2",
  E: "x ~@5 x ~@3 x ~@2 x ~@2", F: "x ~@5 x ~@3 x ~@4 x", G: "x ~@2 x ~ x ~ x", H: "~@2 x ~ x ~ x ~@4 x ~@4",
  I: "x ~@2 x ~@2 x ~@3 x ~@3 x ~", J: "x!2 ~ x!2 ~@3", K: "~ x ~ x ~ x ~@2", L: "x ~@2 x ~@2 x ~@3 x ~@2 x ~@2",
  M: "~@11 x ~@4", N: "x ~@2 x ~@2 x ~@9", O: "x ~@2 x ~@2 x ~@3 x ~@5", P: "x",
})).gain(0.4)

// drums · rim
const rim = s("rim").struct("<~@4 A ~ A ~ A ~ A ~ A ~ A ~ A ~@11 A ~ A ~ A ~ A ~ A ~ A ~ A ~@58 A@8 ~@2>".pickRestart({
  A: "~@3 x",
})).gain(0.35)

// drums · snare
const snare = s("sd").struct("<~@18 A B@7 C A ~@7 A@4 B@3 D B@8 E B@7 E F B@6 G B@3 H A B@7 H B@7 H ~@20>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@2 x ~@2 x ~@2", D: "~@8 x ~@3 x!2 ~@2", E: "~@4 x ~@5 x!3 ~@3", F: "x!2 ~ x",
  G: "~@4 x ~@7 x ~ x!2", H: "~ x!3",
})).gain(0.4)

// drums · clap
const clap = s("cp").struct("<~@12 A ~ A ~ A ~ A ~@17 A ~ A ~ A ~ A ~@56 A@8 ~@2>".pickRestart({
  A: "~ x ~@2",
})).gain(0.35)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@19 A B A B A B A B C ~@15 A B A B A B A B C A B A B A B A D A B A B A B A B A B A B E A B A B A B A B A B A B A B A
  B ~@10 F G H C@2 F C@2 ~@2
>`.pickRestart({
  A: "x ~@3 x!2 ~@2 x ~@3 x ~@3", B: "x ~@3 x ~ x ~ x ~ x!2 ~ x!2 ~", C: "x!4", D: "x ~ x!3 ~@3", E: "x!3 ~",
  F: "x ~ x ~ x ~ x!2", G: "x ~ x!3 ~ x ~", H: "x!2 ~ x",
})).gain(0.25)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@19 A B A B A B A B C ~@15 A B A B A B A B C A B A B A B A D 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 ~@10 E F G H C I C J ~@2
>`.pickRestart({
  A: "~ x ~@3 x ~ x", B: "~ x ~@4 x ~", C: "~ x ~ x ~ x ~ x", D: "~ x ~@6", E: "~ x ~ x ~ x ~@2",
  F: "~@2 x ~@6 x!2 ~@5", G: "~ x ~ x!3 ~ x", H: "~@2 x ~@3 x ~@2 x!2 ~@3 x ~", I: "~@2 x ~@3 x ~@2 x!2 ~@5",
  J: "~ x!2 ~@3 x ~@2 x!2 ~@5",
})).gain(0.15)

// drums · low tom
const low_tom = s("lt").struct("<~@26 A ~@15 A ~@16 A ~@12 B ~@36>".pickRestart({
  A: "~@7 x", B: "~@3 x",
})).gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@26 [~@3 x] ~@24 [~@13 x ~@2] ~@7 [~@13 x ~@2] ~@49>").gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@19 A ~@23 A ~@7 A ~@8 B ~@7 A ~ C ~@2 A ~@5 C ~ A ~@5 C ~@21>".pickRestart({
  A: "x", B: "~ x ~ x ~@4", C: "~@10 x ~@2 x ~@2",
})).gain(0.35)

// drums · ride
const ride = s("rd").struct("<~@107 x ~>").gain(0.25)

// drums · tambourine
const tambourine = s("tb").struct("<~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~@11 A ~ A ~ A ~ A ~ A ~ A ~ A ~@67>".pickRestart({
  A: "~@3 x",
})).gain(0.4)

// drums · shaker
const shaker = s("sh").struct("<[x!4]!72 ~ [x!4]!34 ~@2>").gain(0.3)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<[~ x ~ x ~ x ~ x]!72 ~ [~ x ~ x ~ x ~ x]!34 ~@2>").gain(0.15)

stack(
  bass, epiano2, string_ensemble_2, distortion_guitar, kick, rim, snare, clap, hihat, hihat_soft, low_tom, mid_tom,
  crash, ride, tambourine, shaker, shaker_soft
)

More by Celine Dion