Strudelify
Milk And Toast And Honey cover art

Milk And Toast And Honey

Roxette

KeyE♭ majorTempo71 bpm
0:00/0:00
// Milk And Toast And Honey — Roxette
// 71 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 72 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(71/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 · piano
const piano = note("<~ A B C D A B C D ~@21 A B C D ~@15 E F A B C G ~@17>".pickRestart({
  A: "db5 f5 ab5 f5 c5 f5 ab5 f5", B: "bb4 db5 f5 db5 ab4 db5 f5 db5", C: "gb4 bb4 db5 gb5 db5 bb4 db5 gb5",
  D: "db4 f4 ab4@2 ab3 c4 eb4 ab4", E: "ab4@4 f4@2 bb4@4 f4 ~ f4 g4 ab4@2", F: "g4@2 ~@2 bb3@2 c4@5 ~@5",
  G: "db4 f4 ab4@2 ab3 c4 ~@2",
})).s("gm_piano").gain(0.4).pan(0.7)

// other · piano
const piano_2 = note("<~ A B C D A B C D ~@42 A B C D ~@17>".pickRestart({
  A: "eb6 f6 ~@2 f6 ~ db6@2 eb6 f6 ~@2 f6@2 db6 ~", B: "eb6 f6 ~@2 f6@2 db6 ~ eb6 f6 ~@2 f6 ab6@2 ~",
  C: "db6@7 ~@5 bb5 ab5 ~@2", D: "ab5@6 f5 gb5 ab5@5 ~@3",
})).s("gm_piano").gain(0.4).pan(0.3)

// bass · acoustic bass
const bass = note(`<
  ~@5 A B C D A B C D A B C D E F G H ~ I J K L A B C D A B C D E F G H ~ M N O P M N O P Q O R O A B C S M N O P M N O
  P M N O P M N O P T
>`.pickRestart({
  A: "db2@6 ~@2 c2 ~ c2@5 ~", B: "bb1@6 ~ bb1 ab1 ~ ab1@4 ~@2", C: "gb1@6 ~ gb1!2 ~ gb1@5 ~",
  D: "db2@7 ~ ab1 ~ ab1@5 ~", E: "eb2@8 db2 ~ db2@5 ~", F: "ab1@9 ~ ab1@5 ~", G: "eb2@7 ~ db2 ~ db2@5 ~", H: "ab1@7 ~",
  I: "db2@8 gb1 ~ gb1@6", J: "bb1@8 ab1 ~ ab1@3 ~ ab1@2", K: "db2@8 gb1 ~ gb1@5 ~", L: "bb1@6 ~@2 ab1 ~ ab1@5 bb1",
  M: "eb2@8 ab1 ~ ab1@6", N: "c2@8 bb1 ~ bb1@3 ~ bb1@2", O: "eb2@8 ab1 ~ ab1@5 ~", P: "c2@6 ~@2 bb1 ~ bb1@5 c2",
  Q: "f1@6 ~ f1 bb1 ~ bb1@5 ~", R: "f1@7 f1 bb1 ~ bb1@5 ~", S: "db2@7 ~ ab1 ~ ab1@2 ~@4", T: "eb1 ~@3",
})).s("gm_acoustic_bass").gain(0.64).pan(0.6)

// other · pad new age
const pad_new_age = note(`<
  ~@5
  [eb5 f5 ~@2 f5 ~ db5@2 eb5 f5 ~@2 f5@2 db5 ~]
  [eb5 f5 ~@2 f5@2 db5 ~ eb5 f5 ~@2 f5 ab5@2 ~]
  [db5@7 ~@5 bb4 ab4 ~@2]
  [ab4@6 f4 gb4 ab4@5 ~@3]
  ~@63
>`).s("gm_pad_new_age").gain(0.25).pan(0.4)

