Strudelify

The Promise You Made

Cock Robin

KeyC majorTempo117 bpm
0:00/0:00
// The Promise You Made — Robin Cock
// 116.6 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 113 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(116.6/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 · fretless bass · "FRETLESS"
const bass = note(`<
  ~@2 A B C D E F G H A B C D A B C D@2 I J@2 F@2 G E F K L@2 M N K O P@3 M Q R S T U R S T U R S T U R S T U V W X Y Z
  AA X Y AB AC AB AD AE AB AC AF AG AF AH@2 R S T U R S T U V W X Y Z AA X Y AB AC AB AD AE AB AC AI@2 AJ@2 AK AL AM
  AN@2 R S AO D ~@2
>`.pickRestart({
  A: "a1", B: "g1", C: "f1", D: "c1", E: "a2", F: "g2", G: "f2", H: "c2", I: "b2", J: "a2/2", K: "f1 g1",
  L: "[e1 f1@2 g1]/2", M: "e1", N: "e2@3 b1 e2@2 e1@2", O: "e1 f1", P: "[c2@22 c1 d1]/3", Q: "e2 e1",
  R: "a1 ~@2 a1 a1@3 ~ a1!2 ~ a1 a1@2 e1 ~", S: "g1 ~@2 g1 g1@2 ~@2 g1!2 ~ g1 g1@2 e1 ~",
  T: "f1 ~@2 f1 f1@2 ~@2 f1!2 ~ f1 f1@2 f1!2", U: "c2 ~@2 c2 c2@2 ~@2 c2!2 ~ c2 c2@2 g1@2",
  V: "b1 ~@2 b1 b1@3 ~ b1!2 ~ b1 b1@2 g1 ~", W: "a1 ~@2 a1 a1@2 ~@2 a1!2 ~ a1 a1@2 g1 ~",
  X: "a1 ~@2 a1 a1@2 ~@2 a1!2 ~ a1 a1@2 a1 e1", Y: "g1 ~@2 g1 g1@2 ~@2 g1!2 ~ g1 g1@2 d1@2",
  Z: "g1 ~@2 g1 g1@3 ~ g1!2 ~ g1 g1@2 d1 ~", AA: "f1 ~@2 f1 f1@2 ~@2 f1!2 ~ f1 f1@2 g1 ~",
  AB: "f1@2 ~ f1!2 ~ f1@2 g1@2 ~ g1!2 ~ f1@2", AC: "e1@2 ~ e1!2 ~ e1@2 f1@2 ~ f1!2 ~ c1@2",
  AD: "e1@2 ~ e1 e1@2 e1@2 e1@2 ~ e1 e1@2 e1@2", AE: "e1@2 ~ e1 e1@2 b1@2 e2@3 b1 e2@2 e1@2",
  AF: "c2@2 ~ c2 c2@3 ~ c2@2 ~ c2 c2@2 g1 ~", AG: "c2@2 ~ c2 c2@2 ~@2 c2@2 ~ c2 c2@2 g1 ~",
  AH: "e1@2 ~ e1 e1@2 ~@2 e1@2 ~ e1 e1@2 ~@2", AI: "[c2@29 ~ g1@2]/2", AJ: "[c2@31 ~]/2",
  AK: "c2 ~@2 c2 c2@3 ~ c2!2 ~ c2 c2@2 c2 ~", AL: "c2 ~@2 c2 c2@2 ~@2 c2!2 ~ c2!2 ~ g1 ~",
  AM: "c2 ~@2 c2 c2@2 ~@2 c2!2 ~ c2 c2@2 d1 e1", AN: "e1 ~@2 e1 e1@2 ~@2 e1!2 ~ e1 e1@2 e1@2",
  AO: "f1 ~@2 f1 f1@2 ~@2 f1!2 ~ f1 f1@2 f1 e1",
})).s("gm_fretless_bass").gain(0.46)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note("<~@49 A B ~@2 A B ~@6 C D ~@26 C D ~@22>".pickRestart({
  A: "f4!5 ~@3 a4!5 ~@3", B: "c5!5 ~@11", C: "a4!5 ~@3 c5!5 ~@3", D: "b4!5 ~@11",
})).s("gm_lead_2_sawtooth").gain(0.15)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  A@3 B C D E@4 F@8 G H I@2 J@2 I@2 K L M@4 L N O@3 P@2 Q B R S Q B R S Q B R S Q B R S T U@2 H T U@2 H L M@4 L N O@3
  P@2 Q B R S Q B R S T U@2 H T U@2 H L M@4 L N V@4 B W B X@2 Y Z AA AB@3
