Strudelify

Zing Went the Strings of My Heart

The Trammps

KeyE majorTempo122 bpm
0:00/0:00
// Zing Went the Strings of My Heart — The Trammps
// 122 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 94 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(122/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 · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~ A B C D E F G H I J K L M N H O I J P Q@5 R S T U M N H O I J P Q@5 R V R@2 A B C D E F G H I J W L M N H O I J P
  Q@5 R V R@2 M N H O I J P@2 M N H O I J P@2 A B C D X
>`.pickRestart({
  A: "[e4,e5] ~@2 [e4,e5]!2 ~@2 [e4,e5] ~@3 [e4,e5]!2 ~@2 [e4,e5]", // E
  B: "[e4,e5] ~@2 [e4,e5]!2 ~@2 [e4,e5] ~ [e4,e5] ~@2 [e4,e5] ~@2 [e4,e5]", // E
  C: "[e4,e5] ~@2 [e4,e5]!2 ~@2 [e4,e5] ~ [e4,e5] ~ [e4,e5]!2 ~@2 [e4,e5]", D: "[e4,e5] ~@2 [e4,e5]!2 ~@11",
  E: "~@2 [g#3,b3,e4,g#4] ~ [g#3,b3,e4]!2 ~@2 [b3,e4,g#4] ~@2 [g#3,b3,e4,g#4] ~@2 [g#3,b3,e4,g#4] ~", // E
  F: "~@2 [g#3,b3,e4,g#4] ~ [b3,e4,g#4] [g#3,b3,e4] ~@2 [b3,e4,g#4] ~@2 [g#3,b3,e4,g#4] ~@2 [b3,e4] ~", // E E5
  G: "~@2 [b3,c#4,e4,g#4] ~ [b3,c#4,e4,g#4] [c#4,e4] ~@2 [b3,c#4,e4,g#4] ~@2 [b3,c#4,e4,g#4] ~@2 [b3,c#4,e4,g#4] ~", // C#m7 C#m C#m7
  H: "~@2 [b3,c#4,e4,g#4] ~ [b3,c#4,e4,g#4] [b3,c#4,e4] ~@2 [b3,c#4,e4,g#4] ~@2 [b3,c#4,e4,g#4] ~@2 [b3,c#4,e4,g#4] ~", // C#m7
  I: "~@2 [a3,c#4,e4,a4] ~ [a3,c#4,e4,a4] [a3,c#4,e4] ~@2 [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4] ~", // A
  J: "~@2 [a3,c#4,e4,a4] ~ [a3,c#4,e4,a4]!2 ~@2 [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4] ~@2 [a3,c#4,e4,a4] ~", // A
  K: "~@2 [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4] [b3,d#4,f#4] ~@2 [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,g#4,b4] ~@2 [b3,d#4,f#4,b4] ~", // B G#m7 B
  L: "~@2 [b3,d#4,f#4,b4] ~ [d#4,f#4] [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,b4] ~", // B D#m B
  M: "~@2 [g#3,b3,g#4] ~ [g#3,c4,e4,g#4]!2 ~@2 [g#3,b3,e4,g#4] ~@2 [g#3,b3,e4,g#4] ~@2 [g#3,b3,e4,g#4] ~", // G#m G#aug E
  N: "~@2 [g#3,b3,e4,g#4] ~ [g#3,b3,e4] [b3,e4] ~@2 [g#3,b3,e4,g#4] ~@2 [g#3,b3,e4,g#4] ~@2 [g#3,b3,e4] ~", // E E5 E
  O: "~@2 [b3,c#4,e4,g#4] ~ [b3,c#4,e4,g#4] e4 ~@2 [b3,c#4,e4,g#4] ~@2 [b3,c#4,e4,g#4] ~@2 [b3,c#4,e4,g#4] ~", // C#m7
  P: "~@2 [b3,d#4,f#4,b4] ~ [b3,d#4,f#4] [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,g#4,b4] ~", // B G#m7
  Q: "[[b3,d#4] ~ [b3,d#4,b4] ~ [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4] ~ [c#4,f4] ~ [a3,c#4,e4]@8 ~@2 [c#4,e4,f#4]@6 ~@2 g#4@5 ~@3 f#4@5 ~@3 e4@7 ~ [c4,f#4]@6 ~@2 g4@7 ~ [c4,f#4]@4 [a3,c4,e4]@2 ~@2, ~@23 a3@7 ~ a3@7 ~ a3@5 ~@3 [a3,c4]@7 ~ a3@7 a3@8 ~ a3@4 ~@5, ~@63 [c4,e4]@7 ~@10]/5", // B C# A F#7 Cdim Am C
  R: "~@2 [g#3,b3,e4,g#4] ~@2 [b3,e4,g#4] ~@2 [g#3,b3,e4] ~@2 [g#3,b3,e4] ~@2 [b3,e4] ~", // E E5
  S: "~@2 [b3,c#4,e4,g#4] ~@2 [b3,c#4,e4,g#4] ~@2 [b3,c#4,e4,g#4] ~@2 [b3,c#4,e4,g#4] ~@2 [b3,c#4,e4,g#4] ~", // C#m7
  T: "~@2 [a3,c#4,f#4,a4] ~@2 [a3,c#4,f#4,a4] ~@2 [a3,c#4,f#4,a4] ~@2 [a3,c#4,f#4,a4] ~@2 [a3,c#4,f#4,a4] ~", // F#m
  U: "~@2 [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,b4] ~", // B
  V: "~@2 [a3,c#4,f#4,a4] ~@2 [a3,c#4,f#4,a4] ~@4 [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,b4] ~@2", // F#m B
  W: "~@2 [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4] [b3,d#4,f#4] ~@2 [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,b4] ~@2 [b3,d#4,f#4,b4] ~", // B
  X: "~@2 [g#3,b3,e4,g#4] ~ [g#3,b3,e4]!2 ~@2 [b3,e4,g#4] ~@7", // E
})).s("gm_electric_guitar_clean").gain(0.27).pan(0.7)

// chords · electric guitar clean · "CLEAN GTR" · soft notes
const electric_guitar_clean_2 = note(`<
  ~@5 A B C ~ D ~ E ~@2 F ~ G D ~ H I ~ J ~@2 K ~@4 F ~ G D ~ H I ~ J ~@2 K ~ K@2 ~@4 A B C ~ D ~@4 F ~ G D ~ H I ~ J
  ~@2 K ~ K@2 ~ F ~ G D ~ H@2 ~ F ~ G D ~ H@2 ~@4 A
