Strudelify

Scirocco d'Africa

Daniele

KeyD minorTempo110 bpm
0:00/0:00
// Scirocco d'Africa — Daniele
// 110 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 5 ocarina (copy of ch 2 electric bass finger)
// note: Full arrangement: all 122 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(110/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(`<
  ~@7 A B C D E B C D E B C D E B C D F G H G H G H I J G H G H G H I J B C D E K L M N K L M N B C D E B C D F G H G H
  G H I J G H G H G H I J K L M N K L M N B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C O@4
>`.pickRestart({
  A: "~@23 c2", B: "d2@3 c2@3 a1@3 f1@12 ~@2 f1", C: "g1@3 f1@3 a1@3 g1@12 ~@2 c2", D: "d2@3 c2@3 a1@3 f1@12 ~@2 c1",
  E: "d1@3 c1@3 f1@15 c2@2 a1", F: "d1 c1 f1@5 ~", G: "e1 ~@2 eb1 ~@2", H: "d1 ~@2 db1 ~@2", I: "d1 ~@2 d1 ~@2",
  J: "eb1 ~@2 eb1 ~@2", K: "e2@3 d2@3 b1@3 g1@12 ~@2 g1", L: "a1@3 g1@3 b1@3 a1@12 ~@2 d2",
  M: "e2@3 d2@3 b1@3 g1@12 ~@2 d1", N: "e1@3 d1@3 g1@15 d2@2 b1", O: "[d1@41 ~@7]/4",
})).s("gm_electric_bass_finger").gain(0.64)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  A@8 ~@8 B C B C B C B C ~@28 B C B C B C B C ~@40 D E D E D E D E D E D E D E D E D E ~@4
>`.pickRestart({
  A: "[~@4 [d4,a4] ~ [d4,a4]!2 ~ [d4,a4] [c4,g4] ~ [c4,g4]!2 ~ [a3,f4]!2 ~ [a3,f4] [c4,g4] ~ [c4,g4] [c4,g4]@4 ~@2 [d4,a4] ~ [d4,a4]!2 ~ [d4,a4] [c4,g4] ~ [c4,g4]!2 ~ [a3,f4]!2 ~ [a3,f4] [c4,g4] ~ [c4,g4] [c4,g4]@4 ~@2 [d4,a4] ~ [d4,a4]!2 ~ [d4,a4] [c4,g4] ~ [c4,g4]!2 ~ [a3,f4]!2 ~ [a3,f4] [c4,g4] ~ [c4,g4] [c4,g4]@4 ~ [a3,f4]!2 ~ [a3,f4] [c4,g4] ~ [c4,g4] [c4,g4]@4 ~@10]/4", // D5 C5 Dm C5 D5 C5 Dm C5 …
  B: "d4@2 f4 a4@2 g4@3 e4 c4@2 a3 d4 ~ a3 d4@2 f4 ~@2 f4 e4@3",
  C: "d4@2 f4 a4@2 g4@3 e4 c4@2 a3 bb3@2 ~@3 bb3 c4@2 bb3 c4@2 bb3",
  D: "~@6 [d4,a4] [d4,a4]@3 [d4,g4] ~ [d4,g4]@2 ~ [d4,f4] [d4,f4]@2 ~ [d4,g4] ~ [d4,g4]@3", // D5 G5 Dm G5
  E: "~@6 [d4,a4] [d4,a4]@3 [d4,g4] ~ [d4,g4]@2 ~ [d4,f4] [d4,f4]@2 ~ d4 ~ d4@3", // D5 G5 Dm
})).s("gm_electric_guitar_clean").gain(0.22).pan(0.8)

// other · lead 1 square
const lead_1_square = note("<~@17 A B C D@2 E ~@30 A B C D@2 E ~@63>".pickRestart({
  A: "~@2 a5 g5", B: "d5", C: "~@2 a4 c5", D: "[g5@7 f5]/2", E: "e5",
})).s("gm_lead_1_square").gain(0.48)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@24 A B A B A B C D A B A B A B C D ~@20 A B A B A B C D A B A B A B C D E F G H E F G H ~@5 I J K ~@5 I J K ~@5 L@2
  M ~ N O P ~@10
