Strudelify

Desde mi libertad

Ana Belen

KeyC majorTempo70 bpm
0:00/0:00
// Desde mi libertad — Ana Belen
// 70 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 69 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(70/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(`<
  ~ A B C@2 D E F@2 G H I J K L M N G H I J K L M O P@2 Q R S T U V W X Y@2 ~@4 P@2 Q R S T U V Z AA AB AC AD AE AF AG A
  B AH@2 K L AI@2 AJ@4
>`.pickRestart({
  A: "~@2 e3@2 ~@4 [e4,e5]@4 [g4,g5]@3 ~, c2, [c4,c5]@6 e3@9 ~, ~@4 g3@11 ~, ~@8 c4@7 ~", // E G C
  B: "~ c3 [a4,a5] ~@4 [e4,e5], f2, [g4,g5] f3@3, ~@3 c3@5, ~@3 [f4,f5] a3@4", // A E G F
  C: "[[d4,d5] ~ [d4,d5] ~ [d4,d5] ~ [d4,d5]@2 [e4,e5]@2 [f4,f5]@4 ~@4 e3@2 ~@4 [e4,e5]@4 [d4,d5]@3 ~, g2@16 c2@15 ~, ~@2 d3@2 g3@12 ~@4 g3@11 ~, ~@3 d3@5 ~@3 e3@5, ~@4 b3@3 [e4,e5]@5 c4@4]/2", // D E F E D E
  D: "~ c3 ~ [c4,c5] [d4,d5] [e4,e5]@3, a2@15 ~, [c4,c5]@4 e3@11 ~, ~@3 c3@5, ~@8 a3@7 ~", // C D E C
  E: "~@2 d3@2 [e4,e5]@2 ~@6 [g3,g4]@2 [a3,a4] ~, d2, [d4,d5]@4 f3@11 ~, ~@6 [d3,d4,d5]@9 ~, ~@4 a3@3 ~", // E G A D
  F: "[[c4,c5] ~ [c4,c5] ~ [c4,c5] ~ [c4,c5] ~ [d4,d5]@2 [e4,e5]@4 ~@6 [g3,b3,g4,b4,g5]@4 [a3,c4,g4,a4,c5,g5]@3 ~ [b3,d4,g4,b4,d5,g5]@3 ~, f2@16 g2@15 ~, ~ c3 f3@6 ~@8, ~@3 c3 a3@4 ~@8, ~@14 [d4,d5]@11 ~@7]/2", // C D E G Am7 G D
  G: "~@2 e3@2 ~@4 c4@7 ~, c2, ~@4 g3@11 ~, ~@6 e3@9 ~", H: "~ c3 ~@2 a3@4, f2, ~ f3@3, ~@3 c3@5",
  I: "~@2 d3@2 ~@4 b3@7 ~, g2, ~ g3@3, ~@3 d3@5", J: "~ e3 ~@2 c4@4, c2@15 ~, ~@4 g3@11 ~, ~@3 e3@5",
  K: "~@2 c3@2 ~@4 a3@7 ~, a2@15 ~, ~@4 e3@11 ~, ~@3 c3@5", L: "~@2 d3@2 ~@4 a3@7 ~, d2, ~@4 f3@11 ~, ~@6 d3@9 ~",
  M: "~ c3 ~ c3 a3@4, f2, ~ f3@3", N: "g2@15 ~", O: "~@8 d4@7 ~, g2@15 ~, ~@2 d3@13 ~, ~@4 g3@11 ~, ~@6 b3@9 ~",
  P: "[~@4 a4@2 f4@2 ~@2 g4@2 b4@2 g4@2 ~@4 d4@3 ~@5 e4@4, f2@7 ~, ~@2 c4@4 ~@2 d4@5 ~@5 b3@5 ~ a4@8]/2",
  Q: "~@4 f4@2 a4 ~ [g4,b4]@7 ~, ~@2 d4@13 ~", R: "~@4 [c4,e4]@3 ~ [d4,f4]@3 ~ [e4,g4]@3 ~",
  S: "~@2 c4@2 [f4,a4]@2 c4 ~ [d4,g4,b4]@8, f2 ~", T: "~@2 e4@2 [g4,b4]@2 e4 ~ [e4,a4,c5]@7 ~",
  U: "~@4 a4@2 d4 ~ [f4,a4]@4 d4@3 ~, d4@4 ~@4 d4 ~@7, ~ f4@2 ~@5", // F
  V: "[g4,b4]@3 ~ [g4,b4]@3 ~ [a4,c5]@3 ~ [b4,d5]@3 ~, d4 ~@15", W: "[c4,c6]@7 ~ [e4,e6]@4 [g4,g6]@3 ~",
  X: "[g4,g6]@2 [a4,a6] [f4,f6]@4 [e4,e6]", // G A F E
  Y: "[[d4,d6] ~ [d4,d6] ~ [d4,d6] ~ [d4,d6]@2 [e4,e6]@2 [f4,f6]@4 [e4,e6]@8 ~@10]/2", // D E F E
  Z: "~@2 e4@2 ~@4 c5@7 ~, c3, ~@4 g4@11 ~, ~@6 e4@9 ~", AA: "~ c4 ~@2 a4@4, f3, ~ f4@3, ~@3 c4@5",
  AB: "~@2 d4@2 ~@4 b4@7 ~, g3, ~ g4@3, ~@3 d4@5", AC: "~ e4 ~@2 c5@4, c3@15 ~, ~@4 g4@11 ~, ~@3 e4@5",
  AD: "~@2 c4@2 ~@4 a4@7 ~, a3@15 ~, ~@4 e4@11 ~, ~@3 c4@5", AE: "~@2 d4@2 ~@4 a4@7 ~, d3, ~@4 f4@11 ~, ~@6 d4@9 ~",
  AF: "~ c4 ~ c4 a4@4, f3, ~ f4@3", AG: "g3@15 ~",
  AH: "[[d4,d5] ~ [d4,d5] ~ [d4,d5] ~ [d4,d5]@2 [e4,e5]@2 [f4,f5]@4 ~@4 e3@2 ~@8 [d4,d5]@3 ~, g2@16 c2@15 ~, ~@2 d3@2 g3@12 ~@4 g3@11 ~, ~@3 d3@5 ~@3 e3@5, ~@4 b3@3 [e4,e5]@5 c4@4]/2", // D E F D E
  AI: "[~@2 c3@2 [f3,a3]@2 ~ c3@2 ~ [g2,d3,g3,b3]@10 ~ c4@8 e4@3, f2@9 ~@23]/2", // F G
  AJ: "[~@2 g4@3 ~@2 g4@5 a4@2 f4@11 ~ c5@2 a4@2 g4@3 e4@2 ~ e4@14 ~@14, ~@35 [c3,g3,c4]@15 ~@14]/4", // C5
})).s("gm_piano").gain(0.56)

// bass · electric bass finger · "bajo"
const bass = note(`<
  ~@16 A B C D E F G H I J K L M N K O P Q R S E T U V W J K L M N K O P Q R S E T U V X Y Z AA@2 ~@8
