Strudelify

Shattered Dreams

Johnny Hates Jazz

KeyD minorTempo120 bpm
0:00/0:00
// Shattered Dreams — Johnny Hates Jazz
// 120 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 90 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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.

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  A ~ B ~ A ~ B C D E F G H E F I ~@20 A ~ B C D E F G H E F I ~@22 J K L M ~@16
>`.pickRestart({
  A: "f5 e5 c5 a4@3 ~@2", B: "f5 e5 c5 a4@2 d5@3", C: "~@14 d4 c4", D: "[a3,f4], d4 ~@15", E: "[g3,c4,e4]",
  F: "[a3,d4,f4]", G: "~@14 d5 c5, [g3,bb3,d4]", H: "[a3,f4], d5 ~@3, d4 ~@15", I: "[g3,bb3], d4 ~@15",
  J: "[ab3,db4,f4,ab4]", K: "[c4,eb4,ab4]", L: "[b3,db4,gb4], eb4 ~@15", M: "[bb3,ab4,bb4] [bb4,eb5,ab5,bb5], eb4 ~@15",
})).s("gm_synth_strings_1").gain(0.25)

// bass · electric bass pick · "PICK BASS"
const bass = note(`<
  A B C D A B C D E F G H E F G I J K L M A B N D A B N O P Q R S A B C I T B C D E F G H E F G I J K L M A B N D A B N
  O P Q R S A B C I U@2 V J K W X N Y Z AA N Y AB AA N AC AD AE AF AG@2
>`.pickRestart({
  A: "d1 ~@5 d1@8 d1@2", B: "a1 ~@5 a1@8 a1@2", C: "bb1 ~@5 bb1@8 f1@2", D: "g1 ~@11 c2@2 d2@2, ~@3 g1@4 ~",
  E: "d1 ~@5 d1@10", F: "a1 ~@5 a1@10", G: "bb1 ~@5 bb1@10", H: "g1 ~@5 g1@2 bb1@3 ~ f1@3 ~", I: "g1 ~@5 g1@10",
  J: "c2", K: "b1", L: "bb1", M: "g1@4 ~@2 g1@2 g1@3 ~ f1@2 e1@2", N: "bb1 ~@5 bb1@8 bb1@2",
  O: "g1 ~@5 g1@4 ~@2 c2@2 d2@2", P: "d1 ~@5 d1@8 c2@2", Q: "c2@7 c2", R: "bb1@2 ~ bb1@4 bb1",
  S: "g1@2 ~@4 c2 d2, ~@3 g1@4 ~", T: "~@3 d1@4 d1, eb1@7 ~", U: "[eb1@7 eb1@8 ~]/2", V: "db2@15 ~",
  W: "ab1@12 gb1@3 ~", X: "eb1 ~@5 eb1@8 eb1@2", Y: "b1 ~@5 b1@8 gb1@2", Z: "ab1 ~@11 db2@2 eb2@2, ~@3 ab1@4 ~",
  AA: "eb1 ~@5 eb1@8 ab1@2", AB: "ab1 ~@5 ab1@4 ~@2 gb1@2 ab1@2", AC: "b1 ~@5 b1@8 b1@2",
  AD: "ab1 ~@5 ab1@4 ~@2 db2@2 eb2@2", AE: "eb1 ~@5 eb1@8 db2@2", AF: "db2@7 db2", AG: "[ab1@3 ~]/2",
})).s("gm_electric_bass_pick").gain(0.48)

// chords · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  A B A C A B A C A B A C A B A C ~@4 A B A D A B A C A B E C A B A C A B A C A B A C A B A C ~@4 A B A D A B A C A B E
  C A B A C F@2 ~@4 G H G I G H G I G H G I G H J@2
>`.pickRestart({
  A: "[a3,d4,f4]", B: "[g3,c4,e4]", C: "[g3,bb3,d4]", D: "[bb3,d4], g3@7 ~", E: "[d4,f4], a3@7 ~",
  F: "[[bb3,eb4,gb4]@7 [c4,eb4,f4,ab4]@9]/2", G: "[bb3,eb4,gb4]", H: "[ab3,db4,f4]", I: "[ab3,b3,eb4]",
  J: "[[bb3,eb4,gb4]@11 ~@5]/2", // Ebm
})).s("gm_lead_2_sawtooth").gain(0.38).pan(0.3)

// other · music box
const music_box = note(`<
  [a5 ~ d5 ~ f5 ~ d5 ~ a5 ~ d5 ~ f5 ~ d5 ~]!8
  ~@28
  [a5 ~ d5 ~ f5 ~ d5 ~ a5 ~ d5 ~ f5 ~ d5 ~]!4
  ~@28
  [bb5 ~ eb5 ~ gb5 ~ eb5 ~ bb5 ~ eb5 ~ gb5 ~ eb5 ~]!2
  ~@20
>`).s("gm_music_box").gain(0.29).pan(0.8)

