Strudelify
Der Sommer, als Jenny sich verliebte cover art

2008

Der Sommer, als Jenny sich verliebte

Daniel

KeyE majorTempo128 bpm
0:00/0:00
// Der Sommer, als Jenny sich verliebte — Daniel
// 128 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 5 "CLEAN GTR" electric guitar clean (copy of ch 4 "OVERDRIVE" overdriven guitar)
// note: Full arrangement: all 131 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(128/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, A@4 for four bars: edit a riff to change every repeat.

// bass · slap bass 2 · "SLAP BASS"
const bass = note(`<
  ~ A@2 B C D E C B@2 C B@4 D@7 F C B@7 G@4 B@3 F B@2 G@2 B@2 F@2 B@2 G@2 B@2 F H B@2 G@2 C B F E B@8 F@8 B@8 G@4 B@3 F
  B@2 G@2 B@2 F@2 B@2 G@2 B@2 F I B@2 G@2 B@2 F@2 B@2 A G C B F I B@2 J ~
>`.pickRestart({
  A: "a1@2 a2 ~ a1@2 a2 ~ a1@2 a2 ~ a1 ~ a2 ~", B: "e1 ~ e2 ~ e1 ~ e2 ~ e1 ~ e2 ~ e1 ~ e2 ~",
  C: "e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~", D: "b1@2 b2 ~ b1@2 b2 ~ b1@2 b2 ~ b1@2 b2 ~",
  E: "a1@2 a2 ~ a1@2 a2 ~ b1@2 b2 ~ b1@2 b2 ~", F: "b1 ~ b2 ~ b1 ~ b2 ~ b1 ~ b2 ~ b1 ~ b2 ~",
  G: "a1 ~ a2 ~ a1 ~ a2 ~ a1 ~ a2 ~ a1 ~ a2 ~", H: "a1@2 a2 ~ a1 ~ a2 ~ b1@2 b2@2 b1 ~ b2 ~",
  I: "a1@2 a2 ~ a1@2 a2 ~ b1 ~ b2 ~ b1 ~ b2 ~", J: "e1",
})).s("gm_slap_bass_2").gain(0.5)

// chords · pad warm · "WARM PAD"
const pad_warm = note(`<
  A@6 B@8 ~ C@8 D@8 E@4 F@4 G@2 H@8 I@5 J G@2 K@5 J L@8 M@8 L@8 E@4 N@3 O@3 P@2 Q@8 R@3 S@5 T@6 P@2 U@3 V W@4
>`.pickRestart({
  A: "[~@16 [a4,c#5]@31 ~ g#4@31 [d#4,f#4]@16 [c#4,e4,a4], ~@2 e4@11 ~@3, ~@47 b4@48 ~]/6", // A D#m A
  B: "[~@4 [d#4,b4]@3 ~ [b3,e4]@56, ~@8 f#4@7 g#4@113]/8", C: "[[d#4,f#4,a4]@127 ~]/8", D: "[[e4,g#4]@127 ~]/8",
  E: "[[c#4,e4,a4]@63 ~]/4", F: "[g#4@48 [d#4,f#4]@15 ~, b3@63 ~, e4@23 ~@9]/4", G: "[[b3,e4,g#4]@29 ~@3]/2",
  H: "[[a4,c#5]@32 g#4@31 ~ d#4@31 [e4,g#4]@32 ~, e4@62 ~ f#4@32 ~@33, ~ b4@3]/8", // A E
  I: "[[a4,c#5]@32 g#4@32 [d#4,f#4]@15 ~, e4@31 ~@9, ~@32 b4@47 ~]/5", J: "[c#4,e4,a4]@7 ~ [d#4,b4]@7 ~, ~@7 f#4@8 ~",
  K: "[[a4,c#5]@31 g#4@32 ~ [d#4,f#4]@15 ~, e4@31 ~@9, ~@31 b4@48 ~]/5", L: "[[b3,e4,g#4]@127 ~]/8",
  M: "[[b3,d#4,f#4,a4]@127 ~]/8", N: "[[b3,e4,g#4]@47 ~]/3",
  O: "[[f#4,a4]@15 ~ e4@30 ~@2, [b3,d#4]@14 ~ [b3,g#4]@31 ~@2]/3", P: "[[e4,a4,c#5]@31 ~]/2",
  Q: "[g#4@32 f#4@32 [e4,g#4]@30 ~ [e4,a4,c#5]@32 ~, b4@95 ~@33, e4@15 ~ d#4@15 ~@33]/8", // E A
  R: "[[e4,g#4,b4]@15 ~ f#4@7 ~, ~@31 [d#4,b4]@16 ~]/3", // E G#m
  S: "[[c#4,e4,a4]@8 f#4@8 [e4,g#4]@30 ~@2 a4@31 e4, ~@4 b4@19 ~@17, ~@8 d#4@6 ~@33 [e4,c#5]@31 ~@2]/5", // A E C#m
  T: "[g#4@31 ~ f#4@32 [e4,g#4]@30 ~@2, b4, ~@31 d#4@31 ~@34]/6", U: "[[e4,g#4,b4]@30 ~ [d#4,f#4,b4]@15 ~@2]/3",
  V: "[c#4,e4,a4]@7 ~ d#4@7 ~, ~@7 [f#4,b4]@7 ~@2", W: "[~@32 e5@17 ~@15, [e4,g#4,b4]@49 ~@15]/4",
})).s("gm_pad_warm").gain(0.4)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  A B C D E F G H@2 ~@7 I ~@7 J ~@7 K ~@6 L M N ~@5 L O P ~@6 A B C D Q@2 R S@2 ~@7 T@2 ~@6 U@2 ~@5 V W@2 ~@5 X Y Z@2
  ~@4 X Y P ~@5 AA AB AC@2 ~@4 X AD P ~@6 AE@2 ~