>`.pickRestart({
  A: "~@4 g1@4 a1@3 ~ b1@4", B: "c2@15 g1", C: "f1", D: "g1", E: "c1@8 c2@4 b1@3 ~", F: "a1", G: "d2@13 ~ d1 e1",
  H: "f1@15 ~", I: "g1@13 ~@3", J: "f1@6 ~ f1 f1@8", K: "e1@6 ~ e1 a1@7 ~", L: "d2@7 d2 g1@6 ~@2",
  M: "c2@3 ~ c2@3 ~ d2@3 ~ e2@3 ~", N: "f1@6 ~ f1 f1@7 ~", O: "d2@6 ~ d2 d2@7 ~", P: "g2@4 g1@3 ~ a1@3 ~ b1@3 ~",
  Q: "c2@14 ~ c2", R: "f1@14 ~ f1", S: "g1@14 ~ g1", T: "a1@14 ~ a1", U: "d1@11 ~ d1@2 e1@2", V: "f1@13 ~@2 f1",
  W: "g1@8 g1@3 ~ g1 g1@2 ~", X: "~@4 [b2,b3]@3 ~ [c3,c4]@3 ~ [d3,d4]@2 ~@2, g1 ~", Y: "c3@7 ~ e3@4 g3@3 ~",
  Z: "g3@2 a3 f3@4 e3", AA: "[d3 ~ d3 ~ d3 ~ d3@2 e3@2 f3@4 e3@14 ~@4]/2",
})).s("gm_electric_bass_finger").gain(0.33)

// chords · string ensemble 1 · "cuerdas"
const string_ensemble_1 = note(`<
  ~ A B C@2 D E F G A B C@2 D E F G H I J@2 K L M N O P Q R S T U V W X Y@2 Z AA AB AC O P Q R S T U V AD AE AF@2 AG AH
  AI AJ A B C@2 D AK AL@6
