Strudelify

Snow on the Sahara

Anggun

KeyF majorTempo87 bpm
0:00/0:00
// Snow on the Sahara — Anggun
// 87 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 92 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(87/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 · fretless bass
const bass = note(`<
  ~@4 A B C D A B C D A B C D E F A B C D A B C D G H I J K L M N O P M N O P M N O Q@2 ~@2 C D R S T U R S T U V W I J
  K L M N O P M N O P M N O P M N O P M N O P M N O Q@2 X@2 ~@2
>`.pickRestart({
  A: "bb1@2 ~ bb1@2 ~@4 f1 bb1 ~ bb1@2 ~ f1", B: "bb1@2 ~ bb1 ~@5 f1 bb1 ~ bb1@2 ~ f1",
  C: "ab1@2 ~ ab1@2 ~@4 f1 ab1 ~ ab1@2 ~ eb1", D: "f1@2 ~ f1 ~@3 gb1@2 gb1 f1 ~ eb1@3 db1",
  E: "db1 ~@7 ab1 ~ ab1@2 ~ ab1@2 ~", F: "db1@7 ~ ab1 ~ ab1@2 ~ ab1@2 ~", G: "eb1@14 ~ eb1", H: "f1 g1",
  I: "f1@3 f1 ~@2 f1@2 a1@3 a1 ~@2 a1@2", J: "bb1@3 bb1 ~@2 bb1@3 bb1!2 ~ g1@2 g1 bb1",
  K: "c2@3 c2 ~@2 c2@2 ~ c2!2 ~ a1@3 c2", L: "d2@3 d2 ~@2 d2@3 d2 ~ d2 c2@2 a1@2",
  M: "a1@2 ~ a1 ~@2 a1@3 a1!2 ~ a1@3 a1", N: "bb1@3 bb1 ~@2 bb1@3 bb1!2 ~ g1@2 bb1@2",
  O: "c2@3 c2 ~@2 c2@2 ~ c2!2 ~ a1 ~ c2@2", P: "d2@3 d2 ~@2 d2@2 ~ d2!2 ~ c2@2 a1@2",
  Q: "[d2@3 d2 ~@2 d2@2 ~ d2!2 ~ d2@19 ~]/2", R: "c2@2 ~ c2@2 ~@4 g1 c2 ~ c2@2 ~ g1",
  S: "c2@2 ~ c2 ~@5 g1 c2 ~ c2@2 ~ g1", T: "bb1@2 ~ bb1@2 ~@4 g1 bb1 ~ bb1@2 ~ f1",
  U: "g1@2 ~ g1 ~@3 ab1@2 ab1 g1 ~ f1@3 eb1", V: "f1@14 ~ f1", W: "g1 a1", X: "f1/2",
})).s("gm_fretless_bass").gain(0.57)

// chords · synth strings 1
const synth_strings_1 = note(`<
  A@2 B C A@2 B C A@2 B C A@2 B C D@2 A@2 B C A@2 B C E@2 F G H I F G H I F G H I F G H J@2 A@2 B C K@2 L M K@2 L M N@2
  F G H I F G H I F G H I F G H I F G H I F G H I F G H J@2 O@2 ~@2
>`.pickRestart({
  A: "[f4 eb4 gb4 f4, [bb3,db4]]/2", B: "db4 c4, [ab3,eb4]", C: "[f3,db4,eb4] [gb3,bb3,db4], ab3",
  D: "[ab3,bb3,db4,eb4]/2", E: "[eb4@3 d4, [ab3,bb3]]/2", F: "[a3,c4,f4]", G: "[bb3,c4,d4,f4]", H: "[g3,c4,e4]",
  I: "[a3,c4,d4,f4]", J: "[~ [bb3,f4,bb4], [a3,c4,d4,f4] ~, ~@3 [d1,d2]@5]/2", K: "[g4 f4 ab4 g4, [c4,eb4]]/2",
  L: "eb4 d4, [bb3,f4]", M: "[g3,eb4,f4] [ab3,c4,eb4], bb3", N: "[bb3,c4,f4]/2", O: "[f2,c4,f4,a4]/2",
})).s("gm_synth_strings_1").gain(0.4).pan(0.4)

// other · pad halo
const pad_halo = note("<~@28 A@16 B ~@14 A@28 B ~@4>".pickRestart({
  A: "c5/4", B: "f4",
})).s("gm_pad_halo").gain(0.57).pan(0.7)

