Strudelify

Unplugged 06 Tea in the Sahara

Sting

KeyF minorTempo124 bpm
0:00/0:00
// Unplugged 06 Tea in the Sahara — Sting
// 124 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 5 pad warm (copy of ch 3 string ensemble 2); ch 9 clarinet (copy of ch 11 bassoon); ch 14 oboe (copy of ch 13 soprano sax)
// note: Full arrangement: all 126 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(124/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 · acoustic bass · "Moon Bourbon"
const bass = note(`<
  ~@2 A B C D E B F G H I J K L M H I A B J N A B F G O P F G H I Q R Q R Q R Q R M B F G M B J K H I J K S A H I M B J
  N A B F G O P F G H I Q R Q R Q R Q R ~@12 M B F G M B J N H I J K S A H I M B F G A B F G H I F G T U@3 ~@4
>`.pickRestart({
  A: "g2 g1", B: "c2 c3", C: "f2 c2", D: "f1 f2", E: "g2 db2", F: "f2 e2", G: "eb2 d2", H: "db2 db3", I: "c3 c2",
  J: "f2 g2", K: "ab2 c3", L: "d2!2", M: "g1 g2", N: "ab2 f2", O: "db2 ab2", P: "g2 c2", Q: "f1 ab1", R: "bb1 c2",
  S: "d2 d3", T: "db2", U: "c2/3",
})).s("gm_acoustic_bass").gain(0.35)

// chords · string ensemble 2
const string_ensemble_2 = note(`<
  ~@32 A@8 B@2 C@2 B@2 C@2 D@2 E@2 F@3 G B@2 C@2 B@2 C@2 D@2 E@2 H I J@8 K L M N O P Q R S@4 T@2 C@2 B@2 C@2 D@2 E@2 F@3
  G B@2 C@2 B@2 C@2 D@2 E@2 H I ~@2 U@4
>`.pickRestart({
  A: "f6/8", B: "[~@6 [f4,bb4] ~@5 [f4,bb4]@9 ~@9 [eb4,gb4] ~@5 [eb4,gb4]@6 [e4,g4]@3 ~@3, [bb3,db4], f3 e3]/2",
  C: "[~@6 [ab4,c5] ~@5 [ab4,c5]@9 ~@9 [ab4,c5] ~@5 [ab4,c5]@9 ~@3, [f3,ab3,c4]]/2", // Ab Fm
  D: "[~@6 [f4,ab4] ~@5 [f4,ab4]@7 ~@11 [f4,ab4] ~@5 [f4,ab4]@6 [e4,g4]@3 ~@3, [f3,ab3,db4]@3 [e3,g3,c4]]/2", // Fm Em Db C
  E: "[~@6 [f4,ab4] ~@5 [f4,ab4]@7 ~@11 [f4,ab4] ~@5 [f4,ab4]@7 ~@5, [f3,ab3,c4]]/2", // Fm
  F: "[~@6 [f4,ab4] ~@5 [f4,ab4]@7 ~@11 [f4,b4] ~@5 [f4,b4]@7 ~@11 [f4,ab4] ~@5 [f4,ab4]@7 ~@5, [f3,b3], d4@2 ab3]/3", // Fm Fdim Fm Fdim
  G: "~@6 [e4,g4] ~@5 [e4,g4]@7 ~@5, [e3,g3,bb3]", H: "[f3,b3,db4,f4,ab4]", I: "[e3,bb3,c4,e4,bb4]", J: "f5/8",
  K: "[db2,db3]", L: "[eb2,eb3] [f2,f3]", M: "[g2,g3] [b1,b2]", N: "[c2,c3] [g2,g3]", O: "[c3,c4] [f2,f3]",
  P: "[bb2,bb3] [bb1,bb2]", Q: "[ab1,ab2] [ab2,ab3]", R: "[g1,g2] [g2,g3], b3",
  S: "[c4@2 db4@2 d4@2 [eb4,gb4] [e4,g4], [c1,c2,bb3], g4@3 ~]/4", // Ebm Em C7
  T: "[[f3,f4,bb4]@24 ~@6 [eb4,gb4] ~@5 [eb4,gb4]@6 [e4,g4]@3 ~@3, [bb3,db4], ~ e3]/2", U: "f1/4",
})).s("gm_string_ensemble_2").gain(0.2)

