Strudelify

River Deep - Mountain High

Ike & Tina Turner

KeyB♭ majorTempo168 bpm
0:00/0:00
// River Deep - Mountain High — Ike & Tina Turner
// 168 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 153 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(168/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
const bass = note(`<
  A B C D E ~ F G F H I J K L F G F M I N O P I Q R S I T O S I U V W X Y I Z AA AB AC V X Y AD AE AF AG@2 B C D E ~ F G
  F H I J K L F G F M I N O P I Q R S I T O S I U V W X Y I Z AA AB AC V X Y AD AE AF AH@2 AI AJ AK AJ AK AJ AK AJ AK AJ
  AK AJ AL AM AN AO AP AJ AK AJ AK AJ AK AJ AK AJ AK AJ AK AJ AK AJ AK AQ AR V W X Y I Z AA AB AC V X Y AD AE AF AG@2 B
  C D E
>`.pickRestart({
  A: "~@14 f2 ~", B: "bb2 ~ bb2 ~ ab2 ~ bb2@5 ~ ab2@2 ~@2", C: "f2 ~ f2 ~ eb2 ~ f2@5 ~ eb2@2 ~@2",
  D: "bb1 ~ bb1 ~ ab1 ~ bb1@5 ~ ab1@3 ~", E: "bb1 ~ bb1 ~@5", F: "eb2@5 ~ eb2 ~ eb2@6 ~@2",
  G: "eb2@5 ~ bb1 ~ eb2@6 ~@2", H: "eb2@5 ~ bb1 ~ eb2@7 ~", I: "bb1@5 ~ bb1 ~ bb1@6 ~@2", J: "bb1@5 ~ f1 ~ bb1@5 ~@3",
  K: "bb1@5 ~ bb1 ~ bb1@5 ~@3", L: "bb1@6 f1 ~ bb1@5 ~@3", M: "eb2@6 bb1 ~ eb2@6 ~@2", N: "bb1@5 ~ f1 ~ bb1@3 ~ g1@3 ~",
  O: "f1@4 ~@2 f1 ~ f1@6 ~@2", P: "f1@5 ~ f1 ~ f1@4 g1@4", Q: "bb1@4 ~@2 bb1 ~ bb1@4 g1@4", R: "f1@5 ~ f1 ~ f1@6 ~@2",
  S: "f1@4 ~@2 f1 ~ f1@3 ~ g1@3 ~", T: "bb1@5 ~ bb1 ~ bb1@3 ~ g1@4", U: "bb1@4 ~@2 bb1@2 c2@4 bb1@3 ~",
  V: "ab1@4 ~@2 ab1 ~ ab1@6 ~@2", W: "ab1@4 ~@2 ab1 ~ ab1@7 ~", X: "ab1 ~ ab1@2 g1@2 ab1@2", Y: "bb1 ab1 g1 ab1",
  Z: "bb1@4 ~@2 bb1 ~ bb1@6 ~@2", AA: "bb1 ~ bb1@2 a1@2 bb1@2", AB: "c2 bb1 a1 bb1", AC: "ab1@5 ~ ab1 ~ ab1@6 ~@2",
  AD: "bb1@5 ~ bb1 ~ bb1@5 ~ f1 ~", AE: "bb1@2 ~ bb1@4 ~", AF: "bb1@5 ~ bb1@6 ~@2 f1 ~",
  AG: "[bb1@4 ~@26 f2 ~, ~@3 bb1@13]/2", AH: "[bb1@2 ~ bb1@13]/2", AI: "~@5 f1 ab1 a1",
  AJ: "bb1@2 ~@2 bb1@5 ~ f1@2 ab1@2 a1@2", AK: "bb1@2 f1@2 db2 ~ bb1@3 ~ f1@2 ab1@2 a1@2",
  AL: "bb1@2 f1@2 db2 ~ bb1@3 ~ bb1@2 db2@2 d2@2", AM: "eb2@2 ~@2 eb2@5 ~ bb1@2 db2@2 d2@2",
  AN: "eb2@2 bb1@2 gb2@2 eb2@3 ~ bb1@2 db2@2 d2@2", AO: "eb2@2 ~@2 eb2@5 ~ bb1 ~ db2@2 d2@2",
  AP: "eb2@2 bb1@2 gb2 ~ eb2@3 ~ f1@2 ab1@2 a1@2", AQ: "bb1@7 ~ bb1@7 ~", AR: "bb1@7 ~ bb1@4 a1@4",
})).s("gm_acoustic_bass").gain(0.45)

