Strudelify

Hungrige Herzen

Tom Astor

KeyC majorTempo82 bpm
0:00/0:00
// Hungrige Herzen — Tom Astor
// 82 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 59 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(82/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 · fretless bass · "FRETLESS"
const bass = note(`<
  A B C D E F G H I J E K L M N O P Q R S A B C D E T G H U V E K L M N O P Q R S L M N O P Q R S L M N O P Q R S R W@2
>`.pickRestart({
  A: "c2@4 f2@4 c2@3 ~ c2 e2 g2@2", B: "f2@4 a#2@4 f2@4 f2 e2 d2@2", C: "c2@3 ~ c2@3 c2 g1@3 ~ g1@2 ~ g1",
  D: "f1@3 ~ f1@2 ~@2 c2@3 c2 c2@3 ~", E: "a1@2 ~@2 a1@4 f1@2 ~@2 f1@2 ~ f1", F: "g1 ~ g1@2 c2 ~ c2@2",
  G: "a1 ~ a1@2 f1 ~ f1 ~", H: "g1@2 ~@2 g1@2 ~ c2 g1@2 ~ d2 g1 ~ e1 ~", I: "f1@2 ~@2 f1@4 c2@2 ~@2 c2@2 ~ c2",
  J: "f1@2 ~@2 f1@4 c2@2 ~@2 c2 a1 c2 b1", K: "g1@2 ~@2 g1 d2 g2 a2 g2@3 g1!3 b1@2",
  L: "c2@2 ~ c2 c2@2 ~@2 f1@2 ~ f1 f1@2 f1@2", M: "g1@2 ~ g1 g1@2 g1@2 c2@2 ~ c2 g1@2 e1@2",
  N: "f1@2 ~ f1 f1@2 f1@2 g1@2 ~ g1 g1@2 g1@2", O: "c2@2 ~ c2 c2@2 d2@2 g1@2 ~ g1 g1@2 b1@2",
  P: "c2@2 ~ c2 g1@2 ~@2 f1@2 ~ f1 f1@2 f1@2", Q: "g1@2 ~ g1 g1@2 g1@2 c2@2 ~ c2 g1@2 g1!2",
  R: "c2@2 ~@2 c2@2 c2 d2 g2@4 d2@4", S: "c2@2 ~@2 g1@2 ~@2 c2@2 ~ g1 g1@2 a1 g1", T: "g1@2 ~@2 g1@4 c2@2 ~ g1 c2@4",
  U: "f1@2 ~@2 f1@3 f1 c2@2 ~@2 c2@2 e1@2", V: "f1@2 ~@2 f1@2 ~ f1 c2@2 ~ g1 c2@2 b1@2", W: "[c2 ~ g1 ~ c2@12]/2",
})).s("gm_fretless_bass").gain(0.51)

