Strudelify

The First Time Ever I Saw Your Face

Roberta Flack

KeyF majorTempo72 bpm
0:00/0:00
// The First Time Ever I Saw Your Face — Roberta Flack
// 72 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 66 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(72/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(`<
  A B C B D E F G H I J K L M N O P Q R F G S N T U V W J X Y M N Z AA AB AC AD AE AF AG AH AI AJ AK AL X Y M AG AH P AM
  AN AO@2 AP D AQ AR AS AT AU AV AW A ~
>`.pickRestart({
  A: "f1", B: "g1 c2", C: "f2", D: "g1@5 ~ g1 ~ g1@7 ~", E: "c2@4 ~@2 c2 ~ c2@6 c2@2", F: "f2@4 ~@2 f2 ~ f2@6 c2@2",
  G: "f1@5 ~ f1 ~ f1@8", H: "d2@5 ~ d2 ~ d2@6 ~@2", I: "d2@4 ~@2 d2 ~ d2@4 c2@2 bb1@2", J: "a1@5 ~ a1 ~ a1@8",
  K: "bb1@5 ~ bb1 ~ bb1@7 ~", L: "bb1@4 ~@2 bb1 ~ bb1@4 ~@2 bb1@2", M: "c2@5 ~ c2 ~ c2@6 ~@2", N: "c2@4 ~@2 c2 ~ c2@8",
  O: "f2@5 ~ f2 ~ f2@8", P: "f1@5 ~ f1 ~ f1@2 f2@2 c2@2 f1@2", Q: "eb2@5 ~ eb2 ~ eb2@7 ~", R: "eb2@5 ~ eb2 ~ eb2@8",
  S: "g1@4 ~@2 g1 ~ g1@7 ~", T: "f2@5 ~ f2 ~ f2@6 c2@2", U: "f1@5 ~ f1 ~ f1@4 f2@2 e2@2", V: "d2@5 ~ d2 ~ d2@6 a1@2",
  W: "d2@5 ~ d2 ~ d2@4 c2@2 bb1@2", X: "bb1@4 ~@2 bb1 ~ bb1@6 ~@2", Y: "bb1@4 ~@2 bb1 ~ bb1@4 g1@4",
  Z: "f1@4 ~@2 f1 ~ f1@8", AA: "f2@4 ~@2 f2 ~ f2@4 c2@4", AB: "eb2@5 ~ eb2 ~ eb2@6 bb1@2",
  AC: "eb2@5 ~ eb2 ~ eb2@2 g2 ~ f2@2 c2@2", AD: "f1@5 ~ f1 ~ f1@7 ~", AE: "f2@5 ~ f2 ~ f2@4 f1@2 c2@2",
  AF: "g1@4 ~@2 g1 ~ g1@5 ~ d2@2", AG: "c2@4 ~@2 c2 ~ c2@5 ~ c2@2", AH: "f2@4 ~@2 f2 ~ f2@5 ~ c2@2",
  AI: "f1@5 ~ f1 ~ f1@2 c2@2 f2@2 e2@2", AJ: "d2@5 ~ d2 ~ d2@7 ~", AK: "d2@4 ~@2 d2 ~ d2@8", AL: "a1@4 ~@2 a1 ~ a1@7 ~",
  AM: "eb2@5 ~ eb2 ~ eb2@5 ~ bb1@2", AN: "eb2@4 ~@2 eb2 ~ eb2@8", AO: "f2@5 ~ f2 ~ f2@4 c2@4",
  AP: "g2@4 ~@2 g2 ~ g2@6 d2 ~", AQ: "c2@4 ~@2 c2 ~ c2@4 ~@2 c2 ~", AR: "c2@4 ~@2 g1@2 c2@3 ~ c2@2 bb1 ~",
  AS: "a1@4 ~@2 a1 ~ a1@4 f1@4", AT: "eb2@5 ~ eb2 ~ eb2@4 c2@4", AU: "f2@4 ~@2 f2 ~ f2@8", AV: "eb2", AW: "f2@3 c2",
})).s("gm_fretless_bass").gain(0.2)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  A B C D E F G H I@2 J K L M N O P Q@2 R@2 E F G H S@2 J T L U V O P Q@2 R@2 E F G H S@2 J T L U V O P W X R@2 Y@2 Z AA
  G AB AC AD AE@2 ~
>`.pickRestart({
  A: "~ c3@3, f2", B: "[g2,f3]@2 e3 c3", C: "[f3,a3]@3 c3", D: "[g2,f3] c3", E: "[g3,bb3]", F: "c3@3 c3 c3@4, bb3",
  G: "[f3,a3]", H: "a3@3 f3 c3@2 a2 c3", I: "[d3@8 d3@8 d3@6 d3@2 d3@7 ~, ~ [f3,a3]@3]/2", J: "a3 [a3,c4,e4]",
  K: "bb3@3 bb3 bb3@2 f3@2, d4 ~", L: "d3 bb2 g3 f3", M: "~ g3@15, [c3,f3]@15 ~", N: "c3@5 ~ c3 ~ c3@8, e3", O: "f3",
  P: "a3 g3 f3 c3", Q: "[eb3,g3]@3 eb3 eb3@4", R: "[f3,a3]@3 f3 f3@4", S: "[d3@4 d3@4 d3@3 d3 d3@4, ~ [f3,a3]@3]/2",
  T: "[bb3,d4]@3 bb3 bb3@2 f3@2", U: "~ g3@15, [c3,f3]", V: "c3@3 c3 c3@4, e3", W: "[eb3,g3]@3 bb2",
  X: "eb3@3 eb3 eb3@4, g3", Y: "[g3@8 g3@3 g3 g3@4, bb3]/2", Z: "f3@2 e3 g3, c3@3 ~", AA: "c4 g3 ~ bb3, ~ c3",
  AB: "~ bb3, eb3", AC: "[f3,a3,c4]", AD: "[eb3,g3,bb3]", AE: "[f3@4 c3@4 f3@4 g3@3 ~ c4@16, ~@15 [f3,a3]@17]/2",
})).s("gm_epiano2").gain(0.25).pan(0.4)

