Strudelify
I Will Remember cover art

1995 · Tambu

I Will Remember

Toto

KeyG minorTempo97 bpm
0:00/0:00
// I Will Remember — Toto
// 97 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 148 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, A@4 for four bars: edit a riff to change every repeat.

// bass · piano · "Accoustic Piano"
const bass = note(`<
  ~@5 A@2 B C A@2 B D A E F@2 A E F D A E F D E F A@2 B D A E F@2 A E F D A E F D E F A@2 G H E A E H E@2 I J A K E F I
  J A K E F E F A@2 B D A@2 B D A E F@2 A E F D A E F D E F A@2 G H E A E H E@2 I J A K E F I J A K E F I J A K E F I J
  A K E F E F A@2 B D A@2 B D A@2 B D A@2 B L@2 ~@4
>`.pickRestart({
  A: "[g1,g2]@15 ~", B: "[eb1,eb2]@7 ~ [f1,f2]@8", C: "[c1,c2]@3 ~", D: "[c1,c2]@15 ~", E: "[eb1,eb2]@15 ~",
  F: "[f1,f2]@15 ~", G: "[eb1,eb2]@7 ~", H: "[bb1,bb2]@7 ~ [f1,f2]@8", I: "[bb1,bb2]@15 ~", J: "[a1,a2]",
  K: "[d1,d2]@15 ~", L: "[c1,c2]/2",
})).s("gm_piano").gain(0.8)

// bass · electric bass finger · "Bass"
const bass_2 = note(`<
  ~@5 A@2 B C A@2 B C A D E F A D G C H I G J I G A@2 B K A D E F A D G C H I G J I G L M N O P Q N R S T U V W X N Y U
  V W X N Z AA Z A@2 AB K A@2 B K A D E F A D G C H I G J I G L M N O P Q N R S T U V W X N Y U V W X N Y U V W X N Y U
  V W X N Z AA Z A@2 AB K A@2 AB K A@2 AB K A@2 AB AC@2 ~@4
>`.pickRestart({
  A: "g1@15 ~", B: "eb2@7 ~ f2@8", C: "c2", D: "eb2@15 ~", E: "f2@14 bb1 c2", F: "f2@11 ~ c2@3 ~, e2 ~@15",
  G: "f2@15 ~", H: "~@14 bb1 c2, g1", I: "eb2@12 bb1 c2 eb2 ~", J: "c2@14 bb1 c2", K: "c2@13 ~@3",
  L: "~@3 g2@5, g1@15 ~", M: "~@3 g2@4 g1, g1@7 ~", N: "eb2@13 ~ eb2@2", O: "bb1@5 ~ bb1@2 f1@8", P: "eb2@12 f2@3 ~",
  Q: "~@3 g1@4 g1, g2@7 ~", R: "bb1@5 ~ bb1@2 f1@5 ~ f1@2", S: "~@3 eb2@5, eb1@15 ~", T: "~@3 eb2@4 eb1, eb1@13 ~@3",
  U: "bb1@13 ~ bb1@2", V: "a1@7 a1", W: "g1@7 g1", X: "d2@7 d2", Y: "f1@7 f1", Z: "f1@15 ~", AA: "eb1@15 ~",
  AB: "eb1@7 ~ f1@8", AC: "c2/2",
})).s("gm_electric_bass_finger").gain(0.8)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@5 A@3 B A@3 B C D E@2 C D F G C D F H D F I@3 H C D E@2 C D F G C D F H D F J K D L D C D L M@2 N F C F D L N F C F
  D L O L P@2 Q H I@3 H C D E@2 C D F G C D F H D F J K D L D C D L M@2 N F C F D L N F C F D L N F C F D L N F C F D L
  O L P@2 Q H P@2 Q H P@2 Q H P@2 Q R@2 ~@4
