Strudelify

Flor D'Luna (Moon Flower)

Santana

KeyD minorTempo120 bpm
0:00/0:00
// Flor D'Luna (Moon Flower) — Santana
// 120 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 106 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 26.
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 · electric bass finger
const bass = note(`<
  ~@2 A B C D A E F G H I J K L M C D N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG Z@2 AH U A B C D A E F G H I J K AI
  AJ AK AL AM@2 AN AO AP AQ AR AS AT AU AV AW AX AY AZ BA BB BC BD BE V W X Y Z AA AB AC AD AE AF AG Z@2 AH U L M C D N
  O P Q R S T U
>`.pickRestart({
  A: "d2@4 ~@2 a2@2 a2@3 ~@3 d2@2", B: "d2@3 ~@3 a2@2 a2@3 ~ f2@3 ~", C: "a1@2 ~ e2 e2@2 ~ a1",
  D: "a1@3 ~@3 e2@2 e2@3 ~ a1@2 ~@2", E: "d2@4 ~@2 a2@2 a2@3 ~ f2@3 ~", F: "g2@2 ~ d3 d3@2 ~ g2",
  G: "g2@4 ~@2 d3 ~ d3@2 c3 ~ bb2@2 g2 ~", H: "d2@4 ~@2 a2@2 a2@2 g2 ~ f2 ~ d2 ~",
  I: "a1@4 ~@2 e2@2 e2 ~ d2 ~ e2 ~ db2 ~", J: "d2@5 ~ f2@2 a2@2 ~@2 f2@3 ~", K: "d2 ~@7",
  L: "d2@3 ~@3 a2@2 a2@3 ~@3 d2@2", M: "d2@2 ~@4 a2@2 a2 ~ g2@2 f2@2 ~@2", N: "d2@3 ~@3 a2@2 a2@3 ~ f2 a2 f2 ~",
  O: "d2@3 ~@3 a2@2 a2@3 ~ g2@3 ~", P: "g2@4 ~@2 d3@2 d3@3 ~ bb2@3 ~", Q: "g2@4 ~@2 d3@2 d3@2 c3 ~ bb2@2 g2 ~",
  R: "d2@4 ~@2 a2@2 a2 ~ g2 ~ f2 ~ d2 ~", S: "a1@4 ~@2 e2@2 e2 ~ d2@2 db2 ~ a1 ~",
  T: "d2@4 ~@2 bb2@2 a2 ~ g2@2 f2 ~ e2 ~", U: "d2 ~@15", V: "g2@5 ~ d3@2 d3@3 ~ g2@3 ~",
  W: "c2@5 ~ g2@2 g2@3 ~ e2@2 c2@2", X: "f2@5 ~ c3@2 c3@3 ~ a2 c3 a2 ~", Y: "f2@5 ~ c3@2 c3@3 ~ a2 ~ f2@2",
  Z: "a2@5 ~ e2@2 e2@3 ~ a2@3 ~", AA: "a2@5 ~ e2@2 e2 ~ a2@2 g2@2 f2@2", AB: "d2@5 ~ a2@2 a2@3 ~ f2@3 ~",
  AC: "d2@5 ~ d2@2 f2@3 ~ a2@3 ~", AD: "g2@5 ~ d3@2 d3 ~ bb2@2 g2 ~ d2@2", AE: "c2@4 ~@2 g2@2 g2@3 ~ e2@3 ~",
  AF: "f2@5 ~ c3@2 c3@3 ~ a2@3 ~", AG: "f2@5 ~ c3 ~ c3@3 ~ a2@2 f2@2", AH: "d2@2 d3 ~ c3@2 bb2 ~ a2 ~ g2@2 f2@2 e2@2",
  AI: "d2@3 ~ a2 ~ a2@2 ~@2 d2@2 a2 ~ d2 db2", AJ: "a1@4 e2 ~ e2 ~@2 a1 ~ db2 e2 ~ db2 ~",
  AK: "d2@2 ~@2 a2 ~ a2 ~@2 d2 ~ a2 f2 ~ d2 ~", AL: "a1@3 ~ e2 ~ e2@2 ~ a1 ~ db2 e2 ~ db2 ~",
  AM: "[d2@2 ~@2 a2 ~ a2@2 ~ d2 ~ a2 f2 d2 db2 a1@3 ~ e2 ~@2 e2@2 ~ a1 ~ db2 f2 ~ db2 ~]/2",
  AN: "d2@2 ~@2 d2 e2 f2 g2 a2 ~@2 f2 ~ e2 d2 eb2", AO: "e2@2 ~@2 a2 ~ a2 ~@2 a2 ~ g2 f2 e2 d2 db2",
  AP: "d2 ~ a1 ~ a1 ~ d2 f2 ~ a1 ~ d2 f2 ~ a2 ~", AQ: "a2@2 ~ a1 db2 e2 ~ g2 ~ a1 db2 e2 g2 ~ e2 ~",
  AR: "d2@2 ~@2 d2 f2 a2!2 ~ d2 f2 a2@2 ~ f2 d2", AS: "e2 ~ a1!2 ~ a1 ~ db2 e2 ~ g2 a2 ~ g2 f2 e2",
  AT: "d2@2 f2 ~@5 d2 f2 ~ a2 ~ g2 f2 d2", AU: "db2 a1 ~ a1 ~@2 a1 db2 e2 ~ g2 f2 ~ e2 ~ a1",
  AV: "d2@2 f2 ~ d2 ~ a1@2 ~ d2 ~ f2 ~ d2 ~ a1", AW: "a1@2 db2 ~ [eb2,e2] ~ a1@3 db2 ~ e2 ~ db2 a1 f1",
  AX: "d1@3 ~ f1@2 d1 f1 ~ a1 d2 ~ a1 f1 d1 eb1", AY: "e1@2 g1 a1 ab1 a1 db2 e2 ~ g2 ~ a2 ~ g2 f2 e2",
  AZ: "d2@3 ~@5 d2 a2 g2 f2 e2 d2 c2 db2", BA: "a1@3 ~ a1 db2 e2 g2 a2 ~ g2 f2 ~ e2 ~ f2", BB: "d2@3 ~ f2@4 e2@4 g2@4",
  BC: "f2@3 ~ a2@3 ~ g2@4 bb2@4", BD: "a2@3 ~ d3@3 ~ db3@3 ~ e3@2 ~@2, ~@12 eb3 ~@3", BE: "d3 ~@15",
})).s("gm_electric_bass_finger").gain(0.5)