>`.pickRestart({
  A: "[~@2 e4, a3, ~ c4@2]/3", B: "[g3,c4,e4]", C: "[f3,a3,c4]", D: "[e3,g3,c4]",
  E: "[[e3,a3] [e3,g3] [f3,a3] [e3,g3], c4]/4", F: "[a3 g3 [f3,a3] [e3,g3], c4, e3 ~]/4", G: "e4 f4, [e3,g3]",
  H: "[b3,d4,g4]", I: "[f4 e4, [a3,c4]]/2", J: "[g3,b3,d4]/2", K: "[g3,b3,d4]", L: "[c4,f4,a4] [d4,g4,b4]",
  M: "[[b3,e4,g4] [c4,f4,a4]@2 b4@3 c5 d5, ~@3 [d4,g4]@5]/4", N: "[b3,e4,g4] [c4,f4,a4]", O: "[g3 g#3 g3, [c3,c4]]/3",
  P: "[b3@2 c4 d4, [e3,g#3]]/2", Q: "[a3,c4,e4]", R: "[f3,c4,f4,a4]", S: "[e3,g3,e4,g4,c5]", T: "[b3,d4,g4]@15 ~",
  U: "[f4@16 e4@15 ~, [a3,c4]@31 ~]/2", V: "[g3 g#3 g3 g#3, c4, c3@3 ~]/4", W: "[g#3,c4,e4]", X: "[g#3,b3,e4,e5]/2",
  Y: "[a4,c5,e5]", Z: "[g4,c5,e5]", AA: "[a4,c5,f5]", AB: "[c1,e5,g5,c6]/3",
})).s("gm_synth_strings_1").gain(0.42)

// chords · electric guitar clean · "+CHORUS GT"
const electric_guitar_clean = note(`<
  ~@3 A@3 ~ A@3 ~ A@3 ~ A@3 ~@22 A@3 ~ A@3 ~@2 B C ~@2 B C D E@3 D F G H ~@6 I@5 ~@2 A@3 ~ A@3 D J@3 D F G H ~@16 K L M
  N@2 ~
>`.pickRestart({
  A: "[~@15 [g3,c4]@14 ~@3 c4@16, ~@14 [c3,f3]@15 ~ c3@18, ~@31 [e3,g3]@17]/3", B: "g2 b2", C: "d3@15 ~",
  D: "d3@3 g3@3 d4@8 g3@2", E: "[c3 g3 c4@14]/3", F: "c3@3 g3@3 c4@10", G: "e4@11 ~ e4@4", H: "f4@13 ~@3",
  I: "[~@16 g4@15 ~ g#4@15 ~@13 c3@8 ~@12, ~@15 [c4,e4]@16 [c4,e4]@16 [c4,e4]@17 ~@16, ~@3 g4 ~]/5", // C
  J: "[c3@3 g3@3 ~@10 e4@11 ~ f4@2 e4@2 d4@16, ~ c4@7]/3", K: "a3@2 ~ a3 ~@2 c4@6 g4@3 ~",
  L: "g3@2 ~ g3 ~@2 c4@5 ~ b3@4", M: "a3 f3", N: "g3/2",
})).s("gm_electric_guitar_clean").gain(0.52)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~@6 A@12 B C@8 ~@30 D E ~@4 F G F H@2 F G ~@15 D E ~@4 F G F H@2 F G ~@9 I J ~@4
>`.pickRestart({
  A: "c4!16", B: "[c4,e4] c4!2 [c4,e4] c4 [c4,e4] [c4,f4] c4!2 [c4,f4] c4 [c4,f4]!2 c4 [c4,f4]!2", C: "g4!16",
  D: "e4!2 ~ e4!2 ~@11", E: "d4!2 ~ d4!2 ~@11", F: "a3 ~ a3!2 ~ a3!3 b3 ~ b3!2 ~ b3!3",
  G: "g3 ~ g3!2 ~ g3!3 a3 ~ a3!2 ~ a3 g3!2", H: "g3 ~ g3!2 ~ g3!4 ~ g3!2 ~ g3!3", I: "a4 ~@2 a4!2 ~@11",
  J: "g4 ~@2 g4!2 ~@11",
})).s("gm_electric_guitar_muted").gain(0.36).pan(0.6)