>`.pickRestart({
  A: "[[d3,g3,bb3]@39 ~ [c3,f3,a3]@8]/3", B: "[c3,e3,g3]@15 ~", C: "[g3,bb3,d4]@15 ~", D: "[g3,bb3,eb4]@15 ~",
  E: "[f3,a3,c4]/2", F: "[f3,a3,c4]@15 ~", G: "[e3,g3,c4]@15 ~", H: "[e3,g3,c4]@7 ~",
  I: "[[g3,bb3,d4]@40 [f3,a3,c4]@7 ~]/3", J: "[g3,bb3,d4,g4] [f3,a3,c4,a4]", K: "[g3,bb3,d4,bb4]",
  L: "[f3,bb3,d4]@7 ~ [f3,a3,c4]@7 ~", M: "[eb5@8 d5@8 bb4@13 ~@3, [g3,bb3,eb4]@15 ~]/2", N: "[f3,bb3,d4]@15 ~",
  O: "[eb3,g3,bb3]@15 ~", P: "[g3,bb3,d4]/2", Q: "[g3,bb3,d4]@7 ~ [f3,a3,c4]@7 ~", R: "[e3,g3,c4]/2",
})).s("gm_string_ensemble_1").gain(0.24)

// chords · piano · "Accoustic Piano"
const piano = note(`<
  ~@4 A B@2 C@2 D@2 E@2 F G H@2 F G I J F G K J G L M@2 N@6 O@2 P Q F G K J G R S F G T G F G U@4 V F V W X Y V F V Z X
  AA@4 AB AC@3 N@6 O@2 P Q F G K J G R S F G T G F G U@4 V F V W AD AE V F V W AF AG V F V W AF AG V F V Z X AA@4 AH@2
  AI@2 AJ@2 AK@2 AJ@2 AK@2 AL@3 ~@4
