Strudelify

Dog & Butterfly

Heart

KeyA majorTempo100 bpm
0:00/0:00
// Dog & Butterfly — Heart
// 100 bpm, 2/2, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 3 "Staff-1" piccolo (copy of ch 4 "Staff-2" piccolo)
// note: Full arrangement: all 133 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(100/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 steel · "Staff"
const acoustic_guitar_steel = note(`<
  A B@5 C@4 D@7 E@3 F@2 G@4 H@5 I@8 C@4 D@7 E@3 F@2 G@4 H@5 J@3 K@8 L@6 M@7 N@2 O@8 D@7 E@3 F@2 P@8 Q@8 R@7
>`.pickRestart({
  A: "~@7 e3",
  B: "[~@19 e5@2 ~ e4 ~@4 e5@2 ~@10 e3, a3@7 e3@7 e4@2 a3@7 e3@6 e5@3 a3@8, ~ e4@5 e4@2 a3@7 e3@7 b4@12 a4 [c#5,e5]@5, ~@2 a4@3 a4@4 e4@4 a4@4 e4@4 e5@4 e4 a4 c#5@6 e4@4 a4@3, ~@3 [b4,e5]@7 a4 [b4,e5]@7 a4 b4@2 a4@2 e4 a3@5 a4 e4 e3@7 e4@2]/5", // C#m E5
  C: "[~@31 e3, a3@9 e4 g#4 [b4,e5]@5 b3@13 a4 e4@2, ~ e4@4 a4@13 g#4 [b4,e5]@5 a3@8, ~@2 a4 e5@3 e4 e3 b3@5 g#4 e4 e3@7 e4 e3@2 e4 a4 [b4,e5]@5, ~@3 c#5@14 e4@4 g#4@11]/4", // E5
  D: "[~@22 c#4@2 a4@2 ~@29 f#4, a3@11 b4@6 e4@7 c#4@9 f#4 b4 f#5@9 b3@2 b4 f#4 c#5@6 b4@2, ~ e4@5 e4 e3@2 e4 g#4 e5@11 [g#4,f5]@8 f#4 f#3 b3@3 d#5@5 e5@16, ~@2 a4@3 a4@8 g#4 e4 e3@7 b4@2 [f#3,f#4,c#5]@2 a4 c#5@10 b4 f#4 f#3@9 b3@2 b4 f#4 [b3,a4]@4, ~@3 [b4,e5]@5 b3@10 g#4 c#4@2 f4@6 f#5@2 a4@11 b3@2 b4 f#4 d#5@12]/7", // C# F#5 B7 E5
  E: "[~@7 g#4 ~@15 e3, d4@6 d4@11 [e4,b4,e5]@13 e3@4 e4@2 a4@2 [b4,e5]@4 a4@2 e4@4, ~ a4@3 a4 a4@3 b3@16, ~@4 d5@12 e3 g#4@31, ~@9 b4@3 f#4@20 a3@16]/3", // E5
  F: "[~@15 e3, a3@7 e3@6 g#4 e4@2, ~ e4@5 e4@2 a3@8, ~@2 a4@3 a4@11, ~@3 [b4,e5]@6 e4 g#4 [b4,e5]@5]/2", // E5
  G: "[~@8 [g3,g4] ~@22 e3, a3@7 e3@10 d4 a4 d5@10 a4 e4@2, ~ e4@4 g#4@7 b4 a4 b4@9 e3@2 e4 a4 [b4,e5]@5, ~@2 g#4 b4@3 e4@9 d4 a3@3 e5@5 a3@8, ~@3 e5@6 [g3,g4]@12 a4 d4@10]/4", // G E5 G
  H: "[~@39 f#3, a3@7 f#3@8 g#3@9 c#4@9 f#4 b4 [d#5,f#5]@2 b4 f#4@2, ~ e4@5 e4@8 f#4@2 c#4 g#4 c#5 [e5,g#5]@8 f#5@2 a4@11, ~@2 g#4@3 g#4@3 c#4 f#4 a4 f#5@11 g#4@8 f#4 f#3 b3@8, ~@3 [b4,e5]@8 c#5@2 a4@8 c#5@2 f#3@2 f#4 a4 c#5@13]/5", // D#m E E5
  I: "[~@63 e3, b3@14 [f#3,d#4]@19 e5@15 a3@10 g#4@8 e4@8 g#4@24 e4@2 a4@2 [c#5,e5]@12 e4@8 a4@6, ~@2 f#4@10 f#4@21 d5@29 e3@14 e4@4 a3@10 a4@2 e4@2 e3@12 a4@6 a3@16, ~@2 b4@3 b4@11 [d4,a4]@14 e4@2 a3@7 e3@4 e5@5 a3@6 e4 e3@7 e4@2, ~@3 [d#5,f#5]@5 d4 a4 d5 e5 d5 a4 d4 a3@8 e3@2 e4 g#4 [b4,e5]@7 g#4 [b4,e5]@6 e4 a4 b4@15 a4 [c#5,e5]@5]/8", // D#m C#m D5 D#m E5 C#m
  J: "[~@23 e3, b3@7 [f#3,d#4]@16 ~, ~@2 f#4@10 f#4@21 [d5,e5]@15, ~@2 b4@3 b4@11 [d4,a4]@8, ~@3 [d#5,f#5]@5 d4 a4 d5 e5 d5 a4 d4 a3@9]/3", // D#m Dsus2 D5 D#m
  K: "[~@63 a3, a3@7 e3 a3@8 c#4 g#4 c#5 [e5,g#5]@8 a4@2 f#4@10 e3@9 a3 d4@4 a4@6 d4@2 f#4@3, ~ e4@5 e4@9 g#3@10 c#4 f#4 [c#5,f#5]@8 e5@2 a4 d4@7 a4 e4@4 a4 [d5,f#5]@13, ~@2 g#4@3 g#4@7 e3@11 c#4 f#3@7 e3 a3 d4 a4 d5@12 f#3@9 g4@8, ~@3 [b4,e5]@11 f#3@7 c#5 g#4@8 c#4@10 a3 e4 a4 [c#5,e5]@11 a3@3 f#4 e4@6]/8", // E F#5 D E5 C#m
  L: "[~@23 [e3,e4] ~@23 a3, a3@6 e4@9 g#3@9 e3 f#3@6 e3 a3 d4 a4 d5@10 a4 e4@2, ~ e4@4 a4@9 f#3@7 c#5@3 e4@6 c#4@10 a3 e4 a4 [c#5,e5]@5, ~@2 a4 c#5@4 e3 a3@9 g#4 c#5 [e5,g#5]@7 c#4 c#5@8 e5@2 a4 d4@10, ~@3 e5@9 e3@4 c#4@6 g#4@5 a4@2 f#4@10 e3@9]/6", // E C#m E
  M: "[~@31 a3 ~@23 e3, a3@7 a3@2 f#4 e4 d4@13 a3@6 e4@7 a4@4 f#4 e4 d4@6 e4 a4 [c#5,e5]@2 a4 e4@2, ~ d4@5 d4@2 g4@9 e4 a4 [c#5,e5]@6 e4@4 a4@3 a3@8 g4@16, ~@2 a4@3 a4@8 f#4@13 a4 [c#5,e5]@11 d4 c#4@8 e3 a3@8, ~@3 [d5,f#5]@12 e3 a3@5 a4 e4 e3@10 d4 a4 [d5,f#5]@10 f#4@11]/7", // C#m D
  N: "[~@10 [g3,d4] [g3,d4]@3 [g3,d4,f#4]!2, a3@7 e3@9, ~ e4@5 e4@10, ~@2 a4@3 a4@11, ~@3 [c#5,e5]@13]/2", // G5 Gmaj7 C#m
  O: "[~@2 g3 ~@7 [g#3,d4] d4@3 d4@2 e3@7 ~@40 e3, ~@2 d4@3 f#3@11 e4@8 a3@5 a4@3 a3@6 e4 e3 b3 e4 g#4 [b4,e5]@2 g#4 e4 e3@6 g#4@4 e4 a4 [b4,e5]@2 a4 e4@2, ~@3 g3@61, ~@3 e4@8 g#3@3 a3@9 e3@2 e4 a4 [c#5,e5]@6 e4 a4 c#5@13 b3@16, ~@5 d4@3 e3@8 [g#3,d4]@14 e4 e3@4 e5@2 a4@12 e4 g#4 [b4,e5]@3 e4 e3 a3@8]/8", // G#dim E5 C#m G#dim E5
  P: "[~@8 [g3,g4] ~@54 f#3, a3@7 e3@8 d4 a3 d4 a4 d5@10 a4@4 e4 g#4 [b4,e5]@5 c#4 f#4 a4 f#5@10 c#5 g#4@3 f#4 a4 [c#5,f#5]@2 a4 f#4@2, ~ e4@4 g#4@4 g4@10 e5@2 a4 d4@10 a3@6 e4@5 c#5@2 a4@3 c#4 g#4 c#5 [e5,g#5]@13, ~@2 g#4 b4@3 e4@6 b4 a4 b4@9 e3 a3 e4 a4 [b4,e5]@3 e4 e3@6 g#4@2 f#3@7 f#4 g#3@8 f#3 c#4@8, ~@3 e5@6 g3@55]/8", // G E5 F#5 E E5
  Q: "[~@63 e3, b3@7 f#3@7 f#4@2 b3@7 f#3@7 f#4@10 a4@7 e3@2 e4 a4 [b4,e5]@7 a4 [b4,e5]@5, ~@2 f#4@10 f#4@4 b3@14 f#3@14 f#4@4 b3@14 f#3@19 d5@29 e3@14 e4@4, ~@2 b4@3 b4@4 f#4@4 b4@4 f#4@4 b4@4 f#4@4 b4@11 d4@13 a4@4 e4@4 a4@3, ~@6 [d#5,f#5]@14 b4@2 [d#5,f#5]@14 b4@2 [d#5,f#5]@14 b4@2 [d#5,f#5]@10 d4@2 a4@2 d5@2 e5@2 d5@2 a4@2 d4@2 a3@3 e5@15 a3@12 e4@4 a3@16]/8", // E5 D#m
  R: "[~@5 [a3,c#4,e4,a4]@2, a3@7 e3@7 e4@2 a3@7 e3@7 e4@2 a3@7 e3@16 ~, ~ e4@5 e4@2 a3@7 e3@7 e4@2 a3@7 e3@7 e4@2 ~@16, ~@2 a4@3 a4@4 e4@4 a4@4 e4@4 a4@4 e4@4 a4@4 e4@4 a4@3 ~@16, ~@3 [b4,e5]@7 a4 [b4,e5]@7 a4 [b4,e5]@7 a4 [b4,e5]@7 a4 [b4,e5]@16 ~@5]/7", // A E5
})).s("gm_acoustic_guitar_steel").gain(0.32)