>`.pickRestart({
  A: "~@4 g#4 ~@3 g#3 ~@7", B: "~@5 g#4 ~@2 g#3 ~@5 [g#3,g#4] ~", C: "~@5 b3 ~@10", D: "~@5 a4 ~@10", E: "~@8 g#4 ~@7",
  F: "~@4 g#4 g#3 ~@8 g#4 ~", G: "~@5 c#4 ~@10", H: "~@11 g#4 ~@4", I: "[f#4,b4] ~ f#4 ~@13",
  J: "[c#4,e4]@7 [c#4,e4]@5 ~@4", K: "~@5 g#3 ~@2 g#4 ~@2 g#4 ~@2 [g#3,g#4] ~",
})).s("gm_electric_guitar_clean").gain(0.16).pan(0.7)

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  A B@2 C@2 D E F G H I J K L M N O P Q R S@2 T U V W X Y K L M N O P Q R S@2 T U V Z AA AB AC B@2 C@2 D E F G H I J K L
  M N O P Q R S@2 T U V Z AA AB AC L M N O P Q R@2 L M N O P Q AD AE B@2 C@2 AF
>`.pickRestart({
  A: "~@10 b1 ~ c#2 ~ e1@2", B: "[e2@23 ~ b1 c#2 ~ d2 ~ c#2 b1 ~]/2", C: "[d2@23 ~ b1 c#2 ~ d2 ~ c#2 b1 ~]/2",
  D: "e1@2 e1@3 ~@2 e1 b1 ~ b1@4 c#2 b1", E: "e2@6 ~ b1 c#2@2 e2@2 b1 ~ c2@2",
  F: "c#2 ~ c#2@3 ~ f#2 g2 g#2 ~ g#2@3 ~ g#2 ~", G: "c#3 ~ c#3 ~ c#3@2 ~ b2 c#3 b2 ~ g#2 ~ f#2 e2 c#2",
  H: "a1 ~ a1@4 e2 f#2 a2 ~ a2@3 ~ a2 e2", I: "a1 ~ a1@4 ~ a1 e1@2 f#1@2 a1 ~ a#1 ~",
  J: "b1 ~ b1 ~ b1@3 f#1 b1 ~ b1@2 f#1 ~ a1 ~", K: "b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~",
  L: "e2 ~ e2@2 b1@2 c#2 ~ e2 ~ e2 ~ b1@2 c#2@2", M: "e2 ~ e2 ~ b1 ~ c#2 ~ e2 ~ e2 ~ b1@2 e2@2",
  N: "c#2 ~ c#2 ~ g#1@2 b1@2 c#2 ~ c#2 ~ g#1@2 b1 ~", O: "c#2 ~ c#2 ~ g#1@2 b1 ~ c#2 ~ c#2 ~ g#1@2 c#2@2",
  P: "a1 ~ a1 ~ e1@2 f#1 ~ a1 ~ a1 ~ e1 ~ f#1 ~", Q: "a1 ~ a1 ~ e1@2 f#1 ~ a1 ~ a1 ~ e1@2 a1@2",
  R: "b1 ~ b1 ~ f#1@2 a1 ~ b1 ~ b1 ~ f#1 ~ a1 ~",
  S: "[b1 ~ b1@2 f#1 ~ a1@2 b1 ~ b1@2 a#1@2 a1@4 a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~]/2",
  T: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ e1 ~ f#1 ~ a1@2", U: "~@2 a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~",
  V: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ b1 ~ c#2 ~", W: "e2 ~ e2 ~ b1 ~ c#2 ~ e2 ~ e2 ~ b1@2 e2 ~",
  X: "c#2 ~ c#2@2 g#1@2 b1 ~ c#2 ~ c#2 ~ g#1@2 c#2@2", Y: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~",
  Z: "e2 ~ e2 ~ e2@2 ~ e2 b1@2 e2 ~ b1@2 e2 f2", AA: "f#2 ~ f#2 ~ f#2@2 a2 f#2 b1 ~ b1 ~ b1 ~ d2 d#2",
  AB: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~", AC: "e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 b1 d2 d#2",
  AD: "b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~", AE: "b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1!2 d2 d#2",
  AF: "e1@2 e1 ~ e1!2 ~@2 e1 ~@7",
})).s("gm_fretless_bass").gain(0.49)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note("<~ A B C D ~@40 A B C D ~@40 A B C D ~>".pickRestart({
  A: "e5 ~ e4 e5!2 ~ e4 e5 ~ e4 ~ e5!2 ~@2 e5", B: "e5 ~ e4 e5!2 ~@2 e5 ~ e5 ~ e4 e5 ~ e4 e5",
  C: "e5 ~ e4 e5!2 ~@2 e5 ~ e5 e4 e5!2 ~@2 e5", D: "e5 ~@2 e5!2 ~@11",
})).s("gm_electric_guitar_muted").gain(0.38).pan(0.3)

