Strudelify

Judy in Disguise

John Fred

KeyB♭ majorTempo165 bpm
0:00/0:00
// Judy in Disguise — John Fred
// 165 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 119 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(165/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 · piano
const piano = note(`<
  ~@5 A B A C D E D E D F G H I J K L M L M J K N O P Q J K R A J K L M L M J K N O P Q S ~ S T U V U L M L M W A J K L
  M L M J K N O X Q J K R A J K L M L M J K N O X Q S ~ S T U V U L M L M L M F G H I J K L M L M J K N Y Z@2 AA@2 ~
>`.pickRestart({
  A: "~@8 [bb3,bb4] ~ [c4,c5] ~ [eb4,eb5] ~ [c4,c5] ~", B: "[eb4,eb5] ~@15",
  C: "[g3,bb3,eb4] ~@3 [g3,bb3,eb4] ~@3 [bb3,eb4]@3 ~ [g3,bb3,eb4] ~ [ab3,c4,f4] ~, ~@8 g3 ~@7", // Eb Eb5 Eb Fm
  D: "~@2 [ab3,c4,f4] ~@3 [ab3,c4,f4] ~ [bb3,d4,g4] ~@7", // Fm Gm
  E: "[g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~@3 [bb3,eb4]@3 ~ [g3,bb3,eb4] ~ [ab3,c4,f4] ~, ~@8 g3 ~@7", // Eb Eb5 Eb Fm
  F: "[f3,bb3,f4]@5 ~@3 [f3,bb3,f4]@5 ~@3", G: "[gb3,b3,gb4]@5 ~@3 [g3,c4,g4]@5 ~@3",
  H: "[ab3,db4,ab4]@5 ~@3 [a3,d4,a4]@5 ~@3", // Db5 D5
  I: "[bb3,eb4,bb4] ~@3 [eb4,eb5,eb6] ~@3 [bb3,bb4] ~ [c4,c5] ~ [eb4,eb5] ~ [c4,c5] ~", // Eb5 Eb Bb C Eb C
  J: "[g3,bb3,eb4] ~ [g3,bb3,eb4] ~ c4 ~@3 [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ c4 ~ [g3,bb3,eb4] ~", // Eb
  K: "~@2 [g3,bb3,eb4] ~@3 c4 ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,c4,eb4] ~ [g3,bb3,eb4] ~", // Eb Cm Eb
  L: "[d4,f4,bb4] ~ [d4,f4,bb4] ~ g4 ~@3 [d4,f4,bb4] ~ [d4,f4,bb4] ~ g4 ~ [d4,f4,bb4] ~", // Bb
  M: "~@2 [d4,f4,bb4] ~@3 g4 ~ [d4,f4,bb4] ~ [d4,f4,bb4] ~ [d4,g4,bb4] ~ [d4,f4,bb4] ~", // Bb Gm Bb
  N: "[g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [g3,bb3,eb4] ~", // Eb
  O: "[d4,f4,bb4] ~ [d4,f4,bb4] ~ [d4,f4,bb4] ~ [d4,f4,bb4] ~ [d4,f4,bb4] ~ [d4,f4,bb4] ~ [d4,f4,bb4] ~ [d4,f4,bb4] ~", // Bb
  P: "[g3,bb3,eb4] ~ [g3,bb3,eb4] ~ c4 ~@3 [g3,bb3,eb4]@3 ~ [bb3,bb4] ~ [g4,g5] ~", Q: "~@2 [eb4,eb5] ~@13",
  R: "[g3,bb3,eb4] ~ [g3,bb3,eb4] ~ c4 ~@3 [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [c4,c5] ~ [eb4,eb5]@2", S: "[ab3,c4,eb4]",
  T: "~@4 [ab3,db4,f4] ~@3 [bb3,d4,f4]@5 ~@3", U: "[ab3,c4,eb4]@3 ~@3 [ab3,c4,eb4]@3 ~@3 [ab3,c4,eb4]@3 ~",
  V: "[gb3,bb3,db4]@3 ~@3 [gb3,bb3,db4]@3 ~@3 [gb3,bb3,db4]@3 ~", // Gb
  W: "[d4,f4,bb4] ~ [d4,f4,bb4] ~ g4 ~@3 [d4,f4,bb4] ~ [d4,f4,bb4] ~ g4 ~ [d4,f4,bb4]@2", // Bb
  X: "[g3,bb3,eb4] ~ [g3,bb3,eb4] ~ c4 ~@3 [g3,bb3,eb4] ~ [g3,bb3,eb4] ~ [bb3,bb4] ~ [g4,g5] ~", // Eb Bb G
  Y: "[d4,f4,bb4] ~ [d4,f4,bb4] ~ [d4,f4,bb4] ~ [bb4,bb5]@3 ~ [bb4,bb5]@3 ~ [bb3,bb4] ~", // Bb
  Z: "[[g4,g5]@2 ~@5 [eb4,eb5]@2 ~@6 [bb3,bb4]@2 ~@5 [c4,c5]@2 ~@6 [bb3,bb4]@2]/2", // G Eb Bb C Bb
  AA: "[~@5 [g4,g5]@2 ~@5 [eb4,eb5]@20]/2", // G Eb
})).s("gm_piano").gain(0.51)