// other · string ensemble 1 · "Staff-3"
const string_ensemble_1 = note(`<
  ~@33 A B@3 C B@2 D@2 B@2 D E F G H I J D B@4 K L B@2 F M F N O J L P Q R S T U T V P Q W@2 T U X V P@2 X V P@2 Y Z AA
  AB B@2 D@2 B@2 D E F G H I J D B@4 K L B@2 F M F N@4 J L AC@6 AD@2 ~
>`.pickRestart({
  A: "~@7 a2", B: "a2@13 ~ e2@2", C: "a2@11 ~@5", D: "e2@13 ~ e2@2", E: "e2@5 ~ c#3@3 ~ f3@2 g#3@3 ~",
  F: "f#2@13 ~ f#2@2", G: "b1@13 ~ b1@2", H: "e3@7 ~ d#3@7 ~", I: "c#3@7 ~ a2@7 ~", J: "d2@15 ~", K: "g2@13 ~ e2@2",
  L: "d2@13 ~ e2@2", M: "c#3@13 ~ e2@2", N: "b2@13 ~ f#2@2", O: "b2@15 ~", P: "a2@15 ~", Q: "a2@7 ~ e2@3 ~ f#2@2 g#2@2",
  R: "c#2@5 ~ c#2@2 c#2@7 ~", S: "f#2@5 ~ f#2@2 f#2@7 ~", T: "d2@5 ~ a2@2 d3@7 ~", U: "a2@2 e2@2 a2@6 e2@2 a2@3 ~",
  V: "c3@2 b2@2 a2@2 g2@9 ~", W: "[c#2@5 ~ c#2@2 c#2@5 ~ e2@4 f#2@2 f#2@6 c#3@2 f#2@3 ~]/2",
  X: "d2@5 ~ a2@2 d3@3 ~ d2@3 ~", Y: "c3@11 ~ g2@3 ~", Z: "c2@13 ~ d2@2", AA: "e2@11 ~ b2@3 ~", AB: "e3@11 ~@5",
  AC: "e2@15 ~", AD: "[e2@31 ~]/2",
})).s("gm_string_ensemble_1").gain(0.2)

