Strudelify

Maggie

Fay Lovsky

KeyA♭ majorTempo100 bpm
0:00/0:00
// Maggie — Fay Lovsky
// 100 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 93 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/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 · flute
const flute = note(`<
  A B C@2 D@6 E F G@2 H I@2 J K@2 L@2 M N@2 O E F P Q R S@2 T U@2 V W X@3 T Y F Z@2 AA@3 AB AC@2 AD@5 AE@2 AF AG@2 AH
  AI@2 ~@7 AJ AK AL@2 AM@2 AN AO@5 AP Q AQ@4 AR@3
>`.pickRestart({
  A: "~@12 eb5@3 ~", B: "eb5@7 c5", C: "[bb4@2 ab4@9 bb4@2 ab4@2 ab4@16 ~]/2",
  D: "[~@2 ab4 ~@9 f4@3 eb4@9 ab4@3 c5@3 eb5@12 eb5@2 ~ c5@2 bb4@26 ~@2 eb5@3 ~ eb5@12 ~ c5 ~ bb4 ~, f4@11 ~@85]/6",
  E: "ab4@11 bb4@2 ab4@2 ~", F: "ab4", G: "[f4@2 ~ ab4@8 ~ ab4@3 eb4@9 ab4@6 c5@2]/2", H: "eb5@6 bb4 c5",
  I: "[~ ab4@22 ~@5 ab4@4]/2", J: "f5@6 f5 eb5", K: "[db5@8 eb5@3 ~ f5@2 ~ eb5@17]/2",
  L: "[c5@2 ~ eb5@8 ~ c5@3 bb4@15 eb5@2]/2", M: "d5@11 g5@2 f5@2 ~", N: "[eb5@13 ~ eb5@2]/2", O: "~ eb5@11 c5 ~ bb4 ~",
  P: "~@2 ab4 ~@9 ab4 ~ f4@2, f4@11 ~@5", Q: "eb4@8 ab4@3 ~ c5@4", R: "eb5@4 bb4@3 c5", S: "[ab4@19 ~@9 eb5@3 ~]/2",
  T: "eb5@6 c5 bb4", U: "[ab4@11 bb4@2 ab4@2 ab4@16 ~]/2", V: "~@2 ab4 ~@9 f4@4, f4@11 ~@5", W: "eb4@8 ab4@3 ~ c5@3 ~",
  X: "[eb5@8 ~ eb5@2 c5@3 bb4@28 eb5@5 ~]/3", Y: "ab4@10 bb4@2 ~ ab4@2 ~", Z: "[f4@3 ab4@9 ab4@3 eb4@9 ab4@3 ~ c5@4]/2",
  AA: "[eb5@8 bb4@4 c5@2 ~ ab4@26 ~@3 ab4@4]/3", AB: "[db5,f5]@11 ~ [db5,f5]@2 c5@2, ~@14 eb5 ~",
  AC: "[[bb4,db5]@8 [c5,eb5]@3 [db5,f5]@4 [ab4,c5,eb5]@17]/2", // Bbm Cm Db Ab
  AD: "[c5@2 eb5@9 ~ c5@3 bb4@13 eb5@3 d5@11 g5@3 f5@2 eb5@28 ~ eb5@3 ~]/5",
  AE: "[eb5@10 c5@2 ~ bb4@2 ab4@12 ~ bb4 ~ ab4@2]/2", AF: "ab4@15 ~",
  AG: "[~@2 ab4 ~@8 f4@4 eb4@8 ~ ab4@3 ~ c5@4, f4@11 ~@21]/2", AH: "eb5@8 bb4@5 ~ c5@2", AI: "[ab4@13 ~@3]/2",
  AJ: "~@13 ab4@3", AK: "f5@11 ~ f5@2 eb5@2", AL: "[db5@8 eb5@3 ~ f5@2 eb5@17 ~]/2",
  AM: "[~@2 eb5 ~@9 c5@3 bb4@15 eb5@2, c5@11 ~@21]/2", AN: "d5@13 g5 ~ f5",
  AO: "[eb5@27 ~ eb5@14 c5@3 bb4@2 ab4@11 bb4@2 ~ ab4@2 ab4@16 ~]/5", AP: "~@2 ab4 ~@9 ab4@2 f4@2, f4@11 ~@5",
  AQ: "[eb5@8 bb4@4 c5@2 ab4@29 ~ ab4@3 eb4@8 ~ ab4@3 c5@3 ~@2]/4", AR: "[~@8 bb4@5 c5@2 ab4@24 ~@9, eb5@5 ~@7]/3",
})).s("gm_flute").gain(0.48)