// bass · fretless bass · "Bass"
const bass = note(`<
  ~@3 A B C B C B C B C B C D E F G B C H I H J B C K L M N B C O A B C H I H J B C K L M N P@3 Q P R P H I H I S A B C
  H I H J B C K L M N B C O A B C H I H J B C K L M N P@3 Q P R P H I H I H I D E F G B C H I H J B C K T ~@5
>`.pickRestart({
  A: "~@8 bb1 ~ c2 ~ eb2 ~ c2 ~", B: "eb2 ~ eb2 ~ c2 ~@3 bb1 ~ bb1 ~ c2 ~ eb2 ~",
  C: "~@2 eb2 ~@3 c2 ~ bb1 ~ bb1 ~ c2 ~ bb1 ~", D: "bb1@5 ~@3 bb1@3 ~ bb2@3 ~", E: "b1@3 ~ b2@3 ~ c2@3 ~ c3@3 ~",
  F: "db2@3 ~ db3@3 ~ d2@3 ~ d3@3 ~", G: "eb2 ~@3 eb2 ~@3 bb1 ~ c2 ~ eb2 ~ c2 ~",
  H: "bb2 ~ bb2 ~ g2 ~@3 f2 ~ f2 ~ g2 ~ bb2 ~", I: "~@2 bb2 ~@3 g2 ~ f2 ~ f2 ~ g2 ~ f2 ~",
  J: "bb1 ~ bb2 ~ c2 ~ c3 ~ db2 ~ db3 ~ d2 ~ d3 ~", K: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~",
  L: "bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~", M: "eb2 ~ eb2 ~ c2 ~@3 bb1 ~ bb1 ~ bb1 ~ g2 ~",
  N: "~@2 eb2 ~@13", O: "eb2 ~ eb2 ~ c2 ~@3 bb1 ~ bb1 ~ c2 ~ eb2@2",
  P: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~", Q: "ab2 ~ ab2 ~ db3 ~@3 bb2 ~ bb2 ~ bb2 ~ bb2 ~",
  R: "gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~ gb2 ~", S: "bb2 ~ bb2 ~ g2 ~@3 f2 ~ f2 ~ g2 ~ bb2@2",
  T: "bb2 ~ bb2 ~ bb2 ~ bb2@3 ~ bb2@3 ~ bb2 ~",
})).s("gm_fretless_bass").gain(0.46)

