Strudelify

I Knew I Loved You

Savage Garden

KeyA majorTempo85 bpm
0:00/0:00
// I Knew I Loved You — Savage Garden
// 85 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 83 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(85/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 · electric bass finger · "Bass"
const bass = note(`<
  ~@18 A B A C A B A D E F E F E F E G H G H I A B A C A B A J K L M N K L O D ~ H P H Q H P H Q H P H Q H P H Q H P H Q
  H P H Q H P H Q
>`.pickRestart({
  A: "a1@5 ~ a1@2 b1@5 ~@3", B: "d1@5 ~ d1@2 e1@5 ~ e1 f#1", C: "d1@5 ~ d1@2 e1@3 ~@3 e1 f#1", D: "d1",
  E: "a1@5 ~ a1@2 b1@5 ~ b1@2", F: "c#2@5 ~ c#2@2 d2@4 ~@2 d2@2", G: "d2@5 ~ d2@2 e2@5 ~ e2@2",
  H: "b1@5 ~ b1@2 c#2@5 ~ c#2@2", I: "d2@15 ~", J: "d1@5 ~@3 e1@8", K: "c#2 c#1", L: "d2@2 a1 g#1", M: "f#1 d1",
  N: "a1@8 e1@7 ~", O: "f#1 e1", P: "e1@5 ~ e1@2 f#1@5 ~ f#1 a1", Q: "e1@5 ~ e1@2 f#1@4 ~@2 f#1 a1",
})).s("gm_electric_bass_finger").gain(0.57)

