Strudelify

Gitarren klingen leise durch die Nacht

G. G. Anderson

KeyF majorTempo114 bpm
0:00/0:00
// Gitarren klingen leise durch die Nacht — G. G. Anderson
// 114 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 90 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(114/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 · "FINGERDBAS"
const bass = note(`<
  ~ A B C D A@3 E F G C H A@3 I F G J H K L M N O P Q R S@2 T U V G W X Y Z AA F AB AC AD AE AF AG AH AI AJ AK AL AE A
  AM T AN AB AO C AL S AP S I F AQ AL AR AS AT AU AV O P AW R A AX AY AZ F BA BB X BC@2 BD@3
>`.pickRestart({
  A: "f1@7 ~@3 f1@2 c2@6 c1@6", B: "f1@6 ~@4 f1@2 c2@3 ~ c2@2 c1@6", C: "f1@7 ~@3 f1@2 c2@6 c1@5 ~",
  D: "f1@3 ~@2 f1 c2 ~ c2@3 c1", E: "f1@7 ~@3 f1@2 c2@6 f1@6", F: "c2@7 ~@3 c2@2 g2@6 g1@6",
  G: "c2@7 ~@3 c2@2 g2@2 ~@2 g2@2 c2@6", H: "f1@5 ~@19", I: "f1@3 ~@2 f1 c2@3 f1@3", J: "f1@7 ~@3 f1@2 c2@6 a1@6",
  K: "bb1@7 ~@3 bb1@2 f2@6 f1@6", L: "bb1@7 ~@3 bb1@2 f2@6 bb1@6", M: "f2@8 ~@2 f2@2 c2@7 ~@3 c2@2",
  N: "f2@6 c2@6 a1@6 f1@5 ~", O: "d1@7 ~@3 d1@2 a1@7 ~@3 a1@2", P: "g1 b1 d2 g2", Q: "c2@4 ~ c2 g1@5 c2",
  R: "~@4 c2@2 bb1@3 ~@3 a1@3 ~@3 g1@3 ~@3", S: "f1@3 ~@2 f1 c2@3 c1@3", T: "f1@6 ~@4 f1@2 c2@6 c1@5 ~",
  U: "f1@7 ~@3 f1@2 c2@2 ~@2 c2@2 f1@6", V: "c2@7 ~@3 c2@2 g2@6 g1@5 ~", W: "f1@5 f2 c2@3 a1@3", X: "f1 ~@3",
  Y: "f1@4 ~ f1 ~@3 c1@3, ~@6 c2@5 ~", Z: "f1@7 ~@5 c2@6 f1@5 ~", AA: "c2@3 ~ g2@2 g1@2", AB: "c2@11 ~ g2@6 g1@6",
  AC: "c2@8 ~@2 c2@2 g2@5 ~ c2@6", AD: "f1@9 ~ f2@2 d2@6 c2@6", AE: "f1@7 ~@17", AF: "f1@9 ~@3 c2@6 c1@5 ~",
  AG: "f1@4 ~@2 c2@3 f1@3", AH: "c2@7 ~@3 c2@2 g2@5 ~ g1@6", AI: "c2@7 ~@5 g2@6 g1@6", AJ: "c2@3 ~@2 c2 g2@3 g1@3",
  AK: "c2@11 ~ g2@5 ~ c2@6", AL: "f1 f2 c2 a1", AM: "f1@10 ~@2 c2@6 c1@5 ~", AN: "f1@3 ~@2 f1 c2 ~ c2 f1@3",
  AO: "c2@7 ~@3 c2@2 g2@6 c2@6", AP: "f1@4 ~@2 c2@3 c1@3", AQ: "c2@3 ~@2 c2 g2 ~ g2 c2@3", AR: "f1 ~@5",
  AS: "bb1@3 ~@2 bb1 f2@3 f1@3", AT: "bb1@7 ~@3 bb1@2 f2@2 ~@2 f2@2 bb1@6", AU: "f2@7 ~@3 f2@2 c2@7 ~@3 c2@2",
  AV: "f2@6 c2@6 a1@5 ~ f1@5 ~", AW: "c2@7 ~@3 c2 ~ g1@10 c2@2", AX: "f1@5 ~ c2@3 c1@3", AY: "f1@3 ~@2 f1 c2 ~ c2 c1@3",
  AZ: "f1@11 ~ c2@6 f1@6", BA: "c2@2 g2 c2", BB: "f1@9 ~ f2@2 c2@6 a1@6", BC: "[c2@47 ~]/2", BD: "[f1@25 ~@11]/3",
})).s("gm_electric_bass_finger").gain(0.5)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  A@3 B@4 C@8 D@6 E@2 F G@3 H I@3 J@6 K@8 L@7 M@3 N@4 O@2 P@2 Q@5 R@7 S T@3 U@5 V@6
>`.pickRestart({
  A: "[~@24 [f4,a4]@11 ~ [f4,a4]@18 [d4,bb4]@4 [c4,a4]@2 [e4,c5]@4 [d4,bb4]@2 [c4,a4]@4 [d4,bb4]@2, ~ c4@2 ~]/3", // F Gm F C Gm F Gm
  B: "[[f4,a4]@42 ~@6 [f4,a4]@11 ~ [f4,a4]@18 [d4,bb4]@3 [c4,a4]@2 ~ [e4,c5]@3 ~ d4@2 [c4,a4]@3 ~ bb4@2, c4@38 ~@4 c4@36 ~@9 bb4@2 ~@4 d4@3]/4", // F Gm F C F
  C: "[[f4,a4]@42 ~@6 [e4,g4]@11 ~ [e4,g4]@24 [d4,bb4]@9 a4@4 [a3,f4]@29 ~@18 [f4,a4]@30 [d4,bb4]@3 ~ c4@2 [e4,c5]@3 ~ bb4@2 [c4,a4]@4 [d4,bb4]@2, c4@40 ~@2 c4@42 ~@9 c4@32 ~@13 c4@36 ~@3 a4@2 ~@13, ~@16 bb3@12 ~@33 d4 ~@2]/8", // F Em Gm Dm F Gm C F …
  D: "[[f4,a4]@42 ~@5 [bb3,e4,g4]@37 a4@12 [a3,f4]@28 ~@20, c4@40 ~@2 c4@39 ~@3 c4@40 ~@20]/6", // F Edim Dm
  E: "[[d4,f4,bb4]@47 ~]/2", F: "[f4,a4] [e4,g4], c4@9 ~@3 [bb3,c4]@10 ~@2",
  G: "[c4@24 ~@24 [g3,b3]@23 ~, f4@71 ~, a3@2 ~, ~@24 d4@47 ~]/3", H: "[c4,e4,g4]@8 ~ [c4,eb4,gb4,a4]@2 ~",
  I: "[[e4,g4,bb4]@21 ~@3 [f4,a4]@28 ~@2 [d4,bb4]@4 [c4,a4]@2 [e4,c5]@3 ~ d4@2 [c4,a4]@4 [d4,bb4]@2, c4@53 ~@10 bb4@2 ~@7]/3", // Edim F Gm F C F Gm
  J: "[[f4,a4]@42 ~@6 [e4,g4]@36 a4@11 [a3,f4]@27 ~@16 a4@5 ~, c4@20 ~ c4@20 ~ c4@19 ~@2 c4@9, ~@47 bb3@37 ~@48 f4@11 ~]/6", // F Em Dm
  K: "[d4@12 a4@45 ~ e4@85 ~ [a3,f4]@26 ~@16 a4@5 ~, f4@51 ~@6 g4@87 ~@36 f4@11 ~, bb4@5 ~ c4@79 ~@2 c4@9, ~@19 bb3@28 ~@17]/8", // Dm
  L: "[[d4,bb4]@12 ~@37 bb3@2 f4@4 ~@3 g4@86 [a3,f4]@24, f4@48 ~@7 bb3@87 ~@26, ~ c4@13, ~@4 a4@15 e4@29 ~@8]/7", // Gm Dm
  M: "[~@24 [f4,a4]@30 [d4,bb4]@4 [c4,a4]@2 ~ e4@2 ~ bb4@2 [c4,a4]@3 ~ bb4 ~, ~@19 c4@35 ~@6 c5@3 d4@3 ~@3 d4@3]/3", // F Gm F
  N: "[c4@40 ~@7 [bb3,e4,g4]@36 ~ [d4,bb4]@12, [f4,a4]@11 ~@13, ~@7 c4@7 ~@2]/4", // Edim Gm F
  O: "[~@3 [a3,f4]@13, c4@23 ~, a4@11 ~@37]/2", // Dm
  P: "[[c4,f4,a4]@30 [d4,bb4]@3 ~ c4@2 [e4,c5]@3 ~ bb4@2 [c4,a4]@3 [d4,bb4]@3, ~@11 a4 ~ d4 ~@2]/2", // F Gm C F Gm
  Q: "[c4@39 ~@8 [bb3,g4]@36 ~@13 [a3,f4]@24, [f4,a4]@43 ~@4 e4@34 ~@2 a4@12 ~@25, ~@41 c4@41 ~@2 c4@36]/5", // Eb Dm F
  R: "[~@24 [d4,f4]@47 ~ f4@11 ~ g4@12 ~@47 b3@25, ~@23 bb4@47 ~ c4@48 d4@48 ~, ~@71 a4@12 [bb3,e4]@12 ~ f4@72, ~@96 a3@47 g3@20 ~@5]/7", // Dm Bbdim
  S: "[e4,g4]@8 ~ [eb4,gb4,a4]@2 ~, c4@11 ~", // Em Ebdim
  T: "[[c4,e4,g4,bb4]@20 ~@4 [f4,a4]@30 [d4,bb4]@3 ~ a4@2 ~@3 [d4,bb4]@2 ~ [c4,a4]@4 [d4,bb4]@2, ~@20 c4@34 ~@3 c4@2 ~ [e4,c5]@5 ~@7]/3", // C7 F Gm F Gm C
  U: "[[f4,a4]@7 ~ [e4,g4]@6 a4@2 [a3,f4]@4, c4@39 ~@3 c4@40 ~@2 c4@36, ~@47 bb3@37 ~@36]/5", // F Em Dm
  V: "[~@24 [bb3,e4]@35 ~ [d4,bb4]@6 a4@6 [a3,f4]@52 ~@20, ~@4 c4@16 ~@2 c4@19 ~@7, ~@2 g4@3 ~@7]/6", // Bbdim Gm Dm
})).s("gm_string_ensemble_1").gain(0.15)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  A B@2 C ~@8 D E ~@6 F G ~@6 H I ~@22 J K@2 L M N@2 O@2 P Q R M S@2 T F U ~@6 V W ~@6 X Y@2 Z AA ~
>`.pickRestart({
  A: "~@9 c4@2 ~",
  B: "[[c4,a4]@11 ~ a4@15 ~@3 [d4,bb4]@4 [c4,a4]@2 [e4,c5]@4 [d4,bb4]@2 [c4,a4]@4 [d4,bb4] ~, ~@12 c4@13 ~@23]/2", // F Gm F C Gm F Gm
  C: "[c4,a4]", D: "~@3 c3@2 d3 c3@2 bb2 a2@2 g2", E: "f2@7 ~@5", F: "~@3 f3@2 c3 f3@2 eb3 d3@2 c3", G: "bb2@11 ~",
  H: "~@4 c4@2 bb3@2 ~@4 a3@2 ~@4 g3@3 ~@3", I: "f3@13 ~@11", J: "~@3 [f3,a3,c4]@2 ~",
  K: "[[c4,f4,a4]@11 ~ [c4,f4,a4]@14 ~@4 [d4,g4,bb4]@3 ~ [c4,f4,a4] ~ [e4,a4,c5]@3 ~ [d4,g4,bb4] ~ [c4,f4,a4]@3 ~ [d4,g4,bb4] ~]/2", // F Gm F Am Gm F Gm
  L: "[c4,f4,a4]@3 ~", M: "~@3 [a3,c4]@2 ~", N: "[[bb3,e4,g4]@10 ~@2 [bb3,e4,g4]@19 ~@5 [d4,g4,bb4]@10 ~@2]/2",
  O: "[[c4,f4,a4]@3 ~@2 [a3,c4,f4]@11 ~@2 [f3,a3,c4]@4 ~@2]/2", P: "[c4,f4,a4]@11 ~ [c4,f4,a4]@12",
  Q: "~@6 [d4,g4,bb4]@3 ~ [c4,f4,a4] ~ [e4,a4,c5]@2 ~@2 [d4,g4,bb4] ~ [c4,f4,a4]@2 ~@2 [d4,g4,bb4] ~", R: "[c4,f4,a4]",
  S: "[[bb3,e4,g4]@10 ~@2 [e4,g4]@19 ~@5 [c4,a4]@9 ~@3, f4 ~@11 bb3@23 ~@13]/2", // Edim Em F
  T: "[bb3,d4,g4]@2 ~@2 [a3,c4,f4]@17 ~@3", U: "bb2@5 ~", V: "~@4 c4@2 bb3@3 ~@3 a3@3 ~@3 g3@3 ~@3", W: "f3@17 ~@7",
  X: "~ c4", Y: "[[bb3,g4]@10 ~@2 g4@22 ~@2 [d4,bb4]@5 ~ [c4,a4]@6, ~@12 bb3@19 ~@17]/2", Z: "f4@3 ~, a3@3 ~@5",
  AA: "[d4,f4,a4]@2 ~ [f4,a4,c5,d5]@5", // Dm Dm7
})).s("gm_acoustic_guitar_steel").gain(0.53)

