Strudelify
Black Magic Woman   Gypsy Queen cover art

Abraxas

Black Magic Woman Gypsy Queen

Santana

KeyD minorTempo122 bpm
0:00/0:00
// Black Magic Woman   Gypsy Queen — Santana
// 122 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 103 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(122/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 · electric bass finger · "bass"
const bass = note(`<
  ~@2 A B@2 C D E D E D E F G H I J G H K L M@2 N@2 M@2 O@2 M N M P L M@2 N@2 M Q R O M N M L M@2 N@2 M@2 O@2 M N M L
  M@2 N@2 M@2 O@2 M N M L M@2 N@2 M Q R O M N M L M@2 N@2 M Q R O M N M D E D E D E D E S T
>`.pickRestart({
  A: "~@7 a1", B: "[d2@7 a2]/2", C: "~@3 a2, d2", D: "d2@7 a1", E: "d2@3 a2", F: "d2@7 d2", G: "g1@3 d2 g2 g2@2 d2",
  H: "g1@3 d2 g2 g2@2 a2", I: "d2@3 a1 d2 d2@2 a1", J: "d2@3 a1 d2 d2@2 d2", K: "d2", L: "d2 ~@7",
  M: "d2@3 a2 c3!2 d3 c3", N: "a1@3 e2 g2!2 a2 g2", O: "g1@3 d2 f2!2 g2 f2", P: "d2@3 a2 c3!2 g2 f2",
  Q: "d2@3 a2 c3!2 a2 ab2", R: "g2@3 d2 f2!2 g2 f2", S: "d3 ~ c3@2 bb2@2 a2 ~ g2@2 f2@2 e2@2 db2 ~", T: "d2@3 ~@5",
})).s("gm_electric_bass_finger").gain(0.57)

// other · overdriven guitar · "guitar"
const overdriven_guitar = note(`<
  ~@5 A@2 B@2 C D@2 E@2 F@2 E@2 G H I@2 J K L M N@3 O P Q R S ~@23 T U V K W X Y@2 Z AA AB@2 AC AD J K AE AF@2 AG@4 AH
  ~@12 A@2 AI@2 A@2 AI@2 ~ AJ
>`.pickRestart({
  A: "[f4@15 d4, g4 ~@31]/2", B: "[e4@2 d4@29 f4]/2", C: "f4, g4 ~@15", D: "[e4 d4@15]/2",
  E: "[a4 ~@2 g4 ~@2 f4 e4@9]/2", F: "[g4 ~@2 f4 ~@2 e4 d4@9]/2", G: "g4 ~@2 f4 ~@2 e4 ~",
  H: "~@6 d4@2 ~@2 a4@2 d5@3 ~", I: "[~@4 d5@2 c5@2 d5@2 c5@2 a4 ~ d5@18]/2", J: "~@2 d5@6 d5 c5 ~ a4 g4 a4 g4 f4",
  K: "e4", L: "~@4 a4@2 c5@2 e5@2 f5@2 ~ e5@2 ~", M: "f5 e5 ~ d5 d5@6 a4 ~@5",
  N: "[~@2 d5@4 ~@2 d5 c5 ~ a4@3 a4@4 g4 f4 ~@6 g4 bb4 d5 e5@2 f5@2 g5@6 ~ a5@8]/3", O: "~ f5 ~ d5 f5@8 ~@4",
  P: "~ c6@5 d5@2", Q: "a4@2 g4 f4 g4@2 a4@2 g4@2 f4 [f4,g4] d4@2 c4@2", R: "d4 c4 a3 ab3 g3 f3 d3 c3",
  S: "[d4,a4,c5]@3 ~@5", T: "[c4,f4,a4] d5@3 d5@4 d5@3 d5@5", U: "d5 c5 a4@6",
  V: "~@4 f5 e5 d5@2 d5 c5 ~ a4@2 a4 g4 f4", W: "~@2 e4@2 f4@2 a4@2 ~ c5@2 e5@5", X: "~ f5 e5 d5@2 c5@2 d5@9",
  Y: "[~@2 g5@11 a5@7 g5@2 f5@2 a5@3 g5 f5@4]/2", Z: "~@5 c6@9 e5@2", AA: "f5@3 e5 d5@2 e5@2 f5@3 e5 d5@2 d5@2",
  AB: "[~@2 d5@2 c5@2 a4@2 a4 g4 ~ f4 ~@2 f4@4 d4@2 a4@2 c5@2 a4@2 g4 a4 g4 f4 ~@2]/2", AC: "~ c5 d5 ~ d5 e5 ~ c5",
  AD: "d5@2 ~@2 a4 g4 a4@7 ~@3", AE: "~@4 a4@3 c5@9", AF: "[d5@4 d5@6 c5 a4 ~@2 d5@4 f4@2 f4@6 ~@4 g4@2]/2",
  AG: "[bb4@2 d5@2 ~ f5 ~ g5@6 a5@9 c6@6 d6@6 ~@2 a4@2 a4@6 c5@2 d5@4 a4@2 c5@2 d5@2 a4@2 c5@2 d5@2 f5 d5, ~@2 e5 ~@29]/4",
  AH: "f5 d5 f5 d5 c5 a4 c5 a4 g4 f4 g4 f4 ~@4", AI: "[e4@2 d4@29 ~]/2", AJ: "[a3,d4] ~@7",
})).s("gm_overdriven_guitar").gain(0.63)

