Strudelify

Forgiven Not Forgotten

The Corrs

KeyD majorTempo90 bpm
0:00/0:00
// Forgiven Not Forgotten — The Corrs
// 90 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 97 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(90/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@20 B@4 A@64 C@4 ~@5>".pickRestart({
  A: "[a3@3 ~@3 e4@2 ~@3 c4@3 f#3@3 d4@3 ~@12 a3@3 ~@3 e4@2 ~@3 d4@3 f#3@3 ~@11 b3@3 b3, ~@3 a3@8 ~@3 c4@6 d4@14 ~@6 g3@3 g3@6 f#3@15, ~@8 g3@3 g3@6 f#3@13 ~@5 a3@8 ~@21, ~@9 e4@4 ~@28 e4@4 ~ d4@18]/4",
  B: "[a3@3 ~@3 e4@2 ~@3 c4@3 f#3@3 d4@3 ~@12 a3@3 ~@3 e4@2 ~@3 d4@3 f#3@3 a5 a6 g6 f#6 d6 a5 g5 f#5 d5 a4 g4 [b3,e4]@3 b3, ~@3 a3@8 ~@3 c4@6 d4@14 ~@6 g3@3 g3@6 f#3@15, ~@8 g3@3 g3@6 f#3@13 ~@5 a3@8 ~@21, ~@9 e4@4 ~@28 e4@4 ~ d4@18]/4", // E5
  C: "[a3@3 ~@3 e4@2 ~@3 c4@3 f#3@3 d4@3 ~@12 a3@3 ~@3 e4@2 ~@3 d4@3 f#3@3 f#3@14 b3, ~@3 a3@8 ~@3 c4@6 d4@14 ~@6 g3@3 g3@6 ~@15, ~@8 g3@3 g3@6 f#3@13 ~@5 a3@8 ~@21, ~@9 e4@4 ~@28 e4@4 ~ d4@18]/4",
})).s("gm_piano").gain(0.42).pan(0.4)