// other · brass section
const brass_section = note(`<
  A B C D E ~@15 F@12 ~@6 G H ~@2 I J ~ K ~ L@2 B C D M ~@15 F@12 ~@6 G H ~@2 I J ~ K ~ L@2 ~@13 N@4 O@4 ~@20 G H ~@2 I
  J ~ K ~ L@2 B C D E
>`.pickRestart({
  A: "~@14 [f4,f5] ~", B: "[bb4,bb5] ~ [bb4,bb5] ~ [ab4,ab5] ~ [bb4,bb5]@5 ~ [ab4,ab5]@3 ~",
  C: "[f4,f5] ~ [f4,f5] ~ [eb4,eb5] ~ [f4,f5]@5 ~ [eb4,eb5]@2 ~@2", // F Eb F Eb
  D: "[bb3,bb4] ~ [bb3,bb4] ~ [ab3,ab4] ~ [bb3,bb4]@5 ~ [ab3,ab4]@3 ~", E: "[bb3,bb4] ~ [bb3,bb4] ~@5",
  F: "[[f2,f3,f4]@26 [f2,f3,f4] ~ [g2,g3,g4] ~ [bb2,bb3,bb4]@34]/4", G: "~ [bb4,bb5] [a4,a5] [bb4,bb5]",
  H: "[c5,c6] [bb4,bb5] [a4,a5] [bb4,bb5]", I: "~ [ab4,ab5] [g4,g5] [ab4,ab5]",
  J: "[bb4,bb5] [ab4,ab5] [g4,g5] [ab4,ab5]", K: "[bb4,bb5]@3 ~@3 [bb4,bb5]@3 ~@7",
  L: "[[bb4,bb5]@3 ~@3 [bb4,bb5]@22 ~@4]/2", M: "[bb3,bb4]@2 ~@2 [bb3,bb4]@3 ~@9", N: "[[eb3,eb4,eb5]@63 ~]/4",
  O: "[[bb2,bb3,bb4]@7 ~]/4", // Bb
})).s("gm_brass_section").gain(0.33)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  A B C D E ~@17 F G ~@2 H I ~@2 J K ~@2 L M ~@2 N O ~@2 L M ~@4 A B C D P ~@17 F G ~@2 H I ~@2 J K ~@2 L M ~@2 N O ~@2
  L M ~@9 Q R S T U V W V X Y Z Y AA AB AC AD AE AB AC AD AE AB AC AD AE AB AC AD AE AF@2 ~@2 L M ~@2 N O ~@2 L M ~@4 A
  B C D P
