Strudelify

Moon Mist

Ellington

KeyG minorTempo60 bpm
0:00/0:00
// Moon Mist — Ellington
// 60 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 55 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(60/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.

// chords · french horn
const french_horn = note(`<
  A B C B D E F G H I J K L M F G N O J P Q R S T U V W X Y Z AA AB AC AD J AE AF AG@2 AH AI@2 AJ AK AL AM AN AO N AD AP
  AQ AR@2 ~
>`.pickRestart({
  A: "c4 bb3, [d4,d5,g5]", B: "[a3,eb5,f5] ~@11", C: "c4 bb3, [d4,d5,eb5,g5]", D: "[c4,g4] [bb3,g4]",
  E: "[a3,g4,b4] [gb3,gb4]", F: "[f3,g3,eb4,f4] [f3,ab3,eb4,g4]", G: "[c4,bb4]", H: "[ab3,d4,bb4,db5] [a3,b4,d5]@5, f3",
  I: "[b4,eb5,gb5] [bb4,c5,e5,g5]@5, bb2", J: "[eb3,f3,d4]", K: "[f3,ab3,eb4] [f3,ab3,d4]",
  L: "[c4,bb4,d5] [bb3,d4,bb4,d5]", M: "[a3,b4,d5] [bb2,ab3,c4,d4,d5,e5]", N: "[ab3,bb4,db5] [a3,b4,d5]@5, f3",
  O: "[db4,b4,eb5,gb5] [d4,c5,e5,g5]@5, bb2", P: "[f3,eb4] [f3,d4]", Q: "[eb3,g3,d4,f4,g4]@3 bb4 gb4@2, ~ [gb2,ab3,d4]",
  R: "[eb3,g3,f4,g4,bb4] [bb2,f3,f4,ab4]", S: "[eb3,g3,bb3,f4,g4]@3 bb4 gb4@2, ~ [ab3,bb3]",
  T: "[eb3,g3,c4,bb4] [bb3,bb4,db5,eb5,e5,gb5]", U: "[eb3,eb4,g4,bb4,eb5] ~@5 [gb3,ab3,eb4,f4]@6",
  V: "[g3,eb4,f4,g4] [g3,eb4,f4,g4]@2 [g3,eb4,f4,g4]@3", W: "[f3,eb5,g5]", X: "[bb3,d5,g5]",
  Y: "[c4,bb4,d5] [bb3,bb4,d5]", Z: "[a3,b4,d5] [bb2,ab3,d5,e5]", AA: "[f3,g3,f4] [f3,ab3,g4]",
  AB: "gb4 g4@3, [e4,bb4]", AC: "[ab3,db5] [a3,b4,d5]@5, f3", AD: "[db4,eb5,gb5] [d4,e5,g5]@5, bb2",
  AE: "[f3,c4,eb4] [f3,d4]", AF: "[db4,eb4,c5,a5]@5 [c4,eb4,c5,ab5] ~@6",
  AG: "[[db4,eb4,c5,gb5]@5 [c4,eb4,f4,bb4,c5,f5] ~@5 [db4,eb4,c5,a5]@4 [b3,d4,c5,bb5]@2 [d4,c5,gb5]@7]/2", // Cdim Cm7 Adim D7
  AH: "[c4,eb4,eb5] [d4,eb5,gb5]@5", // Cm D
  AI: "[~@2 [db4,eb4,a5]@4 [c4,eb4,f4,ab5] ~@4 [eb4,f4,g4,eb5,g5]@4 [d4,f4,g4,d5]@2 [c4,eb4,g4,eb5,g5] ~@2 [bb3,c4,eb4,d5,gb5]@4]/2", // Ebm7b5 Fm7 Eb G7 Cm Cm7b5
  AJ: "[a3,c4,eb4,d5,g5]", AK: "[ab3,c4,d5,g5]", AL: "[c4,d5] [bb3,d4,d5]", AM: "[a3,d5] [bb2,ab3,c4,d4,d5,e5]",
  AN: "[f3,g3,f4] [f3,ab3,eb4,g4]", AO: "gb4 g4@3, [c4,bb4]", AP: "[eb3,f3,d4] [c3,eb3,c4,eb4]",
  AQ: "[f3,c4,eb4] [f3,b3,d4]", AR: "[~ f6 d6 bb5 g5 f5 d5 c5 d5@8, [eb3,g3,bb3,eb4,f4]]/2",
})).s("gm_french_horn").gain(0.22).pan(0.6)

