Strudelify
I'm Sorry cover art

1994 · Crash! Boom! Bang!

I'm Sorry

Roxette

KeyG minorTempo97 bpm
0:00/0:00
// I'm Sorry — Roxette
// 97 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 58 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(97/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 · "HONKY TONK"
const piano = note("<A@3 B@7 ~@23 C@7 ~@18>".pickRestart({
  A: "[[a4,e5]@2 a4 ~@16 f4@5, d4@3 f5@8 a4@4 f4 g4@8, ~@2 e5@7 a4 d3@14, ~@2 a3@2 d5@3 a4 c5@16, ~@3 d4@4 d4@2 d5@15]/3", // A5
  B: "[~@2 d4 d4@3 ~@9 a4 a4 ~@12 d4@3 ~@8 g2@16, ~@2 g4@9 f3@5 a3 d5@9 bb3@8 g4@5 bb2@16 ~, ~@3 f4@4 f4@5 [a3,d5] d4 d3@2 c5@9 a4 g4 f4@8 ~@2 d4@16 ~@3, ~@6 d4@2 d3@2 d4 f5@8 a4 d4 d3 g4 f4 [bb2,g4] f3@2 d3@5 g4 a4@5 d3@16 ~@2, ~@8 [d4,e5] a3 e5@7 [d4,a4] d3 a3@16 [bb3,f4]@16 ~@5]/7", // D5 Eb Dsus2 D5 Bb5
  C: "[~@39 f4@16 ~, ~@15 d3@5 d4@2 d3@2 d5@4 d3@4 c5@10 f4@2 [d4,g4]@2 f4@2 g4@2 [f3,a4]@2 [bb3,g4]@2 f4@10 g4@2 [bb2,a4]@32 ~@14, ~@15 d4@5 a4@4 a3@2 d4@4 a4@2 a3@2 d5@22 bb2@2 d4@14 bb3@32 ~@8, ~@8 [a4,e5]@2 e5@7 d4 d3@12 f3 bb3@3 [f3,g4]@16 ~@6, ~@9 a3@2 f5@8 a4 a3@15 f4@3 d4@16 ~@2]/7", // G5 F Eb Bbmaj7 A5 Fsus2
})).s("gm_piano").gain(0.48)

// chords · piano · "HONKY TONK" · soft notes
const piano_soft = note("<A@6 B@4 ~@26 C ~@21>".pickRestart({
  A: "[~@12 a3@12 ~@4 g4@4 ~@10 d4@5 ~@11 bb3@32 ~@6, d3@5 d3@5 ~@2 a3@12 [d4,g4] a4@14 ~@9, ~ f3@15 bb3 a4@7 f3@4 f3@7 ~@13, ~@6 a4@8 ~@12 f4@4 ~@2 bb2@4 bb3@11 bb2@32 ~@17, ~@14 d4@3 f3@7 bb3@5 ~@19]/6", // G5
  B: "[~@5 f3@8 ~@3, ~@15 bb2@15 ~@34, ~@8 d4@5 ~@19, ~@9 d3@5 ~@18]/4", C: "bb2 ~",
})).s("gm_piano").gain(0.32)

