Strudelify

Europa (Earth's Cry Heaven's Smile)

Santana

KeyC minorTempo75 bpm
0:00/0:00
// Europa (Earth's Cry Heaven's Smile) — Santana
// 75 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 101 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(75/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · acoustic bass
const bass = note(`<
  ~ A@2 B C D@2 E@2 A@2 B C D@2 E@2 F A B C D@2 E@2 A@2 B C D@2 E@2 A@2 B C D@2 E@2 F A B C D@2 E F E F E F E F E F E F
  E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E@2 F E F E F E G@2
>`.pickRestart({
  A: "bb1@5 ~ bb1@2 bb1@5 ~ bb1@2", B: "eb2@5 ~ eb2@2 eb2@5 ~ eb2@2", C: "ab1@5 ~ ab1@2 ab1@5 ~ ab1@2",
  D: "g1@5 ~ g1@2 g1@5 ~ g1@2", E: "c2@5 ~ c2@2 c2@5 ~ c2@2", F: "f1@5 ~ f1@2 f1@5 ~ f1@2", G: "c2@15 ~",
})).s("gm_acoustic_bass").gain(0.56)

// chords · percussive organ
const percussive_organ = note(`<
  ~ A B C D E F G H I J K D L M N O P Q R S T F U V W Q X Y Z AA U AB I Q AC AD Z AE AF O AG AH AI Y AJ F AK AL AM AG AM
  AN AO AG AO AL AM P AP AN AM AN AQ AL AO AN AO AR AM AR AP AS AO AS AQ AT AO AR AU AV AM AR AO AR AP AR AO AT AM AR
  AO@2 AT AK AW AX AT AU AM ~
>`.pickRestart({
  A: "[bb2,eb4,f4,ab4,c5]@7 ~@9", B: "[bb2,d4,f4,ab4,bb4]@7 ~@9", C: "[bb3,d4,f4,g4]@7 ~@3 bb3@2 d4@2 f4@2",
  D: "[c4,eb4,g4,bb4]@7 ~@3 c4@2 eb4@2 g4@2", E: "[g3,c4,d4,f4,a4]@7 ~@9", F: "[g3,b3,d4,f4,g4]@7 ~@3 b3@2 d4@2 f4@2",
  G: "[g3,c4,eb4,g4]@7 ~@3 c3@2 [c3,g3,c4,eb4,g4]@4", H: "[c3,g3,c4,eb4]@7 ~@3 c3@2 [g3,c4,eb4]@4",
  I: "[eb4,f4,ab4,c5]@7 ~@9", J: "[bb2,d4,f4,ab4,bb4]@7 ~@3 bb2@2 [d4,f4,ab4,bb4]@4", K: "[eb3,bb3,d4,f4,g4]@7 ~@9",
  L: "[g3,c4,d4,f4,a4]@7 ~@3 g3@2 [g3,c4,d4,f4,a4]@4", M: "[b3,d4,f4,g4]@7 ~@3 g3@2 [g3,b3,d4,f4,g4]@4",
  N: "[b3,d4,e4,g4]@7 ~@3 b3@2 d4@2 e4@2", O: "[b3,d4,e4,g4]@7 ~@9", P: "[f3,c4,eb4,f4,ab4]@7 ~@9",
  Q: "[d4,f4,ab4,bb4]@7 ~@3 d4@2 f4@2 ab4@2", R: "[eb3,bb3,d4,f4,g4]@7 ~@3 eb3@2 [bb3,d4,f4,g4]@4",
  S: "[c4,eb4,g4,bb4]@7 ~@3 ab3@2 [ab3,c4,eb4,g4,bb4]@4", T: "[c4,d4,f4,a4]@7 ~@3 c4@2 d4@2 f4@2",
  U: "[g3,c4,eb4,g4]@7 ~@9", V: "[c3,g3,c4,eb4,g4]@7 ~@3 g3@2 c4@2 eb4@2",
  W: "[eb4,f4,ab4,c5]@7 ~@3 bb2@2 [bb2,eb4,f4,ab4,c5]@4", X: "[bb3,d4,f4,g4]@7 ~@9",
  Y: "[c4,eb4,g4,bb4]@7 ~@3 ab3@2 [c4,eb4,g4,bb4]@4", Z: "[c4,d4,f4,a4]@7 ~@9",
  AA: "[b3,d4,f4,g4]@7 ~@3 b3@2 d4@2 f4@2", AB: "[g3,c4,eb4]@7 ~@3 c3@2 [g3,c4,eb4]@4", AC: "[eb3,d4,f4,g4,bb4]@7 ~@9",
  AD: "[ab3,c4,eb4,g4,bb4]@7 ~@3 ab3@2 [c4,eb4,g4,bb4]@4", AE: "[b3,d4,f4,g4]@7 ~@9",
  AF: "[b3,d4,e4,g4]@7 ~@3 c3@2 [c3,b3,d4,e4,g4]@4", AG: "[f3,c4,eb4,f4,ab4]@7 ~@3 c4@2 eb4@2 f4@2",
  AH: "[bb2,d4,f4,ab4,bb4]@7 ~@3 d4@2 f4@2 ab4@2", AI: "[bb3,d4,f4,g4]@7 ~@3 eb3@2 [bb3,d4,f4,g4]@4",
  AJ: "[c4,d4,f4,a4]@7 ~@3 g3@2 [c4,d4,f4,a4]@4", AK: "[bb3,c4,eb4,g4]@7 ~@3 c3@2 [bb3,c4,eb4,g4]@4",
  AL: "[c4,eb4,f4,ab4]@7 ~@3 f3@2 [c4,eb4,f4,ab4]@4", AM: "[bb3,c4,eb4,g4]@7 ~@9",
  AN: "[c4,eb4,f4,ab4]@7 ~@3 c4@2 eb4@2 f4@2", AO: "[bb3,c4,eb4,g4]@7 ~@3 bb3@2 c4@2 eb4@2",
  AP: "[c3,bb3,c4,eb4,g4]@7 ~@9", AQ: "[bb3,c4,eb4,g4]@7 ~@3 c3@2 [c3,bb3,c4,eb4,g4]@4",
  AR: "[c4,eb4,g4,ab4]@7 ~@3 c4@2 eb4@2 g4@2", AS: "[f3,c4,eb4,g4,ab4]@7 ~@9", AT: "[c4,eb4,g4,ab4]@7 ~@9",
  AU: "[c3,bb3,c4,eb4,g4]@7 ~@3 bb3@2 c4@2 eb4@2", AV: "[f3,c4,eb4,g4,ab4]@7 ~@3 f3@2 [c4,eb4,g4,ab4]@4",
  AW: "[c4,eb4,g4,ab4]@7 ~@3 [c4,eb4,g4,ab4]@4 ~@2", AX: "[c3,bb3,c4,eb4,g4]@7 ~@3 c3@2 [bb3,c4,eb4,g4]@4",
})).s("gm_percussive_organ").gain(0.48).pan(0.6)

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

// drums · rim
const rim = s("rim").struct("<~ [~ x ~ x]!30 [~ x ~@2] [~ x ~ x]!59 [~ x ~@2] [~ x ~ x]!6 [~ x ~@2] ~@2>").gain(0.48)

// drums · snare
const snare = s("sd").struct("<~@31 [~@5 x!3] ~@59 [~@6 x!2] ~@6 [~@12 x ~@2 x] [~ x ~ x] ~>").gain(0.48)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@16 A ~@8 B ~@2 B ~@3 A ~@2 B ~@4 B ~ B ~@4 B@2 ~@7 B ~@7 B@2 ~@9 B@2 ~@14 C A ~@8
>`.pickRestart({
  A: "x", B: "~@15 x", C: "~@7 x",
})).gain(0.48)

// drums · crash
const crash = s("cr").struct("<~@48 x ~@15 x ~@15 x ~@19 x>").gain(0.48)

stack(bass, percussive_organ, kick, rim, snare, hihat, open_hat, crash)

More by Santana