Strudelify

Be Good to Yourself

Journey

KeyA minorTempo140 bpm
0:00/0:00
// Be Good to Yourself — Journey
// 140.4 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 164 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(140.4/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.

// chords · piano
const piano = note("<~ A@6 B@2 ~@64 A@6 B@2 A@6 B@2 ~@64 A@6 B@2 C@3>".pickRestart({
  A: "[~@2 [d4,g4,b4]@2 [d4,g4,a4]@3 [d4,g4,c5]@2 [d4,g4,c5]@2 [d4,g4,c5] [d4,g4,b4]@2 [d4,g4,a4]@2]/2", // G Dsus4 Csus2 G Dsus4
  B: "[~@2 [d4,g4,b4]@2 [d4,g4,a4]@3 [f#4,a4,d5]@2 [f#4,a4,d5]@2 [f#4,a4,d5] [d4,f#4,b4]@2 ~@2]/2", // G Dsus4 D Bm
  C: "[[d4,g4,b4]@17 ~@7]/3", // G
})).s("gm_piano").gain(0.4)

// bass · electric bass finger
const bass = note(`<
  ~ A@2 B@4 C@3 D@2 E@2 F@2 G@2 D@2 H@4 I J K L M@2 N@2 O J K L M@2 N@2 P@2 D@2 E@2 F@2 G@2 D@2 H@4 I J K L M@2 N@2 O J
  K L M@2 N@2 O A@2 B@4 Q@2 J K L M@2 I R@2 J@2 O@2 S@2 L@2 J@2 O@2 S@2 L@2 J@2 O@2 S@2 L@2 J@2 O@2 S@2 L@2 J@2 O@2 S@2
  L@2 J@2 O@2 S@2 L@2 J@2 O@2 S@2 L@2 J@2 O@2 S@2 L@2 A@2 B@4 Q@2 T@3
>`.pickRestart({
  A: "[g1@7 b1]/2", B: "[c2@14 g1 e1@15 b1@2]/4", C: "[c2@6 a1 d2@2 d2!6 e1@2 e1!7]/3", D: "[e1!6 g#1 a1@2 a1!7]/2",
  E: "[a1!7 b1@2 b1!7]/2", F: "[b1!7 e1@2 e1!7]/2", G: "[e1 d#2 e2@2 d#2 e2 b1 e1@2 e1!7]/2",
  H: "[a1!7 c#2@2 c#2!6 a1@2 a1!2 b1@2 b1!2 e1@2 e1!7]/4", I: "e1!8", J: "g1!8", K: "g1!6 b1!2", L: "c2!8",
  M: "[c2!6 g1 e1@2 e1!7]/2", N: "[e1!7 d2@2 d2!7]/2", O: "d2!8", P: "[d2!5 ~@2 e1@2 e1!7]/2",
  Q: "[c2@6 a1 d2@2 d2!7]/2", R: "[c2!7 d2@2 d2!7]/2", S: "f1!8", T: "[g1@17 ~@7]/3",
})).s("gm_electric_bass_finger").gain(0.64)

// chords · string ensemble 1
const string_ensemble_1 = note("<~@15 A B@4 C@7 D@3 E@8 F@2 G@8 H@4 C@7 D@3 E@8 I@8 ~@11 J@56 K@8 ~@11>".pickRestart({
  A: "~@5 [b3,e4] [b3,d#4] [b3,e4]", B: "[~@21 g#3 a3 b3@2 a3@7, ~@7 e3@15 ~@10]/4",
  C: "[~@29 [b3,e4] [b3,d#4] [b3,e4]@9 [b3,d4]@14 ~@2, a3, ~@7 b3@17 ~@32, ~@23 e3@12 ~@5 g3@16]/7", // E5 B E5 Bm
  D: "[[g3,c4,e4]@14 ~ [g3,b3,e4]@9]/3", // C Em
  E: "[~@7 [f#3,d4]@17 [b3,d4]@14 ~@2 [g3,c4,e4]@14 ~ [g3,b3,e4]@9, ~@7 a3@57, ~@3 g3@2 ~@3]/8", // D Bm C Em
  F: "[~@7 [f#3,a3,d4]@9]/2", G: "[~@4 [f#3,d4] ~@56 [b3,e4] [b3,d#4] [b3,e4], ~ a3@15]/8",
  H: "[~@21 g#3 ~ b3@2 a3@7, ~@7 e3@15 a3@3 ~@7]/4", I: "[~@7 [f#3,d4]@17 ~@40, ~@7 a3@57]/8",
  J: "[[g3,b3] ~@2 [e3,g3], d3 c3, ~ a3@3, ~ f3@2 ~]/8", K: "[[g3,b3] ~@2 [e3,g3], d3 c3, ~ f3@2 ~]/8",
})).s("gm_string_ensemble_1").gain(0.4)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@2 A ~ A@4 B ~@15 C ~@31 C ~@17 A ~ A@4 D ~@7 E ~@65 A ~ A@4 D ~@3>".pickRestart({
  A: "~@3 x", B: "~ x!6 ~", C: "~@6 x!2", D: "~ x!7", E: "~ x!5 ~@2",
})).gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct("<~@2 A ~ A@4 ~@16 B ~@31 B ~@17 A ~ A@4 ~@74 A ~ A@4 ~@4>".pickRestart({
  A: "~@3 x", B: "~@4 x!2 ~@2",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct(`<
  A ~@8 B C@4 D B D B C@2 D E@2 B F ~@16 B C@4 D B D B C@2 D E@2 B F ~@107
>`.pickRestart({
  A: "x!4", B: "~ x!7", C: "x!8", D: "x!7 ~", E: "~ x!6 ~", F: "x",
})).gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~@24 [~@3 x ~@4] ~@31 [~@3 x ~@4] ~@107>").gain(0.64)

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

// drums · ride bell
const ride_bell = s("rd").struct(`<
  ~@25 A B A C A C A B A B A C A C A D ~@16 A B A C A C A B A B A C A C A E ~@8 A B A C A B F ~ A B@3 A B@3 A B@3 A B@3
  A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 A B@3 ~@11
>`.pickRestart({
  A: "~ x!7", B: "x!8", C: "x!7 ~", D: "x", E: "x!6 ~@2", F: "~ x!6 ~",
})).gain(0.64)

stack(piano, bass, string_ensemble_1, kick, snare, low_tom, mid_tom, open_hat, high_tom, crash, ride_bell)

More by Journey