// chords · piano · "A.PIANO 2"
const piano = note(`<
  A B C D E F G H I J K L M N O P M Q R S A B C D T U V W X Y K Z M N O P M Q R S M N AA P M Q R S M N O P M Q R S R
  AB@2
>`.pickRestart({
  A: "[c3,g3,c4,e4] [f3,a3,c4,f4] [c3,g3,c4,e4]@2", B: "[f3,a3,f4,c5]@4 [a#3,d4,f4,c5]@3 ~ [f3,a3,f4,c5]@8",
  C: "[c4,e4]@5 ~ e4@2 [b3,d4]@6 g3@2, [c3,g4] [g2,g4], ~@5 c4@2 ~@9", D: "g4 f4 [c3,g3,c4,e4]@2, [f2,a3,c4] ~",
  E: "[a2,a3,c4]@8 f4@4 f4 g4 a4 ~, e4@3 ~ [f2,a3,c4]@4", F: "g4@4 g4@3 ~ [c3,g3,c4,e4]@8, [g2,d4] ~, [g3,b4]@3 ~@5",
  G: "e4@3 c5 a4 ~ f5@2, [a2,a3,c4] [f2,a3,c4,f4]", // Am F
  H: "g4@2 ~ g4 ~@3 [g3,b3,d4,g4], g2@3 g2, [c4,e4,e5]@4 [b3,d4,g4,d5]@3 ~, ~ c5 ~@2", // G C G
  I: "[f3,c4,f4,a4]@4 [c4,e4,g4]@3 [e4,g4], ~ c3, ~@14 c4 ~", J: "c4@3 c4 g4@3 [g4,c5], [f3,f4,a4] [c3,c4,e4]",
  K: "[a3,c4,e4,a4]@2 a4 [c5,f5], ~ [f3,c4,f4]", // Am F5
  L: "[c4,e4]@2 [c4,e4,g4]@2 ~ [e4,g4]@2 c4 [d4,g4]@3 ~@3 d4@2, c3 [g2,b3], c5@4 c4@3 ~@4 d4@3 ~@2, ~@3 [g3,g4]", // C Em G5 G
  M: "e4@6 c4@2 [f4,a4]@5 ~ a4@2, [c3,g4] [f3,c4], c4 ~@3", // F C5 F5
  N: "[d4,g4]@4 f4@4 c4@3 ~@3 g3@2, [g2,b3] [c3,e4,g4], ~@3 c4", // G5 G C
  O: "c4@2 ~ c4 g4@2 f4@2, [f3,f4,a4] g2, ~@4 [b3,d4]@3 ~", // F Bm
  P: "[c4,e4,g4]@5 ~@7 g3@4, c3 [g2,b3,d4], ~@5 c4@2 g4@9, ~@3 e4 ~@4", // C G
  Q: "[d4,g4] f4 [c4,e4] [g3,c4,e4], [g2,b3] [c3,g4]", R: "c4@2 ~ c4 b3@2 g3@2, [c3,e4,g4] [g2,d4,g4]",
  S: "[c4,e4,g4]@5 ~@2 g4 g3@4 g3@4, c3 [c3,c4,e4], ~@5 c4@2 ~@9, ~@3 e4 ~@4", // C
  T: "[a2,a3,c4]@4 c5@3 [a4,c5,f5], e4@3 ~ [f2,a3,c4,f4]@4", U: "[g2,g4,d5] [c3,g3,e4,c5,e5], [g3,b4]@3 ~@5",
  V: "e4@4 ~ c5@3 g4 ~@3 [c5,f5]@4, [a2,a3,c4] [f2,a3,c4,f4], e5@3 ~@5, ~ [e4,g4] ~@2, ~@4 b4@2 ~@3 a4@7", // F5 Am F Em
  W: "[c4,e4]@2 g4@4 ~@2 [b3,d4,g4,d5]@5 g3 [g3,b3,d4,g4]@2, [g2,e5] g2, g3@6 g3@7 ~@3, ~ [c4,e4]@3 ~@4", // C G C
  X: "[f3,c4,f4,a4]@8 [c4,e4,g4]@5 ~ [e4,g4]@2, ~ c3, ~@13 g3@3, ~@14 c4 ~", // F C Em
  Y: "c4@3 c4 g4@3 [g3,b3], [f3,f4,a4] [c3,c4,e4]", // G F C
  Z: "[c4,e4]@2 [c4,e4,g4]@2 ~ [e4,g4]@2 c4 [d4,g4]@3 d4 d4@2 d4@2, c3 [g2,b3], c5@4 c4@3 ~@5 [g3,g4]@4", // C Em G5 G
  AA: "f4@2 [f4,a4]@3 ~ c4@2 g4@2 ~@4 [b4,d5,g5]@2, [f3,a3] g2, c4@5 [a4,c5,f5]@3 [b3,d4]@6 ~@2, ~@5 [g4,b4]@2 ~, ~@3 f4", // F G F Bm G
  AB: "[[c4,e4,g4]@5 ~@2 g4 [c3,g3,c4,e4]@24, c3 ~@3, ~@5 c4@2 ~@25, ~@3 e4 ~@12]/2", // C
})).s("gm_piano").gain(0.29).pan(0.3)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  A B C D E F E C G H I J K L M N K O N P A B C D E F E C G H I J K L M N K O N P K L M N K O N P K L M N K O N P N Q@2
>`.pickRestart({
  A: "[e3,g3,c4]@4 [f3,a3,c4]@4 [e3,g3,c4]@7 ~", B: "[f3,a3,c4] [f3,a#3,d4] [f3,a3,c4]@2", C: "[e3,g3,c4] [d3,g3,b3]",
  D: "[f3,a3,c4] [e3,g3,c4]", E: "e3 f3, [a3,c4]", F: "[b3,d4] [e3,c4], g3", G: "[f3,a3] [e3,g3], c4",
  H: "[a3,f4] [g3,e4], c4", I: "e4 f4, [a3,c4]", J: "[c4,e4] [b3,d4], g4", K: "[e3,g4] [f3,a4], c4",
  L: "[g3,b3,g4] [c4,e4,g4]", M: "[a3,c4,f4] [b3,d4,g4]", N: "[c4,e4] [b3,d4], g3", O: "[b3,g4] [c4,e4], g3",
  P: "[c3,c4,e4]", Q: "[c3 [c3,c5]@3, [c4,e4]]/2",
})).s("gm_string_ensemble_2").gain(0.28)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  A B C D E F G H I@2 G H J K L M N O P Q A B C D E F G H I@2 G H J K L M N O P Q J K L M N O P Q J K L M N O P Q R S@2
>`.pickRestart({
  A: "[g3,c4,e4] ~ [g3,c4]!2 [a3,c4,f4] ~ [a3,c4]!2 [g3,c4]@2 [g3,c4]!2 [g3,c4,e4]@2 [g3,c4]!2, ~@2 e4 ~", // C C5 F Am C5 C C5
  B: "[a3,c4,f4,c5] ~ [a3,c4,c5]!2 [a#3,d4,f4,c5] ~ [a#3,d4,c5]!2 [a3,c4]@2 [a3,c4]!2 [a3,c4,f4]@2 [a3,c4]!2, ~ c5, ~@2 f4 ~", // F Am A# Am F Am
  C: "[e3,g3,c4] [g3,c4,e4] [g3,c4] [g3,c4,e4] [g3,b3] [g3,b3,d4] [g3,b3] [g3,b3,d4]", // C C5 C G
  D: "[a3,c4]@2 [a3,c4,f4]@2 [a3,c4]@2 [a3,c4,f4]@2 [g3,c4]@2 [g3,c4,e4]@2 [g3,c4]!2 [g3,c4,e4]@2", // Am F Am F C5 C C5 C
  E: "a3@2 a3 ~@3 a3@2 ~@7 f3, a2 f2, [e3,c4]@3 a4@4 ~@5 c4@4, ~@4 e4@4 ~@3 f4@4 ~, ~@5 c4@3 ~@2 a3@4 a3@2", // C
  F: "~@6 g3@2 ~@7 g3, g2 c3, ~@2 g3@3 b3@3 ~@2 c4@4 c4@2, ~@3 g4@4 ~@4 g4@4 ~, ~ d4 ~ e4",
  G: "~@6 a3@2 ~@7 f3, a2 f2, ~@2 a3@3 c4@3 ~@2 a3@4 a3@2, ~@3 a4@4 ~@5 c4@4, ~@4 e4@4 ~@3 f4@4 ~",
  H: "~@3 g3 ~@3 b3, g2!2, ~@2 g3@3 c4@3 ~@2 b3@4 ~@2, ~@3 g4@4 ~@4 g4@4 ~, ~ e4 ~ d4",
  I: "~@6 f3@2 ~@7 c3, f2@8 c3@7 ~, ~@2 f3@3 a3@3 ~@2 g3@4 g3@2, ~@3 f4@4 ~@4 e4@4 ~, ~ c4 ~ c4",
  J: "[e3,g3,c4]@2 [g3,c4,e4,c6]@2 [g3,c4]@2 [g3,c4,e4,c6]@2 [a3,c4]@2 [a3,c4,f4,c6]@2 [a3,c4,c6] [a3,c4,a5] [a3,c4,f4,c6]@2", // C C5 C Am F Am F
  K: "[b3,d4]@2 [b3,d4,g4,b5]@2 [b3,d4]@2 [b3,d4,g4,b5]@2 [g3,c4]@2 [g3,c4,e4,c6]@2 [g3,c4] [g3,c4,e4,c6] [g3,c4,e4,c6]@2", // Bm G Bm G C5 C C5 C
  L: "[a3,c4]@2 [a3,c4,f4,a5]@2 [a3,c4] [a3,c4,f4,a5] [a3,c4,f4,a5]@2 [b3,d4]@2 [b3,d4,g4,b5]@2 ~ b5 [b3,d4,g4,b5]@2, ~@6 [b3,d4] ~", // Am F Am F Bm G Bm
  M: "[c4,e4]@2 [c4,e4,g4,c6]@2 [c4,e4] [c4,e4,g4,c6] [c4,e4,g4,c6]@2 [b3,d4]@2 [b3,d4,g4,b5]@2 [b3,d4] [b3,d4,b5] [b3,d4,g4,b5]@2", // C Bm G Bm G
  N: "[e3,g3,c4]@2 [g3,c4,e4,c6]@2 ~ c6 [g3,c4,e4,c6]@2 [a3,c4]@2 [a3,c4,f4,c6]@2 [a3,c4,c6] [a3,c4,a5] [a3,c4,f4,c6]@2, ~@2 [g3,c4] ~@5", // C Am F Am F C5
  O: "[b3,d4]@2 [b3,d4,g4,b5]@2 [b3,d4]@2 [b3,d4,g4,b5]@2 [g3,c4]@2 [g3,c4,e4,c6]@2 [g3,c4] [g3,c4,e4,c6]!2 [g3,c4,c6]", // Bm G Bm G C5 C C5 C …
  P: "[c4,e4]@2 [c4,e4,g4,c6]@2 [c4,e4] [c4,e4,g4,c6] [c4,e4,g4,c6]@2 [b3,d4]@2 [b3,d4,g4,b5]@2 ~ b5 [b3,d4,g4,c6]@2, ~@6 [b3,d4] ~", // C Bm G Bm
  Q: "[c4,e4]@2 [c4,e4,g4,c6]@2 [c4,e4] [c4,e4,g4] [c4,e4,g4,g5]@2 [c4,e4]@2 [c4,e4,g4,c5]@2 [c4,e4] [c4,e4,g4,c5]!2 [c4,e4,g4]", // C
  R: "[c4,e4]@2 [c4,e4,g4,c6]@2 [c4,e4] [c4,e4,g4,c6]!3 [b3,d4]@2 [b3,d4,g4,b5]@2 ~ b5 [b3,d4,g4,b5]@2, ~@6 [b3,d4] ~", // C Bm G Bm
  S: "[[c4,e4]@2 [c4,e4,g4,c6]!2 [c4,e4,c6] [c4,e4,g4,g5]@2 [c4,e4] [c4,e4,g4,c5]@24]/2", // C
})).s("gm_acoustic_guitar_steel").gain(0.31).pan(0.6)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  A B C D ~@6 E F ~@6 G H I J K L ~@4 M@2 E F ~@6 G N O P Q R ~ S T@2 ~@6 G U V W@2
>`.pickRestart({
  A: "[c3,g3]@2 c3!2 [c3,f3]@2 f3!2 [g3,c4]@8", B: "[c3,f3]@2 f3!2 [f3,a#3]@2 a#3!2 [c3,f3]@8",
  C: "~@3 d4@2 c4@3 ~@3 d4@5, c3 g2, ~ g3@3 ~ g3@3", D: "~@3 c4@2 ~@3 c3@8, f2 ~, ~@2 f3@7 ~@7, ~@5 c4@11", E: "e4 f4",
  F: "~@5 d4@3 g3@6 ~@2, g3@3 ~@5, ~ d4 ~@6, ~@3 g4@11 ~@2", G: "c4 b3",
  H: "c4@2 ~@3 g3 ~@2 g4@6 ~@2, ~ g3 ~@6, ~@3 c4@5 ~@8", I: "[c3,g3,c4]@2 c3!2 [c3,f3,c4]@2 f3!2 [c3,g3,c4]@8",
  J: "[c3,f3,c4]@2 f3!2 [f3,a#3,d4]@2 a#3!2 [c3,f3,c4]@8", // F5 A# F5
  K: "~@3 d4@2 c4@3 ~@6 d3@2, c3 g2, ~@2 g3@6 ~ g3@4 g3@2 ~, ~@10 d4@5 ~, ~@11 g4@5",
  L: "~ [c3,g3], f2 ~, ~ f3@7 ~@8, ~@2 c4@2 ~ c4@11, ~@3 g4@10 ~@3", M: "g4", N: "c4@8 ~ g4 a4 b4 c5 d5 e5 f5",
  O: "e5 f5 g5 c5@5 c5 d5 e5 a4@3 b4 c5", P: "b4 g4 d4 c4 b3 a4 g4@5 ~@2 g4 c5 g4", Q: "d5@3 c5@3 g4!2 a5@3 g5@3 f5 e5",
  R: "g5@3 g5@3 g5@9 ~", S: "~@2 e5!2", T: "[g4@9 c4@3 g4@4]/2", U: "~@2 c4@7 g4 a4 b4 c5 d5 e5 f5",
  V: "e5 f5 g5@6 e5@4 d5@4", W: "[~ c4@3, c5 ~, ~ g4@7 ~@8]/2",
})).s("gm_overdriven_guitar").gain(0.28).pan(0.6)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel_2 = note("<A B C D E F@2 ~ G H ~@10 I@2 C J E ~@3 G H ~@9 K ~@7 K ~@7 K ~@3>".pickRestart({
  A: "g6@2 g6!2 g6@2 g6!2 g6@3 g5 e5 d5 c5@2", B: "a5@2 a5!3 a#5!3 a5@2 ~ a5!2 g5 f5 ~",
  C: "~@2 [e4,g4,d5]@3 ~@5 g5 ~ d5 ~ c5!2, g5@5 g5@2 g5@2 d5@2 g5@5, ~@6 d5@2 b4@4 ~ g4@2 ~", // Em7
  D: "g4 a4 c5 ~ d5 ~ g4 ~ c5@2 [g3,c4,e4,c5]@2 ~ c5 ~ g4, ~@3 c5@2 c5@2 g4@2 ~@5 c5@2", E: "a4 ~",
  F: "[~@12 [d4,g4]@11 ~@9]/2", G: "[a3,c4,g4]@7 ~ [g3,c4,g4]@7 ~", H: "[a3,c4,f4]@7 ~ [g3,c4,e4]@7 ~",
  I: "[g6@2 g6!2 g6@2 g6!2 g6@3 g5 e5 d5 c5@4 a5!3 a#5!3 a5@2 ~ a5!2 g5 f5 ~]/2",
  J: "g4 a4 c5 ~ d5 ~ g4 ~ c5@2 [g3,c4,e4,c5]@6, ~@3 c5@2 c5@2 g4@2 ~@7", K: "~@2 d3 e3@8 ~@5",
})).s("gm_acoustic_guitar_steel").gain(0.4).pan(0.3)

// drums · kick
const kick = s("bd").struct("<[x!4]!57 [x!3 ~] ~>").gain(0.64)

// drums · snare
const snare = s("sd").struct("<A ~@2 B C@16 A ~@2 B C@33 D ~>".pickRestart({
  A: "~@3 x", B: "~@2 x ~ x ~@2 x ~@8", C: "~ x ~ x", D: "~ x ~@2",
})).gain(0.4)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  [~@3 x ~@3 x ~@3 x ~@3 x]!18
  [~@3 x ~@3 x ~@8]
  ~@5
  [~@3 x ~@3 x ~@3 x ~@3 x]!7
  ~@28
>`).gain(0.16)