// chords · epiano1 · "piano"
const epiano1 = note(`<
  ~@34 A@2 B@2 A@2 C D A B E F A@2 B@2 A@2 C D A B E F G H I J A@2 C D A B E F G H I J K@2 L@2 K M K N O P Q R K@2 L S K
  M K T U T U T U T U V W
>`.pickRestart({
  A: "[c4,d4,f4,a4]@3 [c4,d4,f4,a4]@2 ~@2 d4, ~@5 d4@2 ~, ~@3 [f4,a4]", // Dm7 F
  B: "[c4,e4,g4,a4]@3 [c4,e4,g4,a4]@2 ~ [g4,a4] g4, ~@5 a3@2 ~, ~@3 [c4,e4]", // Am7 Gsus2 C
  C: "[bb3,d4,f4,g4]@3 [bb3,d4,f4,g4]@2 ~@2 bb3, ~@5 bb3@2 ~, ~@3 [d4,f4,g4]", // Gm7 G7
  D: "bb3 ~ f4 e4@2 [bb3,d4]@3, [d4,f4,g4] ~@3, ~ bb3@2 ~@5", // Bb G7
  E: "[c4,d4,f4,a4]@3 a4!2 ~ f4 e4, ~@3 [c4,d4,f4]@2 g4@2 ~", F: "[c4,d4] ~@7",
  G: "[c4,d4,f4,a4]@6 [c4,d4,f4,a4]@2 ~@2 [c4,d4,f4,a4]@2 [c4,d4,f4,a4] [c4,d4,f4,a4]@3", // Dm7
  H: "[c4,d4,f4,a4]@2 [c4,d4,f4,a4]@2 ~ [c4,d4,f4,a4]@3", // Dm7
  I: "[c4,e4,g4,a4]@6 [c4,e4,g4,a4]@2 ~@2 [c4,e4,g4,a4]@2 [c4,e4,g4,a4] [c4,e4,g4,a4]@3", // Am7
  J: "[c4,e4,g4,a4]@2 [c4,e4,g4,a4]@2 ~ [c4,e4,g4,a4]@3", K: "[c4,d4,f4,a4]@3 [c4,d4,f4,a4]@2 [c4,d4,f4,a4]@3",
  L: "[bb3,d4,f4,g4]@3 [bb3,d4,f4,g4]@2 [bb3,d4,f4,g4]@3", M: "[c4,e4,g4,a4]@3 [c4,e4,g4,a4]@2 [c4,e4,g4,a4]@3",
  N: "[c4,d4,f4,a4] ~@7", O: "[c4,d4,f4,a4]@3 [c4,d4,f4,a4]@2 [c4,d4,f4,a4] [c4,d4,f4,a4]@2",
  P: "[c4,d4,f4,a4]@2 [c4,d4,f4,a4]@3 [c4,d4,f4,a4]@3", // Dm7
  Q: "[c4,e4,g4,a4]@3 [c4,e4,g4,a4]@2 [c4,e4,g4,a4] [c4,e4,g4,a4]@2", // Am7
  R: "[c4,e4,g4,a4]@2 [c4,e4,g4,a4]@3 [c4,e4,g4,a4]@3", S: "[bb3,d4,f4,g4] bb3 f4 e4@2 [bb3,d4]@3",
  T: "c4 d4 a3 c4 d4 a3 c4 d4", U: "c4 d4 a3 c4 d4@4", V: "d5 ~ c5@2 bb4@2 a4 ~ g4@2 f4@2 e4@2 db4 ~",
  W: "[a3,c4,d4,f4]", // Dm7
})).s("gm_epiano1").gain(0.58).pan(0.2)

