Strudelify

Capelli

Fabi

KeyG majorTempo88 bpm
0:00/0:00
// Capelli — Fabi
// 88 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 90 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(88/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.

// chords · piano
const piano = note(`<
  ~@23 A B C B C D C D C ~@7 A B C B C B C B C B C B C B C B C ~@2 E F ~ G ~@2 B C B C B C B C B C B C B C B C B C B C B
  C B C H@2
>`.pickRestart({
  A: "[a3,d4,f#4]@2 [a3,d4,f#4]!5 [a3,d4,g4]", B: "[b3,e4,g4]@3 [a3,d4,f#4]@2 ~ [g3,c4,e4]@10",
  C: "[a3,d4,f#4]@3 [a3,d4,f#4]@3 [b3,d4,g4]@10", D: "[b3,d4,g4]@3 [a3,d4,f#4]@2 ~ [g3,c4,e4]@10", E: "~@10 b3@3 b4@3",
  F: "[b3,c#4,e4]@9 ~@7", G: "~ [b3,e4]", H: "[[g3,b3,d4]@7 ~]/2",
})).s("gm_piano").gain(0.45).pan(0.7)

// bass · fretless bass
const bass = note(`<
  ~@23 A B C B D B C B D ~@7 A B C B D B C B D B C B D B C B E F G H I F J K L B C B D B C B E B C B D B C B E B C B D B
  C B E M@2
>`.pickRestart({
  A: "~@6 b1 d2", B: "e2@6 c2@9 ~", C: "d2@2 ~ d2@2 ~ g1@6 f#1@4", D: "d2@2 ~ d2@2 ~ g2@6 b1@2 d2@2",
  E: "d2@2 ~ d2@2 ~ g2@10", F: "a1@6 ~ e1 g1 e1 a1@4 b1 d2", G: "e2@6 ~ d2 ~ d2 e2@6", H: "a1@6 ~ e1 g1 e1 a1@6",
  I: "c#2@10 d2@3 e2@3", J: "e2@3 d2 c#2@3 c#2", K: "c2@7 b1 c2 b1 c2@4 c2@2", L: "d2 c2 b1 a1", M: "[g1@7 ~]/2",
})).s("gm_fretless_bass").gain(0.54)

