Strudelify
Feelings cover art

Feelings

Feelings

Morris Albert

KeyG majorTempo80 bpm
0:00/0:00
// Feelings — Morris Albert
// 80 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 74 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. 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.

// bass · acoustic bass · "Bass"
const bass = note(`<
  ~@10 A B C D@2 E F G H I J K L M N O P Q R S T U V W A B C D@2 E F G H I J K L M V W A B C D@2 E F G H I J K L M N O P
  Q R S T X ~@2
>`.pickRestart({
  A: "e2@5 ~ e2@2 e2@3 ~ e2@2 b1@2", B: "d#2@4 ~@2 d#2 ~ d#2@6 b1@2", C: "d2@4 ~@2 d2 ~ d2@4 g2@2 d2@2",
  D: "a1@2 ~ a1@3 e2 a1", E: "d2@2 ~ d2@2 a1 c2 d2", F: "g1@2 ~@3 d2 g2 g1, ~@3 g1@3 ~@2",
  G: "e2@4 ~@2 e2@4 b1@2 e2@2 d2 ~", H: "c2@2 ~ c2@2 e2 c2 b1", I: "a1@4 ~@2 b1 c2 d2@4 f#2 d2 c2@2",
  J: "b1@6 f#2 f#1 b1 ~ b1@5 ~", K: "e2@7 b1 e2 ~ e2@2 b1@2 e2@2", L: "a1@5 ~ e2@3 ~ e2@2 a1@2 c2@2",
  M: "d2@5 ~ a2@2 d2@2 a2@2 d2!2 c2@2", N: "b1@6 f#2@2 b1@2 ~ b1 f#2@2 b1@2", O: "e2@5 ~ b1@2 e2@3 ~ e2!2 d2@2",
  P: "c2@4 ~@2 c2 g2 c2@3 ~ c2@2 b1@2", Q: "a1@5 ~ b1 c2 d2@3 ~ d2!2 c2@2", R: "b1@5 ~@2 b1!2 ~ b1@2 f#2@2 b1@2",
  S: "e2 ~ e2@3 ~ e2 b1 e2@2 ~@2 e2!2 d2@2", T: "a1@6 ~ e2 a2@3 ~ a2@2 e2@2", U: "d2@4 ~@2 d2@2 a2@4 d2@3 ~",
  V: "f#2@4 ~@2 f#2 ~ f#2@3 ~ f#2@4", W: "b1@4 ~@2 b1@2 b2 ~ b2@2 b1@3 ~", X: "d2@2 ~ d2 a2@2 ~@2",
})).s("gm_acoustic_bass").gain(0.56)

