Strudelify

But It's Alright

J.J. Jackson

KeyE majorTempo116 bpm
0:00/0:00
// But It's Alright — J.J. Jackson
// 116 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 6 "VIBRAPHONE" named as a mallet, played on vibraphone (its piano patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: duplicate parts dropped: ch 5 "STEEL GTR" acoustic guitar steel (copy of ch 3 "A.PIANO 1" piano)
// note: Full arrangement: all 80 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(116/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 · "ACOU BASS"
const bass = note(`<
  ~@2 A B@2 C A B@2 C A B@2 C D E F G A B@2 C A B@2 C A B@2 C D E F G A B@2 C A B@2 C A B@2 C D E F G A B H I J H@2 I J
  H@2 I K L M N J H@2 I J H@2 I J H@2 I J O
>`.pickRestart({
  A: "a1 ~ a1@2 ~ e2 d2@2", B: "a1 ~ a1 ~@2 e2 d2@2", C: "a1@2 ~@2 a1@2 ~@4 e2 ~ d2@3 ~",
  D: "c#2@4 g#1@2 b1 ~ c#2@4 g#1@3 ~", E: "b1@2 f#1@2 b1 f#1 b1 f#1", F: "c#2@3 ~ g#1@2 b1@2 c#2@4 g#1@3 ~",
  G: "b1!2 ~ b1!2 ~ b1 ~ e2@2 ~@6", H: "b1 ~ b1 ~@2 f#2 e2@2", I: "b1@2 ~@2 b1@2 ~@4 f#2 ~ e2@3 ~",
  J: "b1 ~ b1@2 ~ f#2 e2@2", K: "d#2@4 a#1@2 c#2 ~ d#2@4 a#1@3 ~", L: "c#2@2 g#1@2 c#2 g#1 c#2 g#1",
  M: "d#2@3 ~ a#1@2 c#2@2 d#2@4 a#1@3 ~", N: "c#2!2 ~ c#2!2 ~ c#2 ~ f#2@2 ~@6", O: "b1 ~@7",
})).s("gm_acoustic_bass").gain(0.72)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~@2 A B@2 C A B@2 C A B@2 C D E F G A B@2 C A B@2 C A B@2 C D E F G A B@2 C A B@2 C A B@2 C D E F G A B H I J H@2 I J
  H@2 I K L M N J H@2 I J H@2 I J H@2 I J O
>`.pickRestart({
  A: "[c#4,e4,a4]@2 ~@2 [a3,c#4,e4,a4] ~@5 [c#4,e4,g#4,c#5] ~ [b3,d4,f#4,b4]!2 [b3,d4,f#4,b4]@2, a3 ~@15", // A C#m Bm
  B: "[a3,c#4,e4,a4] ~@3 [a3,c#4,e4,a4] ~@5 [c#4,e4,g#4,c#5] ~ [b3,d4,f#4,b4]!2 [b3,d4,f#4,b4]@2", // A C#m Bm
  C: "[a3,c#4,e4,a4] ~@3 [e4,a4]@2 ~@4 [c#4,e4,g#4,c#5] ~ [b3,d4,f#4,b4]!3 ~, ~@4 [a3,c#4] ~@11", // A A5 C#m Bm A
  D: "[c#3,g#3,c#4,e4,g#4]", E: "[b2,b3,d4,f#4]", F: "[c#3,e3,g#3,c#4,e4,g#4]@3 ~",
  G: "[b2,b3,d4,f#4]!2 ~ [b2,b3,d4,f#4]!2 ~ [b2,b3,d4,f#4] ~ [e3,g#3,b3,e4,g#4,b4] ~@7", // Bm E
  H: "[b3,d#4,f#4,b4] ~@3 [b3,d#4,f#4,b4] ~@5 [d#4,f#4,a#4,d#5] ~ [c#4,e4,g#4,c#5]!2 [c#4,e4,g#4,c#5]@2", // B D#m C#m
  I: "[b3,d#4,f#4,b4] ~@3 [f#4,b4]@2 ~@4 [d#4,f#4,a#4,d#5] ~ [c#4,e4,g#4,c#5]!3 ~, ~@4 [b3,d#4] ~@11", // B B5 D#m C#m B
  J: "[d#4,f#4,b4]@2 ~@2 [b3,d#4,f#4,b4] ~@5 [d#4,f#4,a#4,d#5] ~ [c#4,e4,g#4,c#5]!2 [c#4,e4,g#4,c#5]@2, b3 ~@15", // B D#m C#m
  K: "[d#3,a#3,d#4,f#4,a#4]", L: "[c#3,c#4,e4,g#4]", M: "[d#3,f#3,a#3,d#4,f#4,a#4]@3 ~",
  N: "[c#3,c#4,e4,g#4]!2 ~ [c#3,c#4,e4,g#4]!2 ~ [c#3,c#4,e4,g#4] ~ [f#3,a#3,c#4,f#4,a#4,c#5] ~@7", // C#m F#
  O: "[b2,b3,f#4] ~@7, d#4 ~@15", // B5
})).s("gm_piano").gain(0.72)

// chords · brass section · "BRASS 1"
const brass_section = note(`<
  ~@14 A B C D ~@4 E@2 F@2 G@2 H@2 A B C D ~@12 I@2 J@2 K@2 L@2 ~@8 M A N O P@2 Q@2 P@2 Q@2 R@2 S@2 T U