// chords · ocarina · "Synth"
const ocarina = note("<~@3 A B@2 C D B@2 C E ~@85>".pickRestart({
  A: "~ [a4,d5,f#5]", B: "[~ g5@15 f#5@16, ~ a4@31]/2", C: "[a4,g5]", D: "[a4,f#5]", E: "f#5",
})).s("gm_ocarina").gain(0.1).pan(0.4)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@4 A@2 B@2 A@2 C@2 A@2 D@2 A@2 E F A@2 D@2 A@2 G@5 H@7 I@6 J@8 K@7 L@5 M@8 ~@3 N O@8 P@8 ~@5
>`.pickRestart({
  A: "[a1@4 c2@3 d1@9]/2", B: "[e1@8 g1@6 d1@10 ~ a1 e2 ~@2 c2 b1@2]/2", C: "[e1@8 g1@6 d1@11 ~ e1 ~@2 g1 ~@2]/2",
  D: "[e1@4 g1@3 d1@8 ~]/2", E: "e1@4 g1@3 d1", F: "d1@9 ~ d2 ~@2 c2 b1@2",
  G: "[e1@4 g1@3 ~@9 a1@4 c2@3 ~@9 e1@4 g1@3 d1, ~@7 d1@16 d1@16 ~]/5",
  H: "[~@8 d2 a1 d1@3 ~@2 g1 a1@8 c2@6 ~@18 e1@8 g1@6 ~@18 a1@8 c2@6 d1@18, ~@7 d1@3 ~@3 d1@17 d1@32 d1@32 ~@18]/7",
  I: "[e1@4 g1@3 ~@7 d2@2 a1@4 c2@3 ~@9 e1@4 g1@3 d1@9, ~@7 d1@16 d1@16 ~@9]/6",
  J: "[~@8 c2@6 ~@18 e1@8 g1@6 ~@26 c2@6 ~@18 e1@8 g1@6 ~@9 e1 g1 a1@7, a1@57 ~@7 a1@57 ~@7, ~@7 d1@16 d1@16 d1@16 d1@9]/8",
  K: "[~@8 c2@6 ~@8 g1 a1@3 ~@6 e1@8 g1@6 ~@26 c2@6 ~@8 g1 a1@3 ~@6 e1@8 g1@6 d1@2, a1@23 ~@3 a1@31 ~@7 a1@23 ~@25, ~@7 d1@16 d1@16 d1@16 ~]/7",
  L: "[~@2 d1@2 d1@2 d1@2 d1@2 ~@2 g1 ~ g1 ~@9 c2@6 ~@18 e1@8 g1@6 d1@18, ~@5 d1@10 d1@16 ~@9, ~ a1@4]/5",
  M: "[~@4 c2@3 ~@9 e1@4 g1@3 d1@41, a1, ~@7 d1@16 ~@41]/8", N: "~@2 d2 ~ d2 ~ d2 ~ d2 ~ e2 ~ d2 c2 b1@2",
  O: "[~@8 c2@6 ~@18 e1@8 g1@6 ~@26 c2@6 ~@18 e1@8 g1@6 ~@10 d2 e2@6 c2, a1, ~@7 d1@16 d1@16 d1@16 d1@9]/8",
  P: "[~@8 c2@6 ~@18 e1@8 g1@6 ~@26 c2@6 ~@18 e1@8 g1@6 d1@4 ~@4 d1@2 d1@2 d1@5 ~, ~@7 d1@16 d1@16 d1@16 ~@9]/8",
})).s("gm_electric_bass_finger").gain(0.8).pan(0.3)

// bass · electric bass finger · "Bass" · soft notes
const bass_soft = note("<~@7 A ~@11 A ~@19 B ~@3 C ~@3 C ~@7 C ~ D@3 ~@31 E ~@5>".pickRestart({
  A: "~@12 d2 ~@3", B: "~@11 a1 ~@4", C: "~@9 a1@7", D: "[~@5 a1@19]/3", E: "~ d1!2 ~@5",
})).s("gm_electric_bass_finger").gain(0.48).pan(0.3)

// bass · slap bass 2 · "Bass"
const bass_2 = note("<~@51 A@5 ~@7 B ~@19 C ~@13>".pickRestart({
  A: "[~@10 c2 a1@63 ~@6]/5", B: "~@10 e2 ~ c2 ~@3", C: "~@10 g2 ~ a2 ~@3",
})).s("gm_slap_bass_2").gain(0.8).pan(0.3)

// chords · synth strings 2 · "String Pad"
const synth_strings_2 = note(`<
  ~@4 A@2 B@2 C@2 D@2 ~@16 E@8 ~@16 E@4 C@2 D@2 ~@14 F@2 G@4 C@2 D@2 G@4 C@2 D@2 ~@5
>`.pickRestart({
  A: "[[a3,e4], c4 ~]/2", B: "[[a3,e4]@15 ~, c4 ~]/2", C: "[c4@4 b3@3 ~@9, [a3,e4,a4]]/2",
  D: "[[a3,e4,a4]@15 ~, c4 ~]/2", E: "[~@15 c5@17 ~@16 c5@16, a4, ~@16 e4@9 ~@7]/4",
  F: "[c4@3 b3@3 ~@6 g4@4, g4@3 ~, e4@5 e4@3, d4 d4, ~@3 a3@5]/2", G: "[e4@15 c5@17 ~@16 c5@16, a4, ~@16 e4@9 ~@7]/4",
})).s("gm_synth_strings_2").gain(0.16).pan(0.6)

// chords · synth strings 2 · "String Pad" · soft notes
const synth_strings_2_soft = note(`<
  ~@4 A@2 B@2 ~ C ~ D ~@16 E@3 F E@3 F ~@16 E@3 F ~ C ~ D ~@16 E@3 F ~ C ~ D E@3 F ~ C ~ D ~@5