// chords · percussive organ
const percussive_organ = note(`<
  ~@2 A@2 B@2 C@6 D@2 E@2 F@2 G@4 H@2 I@2 J K L M N O P@2 Q@2 R S T O D@2 A@2 B@2 C@6 D@2 U V W X Y X Z X AA AB AC AD AE
  AD AF AD AG AD AH AI AJ AK AL AM AN K L M N O P@2 Q@2 R S T O D@2 E@2 F@2 G@4 H@2 I@2
>`.pickRestart({
  A: "[[d4,f4,a4]@15 ~]/2", B: "[[bb4,f5]@15 ~ e5@16, g4@31 ~, ~@15 db5@16 ~]/2",
  C: "[a4@31 ~@17 e5@16 [f4,a4]@15 ~ [e4,g4]@15 ~, d5@5 ~, f5@48 ~@31 db5@16 ~, ~ [g4,bb4] ~]/6", // F Em Gm
  D: "[[d3,f4,a4,d5]@9 ~@7]/2", E: "[~@16 a4@15 ~, [d5,f5,a5]@31 ~, ~@15 d4@17]/2",
  F: "[[g4,bb5]@15 ~ [a3,e5]@16, g5@31 ~, ~@15 db6@17]/2", // Gm A5
  G: "[[d4,f5]@32 ~@15 e6@16 ~, d6@3 ~, a5@15 ~ [g3,g5,bb5]@16]/4", // Dm Gm
  H: "[[d4,f5,a5,d6]@15 ~ [a3,e5,g5]@16, ~@15 db6@17, ~@16 bb5 ~@15]/2", // Dm A7
  I: "[~@8 d3 ~@7, d5@9 ~@7, d4@3 d6@6 ~@7, ~ f5@16 ~@15, ~@2 a5@7 ~@7]/2", J: "[g4,bb4,d5,f5]@15 ~",
  K: "[e4,bb4,d5]@15 ~", L: "[e4,a4,c5]@15 ~", M: "[d4,a4,c5]@15 ~", N: "[e4,g4,b4,d5]", O: "[a3,e4,g4,db5]",
  P: "[~@4 f5@3 ~, [d3,f4,a4,d5]@29 ~@3]/2", Q: "[~@12 g3@4 [gb4,d5]@15 ~, bb4, [g4,f5] ~, d5@7 ~@9]/2",
  R: "[f3,f4,a4,e5]@15 ~", S: "[f3,f4,a4,d5]", T: "[e3,e4,g4,b4,d5]",
  U: "~@4 [d5,f5,a5]!2 ~@2 [d5,f5,a5] ~@2 [d5,f5,a5] ~@2 [d5,f5,a5] ~", // Dm
  V: "[a3,e4] ~ [e5,g5,a5] ~ [e5,g5,a5]!2 [a3,e4]!2 [e5,g5,a5] ~ [a3,e4] [e5,g5,a5] ~ [a3,e4] [e5,g5,a5] ~", // A5 A7 A5 A7 A5 A7 A5 A7
  W: "[a3,d4]@2 [d5,f5,a5] ~ [d5,f5,a5] [f5,a5] [a3,d4]!2 [d5,f5,a5] ~ [a3,d4] [d5,f5,a5] ~ [a3,d4] [d5,f5,a5] ~", // D5 Dm F D5 Dm D5 Dm D5 …
  X: "[a3,e4]@2 [e5,g5,a5] ~ [e5,g5,a5]!2 [a3,e4]!2 [e5,g5,a5] ~ [a3,e4] [e5,g5,a5] ~ [a3,e4] [e5,g5,a5] ~", // A5 A7 A5 A7 A5 A7 A5 A7
  Y: "[a3,d4]@2 [d5,f5,a5] ~ [c5,d5,f5,a5] [f5,a5] [a3,d4]!2 [d5,f5,a5] ~ [a3,d4] [d5,f5,a5] ~ [a3,d4] [d5,f5,a5] ~", // D5 Dm Dm7 F D5 Dm D5 Dm …
  Z: "[a3,d4]@2 [d5,f5,a5] ~ [d5,f5,ab5,a5] [f5,a5] [a3,d4]!2 [d5,f5,a5] ~ [a3,d4] [d5,f5,a5] ~ [a3,d4] [d5,f5,ab5,a5] ~", // D5 Dm F D5 Dm D5 Dm D5 …
  AA: "[a3,d4] ~ [d5,f5,a5] ~ [d5,f5,ab5,a5] [d5,f5,a5] [a3,d4]!2 [d5,f5,ab5,a5] ~ [a3,d4] [d5,f5,a5] ~ [a3,d4] [d5,f5,a5] ~", // D5 Dm D5 Dm D5 Dm D5 Dm
  AB: "[a3,e4] ~ [a3,e4] ~ [e5,g5,a5]!2 [a3,e4] ~ [e5,g5,a5]!2 [a3,e4] [e5,g5,a5] ~ [a3,e4] [e5,g5,a5] ~", // A5 A7 A5 A7 A5 A7 A5 A7
  AC: "[a3,d4] ~ [d5,f5,ab5,a5] ~ [d5,f5,a5]!2 [a3,d4]!2 [d5,f5,a5]!2 [a3,d4] [d5,f5,ab5,a5] ~ [a3,d4] [d5,f5,ab5,a5] ~", // D5 Dm D5 Dm D5 Dm D5 Dm
  AD: "[a3,e4]@2 [e5,g5,a5] ~ [e5,g5,a5]!2 [a3,e4]!2 [e5,g5,a5]!2 [a3,e4] [e5,g5,a5] ~ [a3,e4] [e5,g5,a5] ~", // A5 A7 A5 A7 A5 A7 A5 A7
  AE: "[a3,d4]@2 [d5,f5,a5] ~ [d5,f5,a5]!2 [a3,d4]!2 [d5,f5,ab5,a5] [d5,f5,a5] [a3,d4] [d5,f5,a5] ~ [a3,d4] [d5,f5,ab5,a5] ~", // D5 Dm D5 Dm D5 Dm D5 Dm
  AF: "[a3,d4]@2 [d5,f5,a5] ~ [d5,f5,a5]!2 [a3,d4]!2 [d5,f5,a5] [f5,a5] [a3,d4] [d5,f5,a5] ~ [a3,d4] [d5,f5,a5] ~", // D5 Dm D5 Dm F D5 Dm D5 …
  AG: "d4@2 [d5,f5,a5] ~ [d5,f5,ab5,a5] [d5,f5,a5] [a3,d4]!2 [d5,f5,a5]!2 [a3,d4] [d5,f5,a5] ~ [a3,d4] [d5,f5,ab5,a5] ~, a3 ~@15", // Dm D5 Dm D5 Dm D5 Dm
  AH: "[a3,d4]@2 [d5,f5,a5] ~ [d5,f5,a5]!2 [a3,d4]!2 [d5,f5,ab5,a5] [d5,f5,a5] [a3,d4] [d5,f5,ab5,a5] ~ [a3,d4] [d5,f5,ab5,a5] ~", // D5 Dm D5 Dm D5 Dm D5 Dm
  AI: "[a3,e4]@2 [e5,g5,a5] ~ [e5,g5,a5]!2 [a3,e4]!2 [e5,g5,a5]!2 [a3,e4] [e5,g5,a5] ~@2 [e5,g5,a5] ~, ~@13 e4@2 ~", // A5 A7 A5 A7 A5 A7
  AJ: "[d4,d5]@4 [f4,f5]@3 ~ e5@3 [g4,g5]@4 ~, ~@7 e4@3 ~@6", AK: "[f4,f5] [a4,a5] [g4,g5] [bb4,bb5]",
  AL: "[a4,a5]@4 [d5,d6]@4 [db5,db6]@4 [e5,e6]@3 ~", AM: "[d5,d6] ~@15", AN: "~ [g4,bb4,d5,f5]@15",
})).s("gm_percussive_organ").gain(0.35).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~@2 A B@22 C B@15 C B@11 C B@23 C B@15 ~ B@11 C>".pickRestart({
  A: "~ x!3", B: "x!4", C: "x",
})).gain(0.35)

