Strudelify

Canto alla luna

Nomadi

KeyA minorTempo140 bpm
0:00/0:00
// Canto alla luna — Nomadi
// 140 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 182 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(140/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 · electric bass finger
const bass = note(`<
  ~@16 A B C D A B C D A B C D A B C D A B C D A B E F A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A
  B C D A B C D A B C D A B E F A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D G H I@2 G H I@2 A B C D
  A B E F A B C D A B C D A B C D A B E F A B C D A B C D A B C D A B E F A B C D A B E F G H I@2 J@2
>`.pickRestart({
  A: "a1@2 ~ a1 a1@2 e1 a1", B: "g1@2 ~ g1 g1@2 d1 g1", C: "f1@2 ~ f1 f1@2 c1 d1", D: "f1@2 ~ f1 c1 f1 g1 f1",
  E: "f1!7 c2", F: "f2!5 c2 f2 c2", G: "a1", H: "g1", I: "f1/2", J: "a1/2",
})).s("gm_electric_bass_finger").gain(0.64)

// other · distortion guitar
const distortion_guitar = note(`<
  A B C@2 D E F@2 A B C@2 D E F@2 ~@8 G H I@2 G H I@2 G H I@2 G H I@2 ~@8 J K L M@2 K L M@2 K L M@2 K L N@4 ~@5 G H I@2
  G H I@2 G H I@2 G H I@2 ~@8 J K L M@2 K L M@2 K L M@2 K L N@4 ~@9 O@2 P@2 ~@8 J K L M@2 K L M@2 K L M@2 K L Q R K L
  M@2 K L M@2 K L M@2 K L N@4 ~@11
>`.pickRestart({
  A: "a3@3 e3 [b3,b4]@3 [a3,a4]", B: "g3@3 e3 [b3,b4]@3 [g3,g4]", C: "[f3@15 ~]/2", D: "a3@3 a3 [c4,g4]@3 a3",
  E: "g3@3 g3 [d4,g4]@4", F: "[[f3,c4]@15 ~]/2", G: "a2!2 [a4,c5] a2!2 [a4,c5] ~@2", H: "g2!2 [g4,c5] g2!2 [g4,c5] ~@2",
  I: "[f2!2 [f4,a4] ~ g4 f4 c3 f3@2 f3 [f4,a4] ~ g4 f4 g2 g#2]/2", J: "e4", K: "d4", L: "c4",
  M: "[~@2 c4@2 ~ d4@2 ~ e4@2 ~@2 f4@2 e4@16 ~@2]/2", N: "[~@2 e5@4 g5@2 e5@2 d5 c5 e5@52]/4",
  O: "[a3,c4] ~ [e4,g4] [e4,a4]@3 [a3,c4]!2", P: "[[a3,c4] [e4,g4,c5]!6 [e4,g4,c5]@9]/2",
  Q: "~@2 c4@2 ~ d4@2 ~ e4@2 ~@2 f4@2 e4@2", R: "e4@7 ~",
})).s("gm_distortion_guitar").gain(0.31).pan(0.7)

// other · string ensemble 2
const string_ensemble_2 = note("<~@120 A B C@2 A B C@2 ~@54>".pickRestart({
  A: "a2", B: "g2", C: "f2/2",
})).s("gm_string_ensemble_2").gain(0.4)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@2 A ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~@9 A@3 ~ A@3 B C D E@2 C D E@2 ~@16 A@3 ~ A@3 ~@9 A@3 ~ A@3 B C D E@2 C D E@2
  ~@16 A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ C D E@2 C D E@2 C D E@2 C D E@2 C D E@2 C D E@2 C D E@2 C D E@2 A@3 ~ A@3 ~
  A@3 B F@2
