Strudelify

Straight On

Heart

KeyB minorTempo115 bpm
0:00/0:00
// Straight On — Heart
// 115 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 134 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(115/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 finger · "Bass"
const bass = note(`<
  ~ A@2 B@2 C@2 D E F@2 G@2 H@2 I@2 F@2 J@2 K L M N O P O P O Q R S T U V W X Y@2 Z@2 AA AB AC AD F@2 G@2 H@2 AE AF AG P
  AG P AG AH AI S T U AJ AK AL AM AN@2 AO AP AQ AR AS AT AU AV AW AX AG AY AZ BA BB BC BD@2 T U BE BF T U BG BH BI BJ BK
  BL BM BN BO T BP V BQ T BR BS BT BU BT BV BW BV BW BX BY BZ@2 CA CB CC@3 CD ~@7
>`.pickRestart({
  A: "[b1@4 b2@2 f#2@2 a2@2 a2@2 b2@8 d3 c#3 b2@2 c#3@2 b2@2 a2@2 a#2@2]/2",
  B: "[b2@2 b1@2 b2@2 f#2@2 a2@2 a2@2 b2@8 e2 f#2 a2@2 f#2 e2 d2@2 b1@2 a1@2]/2",
  C: "[b1@2 f#2@2 b2@2 f#2@2 a2@2 a2@2 b2@6 b2@2 b3@2 a3@2 f#3 e3 d3@2 b2@2 a2@2]/2",
  D: "b2 a2 f#2 ~ b2@2 f#2@2 a2@2 f#2@2 a2@2 d3@2", E: "f#3 ~@3 e3 ~@3 d3 ~@3 a2@2 a#2@2",
  F: "[b2 ~ a2 ~ f#2 ~@2 b2@2 ~ a2 ~ f#2 ~@3]/2", G: "[a2 ~ g2 ~ e2 ~@2 a2@2 ~ g2 ~ e2 ~@3]/2",
  H: "[g2 ~ f2 ~ d2 ~@2 g2@2 ~ f2 ~ d2 e2!2 d2]/2",
  I: "[e2@4 ~@4 e3@2 d3@4 e3@4 e3@2 f#3 e3 d3@2 e3@2 d3@2 a2@2 a#2@2]/2",
  J: "[a2 ~ g2 ~ e2 ~@2 a2@2 ~ g2 ~ e2 f#2 e2 f#2]/2", K: "g2 ~ f2 ~ d2 ~@2 g2", L: "~ g2 f2@2 d2 e2!2 d2",
  M: "e2@2 ~@2 e3 d3 b2 e3", N: "d3 b2 e3 d3 e3 ~@3", O: "b1@7 e2", P: "d2@8 e2 f#2 a2@2 f#2@2 a1@2",
  Q: "d2@8 e2 f#2 a2@2 f#2@2 e2@2", R: "a2 ~ a2 ~ e2 d2 e2 g2", S: "~ g1 g1@2 g1 g1@2 g1", T: "~ g1!5 ~@2",
  U: "f#1@2 f#1@2 f#1!2 ~ f#1", V: "~ f#1!5 ~@2", W: "b1@15 ~", X: "~ f#1!4 ~@3", Y: "b1 ~ b1 ~",
  Z: "[a1 ~ g1 ~ e1 ~@2 a1@2 ~ g1 ~ e1 ~@3]/2", AA: "g1@5 g1 b1 d2@7 d2 e2", AB: "g2@6 d2 e2 g2@2 e2@2 d2@2 d#2@2",
  AC: "e2!3 ~ e3 d3@2 e3", AD: "~@2 e3@2 f#3 e3 d3@2 e3@2 d3@2 a2@2 a#2@2", AE: "e2!3 ~ e3 d3 ~ e3", AF: "~ e2!4 ~@3",
  AG: "b1@8 f#2 ~@3 e2 ~@3", AH: "d2@4 e2 f#2 a2@2 b2@2 a2@2 f#1@2 g1@2", AI: "a1 ~ g1 ~ a1 g1 e1 g1",
  AJ: "~ f#1!3 f#2 e2 d2 e2", AK: "b1@3 f#2@3 b1@2", AL: "c2@3 g2@3 c2@2", AM: "a2@3 a2@2 a2 g2 a2", AN: "b2@5 b2!2 a2",
  AO: "c3@5 c3!2 b2", AP: "a2@5 a2!2 g#2", AQ: "g2@2 ~@2 g2!2 ~@2", AR: "g2!2 ~@2 g2!2 ~@2", AS: "f#2!2 ~@2 f#2!2 ~@2",
  AT: "f#2!2 ~ a1 c#2 ~ f#2 c#2", AU: "e1@2 ~@4 e1 f#1 g#1@2 ~@4 g#1 a1", AV: "b1@2 ~@4 b1 c#2 e2@2 ~@4 c2@2",
  AW: "d2@2 ~@4 f#2 g2 a2@2 ~@4 a2 b2", AX: "d3 b2 a2 f#2 d2 ~@3", AY: "d2@6 e2 f#2 a2@4 b2@2 a2@2",
  AZ: "b2@3 f#2 a2@2 f#2 e2", BA: "d2@6 e2 f#2 a2@8", BB: "b2@8 f#2 ~@3 e2 ~@3",
  BC: "d2@4 e2 f#2 a2@2 a2@2 b2@2 a2@2 f#2@2", BD: "[a2 ~ a2 ~ e2 d2 b1 g1@2 g1!5 ~ g1]/2", BE: "~ f#1!5 ~ f#1",
  BF: "g1@2 g1@2 g1!2 ~ g1", BG: "~ f#1!2 ~ f#2 e2 f#2 e2", BH: "b1@3 f#2@4 b1", BI: "d2@4 b2 a2 f#2 e2",
  BJ: "b1@6 e2 f#2 a2@4 f#2@2 e2@2", BK: "d2@6 e2 f#2 a2@2 a2@2 b2@2 a2@2", BL: "b2@4 f#2 ~ e2 ~",
  BM: "d2@2 f#2 a2 b2 a2 f#2 e2", BN: "a2 ~ f#2 ~ d2 b1 a1 g1", BO: "~ g1!5 ~ g1", BP: "f#1 ~ f#1 ~ f#1!2 ~ f#1",
  BQ: "g1 ~ g1 ~ g1!2 ~ g1", BR: "f#1 ~ f#1 ~ f#1 f#1@2 f#1", BS: "f#1 ~ f#1 ~ f#2 e2 f#2 e2",
  BT: "b1 ~ b2 f#2 a2!2 b2@2", BU: "~ b2 a2 f#2 e2!2 f#2 e2", BV: "~ d3 ~ c#3 ~ b2 ~ a2", BW: "b2 b1 b2 f#2 a2!2 b2@2",
  BX: "f#3 ~ e3 ~ d3 ~@2 a2", BY: "b2@2 b1@2 b2@2 f#2@2 a2@2 b2@2 a2 f#2 e2@2", BZ: "b1@2 ~@2 b1!2 ~@2",
  CA: "b1@4 ~@2 a1 b1 d2@2 d2@2 e2@2 d2@2", CB: "b1@2 ~@2 f#3@2 ~ e3@2 ~ d3@4 a2@2",
  CC: "b2@2 ~@2 f#3@2 ~ e3@2 ~ d3@4 a2@2", CD: "b2@2 f#2@2 b2@2 f#2 a2@2 f#2 a2@2 b2@2 a2@2",
})).s("gm_electric_bass_finger").gain(0.2)

