Strudelify
KeyA majorTempo210 bpm
0:00/0:00
// Motika — Johannes Linstead
// 210 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (3/8 at bar 1, 4/4 at bar 1, 1/4 at bar 184) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/6244951; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 185 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(210/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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.

// other · piano
const piano = note(`<
  ~ A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C@2 D@2 C@2 E F ~@32 A@2 B@2 A@2 B@2 C@2 D@2 C@2 E F ~@64 A@2 B@2 A@2 B@2 A@2 B@2
  A@2 G H ~@32
>`.pickRestart({
  A: "[[c#3,c#5]@2 [f3,f5] [g#3,g#5] [b3,b5] [d4,d6]@2 [c#4,c#6]@2 [a3,a5]@2 [f#3,f#5] [a3,a5]@2 [c#4,c#6]@2]/2", // C# F G# B D C# A F# …
  B: "[~ [c#3,c#5] [f3,f5] [g#3,g#5] [b3,b5] [d4,d6]@2 [c#4,c#6]@2 [a3,a5]@2 [f#3,f#5] [e3,e5]@2 [d3,d5]@2]/2", // C# F G# B D C# A F# …
  C: "[c#5@2 f5 g#5 b5 d6@2 c#6@2 a5@2 f#5 a5@2 c#6@2]/2", D: "[~ c#5 f5 g#5 b5 d6@2 c#6@2 a5@2 f#5 e5@2 d5@2]/2",
  E: "a#5 b5 c6 c#6 d6 d#6 e6 f6", F: "f#6 ~@3",
  G: "[f#3,a3,c#4,f#4,a4,c#5]@3 [f#3,a3,c#4,f#4,a4,c#5]@3 [f#3,a3,c#4,f#4,a4,c#5]!2", H: "[a3,c#4,f#4,a4,c#5,f#5] ~@3",
})).s("gm_piano").gain(0.3)