>`.pickRestart({
  A: "~@3 e4", B: "[a4,c#5] ~ [a4,c#5]@9 ~ [b4,d#5]@4", C: "[c#5,e5]@5 ~ [c#5,e5]@2 [b4,d#5]@4 [a4,c#5]@2 [a4,c#5]@2",
  D: "~@2 [g#4,b4]@9 ~ [g#4,b4]@3 ~", E: "[b4,e5]@5 ~ [b4,e5] ~ [b4,d#5]@3 ~ [e4,g#4]@2 [g#4,b4]@2",
  F: "~@2 [f#4,a4]@9 ~ [f#4,a4]@2 [g#4,b4]@2", G: "[a4,c#5]@5 ~ [a4,c#5]@2 [g#4,b4]@4 [f#4,a4]@3 ~",
  H: "[[e4,g#4]@7 ~]/2", I: "d#5 c#5 b4 b5@5, ~@6 a5 ~@9", J: "g#5 f#5 e5 b5@5", K: "d5 c#5 a4 b4@2 a4@3",
  L: "e4@3 f#4 [e4,g#4]@3 [f#4,a4]", M: "[g#4,b4]@5 ~ [a4,c#5]@2 [b4,d5]@8, a4 ~@15", N: "[a4,c#5]@13 ~@3",
  O: "[g#4,b4]@5 ~ [a4,c#5]@2 [b4,d5]@2 [a4,c#5]@2 [g#4,b4]@3 ~, ~@12 a#4 ~@3", P: "[a4,c#5]",
  Q: "[[b4,e5]@5 ~ [b4,e5]@2 [b4,d#5]@4 [e4,g#4]@2 [g#4,b4]@4 [f#4,a4]@9 ~ [f#4,a4]@2 [g#4,b4]@2]/2", // E5 B E G#m F#m G#m
  R: "[a4,c#5]@5 ~ [a4,c#5]@2 [g#4,b4]@4 [f#4,a4]@4", S: "[[e4,g#4]@13 ~@3]/2", T: "[d#5 c#5 b4 b5@6 ~@7]/2",
  U: "[g#5 f#5 e5 b5@7 ~@6]/2", V: "~@7 d5", W: "[c#5 a4 e4 d4 c#4@5 ~@7]/2",
  X: "e4 ~ e4@4 f#4@2 [e4,g#4] ~ [e4,g#4]@4 [f#4,a4]@2", // E F#m
  Y: "[g#4,b4] ~ [g#4,b4]@3 ~ [a4,c#5]@2 [b4,d5]@2 [a4,c#5]@2 [g#4,b4]@4", Z: "[[a4,c#5]@21 ~@11]/2",
  AA: "e4 ~ e4@4 f#4 ~ [e4,g#4] ~ [e4,g#4]@4 [f#4,a4]@2", // E F#m
  AB: "[g#4,b4] ~ [g#4,b4]@2 ~@2 [a4,c#5]@2 [b4,d5]@2 [a4,c#5] ~ [g#4,b4]@3 ~", AC: "[[a4,c#5]@19 ~@13]/2",
  AD: "[g#4,b4] ~ [g#4,b4]@3 ~ [a4,c#5]@2 [b4,d5]@2 [a4,c#5]@2 [g#4,b4]@3 ~", AE: "[~@8 g#5@2 f#5@2 e5@2 b5@7 ~@11]/2",
})).s("gm_overdriven_guitar").gain(0.35).pan(0.3)

// chords · pizzicato strings · "PIZZICATO"
const pizzicato_strings = note(`<
  ~ A@2 B@2 C D B@8 C@8 B@8 A@4 B@3 C B E A@2 B@2 C@2 F B A@2 B@2 G D B@2 A@2 B@2 C H B@8 C@8 B@8 A@4 B@3 C B@2 A@2 B@2
  C@2 B@2 A@2 B@2 C D B@2 A@2 B@2 C@2 B@2 A@2 B@2 I D B@2 ~@2
