Strudelify

Forget Him

Bobby Rydell

KeyG♯ minorTempo81 bpm
0:00/0:00
// Forget Him — Bobby Rydell
// 81 bpm, 4/4, key G# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 41 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(81/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 · "ACOU BASS"
const bass = note("<A@2 B C D E F G H I B C D J K L M N O P Q R S T U V O P Q W X Y Z AA X Y AB@2 AC@3>".pickRestart({
  A: "d#2 a#1 d#2 a#1", B: "d#2@4 a#1@4 d#2@4 a#1@3 ~", C: "g2 d2 g2 d2", D: "g#2 d#2 f2 c2",
  E: "a#1@2 f1@2 a#1@2 f1 ~", F: "g2@4 d2@4 g1@4 d2@3 ~", G: "c2@4 g1@3 ~ c2@3 ~ a#1@3 ~", H: "f2@4 c2@3 ~ f2@4 c2@3 ~",
  I: "g#2@4 b1@3 ~ a#1@4 f2@2 a#2 ~", J: "g2@4 d2@3 ~ g1@3 ~ d2@3 ~", K: "c2@3 ~ c2@3 ~ a#1@3 ~ a#1@3 ~",
  L: "g#1@3 ~ g#1@3 ~ f2@3 ~ f2@3 ~", M: "d#2@3 ~ c2@3 ~ f2@4 a#1@3 ~", N: "d#2@3 ~ a#1@3 ~ b1 ~ b1@2 c#2@2 d#2 ~",
  O: "e2@4 b1@4 e2@4 b1@3 ~", P: "g#2 d#2 g#2 d#2", Q: "a2 e2 f#2 c#2", R: "b1@2 f#1@2 b1@2 f#1 ~",
  S: "g#2@4 d#2@4 g#1@4 d#2@3 ~", T: "c#2@4 g#1@3 ~ c#2@3 ~ b1@3 ~", U: "f#2@4 c#2@3 ~ f#2@4 c#2@3 ~",
  V: "a2@4 c2@3 ~ b1@4 f#2@2 b2 ~", W: "g#2@4 d#2@3 ~ g#1@3 ~ d#2@3 ~", X: "c#2@3 ~ c#2@3 ~ b1@3 ~ b1@3 ~",
  Y: "a1@3 ~ a1@3 ~ f#2@3 ~ f#2@3 ~", Z: "e2@3 ~ c#2@3 ~ f#2@4 b1@3 ~", AA: "e2@3 ~ b1@3 ~ e2@4 g#1@3 ~",
  AB: "[~ e2@4 c#2@5 f#2@5 b1@11 ~@2 e2@4]/2", AC: "[b1@2 e2@2 b1@2 e2@13 ~@5]/3",
})).s("gm_acoustic_bass").gain(0.56)

