Strudelify

Hey Mr D.J.

Zhane

KeyF♯ minorTempo101 bpm
0:00/0:00
// Hey Mr D.J. — Zhane
// 101 bpm, 4/4, key F# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 109 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(101/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 · synth bass 2
const bass = note(`<
  A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A
  C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C ~
>`.pickRestart({
  A: "b1 f#1 c#2 f#1 b1 ~@3", B: "c#2@2 e2@2 f2@2 f#2@2 ~@2 c#2 ~ f#1@4", C: "c#2@2 e2@2 f2@2 f#2 ~@3 c#2 ~ f#1@4",
})).s("gm_synth_bass_2").gain(0.44)

// chords · epiano1
const epiano1 = note(`<
  A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2
  B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~
>`.pickRestart({
  A: "[[a3,c#4]@7 ~ [a3,c#4]@2 b3 ~ [a3,c#4]@2 b3 ~ [a3,c#4]@5 ~ [e3,g#3,b3]@10, f#3@11 ~@5]/2", // A E
  B: "[[a3,c#4]@7 ~ [a3,c#4]@2 b3 ~ [a3,c#4]@2 b3 ~ [a3,c#4]@5 ~ [e3,g#3,b3]@9 ~, f#3@11 ~@5]/2", // A E
})).s("gm_epiano1").gain(0.4).pan(0.6)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  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 ~@2
>`.pickRestart({
  A: "~@10 [f#4,f#5] ~@3 [c#4,c#5]@2", B: "~@5 [f#4,f#5] ~ [c#4,c#5]",
})).s("gm_string_ensemble_1").gain(0.4)

// chords · electric guitar clean
const electric_guitar_clean = note("<A B@80 ~@3 A B@16 C@7 ~>".pickRestart({
  A: "[c#3,f#3,a3,c#4]", // F#m
  B: "[~@10 [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] [c#3,f#3,a3,c#4]@27 [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] [c#3,f#3,a3,c#4]@27 [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] [c#3,f#3,a3,c#4]@27 [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] [c#3,f#3,a3,c#4]@17]/8", // E F#m E F#m E F#m E F#m
  C: "[~@10 [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] [c#3,f#3,a3,c#4]@27 [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] [c#3,f#3,a3,c#4]@27 [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] [c#3,f#3,a3,c#4]@27 [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] ~ [b2,e3,g#3,b3] ~]/7", // E F#m E F#m E F#m E
})).s("gm_electric_guitar_clean").gain(0.21).pan(0.4)

// other · epiano2
const epiano2 = note(`<
  A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B
  ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@2
>`.pickRestart({
  A: "[~@2 c#5 d5 c#5 a4 f#4 d4 c#4 ~ b3@18 ~@4]/2", B: "~@2 c#5 d5 c#5 a4 f#4 d4 c#4 ~ b3 ~@5",
})).s("gm_epiano2").gain(0.31).pan(0.4)

// other · vibraphone
const vibraphone = note("<~@15 A ~@7 A ~@23 A ~@7 A ~@15 B@3 C D E@2 F G H@2 I@2 ~@7 A ~@7 A ~@9>".pickRestart({
  A: "~ f#4 ~ e4 f#4 ~ e4 f#4 ~ e4 f#4 ~@5",
  B: "[~@10 f#4!4 e4 f#4@2 ~ f#4 e4 f#4!3 f#4@2 ~ f#4 e4 f#4!3 f#4@2 ~@4 e4!2 ~ f#4!2 e4 f#4 ~ f#4 ~ f#4]/3",
  C: "f#4@2 ~ f#4 ~ f#4!2 ~@2 f#4 ~ f#4 f#4@3 ~", D: "~@5 e4!2 ~ f#4!2 e4@2 f#4 ~@3",
  E: "[~@2 e4!5 f#4@2 e4!2 ~ e4!3 f#4@2 e4!2 ~ e4!3 ~ f#4!2 e4 f#4@2 ~@3]/2", F: "~@4 e4!4 f#4@3 ~ e4!3 ~",
  G: "f#4 ~ f#4@2 e4!3 ~ f#4@5 ~@3",
  H: "[f#4@3 ~ f#4 ~ e4!2 f#4!2 e4!2 f#4@2 ~ f#4@2 ~ f#4 ~ f#4@3 e4 f#4!2 e4!2 f#4@2 ~@2]/2",
  I: "[f#4!2 ~ e4 f#4@2 e4!2 f#4 ~ f#4 ~ f#4!2 e4 f#4@2 ~ f#4 ~ f#4@2 e4 ~ f#4!2 e4@2 f#3@3 ~]/2",
})).s("gm_vibraphone").gain(0.42)

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

// drums · kick · soft notes
const kick_soft = 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 ~@2
>`.pickRestart({
  A: "~@4 x!2 ~@10", B: "~ x ~@2",
})).gain(0.2)

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!83 ~ [~ x ~ x]!24 ~>").gain(0.5)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!83 ~ [~ x ~ x]!24 ~>").gain(0.5)

// drums · hihat
const hihat = s("hh").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 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 ~ A B A B A B A B A B A B A B A B A B A B A B A B ~
>`.pickRestart({
  A: "x!8", B: "x ~ x ~ x ~ x ~ x!3 ~ x ~ x ~",
})).gain(0.35)

stack(bass, epiano1, string_ensemble_1, electric_guitar_clean, epiano2, vibraphone, kick, kick_soft, clap, snare, hihat)