Strudelify

Rosita

Andre Moss

KeyC majorTempo120 bpm
0:00/0:00
// Rosita — Andre Moss
// 120 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 116 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 ~@44 E F G D ~@44 H I@2 J@2 ~@3 K L@2 M@2 ~@6>".pickRestart({
  A: "~ [c3,g3,c4,e4], ~@8 a3 ~@7", B: "[a3,c4,f4]@8 [a3,c4,f4,a4]@7 ~, f3@13 ~@3",
  C: "[[g3,b3,d4,f4,g4]@18 ~@2 [g3,c4,e4]@4 [a3,c4,f4]@5 ~ [f3,g3,b3]@2]/2", D: "[c3,e3,g3,c4]",
  E: "~@4 [c3,g3,c4,e4]@4 [a3,c4,f4]@5 ~ [a3,c4,f4,a4]@2, ~ f3", F: "[g3,b3,d4,g4], f#4 ~@15",
  G: "~@2 [g3,c4,e4]@2 [a3,c4,f4]@2 ~ [g3,b3], ~@8 f3@6 f3 ~", // C F G
  H: "~@4 [c3,g3,c4,e4]@4 [a3,c4,f4]@5 ~ [a3,c4,f4,a4]@2, ~ f3, ~@8 d#4 ~@7", // C F
  I: "[[b3,d4,g4]@19 ~ [g3,c4,e4]@4 [a3,c4,f4]@4 ~@2 [f3,g3,b3]@2, g3@17 ~@7 f3@6 ~@2]/2", // G C F G7
  J: "[[c3,e3,g3,c4]@5 ~@3, d3 ~@31]/2", K: "~@4 [c3,g3,c4,e4]@4 [a3,c4,f4]@5 ~ [a3,f4,a4]@2, ~ f3, ~@14 [c4,d4] ~",
  L: "[[b3,d4,g4]@19 ~ [g3,b3,e4]@3 ~ [g3,b3,d4,f4]@5 ~ [f3,g3,b3]@2, g3@15 ~@5 d#4 ~@3 e4 ~@5 a#3 ~]/2", // G Em G7
  M: "[[c3,e3,g3,c4]@19 ~@13]/2", // C
})).s("gm_piano").gain(0.4).pan(0.3)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@2 A B C D E B C D F D C D F D G B H B G B H B C D F D C D F D G B H B G B H B C D H B I D H B C J H B C D E B C D F
  D C D F D G B H B G B H B C D F D C D F D G B H B G B H B C D K B L D H B C J H B C D E B C J H B C D E B C D F M
>`.pickRestart({
  A: "~@3 [d4,g4] ~@2 [d4,g4] ~@2 d3 [e3,d4,g4] ~@2 [d4,g4] e3 ~, ~@6 g3 ~", // G5 Em7 G5
  B: "[d4,g4]@2 ~ [d4,g4] ~@2 [d4,g4] ~@3 [d4,g4] ~@2 [d4,g4] ~@2", // G5
  C: "[g3,c4]@2 ~ [g3,c4] ~@2 [g3,c4] ~@2 g2 [a2,g3,c4] ~@2 [g3,c4] g2 ~, ~@6 c3 ~", // C5 Am7 C5
  D: "[g3,c4]@2 ~ [g3,c4] ~@2 [g3,c4] ~@3 [g3,c4] ~@2 [g3,c4] ~@2", // C5
  E: "[c4,f4]@2 ~ [c4,f4] ~@2 [c4,f4] ~@2 c3 [d3,c4,f4] ~@2 [c4,f4] d3 ~, ~@6 f3 ~", // F5 Dm7 F5
  F: "[g3,c4]@2 ~ [g3,c4] ~@2 [g3,c4] ~@2 g2 [a2,g3,c4] ~@2 [g3,c4] a2 ~, ~@6 c3 ~", // C5 Am7 C5
  G: "[d4,g4]@2 ~ [d4,g4] ~@2 [d4,g4] ~@2 d3 [e3,d4,g4] ~@2 [d4,g4] d3 ~, ~@6 g3 ~", // G5 Em7 G5
  H: "[d4,g4]@2 ~ [d4,g4] ~@2 [d4,g4] ~@2 d3 [e3,d4,g4] ~@2 [d4,g4] e3 ~, ~@6 g3 ~", // G5 Em7 G5
  I: "[c4,f4]@2 ~ [c4,f4] ~@2 [c4,f4] ~@2 g2 [a2,g3,c4] ~@2 [g3,c4] g2 ~, ~@6 c3 ~", // F5 Am7 C5
  J: "[g3,c4]@2 ~ [g3,c4] ~@2 [g3,c4] ~@3 [c4,f4] ~@2 [c4,f4] ~@2", // C5 F5
  K: "[g3,c4] ~@2 [d4,g4] ~@2 [d4,g4] ~@2 d3 [e3,d4,g4] ~@2 [d4,g4] e3 ~, ~@6 g3 ~", // C5 G5 Em7 G5
  L: "[g3,c4]@2 ~ [g3,c4] ~@2 [c4,f4] ~@2 g2 [a2,g3,c4] ~@2 [g3,c4] g2 ~, ~@6 c3 ~", M: "[g3,c4] ~@7",
})).s("gm_electric_guitar_clean").gain(0.27).pan(0)

// bass · acoustic bass
const bass = note(`<
  A B C@2 D@2 E C D F D@2 G D@3 C@7 H I J D@5 K C@7 H D@2 C@2 L D C M D N C@2 D F O C D F D@6 C@7 P D F D@6 C@5 Q C P
  D@2 C@2 L D C P D R C@2 D F O C D N C@2 D F S C D@2 F T
