Strudelify
Evil Ways cover art

1970 · Santana

Evil Ways

Santana

KeyG minorTempo126 bpm
0:00/0:00
// Evil Ways — Santana
// 126 bpm, 4/4, key G minor. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 169 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(126/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.

// other · overdriven guitar · "Midi C14, T13"
const overdriven_guitar = note(`<
  ~@47 A B C D E F G H I ~@20 A B C D E F G H I ~@45 A B C D E F G H I ~@20 A B C D E F G H I ~
>`.pickRestart({
  A: "~@8 a5@2 a5!2 bb5 a5 bb5@2", B: "a5 ~@3", C: "~@4 g5 a5@2 bb5@2 a5 bb5@2 a5@2 g5 f5", D: "g5@6 a5 d5",
  E: "d5@6 d5@6 f5 g5 ~@2", F: "[g5,a5] [e5,f5] [c5,d5] [a4,bb4] ~@12", G: "~@4 g5 a5@2 bb5@2 a5 bb5@2 a5@2 g5@2",
  H: "d6@2 g5@6 g5@3 g5@2 g5@3", I: "d6 g5@7",
})).s("gm_overdriven_guitar").gain(0.24)

// chords · marimba · "Midi C16, T15"
const marimba = note(`<
  ~@2 A B A B A B A B A B A B A B A B A B A B A B A B C D A B A B A B A B A B A B A B A B C D 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 C D A B A B A B A B A E@2 A B A B A B A B A B A B A B A B A B A B A B A B C D A B A B A B A
  B A B A B A B A B C D 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 C D A B A B A B A B A E@2 ~
>`.pickRestart({
  A: "~ [g3,bb3,d4] ~ [e3,bb3,c4]", B: "~@2 [g3,bb3,d4]@2 ~ [e3,bb3,c4] ~ [e3,bb3,c4]", C: "[gb3,a3,d4]!8",
  D: "[gb3,a3,d4] ~@3", E: "[~@2 [g3,bb3,d4]@2 ~ [e3,bb3,c4] ~ [e3,bb3,c4]@9]/2",
})).s("gm_marimba").gain(0.48)

// bass · electric bass pick · "Midi C17, T16"
const bass = note(`<
  ~@2 A B A B A B A B A B A B A B A B A B A B A B A B C D A B A B A B A B A B A B A B A B E D 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 E D A B A B A B A B A F@2 A B A B A B A B A B A B A B A B A B A B A B A B C D A B A B A B A
  B A B A B A B A B E D 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 E D A B A B A B A B A F@2 ~
>`.pickRestart({
  A: "g2@3 bb2 c3@4", B: "g2@3 bb2 c3@2 c3@2", C: "d2!4", D: "d2 ~@3", E: "d2!4, g2@3 ~@5",
  F: "[g2@3 bb2 c3@2 c3@10]/2",
})).s("gm_electric_bass_pick").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~@2 A@23 B A@27 C A@3 B A@15 B A@10 D A@23 B A@27 C A@3 B A@15 B A@10 D ~>".pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "x ~@5 x ~ x ~@2 x ~@2 x ~", C: "x ~@2 x!5", D: "x",
})).gain(0.26)

// drums · rim
const rim = s("rim").struct(`<
  ~@2 A@11 B ~@15 C D@7 E ~@19 C D F G D@2 H F I A@20 C A@9 B ~@15 C A@7 B ~@19 C A@26 ~@2
>`.pickRestart({
  A: "x!4", B: "x!3 ~", C: "~@3 x", D: "~ x ~ x", E: "~ x ~@2", F: "x!2", G: "x ~@2 x", H: "~ x!3", I: "x ~ x!2",
})).gain(0.26)

// drums · snare
const snare = s("sd").struct(`<
  ~@2 A B A C D A@2 E A@3 B A@2 D F A G H E A@3 I B A@2 J A@2 D F A K L A@4 F A K L C A@3 F A K L B A@3 I B M A N A@3 F
  A K L F A O H I B P A J A@2 D F A K Q A B A C D A@2 E A@3 B A@2 D F A G H E A@3 I B A@2 J A@2 D F A K L A@4 F A K L C
  A@3 F A K L B A@3 I B M A N A@3 F A K L F A O H I B P A J A@2 D F A K Q ~
>`.pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@2 x ~@2 x!3", D: "~ x!2 ~ x ~@7 x ~@3", E: "~@4 x ~@6 x!3 ~@2", F: "~@2 x!2 ~@4",
  G: "~@4 x ~@5 x ~ x ~ x!2", H: "x!2 ~ x!2 ~@7 x ~@3", I: "~@4 x ~@3 x ~@2 x ~@2 x ~", J: "~ x!2 ~ x ~@11",
  K: "~@4 x ~@7 x!2 ~ x", L: "~ x ~ x!2 ~@7 x ~@3", M: "~@4 x ~ x!2 ~@3 x!3 ~@2", N: "~ x!2 ~ x ~@5 x ~ x ~ x ~",
  O: "~@4 x ~@7 x ~@2 x", P: "~@4 x ~ x!2 ~@4 x ~@3", Q: "~ x ~@14",
})).gain(0.26)

