Strudelify

El Bandido

Frank Galan

KeyB♭ majorTempo120 bpm
0:00/0:00
// El Bandido — Frank Galan
// 120 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 105 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. 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.

// chords · marimba · Dm Eb Dm Eb Dm
const marimba = note(`<
  ~@9
  [~@2 [d4,f4] ~@3 [d4,f4] ~ [d4,f4] ~@2 [eb4,g4] ~@2 [d4,f4] ~]
  ~@28
  [~@2 [d4,f4] ~@3 [d4,f4] ~ [d4,f4] ~@2 [eb4,g4] ~@2 [d4,f4] ~]
  ~@66
>`).s("gm_marimba").gain(0.08).pan(0.3)

// bass · synth bass 1 · "SYN BASS 1"
const bass = note(`<
  A@8 B ~ C D E@4 F E@3 C G H@2 E@2 C@2 I J K L@2 M@2 L@2 N O L P M@4 Q M@3 L R S@2 M@2 L@2 T N O L@2 M@2 L@2 M U V@2 W
  V@3 X Y Z@2 V@2 X@2 AA AB AC X@2 V@2 X@2 V@2 X@2 V@2 X@2 V@2 X@2 AB AD
>`.pickRestart({
  A: "f1 ~ f2 ~ f1 ~ f2 ~ f1 ~ f2 ~ f1 ~ eb1!2", B: "f1 ~ f2 ~ f1 ~ f2 ~ f1 ~@3 f1 ~@3",
  C: "f1 ~@3 f1 ~@3 f1 ~@3 f1 ~@3", D: "f1 ~@3 f1 ~@3 f1 ~@3 f1 ~ f1 g1", E: "bb1 ~@3 bb1 ~@3 bb1 ~@3 bb1 ~@3",
  F: "bb1 ~@3 bb1 ~@3 bb1 ~@3 bb1 ~ f1 g1", G: "f1 ~@3 f1 ~@3 f1 ~@3 e1 ~@3", H: "eb1 ~@3 eb1 ~@3 eb1 ~@3 eb1 ~@3",
  I: "eb1 ~@3 eb1 ~@3 f1 ~@3 f1 ~@3", J: "bb1 ~@3 bb1 ~@3 f1 ~@3 f1 ~@3", K: "bb1 ~@15", L: "f1 ~ f1 ~ f1 ~ f1 ~",
  M: "bb1 ~ bb1 ~ bb1 ~ bb1 ~", N: "bb1 ~ bb1 ~ f1 ~ f1 ~", O: "bb1 ~@7", P: "f1@2 ~@2 f1@2 ~@2 f1@2 ~@2 f1@2 f1 g1",
  Q: "bb1@2 ~@2 bb1@2 ~@2 bb1@2 ~@2 bb1@2 f1 g1", R: "f1 ~ f1 ~ f1 ~ e1 ~", S: "eb1 ~ eb1 ~ eb1 ~ eb1 ~",
  T: "eb1 ~ eb1 ~ f1 ~ f1 ~", U: "gb1 ~ gb1 ~ ab1 ~ bb1 ~", V: "b1 ~ b1 ~ b1 ~ b1 ~",
  W: "b1@2 ~@2 b1@2 ~@2 b1@2 ~@2 b1@2 gb1 ab1", X: "gb1 ~ gb1 ~ gb1 ~ gb1 ~", Y: "gb1 ~ gb1 ~ gb1 ~ f1 ~",
  Z: "e1 ~ e1 ~ e1 ~ e1 ~", AA: "e1 ~ e1 ~ gb1 ~ gb1 ~", AB: "b1 ~ b1 ~ gb1 ~ gb1 ~", AC: "b1 ~@7",
  AD: "b1 ~ b1 ~ b1 ~@3",
})).s("gm_synth_bass_1").gain(0.12)

