Strudelify

Hallo, guten Morgen Deutschland

Tom Astor

KeyE♭ minorTempo120 bpm
0:00/0:00
// Hallo, guten Morgen Deutschland — Tom Astor
// 120 bpm, 4/4, key D# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 72 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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 E C D A F G C A H G C A B C D A E C D A F G C A H G C A I J K L M N K L M O P K M Q P K M R K L M N K L M
  S K L M N K L M T M U V@2
>`.pickRestart({
  A: "f2 ~ c2 ~ f2 ~ f2 ~", B: "bb1@2 ~@2 f2@2 ~@2 bb1 ~ f1 ~ g1 ~ a1 ~", C: "bb1 ~ f2 ~ bb1 ~ bb1 ~",
  D: "f2 ~ c2 ~ f2 ~ c2 ~", E: "bb1 ~ f2 ~ bb1 ~ f2 ~", F: "bb1@2 ~@2 f2@2 ~@2 bb1 ~ bb1 ~ c2 ~ d2 ~",
  G: "eb2 ~ bb1 ~ eb2 ~ eb2 ~", H: "bb1@2 ~@2 f2@2 ~@2 bb1@2 ~@2 c2 ~ d2 ~", I: "bb1@3 ~ c2@3 ~ d2@3 ~ f2@3 ~",
  J: "gb2@3 ~ e2@3 ~ eb2@3 ~ db2@3 ~", K: "b1 ~ gb2 ~ b1 ~ b1 ~", L: "gb2 ~ db2 ~ gb2 ~ db2 ~",
  M: "gb2 ~ db2 ~ gb2 ~ gb2 ~", N: "b1 ~ gb2 ~ b1 ~ gb2 ~", O: "b1@2 ~@2 gb2@2 ~@2 b1 ~ b1 ~ db2 ~ eb2 ~",
  P: "e2 ~ b1 ~ e2 ~ e2 ~", Q: "b1@2 ~@2 gb2@2 ~@2 b1@2 ~@2 db2 ~ eb2 ~",
  R: "b1@2 ~@2 gb1@2 ~@2 b1 ~ gb1 ~ ab1 ~ bb1 ~", S: "b1@2 ~@2 gb2@2 ~@2 b1 ~ gb1 ~ ab1 ~ bb1 ~",
  T: "b1@2 ~@2 gb2@2 ~@2 b1 ~ eb2 ~ e2 ~ f2 ~", U: "b1 eb2 ab2 gb2", V: "[eb2 db2 b1@6]/2",
})).s("gm_electric_bass_finger").gain(0.5)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~ A B C D A E C D A F G H I J K H I L C D A E C D A F G H I J K H I M N O P Q R O P Q S T U V W X U V Y O P Q R O P Q
  S Z AA AB AC Z AA AB AD AB AE AF@2
>`.pickRestart({
  A: "f3@2 [a3,c4,f4] ~ c3@2 [a3,c4,f4] ~ f3@2 [a3,c4,f4] ~ f3@2 [a3,c4,f4] ~", // F
  B: "bb2@2 [bb3,d4,f4] ~ f3@2 [bb3,d4,f4] ~ bb2 ~ [bb3,d4,f4] ~ g2@2 [d4,f4] ~, ~@5 f2 ~ a2", // Bb Dm
  C: "bb2@2 [bb3,d4,f4] ~ f3@2 [bb3,d4,f4] ~ bb2@2 [bb3,d4,f4] ~ bb2@2 [bb3,d4,f4] ~", // Bb
  D: "f3@2 [a3,c4,f4] ~ c3@2 [a3,c4,f4] ~ f3@2 [a3,c4,f4] ~ c3@2 [a3,c4,f4] ~", // F
  E: "bb2@2 [bb3,d4,f4] ~ f3@2 [bb3,d4,f4] ~ bb2@2 [bb3,d4,f4] ~ f3@2 [bb3,d4,f4] ~", // Bb
  F: "bb2@2 [bb3,d4,f4] ~ f3@2 [bb3,d4,f4] ~ bb2 ~ [bb3,d4,f4] ~ c3@2 [d4,f4] ~, ~@5 bb2 ~ d3", // Bb Dm
  G: "[eb3,bb3,eb4,g4]@11 ~ [eb3,bb3,eb4,g4]@4", H: "[bb2,bb3,d4,f4]@15 ~", I: "[a3,c4,f4]@11 ~ [a3,c4,f4]@4, f3@15 ~",
  J: "f4 ~@2 d4, [bb2,bb3]@15 ~, d4@11 ~@5, ~ f4@3, ~ bb4", K: "[eb3,g3,bb3,eb4]@11 ~ [eb3,bb3,eb4,g4]@4",
  L: "[bb2,bb3]@10 [f2,f3] ~ [g2,g3] ~ [a2,a3] ~, [d4,f4]", M: "bb2 c3 d3 f3, [d4,f4], bb3@5 ~@3",
  N: "[bb3,db4,gb4]@3 [bb3,db4,gb4], gb2", // Gb
  O: "b2@2 [b3,eb4,gb4] ~ gb3@2 [b3,eb4,gb4] ~ b2@2 [b3,eb4,gb4] ~ b2@2 [b3,eb4,gb4] ~", // B
  P: "gb3@2 [bb3,db4,gb4] ~ db3@2 [bb3,db4,gb4] ~ gb3@2 [bb3,db4,gb4] ~ db3@2 [bb3,db4,gb4] ~", // Gb
  Q: "gb3@2 [bb3,db4,gb4] ~ db3@2 [bb3,db4,gb4] ~ gb3@2 [bb3,db4,gb4] ~ gb3@2 [bb3,db4,gb4] ~", // Gb
  R: "b2@2 [b3,eb4,gb4] ~ gb3@2 [b3,eb4,gb4] ~ b2@2 [b3,eb4,gb4] ~ gb3@2 [b3,eb4,gb4] ~", // B
  S: "b2@2 [b3,eb4,gb4] ~ gb3@2 [b3,eb4,gb4] ~ b2 ~ [b3,eb4,gb4] ~ db3@2 [eb4,gb4] ~, ~@5 b2 ~ eb3", // B Ebm
  T: "[e3,b3,e4,ab4]@11 ~ [e3,b3,e4,ab4]@4", U: "[b2,b3,eb4,gb4]@15 ~",
  V: "[bb3,db4,gb4]@11 ~ [bb3,db4,gb4]@4, gb3@15 ~", W: "gb4 ~@2 eb4, [b2,b3]@15 ~, eb4@11 ~@5, ~ gb4@3, ~ b4",
  X: "[e3,ab3,b3,e4]@11 ~ [e3,b3,e4,ab4]@4", Y: "[b3,eb4,gb4]@3 [b3,eb4,gb4], b2",
  Z: "~@12 b2 ~ [eb4,gb4]@2, b2@3 [eb4,gb4]@2 b3@4 ~ b3@2 ~ b3@2 ~, ~ b3 gb3@2 b2@2 ~@2, ~@6 [eb4,gb4]@4 ~ [eb4,gb4]@2 ~@3", // Ebm
  AA: "~@7 [db4,gb4], gb3@3 [db4,gb4]@2 bb3@4 ~ bb3@2 ~ bb3@2 ~, ~ bb3 db3@2 gb3@2 db3@2, ~@6 [db4,gb4]@4 ~ [db4,gb4]@2 ~@3", // Gb5
  AB: "~@7 [db4,gb4], gb3@3 [db4,gb4]@2 bb3@4 ~ bb3@2 ~ bb3@2 ~, ~ bb3 db3@2 gb3@2 gb3@2, ~@6 [db4,gb4]@4 ~ [db4,gb4]@2 ~@3", // Gb5
  AC: "~@8 b2@2 ~@2 ab2 ~ [bb2,eb4,gb4]@2, b2@3 [eb4,gb4]@2 b3@4 ~@4 gb3@2 ~, ~ b3 gb3@2 ~ [gb2,b3] ~@2, ~@6 [eb4,gb4]@4 ~ [eb4,gb4]@2 ~@3", // Ebm B5 Ebm
  AD: "~@8 b2@2 ~@2 e3 ~ [f3,eb4,gb4]@2, b2@3 [eb4,gb4]@2 b3@4 ~@7, ~@2 b3@2 gb3@4 ~@2 [eb3,b3]@2 ~ gb3@2 ~, ~@6 [eb4,gb4]@4 ~ [eb4,gb4]@2 ~@3", // Ebm Abm Ebm
  AE: "~@7 [eb4,gb4], b2@3 [eb4,gb4]@2 b3@4 ~ b3@2 ~ b3@2 ~, ~ b3 gb3@2 b2@2 b2 ~, ~@6 [eb4,gb4]@4 ~ [eb4,gb4]@2 ~@3", // Ebm
  AF: "[b2@2 [b3,eb4,gb4] ~ gb3@2 [b3,eb4,gb4] ~ [b2,gb3,b3,eb4,gb4]@24]/2", // B
})).s("gm_piano").gain(0.32).pan(0.7)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~ A B@2 A@2 B@2 A@2 B C B A B C B A B@2 A@2 B@2 A@2 B C B A B C B A B D E D@2 E@2 D@2 E F E D E F E D E@2 D@2 E@2 D@2
  E@2 D@2 E@2 D@2 E D E G@2