>`.pickRestart({
  A: "~@2 [c5,c6] ~ [b4,b5] ~ [c5,c6] ~ [d5,d6] ~ [c5,c6] ~ [b4,b5] ~ [c5,c6] ~", // C B C D C B C
  B: "[d5,d6] ~ [c5,c6] ~ [b4,b5] ~ [c5,c6] ~ [d5,d6] ~ [c5,c6] ~ [b4,b5] ~ [c5,c6] ~", C: "[a4,c5,e5]",
  D: "[g4,b4,d5]", E: "[f4,a4,c5]/2", F: "[a4,a5]/2",
})).s("gm_string_ensemble_1").gain(0.55)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note("<~@7 A@8 ~@32 A@16 ~@32 A@16 ~@8 A@8 ~@8 A@32 ~@15>".pickRestart({
  A: "[~@16 [c4,e4]@15 ~@17 [c4,f4]@16, ~@15 [a2,e3,a3]@16 [g2,d3,g3]@15 f2@16 ~@2, ~@32 [b3,g4]@15 [c3,f3,a3]@16 ~]/4", // C F5 A5 G5 Em F
})).s("gm_acoustic_guitar_steel").gain(0.4)

// chords · distortion guitar
const distortion_guitar_2 = note(`<
  ~@16 A@3 B A@3 B C ~@15 D E F@2 D E F@2 D E F@2 D E F@2 D E F@2 D E F@2 A@3 B A@3 G D E F@2 D E F@2 ~@8 D E F@2 D E
  F@2 D E F@2 D E F@2 D E F@2 D E F@2 A@3 B A@3 G ~@8 A@3 B A@3 G D E F@2 D E F@2 D E F@2 D E F@2 D E F@2 D E F@2 D E
  F@2 D E F@2 A@3 B A@3 G A@3 B H@2
>`.pickRestart({
  A: "[a3,e4,a4] ~ [a3,e4,a4] ~ [b3,b4]@4", B: "e4 d#4 d4 c4 b3 a3 g3 f3", C: "e3",
  D: "~@2 [e4,a4,c5] ~@3 [e4,a4,c5] ~", E: "~@2 [d4,g4,b4] ~@3 [d4,g4,b4] ~", F: "~@2 [c4,f4,a4] ~@3 [c4,f4,a4] ~",
  G: "[e5,a5]@2 [e5,a5]!10 [e5,a5]@4", H: "e3/2",
})).s("gm_distortion_guitar").gain(0.35).pan(0.6)

// chords · rock organ
const rock_organ = note(`<
  ~@16 A B C@2 A B C@2 ~@24 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 ~@24 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2
  A B C@2 ~@8 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2
  D@2
>`.pickRestart({
  A: "[a4,c5,e5,a5]", B: "[g4,b4,d5,g5]", C: "[f4,c5,f5,a5]/2", D: "[a4,c5,e5,a5]/2",
})).s("gm_rock_organ").gain(0.25).pan(0.3)

// chords · distortion guitar
const distortion_guitar_3 = note(`<
  A B C@2 A B C@2 D E F@2 D E F@2 ~@8 A B G@2 A B G@2 A B G@2 A B G@2 A B H@2 A B H@2 I J K L@2 J K L@2 J K L@2 J M@2
  ~@8 A B G@2 A B G@2 A B G@2 A B G@2 A B H@2 A B H@2 I J K L@2 J K L@2 J K L@2 J M@2 ~@24 I J K L@2 J K L@2 J K L@2 J
  M@2 I J K L@2 J K L@2 J K L@2 J M@2 ~@14
>`.pickRestart({
  A: "[a2,e3]", B: "[g2,d3]", C: "[f2,c3]/2", D: "g4@2 g4!2 g4@2 g4@2, [a2,e3]", E: "g4@2 g4!2 g4@2 g4@2, [g2,d3]",
  F: "[g4@2 g4!2 g4@2 g4@9 ~, [f2,c3]]/2", G: "[[f2,c3]@14 [g2,d3] [g#2,d#3]]/2",
  H: "[[f2,c3]@12 [c3,a3]!2 [d3,b3] [c3,a3]]/2", I: "c4", J: "b3", K: "a3",
  L: "[~@2 a3@2 ~ b3@2 ~ c4@2 ~@2 d4@2 c4@16 ~@2]/2", M: "[a3@15 ~]/2",
})).s("gm_distortion_guitar").gain(0.33).pan(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~@15 A B@23 C B@3 D B@3 E B@3 F B@3 D B@7 E B@7 G B@3 F B@11 C B@3 D B@3 E B@3 F B@3 D B@7 E B@7 G H@3 I H@3 I B@6 E J
  B@3 F B@3 D B@7 E B@3 F B@3 D B@7 E B@6 E J K@2 D ~ D ~
>`.pickRestart({
  A: "~@7 x", B: "x ~@2 x!2 ~@3", C: "x ~@2 x ~ x ~ x", D: "x", E: "x ~@2 x!2 ~@2 x", F: "x ~@2 x!3 ~@2",
  G: "x ~@3 x!2 ~@2", H: "x ~@6 x", I: "x ~@2 x!3 ~ x", J: "~ x!2 ~ x!2 ~@2", K: "x ~@2 x ~@4",
})).gain(0.8)