// drums · snare
const snare = s("sd").struct("<~@2 A@23 B A@15 ~ A@11 C@24 ~ A@15 B A@11 B>".pickRestart({
  A: "~ x ~@4 x!2", B: "x", C: "~ x ~@6",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<[x!4] ~@105>").gain(0.25)

// drums · cowbell
const cowbell = s("cb").struct("<~@2 A B@22 C B@15 C B@11 C B@23 C B@15 C B@11 C>".pickRestart({
  A: "~@2 x ~ x ~ x!2", B: "x ~ x ~ x ~ x!2", C: "x",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct("<~@77 x ~@28>").gain(0.3)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@54 [~@12 x!2 ~@2]!23 ~@29>").gain(4.08)

// drums · bongos
const bongos = s("bongo:4").struct("<~@2 A@23 ~ A@15 ~ A@11 B ~@24 A@15 ~ A@11 ~>".pickRestart({
  A: "~@2 x!2 ~@4", B: "~@3 x!2 ~ x ~@9",
})).gain(0.78)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@2 A@23 ~ A@15 ~ A@11 B C@23 ~ A@15 ~ A@11 ~>".pickRestart({
  A: "~@5 x ~@2", B: "~ x ~ x ~ x!3", C: "~@3 x!2 ~@6 x!2 ~@3",
})).gain(0.78)

// drums · congas
const congas = s("conga:13").struct("<~@2 A@23 B A@15 ~ A@11 C D@23 ~ A@15 B A@11 B>".pickRestart({
  A: "~@3 x ~@2 x!2", B: "x", C: "~@3 x!2 ~ x ~@9", D: "~@6 x!2",
})).gain(0.95)

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

// drums · congas
const congas_3 = s("conga:33").struct("<~@2 A B@22 C B@15 C B@11 D E@23 F B@15 ~ B@11 C>".pickRestart({
  A: "~@3 x ~@12", B: "x ~@2 x ~@12", C: "x", D: "x ~@3 x!2 ~@10", E: "x ~@2 x ~ x ~@3 x ~ x ~@3 x", F: "x ~@14 x",
})).gain(0.95)

// drums · ht
const ht = s("ht").struct("<~@25 x ~@27 [~@8 x!2 ~@2 x!2 ~ x] ~@51 x>").gain(0.35)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@2 A@23 ~ A@15 B A@11 ~ C@23 ~ A@15 B A@11 ~>".pickRestart({
  A: "x!8", B: "x", C: "x!16",
})).gain(1.51)

stack(
  bass, percussive_organ, kick, snare, hihat, cowbell, crash, vibraslap, bongos, bongos_2, congas, congas_2, congas_3,
  ht, cabasa
)

More by Santana