// chords · pad poly · "POLYSYNTH"
const pad_poly = note(`<
  ~@10 A B C@2 D@2 E@2 D@2 F G H I J@2 K@2 L M N O@2 P Q O R S T A B C@2 D@2 E@2 D@2 F G H I J@2 K@2 L M N O@2 P Q O R Q
  U V@2 W@2 V@2 X Y Z AA AB@2 AC@2 AD AE AF AG@2 AH AI AG AJ AI@2 AG@2 AH AI AG AJ AI@2 AG AJ AK AL
>`.pickRestart({
  A: "~@2 [c3,f3,a3]!3 ~ [c3,f3,a3] ~@3 [c3,eb3,f3,a3]!3 ~ [c3,eb3,f3,a3] ~", // F F7
  B: "~@2 [c3,f3,a3]!3 ~ [c3,f3,a3] ~@3 [c3,eb3,f3,a3]!2 ~@2 [c3,eb3,f3,a3] ~", // F F7
  C: "~@2 [f3,bb3,d4]!3 ~ [f3,bb3,d4] ~@3 [f3,bb3,d4]!3 ~ [f3,bb3,d4] ~", // Bb
  D: "~@2 [f3,bb3,d4] ~@3 [f3,bb3,d4] ~@3 [f3,bb3,d4] ~@3 [f3,bb3,d4] ~", // Bb
  E: "~@2 [f3,bb3,d4]!2 ~@2 [f3,bb3,d4] ~@3 [f3,bb3,d4]!2 ~@2 [f3,bb3,d4] ~", // Bb
  F: "~@2 [f3,a3,c4] ~@3 [f3,a3,c4]!2 ~@2 [f3,a3,c4] ~@3 [f3,a3,c4] ~", // F
  G: "~@2 [f3,a3,c4]!2 ~@2 [f3,a3,c4] ~ [f3,a3,c4] ~@3 [e3,ab3,b3] ~@3", // F E
  H: "~@2 [eb3,g3,bb3] ~@3 [eb3,g3,bb3] ~@3 [eb3,g3,bb3] ~@3 [eb3,g3,bb3] ~", // Eb
  I: "~@2 [eb3,g3,bb3] ~@3 [eb3,g3,bb3] ~@3 [eb3,g3,bb3]!2 ~@2 [eb3,g3,bb3] ~", // Eb
  J: "~@2 [f3,bb3,d4] ~@3 [f3,bb3,d4] ~@3 [f3,bb3,d4]!2 ~@2 [f3,bb3,d4] ~", // Bb
  K: "~@2 [f3,a3,c4] ~@3 [f3,a3,c4] ~@3 [f3,a3,c4]!2 ~@2 [f3,a3,c4] ~", // F
  L: "~@2 [eb3,g3,bb3] ~@3 [eb3,g3,bb3] ~@3 [f3,a3,c4]!2 ~@2 [f3,a3,c4] ~", // Eb F
  M: "[d3,f3,bb3] ~ [f3,bb3,d4] ~@3 [f3,bb3,d4] ~ [c3,f3,a3] ~ [f3,a3,c4]!2 ~@2 [f3,a3,c4] ~", N: "[f3,bb3,d4] ~@15",
  O: "~@2 [c3,f3,a3] ~@3 [c3,f3,a3] ~@3 [c3,f3,a3]!2 ~@2 [c3,f3,a3] ~", // F
  P: "~@2 [d3,f3,bb3] ~@3 [d3,f3,bb3]!2 ~@2 [d3,f3,bb3]!2 ~@2 [d3,f3,bb3] ~", // Bb
  Q: "~@2 [d3,f3,bb3] ~@3 [d3,f3,bb3] ~@3 [d3,f3,bb3]!2 ~@2 [d3,f3,bb3] ~", // Bb
  R: "~@2 [c3,f3,a3] ~@3 [c3,f3,a3]!2 ~@2 [c3,f3,a3]!2 ~@2 [c3,f3,a3] ~", // F
  S: "~@2 [d3,f3,bb3] ~@3 [d3,f3,bb3] ~@3 [c3,f3,a3]!2 ~@2 [c3,f3,a3] ~", T: "[d3,f3,bb3] ~@15",
  U: "~@2 [db3,gb3,bb3] ~@3 [db3,gb3,bb3] ~@3 [db3,gb3,bb3]!2 ~@2 [gb3,bb3,db4] [db3,gb3,bb3]", // Gb
  V: "~@2 [gb3,b3,eb4] ~@3 [gb3,b3,eb4] ~@3 [gb3,b3,eb4] ~@3 [gb3,b3,eb4] ~", // B
  W: "~@2 [gb3,b3,eb4]!2 ~@2 [gb3,b3,eb4] ~@3 [gb3,b3,eb4]!2 ~@2 [gb3,b3,eb4] ~", // B
  X: "~@2 [gb3,bb3,db4] ~@3 [gb3,bb3,db4]!2 ~@2 [gb3,bb3,db4] ~@3 [gb3,bb3,db4] ~", // Gb
  Y: "~@2 [gb3,bb3,db4]!2 ~@2 [gb3,bb3,db4] ~ [gb3,bb3,db4] ~@3 [f3,a3,c4] ~@3", // Gb F
  Z: "~@2 [e3,ab3,b3] ~@3 [e3,ab3,b3] ~@3 [e3,ab3,b3] ~@3 [e3,ab3,b3] ~", // E
  AA: "~@2 [e3,ab3,b3] ~@3 [e3,ab3,b3] ~@3 [e3,ab3,b3]!2 ~@2 [e3,ab3,b3] ~", // E
  AB: "~@2 [gb3,b3,eb4] ~@3 [gb3,b3,eb4] ~@3 [gb3,b3,eb4]!2 ~@2 [gb3,b3,eb4] ~", // B
  AC: "~@2 [gb3,bb3,db4] ~@3 [gb3,bb3,db4] ~@3 [gb3,bb3,db4]!2 ~@2 [gb3,bb3,db4] ~", // Gb
  AD: "~@2 [e3,ab3,b3] ~@3 [e3,ab3,b3] ~@3 [gb3,bb3,db4]!2 ~@2 [gb3,bb3,db4] ~", // E Gb
  AE: "[eb3,gb3,b3] ~ [gb3,b3,eb4] ~@3 [gb3,b3,eb4] ~ [db3,gb3,bb3] ~ [gb3,bb3,db4]!2 ~@2 [gb3,bb3,db4] ~", // B Gb
  AF: "[gb3,b3,eb4] ~@15", AG: "~@2 [db3,gb3,bb3] ~@3 [db3,gb3,bb3] ~@3 [db3,gb3,bb3]!2 ~@2 [db3,gb3,bb3] ~",
  AH: "~@2 [eb3,gb3,b3] ~@3 [eb3,gb3,b3]!2 ~@2 [eb3,gb3,b3]!2 ~@2 [eb3,gb3,b3] ~", // B
  AI: "~@2 [eb3,gb3,b3] ~@3 [eb3,gb3,b3] ~@3 [eb3,gb3,b3]!2 ~@2 [eb3,gb3,b3] ~", // B
  AJ: "~@2 [db3,gb3,bb3] ~@3 [db3,gb3,bb3]!2 ~@2 [db3,gb3,bb3]!2 ~@2 [db3,gb3,bb3] ~", // Gb
  AK: "~@2 [eb3,gb3,b3] ~@3 [eb3,gb3,b3] ~@3 [bb2,db3,gb3]!2 ~@2 [bb2,db3,gb3] ~", // B Gb
  AL: "~@2 [eb3,gb3,b3]!2 ~@2 [eb3,gb3,b3] ~ [eb3,gb3,b3] ~@7", // B
})).s("gm_pad_poly").gain(0.22).pan(0.6)

