Strudelify

Perche ti amo

Camaleonti

KeyD majorTempo64 bpm
0:00/0:00
// Perche ti amo — Camaleonti
// 64 bpm, 2/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 101 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(64/2)

// 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("<~@15 A B C D ~@41 A B C E ~@37>".pickRestart({
  A: "[f#4,a#4,c#5]@4 [f#4,a#4,c#5]@3 ~", B: "[f#4,b4,d5]@6 ~@2 [f#4,b4,d5]@7 ~", C: "[a4,c#5,e5]@3 ~ [a4,c#5,e5]@3 ~",
  D: "[d4,f#4,a4,d5]@6 ~@2 [d4,f#4,a4,d5]@7 ~", E: "[d4,f#4,a4,d5]@3 ~@5",
})).s("gm_piano").gain(0.16).pan(0.2)

// bass · fretless bass
const bass = note(`<
  ~@18 A B@2 ~ C@2 D@2 E@2 F@2 G@2 D@2 H@2 I J K L M N O P Q R S@2 D@2 T@2 U ~@10 V W@3 G@2 X@2 H@2 R Y K L M Z O AA Q R
  AB@2 D@2 AC@2 AD AE AF@2 AG@2 AH AI AJ@4
>`.pickRestart({
  A: "~@8 d2@4 c#2@3 ~", B: "[b1 ~ b1 ~ b1 ~ b1@2 e2@3 ~ e2@2 a1@18]/2", C: "[d2@3 a1@3 d1@6 a1@2 d2 a#1]/2",
  D: "[b1@3 f#2@3 b2@6 f#2@2 d2 d#2]/2", E: "[e2@6 b1@6 e1@12 e2@3 ~ e1@4]/2", F: "[a1@6 e2@5 ~ a2@12 e2@4 a1@4]/2",
  G: "[d2@3 a1@3 d1@6 a1@2 d2@2]/2", H: "[e2@3 b1@3 e1@6 b1@2 e2@2]/2", I: "a1@3 ~ a1@3 ~ a1@3 ~ a1@4",
  J: "f#1@3 ~ f#1@3 ~ f#1@3 ~ f#1@4", K: "b1@3 f#1 a1 b1@2 f#1", L: "b1 ~ b1@2 f#1@2 a1@2 b1@4 b1@2 c#2@2",
  M: "f#2@3 c#2 e2 f#2@2 c#2", N: "f#2!2 c#2 e2 f#2@2 c#2@2", O: "e2@3 b1 d2 e2@2 b1",
  P: "e2 ~ e2@2 b1@2 c2@2 c#2@4 e2@2 f2@2", Q: "f#2@3 ~ f#2@3 ~ f#2@3 ~ f#2@3 ~", R: "a1@3 ~ a1@3 ~ a1@3 ~ a1@3 ~",
  S: "[d2@6 a1@5 ~ d1@12 a1@4 d2@4]/2", T: "[e2@3 b1@3 e1@6 a1@4]/2", U: "d2", V: "~@2 d2 c#2",
  W: "[b1 ~ b1 ~ b1 ~ b1 ~ e2@3 ~ e2@2 a1@21 ~@13]/3", X: "[b1@3 f#2@3 b2@5 f#2 b1@2 d2 d#2]/2",
  Y: "f#1 ~ f#1 ~ f#1 ~ f#1 ~", Z: "f#2 ~ f#2@2 c#2@2 e2@2 f#2@4 c#2@2 d#2@2",
  AA: "e2 ~ e2 ~ b1@2 c2@2 c#2@4 e2@2 f2@2", AB: "[d2@6 a1@6 d1@12 a1@4 d2@3 ~]/2",
  AC: "[e2@6 b1@5 ~ e1@12 b1@4 e1@4]/2", AD: "a1 ~ a1 ~ a1 ~ a1 ~", AE: "c2@3 ~ c2@3 ~ c2@3 ~ c2@3 ~",
  AF: "[c2@3 g2@3 c3@6 g2@2 c2@2]/2", AG: "[a1@3 e2@3 a2@6 e2@2 a1@2]/2", AH: "d2@7 ~ a2@3 ~ d2@3 ~", AI: "g2 g1",
  AJ: "[c2@8 c1@5 ~@3]/4",
})).s("gm_fretless_bass").gain(0.33)

