Strudelify

Tighter, Tighter

Alive

KeyE♭ majorTempo90 bpm
0:00/0:00
// Tighter, Tighter — Alive
// 90 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 40 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(90/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 · "base"
const bass = note("<A@3 B A@2 C A@3 C A D E D F G H G I A@2 C A@3 C A D E D F G H G I G H G ~>".pickRestart({
  A: "eb2@3 eb2 eb2@4 eb2@3 eb2 bb1 c2 eb2@2", B: "eb2@3 eb2 eb2@4 eb2@4 bb1@4", C: "eb2@3 eb2 eb2@4 eb2@3 eb2 eb2@4",
  D: "ab2@3 ab2 ab2@4 ab2@3 ab2 ab2@4", E: "bb2@3 bb2 bb2@4 bb2@3 bb2!4 a2", F: "bb2@3 bb2 bb2@4 bb2@3 bb2@3 bb1@2",
  G: "db2@3 db2 db2@4 db2@3 db2 db2@4", H: "eb2@3 eb2 eb2@4 eb2@3 eb2!4 d2", I: "db2@3 db2 db2@4 db2@3 db2!5",
})).s("gm_electric_bass_pick").gain(0.72)

// chords · rock organ · "organ"
const rock_organ = note(`<
  A B C D E B F D E B F D G@2 H@2 I@2 J K E B C D E B F D G@2 H@2 I@2 J K I@2 ~@2
>`.pickRestart({
  A: "[g4,bb4,eb5]@11 [bb4,d5,g5] ~ [bb4,d5,g5] [bb4,d5,f5]@2", // Eb Gm Bb
  B: "[ab4,c5,eb5]@11 [ab4,c5,g5]@2 [ab4,c5,g5] [ab4,c5,f5]@2", // Ab Abmaj7 Fm
  C: "[g4,bb4,eb5]@11 [d5,g5,c6] ~ [d5,g5,c6] [d5,g5,bb5]@2", D: "[ab4,c5,eb5]@10 g5 eb5 f5 eb5 c5 bb4",
  E: "[g4,bb4,eb5]@11 [bb4,d5,g5]@2 [bb4,d5,g5] [bb4,d5,f5]@2", // Eb Gm Bb
  F: "[g4,bb4,eb5]@11 [d5,g5,c6]@2 [d5,g5,c6] [d5,g5,bb5]@2", // Eb Csus2 Gm
  G: "[[c5,eb5,ab5] [c5,eb5,ab5]@2 [ab4,c5,f5] [ab4,c5,eb5]@4 ~ [c5,eb5,ab5]!5 [c5,eb5,g5] [bb4,d5,g5]@2 [bb4,d5,f5] [bb4,d5,f5]@2 [bb4,d5,f5]@2 [bb4,d5,f5]@3 ~ [bb4,d5,g5]@2 [bb4,d5,f5]@2 [bb4,d5,g5]@2]/2", // Ab Fm Ab Cm Gm Bb Gm Bb …
  H: "[[c5,eb5,ab5] [c5,eb5,ab5]@2 [c5,eb5,ab5] [c5,eb5,ab5]@3 [c5,eb5,ab5]!4 [c5,eb5,ab5]@2 [c5,eb5,g5]!2 [bb4,d5,g5]@3 [bb4,d5,f5]@2 [bb4,d5,f5] [bb4,d5,g5]@3 [bb4,d5,g5] [d5,f5,bb5]@2 [d5,f5,bb5,c6]@4 ~]/2", // Ab Cm Gm Bb Gm Bb
  I: "[[f5,ab5,db6] [f5,ab5,db6]@2 [db5,f5,bb5] [db5,f5,ab5]@3 ~@2 [f5,ab5,db6]!5 [f5,ab5,c6] [eb5,g5,c6]@2 [eb5,g5,bb5] [eb5,g5,bb5]@2 [eb5,g5,bb5]@2 [eb5,g5,c6]@9 ~]/2", // Db Bbm Db Fm Cm Eb Cm
  J: "[db5,f5,ab5]@2 [f5,ab5,db6]@4 [f5,ab5,c6] [f5,ab5,bb5]", K: "[ab5,db6,f6] [db6,f6,ab6]@3",
})).s("gm_rock_organ").gain(0.56)

// chords · string ensemble 2 · "strings"
const string_ensemble_2 = note("<A@12 B C B D E F G H A@8 B C B D E F E@3 F E ~>".pickRestart({
  A: "[[g4,bb4] [ab4,c5] [g4,bb4] [ab4,c5], eb4]/4", B: "[ab4,c5,eb5]", C: "[bb4,d5,f5]", D: "f5@2 d5@3 f5@3, bb4",
  E: "[ab4,db5,f5]", F: "[g4,bb4,eb5]", G: "[db4,f4,ab4]@2 [f4,ab4,db5]@4 [f4,ab4,c5] [f4,ab4,bb4]",
  H: "[ab4,db5,f5] [db5,f5,ab5]@3", // Db
})).s("gm_string_ensemble_2").gain(0.48)

// drums · snare
const snare = s("sd").struct(`<
  [~@2 x ~@3 x!2]!19
  [~@4 x ~@6 x!2 ~ x!2]
  [~@2 x ~@3 x!2]!15
  [~@4 x ~@6 x!2 ~ x!2]
  [~@2 x ~@3 x!2]!3
  ~
>`).gain(0.72)

// drums · hihat
const hihat = s("hh").struct("<A@3 B A@7 B C D C D C D C E A@7 B C D C D C D C E C D C ~>".pickRestart({
  A: "x ~ x ~ x ~@2 x ~ x ~ x!2 ~ x ~", B: "x ~ x ~ x ~@2 x ~ x ~ x!2 ~@3", C: "x ~@3 x ~@2 x ~ x ~@2 x ~ x ~",
  D: "x ~ x ~ x ~@2 x ~ x ~ x ~@2 x ~", E: "x ~ x ~ x ~@2 x ~ x ~ x ~@4",
})).gain(0.72)

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

// drums · crash
const crash = s("cr").struct("<A ~ A ~ A ~@3 A ~@3 A ~ A ~ A ~ A ~ A ~@3 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~>".pickRestart({
  A: "x",
})).gain(0.72)

stack(bass, rock_organ, string_ensemble_2, snare, hihat, open_hat, crash)