Strudelify

Don't Cry

Loesser

KeyE♭ majorTempo52 bpm
0:00/0:00
// Don't Cry — Loesser
// 52 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 3/4 at bar 16, 4/4 at bar 16, 3/4 at bar 22, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 30 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(52/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.

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<A@2 B@6 C@2 D E F G@2 H I@3 J@2 ~@7 K@2>".pickRestart({
  A: "bb4/2", B: "[ab4@64 g4@31 ~]/6", C: "[g4@10 gb4@10 f4@11 bb4@13 g4@9 gb4@11]/2", D: "f4@11 e4@10 eb4@11",
  E: "d4@5 g4@2 ab4@3 g4@22", F: "~@12 b4@11 b4@6 ~@3", G: "[~@5 b4@5 ~@4 b4@3 ~@2 a5@2 c6@25 ~@18]/2",
  H: "~ g4@5 gb4@5 f4@5", I: "[bb4@10 g4@10 gb4@10 f4@11 e4@10 eb4@10 d4@5 g4@3 ab4@2 g4@20 ~@5]/3",
  J: "[~@16 a4@7 ~@8 a4@3 ~@5 a4@3 ~@2 g5@2 bb5@18]/2", K: "[~@26 [eb4,g4]@2 [f4,ab4]@2 [g4,bb4]@7 ~@27]/2",
})).s("gm_string_ensemble_1").gain(0.24)

// bass · pizzicato strings · "PIZZICATO"
const bass = note("<~@21 A B C D E F G H ~>".pickRestart({
  A: "~@11 g2 ~@8 bb2 ~@3 c3 ~@7", B: "~@12 f2 ~@7 eb2 ~@6 d2 ~@4",
  C: "~@3 bb1 ~@8 eb2 ~@3 eb2 ~@2 eb2 ~@3 eb2 ~@3 eb2 ~@3 eb2", D: "~@2 db2 ~@9 [c2,c3] ~@19",
  E: "~@15 ab1 ~@6 a1 ~@7 bb1 ~", F: "~@5 db2 ~@7 e2 ~@6 eb2 ~@6 d2 ~@4", G: "~@3 db2 ~@6 c2 ~@7 b1 ~@2 d2 ~@3 eb2 ~@6",
  H: "~@12 f2 ~@2 e2 ~@7 eb2 ~@8",
})).s("gm_pizzicato_strings").gain(0.36)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1_2 = note("<A@2 B@6 C@4 D E ~ F G@5 H@2 I@2 ~ J@4>".pickRestart({
  A: "[f4,ab4]/2", B: "[g4@32 ~@32 db4@48 bb3@16 db4@63 ~, eb4@65 ~@47 e4@78 ~@2, ~@32 f4@81 ~@79]/6",
  C: "[[c4,eb4]@21 [db4,f4]@9 ~ bb4@12 g4@11 gb4@10 ~@11 e4@10 eb4@11 d4@5 [b3,f4]@5 eb4@10 d4@12, ~@30 e4@13 c4@27 bb3@15 ab3@17 ~@4 bb3@22, ~@64 f4@11 ~@53]/4", // Cm Db Bdim
  D: "~ eb4@11 d4@12 b4@4 [d5,f5] ~@3", E: "~@5 b4@4 [d5,f5] ~@4 b4@2 [d5,f5] ~@2 [d5,f5]@2 [g4,c5] ~@10",
  F: "~ [c4,eb4]@10 [db4,f4]@5", // Cm Db
  G: "[[e4,bb4]@10 g4@10 gb4@11 ~@10 e4@10 eb4@10 d4@5 [b3,f4]@5 eb4@10 d4@11 eb4@10 d4@10 a4@5 [c5,eb5] ~@9 a4@2 ~ [c5,eb5] ~@4 a4@2 [c5,eb5] ~@2 [c5,eb5]@2 [f4,bb4] ~@17, ~@10 c4@26 bb3@15 ab3@16 ~@4 bb3@21 ~@68, ~@31 f4@11 ~@118]/5", // Edim Bdim Cm Bb5
  H: "[~@7 f4@17 ~@5 c4@15 ~@4 db4@2 eb4@2 c4@7 ~@3 f4@2, ~@7 db4@22 ~@35, ~@6 e4@5 ~@5]/2",
  I: "[~ g4@2 d4@9 ~@4 g4@7 gb4@8 f4@11 ~@2 [e4,bb4,eb5] ~@19]/2", // Eb
  J: "[~@13 c5@14 c5@2 bb4@2 ~@7 e4@4 ~@4 eb4@3 d4@4 g4@2 f4@2 eb4@7 d4@8 ~@7 [bb3,d4]@8 [ab3,c4]@3 [g3,bb3]@2 [f3,ab3]@2 [eb3,g3]@4 ~@30, ~@31 bb4@11 ab4@11 b3@4 g4@15 ~@3 [c4,eb4]@4 ~@49, ~@76 ab3@11 ~@41]/4", // Bb Ab Gm Fm Eb Cm
})).s("gm_string_ensemble_1").gain(0.3)

