Strudelify

Valerie

Steve Winwood

KeyA majorTempo118 bpm
0:00/0:00
// Valerie — Steve Winwood
// 118 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 4 synth brass 1 (copy of ch 3 synth brass 1, 0.083 beats late); ch 3 synth brass 1 (copy of ch 5 pad warm); ch 9 pad warm (copy of ch 8 tenor sax, 0.083 beats late); ch 15 lead 2 sawtooth (copy of ch 14 lead 2 sawtooth, 0.083 beats late)
// note: Full arrangement: all 121 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(118/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 1
const bass = note(`<
  A B C B D E F G H E I H J K B K B E I G@2 E I G@2 L H G L H G M N O P H@3 B C B@2 E F G H E I H J K B K B E I G@2 E I
  G@2 L H G L H G M N O P H@3 B C B@2 E F G H E I H J K B K B E I G@2 E I G@2 L H G L H G M N O P H@3 B C B@5 Q ~
>`.pickRestart({
  A: "~@14 a2 ~", B: "a2 ~ a2!3 ~ a2!3 ~ a2!3 ~ a2!2", C: "[a1,a2] ~ [a1,a2] a2!2 ~ a2!3 ~ a2!3 ~ a2!2",
  D: "a1@2 a2!3 ~ a2!3 ~ a2!3 ~ a2!2, a2 ~@15", E: "b2 ~ b2!3 ~ c#3!3 ~ c#3!3 ~ d3!2",
  F: "d3 ~ d3!3 ~ d3!3 ~ d3!3 ~ d3!2", G: "e3 ~ e3!3 ~ e3!3 ~ e3!3 ~ e3!2", H: "f#3 ~ f#3!3 ~ f#3!3 ~ f#3!3 ~ f#3!2",
  I: "d3 ~ d3!3 ~ e3!3 ~ e3!3 ~ e3!2", J: "g3 ~ g3!3 ~ g3!3 ~ g3!3 ~ g3!2", K: "e3 ~ e3!3 ~ e3!2 d3 ~ d3!3 ~ a2!2",
  L: "g#3 ~ g#3!3 ~ g#3!3 ~ g#3!3 ~ g#3!2", M: "f#3 ~ f#3!3 ~ e3!3 ~ e3!3 ~ e3!2", N: "e3 ~ e3!3 ~ d3!3 ~ d3!3 ~ f#3!2",
  O: "f#3 ~ f#3!3 ~ e3!3 ~ e3!3 ~ d3!2", P: "d3 ~ d3!3 ~ c#3!3 ~ c#3!3 ~ c#3!2", Q: "a2 ~@15",
})).s("gm_synth_bass_1").gain(0.4)

// bass · electric bass pick
const bass_2 = note(`<
  ~ A B C ~ D@2 E F G@2 F H I@4 G@2 J@2 G@2 J@2 K L M K L M N@4 O ~@2 A B C P D@2 E F G@2 F H I@4 G@2 J@2 G@2 J@2 K L M
  K L M N@4 O ~@2 A B C P D@2 E F G@2 F H I@4 G@2 J@2 G@2 J@2 K L M K L M N@4 O ~@2 A B C Q C ~ A@2 ~
>`.pickRestart({
  A: "a1 ~@15", B: "~@14 e1 ~", C: "a1 ~@3", D: "[b1@3 c#2@4 d2@4 d2!2 c#2 d2 d#2]/2", E: "e2@3 e2 e2@3 e1",
  F: "f#1 f#2", G: "[b1@3 c#2@4 d2@4 e2@3 ~ d#2]/2", H: "g1 g2", I: "[e1@4 d1@3 a1@8 ~]/2", J: "e1 e2",
  K: "g#1@3 g#1 g#1@4", L: "f#1@3 f#1 f#1@4", M: "e1@3 e1 e1@4",
  N: "[f#1@3 e1@4 e1@4 d1@4 f#1@4 e1@4 d1@4 c#1@3 ~@2]/4", O: "~@7 f#1", P: "~@12 a1 ~ a#1 ~", Q: "~@7 e1",
})).s("gm_electric_bass_pick").gain(0.45)

// chords · pad warm
const pad_warm = note(`<
  ~ A B C ~ D@2 E F G@2 H I J K J K G@2 L M G@2 L M N O K N O K P@4 Q@3 A B C ~ D@2 E F G@2 H I J K J K G@2 L M G@2 L M
  N O K N O K P@4 Q@3 A B C ~ D@2 E F G@2 H I J K J K G@2 L M G@2 L M N O K N O K P@4 Q@3 A B C R A B ~ S ~
>`.pickRestart({
  A: "[e3,a3,c#4] ~@5 [c#5,e5,a5] ~@9", B: "~@2 [f#3,a3,d4] ~ [e3,a3,c#4] ~@3 [f#3,a3,d4] ~@7",
  C: "[e3,a3,c#4] ~@5 [c#5,e5,a5] ~@5 [f#3,a3,d4] ~ [e3,a3,c#4] ~", // A D A
  D: "[[b3,d4]@3 [a3,c#4]@4 a3@7 a3@2, ~@7 [d4,f#4]@8 ~]/2", E: "[e3,a3,c#4]!2", F: "[f#3,a3,c#4]",
  G: "[[b3,d4]@3 [a3,c#4]@4 [f#3,a3,d4]@4 [a3,c#4,e4]@4 ~]/2", H: "f#3!2, [a3,c#4]", I: "g3!2, [b3,d4]",
  J: "[e3,b3,d4] [f#3,a3,d4]", K: "[e3,a3,c#4]", L: "[e3,a3,d4]", M: "[e3,g#3,b3]", N: "[g#3,b3,e4]", O: "[f#3,a3,d4]",
  P: "[[a3,d4,f#4]@3 [a3,c#4,e4]@4 [b3,e4,g#4]@4 [d4,f#4,a4]@4 [c#4,f#4,a4]@4 [a3,c#4,e4]@4 [a3,d4,f#4]@4 [c#4,e4,a4]@4 ~]/4", // D A E D F#m A D A
  Q: "[a3,d4,f#4]/3", R: "~@6 [f#3,a3,d4]@2 [f#3,a3,d4] ~@7", S: "[e3,a3,c#4] ~@15",
})).s("gm_pad_warm").gain(0.19).pan(1)