// other · pad new age · "FANTASIA"
const pad_new_age = note("<A B C D ~@39 E F ~@6 E F ~@2 G H ~@6 I F ~@25>".pickRestart({
  A: "~@9 c6@2 ~", B: "[c6,a6]@3 ~ [c6,a6]@4",
  C: "~@6 [d6,bb6]@2 ~@2 [c6,a6] ~ [e6,c7]@2 ~@2 [d6,bb6] ~ [c6,a6] ~@3 [d6,bb6] ~", D: "[c6,a6]@7 ~@5",
  E: "~@6 f6 ~ g6 ~ f6 ~ e6 ~ f6 ~ e6 ~ d6 ~ e6 ~ d6 ~", F: "c6 ~@23", G: "~@4 c5@2 f5@3 ~ a5@2 d6@4 ~@2 c6@2 ~@2 b5 ~",
  H: "c6 ~@2", I: "~@4 c5@2 f5@2 ~@2 a5 ~ d6 ~@5 c6 ~@3 b5 ~",
})).s("gm_pad_new_age").gain(0.4)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1_2 = note(`<
  A@3 B@2 C@3 D@3 E@2 C@3 F@5 G@2 H I@4 J C@3 K@3 L M N@2 O@6 P@2 Q@4 R@4 S@4 T@4 U@4 V@2 G@2 W X@2 Y Z@2 C@3 AA@3 AB@2
  AC@2 AD@3
>`.pickRestart({
  A: "[~@12 [f4,a4]@15 [d4,bb4]@2 [c4,a4] [e4,c5]@2 [d4,bb4] [c4,a4]@2 [d4,bb4], ~ c4@2 ~]/3", // F Gm F C Gm F Gm
  B: "[a4@24 [f3,a3]@17 ~@7, c4@11 ~, f4@11 ~ f4@12]/2", C: "[[c4,c5]@9 [f4,f5] [a4,a5] [d5,d6]]/3",
  D: "[[c5,c6]@2 b4 [c5,c6]@27 [bb4,bb5]@6, ~@4 b5 ~@67]/3", E: "[[a4,a5]@6 f5@17 [a3,c4]@7 ~@18, ~ f4@4 ~@3]/2",
  F: "[[c5,c6]@2 b4 c6@27 a5@6 [a4,f5]@13 ~@11, ~@4 b5 ~ c5@51 ~@3 c5@38 ~@22]/5", G: "[[f4,f5]@7 [d5,bb5,d6]]/2",
  H: "[c5,a5,c6] [bb4,bb5], ~@6 e5@5 ~", // F Bb
  I: "[[c5,f5]@25 a4@47 [e4,e5]@12 f4@6 [gb4,eb5,gb5]@6, a5@3 c5, ~@21 f5 ~@2]/4", J: "~@5 bb4@15 ~@4, [g4,e5,g5]@7 ~",
  K: "[[c5,c6]@4 [b4,b5]@2 [c5,c6]@53 ~ [c5,a5]@11 ~]/3", L: "[f4,a4,f5]", M: "~ c4 f4 [a4,a5], ~@6 c5@17 ~, ~ f5",
  N: "[[bb4,d5,bb5]@11 ~ [a4,c5]@17 ~@2 f5@3 [bb4,g5]@2 [c5,a5]@4 [d5,bb5]@2 [c5,a5]@4 [a4,f5]@2, ~@4 a5@7 ~@5, ~@10 a4 ~@5]/2", // Bb Am Eb F Gm F Dm
  O: "[a5@11 ~ g5@18 ~@6 e5@6 g5@5 ~ [c6,e6]@10 ~@2 [c6,e6]@17 ~ [d6,f6]@5 ~ [bb5,d6]@5 ~ [c6,e6]@6 [f5,a5]@25 ~@17 a5@6, c5@28 ~@2 c5@91 ~@5 c5@18, ~@11 bb4@17 ~@30 e5@35 ~@39 f5@10 ~@2]/6", // C Dm Bb C F
  P: "[[d5,bb5]@6 c5@9 [a4,f5]@2 [bb4,g5] [c5,a5]@2 d5 [c5,a5]@2 [a4,f5], f5@29 ~@19, ~@12 a5@15 ~@13 bb5 ~@7]/2", // Gm Dm Eb F Dm
  Q: "[a5@11 ~ g5@18 ~@12 g5@6 [c6,e6]@11 ~ [c6,e6]@24 [d5,bb5]@9 [bb4,e5]@2 ~, c5@29 ~ c5@51 ~@15, ~@11 bb4@15 ~@10 e5@47 ~@13]/4", // C Gm Bbdim
  R: "[[a4,f5]@26 ~@22 [f4,a4]@29 ~ [d4,g4,bb4]@4 [f4,a4] ~ [e4,a4,c5]@3 ~ [d4,g4,bb4] ~ [c4,f4,a4]@3 ~ [d4,g4,bb4] ~, ~@36 c4@41 ~@5 c4@2 ~@12]/4", // Dm F Gm F Am Gm F Gm
  S: "[a4@36 ~@12 [e4,g4]@11 ~ [e4,g4]@22 ~@2 [d4,g4,bb4]@11 ~, f4@47 ~ bb3@33 ~@15, c4@35 ~ c4@45 ~@15]/4", // Em Gm
  T: "[[f4,a4]@6 f4@40 ~ [c4,f4,a4]@30 ~ [d4,g4,bb4]@4 [f4,a4] ~ [e4,a4,c5]@3 ~ [d4,g4,bb4] ~ [c4,f4,a4]@3 ~ [d4,g4,bb4] ~, c4@45 ~@37 c4@2 ~@12, ~ a3@5 ~@10]/4", // F Gm F Am Gm F Gm
  U: "[[f4,a4]@36 ~@12 [e4,g4]@10 ~@2 [e4,g4]@23 ~ [f4,a4]@10 ~@2, c4@17 ~ c4@23 ~ c4@4 ~@2, ~@48 bb3@35 ~@13]/4", // F Em F
  V: "[[bb3,d4,g4]@3 ~ [a3,c4,f4]@22 ~@22]/2", W: "[c5,a5,c6]@11 ~ [bb4,e5]@12, ~@11 bb5@12 ~",
  X: "[[a4,a5], f5@25 ~@23]/2", Y: "[f4,f5]",
  Z: "[[e4,e5]@11 ~ [f4,f5]@6 [gb4,eb5,gb5]@5 ~@7 bb4@17 ~, ~@12 c5@11 e5@23 ~@2, ~@24 [g4,g5]@23 ~]/2", // E F Ebm G
  AA: "[[c5,c6]@3 ~ [b4,b5] ~ [c5,c6]@66]/3", AB: "[[f4,f5]@29 ~@7 [c4,c5]@11 ~]/2",
  AC: "[[g4,bb4,g5]@33 ~@3 [bb4,d5,bb5]@5 ~ [a4,c5,a5]@5 ~]/2", // Gm Bb Am
  AD: "[~@6 [f3,a3]@7 ~@5, [f4,f5]@17 ~@7, ~ a4@50 ~@21, ~@23 c4@28 ~@21]/3", // F
})).s("gm_string_ensemble_1").gain(0.25)

