Strudelify
It's a Real Good Feeling cover art

I Feel Good

It's a Real Good Feeling

Peter Kent

KeyF majorTempo123 bpm
0:00/0:00
// It's a Real Good Feeling — Peter Kent
// 123 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 106 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(123/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@2 C D B@2 E@2 B@4 C@2 B@2 E@2 B@6 C@2 B@2 E@2 B F C D B@2 E@2 B F C D B@2 G H B@2 C I E@2 B@4 C@2 B@2 E@2 B F C@2
  B@2 E@2 B F C D B J G H B F C D B J E@2 B F C D B J E@2 B F C D B J E@2 B F K
>`.pickRestart({
  A: "~@3 g2", B: "f1@5 ~ c2@2 d2@4 c2@3 ~", C: "bb1@5 ~ f2@2 g2@4 f2@4", D: "bb1@5 ~ f2@2 g2@4 a2@4",
  E: "c2@5 ~ g2@2 a2@4 g2@3 ~", F: "f1@6 c2 ~ g2@4 f2@4", G: "g1@5 ~ g1 ~ g1@3 ~ g1@2 a1@2", H: "bb1@15 ~",
  I: "bb1@5 ~ f2@2 g2@4 f2@2 d2@2", J: "f1@5 ~ c2@2 d2@4 c2@2 a1@2", K: "bb1@5 ~ f2@2 g2@4 ~@4",
})).s("gm_fretless_bass").gain(0.33)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  ~@21 A@4 B@2 C@2 D@2 E F G@2 H@2 I@2 J@2 K@2 L@2 M N O@2 P@2 Q@2 R@4 S@2 T@2 D@2 E U V@2 H@2 I@2 J@2 K@2 L@2 M W X@2
  Y@2 Z@2 AA@2 AB AC AD@2 AE@2 AF@2 AG AH AD@2 AE@2 AF@2 AG AH AI
>`.pickRestart({
  A: "[~@14 a5 g5, [f4,a4,c5]@63 ~]/4", B: "[f5@23 ~ f5@4 g5@4, [f4,bb4,d5]@31 ~]/2",
  C: "[a5@6 e5 f5, [f4,a4,c5]@31 ~]/2", D: "[g5@4 ~@2 d5 e5, g4@31 ~, e5@27 ~@5, c5@19 ~ c5@11 ~, ~@16 c6@9 ~@7]/2",
  E: "[a4,c5,f5]", F: "~@6 g5@2 a5@4 c6@3 ~, [a4,c5,eb5]@15 ~", G: "[[bb4,d5,f5]@31 ~, bb5@27 ~@5]/2",
  H: "[c6@23 ~ d6@4 a5@4, [a4,c5,f5]@31 ~]/2", I: "[c6@7 bb5, [c5,e5,g5]@31 ~]/2",
  J: "[f5@15 ~@7 g5@2 a5@4 c6@3 ~, [a4,c5]@31 ~, a5@11 ~@5, ~@16 eb5@15 ~]/2", K: "[bb5@5 ~ d6 a5, [bb4,d5,f5]@31 ~]/2",
  L: "[[a4,c5,f5]@11 ~ [d5,d6]@2 [a4,a5]@2, c6@17 ~@15]/2", M: "[g4,bb4,d5,g5]@13 ~@3", N: "[bb4,d5,f5,bb5] ~",
  O: "[[a5,c6]@15 ~, f5@7 ~]/2", P: "[[f5,bb5,d6]@27 ~@5]/2", Q: "[[g5,c6,e6]@13 ~@3]/2",
  R: "[[f4,a4,c5]@14 a5 g5, c6@53 ~@11]/4", S: "[f5@21 ~@3 g5@4 a5@4, [f4,bb4,d5]@31 ~]/2",
  T: "[c5@27 ~ f5@4, [f4,a4]@31 ~]/2", U: "~@6 g5@2 a5@4 c6@3 ~, [a4,c5,eb5]@3 ~",
  V: "[bb5@24 d6@4 a5@3 ~, [bb4,d5,f5]@7 ~]/2", W: "[bb4,d5,f5]@3 ~, bb5@5 ~@3", X: "[[f5,a5,c6]@31 ~]/2",
  Y: "[[f5,bb5,d6]@29 ~@3]/2", Z: "[[f5,a5,c6]@15 ~]/2", AA: "[[e5,g5,c6]@29 ~@3]/2", AB: "[c5,f5,a5]@15 ~",
  AC: "[f5,a5]@6 g5 ~ a5@3 ~ c6@3 ~, eb5@3 ~", AD: "[bb5@23 ~ d6@4 a5@4, [d5,f5]@29 ~@3]/2",
  AE: "[c6@23 ~ d6@4 a5@4, [c5,f5]@7 ~]/2", AF: "[c6@28 bb5@3 ~, [c5,e5,g5]@15 ~]/2", AG: "[f5,a5]@15 ~, c5@13 ~@3",
  AH: "f5@3 ~ f5@2 g5 ~ a5@3 ~ c6@3 ~, eb5@3 ~, a5@7 ~@9", AI: "[d5,f5,bb5]@13 ~@3",
})).s("gm_synth_strings_1").gain(0.11)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@80 A B C D E F G H@2 ~@17>".pickRestart({
  A: "~@2 f4 ~@3 d4 ~ f4 ~ d4 ~ f4@3 ~", B: "[c4,d4]@2 bb3@9 ~@5", C: "~@2 c4 ~@3 d4 ~ f4@2 ~@2 g4@2 f4 ~",
  D: "g4 ~ f4@8 ~@6, ~ a4@2 ~@13", E: "~@2 c4@2 d4@2 f4 ~ f4@4 g4@2 f4 ~", F: "[g4,a4] c5@5 ~@2",
  G: "~ c5 d5 f5@3 d5 a4", H: "[c5@9 ~ a5@2 g5@2 f5@13 ~@5]/2",
})).s("gm_overdriven_guitar").gain(0.37)

