Strudelify

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: edit a riff to change every repeat.

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

// bass · electric bass finger · "Bass"
const bass_2 = note(`<
  ~@5 A B C D A@2 C E B F G H B F I D J K I L K I A@2 M N B F G H B F I D J K I L K I O P Q R S T U V W X Y Z AA AB Q AC
  AD AE AF AB U AG AH AG A@2 AI AJ A@2 M N B F G H B F I D J K I L K I O P Q R S T U V W X Y Z AA AB Q AC Y Z AA AB Q AC
  Y Z AA AB Q AC AD AE AF AB U AG AH AG A@2 AI AJ A@2 AI AJ A@2 AI AJ A@2 AI AK@2 ~@4
>`.pickRestart({
  A: "g1@15 ~", B: "g1", C: "eb2@7 ~ f2@8", D: "c2", E: "c2@15 ~", F: "eb2@15 ~", G: "f2@14 bb1 c2",
  H: "f2@11 ~ c2@3 ~, e2 ~@15", I: "f2@15 ~", J: "~@14 bb1 c2, g1", K: "eb2@12 bb1 c2 eb2 ~", L: "c2@14 bb1 c2",
  M: "eb2@7 ~ f2@7 ~", N: "c2@7 ~", O: "~@3 g2@5, g1@15 ~", P: "~@3 g2@4 g1, g1@7 ~", Q: "eb2@13 ~ eb2@2",
  R: "bb1@5 ~ bb1@2 f1@8", S: "eb2@12 f2@3 ~", T: "~@3 g1@4 g1, g2@7 ~", U: "eb2@7 eb2", V: "bb1@5 ~ bb1@2 f1@5 ~ f1@2",
  W: "~@3 eb2@5, eb1@15 ~", X: "~@3 eb2@4 eb1, eb1@13 ~@3", Y: "bb1@13 ~ bb1@2", Z: "a1@7 a1", AA: "g1@7 g1",
  AB: "d2@7 d2", AC: "f1@7 f1", AD: "bb1@7 bb1", AE: "a1@13 ~ a1@2", AF: "g1@13 ~ g1@2", AG: "f1@15 ~", AH: "eb1@15 ~",
  AI: "eb1@7 ~ f1@8", AJ: "c2@13 ~@3", AK: "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 F D G H C I J K D J L@3 K C D E@2 F D G H C I J K I G M N D O D C D P Q@2 R J C J D S R J C J
  I P T S U@2 V W L@3 K C D E@2 F D G H C I J K I G M N D O D C D P Q@2 R J C J D S R J C J D S R J C J D S R J C J I P
  T S U@2 V W U@2 V W U@2 V W U@2 V X@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: "[g3,bb3,d4]", G: "[f3,a3,c4]", H: "[e3,g3,c4]", I: "[g3,bb3,eb4]", J: "[f3,a3,c4]@15 ~",
  K: "[e3,g3,c4]@7 ~", L: "[[g3,bb3,d4]@40 [f3,a3,c4]@7 ~]/3", M: "[g3,bb3,d4,g4] [f3,a3,c4,a4]", N: "[g3,bb3,d4,bb4]",
  O: "[f3,bb3,d4]@8 [f3,a3,c4]@7 ~", P: "[f3,bb3,d4]@7 ~ [f3,a3,c4]@8",
  Q: "[eb5@8 d5@8 bb4@13 ~@3, [g3,bb3,eb4]@15 ~]/2", R: "[f3,bb3,d4]@15 ~", S: "[f3,bb3,d4]@7 ~ [f3,a3,c4]@7 ~",
  T: "[eb3,g3,bb3]@15 ~", U: "[g3,bb3,d4]/2", V: "[g3,bb3,d4]@7 ~ [f3,a3,c4]@7 ~", W: "[e3,g3,c4]@15 ~",
  X: "[e3,g3,c4]/2", // C
})).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 L G M N@2 O@6 P@2 Q R F G K L G S T U G V G F G W@4 X F X Y Z AA X F X AB
  Z AC@4 AD AE@3 O@6 P@2 Q R F G K L G S T U G V G F G W@4 X F X Y AF AG X F X Y AH AI X F X Y AH AI X F X AB Z AC@4
  AJ@2 AK@2 AL@2 AM@2 AL@2 AM@2 AN@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 ~@5 a3@2, g3@25 ~ f3@6, ~@7 bb3]/2", E: "[g3@6 f3 ~@5 g3@2 e3@17 ~, ~@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]@7 ~", K: "a3@5 ~ bb3@6 a3@3 ~, [f3,c4]", L: "[e3,g3,c4]@15 ~", M: "[f3,a3,c4]@5 f3 bb3 a3",
  N: "[g3@5 ~ f3 ~ f3@17 ~ f3@2 bb3 ~ a3 ~]/2",
  O: "[~@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 …
  P: "[[g3,bb3]@16 ~@11 eb4@3 d4 ~, d4@19 ~@5 f4@7 ~, ~@16 [g3,bb3]@15 ~, ~@16 eb4@11 ~@5]/2", // Gm
  Q: "~@12 a3@3 ~, [f3,c4]@15 ~, a3@3 ~, ~@6 bb3@9 ~", // F5
  R: "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", S: "[f3,a3,c4]@5 ~@3",
  T: "[g3,bb3,d4] ~@7 [f3,a3,c4]@7 ~", U: "[g3,bb3,d4]@7 ~", V: "[f3,bb3,d4]@7 ~ [f3,a3,c4]@7 ~",
  W: "[[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
  X: "[f3,a3,c4]@15 ~", Y: "[g3,bb3]@8 [eb3,g3,bb3]@2 ~ [f3,a3,c4]@2 ~ [bb3,d4]@2, eb4@14 g3 ~",
  Z: "[f3,g3,bb3,d4]@7 ~ [f3,a3,c4]@7 ~", AA: "[f3,bb3,d4]@15 ~",
  AB: "[g3,bb3]@8 [eb3,g3,bb3]@2 ~ [eb3,g3,bb3]@2 ~ [f3,a3,c4]@2, eb4@15 ~", // Gm Eb F
  AC: "[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
  AD: "[g3,bb3,d4]@6 f3 ~@7 e3@2, ~ [f3,a3,c4], ~@3 g3", // Gm F
  AE: "[~@5 f3 bb3 ~@4 f3 f3@9 ~@2 a3, [e3,g3,c4]@7 a3@16 ~, ~ g3@2, ~@7 f3, ~@11 bb3]/3", // C
  AF: "[f3,g3,bb3,d4]@7 ~ [f3,a3,c4]@6 [f4,bb4] [d4,f4,bb4]", AG: "[f3,bb3,d4]@15 ~, [f4,bb4]@5 ~@11",
  AH: "[f3,g3,bb3,d4]@7 ~ [f3,a3,c4]@6 [d4,f4,bb4]!2", AI: "[f3,bb3,d4]@15 ~, [f4,bb4] ~",
  AJ: "[[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
  AK: "[c4 ~@5 f3@2 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 ~@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
  AM: "[c4 ~@5 f3 ~ f3@2 ~@18 bb3@2 a3 ~, [g3,d4]@31 ~, bb3@7 ~, ~@26 f3@5 ~]/2", // G5
  AN: "[[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 I C G J H J H K@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 I C G
  J H J H K@2 ~@2 K@2 ~@2 K@2 ~@2 K@2 ~@7