>`.pickRestart({
  A: "~@12 bb3@2 a3 ~, ~@10 f3@5 ~", B: "[~@6 f3@2 f3@18 ~@2 bb3@2 a3 ~, g3@31 ~, ~@26 f3@5 ~]/2",
  C: "[~@6 f3@2 ~@4 g3@2 ~@14 bb3@2 a3 ~, g3@8 f3@6 e3@17 ~, ~@26 f3@5 ~]/2",
  D: "[~@6 f3@2 f3@17 ~@3 bb3@2 a3 ~, g3@25 ~ f3@5 ~]/2", E: "[~@6 f3@2 ~@4 g3@2 e3@17 ~, g3@4 f3@3 ~@9]/2",
  F: "[g3,bb3,d4]@15 ~", G: "[g3,bb3,eb4]@15 ~", H: "[[f3,a3,c4]@15 ~]/2", I: "[a3,c4]@6 bb3@6 a3@3 ~, f3@15 ~",
  J: "[e3,g3,c4]@15 ~", K: "a3@5 ~ bb3@6 a3@3 ~, [f3,c4]", L: "[f3,a3,c4]@5 f3 bb3 a3",
  M: "[g3@5 ~ f3 ~ f3@17 ~ f3@2 bb3 ~ a3 ~]/2",
  N: "[~@6 f3 ~@5 g3 ~@9 [f3,g3,c4] c4@2 [c4,g4]@2 ~@5 [g3,bb3]@16 ~@16 [f3,c4]@14 [f3,g3,c4,f4] [f3,g3] ~@8 a3@7 ~, g3@4 f3@3 e3@7 [g4,c5]@16 ~@18, ~@23 f3@9 d4@32 a3@24 ~@8, ~@23 g3@4 c4@21 g3@30 ~ [c4,f4]@16 ~, ~@25 f4@23 [bb3,eb4]@32 [f3,g3,bb3]@15 ~]/6", // Fsus2 C5 Gm F5 Fsus2 C5 F5 Eb5 …
  O: "[[g3,bb3]@16 ~@11 eb4@3 d4 ~, d4@19 ~@5 f4@7 ~, ~@16 [g3,bb3]@15 ~, ~@16 eb4@11 ~@5]/2", // Gm
  P: "~@12 a3@3 ~, [f3,c4]@15 ~, a3@3 ~, ~@6 bb3@9 ~", // F5
  Q: "c4@5 ~@10 a3, [e3,g3]@10 f4 e4 d4 c4 bb3@2, ~@5 c4@4 g4@7, ~@3 f4 a4@4, ~@7 bb4@9", R: "[f3,a3,c4]@5 ~@3",
  S: "[g3,bb3,d4] ~@7 [f3,a3,c4]@7 ~", T: "[f3,bb3,d4]@7 ~ [f3,a3,c4]@7 ~",
  U: "[[f3,bb3,d4]@7 ~@9 [g4,bb4]@8 bb4@8 [d4,f4,bb4]@10 [d4,f4,bb4]@2 [d4,f4,bb4]@2 [d4,f4,bb4] d4 [f3,bb3,d4]@15 ~, ~@8 [f3,a3,c4]@32 ~@7 [f4,bb4]@16 ~, ~ [g3,bb3,eb4,eb5]@2 ~, ~@3 [g4,d5]@4 ~]/4", // Bb Gm Bb F Bb5 Eb G5
  V: "[f3,a3,c4]@15 ~", W: "[g3,bb3]@8 [eb3,g3,bb3]@2 ~ [f3,a3,c4]@2 ~ [bb3,d4]@2, eb4@14 g3 ~",
  X: "[f3,g3,bb3,d4]@7 ~ [f3,a3,c4]@7 ~", Y: "[f3,bb3,d4]@15 ~",
  Z: "[g3,bb3]@8 [eb3,g3,bb3]@2 ~ [eb3,g3,bb3]@2 ~ [f3,a3,c4]@2, eb4@15 ~", // Gm Eb F
  AA: "[g3@8 g3@3 ~@5 [f3,bb3,d4]@8 f3@2 f3@2 bb3@2 ~@8 f3@2 f3@16 ~@4 bb3@2 a3 ~, eb3@25 ~@7 c4@24 ~@8, bb3@16 ~@14 a3@26 ~@2 f3@5 ~, ~@11 g3@14 ~@7 [g3,d4]@31 ~, ~@14 a3@10 [a3,c4]@7 ~ bb3@28 ~@4]/4", // Bb G5 Am
  AB: "[g3,bb3,d4]@6 f3 ~@7 e3@2, ~ [f3,a3,c4], ~@3 g3", // Gm F
  AC: "[~@5 f3 bb3 ~@4 f3 f3@9 ~@2 a3, [e3,g3,c4]@7 a3@16 ~, ~@16 g3@31 ~, ~@7 f3, ~@11 bb3]/3", // C
  AD: "[f3,g3,bb3,d4]@7 ~ [f3,a3,c4]@6 [f4,bb4] [d4,f4,bb4]", AE: "[f3,bb3,d4]@15 ~, [f4,bb4]@5 ~@11",
  AF: "[f3,g3,bb3,d4]@7 ~ [f3,a3,c4]@6 [d4,f4,bb4]!2", AG: "[f3,bb3,d4]@15 ~, [f4,bb4] ~",
  AH: "[[g3,bb3,d4]@6 f3 ~@7 e3@2 ~@12 bb3@2 a3@2, ~@8 a3@21 ~@3, ~@4 f3@9 f3@2 ~, ~ c4 ~@2, ~@12 g3@4 [e3,g3,c4]@15 ~]/2", // Gm C
  AI: "[c4 ~@5 f3@2 f3@2 ~@18 bb3@2 a3 ~, [g3,d4]@31 ~, bb3@7 ~, ~@26 f3@5 ~]/2", // G5
  AJ: "[[g3,bb3,d4]@6 f3 ~@7 e3@2 ~@10 f3@2 bb3 ~ a3@2, ~@8 a3@21 ~@3, ~@4 f3@9 ~@3, ~ c4 ~@2, ~@12 g3@4 [e3,g3,c4]@15 ~]/2", // Gm C
  AK: "[c4 ~@5 f3 ~ f3@2 ~@18 bb3@2 a3 ~, [g3,d4]@31 ~, bb3@7 ~, ~@26 f3@5 ~]/2", // G5
  AL: "[[g3,bb3,d4]@6 f3 ~@7 e3@2 [e3,g3,c4]@32, ~@8 [f3,a3]@21 ~@19, ~ c4 ~@4, ~@3 g3 ~@8]/3", // Gm C F
})).s("gm_piano").gain(0.8)

// other · overdriven guitar · "OverDrive Guitar"
const overdriven_guitar = note(`<
  ~@47 A B A C A B D@2 E F C G ~ H E F C G I H I H J@2 ~@22 A B A C A B D@2 E F C G ~ H E F C G ~ H E F C G ~ H E F C G
  I H I H J@2 ~@2 J@2 ~@2 J@2 ~@2 J@2 ~@7
>`.pickRestart({
  A: "eb2", B: "bb1 f1", C: "g1", D: "[eb2@15 ~]/2", E: "bb1", F: "a1@15 ~", G: "d2", H: "f1", I: "eb1",
  J: "[g1@15 ~]/2",
})).s("gm_overdriven_guitar").gain(0.6)

// other · electric guitar clean · "Electric Guitar"
const electric_guitar_clean = note(`<
  ~@55 A@2 B C B A@3 B C B A ~@34 A@2 B C B A@3 B C B A@3 B C B A@3 B C B A ~@23
