Strudelify

Terra mia

Daniele

KeyD minorTempo108 bpm
0:00/0:00
// Terra mia — Daniele
// 108 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 60 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 25.
setcpm(108/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 · pad warm
const pad_warm = note(`<
  ~ A B C D E@3 F@3 G@3 H I@2 J@2 K@2 L M N O L P Q R S@3 F@3 G@3 H I@2 J@2 K@2 L T N O L P Q R A B U@3 ~@2
>`.pickRestart({
  A: "a5@3 f5", B: "e5", C: "d5@3 bb4", D: "a4 ~@3", E: "[~@15 a4@16 bb4@17, ~ d4@31 ~@16]/3",
  F: "[g4@15 a4@25 g4@8]/3", G: "[f4@11 e4]/3", H: "d4", I: "[c4,f4]/2", J: "[~ d4, ab4]/2", K: "[a4 g4, db4]/2",
  L: "[f4,a4]", M: "[e4,g4]@7 [c4,f4]@8 ~", N: "[bb3,f4]", O: "[a3,g4]", P: "[e4,g4] [c4,f4]", Q: "[bb3,g4]",
  R: "[a3,e4]@9 ~@7", S: "[~@15 a4@16 bb4@16 ~, ~ d4@31 ~@16]/3", T: "[e4,g4]@7 [c4,f4]@9", U: "[a5@13 f5@5 e5@29 ~]/3",
})).s("gm_pad_warm").gain(0.3).pan(0.4)

// bass · fretless bass
const bass = note(`<
  ~ A B C@2 D@2 E@2 F@2 G@2 H B I J K L M N A O P Q A O P Q D@2 E@2 F@2 G@2 H B I J K L M N A O P Q A O P Q A B R@5
>`.pickRestart({
  A: "d2", B: "bb1", C: "[d2@3 ~]/2", D: "d2/2", E: "g1/2", F: "a1/2", G: "[d2@7 c2]/2", H: "bb1@3 f1", I: "f1@3 c2@5",
  J: "f2@3 c2@3 f1@2", K: "e1", L: "e2@3 b1@3 e1@2", M: "a1@3 e2", N: "a2", O: "c2 f1", P: "g1", Q: "a1",
  R: "[d2@18 bb1@24 d1@33 ~@5]/5",
})).s("gm_fretless_bass").gain(0.54)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  A@3 B@2 C@2 D@2 E F G@2 H@2 I@2 J@2 K@2 L M N O L M N P C@2 D@2 E F G@2 H@2 I@2 J@2 K@2 L M N O L M N P Q@2 R@5
>`.pickRestart({
  A: "[~@8 d4 ~@12 g4 ~ a3, ~@15 d3@6 ~ [a2,e4]@6 [a2,f4]@4 bb2@16, ~@8 f4@3 ~@5 e4@3 g4@2 ~ e4@2, ~@8 a3@2 a3@3 a3@2 a3@3 a3@3 a3@2 ~, ~@9 d4@3 d4@5 d4@3 d4@4]/3", // A5 Dm
  B: "[d4@2 ~@12 a3 ~ [d4,f4]@16, [d3,f4]@3 [a2,e4]@3 [a2,f4]@2 ~@8, a3@4 a3@6 a3@4 ~ [d3,a3]@17, ~ d4@3 d4@4 ~@8]/2", // Dm A5 Dm D5
  C: "[d4 ~@14 a3, [d3,f4]@3 [a2,e4]@3 [a2,f4]@2 [d3,f4]@3 [a2,e4]@3 [a2,f4]@2, a3@2 a3@3 a3@2 a3@3 a3@3 a3@2 ~, ~ d4@3 d4@5 d4@3 d4@4]/2", // Dm A5 Dm A5 Dm
  D: "d4 ~@6 bb3, [g2,g4]@3 [d3,e4]@3 [d3,e4]@2, bb3@2 bb3@3 bb3@2 ~, ~ d4@3 d4@4", // G Dsus2
  E: "a3 ~@6 e3, a2@3 [e2,db4], db4@3 b3@3 ~@2, e3@2 e3@3 e3@2 ~, ~ a3@3 a3@4", // Dbm
  F: "a3 ~@6 e3, [a2,d4]@3 [a2,e4]@3 [a2,e4]@2, e3@2 e3@3 e3@2 ~, ~ a3@3 a3@4", // D5 A5
  G: "d4 ~@6 a3, [d3,f4]@3 [a2,e4]@3 [a2,f4]@2, a3@2 a3@3 a3@2 ~, ~ d4@3 d4@4", // Dm A5 Dm
  H: "[~@15 bb2, [bb3,d4,f4]@6 [bb3,d4,f4]@5 ~ [bb3,d4,f4]@4 [bb3,d4,f4]@5 ~ [bb3,d4,f4]@5 ~ [bb3,d4,f4]@4, bb2@2 bb2@3 bb2@2 bb2@3 bb2@3 bb2@2 ~, ~ f3@3 f3@5 f3@3 f3@4]/2", // Bb
  I: "[~@15 a2, [a3,c4,f4]@6 [a3,c4,f4]@5 ~ [a3,c4,f4]@4 [a3,c4,f4]@5 ~ [a3,c4,f4]@5 ~ [a3,c4,f4]@4, a2@2 a2@3 a2@2 a2@3 a2@3 a2@2 ~, ~ f3@3 f3@5 f3@3 f3@4]/2", // F
  J: "[~@15 ab2, [b3,d4,ab4]@6 [b3,d4,ab4]@5 ~ [b3,d4,ab4]@4 [b3,d4,ab4]@5 ~ [b3,d4,ab4]@5 ~ [b3,d4,ab4]@4, ab2@2 ab2@3 ab2@2 ab2@3 ab2@3 ab2@2 ~, ~ e3@3 e3@5 e3@3 e3@4]/2", // Abdim
  K: "[~@15 a2, [db4,e4,a4]@6 [d4,a4]@6 [d4,a4]@4 [db4,e4,a4]@5 ~ [b3,e4,a4]@5 ~ [db4,e4,a4]@4, a2@2 a2@3 a2@2 a2@3 a2@3 a2@2 ~, ~ e3@3 e3@5 e3@3 e3@4]/2", // A D5 A Esus4 A
  L: "d3 ~@6 d3, a4, [a3,f4]@2 a3@3 a3@3, ~ d3@3 d3@3 ~, ~@3 f4@3 f4@2", // Dm
  M: "c3 ~@2 e4 a2 ~@2 c4, g4 f4, [g3,e4] g3 [a3,c4] a3, ~ c3@3 ~ a2@3", // C Am
  N: "g2 ~@6 g2, d4, [d3,bb3]@2 d3@3 d3@3, ~ g2@3 g2@3 ~, ~@3 bb3@3 bb3@2", // Gm
  O: "a2 ~@6 a2, e4@3 e4, [e3,db4]@2 e3@3 e3@3, ~ a2@3 a2@3 ~, ~@3 d4@3 ~@2", // Dbm
  P: "a2@2 ~@4 [a2,db4,e4]@7 ~@3, [db4,e4]@3 ~@5, e3@4 e3@9 ~@3, ~ a2@2 ~@5", // A Dbm
  Q: "[d4 ~@12 g4 ~ a3, [d3,f4]@6 [a2,e4]@6 [a2,f4]@4 bb2@15 ~, a3@2 a3@3 a3@2 a3@3 a3@3 a3@2 ~, ~ d4@3 d4@5 d4@3 d4@4, ~@8 e4@3 g4@2 ~ e4@2]/2", // Dm A5 Dm
  R: "[d4@2 ~@29 g4@3 ~@4 g3@3 ~ [a3,d4,f4]@32 ~@6, [d3,f4]@6 [a2,e4]@7 [a2,f4]@5 bb2@23 d3@33 ~@6, a3@4 a3@6 a3@5 a3@8 a3@9 ~@3 e4@7 ~@38, ~@2 d4@6 d4@12 d4@8 d4@13 ~@39, ~@18 e4@7 g4@6 bb3@6 ~@43]/5", // Dm A5 Dm
})).s("gm_acoustic_guitar_nylon").gain(0.4).pan(0.4)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A@2 B@2 C@7 D E@2 F@2 G@2 H I@6 J@4 ~ K@6 E@2 F@2 G@2 H ~ L@5 M@5 B@2 ~ N@3
>`.pickRestart({
  A: "[~@15 a3@4 ~@13]/2", B: "[~@15 d3@6 ~@11]/2",
  C: "[a4@15 d3@32 ~@7 g4@10 a4@6 g4@9 a2@12 ~@4 g2@6 ~ [db3,g4]@6 ~@4, ~@47 g2@32 e3@4 ~@29]/7", D: "~@3 g4@3 ~@2",
  E: "[~@15 bb2@4 ~@3 c5@5 ~@5]/2", F: "[~@6 c5@5 ~@4 a3@6 ~@11, ~@15 a2@4 ~@13]/2", G: "[~@15 ab2@4 ~@13]/2",
  H: "gb4@5 ~@11", I: "[~@15 g2@6 ~ g2@4 g2@5 d3@2 ~@14 [c3,g3]@8 [a2,f3]@8 d3@16 e3@4 ~@12 d3, ~@79 a2@2 ~@15]/6",
  J: "[~@15 [c3,g3]@8 [a2,f3]@8 d3@16 [a2,e3]@14 ~@3]/4", // C5 Dm A5
  K: "[~@22 g4@10 a4@6 g4@9 a2@12 ~@4 g2@6 ~ [db3,g4]@6 ~@3 d3@6 ~ g4@6 ~@4, ~@15 g2@32 e3@4 ~@45]/6", // Dbdim
  L: "[g2@6 g2@4 g2@5 d3@2 ~@14 [c3,g3]@8 [a2,f3]@8 [d3,g3]@16 e3@4 ~@13, ~@63 a2@2 ~@15]/5", // C5 Dm G5
  M: "[~@15 [c3,g3]@8 [a2,f3]@8 [d3,g3]@16 [a2,e3]@14 ~@2 d3@6 ~@11]/5", N: "[~@6 bb3@3 ~@2 a4@31 ~@6]/3",
})).s("gm_acoustic_guitar_steel").gain(0.19).pan(0.7)