>`.pickRestart({
  A: "[a3,c4,f4]@2 [a3,c4]!2 [a3,c4,f4]@2 [a3,c4]!2 [a3,c4,f4]@2 [a3,c4]!2 [a3,c4,f4]@2 [a3,c4]@2", // F Am F Am F Am F Am
  B: "[bb3,d4,f4]@2 [bb3,d4]!2 [bb3,d4,f4]@2 [bb3,d4]!2 [bb3,d4,f4]@2 [bb3,d4]!2 [bb3,d4,f4]@2 [bb3,d4]@2", // Bb
  C: "[bb3,eb4,g4]@2 [bb3,eb4]!2 [bb3,eb4,g4]@2 [bb3,eb4]!2 [bb3,eb4,g4]@2 [bb3,eb4]!2 [bb3,eb4,g4]@2 [bb3,eb4]@2", // Eb Eb5 Eb Eb5 Eb Eb5 Eb Eb5
  D: "[bb3,db4,gb4]@2 [bb3,db4]!2 [bb3,db4,gb4]@2 [bb3,db4]!2 [bb3,db4,gb4]@2 [bb3,db4]!2 [bb3,db4,gb4]@2 [bb3,db4]@2", // Gb Bbm Gb Bbm Gb Bbm Gb Bbm
  E: "[b3,eb4,gb4]@2 [b3,eb4]!2 [b3,eb4,gb4]@2 [b3,eb4]!2 [b3,eb4,gb4]@2 [b3,eb4]!2 [b3,eb4,gb4]@2 [b3,eb4]@2", // B
  F: "[b3,e4,ab4]@2 [b3,e4]!2 [b3,e4,ab4]@2 [b3,e4]!2 [b3,e4,ab4]@2 [b3,e4]!2 [b3,e4,ab4]@2 [b3,e4]@2", // E E5 E E5 E E5 E E5
  G: "[[b3,eb4,gb4]@2 [b3,eb4]!2 [b3,eb4,gb4]@2 [b3,eb4]@2 [b2,b3,eb4,gb4]@24]/2", // B
})).s("gm_acoustic_guitar_steel").gain(0.24).pan(0.3)

// other · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel_2 = note("<A B C D E F G H I J K L ~@8 E F G H I J M ~@45>".pickRestart({
  A: "~@5 [d4,f4] [eb4,f4] [e4,f4]", B: "[f3,f4]@2 f4 ~ f3 f4 eb4@2 d4@2 eb4@2 [d4,eb4] d4 c4 ~, ~@3 c4@2 ~@11",
  C: "[bb2,bb3]@2 bb3 ~ bb2 bb3 f3@2 bb3@2 f3@2 g3@2 a3@2, ~@3 f3@2 ~@11", D: "bb3 ~",
  E: "~@4 a4@2 f4 ~ eb4@2 c4 ~ a3@2 f3 ~", F: "f3@7 ~@9", G: "f3@2 f3!2 f3@2 f3!2 f3@2 f3!2 f3@2 d3 ~", H: "bb2@7 ~@9",
  I: "f3@2 f3!2 f3@2 f3!2 f3@2 f3!2 f3@2 a3 ~", J: "f3@5 ~@11", K: "bb2@2 bb2!2 d3@2 d3!2 f3@2 f3!2 f3@2 d3 ~",
  L: "eb3@5 ~@11", M: "g3 ~ f3 ~ d3 ~ c3@2 bb2@4 ~@4",
})).s("gm_acoustic_guitar_steel").gain(0.36).pan(0.7)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note("<~@28 A B C@2 D E F G H ~@7 I J ~ K@2 L M N@2 ~@14 O M P Q@2>".pickRestart({
  A: "~@8 d4 f4 d4 f4@3 g4@2", B: "c4@9 ~@7", C: "[~@4 d4 eb4 f4 ab4@3 g4 ~ f4 eb4 ~ g4@10 ~@3 [g4,bb4]@3 ~]/2",
  D: "[f4,bb4]@5 ~@2 [d4,f4]@3 [d4,f4] ~@2 [bb3,d4]@3", E: "[a3,c4]@15 ~",
  F: "[c3,c4]@2 bb2 ~ c3@3 ~ d3@3 ~ f3@3 ~, ~ bb3@6 ~", // C
  G: "[gb3,bb4]@3 ~ bb4 ~@3 [eb3,ab4]@3 ~ db3@3 ~, gb4@4 e3@3 ~@9, ~@5 gb4@5 ~ bb4@3 ~@2", H: "b2@11 ~@5",
  I: "~@13 ab3@3", J: "b3@2 ~@6 eb4 gb4 eb4 gb4@3 ab4@2", K: "[~@6 eb4 e4 gb4 a4@3 ab4@2 gb4 e4@12 ~ [ab3,db4]@4]/2",
  L: "[gb3,b3] ~@2 [gb3,b3]", M: "[gb3,bb3]@15 ~", N: "[eb4@2 gb4 eb4 db4 ~ db4 ~ eb4@2 gb4 eb4 db4 ~ db4 b3@9 ~@8]/2",
  O: "~@3 gb3 ~ b3 gb3@2 ~ gb3 bb3 gb3 ~ gb3 ab3@2, ~ b3 ~@2 b3 ~ a3 ~", P: "b3@2 gb4 eb4 db4 b3 ~ b3 [b3,eb4]@4 db4@4",
  Q: "b3/2",
})).s("gm_electric_guitar_clean").gain(0.34).pan(0.7)

// chords · electric guitar clean · "CLEAN GTR" · soft notes
const electric_guitar_clean_2 = note("<~@51 A ~@15 B ~ C D@2>".pickRestart({
  A: "~@5 b3 ~ b3 ~@5 b3 ~@2", B: "~@4 eb3 ~@11", C: "~@6 b3 ~@5 gb3@4", D: "gb3/2",
})).s("gm_electric_guitar_clean").gain(0.19).pan(0.7)

// chords · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz = note(`<
  ~ A B ~@2 C D E F G H I A J K I A L M ~@2 C D E F G H ~@8 N O P@2 Q@2 R S T ~@3 U V W ~ X ~ P@2 Q@2 R S Y ~ P@2 Q@2 R
  S Z ~@2 AA@2
