Strudelify

Have You Seen Her

MC Hammer

KeyF majorTempo70 bpm
0:00/0:00
// Have You Seen Her — MC Hammer
// 70 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 66 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(70/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(`<
  ~@2 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ R AK AL AM Q R S T U V W X Y Z
  AA AB AC AN ~@10
>`.pickRestart({
  A: "f1 ~@6 f1!2 ~@5 g1 ab1", B: "a1 ~@6 e1 a1 ~@3 a1@3 ~", C: "bb1 ~@6 f1 bb1 ~@5 bb1@2",
  D: "c2 ~@6 c2!2 ~@3 c2 d2 f2@2", E: "f1@2 ~@5 f1!2 ~@5 g1 ab1", F: "a1@2 ~@5 e1 a1 ~@2 a0 a1@3 ~",
  G: "bb1@2 ~@5 f1 bb1@2 ~@4 bb1 ~", H: "c2@2 ~@5 c2!2 ~@3 c2 d2 f2 ~", I: "f1 ~@6 f1 ~@3 f1 f0 ~ f0 f1",
  J: "a0 ~@6 a0!2 ~@2 a0 a0@2 f1 a0", K: "bb0@2 ~@5 bb0@2 ~@3 bb0@3 ~", L: "c1@2 ~@5 c1!2 ~@3 c1 d1 f1@2",
  M: "f0 ~@6 f0 f0@2 ~@2 f1 f0 g0@2", N: "a0@2 ~@5 a0 a0@2 ~@6", O: "bb0@2 ~@5 bb0!2 ~@3 bb0@3 f0",
  P: "c1 ~@6 c1!2 ~ c1@3 ~ c1 d1", Q: "f1 ~@6 f1!2 ~@6 f1", R: "f1 ~@6 f1!2 ~@7", S: "g1@2 ~@5 g1 c2 ~@7",
  T: "f1@2 ~@5 f1!2 ~@7", U: "f1 ~@6 f1!2 ~@5 c1@2", V: "f1@2 ~@5 f1!2 ~@2 f1!2 f0 f1@2", W: "g1@2 ~@5 g1 c2@2 ~@5 c2",
  X: "f1@2 ~@5 f1 f1@2 ~@6", Y: "bb1!3 ~@5 bb1@4 a1 ~@3", Z: "g1@6 ~ g1 g1@8", AA: "f1@5 ~@2 f1!2 ~@5 f1!2",
  AB: "f1@2 ~@5 f1!2 ~@3 f1@3 f1", AC: "g1 ~@6 g1!2 ~@7", AD: "g1 ~@4 g1!2 g0 g1 ~@3 g1@4", AE: "c2 ~@6 c2!2 ~@5 g1 a1",
  AF: "c2 ~@6 c2!2 ~ c2@5 ~", AG: "f1 ~@6 f1!2 ~@5 c1 d1", AH: "f1 ~@6 f1!2 ~@4 f1 f0 f1", AI: "g1@2 ~@5 g1 c2 ~@6 c2",
  AJ: "f1@2 ~@5 f1!2 ~ c1@3 ~ c1 d1", AK: "f1@2 ~@5 f1!2 ~@3 f1@4", AL: "g1@2 ~@3 g1 c2 g1 c2@2 ~@5 c2",
  AM: "f1 ~@6 f1!2 ~ c1@3 ~ c1 d1", AN: "g1 ~@4 g1 ~@10",
})).s("gm_acoustic_bass").gain(0.45)

// bass · acoustic bass · "ACOU BASS" · soft notes
const bass_soft = note("<~@3 A ~@6 B ~@44 C D E ~@8>".pickRestart({
  A: "~@11 a0 ~@4", B: "~@8 f1 ~@7", C: "~@6 g1 g0 g1 ~@3 g1@4", D: "c2 ~@6 c2!2 ~@5 g1 a1", E: "c2 ~@6 c2!2 ~ c2@5 ~",
})).s("gm_acoustic_bass").gain(0.15)

// other · piano · "A.PIANO 1"
const piano = note("<~@2 A B C D@2 B C E@2 B C E@2 B C F@7 G@8 H I@8 J@3 K J@3 K L ~@2 M N O@2 H P ~@8>".pickRestart({
  A: "c5@4 ~@4 f5@4 g5@2 a5 [c5,bb5], ~@4 c5@11 ~", B: "c5@6 c5 [a4,a5], c6@7 ~",
  C: "[bb4,bb5] [a4,a5] [g4,g5] [f4,f5]", // Bb A G F
  D: "[[c5,a5]@8 c5@4 c5@3 c5 c5@4 ~@4 f5@4 g5@2 [a4,a5] [bb4,bb5], ~@4 g5@6 c5@5 ~]/2", // F A Bb
  E: "[a5@8 ~@4 c5@3 c5 c5@4 ~@4 f5@4 g5@2 [a4,a5] [bb4,bb5], c5@6 ~@4 c5@5 ~, ~@2 g5@3 ~@3]/2", // A Bb
  F: "[a5@46 f5 d5 g5@2 d5@10 ~ d5 f5 d5 g5@2 a5@44 f5 d5, c5@15 c5@13]/7",
  G: "[g5@2 d5@10 ~ d5 f5 d5 g5@2 ~@46 c4@8 db4@8 d4@8 eb4@8 d4@16 d4@16, ~@3 c5@13 ~@16, ~@9 a5@55]/8", H: "f4 e4",
  I: "[f4@10 f4@4 d4 ~@31 f5 d5 g5@2 d5@10 c5 d5 f5 d5 g5@2 a5@44 f5 d5 g5@2 d5@10 c5 d5 f5 d5, ~@15 e4@113]/8",
  J: "[g5@2 a5@44 f5 d5]/3", K: "g5@2 d5@10 c5 d5 f5 d5", L: "g5@2 a5@3 ~@11", M: "c4 db4", N: "d4 eb4", O: "d4",
  P: "f4@10 f4@4 d4 e4",
})).s("gm_piano").gain(0.36)

// other · alto sax
const alto_sax = note("<~@27 A B C@2 D E F ~@17 A B G@2 H ~@10>".pickRestart({
  A: "~@4 c5@3 bb4 g4@2 g4@2 ~@2 a4 bb4", B: "c5@13 ~ d5 f4",
  C: "[~ ab4 g4 f4@7 a4@2 g4 f4 d4 f4@3 ~@2 [f4,gb4,g4,ab4] ~@3 f4 e4 [d4,eb4] f4@3 ~ d4, a4@2 ~@8 ab4 ~@9 a4@3 ~@9]/2", // Ebmaj7
  D: "d5@2 a4@2 a4@3 a4 g4@2 e4@2 ~ a4 c5 a4, db5 ~@15", E: "c5 ~ g4@8 ~@2 g4!2 a4 g4", F: "c5 g4@5 a4 ~@9",
  G: "[~ ab4 [gb4,g4] f4@7 a4@2 g4 f4 d4 f4@3 ~@2 [f4,gb4,g4,ab4] ~@3 f4 e4 [d4,eb4] f4@3 ~ d4, a4@2 ~@8 ab4 ~@9 a4@3 ~@9]/2", // Gmaj7 Ebmaj7
  H: "d5@2 a4@2 a4@3 a4 g4@3 ~@5, db5 ~@15",
})).s("gm_alto_sax").gain(0.48)

// other · alto sax · soft notes
const alto_sax_soft = note(`<
  ~@29
  [~@2 gb4 ~@13]
  ~@25
  [~@10 e4@2 ~ a4 c5 a4]
  [c5 ~ g4@8 ~@2 g4!2 a4 g4]
  [c5 g4@5 a4 ~@9]
  ~@8