// chords · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz = note(`<
  ~ A@2 B@2 A@2 C@2 A@4 B@2 A@2 C@2 A@6 B@2 A@2 C@2 A D B@2 A@2 C@2 A D B@2 A@2 E F A@2 B@2 C@2 A@4 B@2 A@2 C@2 A D B@2
  A@2 C@2 A D B@2 A@2 E F A@2 B@2 A@2 C@2 A D B@2 A@2 C@2 A D B@2 A@2 C@2 A D ~
>`.pickRestart({
  A: "~@4 [f4,a4,c5] ~@5 [f4,a4,d5] ~@5", B: "~@4 [bb4,d5,f5] ~@5 [bb4,d5,g5] ~@5",
  C: "~@4 [c5,e5,g5] ~@5 [c5,e5,a5] ~@5", D: "~@4 [f4,a4,eb5] ~@5 [f4,a4,eb5] ~@5",
  E: "~@4 [g4,bb4,d5] ~@5 [bb4,d5,f5] ~@5", F: "~@4 [bb4,d5,f5] ~@11",
})).s("gm_electric_guitar_jazz").gain(0.27).pan(0.1)

// chords · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz_2 = note(`<
  ~ A@2 B@2 A@2 C@2 A@4 B@2 A@2 C@2 A@6 B@2 A@2 C@2 A D E@2 F@2 G@2 F H E@2 F@2 I J A@2 B@2 C@2 A@4 B@2 A@2 C@2 A D E@2
  F@2 G@2 F H E@2 F@2 I J A@2 B@2 A@2 C@2 A D E@2 F@2 G@2 F H E@2 F@2 G@2 F H K