>`.pickRestart({
  A: "~@4 c2 ~@3", B: "f2 ~@3 f2 ~@3", C: "g1 ~@2 g1 b1 ~ d2 ~", D: "c2 ~@2 c2 e2 ~ g2 ~",
  E: "[f1,g1] ~@2 f1 a1 ~ c2 ~", F: "c2 ~@2 c2 c3 a2 g2 e2", G: "c2 ~@2 c2 e2 ~ [g2,a2] ~", H: "g1 ~@2 g1!3 a1 b1",
  I: "[c2,d2] ~@2 c2 e2 ~ g2 ~", J: "c2 ~@2 c2 c3 a2 [f2,g2] e2", K: "c2 ~@2 c2!2 ~ c2 ~", L: "f1 ~@2 f1 c2 ~ e2 ~",
  M: "g1 ~@2 b1!2 ~ d2 ~", N: "c2 ~@2 c2 f1 ~ f1 ~", O: "f1 ~@2 f1 a1 ~ c2 ~", P: "g1 ~@2 g1!2 ~ a1 b1",
  Q: "g1 ~@2 g1 b1 ~ [d2,e2] ~", R: "c2 ~@3 f1 ~ f1 ~", S: "f1 ~@2 f1!2 ~ f1 f#1", T: "c2 ~@7",
})).s("gm_acoustic_bass").gain(0.72)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@2 A@8 B@4 C D E@8 F@8 G@8 H@2 I@2 J@2 K@2 L@2 M@2 N@2 O P@3 Q@8 R@6 H@2 S@4 T@5 U@5 V@8 W@2 X@2 Y@2 O Z@3 AA@2 AB AC
  AD AE AF@4
>`.pickRestart({
  A: "[[b3,d4]@31 e4@32 ~ a3@15 ~ [b3,d4]@16 [c4,e4]@32, g3@64 f4@31 ~@33, ~@31 c4@48 ~ g3@48]/8", B: "[g3,c4,e4]/4",
  C: "[c4,e4,g4]", D: "[g3,c4]", E: "[[b3,d4]@31 [b3,d4,g4]@96 ~]/8", F: "[g3,c4,e4]/8", G: "[[g3,b3,d4]@127 ~]/8",
  H: "[g3,c4,e4]/2", I: "[g3,b3,d4]/2", J: "[[a3,f4] [g3,e4]@3, c4]/2", K: "[g4@16 g3@15 ~, [b3,d4]@31 ~, f4 ~@31]/2",
  L: "[[g3,e4]@3 [a3,f4], c4, f4 ~@31]/2", M: "[[b3,d4,g4], e4 ~@31]/2", N: "[[g3,c4,e4]@29 ~@3, d#4 ~@31]/2",
  O: "~@8 c5@7 ~, [c4,f4,a4]", P: "[[d4,b4]@16 [c4,e4]@31 ~, g4@47 ~, a4 ~@47]/3",
  Q: "[[f3,b3,d4] ~@63 g4@16 ~@16 b3@16 [b3,g4]@16, [c4,e4]@3 d4, g3@63 ~@17 g3@31 ~@17]/8", // Bdim Em C
  R: "[[g3,b3]@64 g4@23 ~ g3@7 ~, d4@95 ~, ~@64 b3@31 ~]/6", S: "[[c4,e4], g3@31 ~]/4",
  T: "[[c4,g4]@16 c5@7 ~ c4@8 [b3,d4]@47 ~, e4@2 ~@3, ~ g4@4]/5", U: "[g3,b3,d4]/5",
  V: "[g3@24 ~@8 [b3,d4]@31 ~ a4@8 g4@16 ~@8 [b3,d4]@31 ~, [c4,e4] ~ c4 ~, ~@24 g4@39 f4@8 ~ e4@24 ~@32, ~@64 g4 ~@23 g3@39 ~]/8", // Bm C
  W: "[[g3,e4]@3 [a3,f4], c4]/2", X: "[g4@24 g3@7 ~, [b3,d4]@31 ~]/2", Y: "[[g3,c4,e4]@31 ~]/2",
  Z: "[[d4,b4]@2 [c4,e4]@3 [a3,c4,f4], g4@40 e4 ~@7, a4 ~@47]/3", AA: "[g3@15 ~ g4@15 ~, [b3,d4]@31 ~]/2",
  AB: "[g3,c4,e4]", AC: "[c4,e4,g4]@15 ~", AD: "~@8 c5@7 ~, [c4,f4,a4]@15 ~", AE: "~@8 f4@7 ~, [d4,g4,b4]",
  AF: "[[c4,e4,g4]@27 ~@5]/4", // C
})).s("gm_string_ensemble_1").gain(0.41)

