Strudelify

(and) Then He Kissed Me

Crystals

KeyG majorTempo120 bpm
0:00/0:00
// (and) Then He Kissed Me — Crystals
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 63 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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 · acoustic bass · "Bass"
const bass = note(`<
  A B A C ~ A B D E F B G@2 H A H F A B I J A B D E F B G@2 H A H F A B I K L M N O P@2 Q R A B D E F B G@2 H A H F A B
  I S ~@2
>`.pickRestart({
  A: "g2@3 ~@5 d3@3 ~ g2@3 ~", B: "d2@3 ~@5 d3@3 ~ d2@3 ~", C: "d2@3 ~@13", D: "g2@3 ~ g2@2 d3@3 ~ d3@2 d2@3 ~",
  E: "g2@3 ~ g2@2 d3@3 ~ d3@2 d2@2 ~@2", F: "g2@3 ~@5 d3@3 ~ d2@3 ~",
  G: "[g2@3 ~ g2@2 g2@2 d3@2 d2@3 ~ g2@4 g2@3 ~ g2@2 a2@3 ~ b2@3 ~]/2", H: "c3@3 ~@5 c2@3 ~@5",
  I: "g2@3 ~@3 d3@3 ~ d3@2 d2@3 ~", J: "g2@3 ~ d2@3 ~ e2@3 ~ f#2@3 ~", K: "g2@3 ~ g2@3 ~ a2@3 ~ b2@3 ~",
  L: "c3@3 ~ g2@3 ~", M: "c2@5 ~ g2@5 ~ g2@3 ~", N: "c2@3 ~ g2@2 a2@3 ~ a2@2 b2@3 ~",
  O: "c3@3 ~ g2@2 a2@3 ~ b2@2 c3@3 ~", P: "[a2,g3]@13 ~@3", Q: "d3@3 ~ d2@2 d3@3 ~ d3@2 d2@3 ~",
  R: "d3@3 ~ d3@2 c3@3 ~ b2@2 a2@2 ~@2", S: "g2@3 ~ d2@3 ~ g1@3 ~@5",
})).s("gm_acoustic_bass").gain(0.6).pan(0.7)

// chords · synth brass 2 · "Brass"
const synth_brass_2 = note(`<
  ~@13 A B A B C D B E F G F H F G F H I F I F H G F H J@4 K@2 L@2 F G F H M N F H I F I F H G F H F O
>`.pickRestart({
  A: "~@4 g4@6 ~@2 g4@3 ~", B: "~@4 b4@5 ~ b4@2 b4@3 ~", C: "~@4 b4@6 ~@2 b4@3 ~", D: "~@4 c5@6 ~@2 c5@3 ~",
  E: "~@4 b4@6 ~@2 [b4,g5]@3 ~", F: "~@4 [b4,g5]@6 b4@2 [b4,g5]@3 ~", G: "~@4 [c5,f#5]@6 ~@2 [c5,f#5]@3 ~",
  H: "~@4 [b4,g5]@6 ~@2 [b4,g5]@3 ~", I: "~@4 [g4,e5]@6 ~@2 [g4,e5]@3 ~", J: "[[c4,e4,g4]@25 ~@7]/2",
  K: "[[a4,c#5,e5,g5]@13 ~@3]/2", L: "[[d4,f#4,a4,c5]@19 ~@13]/2", M: "[d4,g4,b4]@13 ~@3", N: "[d4,f#4,a4,c5]@13 ~@3",
  O: "~@4 [b4,g5]@3 ~@9", // Em
})).s("gm_synth_brass_2").gain(0.4)

