Strudelify
Macarena cover art

1996 · Fiesta Macarena

Macarena

Los Del Rio

KeyA♭ majorTempo100 bpm
0:00/0:00
// Macarena — Los Del Rio
// 100 bpm, 4/4, key G# major. 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(100/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · synth bass 2 · "Synth Bass"
const bass = note("<~@4 A B@2 C D@2 E@16 ~@4 E@16 ~@4 E@4 ~@4 E@4 ~@4 E@12 ~@8 E@16 F>".pickRestart({
  A: "ab1@2 ab2!2 ab1 ab2!2 ab1 ab2!2 ab1 ab2!2 ab1 ab2@2", B: "ab1@2 ab2!2 ab1 ab2!2 ab1 ab2!2 ab1 ab2@2 ab1 ab2@2",
  C: "ab1@2 ab2!2 ab1 ab2!2 ab1 ab2@2 ab1 ab2@2 ab1 ab2@2", D: "ab1 ~@3",
  E: "ab1@2 ~@2 ab1@2 ~ eb2@2 ~ eb2@2 eb2@2 gb2@2", F: "ab1 ~@7",
})).s("gm_synth_bass_2").gain(0.64)

// chords · lead 2 sawtooth · "Synth"
const lead_2_sawtooth = note("<~@49 A@2 ~@52>".pickRestart({
  A: "[[ab3,eb4,ab4]@5 ~@2 [gb4,db5,gb5]@3 [eb4,bb4,eb5]@3 ~ [gb4,db5,gb5]@6 ~@12]/2", // Ab5 Gb5 Eb5 Gb5
})).s("gm_lead_2_sawtooth").gain(0.2)

// chords · banjo
const banjo = note(`<
  A B@2 C A B@2 C ~@2 A B@2 C A B@2 C A B@2 C A B@2 C ~@4 A B@2 C A B@2 C A B@2 C ~@8 A B@2 C D@3 E A B@2 C ~@4 A B@2 C
  A B@2 C A B@2 C ~@4 A B@3 A B@3 A B@3 A B@3 A B@3 ~
>`.pickRestart({
  A: "~@2 [eb3,ab3,eb4]!11 [db3,gb3,db4]!2 [eb3,ab3,eb4]", B: "[eb3,ab3,eb4]!13 [db3,gb3,db4]!2 [eb3,ab3,eb4]",
  C: "[eb3,ab3,eb4]!9 ~ [db3,gb3,db4] ~ [bb2,eb3,bb3] ~ [bb3,eb4,bb4] ~", // Ab5 Gb5 Eb5
  D: "~@2 [eb3,ab3,eb4] ~@2 [eb3,ab3,eb4] ~@2 [eb3,ab3,eb4] ~@2 [eb3,ab3,eb4] ~@2 [db3,gb3,db4] ~", // Ab5 Gb5
  E: "~@2 [eb3,ab3,eb4] ~@2 [eb3,ab3,eb4] ~@2 [eb3,ab3,eb4] ~ [db3,gb3,db4] ~ [bb2,eb3,bb3] ~ [bb3,eb4,bb4] ~", // Ab5 Gb5 Eb5
})).s("gm_banjo").gain(0.07).pan(0.6)

// bass · synth bass 1 · "Synth Bass"
const bass_2 = note(`<
  ~@4
  [ab1@2 ab2!2 ab1 ab2!2 ab1 ab2!2 ab1 ab2!2 ab1 ab2@2]
  [ab1@2 ab2!2 ab1 ab2!2 ab1 ab2!2 ab1 ab2@2 ab1 ab2@2]!2
  [ab1@2 ab2!2 ab1 ab2!2 ab1 ab2@2 ab1 ab2@2 ab1 ab2@2]
  ~@95
>`).s("gm_synth_bass_1").gain(0.22).pan(0.4)

// chords · banjo
const banjo_2 = note("<~@13 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@11 A ~@7 A ~@7 A ~@3 A ~@3 A ~@25>".pickRestart({
  A: "~@9 [eb3,ab3,eb4]!7", // Ab5
})).s("gm_banjo").gain(0.07).pan(0.1)

// other · synth strings 1 · "SynthStrings"
const synth_strings_1 = note("<~@19 A@2 ~@5 B C ~@25 D@2 ~@28 E F@2 ~ G ~@3 G ~@3 G ~@3 G ~@3>".pickRestart({
  A: "[ab5@9 ~@6 gb6@3 ~@14]/2", B: "~@8 db6@5 ~@3", C: "~@3 eb6@2 ~@3", D: "[~@15 db6@3 ~@14]/2", E: "~ db6@4 ~@2 gb6",
  F: "[~@7 bb6@2 ~@7]/2", G: "~ db6@3 ~@4",
})).s("gm_synth_strings_1").gain(0.11)