// other · clarinet
const clarinet = note(`<
  ~@8 A B C D E F G H I J K L M N@2 O P@2 Q@2 P@2 R@2 S T U V W X Y Z AA@2 AB@2 AA@4 ~ AC@2 AD@4 ~ AE AF AG AH AI AJ AK
  AL@2 AM@6 AN AO AP AQ AR AS AT AU AV ~@10
>`.pickRestart({
  A: "b4@3 b4@2 a4@2 g4 a4@3 a4@2 d4!3", B: "b4!3 b4@2 a4@2 g4 g4@3 g4 ~ d4 ~ d4",
  C: "b4 b4@2 b4@2 a4@2 g4 a4@3 d4@2 ~ d4!2", D: "a4@2 g4 a4@2 g4 a4 g4 b4 b4@2 a4@2 g4@2 ~",
  E: "g4@3 g4@2 g4@2 e4 g4@3 g4@2 d4!3", F: "a4!2 ~ g4 a4 g4 a4 g4 b4!2 a4 g4 a4@2 g4 ~",
  G: "g4@4 ~ e4 g4 e4 g4!2 ~ e4 b4@2 a4@2", H: "b4@2 a4 g4 a4 ~ d4!2 b4!2 a4 g4 a4@2 ~ d4",
  I: "b4!2 ~ b4!2 a4 g4@2 a4@3 d4 ~ d4!3", J: "a4!2 ~ a4@2 g4 a4 g4 b4!5 a4@2 g4", K: "g4@3 d4@2 ~@4 a4 ~ a4 ~ a4 ~ a4",
  L: "~ a4 ~ a4 ~ a4!2 g4 b4 ~ g4 ~@3 g4!2", M: "b4!2 a4 g4 a4@2 a4 g4 b4!2 a4 g4 a4!3 g4",
  N: "[b4!2 a4 g4 g4@2 g4 d4 b4 b4@2 a4@2 g4@2 g4@2 g4@2 ~@6 b4@2 a4@2 g4 ~ b4]/2",
  O: "~ a4 g4 a4@2 d4!3 b4 a4 g4 a4@2 ~@2 d4", P: "[g4!2 ~@2 g4!2 ~ g4!3 ~ g4 b4@2 c5 b4@2 g4@2 ~@7 b4@2 a4@3 ~]/2",
  Q: "[g4!2 ~@2 g4!2 ~ g4!3 ~ g4 b4@2 c5 d5@2 g4@2 ~@7 b4@2 a4@2 g4@2]/2",
  R: "[g4!2 ~@2 g4!2 ~ g4!3 ~ g4 b4@2 c5 b4@2 g4@2 ~@12 d4]/2", S: "g4!2 f#4 g4@2 g4@2 f#4 g4!2 f#4 g4@2 g4!3",
  T: "a4!5 g4 a4 g4 b4 b4@2 a4@2 g4 a4 g4", U: "g4!2 ~ g4!2 g4@2 ~ g4!3 g4@2 g4!3",
  V: "a4!3 a4@2 g4 a4 g4 d5!2 ~ b4@2 b4 ~@2", W: "d5!2 ~@2 d5!4 ~ d5 b4 d5 ~ d5 b4!2",
  X: "d5!2 ~ b4 d5!2 ~ b4 b4@2 ~ b4@2 ~ a4 g4", Y: "b4 b4@2 g4@2 ~ g4@2 ~@2 b4@2 a4@2 ~ g4",
  Z: "a4!3 ~ a4 ~ a4@2 b4@3 ~ a4@3 e4", AA: "[g4!2 ~@2 g4!2 ~ g4!3 ~ g4 b4@2 c5 b4@2 g4@2 ~@7 b4@2 a4@2 g4@2]/2",
  AB: "[g4!2 ~@2 g4!2 ~ g4!3 ~ g4 b4@2 c5 d5@2 g4@2 ~@3 b4@2 a4@4 ~@4]/2", AC: "[~@10 b4@2 a4@2 g4@5 ~@13]/2",
  AD: "[~@5 b4 a4 g4@3 ~@6]/2", AE: "b4@2 ~ b4@2 a4@2 g4 a4@2 b4@2 ~@2 e4!2",
  AF: "b4!3 b4@2 a4@2 g4 a4@2 g4@2 ~@2 e4!2", AG: "b4!2 ~ b4 ~ a4 ~ g4 a4 ~ b4@2 ~@2 e4!2",
  AH: "b4 b4@2 a4@2 g4!2 e4 g4 g4@2 g4@2 a4@2 ~", AI: "a4@3 a4@2 a4@2 g4 a4@3 a4@2 e4!3",
  AJ: "b4!2 ~ b4!3 a4 g4 b4!2 a4 g4 b4@2 a4 ~", AK: "a4@4 ~ g4 a4 g4 a4 a4@2 g4 a4@2 g4@2",
  AL: "[b4@2 a4 g4 a4@2 d4!2 b4!2 ~ a4@2 a4@2 g4@11 ~@6]/2", AM: "[~@6 d4!2 b4!2 ~ a4 ~ a4@2 g4@10 ~@7]/2",
  AN: "~@6 d5@8 ~ b4", AO: "d5 b4 d5 b4 d5@2 d5 d5@2 b4 d5 b4 d5@2 d5 b4", AP: "d5 b4 d5 b4 d5!2 ~ d5!4 b4 d5 d5@2 ~",
  AQ: "c5@2 b4@3 g4@5 d5 ~ d5 ~ b4@2", AR: "d5 ~ d5!4 b4 d5 ~ d5@2 b4 d5!2 b4 d5",
  AS: "~ d5@2 ~ d5!2 ~ d5 ~ d5 d5@2 ~ b4 c5 b4", AT: "d5 d5@2 d5!3 ~ d5!2 d5@2 d5!2 c5@2 b4",
  AU: "d5@2 g4@2 ~ d5 ~ d5!2 c5 ~ b4 d5@2 g4 b4", AV: "d5!2 b4 d5 ~ d5 ~ b4 d5!3 d5@2 d5@2 ~",
})).s("gm_clarinet").gain(0.54)

// other · lead 1 square
const lead_1_square = note("<A@2 B@2 A@2 C D E F G H G H G ~ I J I K L J M N ~@8 I J I K L J M N ~@50>".pickRestart({
  A: "[d4@3 g3@12 ~]/2", B: "[d4@3 ~@5 c#4@2 a#3 b3@4 ~, ~@3 g3@12 ~]/2", C: "d4@3 g3@5", D: "c4@3 b3@3 g3@2 d3@7 ~",
  E: "b2@5 ~ c3@6 ~@4", F: "f#3@5 ~ g3@6 ~@4", G: "b2@5 ~ c3@7 ~@3", H: "f#3@5 ~ g3@7 ~@3", I: "b2@6 c3@9 ~",
  J: "f#2@6 g2@9 ~", K: "d3@6 g2@9 ~", L: "b2@3 c3@4 ~", M: "e2@6 c3@9 ~", N: "d3@3 ~",
})).s("gm_lead_1_square").gain(0.42).pan(0.4)

