Strudelify

Love Takes Time

Mariah Carey

KeyB majorTempo60 bpm
0:00/0:00
// Love Takes Time — Mariah Carey
// 60 bpm, 4/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 6/4 at bar 47, 4/4 at bar 49) are rendered on a constant 4/4 grid of one bar per cycle
// note: duplicate parts dropped: ch 8 "Piano" piano (copy of ch 4 "Keyboard" epiano1)
// note: Full arrangement: all 59 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(60/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 · epiano1 · "Keyboard"
const epiano1 = note(`<
  A B C D E F G H I J K L@2 M N@2 O@3 P@3 E F G Q@3 R L@2 M N@2 O@3 S@3 T@3 U@4 V@6 W@6
>`.pickRestart({
  A: "[f#4,d#5] [f#4,c#5]", B: "[d#4,b4]@8 [d#4,a#4]@4 ~ d#4 f#4 b4", C: "[b3,e4,g#4]@2 f#4 b4, ~ [b3,d#4]",
  D: "[f#4,b4,c#5]@7 [f#4,a#4,c#5]@4 ~@2 f#4 c#4@2", E: "[b4,d#5] [c#5,f#5]",
  F: "[f#4,d#5] [e4,c#5] [d#4,b4] [e4,c#5]@4 [f#4,d#5] [d#4,b4]@4 [d#4,b4]@4", G: "[e4,g#4]@4 [b4,f#5,g#5]@3 ~",
  H: "[c#5,f#5]@12 f#5 c#5 f#4 c#5, b4 ~", I: "b4@2 [f#5,g#5] ~, d#5 ~@3 c#5@4", J: "b4@8 ~@5 d#4 b4@2, d5 ~@7 c#5@8",
  K: "[e4,g#4] ~ [b4,f#5]@2, b4 ~", // E B5
  L: "[b4@8 c#4@4 b4 a#4 f#4@2 [e4,g#4]@6 g#4@2 [c#4,f#4,a#4]@6 d#4 g#4, c#5, ~@6 d#4@9 ~, ~@8 b3@7 ~, ~@11 b4@5]/2", // E F#
  M: "[c#4,f#4]@2 f#4!2 d4 c#4!2 b3 [g#3,b3]@4 ~@2 b3 f#4", // F#5 G#m
  N: "[g#4@2 f#4@2 e4@8 c#5@4 a#4@2 g#4@2 f#4@8 ~@4 e5@4 d#5 ~ c#5 ~ b4@4 c#5@4 b4@2 [g#4,b4,d#5]@6 [f#4,a#4,c#5]@2 b4@2 b4@2 b4@2, b3@8 c#4@7 f#4@13 ~@4]/2", // G#m F#
  O: "[g#4@2 f#4@2 e4@8 c#5@4 a#4@2 g#4@2 f#4@8 ~@2 e4@2 d#4@2 f#4@2 g#4@2 d#4 ~ c#4 ~@3 c#4@4 [d#3,b3]@8 a#4@2 g#4@2 d#4@2 ~@2 [e3,c#4]@8 d#4@2 f#4@2 f#4@2 d#4@2 g#4@4 f#4@12, b3@24 ~@7 b3@9 [b3,e4]@8, ~@8 c#4@8 ~@5 g#3@2 ~@25]/3", // G#m C#m E5
  P: "[f#4@4 d#4 f#4!2 d#4 g#4 a#4 g#4 f#4 ~@2 [d#4,b4] [e4,c#5]@5 b4 f#4 d#5 f#5 [f#4,c#5]@8 [e4,g#4,b4]@4 [d#4,f#4,b4]@4 [f#4,g#4,b4]@2 f#4 b4 [b3,e4,g#4]@4, [b3,c#4]@2 ~@3 d#4@4 ~@3]/3", // G#m C#m F#5 E B G#m7 E Bsus2
  Q: "[[c#5,f#5]@24 ~@2 c#5@2 f#4@2 c#5@2 d#5@4 ~@2 d#5@2 f#5@3 ~@5 [f#5,f#6]@8 ~@8 d5@2 ~@4 d#5@2 ~@4 b5@3 ~ a#5@8 ~@2 d#4@2 b4@4, b4@4 ~@2 f#5@4 ~ b5@8 ~@5, ~@32 b4@16 g#5@24 g#5@7 ~@17, ~@3 c#5 b4 c#5]/3", // F#5 F#
  R: "[e4,g#4]@6 e5@2 g#5@3 ~ b5@3 ~ [b4,f#5]@16, b4 ~", // E B5
  S: "[f#4@4 d#4 f#4!2 d#4 g#4 a#4 g#4 f#4 ~@2 [d#4,b4] c#5@5 [d#4,b4]@2 f#4 ~ e5@2 d#5 e5 [b4,d#5,f#5]@2 ~@2 g#4@4 g#4@2 b4@2 c#5 b4@5 b4 a#4, [b3,c#4]@16 ~@14 e4@45 ~@5 [c#4,g4]@16, ~@23 d#5@3 ~@4 b4@8 ~@10, ~@12 [g4,b4]@2 ~@2 [a#4,c#5]@3 ~@5]/3", // G#m B Bsus2 C#dim G A#m
  T: "[c#5@4 ~@8 c#5 ~@3 [d#4,g#4,b4]@10 [d#4,g#4,b4]@6 ~@8 d#5@3 ~ c#5@3 ~ [g4,c#5] ~ b4 ~ g#4@4 ~@2 f#4@2 g#4@2 c#5@4 b4@6 c#5 ~ b4@2 g#4 ~@3 [d#4,g#4,b4]@12 [d#4,g#4,b4]@4, [d#4,g#4]@14 d#5@25 ~@57, ~ b4@3 ~@4 [c#4,b4,c#5]@3 ~@13]/3", // G#m Gdim G#m G#5 C#7
  U: "[[c#4,b4,c#5]@8 ~@8 d5 ~ c#5 ~ b4 ~ g#4@4 b4@2 a#4@3 ~ c#5@4 b4@4 ~@2 b4@2 ~@4 d5 ~ d5 ~ b4@2 ~@2 b4@4 a#4@3 ~ c#5@2 ~ b4@3 a#4@2 ~@2 c#5@2 ~ b4@2 ~ b4@2 ~ c#5@2 ~@2 b4@2 ~ a#4@2 ~ [e4,g#4]@6 b4@2 ~@2 d#5@2 ~ d#5@2 ~@2 b4@5 c#5 ~ d#5!2 ~ c#5 ~ b4 g#4@3 ~@2, ~@8 g#5@40 ~@45 c#5@3 ~@13 c#5@2 ~@17, ~@6 f#5@16 f#5@37 ~@5, ~@26 [c#4,g4]@6 [d#4,g#4]@8 ~@16 [d#4,g#4]@8 [e4,g#4]@13 ~@6 [e4,g#4]@7 ~@38]/4", // C#7 E C#dim G#5 E
  V: "[~@3 f#4@2 ~@2 g#4@2 ~ b4@3 [e4,g#4]@12 g#4@4 [c#4,f#4,a#4]@12 d#4@2 g#4@2 [c#4,f#4]@4 f#4@2 f#4@2 d4@2 c#4@2 c#4@2 b3@2 [g#3,b3]@8 ~@4 b3@2 f#4@2 g#4@2 f#4@2 e4@8 c#5@4 a#4@2 g#4@2 f#4@8 ~@4 e5@4 d#5 ~ c#5 ~ b4@4 c#5@4 b4@2 [g#4,b4,d#5]@6 [f#4,a#4,c#5]@2 b4@2 b4@2 b4@2 g#4@2 f#4@2 e4@8 c#5@4 a#4@2 g#4@2 f#4@8 ~@2 e4@2 d#4@2 f#4@2 g#4@2 d#4 ~ c#4 ~@3 c#4@4 [d#3,b3]@3, ~@13 c#5@32 ~@147, ~@13 [b3,d#4]@28 ~@36 b3@16 c#4@16 ~@32 b3@48 ~@3, ~@25 b4@20 ~@62 f#4@26 ~@24 c#4@16 ~@10 g#3@4 ~@5]/6", // E F# F#5 G#m F# G#m B
  W: "[~@5 a#4@2 g#4@2 d#4@2 b3@2 [e3,b3,c#4]@8 d#4@2 f#4@2 f#4@2 d#4@2 g#4@4 f#4@8 ~@4 [e4,f#4]@8 d#4@2 f#4@2 f#4@2 d#4@2 g#4@2 a#4@2 g#4@2 f#4@2 ~@4 [d#4,b4]@2 [e4,c#5]@10 [d#4,b4]@2 f#4@2 d#5@2 ~@2 [f#4,c#5]@16 [e4,g#4,b4]@8 [d#4,f#4,b4]@8 [f#4,g#4,b4]@4 f#4@2 b4@2 [b3,e4,g#4]@8 ~@2 f#4@30 ~@19, ~@29 [b3,e4]@16 ~@16 [b3,e4]@8 ~@22 f#5@38 ~@12 a#3@32 ~@19, ~@142 [c#4,d#4]@31 ~@19]/6", // C#m7 Esus2 G#m C#m G#m F#5 E B …
})).s("gm_epiano1").gain(0.51).pan(0.6)

