Strudelify

Besame Mucho

Apollo 100

KeyA minorTempo120 bpm
0:00/0:00
// Besame Mucho — Apollo 100
// 120 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: bank select 127 (Roland MT-32 map) read through the MT-32 patch table: 
// note: duplicate parts dropped: ch 5 "CLEAN GTR" electric guitar clean (copy of ch 4 "STRINGS" string ensemble 1)
// note: Full arrangement: all 105 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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(`<
  ~ A B C A D C E F G H I J C K L M A N C@2 O C P C Q A R S C@2 T U O P V W D K T X C B C Y O C Z C O A AA AB C@2 T AC O
  P AD@2 C K O@2 A B D AE O AF AG C O C AH AI D C L O@2 AJ D C V K L O AF B D C A AK D AL ~@8
>`.pickRestart({
  A: "a1@6 c2@2 e2@4 c2@3 ~", B: "b1@5 ~ b1@2 e2@8", C: "a1@3 c2 e2@2 c2@2", D: "a1@3 c2 e2@2 c2 b1",
  E: "d2@3 f2 a2@2 f2 e2", F: "d2@2 ~ d2@3 f2@2 a2@4 f2@4", G: "d2@5 d2@3 f2@4 a2@4", H: "e2@5 ~ e2@2 g#2@4 b1@4",
  I: "a1@5 ~ a1@2 e2@4 f#2@4", J: "a1@6 e2@2 f#2@4 g#2@3 ~", K: "a1@3 c#2 e2@2 c#2@2", L: "d2@3 f2 a1@2 f2 e2",
  M: "d2@6 f2@2 a1@4 f2@3 ~", N: "b1@5 ~ b1@2 e2@7 ~", O: "d2@3 f2 a1@2 f2@2", P: "e2@3 g#1 b1@2 g#1@2",
  Q: "d2@3 f2@2 a1@2 f2", R: "b1@5 ~ b1 ~ f2@6 f2@2", S: "e2@3 e2 g#1@2 b1@2", T: "d2@6 f2@2 a1@3 f2@3 e2@2",
  U: "d2@3 f2@3 a1@2 f2@4 e2@4", V: "a1@3 e2 f#2@2 g#1@2", W: "a1@3 e2 f#2@2 g#2@2", X: "d2@3 d2@3 f2@2 a1@4 f2@4",
  Y: "a1@5 ~ a1@2 a1@8", Z: "e2@5 ~ g#1@2 b1@4 g#1@4", AA: "b1@5 ~ b1 ~ f2@5 ~ f2@2", AB: "e2@6 f#2 g#1",
  AC: "d2@3 a1 f2@2 e2@2", AD: "a1@6 c2@2 e2@3 c2@3 b1@2", AE: "a1@6 a1 ~ a1@8", AF: "a1@2 c2 e2",
  AG: "e2@2 ~ g#1 b1@2 g#1@2", AH: "b1@5 ~ b1 ~ f2@7 ~", AI: "e2@5 ~ e2@2 e2@2 e2@2 f#2 ~ g#1 ~",
  AJ: "e2@3 g#1 b1@2 g#1 ~", AK: "b1@5 ~ b1 ~ e2@7 ~", AL: "a1@5 ~ a1@2 a1 ~@7",
})).s("gm_acoustic_bass").gain(0.35)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~ A B C@2 D@2 E@2 F G H@2 I J K@2 L M N@2 F O P Q R S T U V Q W@2 X Y Z@2 AA AB AC AD AE@3 AF AG AH AI AJ AK AL AM AN
  AO@2 AP AQ AR AS AT AU AV AW AX AY AZ BA BB BC BD BE BF BG BH BI AM BJ BK BL AX BM BN BO BP BQ BR BS BT BU@3 BV BW
  BX@2 BY BZ ~@8
>`.pickRestart({
  A: "~@8 e5@2 ~@2 e5@2 c5 ~, ~@6 a4@9 ~, ~@7 c5@3 a5@5 ~",
  B: "~@7 a4 d5 ~@3 [g#4,b4,e5] ~@3, ~@6 [d4,f4]@3 ~@2 e4@2 ~@3", // E Dm
  C: "[~@7 c5 e5@3 c5@3 [b4,c5] a4@10 ~@7, ~@6 a4@2 ~@7 b4 ~@16]/2", // Cmaj7
  D: "[~@10 [a4,c5,e5] ~@5 e5@11 ~@5, ~@14 a4@13 ~@5, ~@15 c5@12 ~@5]/2", // Am
  E: "[~@10 d4@2 f4@2 a4@4 f4@3 ~ [e4,f4] e4 d4@2 [f4,a4] ~@5]/2", F: "~@6 [d4,f4,a4] ~@9", G: "~@6 [e4,g#4,b4] ~@9",
  H: "[~@7 [c5,e5]@3 ~@6 a4@8 ~@6 [a4,e5] ~, ~@6 a4@7 ~ e5@11 ~@7, ~@10 a5@15 ~@7, ~@15 c5@9 ~@8]/2", // C A5
  I: "~@6 [a4,c5,e5] ~@3 [a4,c5,e5] ~@3 [a4,c5,e5]@2", J: "~@6 [a4,c#5,e5] ~@3 [a4,c#5,e5] ~@3 [a4,c#5,e5] ~",
  K: "[~@10 d4@2 f4@2 a4@4 f4@3 ~ e4 [e4,f4] d4@5 ~@3]/2", L: "~@3 [a4,c5,e5] ~@8 [a4,c5,e5] ~@3",
  M: "~@3 [b4,d#5,f#5] ~@2 [b4,d#5,f#5] ~@5 [e4,g#4,b4] ~@3", // B E
  N: "[~@7 e5@3 ~@6 a4@9 ~@3 c5@2 e5@2, ~@6 a4@6 ~@2 e5@11 ~@7, ~@6 c5@4 a5@15 ~@7, ~@15 c5@10 ~ a4@6]/2",
  O: "~@6 [a4,c5,e5] ~@9", P: "~@10 [e4,g#4,b4] ~@3 [e4,g#4,b4] ~", Q: "~@6 [a4,c5,e5] ~@3 [a4,c5,e5] ~@5",
  R: "~@6 [d4,f4,a4] ~@3 [d4,f4,a4] ~@5", S: "~@8 c5@3 e5@3 c5 ~, ~@5 a4@9 ~@2",
  T: "[b4,d#5,f#5]@2 ~ [b4,d#5,f#5]@2 f#5 [a4,b4,d#5] ~ [f4,a4,c5]@2 ~ [f4,a4,c5]@2 a4 [f4,c5] ~", // B B7 F F5
  U: "[e4,g#4,b4]@6 [e4,g#4] [g#4,b4] ~@4 g#4@2 b4 ~, ~@10 e4@5 ~", V: "~@6 [a4,c5,e5] ~@7 [a4,c5,e5] ~",
  W: "[~@6 [d4,f4,a4] ~@3 d4@2 f4@2 a4@4 f4@4 e4 [e4,f4] ~@2 f4@4 a4 ~, ~@24 d4@7 ~]/2", // Dm Fmaj7
  X: "~@6 [d4,f4,a4] ~@7 [d4,f4,a4] ~", Y: "~@6 [e4,g#4,b4] ~@7 [e4,g#4,b4] ~",
  Z: "[~@6 a4@2 c5@2 e5@2 c5@2 [b4,c5] a4@4 ~@3 [a4,c5,e5] ~@3 [a4,c5,e5] ~@3 [a4,c5,e5] ~, ~@15 b4 ~@16]/2", // Cmaj7 Am
  AA: "~@3 [a4,c5,e5]@4 ~", AB: "~@6 [a4,c#5,e5]@9 ~", AC: "~@6 d4@2 f4@2 a4@2 f4@2 e4 [e4,f4]",
  AD: "~@6 f4@2 a4@4 f4 ~@3, d4@9 ~@7",
  AE: "[~@3 c5@3 ~@2 c5@5 ~@3 [d#5,f#5]@5 ~@3 [g#4,b4]@5 ~@3 e5@10 c5@4 b4!2, a4@14 ~ b4@6 ~@2 e4@6 ~@2 a4@11 ~@6, ~@6 e5@8 ~@17 c5@5 ~@12]/3", // D#m G#m
  AF: "~@6 e5 ~, a4@7 ~, ~@4 c5@3 ~", AG: "~@6 d4@2 f4@2 a4@2 f4@2 e4 ~",
  AH: "~@4 c5@2 ~@4 c5@2 a4@2 c5 ~, ~ a4@3 ~@4, ~@3 e5@4 ~", AI: "~@6 g#4@2 ~@3 g#4@3 e4 ~, ~ e4@2 ~, ~@4 b4@3 ~",
  AJ: "~@4 c5@2 ~@2 c5@2 a4@4 c5 ~, ~ a4@3 ~@4, ~@3 e5@4 ~", AK: "~@4 f4@2 ~@4 f4@2 d4@2 f4 ~, ~ d4@4 ~@3, ~@3 a4@4 ~",
  AL: "~@4 c5@2 ~@2 c5@2 ~@2 c5@2 e5 ~, ~ a4@3 ~ a4@2 ~, ~@6 e5@5 ~@5",
  AM: "[b4,f#5]@2 ~ [b4,d#5,f#5]@2 ~ [b4,d#5,f#5] ~ [f4,a4,c5] ~@2 [f4,a4,c5]@2 ~ [f4,a4,c5] ~, d#5 ~@15", // B5 B F
  AN: "[e4,g#4,b4]@5 ~@2 g#4 ~@2 g#4@2 e4@2 g#4 ~, ~@6 e4@2 b4@7 ~", // E
  AO: "[~@4 c5@2 e5@4 c5@3 ~ [b4,c5] a4@2 ~ [a4,c5,e5] ~@3 [a4,c5,e5] ~@3 [a4,c5,e5] ~@5, ~@2 a4@8 ~@5 b4 ~@16]/2", // Cmaj7 Am
  AP: "~@4 f4@2 a4@4 f4@4 e4 [e4,f4], ~@2 d4@9 ~@5", AQ: "~@6 f4@2 a4@3 f4@3 e4@2, d4@5 ~@3",
  AR: "d4@5 ~ [d4,f4,a4] ~@5 d4@2 f4 ~", AS: "~@8 g#4@3 b4@3 g#4 ~, ~@6 e4@9 ~",
  AT: "~@6 c5@2 e5@3 c5@2 ~ b4 [b4,c5], ~@4 a4@5 ~@7", // Cmaj7
  AU: "a4 ~ [a4,c5,e5] ~@3 [a4,c5,e5] ~@3 [a4,c5,e5] ~@3 [a4,c5,e5] ~", AV: "~@4 c5@2 ~@4 c5@2 a4@2 c5 ~, ~@2 a4@9 ~@5",
  AW: "[a4,c#5,e5]@2 ~@2 c#5@2 e5@4 c#5@2 a4@2 c#5 ~, ~ a4@4 ~@3", AX: "~@4 f4@2 a4@4 f4@4 e4 [e4,f4], ~ d4@4 ~@3",
  AY: "d4 ~ [d4,f4,a4] ~@5 f4@4 a4 ~@3, ~@6 d4@7 ~@3", AZ: "~@3 c5@3 ~@2 c5@4 a4 ~@3, a4@9 ~@7, ~@6 e5@7 ~@3",
  BA: "b4@3 d#5@3 b4 ~ [e4,g#4]@2 ~ g#4@3 e4 ~, f#5@6 ~@2 f#4 ~@2 e4 ~@4, d#5 ~@7 b4@6 ~@2", // E
  BB: "~@2 c5@4 e5@2 c5@4 b4@2 c5 b4, a4@3 ~", BC: "a4@2 [c5,e5] ~@3 [c5,e5]@4 ~@2 c5@2 e5 ~, ~@6 a4@3 ~ a4@4 ~@2",
  BD: "~@2 d4@2 f4@2 a4@4 f4@2 d4 ~@3", BE: "~@4 c5@2 ~@4 c5@2 a4@2 c5 ~, ~ a4@4 ~@3, ~@6 e5@9 ~",
  BF: "~@4 g#4@2 ~@4 g#4@2 ~ g#4 ~@2, ~ e4@4 ~ e4 ~, ~@3 b4@3 ~@2", BG: "~@2 c5 ~@2 c5 a4 ~, ~ a4@9 ~@6, ~@6 e5@7 ~@3",
  BH: "~@4 f4@2 ~@4 f4@2 d4 ~@3, d4@5 ~@3, ~@3 a4@4 ~", BI: "~@4 c5@2 ~@4 c5@2 a4@2 c5 ~, ~ a4@4 ~@3, ~@3 e5@4 ~",
  BJ: "[e4,g#4,b4]@6 e4 g#4 ~ g#4@3 e4@2 g#4 ~, ~@8 b4@7 ~", // E
  BK: "~@2 [a4,e5] ~@5 c5@2 e5@2 c5@2 b4 [b4,c5], ~@3 a4@3 ~@2", // A5 Cmaj7
  BL: "a4@2 [c5,e5] ~@3 [a4,c5,e5] ~@5 c5@2 e5 ~, ~@10 a4@5 ~", BM: "~@2 f4@4 a4@2 f4@4 e4@2 f4 e4, d4 ~",
  BN: "~ f4@2 ~@3 d4 ~, d4@8 f4@7 ~, ~@6 a4@9 ~", BO: "~@3 g#4@3 ~@2 g#4@4 e4@2 g#4 ~, e4@9 ~@7, ~@6 b4@9 ~",
  BP: "~@4 c5@2 e5@4 c5@2 b4@2 c5 [a4,b4], ~ a4@4 ~@3", BQ: "~@2 c5 ~@2 c5 a4 ~, ~ a4@4 ~@3, ~@3 e5@4 ~",
  BR: "e5@2 ~@2 c5@2 ~@4 c5@2 a4@2 c5 ~, c4 ~ a4@8 ~@6, ~@3 e5@4 ~",
  BS: "[c#5,e5]@2 ~@2 c#5@2 ~@4 c#5@2 a4@2 c#5 ~, a4 ~ a4@8 ~@6, ~@3 e5@4 ~", // C#m
  BT: "~@4 f4@2 a4@4 f4@3 e4 f4 e4, ~ d4@2 ~@5",
  BU: "[~@2 f4@4 ~@2 f4@4 d4 ~@3 c5@3 ~@3 c5@2 a4@4 c5@2 ~@2 d#5@3 f#5@3 d#5 ~@4 g#4@3 b4 ~, d4@6 a4@7 ~@2 a4@7 ~@9 b4@7 ~@2 e4@6 ~@2, ~@19 e5@11 ~@18]/3",
  BV: "~@6 c5@2 e5@4 c5@2 [b4,c5] b4, a4@7 ~", BW: "~@6 c5@2 ~@2 c5@2 a4@2 c5 ~, a4@5 ~@3, ~@8 e5@5 ~@3",
  BX: "[~@2 c5@4 ~@2 c5@4 a4 ~@6 d#5@3 b4 ~@3 g#4@2 b4@2 g#4 ~, a4@9 ~@5 b4@6 ~@4 e4@6 ~@2, ~@6 e5@6 ~@3 d#5@2 ~@15, ~@16 f#5@7 ~@9]/2",
  BY: "~@6 c5@2 e5@3 c5@3 b4@2, a4@13 ~@3", BZ: "a4 ~@5 [a4,e5]@2 [a4,c5,e5] ~@7, ~@6 c5 ~@9",
})).s("gm_string_ensemble_1").gain(0.3)