// drums · clap
const clap = s("cp").struct("<~@30 A@8 ~@11 B ~@3 B ~ B ~@2 C D E F A G H D B I B I ~@99>".pickRestart({
  A: "x!2", B: "~@5 x!2 ~", C: "x ~ x!2", D: "~ x ~ x", E: "~ x!2 ~", F: "x ~@3 x!3 ~", G: "x ~@2 x",
  H: "~@2 x ~@2 x!2 ~", I: "~@3 x",
})).gain(0.26)

// drums · low tom
const low_tom = s("lt").struct(`<
  A ~ B C ~ D E F G H ~ I E C J E ~ K I B L C ~ M N ~ C ~@2 O ~@2 N P ~@2 J ~@3 Q R S N T ~ N ~@2 U ~@4 B V W ~ X@2 ~@5
  Y ~@3 Z AA AB AC AD AE B E X ~@3 U M ~@3 AF ~ F E AG V H ~ AH E C ~ AG M Z AI F ~ C ~@4 C ~@2 X ~@3 U ~@6 AJ U ~ AJ D
  ~@4 U ~@4 V@3 ~ C@2 ~@5 U ~@3 Z ~@3 V AK V@2 X ~@3 U ~@4
>`.pickRestart({
  A: "~@7 x!2 ~@7", B: "x", C: "~@14 x!2", D: "x!2 ~@2", E: "x!2", F: "x!2 ~ x", G: "~ x!3", H: "x ~@9 x ~@3 x!2",
  I: "~ x ~@2", J: "~@3 x ~ x ~@10", K: "~@5 x!3", L: "~@13 x ~@2", M: "~@5 x ~@2", N: "~@3 x", O: "~@8 x ~@6 x",
  P: "~@12 x!3 ~", Q: "x ~@7 x ~@4 x ~@2", R: "~@8 x ~ x ~ x!3 ~", S: "~@12 x!2 ~@2", T: "~ x ~ x", U: "~@10 x ~ x!4",
  V: "x!4", W: "x ~ x!2", X: "~@15 x", Y: "~@10 x ~ x ~@2 x", Z: "~@10 x ~ x!3 ~", AA: "x ~ x ~ x!2 ~@10",
  AB: "x ~@2 x ~ x ~@2", AC: "x ~@3 x ~@3 x ~@2 x ~@2 x ~", AD: "x ~@2 x", AE: "~@8 x!2 ~@4 x!2", AF: "~@9 x ~@4 x ~",
  AG: "x ~@3 x ~@3 x ~ x!3 ~@3", AH: "~@4 x ~@4 x ~@6", AI: "~ x!2 ~", AJ: "~@2 x!2", AK: "x ~@3 x ~@3 x ~@3 x ~ x!2",
})).gain(0.26)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A ~ B@11 A C@5 D E B F ~ B@11 A C@3 D C D E B C G C@23 ~ C@6 E B@2 H C I C@3 J C@3 ~ C@7 ~ F ~ A ~@52 K@2 ~@11 L A
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~ x ~ x", D: "~@4 x ~@5 x!3 ~@3", E: "x ~@2 x", F: "~ x ~@2", G: "~@2 x ~@2 x!2 ~",
  H: "~@11 x!2 ~@3", I: "~ x", J: "~@4 x ~@7 x ~@2 x", K: "x ~ x ~ x ~ x ~ x ~ x!3 ~ x ~", L: "~ x!3",
})).gain(0.26)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  A ~ B C ~ D E F@2 G H ~ I C J ~@2 K L M N C ~ N O ~@4 P ~@2 G Q ~@2 J ~@3 R S T U G ~ G ~@2 Q ~@4 G ~@2 N ~ N ~@4 N V
  N ~@2 K W X Y G Z E H N ~@3 Q AA ~@3 AB ~ D AC AD F G H A I ~@2 AE N AF AG G ~@9 N ~@3 Q ~@6 U Q ~ U M ~@4 Q ~@9 N ~@5
  Q ~@2 N K ~@7 N ~@3 Q ~@4