// chords · percussive organ · "organ"
const percussive_organ = note("<~ A B A B@2 A B A B A B C D@2 E@2 D@2 F@2 G@2 H@2 G@2 I@2 J K L@3 ~@69>".pickRestart({
  A: "c5 d5 a4 c5 d5 a4 b4 d5, d3 e3 d3 e3", B: "c5 d5 a4 c5 d3@2 e3@2, d3 e3 d5@2",
  C: "c5 d5 a4 c5 d5 a4 c5 d5, d3 e3 d3 e3", D: "[f4,g4,bb4,d5]/2", E: "[f4,a4,c5,d5]/2", F: "[[f4,a4,c5,d5]@9 ~@7]/2",
  G: "[d4,f4,a4]/2", H: "[c4,e4,a4]/2", I: "[bb3,d4,g4]/2", J: "[d4,f4,a4]", K: "[c4,e4,a4]",
  L: "[[d4,f4,a4]@17 ~@7]/3", // Dm
})).s("gm_percussive_organ").gain(0.64).pan(0.3)

// chords · electric guitar jazz · "Rym GutR"
const electric_guitar_jazz = note(`<
  ~@34 A@2 B@2 A@2 C@2 A B A D E A B@2 A@2 C@2 A B A ~@24 F A@2 B@2 A@2 C@2 A B A ~@10
>`.pickRestart({
  A: "[c4,f4,a4]@4 ~@2 [c4,f4,a4] ~@3 [c4,f4,a4] ~@3 [c4,f4,a4] ~", // F
  B: "[g3,c4,e4,a4]@4 ~@2 [g3,c4,e4,a4] ~@3 [g3,c4,e4,a4] ~@3 [g3,c4,e4,a4] ~", // Am7
  C: "[f3,bb3,d4,g4]@4 ~@2 [f3,bb3,d4,g4] ~@3 [f3,bb3,d4,g4] ~@3 [f3,bb3,d4,g4] ~", D: "[c4,f4,a4] ~@15",
  E: "~@2 [c4,f4,a4]@2 ~@2 [c4,f4,a4] ~@3 [c4,f4,a4] ~@3 [c4,f4,a4] ~", F: "~ g4 ab4 a4 c5 d5 e5 f5",
})).s("gm_electric_guitar_jazz").gain(0.4).pan(0.8)

// drums · kick
const kick = s("bd").struct("<~@58 [x!4]!11 x [x!4]!12 ~@21>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<[x!4] ~@102>").gain(0.25)

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

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@9 A ~@9 B ~@3 C ~@2 D ~@2 E ~@73>".pickRestart({
  A: "x!2 ~@14", B: "~ x ~@2", C: "~ x!2 ~", D: "~@4 x!2 ~@10", E: "x",
})).gain(0.05)

// drums · ride
const ride = s("rd").struct("<~@3 A ~@15 B ~@38 C D@10 A C D@10 A ~@21>".pickRestart({
  A: "x", B: "x!2", C: "~@3 x!2 ~ x ~ x!5 ~ x ~", D: "x ~@2 x!2 ~ x ~ x!5 ~ x ~",
})).gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@5 A B C@2 D@2 E F G H I J K L B M A G E L@2 D G@2 N O D C M ~@59 L C I L@2 C I L@2 ~
>`.pickRestart({
  A: "x!5 ~ x!3 ~ x!6", B: "x ~ x!11 ~ x!2", C: "x ~ x!3 ~ x!3 ~ x!6", D: "x ~ x!7 ~ x!3 ~ x!2", E: "x ~@2 x!13",
  F: "x!9 ~ x!3 ~ x!2", G: "x ~ x!14", H: "x ~@2 x!2 ~ x!3 ~ x!6", I: "x ~@2 x!6 ~ x!3 ~ x!2", J: "x!9 ~ x!6",
  K: "x ~ x!7 ~@2 x!5", L: "x ~ x!7 ~ x!6", M: "x", N: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", O: "x ~ x!3 ~ x!10",
})).gain(0.25)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct(`<
  ~@5 A B C@2 D@2 E F G H I J K L B ~ A G E L@2 D G@2 M N D C ~@60 L C I L@2 C I L@2 ~