// bass · acoustic bass
const bass = note(`<
  ~@4 A B C D E F G H A I J D K F L M N O P Q R S T U A V J W X F Y Z AA AB@2 AC AD AE AF AG AH AI AJ AK AL AM AN AO AP
  AQ ~
>`.pickRestart({
  A: "c2 bb1", B: "a1 gb1", C: "eb2@11 ~ db2@12", D: "c2 e2", E: "f2@6 f2@3 ~ ab1 a1", F: "bb1!2", G: "eb2!2",
  H: "f2@5 c3 bb2@3 g2@3", I: "a1@2 bb2 bb1", J: "eb2 db2", K: "f2!2", L: "eb2 g2 bb2 eb2", M: "f2@5 c2 bb1@3 bb2@3",
  N: "eb2 ab2", O: "eb2@6 bb1@3 f2 bb2 bb1", P: "eb2@4 ~ eb2 ab2@6", Q: "eb2@5 eb2 bb1@3 e2@3",
  R: "eb2@3 ~@2 eb2 ab2@6", S: "eb2@4 bb2 b2 c3@3 c2@3", T: "f2@6 f2@4 c2 b1", U: "bb1@2 g2 b2", V: "a1@2 f2 bb1",
  W: "c2@2 g2 c2", X: "f2@5 e2 f2@5 c2", Y: "eb2 g2 c3 bb2", Z: "f2@2 bb2 bb1", AA: "eb2@5 ab2@4 ~ bb2 d2",
  AB: "[eb2@5 ab2@3 ~ bb1@2 eb2@5 ~ eb2 ab2@3 bb1@2 d2]/2", AC: "eb2@9 ~ eb2@2 ab2@6 bb1@6", AD: "eb2@5 ~ ab1@5 c2",
  AE: "eb2@3 d2@2 c2@3 c2@3 a1", AF: "f1@3 g1@3 a1@3 c2@2 f1", AG: "bb1 c2 d2 g2", AH: "c2@9 ~ c2@2 bb1@12",
  AI: "a1@4 ~ a1 f1@3 bb1@3", AJ: "eb2@9 ~ eb2@2 db2@9 ~ db2@2", AK: "c2 e2 g2 c2", AL: "f2@4 f2 c2 f1@4 c2 b1",
  AM: "bb1@9 ~ bb1@2 bb2@6 bb1@6", AN: "eb2@3 eb2@2 d2 c2@4 g2 gb2", AO: "f2@5 b1 bb1@3 bb2@2 bb1", AP: "eb1@3 eb2",
  AQ: "eb1",
})).s("gm_acoustic_bass").gain(0.43)

// bass · acoustic bass · soft notes
const bass_soft = note("<[~@3 c4!4 ~@8 c4!4 ~@5]!4 ~@51>").s("gm_acoustic_bass").gain(0.19)