// other · pad new age
const pad_new_age = note(`<
  ~ A B C D E F@2 G@2 H I J K L M N O P@2 Q R S@2 J T U V@2 W X Y Z ~@6 AA AB AC AD@2 AE AF AG AH@5 AI@2 AJ@2 AK AL AM@2
  AN AO@3 AP@3 W X AQ Z ~@18 AR@2 AS AT O AU AV AW AX@3 AY AZ BA AV BB@4 BC@3 BD BE BF BG@2 BH@2 BI BJ ~@6
>`.pickRestart({
  A: "~@8 bb3 ~ bb3 ~", B: "bb3@11 ~@5 c4@2 ~@2 bb3@2 ~@2", C: "ab3 g3@2 f3@3", D: "~@4 g3@4 ab3@15 ~",
  E: "~@8 f3 ~ f3 ~", F: "[bb3@2 bb3 ~ c4@5 bb3@2 ab3@4 g3@2 ab3@3 bb3@4]/2",
  G: "[~@4 c4@8 c4@10 c4@15 ~@3 c4@2 ~@2 c4@4]/2", H: "db4@4 bb3 ab3", I: "g3@2 ab3@5 ~@3 bb3@2", J: "c4@23 ~",
  K: "~@3 g9 ~ f3", L: "ab3 ab3@2 g9 ~ ab3", M: "b3@2 g3@4 g9@2 ~@2 g3 ~", N: "g3 c4 bb3 g3@3", O: "~@3 g9 ~ c3",
  P: "[g3@13 ~@3 g3@2 ab3@4 bb3@16 ~@8 ab3@2]/2", Q: "g3 ab3@5", R: "~@8 c3 ~ c3@2",
  S: "[g3@13 ~@3 g3@2 ab3@4 bb3@15 ~@3 ab3@4 bb3@4]/2", T: "~@8 c4 ~ c4@2", U: "db4@2 db4@3 bb3@3 bb3@3 g3",
  V: "[g9 ~ g3 ab3 bb3 c4@2 c4!2 c4@3]/2", W: "~@4 f3 g3", X: "ab3@3 ab3@7 ~@6 bb3@4 ab3@4", Y: "ab3 g3@5", Z: "f3",
  AA: "~@4 g3!2", AB: "g3!3 ab3 bb3@8", AC: "~@3 g9 ~ g3", AD: "[ab3@4 ab3@4 ab3@6 ab3@2 bb3@2 c4@19 ~@3 f3@4 f3@4]/2",
  AE: "g3@4 g3@4 ab3@4 bb3@11 ~", AF: "~@10 ab3 bb3", AG: "c4!3 c4@9",
  AH: "[~@8 c4 c4@2 c4@3 db4 db4@2 bb3@3 bb3@3 g3@8 ~@4 db4@3 c4@11 ~@5 g9@2 ~@2 f3@2]/5",
  AI: "[ab3@2 ab3@2 ab3@2 ab3@2 ab3@3 b3@3 g3@4 g9@2 ~@2 g3@2]/2",
  AJ: "[g3@2 c4@2 bb3@2 bb3@2 g3@5 ~@5 g9@2 ~@2 c3@2]/2", AK: "g3@13 ~@3 g3@4 ab3@4", AL: "bb3@13 ~@3 ab3@4 g3@4",
  AM: "[ab3@13 ~@3 ab3@2 bb3@4 c4@15 ~@3 f3@4 f3@4]/2", AN: "bb3@13 ~@3 c4@4 bb3@4",
  AO: "[ab3@2 g3@8 ~@6 ab3@2 bb3@4 c4@16 ~@2 c4@2 c4@4 c4@15 ~@3 c4@4 c4@4]/3",
  AP: "[db4@2 db4@3 bb3@3 bb3@3 g3@5 g3@2 ab3@2 bb3@2 c4@4 c4@2 c4@2 c4@6]/3", AQ: "ab3@2 g3@7 ~@3",
  AR: "[~@8 c3 c3@2 g3@3 g3 ab3@2 bb3@7]/2", AS: "~@8 ab3 g3@2 ab3", AT: "g9 ab3@2 ab3 bb3 c4@7",
  AU: "g3@2 g3@2 g3@4 ab3@4 bb3@11 ~", AV: "~@11 ab3", AW: "bb3@2 c4@3 c4 c4@2 c4@4",
  AX: "[~@16 c4@6 db4@15 ~@3 bb3@2 bb3@4 g3@8 ~@6 g3@4 ab3@4 bb3@4]/3", AY: "c4!3 c4@3", AZ: "~@7 f3",
  BA: "ab3@3 ab3@3 ab3@3 ab3@3 ab3@6 ab3@5 ~",
  BB: "[g3@2 g3@3 g3@3 g3@5 ~@10 c3@3 g3 g3@2 g3 ab3@2 bb3@5 ~@9 ab3 bb3]/4",
  BC: "[c4@2 f4@2 g4@2 ab4@2 f4@5 ~@7 c4 c4@2 g4@3 g4 g4@2 ab4@3 g4@4]/3", BD: "~@4 c4!2",
  BE: "ab4@2 ab4@2 g4 g4@2 f4@4 ~", BF: "~@4 f4!2", BG: "[f4@4 f4@6 f4@6 f4@6 c4@9 ~@9 c4@4 f4@4]/2",
  BH: "[g4@2 ab4@3 bb4@3 g4@3 f4@7 ~@2 ab4@2 g4@2]/2", BI: "f4@2 db4@5 ~ c4@2 bb3@2", BJ: "c4@2 bb3@7 f3@3",
})).s("gm_pad_new_age").gain(0.25)