// chords · pad poly
const pad_poly = note("<~@57 A B@2 C D E F@2 D G F@2 D G F@2 H G F@2 D G F@2 H G ~@9>".pickRestart({
  A: "~@3 d4", B: "[eb4@4 ~@4 c5@17 ~@7, f4@25 ~@7, ~ [d4,g4]@3 ~@4]/2", C: "[c4,d4,f4]", D: "[g3,c4,e4]", E: "[c4,f4]",
  F: "[~ d4, [c4,f4]]/2", G: "[a3,c4,f4]", H: "[c4,e4]",
})).s("gm_pad_poly").gain(0.56).pan(0.3)

// other · lead 1 square
const lead_1_square = note("<~@74 A B C B D@2 C B D@2 C B E@2 ~@4>".pickRestart({
  A: "~@15 g5", B: "c6 f5 c6 f5 ~ f5 c6 f5 c6 f5 ~ f5 c6 f5 c6 f5", C: "bb5@2 a5 g5 f5 g5 a5 f5@2 c5 ~ c5 d5 f5 g5 f5",
  D: "[f6@2 e6 d6 c6 d6 e6 f6@2 e6 d6 c6 a5 g5 f5 c6@2 f5 c6 f5 ~ f5 c6 f5 c6 f5 ~ f5 c6 f5 c6 f5]/2",
  E: "[f6@2 e6 d6 c6 d6 e6 f6@2 e6 d6 c6 a5 g5 f5@5 ~@13]/2",
})).s("gm_lead_1_square").gain(0.44).pan(0.8)

// other · bagpipe
const bagpipe = note("<~@4 A ~ B ~ A ~ B ~ A ~ B ~@3 A ~ B ~ A ~ B ~@20 A ~ B ~ C ~ D ~ C ~ D ~@36>".pickRestart({
  A: "db5 bb4 ~ db5 bb4 ~@3", B: "db5@2 bb4@2 ~@2 db5@2 bb4 ~@7", C: "eb5 c5 ~ eb5 c5 ~@3",
  D: "eb5@2 c5@2 ~@2 eb5@2 c5 ~@7",
})).s("gm_bagpipe").gain(0.22).pan(0.8)

// other · bagpipe
const bagpipe_2 = note("<~@4 A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~@20 A ~ A ~ B ~ B ~ B ~ B ~@36>".pickRestart({
  A: "~@4 b4 ~@3", B: "~@4 db5 ~@3",
})).s("gm_bagpipe").gain(0.14).pan(0.7)

// other · synth drum
const synth_drum = note(`<
  [a-1 ~@2 a-1 ~@6 a-1 ~@5]!16
  ~@2
  [a-1 ~@2 a-1 ~@6 a-1 ~@5]!8
  ~@21
  [a-1 ~@2 a-1 ~@6 a-1 ~@5]!10
  ~@35
>`).s("gm_synth_drum").gain(0.46)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@26 A B C@3 D C@3 D C@3 D C@3 E ~@13 F@2 G@3 H G@3 H G@3 H G@3 I G@3 H G@3 I C@3 E ~@5
>`.pickRestart({
  A: "~@3 eb4@5, eb3, ~@3 bb3@13", B: "~@11 d4@5, eb4@6 eb4@7 ~@3, ~@3 f4@5 f4@8",
  C: "[~@3 f4@2 e4@2 ~@4 e4@2 ~@6 f4@2 e4@2 ~@4 e4@2 ~@3 c4@2 ~ g4@2 ~@8 g4@3, f3@7 ~@2 c4@7 bb2@7 f4@4 ~@2 f4@5 ~@3 f4@4 c4@7, ~@2 c4@5 f4@4 ~@2 f4@5 c4@6 ~ c4@6 ~@3 c4@5 g4@4 f4@5]/3",
  D: "~@3 g4@2 a4@2 ~@5 f4@4, d3, ~ d4@7, ~@7 g4@5 ~@4, ~@9 a4@7", E: "~@7 a4@2 g4@3 a4@4, d3, ~@5 f4@11",
  F: "[~ g3 ~@3 g3 ~@3 g3 ~@3 g3 ~@3 g3 ~@3 g3 ~@3 g3 ~@3 g3 f3@2, c4@2 f3@3 ~ f3@3 ~ f3@3 ~ f3@3 ~ f3@3 ~ f3@3 ~ f3@3 ~@3, ~@3 c4@4 c4@4 c4@4 c4@4 c4@4 c4@4 c4@5]/2",
  G: "[~@3 f4@2 e4@2 ~@4 e4@2 f4@5 ~ f4@2 e4@2 ~@4 e4@2 ~@3 c4@2 ~ g4@2 ~@8 g4@3, ~@2 c4@5 f4@4 ~@12 f4@4 ~@2 f4@5 ~@3 f4@4 c4@7, ~@9 c4@7 ~@2 c4@6 ~ c4@6 ~@3 c4@5 g4@4 f4@5]/3",
  H: "~@3 g4@2 a4@2 ~@5 f4@4, ~ d4@7, ~@7 g4@5 ~@4, ~@9 a4@7", I: "~@7 a4@2 g4@3 a4@4, ~@5 f4@11",
})).s("gm_electric_guitar_clean").gain(0.44).pan(0.1)

// chords · piano
const piano = note(`<
  ~@16 A B@2 ~@9 C@2 D E C@2 D E C@2 F@2 C@2 G@2 ~@5 H I J K H L J K ~@4 M@2 ~@2 N@2 ~@2 O@2 ~@2 P@2 ~@2 Q@2 ~@2 R@2 ~@2
  Q@2 ~@5