// chords · synth strings 1
const synth_strings_1 = note(`<
  A B A B C D E F G H I J K L M N O P I J Q R Q S T U V W X L Y N Z P AA J AB AC@2 AD AE@2 AF AG AH AI Y N G AJ AK AL
  AM@2 ~
>`.pickRestart({
  A: "[d4,eb4,g4]", B: "[eb4,g4,c5] ~@11", C: "[d4,eb4,f4,g4]!2", D: "[d4,eb4,f4,g4,b4] [d4,gb4]",
  E: "[eb4,f4] [eb4,g4]", F: "gb4 g4@3, [e4,bb4]", G: "[d4,gb4,bb4] [eb4,f4,g4,b4]@5", H: "[g4,b4] [d4,ab4,bb4,c5]@5",
  I: "[g3,bb3,d4]", J: "[ab3,bb3,c4,eb4] [ab3,b3,d4]", K: "[c4,eb4,f4,g4] [bb3,d4,eb4,f4,g4]",
  L: "[eb4,f4,g4] [c4,d4,gb4]", M: "[bb3,c4,eb4,f4] [bb3,db4,eb4,g4]", N: "gb4 g4@3, [c4,e4,bb4]",
  O: "[d4,gb4,bb4] [eb4,f4,g4]@5", P: "[db4,g4] [d4,ab4,bb4]@5", Q: "[g3,bb3,c4,d4] [ab3,bb3,c4,d4]",
  R: "[g3,c4,d4] [g3,b3,eb4]", S: "[g3,c4,d4] [bb3,e4]", T: "eb4 ~@5 [c4,eb4,f4]@6",
  U: "[c4,eb4,f4,g4] [eb4,f4,g4]@2 [c4,eb4,f4,g4]@3", V: "[eb4,a4,c5]", W: "[d4,ab4,b4]",
  X: "[c4,eb4,f4,g4] [d4,eb4,f4,g4]", Y: "[c4,eb4,f4] [db4,eb4,g4]", Z: "[ab3,d4,gb4,bb4] [a3,eb4,f4,g4]@5",
  AA: "[bb3,d4]", AB: "[db4,eb4,gb4,bb4]@5 [c4,eb4,f4,bb4] ~@6",
  AC: "[[db4,eb4,gb4,bb4]@5 [c4,eb4,f4,bb4] ~@5 [gb4,bb4,c5]@4 [gb4,bb4,c5]@2 [ab4,b4,c5]@7]/2", // Ebm7 Cm7 Cm7b5 Ab
  AD: "[gb4,bb4,c5,eb5] [ab4,c5,eb5]@5", // Cm7b5 Ab
  AE: "[~@2 [gb4,bb4,c5]@4 [f4,bb4,c5] ~@4 [f4,g4,bb4,c5,eb5]@4 [f4,g4,b4,d5]@2 [g4,bb4,c5,eb5] ~@2 [gb4,d5]@4]/2", // Cm7b5 Fsus4 Cm7 G7 Cm7 D
  AF: "[g4,d5]", AG: "[g4,b4,d5]", AH: "[g4,bb4,d5]!2", AI: "[g4,b4,d5] [gb4,d5,e5]",
  AJ: "[db4,g4,b4] [d4,ab4,bb4,c5]@5", AK: "[f3,g3,d4] eb4", AL: "[f3,eb4] [f3,d4]", AM: "[eb3,g3,eb4,f4]/2",
})).s("gm_synth_strings_1").gain(0.27).pan(0.4)