// other · viola
const viola = note("<~@13 A@2 B@2 C D E F G H I J K L M N ~@8 A@2 B@2 C D E F G H I J K L M N ~@7>".pickRestart({
  A: "bb2/2", B: "a2/2", C: "ab2 b2", D: "e3 d3", E: "db3 d3", F: "e3@2 d3 e3", G: "f3@2 e3 d3", H: "e3 c3 d3 bb2 a2@4",
  I: "bb2 d3", J: "db3 d3 e3 a2", K: "a3@2 g3 f3", L: "g3 f3 e3 d3 c3@4", M: "d3", N: "e3@13 ~@3",
})).s("gm_viola").gain(0.27).pan(0.6)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@6 A ~@3 A ~@3 A ~@2 B A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@5
>`.pickRestart({
  A: "~@7 x", B: "x",
})).gain(0.28)

// drums · open hat
const open_hat = s("oh").struct("<~@9 A ~@3 A ~@5 A ~@11 A ~@3 A ~@7 A ~@16>".pickRestart({
  A: "x",
})).gain(0.16)

// drums · ride
const ride = s("rd").struct("<~@21 A B C D E F G H ~@16 I J K L M N O P Q R S T U ~@2>".pickRestart({
  A: "x!4 ~ x ~ x", B: "x!3 ~ x!3 ~ x!3 ~ x ~ x!2", C: "x ~ x ~ x ~ x ~ x!3 ~ x ~@3", D: "x ~ x ~ x ~ x!3 ~ x!5 ~",
  E: "x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~", F: "x!3 ~ x ~ x!5 ~ x ~ x!2", G: "x ~ x ~@3 x ~ x ~ x ~ x ~ x!2", H: "x!2 ~@6",
  I: "x!3 ~ x ~ x ~@2 x ~@2 x ~@3", J: "x!3 ~ x ~ x ~ x ~ x ~ x!3 ~", K: "x!2 ~ x!5", L: "x!3 ~ x ~ x ~ x!3 ~ x!3 ~",
  M: "x ~@2 x!5", N: "x ~ x ~ x ~ x ~ x!3 ~ x ~ x!2", O: "x!8", P: "~ x!2 ~@13", Q: "~@2 x ~ x ~ x ~ x!3 ~ x ~ x ~",
  R: "x ~ x ~ x!3 ~ x!3 ~ x ~ x!2", S: "x ~@3 x ~ x!3 ~ x ~@2 x ~ x", T: "x ~ x ~@8 x!2 ~@3", U: "~ x ~ x ~@5 x!2 ~@5",
})).gain(0.12)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@21 A ~@5 B C ~@16 D E B ~ B ~@2 F ~@2 G H ~@3>".pickRestart({
  A: "~@3 x", B: "~ x ~@2", C: "~@2 x!2 ~@4", D: "~@4 x!2 ~ x", E: "~@9 x ~@6", F: "x ~@3 x!3 ~ x!3 ~ x!3 ~",
  G: "~ x ~@6", H: "~@9 x ~@5 x",
})).gain(0.04)

// drums · tambourine
const tambourine = s("tb").struct("<~@21 [~ x]!7 ~@17 [~ x]!7 ~ [~ x]!3 ~@4>").gain(0.24)

// drums · splash
const splash = s("cr").struct("<~@29 x ~@23 x ~@6>").gain(0.2)

// drums · bongos
const bongos = s("bongo:18").struct("<~@8 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@11>".pickRestart({
  A: "~@3 x",
})).gain(0.74)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@5 A B C D A B C D A B C D A B C D A B C D A B C ~ A B C D A B C D A B C D A B C D A B C D A B C ~ A B C ~@4
>`.pickRestart({
  A: "~ x ~@2", B: "~@3 x!2 ~@3", C: "~@3 x ~@4", D: "~@3 x ~ x ~@2",
})).gain(1.03)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~@5 A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@3 A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@3 A ~@6
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@7 x",
})).gain(1.03)