// other · brass section · "Brass"
const brass_section = note(`<
  ~@8 A B C B C D E@3 F ~@10 G H I J K ~@11 G H ~@3 L ~@3 M N O P Q ~@11 G H R S T U V W@2 X Y Z@2 AA AB@2 AC AD ~@3 AE
  ~@3 AF AG AH AI AJ AK E@3 AL ~@9 AM ~@5
>`.pickRestart({
  A: "[g4,bb4,eb5]@2 ~@2 [g4,bb4,eb5]@2 ~@2 [g4,bb4,eb5]@3 ~ [g4,bb4] ~ [ab4,c5,f5]@2, ~@6 eb5 ~", // Eb Gm Fm
  B: "~@2 [ab4,c5,f5]@2 ~@2 [ab4,c5,f5] ~ [bb4,d5,g5]@2 ~@6", // Fm Gm
  C: "[g4,bb4,eb5] ~ [g4,bb4,eb5] ~ [g4,bb4,eb5] ~@3 [g4,bb4,eb5]@3 ~ [g4,bb4,eb5] ~ [ab4,c5,f5]@2", // Eb Fm
  D: "~@2 [ab4,c5] ~@3 [ab4,c5,f5] ~ [d5,g5] ~@7, ~ f5 ~@2 bb4 ~@3", E: "[f4,f5] [c4,c5]",
  F: "[eb4,eb5] ~@3 [eb5,eb6]@2 ~@10", G: "~@6 [bb3,bb4] [g4,g5]", H: "~ [eb4,eb5] ~@6",
  I: "[eb4,eb5] ~ [eb4,eb5]@2 [c4,c5]@2 ~@2 [bb3,bb4] ~ [bb3,bb4]@2 [c4,c5]@2 [eb4,eb5]@2", // Eb C Bb C Eb
  J: "~@2 [eb4,eb5]@2 ~@2 [c4,c5] ~ [bb3,bb4] ~ bb3@2 [c4,c5]@2 [bb3,bb4]@2, ~@10 bb4 ~@5", // Eb C Bb C Bb
  K: "[eb4,eb5] ~ [eb4,eb5] ~ [c4,c5]@2 ~@2 [bb3,bb4] ~ bb3@2 [c4,c5]@2 [eb4,eb5]@2, ~@10 bb4 ~@5", // Eb C Bb C Eb
  L: "~@4 [f4,ab4,db5] ~@3 [f4,bb4,d5]@6 ~@2", // Db Bb
  M: "[bb3,bb4] ~ bb4@2 [g3,g4]@2 ~@2 [f3,f4] ~ [f3,f4] ~ [g3,g4]@2 [bb3,bb4]@2, ~@2 bb3 ~@13", // Bb G F G Bb
  N: "~@2 [bb3,bb4]@2 ~@2 g4@2 [f3,f4] ~ [f3,f4]@2 [g3,g4]@2 [f3,f4]@2, ~@6 g3 ~@9", // Bb F G F
  O: "[bb3,bb4] ~ [bb3,bb4]@2 [g3,g4]@2 ~@2 [f3,f4] ~ [f3,f4]@2 [g3,g4]@2 [bb3,bb4]@2", // Bb G F G Bb
  P: "~@2 [bb3,bb4]@2 ~@2 g4@2 [f3,f4] ~ [f3,f4]@2 [g3,g4]@2 [f3,f4] ~, ~@6 g3 ~@9", // Bb F G F
  Q: "[bb3,bb4] ~ [bb3,bb4]@2 [g3,g4]@2 ~@2 [f4,f5] ~ [f4,f5]@2 [g4,g5] ~ [bb4,bb5]@2", // Bb G F G Bb
  R: "[eb4,eb5] ~ [eb4,eb5]@2 [c4,c5]@2 ~@2 [bb3,bb4] [bb3,bb4]@2 ~ [c4,c5]@2 [eb4,eb5]@2", // Eb C Bb C Eb
  S: "~@2 [eb4,eb5]@2 ~@2 [c4,c5]@2 [bb3,bb4] ~ [bb3,bb4]@2 [c4,c5]@2 [bb3,bb4]@2", // Eb C Bb C Bb
  T: "[eb4,eb5] ~ [eb4,eb5]@2 [c4,c5]@2 ~@2 [bb4,bb5] ~ [bb4,bb5]@2 [c5,c6]@2 [eb5,eb6]@2", // Eb C Bb C Eb
  U: "~@6 [eb4,eb5] [c4,c5] [bb3,bb4]@2 [c4,c5]@2 [eb4,eb5]@2 [c4,c5]@2", V: "[eb4,eb5] ~@7",
  W: "[~@4 [eb4,eb5] ~ [eb4,eb5]@2 [f4,f5]@2 [f4,f5]@3 ~ [d4,d5]@4 ~@14]/2", // Eb F D
  X: "~@8 [d4,d5]@2 [f4,f5] ~ [f4,f5]@2 d4@2, ~@14 d5 ~", Y: "[f4,f5]@3 ~@13",
  Z: "[~@4 [eb4,eb5] ~ [eb4,eb5]@2 [g4,g5]@2 [f4,f5]@3 ~ [eb4,eb5]@4 ~@14]/2", // Eb G F Eb
  AA: "~@8 [eb4,eb5] ~ [eb4,eb5] ~ [eb4,eb5]@2 [g4,g5]@2", // Eb G
  AB: "[~@4 [g4,g5]@3 ~ [g4,g5] ~ [g4,g5] ~ [g4,g5]@2 [f4,f5]@6 [bb3,bb4]@2 [g4,g5]@2 ~@2 [g4,g5]@2 [g4,g5]@2 [f4,f5]@2]/2", // G F Bb G F
  AC: "[eb4,eb5]@8 ~@3 [bb3,bb4]@2 ~ [g4,g5]@2", AD: "~@2 [eb4,eb5]@3 ~@11", AE: "~@4 [f4,ab4,db5] ~@3 [f4,bb4,d5]@7 ~",
  AF: "[bb3,bb4] ~ [bb3,bb4] ~ [g3,g4]@2 ~@2 [f3,f4] ~ [f3,f4] ~ [g3,g4]@2 [bb3,bb4]@2", // Bb G F G Bb
  AG: "~@2 [bb3,bb4]@2 ~@2 [g3,g4]@2 [f3,f4] ~ [f3,f4]@2 [g3,g4]@2 [f3,f4]@2", // Bb G F G F
  AH: "[bb3,bb4] ~ [bb3,bb4] ~ [g3,g4]@2 ~@2 [f3,f4] ~ [f3,f4]@2 [g3,g4]@2 [bb3,bb4]@2", // Bb G F G Bb
  AI: "~@2 [bb3,bb4]@2 ~@2 [g3,g4]@2 [f3,f4]@2 [f3,f4]@2 [g3,g4]@2 [f3,f4] ~", // Bb G F G F
  AJ: "[bb4,bb5] ~ [bb4,bb5]@2 [g4,g5]@2 ~@2 [f4,f5]@2 [f4,f5]@2 [g4,g5]@2 [bb4,bb5]@2", // Bb G F G Bb
  AK: "~@2 [bb4,bb5]@2 ~@2 [g4,g5]@2 [f4,f5]@2 [f4,f5]@2 [g4,g5]@2 [f4,f5] ~", AL: "[eb4,eb5] ~@3 [eb5,eb6] ~@11",
  AM: "~@6 [bb5,bb6] ~@3 [bb5,bb6] ~@5", // Bb
})).s("gm_brass_section").gain(0.36)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B@12 C@3 D B@11 ~ B@3 E B@11 ~ B@12 F B@11 ~ B@3 E B@11 ~ B@13 C@3 D B@9 G ~@5
>`.pickRestart({
  A: "~@5 x ~ x", B: "x ~@4 x ~ x", C: "x!2", D: "x ~ x ~ x!2 ~ x", E: "x ~@3 x!2 ~ x", F: "~@4 x!2 ~ x",
  G: "x ~@2 x ~ x ~ x",
})).gain(0.31)

// drums · snare
const snare = s("sd").struct(`<
  ~ A B@12 ~@3 C B@11 D B@15 D B@11 E B@12 D B@3 C B@11 D B@13 ~@3 C B@9 F ~@5
