Strudelify

New York Groove

Ace Frehley

KeyF majorTempo94 bpm
0:00/0:00
// New York Groove — Ace Frehley
// 94 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 71 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(94/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 · electric bass pick · "Ace (Bass)"
const bass = note(`<
  ~@4 A@7 B C@2 A B A@3 D E F E F E F A@2 G@5 H I@2 G H G@3 J K L K L K L G@2 K L K L K L K L K L K L K L K L K L K L ~
>`.pickRestart({
  A: "e2 ~@2 e2 ~@2 e2 ~@3 e2 ~ e2 ~@3", B: "b1 ~@2 b1 ~@2 b1 ~@3 b1 ~ b1 ~@3", C: "a1 ~@2 a1 ~@2 a1 ~@3 a1 ~ a1 ~@3",
  D: "e2 ~@2 e2 ~@2 e2 ~@3 e2 ~ e2 ~ b1@2", E: "e1 ~ e2@5 b1", F: "a1@2 ~@2 a1@2 ~@2 a1@2 ~ b1!4 ~",
  G: "f2 ~@2 f2 ~@2 f2 ~@3 f2 ~ f2 ~@3", H: "c2 ~@2 c2 ~@2 c2 ~@3 c2 ~ c2 ~@3",
  I: "bb1 ~@2 bb1 ~@2 bb1 ~@3 bb1 ~ bb1 ~@3", J: "f2 ~@2 f2 ~@2 f2 ~@3 f2 ~ f2 ~ c2@2", K: "f2 ~ f2@5 c2",
  L: "bb1@2 ~@2 bb1@2 ~@2 bb1@2 ~ c2!4 ~",
})).s("gm_electric_bass_pick").gain(0.44)

// chords · distortion guitar · "Ace (Gtr 1)"
const distortion_guitar = note(`<
  ~@2 A@9 B C@2 A B A@4 D E F E F E A@2 G@5 H I@2 G ~ G@4 J K J K J K G@2 J K J K J K J K J K J K J K J K J K J K ~
>`.pickRestart({
  A: "e3 ~ e3!2 ~ e3!2 ~ e3!3 ~ e3 ~ e3!2", B: "b2 ~ b2!2 ~ b2!2 ~ b2!3 ~ b2 ~ b2!2",
  C: "a3 ~ a3!2 ~ a3!2 ~ a3!3 ~ a3 ~ a3!2", D: "~ [e2,e3,b3,e4]@3",
  E: "[a2,e3,a3,db4]@2 ~@2 [a2,e3,a3,db4]@2 ~@2 [a2,e3,a3,db4]@2 ~ [b2,gb3,b3,eb4]!4 ~", F: "e2 [e2,e3,b3,e4]@3",
  G: "f3 ~ f3!2 ~ f3!2 ~ f3!3 ~ f3 ~ f3!2", H: "c3 ~ c3!2 ~ c3!2 ~ c3!3 ~ c3 ~ c3!2",
  I: "bb2 ~ bb2!2 ~ bb2!2 ~ bb2!3 ~ bb2 ~ bb2!2", J: "~ [f3,c4,f4]@3",
  K: "[bb2,f3,bb3,d4]@2 ~@2 [bb2,f3,bb3,d4]@2 ~@2 [bb2,f3,bb3,d4]@2 ~ [c3,g3,c4,e4]!4 ~", // Bb C
})).s("gm_distortion_guitar").gain(0.29).pan(0.9)

