Strudelify

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: edit a riff to change every repeat.

// bass · slap bass 2 · "SLAP BASS"
const bass = note(`<
  ~ A@2 B C D E C F C G H I J@2 K D@3 L D@2 M C B N O P Q G N R S T U F V I W N@2 X U F Y Z W C H AA AB AC V AD AE V AF
  AB AA AC N AG AH F P Y@3 I Q Y AI AG AJ@4 AG AJ Y G O I@2 Y@3 U@4 H Y@2 AJ H Y U@2 Y@2 M AK C Y U@2 J Y AJ AL C Q S U
  J B AM AJ B O AN AO C J AP AQ B Y AR ~
>`.pickRestart({
  A: "a1@2 a2 ~ a1@2 a2 ~ a1@2 a2 ~ a1 ~ a2 ~", B: "e1@2 e2 ~ e1@2 e2 ~ e1@2 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: "e1@2 e2 ~ e1@2 e2 ~ e1 ~ e2 ~ e1@2 e2 ~",
  G: "e1 ~ e2 ~ e1 ~ e2 ~ e1@2 e2 ~ e1@2 e2 ~", H: "e1@2 e2 ~ e1 ~ e2 ~ e1 ~ e2 ~ e1 ~ e2 ~",
  I: "e1 ~ e2 ~ e1 ~ e2 ~ e1 ~ e2 ~ e1@2 e2 ~", J: "e1@2 e2 ~ e1 ~ e2 ~ e1 ~ e2 ~ e1@2 e2 ~",
  K: "b1@2 b2@2 b1@2 b2 ~ b1 ~ b2 ~ b1@2 b2 ~", L: "b1@2 b2 ~ b1 ~ b2 ~ b1@2 b2 ~ b1@2 b2 ~",
  M: "b1@2 b2 ~ b1 ~ b2 ~ b1@2 b2 ~ b1 ~ b2 ~", N: "e1@2 e2 ~ e1@2 e2 ~ e1 ~ e2 ~ e1 ~ e2 ~",
  O: "e1 ~ e2 ~ e1@2 e2 ~ e1@2 e2 ~ e1 ~ e2 ~", P: "e1 ~ e2 ~ e1 ~ e2 ~ e1@2 e2 ~ e1 ~ e2 ~",
  Q: "e1 ~ e2 ~ e1@2 e2 ~ e1 ~ e2 ~ e1 ~ e2 ~", R: "a1@2 a2 ~ a1@2 a2 ~ a1@2 a2 ~ a1@2 a2 ~",
  S: "a1@2 a2 ~ a1@2 a2 ~ a1 ~ a2 ~ a1@2 a2 ~", T: "a1 ~ a2 ~ a1 ~ a2 ~ a1 ~ a2 ~ a1@2 a2 ~",
  U: "a1 ~ a2 ~ a1 ~ a2 ~ a1 ~ a2 ~ a1 ~ a2 ~", V: "e1@2 e2 ~ e1 ~ e2 ~ e1@2 e2 ~ e1 ~ e2 ~",
  W: "b1@2 b2 ~ b1@2 b2 ~ b1@2 b2 ~ b1 ~ b2 ~", X: "a1@2 a2 ~ a1 ~ a2 ~ a1 ~ a2 ~ a1 ~ a2 ~",
  Y: "e1 ~ e2 ~ e1 ~ e2 ~ e1 ~ e2 ~ e1 ~ e2 ~", Z: "b1@2 b2 ~ b1 ~ b2 ~ b1 ~ b2 ~ b1@2 b2 ~",
  AA: "a1@2 a2 ~ a1@2 a2 ~ a1 ~ a2 ~ a1 ~ a2 ~", AB: "a1@2 a2 ~ a1 ~ a2 ~ a1@2 a2 ~ a1 ~ a2 ~",
  AC: "e1@2 e2@2 e1@2 e2 ~ e1@2 e2 ~ e1@2 e2 ~", AD: "b1 ~ b2 ~ b1 ~ b2 ~ b1 ~ b2@2 b1@2 b2 ~",
  AE: "a1@2 a2 ~ a1 ~ a2 ~ b1@2 b2@2 b1 ~ b2 ~", AF: "e1@2 e2 ~ e1@2 e2 ~ e1 ~ e2@2 e1 ~ e2 ~",
  AG: "b1@2 b2 ~ b1 ~ b2 ~ b1 ~ b2 ~ b1 ~ b2 ~", AH: "a1@2 a2 ~ a1@2 a2 ~ b1 ~ b2 ~ b1 ~ b2 ~",
  AI: "b1 ~ b2 ~ b1 ~ b2 ~ b1 ~ b2 ~ b1@2 b2 ~", AJ: "b1 ~ b2 ~ b1 ~ b2 ~ b1 ~ b2 ~ b1 ~ b2 ~",
  AK: "b1 ~ b2 ~ b1 ~ b2 ~ b1@2 b2 ~ b1 ~ b2 ~", AL: "a1@2 a2 ~ a1 ~ a2 ~ b1@2 b2 ~ b1 ~ b2 ~",
  AM: "b1 ~ b2 ~ b1 ~ b2 ~ b1@2 b2 ~ b1@2 b2 ~", AN: "a1 ~ a2 ~ a1@2 a2 ~ a1@2 a2 ~ a1 ~ a2 ~",
  AO: "a1 ~ a2 ~ a1@2 a2 ~ a1 ~ a2 ~ a1 ~ a2 ~", AP: "b1@2 b2 ~ b1@2 b2 ~ b1 ~ b2 ~ b1@2 b2 ~",
  AQ: "a1 ~ a2 ~ a1 ~ a2 ~ b1 ~ b2 ~ b1 ~ b2 ~", AR: "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 K@2 L@5 M N@8 O@8 N@8 E@4 P@3 Q@3 R@2 S@8 T@3 U@5 V@6 R@2 W@3 X Y@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: "[[b3,e4,g#4]@15 ~]/2", L: "[c#5@31 g#4@32 ~ [d#4,f#4]@16, e4@31 ~@9, a4@30 ~ b4@48 ~]/5",
  M: "[c#4,e4,a4] [d#4,f#4,b4]", N: "[[b3,e4,g#4]@127 ~]/8", O: "[[b3,d#4,f#4,a4]@127 ~]/8", P: "[[b3,e4,g#4]@47 ~]/3",
  Q: "[[f#4,a4]@15 ~ e4@30 ~@2, [b3,d#4]@14 ~ [b3,g#4]@31 ~@2]/3", R: "[[e4,a4,c#5]@31 ~]/2",
  S: "[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
  T: "[[e4,g#4,b4]@15 ~ f#4@7 ~, ~@31 [d#4,b4]@16 ~]/3", // E G#m
  U: "[[c#4,e4,a4]@8 f#4@8 g#4@31 ~ a4@31 e4, ~@4 b4@19 ~@17, ~@8 d#4@6 ~@2 e4@29 ~@2 [e4,c#5]@31 ~@2]/5", // A C#m
  V: "[g#4@31 ~ f#4@32 [e4,g#4]@30 ~@2, b4@95 ~, ~@31 d#4@31 ~@34]/6", W: "[[e4,g#4,b4]@31 [d#4,f#4,b4]@15 ~@2]/3",
  X: "[c#4,e4,a4]@7 ~ d#4@7 ~, ~@7 [f#4,b4]@7 ~@2", Y: "[~@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 Q@2 R@2 S T@2 ~@7 U@2 ~@6 V@2 ~@5 W X@2 ~@5 Y Z AA@2
  ~@4 Y Z P ~@5 AB AC AD@2 ~@4 Y AE P ~@6 AF@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: "[[c#5,e5]@5 ~ [c#5,e5]@2 [b4,d#5]@4 [a4,c#5]@2 [a4,c#5]@4 [g#4,b4]@9 ~ [g#4,b4]@3 ~]/2", // C#m B A G#m
  R: "[[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
  S: "[a4,c#5]@5 ~ [a4,c#5]@2 [g#4,b4]@4 [f#4,a4]@4", T: "[[e4,g#4]@13 ~@3]/2", U: "[d#5 c#5 b4 b5@6 ~@7]/2",
  V: "[g#5 f#5 e5 b5@7 ~@6]/2", W: "~@7 d5", X: "[c#5 a4 e4 d4 c#4@5 ~@7]/2",
  Y: "e4 ~ e4@4 f#4@2 [e4,g#4] ~ [e4,g#4]@4 [f#4,a4]@2", // E F#m
  Z: "[g#4,b4] ~ [g#4,b4]@3 ~ [a4,c#5]@2 [b4,d5]@2 [a4,c#5]@2 [g#4,b4]@4", AA: "[[a4,c#5]@21 ~@11]/2",
  AB: "e4 ~ e4@4 f#4 ~ [e4,g#4] ~ [e4,g#4]@4 [f#4,a4]@2", // E F#m
  AC: "[g#4,b4] ~ [g#4,b4]@2 ~@2 [a4,c#5]@2 [b4,d5]@2 [a4,c#5] ~ [g#4,b4]@3 ~", AD: "[[a4,c#5]@19 ~@13]/2",
  AE: "[g#4,b4] ~ [g#4,b4]@3 ~ [a4,c#5]@2 [b4,d5]@2 [a4,c#5]@2 [g#4,b4]@3 ~", AF: "[~@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@2 C@2 A@3 D A@2 E B F A D@2 A@2 B C A@2 G H A@2 B C A@2 G I F A F A@5 D@2 J D@5 A@8 B C K C A L A D A@2 C@2
  A@2 D@2 A@2 B M A@2 G N A@2 M@2 A@2 D O A@2 B@2 A@2 D N A@2 P ~
>`.pickRestart({
  A: "g#5 e5 b4 a5 g#5 e5 b4 e5", B: "a5 e5 c#5 b5 a5 e5 c#5 e5", C: "a5@2 e5@2 c#5 ~ b5@2 a5@2 e5@2 c#5@2 e5@2",
  D: "f#5 d#5 b4 g#5 f#5 d#5 b4 d#5", E: "a5@2 e5@2 c#5@2 b5@2 a5 ~ e5@2 c#5@2 e5@2",
  F: "g#5 ~ e5@2 b4@2 a5@2 g#5@2 e5@2 b4@2 e5@2", G: "f#5@2 d#5@2 b4@2 g#5@2 f#5@2 d#5@2 b4@2 d#5 ~",
  H: "e5@2 c#5@2 a4@2 c#5 ~ f#5@2 d#5@2 b4@2 d#5@2", I: "e5@2 c#5@2 a4@2 c#5 ~ f#5 ~ d#5 ~ b4@2 d#5 ~",
  J: "f#5@2 d#5@2 b4@2 g#5@2 f#5@2 d#5@2 b4 ~ d#5@2", K: "a5@2 e5@2 c#5 ~ b5 ~ a5@2 e5@2 c#5@2 e5@2",
  L: "g#5@2 e5@2 ~@2 a5 ~ g#5@2 e5@2 b4@2 e5@2, ~ b4 ~@2", M: "a5@2 e5@2 c#5@2 b5 ~ a5@2 e5@2 c#5@2 e5@2",
  N: "e5 c#5 a4 c#5 f#5 d#5 b4 d#5", O: "f#5@2 d#5@2 b4@2 d#5@2 f#5@2 d#5@2 b4@2 d#5 ~", P: "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
)