// chords · piano · "A.PIANO 2"
const piano = note(`<
  A B C D E F G H I J C D E K L M N O P Q R S T U V W P Q R X Y Z AA AB Y AC AD@2 AE@3
>`.pickRestart({
  A: "~@2 [a#3,d#4,g4]!2 ~@2 [a#3,d#4,g4]!2 ~@2 [a#3,d#4,g4]!2 a#1@2 [a#3,d#4,g4]!2, d#2 a#1 d#2 ~", // D#
  B: "~@2 [a#3,d#4,g4]!2 a#1@2 [a#3,d#4,g4]!2 d#2@2 [a#3,d#4,g4]!2 a#1@2 [a#3,d#4,g4]!2, d#2 ~@3", // D#
  C: "~@2 [a#3,d#4,g4]!2 a#1@2 [a#3,d#4,g4]!2 ~@2 [a#3,c4,d#4,g4]!2 a#1@2 [a#3,c4,d#4,g4]!2, d#2 ~ d#2 ~", // D# Cm7
  D: "~@2 [g3,a#3,d4,g4]!2 ~@2 [g3,a#3,d4,g4]!2 ~@2 [g3,a#3,d4,g4]!2 ~@2 [g3,a#3,d4,g4]!2", // Gm
  E: "~@2 [c4,d#4,g#4]!2 ~@2 [c4,d#4,g#4]!2 ~@2 [c4,f4,g#4]!2 ~@2 [c4,f4,g#4]!2", // G# Fm
  F: "~@2 [a#3,d4,f4]!2 ~@2 [a#3,d4,f4]!2 ~@2 [a#3,d4,f4]!2 ~@2 [a#3,d4,f4]!2", // A#
  G: "~@2 [b3,d4,f4]!2 ~@2 [b3,d4,f4]!2 ~@2 [b3,d4,f4]!2 ~@2 [b3,d4,f4]!2", // Bdim
  H: "~@2 [c4,d#4,g4]!2 ~@2 [c4,d#4,g4]!2 ~@2 [c4,d#4,g4]!2 ~@2 [a#3,d#4,g4]!2", // Cm D#
  I: "~@2 [a3,c4,d#4,f4]!2 ~@2 [a3,c4,d#4,f4]!2 ~@2 [a3,c4,d#4,f4]!2 ~@2 [a3,c4,d#4,f4]!2", // F7
  J: "~@2 [g#3,b3,d#4]!2 ~@2 [g#3,b3,d#4]!2 ~@2 [a#3,d4,f4]!2 ~@2 [a#3,d4,f4] ~", // G#m A#
  K: "~@2 [f3,b3,d4]!2 ~@2 [f3,b3,d4]!2 ~@2 [f3,b3,d4]!2 ~@2 [f3,b3,d4] ~", // Bdim
  L: "~@2 [c4,d#4,g4]!2 ~@2 [c4,d#4,g4]!2 ~@2 [a#3,d#4,g4]!2 ~@2 [a#3,d#4,g4]!2", // Cm D#
  M: "~@2 [g#3,c4,d#4]!2 ~@2 [g#3,c4,d#4]!2 ~@2 [a3,c4,d#4,f4]!2 ~@2 [a3,c4,d#4,f4]!2", // G# F7
  N: "~@2 [a#3,d#4,g4]!2 ~@2 [c4,d#4,g4]!2 ~@2 [c4,f4,g#4]!2 ~@2 [a#3,d4,f4]!2", // D# Cm Fm A#
  O: "~@2 [a#3,d#4,g4]!2 ~@2 [a#3,d#4,g4]!2 [b2,f#3,b3] ~ [b2,b3,d#4]@2 [c#4,e4]@2 [d#4,f#4] ~", // D# B5 B C#m D#m
  P: "~@2 [b3,e4,g#4]!2 b1@2 [b3,e4,g#4]!2 ~@2 [b3,c#4,e4,g#4]!2 b1@2 [b3,c#4,e4,g#4]!2, e2 ~ e2 ~", // E C#m7
  Q: "~@2 [g#3,b3,d#4,g#4]!2 ~@2 [g#3,b3,d#4,g#4]!2 ~@2 [g#3,b3,d#4,g#4]!2 ~@2 [g#3,b3,d#4,g#4]!2", // G#m
  R: "~@2 [c#4,e4,a4]!2 ~@2 [c#4,e4,a4]!2 ~@2 [c#4,f#4,a4]!2 ~@2 [c#4,f#4,a4]!2", // A F#m
  S: "~@2 [b3,d#4,f#4]!2 ~@2 [b3,d#4,f#4]!2 ~@2 [b3,d#4,f#4]!2 ~@2 [b3,d#4,f#4]!2", // B
  T: "~@2 [c4,d#4,f#4]!2 ~@2 [c4,d#4,f#4]!2 ~@2 [c4,d#4,f#4]!2 ~@2 [c4,d#4,f#4]!2", // Cdim
  U: "~@2 [c#4,e4,g#4]!2 ~@2 [c#4,e4,g#4]!2 ~@2 [c#4,e4,g#4]!2 ~@2 [b3,e4,g#4]!2", // C#m E
  V: "~@2 [a#3,c#4,e4,f#4]!2 ~@2 [a#3,c#4,e4,f#4]!2 ~@2 [a#3,c#4,e4,f#4]!2 ~@2 [a#3,c#4,e4,f#4]!2", // F#7
  W: "~@2 [a3,c4,e4]!2 ~@2 [a3,c4,e4]!2 ~@2 [b3,d#4,f#4]!2 ~@2 [b3,d#4,f#4] ~", // Am B
  X: "~@2 [f#3,c4,d#4]!2 ~@2 [f#3,c4,d#4]!2 ~@2 [f#3,c4,d#4]!2 ~@2 [f#3,c4,d#4] ~", // Cdim
  Y: "~@2 [c#4,e4,g#4]!2 ~@2 [c#4,e4,g#4]!2 ~@2 [b3,e4,g#4]!2 ~@2 [b3,e4,g#4]!2", // C#m E
  Z: "~@2 [a3,c#4,e4]!2 ~@2 [a3,c#4,e4]!2 ~@2 [a#3,c#4,e4,f#4]!2 ~@2 [a#3,c#4,e4,f#4]!2", // A F#7
  AA: "~@2 [b3,e4,g#4]!2 ~@2 [c#4,e4,g#4]!2 ~@2 [c#4,f#4,a4]!2 ~@2 [b3,d#4,f#4]!2", // E C#m F#m B
  AB: "~@2 [b3,e4,g#4]!2 ~@2 [b3,e4,g#4]!2 ~@2 [b3,e4,g#4]!2 ~@2 [g#3,c4,d#4]!2", // E G#
  AC: "~@2 [a3,c#4,e4]!2 ~@2 [a3,c#4,e4]!2 ~@2 [a#3,c#4,e4,f#4]!2 ~@3 [a#3,c#4,e4,f#4]", // A F#7
  AD: "[[a#3,c#4,e4,f#4] [e3,b3,e4,g#4]@4 [c#3,g#3,c#4,e4,g#4]@5 [f#3,a3,c#4,f#4,a4]@5 [b2,b3,d#4,f#4]@13 ~@2 [b3,e4,g#4]!2]/2", // F#7 E C#m F#m B E
  AE: "[~@2 [b3,e4,g#4]!2 ~@2 [b3,e4,g#4]!2 ~@2 [b3,e4,g#4]!2 [e2,e3,b3,e4,g#4]@28 ~@8]/3", // E
})).s("gm_piano").gain(0.56)