// other · lead 2 sawtooth · "Synth" · Ab5
const lead_2_sawtooth_2 = note("<~@86 [~@8 gb4@3 eb4@3 gb4@2]!16 [[ab3,eb4,ab4]@3 ~@13]>")
  .s("gm_lead_2_sawtooth").gain(0.31).pan(0.7)

// chords · distortion guitar · "Disto. Guitar"
const distortion_guitar = note("<~@26 A B C D ~@32 A B C D ~@12 A B C D ~@4 E@17>".pickRestart({
  A: "~@2 [db3,ab3,db4]@2 ~ [db3,ab3,db4]@2 ~ [db3,ab3,db4]@2 ~ [db3,ab3,db4]@2 ~ [db3,ab3,db4]@2", // Db5
  B: "~@2 [c3,g3,c4]@2 ~ [c3,g3,c4]@2 ~ [c3,g3,c4]@2 ~ [c3,g3,c4]@2 ~ [c3,g3,c4]@2", // C5
  C: "~@2 [bb2,f3,bb3]@2 ~ [bb2,f3,bb3]@2 ~ [bb2,f3,bb3]@2 ~ [bb2,f3,bb3]@2 ~ [bb2,f3,bb3]@2", // Bb5
  D: "~@2 [eb3,bb3,eb4]@2 ~ [eb3,bb3,eb4]@2 ~ [ab2,eb3,ab3]@2 [gb2,db3,gb3]@2 [eb2,bb2,eb3]@2 [bb2,eb3,bb3]@2", // Eb5 Ab5 Gb5 Eb5
  E: "[ab2,eb3,ab3,eb4,ab4]@3 ~@13", // Ab5
})).s("gm_distortion_guitar").gain(0.19).pan(0.4)

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

// drums · snare
const snare = s("sd").struct("<~@4 A@4 ~@2 A@8 ~@2 A@22 ~@4 A@56 ~>".pickRestart({
  A: "~ x ~ x",
})).gain(0.48)

// drums · clap
const clap = s("cp").struct("<~@8 A@2 B@8 ~@2 B@22 ~@4 A@4 B@4 A@4 B@44 ~>".pickRestart({
  A: "x!16", B: "~ x ~ x",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~@4 A@14 B ~ A@22 B ~@3 A@56 B>".pickRestart({
  A: "x!6 ~@2 x!6 ~@2", B: "x",
})).gain(0.32)

// drums · open hat
const open_hat = s("oh").struct("<~@4 [~@3 x ~@3 x]!14 ~@2 [~@3 x ~@3 x]!22 ~@4 [~@3 x ~@3 x]!56 ~>").gain(0.56)

// drums · tambourine
const tambourine = s("tb").struct("<~@10 A@8 ~@2 A@6 ~@4 A@12 ~@4 A@16 ~@4 A@12 ~@8 A@16 B>".pickRestart({
  A: "x!8", B: "x",
})).gain(0.32)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@10 A@8 ~@2 A@6 ~@4 A@12 ~@4 A@16 ~@4 A@12 ~@8 A@16 ~>".pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x",
})).gain(0.16)

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

// drums · congas
const congas_2 = s("conga:18").struct("<~@8 A B ~@16 C D E F ~@15 G H@3 I ~@4 J K@3 ~@45>".pickRestart({
  A: "x!2 ~@4 x!2 ~ x!2 ~@5", B: "~ x ~ x ~@4 x!2 ~@3 x ~@2", C: "~@2 x ~ x!3 ~@3 x!2 ~ x ~@2",
  D: "~ x ~@2 x!2 ~@4 x!2 ~@2 x ~", E: "~@2 x!3 ~@6 x!3 ~@2", F: "~@2 x!2 ~@4 x!2 ~ x!3 ~@2", G: "~@15 x",
  H: "~@3 x ~@3 x ~@3 x ~@3 x", I: "~@3 x ~@3 x ~@3 x ~@4", J: "~ x", K: "x!2",
})).gain(1.02)

// drums · congas
const congas_3 = s("conga:33").struct("<~@8 A B ~@16 C D ~ E ~@16 F@4 ~@4 G H@3 ~@45>".pickRestart({
  A: "~@11 x ~ x!3", B: "x ~@6 x", C: "~@14 x!2", D: "~@15 x", E: "~@7 x", F: "x!3 ~@5 x!3 ~@5", G: "~@9 x!2 ~@5",
  H: "~ x!2 ~@6 x!2 ~@5",
})).gain(1.02)

stack(
  bass, lead_2_sawtooth, banjo, bass_2, banjo_2, synth_strings_1, lead_2_sawtooth_2, distortion_guitar, kick, snare,
  clap, hihat, open_hat, tambourine, tambourine_soft, congas, congas_2, congas_3
)