Strudelify

Somewhere Other Than the Night

Brooks Garth

KeyD majorTempo71 bpm
0:00/0:00
// Somewhere Other Than the Night — Brooks Garth
// 71 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 2/4 at bar 6, 4/4 at bar 6) are rendered on a constant 4/4 grid of one bar per cycle
// note: Full arrangement: all 60 bars on a 48-step grid, each part at one level. Source detail keeps the original performance.
setcpm(71/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 · "Bass Gt"
const bass = note(`<
  ~ A@5 ~@7 B C@2 D E F G@2 H I J K L M N O P ~ Q R S T U V W F X Y H I J K L M N O Z@2 N AA AB AC AD AE AF@2 ~
>`.pickRestart({
  A: "[~@23 d3@49 b2@48 d3@36 ~@6 e3@3 d3@3 ~ a2@50 ~@21, ~@40 f#3 ~@19]/5", B: "~@7 a2",
  C: "[d2@23 ~ f#2@22 ~@20 d3@6 g2@19 ~@5, ~@47 g2@24 ~@25]/2", D: "d3@11 ~ d3@10 ~@2", E: "a2@3 e3 a2@2 a#2@2",
  F: "b2@9 ~@3 a2@10 ~@2", G: "[g2@15 ~@3 g2@3 ~@3 g2@13 ~@10 d2@20 ~@5 d2@18 ~@6]/2", H: "a1@2 ~@7 a1@3 a1@3 ~@9",
  I: "a1 ~@11", J: "g2@2 ~ g2 a2@2 ~ a2", K: "d2@3 ~ d2@2 f#2@2", L: "g2@3 g2 a2@3 a2", M: "d2 ~ d3 c#3",
  N: "b2@2 ~ b2 a2@3 a2", O: "g#2@2 ~ g#2 g2@2 f#2@2", P: "e2@2 ~ e2 a2@3 ~", Q: "b2", R: "d3@12 ~@2 e3 d3, ~@10 f#3 ~",
  S: "~ a2@47", T: "b2@20 ~@3 g2@20 ~@5", U: "d3@13 ~@5 d3@2 ~@4 d3@15 ~@9", V: "f#2@17 ~@7 b2@12 a2@12",
  W: "g2@13 ~@5 d2@3 ~@3 g2@17 ~@7", X: "g2@15 ~@3 g2@3 ~@3 g2@13 ~@11", Y: "e2@15 ~@3 e2@3 ~@3 e2@17 ~@7",
  Z: "[e2@12 ~@6 e2@6 a2@12 ~@6 a2@5 d3@18 ~ a2@6 d3@11 c#3@13]/2", AA: "g#2 ~@3", AB: "~@4 e2@2 ~ e2",
  AC: "a2@18 ~@6 c3@14 ~@4 c3@3 ~@3", AD: "c3@8 ~@3 c3@9 ~@3 b2@12 ~@7 b2@3 ~@3",
  AE: "b2@4 ~@2 b2@4 ~@2 a2@6 ~@3 a2@2 ~", AF: "[~ a2@10 ~@4 a2@8 ~@6 d2@54 ~@13]/2",
})).s("gm_acoustic_bass").gain(0.12)

// chords · acoustic guitar steel · "Accoustic Gt"
const acoustic_guitar_steel = note(`<
  ~ A@2 ~@3 B C D E F G H I J K L M N@2 ~@4 O ~@5 P ~@13 O ~@5 Q ~@3 R@2 S@2 ~@2
>`.pickRestart({
  A: "[~@5 f#4 ~@2, ~ d3@2 ~, ~@5 a3@7 ~@4, ~@3 d4@3 ~@2, ~@2 e4 ~]/2", B: "~ b3 ~ g3, b2@8 g2@7 ~, ~ f#3@3 ~ d3@3",
  C: "~@4 e4 f#4 ~@2 a3@5 ~@3, a2@4 ~ e4@8 ~@3, ~@2 a3@4 d4@7 ~@3",
  D: "~ c#3 f#3 a3 [f#3,f#4] [d3,d4] [b2,b3] d4, f#2 ~", E: "g3@3 ~@13",
  F: "~@3 f#4 ~@2 d4 f#4, a3 b2, ~ d4@3 ~ a3@3, ~ e4 ~@2", G: "~@2 g3 ~ g4@3 ~, g2@3 ~, ~ d3@5 ~@2, ~@3 b3@3 ~@2",
  H: "~@2 b3 ~@3 g3@2, b2 g2, ~ f#3@3 ~ d3@3, ~@3 d4@2 ~@3", I: "a2 e3 ~@6",
  J: "~@3 d4 ~@2 f#4 d4, d3@4 ~ a3@3, ~ a3@3 f#3@4, ~ f#4 ~@2",
  K: "~@5 d4 ~ g3, d3@7 ~, ~ g3@6 ~, ~@2 b3@2 g4@3 ~, ~@3 d4@2 ~ b3@2",
  L: "~@2 f#4 d4 ~@2 f#4 d4, d3 ~ d3@2, ~ f#3@3 ~ f#3@3", M: "~@2 d4 e4 c#4@2 ~@2, a2 ~, ~ d3@3 ~@4",
  N: "[~@54 d4@6 b3@5 ~@6 g3@13 ~@12, ~@47 g3@18 a3@20 ~@11]/2", O: "~@6 a4@5 f#4@7 ~@6 a3@17 ~@7, ~@18 d4@17 ~@13",
  P: "~@3 f#4, d3, ~ a3@7, ~ d4@3, ~ e4", Q: "d3",
  R: "[~@24 [e3,g3]@29 ~@18 [f#2,d3,f#3]@20 ~@5, ~@23 [g2,c3]@31 ~@16 d2@21 ~@5]/2", // Em D C5
  S: "[~@24 [c#2,a2,c#3,e3]@37 ~@35]/2", // A
})).s("gm_acoustic_guitar_steel").gain(0.06)

// chords · acoustic guitar nylon · "Nylon-str. Gt"
const acoustic_guitar_nylon = note("<~@2 A@2 ~@15 B@2 C@2 ~@7 D E F ~@6 G@2 ~@19>".pickRestart({
  A: "[~@15 a3@3 f#3@3 d3@4 ~@11 g3@22 ~@4 f#3@4 e3@3 d3@3 a2@22 ~@2, ~@25 b2@33 ~@38, ~@15 d3@14 ~ g3@2 ~@16]/2",
  B: "[~@9 d4 f#4 d4 ~ d4 e4 d4, ~@47 a3@20 ~@5 a3@18 ~@6]/2",
  C: "[~@6 d4@4 ~@2 d4@5 e4@6 d4@6 e4@6 d4@6 e4@4 ~@3 e4@5 ~@43, a3@53 ~@43]/2", D: "~@13 a3 f#3 d3",
  E: "~@12 g3@22 ~@4 f#3@4 e3@3 d3@3, ~ b2@33 ~@14, ~@3 d3@14 ~ g3@2 ~@4", F: "a2@11 ~@13", G: "[~@47 a3@20 ~@29]/2",
})).s("gm_acoustic_guitar_nylon").gain(0.05)

// other · piano
const piano = note(`<
  ~@3 A B@2 C ~@2 D ~@3 E ~@3 F G H ~ I J K L M N O P Q ~@2 R S@2 ~@2 T U H ~ I J K L M N O V W ~ O X ~ Y@2 Z@4
>`.pickRestart({
  A: "~@3 [d4,f#4]", B: "[[e4,g4]@4 [f#4,a4]@4 ~@8 e4@8 ~@6 d5 c#5, ~@5 a3@7 ~@4, ~@37 b3@36 ~@23, ~@42 d4@31 ~@23]/2",
  C: "b4@7 ~@17", D: "~@12 d3@3 f#3@3 ~@2 c4@3 b3@25, ~@9 g3@2 ~@13", E: "~@2 d4 [e4,a4] [c#4,e4]@3 ~", F: "~@2 c#4 e4",
  G: "b3@5 ~ a3@5 ~", H: "g3@31 ~@17",
  I: "[a1,a2]@15 ~@3 [a1,a2]@3 ~@2 [a1,a2]@4 ~@3 a1@3 ~@2 [a1,a2]@3 ~@3 [a1,a2]@3 ~@4, ~@29 a2@3 ~@16", // A
  J: "[a1,a2] ~@11", K: "~ g2@15 ~@2 g2@6 a2@14 ~@4 a2@6", L: "d2@7 ~@2 d2@3 f#2@6 a2@6",
  M: "g2@15 ~@3 g2@6 a2@16 ~@2 a2@5 ~", N: "d2@18 a1@4 ~@2 d2@11 c#2@12 ~", O: "b2@18 b2@6 a2@15 ~@3 a2@5 ~",
  P: "g#2@5 ~ g#2@2 g2@4 f#2@4", Q: "e2@4 a2@3 ~", R: "~@13 f#4@11 g4@12 a4@12",
  S: "[~@2 a4@3 ~@3, ~ a3@9 ~@6, ~@12 d4@47 ~@37, ~@3 e4@7 ~@6]/2",
  T: "~@12 d3@2 ~@4 g3@2 c4@3 ~ b3@21 ~@3, ~@14 e3@15 ~@19", U: "~@6 a3@5 ~",
  V: "g#2@15 ~@3 g#2@6 [g2,g3]@11 [f#2,f#3]@6 ~ g2@6, ~@41 g3@7", W: "[e2,e3]@5 ~@3 a2@6 ~@2", X: "g#2@5 ~ g#2@2 ~@8",
  Y: "[a2@18 ~@6 g2@12 ~@6 g2@4 ~@13 f#5@12 d5@9 ~@3 d5@7 f#2@3 ~@3, ~@36 d5@11 e5@13 ~@36, ~@48 g2@22 ~ f#2@16 ~@9]/2",
  Z: "[e5@12 f#5@12 [e2,d5]@12 g3@6 ~ f#3@6 [e2,e3,g5]@13 ~ e5@13 ~ d2@74 ~@41, f#2@5 ~@4 b5@3 ~@7 d5@6 ~@23, ~@42 e2@4 ~@16 [c#2,c#3]@15 d3@55 ~@60]/4", // E7 Em C#
})).s("gm_piano").gain(0.16)

// other · string ensemble 2 · "Sl Strings"
const string_ensemble_2 = note("<~ A@4 ~@26 B@3 ~@26>".pickRestart({
  A: "[~@23 a5@86 g5@10 f#5@63 ~@10]/4", B: "[~@37 g5@10 f#5@63 ~@34]/3",
})).s("gm_string_ensemble_2").gain(0.09)

// other · violin
const violin = note("<~@4 A@2 ~@26 B@3 ~@25>".pickRestart({
  A: "[~ g4@24 ~@7]/2", B: "[~@3 g4@8 ~@5]/3",
})).s("gm_violin").gain(0)

// other · string ensemble 1 · "Strings 1"
const string_ensemble_1 = note("<~@22 A ~ B C@4 D@5 E@2 F@2 G H@3 I ~ B J@4 ~@3 K@2 L@5 ~>".pickRestart({
  A: "a5", B: "f#5", C: "[[b4,g5]@24 a4@24 d5@121 ~@23, ~ a5@2 ~@5]/4", D: "[~@47 a5@84 g5@12 f#5@67 ~@30]/5",
  E: "[f#4@24 g4@23 a4@48 ~]/2", F: "[[f#2,c#4]@23 [b2,f#4]@12 [a2,e4]@12 g2@48 ~, ~@47 d4@41 ~@8]/2",
  G: "[d2,d4]@23 ~ f#2@24, ~@23 f#4@24 ~", H: "[g4@36 f#4@11 e4@25 g4@22 a4@21 ~@3 a4@8 c#5@5 e5@6 g5@6 a5, g2 ~@2]/3",
  I: "a5@11 a5@37", J: "[[b4,g5] a4 d5@5 ~, ~ a5@2 ~@5]/4", K: "[~@24 [g3,b3]@47 ~ g4@24]/2",
  L: "[a4@23 ~ a5@202 ~@14]/5",
})).s("gm_string_ensemble_1").gain(0.06)

// other · string ensemble 1 · "Strings 2"
const string_ensemble_1_2 = note("<~@23 A B C@2 ~ D E ~@13 F G H@2 ~ I J K L M@2 N@5 ~>".pickRestart({
  A: "~ d6@23 c#6@23 ~", B: "f#5@2 f#4 a4", C: "[g4 a4@3]/2", D: "~@23 b4@13 a4@12", E: "g4@24 a4@23 ~",
  F: "~ [g4,g5]@22 ~ a5@24, ~@23 a4@24 ~", G: "f#4@35 ~ a4@12, f#5", H: "[[g4,g5] [a4,a5]@3]/2",
  I: "~@24 b4@11 a4@12 ~", J: "g4@12 f#4@5 g4@6 a4@23 ~@2", K: "d5@10 ~@2 d5@5 e5@6 f#5@12 e5@12 ~",
  L: "~@6 d5@5 c#5@7 d5@8 ~@4 d5@6 c#5@6 d5@6", M: "[~@30 g3@6 f#3@6 g3@6 d4@23 ~@6 g3@6 f#3@6 g3@7, b4@21 ~@11]/2",
  N: "[d4@23 a4@202 ~@15]/5",
})).s("gm_string_ensemble_1").gain(0.12)

// other · pad new age · "Fantasia"
const pad_new_age = note("<~@3 A B C ~@26 D E ~@20 F@3 G@2 ~>".pickRestart({
  A: "~@3 d5", B: "e5@2 f#5@2 ~ a4 b4 d5, ~@2 a5 ~", C: "e5@13 ~@11", D: "~ d5 e5 f#5", E: "~ a4 b4 d5 e5@4, a5 ~@3",
  F: "[~@24 a4@47 ~ a4@48 g4@24]/3", G: "[~ e4@13 c#4@14 d4@58 ~@10]/2",
})).s("gm_pad_new_age").gain(0.06)

// drums · kick
const kick = s("bd").struct("<~@14 A ~@5 B C ~ B@7 ~@4 A ~@5 B D ~ B@9 E ~ A B@2 F ~@2>".pickRestart({
  A: "~ x", B: "x!2", C: "x ~@16 x ~@6 x ~@16 x ~@5 x", D: "x ~@5 x ~@5 x ~@4 x ~@6 x ~@4 x ~@6 x ~@4 x ~@5 x", E: "x",
  F: "~ x ~@28 x ~@17",
})).gain(0.12)

// drums · rim
const rim = s("rim").struct("<~@15 A ~ A B@3 C ~@13 A ~ A B@3 C ~@18>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@11 x ~@24 x ~@11",
})).gain(0.12)