// chords · electric guitar jazz
const electric_guitar_jazz = note(`<
  A B C D E@2 F G F H I D J G K J D L M N@3 O@2 P@2 Q@2 R@2 O@2 S@2 T@2 U V ~@8 W@2 S@2 X@2 Y ~@3 D J G K J D L Z N@3
  AA@2 AB@2 AC@2 AD AE ~@8 AF@2 AG@2 AH@2 AI AJ AK@2 AL@2 AM@2 AN@2 ~@2
>`.pickRestart({
  A: "~@8 a5@4 ~@2 a5 ~", B: "a5 ~ a5@6", C: "a#5 ~ a#5@6", D: "[b2,f#3] ~@3", E: "[b2,f#3] ~@7", F: "[a2,e3] ~@3",
  G: "[g2,d3] ~@3", H: "[d3,a3] d3 ~@2", I: "[f#2,c#3] ~@3 [f#2,c#3]@11 ~", J: "[f#2,c#3] ~@3", K: "a3 ~@3, d3 ~@7",
  L: "[a2,e3] a2 ~@2", M: "[d3,a3]@7 ~ d3@4 c#3@3 ~", N: "[b2 ~ b2 ~ b2 ~ b2 ~ e3@2 ~@2 e3@2 a2@22 ~@12]/3",
  O: "[[a3,c#4,f#4]@5 ~ [a3,c#4,f#4] ~@5 [a3,c#4,f#4]@17 ~@3]/2", // F#m
  P: "[[b3,d4,f#4]@5 ~ [b3,d4,f#4] ~@5 [b3,d4,f#4]@17 ~@3]/2", Q: "[[e3,b3,e4]@5 ~ [e3,b3,e4] ~@5 [g3,b3,e4]@17 ~@3]/2",
  R: "[[a3,c#4,e4]@5 ~ [a3,c#4,e4] ~@5 [a3,c#4,e4]@17 ~@3]/2", // A
  S: "[[b3,d4,f#4]@5 ~ [b3,d4,f#4]@2 ~@4 [b3,d4,f#4]@16 ~@4]/2", // Bm
  T: "[[g3,b3,e4]@5 ~ [g3,b3,e4] ~@5 [g3,b3,e4]@18 ~@2]/2", U: "[a3,c#4]@5 ~@11, e4@15 ~", V: "f#4, a#3@9 ~@7",
  W: "[[a3,c#4,f#4]@2 ~ [a3,c#4,f#4] ~@2 [a3,c#4,f#4]@8 ~@2]/2", // F#m
  X: "[[g3,b3,e4]@5 ~ [g3,b3,e4] ~@5 [g3,b3,e4]@10 ~@2 [a3,c#4,e4]@6 ~@2]/2", Y: "[a3,d4,f#4]@7 ~",
  Z: "[d3,a3]@4 d3@3 ~ d3@3 ~ c#3@3 ~", AA: "[[a3,c#4,f#4]@5 ~ [a3,c#4,f#4] ~@5 [a3,c#4,f#4]@15 ~@5]/2",
  AB: "[[b3,d4,f#4]@5 ~ [b3,d4,f#4] ~@5 [b3,d4,f#4]@13 ~@7]/2", // Bm
  AC: "[[g3,b3,e4]@5 ~ [g3,b3,e4] ~@5 [g3,b3,e4]@14 ~@6]/2", AD: "[a3,c#4]@7 ~@9, e4", AE: "[a#3,c#4] ~, f#4",
  AF: "[[a3,c#4,f#4]@5 ~ [a3,c#4,f#4] ~@5 [a3,c#4,f#4]@16 ~@4]/2", // F#m
  AG: "[[b3,d4,f#4]@4 ~@2 [b3,d4,f#4]@2 ~@4 [b3,d4,f#4]@17 ~@3]/2", // Bm
  AH: "[[g3,b3,e4]@5 ~ [g3,b3,e4] ~@5 [g3,b3,e4]@16 ~@4]/2", AI: "[a3,c#4,e4]@5 ~@7 b3@4", AJ: "c4@7 ~",
  AK: "[[b3,e4,g4]@4 ~@2 [b3,e4,g4] ~@5 [b3,e4,g4]@18 ~@2]/2", // Em
  AL: "[[a3,c4,e4]@5 ~ [a3,c4,e4] ~@5 [a3,c4,e4]@16 ~@4]/2", // Am
  AM: "[[a3,d4,f4]@5 ~ [a3,f4]@3 ~@3 [a3,d4,f4]@9 ~@3 [g3,d4,g4]@6 ~@2, ~@6 d4 ~@25]/2", AN: "[[c4,e4,g4]@27 ~@5]/2",
})).s("gm_electric_guitar_jazz").gain(0.22).pan(0.7)