>`.pickRestart({
  A: "[c2,e4,c5], g4@7 ~", B: "[f2,f4,a4], c4@7 ~", C: "[[g2,d4] [c2,e4], g4@31 ~, b4@7 ~ c5@7 ~]/2",
  D: "[a2,c4,a4], e4@7 ~", E: "[d2,c4,d4,f4,a4]@15 ~", F: "[f2,c4,f4,a4]", G: "~ [g3,b3] [a3,c4] [b3,d4], g2",
  H: "c3@2 e3 g3, [c2,e4,c5], g4@7 ~", I: "g3@2 f3 e3 f3@2 c4@2, [f2,f4,a4], c4@3 ~",
  J: "[[g2,b3,d4]@4 [c4,e4]@2 g3 [f3,d4], g4@31 ~, b4@7 ~ c2@8, ~@8 c5@7 ~, ~@24 e4@7 ~]/2", // G C Dm
  K: "[a2,c4,a4], e4@7 ~, e3@7 ~@9", L: "~@6 a3 b3, [d2,c4,d4,f4,a4]@15 ~", M: "~@2 d4 c4, [f2,f4,a4], c4@3 ~",
  N: "[d4,g4,b4]@15 ~", O: "c6 b5", P: "d6@8 c6@7 ~", Q: "d6@3 a6", R: "g6@3 ~ e6@4 f6@4 g6@3 ~", S: "a6@8 g6@7 ~",
  T: "g6@4 a6 a5 b5 c6", U: "d6@2 e6 f6", V: "g6@13 ~@3", W: "c6@7 ~ e6@4 g6@3 ~, [c3,g3,c4,e4]",
  X: "g6@2 a6 f6@4 e6, [f2,f3,a3,c4]", // F
  Y: "[d6 ~ d6 ~ d6 ~ d6@2 e6@2 f6@4 ~@2 [c4,e4]@7 ~ [c4,e4]@4 d4@4, g3@23 ~ g3@8, [g2,b3,d4] c2, ~@7 e6@4 ~@5]/2", // C G
  Z: "~ a2@3, [a3,c4,e4]@7 ~", AA: "[d2,d3,f3,a3]", AB: "[f2,c3,f3,a3]", AC: "[g2,d3,g3,b3]",
  AD: "c6@2 e6 c6, [c3,g3,c4,e4]", AE: "g6@2 f6 e6 f6@2 c7@2, [f2,f3,a3,c4]",
  AF: "[b6@6 a6@2 g6@4 f6@4 [c4,e4,e6]@7 ~ [c4,e4,c6,e6]@4 [d4,b5,d6]@4, g3@23 ~ g3@8, [g2,b3,d4] c2]/2", // C G
  AG: "~ a2@3, [a3,c4,e4,e5,a5,c6]@15 ~", AH: "[d2,d3,f3,a3,d5,f5,a5]", AI: "[f2,c3,f3,a3,c5,f5,a5]",
  AJ: "[g2,d3,g3,b3], [d5,g5,b5]@3 ~@13", AK: "[d2,c4,d4,f4,a4]",
  AL: "[[f2,f4,a4]@9 [g2,d4,g4,b4]@11 ~ [c3,g3,c4,e4]@17 ~ [f2,f3]@28 [c2,g3,c4,e4]@20 ~@9, c4@4 ~@15 [a3,c4,e4]@14 ~@15]/6", // F G C F C Am
})).s("gm_string_ensemble_1").gain(0.16)

// chords · string ensemble 2 · "softs"
const string_ensemble_2 = note(`<
  ~@9 A B@3 C@3 D A E F@2 C@3 G H@2 I J K L M N ~@3 O P Q E R H@2 I J K L M N ~@3 O P Q E R ~@5 S@3 ~@4