// bass · slap bass 2 · "SLAPBASS 2"
const bass = note(`<
  ~@8 A B C D E F G C E@2 B H I J@2 K@2 L M N O P Q R S T ~@5 U I J@2 V@2 H I J@2 V@2 H I J@2 W@2 ~
>`.pickRestart({
  A: "~@7 g1 ~@2 g1@5 ~", B: "g1@6 ~ g1 ~@2 g1@6", C: "d2@6 ~ d2 ~@2 d2@5 ~", D: "d2@6 ~ d2",
  E: "bb1@6 ~ bb1 ~@2 bb1@3 ~ bb1 ~", F: "bb1@6 ~ bb1 ~@2 bb1@3 ~ bb1@2", G: "d2@6 ~ d2 ~@2 d2@3 ~ d2 ~",
  H: "f2@3 ~ f2@2 c2@3 ~ c2@2 ~@2 c2 a1, g1 ~@15", I: "g1@6 ~ g1 ~@2 g1@5 ~",
  J: "[f1@4 f2@2 c2@5 ~ c2 ~ c2 g1@7 ~ g1 ~@2 g1@4 ~ g1]/2", K: "[f2@3 ~ f2@2 ~ c2 ~@2 c2 ~ c2@15 ~ c2@3 ~]/2",
  L: "f2@6 f1@7 ~@3", M: "~@4 f1 ~@2 f1 ~@2 f1 ~@3 eb2 f2, f2@7 ~", N: "ab2@3 ~ ab2@2 eb2 ~@3 eb2@2 ~@2 eb2!2",
  O: "f2@4 f1 ~@2 f1 ~@2 f1@2 ~@2 eb2 f2", P: "ab2@2 ~@2 ab2@2 eb2 ~@3 eb2 ~ eb2@2 f2 eb2", Q: "f2@12 ~@2 c2 f2",
  R: "ab2 ~@15", S: "~@7 f1 ~@2 f1@3 ~ eb2 f2, f2@7 ~", T: "ab2@2 ~@2 ab2@2 eb2 ~@3 eb2 ~@3 eb2@2",
  U: "f2@3 ~ f2@2 c2@3 ~ c2@2 ~@2 c2 a1", V: "[f2@3 ~ f2@2 ~ c2 ~@2 c2 ~@5 g1@6 ~ g1 ~@2 g1@6, ~@12 c2@15 ~@5]/2",
  W: "[f2@3 ~ f2@2 ~ c2 ~@2 c2 ~ c2@15 ~@5]/2",
})).s("gm_slap_bass_2").gain(0.8)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note("<A@2 B@2 C@2 D@2 E@2 ~@48>".pickRestart({
  A: "[[d4,a4,e5]@3 ~ e5@2 f5@2 ~@6 a4@2 c5@2 ~@8 f4@2 [d4,g4]@2 f4@2, d3@4 d5@4 ~ [a4,d5]@2 a4@2 ~@3, ~@4 a3@5 ~ d3@7 ~@3 d3@10 ~@2, ~@4 a4 ~ d4@6 a3@6 ~@6 a3@6 ~@2, ~@7 d4@4 ~@5]/2", // Dsus2 G5 D5
  B: "[[bb3,g4]@2 a4@2 ~@6 d4@5 ~@5 d4@2 ~@8 f4@2, bb2@15 ~@5 g4@6 bb3@6, ~ f3@2 f4@8 [d4,f4]@3 d4@2, ~@4 bb3@11 ~@3 a4@8 ~@6]/2", // Eb Dm
  C: "[e5@3 f5 d5@3 a4 c5 d5@2 a4@2 f4 g4 f4, d3]/2", D: "g4 a4 g4 f4@2 d4@3", E: "[[g2,g3]@31 ~]/2",
})).s("gm_synth_strings_1").gain(0.3)

// chords · synth strings 1 · "SYN STR 1" · soft notes
const synth_strings_1_soft = note("<A ~ B@2 ~@54>".pickRestart({
  A: "~@6 a4@7 ~@3, ~@2 f3@7 ~@7", B: "[~@16 [d4,g4]@4 ~@4 f3@7 ~, ~@15 bb2@17, ~@8 bb3@5 ~@3, ~@2 f3 ~]/2",
})).s("gm_synth_strings_1").gain(0.18)

// other · pad poly · "POLYSYNTH"
const pad_poly = note("<~@2 A@2 ~@4 B@2 ~@48>".pickRestart({
  A: "[~ [bb1,bb3]@3]/2", B: "[g1@31 ~]/2",
})).s("gm_pad_poly").gain(0.01)

// chords · pad warm · "WARM PAD"
const pad_warm = note("<~@8 A@2 B@2 C@2 D@2 E@2 ~@40>".pickRestart({
  A: "[~@4 g1@11 ~]/2", B: "[[d4,e4] d4, a3]/2", C: "[~ f4@3, [f3,bb3], e4 ~@3, ~ bb2@15]/2",
  D: "[e4 d4, [d3,a3], d4@7 ~@9]/2", E: "[e4@8 [bb2,f4]@23 ~, [f3,bb3]@31 ~]/2",
})).s("gm_pad_warm").gain(0.32)