>`.pickRestart({
  A: "c4 ~@2 [c4,f4,a4] ~@2 c4 [d4,f4,a4] ~@2 [d4,f4,a4]!2 [c4,f4,a4] ~@3", // F Dm F
  B: "f4 ~@2 [f4,bb4,d5] ~@2 f4 [g4,bb4,d5] ~@2 [g4,bb4,d5]!2 [f4,bb4,d5] ~@3", // Bb Gm Bb
  C: "g4 ~@2 [g4,c5,e5] ~@2 g4 [a4,c5,e5] ~@2 [a4,c5,e5]!2 [g4,c5,e5] ~@3", // C Am C
  D: "eb4 ~@2 [eb4,f4,a4] ~@2 eb4 [eb4,f4,a4] ~@2 [eb4,f4,a4] ~@5", E: "bb3 ~@5 c4 ~ d4 ~ f4 ~ f4 g4 bb4 ~",
  F: "f3 ~@5 g3 ~ a3 ~ c4 ~ c4 d4 f4 ~", G: "c4 ~@5 d4 ~ e4 ~ g4 ~ g4 a4 c5 ~", H: "eb4 ~@15", I: "g4 ~@5 d4 ~@7 a4 ~",
  J: "bb4 ~@15", K: "bb3 ~@5 c4 ~ d4 ~ f4 ~@5",
})).s("gm_electric_guitar_jazz").gain(0.14).pan(0.9)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1_2 = note("<A B C D E B F G ~@12 H ~@27 C D F G I J ~@52>".pickRestart({
  A: "~@15 [a4,c5,f6,a6], ~@7 f4", B: "c7 ~@15", C: "~@14 bb4 [d5,f5], ~@7 f4", D: "bb5 ~@15",
  E: "~@13 f4 a4 [c5,f6,a6]", F: "~@14 [g3,c4,g4] c5", G: "e5 ~@15", H: "~@14 [f5,a5] c6", I: "~@13 f4 a4 [c5,f5,a5]",
  J: "c6 ~@15",
})).s("gm_synth_strings_1").gain(0.11)

// other · tubular bells · "TUBULARBEL"
const tubular_bells = note("<~@32 A ~@7 A ~@23 A ~@7 A ~@7 A ~@7 A ~@7 A ~@9>".pickRestart({
  A: "a7 [f7,g7] [d7,e7] c7 [a6,bb6] g6 [e6,f6] [c6,d6] [a5,bb5] g5 [e5,f5] d5 c5 ~@3", // Fsus2 Dsus2 Bbmaj7 Fmaj7 Csus2 Bbmaj7 Fmaj7
})).s("gm_tubular_bells").gain(0.31)

// other · tubular bells · "TUBULARBEL" · soft notes
const tubular_bells_soft = note("<~@32 A ~@7 A ~@23 A ~@7 A ~@7 A ~@7 A ~@7 A ~@9>".pickRestart({
  A: "~@12 bb4 a4 [f4,g4] ~", // Fsus2
})).s("gm_tubular_bells").gain(0.18)

// drums · kick
const kick = s("bd").struct("<~ [x!4]!104 [x!3 ~]>").gain(0.38)

// drums · snare
const snare = s("sd").struct("<~ A@31 B A@7 B A@5 ~ A@17 B A@7 B A@5 ~ A B A@7 B A@7 B A@7 B C>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@6 x ~@2 x ~", C: "~ x ~@2",
})).gain(0.29)

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

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

// drums · open hat
const open_hat = s("oh").struct(`<
  A ~ A ~ A ~ A ~ A ~@3 A ~@7 A ~@3 A ~@7 A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~@3 A ~@7 A ~ A ~ A ~ A ~ A ~ A ~ A
  ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@3 x",
})).gain(0.34)

// drums · mid tom
const mid_tom = s("mt").struct("<~@32 A ~@7 A ~@23 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~>".pickRestart({
  A: "~@3 x",
})).gain(0.34)

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

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~
  [~@4 x ~@5 x!3 ~@3]!45
  ~
  [~@4 x ~@5 x!3 ~@3]!31
  ~
  [~@4 x ~@5 x!3 ~@3]!26
  [~ x ~@2]
>`).gain(1.49)

// drums · shaker
const shaker = s("sh").struct(`<
  ~@2 A ~ A ~ A ~ A ~@3 A ~@7 A ~@3 A ~@9 A ~ A ~ A ~@3 A ~ A ~@3 A ~ A ~ A ~@3 A ~@9 A ~ A ~ A ~@3 A ~ A ~@5 A ~ A ~ A
  ~@3 A ~ A ~ A ~@3 A ~ A ~ A ~@3
>`.pickRestart({
  A: "~@14 x!2",
})).gain(0.25)

stack(
  bass, synth_strings_1, overdriven_guitar, electric_guitar_jazz, electric_guitar_jazz_2, synth_strings_1_2,
  tubular_bells, tubular_bells_soft, kick, snare, hihat, hihat_soft, open_hat, mid_tom, crash, cabasa, shaker
)