// other · tuba
const tuba = note(`<
  ~@13 A B C@2 D E F ~ G H I@2 J@2 ~@14 K L M ~@13 N@2 O P Q R S ~ G H I@2 K L M ~ T@2 U@2 V@2 W X Y@2 Z@2 AA@2 W AB AC
  ~@4
>`.pickRestart({
  A: "~@4 b3@5 ~ g#3@3 ~ f#3@2", B: "e3@2 f#3 ~@2 g#3@7 ~@4", C: "[~@4 c#4@7 ~ g#3@2 ~ f#3@3 e3@2 f#3@2 g#3@6 ~@4]/2",
  D: "~@4 c#4@6 ~ a3@2 ~ g#3@2", E: "f#3@6 ~@4 b3@3 c#4@2 ~", F: "d#4", G: "~@4 g#4@6 f#4 ~ e4 ~ f#4@2",
  H: "e4@2 ~ e4@4 ~@9", I: "[~@4 g4@5 ~ f#4 ~ e4 ~ f#4@6 e4@2 e4@3 ~@7]/2", J: "[e3@11 ~@5]/2",
  K: "e3@7 ~ e3@3 ~ e3@3 ~", L: "f#3@7 ~ f#3@3 ~ f#3@3 ~", M: "e3 ~",
  N: "[~@4 b3@5 ~ g#3@3 ~ f#3@4 e3@2 f#3 ~ g#3@3 ~@7]/2", O: "~@4 c#4@5 ~ e4@2 c#4 ~ g#4@2", P: "f#4@2 ~ e4@4 ~@9",
  Q: "~@4 c#4@6 a3@3 g#3@2 ~", R: "f#3 ~ f#3@5 ~@3 b3@2 ~ c#4@2 ~", S: "d#4@11 ~@5", T: "[e3@22 ~@2 e3@3 ~ b3@3 ~]/2",
  U: "[c#4@22 ~@2 c#4@2 a3@2 ~ g#3@2 ~]/2", V: "[f#3@25 ~@3 b3 ~ c#4@2]/2", W: "b3@13 ~ f#3 ~",
  X: "b3@3 ~ a3@3 ~ g#3@3 ~ f#3@4", Y: "[e3@25 ~ e3@2 ~ b3@2 ~]/2", Z: "[c#4@23 ~ c#4@2 ~ a3@2 g#3@2 ~]/2",
  AA: "[f#3@23 ~ f#3@4 c#4@3 ~]/2", AB: "b3@4 a3@4 g#3@3 ~ f#3@4", AC: "e3@3 ~",
})).s("gm_tuba").gain(0.4).pan(0.6)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  A B@4 C ~@6 D E@2 F@2 G@2 H@2 I J I K L M N O E@2 F@2 G@2 H@2 I J I K P Q R@2 B@4 C ~@6 D E@2 F@2 G@2 H@2 I J I K P Q
  R@2 E@2 F@2 G@2 S@2 E@2 F@2 G@2 S@2 B@4 T
