Strudelify

Dirty Water

The Standells

KeyA majorTempo145 bpm
0:00/0:00
// Dirty Water — The Standells
// 145 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 98 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(145/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@2 A B C D E F G H I H J H E H E K E D L M N O P E@2 F H Q R S ~ D E T E H E H E K E D L M N O P E@2 F H Q R S ~ D E
  T E H E H E K E D L M N O P E@2 F H Q R S ~ D E T E D E T E D E T E D E T E U
>`.pickRestart({
  A: "~@11 b1", B: "e2@4 ~@2 e2@4 ~@2 e2@3 ~@3 e2@3 ~ b1 ~", C: "e2@4 ~@2 e2@3 ~@3 e2@3 ~ b1 ~ e2@3 ~ b1 ~",
  D: "e2@3 ~@3 e2@3 ~@3 e2@3 ~@3 e2@3 ~ b1 ~", E: "e2@3 ~@3 e2@3 ~@3 e2@3 ~ b1 ~ e2@4 b1 ~",
  F: "e2@3 ~@3 e2@3 ~@3 e2@3 ~@3 e2@2 ~@2 b1 ~", G: "e2@3 ~@3 e2@3 ~@3 e2@2 ~@2 b1 ~ e2@3 ~ b1 ~",
  H: "e2 ~ e2 ~ e2 ~ e2 ~", I: "e2@4 ~@2 e2@3 ~@3 e2@3 ~ b1 ~ e2@4 b1 ~",
  J: "e2@3 ~@3 e2@3 ~@3 e2@3 ~ b1 ~ e2@3 ~ b1 ~", K: "e2@3 ~@3 e2@3 ~@3 e2@3 ~@3 e2@4 ~@2",
  L: "e2@4 ~@2 e2@3 ~ b1 ~ e2@3 ~ b1 ~ e2@3 ~ b1 ~", M: "a1@3 ~@3 a1@3 ~@3 a1@3 ~@3 a1@3 ~ e1 ~, b1 ~@23",
  N: "a1@3 ~@3 a1@3 ~@3 a1@3 ~ e1 ~ a1@4 e1 ~", O: "a1@3 ~@3 a1@4 ~@2 a1@4 ~@2 a1@3 ~@3",
  P: "a1@2 ~@2 e1 ~ a1@3 ~@3 a1@3 ~@3 a1@3 ~@3", Q: "b1@3 ~@3 b1@4 ~@2 b1@3 ~@3 b1@3 ~@3",
  R: "b1@3 ~@3 b1@3 ~@3 b1@4 ~@2 a#1@4 ~@2", S: "a1 ~@7", T: "e2@3 ~@3 e2@4 ~@2 e2@3 ~ b1 ~ e2@4 b1 ~",
  U: "e2 ~ e2 ~ e2 ~@3",
})).s("gm_acoustic_bass").gain(0.66)

// chords · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~@7 A B A B A B C D C E F D C G H I H J F D F B K L M ~ F N C G C D C E F D C G H I H J F D F B K L M ~ F N C G C D C
  E F D C G H I H J F D F B K L M ~ F N C G F N C G F N C G F N C G F
>`.pickRestart({
  A: "[e4,g#4,b4]@2 ~@4 [e4,g#4,b4]@3 ~@3 [e4,a4,c#5]@2 ~@10", // E A
  B: "[f#4,a4,d5]@2 ~@4 [f#4,a4,d5]@2 ~@2 [e4,a4,c#5]@7 ~ [e4,a4,c#5]@2 ~@4", // D A
  C: "[e4,g#4,b4]@2 ~@4 [e4,g#4,b4]@3 ~@3 [e4,a4,c#5]@3 ~@9", // E A
  D: "[f#4,a4,d5]@3 ~@3 [f#4,a4,d5]@2 ~@2 [e4,a4,c#5]@7 ~ [e4,a4,c#5]@4 ~@2", // D A
  E: "[f#4,a4,d5]@2 ~@4 [f#4,a4,d5]@2 ~@2 [e4,a4,c#5]@7 ~ [e4,a4,c#5]@3 ~@3", // D A
  F: "[e4,g#4,b4] ~ [e4,g#4,b4] ~ [e4,a4,c#5] ~@3", // E A
  G: "[f#4,a4,d5]@3 ~@3 [f#4,a4,d5]@2 ~@2 [e4,a4,c#5]@7 ~ [e4,a4,c#5]@3 ~@3", // D A
  H: "[a4,c#5,e5] ~ [a4,c#5,e5] ~ [a4,d5,f#5] ~@3", // A D
  I: "[a4,e5,g5]@3 ~@3 [a4,e5,g5]@2 ~@2 [a4,d5,f#5]@7 ~ [a4,d5,f#5]@4 ~@2", // A7 D
  J: "[a4,e5,g5]@2 ~@4 [a4,g5]@2 ~@2 [a4,d5,f#5]@7 ~ [a4,d5,f#5]@3 ~@3, ~@6 e5 ~@17", // A7 D
  K: "[b4,d#5,f#5]@2 ~@4 [b4,d#5,f#5]@3 ~@3 [b4,d#5,f#5]@3 ~@3 [b4,d#5,f#5]@3 ~@3", // B
  L: "[b4,d#5,f#5]@2 ~@4 [b4,d#5,f#5]@3 ~@3 [b4,d#5,f#5]@9 ~@3", M: "[a4,c#5,e5] ~@7",
  N: "[f#4,a4,d5]@2 ~@4 [f#4,a4,d5]@2 ~@2 [e4,a4,c#5]@7 ~ [e4,a4,c#5]@4 ~@2", // D A
})).s("gm_rock_organ").gain(0.64)