// chords · overdriven guitar
const overdriven_guitar = note("<~@48 A@4 B@4 ~@6 C@2 A@4 D@16 E@4 F@2>".pickRestart({
  A: "[~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~@3 [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [b3,b4]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [b3,b4]@2 [c4,g4,c5]@2, g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@2 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 ~@2, ~@31 [d4,d5]@2 ~@31]/4", // D C B C B C5 D
  B: "[~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~@3 [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [b3,b4]@6 [a3,a#3,f4,f#4,a4,a#4] [g3,g#3,d#4,e4,g4,g#4] [f3,f#3,c#4,d4,f4,f#4] [d#3,e3,b3,c4,d#4,e4], g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@2 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@7 ~@4, ~@31 [d4,d5]@2 ~@31]/4", // D B C B F#maj7 Emaj7 Dmaj7 Cmaj7 …
  C: "[f#5@3 [b4,f#5]@13]/2", // B5
  D: "[~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~@3 [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~@3 [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~@3 [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [b3,b4]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [b3,b4]@2 [c4,g4,c5]@2, g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@2 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@2 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@2 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 ~@2, ~@31 [d4,d5]@2 ~@30 [b3,b4]@2 ~@30 [d4,d5]@2 ~@31]/8", // D B C B D C B C …
  E: "[~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [d4,d5]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~@3 [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [c4,c5]@2 ~ [b3,b4]@2 ~ [b3,b4]@2 ~@3 g4@2, g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@2 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 g4@3 ~@2, ~@31 [d4,d5]@2 ~@27 [b3,b4]@4]/4", // D B C B D B
  F: "[[g3,d4,g4]@7 ~]/2", // G5
})).s("gm_overdriven_guitar").gain(0.23)

// chords · pad poly
const pad_poly = note("<A@8 ~@82>".pickRestart({
  A: "[g3,d4,g4]/8", // G5
})).s("gm_pad_poly").gain(0.01)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A B A B A B A B A B A B A B A ~ A B A B A B C D E F E F E F E G A B A B A B C D E F E F E F E F E F E F E F E G H I H
  J H K H L E F E F E F E G E F E F E F E G E F E F E F E G M@2
>`.pickRestart({
  A: "[d4,g4] [d4,g4]@2 [d4,g4,b4] ~@2 [d4,e4,a4]@3 [d4,e4,a4] [d4,e4,a4]@2 [d4,e4,a4]!3 ~, b4@3 ~@13", // G5 G Dsus2
  B: "[a3,d4] [a3,d4]@2 [a3,d4,f#4] ~@2 [b3,d4,g4]@3 [b3,d4,g4] [b3,d4,g4]@2 [b3,d4,g4,a4]!3 ~, f#4@3 ~@3 a4@6 ~@4", // D5 D G
  C: "[b3,e4] [b3,e4]@2 [b3,e4,g4] ~@2 [c4,e4,g4]@3 [c4,e4,g4] [c4,e4,g4]@2 [c4,e4,g4]!3 ~, g4@3 ~@13", // E5 Em C
  D: "[a3,d4] [a3,d4]@2 [a3,d4,f#4] ~@2 [a3,d4,f#4]@3 [a3,d4,f#4] [a3,d4,f#4]@2 [a3,d4,f#4]!3 ~, f#4@3 ~@13", // D5 D
  E: "[b3,e4] [b3,e4]@2 [b3,e4,g4]@3 [c4,e4,g4]@3 [c4,e4,g4] [c4,e4,g4]@2 [c4,e4,g4]!2 [c4,e4,g4]@2, g4@3 ~@13", // E5 Em C
  F: "[a3,d4] [a3,d4]@2 [a3,d4,f#4]@3 [d4,g4,b4]@3 [d4,g4,b4] [b3,d4,g4,b4]@2 [b3,d4,g4,b4]!2 [b3,d4,g4,b4]@2, f#4@3 ~@13", // D5 D G
  G: "[a3,d4] [a3,d4]@2 [a3,d4,f#4]@3 [b3,d4,g4]@3 [b3,d4,g4] [b3,d4,g4]@2 [b3,d4,g4]!2 [b3,d4,g4]@2, f#4@3 ~@13", // D5 D G
  H: "[c4,e4] [c4,e4]@2 [c4,e4,g4] ~@2 [c4,e4,g4]@3 [c4,e4,g4] [c4,e4,g4]@2 [c4,e4,g4]!2 [c4,e4,g4]@2, g4@3 ~@13", // C
  I: "[b3,d4] [b3,d4]@2 [b3,d4,f#4] ~@2 [b3,d4,f#4]@3 [b3,d4,f#4] [b3,d4,f#4]@2 [b3,d4,f#4]!3 ~, f#4@3 ~@13", // Bm
  J: "[b3,c#4,e4]@10 [a3,b3,d4]@2 ~ [a3,b3,e4]@2 ~", // C#m7 Bm7 Asus2
  K: "[b3,d4] [b3,d4]@2 [b3,d4,f#4] ~@2 [b3,d4,f#4]@2 [b3,c#4,e4]@4 [b3,c#4,e4]!2 [b3,c#4,e4]@2, f#4@3 ~@13", // Bm C#m7
  L: "[a3,d4] [a3,d4]@2 [a3,d4,g4] ~@2 [a3,d4,f#4]@3 [a3,d4,f#4] [a3,d4,f#4]@2 [a3,d4,f#4]!3 ~, g4@3 ~@13", // D5 Dsus4 D
  M: "[~ g4@28 ~@3, [g3,b3,d4]@7 ~]/2", // G
})).s("gm_acoustic_guitar_steel").gain(0.36).pan(0.3)

// other · melodic tom
const melodic_tom = note("<~@5 [~@7 a2] ~ [~@7 a3 g#3 ~ g3 ~ e3!2 ~@2] ~@82>").s("gm_melodic_tom").gain(0.3).pan(0.4)

// chords · acoustic guitar steel
const acoustic_guitar_steel_2 = note(`<
  ~@24 A B A B A B A C ~@8 A B A B A B A B A B A B A B A D E ~@7 A B A B A B A D A B A B A B A D A B A B A B A D F@2