// chords · synth brass 2 · "SYNBRASS 2"
const synth_brass_2 = note(`<
  ~@10 A B C D E F G H I J K J I L M N ~ O ~ P Q ~ R@2 ~@4 I J I J I L I J I J I L I J I J I L ~@2
>`.pickRestart({
  A: "[a3,e4] ~@3 e4@2 f4@2 [a3,d4] ~@3 [a3,d4] ~@3, ~@4 a3 ~ a3 ~@9", // A5 D5
  B: "[a3,c4] ~@3 [a3,c4] ~@3 [a3,c4] ~@3 c4@4, ~@6 e3 ~", // Am
  C: "[bb3,d4,g4] ~@3 [d4,g4]@4 [bb3,f4] ~@3 [bb3,d4,f4] ~@3, ~@2 bb3 ~@5", // Gm G5 Bb5 Bb
  D: "[bb3,d4,g4] ~@3 [bb3,d4,g4] ~@3 [bb3,d4,f4] ~@3 [bb3,d4,f4]@3 ~", // Gm Bb
  E: "[d4,a4,e5] ~ d4 ~ e5@2 [d4,f5] ~ [d4,a4,d5] ~@3 [a4,d5]@2 d4 ~, ~ a4 ~@2, ~@4 d4 ~@7 d4 ~@3", // Dsus2 Dm D5
  F: "[c4,a4,c5] ~ c4 ~ [c4,a4,c5] ~ c4 ~ [c4,a4,c5] ~@3 [e4,a4,c5]@4", // F Am
  G: "[bb3,d4,g4] ~ bb3 ~ [bb3,d4] ~ bb3 ~ [bb3,d4,f4] ~@3 [d4,f4]@2 bb3 ~, ~@4 g4@2 ~@6 bb3 ~@3", // Gm Bb Dm
  H: "[bb3,d4,g4] ~ bb3 ~ [d4,g4]@2 bb3 ~ [bb3,d4,f4] ~ bb3 ~ [bb3,d4,f4]@3 ~, ~@4 bb3 ~@11", I: "[d4,g4,bb4]",
  J: "[f4,a4]@3 [e4,g4]@5, c4", K: "[d4,bb4]", L: "[f4,a4]@6 [e4,g4]@9 ~, c4@15 ~", M: "[c4,eb4,g4]",
  N: "[bb3,d4]@3 [a3,c4]@5, f4@15 ~", O: "[ab4,c5]@4 [g3,bb3]@3 ~, eb4, ~ g4, ~@8 ab4 ~@7",
  P: "[ab4,c5] [g3,bb3,g4], eb4", Q: "f3@15 ~",
  R: "[[f3,c4]@15 ~ [ab4,c5]@8 [g3,g4,bb4]@8, ab3@23 ~ [b3,ab4] ~@7, ~ [eb3,eb4]]/2", // F5 Ab Gm E Eb
})).s("gm_synth_brass_2").gain(0.32)

// chords · synth brass 2 · "SYNBRASS 2" · soft notes
const synth_brass_2_soft = note("<~@11 A ~@2 B ~ C ~@3 D ~@5 E F G@2 H ~@2 I ~@24>".pickRestart({
  A: "~@12 a3@3 ~", B: "~@10 d4 ~@5", C: "~@10 bb3 ~@5", D: "g4", E: "[f3,ab3,c4]@15 ~", F: "ab3@7 ~ bb4@8, eb3@7 ~",
  G: "[[f3,c4]@15 ~@2 c4@6 ~ bb4@8, ab3@23 ~@9, ~@17 eb3@14 ~]/2", H: "[ab3,c4]@15 ~", I: "c4@7 ~@5 bb3@3 ~",
})).s("gm_synth_brass_2").gain(0.16)