// chords · acoustic guitar nylon · "Acoustic Guitar"
const acoustic_guitar_nylon = note(`<
  ~@24 A ~@8 B C D E B C F G H@2 I@2 H@2 I J K@2 L@2 M@2 N O ~@15 A P Q@2 P@2 Q@2 P@2 Q@2 P@2 Q@2 L R S T@2 U T L V U T
  L M@3 W O ~@8 X Y Z AA AB AC AD AE H@2 I@2 H@2 I J K@2 L@2 M@2 N O ~@16 AF AG AF AG AF AG AF AG AF AG AF AG AF AG AF
  AG AF AG AF AG AF AG AF AG AF AG AF AG AF AG AH A
>`.pickRestart({
  A: "[f#3,a3,c#4,f#4] ~@3", B: "f#4@3 c#4@3 f#4@2", C: "f4 f#4 f4@4 g#4@6 ~@4", D: "g#4@3 c#4@3 g#4@2",
  E: "f#4 g#4 f#4@4 a4@6 ~@4", F: "f4 f#4 f4@4 d4@2 c#4@2 d4@2 f4@2 g#4@2", G: "g#4 f#4@7 ~@8",
  H: "[e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4]!2 [e2,b2,e3,g#3,b3,e4]@2 [e2,b2,e3,g#3,b3,e4]!2", // E
  I: "[a2,e3,a3,c#4,e4]@2 [a2,e3,a3,c#4,e4]!2 [a2,e3,a3,c#4,e4]@2 [a2,e3,a3,c#4,e4]!2", // A
  J: "[a2,e3,a3,c#4,e4]@2 [a2,e3,a3,c#4,e4]!2 [a2,e3,a3,c#4,e4]@2 [a2,e3,a3,c#4,e4]@2", // A
  K: "[c#3,g#3,b3,f4,g#4]@2 [c#3,g#3,b3,f4,g#4]!2 [c#3,g#3,b3,f4,g#4]@2 [c#3,g#3,b3,f4,g#4]!2", // C#7
  L: "[f#3,a3,c#4,f#4]!3 [f#3,a3,c#4,f#4]@2 [f#3,a3,c#4,f#4]!3", // F#m
  M: "[d3,a3,d4,f#4]!3 [d3,a3,d4,f#4]@2 [d3,a3,d4,f#4]!3", N: "[c#3,g#3,b3,f4,g#4]@3 ~@3 [c#3,g#3,b3,f4,g#4]!2",
  O: "[c#3,g#3,b3,f4,g#4] ~@3", P: "~@2 [f#3,a3,c#4,f#4] [f#3,a3,c#4,f#4]@2 ~ [f#3,a3,c#4,f#4] ~",
  Q: "~@2 [c#3,g#3,b3,f4] [c#3,g#3,b3,f4]@2 ~ [c#3,g#3,b3,f4] ~", // C#7
  R: "[e3,g#3,b3,e4]!3 [e3,g#3,b3,e4]@3 [e3,g#3,b3,e4]@2", S: "[d3,a3,d4,f#4]!3 [d3,a3,d4,f#4]@3 [d3,a3,d4,f#4]@2",
  T: "[c#3,g#3,c#4,f4]!3 [c#3,g#3,c#4,f4]@2 [c#3,g#3,c#4,f4]!3", // C#
  U: "[b2,f#3,b3,d4]!3 [b2,f#3,b3,d4]@2 [b2,f#3,b3,d4]!3", // Bm
  V: "[f#3,a#3,c#4,f#4]!3 [f#3,a#3,c#4,f#4]@2 [f#3,a#3,c#4,f#4]!3", // F#
  W: "[c#3,g#3,b3,f4,g#4]@2 ~@4 [c#3,g#3,b3,f4,g#4]!2", X: "d4 f#4@5 c#4@6 f#4@4", Y: "c#4 g#4@3 g#4 [f#4,g4] f4@6 ~@4",
  Z: "c#4 g#4@5 f4@6 g#4@4", AA: "f4 a4@3 a4 [g4,g#4] f#4@6 ~@4", AB: "f#4 a4@5 f#4@6 a4@4",
  AC: "g#4 b4@3 b4 [a4,a#4] g#4@6 ~@4", AD: "b4 a4 ~ g#4 f#4 f4 ~ d4 f4 f#4 ~ g#4 a4 b4 ~ c5", AE: "c#5 ~",
  AF: "[c#3,g#3,c#4,f4]!3 [c#3,g#3,c#4,f4]@3 [c#3,g#3,c#4,f4]!2", // C#
  AG: "[f#3,a3,c#4,f#4]!3 [f#3,a3,c#4,f#4]@3 [f#3,a3,c#4,f#4]!2", // F#m
  AH: "[c#3,g#3,c#4,f4]!2 ~ [c#3,g#3,c#4,f4]!3 ~ [c#3,g#3,c#4,f4]!3 ~ [c#3,g#3,c#4,f4]!3 ~ [c#3,g#3,c#4,f4]", // C#
})).s("gm_acoustic_guitar_nylon").gain(0.25)

// bass · electric bass finger · "Electric Bass"
const bass = note(`<
  ~ A B A ~ A B A ~ C D C E F D C E F D C E F D ~@2 G H@2 I G H@2 I G H@2 I G H@2 I J@2 K@2 J@2 K@2 H@2 L@2 M@2 N A C D
  C E F D C E F D C E F D ~@2 G H@2 I G H@2 I G H@2 I G H@2 I O P H Q R H L S R H T U R V H@2 G H@2 I G H@2 I G H@2 I G
  H@2 I J@2 K@2 J@2 K@2 H@2 L@2 M@2 N A@2 B A ~ A B A ~ C D C E F D C W C D C E F D C D C E F D C D C E F D C D C E F D
  C D C E F D C W
>`.pickRestart({
  A: "c#2 ~@3", B: "~@3 c#2", C: "c#2@2 ~ c#2 f2@2 g#2@2", D: "f#2 ~ c#2 ~", E: "f#2 ~ a2 d3",
  F: "c#3@2 ~ c#2 f2@2 g#2@2", G: "f#1@3 a1@3 a1@2", H: "c#2@3 f2@3 g#2@2", I: "f#2@3 c#2@3 c#2@2",
  J: "e1@3 e1@3 g#1@2", K: "a1@3 c#2@3 e2@2", L: "f#1@3 a1@3 c#2@2", M: "d2@3 f#2@3 a2@2", N: "c#2@3 ~@3 c#2!2",
  O: "e2@3 b1@3 e2@2", P: "d2@3 a1@3 d2@2", Q: "g#2@3 f2@3 c#2@2", R: "b1@3 d2@3 f#2@2", S: "f#1@3 a#1@3 c#2@2",
  T: "c#2@3 f#2@3 g#2@2", U: "a2@3 f#2@3 d2@2", V: "f#2@3 d2@3 f#2@2", W: "f#2 ~@3",
})).s("gm_electric_bass_finger").gain(0.3)