// other · string ensemble 2
const string_ensemble_2 = note(`<
  ~@5 A B C D ~@9 E F G ~ H I J I K I L@2 M@2 N@2 ~ E F O@2 P Q R Q P Q R Q S T U V A B C W P Q R Q P Q R Q P Q R Q P Q
  R Q ~
>`.pickRestart({
  A: "eb6 f6@2 ~ f6@2 db6@2 eb6 f6@2 ~ f6@2 db6@2", B: "eb6 f6@2 ~ f6@2 db6@2 eb6 f6@2 ~ f6 ab6@3",
  C: "db6@12 bb5 ab5@2 ~", D: "ab5@6 f5 gb5 ab5@8", E: "~@6 bb3@2 db4@4 bb3@3 ~", F: "gb4 db4", G: "ab3",
  H: "f4@9 gb4@6 ~", I: "bb3 ab3", J: "f4@9 gb4@7", K: "db4 c4", L: "[gb3@15 db3@7 f3 gb3 ab3@3 gb3@5]/2",
  M: "[f3@8 eb3@7 db3@9 c3@8]/2", N: "[bb2@4 db3@3 gb3@4 bb3@4 ab3@7 f3 gb3 ab3@6 ~@2]/2", O: "[ab3@9 ~@7]/2",
  P: "g4@9 ab4@6 ~", Q: "c4 bb3", R: "g4@9 ab4@7", S: "ab4@3 f4@3 bb4@4 f4 ~ f4 g4 ab4@2", T: "g4@3 ~ bb3@2 c4@7 ~@3",
  U: "ab4@2 ~ f4@3 bb4@3 ~ f4 ~ f4 g4 ab4@2",
  V: "g4@3 ~ bb3@2 c4@6 ~@3 [d4,d5], ~@6 [ab3,ab4] [c4,c5], ~@13 [bb3,bb4]@2 ~", W: "ab5@6 f5 gb5 ab5@4 ~@4",
})).s("gm_string_ensemble_2").gain(0.22).pan(0.7)

// chords · pad warm
const pad_warm = note(`<
  ~@5 A B C D A B C D A B C E F G H I ~ J@4 A B C D A B C E F G H I ~ K@6 L@2 M N M N A B C O K@16 P
>`.pickRestart({
  A: "db5 c5, [ab4,f5]", B: "bb4 ab4, [f4,db5]", C: "[gb4,bb4,db5]", D: "[ab4,db5,f5] [ab4,c5,eb5]",
  E: "~@6 f3 gb3 [ab3,c5,eb5]@8, ab4, [db5,f5] ~", F: "[bb4,eb5] [bb4,db5], gb4",
  G: "~@3 bb3 db4@2 bb3@2, [eb4,ab4,c5]", H: "eb5 db5, [gb4,bb4]", I: "[eb4,ab4,c5]",
  J: "[[ab4,f5] gb5 f5 [ab4,c5,eb5], db5@3 ~, ~ bb4@2 ~, ~@8 ab5@3 ~@5]/2", // Db Ab
  K: "[[bb4,g5] ab5 g5 [bb4,d5,f5], eb5@3 ~, ~ c5@2 ~, ~@8 bb5@3 ~@5]/2", // Eb Bb
  L: "[[bb4,g5] ab5 [g5,bb5] [bb4,d5,f5], eb5@3 ~, ~ c5@2 ~]/2", M: "[ab4,c5] [bb4,d5], f5",
  N: "[g4,bb4] [ab4,c5], eb5", O: "[ab4,db5,f5]@2 [ab4,c5,eb5] ~", P: "[g4,bb4,eb5] ~",
})).s("gm_pad_warm").gain(0.22).pan(0.4)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@16 A B@2 C D ~ E F G H I J K L M N O P B@2 C Q@2 R S T U R S T U V W X Y Z AA AB AC R S T U R S T U AD AE AF AG AD
  AE AF AH AI
