Strudelify
Roses Are Red cover art

1997 · Aquarium

Roses Are Red

Aqua

KeyC minorTempo140 bpm
0:00/0:00
// Roses Are Red — Aqua
// 140 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 15 "Solo2" lead 4 chiff (copy of ch 5 "Solo1" lead 1 square); ch 9 "Guitar right" acoustic guitar steel (copy of ch 8 "Guitar left" acoustic guitar steel)
// note: Full arrangement: all 129 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(140/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 · piano
const piano = note(`<
  ~ A B C D A E F G ~@24 H I H I H I J ~ H I H I H I H I ~@16 H I H I H I J ~ H I H I H I H I H I H I H I ~@18 H I H I H
  I H I H I H I H I H I ~@8
>`.pickRestart({
  A: "g5 c5 eb5 g5 f5 c5 g5 c5, c3", B: "ab5 c5 eb5 ab5 f5 bb4 d5 f5, ab2 bb2", C: "eb5 g4 c5 eb5 d5 g4 eb5 g4, c3",
  D: "eb5 ab4 c5 eb5 f5 bb4 d5 f5, ab2 bb2", E: "ab5 c5 eb5 ab5 f5 bb4 d5 ~, ab2 bb2", F: "[c3,c5,eb5,g5]",
  G: "[ab2,c5,eb5,ab5] [bb2,bb4,d5,f5]", // Ab Bb
  H: "~@2 [eb4,g4] ~@2 [c4,eb4,g4] ~@2 [c4,eb4,ab4] ~@2 [c4,eb4,ab4] ~@2 [c4,eb4,ab4] ~, ~ c4 ~@6", // Eb Cm Ab
  I: "~@2 [eb4,g4] ~@2 [bb3,eb4,g4] ~@2 [bb3,d4,f4] ~@2 [bb3,d4,f4] ~@2 [bb3,d4,f4] ~, ~ bb3 ~@6", // Eb Bb
  J: "~@2 [eb4,ab4] ~@2 [c4,eb4,ab4] ~@2 [c4,f4,ab4] ~@2 [c4,f4,ab4] ~@2 [c4,f4,ab4] ~, ~ c4 ~@6", // Ab5 Ab Fm
})).s("gm_piano").gain(0.26).pan(0.2)

// chords · synth strings 2 · "High left"
const synth_strings_2 = note("<A@2 B C B C B C B D@7 ~@5 E@2 F@2 ~@16 G@8 ~@4 E@2 H@2 ~@72>".pickRestart({
  A: "[[c4,eb4,g4,c5] [c4,eb4,g4,c5], g3]/2", B: "[ab3,c4,eb4,ab4] [bb3,d4,f4,bb4]", C: "[g3,c4,eb4,g4,c5]", D: "c6/7",
  E: "[~@2 ab3 [bb3,d4,d5], [c4,eb4,g4,eb5]@3 ~]/2", F: "[[eb4,g4,c5]@2 [eb4,g4,c5] ~, c4@15 ~]/2", G: "c6/4",
  H: "[[eb4,g4,c5]@3 ~, c4@15 ~]/2", // Cm
})).s("gm_synth_strings_2").gain(0.26).pan(0.3)

// chords · synth strings 2 · "High left" · soft notes
const synth_strings_2_soft = note("<~@25 A@8 ~@24 A@8 ~@8 B@12 C@2 ~@2 A@6 D@2 ~@8 B@16 ~@8>".pickRestart({
  A: "[[c4,eb4]@3 [bb3,d4]]/2", B: "c6/4", C: "c6/2", D: "[c4@2 c4 [bb3,d4], eb4@3 ~]/2",
})).s("gm_synth_strings_2").gain(0.15).pan(0.3)

// bass · synth bass 1 · "Bass"
const bass = note(`<
  ~@9 A B A B A B A ~ A B A B A B A B A B A B A B A B C D C D C D E ~ C D C D C D C D A B A B A B A B A B A B A B A B C
  D C D C D E ~ C D C D C D C D C D C D C D ~@10 A B A B A B A B C D C D C D C D C D C D C D C D ~@8
>`.pickRestart({
  A: "c2 ~ c2!3 ~ c2!3 ~ c2!3 ~ c2!2", B: "ab1 ~ ab1!3 ~ ab1!2 bb1 ~ bb1!3 ~ bb1!2",
  C: "c2 ~ c2!3 ~ c2!2 ab1 ~ ab1!3 ~ ab1!2", D: "eb2 ~ eb2!3 ~ eb2!2 bb1 ~ bb1!3 ~ bb1!2",
  E: "ab1 ~ ab1!3 ~ ab1!2 f2 ~ f2!3 ~ f2!2",
})).s("gm_synth_bass_1").gain(0.48)

// other · pad choir · "Back"
const pad_choir = note("<~@33 A B A B A B A C ~@24 A B A B A B A C ~@56>".pickRestart({
  A: "c4", B: "bb3", C: "[b3,d4,g4]",
})).s("gm_pad_choir").gain(0.11).pan(0.8)

// chords · acoustic guitar steel · "René"
const acoustic_guitar_steel = note(`<
  ~@17 A B A B A B A B ~@24 A B A B A B A B ~@23 C@4 D@3 ~@10 A B A B A B A B ~@7 C@4 D@3 ~@10
>`.pickRestart({
  A: "~@2 [c4,eb4,g4] ~@3 [c4,eb4,g4] ~@3 [c4,eb4,g4] ~@3 [c4,eb4,g4] ~", // Cm
  B: "~@2 [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~@3 [bb3,d4,f4] ~@3 [bb3,c4,f4] ~", // Ab Bb Bbsus2
  C: "[~@7 c2@2 c2 ~@5 c2@2 c2 ~@5 c2@2 c2 ~@6]/4", D: "[~@7 c2@2 c2 ~@5 c2@2 c2 ~@6]/3",
})).s("gm_acoustic_guitar_steel").gain(0.33).pan(0.7)

