Strudelify

So Far Away

Dire Straits

KeyE majorTempo112 bpm
0:00/0:00
// So Far Away — Dire Straits
// 112 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 145 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 26, guitar program 28.
setcpm(112/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 · electric guitar jazz
const electric_guitar_jazz = note(`<
  ~@4 A B C D A B E F G ~@17 A B E F G ~ H@2 ~@2 H@2 ~@10 A B C D A B E F G ~ H@2 ~@2 H@2 ~@10 A B C D A B E D A B C D A
  B E I A B C D A B E D A B C D A B E D A B C D A B E D A B C D A J E I K L M N A O P Q K R M N A O S@3 ~@2
>`.pickRestart({
  A: "~@5 [g#3,b3] [a3,a#3,c4,c#4] [b3,c4,d4,d#4] [c#4,e4] [e4,g#4] ~ [c#4,e4,a4] ~@4", // G#m C#m E A
  B: "[d#4,f#4]@7 ~ [d#4,f#4] ~ [e4,g#4] ~@5", C: "[c#4,e4]@3 ~", D: "f#3 f#3@3", E: "[c#4,e4]@12 ~@2 f#3 ~",
  F: "f#3@4 f#3@5 ~ f#3@5 ~", G: "f#3@13 ~@3", H: "[~@6 d#4@5 ~ d#4@2 b3@17 ~]/2", I: "f#3@4 f#3@5 ~@7",
  J: "[d#4,f#4]@7 ~ [e4,g#4]@2 ~ [e4,g#4]@2 ~ [d#4,f#4]@2", K: "~@5 [g#3,a#3] [c4,d4,e4] ~ f#4@2 ~ e4 ~@2 c#4@2",
  L: "d#4@6 ~@2 e4 ~@2 d#4@2 ~ b3 ~", M: "c#4@15 ~", N: "~ f#3@3",
  O: "[d#4,f#4]@7 ~ [d#4,f#4] ~ [e4,g#4] ~@5, d#5@13 ~@3", P: "[c#4,e4]@12 ~@2 f#3 ~, c#5@7 ~", Q: "f#3 f#3@3, b4",
  R: "d#4@6 ~@2 e4 ~@2 d#4@2 ~ b3@2", S: "[[c#4,e4]@14 ~@4 f#3@2 ~ [b4,e5]@25 ~@2, c#5@18 ~@2 g#4@25 ~@3]/3",
})).s("gm_electric_guitar_jazz").gain(0.23).pan(0.4)

// chords · piano
const piano = note("<~@23 A B ~@2 C D@3 ~@14 A B ~@2 C D@3 ~@18 A B ~@2 C D@3 ~@66>".pickRestart({
  A: "~@4 [b3,e4] [b3,e4]@2 [b3,e4]", B: "[c#4,e4]!2 [b3,e4]@2", C: "~@2 b3!2",
  D: "[b3@3 a3 [g#3,g#4]@5 ~@3, e4@3 ~, a4 ~@2]/3", // G#
})).s("gm_piano").gain(0.07)

// chords · electric guitar jazz
const electric_guitar_jazz_2 = note(`<
  ~@17 A ~@21 A ~@19 B@2 ~@4 A ~@61 C D ~@2 E F ~@2 C D ~@2 E G H@2 ~@2
>`.pickRestart({
  A: "b3@11 ~ [c#4,e4] ~@3", B: "[~@8 g#3@2 f#3 ~ e3 ~ f#3@15 ~@3]/2", C: "f#4@7 ~ g#3@2 ~ f#3@2 ~ d#3 ~", D: "e3@7 ~",
  E: "~@10 [e4,g#4] ~@5", F: "[c#4,e4]@3 ~", G: "[c#4,e4]@7 ~", H: "[~@5 g#3@25 ~@2]/2",
})).s("gm_electric_guitar_jazz").gain(0.29).pan(0.4)

// chords · electric guitar jazz · soft notes
const electric_guitar_jazz_3 = note("<~@17 A B@2 ~@19 A B@2 ~@23 A B@2 ~@77>".pickRestart({
  A: "g#4@11 ~@5", B: "[d#4@31 ~]/2",
})).s("gm_electric_guitar_jazz").gain(0.16).pan(0.4)

// bass · electric guitar muted
const bass = note("<~@13 A ~@2 B C ~@17 A ~@2 B C ~@21 A ~@2 B C ~@75 D@2 ~@2>".pickRestart({
  A: "~@8 g#2 ~ g#2@2 ~@4", B: "~@12 e2 ~ e2 ~", C: "e2@3 ~ e1@2 ~@10", D: "[~@2 e2@13 ~]/2",
})).s("gm_electric_guitar_muted").gain(0.56)

// chords · electric guitar jazz
const electric_guitar_jazz_4 = note(`<
  ~@4 A B C D A B E F G ~@3 H I J ~ K L ~@2 K L ~@4 A B E F G ~ M@2 H I N@2 K L ~@2 K L ~@4 A B C D A B E D ~@2 M@2 H I
  N@2 K L ~@2 K L ~@4 A B C D A B E D A B C D A B E D A B C D A O E D A B C P Q B E D A B C D A B E D A B C D A R E D S
  T U D A V@2 W@2 X U D A Y@2 Z@2 ~@2
>`.pickRestart({
  A: "~@4 [g#3,b3] [a3,c4] [a#3,b3,c#4,d4] [c4,c#4,d#4,e4] [e4,g#4] ~ [c#4,e4,a4] ~@5", // G#m Am E A
  B: "[d#4,f#4]@7 ~ [d#4,f#4] ~ [e4,g#4] ~@5", C: "[c#4,e4]@3 ~", D: "f#3 f#3@3", E: "[c#4,e4]@12 ~@2 f#3 ~",
  F: "f#3@4 f#3@5 ~ f#3@5 ~", G: "f#3@13 ~@3", H: "~@10 [e4,g#4] ~@5", I: "~@6 a3 ~", J: "b3@15 ~",
  K: "~@7 [f#3,g3,b3,c4,c#4] [g#3,a3,a#3,d4,d#4,e4] b3 [e4,g#4] ~@5", L: "[a3,c#4]@7 ~",
  M: "[~@6 b4@5 ~ b4@2 g#4@15 ~@3]/2", N: "[~@6 b4@5 ~ b4@2 g#4@15 ~@3, b3@15 ~@17]/2",
  O: "[d#4,f#4,b4]@7 ~ [d#4,f#4] ~ [e4,g#4] ~@5", P: "~@4 [f#4,b4]@2 [f#4,b4] ~ [f#4,b4]@2 ~ [e4,g#4]@2 ~ [f#4,b4] ~",
  Q: "[f#4,b4]@2 ~ [e4,g#4] [g#3,b3] [a3,c4] [a#3,b3,c#4,d4] [c4,c#4,d#4,e4] [e4,g#4] ~ [c#4,e4,a4] ~@5", // B5 E G#m Am E A
  R: "[d#4,f#4]@7 ~ [e4,g#4] ~@2 [e4,g#4] ~@2 [d#4,f#4]@2", S: "~@5 [g#3,a#3,c4] [d4,e4] ~ f#4@2 ~ e4 ~@2 c#4@2",
  T: "d#4@7 ~ e4 ~@2 d#4@2 ~ b3@2", U: "c#4@15 ~",
  V: "[[d#4,f#4,b4]@7 ~ [d#4,f#4] ~@5 g#4@14 ~@4, ~@5 b3@3 ~@8, ~@3 e4@3 ~@2]/2", // B D#m
  W: "[[e4,a4]@2 [e4,g#4]@2 ~@2 [e4,g#4]@12 ~@3 [g#3,a#3,c4] [d4,e4] ~ f#4@2 ~ e4 ~@2 c#4@2]/2", // A5 E G# Dsus2
  X: "d#4@6 ~@2 e4 ~@2 d#4@2 ~ b3@2", Y: "[[d#4,f#4,b4]@7 ~ [d#4,f#4] ~@5 g#4@17 ~, ~@5 b3@3 ~@8, ~@12 e4@13 ~@7]/2",
  Z: "[~@5 [b3,e4]@25 ~@2, ~@4 e3@25 ~@3]/2", // E5
})).s("gm_electric_guitar_jazz").gain(0.4).pan(0.6)

// chords · percussive organ
const percussive_organ = note("<~@35 A@8 ~@18 A@8 ~@76>".pickRestart({
  A: "[~@3 c#5 [f#4,d#5]@8 [g#4,e5]@4, b4, [e4,g#4] ~@3]/4", // D#m C#m E
})).s("gm_percussive_organ").gain(0.08)

// other · electric guitar muted
const electric_guitar_muted = note(`<
  A B C D E B C D E B C D F D B@2 G H I B J K L B M K L N O D E B C D P D B@2 G H I B J K L B M K L N O D E B C D Q B C
  D F D B@2 G H I B J K L B M K L N O D E B C D Q B C D R B C D Q B C D R B C D Q B C D R B C D Q B C D R B C D Q B C D
  R B C D Q B C D R B C D Q B C D R B C D Q B S T ~@3
>`.pickRestart({
  A: "~@7 a2", B: "b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~", C: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~",
  D: "e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~",
  E: "e3 ~ e3 ~ [e2,e3] ~ [e2,e3] ~ [g#2,e3] ~ [g#2,e3] ~ [a2,e3] ~ [a2,e3] ~", // E C#m A5
  F: "e3 ~ e3 ~ e3 ~ e3 ~ b2 ~ b2 ~ b2 ~ b2 ~", G: "e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ c#3@2 b2 ~",
  H: "b2 ~ b2 ~ b2 ~ e2 ~ g#2 ~ g#2 ~ a2 ~ a2 ~", I: "b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ a2 ~",
  J: "e3 ~ e3 ~ e3 ~ e3 ~ c#3 ~ b2 ~ g#2 ~ g#2 ~", K: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ b2 ~ c3 ~",
  L: "c#3 ~ c#3 ~ c#3 ~ c#3 ~ c#3 ~ c#3 ~ c#3 ~ a2 ~", M: "e3 ~ e3 ~ e3 ~ e3 ~ b2 ~ b2 ~ g#2 ~ g#2 ~",
  N: "b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ b2 ~ g#2 ~", O: "a2@3 ~", P: "e3 ~ e3 ~ e2 ~ e2 ~ b2 ~ b2 ~ b2 ~ b2 ~",
  Q: "e3 ~ e3 ~ e2 ~ e2 ~ g#2 ~ g#2 ~ a2 ~ a2 ~", R: "e3 ~ e3 ~ e3 ~ e3 ~ g#2 ~ g#2 ~ a2 ~ a2 ~",
  S: "a2 ~ a2 ~ a2 ~@2 a2 ~ a2@2 ~ a2 ~ a2 ~", T: "~ a2@2 ~@13",
})).s("gm_electric_guitar_muted").gain(0.23)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@21 A B C D A B C E F@2 ~@12 A B C D A B C E F@2 ~@16 A B C D A B C E F@2 ~@66
>`.pickRestart({
  A: "~@4 a3@2 ~@6 a3@3 ~, a2@15 ~, ~@2 e3@13 ~, ~@6 b3@9 ~", B: "~@6 [d#3,d#4]@9 ~, c#3@7 ~, ~ g#3@6 ~, ~@2 c#4@5 ~",
  C: "~@6 b3@9 ~, b2@15 ~, ~@2 f#3@13 ~", D: "e2@7 ~", E: "[e3,a3]@15 ~", F: "[[e3,b3,e4]@3 ~]/2",
})).s("gm_electric_guitar_clean").gain(0.15).pan(1)

// bass · lead 5 charang
const bass_2 = note(`<
  ~@21 A B C D E F C A ~@14 A B C D E F C A ~@18 A B C D E F C A ~@2 G E H@2 G E H@2 G E H@2 G E H@2 G E H@2 G E H@2 G E
  H@2 G E H@2 G E H@2 G E H@2 G E H@2 G E H@2 G E H@2 G E H@2 G E H@2 G I@3 ~@2
>`.pickRestart({
  A: "a1@15 ~", B: "c#2", C: "b1@15 ~", D: "e2@15 ~", E: "a1", F: "c#2@15 ~", G: "b1", H: "[e1@15 ~]/2",
  I: "[a1@21 e1@25 ~@2]/3",
})).s("gm_lead_5_charang").gain(0.39).pan(0.1)

// chords · pad choir
const pad_choir = note(`<
  ~@6 A@3 B A@3 ~@10 C D ~@2 E F@3 B A@3 ~@10 C D ~@2 E F@3 B A@3 B A@3 ~@10 C D ~@2 E F@3 B A@3 B A@3 G H@3 B A@3 G H@3
  B A@3 G H@3 B A@3 G H@3 B A@3 G H@3 B A@3 G H@3 B A@3 G H@3 B I@5
>`.pickRestart({
  A: "[[c#4,a4]@4 [b3,g#4]@7 ~, e4@11 ~]/3", B: "[d#4,f#4,b4]", C: "~@8 [b3,e4] ~ [b3,e4]@3 ~ [b3,e4] ~",
  D: "[c#4,e4]@2 ~@2 [c#4,e4]@2 ~@2 [b3,e4]@3 ~@5", E: "~@4 b3 ~ b3 ~",
  F: "[b3@3 a3 [g#3,g#4]@5 ~@3, e4@3 ~, a4@5 ~@11]/3", G: "[d#4,f#4,b4]@7 ~ [b3,e4,b4]@3 ~ [b3,e4,b4]@3 ~",
  H: "[[b3,b4] [a3,a4]@7 [g#3,g#4]@10 ~@6, e4@3 ~]/3", I: "[[c#4,a4]@20 [b3,g#4]@51 ~@9, e4@71 ~@9]/5",
})).s("gm_pad_choir").gain(0.17)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A B@23 C B D B@19 C B D B@7 E B@7 F B@7 C B G B@7 E B@7 E B@7 E B@7 E B@7 H B@7 E B@7 H B@4 I H J ~@3
>`.pickRestart({
  A: "~@5 x ~@2", B: "x ~@2 x ~@4", C: "x ~@6 x", D: "x ~@2 x!2 ~@3", E: "x!2", F: "x ~@2 x ~@3 x", G: "x",
  H: "x!2 ~@2", I: "x ~@5 x ~@3 x!2 ~@4", J: "~@5 x ~@10",
})).gain(0.56)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@28 A ~@21 A ~@9 B ~@15 A ~ C ~@31 B ~@7 C ~@15 C ~@3 C ~@6>".pickRestart({
  A: "~@9 x!2 ~@5", B: "~@8 x!2 ~@6", C: "~@5 x ~@2",
})).gain(0.32)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@34 A B ~@6 C ~@13 A B ~@24 A B ~@10 D ~@3 A B ~@14 A B ~@10 D ~@3 A B ~@8 E ~@4
>`.pickRestart({
  A: "~@7 x", B: "x", C: "~@12 x ~ x!2", D: "~@3 x ~@4", E: "~@6 x!2",
})).gain(0.48)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@28 A ~@5 B ~@7 C ~@7 A ~@5 B ~@3 D ~@15 A ~ E ~@3 B ~@10 F G ~@3 B ~@11 D ~@3 B ~@3 E ~@6 F G ~@3 B ~@3 E ~@5 H ~@4
>`.pickRestart({
  A: "~ x", B: "~@15 x", C: "~@5 x ~@2", D: "~ x ~ x ~ x ~@2", E: "~@2 x ~@10 x!2 ~", F: "~@7 x", G: "~ x ~@3 x ~@2",
  H: "~@9 x ~@2 x ~ x ~",
})).gain(0.56)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@10 A ~ B ~@3 A ~@3 C ~@3 A ~@2 C ~@2 D ~@3 B ~@3 A ~@3 E ~@3 A ~@2 C ~@2 D ~@3 B ~ A ~ B ~@3 A ~@3 E ~@3 C ~@2 C ~@2
  F ~@3 C ~ A ~ B ~@3 C ~ A ~ B ~@3 C ~ A ~ B ~@3 C ~ A ~ B ~@3 C ~ A ~ F ~@3 C ~ A ~ B ~@3 C ~ A ~ F ~@3 G H ~ I ~@3
>`.pickRestart({
  A: "~@7 x", B: "~@5 x ~ x", C: "~@5 x ~@2", D: "~@5 x!2 ~", E: "~ x", F: "x", G: "~@3 x", H: "~@3 x ~ x ~@2",
  I: "~ x ~@14",
})).gain(0.48)

// drums · high tom
const high_tom = s("ht").struct("<~@140 [~@9 x ~@6] ~@4>").gain(0.64)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@5 A@23 B A@21 B A@25 B A@63 C D ~@3>".pickRestart({
  A: "x!4", B: "x", C: "x ~@3 x ~@4 x ~@4 x ~", D: "~@5 x ~@10",
})).gain(0.4)

// drums · shaker
const shaker = s("sh").struct("<~@31 A@19 B ~@2 A@23 B ~@2 A@60 C B ~@4>".pickRestart({
  A: "x!8", B: "x", C: "x!7 ~",
})).gain(0.4)

stack(
  electric_guitar_jazz, piano, electric_guitar_jazz_2, electric_guitar_jazz_3, bass, electric_guitar_jazz_4,
  percussive_organ, electric_guitar_muted, electric_guitar_clean, bass_2, pad_choir, kick, snare, snare_soft, low_tom,
// … 2 more lines

More by Dire Straits