// other · harmonica
const harmonica = note("<~@60 A@2 B C D E F G@2 ~@29>".pickRestart({
  A: "[~@4 d5@3 ~, ~@16 b4@27 ~@5]/2", B: "~@2 b4@4 a4@2 b4@3 ~, ~@16 g4@3 ~@5", C: "f4@3 ~",
  D: "~@4 g#4@4 b4@2 d5@2 g#4@6 [b4,d5]@3 ~@3", E: "[d5,f#5]@23 ~", F: "[d5,f#5]@3 e5@2 d5 c#5@2 b4@4",
  G: "[d5@4 b4@6 d5@2 b4@6 d5@4 b4@5 d5@3 b4@4 a4@6 g4@6 ~@2]/2",
})).s("gm_harmonica").gain(0.62)

// chords · distortion guitar · "DISTORTION"
const distortion_guitar = note("<~@68 A@5 B@2 C D ~@21>".pickRestart({
  A: "[~@11 e4@3 g4@12 e4 g4@3 e4@2 g4 e4@2 d4@4 e4@11 d5@4 a4@3 b4@2 a4]/5",
  B: "[b4@2 a4@3 b4@13 [e4,g4]@2 [e4,g4]@2 [e4,g4]@2]/2", C: "[e4,g4]!6", D: "g4@4 e4@8 b3@9 ~@3",
})).s("gm_distortion_guitar").gain(0.62)

// drums · kick
const kick = s("bd").struct("<~@5 A@8 B@16 C@2 D ~ B@20 C@2 D ~ B@20 C@2 D ~ B@16 E>".pickRestart({
  A: "x ~@4 x!2 ~@4 x", B: "x ~@4 x!2 ~ x ~@2 x", C: "x!4", D: "x", E: "x!3 ~",
})).gain(0.8)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@32 [~@8 x!4] ~@23 [~@8 x!4] ~@23 [~@8 x!4] ~@16 [~ x]>").gain(0.8)

// drums · hihat
const hihat = s("hh").struct("<~ A@12 B@16 C@2 A@2 B@20 C@2 A@2 B@20 C@2 A@2 B@16 ~>".pickRestart({
  A: "~ x ~ x", B: "x ~ x!2 ~ x!2 ~ x!2 ~ x", C: "x!4",
})).gain(0.24)

// drums · mid tom
const mid_tom = s("mt").struct("<~@31 A B ~@22 A B ~@22 A B ~@16 C>".pickRestart({
  A: "~@11 x", B: "~@2 x!2 ~ x!3 ~@4", C: "~ x ~@2",
})).gain(0.8)

// drums · high tom
const high_tom = s("ht").struct("<~@31 [~ x ~ x ~@2] ~@23 [~ x ~ x ~@2] ~@23 [~ x ~ x ~@2] ~@17 x>").gain(0.8)

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

// drums · ride
const ride = s("rd").struct("<~@13 A@16 ~@4 A@20 ~@4 A@20 ~@4 A@16 ~>".pickRestart({
  A: "x!4",
})).gain(0.8)

// drums · tambourine
const tambourine = s("tb").struct("<~@3 A@26 ~@4 A@20 ~@4 A@20 ~@4 A@16 ~>".pickRestart({
  A: "x!4",
})).gain(0.8)

stack(
  bass, rock_organ, harmonica, distortion_guitar, kick, snare, snare_soft, low_tom, hihat, mid_tom, high_tom, crash,
  ride, tambourine
)