>`.pickRestart({
  A: "[~@16 d4@15 ~, a4@31 ~]/2", B: "[~@8 d4@7 ~, a4@15 ~]/2", C: "d4@15 ~", D: "d4@7 ~",
  E: "[~@17 d5@17 ~@14, e5@19 ~@29]/3", F: "~ d5@15",
})).s("gm_synth_strings_2").gain(0.08).pan(0.6)

// other · pizzicato strings · "Pizz Violin"
const pizzicato_strings = note("<~@19 [~@2 e4 g4 a4 c5 d5 e5 g5 a5 a3 ~ a3 ~@3] ~@77>")
  .s("gm_pizzicato_strings").gain(0.2)

// chords · electric guitar clean · "Guitar 1"
const electric_guitar_clean = note("<~@4 A@8 ~@7 B ~@11 C ~@2 D E ~@61>".pickRestart({
  A: "[~ [d3,a3,d4], [a2,e3,a3] ~, ~ [c4,e4]@18 ~@13]/2", B: "~@2 e4 g4 ~@6 a3 ~ a3@3 ~",
  C: "~@4 d5@2 ~ d5@3 ~@6, ~@6 a4@3 ~@7", D: "~ e5@3, ~ a4@7", E: "~@5 c5 ~ d5@9, ~@2 d5 a4@5",
})).s("gm_electric_guitar_clean").gain(0.15).pan(0.7)

// chords · electric guitar clean · "Guitar 1" · soft notes
const electric_guitar_clean_2 = note("<~@5 A ~ A ~ A ~ A ~@7 B ~@11 C ~@65>".pickRestart({
  A: "~ f#4@15", B: "~@4 a4 ~@11", C: "~@5 d5@3, ~@9 a4@3 ~@4",
})).s("gm_electric_guitar_clean").gain(0.05).pan(0.7)

// chords · distortion guitar · "Guitar 2"
const distortion_guitar = note(`<
  ~@19 A ~@11 B C ~@3 D E F G D E H@2 D I D E F J K L M@6 N O P@6 Q@3 ~@5 R S M@6 N O T@2 M@4 N O ~@5