// chords · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  ~@11 A B@2 ~@7 C ~@7 D E ~@6 D E ~ A B@2 ~@7 C ~@7 D E ~@15 F ~@7 G H ~@20
>`.pickRestart({
  A: "~@2 [c5,eb5] ~@3 [c5,eb5] ~ [c5,eb5]@3 [bb4,d5]@3 [a4,c5] ~", // Cm Bb Am
  B: "[[a4,c5]@6 [bb4,d5] a4 [f4,bb4]@16 ~@8, ~@7 c5@2 ~@23]/2", C: "~@2 [c3,f3,a3] [b2,e3,ab3]",
  D: "[d3,f3,bb3]@7 ~ [c3,f3,a3]@7 ~", E: "[d3,f3,bb3] ~@15", F: "~@2 [db3,gb3,bb3] [c3,f3,a3]",
  G: "[eb3,gb3,b3]@7 ~ [db3,gb3,bb3]@7 ~", H: "[eb3,gb3,b3] ~@15",
})).s("gm_lead_2_sawtooth").gain(0.08)

// chords · lead 2 sawtooth · "SAW WAVE" · soft notes · Eb E
const lead_2_sawtooth_soft = note("<~@22 [[bb2,eb3,g3]@3 ~] ~@28 [[bb2,eb3,g3]@3 ~] ~@24 [[b2,e3,ab3]@3 ~] ~@28>")
  .s("gm_lead_2_sawtooth").gain(0.05)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@4 A B C D@2 ~@96>".pickRestart({
  A: "~@2 [f3,f4] ~@3 [f3,f4] ~ [f3,f4]@2 ~ [g3,g4]@2 ~ [f3,f4] ~", // F G F
  B: "~@2 [a3,a4] ~@2 [a3,a4] ~@2 [a3,a4]@2 ~ [bb3,bb4]@2 ~ [a3,a4] ~", // A Bb A
  C: "~@2 [c4,c5] ~@3 [c4,c5] ~ [c4,c5]@2 ~ [d4,d5]@2 ~ [c4,c5] ~", // C D C
  D: "[f6@4 eb6@4 c6@4 eb6@4 f6@2 eb6@2 c6@2 eb6@2 f6 ~@3 f6 ~@3, f4@7 ~]/2",
})).s("gm_string_ensemble_2").gain(0.22)

// other · trumpet
const trumpet = note("<~@4 A B C D E F G@2 ~@26 F G@2 ~@64>".pickRestart({
  A: "~@2 f4 ~@3 f4 ~ f4@2 ~ g4@2 ~ f4 ~", B: "~@2 a4 ~@2 a4 ~@2 a4@2 ~ bb4@2 ~ a4 ~",
  C: "~@2 c5 ~@3 c5 ~ c5@2 ~ d5@2 ~ c5 ~", D: "f5@15 ~", E: "f5@2 eb5@2 c5@2 eb5@2 f5 ~@3 f5 ~@3",
  F: "~@2 d4 ~@3 d4 ~ d4@3 eb4@3 d4 ~", G: "[f4@4 eb4@5 ~@7]/2",
})).s("gm_trumpet").gain(0.12).pan(0.4)

// other · trumpet
const trumpet_2 = note("<~@5 A B C@2 D E@2 F@2 ~@24 D E@2 F@2 ~@62>".pickRestart({
  A: "~@2 f4 ~@2 f4 ~@2 f4@2 ~ g4@2 ~ f4 ~", B: "~@2 a4 ~@3 a4 ~ a4@2 ~ bb4@2 ~ a4 ~",
  C: "[~@15 eb5 f5@2 eb5@2 c5@2 eb5@2 f5 ~@3 f5 ~@3, f4@7 ~, ~@16 c5 ~@15]/2", D: "~@2 f4 ~@3 f4 ~ f4@3 g4@3 f4 ~",
  E: "[a4@8 g4@10 eb5 ~@3 eb5 ~ eb5@3 d5@3 c5 ~]/2", F: "[c5@5 ~ d5 c5 bb4@15 ~@9]/2",
})).s("gm_trumpet").gain(0.12).pan(0.6)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2_2 = note(`<
  [f2 ~ f3!2 f2 ~ f3!2 f2 ~ f3!2 f2 ~ eb2!2]
  [f2 ~ f3 ~@13]
  [f2 ~ f3!2 f2 ~ f3!2 f2 ~ f3!2 f2 ~ eb2!2]
  [f2 ~ f3 ~@13]
  [f2 ~ f3!2 f2 ~ f3!2 f2 ~ f3!2 f2 ~ eb2!2]
  [f2 ~ f3 ~@13]
  ~@99