// other · flute
const flute = note("<~@8 A@2 B C ~@3 D E@3 ~@3 F@4 G@4>".pickRestart({
  A: "[g4@11 gb4@10 f4@10 bb4@9 ~@4 g4@10 gb4@10]/2", B: "~ f4@10 e4@10 eb4@10 ~", C: "d4@5 g4@3 ab4@2 g4@22",
  D: "~ g4@5 gb4@5 f4@5", E: "[~ bb4@8 ~@2 g4@10 gb4@10 f4@10 e4@10 eb4@10 d4@5 g4@3 ab4@2 g4@20 ~@5]/3",
  F: "[~@16 db5@2 eb5@2 c5@7 ~@4 f5@2 g5@2 d5@9 ~@4 [eb5,g5]@7 [d5,gb5]@7 [db5,f5]@4 f4@7 ~@2 eb5@17 ~ [c5,db5] [ab4,bb4] [f4,g4] ~@19 g5@4 gb5@7 ~@2, ~@95 eb4@16 ~@17]/4", // Eb D Db Dbmaj7 Absus2 Fsus2
  G: "[~ f5@4 e5@7 ~@4 [g4,c5]@2 ~@6 [gb4,c5]@2 ~ c5@2 bb4 ~ [f4,bb4,f5]@4 ~@3 [e4,bb4]@3 ~@5 [eb4,eb5]@3 ~ d5@7 ~@4 eb5@4 [d4,d5]@7 ~@4 eb4@3 d4@6 ~@7 f4@2 g4@7 ~@27, ~@16 g5@4 gb5@7 ~@8 e5@7 ~@4 ab4@11 g4@15 ~@56, ~@49 d4@4 ~@4 eb4@8 ~@26 eb4@2 ~@35]/4", // C5 Gbdim Bb5 Edim Eb D
})).s("gm_flute").gain(0.3)

// other · clarinet
const clarinet = note("<~@8 A@4 ~@3 B C@2 D ~@11>".pickRestart({
  A: "[eb4@21 f4@10 e4@13 c4@26 bb3@16 ab3@15 b3@5 bb3@22]/4", B: "~ eb4@10 f4@5", C: "[e4@11 c4@25 bb3@15 ab3@13]/2",
  D: "~@2 b3@5 ~ bb3@21 ~@3",
})).s("gm_clarinet").gain(0.3).pan(0.6)

// other · oboe
const oboe = note("<A@2 B@2 C@2 D@2 ~@13 E@5 F@2 G ~>".pickRestart({
  A: "[eb5@2 c5@4 eb5 g5]/2", B: "[eb5@16 c5@43 ~@5]/2", C: "[c5@4 ab4@7 ~ c5@2 e5@2]/2", D: "[c5@31 ~]/2",
  E: "[~@7 f5@8 ~ g5@8 ab5@10 g5@9 ~@5 db6@2 eb6@2 c6@7 ~@4 f5@2 g5@2 d5@9 ~@4 g5@7 gb5@7 ~ f5@10 ~@3 eb5@35 ~@3 g5@4 gb5@7 ~@3]/5",
  F: "[~ f5@4 e5@7 ~@4 g5@4 gb5@7 ~@4 f5@4 e5@7 ~@4 eb5@4 d5@7 ~@4 eb5@3]/2", G: "~ d5@7 ~@24",
})).s("gm_oboe").gain(0.3)

// other · french horn · "FR.HORN"
const french_horn = note("<~@13 A@2 ~@5 B@2 C@3 ~ D@2 E@2>".pickRestart({
  A: "[~@21 c5@35 ~@8]/2", B: "[~@14 bb4@21 ~@4 f4@8 ~ g4@8 ab4@8]/2",
  C: "[~@2 g4@10 ~@4 [f4,ab4]@3 ~ [f4,ab4]@7 ~@4 c5@3 [f4,ab4]@10 ~@3 g4@8 gb4@7 ~ f4@2 ~ [bb3,f4]@8 ~ bb4@2 ~@19, ~@31 ab4@2 ~@42 e4 ~@20]/3", // Fm Bb5
  D: "[~@13 c5@16 bb4@13 ab4@11 g4@2 f4@2 eb4@7]/2",
  E: "[~ d4@7 ~@4 c4@3 bb3@8 c4@4 ~ ab3@2 ~ g3@7 ~@26, ~@27 bb3@2 ~@35]/2",
})).s("gm_french_horn").gain(0.3).pan(0.3)

