Strudelify

Hippy Hippy Shake

The Swinging Blue Jeans

KeyE majorTempo155 bpm
0:00/0:00
// Hippy Hippy Shake — The Swinging Blue Jeans
// 155 bpm, 4/4, key E 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: ch 8 "ds guitar 1 | - SHAKE" named as a guitar, played on electric guitar clean (its fretless bass patch is not one)
// note: Full arrangement: all 63 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): od guitar 2.
setcpm(155/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 finger · "bass"
const bass = note(`<
  ~ A@2 B@2 A@2 C D B@4 A@2 E F C G H I J@2 K L A@2 B F C G M I B@4 A@2 B F C N F I J@2 K L A@2 B F C G B O B K B P@2 ~
>`.pickRestart({
  A: "a1 ~ a1@2 c#2@2 a1@2 e2 ~ e2@2 c#2@2 e2@2", B: "e1 ~ e1@2 g#1@2 e1@2 b1 ~ b1@2 g#1@2 b1@2",
  C: "b1 ~ b1@2 d#2@2 b1@2 f#2 ~ f#2@2 d#2@2 f#2@2", D: "b1 ~@15", E: "e1 ~ e1 ~ g#1@2 e1@2 b1 ~ b1@2 g#1@2 b1@2",
  F: "e1 ~ e1@2 g#1@2 e1@2 b1 ~ b1@2 g#1@2 a1@2", G: "a1 ~@7", H: "e1 ~ e1@2 g#1@2 e1@2 b1 ~ b1@2 g#1@2 e1@2",
  I: "~@2 b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1@2", J: "e1 ~@4 e1 f#1 g1", K: "e1 ~@7",
  L: "e1 ~ e1@2 f#1 ~ f#1@2 g1 ~ g1@2 g#1 ~ g#1@2", M: "e1 ~ e1@2 g#1@2 e1@2 b1 ~ b1@2 g#1 a1 a1@2",
  N: "a1 ~ a1 ~ c#2@2 a1@2 e2 ~ e2@2 c#2@2 e2@2", O: "e1 ~@15", P: "[e1 ~ f1 e1@13]/2",
})).s("gm_electric_bass_finger").gain(0.4)

// chords · overdriven guitar · "od guitar 1 | - HIPPY HIPPY"
const overdriven_guitar = note(`<
  ~ A@2 B@2 A@2 C D B@4 A@2 B@2 E F B G H I J K A@2 B@2 E F B L B@4 A@2 B@2 C A B L M I J K A@2 B@2 C F B N B N B O@2 ~
>`.pickRestart({
  A: "~@4 [a4,c#5,e5] ~@5 [a4,c#5,e5] ~@5", B: "~@4 [g#4,b4,e5] ~@5 [g#4,b4,e5] ~@5",
  C: "~@4 [f#4,b4,d#5] ~@5 [f#4,b4,d#5] ~@5", D: "[f#4,b4,d#5] ~@15", E: "~@4 [b4,d#5,f#5] ~@5 [b4,d#5,f#5] ~@5",
  F: "[a4,c#5,e5] ~@15", // A
  G: "~@2 [b4,d#5] ~ [b4,d#5] ~ [b4,d#5] ~ [b4,d#5] ~ [f#4,b4,d#5] ~ [f#4,b4,d#5] ~ [f#4,b4,d#5] ~", // B
  H: "[e4,b4,e5] ~@9 e4@2 f#4@2 g4@2", I: "e4 ~@9 e4@2 f#4@2 g4@2", J: "e4 ~@7", K: "e4 f#4 g4 g#4",
  L: "~@2 [f#4,b4] ~ [f#4,b4] ~ [f#4,b4] ~ [f#4,b4] ~ [f#4,b4] ~ [f#4,b4] ~ [f#4,b4] ~", // B5
  M: "[e4,b4] ~@9 e4@2 f#4@2 g4@2", N: "[g#4,b4,e5] ~@15", O: "[[g#4,b4,e5] ~@3 [f4,d5]@2 [e4,c#5]@26]/2",
})).s("gm_overdriven_guitar").gain(0.45).pan(0.3)

// chords · distortion guitar · "ds guitar 2"
const distortion_guitar = note("<~@32 A B@2 C D E F G H I@2 J K ~@18>".pickRestart({
  A: "~@5 b3 c#4 e4", B: "[d#4,g4]@2 [e4,g#4] ~ [e4,g#4] ~ [e4,g#4]@2 [d#4,g4]@2 [e4,g#4] ~ [e4,g#4] ~ [e4,g#4]@2",
  C: "[d#4,g4] [e4,g#4] [d#4,g4] [e4,g#4] [d#4,g4] [e4,g#4] [d#4,g4] [e4,g#4]", // D# E D# E D# E D# E
  D: "[e4,g#4] ~ [e4,g#4]@2 [d4,f#4] ~ [d4,f#4]@2 [c#4,e4] ~ [c#4,e4]@2 [b3,d4] ~ [b3,d4]@2", // E D C#m Bm
  E: "[a3,c#4] ~ [a3,c#4]@2 [g#3,b3] ~ [g#3,b3]@2 [f#3,a3] ~ [f#3,a3]@2 [e3,g#3] ~ [e3,g#3]@2", // A G#m F#m E
  F: "[f#3,a3] ~ [f#3,a3]@2 [g#3,b3] ~ [g#3,b3]@2 [a3,c#4] ~ [a3,c#4]@2 [g#3,b3]@2 [f#3,a3]@2", // F#m G#m A G#m F#m
  G: "[e3,g#3]@2 [e3,g#3]@2 [f#3,a3] ~ [f#3,a3]@2 [g#3,b3] ~ [g#3,b3]@2 [a3,c#4] ~ [a3,c#4]@2", // E F#m G#m A
  H: "[b3,d4] ~ [b3,d4]@2 [a3,c#4] ~ [a3,c#4]@2 [g#3,b3] ~ [g#3,b3]@2 f#3@2 [e3,g#3]@2", // Bm A G#m E
  I: "[e3 ~ b3@2 [c#4,g4] ~ [c#4,g4]@4 b3@2 [c#4,g4] ~ [c#4,g4]@4 b3@2 [c#4,g4] ~ [c#4,g4]@4 b3@2 c#4@2 e4@2]/2", // C#dim
  J: "[d#4,g4]@2 [e4,g#4] ~ [e4,g#4] ~ [e4,g#4] ~ [d#4,g4]@2 [e4,g#4] ~ [e4,g#4] ~ [e4,g#4] ~", // D# E D# E
  K: "e4@2 d4@2 b3@2 b3@9 ~",
})).s("gm_distortion_guitar").gain(0.4).pan(0.7)

// other · alto sax · "bari sax"
const alto_sax = note(`<
  A B C D E F G H I B J D K L C D M N O P Q R S T U V W D X N Y B ~@12 Q R S T U V W D X N Y B Y B Y B ~@3
>`.pickRestart({
  A: "~@4 g3@3 ~ g3@3 ~ g3@3 ~", B: "d3@7 ~@9", C: "~@2 g3 ~ g3@2 e3 ~ g3@2 e3 ~ g3 ~ g3@2", D: "d3@3 ~@5",
  E: "g3@9 ~ e3 ~ g3 ~ g3@2", F: "e3@5 ~@11", G: "~@2 c#3 ~ e3@2 c#3 ~ e3@2 c#3 ~ e3@2 c#3 ~", H: "e3 ~",
  I: "~@6 e3 ~ g3@2 ~@2 g3@2 ~@2", J: "~@2 g3@4 e3 ~ g3 ~ e3 ~ g3 ~ g3@2", K: "~@4 g3@5 ~ g3 ~ g3 ~ g3 ~",
  L: "g3@3 ~ e3@7 ~@5", M: "~@10 e3 ~ g3@2 e3 ~", N: "e3@15 ~", O: "~@6 e3 ~ g3@2 e3 ~ g3 ~ g3@2", P: "d3@5 ~@11",
  Q: "~@10 g3 ~ g3@2 e3 ~", R: "g3 ~ g3 ~ g3@2 e3@2 g3@2 ~@4 e3 ~", S: "g3 ~ g3 ~ g3@2 e3@2 g3@2 ~@4 g3 ~",
  T: "g3 ~ g3 ~ g3 ~ g3 ~ g3 ~ g3@3 ~ g3 ~", U: "g3@3 ~ g3 ~ g3@3 ~ g3@2 ~@2 g3@2", V: "~ e3@4 ~@3",
  W: "~@4 g3@6 e3 ~ g3 ~ g3@2", X: "~@6 g3@4 e3 ~ g3@2 e3 ~", Y: "~@6 e3 ~ g3@2 e3 ~ g3 ~ g3 ~",
})).s("gm_alto_sax").gain(0.59)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@7 A ~@9 A ~@2 B ~@8 A ~@2 B ~@3 C ~@7 C ~@8 A ~ D ~ D ~@5>".pickRestart({
  A: "~@11 x ~@4", B: "~@3 x ~@12", C: "~@3 x ~ x ~@3 x ~@6", D: "~@9 x ~ x ~@4",
})).gain(0.2)

// drums · hihat
const hihat = s("hh").struct("<~ A B@6 ~ B@9 ~ B@2 ~@3 B@6 ~ B@14 ~@3 B@6 ~ B ~ B ~ B ~@3>".pickRestart({
  A: "~ x!7", B: "x!8",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct("<~ A ~@7 A ~@9 A@2 ~@4 A ~@5 A@3 ~@3 A ~@11 A ~@5 B ~ B ~@2 C ~@2>".pickRestart({
  A: "x", B: "x!2", C: "~@3 x ~@4",
})).gain(0.45)

// drums · ride
const ride = s("rd").struct("<~@33 [~ x!7] [x!8]!3 [~ x!7] [x!8]!7 ~@18>").gain(0.4)

// drums · ht
const ht = s("ht").struct("<~@8 A ~@9 A ~ B ~@9 A ~ B ~@11 B ~@9 A ~ A ~ A ~@4>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.45)

stack(bass, overdriven_guitar, distortion_guitar, alto_sax, kick, snare, snare_soft, hihat, crash, ride, ht)