// drums · snare
const snare = s("sd").struct("<~@21 A B C@7 ~@11 D E C@9 F ~ G C@2 H ~@2>".pickRestart({
  A: "~@47 x", B: "x", C: "~ x ~ x", D: "~@12 x ~@22 x ~@12", E: "x ~@7 x!2 ~@6", F: "~ x ~@2", G: "~@3 x",
  H: "~@5 x ~@4 x ~@5",
})).gain(0.12)

// drums · low tom
const low_tom = s("lt").struct("<~@46 A ~@3 B ~@3 C ~@2 D ~@2>".pickRestart({
  A: "~@5 x ~ x", B: "~@35 x ~@12", C: "~@20 x ~@2 x ~@24", D: "~@7 x ~@3 x ~@12",
})).gain(0.12)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@21 A ~@19 A B C ~@2 D ~@2 E F ~@3 G ~@2 H ~@2>".pickRestart({
  A: "~@24 x ~@4 x ~@5 x ~@5 x ~@5 x", B: "~@39 x ~@3 x ~@2 x ~", C: "x", D: "~@3 x ~@4", E: "~@19 x ~ x ~@2",
  F: "~@18 x ~@5 x ~@4 x ~@18", G: "~@9 x ~@4 x ~@3 x ~@29", H: "~@7 x ~@40",
})).gain(0.12)