// chords · trumpet · Eb
const trumpet = note("<~@24 [~@12 [e4,bb4,eb5] ~@19] ~@5>").s("gm_trumpet").gain(0.32).pan(0.7)

// chords · orchestral harp · "HARP"
const orchestral_harp = note("<~@6 A@2 ~@8 B C D ~@11>".pickRestart({
  A: "[~@10 g5@2 ~@15 [g6,c7]@22 ~@15, ~@4 db4@8 [e5,g5]@5 g4 db5 [e5,g5] bb5@2 db5 e5 g5 bb5 [db6,e6]@23 ~@15, ~@5 e4@8 db5@2 db4@34 ~@15, ~@7 [g4,bb4]@9 e4@33 ~@15, ~@8 db5 e5 bb5@8 bb4@31 ~@15]/2", // C5 Em Dbm Gm
  B: "~@15 [g4,c5] g5 ~@7 gb4 [a4,c5] gb5 ~@5", C: "~@3 [f4,bb4] f5 ~@8 [e4,g4] [bb4,e5] ~@8 eb4 [ab4,eb5] ~@7",
  D: "~@2 [f4,b4] f5 ~@28", // Fdim
})).s("gm_orchestral_harp").gain(0.3).pan(0.4)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<A@8 B@4 C D ~ E F@5 G@4 H@2 ~@3>".pickRestart({
  A: "[eb4@64 c4@97 db4@15 ~@16 [db3,g3]@63 ~, ab3@8 ~@168 bb3@79 ~]/8", // Dbdim
  B: "[eb3@20 f3@11 gb3@12 g3@10 ~ a3@16 g3@15 f3@16 b3@5 bb3@22]/4",
  C: "[c4,eb4]@12 [b3,d4]@11 ~ [eb4,gb4]@4 [d4,f4]@2 ~@2, ab3@23 ~@9", // Cm Bm Ebm Dm
  D: "~@5 [eb4,gb4]@4 [d4,f4] ~@4 [eb4,gb4]@2 [d4,f4] ~@2 [a3,f4]@2 [e3,g3,c4] ~@10, ~@9 d4 ~@6", E: "~ eb3@10 f3@5",
  F: "[gb3@10 g3@10 a3@16 g3@15 f3@15 b3@5 bb3@20 ~ [c4,eb4]@10 [b3,d4]@10 [db4,e4]@5 [c4,eb4]@2 ~@8 [db4,e4]@3 [c4,eb4] ~@4 [db4,e4]@2 [c4,eb4] ~@2 [g3,eb4]@2 [d3,f3,bb3] ~@17, ~@92 ab3@20 ~@27 c4@3 ~@18]/5", // Cm Bm Dbm Cm Dbm Cm Dbm Cm …
  G: "[~@8 g3@16 e3@20 [f3,ab3]@15 [ab3,c4]@16 g4@11 ~ gb4@7 ~@4 ab3@7 ~@23, ~@7 bb3@37 ~@31 bb3@23 ~@30, ~@94 f4@11 ~@23]/4", // Fm Ab
  H: "[~@15 g4@7 gb4@8 [f3,db4,f4]@7 [g3,bb3,e4]@7 c4@12 ~@8, ~@15 [ab3,c4]@15 ~@34]/2", // Db Edim Ab
})).s("gm_string_ensemble_2").gain(0.3).pan(0.4)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1_3 = note("<A@6 B@2 C@2 D E F G ~ H I@3 J@2 K@3 L M@5>".pickRestart({
  A: "[ab3@8 g3@4 ab3@4 bb3@8 c4@16 g3@3 ab3@4 ~ bb3@8 c4@15 bb3@4 ab3@4 g3@8 ~ f3@16 bb3@4 ab3@4 g3@8 f3@16 g3@4 ab3@4 bb3@3 c4@5 f3@15 ~ f3@4 g3@4 ab3@4 bb3@4 e3@8]/6",
  B: "[a2@31 ~]/2", C: "[ab2@10 a2@10 bb2@11 db3@13 e3@10 eb3@10]/2", D: "~ d3@10 [db2,db3]@10 [c2,c3]@11, d2@11 ~@21",
  E: "[b1,b2]@5 [d2,d3]@5 [eb2,eb3]@22", F: "~@24 [b2,gb3]@4 [bb2,f3]@3 ~",
  G: "~@5 [b2,gb3]@4 [bb2,f3]@2 ~@3 [b2,gb3]@2 [bb2,f3] ~@2 [bb2,f3]@2 [a2,e3] ~@10", H: "~ ab2@5 a2@5 bb2@5",
  I: "[db3@10 e3@10 eb3@10 ~ [d2,d3]@10 [db2,db3]@10 [c2,c3]@10 [b1,b2]@5 [d2,d3]@5 [eb2,eb3]@20 ~@5]/3", // D Db C B D Eb
  J: "[~@16 [a2,e3]@5 [ab2,eb3]@3 ~@7 [a2,e3]@3 [ab2,eb3]@2 ~@3 [a2,e3]@2 [ab2,eb3] ~@2 [ab2,eb3]@2 [g2,d3] ~@17]/2", // A5 Ab5 A5 Ab5 A5 Ab5 G5
  K: "[~@24 c3@20 f2@8 eb2@7 d2@7 bb1@8 ~@2 bb3 ~@3 bb3 ~@2 bb3 ~@3 bb3 ~@3 bb3 ~@2 bb3 ~, ~@19 eb3@5]/3",
  L: "~@2 [db3,ab3]@8 ~@2 bb3 ~@19", // Db5
  M: "[~@15 ab2@7 a2@7 ~ bb2@7 db3@7 ~ e2@7 eb2@7 d2@8 db2@7 c2@7 ~ b2@3 d3@4 eb3@15 ~@4 f2@3 e2@8 eb2@15 ~@26]/5",
})).s("gm_string_ensemble_1").gain(0.36)