>`.pickRestart({
  A: "[eb4,eb5]@6 [db4,db5] [f4,f5]@2 [db4,db5]@3 [bb3,bb4] [db4,db5]@3", // Eb Db F Db Bb Db
  B: "[[eb4,eb5]@6 [db4,db5] [f4,f5]@2 [db4,db5]@3 [bb3,bb4]@2 [db4,db5]@6 ~@12]/2", C: "[~ d4, [c4,f4]]/2",
  D: "[g3,c4,e4]", E: "[a3,c4,f4]",
  F: "[~@3 c5 e5 ~ d5 e5@2 ~@2 d5 e5@2 d5 ~@2 d5@4 ~@11, [g3,c4,e4]@15 f5@2 ~@15, ~ [a3,c4,f4]]/2", // C F
  G: "[~@3 c5 e5 ~ d5 e5 ~ d5 ~ e5 ~ d5 ~@3 d5@3 ~@12, [g3,c4,e4]@15 f5@2 ~@15, ~ [a3,c4,f4]]/2", H: "[eb4,g4] [d4,f4]",
  I: "ab4 g4, eb4", J: "[eb4,g4]@2 [d4,f4] [bb3,d4]", K: "g3 ab3, eb4@3 ~", L: "ab4 g4, eb4@15 ~",
  M: "[~@3 c5 e5 d5@2 e5@2 d5@2 e5@3 d5 f5@2 d5@3 ~@5 [f4,a4] [d4,g4] [c4,f4] [d4,g4]@2 [c4,f4]@2]/2", // F G5 F5 G5 F5
  N: "[~@3 c5 e5@2 d5 e5@2 d5@2 e5@2 d5@2 f5@2 d5@3 ~@5 [f4,a4] [d4,g4] [c4,f4] [d4,g4]@2 [c4,f4]@2]/2", // F G5 F5 G5 F5
  O: "[~@3 c5 e5@2 d5 e5@4 d5 e5@2 d5 f5@2 d5@3 ~@5 [f4,a4] [d4,g4] [c4,f4] [d4,g4]@2 [c4,f4]@2]/2", // F G5 F5 G5 F5
  P: "[~@3 c5 e5@2 d5 e5@2 d5@2 e5@2 d5@2 f5@2 d5@3 ~@12]/2",
  Q: "[~@4 [g4,bb4]@2 [f4,a4] [g4,bb4]@2 [f4,a4]@2 [g4,bb4]@2 [f4,a4]@2 [a4,c5]@2 [f4,a4]@7 ~@8]/2", // Gm F Gm F Gm F Am F
  R: "[~@4 [g4,bb4]@2 [f4,a4] [g4,bb4]@2 [f4,a4]@2 [g4,bb4]@2 [f4,a4]@2 [a4,c5]@2 [f4,a4]@5 ~@10]/2", // Gm F Gm F Gm F Am F
})).s("gm_piano").gain(0.07)

// drums · kick
const kick = s("bd").struct("<~@8 A@8 B@2 A@8 B C A@15 D ~@3 A@10 B C A@27 D ~@5>".pickRestart({
  A: "x ~@2 x ~@4 x ~ x ~@2 x ~@2", B: "x ~@7 x ~ x ~@2 x ~@2", C: "x ~@7 x ~@2 x ~@2 x ~", D: "x ~@2 x ~@4 x ~ x ~@5",
})).gain(0.64)

// drums · rim
const rim = s("rim").struct("<A@16 ~@2 A@8 ~@2 A@16 ~@3 A@10 ~@2 A@28 ~@5>".pickRestart({
  A: "~@7 x ~ x ~@6",
})).gain(0.56)

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

// drums · clap
const clap = s("cp").struct("<~@28 A@11 B A B A@2 ~@15 A@11 B A@3 B A@3 B A@3 B A B A@2 ~@5>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~@2 x",
})).gain(0.64)

// drums · hihat
const hihat = s("hh").struct("<A@16 B@2 A@8 B@2 A@15 C ~ A@12 B@2 A@27 C A@5>".pickRestart({
  A: "x!16", B: "~ x ~@2", C: "x!13 ~@3",
})).gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@27 [~@9 x!2 ~ x!2 ~ x] ~@64>").gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@16 [~ x ~@6]!2 ~@8 [~ x ~@6]!2 ~@29 [~ x ~@6]!2 ~@33>").gain(0.4)

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

// drums · ride
const ride = s("rd").struct("<~@57 [~ x!3] [x!4] ~@33>").gain(0.64)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@4 A B A B A B A B A B A B A@3 B A B A B A B A@3 B A B A B A B A B A B A B A B ~ C@2 A B A B A B A B A B A@3 B A B A
  B A B A B A B A B A B A B A B A B A B A B A B C@5
>`.pickRestart({
  A: "x ~@2 x ~@2 x ~@3 x ~@5", B: "x ~@2 x ~ x ~@2", C: "x ~@2 x ~@6 x ~ x ~@3",
})).gain(1.54)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  ~@4 A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2 B@2 A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B@5
>`.pickRestart({
  A: "~@3 x", B: "~@6 x!2 ~@6 x!2",
})).gain(1.54)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct(`<
  ~@4 A B A B A B A B A B A B ~@2 A B A B A B A B ~@2 A B A B A B A B A B A B A B A B ~ A B A B A B A B A B A B ~@2 A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A@5