>`.pickRestart({
  A: "~@10 x ~ x!3 ~", B: "~ x ~ x!2 ~@2 x", C: "~@15 x", D: "x", E: "~ x ~ x", F: "x ~@3 x!2 ~ x", G: "~ x",
  H: "~ x ~@2", I: "x!2 ~ x", J: "~@8 x ~@2 x!2 ~ x ~", K: "~@11 x ~@3 x", L: "~@3 x", M: "~@2 x!2", N: "~@7 x",
  O: "~@2 x ~@5 x ~ x!2 ~@4", P: "~@6 x!2", Q: "~@11 x ~@4", R: "~@2 x ~@4 x", S: "~@11 x!2 ~@3", T: "~@4 x ~@2 x",
  U: "x!2 ~@2", V: "~@11 x ~@2 x ~", W: "~@6 x ~ x ~ x!5 ~", X: "~@2 x ~@5 x ~@2 x ~@2 x ~", Y: "~ x ~ x ~ x!2 ~",
  Z: "~@4 x ~@5 x ~ x!3 ~", AA: "~@2 x ~ x ~ x ~@5 x!3 ~", AB: "~@10 x ~ x!4", AC: "~@2 x ~@3 x!2",
  AD: "x ~ x ~ x ~ x ~ x ~ x ~ x!4", AE: "x ~ x ~ x ~ x ~ x ~@3 x!4", AF: "~@2 x ~@5 x ~ x!2 ~@3 x", AG: "x ~@2 x",
})).gain(0.26)

// drums · open hat
const open_hat = s("oh").struct("<~@85 A@3 ~@24 B ~@2 B ~@8 B@2 ~@2 B@2 ~@10 A@11 ~@2 A ~@15>".pickRestart({
  A: "~@7 x", B: "~@2 x!2",
})).gain(0.26)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~ A ~ A@2 B A C D ~@6 E ~ F G H ~ A ~@4 I ~@2 I ~@3 J ~@6 B I ~ C D K ~@8 E ~ H ~@8 F ~@4 A E ~ H D C B ~@92
>`.pickRestart({
  A: "~@7 x", B: "~@3 x", C: "~ x", D: "x", E: "~ x ~ x", F: "~@13 x ~@2", G: "x!2", H: "~ x ~@2", I: "~@15 x",
  J: "~@10 x ~@2 x ~ x", K: "~@2 x!2",
})).gain(0.26)

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

// drums · ride
const ride = s("rd").struct(`<
  ~ A B@23 C B@42 D B@15 D B@4 E F B@3 C B@3 D G B@8 H I B@30 ~ J B@9 K L B@3 ~ J B@9 H ~
>`.pickRestart({
  A: "x!4", B: "x!8", C: "x!5 ~ x!2", D: "x!7 ~", E: "x!6 ~@2", F: "~@3 x!5", G: "x ~ x ~ x!4", H: "x", I: "~@5 x!3",
  J: "~@4 x!4", K: "~@2 x!3 ~@3", L: "~@2 x!6",
})).gain(0.26)

// drums · cowbell
const cowbell = s("cb").struct("<[x!2] [x!4] ~@167>").gain(0.26)

// drums · congas
const congas = s("conga:18").struct(`<
  ~@2 A B ~ C@7 ~ C@7 D C E F@3 G C@5 ~ C@23 H C F@2 I C J C@3 ~ K F@10 ~ B F@2 I C@5 ~ K F@10 ~@2 A B ~ C@7 ~ C@7 D C E
  F@3 G C@5 ~ C@23 H C F@2 I C J C@3 ~ K ~
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~ x ~ x", D: "~ x", E: "~@4 x!2 ~@10", F: "~ x ~@2", G: "x!2 ~ x", H: "~@2 x!2 ~@2 x ~",
  I: "x ~@3 x!3 ~@5 x ~@3", J: "~@4 x!3 ~@5 x ~@3", K: "x!2 ~@2",
})).gain(0.85)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  ~@2 A B C D@7 C D@7 E D@11 E D@33 F G D@10 A B D@8 F G D@10 F ~ A B C D@7 C D@7 E D@11 E D@33 F G ~
>`.pickRestart({
  A: "x ~@2 x", B: "~@5 x ~ x", C: "x ~@3 x!4", D: "x ~@3 x!2 ~@2", E: "x ~ x ~ x!2 ~@2", F: "x", G: "~@4 x!2 ~@2",
})).gain(0.85)

// drums · shaker
const shaker = s("sh").struct(`<
  ~ A B C@11 ~ D C@3 D E F G H I J C@10 ~ D E C@2 D E F K C L C L C K C@3 L C L C K C G C L C L C L C L C ~ D C@3 D E F
  G L@2 C ~ D L D M N C E ~ D G D G D G C ~ H I ~@68
>`.pickRestart({
  A: "~ x!3", B: "x!2 ~@2", C: "x!8", D: "~ x!7", E: "x!6 ~@2", F: "~@2 x!3 ~ x!2", G: "x!5 ~ x!2", H: "x!3 ~", I: "x",
  J: "x ~ x!3 ~ x!2", K: "x!5 ~ x ~", L: "x!7 ~", M: "x!4 ~@4", N: "~ x!6 ~",
})).gain(0.26)

// drums · claves
const claves = s("clave:2").struct(`<
  ~@2 A ~@3 A ~ A ~@5 A ~ B A B A B A C ~@3 C ~ C ~@5 C ~ D C D C D@2 A ~@3 A ~ A ~@5 A ~ B A B A B A C ~@3 C ~ C ~@5 C
  ~ D C D C D@2 A ~@3 A ~ A ~@5 A ~ B A B A B A C ~@3 C ~ C ~@5 C ~ D C D C D@2 ~@47
>`.pickRestart({
  A: "x!2 ~@6", B: "~ x ~@6", C: "~ x!2 ~@5", D: "~ x ~@2",
})).gain(1.3)

stack(
  overdriven_guitar, marimba, bass, kick, rim, snare, clap, low_tom, hihat, mid_tom, open_hat, high_tom, crash, ride,
  cowbell, congas, congas_2, shaker, claves
)

More by Santana