Strudelify

Sing It to You

Lavinia Jones

KeyD majorTempo120 bpm
0:00/0:00
// Sing It to You — Lavinia Jones
// 120 bpm, 4/4, key D major. 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 104 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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 · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  ~@8 A B C D A B C D E F E F E F E F E F E F A B C D A B C D G H I J K L M L E F E F E F E F A B C D A B C D G H I J K
  L M L E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F E F
>`.pickRestart({
  A: "b1@3 ~ b1@2 ~ b1@3 b1@2 ~@2 b1@2", B: "g1@3 ~ g1@2 ~ g1@2 ~ g1@2 ~@2 g1 ~",
  C: "a1@2 ~@2 a1@2 ~ a1@2 ~ a1@2 ~@2 a1@2", D: "a1@2 ~@2 a1@2 ~ a1@2 ~ a1@2 ~@2 a1 ~",
  E: "b0@2 ~@2 b0@3 ~ d1@3 d1 ~@2 d1@2", F: "f#1@2 ~@2 f#1@2 ~@2 c2@3 c2@3 c2@2",
  G: "f#1@3 ~ f#1@2 ~ f#1@3 f#1@2 f#1@2 f#1@2", H: "f1@3 ~ f1@2 ~ f1@3 f1@2 f1@2 f1@2",
  I: "e1@3 ~ e1@2 ~ e1@3 e1@2 e1@2 e1@2", J: "d#1@3 ~ d#1@2 ~ d#1@3 d#1@2 d#1@2 d#1@2",
  K: "d1@3 ~ d1@2 ~ d1@3 d1@2 d1@2 d1@2", L: "a1@3 ~ a1@2 ~ a1@3 a1@2 a1@2 a1@2",
  M: "b0@3 ~ b0@2 ~ b0@3 b0@2 b0@2 b0@2",
})).s("gm_synth_bass_2").gain(0.35)

// chords · pad halo · "HALO PAD"
const pad_halo = note("<A@2 B@2 C@4 A@2 B@2 C@4 ~@12 D@2 E@2 F@4 ~@16 D@2 E@2 F@4 ~@44>".pickRestart({
  A: "[~ g3, [b3,d4,f#4]]/2", B: "[e4 ~ c#4@2, a3, d4 ~, ~@8 e4@23 ~]/2",
  C: "[b3@15 ~ [g3,b3]@16 e4@8 ~@8 c#4@16, d4@3 ~, f#4 a3, ~@5 e4@3]/4", D: "[~ g4, [b4,d5,f#5]]/2",
  E: "[e5 ~ c#5@2, a4, d5 ~, ~@8 e5@23 ~]/2", F: "[b4@15 b4 g4@16 e5@8 ~@8 c#5@16, d5@3 ~, f#5 a4, ~@5 e5@3]/4",
})).s("gm_pad_halo").gain(0.09).pan(0.4)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  A@4 B@4 A@4 B@4 C D E F C D E F C D E F G@4 B@4 H I J K L M N O C D E F C D E F G@4 B@4 P I J K L M N O C D E F C D E
  F C D E F C D E F C D E F C D E F C D E F C D E F C D E F
>`.pickRestart({
  A: "[~@16 g3@15 ~@17 c#4@16, d4@3 ~, [b3,f#4] [a3,e4]]/4", B: "[~@8 g3@7 ~@9 c#4@8, d4@3 ~, [b3,f#4] [a3,e4]]/4",
  C: "[b4,d5,f#5]@8 [d5,f#5,a5]@7 ~", D: "[a4,c#5,e5]@7 ~ [c5,e5,g5]@7 ~", E: "[b4,d5,f#5]@7 ~ [d5,f#5,a5]@7 ~",
  F: "[a4,c#5,e5]@7 ~ [c5,e5,g5]@6 ~@2", G: "[~@16 g3@15 ~@15 c#4@17 ~, d4@3 ~, [b3,f#4] [a3,e4]]/4",
  H: "[a3,c#4,f#4]@7 ~", I: "[a3,c#4,f4]", J: "[a3,c#4,e4]", K: "[a3,c#4,d#4]", L: "[c#4,d4,f#4]", M: "[c#4,e4,g#4]",
  N: "[f#4,a4,b4,e5]", O: "[f#4,g4,b4,d5]", P: "[a3,c#4,f#4]",
})).s("gm_synth_strings_1").gain(0.06).pan(0.6)

// other · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note(`<
  ~@10 A@2 ~@2 B C ~@8 D E@3 ~@6 F G ~@12 D E@3 ~@2 D H@2 ~ F G ~@16 I J@3 I J@3 ~@16 D E@3