// other · piano
const piano_2 = note(`<
  ~@10 A B C@2 D E F@2 G H I@2 J@2 K@2 L B M@2 N O P@2 Q R S@2 T U V W X Y Z@2 X AA AB@2 ~@8 A B AC@2 AD AE AF@2 AG AH
  AI@2 AJ AK AL@2 AM B AC@2 AD AN AO@2 Q R AP@2 T AK V AQ X AR Z@2 AS@2 AT ~@19
>`.pickRestart({
  A: "e5@3 d#5 e5@3 d#5", B: "e5@2 d5@2 f5@3 e5", C: "[d5@2 e5 d5 c5@19 ~ c5@3 ~ c5@3 ~]/2",
  D: "e5 ~ [e5,f5] ~ e5@2 c5 ~ e5@4 c5@3 ~", E: "e5 ~ e5 e5@2 ~ c5 ~ e5@4 c5@4", F: "[d5@6 c5 b4 a4@21 ~@3]/2",
  G: "d5@5 ~ d5@2 d5@3 ~ c5@4", H: "c5@6 b4@2 c5@2 ~ b4@2 a4@2 ~", I: "[g4@2 ~ f4@20 ~ f4@3 ~ g4@3 ~]/2",
  J: "[a4@2 a4@2 ~@2 g4@2 a4@3 ~ g4@3 b4@8 ~ a4@6 b4@2]/2", K: "[a4@2 b4 a4 g4@26 ~@2]/2", L: "e5@5 ~ d#5@2 e5@6 d#5@2",
  M: "[d5@2 e5 d5 c5@19 ~ c5@4 e5@3 ~]/2", N: "e5 ~ e5 ~ e5@2 c5@2 e5@3 ~ c5@3 ~", O: "e5 ~ e5 e5@2 ~ c5@2 e5@4 c5@3 ~",
  P: "[d5@5 ~ c5 b4 a4@23 ~]/2", Q: "d5@5 ~ d5@2 d5@3 ~ c5@3 ~", R: "c5@5 ~ b4@2 c5@2 ~ b4@2 a4@2 ~",
  S: "[g4@2 ~ f4@18 ~@3 b4@3 ~ c5@3 ~, a4 ~@31]/2", T: "d5@2 d5@2 ~@2 c#5@2 d5@3 ~ c5@3 ~", U: "e5@8 d5@5 ~ e5@2",
  V: "d5@2 e5 d5 c5@12", W: "~@2 c5@2 ~ d5@2 ~ e5@2 ~ [e5,f5] f5 ~ a5@2", X: "g5",
  Y: "~@2 f5@2 g5@2 f5@2 g5@2 ~ f5@2 g5@2 ~", Z: "[f5@6 g5 f5 e5@10 c5@2 ~ d5@2 ~ e5@2 ~ f5@2 a5@2 ~]/2",
  AA: "~@2 f5@2 ~ e5@2 ~ d5@5 ~ d5@2", AB: "[e5@19 ~@13]/2", AC: "[d5@2 e5 d5 c5@19 ~ c5@3 ~ e5@3 ~]/2",
  AD: "e5 ~ e5 ~ e5 ~ c5@2 e5@4 c5@3 ~", AE: "e5 ~ e5 ~ e5 ~ c5@2 e5@4 c5@4", AF: "[d5@6 c5 b4 a4@22 ~@2]/2",
  AG: "d5@6 d5@2 d5@4 c5@3 ~", AH: "c5@5 ~ b4@2 c5@2 ~ b4@2 ~ a4@2", AI: "[g4@2 ~ f4@20 ~ b4@3 ~ c5@3 ~]/2",
  AJ: "d5@2 d5@3 ~ c#5@2 d5@3 ~ c5@3 ~", AK: "e5@4 d5@3 e5", AL: "[d5@2 e5 d5 c5@24 ~@4]/2",
  AM: "e5@6 d#5@2 e5@5 ~ d#5@2", AN: "e5 ~ e5 ~ e5 c5@2 ~ e5@4 c5@4", AO: "[d5@6 c5 b4 a4@23 ~]/2",
  AP: "[g4@2 ~ f4@19 ~@2 b4@3 ~ c5@3 ~]/2", AQ: "~@2 c5@2 ~ d5@2 ~ e5@2 ~ f5@2 a5@2 ~",
  AR: "~ f5@2 ~ g5@2 f5@2 g5@2 ~ f5@2 g5@2 ~", AS: "[g5@18 f5@2 ~ e5@2 ~ d5@5 ~ d5@2]/2", AT: "e5",
})).s("gm_piano").gain(0.46)

