Strudelify
Samba Pa Ti cover art

Abraxas

Samba Pa Ti

Santana

KeyD majorTempo86 bpm
0:00/0:00
// Samba Pa Ti — Santana
// 86 bpm, 4/4, key D 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 94 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(86/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 · fretless bass · "El Bass"
const bass = note(`<
  ~ A B C D E B C D F D G@2 D B D H@2 A B C D E B C D F D G@2 D B D H@2 A B D F A B D I J K J L J K J L J K J L J K J L
  J K J L J K J L J K J L J K J L J K J L J K J L J L J L J L J L M@3
>`.pickRestart({
  A: "g2@15 ~", B: "b2", C: "e2", D: "a2", E: "g2", F: "d2", G: "d2/2", H: "[d2@31 ~]/2",
  I: "d2@2 d2@3 ~ d2@4 d2@2 d2 e2 g2 e2", J: "g2@2 ~ g2 g2@2 ~ g2 g2@2 ~ g2@2 d2 e2@2",
  K: "a2@2 ~ a2 a2@2 ~ a2!2 d2 e2 a2@2 g2 e2 d2", L: "a2@2 ~ a2 a2@2 ~ a2 d2 e2 g2 a2 ~ g2 e2 d2", M: "[g1@13 ~@3]/3",
})).s("gm_fretless_bass").gain(0.23)

// chords · drawbar organ · "Organ"
const drawbar_organ = note(`<
  ~ A B C D A B E@2 F D G@2 D B D G@2 A B C D A B E@2 F D G@2 D B D H@2 A B D F A B D F A I J I A I J I A I J I A I J I
  A I J I A I J I A I J I A I J I A I J I A I J I J I J I J I J I K@2 ~
>`.pickRestart({
  A: "[g4,b4,d5]", B: "[b4,d5,f#5]", C: "[g4,b4,e5]", D: "[a4,c5,e5]", E: "[[g4,b4] [a4,c5], e5]/2", F: "[a4,d5,f#5]",
  G: "[a4,d5,f#5]/2", // D
  H: "[~@4 [a5,a#5,d6] ~ [a5,a#5] ~@3 [a5,a#5] ~ g5@2 e5 ~ g5@2 e5 ~ [d5,d#5] ~ d5@2 ~@2 a4@2 g4@2 e4 ~, ~@4 b5@2 d6@12 ~@2 e5@2 ~@4 a#4 ~@5, ~@6 b5@3 ~@11 g5@7 ~@5]/2", // A#maj7 D#maj7
  I: "[a4,c5,e5]@2 [b4,d5,f#5] [a4,c5,e5]", J: "g4@3 f#5, [b4,d5]", K: "[g4,b4,d5]/2",
})).s("gm_drawbar_organ").gain(0.19)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note("<~@18 A B@3 C D@3 E F@3 G H I J@2 A K@2 E A K@2 E ~@51>".pickRestart({
  A: "[g2,d3,b3]", B: "[~@2 a3@2 e2@4 ~@3 e4, d4@2 [a2,c4], [b2,f#3]@4 [e3,g3]@7 ~]/3", C: "b3@6 a3@6 g3@3 ~, [g2,d4]",
  D: "[f#3 e2 [a2,c4], [b2,d4]@2 ~, a3@15 ~ g3@32]/3", E: "~ b3@15, [d2,a3,d4]",
  F: "[[g3,c4] [d2,f#3,d4]@2, a2@7 ~@5]/3", G: "[a2,g3,c4,e4]", H: "[b2,a3,d4,f#4]", I: "[a2,c4,e4,g4]",
  J: "[d3,d4,f#4,a4]/2", K: "[~@2 a3@2 ~@3 e4, d4, [b2,f#3] [a2,c4]]/2",
})).s("gm_string_ensemble_1").gain(0.16)

// drums · kick
const kick = s("bd").struct(`<
  ~ A@10 B ~ A@3 B C A@10 B ~ A@3 B C A@7 D E F G@2 E F G@2 E F G@2 E F G@2 E F G@2 E F G@2 E F G@2 E F G@2 E F G@2 E F
  G@10 B ~@2
>`.pickRestart({
  A: "x ~@6 x", B: "x", C: "~@7 x", D: "x ~@2 x ~ x ~ x", E: "x ~@3 x ~@2 x!2 ~@2 x!2 ~@3",
  F: "x ~@2 x!2 ~@2 x!2 ~@3 x ~ x ~", G: "x ~@2 x!2 ~@2 x!2 ~@2 x!2 ~ x ~",
})).gain(0.21)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@43 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@13
>`.pickRestart({
  A: "~@3 x ~@10 x ~", B: "~@11 x ~@4",
})).gain(0.11)

// drums · rim
const rim = s("rim").struct("<~ A@10 ~@2 A@3 ~ B A@10 ~@2 A@3 ~ B A@7 C ~@51>".pickRestart({
  A: "~ x ~ x", B: "~@3 x", C: "~ x ~@2",
})).gain(0.24)

// drums · clap
const clap = s("cp").struct("<~@43 [~@7 x]!48 ~@3>").gain(0.26)

// drums · low tom
const low_tom = s("lt").struct("<~@42 [~@3 x] ~@51>").gain(0.26)

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

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

// drums · crash
const crash = s("cr").struct("<~@43 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@11 A ~@2>".pickRestart({
  A: "x",
})).gain(0.21)

// drums · ride
const ride = s("rd").struct("<~ A ~@9 A ~ A ~@2 A ~ A ~@9 A ~ A ~@2 A ~ A ~@3 A ~@2 B ~@51>".pickRestart({
  A: "x", B: "x!6 ~@2",
})).gain(0.19)

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

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~ A@2 B@8 ~@2 B@3 ~@2 A@2 B@8 ~@2 B@3 ~@2 A@2 B@2 A@2 B@2 C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D
  C D C D C D C D C D C D C D C D C D ~@3
>`.pickRestart({
  A: "x ~@2 x", B: "~@3 x", C: "~@6 x!2 ~@6 x!2", D: "~@6 x!2 ~@7 x",
})).gain(0.85)

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

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@43 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@11 ~@3
>`.pickRestart({
  A: "x ~@2 x!2 ~ x!3 ~ x!3 ~ x!2", B: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2",
})).gain(0.8)

stack(
  bass, drawbar_organ, string_ensemble_1, kick, kick_soft, rim, clap, low_tom, hihat, open_hat, crash, ride, congas,
  congas_2, congas_3, cabasa
)

More by Santana