>`.pickRestart({
  A: "~ [e3,b3] ~ [e3,b3] ~ [eb3,b3] ~ [eb3,b3]", B: "~ [d3,b3] ~ [d3,b3] ~ [db3,b3] ~ [db3,b3]",
  C: "~ [d3,b3,gb5] ~ [d3,b3,gb5] ~ [d3,b3,gb5] ~ [d3,b3,gb5]", // Bm
  D: "~ [eb3,b3,gb5] ~ [eb3,b3,gb5] ~ [eb3,b3,gb5] ~ [eb3,b3,gb5]", E: "[d4,gb4]@23 ~", F: "[d4,g4]@23 ~",
  G: "[d4,a4]@23 ~", H: "[e4,g4]@23 ~", I: "[f5,a5]@3 ~", J: "[e5,g5]@19 ~@5", K: "[d5,f5]@7 ~",
  L: "[a5@10 ~@2 g5@33 ~@3, e5@15 ~]/2", M: "[d5,f5]", N: "[d5,a5]@11 ~", O: "[d5,g5]@11 ~", P: "[d5,f5]@11 ~",
})).s("gm_string_ensemble_1").gain(0.48)

// other · pizzicato strings
const pizzicato_strings = note(`<
  ~@24 A B A B A B C D A B A B A B C D ~@20 A B A B A B C D A B A B A B C D ~@46
>`.pickRestart({
  A: "e3 ~@2 eb3 ~@2", B: "d3 ~@2 db3 ~@2", C: "d3 ~@2 d3 ~@2", D: "eb3 ~@2 eb3 ~@2",
})).s("gm_pizzicato_strings").gain(0.72)

// chords · epiano1
const epiano1 = note(`<
  A B C D E D F D G D H D G D H D G D H D G D H D ~@16 H D H D I J K J I J K J G D H D G D H D ~@16 L M N J L M N J H D
  H D H D H D H D H D H D H D H D H D H D H D H D H D H D H D H D O@4