>`.pickRestart({
  A: "~@6 f3 gb3 ab3@4 ~@4", B: "[bb5@8 ab5@23 ~]/2", C: "bb5 ab5", D: "eb5", E: "db6@9 ~@3 ab4@4, db5@3 ~, ~@9 gb5@7",
  F: "f6@9 ~@2 ab4@5, bb4@3 ~, ~@9 eb6@6 ~", G: "db6@9 gb5@2 ~ [ab4,gb5]@4, db5@3 ~",
  H: "~@9 eb6@2 ~ eb6@3 ~, [bb4,f6]@11 ab4@5", I: "ab5", J: "f5", K: "gb5", L: "~@6 f3 gb3 [ab3,ab5]@4 c6@4, f5 ~",
  M: "db6 eb6", N: "f6 ab6", O: "gb6 f6 eb6 db6", P: "~@6 f3 gb3 c6@8, ab5@2 ab3 ~", Q: "[eb5@9 ~@7]/2",
  R: "eb6@9 ~@3 bb4@4, eb5@3 ~, ~@9 ab5@7", S: "g6@9 ~@2 bb4@5, c5@3 ~, ~@9 f6@6 ~",
  T: "eb6@9 ab5@2 ~ [bb4,ab5]@4, eb5@3 ~", U: "~@9 f6@2 ~ f6@3 ~, [c5,g6]@11 bb4@5",
  V: "f3@4 c3@2 bb2@4 d3 ~ d3 eb3 f3@2, ab5@3 bb5@5", W: "eb3@2 bb2 c5@5, g5@3 ab2@3 ~@2",
  X: "f3@3 ~ c3@2 bb2@4 d3 ~ [d3,f5] [eb3,g5] [f3,ab5]@2, ab5@3 bb5@3 ~@2", // Dm Eb Fm
  Y: "[eb3,g5]@4 [bb2,eb5]@2 [ab2,c5]@6 [ab3,a3,ab4,a4] [bb3,b3,bb4,b4] [c4,db4,c5,db5] [d4,d5]", Z: "f4 ab4",
  AA: "bb4 ab4", AB: "gb4@3 ~ gb4@2 f4@2 gb4@2 f4@2 eb4@2 db4@2", AC: "f4@2 eb4 ~", AD: "eb5@3 eb5 f5@2 [bb4,ab5]@2",
  AE: "g5@6 eb5@2 f5@3 ~ g5@2 ab5@2, c5@11 bb4@5", AF: "bb5@5 ~ bb5 ~ bb5@4 [bb4,c6]@4, eb5@3 ~",
  AG: "bb5@5 ~ g5 ~ g5@3 ~ f5@4, c5@11 bb4@5", AH: "bb5@6 g5 ~ g5@3 ~ f5@3 ~, c5@11 bb4@5", AI: "eb5 ~",
})).s("gm_string_ensemble_1").gain(0.15).pan(0.3)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~@22 A B A B ~@13 C D C D C D C D ~@8 C D C D C D C D C D C D C D C D ~
>`.pickRestart({
  A: "[db3,f3,ab3,db4,f4] [db3,f3,ab3,db4,f4]@2 [db3,f3,ab3,db4,f4] [db3,f3,ab3,db4,f4]@2 [db3,f3,ab3,db4,f4] [db3,gb3,bb3,db4,gb4]@2 [db3,gb3,bb3,db4,gb4] [db3,gb3,bb3,db4,gb4]@2 [db3,gb3,bb3,db4,gb4]@2 [db3,gb3,bb3,db4,gb4]@2", // Db Gb
  B: "[bb2,f3,bb3,db4,ab4] [bb2,f3,bb3,db4,ab4]@2 [bb2,f3,bb3,db4,ab4] [bb2,f3,bb3,db4,ab4]@2 [bb2,f3,bb3,db4,ab4] [eb3,ab3,c4,eb4,ab4]@2 [eb3,ab3,c4,eb4,ab4] [eb3,ab3,c4,eb4,ab4]@2 [eb3,ab3,c4,eb4,ab4]@2 [eb3,ab3,c4,eb4,ab4]@2", // Bbm7 Ab
  C: "[eb3,g3,bb3,eb4,g4] [eb3,g3,bb3,eb4,g4]@2 [eb3,g3,bb3,eb4,g4] [eb3,g3,bb3,eb4,g4]@2 [eb3,g3,bb3,eb4,g4] [eb3,ab3,c4,eb4,ab4]@2 [eb3,ab3,c4,eb4,ab4] [eb3,ab3,c4,eb4,ab4]@2 [eb3,ab3,c4,eb4,ab4]@2 [eb3,ab3,c4,eb4,ab4]@2", // Eb Ab
  D: "[c3,g3,c4,eb4,bb4] [c3,g3,c4,eb4,bb4]@2 [c3,g3,c4,eb4,bb4] [c3,g3,c4,eb4,bb4]@2 [c3,g3,c4,eb4,bb4] [f3,bb3,d4,f4,bb4]@2 [f3,bb3,d4,f4,bb4] [f3,bb3,d4,f4,bb4]@2 [f3,bb3,d4,f4,bb4]@2 [f3,bb3,d4,f4,bb4]@2", // Cm7 Bb
})).s("gm_acoustic_guitar_steel").gain(0.27).pan(0.3)