// chords · muted trumpet
const muted_trumpet = note(`<
  A B A B C D E F G H I J K L E M G N I O P Q P R S T U V W X Y M Z AA I AB AC AD@2 AE AF@2 AG AH K AI AJ F G AK AL AB
  AM@2 ~
>`.pickRestart({
  A: "[g4,d5]", B: "[g4,c5] ~@11", C: "[eb4,f4]!2", D: "[eb4,f4] [bb3,c4]", E: "[bb3,c4] [bb3,db4]", F: "gb4 g4@3, e4",
  G: "gb4 [f4,g4]@5", H: "b4 [bb4,c5]@5", I: "[g3,bb3]", J: "[bb3,c4]@11 ~ [ab3,b3]@12", K: "[f4,g4]!2",
  L: "[f4,g4] [d4,gb4]", M: "gb4 g4@3", N: "[db4,g4] [d4,ab4]@5", O: "bb3 b3", P: "[c4,d4]!2", Q: "[c4,d4] eb4",
  R: "[c4,d4] [e4,gb4]", S: "eb4 ~@5 [c4,eb4]@6", T: "[c4,eb4] [b3,eb4]@2 [c4,eb4]@3", U: "[a4,c5]", V: "[ab4,b4]",
  W: "g4 [f4,g4]", X: "[f4,g4] [c4,d4]", Y: "[c4,eb4] [db4,eb4]", Z: "[gb4,bb4] [g4,b4]@5", AA: "b4 [bb4,c5]@5, bb2",
  AB: "[ab3,bb3] ab3", AC: "[gb4,bb4]@5 bb4 ~@6", AD: "[[gb4,bb4]@5 bb4 ~@5 [gb4,bb4]@4 [gb4,bb4]@2 [ab4,b4]@7]/2",
  AE: "[gb4,bb4] ab4@5", AF: "[~@2 [gb4,bb4]@4 bb4 ~@4 [g4,bb4]@4 [g4,b4]@2 [g4,bb4] ~@2 [eb4,gb4]@4]/2",
  AG: "[eb4,g4]", AH: "[f4,g4]", AI: "[f4,g4] [bb2,d4,gb4]", AJ: "[eb4,f4] [eb4,g4]", AK: "g4 [ab4,e5]@5",
  AL: "[g3,bb3] bb3", AM: "[~ f6 d6 bb5 g5 f5 d5 c5 d5@8, [g3,bb3]]/2",
})).s("gm_muted_trumpet").gain(0.3).pan(0.3)

// chords · brass section
const brass_section = note(`<
  A B A B C D E F G H I J K L M F G H I J N O P Q R S A T U L M F G H V J W X@2 Y Z@2 T AA K AB M F G AC AD AE AF@2 ~
>`.pickRestart({
  A: "[eb5,g5]", B: "[eb5,f5] ~@11", C: "g4!2", D: "[g4,b4] gb4", E: "~ g4", F: "gb4 g4@3, bb4",
  G: "[bb4,db5] [b4,d5]@5", H: "[eb5,gb5] [e5,g5]@5", I: "d4", J: "[c4,eb4] [b3,d4]", K: "[bb4,d5]!2",
  L: "[b4,d5] [d5,e5]", M: "[eb4,f4] [eb4,g4]", N: "[f4,g4]@3 bb4 gb4@2, ~ gb2", O: "[g4,bb4] ab4", P: "g4@3 bb4 gb4@2",
  Q: "[g4,bb4] [e5,gb5]", R: "~ [eb4,f4]", S: "[eb4,f4,g4] [eb4,f4,g4]@2 [eb4,f4,g4]@3", T: "[d5,g5]", U: "d5 [bb4,d5]",
  V: "[bb3,d4]", W: "[c5,a5]@5 [c5,ab5] ~@6", X: "[[c5,gb5]@5 [c5,f5] ~@5 [c5,a5]@4 [c5,bb5]@2 [c5,gb5]@7]/2",
  Y: "eb5 [eb5,gb5]@5", Z: "[~@2 [c5,a5]@4 [c5,ab5] ~@4 [eb5,g5]@4 d5@2 [eb5,g5] ~@2 [d5,gb5]@4]/2", AA: "[b4,d5,g5]",
  AB: "[b4,d5] [bb2,d5,e5]", AC: "[db4,g4,b4,eb5,gb5] [d4,ab4,bb4,c5,e5,g5]@5, bb2", AD: "d4 [c3,c4,eb4]",
  AE: "[c4,eb4] d4", AF: "[~ f6 d6 bb5 g5 f5 d5 c5 d5@8, [eb4,f4]]/2",
})).s("gm_brass_section").gain(0.25).pan(0.8)

// drums · kick
const kick = s("bd").struct("<[x!2]!39 [x ~@5 x ~@4 x] [x!2]!12 x ~@2>").gain(0.38)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<[~@5 x ~@6]!52 ~@3>").gain(0.22)