// chords · electric guitar jazz · soft notes
const electric_guitar_jazz_2 = note("<~@3 A B C D E F G ~ H I J K I L M ~@19 N ~@18 H I J K I L M O ~@37>".pickRestart({
  A: "~@2 [b2,f#3]@2 [b2,f#3]@2 [b2,f#3] ~", B: "~@2 [b2,f#3] ~ [b2,f#3] ~ [b2,f#3] ~",
  C: "~@4 [b2,f#3]@2 ~@2 [b2,f#3]@2 ~@2 [b2,f#3]@3 ~", D: "~ [a2,e3]!3", E: "~@4 [g2,d3]@4 [g2,d3]@4 [g2,d3]@3 ~",
  F: "~@4 [a2,e3]@4 [a2,e3]@4 [a2,e3]@3 ~", G: "~@4 a3@4 [d3,a3]@4 [d3,a3]@3 ~",
  H: "~@4 [b2,f#3]@4 [b2,f#3]@4 [b2,f#3] ~@3", I: "~ [f#2,c#3]!3", J: "~@2 [g2,d3]@2 [g2,d3]@2 [g2,d3] ~",
  K: "~@4 a3@4 a3@4 [d3,a3]@3 ~, ~@2 d3 ~ d3 ~@3", L: "~@4 [b2,f#3]@4 [b2,f#3]@4 [b2,f#3]@3 ~", M: "~ e3 [a2,e3]!2",
  N: "c#4@9 ~@7", O: "~@4 a3@3 ~ a3@3 ~ [d3,a3]@3 ~",
})).s("gm_electric_guitar_jazz").gain(0.07).pan(0.7)

// chords · electric guitar muted
const electric_guitar_muted = note(`<
  A@2 B ~@4 C@2 D E ~ F ~ G H ~@22 I J K L M N O P Q ~@10 F ~ G H ~@14 I J K L M N O P Q ~@17
>`.pickRestart({
  A: "[~@8 e5@4 d5 ~ d5@4 c#5 ~ c#5@4 b4 ~ b4@4 a4 ~]/2", B: "f#5 ~ f#5@6", C: "[~@2 f#5 e5@3 ~@2]/2", D: "~ b4@2 ~",
  E: "f#5 ~@3 f#5@9 ~@3", F: "a5@5 ~ d6@4 ~@6", G: "~@2 a5 ~ f#5@3 ~ d5@2 ~@2 e5@2 ~@2", H: "f#5@7 ~@9",
  I: "[b2,f#3] ~ [b2,f#3] ~ b2 ~ [b2,f#3] ~ [b2,f#3] ~ [a2,f#3] ~ b2 ~ [d3,f#3] ~", // B5 D
  J: "[b2,f#3]@2 b2 ~ b2 ~ [b2,f#3] ~ [b2,f#3] ~ f#3@2 b2@2 [d3,f#3] ~, ~@10 a2 ~@5", // B5 D
  K: "[f#2,c#3,f#3] ~ [f#2,f#3] ~ [f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [a2,f#3]@2 b2 ~ c#3 ~", // F#5 F# F#5 D
  L: "[f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [f#2,f#3] ~ [f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [a2,c#3,f#3]@2 [b2,f#3] ~ [c#3,f#3] ~", // F#5 F# F#5 F#m B5 F#5
  M: "[e2,b2,e3] ~ [e2,b2,e3] ~ [b2,e3] ~ [b2,e3] ~ [b2,e3] ~ a2@2 b2 ~ [b2,e3] ~, ~@6 e2@2 ~@2 e3 ~@5", // E5
  N: "[e2,b2,e3] ~ [e2,b2,e3] ~ [e2,b2,e3] ~ [e2,b2,e3] ~ [f2,c#3,f3] ~ [f2,c#3,f3] ~ [f2,c#3,f3] ~ [f2,c#3,f3] ~", // E5 C#
  O: "[f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~", // F#5
  P: "[a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~", Q: "[d3,a3]@5 ~@3",
})).s("gm_electric_guitar_muted").gain(0.26).pan(0.3)