// chords · clavinet
const clavinet = note(`<
  ~@11 A B ~@3 C D E@2 F G H I F G H I F G H I F G H I J ~@6 A B ~@3 C D E@2 F G H I F G H I F G H I F G H I K@2 L M N@2
  O P Q R O P Q R O P Q R O P S@2
>`.pickRestart({
  A: "~@2 bb1 f1", B: "d1 ~@15",
  C: "[g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~", // C
  D: "[g3,b3,d4] ~ [g3,b3,d4] ~ [g3,b3,d4] ~ [g3,b3,d4] ~ [g3,b3,d4] ~ [g3,b3,d4] ~ [g3,b3,d4] ~ [g3,b3,d4] ~", // G
  E: "[g3,bb3,d4] ~ [g3,bb3,d4] ~ [g3,bb3,d4] ~ [g3,bb3,d4] ~ [g3,bb3,d4] ~ [g3,bb3,d4] ~ [g3,bb3,d4] ~ [g3,bb3,d4] ~", // Gm
  F: "[d4,f4,a4]", G: "[a3,c4,e4,g4]", H: "[bb3,d4,f4,a4]", I: "[bb3,d4,g4]", J: "[eb4,gb4,bb4]@7 ~",
  K: "[[eb4,gb4,bb4]@7 [c4,eb4,f4,ab4]@9]/2", // Ebm Fm7
  L: "[ab3,db4,eb4,f4,gb4,bb4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~", // Ebm7 Db
  M: "[ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~ [ab3,c4,eb4] ~", // Ab
  N: "[ab3,b3,eb4] ~ [ab3,b3,eb4] ~ [ab3,b3,eb4] ~ [ab3,b3,eb4] ~ [ab3,b3,eb4] ~ [ab3,b3,eb4] ~ [ab3,b3,eb4] ~ [ab3,b3,eb4] ~", // Abm
  O: "[eb4,gb4,bb4]", P: "[bb3,db4,f4,ab4]", Q: "[b3,eb4,gb4,bb4]", R: "[b3,eb4,ab4]",
  S: "[~@7 bb4@14 ~@11, gb4@5 ~@3, eb4@17 ~@15, ~@3 b3@7 ~@6]/2",
})).s("gm_clavinet").gain(0.3).pan(0.6)

// chords · brass section · "BRASS 1"
const brass_section = note("<~@74 A B A B A C A C A C A C A C D ~>".pickRestart({
  A: "~@2 [bb4,eb5] ~ [ab4,db5] [bb4,eb5] ~@2", B: "~ [bb4,eb5] ~@2 [ab4,db5]!2 [bb4,eb5] ~",
  C: "~ [bb4,eb5] ~ [bb4,eb5] [ab4,db5]!2 [bb4,eb5] ~", D: "~@2 [bb4,eb5] ~ [ab4,db5] [bb4,eb5]@3",
})).s("gm_brass_section").gain(0.27)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  A B A B A B A B ~@12 A B A B A B A B A B A B A B A B A B A B ~@12 A B A B A B A B A B A B A B A B C D ~@4 C D C D C D
  C D C D C D C D C E
>`.pickRestart({
  A: "~@2 [a3,d4] ~@3 [d3,a3] ~ [f3,c4] ~ [d3,a3] ~ g3 ~ [a3,d4] ~", // D5 F5 D5
  B: "~@2 [a3,d4] ~@3 [d3,a3] ~ [f3,c4] ~ [d3,a3] ~ [g3,c4] ~ [a3,d4] ~", // D5 F5 D5 C5 D5
  C: "~@2 [bb3,eb4] ~@3 [eb3,bb3] ~ [gb3,db4] ~ [eb3,bb3] ~ ab3 ~ [bb3,eb4] ~", // Eb5 Gb5 Eb5
  D: "~@2 [bb3,eb4] ~@3 [eb3,bb3] ~ [gb3,db4] ~ [eb3,bb3] ~ [ab3,db4] ~ [bb3,eb4] ~", // Eb5 Gb5 Eb5 Db5 Eb5
  E: "~@2 [bb3,eb4] ~@3 [eb3,bb3] ~ [gb3,db4] ~ [eb3,bb3] ~ ab3 ~@3", // Eb5 Gb5 Eb5
})).s("gm_electric_guitar_muted").gain(0.44).pan(0.8)

// other · woodblock
const woodblock = note(`<
  ~@7 A B ~@6 C ~@3 D B ~@2 E ~@3 F ~@3 D G ~@6 A B ~@6 C ~@3 D B ~@2 E ~@3 F ~@3 D G ~@5 H ~@2 E ~@4 I ~@2 E ~@4 J ~@3