// drums · snare
const snare = s("sd").struct("<A@4 B@7 A B@3 A B A B@13 A C D C@3 D C E C D C@5 D@2 C@3 F ~@2>".pickRestart({
  A: "x ~@2 x ~ x!2 ~@2 x ~@2", B: "x ~@2 x ~ x!2 ~@5", C: "x ~@4 x!2 ~@2 x ~@2", D: "x ~@4 x!2 ~@5",
  E: "x ~@4 x!2 ~@2 x ~ x", F: "x",
})).gain(0.38)

// drums · clap
const clap = s("cp").struct(`<
  ~@4 A@5 B A C B D A E B F B C A G A C H@2 A I A@3 J K L M N O P M O M Q M O M O M P Q M R K ~@3
>`.pickRestart({
  A: "~@3 x", B: "~@8 x!2 ~@2", C: "~@7 x ~ x ~@2", D: "~@9 x ~ x", E: "~@2 x ~@4 x ~@2 x ~", F: "~@2 x",
  G: "~@4 x ~@2 x ~ x ~ x", H: "~@9 x!2 ~", I: "~@7 x ~ x ~ x", J: "~ x ~@5 x ~ x ~@2", K: "~@3 x ~@7 x",
  L: "~@3 x ~@5 x ~ x", M: "~ x ~@2", N: "~@3 x ~@3 x ~@2 x ~", O: "~@3 x ~@6 x ~", P: "~@3 x ~@3 x ~ x ~ x",
  Q: "~@3 x ~@3 x ~ x ~@2", R: "~@3 x ~@4 x ~@3",
})).gain(0.38)

// drums · open hat
const open_hat = s("oh").struct("<[x!4]!52 x ~@2>").gain(0.05)

// drums · ride
const ride = s("rd").struct(`<
  ~@4 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ AR AS AT AU
  AV AW AX AY
>`.pickRestart({
  A: "~@3 x!5 ~ x!3", B: "x ~ x ~@4 x!2 ~ x ~ x ~ x!3 ~ x ~ x ~ x ~", C: "x!5 ~ x ~ x!4",
  D: "x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~", E: "~@3 x!2 ~ x ~ x ~@3 x ~@5 x ~ x ~ x ~",
  F: "x!4 ~@2 x ~@2 x!3", G: "~ x ~ x!4 ~ x!4", H: "x ~@2 x!2 ~ x ~@3 x ~ x ~ x ~ x ~ x ~ x ~ x ~",
  I: "~@2 x!2 ~@2 x ~@2 x ~ x", J: "x ~@3 x ~ x ~ x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~", K: "~ x!6 ~ x!3 ~",
  L: "x!5 ~ x ~ x ~ x!2", M: "x!11 ~", N: "x ~@5 x ~ x ~ x ~@4 x!2 ~ x ~ x!3 ~", O: "~@2 x!8 ~ x", P: "x!7 ~ x!4",
  Q: "x ~@2 x ~@2 x ~ x!4", R: "x!2 ~ x!2 ~ x!2 ~ x!2 ~", S: "~@2 x!5 ~ x!4",
  T: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!3 ~ x ~", U: "~@2 x ~ x ~ x ~@3 x ~ x ~@2 x!2 ~ x ~@3 x ~",
  V: "x ~@2 x!2 ~ x ~@3 x ~ x ~@3 x ~ x ~@2 x!2 ~", W: "~@4 x ~ x ~ x ~ x ~ x ~ x!3 ~ x!3 ~ x ~",
  X: "~@2 x ~ x ~ x ~@7 x!3 ~@3 x ~@3", Y: "~@6 x ~@3 x ~ x ~@2 x!2 ~ x ~@3 x ~",
  Z: "x ~ x!3 ~ x ~ x ~@3 x ~ x ~ x ~ x ~ x ~ x ~", AA: "x!2 ~ x ~ x!7",
  AB: "x ~@2 x!2 ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~", AC: "~@2 x ~@3 x ~ x ~ x ~ x ~ x!3 ~ x ~@3 x ~",
  AD: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!3 ~ x ~ x!3 ~", AE: "~@3 x ~ x!2 ~ x!4",
  AF: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~ x ~ x!3 ~ x ~", AG: "~@2 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!3 ~",
  AH: "x ~ x ~ x ~ x!3 ~ x!3 ~ x ~ x!3 ~@3 x ~", AI: "~@6 x ~ x!3 ~ x ~ x ~ x ~ x ~ x!3 ~",
  AJ: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@3 x!6", AK: "~@2 x ~ x ~ x ~ x ~ x ~ x ~ x!3 ~ x ~ x!4",
  AL: "x!5 ~ x ~ x!3 ~@5 x ~ x ~ x ~ x!2", AM: "~@3 x ~ x!7", AN: "x ~ x ~ x ~ x ~ x ~ x ~ x!3 ~ x!3 ~ x ~ x ~",
  AO: "~@2 x!2 ~ x!7", AP: "x ~ x!2 ~@2 x ~ x ~@3 x!5 ~@2 x!2 ~ x!2", AQ: "~@2 x!10",
  AR: "x ~ x ~ x ~ x ~ x ~ x!3 ~ x ~@3 x ~ x ~@3", AS: "~@4 x ~ x ~ x ~ x ~ x!3 ~ x!3 ~ x ~ x ~",
  AT: "~@2 x ~@3 x ~ x ~ x ~ x!3 ~ x!3 ~@3 x ~", AU: "x ~@3 x ~ x ~@3 x ~ x ~ x!3 ~ x!6",
  AV: "~@6 x ~ x ~ x ~ x ~@2 x!2 ~ x ~ x ~ x ~", AW: "~ x!7", AX: "x ~@3 x!2 ~@2 x ~ x!2 ~ x!2 ~@3 x ~ x ~ x ~",
  AY: "x",
})).gain(0.16)