// chords · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note(`<
  A@2 B@2 C D E F G H B@2 C I J K L M N@2 O P Q R S T N@2 O U V W X Y V Z AA@5
>`.pickRestart({
  A: "~@6 [d#3,a#3,d#4,g4]!3 ~@7", // D#
  B: "[~ [d#4,g4]@2 [d#4,g4]@2 [d#4,g4]@2 g3 g3 [a#3,d4] ~ [g2,g3,a#3,d4]@2 [g3,a#3,d4]@2 [g3,a#3,d4], [d#3,g3,a#3]@7 [d#3,a#3,d#4,g4]@2 g3@2 ~@2 g2@3]/2", // D# A# Gm D#
  C: "~ [g#3,c4,d#4]@2 [g#3,c4,d#4]@2 [f3,c4,d#4]@2 [f3,c4,d#4], g#2@5 ~@3", // G# F7
  D: "~ [a#3,d4,f4]@2 [a#3,d4,f4]@2 [a#3,d4,f4]@2 [a#3,d4,f4], a#2", // A#
  E: "~ [g3,b3,d4]@2 [g3,b3,d4]@2 [g3,b3,d4]@2 [g3,b3,d4], ~ g2@7", // G
  F: "~ [c4,d#4]@2 [c3,c4,d#4]@2 [c4,d#4,g4]@2 [c4,d#4,g4], c3@3 ~@2 c3@3", // Cm
  G: "~ [a3,c4,f4]@2 [f3,a3,c4,f4]@2 [a3,c4,f4]@2 [a3,c4,f4], ~@5 f3@3", // F
  H: "~@2 [g#3,b3,d#4]@4 [g#3,b3,d#4]@2 ~@2 [a#3,d4,f4]@4 [a#2,a#3,d4,f4] ~, g#2@4 a#2@3 ~", // G#m A#
  I: "~@2 [g3,b3,d4]@3 ~@3 [g3,b3,d4]@3 [g3,b3,d4]@3 [g3,b3,d4]@2, g2@5 g2@2 g2@9, ~@3 [g3,b3,d4] ~@4", // G
  J: "~@7 c4 ~@7 d#4, c3@2 a#2!2, ~ g3@3 g4@4 ~@3 g4@5, ~@2 c4@4 d#4@2 ~@2 d#4@3 d#4@2 ~, ~@3 d#4@2 g3@3 ~ a#3@5 a#3@2",
  K: "~@6 g#3 c4 d#3 ~@5 a3 ~, g#2@7 ~@9, ~ d#3@6 ~@2 f3@2 ~@2 f3@2 ~, ~@2 g#3@3 c4@2 ~@3 a3@2 a3@2 ~@2, ~@3 c4 d#4@3 ~@4 c4@4 ~",
  L: "[d#3,g3,a#3] [c3,d#3,g3] [f3,g#3,c4] [a#3,d4,f4]", // D# Cm Fm A#
  M: "[d#3,g3,a#3]@5 ~@8 f#3 a3 ~, ~@8 b2@7 ~, ~@9 f#3@4 ~@3, ~@5 b3!2 ~, ~@11 d#4@3 ~@2", // D#
  N: "[~ [e4,g#4]@2 [e4,g#4]@2 [e4,g#4]@2 g#3 g#3 [b3,d#4] ~ [g#2,g#3,b3,d#4]@2 [g#3,b3,d#4]@2 [g#3,b3,d#4], [e3,g#3,b3]@7 [e3,b3,e4,g#4]@2 g#3@2 ~@2 g#2@3]/2", // E B G#m E
  O: "~ [a3,c#4,e4]@2 [a3,c#4,e4]@2 [f#3,c#4,e4]@2 [f#3,c#4,e4], a2@5 ~@3", // A F#7
  P: "~ [b3,d#4,f#4]@2 [b3,d#4,f#4]@2 [b3,d#4,f#4]@2 [b3,d#4,f#4], b2", // B
  Q: "~ [g#3,c4,d#4]@2 [g#3,c4,d#4]@2 [g#3,c4,d#4]@2 [g#3,c4,d#4], ~ g#2@7", // G#
  R: "~ [c#4,e4]@2 [c#3,c#4,e4]@2 [c#4,e4,g#4]@2 [c#4,e4,g#4], c#3@3 ~@2 c#3@3", // C#m
  S: "~ [a#3,c#4,f#4]@2 [f#3,a#3,c#4,f#4]@2 [a#3,c#4,f#4]@2 [a#3,c#4,f#4], ~@5 f#3@3", // F#
  T: "~@2 [a3,c4,e4]@4 [a3,c4,e4]@2 ~@2 [b3,d#4,f#4]@4 [b2,b3,d#4,f#4] ~, a2@4 b2@3 ~", // Am B
  U: "~@2 [g#3,c4,d#4]@3 ~@3 [g#3,c4,d#4]@3 [g#3,c4,d#4]@3 [g#3,c4,d#4]@2, g#2@5 g#2@2 g#2@9, ~@3 [g#3,c4,d#4] ~@4", // G#
  V: "~@7 c#4 ~@7 e4, c#3@2 b2!2, ~ g#3@3 g#4@4 ~@3 g#4@5, ~@2 c#4@4 e4@2 ~@2 e4@3 e4@2 ~, ~@3 e4@2 g#3@3 ~ b3@5 b3@2",
  W: "~@6 a3 c#4 e3 ~@5 a#3 ~, a2@7 ~@9, ~ e3@6 ~@2 f#3@2 ~@2 f#3@2 ~, ~@2 a3@3 c#4@2 ~@3 a#3@2 a#3@2 ~@2, ~@3 c#4 e4@3 ~@4 c#4@4 ~",
  X: "[e3,g#3,b3] [c#3,e3,g#3] [f#3,a3,c#4] [b3,d#4,f#4]", Y: "[e3,g#3,b3]@5 ~@3 [b3,e4,g#4]@4 [g#3,c4,d#4]@2 ~@2",
  Z: "~@6 a3 c#4 e3 ~@4 f#3@2 a#3, a2@7 ~@9, ~ e3@6 ~@2 f#3@2 ~@5, ~@2 a3@3 c#4@2 ~@3 a#3@2 a#3@2 ~@2, ~@3 c#4 e4@3 ~@4 c#4@5",
  AA: "[~ [e3,g#3,b3]@4 [c#3,e3,g#3]@5 [f#3,a3,c#4]@5 [b2,d#3,f#3]@13 ~@15 b3 [e2,e3,g#3,b3]@21 ~@15, ~@28 e3@5 e3@4 e3@4 e3@3 ~@36, ~@15 g#3 g#3!6 ~@18, ~@31 b3@4 b3@4 b3@4 ~@37]/5", // E C#m F#m B E
})).s("gm_acoustic_guitar_nylon").gain(0.38)

// chords · string ensemble 2 · "SLOWSTRIN"
const string_ensemble_2 = note(`<
  ~@2 A B C D E F G H A B C I J K L M ~ N O ~ P Q ~@2 R S T U V W X Y V Z AA@5