// bass · electric bass finger · "Bass" · soft notes
const bass_soft = note("<~@127 [b2@2 f#2@2 b2@2 f#2 a2@2 f#2 a2@2 b2@2 a2@2]!5 ~@2>")
  .s("gm_electric_bass_finger").gain(0.05)

// chords · electric guitar clean · "Guitar 1"
const electric_guitar_clean = note(`<
  ~ A@2 B@3 C D E F G H I J K L@2 M N O I P Q R@2 S T S T S T U V@2 W@2 X Y F Z AA I J@2 AB@2 M AC AD AE P AF R@2 S T S
  T S T U V@2 W@2 AG AH AI AG AJ AK AL AM@2 AN@2 AO@2 AP AQ S T S T S T U V@2 W@2 V@2 W@2 S T S T S T U V@2 W@2 V@2 W@2
  AR@4 AS AT@7 AU AV@5 AW ~@5
>`.pickRestart({
  A: "~@4 [d4,f#4] ~@7 [d4,f#4] ~@3", // D
  B: "[~@4 [b3,d4] ~@3 [b3,d4] ~@3 [c#4,e4]@2 [b3,d4]@4 ~@2 [b3,e4] ~@3 a3@2 ~@2 a3 b3@6 ~ [d4,f#4] ~@7 [d4,f#4] ~@3]/3", // Bm C#m Bm E5 D
  C: "~@4 [d4,f#4] ~@7 [f#4,b4] ~ b4!2", D: "~@4 [f#4,b4] ~@7 [f#4,b4] ~@3", E: "~@4 [f#4,b4] ~@7 [d4,f#4] ~@3",
  F: "~@4 [f#4,b4]@3 [f#4,b4] ~@2 [f#4,b4] ~@5", G: "~@4 [f#4,b4]@3 [f#4,b4] ~@2 [f#4,b4] ~ [f#4,b4] ~ [f#4,b4] ~",
  H: "~@4 [e4,a4]@3 [e4,a4] ~@2 [e4,a4] ~@5", I: "~@4 [e4,a4]@3 [e4,a4] ~@2 [e4,a4] ~@3 [e4,a4] ~",
  J: "~@4 [d4,g4]@3 [d4,g4] ~@2 [d4,g4] ~@5", K: "~@4 [d4,g4]@3 [d4,g4] ~@2 [d4,g4] ~ d4 ~@3",
  L: "[~@2 [b3,e4]@2 [b3,e4]@6 [b3,e4]@2 [b3,e4]@6 [b3,e4] ~ [b3,e4]@6 [b3,e4]@2 [b3,e4]@4]/2", // E5
  M: "~@4 [f#4,b4]@3 [f#4,b4] ~@2 [f#4,b4] ~@3 f#4 ~", N: "b4 ~@3 [f#4,b4]@3 [f#4,b4] ~@2 f#4 ~ b4 ~@3",
  O: "~@4 [e4,a4]@3 [e4,a4] ~@2 [e4,a4] ~@3 d4 e4", P: "~@4 [d4,g4]@3 [d4,g4] ~@2 [d4,g4] ~@3 [d4,g4] ~",
  Q: "~@4 [d4,g4]@3 [d4,g4] ~@4 [d4,g4] ~@3", // G5
  R: "[~ [b3,e4,g#4] [b3,e4,g#4]@3 [b3,e4,g#4] [b3,e4,g#4]@3 [b3,e4,g#4]!2 [e4,g#4]!2 ~@3, ~@11 b3@2 ~@3]/2", // E
  S: "[b3,d4,f#4]@3 [b3,d4,f#4]@5", T: "~@3 a3, a3@3 a3@3 ~@2, ~ e4@3 e4@4, ~@2 d4@3 d4@3", U: "[a3,c#4,e4]",
  V: "~@2 [b3,d4,g4]@2 ~@4 [b3,d4,g4] ~@7", W: "~@2 [a#3,c#4,f#4]@2 ~@4 [a#3,c#4,f#4] ~@7",
  X: "[d4,f#4,b4]@3 [d4,f#4,b4] [d4,f#4,b4]@2 [d4,f#4,b4]@2 [d4,f#4,b4]@2 [d4,f#4,b4]@2 [d4,f#4,b4]@2 [d4,f#4,b4]@2", // Bm
  Y: "~ [a#3,c#4,f#4]!4 ~@3", Z: "~@4 [f#4,b4]@3 [f#4,b4] ~@2 [f#4,b4] ~@3 [f#4,b4] ~",
  AA: "~@4 [e4,a4]@3 [e4,a4] ~@2 [e4,a4] ~ [e4,a4] ~@3", // A5
  AB: "[~@4 [b3,e4]@2 [b3,e4]@6 [b3,e4]@2 [b3,e4]@4 [a3,d4] [b3,e4] e4@2 e4@2 e4@2 e4@2 [e4,g#4]@4, ~@5 g#4!2 ~]/2", // E5 D5 E5 E
  AC: "~@4 [f#4,b4]@3 [f#4,b4] ~@4 f#4 ~@3", AD: "~@4 [e4,a4]@3 [e4,a4] ~@2 [a2,e4,a4] ~ a2@2 ~@2",
  AE: "a2@2 a2@2 [e4,a4]@3 [e4,a4] ~@2 [e4,a4] ~@3 [e4,a4] ~", AF: "~@4 [d4,g4]@3 [d4,g4] ~@8", AG: "b3@3 b3@5, f#3",
  AH: "c4@3 c4@5, g3", AI: "a3@3 a3@5, e3", AJ: "b3@3 b3@5, [f#4,f#5]",
  AK: "[g4,g5]@3 [f#4,f#5]@3 [e4,e5]@3 [d4,d5]@3 [e4,e5]@2 [e4,e5] [f#4,f#5], c4@3 c4@5", // G F# E D E F#
  AL: "a3@6 ~@2 [c#4,c#5]@3 [d4,d5]@3 [d4,d5] [e4,e5], [e4,e5] ~, ~@3 a3@5", // C# D E
  AM: "[~@2 g4@6 ~@8 [b5,d6] [a5,c#6] [g5,b5]@2 [f#5,a5]@2 [e5,g5]@2 [d5,f#5]@2 [c#5,e5]@4 [b4,d5]@2, [d4,d5] ~, ~@4 g4@5 g4@3 g4@4]/2", // Bm A G F#m Em D C#m Bm …
  AN: "[~@2 f#4@6 ~ [a#4,c#5] [b4,d5]@2 [a#4,c#5]@2 [b4,d5]@2 ~@2 f#4@6 [f#4,c#5]@2 [f#4,a4]@4 [d4,g4]@2, [a#4,c#5]@4 f#4@5 ~@7, ~@8 a#4@5 ~@3, ~@2 c#5 ~]/2", // A#m Bm A#m Bm F#5 F#m G5 A#m
  AO: "[e4 e4@3 e4@5 e4@3 [e4,f#4,b4] [e4,g#4]@2 [c#4,e4], g#4@3 ~]/2", AP: "d4 d4@3 d4@4, f#4",
  AQ: "[d4,a4] [d4,f4,d5] [d4,f#4,f#5] [d4,a4,a5] [d5,d6]@2 ~@2, ~@4 d4 ~@3", // D5 Dm D D5 D
  AR: "[d4,f#4,b4]@3 [d4,f#4,b4] ~@2 [d4,f#4,b4] ~@3 [d4,f#4,b4] ~@5", // Bm
  AS: "~@4 [d4,f#4,b4]@3 [d4,f#4,b4] ~@2 [d4,f#4,b4] ~@3 [d4,f#4,b4] ~", // Bm
  AT: "~@4 [d4,f#4,b4]@3 [d4,f#4,b4] ~@2 [d4,f#4,b4] ~@5", // Bm
  AU: "~@4 [a4,d5] ~@2 [g#4,c#5] ~@2 b4@2 ~@2 f#3!2, ~@5 f#4@3, ~@3 b4", // D5 C#5
  AV: "a3 b3@2 ~ [a4,d5] ~@2 [g#4,c#5] ~@2 b4@2 ~@2 f#3!2, ~@5 f#4@3, ~@3 b4", // D5 C#5
  AW: "a3 b3@2 ~ [a4,d5] ~@2 [g#4,c#5] ~@2 b4@2 b4@4, ~@5 f#4@3", // D5 C#5
})).s("gm_electric_guitar_clean").gain(0.41)