>`.pickRestart({
  A: "[c#3,c#4,e4,g#4]@15 ~", B: "[b2,b3,d4,f#4]@15 ~", C: "[c#3,c#4,e4,g#4]@7 ~",
  D: "[b2,b3,d4,f#4]!2 ~ [b2,b3,d4,f#4]!2 ~ [b2,b3,d4,f#4] ~ [e4,g#4,b4] ~@7", // Bm E
  E: "[[a3,a4]@21 ~ [f#3,f#4]@2 [e3,e4] ~ [e3,e4]@2 [f#3,f#4]@2 [e3,e4]@2]/2", // A F# E F# E
  F: "[[a2,a3]@21 ~ [e3,e4] ~ [e3,e4] ~ [e3,e4]@2 [f#3,f#4]@2 [e3,e4] ~]/2", // A E F# E
  G: "[[a3,a4]@22 [e3,e4]@2 [f#3,f#4] ~ [f#3,f#4]@2 [e3,e4]@2 [f#3,f#4] ~, [g3,g4] ~@31]/2", H: "[[a2,a3]@13 ~@3]/2",
  I: "[~@4 [e4,e5] ~@3 [e4,e5] ~ [g#4,g#5]@2 ~@2 [f#4,f#5]@17 ~]/2", // E G# F#
  J: "[[e4,e5]@7 ~ [e4,e5] ~ [g#4,g#5] ~@3 [a4,a5]@11 ~@7]/2", // E G# A
  K: "[[a4,a5]@21 ~ [f#4,f#5]@2 [e4,e5] ~ [e4,e5]@2 [f#4,f#5]@2 [e4,e5]@2]/2", // A F# E F# E
  L: "[[b4,b5]@22 [g#4,g#5]@2 [f#4,f#5] ~ [f#4,f#5]@2 [g#4,g#5]@2 ~@2]/2", M: "[d#3,d#4,f#4,a#4]@15 ~",
  N: "[d#3,d#4,f#4,a#4]@7 ~", O: "[c#3,c#4,e4,g#4]!2 ~ [c#3,c#4,e4,g#4]!2 ~ [c#3,c#4,e4,g#4] ~ [f#4,a#4,c#5] ~@7",
  P: "[[b3,b4]@21 ~ [g#3,g#4]@2 [f#3,f#4] ~ [f#3,f#4]@2 [g#3,g#4]@2 [f#3,f#4]@2]/2", // B G# F# G# F#
  Q: "[[b2,b3]@21 ~ [f#3,f#4] ~ [f#3,f#4] ~ [f#3,f#4]@2 [g#3,g#4]@2 [f#3,f#4] ~]/2", // B F# G# F#
  R: "[[b3,b4]@22 [f#3,f#4]@2 [g#3,g#4] ~ [g#3,g#4]@2 [f#3,f#4]@2 [g#3,g#4] ~, [a3,a4] ~@31]/2", // B F# G# F# G# A
  S: "[[b2,b3]@13 ~@3]/2", T: "[b3,b4]", U: "[d#5,f#5] ~@15, b5 ~@7",
})).s("gm_brass_section").gain(0.8)

// chords · vibraphone
const vibraphone = note(`<
  ~@2 A B@3 A B@3 A B@3 ~@4 A B@3 A B@3 A B@3 ~@4 A B@3 C D E@2 F@2 G@2 ~@4 A B H@2 I H@3 I H@3 ~@4 I H@3 I H@3 I H@3 I
  ~