// drums · kick
const kick = s("bd").struct("<[~ x] [x!2] [x ~@2 x!2 ~@3]!113 x>").gain(0.31)

// drums · snare
const snare = s("sd").struct("<[~ x] [x!2] [~@2 x ~@2 x ~@2]!113 ~>").gain(0.46)

// drums · mid tom
const mid_tom = s("mt").struct("<~@9 A ~@35 A ~@11 B ~@15 C ~@23 D ~@3 A ~@3 E ~@3 A ~@4 A ~>".pickRestart({
  A: "~@7 x", B: "~@2 x ~@7 x ~ x!3 ~", C: "~@3 x ~@4", D: "~@4 x!3 ~", E: "~@5 x ~@2",
})).gain(0.51)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~ A ~@3 B ~@3 C ~@15 D ~@15 E ~@3 F ~@3 G ~@3 H ~@2 I J ~@15 K ~@15 L ~@7 M ~@3 F ~@3 N ~@3 F ~@4 D ~
>`.pickRestart({
  A: "~@10 x!3 ~ x ~", B: "~@4 x!4", C: "~@6 x!3 ~ x ~ x ~@3", D: "~@2 x!3 ~ x ~@3 x ~ x ~@3",
  E: "x ~@2 x ~@2 x!3 ~@3 x ~ x ~", F: "~@5 x!2 ~", G: "~@4 x ~ x ~@3 x!3 ~@3", H: "~@5 x ~ x", I: "~@14 x!2",
  J: "x ~@5 x!3 ~@7", K: "~@2 x!3 ~@5 x ~ x!3 ~", L: "x ~@2 x ~@3 x!2 ~@2 x!2 ~@3", M: "~@6 x!2 ~@8", N: "~@6 x!3 ~@7",
})).gain(0.46)

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

// drums · ride
const ride = s("rd").struct("<~ [~@5 x!3] [x ~ x!3 ~ x ~ x ~ x ~ x ~ x ~]!113 x>").gain(0.36)

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

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

stack(
  piano, electric_guitar_clean, bass, string_ensemble_1, piano_2, kick, snare, mid_tom, high_tom, crash, ride, congas,
  congas_2
)