>`.pickRestart({
  A: "~@2 [a4,c#5,e5] ~ [a4,c#5,e5] ~ [a4,c#5,e5] ~@3 [a4,c#5,e5] ~ [a4,c#5,e5] ~ [a4,c#5,e5] ~", // A
  B: "~@2 [g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~@3 [g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~", // E
  C: "~@2 [a4,b4,d#5] ~ [a4,b4,d#5] ~ [a4,b4,d#5] ~@3 [a4,b4,d#5] ~ [a4,b4,d#5] ~ [a4,b4,d#5] ~", // B7
  D: "~@2 [a4,c#5,e5] ~ [a4,c#5,e5] ~ [a4,c#5,e5] ~@3 [a4,b4,d#5] ~ [a4,b4,d#5] ~ [a4,b4,d#5] ~", // A B7
  E: "~@2 [g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~@3 [g#4,b4,e5] ~@3 [g#4,b4,e5] ~", // E
  F: "~@2 [g#4,b4,e5] ~ [g#4,b4,e5] ~ [g#4,b4,e5] ~@3 [g#4,b4,e5] ~ [g#4,b4] ~ [g#4,b4,e5] ~", // E G#m E
  G: "~@2 [f#4,b4,d#5] ~ [f#4,b4,d#5] ~ [f#4,b4,d#5] ~@3 [f#4,b4,d#5] ~ [f#4,b4,d#5] ~ [f#4,b4,d#5] ~", // B
  H: "~@2 [a4,c#5,e5] ~ [a4,c#5,e5] ~ [a4,c#5,e5] ~@3 [f#4,b4,d#5] ~ [f#4,b4,d#5] ~ [f#4,b4,d#5] ~", // A B
  I: "~@2 [b4,d#5] ~ [f#4,b4,d#5] ~ [f#4,b4,d#5] ~@3 [f#4,b4,d#5] ~ [f#4,b4,d#5] ~ [f#4,b4,d#5] ~", // B
})).s("gm_pizzicato_strings").gain(0.3).pan(0.1)

// other · pizzicato strings · "PIZZICATO"
const pizzicato_strings_2 = note(`<
  ~ A@2 B@2 C D B@2 ~@32 A@2 B@2 C@2 B@2 A@2 B@2 C E B@2 A@2 B@2 C F B@2 ~@32 A@2 B@2 C@2 B G A@2 B@2 C H B@2 A@2 B I
  C@2 B J K A B@2 C D B@2 L ~