>`.pickRestart({
  A: "[g4,c5,e5]", B: "[[f4,a4,c5]@15 [g4,b4,d5]@16 [g4,c5,e5]@17]/3",
  C: "[[a4,c5,e5]@15 [d4,f4,a4]@16 [f4,a4,c5]@17]/3", D: "~@3 [g4,b4]@5 [a4,c5]@4 [b4,d5]@4", E: "[f4,a4,c5]",
  F: "[[g4,b4,d5]@15 [g4,c5,e5]@17]/2", G: "[d4,g4,b4]", H: "[[c4,f4,a4] [d4,g4,b4]@2 [e4,a4,c5]]/2",
  I: "[d4,f4,a4] [d4,g4,b4]", J: "[c4,e4]@2 [d4,f4] [e4,g4]", K: "[c4,f4,a4] [d4,g4,b4]", L: "[e4,g4,b4] [e4,a4,c5]",
  M: "[d4,f4,a4] [c4,d4,f4,a4]", N: "[b3,d4,g4] [b3,d4] [c4,e4] [d4,f4]", O: "~@2 e5 d5", P: "[e4,a4,c5]",
  Q: "[a4,d5,f5]", R: "[g4,b4,d5]", S: "[~@15 [c4,f4,a4]@9 [d4,g4,b4]@13 ~@11]/3",
})).s("gm_string_ensemble_2").gain(0.13)

// other · pad new age · "fantasy"
const pad_new_age = note("<~ A B C@2 D E F@2 ~@47 G A B H@2 ~@8>".pickRestart({
  A: "c5@7 ~ e5@4 g5@3 ~", B: "g5@2 a5 f5@4 e5", C: "[d5 ~ d5 ~ d5 ~ d5@2 e5@2 f5@4 e5@10 e5@4 d5@3 ~]/2",
  D: "c5@5 ~ c5@2 d5@2 e5@6", E: "d5@4 e5@2 ~@6 g4@2 a4 ~, ~@3 d5@4 ~",
  F: "[c5 ~ c5 ~ c5 ~ c5 ~ d5@2 e5@4 ~@6 [g4,b4,g5]@4 [a4,c5,g5]@3 ~ [b4,d5,g5]@3 ~, ~@14 d5@11 ~@7]/2", // G Am7 G
  G: "~@4 b4@3 ~ c5@3 ~ d5@2 ~@2", H: "[d5 ~ d5 ~ d5 ~ d5@2 e5@2 f5@4 e5@14 ~@4]/2",
})).s("gm_pad_new_age").gain(0.36)

// drums · kick
const kick = s("bd").struct("<~@17 [x ~@14 x]!8 [x ~@7 x ~@6 x]!8 [x ~@14 x]!8 [x ~@7 x ~@6 x]!15 x ~@12>").gain(0.55)

// drums · snare
const snare = s("sd").struct(`<
  ~@24
  [~@7 x!3 ~ x ~ x!2 ~]
  [~ x ~ x]!8
  ~@7
  [~@7 x!3 ~ x ~ x!2 ~]
  [~ x ~ x]!15
  [~ x!3]
  ~@12
>`).gain(0.49)

// drums · hihat
const hihat = s("hh").struct("<[x!4] ~@8 [x!4]!16 [x!16]!8 [x!4]!8 [x!16]!15 x ~@12>").gain(0.33)

// drums · open hat
const open_hat = s("oh").struct("<~@56 [~ x!3] ~@12>").gain(0.38)

// drums · crash
const crash = s("cr").struct("<~@56 x ~@12>").gain(0.44)

stack(piano, bass, string_ensemble_1, string_ensemble_2, pad_new_age, kick, snare, hihat, open_hat, crash)