// drums · kick
const kick = s("bd").struct("<~ A@11 B A@7 B A@15 B A@7 B A@7 B A@15 B A@15 B ~@5>".pickRestart({
  A: "x!4", B: "x",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct("<~ A@11 ~ A@7 ~ A@15 ~ A@7 ~ A@7 ~ A@15 ~ A@15 ~@6>".pickRestart({
  A: "~ x ~ x",
})).gain(0.5)

// drums · low tom
const low_tom = s("lt").struct("<~@4 A ~@23 B ~@22 A ~@8 C ~@6 A ~@8 D ~@6 A ~@6>".pickRestart({
  A: "~@11 x", B: "~@3 x", C: "~@10 x!2", D: "~@9 x!2 ~",
})).gain(0.25)

// drums · hihat
const hihat = s("hh").struct("<~ A@11 B A@7 B A@15 B A@7 B A@7 B A@15 B A@15 B ~@5>".pickRestart({
  A: "x!12", B: "x",
})).gain(0.2)

// drums · mid tom
const mid_tom = s("mt").struct("<~@11 A ~@16 B ~@22 C ~@8 D ~@15 B ~@6 C ~@6>".pickRestart({
  A: "~@11 x", B: "~ x", C: "~@5 x", D: "~@8 x!2 ~@2",
})).gain(0.25)

// drums · high tom
const high_tom = s("ht").struct("<~@4 A ~@6 A ~@16 B ~@31 C ~@6 A ~@8 B ~@13>".pickRestart({
  A: "~@5 x", B: "~@2 x ~@2 x ~@6", C: "~@2 x ~@2 x!3 ~@4",
})).gain(0.25)

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

// drums · ride
const ride = s("rd").struct("<~@85 x [~ x] ~@3>").gain(0.2)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ A@11 B A@7 B A@15 B A@7 B A@7 B A@15 B A@7 C A@7 ~@6>".pickRestart({
  A: "x ~ x!2 ~ x!2 ~ x!2 ~ x", B: "x", C: "x ~@2 x ~ x!2 ~ x!2 ~ x",
})).gain(1.01)

// drums · shaker
const shaker = s("sh").struct("<~ A@11 B A@7 B A@15 B A@7 B A@7 B A@15 B A@7 C A@7 ~@6>".pickRestart({
  A: "x ~ x!2 ~ x!2 ~ x!2 ~ x", B: "x", C: "x ~@2 x ~ x!2 ~ x!2 ~ x",
})).gain(0.2)

stack(
  bass, string_ensemble_1, acoustic_guitar_steel, pad_new_age, string_ensemble_1_2, kick, snare, low_tom, hihat,
  mid_tom, high_tom, crash, ride, cabasa, shaker
)

More by G. G. Anderson