// drums · congas
const congas_3 = s("conga:33").struct(`<
  ~@5 A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B C ~@4
>`.pickRestart({
  A: "~@6 x!2", B: "~@7 x", C: "~@13 x ~ x",
})).gain(1.03)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@5
  [~ x ~ x ~ x ~ x]!23
  ~
  [~ x ~ x ~ x ~ x]!23
  ~
  [~ x ~ x ~ x ~ x]!2
  [~@2 x ~@3 x ~@3 x ~@4 x]
  ~@4
>`).gain(0.61)

// drums · claves
const claves = s("clave:2").struct(`<
  ~@6 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~@3 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~@3 A ~@5
>`.pickRestart({
  A: "x ~@2 x ~@12", B: "~ x ~@2 x ~@3",
})).gain(0.98)

// drums · claves · soft notes
const claves_soft = s("clave:2").struct(`<
  ~@6 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@5
>`.pickRestart({
  A: "~@5 x ~@2 x ~@2 x ~@4",
})).gain(0.39)

// drums · triangle
const triangle = s("triangles:30").struct(`<
  ~@5 A ~ B C A D ~ E F G H I J B K L ~@8 M N O P Q P R S T@2 U V R W X Y ~@6 Z ~@4 AA ~@3
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "x!2 ~ x ~ x ~ x", C: "~@3 x ~@2 x ~", D: "~ x ~ x!2 ~ x ~",
  E: "x!2 ~@2 x ~ x ~ x!2 ~@2 x ~@3", F: "x!2 ~@6", G: "~@4 x!2 ~ x", H: "x ~@4 x ~ x",
  I: "x ~@3 x!2 ~@2 x!2 ~@2 x ~ x ~", J: "~ x ~ x ~@3 x", K: "~ x ~ x!3 ~ x", L: "x ~@3 x ~ x ~ x!2 ~@4 x ~",
  M: "~ x!2 ~ x!2 ~ x", N: "x!2 ~@2 x ~ x ~ x ~@3 x ~ x ~", O: "x!3 ~ x!2 ~ x", P: "x!2 ~ x!2 ~ x!2",
  Q: "x ~@2 x!2 ~ x!2", R: "x ~@2 x!3 ~ x", S: "x ~@3 x!2 ~@2 x!2 ~@2 x ~@3", T: "x!2 ~ x!3 ~ x", U: "x!2 ~@2 x ~ x!2",
  V: "x ~@3 x ~ x!2", W: "x ~@3 x!2 ~ x", X: "x!2 ~@2 x ~ x ~", Y: "x!2 ~ x!2 ~ x ~", Z: "~@7 x", AA: "~@12 x ~@2 x",
})).gain(0.7)