>`.pickRestart({
  A: "~@10 a3 ~ a3@2 ~@2", B: "~@11 g3!5", C: "g3@2 a3@5 ~@9",
  D: "[a2,e3] ~@3 a3@2 a3!2 a3@2 [a2,a3] a3@2 a3 g3 a3, a3 ~@3, ~@2 [a2,e3]@9 ~@5", // A5 A A5
  E: "~@4 a3@2 a3!2 a3@2 a3 a3@2 a3 g3 a3, a3 ~@3, ~@2 [a2,d3]@9 ~@5", // D5
  F: "[a2,e3] ~@3 a3@2 a3!2 a3@2 [a2,a3] a3@2 a3 g3 a3, [e2,a3] ~@3, ~@2 [a2,e3]@9 ~@5", // A5 A A5
  G: "~@4 a3@2 a3!2 [a3,d4,g4] [d4,g4] [a3,d4,g4] [a3,g4] g4 a3 g3 a3, a2@5 ~@3, a3@4 ~@8 d4@3 ~, ~@2 d3@9 ~@5", // Dsus4 G5 Dsus4 A7
  H: "[[a2,e3] ~@3 a3@2 a3!2 a3@2 [a2,a3] a3@2 a3 g3 ~ d5!2 a4!2 d5!2 a4!2 d5!2 ~@2 d4!2 ~ a3, [e2,a3] ~@3 d4@3 ~, ~@2 [a2,e3]@9 ~@4 a3@16 ~]/2", // A5 A A5
  I: "~@4 a3@2 a3!2 a3@2 [a3,d4,g4]!2 [d4,g4] [a3,g4] ~ a3, a2@5 ~@3, a3@2 ~@5 [g3,d4,f#4], ~@2 d3@9 ~@5", // Dsus4 G5 A7 Gmaj7
  J: "~@4 a3@2 a3!2 a3@2 a3 a3@2 a3 g3 a3, a2@5 ~@3, a3 ~@3, ~@2 d3@9 ~@5",
  K: "[a2,e3] ~@3 a3@2 a3!2 a3@2 [a2,a3] a3@4 ~, [e2,a3] ~@3, ~@2 [a2,e3]@9 ~@5", // A5 A A5
  L: "~ [d4,d#4] d4 c4 d4 [c4,f#4]@2 a3 c4@4 a3 g3 e3@2, a3@7 ~@9, f#4@5 ~@11", // D#maj7 Cdim
  M: "[[a2,e3,a3]@8 [c3,e3,g3,c4]@6 a3@6 a3@2 a3!2 a3@2 a3 a3@2 a3 g3 a3, ~@7 d3@9]/2", // A5 C
  N: "[a2,e3,a3]@4 [c3,e3,g3,c4]@3 [d3,a3]", // A5 C D5
  O: "~@2 [a3,d4,g4] g4 [a3,d4,g4] g4 [a3,d4,g4] g4 [d4,g4] ~@2 f#4@2 ~@3, ~ a3, ~@9 g4@2 ~@5, ~@5 d4@3", // Dsus4 G5
  P: "[[a2,e3] ~@3 e4@2 e4!2 e4@2 [a2,e4] e4@2 [a3,e4] [g3,d4] ~@7 e4!2 e4@2 e4 e4@2 [a3,e4] [g3,d4] [a3,e4], a3@12 ~@3 [a3,e4]@2 ~ a2@8 ~@6, ~@2 e3@10 ~@4 a3@13 ~@3, ~ a2@4 ~@4 d3@5 ~@2]/2", // A5 G5 A5 G5 A5
  Q: "[[a2,e3] ~@3 e4@2 e4!2 e4@2 [a2,e4] e4@2 [a3,e4] [g3,d4] ~@7 e4!2 [d4,g4] ~ [d4,g4]!2 ~ [d4,g4]!2 [e4,a4]@9 ~@8, a3@12 ~@3 [a3,e4]@2 ~ a2@8 ~@22, ~@2 e3@10 ~@4 a3@17 ~@15, ~ a2@4 ~@4 d3@5 ~@10]/3", // A5 G5 A5
  R: "~@5 a4!2 ~ a4!2 ~ a4!2 ~ a4!2", S: "~ a4!2 ~ a4 [e4,a4] ~ a4 [e4,a4] ~ [a4,d5]!6, ~@5 e4@3",
  T: "[[a2,e3,a3]@8 [c3,e3,g3,c4]@6 a3@6 [a3,a4]@2 [a3,a4]!2 [a3,a4]@2 [a3,a4] [a3,a4]@2 a3 g3 a3, ~@7 d3@9]/2", // A5 C A
})).s("gm_distortion_guitar").gain(0.36).pan(0.7)

// chords · distortion guitar · "Guitar 2" · soft notes
const distortion_guitar_soft = note(`<
  ~@36 A B A C A B A D A E A B A F A ~ G@6 H I J K J K J K J K ~@6 L M G@6 H I G@6 H I ~@5