>`.pickRestart({
  A: "~@5 x ~@3 x ~@6", B: "~ x ~@11 x ~@2", C: "~ x ~@3 x ~@3 x ~@6", D: "~ x ~@7 x ~@3 x ~@2", E: "~ x!2 ~@13",
  F: "~@9 x ~@3 x ~@2", G: "~ x ~@14", H: "~ x!2 ~@2 x ~@3 x ~@6", I: "~ x!2 ~@6 x ~@3 x ~@2", J: "~@9 x ~@6",
  K: "~ x ~@7 x!2 ~@5", L: "~ x ~@7 x ~@6", M: "~ x ~@3 x ~@3 x ~@3 x ~@2", N: "~ x ~@3 x ~@10",
})).gain(0.15)

// drums · cowbell
const cowbell = s("cb").struct("<~@34 A@11 B A@11 B A@11 B A@11 B A@11 C@9 B>".pickRestart({
  A: "x!4", B: "x", C: "x ~ x ~ x!2 ~@2 x ~ x!2 ~ x ~ x",
})).gain(0.35)

// drums · bongos
const bongos = s("bongo:4").struct("<~@4 A B@15 C B@7 D B@4 C ~@47 E ~@21>".pickRestart({
  A: "~@8 x ~@2 x ~@2 x ~", B: "x!5 ~@3 x!5 ~@3", C: "x", D: "x!5 ~@3 x ~ x!3 ~@3", E: "~@12 x!4",
})).gain(0.78)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@5 [~@3 x ~@4]!15 ~ [~@3 x ~@4]!12 ~@70>").gain(0.78)

// drums · congas
const congas = s("conga:18").struct("<~@5 [~ x ~@3 x ~@2]!15 x [~ x ~@3 x ~@2]!12 x ~@48 [~ x ~@3 x ~@2]!20 x>")
  .gain(1.27)

// drums · congas
const congas_2 = s("conga:33").struct("<~@2 A ~ B C@15 ~ C@12 ~@49 C@20 ~>".pickRestart({
  A: "~@8 x ~@2 x ~@4", B: "~@8 x ~@2 x ~@2 x!2", C: "~@6 x!2 ~@6 x!2",
})).gain(1.27)

// drums · ht
const ht = s("ht").struct("<~@2 A ~@30 B C@11 D C@10 E F ~@11 G ~@33>".pickRestart({
  A: "~@8 x ~@2 x ~@4", B: "~ x ~ x", C: "~@3 x ~ x ~ x", D: "~ x", E: "~@6 x ~@3 x ~@3 x!2", F: "~@2 x ~@2 x!2 ~",
  G: "~ x ~@2 x ~@2 x",
})).gain(0.15)

// drums · mt
const mt = s("mt").struct("<~@33 A B@11 C B@11 D ~@11 E ~@33>".pickRestart({
  A: "~ x ~@3 x ~@2", B: "x", C: "x ~@11 x!4", D: "x!2 ~ x!2 ~@2 x", E: "~@4 x!2 ~@4 x!2 ~@4",
})).gain(0.2)

// drums · shaker
const shaker = s("sh").struct("<~@34 A@11 B A@11 B A@11 B A@11 B A@11 ~@10>".pickRestart({
  A: "x!4", B: "x",
})).gain(0.45)

stack(
  bass, overdriven_guitar, epiano1, percussive_organ, electric_guitar_jazz, kick, hihat, crash, crash_soft, ride,
  tambourine, tambourine_soft, cowbell, bongos, bongos_2, congas, congas_2, ht, mt, shaker
)

More by Santana