>`.pickRestart({
  A: "~ x ~@2 x ~@3", B: "~ x ~@2 x!2 ~@2",
})).gain(3.06)

// drums · shaker
const shaker = s("sh").struct("<[~@3 x!2 ~@2 x]!4 [x!16]!39 [x!13 ~@3] ~ [x!16]!41 [x!13 ~@3] [x!16]!5>").gain(0.32)

// drums · guiro
const guiro = s("guiro:0").struct("<~@49 [~@2 x ~@4 x ~ x ~ x ~@4]!8 ~@35>").gain(13.52)

// drums · triangle
const triangle = s("triangles:30").struct("<~@16 A@2 ~@8 A@17 B ~@13 A@30 C D C D C>".pickRestart({
  A: "x!16", B: "x!13 ~@3", C: "~ x!2 ~@3 x!2", D: "~ x!2 ~@4 x",
})).gain(3.48)

// drums · triangle · soft notes
const triangle_soft = s("triangles:30").struct("<~@87 [~ x ~ x ~ x!2 ~ x!4 ~ x ~ x]!5>").gain(2.09)

// drums · triangle
const triangle_2 = s("triangles:35").struct("<~@88 [x ~@2 x] x [x ~@2 x] x>").gain(3.48)

// drums · triangle · soft notes
const triangle_soft_2 = s("triangles:35").struct("<~@87 [x ~@6 x ~@8] [~@7 x ~@8]!4>").gain(2.09)

stack(
  bass, synth_strings_1, pad_halo, pad_poly, lead_1_square, bagpipe, bagpipe_2, synth_drum, electric_guitar_clean,
  piano, kick, rim, snare, clap, hihat, mid_tom, open_hat, crash, ride, congas, congas_2, agogo_bells, shaker, guiro,
  triangle, triangle_soft, triangle_2, triangle_soft_2
)

More by Anggun