Strudelify

Blue Velvet

Bobby Vinton

KeyB♭ majorTempo80 bpm
0:00/0:00
// Blue Velvet — Bobby Vinton
// 80 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 45 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(80/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 · piano
const piano = note(`<
  A B C D E C F G H I C D J C K J L C M N C O P Q R I C D J C K J L C M S H T H T H T H T U
>`.pickRestart({
  A: "[bb3,eb4,g4]@4 [b3,d4] [c4,eb4] [g4,bb4]@4 [d4,gb4] [eb4,g4]", B: "[bb4,d5] [ab4,b4] [a4,c5] [eb5,g5]@9",
  C: "[f5,bb5,d6]!12", D: "[f5,a5,d6]!12", E: "[eb5,g5,c6]!6 [f5,a5,c6]!6", F: "[eb5,g5,c6]!12", G: "[f5,a5,c6]!12",
  H: "[f5,bb5,d6]!6 [g5,b5,d6]!6", I: "[g5,c6,eb6]!6 [f5,a5,c6]!6", J: "[eb5,g5,bb5]!6 [f5,a5,c6]!6",
  K: "[eb5,g5,bb5]!12", L: "[f5,ab5,c6]!12", M: "[g5,bb5,eb6]!12", N: "[gb5,bb5,eb6]!12", O: "[f5,ab5,d6]!12",
  P: "[g5,bb5,d6]!12", Q: "[gb5,bb5,db6]!12", R: "[f5,a5,d6]!6 [e5,g5,bb5]!6", S: "[f5,a5,db6]!12",
  T: "[g5,c6,eb6]!6 [a5,c6,f6]!6", U: "[f5,bb5,d6]!2 ~@10",
})).s("gm_piano").gain(0.39)

// other · string ensemble 1 · "STRING FILLS"
const string_ensemble_1 = note("<A B C ~@18 D E ~ F G H ~@6 I J K L M L N L M L N O>".pickRestart({
  A: "[g2,bb2,eb3,g3,g4]@4 [d2,b2,d3,d4] [eb2,c3,eb3,eb4] [bb2,g3,bb3,bb4]@4 [gb2,d3,gb3,gb4] [g2,eb3,g3,g4]", // Eb G Cm Eb D Cm
  B: "[d3,bb3,d4,d5] [b2,ab3,b3,b4] [c3,a3,c4,c5] [g3,eb4,g4,g5]@9", C: "[bb4,d5,f5]",
  D: "~@12 [bb3,bb4] [a3,a4] [bb3,bb4] [c4,c5] [d4,d5] [eb4,eb5] [f4,f5] [e4,e5] [f4,f5] [g4,g5] [a4,a5] [bb4,bb5]", // Bb A Bb C D Eb F E …
  E: "[eb4,eb5]", F: "[c5,c6] [bb4,bb5]", G: "[bb4,bb5]@5 [c5,c6] [a4,a5]@3 [f4,f5]@3", H: "bb4, bb5@11 ~",
  I: "[bb2,bb3] [a2,a3] [bb2,bb3] [c3,c4] [d3,d4] [eb3,eb4] [f3,f4] [e3,e4] [f3,f4] [g3,g4] [a3,a4] [bb3,bb4] [c4,c5] [b3,b4] [c4,c5] [d4,d5] [eb4,eb5] [f4,f5] [g4,g5] [f4,f5] [g4,g5] [a4,a5] [bb4,bb5] [c5,c6]", // Bb A Bb C D Eb F E …
  J: "[bb4,bb5]", K: "[db5,db6]", L: "[bb2,bb4,bb5]@4 [c3,c5,c6] [d3,d5,d6] [g2,g4,g5]@4 [a2,a4,a5] [bb2,bb4,bb5]",
  M: "[c3,c5,c6]@4 [d3,d5,d6] [eb3,eb5,eb6] [f3,f5,f6]@6", N: "[c3,c5,c6]@4 [d3,d5,d6] [eb3,eb5,eb6] [f2,f4,f5]@6",
  O: "[bb2,bb4,bb5] ~@2", // Bb
})).s("gm_string_ensemble_1").gain(0.38).pan(0.4)