// other · epiano1 · "Piano"
const epiano1 = note(`<
  ~@4 A B C@3 D E@3 F G H G I J K ~ B C@3 D E@3 F G H G I J K A L M N@2 O@2 P A B C@3 D E@3 F G H G I J Q@2 ~@2
>`.pickRestart({
  A: "~@12 d4@3 ~", B: "b3@3 ~ b3@2 b3@2 b3@3 ~ b3@2 b3@2",
  C: "[c4@2 c4@2 c4@2 c4@2 c4@2 ~@2 c4@2 [b3,g4]@22 ~@8 d4@3 ~]/3", D: "b3@3 ~ b3@2 b3@2 b3@2 b3@3 ~ c4@2",
  E: "[~ c4!4 ~ c4 [b3,g4]@11 ~@6]/3", F: "~@4 e4@2 e4@2 e4@3 ~ e4@3 ~", G: "d4@3 ~ b3@2 b3@3 ~@7",
  H: "~@2 g4@2 e4@2 e4@2 e4@3 ~ e4@3 ~", I: "b3@3 ~ b3@3 ~ b3@3 ~ b3@3 ~", J: "c4@3 ~ c4@2 c4@3 ~ c4@2 c4@2 d4@2",
  K: "c4@3 ~ b3@12", L: "[c4,e4]@3 ~ [c4,e4]@3 ~", M: "[c4,e4]@5 ~ [c4,e4]@5 ~ [a3,c4]@3 ~",
  N: "[[a3,c4,e4,g4]@22 ~@6 g4@3 ~]/2", O: "c#4@13 ~@3", P: "[c4,f#4,a4]", Q: "[[c4,a4]@3 ~ [b3,g4]@22 ~@6]/2",
})).s("gm_epiano1").gain(0.5).pan(0.3)

