Strudelify

Here Comes That Rainy Day Feeling Again

Fortunes

KeyF majorTempo122 bpm
0:00/0:00
// Here Comes That Rainy Day Feeling Again — Fortunes
// 122 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 83 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 28, guitar program 24.
setcpm(122/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 · electric bass pick
const bass = note(`<
  A B C@2 A B C@2 ~@2 A B C@2 A B C@2 D@4 E F G H A B C@2 A B C@2 D@3 I E J G H A B K@2 L@2 M@2 L@2 N O P A B C@2 A B
  C@2 D@3 I E J G H A B Q@2 A B Q@2 A B Q@2
>`.pickRestart({
  A: "c2!2 ~ g1 c2!2 ~ g1", B: "c2!2 ~ g1 c2!4", C: "[bb1!2 ~ f1 bb1!3 bb1@2 bb1 bb1@2 bb1!4]/2",
  D: "f2!2 d2 c2 f2!2 d2 c2", E: "c2!2 a1 g1 c2!4", F: "b1!3 a1 b1!3 e2", G: "f2!3 e2 d2!4", H: "g2!8",
  I: "f2!2 d2 c2 f2!2 e2 d2", J: "b1!3 c2 e2!2 d2 e2", K: "[bb2@3 a2@3 g2@3 f2@3 d2@2 c2@2]/2",
  L: "bb1@2 ~ bb1 bb1@2 ~@2", M: "c2@2 ~ c2 c2@2 ~@2", N: "f1@2 ~ f1 f1@2 ~@2", O: "g1!8", P: "g1!6 a1 b1",
  Q: "[bb2@3 a2@3 g2@3 f2@3 e2@2 d2@2]/2",
})).s("gm_electric_bass_pick").gain(0.46)

// chords · electric guitar muted
const electric_guitar_muted = note(`<
  A B ~@2 A B ~@2 C D A B ~@2 A B ~@2 E@4 ~@2 F ~ A B ~@2 A B ~@2 E@4 ~@2 F ~ A B ~@9 G@2 A B ~@2 A B ~@2 E@4 ~@2 F ~ A
  B ~@2 A B ~@2 A B ~ H
>`.pickRestart({
  A: "~@2 a3!2 ~@2 a3 ~", B: "~@2 a3!2 ~@2 a3!2", C: "~@2 a2@2 ~@2 a2 ~", D: "~ a2 ~@2", E: "~@2 d3 ~@3 d3 ~",
  F: "~@3 e3 d3!4", G: "~@2 a3 ~", H: "~@3 [bb2,f3]",
})).s("gm_electric_guitar_muted").gain(0.28).pan(1)

// other · piano
const piano = note("<A B ~@2 A B ~@36 A B C@2 ~@25 A B D@2 A B D@2 E ~@3>".pickRestart({
  A: "[c3,c4]@4 ~ [d3,d4] [e3,e4] [g3,g4]", B: "~@2 [a3,a4]@3 ~ [g3,g4]@3 ~ [e3,e4]@2 [d3,d4]@2 [c3,c4]@2",
  C: "[[bb2,bb3,d4]@3 [a2,bb3,d4]@3 [g2,bb3,d4]@3 [f2,bb3,d4]@3 [d2,bb3,d4]@2 [c2,c4]@2]/2", // Bb Bbmaj7 Gm Bb Gm C
  D: "[[bb2,bb3,d4]@3 [a2,bb3,d4]@3 [g2,bb3,d4]@3 [f2,bb3,d4]@3 [e2,bb3,d4]@2 [d2,d4]@2]/2", E: "[c3,c4] ~",
})).s("gm_piano").gain(0.22).pan(0)

// other · piano · soft notes
const piano_soft = note("<~@79 A B C@2>".pickRestart({
  A: "~@5 [d3,d4] [e3,e4] [g3,g4]", B: "~@2 [a3,a4]@3 ~ [g3,g4]@3 ~ [e3,e4]@2 [d3,d4]@2 [c3,c4]@2",
  C: "[[bb2,bb3,d4]@3 [a2,bb3,d4]@3 [g2,bb3,d4]@3 [f2,bb3,d4]@3 [e2,bb3,d4]@2 [d2,d4]@2]/2", // Bb Bbmaj7 Gm Bb Em7b5 D
})).s("gm_piano").gain(0.06).pan(0)

// other · vibraphone
const vibraphone = note(`<
  A B C D A B C D ~@4 E F ~@2 E F G@2 H@2 I J K L ~@2 E F ~@2 E F G@2 H@2 I J K L A B M ~@12 E F ~@2 E F G@2 H@2 I J K L
  A B M ~ A B M ~ A B M ~
>`.pickRestart({
  A: "c4@4 ~ d4 e4 g4", B: "~@2 a4@3 ~ g4@3 ~ e4@2 d4@2 c4@2", C: "bb3@8 a3@3 ~ bb3@2 c4@2",
  D: "~@2 c4@2 bb3@3 ~ a3@3 ~ bb3@3 ~", E: "~@4 [bb3,bb4]@3 ~ [a3,a4]@3 ~ [bb3,bb4]@2 [c4,c5]@2",
  F: "~@2 [c4,c5]@2 [bb3,bb4]@2 [bb3,bb4]@2 [a3,a4]@2 [a3,a4]@2 [bb3,bb4]@3 ~", // C Bb A Bb
  G: "[a4@3 ~ a4@3 ~ a4@2 a4@4 a4@4 a4@2 ~@2 a4@2 a4@2 a4@2 a4@4]/2",
  H: "[c5@3 ~ c5@3 ~ c5@2 c5@4 c5@4 c5@2 ~@2 c5@2 c5@2 c5@2 c5@4]/2", I: "g4 g4@2 g4@2 [e4,g4]@2 ~",
  J: "~ g4!4 g4@2 g4", K: "a4@2 a4@2 a4 f4@2 f4", L: "d5@2 d5@2 e5@2 e5@2 d5@2 d5@3 ~@3", M: "bb3 ~@7",
})).s("gm_vibraphone").gain(0.12).pan(1)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@4 A B C D ~@10 E@4 F@2 G H A B C D A B C D E@4 F@2 G H A B I@2 ~@9 A B C D A B C D E@4 F@2 G H A B I@2 A B I@2 J ~@3
>`.pickRestart({
  A: "c5@4 ~ d5 e5 g5", B: "~@2 a5@3 ~ g5@3 ~ e5@2 d5@2 c5@2", C: "bb4@8 a4@3 ~ bb4@2 c5@2",
  D: "~@2 c5@2 bb4@3 ~ a4@3 ~ bb4@3 ~", E: "f4/2", F: "e4/2", G: "f4 d4", H: "d4", I: "bb4/2", J: "c5 ~",
})).s("gm_string_ensemble_1").gain(0.2).pan(0)

// other · string ensemble 1 · soft notes
const string_ensemble_1_soft = note("<~@79 A B C@2>".pickRestart({
  A: "~@5 d5 e5 g5", B: "~@2 a5@3 ~ g5@3 ~ e5@2 d5@2 c5@2", C: "[bb4@3 ~]/2",
})).s("gm_string_ensemble_1").gain(0.08).pan(0)

// other · string ensemble 1
const string_ensemble_1_2 = note(`<
  ~@4 A B C D ~@10 E ~ F ~ G H I J A B C D A B C D E ~ F ~ G H I J A B K@2 ~@9 A B C D A B C D E ~ F ~ G H I J A B L@2 A
  B L@2 M ~@3
>`.pickRestart({
  A: "c4@4 ~ d4 e4 g4", B: "~@2 a4@3 ~ g4@3 ~ e4@2 d4@2 c4@2", C: "bb3@8 a3@3 ~ bb3@2 c4@2",
  D: "~@2 c4@2 bb3@3 ~ a3@3 ~ bb3@3 ~", E: "a4", F: "ab4", G: "[c4,g4]", H: "[b3,g4]", I: "c4 f4, a3", J: "[g3,g4]",
  K: "[bb2@3 a2@3 g2@3 f2@3 d2@2 c2@2, [bb3,d4]]/2", L: "[bb2@3 a2@3 g2@3 f2@3 e2@2 d2@2, [bb3,d4]]/2", M: "c4 ~",
})).s("gm_string_ensemble_1").gain(0.2).pan(1)

// other · string ensemble 1 · soft notes
const string_ensemble_1_soft_2 = note("<~@79 A B C@2>".pickRestart({
  A: "~@5 d4 e4 g4", B: "~@2 a4@3 ~ g4@3 ~ e4@2 d4@2 c4@2", C: "[bb2@3 a2@3 g2@3 f2@3 e2@2 d2@2, [bb3,d4] ~]/2",
})).s("gm_string_ensemble_1").gain(0.06).pan(1)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A@2 B@2 A@2 B@2 A@4 B@2 A@2 B@2 C@2 D@2 A E C F A@2 B@2 A@2 B@2 C@2 D@2 A E C F A@2 B@2 G@2 H@2 G@2 I F@2 A@2 B@2 A@2
  B@2 C@2 D@2 J K C F A@2 B@2 A@2 B@2 A@2 L@2
>`.pickRestart({
  A: "[g3,c4,e4]!8", B: "[[bb3,d4,f4]!7 [bb3,d4,f4]@2 [bb3,d4,f4]!7]/2", C: "[a3,c4,f4]!8", D: "[ab3,c4,f4]!8",
  E: "[g3,b3,e4]!8", F: "[c4,d4,g4]!2 [b3,d4,g4]!6", G: "[bb3,d4,f4] ~@2 [bb3,d4,f4]!2 ~@3",
  H: "[c4,e4,g4] ~@2 [c4,e4,g4]!2 ~@3", I: "[a3,c4,f4] ~@2 [a3,c4,f4]!2 ~@3",
  J: "[g3,c4,e4]!2 [g3,c4,e4,g4] [g3,c4,e4] [g3,c4,e4,g4] [g3,c4,e4] [g3,c4,e4,g4] [g3,c4,e4]", // C
  K: "[g3,b3,e4]!2 [g3,b3,e4,g4] [g3,b3,e4]!5", L: "[[bb3,d4,f4]!7 [bb3,d4,f4]@2 [bb3,d4,f4]!5 ~@2]/2",
})).s("gm_acoustic_guitar_steel").gain(0.06).pan(0)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~@2
  [~@8 a3@3 ~@3 c4@2]
  [~@2 c4@2 ~@4 a3@3 ~@5]
  ~@2
  [~@8 a3@3 ~@3 c4@2]
  [~@2 c4@2 ~@4 a3@3 ~@5]
  ~@75