// chords · acoustic guitar steel · "Guitar"
const acoustic_guitar_steel = note(`<
  ~ A@5 B C B C B C B D E F E G H I J K L M N O P Q R S T U T V E W X Y T Z AA AB AC M AD AE AF AG AH AI AJ AK AL AM AN
  AO AP AQ AR AS AP AQ AR AO AP AQ AR AS AP AQ AR AO AP AQ AR AS AP AQ AR AO AP AQ AR
>`.pickRestart({
  A: "[~@8 c#4@2 d4@2 e4 ~@9 e3@2 ~@2 f#3@2 ~@2 f#3@2 ~@6 g#3@2 ~@6 a3@2 ~@4 [f#3,a4]@2 c#3@2 ~@2 b2@2 [e3,e4]@2 b2 ~@9 d2@8, ~@14 e4@4 e3@4 d4@6 ~@2 e4@9 ~@3 g#4@4 a4@4 ~@4 g#4@5 ~@9 d3@12, ~@16 a2@7 ~ b2@7 ~ c#3@7 ~ d3@8 f#2@7 ~ e2@7 ~ d2@6 e4@8 ~@2, ~@10 [a3,e4]@2 ~@2 b3@2 ~ g#3@2 f#4@5 ~@7 f#4@8 ~, ~@18 c#4@2 ~ a3 d4@2 ~ c#3@2 ~@6 a2@2 a2@5]/5", // F#m E A5
  B: "~@2 [e3,a3,c#4] a2 b2@2 [f#3,b3,d4] b2, a2@3 ~@5", C: "c#3@4 [g#3,c#4,e4]@2 c#3@2 d3@4 [f#3,a3,d4]@2 d3 ~",
  D: "c#3@4 [g#3,c#4,e4]@2 c#3@2 [d2,d3]@4 [f#3,a3,d4]@2 d3 ~", E: "b2@2 [f#3,b3,d4] b2 c#3@2 [g#3,c#4,e4] c#3",
  F: "d3@4 [f#3,a3,d4]@2 [c#3,d3] ~ [e3,a3]@2 b2 ~ [e3,g#3]@2 e2 ~, ~@8 e2@5 ~@3", // D Dmaj7 A5 E
  G: "[f#3,a3,d4]@2 f#3 d4 ~@2 a3 [d3,f#3], d3@7 ~, ~@8 f#3@5 ~@3, ~@10 d4@5 ~", // D
  H: "a2@4 ~ b3 a2@2 b2@4 [f#3,b3,d4]@2 b2 ~, ~@2 [e3,a3,c#4] ~@5", // Bm A
  I: "d2@4 [f#3,a3,c#4,d4]@2 [d2,b3]@2 e2@4 [e3,g#3,b3]@2 e2 ~, c#2 ~@15", // Dmaj7 G E
  J: "a2@4 [e3,a3,c#4]@2 [a2,b3]@2 b2@4 g#3 ~ b2 ~, ~@3 [f#3,b3,d4]", // A Asus2 Bm
  K: "d2@4 c#4@2 [d2,b3]@2 e2@4 [e3,g#3,b3]@2 e2 ~, ~@4 [f#3,a3,d4]@4 ~@4 a3 ~@3", // G E D
  L: "a2@4 [e3,a3,c#4]@2 [a2,b3]@2 b2@4 [f#3,b3,d4]@2 b2 ~", // A Asus2 Bm
  M: "d2@4 [f#3,a3,c#4,d4]@2 [d2,b3]@2 e2@4 [e3,g#3,b3]@2 e2 ~", // Dmaj7 G E
  N: "a2@4 [e3,a3,c#4,d4]@2 [a2,b3]@2 b2@4 [f#3,b3,d4]@2 b2 ~", O: "~@2 [f#3,a3,d4] f#3 e4 f#3 e4 a3, d2@15 ~",
  P: "a2@4 ~@2 a2 ~ b2@4 ~@2 b2 ~, ~ [e3,a3,c#4] ~ [f#3,b3,d4]", // A Bm
  Q: "c#3@4 [d4,f#4] ~ c#3 ~ d3@4 [e3,f#3] ~ [d3,a3] b3, ~@4 [g#3,c#4,e4]@4 ~@4 [a3,d4]@3 ~, ~@13 f#3@2 ~", // D Esus2 D5 C#m D5
  R: "a2@4 c#4@2 a2 ~ b2@4 ~@2 b2 ~, a3 ~ [e3,a3]@2 ~@2 [f#3,b3,d4]@2", // A5 Bm
  S: "c#3@4 [g#3,c#4,e4]@2 c#3 ~ d3@4 [f#3,a3,d4]@2 d3 ~", T: "a2@4 [e3,a3,c#4]@2 a2 ~ b2@4 [f#3,b3,d4]@2 b2 ~",
  U: "c#3@4 [g#3,c#4,e4]@2 c#3 ~@3 f#3 ~ [f#3,a3,d4]@2 d3 ~, ~@8 d3@4 e4 ~@3", // C#m D
  V: "d2@4 [d3,f#3,a3]@2 d2@2 e2@4 [e3,g#3,b3]@2 e2 ~", W: "~@8 [e2,b2,e3,a3]@3 ~ [e2,b2,e3,g#3]@2 ~@2, ~@8 f#3 ~@7",
  X: "b2@4 [f#3,b3,d4]@2 b2@2 c#3@4 [g#3,c#4,e4]@2 [c#3,g#3] ~", // Bm C#m C#5
  Y: "[f#3,a3,d4]@2 f#3@2 e4@2 a3@2 e4@2 a3@2 e4@2 a3 ~, f#2@7 ~", // D
  Z: "d2@4 c#4@2 [d2,b3]@2 ~@2 e3 ~@3 e2 ~, ~ [f#3,a3,d4] e2 [e3,g#3,b3]", // G D E
  AA: "a2@4 [e3,a3,c#4]@2 [a2,b3]@2 b2@4 ~@2 b2 ~, ~@3 [f#3,b3,d4]", // A Asus2 Bm
  AB: "d2@4 [f#3,a3,c#4,d4]@2 [d2,b3]@2 [f#3,a3,d4]@2 e2@2 [e3,g#3,b3]@2 e2 ~", // Dmaj7 G D E
  AC: "a2@4 ~@2 [a2,b3]@2 b2@4 [f#3,b3,d4]@2 b2 ~, ~ [e3,a3,c#4] ~@2", // Asus2 Bm A
  AD: "a2@4 [e3,a3,c#4]@2 [a2,b3]@2 b2@4 [f#3,b3,d4]@2 b2 ~, g#2 ~@15", // A Asus2 Bm
  AE: "d2@4 [d3,f#3,a3]@2 d2 ~@3 e3 ~ [e3,g#3,b3]@2 e2 ~, ~@3 [e3,g#3,b3]@2 ~@3, ~@8 e2@5 ~@3", AF: "[c#3,e3,b3]",
  AG: "[d3,f#3,a3] [e3,a3,c#4]", AH: "[f#3,a3,c#4] [d3,f#3,a3]", AI: "[c#3,e3,a3]@6 ~@2 [e3,g#3,b3]@7 ~",
  AJ: "[c#3,e3,b3]@15 ~", AK: "[d3,a3]@8 [g#3,b3] ~ e3@4 ~@2, f#3@7 ~ [a3,c#4]@7 ~",
  AL: "[f#3,a3,c#4]@6 ~@2 [e3,g#3,b3]@7 ~", AM: "d3 ~@6 d3, f#3, a3!4, ~ d3@2 d3@2 d3@2 ~", AN: "a3@2 d3@2 a3@2 d3 ~@9",
  AO: "b2@4 [b3,d#4,f#4]@2 b2 ~@3 c#4 ~@3 c#3 ~, ~@2 c#3 [c#4,e4,g#4]", // B C#m
  AP: "e2@4 [e3,g#3,b3,d#4]@2 [e2,c#4]@2 f#2@4 [f#3,a#3,c#4]@2 f#2 ~", // Emaj7 C#m F#
  AQ: "b2@4 [b3,d#4,f#4]@2 [b2,c#4]@2 c#3@4 [c#4,e4,g#4]@2 c#3 ~", // B Bsus2 C#m
  AR: "e2@4 [e3,g#3,b3,d#4]@2 [e2,c#4]@2 f#2@4 [f#3,a#3,c#4]@2 f#2 ~, ~@4 [g3,a3] ~@11", // Emaj7 C#m F# Gsus2
  AS: "b2@4 [b3,d#4,f#4]@2 [b2,c#4]@2 ~@2 c#4 ~@3 c#3 ~, ~@2 c#3 [c#4,e4,g#4]", // B Bsus2 C#m
})).s("gm_acoustic_guitar_steel").gain(0.45)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note("<~@35 A B C ~@8 D E@2 F D G@3 ~@19 H I@6 ~@3>".pickRestart({
  A: "~@7 g#4", B: "a4 g#4", C: "e4", D: "e5",
  E: "[a4@6 c#5@4 b4 a4@3 b4@6 c#5@2 a4@6 b4@2 g#4@2, ~@6 c5 ~@13 c5 ~@7 a#4 ~@3]/2", F: "~ f#4 e4@14",
  G: "[a4@6 c#5@4 ~ a4@3 b4@6 c#5@2 a4@6 c#5@2 a4@16 ~@2, ~@6 c5 ~@3 b4@2 ~@8 c5 ~@7 c5 ~@19]/3", H: "~@7 b5",
  I: "[b5@2 a#5@2 g#5 ~@10 b4@11 c#5@4 b4@9 d#5@3 c#5 b4@3 c#5@6 d#5@2 b4@32 ~@10, ~@6 f#5@11 ~@22 d5 ~@12 d5 ~@43]/6",
})).s("gm_string_ensemble_1").gain(0.4)