// chords · pad new age · "FANTASIA"
const pad_new_age = note(`<
  ~@18 A ~ B ~ C ~ D E F ~ G H I ~ J K ~@4 A ~ B ~ C ~ A ~ B ~ C ~ A ~ B ~ C ~@3
>`.pickRestart({
  A: "~ g4 [d4,d5] g4 c5 g4 d5 g4, g3@15 ~, ~@2 c4 d4", B: "~ g4 d5 g4 c5 g4 d5 g4, g3, ~ d4 c4 d4",
  C: "~@2 g4@2 d5@2 g4 ~ c5@2 g4@2 d5@2 g4 ~, g3@15 ~, ~ d4 c4 d4",
  D: "[c4,eb4,g4]@2 ~@2 [c4,eb4,g4]@2 ~@2 [c4,eb4,g4] ~@3 [c4,eb4,g4]@4", // Cm
  E: "[bb3,d4,f4] ~@3 [bb3,d4,f4]@3 ~ [a3,c4]@2 ~@2 [a3,c4,f4]@3 ~, ~@8 f4 ~@7", // Bb Am F
  F: "~@2 [c4,c5] [bb3,bb4]@2 [eb4,eb5]@3, f4, ~ f3@7", G: "~@4 [c4,c5]@2 [bb3,bb4]@4 [eb4,eb5]@5 ~, f4, ~@2 f3@13 ~",
  H: "[eb4,ab4,c5]@4 bb4 bb4@3, ~ g4, ~@4 eb4@3 ~", I: "~@2 c5 bb4@2 eb5@3, f3, ~ f4@7",
  J: "~@2 [c4,c5] [bb3,bb4]@2 eb5@3, f4, ~ f3@6 ~, ~@5 eb4@2 ~", // C Bb
  K: "[eb4,ab4,c5]@3 ~ [eb4,ab4,c5]@3 ~ [eb4,g4,bb4]@4 [eb4,g4,bb4]@3 ~", // Ab Eb
})).s("gm_pad_new_age").gain(0.64)

// chords · percussive organ · "ORGAN 2"
const percussive_organ = note("<~@19 A@2 B@2 C D E ~@13 A@2 B@2 C ~ A@2 B@2 C ~ A@2 B@2 C ~@2>".pickRestart({
  A: "[[f5,a5]@3 e5@5 [d5,bb5]@8, c5 ~, ~@3 g5@13]/2", B: "[[f5,a5]@6 e5@9 ~ [d5,bb5]@16, c5@15 ~@17, g5 ~@5 g5@26]/2",
  C: "f5@3 [e5,g5]@5, c5@15 ~", D: "[c5,eb5,g5]@9 ~ [c5,eb5,g5] ~@2 [c5,eb5,g5]@3", E: "[bb4,d5,f5]@5 ~ [a4,c5,f5]@10",
})).s("gm_percussive_organ").gain(0.32)

// chords · percussive organ · "ORGAN 2" · soft notes
const percussive_organ_soft = note("<~@19 A ~@3 B ~@15 A ~@3 B ~ A ~@3 B ~ A ~@3 B ~@2>".pickRestart({
  A: "g5 ~@15", B: "a5@3 ~@5",
})).s("gm_percussive_organ").gain(0.16)

// bass · overdriven guitar · "OVERDRIVE"
const bass_2 = note("<~@18 A B C D C E@2 F G H I J K L G H ~@5 B C D C M@2 B C D C M@2 B C D C E@2 ~>".pickRestart({
  A: "g1@15 ~", B: "~ f1@2 c2@5", C: "g1", D: "f2 ~ f2@4 c2@10", E: "[f1@3 c2@13]/2", F: "~@2 c2 ~@2 c2 ~ f2@8 ~",
  G: "f2, ab2 ~@15", H: "ab2@6 eb2@9 ~", I: "f2", J: "ab2@8 eb2@7 ~", K: "f2 ~@3 f2@3 ~ f2@8", L: "ab2 ~@15",
  M: "[f1@6 ~@10 g1@15 ~, ~@3 c2@13]/2",
})).s("gm_overdriven_guitar").gain(0.72)