>`).s("gm_string_ensemble_2").gain(0.45).pan(0.3)

// other · melodic tom · "MELO TOM 1"
const melodic_tom = note("<~@7 A B ~@12 C ~@8 D ~@19 C ~@8 D ~@15 C ~@8 D ~@7 E ~@11 F>".pickRestart({
  A: "~@15 eb4", B: "gb4 ~ eb4 ~ bb3 ~ eb4 ~@9", C: "gb4!2 ~ gb4 d4 ~ a3 ~ gb4!2 ~ gb4 d4 ~ a3 ~",
  D: "~@2 [ab4,bb4] ~@3 gb4 ~ bb4 ~@2 eb4 ~@2 f3 ~", E: "~@2 [ab4,bb4] ~ f4 ~ f4 ~ bb4 ~@2 f4 ~@2 bb3 ~",
  F: "db4 ~@2 db4!2 ~ db4 ~@9",
})).s("gm_melodic_tom").gain(0.39)

// other · brass section · "BRASS 1"
const brass_section = note("<~@20 A B ~@11 A B ~@14 A B ~@11 A B ~@10 C D ~@11 C D ~@6 C D ~@8>".pickRestart({
  A: "~@6 [d4,d5] [eb4,eb5] [f4,f5] ~ [g4,g5]@2 [f4,f5]@2 [eb4,eb5]@2", B: "[f4,f5] ~@15",
  C: "~@6 [eb4,eb5] [e4,e5] [gb4,gb5] ~ [ab4,ab5]@2 [gb4,gb5]@2 [e4,e5]@2", D: "[gb4,gb5] ~@15",
})).s("gm_brass_section").gain(0.2)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2_3 = note(`<
  ~@14 A@6 B@2 C@2 D@2 E@2 F G H E@2 D@2 E@2 G I ~@4 A@6 B@2 C@2 D@2 E@2 F G H E@2 D@2 E@2 J K L@6 M@2 N@2 O@2 P@2 Q R S
  P@2 O@2 P@2 O@2 P@2 O@2 P@2 O@2 P@2 R T