>`.pickRestart({
  A: "f4@15 ~", B: "bb3@7 ~", C: "f4 eb4", D: "~ d4@13 ~@2", E: "d5@15 ~", F: "c5", G: "c5@15 ~", H: "bb4@5 ~@3",
  I: "g4@15 ~", J: "f4 c4", K: "d4@11 ~@5", L: "c4@15 ~", M: "bb3 ~",
  N: "bb4@3 ~ bb4 ~@3 ab4@3 bb4@3 ~@2, ~@5 gb4@5 ~@6", O: "[b4,eb5]@7 ~",
  P: "[db5@2 bb4 ~@2 bb4@2 ~@5 db4 eb4 gb4 [e4,ab4]@9 [e4,ab4]@8, ~@4 gb4@3 ~@9]/2", // E
  Q: "[[eb4,gb4]@4 eb5@2 b4 [ab4,db5]@5 ~@2 gb4@2]/2", R: "gb4@15 ~",
  S: "~@2 [bb4,db5]@2 ~ [ab4,b4]@2 ~ [gb4,bb4]@2 ~ [e4,ab4]@2 ~ [gb4,bb4]@2", // Bbm Abm Gb E Gb
  T: "~ [gb4,b4]!2 ~ gb4@2 eb4 b3 [b3,eb4] ~ [b3,eb4]@2 d4 db4 b3@2, b3@5 ~@11", U: "[gb3,b3] [gb3,a3]",
  V: "[e3,ab3]@7 ~", W: "[b2,gb3]@13 ~@3", X: "[gb3,b3]@15 ~",
  Y: "~ [gb4,b4]!2 ~ gb4@2 eb4 b3 [b3,eb4] ~ b3@6, b3@5 ~@11", Z: "[gb4,b4]@13 ~@3",
  AA: "[[ab4,b4]@2 [gb4,bb4]@2 [e4,ab4]@4 [b3,eb4,b4]@23 ~]/2", // Abm Gb E B
})).s("gm_electric_guitar_jazz").gain(0.26).pan(0.2)

// drums · kick
const kick = s("bd").struct("<~ A@9 B A@7 B A@7 B A@8 B A@7 C A@7 C A@7 C A@7 C A@3 ~>".pickRestart({
  A: "x!2", B: "x ~@3 x ~@2 x", C: "x ~@3 x!2 ~@2",
})).gain(0.69)

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

// drums · hihat
const hihat = s("hh").struct("<~ A@34 B C A@14 B C A@7 C A@8 D E ~>".pickRestart({
  A: "x ~ x!3 ~ x!3 ~ x!3 ~@3", B: "x ~ x!3 ~ x!3 ~@3 x ~@3", C: "~@2 x!3 ~ x!3 ~ x!3 ~@3",
  D: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", E: "x ~ x!3 ~@11",
})).gain(0.23)

// drums · open hat
const open_hat = s("oh").struct("<~ A@34 B A@15 B A@17 ~ C ~>".pickRestart({
  A: "~@7 x", B: "~@5 x ~ x", C: "~@3 x ~@4",
})).gain(0.31)

// drums · crash
const crash = s("cr").struct("<~@3 A ~@7 A ~@7 A ~@7 A ~@8 A ~@7 A ~@7 A ~@7 A ~@9 B ~>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.31)

stack(
  bass, piano, acoustic_guitar_steel, acoustic_guitar_steel_2, electric_guitar_clean, electric_guitar_clean_2,
  electric_guitar_jazz, kick, snare, hihat, open_hat, crash
)

More by Tom Astor