>`.pickRestart({
  A: "[d2,c4,f4,g4,a4]", B: "[g2,bb3,d4,f4,g4]", C: "[d2,c4,e4,f4,a4]", D: "[g2,bb3,d4,f4]", E: "[d2,c4,d4,f4,g4]",
  F: "[d2,a3,c4,e4,f4]", G: "[d2,c4,f4,g4]", H: "[d2,c4,e4,f4]", I: "[e2,d4,g4,a4]", J: "[a2,c4,e4,g4]",
  K: "[e2,d4,gb4,g4]", L: "[e2,a3,d4,gb4]", M: "[a2,c4,d4,g4]", N: "[e2,d4,gb4,a4]", O: "[d2,c4,e4,f4]/4",
})).s("gm_epiano1").gain(0.56)

// other · acoustic guitar nylon
const acoustic_guitar_nylon = note("<~@76 A@2 B C D E@2 F ~@38>".pickRestart({
  A: "[d4 e4 ~ e4 d4 ~ e4@3 d4 e4@3 e4@3 d4@3 e4@3 g4@5 e4@19 e4 ~]/2", B: "gb4@3 e4 g4@3 e4 ~ gb4@3 e4@4 eb4@4 ~ e4@3",
  C: "gb4@3 g4@3 a4@3 g4@3 gb4!2 ~ e4!2 ~ eb4!2 ~ c4@3", D: "g3@2 b3@2 d4@2 g4@2 b4@2 d5@2 e4@2 g4@2 e4 ~ gb4@3 d4@3",
  E: "[[b3,b4]@4 ~ b4@2 ~@6 a3 a4 ~@2 a4@18 ~@2 e4 ~ g4@3 ~ b4 ~ g5 gb5 ~, ~@4 b3@2 ~@10 a3@18 ~@8 e4@3 ~@3]/2", // B
  F: "g5@3 gb5 e5@3 d5@2 ~ d5 ~@2 e5@10 ~",
})).s("gm_acoustic_guitar_nylon").gain(0.72)

// other · pan flute
const pan_flute = note("<~@40 A B C D@2 ~@77>".pickRestart({
  A: "e5@20 ~ d5@3", B: "a5@19 ~ g5 ~@2 eb5, ab5 ~@23", C: "e5@2 g5@2 eb5 e5@16 ~ d5@2",
  D: "[~ a5@9 ~ [g4,a4] g3@2 ~ c4 ~ a4@2 e5 a4@2 b4@23 ~@3, ~ ab5 ~@8 d5@2 d4 ~ g3@2 d4@2 ~@30]/2", // Gsus2
})).s("gm_pan_flute").gain(0.56)

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

// drums · clap
const clap = s("cp").struct("<~@114 [~ x ~ x]!4 ~@4>").gain(0.48)

// drums · snare
const snare = s("sd").struct("<~@4 [~ x ~ x]!110 ~@8>").gain(0.72)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@24 [~@2 x ~@11 x ~@8 x]!16 ~@20 [~@2 x ~@11 x ~@8 x]!16 ~@46>").gain(0.24)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@4 A B C B A B C B A B C B A B C B A B C B D E F E F E F E D E F E F E F E G H I H A B C B A B C B A B C B A B C B D
  E F E F E F E D E F E F E F E A B C B A B C B G H I H G H I H G H I H G H I H G H I H G H I H G H I H G H J K L K ~@4
>`.pickRestart({
  A: "~@3 x ~@2 x ~@2 x ~ x!2 ~@2 x ~@2 x ~ x!2 ~@2", B: "x ~@2 x ~@2 x ~@2 x ~ x!2 ~@2 x ~@2 x ~ x ~@3",
  C: "x ~@2 x ~@2 x ~@2 x ~ x!2 ~@2 x ~@2 x ~ x!2 ~@2", D: "~@2 x!2 ~@2 x ~@5 x ~@5 x ~@2 x ~@2",
  E: "x ~ x!2 ~@2 x ~@2 x ~@2 x ~@5 x ~@2 x ~@2", F: "x ~ x!2 ~@2 x ~@5 x ~@5 x ~@2 x ~@2",
  G: "~@2 x!2 ~@2 x ~ x!2 ~ x!2 ~ x!2 ~@2 x ~ x!2 ~ x", H: "x ~ x!2 ~@2 x ~ x!2 ~ x!2 ~ x!2 ~@2 x ~ x ~@3",
  I: "x ~ x!2 ~@2 x ~ x!2 ~ x!2 ~ x!2 ~@2 x ~ x!2 ~ x", J: "x ~@2 x ~@5 x ~ x!2 ~@2 x ~@4 x!2 ~@2",
  K: "x ~@2 x ~@5 x ~ x!2 ~@2 x ~@4 x ~@3", L: "~@3 x ~@5 x ~ x!2 ~@2 x ~@4 x!2 ~@2",
})).gain(0.4)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@4 A B A B A B A B A B A B A B A B A B A B ~@20 A B A B A B A B A B A B A B A B ~@16 A B A B A B A B ~@30 C D C D ~@4
>`.pickRestart({
  A: "~@2 x ~@5 x ~@5 x ~@8 x", B: "~ x ~@2 x ~@2 x ~@4", C: "~@2 x ~@3 x ~ x ~@5 x ~@3 x ~@4 x",
  D: "~ x ~ x!2 ~@2 x ~ x ~@2",
})).gain(0.24)

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

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
  A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~@3
>`.pickRestart({
  A: "x",
})).gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct("<[x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x ~@2]!4 ~@118>").gain(0.16)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<[~@11 x]!4 ~@118>").gain(0.08)

stack(
  bass, electric_guitar_clean, lead_1_square, string_ensemble_1, pizzicato_strings, epiano1, acoustic_guitar_nylon,
  pan_flute, kick, clap, snare, snare_soft, hihat, hihat_soft, open_hat, crash, tambourine, tambourine_soft
)

More by Daniele