>`.pickRestart({
  A: "~@14 [f4,f5] ~", B: "[bb4,bb5] ~ [bb4,bb5] ~ [ab4,ab5] ~ [bb4,bb5]@5 ~ [ab4,ab5]@3 ~",
  C: "[f4,f5] ~ [f4,f5] ~ [eb4,eb5] ~ [f4,f5]@5 ~ [eb4,eb5]@2 ~@2", // F Eb F Eb
  D: "[bb3,bb4] ~ [bb3,bb4] ~ [ab3,ab4] ~ [bb3,bb4]@5 ~ [ab3,ab4]@3 ~", E: "[bb3,bb4] ~ [bb3,bb4] ~@5",
  F: "[eb5,g5]@2 [d5,f5] ~ [d5,f5]@2 [c5,eb5] ~", G: "[c5,eb5]@4 d5@2 ~@2 [bb4,d5]@4 [a4,c5]@3 ~, ~@4 bb4 ~@11",
  H: "[eb5,g5]@2 d5 ~ [d5,f5]@2 [c5,eb5] ~, ~@4 f5 ~@11", I: "[c5,eb5]@2 [bb4,d5] ~ [bb4,d5]@2 [a4,c5]@2",
  J: "[eb5,g5]@2 [d5,f5] ~ [d5,f5]@2 c5 ~, ~@12 eb5 ~@3", K: "[c5,eb5]@2 d5 ~ [bb4,d5]@2 [a4,db5]@2, ~@4 bb4 ~@11",
  L: "~ [ab4,ab5] [g4,g5] [ab4,ab5]", M: "[bb4,bb5] [ab4,ab5] [g4,g5] [ab4,ab5]", N: "~ [bb4,bb5] [a4,a5] [bb4,bb5]",
  O: "[c5,c6] [bb4,bb5] [a4,a5] [bb4,bb5]", P: "[bb3,bb4]@2 ~@2 [bb3,bb4]@3 ~@9", Q: "~@10 f3@2 ab3 ~ a3 ~",
  R: "bb3@2 ~@2 bb3@5 ~ f3@2 ab3 ~ a3 ~", S: "bb3 ~ f3 ~ db4 ~ bb3@2 ~@2 f3@2 ab3 ~ a3 ~",
  T: "bb3 ~@3 bb3@5 ~ f3@2 ab3 ~ a3 ~", U: "bb3 ~ f3 ~ db4 ~ bb3@2 ~@2 f3@2 [ab3,ab4] ~ [a3,a4] ~, ~@10 f4 ~@5",
  V: "bb4@2 ~@2 [bb3,bb4]@5 ~ f3@2 [ab3,ab4] ~ [a3,a4] ~, bb3 ~@9 f4 ~@5", // Bb Ab A
  W: "[bb3,bb4] ~ f4@2 [db4,db5] ~ [bb3,bb4]@2 ~@2 f3@2 [ab3,ab4] ~ [a3,a4] ~, ~@2 f3 ~@7 f4 ~@5", // Bb Db Bb Ab A
  X: "[bb3,bb4] ~ f4@2 [db4,db5] ~ [bb3,bb4]@2 ~@2 bb3@2 [db4,db5] ~ d4@2, ~@2 f3 ~@7 bb4 ~@3 d5 ~", // Bb Db Bb Db
  Y: "[eb4,eb5] ~@3 [eb4,eb5]@5 ~ [bb3,bb4] ~ [db4,db5] ~ d4@2, ~@14 d5 ~", // Eb Bb Db
  Z: "eb5@2 [bb3,bb4] ~ [gb4,gb5] ~ [eb4,eb5]@3 ~ [bb3,bb4] ~ [db4,db5] ~ d4@2, eb4 ~@13 d5 ~", // Bb Gb Eb Bb Db
  AA: "[eb4,eb5] ~ [bb3,bb4] ~ [gb4,gb5] ~ [eb4,eb5]@3 ~ [f3,f4] ~ [ab3,ab4] ~ a3@2, ~@14 a4 ~", // Eb Bb Gb Eb F Ab
  AB: "bb3@2 ~@2 [bb3,bb4]@5 ~ f3@2 [ab3,ab4] ~ [a3,a4] ~, bb4 ~@9 f4 ~@5", // Bb Ab A
  AC: "[bb3,bb4] ~ [f3,f4] ~ [db4,db5] ~ bb3@2 ~@2 f3@2 [ab3,ab4] ~ [a3,a4] ~, ~@6 bb4 ~@3 f4 ~@5", // Bb F Db Ab A
  AD: "[bb3,bb4] ~@3 [bb3,bb4]@5 ~ f3@2 [ab3,ab4] ~ [a3,a4] ~, ~@10 f4 ~@5", // Bb Ab A
  AE: "[bb3,bb4] ~ [f3,f4] ~ [db4,db5] ~ [bb3,bb4]@2 ~@2 f3@2 [ab3,ab4] ~ [a3,a4] ~, ~@10 f4 ~@5", // Bb F Db Bb Ab A
  AF: "[bb3@16 bb5@11 ~ [a4,a5]@4, bb4@7 ~]/2", // A
})).s("gm_string_ensemble_1").gain(0.4)

// chords · string ensemble 1
const string_ensemble_1_2 = note(`<
  ~ A@4 ~ B@4 C@4 B@4 D@2 E@2 ~@2 E@2 ~@2 E@2 ~@2 F@3 ~ G@3 ~ H@2 ~@2 I@2 J K@2 L@4 ~ B@4 C@4 B@4 D@2 E@2 ~@2 E@2 ~@2
  E@2 ~@2 F@3 ~ G@3 ~ H@2 ~@2 I@2 J K@2 ~@35 F@3 ~ G@3 ~ H@2 ~@2 I@2 J K@2 L@4