>`.pickRestart({
  A: "f2!2 f3!2 f2!2 f3!2 f2!2 f3!2 f2!2 f3!2", B: "g2!2 g3!2 g2!2 g3!2 g2!2 g3!2 g2!2 g3!2",
  C: "a2!2 a3!2 a2!2 a3!2 a2!2 a3!2 a2!2 a3!2",
})).s("gm_electric_guitar_clean").gain(0.25)

// chords · pad sweep · "Sweeps"
const pad_sweep = note(`<
  ~@47 A B A C A D E@2 F G C G H B F G C G H B H B I@2 ~@22 A B A C A D E@2 F G C G H B F G C G H B F G C G H B F G C G
  H B H B I@2 ~@19
>`.pickRestart({
  A: "[g3,bb3,eb4]@15 ~", B: "[f3,bb3,d4] [f3,a3,c4]", C: "[g3,bb3,d4]@15 ~",
  D: "[f3,bb3,d4]@7 ~ [f3,a3,c4]@8, g3 ~@15", E: "[[g3,bb3]@31 ~, eb4@9 ~@23]/2", F: "[f3,bb3,d4]", G: "[f3,a3,c4]",
  H: "[eb3,bb3], g3@7 ~", I: "[g3,bb3,d4]/2",
})).s("gm_pad_sweep").gain(0.36)

// chords · piano · "Piano Solo"
const piano_2 = note("<~@128 A@5 ~ B@4 C@8 ~@2>".pickRestart({
  A: "[~@22 f4@2 ~@33 c5 [c5,a5]!2 c5 c5@4 ~@2 [c5,a5]!3 c5 [c5,g5]@4 ~@5, ~ d5@5 g5 f5 g5 f5 c5 g5@4 a4@23 g3@4 d4@4 a4 c5 d5@12 a5 g5@9 a5@5 ~@5, ~ c5@4 a5@9 bb4@25 a3@4 e4@32 ~@5, ~@2 f5@2 bb5@9 c5@17 e4@6 c3@4 bb3@4 f4@31 ~@5, ~@3 c6@9 f5@4 g4@8 f4@4 g4@9 f3@4 c4@4 g4@30 ~@5]/5", // F C5
  B: "[~@45 a4 [c4,a4]!2 c4 c4@2 c4 ~ [c4,a4]!3 c4 [c4,g4]@3 [c4,g4] c4 [c4,f4]@2, ~@5 c6@9 f5@32 ~@18, ~@6 bb5@10 bb4@32 a4@3 ~@5 a4@8, ~@7 a5@20 f4 g4@9 c4 f4@24 ~@2, ~@8 g5 f5 g5 f5 c5 g5@26 g4@10 g4@8 ~@4 g4@3]/4", // F C5 F5
  C: "[~@24 [c5,c6]@9 [c5,g5,c6] [g5,c6] d5@4 [g4,bb4] ~ [g4,bb4,d5]!2 g4 ~@2 g4 a4 ~@13 e3 ~@2 c3@4 [d3,g3,c4] [c3,d3,g3,c4] c4@2 ~@2 [g4,c5] [c4,g4,c5]@7 ~ [g4,c5] [d4,g4,c5] [c4,d4,g4,c5]!2 [c4,d4,g4,c5]@2 ~ [c4,d4,g4] [c4,d4,g4,c5]!3 c5@12 ~ [c5,d5,g5,c6]!3 ~ [g5,c6]@17, ~ g4@10 c4@4 g4 a4@19 c5@8 d5@6 g4 f4 g4 f4 c4 g4 f4@8 f3@32 ~@33, ~ e4@9 bb3@4 f4@9 g5@10 ~@2 [g5,c6]@10 bb4@13 a3@15 c4@2 d4@8 ~@11 [c4,d4,g4]@32 ~@2, ~ c4@8 g3@4 e4@10 f5@21 c5@3 g4 a4@11 g3 f3@2 e3@32 ~@34, ~@8 c3@4 d4@6 bb4 c5@2 d5 e5@21 bb4 b4@12 c4 bb3@13 [c3,d3,g3]@32 ~@26]/8", // C C5 Gm Csus2 C5 Csus2 C5 Csus2
})).s("gm_piano").gain(0.72)

// chords · piano · "Piano Solo" · soft notes
const piano_soft = note("<~@131 A B ~ C@3 D E ~ F ~ G H I@3 ~>".pickRestart({
  A: "~@9 a5 ~@6", B: "~@2 [c5,a5] ~@13", C: "[~@25 c4@12 ~@7 c4@2 ~@2, ~@15 c5@32 ~, ~@44 a4 ~@3]/3", D: "~@3 a4 ~@12",
  E: "e4 ~@15", F: "~ d5 [c5,d5] ~@4 d5 ~@4 g4@2 ~@2", G: "~@3 [d3,g3] c3 ~@4 [g4,c5] ~@6, ~@9 d4@2 ~@5",
  H: "~ g4 [g4,c5] ~ c4 ~@5 c5 ~@5, ~ c4 ~@6", I: "[~@8 g5 [g5,c6] [c5,d5,g5,c6] ~@4 [c5,d5]@20 ~@13]/3",
})).s("gm_piano").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~ A@54 B@12 ~@2 A@32 B@24 ~@2 A@20 ~>".pickRestart({
  A: "x", B: "x ~@2 x ~@4",
})).gain(0.48)

// drums · snare
const snare = s("sd").struct("<~@46 A ~@8 B@12 ~@25 A ~@8 B@24 ~@23>".pickRestart({
  A: "~@9 x ~@2 x ~@3", B: "~ x",
})).gain(0.6)

// drums · low tom
const low_tom = s("lt").struct("<A B@53 C D@5 E D@6 ~@2 B@31 C D@5 E D@5 E D@5 E D@6 ~@2 B@19 F ~>".pickRestart({
  A: "~@3 x", B: "~@2 x!2", C: "~@8 x ~@3 x ~ x!2", D: "~@3 x ~@12", E: "~@3 x ~@7 x!2 ~ x ~", F: "~ x",
})).gain(0.6)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct(`<
  A B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@15 B ~ B
  ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@27 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@2