>`.pickRestart({
  A: "eb2", B: "bb1 f1", C: "g1", D: "[eb2@15 ~]/2", E: "bb1", F: "a1@15 ~", G: "d2", H: "f1", I: "a1", J: "eb1",
  K: "[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 C D C E F@2 G H D H I J G H K H I B I L M@2 ~@22 A B C D C E F@2 G H D H I J G H D H I J G H D H I N G H D H
  I N I L M@2 ~@19
>`.pickRestart({
  A: "[g3,bb3,eb4]@15 ~", B: "[f3,bb3,d4]@7 ~ [f3,a3,c4]@8", C: "[g3,bb3,eb4]", D: "[g3,bb3,d4]@15 ~",
  E: "[f3,bb3,d4]@7 ~ [f3,a3,c4]@8, g3 ~@15", F: "[[g3,bb3]@31 ~, eb4@9 ~@23]/2", G: "[f3,bb3,d4]", H: "[f3,a3,c4]",
  I: "[eb3,bb3], g3@7 ~", J: "[f3,bb3,d4] [f3,a3,c4]", K: "[g3,bb3,d4]", L: "[f3,bb3,d4]@7 ~ [f3,a3,c4]@7 ~",
  M: "[g3,bb3,d4]/2", N: "f3 [f3,a3,c4], [bb3,d4]",
})).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",
// … 15 more lines

More by Toto