// bass · acoustic bass
const bass = note(`<
  ~ A B C D A E F G H I J K E L H M N O P Q R S T U V M J K E W P X A B C D A E F G H I J K E L H M N O P Q R S T U V M
  J K E W P X Y Z H AA AB AC H AD N O P Q R S T U V M J K E W AE AF AG T AH AI
>`.pickRestart({
  A: "ab2@7 ~ eb2@7 ~", B: "ab2@7 ~ bb2@3 ~ c3@4", C: "db3@8 ab2@7 ~", D: "db3@7 ~ ab2@7 ~", E: "ab2@8 c3@7 ~",
  F: "eb3@8 bb2@7 ~", G: "eb2@8 f2@3 ~ g2@3 ~", H: "ab2 eb2", I: "ab2@8 bb2@3 ~ c3@4", J: "db3 ab2",
  K: "db3@7 ~ ab2@3 ~ db3@3 ~", L: "~@8 eb2 ~@7, eb3@15 ~", M: "ab2@7 ~ bb2@3 ~ c3@3 ~", N: "db3@7 ~ ab2@8",
  O: "db3@8 ab2@3 ~ db3@4", P: "ab2@7 ~ eb2@8", Q: "ab2@2 eb2 ab2", R: "eb3@7 ~ bb2@7 ~", S: "bb2@7 ~ bb2@7 ~",
  T: "eb3@7 ~ eb2@8", U: "eb3@7 ~ eb2@7 ~", V: "ab2@8 eb2@7 ~", W: "eb3@7 ~ eb3@7 ~", X: "db2@8 eb2@3 ~ eb2@2 ~@2",
  Y: "db3@7 ~ db3@7 ~", Z: "db3@2 ab2 f2", AA: "ab2@7 ~ c3@4 c3@3 ~", AB: "ab2@7 ~ eb2@4 ab2@4",
  AC: "eb2@8 g2@4 bb2@3 ~", AD: "db3@3 ~ ab2@4 eb3@4 eb2@4", AE: "f3@7 ~ eb3@7 ~", AF: "d3@8 db3@7 ~", AG: "c3 eb2",
  AH: "ab2", AI: "ab1@3 ~",
})).s("gm_acoustic_bass").gain(0.57)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~ A@6 B@2 C D E@2 F G H@2 I@2 J@2 K L M@2 F D E@2 F G F N A@6 B@2 C D E@2 F G H@2 I@2 J@2 K L M@2 F D E@2 F G F O P@4
  Q@2 R S I@2 J@2 K L M@2 F D E@2 F G T U R V W@2
>`.pickRestart({
  A: "[~@8 gb4@7 ~ [db4,f4]@16 [c4,eb4]@16, ab3@31 ~, [c4,eb4] ~@2]/6", B: "[g3,bb3,db4]/2",
  C: "~@2 eb4@5 ~, c4, ab3@7 ~", D: "[ab3,c4,eb4,gb4]", E: "[ab3,db4,f4]/2", F: "[ab3,c4,eb4]", G: "[g3,bb3,db4]",
  H: "[ab3,c4,eb4]/2", I: "[f4,ab4,db5]/2", J: "[eb4,ab4,c5]/2", K: "[eb4,g4,bb4]", L: "[d4,f4,ab4]",
  M: "[~@16 db4@15 ~, [bb3,eb4,g4]]/2", N: "[ab3,db4,f4] [g3,bb3,db4]", O: "[ab3,db4,f4] [g3,bb3]",
  P: "[~@24 ab5 ~@3 f5@4 eb5@20 eb5@12, ab4, db5@31 ~ c5@32, f5@7 ~@9]/4", Q: "[ab4 [g4,bb4,db5], c5@9 ~@7]/2",
  R: "[eb4,ab4,c5]", S: "[f4,ab4,db5] [eb4,g4,bb4]", T: "[ab4,c5,f5] [ab4,c5,eb5]", U: "[f4,ab4,d5] [e4,ab4,db5]",
  V: "[g4,bb4,db5,eb5]", W: "[[ab4,c5,eb5,ab5]@3 ~]/2",
})).s("gm_synth_strings_1").gain(0.51).pan(0.9)

// other · string ensemble 1
const string_ensemble_1 = note("<~@64 A@2 B C D E F G ~@21>".pickRestart({
  A: "[~@8 db5@3 ~ eb5@3 f5@15 eb5@2]/2", B: "db5@7 ~ eb5@3 ~ f5@4", C: "eb5@15 ~",
  D: "~@2 eb5 ~@3 c5@2 ab4@5 f4@2 ~, c5@3 ~@5", E: "eb4@8 ab4@3 ~ c5@4", F: "eb5@8 bb4@5 c5@3", G: "ab4 ~@3",
})).s("gm_string_ensemble_1").gain(0.71).pan(0.7)

// drums · kick
const kick = s("bd").struct("<~ x!92>").gain(0.5)

// drums · rim
const rim = s("rim").struct("<~ [~ x ~ x]!91 ~>").gain(0.5)

// drums · snare
const snare = s("sd").struct("<~ [~ x]!91 ~>").gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<[x!3 ~] [x!8]!91 x>").gain(0.4)

stack(flute, bass, synth_strings_1, string_ensemble_1, kick, rim, snare, hihat)