>`.pickRestart({
  A: "[g3,a#3,d#4] [g3,c4,d#4]", B: "[a#3,d4,g4]", C: "[c4,d#4,g#4] f4", D: "[a#3,d4,f4]", E: "[b3,d4,g4]",
  F: "c4@6 a#3 ~, [d#4,g4]@7 ~", G: "[a3,c4,f4]", H: "[g#3,b3,d#4]@8 [a#3,d4,f4]@7 ~", I: "[f3,b3,d4]",
  J: "[c4,d#4,g4]@8 [a#3,d#4,g4]@7 ~", K: "[g#3,c4,d#4]@3 ~ [d#3,a3,c4]@4",
  L: "[a#3,d#4,g4]@4 [c4,d#4,g4]@4 [g#3,c4,d#4]@4 [a#3,d4,f4]@3 ~", // D# Cm G# A#
  M: "[a#3,d#4,g4]@8 [d#4,d#5] ~ [d#4,d#5]@2 [e4,c#5,e5]@2 [f#4,d#5,f#5] ~, ~@2 b4 ~", N: "~@2 b5 g#5", O: "a5@7 ~@9",
  P: "c6", Q: "c#6@2 c6 b5", R: "[g#3,b3,e4] [g#3,c#4,e4]", S: "[b3,d#4,g#4]", T: "[c#4,e4,a4] f#4", U: "[f#3,c4,d#4]",
  V: "[c#4,e4,g#4,e5]@2 g#5 b5, ~@8 [b3,e4,g#4]@7 ~", W: "[a3,c#4,e4]@3 ~ [e3,a#3,c#4,f#6]@4, e6 ~",
  X: "[b3,e4,g#4,b5]@4 [c#4,e4,g#4]@4 [a3,c#4,e4]@4 [b3,d#4,f#4,d#6]@3 ~, ~ c#6@2 ~", // E C#m A B
  Y: "[b3,e4,g#4]@8 ~@4 d#6@3 ~, e6@3 ~", Z: "[a3,e4,e6] [e3,a#3,c#4,f#6], c#4@3 ~@5",
  AA: "[~ [b4,b5]@4 c#4@5 a4@5 [b3,d#6]@12 ~@17 g#4@24 ~@12, ~ [e4,g#4]@9 f#4@16 ~@2 [e4,b4,g#5,b5]@40 ~@12, ~@5 c#6@9 ~@66]/5", // B E
})).s("gm_string_ensemble_2").gain(0.31)

// other · tubular bells · "TUBULARBE"
const tubular_bells = note("<A@2 ~@16 B C D E ~@2 F G ~@4 H I ~ J H I ~ K L@2 ~>".pickRestart({
  A: "[~@10 [a#4,a#5] ~ [g#4,g#5] [g4,g5]@5 ~@8 [a#4,a#5] ~ [g#4,g#5] [g4,g5] ~@2]/2", // A# G# G A# G# G
  B: "~@2 [e4,e5] ~ [f#4,f#5] [g#4,g#5]@4 ~ [e4,e5]!2 [f#4,f#5] ~ [g#4,g#5] ~", C: "[b4,b5]@3 ~ [g#4,g#5]@8 ~@4",
  D: "~@2 [a4,a5]@2 [b4,b5] [c#5,c#6]@4 ~ [a4,a5]!2 [b4,b5] [c#5,c#6]@2 ~", E: "[d#5,d#6] ~, [b4,b5]@3 ~@5",
  F: "f#5 ~@7 a#5 ~@3 c#6 ~@3", G: "a5 ~@3 c6 ~@3 b5 ~@3 f#5 ~@3", H: "e5@2 g#5 b5", I: "e6@4 f#6@3 ~",
  J: "e5@3 ~ e6 ~@3 b5 ~@3 d#6 ~@3", K: "~@14 [e4,e5]!2",
  L: "[[f#4,f#5] ~ [g#4,g#5]@3 ~ [e4,e5]!2 [f#4,f#5] ~ [g#4,g#5] ~ [b4,b5]@20, ~@6 [g#4,g#5]@7 ~@3]/2", // F# G# E F# G# B G#
})).s("gm_tubular_bells").gain(0.59)

// drums · kick
const kick = s("bd").struct("<[x!4]!36 [~ x ~@3 x ~@4 x ~@4 x] [~@3 x] [x!4] ~@2>").gain(0.67)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x ~ x ~ x]!35 [~@2 x ~@3 x ~@3 x!2 ~ x ~ x] x [~@7 x] [~ x ~ x ~ x ~@2] ~@2>")
  .gain(0.2)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  [~@3 x ~@3 x ~@3 x ~@3 x]!35
  [~@3 x ~@3 x ~@8]
  ~
  [~@15 x]
  [~@3 x ~@3 x ~@3 x ~@4]
  ~@2
>`).gain(0.13)

// drums · hihat
const hihat = s("hh").struct(`<
  [x!8]!35
  [x ~ x ~ x ~ x ~ x ~@3 x ~@2 x]
  ~
  [~@7 x!2 ~@2 x!2 ~ x ~]
  [x ~ x ~@2 x ~@3 x ~ x ~@4]
  ~@2
>`).gain(0.67)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!35
  [~ x ~ x ~ x ~ x ~ x ~ x ~@4]
  x
  [~@4 x!2 ~@3 x ~@3 x ~ x]
  [~ x ~@4 x!2 ~@8]
  ~@2
>`).gain(0.2)

// drums · open hat
const open_hat = s("oh").struct("<~@35 [~@10 x ~@2 x ~@2] [~ x ~@14] [~@3 x ~ x ~@2] [~@3 x!2 ~@3 x ~ x ~ x ~@3] ~@2>")
  .gain(0.67)

// drums · ride
const ride = s("rd").struct("<~@36 [~ x ~@3 x ~@4 x ~@4 x] ~ [~@3 x!4 ~] ~@2>").gain(0.67)

stack(
  bass, piano, acoustic_guitar_nylon, string_ensemble_2, tubular_bells, kick, snare, snare_soft, hihat, hihat_soft,
  open_hat, ride
)