// chords · string ensemble 2 · "Strings"
const string_ensemble_2 = note(`<
  ~@10 A B C D E F G@2 H I J K H F@2 L H M N K H F A O P Q R S T U V W X Y Z@2 AA AB AC@2 P Q R S T U AD W X Y AE@2 AA
  AB AF@2 X Y Z@2 AA AG ~@2
>`.pickRestart({
  A: "e4", B: "d#4", C: "d4", D: "c#4", E: "~ e4, c4", F: "[d4,f#4]", G: "[[d4,f#4] [e4,g#4], b3]/2", H: "[c4,e4]",
  I: "[a3,c4,e4] [a3,d4,f#4]", J: "~ f#4@3, [b3,d4]", K: "[e4,g#4]", L: "e4 d4", M: "[c4,e4] [d4,f#4]",
  N: "[b3,d4,f#4]", O: "c#4 c4", P: "~@6 f#4 ~ f#4@2 g4 ~ g4@2 a4 ~", Q: "a4@2 b4@9 ~@5",
  R: "~@6 f#4@2 f#4@2 g4 ~ g4@2 a4 ~", S: "a4 b4@5 ~@2", T: "~@6 a4 ~ a4@2 b4@2 b4@2 c5 ~",
  U: "c5 [c5,e5] [b4,d5] [a4,c5]", V: "[b4,d5]@4 [d5,a5] g5 [d5,g5] d5, ~@14 b4 ~",
  W: "[g#4,b4]@5 ~@2 d5 f5@2 e5@4 d5@2, ~@3 b4@5, ~@3 g#4@4 ~", X: "e4@4 [e5,c6] [d5,b5] [c5,a5] [b4,g5]",
  Y: "[c5,e5,g5]@7 ~ [c5,f#5,a5]@8", Z: "[~@6 g5 b5@5 a5@3 ~@9 e6@7 ~, b4 ~, ~@7 a5 ~@7 [e5,g#5]@15 ~@2]/2",
  AA: "~@2 a5 g5 e5@2 c6 b5, a4 c5", AB: "a5@2 d6 a5",
  AC: "[~@11 f#4@4 e4@9 d#4@7 ~, f#5@15 ~@17, ~ c#5@3 ~@4, ~@7 a4@9 ~@16]/2",
  AD: "[b4,d5]@4 [d5,a5] g5 [d5,g5] [b4,d5]", AE: "[~@6 g5 a5 ~@4 a5@3 ~@9 e6@7 ~, b4 ~, ~@8 b5@6 ~ [e5,g#5]@15 ~@2]/2",
  AF: "[f#5@8 a5@2 f#5@3 d5@9 ~ d5 f5@2 e5@4 d5@2, ~@11 b4 ~@4]/2", AG: "a5@2 d6 ~",
})).s("gm_string_ensemble_2").gain(0.26).pan(0.4)