// drums · rim
const rim = s("rim").struct("<~@120 [x!4]!8 ~@54>").gain(0.8)

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

// drums · low tom
const low_tom = s("lt").struct("<~@43 A ~@11 A ~@35 A ~@11 A ~@31 B ~@7 A ~@15 A ~@15 B ~@6>".pickRestart({
  A: "~@4 x!2 ~@2", B: "~@15 x",
})).gain(0.64)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@43 A ~@11 A ~@35 A ~@11 A ~@31 B ~@7 A ~@15 A ~@15 B ~@6>".pickRestart({
  A: "~@3 x ~@4", B: "~@7 x",
})).gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~@23 A ~@47 A ~@47 A ~@14 B ~@39 B ~@7>".pickRestart({
  A: "~ x ~@2", B: "~@3 x",
})).gain(0.64)

// drums · high tom
const high_tom = s("ht").struct("<~@47 [~ x] ~@47 [~ x] ~@86>").gain(0.64)

// drums · crash
const crash = s("cr").struct(`<
  ~@16 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@2 B A ~@3 A ~@2 B A ~@2 B A ~@3 A ~@3 A ~@6 B A ~@2 C A ~@3 A ~@3 A ~@3 A ~@2 B
  A ~@3 A ~@2 B A ~@2 B A ~@3 A ~@3 A ~@6 B A ~@3 A ~@3 A ~@6 B A ~@2 B A ~@2 B A ~@3 A ~@3 A ~@2 B A ~@2 B A ~@3 A ~@3
  A ~@6 B D@2 A ~ A ~
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~@5 x!2 ~", D: "x!2",
})).gain(0.48)

// drums · ride
const ride = s("rd").struct(`<
  ~@48 A B@2 C A B@2 C A B@3 A B@3 ~@32 A B@2 C A B@2 C A B@3 A B@3 ~@24 A B@2 C A B@2 C A B@3 A B@3 A B@2 C A B@2 C A
  B@3 A B@3 ~@8 D@2 ~@4
>`.pickRestart({
  A: "~ x!7", B: "x!8", C: "x!6 ~ x", D: "~ x!3 ~ x!3",
})).gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct("<~@120 [x!4]!8 ~@54>").gain(0.48)

// drums · bongos
const bongos = s("bongo:4").struct(`<
  ~@3 A ~@7 A ~@7 A ~@12 A ~@34 A ~@12 A ~@34 A ~@4 A ~@3 A ~@6 A ~@39 A ~@10
>`.pickRestart({
  A: "x!3 ~",
})).gain(1.26)

// drums · bongos · soft notes
const bongos_soft = s("bongo:4").struct(`<
  ~@3 A ~@7 A ~@7 A ~@12 A ~@34 A ~@12 A ~@34 A ~@4 A ~@3 A ~@6 A ~@39 A ~@10
>`.pickRestart({
  A: "~@3 x",
})).gain(0.84)

// drums · congas
const congas = s("conga:13").struct("<~@16 A@7 ~ A@47 ~ A@47 ~ B@8 A@7 ~ A@39 ~ A@4 ~@2>".pickRestart({
  A: "~@2 x!2 ~@4", B: "~ x ~@2",
})).gain(1.79)

// drums · congas
const congas_2 = s("conga:18").struct("<~@16 A@7 ~ A@47 ~ A@47 ~ B@8 A@7 ~ A@39 ~ A@4 ~@2>".pickRestart({
  A: "~@6 x!2", B: "x",
})).gain(1.79)

// drums · congas
const congas_3 = s("conga:33").struct("<~@16 A@7 ~ A@47 ~ A@47 ~ B@8 A@7 ~ A@39 ~ A@4 ~@2>".pickRestart({
  A: "~@5 x ~@2", B: "~@6 x!2",
})).gain(1.79)

stack(
  bass, distortion_guitar, string_ensemble_2, string_ensemble_1, acoustic_guitar_steel, distortion_guitar_2, rock_organ,
  distortion_guitar_3, kick, rim, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash, ride, tambourine, bongos,
  bongos_soft, congas, congas_2, congas_3
)

More by Nomadi