>`.pickRestart({
  A: "[a4,c#5,e5]@6 ~@2 [g#4,b4]@3 ~ [f#4,a4]@2 ~@2", B: "[a4,c#5,e5]@6 ~@2 [g#4,b4]@3 ~ [f#4,a4]@3 ~",
  C: "[e4,e5]@3 ~@5 [f#4,f#5]@2 [a4,a5]@4 [c#5,c#6]@2, ~@2 [e4,e5]@3 ~@3", // E F# A C# E
  D: "~@2 [c#5,c#6]@4 [b4,b5] ~ [a4,a5]@2 [g#4,g#5]@2 [f#4,f#5]@2 [g#4,g#5] ~", // C# B A G# F# G#
  E: "[[e4,e5]@3 ~ [e4,e5]@3 ~ [f#4,f#5] ~ [a4,a5]@4 [c#5,c#6]@4 [c#5,c#6]@2 ~@2 [a4,a5]@4 [a4,a5] ~ [g#4,g#5] ~ [f#4,f#5] ~]/2", // E F# A C# A G# F#
  F: "[[e5,e6]@4 [e5,e6]@3 ~ [f#5,f#6]@2 [e5,e6] ~@3 [b4,b5]@4 [c#5,c#6] ~@5 [d5,d6]@2 [c#5,c#6] ~ [b4,b5]@2 [a4,a5] ~, ~@11 [c#5,c#6]@2 ~@3]/2", // E F# E B C# D C# B …
  G: "[[g#4,g#5]@3 ~ [a4,a5]@3 ~ [f#4,f#5]@2 [e4,e5] ~ [f#4,f#5]@2 [a4,a5]@4 ~@2 [c#5,c#6]@3 ~ [c#5,c#6]@2 [b4,b5] ~ [a4,a5]@2 ~@2, ~@18 [b4,b5]@5 ~@9]/2", // G# A F# E F# A C# B …
  H: "[b4,d#5,f#5]@6 ~@2 [a#4,c#5]@3 ~ [g#4,b4]@3 ~", I: "[b4,d#5,f#5]@6 ~@2 [a#4,c#5]@3 ~ [g#4,b4]@2 ~@2",
})).s("gm_vibraphone").gain(0.52)

// drums · kick
const kick = s("bd").struct("<~@2 A@12 B@3 C A@12 B@3 C A@12 B@3 C A@12 B@3 C A@13 C>".pickRestart({
  A: "x ~@3 x!2 ~ x", B: "x ~ x ~@3 x!3 ~ x ~@3 x ~", C: "x",
})).gain(0.78)

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

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

// drums · clap
const clap = s("cp").struct("<~@2 A@15 ~ A@15 ~ A@15 ~ A@15 ~ A@13 ~>".pickRestart({
  A: "~ x ~ x",
})).gain(0.78)

// drums · low tom
const low_tom = s("lt").struct("<~ A ~@15 B ~@15 B ~@15 B ~@15 B ~@14>".pickRestart({
  A: "~@6 x!2", B: "~ x",
})).gain(0.78)

// drums · hihat
const hihat = s("hh").struct("<A@2 B@15 C B@15 C B@15 C B@15 C B@13 ~>".pickRestart({
  A: "~ x ~ x", B: "x!4", C: "~@2 x!2 ~@2 x ~@9",
})).gain(0.78)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~ A ~@15 B ~@15 B ~@15 B ~@15 B ~@14>".pickRestart({
  A: "~@5 x ~@2", B: "~@3 x ~@4",
})).gain(0.78)

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

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

// drums · ride
const ride = s("rd").struct(`<
  ~@2 A B A B A B A B A B A B A B A C A B A B A B A B A B A B A B A C A B A B A B A B A B A B A B A C A B A B A B A B A
  B A B A B A C A B A B A B A B A B A B A ~
>`.pickRestart({
  A: "x!8", B: "x ~ x!6", C: "x",
})).gain(0.78)

stack(
  bass, piano, brass_section, vibraphone, kick, snare, snare_soft, clap, low_tom, hihat, hihat_soft, mid_tom, open_hat,
  crash, ride
)