// chords · acoustic guitar nylon · "Ac.Guit"
const acoustic_guitar_nylon = note(`<
  A B C D E F G H I J C D E F G H I K L M N O P Q R S T@2 U V P Q W X C D E F G H I K L M N O P Q W X C D E F G H I K L
  M N O P Q R S T@2 U Y P Z ~@2
>`.pickRestart({
  A: "~@6 [b3,a4] [d3,g4], g2@8 [g2,b4]@7 ~, ~ d3@2 d3@2 d3@2 ~, ~@4 [c4,c5]@11 ~", // B7 G5 G C
  B: "~@2 b3 ~@3 f#4@2, a4@8 ~ d#3@2 b3@5, f#2@3 ~ [b2,b4]@4, ~ e3@2 e3@5, ~@5 a3@3", // B
  C: "~ g3 b3 g3 ~ g3 b3 g3, e3@7 ~ e3@6 ~@2", D: "~ g3 b3 g3 ~ g3 b3 g3, d#3@3 ~ d#3@3 ~",
  E: "~ g3 b3 g3 ~ g3 b3 g3, d3@7 ~ d3@7 ~", F: "~ e3 g3 b3 ~ b3 g3 e3, c#3@7 ~ c#3@8",
  G: "~ g3 c4 g3 e4 g3 c4 g3, a2@15 ~", H: "~ a3 c4 a3 f#4 a3 c4 a3, d3@7 ~ d3@7 ~",
  I: "g2 d3 [g2,c4] d3 b3 d3 a3 g3, ~ g2", J: "a3 e3 b3 e3 a3 d#3 b3 d#3, f#2 b2",
  K: "~ e3 g#3 e3 e4 e3 b3 g#3, e2@15 ~", L: "~ g3 c4 g3 e4 g3 c4 g3, c3@15 ~",
  M: "~ g3 [c4,e4] g3 [a3,d4,f#4] ~ [d4,f#4] a3, a2 d3, ~@5 a3@2 ~", // C D
  N: "[a3,d4,f#4]@2 a3@2 [d4,f#4]@2 a3@2 [d4,f#4]@2 a3@2 ~ [a3,d4]@2 ~, [b2,f#3]@6 f#4 ~", // D D5 B5
  O: "[e3,g#3,d4,e4] e3 ~@5 b2, b2@7 e3@2 ~ b2@4 ~@2, e2@2 [g#3,d4,e4]@3 ~ [e3,g#3,d4,e4]@2, ~@6 e2@2 e2@7 ~", // E7
  P: "[g3,c4,e4]@3 ~ [g3,c4,e4]@2 [a2,e3]@2 ~@4 [a2,e3]@4, [a2,e3]@4 ~@4 [g3,c4,e4]@2 [g3,c4,e4]@5 ~, ~@9 [a2,e3]@2 ~@5", // C A5 C A5
  Q: "[a3,c4,f#4]@3 ~ [a3,c4,f#4]@2 ~@2 [a3,f#4] [a3,c4,f#4]@3 ~@2 [a3,c4,f#4]@2, d3@4 ~@2 d3@2 d3@3 ~ d3@4, ~@7 c4@2 ~@7", // F#dim D F#dim
  R: "[b3,d4,f#4] ~@2 [b2,f#3] ~@3 b2, [b2,f#3]@4 [d4,f#4]@4 [b2,f#3]@4 [d4,f#4]@3 ~, ~@2 b3@7 ~ b3@5 ~, ~@13 f#3@2 ~", // Bm B5 D B5 D
  S: "[e3,g#3,d4,e4] ~@3 d2 b2 ~ [e2,b2], [e2,b2]@2 [e3,g#3,d4,e4]@3 ~ [e3,g#3,d4,e4]@2, ~@7 b2@2 ~@7, ~@8 e2@5 ~@3", // E7 E5 E7
  T: "[[g3,c4,e4]@3 ~@3 [c3,e3]@2 ~@4 [c4,e4]@2 ~@2 [g3,c4,e4]@3 ~ [g3,c4,e4]@2 e3@2 [a3,c4,f#4]@3 ~ [a3,c4,f#4]@2 d3@2, [c3,e3]@4 [c4,e4]@6 g3@4 e3@7 ~@3 d3@4 ~@4, ~@4 g3@4 [c3,e3]@6 ~@2 a2@7 ~@9]/2", // C F#dim C
  U: "[a3,d4,f#4]@3 ~ [a3,d4,f#4]@2 [b2,f#3]@2 [a3,d4,f#4] ~@5 b2@2, [b2,f#3]@4 ~@5 [a3,d4,f#4]@2 ~ [a3,d4,f#4]@4, ~@5 f#3@3, ~@5 b2@2 ~", // D B5 D B5 D
  V: "[e3,g#3,d4,e4] e3 ~ [e2,b2] a2 e3 [e3,g#3,d4,e4] [e2,b2], [e2,b2]@2 [e3,g#3,d4,e4]@3 ~@3, ~@8 [e2,b2]@5 ~@3", // E7 E5 E7 E5 E7 E5
  W: "[a3,c#4,f#4]@3 ~ [a3,c#4,f#4]@2 [f#2,e3]@2 [f#2,e3]@4 [c#4,f#4]@2 [f#2,e3]@2, [f#2,e3]@4 ~@4 a3@7 ~, ~@4 [c#4,f#4] ~@3", // F#m F#7 F#5 F#7 F#5
  X: "[a3,b3,f#4]@3 ~ [a3,b3,f#4]@2 ~@2 [a3,b3,f#4]@3 ~ [a3,b3,f#4]@2 [a3,b3,f#4]@2, [b2,d#3]@2 ~ [b2,d#3]@3 [b2,d#3]@2", // B7 B
  Y: "[e3,g#3,d4,e4] e3 ~ [e2,b2] ~ e3 [e3,g#3,d4,e4] [e2,b2], [e2,b2]@2 [e3,g#3,d4,e4]@3 ~@3, ~@8 [e2,b2]@5 ~@3", // E7 E5 E7 E5 E7 E5
  Z: "[a3,c4,f#4]@3 ~ [a3,c4,f#4]@2 ~@2 [a3,f#4] [a3,c4,f#4]@3 d3@4, d3@4 ~@2 d3@2 d3@3 ~@5, ~@7 c4@2 ~@7", // F#dim D F#dim
})).s("gm_acoustic_guitar_nylon").gain(0.41)