// drums · kick
const kick = s("bd").struct("<~ [x ~@2 x!2 ~@3]!95 [x ~@2 x ~@4] ~@8>").gain(0.4)

// drums · rim
const rim = s("rim").struct(`<
  ~ A@3 ~ A@3 ~ A@3 ~ A@15 ~ A@7 ~ A@7 ~ A@3 ~ A@3 ~ A@7 ~ A@7 ~ A@3 ~ A@3 ~ A@7 ~ A@3 ~ A@3 ~ A ~ A@2 ~@8
>`.pickRestart({
  A: "~ x ~@2",
})).gain(0.4)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@4 A ~@3 A ~@3 A ~@15 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~ A ~@10
>`.pickRestart({
  A: "~@10 x ~ x!3 ~",
})).gain(0.35)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@4 A ~@3 A ~@3 A ~@15 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~ A ~@10
>`.pickRestart({
  A: "~@3 x!2 ~@3",
})).gain(0.35)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@4 A ~@3 A ~@3 A ~@15 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~ A ~@10
>`.pickRestart({
  A: "x ~ x!3 ~@11",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct("<~@96 [x ~@2 x!2 ~@3] ~@8>").gain(0.2)

// drums · ride
const ride = s("rd").struct("<~ [x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~]!95 ~@9>").gain(0.25)

// drums · congas
const congas = s("conga:18").struct(`<
  A B@3 ~ B@3 ~ B@3 ~ B@15 ~ B@7 ~ B@7 ~ B@3 ~ B@3 ~ B@7 ~ B@7 ~ B@3 ~ B@3 ~ B@7 ~ B@3 ~ B@3 ~ B ~ B ~@9
>`.pickRestart({
  A: "~@4 x!2 ~@2", B: "~ x ~@3 x ~@2",
})).gain(1.27)

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

// drums · cabasa
const cabasa = s("cabasa:4").struct("<[~@4 x!4] [x!4]!95 ~@9>").gain(1.01)

stack(bass, string_ensemble_1, kick, rim, low_tom, mid_tom, high_tom, crash, ride, congas, congas_2, cabasa)