>`.pickRestart({
  A: "[[bb2,bb3]@13 ~@3]/4", B: "[eb3,eb4]/4", C: "[[bb2,bb3]@31 ~]/4", D: "[[bb2,bb3]@7 g3, ~@14 g2 ~]/2",
  E: "[f4,a4]/2", F: "[[ab3,ab4,c5]@17 ~@7]/3", G: "[[bb3,bb4,d5]@17 ~@7]/3", H: "[ab3,ab4,c5]/2",
  I: "[[bb3,bb4,d5]@14 ~ [bb3,bb4,d5]@2 ~@5 [bb3,bb4,d5]@2 ~@8]/2", J: "[bb3,bb4,d5]@7 ~",
  K: "[[bb3,bb4,d5] ~@2 [bb3,bb4,d5]@10 ~@3]/2", L: "[bb3@13 ~@3]/4",
})).s("gm_string_ensemble_1").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  A B@3 C ~ D@28 B E D@2 F G D@2 B E D H@2 I A B@3 C ~ D@28 B E D@2 F G D@2 B E D H@2 I ~@6 J@7 K C H L F C H L F C H L
  F C H L F C H L F M N D@2 B E D@2 F G D@2 B E D H@2 I A B@3 C
>`.pickRestart({
  A: "~@7 x", B: "x!4", C: "x", D: "x ~@2 x!2 ~@3", E: "x!3 ~", F: "x ~@2 x ~ x ~ x", G: "~ x ~ x ~ x ~@2",
  H: "x ~@2 x ~ x ~@2", I: "x ~@2 x ~@4", J: "~ x ~ x", K: "~ x ~@2", L: "x ~@4 x ~@2", M: "x ~@3 x!2 ~@2",
  N: "x!2 ~ x ~@3 x",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct(`<
  ~@4 A ~ B@13 C B@14 ~ D B@2 E F B@2 ~ D B@3 A ~@4 A ~ B@13 C B@14 ~ D B@2 E F B@2 ~ D B@3 A ~@13 D B@21 G B@2 ~ D B@2
  E F B@2 ~ D B@3 A ~@4 A
>`.pickRestart({
  A: "~ x ~@2", B: "~ x ~ x", C: "~@2 x ~@2 x!3", D: "~@5 x!3", E: "~ x!3", F: "x ~ x ~ x ~ x!2", G: "~@2 x ~ x!3 ~",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@6 A@13 B A@12 C A ~@2 C A ~@2 C A ~@2 B ~ D ~ E ~@5 A@13 B A@12 C A ~@2 C A ~@2 C A ~@2 B ~ D ~@2 F G@11 H E@22 C A
  ~@2 C A ~@2 C A ~@2 B ~ D ~ E ~@4
>`.pickRestart({
  A: "x!8", B: "x!7 ~", C: "~ x!7", D: "~ x!3", E: "x!4", F: "x!2 ~@2", G: "~ x ~ x", H: "~ x ~@2",
})).gain(0.25)

// drums · mid tom
const mid_tom = s("mt").struct("<~@31 [~@7 x] ~@47 [~@7 x] ~@73>").gain(0.45)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@34 A ~@3 A ~@3 A ~ B C D ~@35 A ~@3 A ~@3 A ~ B C D ~@2 E ~@36 A ~@3 A ~@3 A ~ B C D ~@6
>`.pickRestart({
  A: "x", B: "~@7 x", C: "~@3 x", D: "~ x ~ x ~ x ~@2", E: "~ x",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@31 [~@5 x ~@2] ~@47 [~@5 x ~@2] ~@73>").gain(0.45)

// drums · crash
const crash = s("cr").struct(`<
  ~@6 A ~@3 A ~@3 A ~@3 A ~ A ~@3 A ~@3 A ~@3 A ~ B C A ~ B D A ~ B C ~ E A E ~@6 A ~@3 A ~@3 A ~@3 A ~ A ~@3 A ~@3 A
  ~@3 A ~ B C A ~ B D A ~ B C ~ E A E ~@22 F ~ F ~ F ~ F ~ F ~ F ~ F ~ A ~ B C A ~ B D A ~ B C ~ E A E ~@4 G
>`.pickRestart({
  A: "x", B: "~ x!3", C: "x!3 ~", D: "x!4", E: "x ~@2 x ~@4", F: "~ x ~@2", G: "x!2 ~@2",
})).gain(0.35)

stack(
  bass, brass_section, string_ensemble_1, string_ensemble_1_2, kick, snare, hihat, mid_tom, open_hat, high_tom, crash
)

More by Ike & Tina Turner