>`).s("gm_alto_sax").gain(0.24)

// chords · rock organ · "ORGAN 2"
const rock_organ = note("<~ A B ~@23 C ~@2 D ~@20 C ~@2 D ~@12>".pickRestart({
  A: "~@12 [b3,c4,d4,e4,f4,g4,a4] [f2,g2,a2,b2,c3,db3,d3,e3,f3,g3,a3] [a2,b2] [c3,d3,e3,f3,g3]", B: "[a3,b3] ~@15",
  C: "[bb3,d4,f4] ~ [bb3,d4,f4] ~@13", D: "d4 ~",
})).s("gm_rock_organ").gain(0.22).pan(0)

// chords · rock organ · "ORGAN 2" · soft notes
const rock_organ_soft = note("<~ A ~@24 B ~ C D ~@20 B ~ C D ~@12>".pickRestart({
  A: "~@14 g2 ~", B: "~ [bb3,d4,f4] ~@14", C: "c4 db4", D: "~ eb4",
})).s("gm_rock_organ").gain(0.13).pan(0)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@2 A@2 B C D@2 B E D@2 F@2 D@2 B G H@2 B I J@2 K@2 L M N@2 O@2 P@2 H@2 B I J@2 Q@2 H@2 B I J@2 K@2 L M N@2 O@2 ~@10
>`.pickRestart({
  A: "[[a3,f4]@15 ~ [g3,e4]@16, c4@31 ~]/2", B: "[f3,bb3,d4]", C: "[f3,a3]@7 ~ [e3,g3]@8, c4",
  D: "[[a3,f4] [g3,e4], c4]/2", E: "[f3,a3]@7 ~ [e3,g3]@7 ~, c4@15 ~", F: "[[bb3,d4]@2 a3 [g3,e4], f3@23 ~@9, ~ c4]/2",
  G: "[f3,a3,c4]@7 ~@3 [f3,bb3,d4]@5 ~", H: "[f4 e4 d4 ~, c4, a3@15 ~]/2", I: "[f3,a3,c4]@15 ~",
  J: "[f4 e4 d4 ~, [a3,c4]]/2", K: "[[bb3,d4]@16 [a3,c4]@15 ~, f3@31 ~]/2", L: "~ [bb3,d4,f4]@2 [g3,c4,e4]",
  M: "[f3,bb3,d4]@15 ~", N: "[c4 db4 d4 eb4, [f3,a3]]/2", O: "[f3,b3,d4]/2",
  P: "[[bb3,d4,f4]@8 [g3,e4]@8 [d4,f4]@7 ~@3 [bb3,d4,f4]@5 ~, ~@8 bb3@15 ~@9]/2", // Bb C Dm Bb
  Q: "[[bb3,d4]@16 [a3,c4]@7 ~@3 [bb3,d4,f4]@6, f3@31 ~]/2", // Bb Am Bb
})).s("gm_string_ensemble_1").gain(0.36)