>`.pickRestart({
  A: "[b3,e4,g4]!3 [b3,e4]!3 [c4,e4,g4]!10, d5@3 g4@3 d5@10", // Em E5 C
  B: "[a3,d4,f#4] [a3,d4,f#4,g4]!5 [b3,d4,g4]!6 [b3,d4,g4,a4] [b3,d4,g4] [b3,d4,g4,b4] [b3,d4,g4], a4@3 a4@3 b4@6 ~@4", // D G
  C: "[a3,d4,f#4] [a3,d4,f#4,g4]!5 d4@4 ~@2 b4@4, a4@3 a4@3 [b3,g4]@10, ~@5 d4@3", // D Em
  D: "[a3,d4,f#4] [a3,d4,f#4,g4]!5 d4@4 ~@2 d5@4, a4@3 a4@3 [b3,g4]@10, ~@5 d4@3", E: "[a3,c4,e4,g4]",
  F: "[~ d5@28 ~@3, [d4,g4,b4]@7 ~]/2", // G
})).s("gm_acoustic_guitar_steel").gain(0.32).pan(0.9)

// drums · kick
const kick = s("bd").struct(`<
  [x ~@4 x ~@2]!4
  [x ~ x ~@4 x!2 ~ x ~@4 x]!3
  [x ~ x ~@4 x!2 ~ x ~@5]
  [x ~ x ~@4 x!2 ~ x ~@4 x]!7
  [x ~@4 x ~@2]
  [x ~ x ~@4 x!2 ~ x ~@4 x]!72
  x
  ~
>`).gain(0.72)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@23 A ~@15 A ~@3 B ~@3 B ~@3 B ~@3 B ~@3 C ~@3 C ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@2
>`.pickRestart({
  A: "~@7 x ~@8", B: "~@6 x ~@6 x ~@2", C: "~@13 x ~@2",
})).gain(0.32)

// drums · hihat
const hihat = s("hh").struct("<~@4 [x ~ x ~ x ~ x!3 ~ x ~ x ~ x!2]!11 x [x ~ x ~ x ~ x!3 ~ x ~ x ~ x!2]!72 ~@2>")
  .gain(0.48)

// drums · splash
const splash = s("cr").struct(`<
  ~@24 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~
>`.pickRestart({
  A: "x",
})).gain(0.32)

// drums · ht
const ht = s("ht").struct("<~@23 [~@7 x!2 ~ x ~ x ~ x ~] ~@15 [~@7 x!2 ~ x ~ x ~ x ~] ~@50>").gain(0.32)

// drums · shaker
const shaker = s("sh").struct("<~@4 [x!8]!11 x [x!8]!72 ~@2>").gain(0.56)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct(`<
  ~@4
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!11
  ~
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!72
  ~@2
>`).gain(0.24)

// drums · triangle
const triangle = s("triangles:35").struct(`<
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@59
>`.pickRestart({
  A: "~ x ~@2",
})).gain(2.09)

stack(
  piano, bass, clarinet, lead_1_square, overdriven_guitar, pad_poly, acoustic_guitar_steel, melodic_tom,
  acoustic_guitar_steel_2, kick, snare, snare_soft, hihat, splash, ht, shaker, shaker_soft, triangle
)

More by Fabi