// chords · pad warm
const pad_warm_2 = note("<~@29 A B ~@6 C ~@28 A B ~@6 C ~@28 A B ~@6 C ~@9>".pickRestart({
  A: "d4", B: "c#4", C: "[a3,d4,f#4,a4]",
})).s("gm_pad_warm").gain(0.18).pan(0)

// chords · pad warm
const pad_warm_3 = note("<~@29 A B ~@6 C ~@28 A B ~@6 C ~@28 A B ~@6 C ~@9>".pickRestart({
  A: "b4 a4", B: "a4", C: "[a3,d4,f#4,a4]",
})).s("gm_pad_warm").gain(0.18).pan(1)

// other · timpani
const timpani = note("<~@12 A@2 ~@4 B C B C B C ~@25 D@2 ~@4 B C B C B C ~@25 D@2 ~@4 B C B C B C ~@23>".pickRestart({
  A: "[~ c2@2 ~ c2!3 c2@2 ~@7]/2", B: "~@7 c2", C: "c2 ~@3", D: "[~@2 c2@2 c2!3 c2@2 ~@7]/2",
})).s("gm_timpani").gain(0.64)

// chords · electric guitar clean
const electric_guitar_clean = note("<~@45 A@2 ~@44 B@2 C D B@2 C D ~@22>".pickRestart({
  A: "[~@3 e4 ~ e4 c#4 d4@8 ~, ~ a4 g#4 ~@5]/2", B: "[[b3,d4,f#4]@3 [a3,c#4,e4]@4 [f#3,a3,d4]@4 [a3,c#4,e4]@4 ~]/2",
  C: "[e3,a3,d4]", D: "[e3,g#3,b3]",
})).s("gm_electric_guitar_clean").gain(0.25).pan(1)

// other · electric guitar muted
const electric_guitar_muted = note("<~@43 A B C ~@3 D@2 ~@70>".pickRestart({
  A: "~@10 e3 f#3 a3 ~ b3 ~", B: "a3 ~@15", C: "~ a3 ~@6", D: "[~@2 e3 f#3 a3 ~ a3 ~ a3 ~ b3 ~ a3 ~ a3@16 ~@2]/2",
})).s("gm_electric_guitar_muted").gain(0.25).pan(1)

// other · lead 2 sawtooth
const lead_2_sawtooth = note("<~@78 A B@2 C@2 D@2 E F@3 G@2 H ~@29>".pickRestart({
  A: "~@10 e4@2 a4 ~ b4 ~", B: "[c5@2 a4 ~ b4 ~ a4@4 b4 ~@3 d5@5 ~ c5@2 a4 ~@3 f#4 ~ e4 ~ f#4 ~]/2",
  C: "[b3@2 a3 ~ a3@2 f#3@2 a3@2 b3 ~ a3@2 b3@4 e4@4 c#4@2 e4@2 a4 ~@5]/2",
  D: "[~@4 d5@2 e5 ~ c5 b4 a4 ~ b4 ~ a4@6 f#4 ~ e4 ~ c4 b3 a3 ~ a3 ~ a3 ~]/2", E: "b3@2 e4 ~ f#4 ~ a4@4 f#4 ~@3 c#5 a4",
  F: "[b4@12 ~@2 c#5@4 e5 ~ c5 b4 a4 ~ a4@2 f#4 ~ c4@2 a3@4 f#3 ~ a3 ~ b3@2 ~@2 a4@4 ~@2]/3",
  G: "[~@2 e5@2 a5@4 c5@2 a4 ~ b4 ~ a4@4 ~@2 b3@2 e4 ~ f#4 ~ a4 ~ b4 ~ f#4 ~]/2", H: "a4",
})).s("gm_lead_2_sawtooth").gain(0.14).pan(0)

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

// drums · clap
const clap = s("cp").struct("<~@25 [~@3 x]!6 ~@31 [~@3 x]!6 ~@31 [~@3 x]!6 ~@16>").gain(0.78)

// drums · snare
const snare = s("sd").struct(`<
  ~ A@3 B A@7 C A@11 D E@6 A@4 ~@2 E A@3 F A@7 C A@11 D E@6 A@4 ~@2 E A@3 F A@7 C A@11 D E@6 A@4 ~@2 E A@3 F A@2 ~@3
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!2 ~", C: "~@4 x ~@7 x ~ x!2", D: "~ x!2 ~@3 x ~", E: "~@3 x", F: "~@2 x ~@3 x!2",
})).gain(0.78)

// drums · hihat
const hihat = s("hh").struct("<~ [x!8]!118 ~@2>").gain(0.7)

// drums · mid tom
const mid_tom = s("mt").struct("<[~@2 x ~ x!5 ~ x!3 ~ x ~] ~@120>").gain(0.62)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@27 A ~@36 A ~@14 B@12 ~@10 A ~@19>".pickRestart({
  A: "~@10 x!3 ~@3", B: "x!16",
})).gain(0.62)

stack(
  bass, bass_2, pad_warm, pad_warm_2, pad_warm_3, timpani, electric_guitar_clean, electric_guitar_muted,
  lead_2_sawtooth, kick, clap, snare, hihat, mid_tom, crash, tambourine
)

More by Steve Winwood