// bass · fretless bass · "Bass"
const bass = note("<~@18 A B ~ C D E F G H I J K L M L N O P A Q R S T S U S V W X Y@8 Z@4>".pickRestart({
  A: "c#2@7 c#2 ~@5 c#3 g#2 c#2, ~@8 c#2@7 ~", B: "f#2@11 ~@21", C: "~@7 c#3", D: "b2@6 ~ b2 a#2@6 f#2 a#2",
  E: "g#2@7 g#2 f#2@6 d#2@2", F: "c#2@6 ~ c#2 d#2@6 c#2 d#2", G: "f#2@6 ~ f#2 f#2@8", H: "b2@6 ~ b2 a#2@5 a#2 f#2 a#2",
  I: "g#2@6 ~ g#2 f#2@6 f#2 d#2", J: "c#2@6 ~ c#2 d#2@5 d#2 c#2 d#2", K: "f#2@6 ~ f#2 f#2@4 g#2@4",
  L: "e2@6 ~ e2 f#2@5 f#2 d#2 f#2", M: "d#2@6 ~ d#2 g#2@5 f#2@3", N: "g2@6 ~ g#2 ~ a2@3 f#2!2 g#2 f#2",
  O: "e2@6 ~ e2 f#2@8", P: "g2@8 f#2@6 g2 d#2", Q: "f#2@6 ~ f#2 f#2@4 g#2!2 f#2@2", R: "b1@6 ~ b1 c#2@4 d#2@4",
  S: "d#2@6 ~ d#2 d#2@5 d#3 d#2 a#2", T: "g#2@6 ~ d#2 g#2 a#2 b2@3 e2@3", U: "g#2@6 ~ d#2 b2 a#2 g#2@3 ~ e2@2",
  V: "g#2@12 ~@2 d#2@2 g#2@2 a#2@2 b2@4 e2@3 ~ g#2@3 ~",
  W: "c#2@2 ~ c#2@2 ~@2 c#2@2 ~ c#2@6 ~@3 c#2@3 ~ c#2@2 ~ c#2@2 ~ c#2@2 ~",
  X: "d#2@2 ~ e2@2 ~ f#2@10 ~@3 f#2@2 f#2@6 ~@5",
  Y: "[~@13 e2@12 ~@2 e2@2 f#2@10 f#2@2 d#2@2 f#2@2 d#2@12 ~@2 d#2@2 g#2@10 f#2@6 e2@12 ~@2 e2@2 f#2@10 f#2@2 d#2@2 f#2@2 g2@12 ~@2 g#2@2 ~@2 a2@6 f#2@2 f#2@2 g#2@2 f#2@2 e2@12 ~@2 e2@2 f#2@16 g2@16 f#2@12 g2@2 d#2@2 c#2@12 ~@2 c#2@2 c#2@10 c#3@2 g#2@2 c#2@2 f#2@12 ~@2 f#2@2 f#2@3]/8",
  Z: "[~@5 f#2@8 b2@16 a#3@16 c#3@8 d#3@8 e3@8 e2@2 d#2@2 c#2@4 b1@32 ~@19]/4",
})).s("gm_fretless_bass").gain(0.51)