// chords · string ensemble 1 · "STRING CHORDS"
const string_ensemble_1_2 = note(`<
  ~@2 A B C A D E F C A B C A G@2 H A I J A K I J L M A B C A N@2 O P Q R S T S M S T S T U
>`.pickRestart({
  A: "[d4,f4,bb4]", B: "[d4,f4,a4]", C: "[c4,eb4,g4] [c4,f4,a4]", D: "[c4,eb4,g4]", E: "[c4,f4,a4]",
  F: "[d4,f4,bb4] [d4,g4,bb4]", G: "[[c4,eb4,g4]@3 [c4,f4,a4]]/2", H: "[c4,f4,ab4]", I: "[eb4,g4,bb4]",
  J: "[eb4,gb4,bb4]", K: "[d4,f4,ab4]", L: "[d4,f4,a4] [e4,g4,bb4]", M: "[eb4,g4,c5] [c4,f4,a4]",
  N: "[[eb4,g4,c5]@3 [f4,a4,c5]]/2", O: "[f4,ab4,c5]", P: "[f4,bb4,d5]", Q: "[g4,bb4,eb5]", R: "[f4,a4,db5]",
  S: "[f4,bb4,d5] [g4,b4,d5]", T: "[eb4,g4,c5] [f4,a4,c5]", U: "[f4,bb4,d5] ~",
})).s("gm_string_ensemble_1").gain(0.45).pan(0.6)

// chords · electric guitar clean · "GUITAR RYTHM"
const electric_guitar_clean = note(`<
  ~@2 A B C A D E F G A B G A D G H A I J A K I J L G A B G A D M N A I O P M P M P M P M Q
>`.pickRestart({
  A: "bb2 [f3,bb3,d4] bb2 [f3,bb3,d4]", B: "d3 [f3,a3,d4] d3 [f3,a3,d4]", C: "c3 [g3,c4,eb4] f2 [a3,c4,f4]",
  D: "c3 [g3,c4,eb4] c3 [g3,c4,eb4]", E: "f2 [f3,a3,c4] f2 [f3,a3,c4]", F: "bb2 [f3,a3,d4] g2 [g3,b3,d4]",
  G: "c3 [g3,c4,eb4] f2 [a3,c4,eb4]", H: "f2 [f3,ab3,c4] f2 [f3,ab3,c4]", I: "eb3 [g3,bb3,eb4] eb3 [g3,bb3,eb4]",
  J: "eb3 [gb3,bb3,eb4] eb3 [gb3,bb3,eb4]", K: "bb2 [f3,ab3,d4] bb2 [f3,ab3,d4]", L: "d3 [f3,a3,d4] e3 [g3,bb3,db4,e4]",
  M: "c3 [g3,c4,eb4] f2 [f3,a3,c4]", N: "f2 [f3,ab3,c4] c3 [f3,ab3,c4]", O: "f2 [f3,a3,db4] f2 [f3,a3,db4]",
  P: "bb2 [f3,bb3,d4] g2 [g3,b3,d4]", Q: "bb2 ~@3",
})).s("gm_electric_guitar_clean").gain(0.37)

// other · electric guitar clean · "GUITAR ARPEG"
const electric_guitar_clean_2 = note(`<
  ~@2 A B C A D E F C A B C A D C G A H I A@2 H I J C A B C A D C K A H L F C F C F C F C M
>`.pickRestart({
  A: "bb2 d3 f3 bb3 f3 d3 bb2 d3 f3 bb3 f3 d3", B: "d3 f3 a3 d4 a3 f3 d3 f3 a3 d4 a3 f3",
  C: "c3 eb3 g3 c4 g3 eb3 f3 a3 c4 f4 c4 a3", D: "c3 eb3 g3 c4 g3 eb3 c3 eb3 g3 c4 g3 eb3",
  E: "f3 a3 c4 f4 c4 a3 f3 a3 c4 f4 c4 a3", F: "bb2 d3 f3 bb3 f3 d3 g2 b2 d3 g3 d3 b2",
  G: "f3 ab3 c4 eb4 c4 ab3 f3 ab3 c4 eb4 c4 ab3", H: "eb3 g3 bb3 eb4 bb3 g3 eb3 g3 bb3 eb4 bb3 g3",
  I: "eb3 gb3 bb3 eb4 bb3 gb3 eb3 gb3 bb3 eb4 bb3 gb3", J: "d3 f3 a3 d4 a3 f3 e3 g3 bb3 db4 bb3 g3",
  K: "f3 ab3 c4 f4 c4 ab3 f3 ab3 c4 f4 c4 ab3", L: "f3 a3 db4 f4 db4 a3 f3 a3 db4 f4 db4 a3", M: "bb2 d3 ~@10",
})).s("gm_electric_guitar_clean").gain(0.42).pan(0.2)