// drums · ride · soft notes
const ride_soft = s("rd").struct(`<
  ~@4 A@2 B ~ C D E F G H I J ~ K L M N O M ~ P Q ~ R S B T H U ~ V ~@3 A W ~@2 T ~ L X Y ~ Z U F AA ~ AB ~
>`.pickRestart({
  A: "~ x!2 ~@9", B: "~@5 x ~@6", C: "~@5 x ~ x!2 ~@3", D: "~@4 x!2 ~ x!2 ~@3", E: "~@2 x ~@4 x ~@4",
  F: "~ x ~@2 x ~@7", G: "~ x ~@2 x!2 ~ x!2 ~ x ~", H: "~ x ~@10", I: "~@7 x ~@3 x", J: "~@10 x ~@3 x ~@4 x ~@4",
  K: "~ x!2 ~@3 x!2 ~@4", L: "~ x ~@8 x ~", M: "~@7 x ~@4", N: "~ x!2 ~ x!2 ~ x ~@4", O: "~@2 x ~@2 x ~@2 x ~@3",
  P: "~@4 x ~@2 x ~@2 x ~", Q: "~ x ~@2 x ~@2 x ~@2 x ~", R: "~@4 x!2 ~@6", S: "~ x!2 ~ x ~@2 x ~@2 x ~",
  T: "~ x!2 ~@3", U: "~ x ~@3 x", V: "~ x!2 ~@4 x ~@4", W: "~@5 x ~@2", X: "~@10 x ~@10 x ~@2", Y: "~@5 x ~ x",
  Z: "~ x ~@6", AA: "~ x ~@4", AB: "~@7 x ~@8 x ~@7",
})).gain(0.05)

// drums · splash
const splash = s("cr").struct(`<
  ~@8 A ~ A ~ A ~ A ~@3 A ~@3 A ~@3 B A@2 ~@3 A ~ A ~ A ~ A ~ A C A ~ A ~ A D A@2 ~ A@2 ~@2
>`.pickRestart({
  A: "x", B: "~ x ~@22", C: "~ x", D: "~@11 x",
})).gain(0.22)

stack(
  french_horn, bass, bass_soft, synth_strings_1, muted_trumpet, brass_section, kick, kick_soft, snare, clap, open_hat,
  ride, ride_soft, splash
)

More by Ellington