// chords · electric guitar muted · soft notes
const electric_guitar_muted_2 = note("<~@12 A@2 ~@24 B C D E ~@15 A@2 ~@16 B C D E ~@22>".pickRestart({
  A: "[~@4 f#5 ~@5 a5 ~ b5@12 ~@8]/2", B: "~@4 f#3 ~@7 f#3 ~@3", C: "~@2 f#3 ~@13", D: "~@2 c#3 ~@13",
  E: "~@4 c#3 ~@11",
})).s("gm_electric_guitar_muted").gain(0.17).pan(0.3)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@18 A B@4 ~@7 C D E F@2 G H I ~@8 J D E F@2 K L ~@10 A B@4 ~@14 M N@2 O@2 ~@2 P Q R S T U@2 V W@4
>`.pickRestart({
  A: "~@2 [b3,d4] [c#4,e4]", // Bm C#m
  B: "[[d4,f#4] ~ [d4,f#4] ~ [d4,f#4] ~ d4@2 [e4,g#4]@3 ~ [e4,g#4]@2 [a3,e4,a4]@44 ~@6, ~@6 f#4 ~@57]/4", // D E A5
  C: "~ [b3,b4] [c#4,c#5] [f#4,f#5], [c#4,c#5]@7 ~@9", D: "[c#4,c#5]", E: "[d4,d5] [c#4,c#5] [d4,d5] [f#4,f#5]",
  F: "[[d4,d5]@5 [c#4,c#5] [d4,d5] [g4,g5]]/2", G: "[d4,d5]", H: "[e4,e5]", I: "[f#4,f#5]",
  J: "[c#4,c#5] [b3,b4] [c#4,c#5] [f#4,f#5]", K: "[d4,d5] [c#4,c#5]", L: "[d4,d5]@15 ~",
  M: "~ [f#4,f#5] [e4,e5] [d4,d5]", N: "[[c#4,c#5] [f#3,f#4]@4 [g3,g4] [a3,a4] [f#3,f#4]]/2", O: "[[d4,d5]@23 ~@9]/2",
  P: "g4 ~ a4@4 [b4,b5]@2, a5@3 ~", Q: "[c5,c6]", R: "[b4,b5] [a4,a5] [b4,b5] [e5,e6]", S: "[b4,b5]",
  T: "[c5,c6] [b4,b5] [c5,c6] [e5,e6]", U: "[[c5,c6]@5 [b4,b5] [c5,c6] [f5,f6]]/2", V: "[c5,c6] [b4,b5]",
  W: "[[c5,c6]@27 ~@5]/4", // C
})).s("gm_string_ensemble_1").gain(0.25).pan(0.8)

// chords · string ensemble 2
const string_ensemble_2 = note("<~@22 A@2 B@8 C@6 ~@8 D@6 E@2 F@2 ~@6 G H@2 ~@2 I@8 ~@8 J@7 K@3 L@8>".pickRestart({
  A: "[d4,f#4,c#5]/2", B: "[b3 ~ a3 [d4,f#4], d5 c#5, ~@32 g4@65 ~@31, ~@16 e4@23 ~@25, ~@64 e5@29 ~@35]/8",
  C: "[b3@2 ~@2 a3 [f#3,f#4,a#4], d5@2 c#5, ~@32 [e4,g4]@49 ~@15]/6", // F# Em
  D: "[[d4,c#5]@4 b3@4 ~@3 [a3,c#5], f#4@2 [e4,g4], ~@4 d5@7 ~]/6", E: "[[d4,f#4]@2 b4 [a4,c#5], d5@3 ~]/2",
  F: "[g4,b4]/2", G: "[c#4,e4]", H: "[d4@21 ~@11]/2",
  I: "[[d4,c#5]@2 b3@2 g4@2 [a3,a4] [f#3,f#4,a#4], f#4@4 e4@3 ~, ~@32 d5@63 ~ c#5@32]/8", // Dmaj7 A F#
  J: "[[d4,c#5]@32 b3@32 g4@31 ~ [a3,a4,c#5]@16, f#4@4 e4@3, ~@2 d5@4 ~]/7", K: "[~@16 b4@31 ~, [c4,g4,e5]]/3",
  L: "[[a3,c5]@4 f4@3 [g3,b4] [c4,e4,c5]@7 ~, a4@56 g4@65 ~@7, ~@32 [d4,d5]@33 ~@63]/8", // Am G C D
})).s("gm_string_ensemble_2").gain(0.2)

// chords · string ensemble 2 · soft notes
const string_ensemble_2_soft = note("<~@60 A@2 B@3 ~@36>".pickRestart({
  A: "[[a#3,c#4] [b3,d4], f#3]/2", B: "[~@16 f#4@21 ~@11, a3@37 ~@11]/3",
})).s("gm_string_ensemble_2").gain(0.08)

// other · overdriven guitar
const overdriven_guitar = note("<~@41 A ~@2 B C ~@32 A ~@2 B C ~@18>".pickRestart({
  A: "c#4@2 f#4 ~ c#4 b3 a3 ~ b3@3 a3 f#3@4", B: "c#4@5 ~ d4@6 e4@4", C: "~ f#4@6 ~",
})).s("gm_overdriven_guitar").gain(0.14).pan(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~@19 A ~@2 B C B D B C B C B C B E B D B D B C B C F D B D B C B E B C G ~ D ~@9 A ~@2 G H B D B E B D B E B C B E B ~
  B E B D B E B ~ B E B E B D@2 ~ I ~
>`.pickRestart({
  A: "~@7 x", B: "x ~@2 x ~@2 x ~", C: "~ x!2 ~@5", D: "x", E: "~ x ~@2", F: "x ~ x ~@4 x", G: "x ~@2 x",
  H: "~@3 x ~@4", I: "~ x ~@14",
})).gain(0.52)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@33 A ~@15 A ~@14 B ~@2 C ~@4 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~@6
>`.pickRestart({
  A: "~ x ~@6", B: "~ x", C: "~@3 x ~@4",
})).gain(0.3)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@25 A ~@5 A ~@5 B ~@2 C ~@2 A ~@4 C ~@21 A C ~@2 D ~ A ~@9 A ~@5 A C ~@7
>`.pickRestart({
  A: "~@14 x!2", B: "~@5 x ~@10", C: "~ x ~@6", D: "~ x ~@2",
})).gain(0.3)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@18 A B ~@9 C ~@7 D ~@7 E ~@5 C ~ F ~@9 A G ~@9 H ~@7 I ~@7 J ~@5 C ~ K ~@2
>`.pickRestart({
  A: "~ x", B: "x!2 ~ x", C: "~@3 x", D: "~@11 x!3 ~ x", E: "~@5 x!3", F: "x!2", G: "x ~ x!2 ~@4", H: "~@3 x ~@3 x",
  I: "~@4 x!3 ~", J: "~@5 x!2 ~", K: "~@11 x ~@4",
})).gain(0.44)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@22 A B@4 C B D E B F@2 B G C B E B@2 F B@3 H E B F B C B E D ~@13 E B F B@2 I C D E F B@4 D ~ E B F B@4 D E B F B@2
  D ~@4
>`.pickRestart({
  A: "~@2 x!2", B: "x!4", C: "x ~ x!2", D: "x!2 ~@2", E: "~ x!3", F: "x!3 ~", G: "~ x!2 ~ x ~ x ~", H: "x",
  I: "x!2 ~ x",
})).gain(0.3)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@22 A ~@2 B ~@7 C ~ D ~@2 E F@2 G F@3 H ~@4 I ~@19 J ~ K ~@2 L G F@4 M ~@19
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@3 x ~@4", C: "~@3 x", D: "x", E: "~@5 x ~ x", F: "~ x ~ x ~ x ~ x", G: "~ x ~ x ~ x ~@2",
  H: "~ x ~@6", I: "~@2 x ~@4 x", J: "~@7 x", K: "~ x", L: "~@3 x ~ x ~ x", M: "~ x ~ x ~@2 x!2",
})).gain(0.15)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@18 A B ~@8 C@2 ~@7 D ~@7 E ~@7 F ~@9 A G ~@2 A ~@6 H ~@7 I ~@7 H ~@5 J ~ C ~@2
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x ~@4", C: "~@7 x", D: "~@8 x!2 ~@6", E: "~@3 x!2 ~@3", F: "~@2 x ~@2 x ~@2", G: "~ x ~@6",
  H: "~ x", I: "~ x ~@2", J: "~@5 x ~@2",
})).gain(0.44)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@27 A ~@4 B ~@3 A ~@4 C ~@6 B ~@4 D ~@15 B ~@3 A ~@2 B ~@8 B ~@7 B ~@7
>`.pickRestart({
  A: "~ x ~@2", B: "~@3 x", C: "x ~@2 x", D: "~ x",
})).gain(0.15)
// … 30 more lines

More by Camaleonti