// other · epiano2 · "E.PIANO 2"
const epiano2_2 = note(`<
  A@2 B C D@2 E@2 F@2 G H I@3 J@2 K@2 L@2 D@2 M@2 F@2 G H I@3 J@2 K@2 L@2 D@2 M@2 F@2 G H I@3 J@2 N@3 O D@2 P@2 Q R S T
  U@2 ~
>`.pickRestart({
  A: "[~@4 a4 f4 c4@4 bb4 a4 g4@4]/2", B: "~ f4 g4 a4 c5 d5@3", C: "~ bb4 g4 d4 e4@2 c4@2",
  D: "[~@6 d4@2 g4@4 g4@16 g4 a4 bb4@2]/2", E: "[a4@3 f4 c4@12]/2", F: "[~@2 f4 a4@2 a4 bb4 a4@9]/2",
  G: "c5@2 c5!2 c5@6 d5@2 c5@2 bb4 a4", H: "bb4", I: "[~@10 c4!2 c5@10 c5!2 bb4@2 a4@18 a4@2 g4@2]/3",
  J: "[a4@2 f4 c4@5]/2", K: "[c4 d4 eb4@22 ~@2 c4!2 d4@2 c4!2]/2", L: "[c4@7 ~]/2", M: "[a4@3 f4 c4@10 ~@2]/2",
  N: "[~@3 d4 eb4@8 ~ c4!2 d4@2 c4 c4@6]/3", O: "~ c4 c4@6", P: "[a4@3 bb4 g4@12]/2", Q: "~@2 f4 f4@5",
  R: "~@2 ab4 g4@5", S: "~@2 a4 a4@5", T: "bb4@7 c5", U: "[a4,c5]/2",
})).s("gm_epiano2").gain(0.3).pan(0.6)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  A B C@2 D@2 E@2 F@2 G H@2 I@2 J@2 K@2 L@2 M@2 N@2 O@2 P Q@2 R@2 S@2 T@2 U@2 V@2 W@2 X@3 Y@4 Z@2 AA@2 AB@2 AC@2 AD@2 AE
  AF AG AH AI@2 ~