// chords · string ensemble 2 · "Staff-4"
const string_ensemble_2 = note(`<
  ~@19 A B C A D E A C F G F H I E ~ C J A K L K M N A B M O P Q R@2 S ~ A B C A D E A C F G F H I E ~ C T U V W K X Y K
  T Z@2 AA AB AC AD AE AB AC AD AE AB AF AG AH AI L K M N A B M O P Q R@2 S ~ A B C A D E A C F G F H I H I AJ ~ B ~@8
>`.pickRestart({
  A: "[a3,b3,e4]@15 ~", B: "[a3,b3,e4,a4]@15 ~", C: "[a3,b3,e4,g#4]@15 ~", D: "[g3,d4,g4]@15 ~", E: "[a3,d4,e4]@15 ~",
  F: "[f#3,a3,c#4]@15 ~", G: "[c#4,e4,g#4]@15 ~", H: "[f#3,b3,d#4,f#4]@15 ~", I: "[f#3,b3,d#4,f#4,b4]@15 ~",
  J: "[a3,b3,e4,g#4,b4,c#5]@15 ~", K: "[a3,c#4,e4,a4]@15 ~", L: "[a3,c#4,e4]@15 ~", M: "[e3,g#3,b3,e4]@15 ~",
  N: "[e3,g#3,b3,e4,g#4]@15 ~", O: "[e3,g#3,b3,e4]@5 ~ [c#4,f4,g#4,b4]@5 ~ [c#4,f4,g#4,b4]@3 ~",
  P: "[f#3,a3,c#4,f#4]@15 ~", Q: "[b3,d#4,f#4]@15 ~", R: "[e4@7 ~ d#4@7 ~@9 a4@7 ~, [b3,f#4,b4]@31 ~, ~@16 c#4@15 ~]/2",
  S: "[d3,f#3,a3,d4]@15 ~", T: "[a3,c#4,e4]@7 ~ e3@3 ~ f#3@2 g#3@2", U: "[c#3,e3,g#3,c#4]@15 ~",
  V: "[f#3,a3,c#4,f#4,a4]@15 ~", W: "[a3,d4,e4,a4]@15 ~", X: "[a3,d4,f#4,a4]@15 ~",
  Y: "[c4,g4]@2 [b3,f#4]@2 [a3,e4]@2 [g3,d4]@9 ~", Z: "[[e3,g#3,c#4,e4,g#4]@13 ~ [e3,b3]@4 [f#3,a3,c#4,f#4]@13 ~]/2",
  AA: "[d3,a3,d4,e4,a4]@15 ~", AB: "[e3,a3,c#4,e4,a4]@15 ~", AC: "[d3,f#3,a3,d4,a4]@15 ~",
  AD: "[g3,c4,g4]@7 ~ [g3,d4,g4]@7 ~", AE: "[e3,a3,c#4,e4]@15 ~", AF: "[c4,d4,g4]@15 ~", AG: "[g3,c4,d4,g4]@15 ~",
  AH: "[e3,g#3,b3,d4]@11 ~ [e3,a3,b3,d4]@3 ~", AI: "[e3,g#3,b3,d4,e4]@11 ~@5", AJ: "[d3,a3,e4]@15 ~",
})).s("gm_string_ensemble_2").gain(0.16).pan(0.6)