// bass · pizzicato strings
const bass_2 = note("<~@32 A B A B A B A B ~@30 A B A B A B A B C D E F G H I J ~@40>".pickRestart({
  A: "~@2 [f1,f2] ~@3 [ab1,ab2] ~", B: "~@2 [bb1,bb2] ~@3 [c2,c3] ~", C: "db2", D: "eb2 f2", E: "g2 b1", F: "c2 g2",
  G: "c3 f2", H: "bb2", I: "ab2", J: "g2",
})).s("gm_pizzicato_strings").gain(0.3)

// chords · flute
const flute = note("<~@32 A@2 B@2 A@2 C@2 ~@30 A@2 B@2 A@2 C@2 ~@42 D E ~@4>".pickRestart({
  A: "[~@6 [ab4,f6] ~@5 ab4@6 c5@6 ~@6 ab6 ~@5 ab6@6 g6 ~@5, ~@3 f6@4 ~@5, ~@2 bb4 g4]/2", // Db
  B: "[~@6 [ab4,f6] ~@5 ab4@6 c5@6 bb4 ~@2 ab4 ~@2 [g4,db6] ~@5 [g4,db6]@6 c6 ~@5, ~@3 f6@4 ~@5]/2", // Db Gdim
  C: "[~@6 [ab4,f6] ~@5 ab4@6 c5@6 bb4 ~@2 ab4 ~@2 [g4,db6] ~@2 f4 ~@2 [g4,db6]@6 c6 ~@5, ~@3 f6@4 ~@5]/2", // Db Gdim
  D: "~@6 ab5 ~@5 ab5@6 g5 ~@5", E: "~@6 f5 ~@5 f5@6 e5 ~@5",
})).s("gm_flute").gain(0.25).pan(0.7)

// chords · oboe
const oboe = note("<~@32 A@2 B@2 A@2 C@2 ~@30 A@2 B@2 A@2 D@3 E F G@2 H I J@2 K L M ~@36>".pickRestart({
  A: "[~@6 [c5,f5] ~@5 c5@6 eb5@6 ~@6 ab5 ~@5 ab5@6 g5 ~@5, ~@3 f5@4 ~@5, ~@2 db5 bb4]/2", // F5
  B: "[~@6 [c5,f5] ~@5 c5@6 eb5@6 db5 ~@2 c5 ~@2 [bb4,db5] ~@5 [ab4,db5]@6 c5 ~@5, ~@3 f5@4 ~@5]/2", // F5 Bbm Db5
  C: "[~@6 [c5,f5] ~@5 c5@6 eb5@6 db5 ~@2 c5 ~@2 [bb4,db5] ~@2 ab4 ~@2 [bb4,db5]@6 c5 ~@5, ~@3 f5@4 ~@5]/2", // F5 Bbm
  D: "[~@6 [c5,f5] ~@5 c5@6 eb5@6 db5 ~@2 c5 ~@2 [bb4,db5] ~@2 ab4 ~@2 db5@6 c5 ~@11 ab4@6 g4@6 f4@6, ~@6 f5@8 ~@4 bb4@9 ~@9]/3", // F5 Bbm
  E: "~ ab5 g5 f5, g4 ab4", F: "~ ab4 g4 f4, b4 f5",
  G: "[~@6 f5@6 eb5@6 d5@6 ~@6 c5@3 bb4 ~@2 ab4 ~@2 bb4 ~@2 g4@4 ~@2, g4@5 ~@3, ~ eb5]/2",
  H: "ab4@3 bb4@3 ab5@4 ~@2 g5@4 ~@2 f5@4 ~@2, ~@3 ab4@8 ~", I: "g4 ab4 bb5 ab5 g5@2 f5@2, ~@3 g4@8 ~",
  J: "[f4 g4 g5 f5 e5@2 ~@4 c5@2 b4@2 c5@2, ~ f4@3 ~@4, ~@3 f5@5]/2", K: "~ bb4 a4 bb4", L: "~ ab4 g4 ab4",
  M: "~ gb4@2 g4",
})).s("gm_oboe").gain(0.25).pan(0.6)

// other · timpani
const timpani = note("<~@86 A@4 B ~@35>".pickRestart({
  A: "[~@95 g2, c2!12 c2!12 c2!12 c2!12, ~ g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 g2@2 ~]/4",
  B: "g2 ~@23",
})).s("gm_timpani").gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<[x!4] [x!3 ~] [~ x ~ x]!76 ~@12 [~ x ~ x]!30 ~@6>").gain(0.3)

stack(bass, string_ensemble_2, pad_new_age, bass_2, flute, oboe, timpani, hihat)

More by Sting