>`.pickRestart({
  A: "[d4,f4,bb4]/6", B: "[[c4,f4,a4]@6 [c4,f4,a4] [b3,e4,ab4]]/2", C: "[bb3,eb4,g4]/2", D: "[d4,f4,bb4]/2",
  E: "[c4,f4,a4]/2", F: "[bb3,eb4,g4] [c4,f4,a4]", G: "[d4,f4,bb4] [c4,f4,a4]", H: "[d4,f4,bb4] ~@15",
  I: "[d4,f4,bb4]@3 ~@13", J: "[d4,f4,bb4]", K: "[bb3,db4,gb4]@2 [b3,db4,f4,ab4] [db4,e4,gb4,bb4]", L: "[eb4,gb4,b4]/6",
  M: "[[db4,gb4,bb4]@6 [db4,gb4,bb4] [c4,f4,a4]]/2", N: "[b3,e4,ab4]/2", O: "[eb4,gb4,b4]/2", P: "[db4,gb4,bb4]/2",
  Q: "[b3,e4,ab4] [db4,gb4,bb4]", R: "[eb4,gb4,b4] [db4,gb4,bb4]", S: "[eb4,gb4,b4] ~@15", T: "[eb4,gb4,b4] ~",
})).s("gm_string_ensemble_2").gain(0.05)

// other · pad metallic · "METAL PAD"
const pad_metallic = note("<~@16 A B ~@6 C D ~@19 A B ~@6 C D ~@15 E F ~@6 G H ~@25>".pickRestart({
  A: "~@4 c5@2 db5@2 d5@7 ~", B: "~@4 c6@2 db6@2 d6@7 ~", C: "~@2 c5 db5 d5@2 c6 db6", D: "d6@7 ~@9",
  E: "~@4 db5@2 d5@2 eb5@7 ~", F: "~@4 db6@2 d6@2 eb6@7 ~", G: "~@2 db5 d5 eb5@2 db6 d6", H: "eb6@7 ~@9",
})).s("gm_pad_metallic").gain(0.31).pan(0.4)

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

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

// drums · hihat
const hihat = s("hh").struct(`<
  [x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~ x]!84
  ~
  [x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~ x]!19
  [x!2 ~@2 x!2 ~@10]
>`).gain(0.32)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@104 [~ x]>").gain(0.08)

// drums · open hat
const open_hat = s("oh").struct("<[~ x ~ x ~ x ~ x]!84 ~ [~ x ~ x ~ x ~ x]!19 [~ x ~ x ~@4]>").gain(0.24)

// drums · crash
const crash = s("cr").struct("<~@8 A ~@13 B ~@8 B ~@19 B ~@8 B ~@15 B ~@8 B ~@18 C>".pickRestart({
  A: "~@2 x!2", B: "x", C: "~ x",
})).gain(0.08)

// drums · lt
const lt = s("lt").struct("<~@16 [~ x] ~@28 [~ x] ~@24 [~ x] ~@34>").gain(0.08)

stack(
  marimba, bass, pad_poly, lead_2_sawtooth, lead_2_sawtooth_soft, string_ensemble_2, trumpet, trumpet_2,
  string_ensemble_2_2, melodic_tom, brass_section, string_ensemble_2_3, pad_metallic, kick, snare, hihat, hihat_soft,
  open_hat, crash, lt
)