// drums · clap
const clap = s("cp").struct("<~@137 [x!8]!16 ~@32>").gain(0.45)

// drums · crash
const crash = s("cr").struct("<~@5 A B A C ~@16 B@16 ~@32 B@48 ~@20 A B A C ~@40>".pickRestart({
  A: "~ x", B: "x!2", C: "x",
})).gain(0.45)

// drums · cowbell
const cowbell = s("cb").struct("<~@41 A@13 B C B ~@64 A@13 B C B ~@47 B>".pickRestart({
  A: "x!2", B: "x", C: "x ~@5 x!2",
})).gain(0.45)

// drums · bongos
const bongos = s("bongo:18").struct("<~ A B A ~ A B A ~@129 A B A ~ A B A ~@41>".pickRestart({
  A: "x", B: "~@3 x",
})).gain(1.18)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@9 A B A B A B A B A B A B A B A C D B D B E F B F D B D B E F B F G@14 ~@2 A B A B A B A B A B A B A B A C H@21 I H
  I H I H I H I H I D B D B E F B F D B D B E F B F G@14 ~@10 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B ~@2
>`.pickRestart({
  A: "x!6 ~@2", B: "x!6 ~ x", C: "x!2 ~@6", D: "x!4 ~ x!3", E: "x!3 ~ x!4", F: "x!5 ~ x!2", G: "~@2 x!2 ~@2 x!2",
  H: "x!8", I: "x ~@2 x!5",
})).gain(1.44)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~@25 A ~ A ~ B ~@3 A ~ A ~ B ~@3 C@14 D E ~@37 F ~ F ~ F ~ F ~ F ~ F A ~ A ~ B ~@3 A ~ A ~ B ~@3 C@14 D G ~@46 H E
>`.pickRestart({
  A: "~ x", B: "~@3 x ~@4", C: "x!2", D: "x ~@5 x!2", E: "x", F: "~ x!2 ~@5", G: "x ~@11 x!4",
  H: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2",
})).gain(1.44)

// drums · congas
const congas_3 = s("conga:33").struct(`<
  ~@9 A B A B A B A B A B A B A B A ~@2 B ~ B ~ C B C ~ B ~ B ~ C B C ~@16 A B A B A B A B A B A B A B A ~@34 B ~ B ~ C
  B C ~ B ~ B ~ C B C ~@24 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B D ~
>`.pickRestart({
  A: "~@6 x!2", B: "~@3 x", C: "~@5 x ~@2", D: "~ x ~@2 x ~@2 x ~ x ~@2 x ~@2 x",
})).gain(1.44)

// drums · ht
const ht = s("ht").struct(`<
  A B C B D B C B E F@15 B ~@16 B ~@13 G B F@15 H ~@48 B ~@13 G B@2 C B D B C B E F@39 B
>`.pickRestart({
  A: "~@10 x!3 ~@3", B: "x", C: "~@3 x", D: "x!7 ~ x ~ x ~@5", E: "~@3 x ~@4", F: "x!2", G: "x ~@5 x!2",
  H: "x ~@11 x!4",
})).gain(0.45)

// drums · mt
const mt = s("mt").struct("<~@4 A ~@2 B C ~@31 C ~@13 A ~@65 C ~@13 A ~@5 A ~@2 B C ~@40>".pickRestart({
  A: "~@3 x", B: "~@4 x!5 ~ x ~ x ~@3", C: "~@12 x!4",
})).gain(0.45)

// drums · shaker
const shaker = s("sh").struct(`<
  ~ A B A ~ A B A C D@15 A E@16 F@14 G A D@15 A F@32 E@16 F@14 G A ~@16 D@31 A
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~@4 x!8 ~@4", D: "x ~ x!3 ~ x!2", E: "x ~ x!3 ~ x ~", F: "x!4", G: "x ~@5 x!2",
})).gain(0.45)

stack(piano, acoustic_guitar_nylon, bass, clap, crash, cowbell, bongos, congas, congas_2, congas_3, ht, mt, shaker)