// drums · kick
const kick = s("bd").struct("<[x ~@6 x ~@2 x ~@3 x ~]!2 [x ~@2 x!2 ~@3]!4 [~@3 x!2 ~@3] [x ~@2 x!2 ~@3]!76>").gain(0.72)

// drums · clap
const clap = s("cp").struct("<~@2 [~ x ~ x]!81>").gain(0.64)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!2 ~@81>").gain(0.72)

// drums · hihat
const hihat = s("hh").struct("x!8").gain(0.56)

// drums · low tom
const low_tom = s("lt").struct("<~@62 [~@7 x] ~@7 [~@7 x] ~@7 [~@7 x] ~@4>").gain(0.72)

// drums · mid tom
const mid_tom = s("mt").struct("<~@17 A ~@19 A ~@16 A ~@7 A ~@7 A ~@7 A ~@4>".pickRestart({
  A: "~@5 x!2 ~",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@3 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2 A ~@28
>`.pickRestart({
  A: "~@15 x",
})).gain(0.56)

// drums · high tom
const high_tom = s("ht").struct("<~@17 A ~@19 A ~@16 A ~@7 A ~@7 A ~@7 A ~@4>".pickRestart({
  A: "~ x",
})).gain(0.72)

// drums · china
const china = s("cr").struct("<~@18 A ~@19 A ~@7 A ~@6 A@3 ~@3 A ~@2 B A ~@3 A ~@2 B A ~@3 A ~@2 B A ~@3>".pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.72)

// drums · shaker
const shaker = s("sh").struct("~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x").gain(0.4)

// drums · bell tree
const bell_tree = s("marktrees:0").struct("<~@17 [~@3 x] ~@19 [~@3 x] ~@45>").gain(3.81)

stack(
  bass, acoustic_guitar_steel, string_ensemble_1, kick, clap, snare, hihat, low_tom, mid_tom, open_hat, high_tom, china,
  shaker, bell_tree
)

More by Savage Garden