// drums · triangle · soft notes
const triangle_soft = s("triangles:30").struct(`<
  ~@5 A ~ A ~ B@2 C ~@3 A D E A B F ~@12 G ~@2 D ~@3 H G H I ~@16
>`.pickRestart({
  A: "~ x", B: "x", C: "x!2 ~@6", D: "~ x ~@14", E: "x ~@3 x!2 ~@2", F: "~@3 x", G: "~ x ~@6", H: "~ x ~ x ~@4",
  I: "~@3 x ~@4",
})).gain(0.35)

// drums · triangle
const triangle_2 = s("triangles:35").struct(`<
  ~@5 A ~ A B C D E F A@3 G A@3 H ~ I J K I L J ~ M N M B@3 C O A@2 B@2 A@2 D P ~ C Q@4 R ~ S@2 T ~ U ~@2
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x ~@2", C: "~@3 x", D: "~@2 x ~@2 x ~ x", E: "~ x ~@2", F: "~ x ~@3 x ~ x",
  G: "~ x ~ x ~ x ~@2", H: "~ x ~@6", I: "~ x", J: "x", K: "x ~@4 x!2 ~", L: "~@7 x", M: "~@3 x ~@2 x ~",
  N: "~ x ~@3 x ~@2", O: "~ x ~ x ~ x ~ x", P: "~@4 x ~@4 x ~@4 x ~", Q: "x ~@2 x!2 ~@2 x", R: "x!2",
  S: "~ x!2 ~@2 x!2 ~", T: "~@2 x ~ x ~@5 x ~@2 x ~@2", U: "~@3 x ~@12",
})).gain(0.7)

// drums · triangle · soft notes
const triangle_soft_2 = s("triangles:35").struct("<~@9 A ~@25 A ~@10 B ~@4 C ~ D E ~@5>".pickRestart({
  A: "~ x ~@2", B: "~@7 x", C: "~@3 x ~@4", D: "~ x", E: "x",
})).gain(0.35)

// drums · shaker
const shaker = s("sh").struct(`<
  ~@5 A B@3 A B A B A B A B A B@3 A B@6 ~ A B@3 A B@3 A B@3 A B@3 A B@6 ~ A B C ~@4
>`.pickRestart({
  A: "~ x!3", B: "x!4", C: "x ~@3 x ~@3 x ~@4 x ~@2",
})).gain(0.2)
// … 16 more lines

More by Daniele