>`).s("gm_acoustic_guitar_nylon").gain(0.16).pan(0)

// other · tubular bells
const tubular_bells = note("<~@54 [~@8 a4 ~ a4 ~ g4 ~ g4 ~] ~@28>").s("gm_tubular_bells").gain(0.09).pan(0)

// other · timpani
const timpani = note("<~@54 [~ g2 ~ b2] [c3 ~@3] ~@27>").s("gm_timpani").gain(0.25).pan(1)

// other · tenor sax
const tenor_sax = note("<~@10 A@2 B ~ C@2 B ~@9 A@2 B ~ D@2 B ~@22 A@2 B ~ C@2 B ~@9 A@2 B ~ A@2 B ~@5>".pickRestart({
  A: "[~@2 e4 e4@2 e4@2 e4@2 e4 e4@2 e4!4]/2", B: "d4 ~@3", C: "[~@2 e4@2 e4@2 e4 e4@2 e4 e4@2 e4!4]/2",
  D: "[~@4 e4@2 e4@4 e4@3 ~ e4@4 e4@2 e4@4 e4@2 e4@2 e4@2 e4@2]/2",
})).s("gm_tenor_sax").gain(0.12).pan(1)

// other · tenor sax · soft notes
const tenor_sax_soft = note("<~@79 A@2 B ~>".pickRestart({
  A: "[~@2 e4 e4@2 e4@2 e4@2 e4 e4@2 e4!4]/2", B: "d4 ~@3",
})).s("gm_tenor_sax").gain(0.04).pan(1)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@78 [~@8 x ~ x!2 ~@2 x ~] [~ x ~ x]!3 [~@4 x ~@3 x ~ x!3 ~@3]>").gain(0.23)

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

// drums · crash
const crash = s("cr").struct("<~@4 A ~@5 A ~@7 A ~@7 A ~@7 A ~@7 A ~@12 A ~@7 A ~@7 A ~@3 A ~@3 A ~@3>".pickRestart({
  A: "x",
})).gain(0.54)

// drums · ride
const ride = s("rd").struct("<~@46 [x ~@2 x!2 ~@3]!7 ~@30>").gain(0.62)

// drums · congas
const congas = s("conga:13").struct("~ x ~@2").gain(1.74)

// drums · congas
const congas_2 = s("conga:18").struct("~@3 x!2 ~@3").gain(1.74)

// drums · congas
const congas_3 = s("conga:33").struct("x ~@2 x").gain(1.74)

stack(
  bass, electric_guitar_muted, piano, piano_soft, vibraphone, string_ensemble_1, string_ensemble_1_soft,
  string_ensemble_1_2, string_ensemble_1_soft_2, acoustic_guitar_steel, acoustic_guitar_nylon, tubular_bells, timpani,
  tenor_sax, tenor_sax_soft, kick, snare, snare_soft, hihat, crash, ride, congas, congas_2, congas_3
)

More by Fortunes