// chords · distortion guitar · "Ace (Gtr 2)"
const distortion_guitar_2 = note("<~@4 A@7 B C@2 A B A@4 D@2 E@4 A@2 F@5 G H@2 F G F@4 I@6 J@2 I@20 ~>".pickRestart({
  A: "[e2,e3,b3,e4] ~ [e3,b3,e4] [e2,e3,b3,e4] ~ [e3,b3,e4] [e2,e3,b3,e4] ~ [e3,b3,e4]!2 [e2,e3,b3,e4] ~ [e2,e3,b3,e4] ~ [e3,b3,e4]!2", // E5
  B: "[b2,gb3,b3,eb4] ~ [gb3,b3,eb4] [b2,gb3,b3,eb4] ~ [gb3,b3,eb4] [b2,gb3,b3,eb4] ~ [gb3,b3,eb4]!2 [b2,gb3,b3,eb4] ~ [b2,gb3,b3,eb4] ~ [gb3,b3,eb4]!2", // B
  C: "[a2,e3,a3,db4] ~ [e3,a3,db4] [a2,e3,a3,db4] ~ [e3,a3,db4] [a2,e3,a3,db4] ~ [e3,a3,db4]!2 [a2,e3,a3,db4] ~ [a2,e3,a3,db4] ~ [e3,a3,db4]!2", // A
  D: "[~ [e2,e3,b3,e4]@7]/2", E: "[~@4 [e2,e3,e4]@29 ~@3 [e2,e3,b3,e4]@28, ~@4 b3@27 ~@33]/4",
  F: "[f3,c4,f4] ~ [f3,c4,f4]!2 ~ [f3,c4,f4]!2 ~ [f3,c4,f4]!3 ~ [f3,c4,f4] ~ [f3,c4,f4]!2", // F5
  G: "[c3,g3,c4,e4] ~ [g3,c4,e4] [c3,g3,c4,e4] ~ [g3,c4,e4] [c3,g3,c4,e4] ~ [g3,c4,e4]!2 [c3,g3,c4,e4] ~ [c3,g3,c4,e4] ~ [g3,c4,e4]!2", // C
  H: "[bb2,f3,bb3,d4] ~ [f3,bb3,d4] [bb2,f3,bb3,d4] ~ [f3,bb3,d4] [bb2,f3,bb3,d4] ~ [f3,bb3,d4]!2 [bb2,f3,bb3,d4] ~ [bb2,f3,bb3,d4] ~ [f3,bb3,d4]!2", // Bb
  I: "[~ [f2,f3,c4,f4]@7]/2", // F5
  J: "[f2,f3,c4,f4] ~ [f3,c4,f4] [f2,f3,c4,f4] ~ [f3,c4,f4] [f2,f3,c4,f4] ~ [f3,c4,f4]!2 [f2,f3,c4,f4] ~ [f2,f3,c4,f4] ~ [f3,c4,f4]!2", // F5
})).s("gm_distortion_guitar").gain(0.29).pan(0.1)

// chords · distortion guitar · "Ace (Gtr 3)"
const distortion_guitar_3 = note(`<
  ~@3 A@4 B ~@9 C ~ C ~@6 D@2 E@2 ~ F ~@7 G ~ G ~@6 E@2 ~ H ~ H ~ H ~ I ~ I ~ I J I J I J I J I ~
>`.pickRestart({
  A: "~@7 [a4,d5]", B: "~@8 b4 ~ [a4,db5] ~ [g4,ab4,b4]@2 ~@2, ~@7 [bb4,d5]@2 ~@7",
  C: "[b3,e4,ab4]!8 [b3,e4,a4] ~ [a3,d4,gb4] ~ [b3,e4,ab4] ~@3", D: "[a4,d5]@3 ~@13", E: "[bb4,eb5]@3 ~@13",
  F: "~ a4 ~ [bb4,d5] ~@2 a4 ~ [c5,eb5] ~ [bb4,d5] ~@2 a4@2 ~, [ab4,c5]@2 ~@3 [ab4,c5]@2 ~@5 [ab4,c5]@2 ~@2", // Bb Cm Bb Ab
  G: "[c4,f4,a4]!8 [c4,f4,bb4] ~ [bb3,eb4,g4] ~ [c4,f4,a4] ~@3", H: "~@10 [eb4,gb4]@2 [eb4,gb4]@2 [eb4,gb4] ~",
  I: "[db4,e4]@2 ~ [d4,g4] ~ [db4,e4]@2 ~@4 e4 ~ e4 ~@2, ~@5 [eb4,g4]!2 ~", // Dbm G5 Dbm Eb
  J: "[ab4,b4]@2 ~ [c5,f5] ~@2 a4 ~@4 a4 ~ a4 ~@2, ~@5 [ab4,c5]@2 ~@3 [ab4,c5]@2 [ab4,c5]@2 ~@2", // Abm F5 Ab
})).s("gm_distortion_guitar").gain(0.29)

// drums · kick
const kick = s("bd").struct(`<
  [x!4]!19
  [x ~ x ~ x ~ x!2]
  [x!4]!21
  [x ~ x ~ x ~ x!2]
  [x!4]!7
  [x ~ x ~ x ~ x!2]
  [x!4]!20
  ~
>`).gain(0.54)

// drums · clap
const clap = s("cp").struct("<[x!4]!70 ~>").gain(0.36)

// drums · hihat
const hihat = s("hh").struct("<[x!14 ~@2]!70 ~>").gain(0.36)

// drums · open hat
const open_hat = s("oh").struct("<[~@7 x]!70 ~>").gain(0.36)

// drums · shaker
const shaker = s("sh").struct("<[x!16]!70 ~>").gain(0.3)

stack(bass, distortion_guitar, distortion_guitar_2, distortion_guitar_3, kick, clap, hihat, open_hat, shaker)