// other · ocarina
const ocarina = note("<~@34 A B C ~@10 D E D E ~@21>".pickRestart({
  A: "~@8 eb6!2 bb5!2 ab5 ~@3", B: "eb6!2 bb5!2 ab5 ~@3 eb6!2 bb5!2 ab5 ~@3",
  C: "ab5!2 db6!2 eb6 ~@3 eb6!2 bb5!2 ab5 ~@3", D: "ab5 f5!4 ~ ab5!2 bb5!3 ~@5", E: "g5 eb5!4 ~ c5!2 eb5 ab5!2 ~@5",
})).s("gm_ocarina").gain(0.12)

// chords · electric guitar clean
const electric_guitar_clean = note("<~@63 A B A B A B A C@2>".pickRestart({
  A: "eb3!2 ~@2 g3!2 bb2 ~ ab2!2 ~@6, ~@7 bb2@2 ~@7", B: "eb3!2 f3 ~ f3!4 bb2 bb2@2 ~@5, ~@3 f3@2 ~@11",
  C: "[eb3!2 f3 ~ f3!4 bb2 bb2@2 ~@5 [bb2,eb3,g3,bb3,eb4]@4 ~@12, ~@3 f3@2 ~@10 eb2@4 ~@13]/2", // Eb
})).s("gm_electric_guitar_clean").gain(0.27).pan(0.7)

// chords · electric guitar clean · soft notes
const electric_guitar_clean_2 = note("<A ~@62 B@8 ~>".pickRestart({
  A: "g6 ~@3", B: "[~@2 eb3 eb3@3 g3 ~ bb2!2 ab2 ab2@7 eb3 eb3@2 ~@3 f3 ~ bb2 bb2@4 ~, ~@7 g3@2 ~@16 f3@2 ~@5]/2",
})).s("gm_electric_guitar_clean").gain(0.04).pan(0.7)

// drums · kick
const kick = s("bd").struct(`<
  ~ A@11 B A@3 B A@3 C ~ A@3 B A@3 B A@3 B A@3 C ~ A@3 B A@3 B A@3 B A@3 D A@3 B A@3 B A@3 B A@3 B C
>`.pickRestart({
  A: "x ~@6 x!2 ~ x ~@5", B: "x ~@6 x!2 ~ x ~@2 x ~@2", C: "x", D: "x ~@6 x!2 ~ x ~ x ~@3",
})).gain(0.48)

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

// drums · clap
const clap = s("cp").struct("<~@5 A@15 ~@2 A@15 ~@2 A@8 B@4 A@20 ~>".pickRestart({
  A: "~ x ~@2", B: "~@4 x ~@10 x",
})).gain(0.48)

// drums · low tom
const low_tom = s("lt").struct("<~@12 A ~@3 A ~@8 A ~@3 A ~@3 A ~@8 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~>".pickRestart({
  A: "~@7 x",
})).gain(0.42)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A@4 B C A@3 C A C A C A C A C A ~@2 B C A C B C A C A C A C B C A ~@2 B C A C B C A C D A@2 C B C A E B C A C B C A
  C B C A C B C A C ~
>`.pickRestart({
  A: "x!16", B: "~@2 x!14", C: "x!15 ~", D: "~@2 x!13 ~", E: "x!12 ~@4",
})).gain(0.3)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A ~ B ~ C ~ B ~ B ~ B ~ B ~ B ~@4 B ~ B ~ B ~ B ~ B ~ B ~ B ~@4 B ~ B ~ B ~ B@2 ~@2 B ~ B ~ D ~ B ~ B ~ B ~ B ~ B
  ~ B ~ B ~ B ~
>`.pickRestart({
  A: "~@12 x!2 ~@2", B: "~@15 x", C: "~@13 x ~@2", D: "~@9 x ~@6",
})).gain(0.42)

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

// drums · ride
const ride = s("rd").struct("<~@20 x ~@16 x ~@16 [~@3 x] ~@17>").gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct("<~@5 A@15 ~@2 A@15 ~@2 A@15 ~ A@16 ~>".pickRestart({
  A: "~@3 x",
})).gain(0.48)

stack(
  piano, piano_2, bass, pad_new_age, string_ensemble_2, pad_warm, string_ensemble_1, acoustic_guitar_steel, ocarina,
  electric_guitar_clean, electric_guitar_clean_2, kick, snare, clap, low_tom, hihat, open_hat, crash, ride, tambourine
)

More by Roxette