// other · distortion guitar · "DISTORTION"
const distortion_guitar = note(`<
  ~@39 A B C D A B E F ~@2 G H ~@2 G H I J@2 ~ I K L@2 ~@6 M@4 N@2 O P@3 O P@3 I K Q R I K L@2 ~@10 S@6 T U V W@2 ~
>`.pickRestart({
  A: "a4 ~@2 a4 ~@2 c5@6 g5@4", B: "g4 ~@2 g4 ~@2 c5@6 b4@3 ~", C: "b4@6 c5@5 ~ d5@4", D: "c5@7 ~",
  E: "b4@6 c5@5 ~ g5@4", F: "g4", G: "a2 c3", H: "e3", I: "d3@3 g3@3 d4@8 g3@2", J: "[c3@3 g3@3 c4@26]/2",
  K: "c3@3 g3@3 c4@9 ~", L: "[e4@11 ~ e4@3 f4@16 ~]/2",
  M: "[~@16 g4@15 ~ g#4@15 ~@13 c3@4, ~@15 [c4,e4]@16 [c4,e4]@16 [c4,e4]@17, ~@3 g4]/4", N: "[e2@7 ~]/2",
  O: "a4@2 ~ a4 ~@2 c5@10", P: "[g5@6 e5 c5@8 a4@10 ~ a4@2 g5@19 ~]/3", Q: "e4@6 f4 e4", R: "d4",
  S: "[~@16 c5@3 g4@2 e4@2 ~ c4@7 ~ c5@3 g#4@2 e4@2 ~ c4@7 ~ c5@2 ~ g4@2 e4@2 ~ c4@7 ~@5 g#4@4 e4@3 b3@4 ~ b4@16, ~@15 [e3,g3]@15 ~ [e3,g#3]@15 ~ [e3,g3]@15 ~ [e2,e3,g#3]@33, ~@16 c4@7 ~@9 c4@8 ~@8 c4@7 ~@9 b3@11 ~@21]/6", // Em E Em E
  T: "a3@2 ~ a3 ~@2 c4@6 g4@3 ~", U: "g3@2 ~ g3 ~@2 c4@5 ~ b3@4", V: "[a2,a3] [f2,f3]", W: "[g2,g3]/2",
})).s("gm_distortion_guitar").gain(0.6).pan(0.4)

// other · woodblock · F
const woodblock = note("<~@2 [f3 ~@2 f3 [f3,f5] ~ e1!2 f3!2 ~ f3 [f3,f5] ~ e1!2]!108 ~@3>")
  .s("gm_woodblock").gain(0.35).pan(0.6)

// other · glockenspiel · "GLOCKENSPL"
const glockenspiel = note("<~@7 [~@6 e8!3 ~ a7!3 f#7!3] ~@105>").s("gm_glockenspiel").gain(0.1)

// drums · kick
const kick = s("bd").struct(`<
  ~@2 A@24 B A@19 C A@3 C A@3 C A@12 C A@2 D A E A@9 C A@12 C A@5 C F A F@3 A@3 G ~@2
>`.pickRestart({
  A: "x!4", B: "x!2", C: "x ~ x ~ x ~ x!2", D: "x ~@3 x ~@3 x ~@2 x ~@4", E: "x ~@3 x ~@3 x ~@2 x ~@2 x ~",
  F: "x ~@3 x ~@3 x ~@2 x!2 ~ x ~", G: "x",
})).gain(0.59)

// drums · snare
const snare = s("sd").struct("<~@38 [~@3 x] [~ x ~ x]!59 ~@3 [~@3 x] [~ x ~ x]!8 ~@3>").gain(0.59)

// drums · low tom
const low_tom = s("lt").struct("<~@38 A ~@23 B ~@11 C ~@7 D ~@7 B ~@15 E ~@6>".pickRestart({
  A: "~@3 x", B: "~@15 x", C: "~@6 x!2 ~@6 x ~", D: "~@7 x", E: "~@8 x ~@2 x ~@2 x!2",
})).gain(0.52)

// drums · hihat
const hihat = s("hh").struct("<~@27 [x!16]!83 ~@3>").gain(0.2)

// drums · mid tom
const mid_tom = s("mt").struct("<~@62 A ~@11 B ~@7 C ~@7 A ~@15 D ~@6>".pickRestart({
  A: "~@7 x", B: "~@8 x!4 ~ x ~@2", C: "~@11 x ~ x ~@2", D: "~@2 x!2 ~ x!2 ~@5 x ~@3",
})).gain(0.52)

// drums · high tom
const high_tom = s("ht").struct("<~@74 [~@3 x] ~@7 [~@3 x] ~@30>").gain(0.46)

// drums · crash
const crash = s("cr").struct(`<
  ~@39 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@4 A ~@6 A ~@7 A ~@3 A ~@3 A ~@4 A ~@5 A ~@4 A ~ B A ~@2
>`.pickRestart({
  A: "x", B: "x!2",
})).gain(0.39)

// drums · bongos
const bongos = s("bongo:4").struct("<~@98 [~@8 x!2 ~@2 x!2 ~@2] [~@8 x!2 ~@2 x ~@3] [~@12 x!2 ~@2] ~@12>").gain(1.04)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<~@98 [~@7 x ~@3 x ~@4] [~@6 x!2 ~@8] [~@10 x!2 ~@4] ~@12>").gain(1.04)

// drums · shaker
const shaker = s("sh").struct("<~@27 [x!16]!83 ~@3>").gain(0.13)

stack(
  bass, lead_2_sawtooth, synth_strings_1, electric_guitar_clean, electric_guitar_muted, distortion_guitar, woodblock,
  glockenspiel, kick, snare, low_tom, hihat, mid_tom, high_tom, crash, bongos, bongos_2, shaker
)