>`.pickRestart({
  A: "~@10 x!2 ~@4", B: "~@11 x ~@4",
})).gain(0.24)

// drums · mid tom
const mid_tom = s("mt").struct("<~ A@54 B@5 C B@6 ~@2 A@32 B@5 C B@5 C B@5 C B@6 ~@2 A@20 ~>".pickRestart({
  A: "~@3 x ~@2 x ~ x ~@7", B: "~@3 x ~@12", C: "~@3 x ~@7 x!2 ~@3",
})).gain(0.54)

// drums · open hat
const open_hat = s("oh").struct("<~@55 [~ x]!12 ~@34 [~ x]!24 ~@23>").gain(0.6)

// drums · tambourine
const tambourine = s("tb").struct("<~@55 [~@8 x!4 ~@4]!12 ~@34 [~@8 x!4 ~@4]!24 ~@23>").gain(0.42)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@55 [~@3 x]!12 ~@34 [~@3 x]!24 ~@23>").gain(0.24)

// drums · splash
const splash = s("cr").struct(`<
  ~@47 A ~@3 A ~@3 A ~@5 A ~@4 A ~@26 A ~@3 A ~@3 A ~@5 A ~@5 A ~@5 A ~@4 A ~@23
>`.pickRestart({
  A: "x",
})).gain(0.6)

// drums · ride
const ride = s("rd").struct("<~@55 A ~@45 A ~@5 A ~@5 A ~@34>".pickRestart({
  A: "x",
})).gain(0.6)

// drums · bongos
const bongos = s("bongo:4").struct(`<
  ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@13 x ~@2",
})).gain(1.1)

// drums · bongos
const bongos_2 = s("bongo:18").struct(`<
  ~
  [~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2]!54
  ~@12
  [~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2]!34
  ~@24
  [~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2]!22
  ~
>`).gain(1.1)

// drums · ht
const ht = s("ht").struct("<~@46 A ~ B ~@3 B ~@39 A ~ B ~@3 B ~@49>".pickRestart({
  A: "~@14 x!2", B: "~@11 x!2 ~@3",
})).gain(0.48)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~@48 A ~@3 A ~@41 A ~@3 A ~@49>".pickRestart({
  A: "~@11 x!2 ~@3",
// … 10 more lines

More by Toto