>`.pickRestart({
  A: "~@12 [b3,g#4] [c#4,d#4,a4,b4] [e4,c#5] [f#4,d#5]", // E B7 C#m D#m
  B: "[e5@32 d5@26 ~@2 [b3,g#4] [c#4,d#4,a4,b4] [e4,c#5] [f#4,d#5], [b3,g#4]@29 ~@3]/4", C: "[b3,g#4,e5] ~@15",
  D: "~@12 [c#4,a4] [d#4,b4] [e4,c#5] [f#4,d#5], ~@5 [g#3,e4] ~@2, ~@11 [b3,g#4]@2 ~@3", // F#m G#m C#m D#m C#m E
  E: "[e5@28 g#4 [f#4,d#5] [e4,c#5] [d#4,b4], b3, g#4@27 ~@5]/2", F: "[[c#4,c#5]@15 c4, g#4]/2",
  G: "[[e4,a4]@14 [e4,g#4] [g#4,c#5], c#4]/2", H: "[[d#4,f#4,b4]@25 ~@7]/2", I: "e4 f#4", J: "g#4 f#4",
  K: "g4@8 f#4@4 e4 ~@2 [b3,c#4]", L: "e4@6 f#4 g#4, d4 ~@15", M: "c#4@11 ~ c#4@2 g#4@2", N: "f#4",
  O: "g#4@3 ~ f#4@2 ~@2 e4@2 f#4@3 ~@3", P: "[b3,g#4,e5], d4 ~@15", Q: "[c#4,a4] [b3,b4], f#4",
  R: "[[b3,g#4,e5]@26 ~@2 [b3,g#4] [c#4,d#4,a4,b4] [e4,c#5] [f#4,d#5]]/2", S: "[d#4,f#4,b4]",
  T: "[b3,g#4,e5]@5 ~@3 [b3,g#4,e5] ~@7", // E
})).s("gm_string_ensemble_1").gain(0.33).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~ A@4 B@15 C B@15 C B@6 D@2 A@4 B@15 C B@6 D@2 B@7 C B@6 D@2 A@4 E>".pickRestart({
  A: "x!2", B: "x!2 ~@2 x!2 ~@2", C: "x!2 ~@2 x!4", D: "x!8", E: "x!2 ~@2 x ~@3",
})).gain(0.38)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~ A@3 B ~@15 C ~@15 C ~@6 D ~ A@3 B ~@15 C ~@6 D ~@15 D ~ A@3 B ~>".pickRestart({
  A: "~@5 x ~@7 x ~@2", B: "~@5 x ~@10", C: "~@3 x ~@4", D: "x!2 ~@6",
})).gain(0.22)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@43 [x!7 ~] ~@27 [x!7 ~] ~@15 [x!7 ~] ~@6>").gain(0.27)

// drums · open hat
const open_hat = s("oh").struct("<~ A@3 B ~@39 C A@3 B ~@23 C ~@15 C A@3 B ~>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~@4", C: "~@7 x",
})).gain(0.49)

// drums · crash
const crash = s("cr").struct("<~@13 A ~@6 B ~@8 A ~@6 B A ~@3 A ~@15 A ~@6 B ~@4 A ~@3 A ~@6 C A ~@11 D>".pickRestart({
  A: "x", B: "~@5 x!3", C: "~@4 x!4", D: "x!2 ~@2 x ~@3",
})).gain(0.44)

// drums · tambourine
const tambourine = s("tb").struct("<~@5 A@8 B@7 C B@15 C B@6 D ~@5 A@8 B@7 C B@6 D ~ B@14 D ~@5 E>".pickRestart({
  A: "~ x ~ x", B: "x!4", C: "x!3 ~", D: "x", E: "~@4 x!2 ~@2 x ~@7",
})).gain(0.44)

// drums · cowbell
const cowbell = s("cb").struct("<~@13 A@7 B A@15 B A@6 C ~@13 A@7 B A@6 C ~ A@14 C ~@6>".pickRestart({
  A: "x!4", B: "x!3 ~", C: "x",
})).gain(0.33)

stack(
  electric_guitar_clean, electric_guitar_clean_2, bass, electric_guitar_muted, tuba, string_ensemble_1, kick, snare,
  snare_soft, hihat, hihat_soft, open_hat, crash, tambourine, cowbell
)

More by The Trammps