>`.pickRestart({
  A: "~ e4@10 ~@5, c4@5 ~@3", B: "~@3 [d4,f#4]@5 ~@8", C: "~@3 [d4,f#4]@5 ~@3 d4 ~ [f#4,a4]@3", D: "~@10 b4!2 ~@4",
  E: "~@3 [d4,f#4]@7 ~@3 d4 ~@2", F: "~@3 d4@8 ~@5, ~@3 f#4@5 ~@8", G: "[[c4,e4]@4 e4@3 [d4,f#4]@9]/2",
  H: "[c4,e4]@4 e4@3 [d4,f#4]", I: "~@3 d4 ~ d4 ~ d4 ~ d4@2 ~@2 f#4@3", J: "~ e4@3 ~@12, c4@11 ~@5",
  K: "~@3 d4@5 ~@8, ~@3 f#4@3 ~@10", L: "a4 ~ a4!2 ~@2 e4 ~@2 e4 ~@2 e4 ~@3", M: "~@2 e4 ~ e4 ~@2 e4 ~@8",
})).s("gm_distortion_guitar").gain(0.18).pan(0.7)

// other · pan flute · "Tin Whistle"
const pan_flute = note("<~@9 A ~ B ~@47 C D@2 E@2 F@2 G@2 H ~@15 I J I J I J I J ~@5>".pickRestart({
  A: "~@8 a5 b5 a5@6", B: "~@8 a5 b5 ~@6", C: "~@6 e5 g5", D: "[g5 a5@5 b5 a5 g5@3 f#5@3 d5@4 e5@8 ~@2 e5@2 g5@2]/2",
  E: "[g5 a5@5 b5 a5 g5@3 f#5@3 g5 f#5@3 d5@8 ~@2 g5 f#5 e5 d5]/2",
  F: "[e5@2 a5@4 b5 a5 g5@3 f#5@3 d5@4 e5@8 ~@2 e5@2 g5@2]/2", G: "[g5 a5@5 b5 a5 g5@3 f#5@3 g5 f#5@3 d5@10 b4@4]/2",
  H: "a4@3 ~@5", I: "~ g5 a5 b5 c6@2 e6 c6 d6@2 b5 d6 c6 b5 a5 f#5", J: "~ g5 a5 b5 c6@2 e6 c6 d6@2 b5 d6 c6@2 ~@2",
})).s("gm_pan_flute").gain(0.32)

// other · pan flute · "Tin Whistle" · soft notes
const pan_flute_soft = note("<~@9 A B C ~@49 D ~@3 D ~@31>".pickRestart({
  A: "f#5 g5 f#5@3 g5@3 ~@8", B: "g5", C: "f#5@3 g5 ~ a5@3", D: "~@2 d#5 ~@13",
})).s("gm_pan_flute").gain(0.19)

// drums · kick
const kick = s("bd").struct("<[x!16]!96 x>").gain(0.08)

// drums · snare
const snare = s("sd").struct("<~@3 A B@31 C B@15 D B@7 D B@8 ~@7 E B@7 D B@7 F B@4 ~>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@4 x ~@7 x ~ x!2", D: "~@4 x ~@7 x!2 ~@2", E: "~@2 x ~ x ~ x ~ x ~ x ~ x!2 ~@2",
  F: "~ x!7",
})).gain(0.8)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@3 A B@7 C ~@24 D@15 E F D@3 F D@2 E F D@7 ~@7 G F D@3 F D@2 E F D@3 F D@2 H ~@5
>`.pickRestart({
  A: "~@14 x!2", B: "~@6 x!2 ~@2 x!2 ~@2 x!2", C: "~@6 x!2 ~@2 x!2 ~@4", D: "x!8", E: "x!7 ~", F: "~ x!7", G: "~ x!6 ~",
  H: "x!4 ~@4",
})).gain(0.08)

// drums · mid tom
const mid_tom = s("mt").struct("<~@51 A ~@7 A ~@15 A ~@7 A ~@13>".pickRestart({
  A: "~@14 x!2",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@4 [x!2 ~@6]!8 ~@79 [~@4 x!4] ~@5>").gain(0.32)

// drums · china
const china = s("cr").struct("<~@52 A ~@3 A ~@3 A ~@15 A ~@3 A ~@3 A ~@3 A ~@8>".pickRestart({
  A: "x",
})).gain(0.64)

// drums · shaker
const shaker = s("sh").struct("<[~ x!2 ~ x!2 ~ x!3 ~ x!3 ~ x]!68 ~@24 [~ x!2 ~ x!2 ~ x!3 ~ x!3 ~ x]!4 ~>").gain(0.08)

stack(
  piano, ocarina, bass, bass_soft, bass_2, synth_strings_2, synth_strings_2_soft, pizzicato_strings,
  electric_guitar_clean, electric_guitar_clean_2, distortion_guitar, distortion_guitar_soft, pan_flute, pan_flute_soft,
  kick, snare, hihat, mid_tom, open_hat, china, shaker
)

More by The Corrs