// chords · lead 7 fifths · "5THSAWWAVE"
const lead_7_fifths = note("<~@8 A@2 ~@48>".pickRestart({
  A: "[~@3 a2 ~@12 g4@15 ~, g3@31 ~, ~@8 g2@23 ~]/2",
})).s("gm_lead_7_fifths").gain(0.36)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@4 A ~@2 B A C ~ B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@3 A ~@4 D ~ B A ~@2 B ~ B A ~@2 B ~ B A ~@2 B ~@2
>`.pickRestart({
  A: "x", B: "~@15 x", C: "~@10 x ~@2 x!2 ~", D: "~@8 x ~@2 x ~@2 x ~",
})).gain(0.35)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@4 A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 D A B E F@2 G B C A B@2 C B C A B@2 C B C A B@2 C ~@2
>`.pickRestart({
  A: "x ~ x ~ x ~ x!2 ~ x!2 ~ x ~@2 x", B: "x ~ x ~ x ~ x!2 ~ x!2 ~ x ~ x ~", C: "x ~ x ~ x ~ x!2 ~ x ~@2 x ~@2 x",
  D: "x!3 ~ x ~ x!3 ~ x ~ x ~ x ~", E: "x!2 ~ x!3 ~ x!4 ~ x!2 ~ x", F: "x!2 ~ x!3 ~ x!3 ~ x!3 ~ x",
  G: "x!2 ~ x!3 ~ x!3 ~ x!4 ~",
})).gain(0.45)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@7 A ~ B ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~@9 C ~ A ~@3 A ~ A ~@3 A ~ A ~@3 A ~@2
>`.pickRestart({
  A: "~@15 x", B: "~@4 x ~@2 x!2 ~@2 x ~@4", C: "~@2 x ~@2 x ~@2 x!3 ~ x ~@3",
})).gain(0.35)

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

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@7 A ~ B ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~@9 C ~ A ~@3 A ~ A ~@3 A ~ A ~@3 A ~@2
>`.pickRestart({
  A: "~@7 x", B: "~@2 x ~@2 x ~@10", C: "~@2 x!2 ~ x ~@2",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct(`<
  ~@3 A B ~@3 B ~ B ~ B ~@3 B ~ B C B D E ~ B F ~@2 B ~@3 B ~@4 G B C B D E ~ B C B D E ~ B C B D E ~@3
>`.pickRestart({
  A: "~@15 x", B: "x", C: "~@14 x!2", D: "~@6 x ~@3 x ~ x ~ x!2", E: "~ x ~@2", F: "~@10 x ~@2 x ~@2", G: "~@7 x",
})).gain(0.5)

// drums · ride bell
const ride_bell = s("rd").struct(`<
  ~@4 A ~@3 A ~@3 A ~@3 A ~ B C@2 D E F C G ~@2 A ~@3 A ~@5 B C@2 D E F B C@2 D E F B C@2 D E F ~@2
>`.pickRestart({
  A: "x", B: "~ x!3", C: "x!4", D: "x!2 ~@2", E: "~@2 x!2", F: "x ~ x ~ x ~ x!2", G: "x!3 ~",
})).gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<~@4 A@6 B C@6 D C@13 ~ C@2 ~@4 C@18 ~@2>".pickRestart({
  A: "x ~ x!3 ~ x!2", B: "x ~@2 x ~@3 x", C: "~@3 x ~@3 x", D: "~@6 x ~ x ~@2 x!2 ~ x ~",
})).gain(0.4)

// drums · cowbell
const cowbell = s("cb").struct("<~@4 [~@3 x ~@3 x]!27 ~ [~@3 x ~@3 x]!2 ~@4 [~@3 x ~@3 x]!18 ~@2>").gain(0.4)

// drums · bongos
const bongos = s("bongo:18").struct("<~@3 [~@12 x!3 ~] ~@54>").gain(1.17)

// drums · congas
// … 33 more lines

More by Roxette