// chords · electric guitar clean · "Guitar 1" · soft notes · D5 C#5 D5 C#5
const electric_guitar_clean_2 = note(`<
  ~@128
  [~@14 f#3!2]
  [a3 b3@2 ~ [a4,d5] ~@2 [g#4,c#5] ~@2 b4@2 ~@2 f#3!2, ~@5 f#4@3, ~@3 b4]!4
  [a3 b3@2 ~ [a4,d5] ~@2 [g#4,c#5] ~@2 b4@2 b4@4, ~@5 f#4@3]
>`).s("gm_electric_guitar_clean").gain(0.2)

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

// drums · snare
const snare = s("sd").struct("<~@8 A B@15 C B@10 D B@17 C B@25 C B@54>".pickRestart({
  A: "~@7 x", B: "~ x ~ x", C: "x!5 ~ x ~", D: "~@2 x ~@3 x!2",
})).gain(0.36)

// drums · hihat
const hihat = s("hh").struct("<[~@5 x ~ x] [~ x ~ x ~ x ~ x]!133>").gain(0.36)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 A ~@15 B ~@10 A ~ B ~@15 B ~@21 C ~@3 B ~@10 C ~@14 C ~@3 C ~@24>".pickRestart({
  A: "~@15 x", B: "~@3 x", C: "~@14 x!2",
})).gain(0.36)

// drums · crash
const crash = s("cr").struct(`<
  ~@9 A ~@15 A ~@10 A ~ A ~@15 A ~@10 A@8 ~ A ~ A ~@3 A ~@10 A ~@3 A ~@10 A ~@3 A ~@3 A ~@19
>`.pickRestart({
  A: "x",
})).gain(0.36)

// drums · tambourine
const tambourine = s("tb").struct("<[~@2 x!2] [x!4]!133>").gain(0.36)

stack(bass, bass_soft, electric_guitar_clean, electric_guitar_clean_2, kick, snare, hihat, mid_tom, crash, tambourine)

More by Heart