// drums · open hat
const open_hat = s("oh").struct("<~@54 [~@3 x] [~ x ~ x] [~@11 x ~@24 x ~@11] [~@5 x ~@10] ~@2>").gain(0.12)

// drums · high tom
const high_tom = s("ht").struct("<~@42 [~@37 x ~@3 x ~@2 x ~@3] ~@6 [~@3 x] ~@4 [~ x ~@2] ~@5>").gain(0.12)

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

// drums · ride
const ride = s("rd").struct("<~@21 A ~ B C D B C E F ~@11 A ~ B C D B C E F ~ C G ~ H I J K ~@2>".pickRestart({
  A: "~@24 x ~@10 x ~@11 x", B: "x ~@11 x ~@11 x ~@11 x ~@10 x", C: "~ x!3", D: "x ~@11 x ~@10 x ~@12 x ~@11", E: "x!4",
  F: "x ~@11 x ~@11 x ~@22 x", G: "x!2 ~@2", H: "~@24 x ~@11 x ~@10 x", I: "~@11 x ~@11 x ~@11 x ~@5 x ~@6",
  J: "x ~@11 x ~@11 x ~@11 x ~@6 x ~@4", K: "~ x ~@13 x ~@13 x ~@18",
})).gain(0.12)

stack(
  bass, acoustic_guitar_steel, acoustic_guitar_nylon, piano, string_ensemble_2, violin, string_ensemble_1,
  string_ensemble_1_2, pad_new_age, kick, rim, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash, ride
)

More by Brooks Garth