// chords · string ensemble 2 · "Staff-4" · soft notes
const string_ensemble_2_soft = note("<~@125 A@5 B@2 ~>".pickRestart({
  A: "[a3,b3,e4,a4]@15 ~", B: "[[e3,a3,c#4,e4]@31 ~]/2",
})).s("gm_string_ensemble_2").gain(0.06).pan(0.6)

// drums · kick
const kick = s("bd").struct(`<
  ~@18 A B@14 C B@3 C B@13 C B@14 C B D E@7 D E@15 C E@13 F E@7 G E@8 F E C@2 ~@6
>`.pickRestart({
  A: "~@7 x", B: "x ~@6 x", C: "x", D: "x ~@3 x ~ x!2", E: "x ~@2 x!2 ~@2 x", F: "x ~@5 x!2", G: "x ~ x ~@3 x!2",
})).gain(0.25).pan(0.6)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@125 [~@3 x!2 ~@2 x]!2 [x ~@2 x!2 ~@2 x]!3 ~@3>").gain(0.1).pan(0.6)

// drums · rim
const rim = s("rim").struct("<~@34 [~ x]!4 ~@95>").gain(0.45).pan(0.6)

// drums · snare
const snare = s("sd").struct("<~@38 A@13 ~ A@14 ~ A B ~ A@6 B ~ A@14 ~ A@13 ~ A@7 C A@8 ~ A ~@8>".pickRestart({
  A: "~ x", B: "~@4 x ~ x!2", C: "~ x ~@2",
})).gain(0.45).pan(0.6)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@125 [~ x]!5 ~@3>").gain(0.1).pan(0.6)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@19 A@14 B C@3 D C@13 ~ C@7 E C@6 ~ C D F C@6 D F C@11 F C@2 ~ C@13 ~ C@7 E F C@7 ~ C ~@8
>`.pickRestart({
  A: "~ x", B: "x", C: "x!4", D: "x!3 ~", E: "x ~ x ~ x ~@2 x", F: "~ x!3",
})).gain(0.45).pan(0.6)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@125 [x!4]!5 ~@3>").gain(0.1).pan(0.6)

// drums · mid tom
const mid_tom = s("mt").struct("<~@68 [~@4 x ~ x!2] ~@7 [~@4 x ~ x!2] ~@56>").gain(0.35).pan(0.6)

// drums · open hat
const open_hat = s("oh").struct("<~@33 A ~@3 A ~@13 A ~@7 A ~@6 A ~@25 A ~@13 A ~@7 A ~@8 A ~@9>".pickRestart({
  A: "~@3 x",
})).gain(0.45).pan(0.6)

// drums · crash
const crash = s("cr").struct("<~@51 A ~@14 A ~@2 A ~@7 A ~@14 B ~@13 A ~@8 A ~@7 A ~@9>".pickRestart({
  A: "x", B: "x!2 ~@14",
})).gain(0.2).pan(0.6)

// drums · ride
const ride = s("rd").struct("<~@89 [x!2 ~@14] ~@43>").gain(0.45).pan(0.6)

stack(
  acoustic_guitar_steel, string_ensemble_1, string_ensemble_2, string_ensemble_2_soft, kick, kick_soft, rim, snare,
  snare_soft, hihat, hihat_soft, mid_tom, open_hat, crash, ride
)

More by Heart