// chords · electric guitar muted · "Guitar"
const electric_guitar_muted = note(`<
  ~@5 A B C D A E C D F A G A H I J@2 K L M N K L O P G H Q H K L O P R@2 S T U V W X H E O P A B C D Y H Y H K E H M Z
  AA
>`.pickRestart({
  A: "~@2 [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,a#2]@2 b2 ~", // G5 Gm
  B: "~@2 [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,f3]@2 f#3 ~", // D5 Dm
  C: "[g2,d3]@2 g2 ~ [g2,e3] ~ g2 ~ [g2,d3]@2 g2 ~ [g2,e3] ~ d3@2, ~@14 g2 ~", // G5 C G5 C
  D: "g2 ~ [g2,d3] ~ [g2,e3] ~ g2 ~ a#2@2 b2@2 f2@2 g2 ~", // G5 C
  E: "[d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~ [d3,a3] ~", // D5
  F: "[c3,g3] ~ c3 ~ [c3,a3] ~ c3 ~ [c3,g3] ~ c3 ~ [c3,a3] ~ c3 ~", // C5 F C5 F
  G: "~@2 [c3,g3] ~ [c3,g3] ~ [c3,g3] ~@3 g3 ~ [c3,g3] ~ [c3,g3] ~", // C5
  H: "[g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~", // G5
  I: "[d3,a3] ~ d3 ~ [d3,b3] ~ d3 ~ [d3,a3] ~ d3 ~ [d3,b3] ~ d3 ~", // D5 G D5 G
  J: "[[g2,d3] ~ g2 ~ [g2,d3,e3] ~ g2 ~ [g2,d3] ~ g2 ~ [g2,e3] ~ [g2,g3]@4 g2 ~ [g2,e3] ~ g2 ~ [g2,d3] ~ g2 ~ [g2,e3] ~ g2 ~]/2", // G5 Em7 G5 C G C G5 C
  K: "~@2 [g2,d3] ~ [g2,d3] ~ [g2,d3] ~@3 d3 ~ [g2,d3] ~ [g2,d3] ~", // G5
  L: "~@2 [d3,a3] ~ [d3,a3] ~ [d3,a3] ~@3 a3 ~ [d3,a3] ~ [d3,a3] ~", // D5
  M: "[g2,d3] ~ g2 ~ [g2,e3] ~ g2 ~ [g2,d3] ~ g2 ~ [g2,e3] ~ g2 ~", N: "b2@2 d3@2 c3@2 a2 ~ b2@2 g2@2 a2@2 f2 ~",
  O: "[g2,d3] ~ g2 ~ [g2,e3] ~ g2 ~ [g2,d3] ~ g2 ~ [g2,e3] ~ g3@2, ~@14 g2 ~", // G5 C G5 C
  P: "g2 ~ [g2,g3] ~ [g2,f3]@2 [g2,e3]@2 [g2,d3]@2 g2 ~ a#2@2 b2@2", // G G7 C G5
  Q: "~@2 [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,d#3]@2 e3 ~", // C5 Cm
  R: "[[c3,g3] ~ c3 ~ [c3,g3,a3] ~ c3 ~ [c3,g3] ~ c3 ~ [c3,a3] ~ [c3,c4]@4 c3 ~ [c3,a3] ~ c3 ~ [c3,g3] ~ c3 ~ [c3,a3] ~ c3 ~]/2", // C5 Am7 C5 F C F C5 F
  S: "[c3,g3] ~ c3 ~ [c3,a3] ~ c3 ~ [c3,g3] ~ c3 ~ [c3,a3] ~ c4@2, ~@14 c3 ~", // C5 F C5 F
  T: "c3 ~ [c3,c4] ~ [c3,a#3]@2 [c3,a3]@2 [c3,g3]@2 c3 ~ d#3@2 e3@2", // C C7 F C5
  U: "[a2,e3] ~ [a2,e3] ~ [a2,f#3]@2 a2 ~ [a2,e3] ~ a2 ~ [a2,f#3] ~ [a2,g3]@2", // A5 D A5 D A7
  V: "~@2 [a2,g3] ~ [a2,f#3] ~ a2 ~ [a2,e3] ~ a2 ~ [a2,c3]@2 c#3 ~", // A7 D A5 Am
  W: "[d3,a3] ~ [d3,a3] ~ [d3,b3]@2 d3 ~ [d3,a3] ~ d3 ~ [d3,b3] ~ [d3,c4]@2", // D5 G D5 G D7
  X: "~@2 [d3,c4] ~ [d3,b3] ~ d3 ~ [d3,a3] ~ d3 ~ [d3,f3]@2 f#3 ~", // D7 G D5 Dm
  Y: "[c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~", // C5
  Z: "[g2,d3] ~ g2 ~ [g2,e3] ~ g2 ~ [g2,d3] ~ g2 ~ [g2,e3] ~ [g2,g3]@2", AA: "~@2 g3 ~ a#2@2 b2@2 g2@8",
})).s("gm_electric_guitar_muted").gain(0.3).pan(0.7)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@13 A B A B C D B C ~@8 A B A B C D B C E@4 F@2 G@2 ~@4 H I B C A B A B C D B C B J
>`.pickRestart({
  A: "[g4,e5]@3 [g4,e5]", B: "b4@5 b4 [b4,g5]@2, g5@3 ~", C: "[b4,g5]@3 [b4,g5]", D: "[c5,f#5]@3 [c5,f#5]",
  E: "[c4,e4,g4]/2", F: "[a4,c#5,e5,g5]/2", G: "[[d4,f#4,a4,c5]@3 ~]/2", H: "[d4,g4,b4]", I: "[d4,f#4,a4,c5]",
  J: "[b4,g5]@3 ~", // Em
})).s("gm_string_ensemble_1").gain(0.25).pan(0.3)

// chords · piano · "Piano Intro" · Em F Em F
const piano = note(`<
  [[b3,g4]@3 ~ [b3,g4]@2 [b3,g4]@3 ~ [b3,g4]@2 [b3,g4]@2 [b3,g4]@2]
  [[c4,a4]@3 ~ [c4,a4]@2 [c4,a4]@3 ~ [c4,a4]@2 [c4,a4]@2 [c4,a4]@2]
  [[b3,g4]@3 ~ [b3,g4]@2 [b3,g4]@3 ~ [b3,g4]@2 [b3,g4]@2 [b3,g4]@2]
  [[c4,a4]@3 ~@13]
  [g4@3 ~ d4@3 ~ e4@3 ~ f#4@3 ~]
  ~@58
>`).s("gm_piano").gain(0.3).pan(0.4)

// chords · pad new age · "Chords"
const pad_new_age = note(`<
  ~@5 A B C@2 D B C@2 E A F A G B C@2 A B C@2 D B C@2 E A F A G B C@2 H@2 I@2 J@2 K ~ A B C@2 D B C@2 E A F A D B L@2
  ~@2
>`.pickRestart({
  A: "[b3,d4,g4]@13 ~@3", B: "[c4,d4,f#4,a4]@13 ~@3", C: "[[b3,d4,g4]@29 ~@3]/2", D: "[d4,g4,b4]@13 ~@3",
  E: "[c4,e4,g4]@13 ~@3", F: "[c4,e4,g4,c5]@13 ~@3", G: "[g4,b4,d5]@13 ~@3", H: "[[c4,e4,g4]@29 ~@3]/2",
  I: "[[a3,c4,e4,g4]@11 ~@5]/2", J: "[[c#4,e4,g4,a4]@29 ~@3]/2", K: "[c4,d4,f#4,a4]", L: "[[d4,g4,b4]@29 ~@3]/2",
})).s("gm_pad_new_age").gain(0.5)

// other · vibraphone · "Keyboard"
const vibraphone = note("<A B A C ~@3 A D ~@2 A@2 ~@7 A ~@2 A D ~@2 A@2 ~@7 A ~@10 A D ~@2 A@2 ~@10>".pickRestart({
  A: "g4@3 ~ b4@2 c5@3 ~ b4@5 ~", B: "d4@3 ~ f#4@2 g4@3 ~ f#4@5 ~", C: "d4@3 ~@13", D: "g4@3 ~ b4@2 c5@3 ~ b4@3 ~@3",
})).s("gm_vibraphone").gain(0.5).pan(0.7)

// drums · kick
const kick = s("bd").struct(`<
  A B A@2 C A@3 D A@3 E A C@2 F A C G F A@3 C A@3 F A C A E A C A F A@3 H A B A E A B A E A@3 F A C A C A C A H I J
>`.pickRestart({
  A: "x!2 ~ x!3 ~ x", B: "x!2 ~ x!3 ~@2", C: "x ~@2 x!3 ~ x", D: "~@7 x", E: "x ~@2 x ~@3 x", F: "x ~@2 x ~@4",
  G: "x ~@2 x!2 ~@2 x", H: "x ~@2 x!2 ~@3", I: "x", J: "~ x",
})).gain(0.55)

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

// drums · low tom
const low_tom = s("lt").struct("<~@8 A ~@3 B ~@19 B ~@7 C ~@3 B ~@3 B ~@11 C ~ D>".pickRestart({
  A: "~@5 x!2 ~", B: "~@5 x ~@2", C: "~@4 x!3 ~", D: "~ x ~@2",
})).gain(0.55)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<A@8 ~ A@3 B A@3 B A@3 B A@7 C A@3 B A@3 B A@7 B A@3 B A@3 B A@9 ~>".pickRestart({
  A: "~ x ~@6", B: "~ x ~ x ~@4", C: "~@3 x ~@4",
})).gain(0.28)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 A ~@3 B ~@19 B ~@11 B ~@3 B ~@13 C>".pickRestart({
  A: "~@3 x!2 ~@3", B: "~ x", C: "~ x ~@6",
})).gain(0.55)

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

// drums · high tom
const high_tom = s("ht").struct("<~@8 [x!3 ~@5] ~@54>").gain(0.48)

// drums · crash
const crash = s("cr").struct("<A ~@7 B ~@4 A ~@3 A ~@7 A ~@3 A ~@3 A ~@11 A ~@7 A ~@3 A ~@3 A C>".pickRestart({
  A: "x", B: "~@7 x", C: "~ x",
})).gain(0.48)

// drums · ride
const ride = s("rd").struct(`<
  ~@5 A ~@3 A ~@3 B@3 ~ B@2 C ~ A ~@7 B D B ~ B@3 ~ A ~@3 A ~@7 A ~@3 B@3 ~ B@3 ~@3
>`.pickRestart({
  A: "x", B: "x!4", C: "x ~@3 x ~ x!3 ~@3 x ~@3", D: "x ~@3 x ~@3 x ~ x!3 ~ x!2",
})).gain(0.62)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@4 A ~@3 A ~@3 A B@3 A B@3 A ~@3 A ~@3 A B@3 A B@3 A ~@3 A ~@3 A ~@3 A ~@3 A B@3 A B@3 A B C
>`.pickRestart({
  A: "~ x ~ x", B: "x!8", C: "x!3 ~ x ~@3",
})).gain(0.35)

// drums · cowbell
const cowbell = s("cb").struct(`<
  ~@4 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A B C
>`.pickRestart({
  A: "x!2", B: "x!4", C: "x!2 ~@2",
})).gain(0.35)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@13 A@6 B ~@9 A@6 B ~ C@6 A B ~@8 A@6 B ~ C D>".pickRestart({
  A: "x!8", B: "x!4 ~@4", C: "x!2", D: "x",
})).gain(2.45)

stack(
  bass, synth_brass_2, epiano1, electric_guitar_muted, string_ensemble_1, piano, pad_new_age, vibraphone, kick, snare,
  low_tom, hihat, hihat_soft, mid_tom, open_hat, high_tom, crash, ride, tambourine, cowbell, cabasa
)

More by Crystals