// drums · mid tom
const mid_tom = s("mt").struct("<~@19 A ~@19 A ~@7 A ~@7 A ~@3>".pickRestart({
  A: "~@14 x!2",
})).gain(0.32)

// drums · open hat
const open_hat = s("oh").struct("<[~ x ~@2]!58 ~>").gain(0.32)

// drums · crash
const crash = s("cr").struct(`<
  A ~ A B ~@8 A ~ A ~ A C A D A ~ A B ~@8 A ~ A ~ A C A D A ~ A ~ A C A E A ~ A ~ A C A D A D ~
>`.pickRestart({
  A: "x", B: "~ x", C: "~@2 x!2", D: "x!2", E: "x ~ x!2",
})).gain(0.24)

// drums · tambourine
const tambourine = s("tb").struct(`<
  [x!4]!4
  [x!2 ~ x]
  [~ x ~ x]!15
  [x!8]!28
  [x ~ x!3 ~ x!3 ~ x!3 ~ x!2]!9
  [x ~ x!3 ~ x!3 ~@7]
  ~
>`).gain(0.24)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<[~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2]!4 ~@16 [~@3 x ~@3 x ~@3 x ~@3 x]!28 ~@11>")
  .gain(0.16)

stack(
  bass, piano, string_ensemble_2, acoustic_guitar_steel, overdriven_guitar, acoustic_guitar_steel_2, kick, snare, hihat,
  hihat_soft, mid_tom, open_hat, crash, tambourine, tambourine_soft
)

More by Tom Astor