// chords · string ensemble 1 · "STRINGS" · soft notes
const string_ensemble_1_soft = note("<~@56 A@2 ~@8>".pickRestart({
  A: "[[bb3,d4,f4]@8 [g3,e4]@8 [d4,f4]@7 ~@3 [bb3,d4,f4]@5 ~, ~@8 bb3@15 ~@9]/2", // Bb C Dm Bb
})).s("gm_string_ensemble_1").gain(0.15)

// drums · kick
const kick = s("bd").struct(`<
  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 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 C D ~@10
>`.pickRestart({
  A: "x ~@4 x!2 ~ x ~@7", B: "x ~@6 x!2 ~@7", C: "x!2", D: "x",
})).gain(0.64)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@54 [~@5 x!2 ~@9] [~@7 x!2 ~@7] [x ~@4 x!2 ~ x ~@7] [x ~@6 x!2 ~@7] ~@8>")
  .gain(0.32)

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!2 ~@64>").gain(0.8)

// drums · snare
const snare = s("sd").struct("<~ [~@12 x!2 ~@2] [~ x ~ x]!53 ~@11>").gain(0.56)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@55 [~ x ~ x]!3 ~@8>").gain(0.32)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  A B C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D E ~@2 F
  ~@8
>`.pickRestart({
  A: "~@3 x ~ x ~@5 x ~ x ~@2", B: "~@3 x ~@7 x ~@4", C: "~@3 x ~ x ~@3 x ~ x ~ x ~@2", D: "~@3 x ~@3 x ~@3 x ~ x ~@2",
  E: "~@3 x ~@9 x ~@2", F: "~@3 x!2 ~ x!10",
})).gain(0.24)

// drums · shaker
const shaker = s("sh").struct(`<
  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 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 A C
  ~@8
>`.pickRestart({
  A: "~@2 x ~ x ~ x!5 ~ x ~@3", B: "~ x!2 ~ x ~ x!5 ~ x ~ x!2", C: "~ x!2 ~ x ~ x!5 ~ x ~ x ~",
})).gain(0.56)

// drums · claves
const claves = s("clave:2").struct("<[~@9 x ~@6]!58 ~@8>").gain(3.14)

// drums · rim
const rim = s("rim").struct(`<
  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 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 C D ~@10
>`.pickRestart({
  A: "x ~@4 x!2 ~ x ~@7", B: "x ~@6 x!2 ~@7", C: "x!2", D: "x",
})).gain(0.72)

// drums · rim · soft notes
const rim_soft = s("rim").struct("<~@54 [~@5 x!2 ~@9] [~@7 x!2 ~@7] [x ~@4 x!2 ~ x ~@7] [x ~@6 x!2 ~@7] ~@8>")
  .gain(0.32)

stack(
  bass, bass_soft, piano, alto_sax, alto_sax_soft, rock_organ, rock_organ_soft, string_ensemble_1,
  string_ensemble_1_soft, kick, kick_soft, clap, snare, snare_soft, hihat, hihat_soft, shaker, claves, rim, rim_soft
)

More by MC Hammer