// other · french horn · "Fr.horns"
const french_horn = note("<~@34 A B C D E@2 F@2 ~@8 A B C D E@2 G@2 ~@16>".pickRestart({
  A: "e4", B: "d#4", C: "d4", D: "c#4", E: "c4/2", F: "b3/2", G: "[b3@31 ~]/2",
})).s("gm_french_horn").gain(0.28).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~@18 A ~@5 B ~ C ~@16 A D ~@25 E ~@3>".pickRestart({
  A: "x", B: "~@13 x ~@2", C: "~ x ~@2", D: "~@3 x ~@12", E: "~@7 x!2 ~@2 x ~@4",
})).gain(0.36)

// drums · snare
const snare = s("sd").struct(`<
  ~@17 A B ~@6 C ~@3 D ~ E ~ D ~ F ~ G ~ H I J ~ E ~ K ~ L M N ~ O P ~ O ~ Q R ~ S ~@2 T U ~ V ~@2 W X O ~@3
>`.pickRestart({
  A: "~@4 x ~@6 x!5", B: "~@2 x ~@2 x ~@2", C: "~@5 x ~@2", D: "~@7 x", E: "~@3 x", F: "~@15 x", G: "~@9 x ~@3 x ~@2",
  H: "~@4 x ~@6 x ~ x ~@2", I: "~@12 x ~@2 x", J: "x!2 ~@2 x ~@2 x!3 ~ x!2 ~@3", K: "~@8 x!2 ~@6",
  L: "~@4 x ~@2 x ~@4 x ~@2 x", M: "~@8 x ~@2 x ~ x ~@2", N: "~@3 x ~ x ~@7 x ~@2", O: "~ x ~@2", P: "~@11 x ~@4",
  Q: "~@4 x ~@3 x ~@2 x ~@4", R: "x ~@2 x!3 ~ x!3 ~ x!3 ~@2", S: "~@13 x ~ x", T: "~@11 x!2 ~@2 x",
  U: "~@3 x ~@4 x ~@2 x!2 ~@2 x", V: "~@5 x ~ x!3 ~ x!3 ~ x", W: "~@7 x!2 ~@4 x ~@2", X: "~@7 x!3 ~ x ~@4",
})).gain(0.64)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@17 A ~@7 B ~@3 C ~ A ~@9 D ~@3 E ~ F ~ G ~ H ~@2 I ~@8 J ~@5 G ~@4>".pickRestart({
  A: "~@9 x!2 ~@5", B: "~@7 x!2 ~@4 x ~@2", C: "~@11 x!2 ~@3", D: "~@5 x ~@7 x ~@2", E: "~@7 x ~@8",
  F: "~@8 x ~@4 x ~@2", G: "~ x ~@2", H: "~@9 x ~@6", I: "~@11 x ~@4", J: "~@13 x ~@2",
})).gain(0.21)

// drums · clap
const clap = s("cp").struct("<~@25 A ~@5 B ~@8 C B D ~@2 E ~@3 F ~@6 G ~@6 H ~@4 G I ~@4>".pickRestart({
  A: "~@7 x", B: "~@15 x", C: "~ x ~@2", D: "x", E: "~@12 x ~@2 x", F: "x ~@7 x ~@2 x ~@4", G: "~@13 x ~@2",
  H: "~@5 x ~@10", I: "~ x ~ x",
})).gain(0.64)

// drums · hihat
const hihat = s("hh").struct("<~@10 [x!2 ~ x] [~ x ~ x]!40 [~@4 x ~@7 x!2 ~@2] [~ x ~ x]!19 [~ x ~@2] ~@2>").gain(0.71)

// drums · open hat
const open_hat = s("oh").struct("<~@33 [~@5 x ~@2] ~@19 [~@13 x ~@2] ~@3 [~@15 x] ~@16>").gain(0.36)

// drums · ride
const ride = s("rd").struct("<~@46 A ~@3 A ~@15 A ~@2 B ~@4>".pickRestart({
  A: "x", B: "~@13 x ~@2",
})).gain(0.64)

stack(bass, string_ensemble_2, acoustic_guitar_nylon, french_horn, kick, snare, snare_soft, clap, hihat, open_hat, ride)