// chords · string ensemble 2 · "Orchestra"
const string_ensemble_2 = note("<~@21 A B C D E B C D F G@2 H@2 I@3 J K@6 L@3 M@4 N@5 ~@3>".pickRestart({
  A: "c#4 d#4 e4@2", B: "b4 a#4", C: "g#4 f#4", D: "c#4 d#4", E: "f#4!2", F: "f#4@2 f#4 g#4",
  G: "[[e4,g#4,b4]@2 c#4@2 [b3,d#4]@2 [g#4,b4,d#5] [b4,c#5,f#5], ~ [f#4,a#4]@2 ~]/2", // E B G#m Bsus2 F#
  H: "[[e4,g#4,b4]@2 c#4@2 e5 ~ [g#4,b4,d#5] [b4,c#5,f#5], ~ [f#4,a#4]@2 ~]/2", // E G#m Bsus2 F#
  I: "[[e4,g#4,b4]@2 c#4@2 ~@2 [b4,d#5] ~ c#4@4, ~ [f#4,a#4]@2 g#4@3, ~ e5@2]/3", J: "[f#4,a#4]",
  K: "[[d#4,f#4,b4]@2 [e4,g#4,c#5] b4 a#4@4 [g#4,b4]@4 [f#4,a#4]@4 [g#4,b4]@4 [f#4,a#4]@4, ~ d#4@7, ~@3 f#4@5 ~@16]/6", // B C#m G#m F# G#m F#
  L: "[b4@16 c#4@13 ~@6 b4@13, g#4, ~ e4@2]/3",
  M: "[~@13 [e4,g#4,b4]@16 c#4@16 [b3,d#4]@16 [g#4,b4,d#5]@8 [b4,c#5,f#5]@8 [e4,g#4,b4]@16 c#4@16 e5@8 ~@8 [g#4,b4,d#5]@3, ~@29 [f#4,a#4]@32 ~@32 [f#4,a#4]@32 ~@3]/4", // E B G#m Bsus2 E G#m F#
  N: "[~@5 [b4,c#5,f#5]@8 [e4,g#4,b4]@16 c#4@16 ~@16 [b4,d#5]@8 ~@8 c#4@32 [f#4,a#4,c#5]@32 ~@19, ~@29 [f#4,a#4]@32 g#4@48 ~@51, ~@45 e5@64 ~@51]/5", // Bsus2 E B F#
})).s("gm_string_ensemble_2").gain(0.36).pan(0.2)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@12 A B A C A D E F G H I J K L I J K M I J K L I J K M N O P O P O P Q R S@4 T@8
>`.pickRestart({
  A: "e4 f#4", B: "d#4@2 g#4 f#4", C: "g4@2 g#4 f#4", D: "g4 g#4", E: "c#5", F: "f#5", G: "~ a#4, b4",
  H: "c#5 d#5 e5@2", I: "b4 a#4", J: "g#4 f#4", K: "c#4 d#4", L: "f#4", M: "f#4@2 ~ g#4", N: "b4@2 c#5 d#5", O: "d#5",
  P: "g#5", Q: "c#5@13 ~@3", R: "~@3 e5@13",
  S: "[~@29 f#5@16 d#5@16 g#5@8 f#5@8 e5@16 f#5@16 g#5@16 g#5@3, ~@13 e5@32 ~@83]/4",
  T: "[~@5 f#5@8 e5@16 f#5@16 g#5@32 c#5@32 f#4@32 b4@16 a#4@16 c#5@8 b4@8 e4@16 b4@32 ~@19]/8",
})).s("gm_string_ensemble_1").gain(0.51).pan(0.9)

// other · acoustic guitar steel · "guitar"
const acoustic_guitar_steel = note("<~@40 A B C B D E F G@4 H@8>".pickRestart({
  A: "~@7 d#4 g#4 a#4 b4@3 e4@2 ~", B: "d#4 ~@3", C: "~@14 d#4@2 b4@2 a#4@2 b4@6 ~@2 e4@3 ~", D: "g#4@11 ~@5",
  E: "c#4@2 ~ c#4@2 ~@2 c#4@2 ~ c#4@6 ~@3 c#4@3 c#4@2 ~@2 c#4@2 ~ c#4@2 ~", F: "d#4@2 ~ e4@2 ~@2 f#4@10 ~@15",
  G: "[~@29 f#5@16 d#5@16 g#5@8 f#5@8 e5@16 f#5@16 g#5@16 g#5@3, ~@13 e5@32 ~@83]/4",
  H: "[~@5 f#5@8 e5@16 f#5@16 g#5@32 c#5@32 f#4@32 b4@16 a#4@16 c#5@8 b4@8 e4@16 b4@32 ~@19]/8",
})).s("gm_acoustic_guitar_steel").gain(0.26).pan(0.3)

// drums · kick
const kick = s("bd").struct("<~@21 A B C@15 D C@6 E ~ F@9 ~@3>".pickRestart({
  A: "~@7 x", B: "x ~@6 x!2 ~@7", C: "~@7 x!2 ~@7", D: "~@8 x!2 ~@6",
  E: "x ~@2 x ~@2 x ~@3 x ~@8 x ~@2 x ~@3 x ~@2 x ~@2", F: "~@27 x ~ x ~@2",
})).gain(0.51)

// drums · rim
const rim = s("rim").struct("<~@23 x!7 ~ x ~@13 [x ~@2 x ~@2 x ~@3 x ~@8 x ~@2 x ~@3 x ~@2 x ~@2] ~@13>").gain(0.51)

// drums · snare
const snare = s("sd").struct("<~@30 A ~ A@6 B A@2 ~@5 C ~@12>".pickRestart({
  A: "x", B: "x ~@8 x ~ x ~@4", C: "x ~@2 x ~@28",
})).gain(0.51)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@12 [~@7 x ~@8]!5 [~ x] [~@7 x ~@8]!2 ~ [~@11 x ~@4] ~@37>").gain(0.26)

// drums · clap
const clap = s("cp").struct("<~@46 x ~@12>").gain(0.51)

// drums · low tom
const low_tom = s("lt").struct("<~@21 [~@13 x ~@2] x ~@15 [~ x] ~@7 [~@6 x ~@12 x ~ x ~@10] ~@12>").gain(0.51)

// drums · hihat
const hihat = s("hh").struct("<~@46 [~@6 x ~@12 x ~ x ~@10] ~@12>").gain(0.51)

// drums · mid tom
const mid_tom = s("mt").struct("<~@21 [~@9 x!2 ~@5] x ~@15 [~@2 x ~@2 x ~@10] ~@20>").gain(0.51)

// drums · high tom
const high_tom = s("ht").struct("<~ A ~@2 A ~ A ~ A ~ A@2 B@5 A B@2 C D ~@16 E ~@20>".pickRestart({
  A: "~@11 x ~@4", B: "~@5 x ~@2", C: "~@5 x ~@10", D: "~@2 x!2", E: "~@3 x!2 ~@11",
})).gain(0.41)

// drums · china
const china = s("cr").struct("<~ A ~@2 A@18 B C@15 D C@6 ~ E F G@9 H ~>".pickRestart({
  A: "x", B: "x ~@6 x", C: "~@7 x", D: "~@7 x ~@3 x ~@2 x ~", E: "~@3 x ~@28", F: "~@5 x ~@10", G: "~@9 x ~@22",
  H: "~@13 x ~@18",
})).gain(0.51)

// drums · ride bell
const ride_bell = s("rd").struct("<~@21 [~@15 x] ~@16 [~@5 x!2 ~] ~@20>").gain(0.51)

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

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@22 [x!4]!8 ~@29>").gain(0.26)

// drums · congas
const congas = s("conga:33").struct("<~ A ~@2 A ~ A ~ A ~ A@2 B@5 A B@2 C ~@38>".pickRestart({
  A: "~@5 x!2 ~", B: "~@9 x ~ x ~@4", C: "~@2 x!2 ~@4",
})).gain(1.31)

stack(
  epiano1, bass, string_ensemble_2, string_ensemble_1, acoustic_guitar_steel, kick, rim, snare, snare_soft, clap,
  low_tom, hihat, mid_tom, high_tom, china, ride_bell, tambourine, tambourine_soft, congas
)

More by Mariah Carey