// chords · acoustic guitar steel · "Guitar left"
const acoustic_guitar_steel_2 = note("<~@25 A B A B A B A B ~@24 A B A B A B A B ~@64>".pickRestart({
  A: "~@2 [c4,eb4] ~@2 [c4,eb4] ~@2 [c4,eb4] ~@2 [c4,eb4] ~@2 [c4,eb4] ~", // Cm
  B: "~@2 [c4,eb4] ~@2 [c4,eb4] ~@2 [bb3,d4] ~@2 [bb3,d4] ~@2 [bb3,d4] ~", // Cm Bb
})).s("gm_acoustic_guitar_steel").gain(0.33).pan(0.8)

// chords · synth strings 2 · "High right"
const synth_strings_2_2 = note(`<
  A@2 B C B C B C B D@7 ~@5 E@2 F@2 ~@16 G@8 ~@4 E@2 H@2 ~@64 I@2 J@2 K ~@3
>`.pickRestart({
  A: "[[c4,eb4,g4,c5] [c4,eb4,g4,c5], g3]/2", B: "[ab3,c4,eb4,ab4] [bb3,d4,f4,bb4]", C: "[g3,c4,eb4,g4,c5]", D: "c6/7",
  E: "[~@2 ab3 [bb3,d4,d5], [c4,eb4,g4,eb5]@3 ~]/2", F: "[[eb4,g4,c5]@2 [eb4,g4,c5] ~, c4@15 ~]/2", G: "c6/4",
  H: "[[eb4,g4,c5]@3 ~, c4@15 ~]/2", I: "[[g3,c4,eb4,g4,c5]@20 ~ eb4@3 [ab3,c4,eb4,ab4]@8, ~@20 [g3,c4,g4,c5]@3 ~@9]/2",
  J: "[[bb3,d4,f4,bb4]@8 ~ [g3,c4,eb4,g4,c5]@15 [ab3,c4,eb4,ab4]@8]/2", K: "[bb3,d4,f4,bb4] ~",
})).s("gm_synth_strings_2").gain(0.29).pan(0.8)

// chords · synth strings 2 · "High right" · soft notes
const synth_strings_2_soft_2 = note("<~@25 A@8 ~@24 A@8 ~@8 B@12 C@2 ~@2 A@6 D@2 ~@8 B@16 ~@8>".pickRestart({
  A: "[[c4,eb4]@3 [bb3,d4]]/2", B: "c6/4", C: "c6/2", D: "[c4@2 c4 [bb3,d4], eb4@3 ~]/2",
})).s("gm_synth_strings_2").gain(0.2).pan(0.8)

// other · lead 2 sawtooth · "Lead2"
const lead_2_sawtooth = note("<~@16 A ~@15 B@2 C D E F G H I ~@23 B@2 C D E F J H I ~@56>".pickRestart({
  A: "~@2 g3 ~ bb3@2 g3 ~ eb3@3 ~ c3@2 ~@2", B: "[~@7 g3@2 g3 ~ ab3 ~ ab3!3]/2", C: "~ g3 ~ f3 ~ f3!3", D: "g3!4 ab3!4",
  E: "~ g3 bb3!2 ~ bb3!2 ~", F: "~ g3!3 ab3 ~ ab3!2", G: "g3 ~ g3!2 f3!3 ~", H: "~ ab3!7", I: "g3@2 g3@2 g3!3 ~",
  J: "g3 ~ g3!2 f3!4",
})).s("gm_lead_2_sawtooth").gain(0.51)

// drums · kick
const kick = s("bd").struct("<~@16 A B@7 ~ B@15 ~ B@15 ~ B@15 ~ B@14 A ~ A ~@7 B@7 ~ B@15 C ~@8>".pickRestart({
  A: "x", B: "x!4", C: "x ~@3 x ~@3 x!3 ~ x ~ x ~",
})).gain(0.76)

// drums · snare
const snare = s("sd").struct(`<
  ~@9 A@7 ~ B@7 A B@7 C B@7 A B@15 A B@7 C B@7 A B@7 C B@8 ~@5 A@3 B@7 A B@7 C B@7 A ~@8
>`.pickRestart({
  A: "x!16", B: "~ x ~ x", C: "~@4 x ~ x ~ x!2 ~ x!2 ~ x!2",
})).gain(0.46)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@90 [x!16]!4 ~@35>").gain(0.23)

// drums · clap
const clap = s("cp").struct("<~@89 [~ x ~ x]!8 ~@32>").gain(0.38)

// drums · hihat
const hihat = s("hh").struct("<~@17 [x!16]!23 ~ [x!16]!31 ~ [x!16]!48 ~@8>").gain(0.61)

// drums · crash
const crash = s("cr").struct(`<
  ~@17 A ~@3 A ~@7 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3
  A ~@3 A ~@3 A ~@3 A ~@3 A ~@7
>`.pickRestart({
  A: "x",
})).gain(0.53)

// drums · ride
const ride = s("rd").struct("<~@17 A@23 ~ A@7 B A@23 ~ A@16 ~@8 A@24 ~@8>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2",
})).gain(0.61)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@33 x ~@95>").gain(7.17)

stack(
  piano, synth_strings_2, synth_strings_2_soft, bass, pad_choir, acoustic_guitar_steel, acoustic_guitar_steel_2,
  synth_strings_2_2, synth_strings_2_soft_2, lead_2_sawtooth, kick, snare, snare_soft, clap, hihat, crash, ride,
  vibraslap
)

More by Aqua