>`.pickRestart({
  A: "a4!2 e4!2 c#4!2 b4!2 a4!2 e4!2 c#4!2 e4!2", B: "g#4!2 e4!2 b3!2 a4!2 g#4!2 e4!2 b3!2 e4!2",
  C: "f#4!2 d#4!2 b3!2 g#4!2 f#4!2 d#4!2 b3!2 d#4!2", D: "e4!2 c#4!2 a3!2 c#4!2 f#4!2 d#4!2 b3!2 d#4!2",
  E: "a3!2 c#4!2 e4!2 c#4 a3 b3!2 d#4!2 f#4!2 d#4!2", F: "a3!2 c#4!2 e4!2 c#4!2 b3!2 d#4!2 f#4!2 d#4!2",
  G: "g#4!2 e4!2 b3!2 a4!2 g#4!2 e4!2 b3!2 [e4,f#4] e4", H: "a3!2 c#4!2 e4!2 f#4 e4 b3!2 d#4!2 f#4!2 g#4 f#4",
  I: "g#4!2 e4!2 b3!2 a4!2 g#4!3 e4 b3!2 e4!2", J: "g#4!2 e4!2 b3!2 e4!2 g#4!2 e4!2 b3!2 e4!2",
  K: "a4!2 e4!2 c#4!2 a4 b4 a4!2 e4!2 c#4!2 e4!2", L: "g#4 ~@15",
})).s("gm_pizzicato_strings").gain(0.3).pan(0.9)

// other · vibraphone
const vibraphone = note(`<
  ~@25 A@6 B@4 A@3 C A@2 B@2 A@2 C@2 A@2 B D A@2 C E A@2 B@2 A@2 C F A@8 C@8 A@8 B D@3 A@3 C A@2 B@2 A@2 C@2 A@2 B@2 A@2
  C E A@2 B@2 A@2 C G A@2 B@2 A@2 C E A@2 H ~
>`.pickRestart({
  A: "g#5 e5 b4 a5 g#5 e5 b4 e5", B: "a5 e5 c#5 b5 a5 e5 c#5 e5", C: "f#5 d#5 b4 g#5 f#5 d#5 b4 d#5",
  D: "a5@2 e5@2 c#5 ~ b5@2 a5@2 e5@2 c#5@2 e5@2", E: "e5 c#5 a4 c#5 f#5 d#5 b4 d#5",
  F: "e5@2 c#5@2 a4@2 c#5 ~ f#5 ~ d#5 ~ b4@2 d#5 ~", G: "f#5@2 d#5@2 b4@2 d#5@2 f#5@2 d#5@2 b4@2 d#5 ~", H: "g#5 ~@3",
})).s("gm_vibraphone").gain(0.3).pan(0.8)

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

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

// drums · low tom
const low_tom = s("lt").struct("<A ~@39 B ~@7 A ~@7 C ~@7 A ~@31 B ~@7 D ~@7 B ~@7 E ~@7 A ~@2>".pickRestart({
  A: "~@15 x", B: "~@14 x!2", C: "~@7 x", D: "~@12 x!3 ~", E: "~@12 x!4",
})).gain(0.72)

// drums · hihat
const hihat = s("hh").struct("<~ [x!8]!128 x ~>").gain(0.72)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 A ~@31 B ~@7 C ~@7 B ~@39 B ~@7 D ~@7 E ~@7 D ~@10>".pickRestart({
  A: "~@15 x", B: "~@3 x", C: "~@7 x", D: "~@4 x!2 ~@2", E: "~@5 x!2 ~",
})).gain(0.72)

// drums · high tom
const high_tom = s("ht").struct("<A ~@7 A ~@31 B ~@7 C ~@7 D ~@7 A ~@31 B ~@7 E ~@7 F ~@7 E ~@7 A ~@2>".pickRestart({
  A: "~@7 x", B: "~@8 x!3 ~@5", C: "~@5 x!2 ~", D: "~@5 x ~@2", E: "~@2 x!3 ~ x ~@9", F: "~ x ~ x!2 ~@3",
})).gain(0.72)

// drums · crash
const crash = s("cr").struct("<~ A ~@7 A ~@31 A ~@7 A ~@7 A ~@7 A ~@31 A ~@7 A ~@7 A ~@7 A ~@7 A ~>".pickRestart({
  A: "x",
})).gain(0.72)

stack(
  bass, pad_warm, overdriven_guitar, pizzicato_strings, pizzicato_strings_2, vibraphone, kick, snare, low_tom, hihat,
  mid_tom, high_tom, crash
)