// bass · electric bass finger · "BASS"
const bass = note(`<
  ~@2 A B C A D E F G A B C A D H I A J K A@2 J L M N A B C A O C P A J Q R S R S R S R S T
>`.pickRestart({
  A: "bb1@3 bb2 ~ d2 f2@3 d2@2 f2", B: "d2@3 d3 ~ f2 a2@3 f2@2 a2", C: "c2@3 c3 ~ eb2 f2@3 f2@3",
  D: "c2@3 c3 ~ eb2 g2@3 eb2@2 g2", E: "f1@3 f2 ~ a1 c2@3 a1@2 c2", F: "bb1!2 g1!2", G: "c2!2 f1!2",
  H: "c2@3 c3 ~ eb2 f2@3 f2@2 ~", I: "f2@3 f3 ~ ab2 c3@3 ab2@2 c3", J: "eb2@3 eb3 ~ g2 bb2@3 g2@2 bb2",
  K: "eb2@3 eb3 ~ gb2 bb2@3 gb2 ~ bb2", L: "eb2@3 eb3 ~ gb2 bb2@3 gb2@2 bb2", M: "d2@3 d3 ~ d2 e2@4 ~ e2",
  N: "c2@4 ~ c2 f2@3 f1@3", O: "c2@3 c3@2 eb2 g2@3 eb2@2 g2", P: "f2@2 ~ f3 ~ ab2 c3@3 ab2@2 c3",
  Q: "f2@3 f3 ~ a2 c3@3 a2@2 c3", R: "bb1@3 bb2 ~ d2 g2@3 g2@3", S: "c2@3 c2@3 f1@3 f1@2 ~", T: "bb1 ~@3",
})).s("gm_electric_bass_finger").gain(0.66)

// other · electric guitar clean · "GUITAR MUTES"
const electric_guitar_clean_3 = note(`<
  ~@2 A B C A D E F G A B C A D H I A J K A@2 J L M N A B C A O C P A J Q R S R S R S R S T
>`.pickRestart({
  A: "bb2@3 bb3 ~ d3 f3@3 d3@2 f3", B: "d3@3 d4 ~ f3 a3@3 f3@2 a3", C: "c3@3 c4 ~ eb3 f3@3 f3@3",
  D: "c3@3 c4 ~ eb3 g3@3 eb3@2 g3", E: "f2@3 f3 ~ a2 c3@3 a2@2 c3", F: "bb2!2 g2!2", G: "c3!2 f2!2",
  H: "c3@3 c4 ~ eb3 f3@3 f3@2 ~", I: "f3@3 f4 ~ ab3 c4@3 ab3@2 c4", J: "eb3@3 eb4 ~ g3 bb3@3 g3@2 bb3",
  K: "eb3@3 eb4 ~ gb3 bb3@3 gb3 ~ bb3", L: "eb3@3 eb4 ~ gb3 bb3@3 gb3@2 bb3", M: "d3@3 d4 ~ d3 e3@4 ~ e3",
  N: "c3@4 ~ c3 f3@3 f2@3", O: "c3@3 c4@2 eb3 g3@3 eb3@2 g3", P: "f3@2 ~ f4 ~ ab3 c4@3 ab3@2 c4",
  Q: "f3@3 f4 ~ a3 c4@3 a3@2 c4", R: "bb2@3 bb3 ~ d3 g3 ~@2 g3@2 ~", S: "c3@3 c3@3 f2@3 f2@2 ~", T: "bb2 ~@3",
})).s("gm_electric_guitar_clean").gain(0.47).pan(0.8)

// drums · kick
const kick = s("bd").struct("<~@2 [x!2]!42 x>").gain(0.5)

// drums · rim
const rim = s("rim").struct("<~@2 [~ x ~ x]!42 ~>").gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<~@2 [x!12]!42 [x!2 ~@10]>").gain(0.5)

stack(
  piano, string_ensemble_1, string_ensemble_1_2, electric_guitar_clean, electric_guitar_clean_2, bass,
  electric_guitar_clean_3, kick, rim, hihat
)

More by Bobby Vinton