>`.pickRestart({
  A: "c4", B: "bb3 [c4,e4]", C: "[c4@27 ~@5]/2", D: "[bb4@31 ~]/2", E: "[a4@3 f4 ~@4 a3@7 ~, ~ c4@3]/2",
  F: "[[a3,f4]@23 ~ [f4,a4]@4 [e4,g4]@2 [d4,f4]@2]/2", G: "[c4,e4]", H: "[bb3,d4]/2",
  I: "[~ e4, c4@15 ~, ~@3 f4@5 ~@8, ~@3 g4@5]/2", J: "[~ f4@3, c4, ~ a4@7]/2",
  K: "[~@12 f4@19 ~, bb4@29 ~@3, ~@3 eb4@12 ~]/2", L: "[~@6 f4@25 ~, a4]/2",
  M: "[~ e4, d4 ~, ~@2 bb3@13 ~, ~@3 g4@5]/2", N: "[~@6 a4@9 ~, f4@31 ~, ~@4 c4@27 ~]/2",
  O: "[~@3 a4@5, f4@31 ~, ~@4 d4@27 ~, ~@6 d5@25 ~]/2", P: "~@3 a4@4 ~, c5, ~ e4@3",
  Q: "[~@6 f4@23 ~@3, bb4@29 ~@3, ~@2 d4@13 ~]/2", R: "[~@3 f4 ~@4, c4@15 ~@17, ~@3 g4@13]/2",
  S: "[~@3 a4@5, c4@29 ~@3, ~@3 f4@13]/2", T: "[~@12 g4@19 ~, bb3@29 ~@3, ~@3 eb4@13]/2", U: "[~@3 a4@5, ~@3 f4@13]/2",
  V: "[~@3 g4@5, ~@3 bb3@12 ~, ~@3 d4@5 ~@8]/2", W: "[~@12 a4@19 ~, c4@15 ~, ~@6 f4@25 ~]/2",
  X: "[~@19 a4@5, f4@16 e4@7 ~, ~@3 a4@13 ~@8, ~ c5@3]/3",
  Y: "[~@12 bb4@16 ~@4 f4@16 e4@13 ~@3, d4@15 ~@17, ~@3 f4@12 ~@17, ~@14 g4@17 ~]/4",
  Z: "[a4@4 f4@2 ~@6 g3 a3 c4@2, ~@12 c4@15 ~@5]/2", AA: "[[g3,bb3]@15 ~]/2",
  AB: "[[g3,c4]@8 ~@3 g4@3 a4@2, a3@11 c4@4 ~, ~@8 f4@7 ~]/2", AC: "[bb4@24 d4@4 bb4@3 ~]/2",
  AD: "[~@6 c4 d4, a4@3 ~ g4@8 ~@4, ~ c4@4 g3@2 ~]/2", AE: "[a3,c4,f4]", AF: "[bb3,eb4,g4]", AG: "[c4,f4,a4]",
  AH: "[eb4,g4,bb4]", AI: "[[c4,f4,a4]@31 ~]/2",
})).s("gm_synth_strings_1").gain(0.07)

// chords · synth strings 1 · "SYN STR 1" · soft notes
const synth_strings_1_soft = note(`<
  ~@2 A B C D ~@13 E@2 ~@10 F ~@4 G@2 ~ H ~@5 I ~ J@2 ~@3 K ~@2 L@2 M ~@8
>`.pickRestart({
  A: "a3", B: "bb3@11 ~@5", C: "d4@15 ~", D: "e4@15 ~", E: "[~ c4@7]/2", F: "~@2 e4@13 ~, c4@7 ~", G: "[c4@31 ~]/2",
  H: "e4", I: "bb4@11 ~@5", J: "c4/2", K: "eb4", L: "[d4@11 ~@5]/2", M: "~@3 bb4 ~@4",
})).s("gm_synth_strings_1").gain(0.04)

// drums · kick
const kick = s("bd").struct("<~@4 [x ~@2 x!2 ~@3]!58 ~@4>").gain(0.2)

// drums · rim
const rim = s("rim").struct("<~@4 [~@3 x]!58 ~@4>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct(`<
  A@4 B@2 C D B@2 C D B@2 C D B@2 C D@2 B@2 C D B@2 C D B@2 C D B@2 C D@2 B@2 C D B@2 C D B@2 C D B@2 C D B@2 C D B@2 C
  D ~@4
>`.pickRestart({
  A: "~ x ~ x", B: "x!4", C: "x ~ x!3 ~ x ~", D: "x!8",
})).gain(0.2)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@4 A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~@2 A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~@2 A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B
  ~@5
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~@3 x ~ x",
})).gain(0.1)

// drums · ride
const ride = s("rd").struct("<[x ~@6 x] x [x ~@6 x] x ~@58 [x ~@6 x] x ~@2>").gain(0.2)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A@2 ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A@2 ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~@4
>`.pickRestart({
  A: "~@3 x",
})).gain(0.25)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@4 [x!5 ~ x ~]!58 ~@4>").gain(0.5)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<~@4 [~@5 x ~ x]!58 ~@4>").gain(0.25)

stack(
  bass, epiano2, epiano2_2, synth_strings_1, synth_strings_1_soft, kick, rim, hihat, hihat_soft, ride, tambourine,
  cabasa, cabasa_soft
)

More by Roberta Flack