// chords · tremolo strings · "TREMOLOSTR"
const tremolo_strings = note("<A@6 B@2 ~@4 C D@3 ~@3 E@3 ~@8>".pickRestart({
  A: "[ab3@8 g3@4 ab3@4 bb3@7 c4@16 g3@4 ab3@4 bb3@8 c4@17 bb3@4 ab3@4 g3@8 f3@16 bb3@3 ab3@4 ~ g3@8 f3@16 g3@3 ab3@4 ~ bb3@4 c4@4 f3@14 ~ f3@4 g3@4 ab3@4 ~ bb3@4 e3@8]/6",
  B: "[a2@63 ~]/2", C: "~@6 f2@6 e2@11 ~@3 c5 d5 [bb1,f3]@2 ~@2, ~@23 [b1,gb3,b4]@5 a5 ~@3",
  D: "[~@5 b4@2 c5 ~ [d5,a5] [bb1,f3] ~@4 c5 [bb1,f3,d5,a5] ~@3 [bb5,b5] [c5,c6]@50 [bb4,bb5]@2 ~@23, ~@5 [b1,gb3]@5 ~@4 [b1,gb3,b4]@2 ~@2 a5@2 ~@76, ~@19 [bb1,f3]@2 [a1,e3] ~@74]/3", // D5 Bb5 Bbmaj7 Bmaj7 C Bb B5 Bb5 …
  E: "[~ f2@5 e2@10 ~@3 bb4 ~ [ab1,eb3]@3 ~@7 [a1,e3,a4]@2 [bb4,c5] [ab1,eb3,g5] ~@5 bb4 [ab1,eb3,c5,g5] ~@3 ab5 [g1,d3,a5] ~@49, ~@16 [a1,e3,a4]@5 [c5,g5] ~@16 a4@2 ~@3 g5@2 ~ bb5@30 ~@20, ~@39 [a1,e3]@3 ~@2 [ab1,eb3]@2 bb4@25 ~@25]/3", // Ab5 A5 Bbsus2 Abmaj7 Gsus2 A5 C5 A5 …
})).s("gm_tremolo_strings").gain(0.3)

// chords · tremolo strings · "TREMOLOSTR" · soft notes
const tremolo_strings_soft = note(`<
  ~@12
  [~@27 db5 ~@4]
  [~@8 db5 ~@7 db5 ~@15]
  ~@5
  [~@20 b4 ~@11]
  [~ b4 ~@6 b4 ~@23]
  ~@9
>`).s("gm_tremolo_strings").gain(0.18)

// drums · low tom
const low_tom = s("lt").struct("<~@20 [~@7 x ~@8] ~@9>").gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct("<~@13 [~@21 x ~@10] ~@16>").gain(0.48)

stack(
  string_ensemble_1, bass, string_ensemble_1_2, flute, clarinet, oboe, french_horn, trumpet, orchestral_harp,
  string_ensemble_2, string_ensemble_1_3, tremolo_strings, tremolo_strings_soft, low_tom, mid_tom
)

More by Loesser