>`.pickRestart({
  A: "~@10 e4 ~ e4 ~ e4 ~", B: "e4 ~@3", C: "~@10 e4 ~ e4!4", D: "~@14 e4 ~", E: "~@14 e4!2", F: "~@12 e4!4",
  G: "e4@7 ~@9", H: "e4 ~@15", I: "e4@3 ~@5", J: "e4 ~",
})).s("gm_woodblock").gain(0.45).pan(0.3)

// other · orchestra hit · "ORCH.HIT"
const orchestra_hit = note("<~@35 bb3 ~@31 bb3 ~@22>").s("gm_orchestra_hit").gain(0.45)

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

// drums · snare
const snare = s("sd").struct("<A@7 B C A@10 D A@6 ~ E A@11 B C A@10 D A@6 ~ E A@13 F A@14 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@6 x!2 ~@3", C: "x!2 ~ x", D: "~@8 x ~ x!3 ~ x ~", E: "~@3 x", F: "~@12 x!3 ~",
})).gain(0.56)

// drums · clap
const clap = s("cp").struct("<~@68 [~@5 x ~ x!2 ~@7] ~@21>").gain(0.44)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@3 A ~@3 A ~@3 A ~@5 B ~ A@2 ~@2 A ~@3 A ~ A ~@3 B ~@5 A ~@3 A ~@5 B ~ A@2 ~@2 A ~@3 A ~ A ~@3 B ~@3 A ~@3 A ~@3 A
  ~@3 A ~@3 A ~@4
>`.pickRestart({
  A: "~@7 x", B: "~@3 x ~@4",
})).gain(0.31)

// drums · crash
const crash = s("cr").struct("<~@19 A B ~@7 C ~@5 B ~@16 A B ~@7 C ~@5 B ~@5 B@2 C ~@7 C ~@5 B ~>".pickRestart({
  A: "~@7 x", B: "x", C: "~ x ~@2",
})).gain(0.37)

// drums · ride
const ride = s("rd").struct("<~@68 [x ~@6 x] [~@10 x ~ x!3 ~] x ~@19>").gain(0.37)

// drums · tambourine
const tambourine = s("tb").struct("<~@16 A@3 ~@29 A@3 ~@17 B ~ A@3 C D@14 ~@2>".pickRestart({
  A: "~@3 x ~@4", B: "~@5 x ~@2", C: "~@3 x!2 ~@3", D: "~@3 x",
})).gain(0.56)

// drums · bongos
const bongos = s("bongo:4").struct("<A@8 ~@12 A@15 B A@4 ~@12 A@15 B ~@6 A@14 ~@2>".pickRestart({
  A: "~ x ~@2", B: "~@4 x ~@7 x ~ x!2",
})).gain(0.82)

// drums · bongos
const bongos_2 = s("bongo:18").struct(`<
  A@8 ~@12 A@6 B@2 A@7 C A@4 ~@12 A@6 B@2 A@7 C ~ D ~@4 A@7 E F C A@4 ~@2
>`.pickRestart({
  A: "~ x ~ x ~@2 x!2", B: "~ x ~@6", C: "~ x ~ x ~ x!3", D: "x!2 ~ x!2 ~@11", E: "~@2 x ~@3 x ~ x!2 ~ x!3 ~ x",
  F: "x!2 ~ x ~@2 x!2",
})).gain(0.82)

// drums · congas
const congas = s("conga:18").struct("<~@69 [~@5 x ~ x!2 ~@7] ~@13 [x!5 ~@3] ~@6>").gain(1.59)

// drums · congas
const congas_2 = s("conga:33").struct("<~@26 [~@6 x!2]!2 ~@30 [~@6 x!2]!2 ~@30>").gain(1.59)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  A@3 B A@11 B A@7 B A@3 B A@7 B A@11 B A@7 B A@3 B A@7 B A B A@3 C A@3 B A@3 B A@3 B A@2 D ~
>`.pickRestart({
  A: "x!4", B: "x ~@3 x ~@3 x ~@3 x!4", C: "x ~@3 x ~@3 x ~@3 x!3 ~", D: "x",
})).gain(0.95)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  A@3 B A@3 B A@7 B A@3 B A@3 B A@3 B A@7 B A@3 B A@7 B A@3 B A@3 B A@3 B A@7 B A B A@3 B A@3 B A@3 B A@3 B A@2 ~@2
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2",
})).gain(0.63)

// drums · claves
const claves = s("clave:2").struct("<~@3 [~@5 x ~ x] ~@86>").gain(1.52)

stack(
  synth_strings_1, bass, lead_2_sawtooth, music_box, clavinet, brass_section, electric_guitar_muted, woodblock,
  orchestra_hit, kick, snare, clap, hihat, open_hat, crash, ride, tambourine, bongos, bongos_2, congas, congas_2,
  cabasa, cabasa_soft, claves
)

More by Johnny Hates Jazz