>`.pickRestart({
  A: "~@2 x!2", B: "~ x ~ x", C: "x!2 ~ x", D: "~ x ~@4 x ~", E: "~@2 x ~@3 x!2", F: "~ x ~@2",
})).gain(0.31)

// drums · hihat
const hihat = s("hh").struct(`<
  A B C@12 B@3 D C@11 B C@3 D C@11 B C@12 D C@11 B C@3 D C@11 B C@13 B@3 D C@9 E F G H ~@2
>`.pickRestart({
  A: "x!2", B: "x!4", C: "x!3 ~ x!3 ~", D: "x ~ x ~ x!3 ~", E: "x!3 ~@5", F: "x ~@6 x ~@7 x", G: "~@3 x ~@3 x",
  H: "~@5 x ~@6 x ~@3",
})).gain(0.31)

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

// drums · crash
const crash = s("cr").struct(`<
  ~@2 A ~ A ~ A ~ A ~ A ~ A ~ B@3 C A ~ A ~ A ~ A ~ A ~ D ~ A ~ E ~ A ~ A ~ A ~ A ~ A ~ D ~ A ~ A F A@4 ~ A ~ D ~ A ~ A
  ~ A ~ A ~ A ~ D ~ A ~ E ~ A ~ A ~ A ~ A ~ A ~ D ~ A ~ A ~ A@4 ~ A ~ A ~ B@3 C A ~ A ~ A ~ A ~ A G H I J ~@2
>`.pickRestart({
  A: "x", B: "x!2", C: "x!2 ~@2", D: "x ~@6 x", E: "~@7 x", F: "x!3 ~", G: "~@3 x ~ x ~ x", H: "x ~@6 x ~@7 x",
  I: "~@3 x ~@3 x", J: "~@5 x ~@6 x ~@3",
})).gain(0.31)

stack(piano, bass, brass_section, kick, snare, hihat, open_hat, crash)