>`.pickRestart({
  A: "[~@10 e3@2 a3@2 e3 b3@2 e3 a3@2 [e3,b3]@2 e3 a3@2 e3 b3@2 e3@2 a3@2]/2", // E5
  B: "~@2 a3@2 e4@2 a3 f#4@2 a3 e4@2 a3@2 f#4@2", C: "a3@9 ~@7", D: "~ b3 e4@2 f#4 b3 e4 f#4@2 e4@2 f#4@2 e4 ~ f#4",
  E: "[~ b3 e4@2 f#4 b3 e4 f#4@2 e4@2 f#4@2 a4@2 f#4@2 b3 e4@2 f#4 b3 e4 f#4@2 e4@2 f#4@2 e4@2 f#4@2 b3 e4@2 f#4 b3 e4 f#4@2 e4@2 f#4@2 a4@2 f#4]/3",
  F: "~@4 e4 a3 d4 e4 ~ [a3,d4] ~@2 e4@2 d4 ~", G: "e4@2 a3!2 e4 a3 d4 e4 ~@2 d4 ~ f#4@2 g4@2",
  H: "[~ b3 e4@2 f#4 b3 e4 f#4@2 e4@2 f#4@2 a4@2 f#4@2 ~@15]/2", I: "~ b3 e4@2 f#4 ~ e4 f#4@2 e4@2 f#4@2 e4 ~ f#4",
  J: "[~ b3 e4@2 f#4 ~@2 f#4@2 e4@2 f#4@2 a4@2 f#4@2 ~ e4@2 f#4 ~ e4 f#4@2 e4@2 f#4@2 e4@2 f#4@2 ~ e4@2 f#4 ~@2 f#4@2 e4@2 f#4@2 a4@2 f#4]/3",
})).s("gm_acoustic_guitar_nylon").gain(0.23)

// other · acoustic guitar nylon · "NYLON GTR" · soft notes
const acoustic_guitar_nylon_2 = note("<~@76 A B C D A B C D ~@20>".pickRestart({
  A: "~@5 b3 ~@10", B: "~@5 b3 e4 ~@9", C: "~ b3 ~@3 b3 ~@10", D: "~ b3 ~@3 b3 e4 ~@9",
})).s("gm_acoustic_guitar_nylon").gain(0.13)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@36 A@4 B@4 ~@16 A@4 B@4 ~@28 C@2 D@2 ~@4>".pickRestart({
  A: "[e6@59 f#6@4 ~]/4", B: "a5/4", C: "b5/2", D: "d6/2",
})).s("gm_string_ensemble_2").gain(0.07)

// chords · piano · "A.PIANO 2"
const piano = note(`<
  ~@20 A B A B A B A B ~@16 A B A B A B A B ~@16 A B A B A B A B ~@8 C B A B A B A B A B A B A B A B A B A B
>`.pickRestart({
  A: "~@2 [b3,d4,f#4]@2 ~ [b3,f#4]@2 ~ [d4,f#4,a4]@2 ~ [d4,f#4,a4]@2 ~ [d4,f#4,a4] ~, ~@5 d4 ~@10", // Bm B5 D
  B: "~@2 [a3,e4]@2 ~ [a3,c#4] ~@2 [c4,e4,g4]@2 ~ [c4,g4]@2 ~ [e4,g4]@2, ~@2 c#4 ~@2 e4@2 ~@4 e4 ~@2 c4 ~", // A5 A C C5 Em
  C: "~@2 [b3,d4,f#4]@2 ~ [b3,d4,f#4]@2 ~ [d4,f#4,a4]@2 ~ [d4,f#4,a4]@2 ~ [d4,f#4,a4] ~", // Bm D
})).s("gm_piano").gain(0.22)

// chords · piano · "A.PIANO 2" · soft notes
const piano_soft = note(`<
  ~@20 A B A B A B A B ~@16 A B A B A B A B ~@16 A B A B A B A B ~@9 C ~@2 A B A B ~ C ~@2 A B A B A B A B
>`.pickRestart({
  A: "~@2 [a4,c#5]@2 ~ c#5@2 ~ [c#5,e5]@2 ~ [c#5,e5]@2 ~ [c#5,e5] ~, ~@5 a4 ~@10", // A C#m
  B: "~@2 b4@2 ~ b4@2 ~ [b4,d5]@2 ~ d5@2 ~ [b4,d5]@2, ~@2 g#4 ~@2 g#4 ~@5 b4 ~@4", C: "~@2 g#4 ~@2 g#4 ~@10",
})).s("gm_piano").gain(0.15)

// drums · kick
const kick = s("bd").struct("<~@16 [x!4]!60 ~@4 [x!4]!23 [x!3 ~]>").gain(0.66)

// drums · snare
const snare = s("sd").struct("<~@19 A B@23 C B@23 C D E D E D E D E ~@11 F D E D E D E D E D E D E B@3 G>".pickRestart({
  A: "~@12 x ~ x!2", B: "~@4 x ~@2 x ~@4 x ~@3", C: "~@4 x ~@4 x ~@2 x ~ x!2", D: "~@2 x ~ x ~ x!2 ~ x ~@2 x ~@2 x",
  E: "~@2 x ~ x ~@2 x ~@4 x ~@2 x", F: "~@10 x ~ x ~ x!2", G: "~@4 x ~@2 x ~@8",
})).gain(0.33)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@21 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@33 A ~ A
>`.pickRestart({
  A: "~ x ~@6",
})).gain(0.2)

// drums · hihat
const hihat = s("hh").struct("<~@8 [x!4]!68 ~@8 [x!4]!19 [x!3 ~]>").gain(0.33)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@8
  [~ x ~@3 x ~@3 x ~@3 x ~@2]!68
  ~@8
  [~ x ~@3 x ~@3 x ~@3 x ~@2]!19
  [~ x ~@3 x ~@3 x ~@6]
>`).gain(0.13)

// drums · open hat
const open_hat = s("oh").struct("<~@8 [~ x ~ x ~ x ~ x]!68 ~@12 [~ x ~ x ~ x ~ x]!15 [~ x ~ x ~ x ~@2]>").gain(0.26)

// drums · triangle
const triangle = s("triangles:35").struct(`<
  ~@8
  [x ~ x ~@2 x ~ x!2 ~ x ~@2 x ~@2]!68
  ~@8
  [x ~ x ~@2 x ~ x!2 ~ x ~@2 x ~@2]!19
  [x ~ x ~@2 x ~ x!2 ~ x ~@5]
>`).gain(2.29)

stack(
  bass, pad_halo, synth_strings_1, acoustic_guitar_nylon, acoustic_guitar_nylon_2, string_ensemble_2, piano, piano_soft,
  kick, snare, snare_soft, hihat, hihat_soft, open_hat, triangle
)