Strudelify

Due (Due)

Raf

KeyD majorTempo105 bpm
0:00/0:00
// Due (Due) — Raf
// 105 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 117 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(105/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 D A E C F A E C D A E C G A E C G A B C D E H E I J K L M N O P Q R S T@2 U@2 V W X Y Z AA@2 A B C G A E C G A B
  C AB@2 H E AC J K L M N O P Q R AD T@2 V AE AF AG AH Q AI AJ AK@2 U@2 V W E H E AL@3 E AM AN AO AN AP J AQ AN AR AS AT
  AN AU J AQ AV@4
>`.pickRestart({
  A: "[f#3,a3,d4]", B: "[g3,b3,d4]@10 [f#3,d4]@3 [g3,d4]@3", C: "[a3,d4]", D: "[a3,b3,d4]", E: "[g3,b3,d4]",
  F: "[f#3,b3,d4]", G: "[f#3,b3,d4]@3 [f3,a3,d4]", H: "[a3,d4,e4]", I: "[f#3,a3,c#4]@3 d5 c#5 a4 e4 f#4",
  J: "[g3,b3,d4,b4]", K: "[a3,d4,e4,a4]", L: "[b3,d4,f#4] [a3,d4,e4,a4]",
  M: "[b3,d4,f#4,b4]@2 [a3,e4,a4,d5] [a3,e4,a4,c#5]", N: "[b3,d4,f#4]@6 g4@6 f#4@3 ~", O: "[a3,e4]@6 d4@9 ~",
  P: "[g3,b3,d4]@15 ~", Q: "[a3,d4,e4]@2 f#4 [c4,e4]", R: "[g3,b3,f#4]@3 g4@3 f#4@2", S: "[a3,e4]@3 d4@2 c#4 a3@2",
  T: "[[f#3,a3,d4]@14 [a3,c#4,e4]@10 a3@7 ~]/2", // D A
  U: "[[a3,d4,f#4]@6 [c4,d4,g4,a4]@7 ~ [c4,d4,g4,a4]@7 ~ [c4,d4,g4]@9 ~]/2", V: "[b3,d4,g4]@7 ~ [a3,d4,a4]@8",
  W: "[b3,d4,f#4]@2 [a3,c#4] e4", X: "[b3,d4,f#4]@5 a4@2 d4 e4@7 ~, ~@5 g4 ~@10",
  Y: "c#4@2 [d4,e4] [d4,e4]@3 d4 f#4 e4@4 d4@3 ~, ~ b3@2 ~@5", Z: "[a3,b3,d4]@3 d4 d4@3 ~", AA: "[[a3,c#4,e4]@15 ~]/2",
  AB: "[[a3,d4]@7 d4 [g3,b3,d4]@8, b3 ~, ~@7 a3@8 ~]/2", AC: "[f#3,a3,c#4]@8 e4 a4 f#4@2 d4@2 c#4@2",
  AD: "e4@3 d4@5, a3@13 ~@3", AE: "[b3,d4,f#4]@2 [a3,e4,a4,d5] [a3,e4,a4,c#5]",
  AF: "[b3,d4,f#4]@3 [f#4,b4,d5]@3 ~ [f#4,b4,d5]", AG: "[e4,a4]@6 [d4,a4]@9 ~", AH: "[b3,d4,g4]@15 ~",
  AI: "~@2 b4@3 ~ d5@4 b4@2 b4@4, f#4@5 ~@3, ~ a4@8 ~@7", AJ: "[e4,a4]@6 [d4,a4]@4 ~@3 [d4,a4]@3",
  AK: "[[a3,d4,f#4]@14 [a3,c#4,e4]@10 a3@7 ~]/2", // D A
  AL: "[[a3,c#4]@12 ~@4 [g3,d4]@10 g3@3 ~@3 [a3,d4,e4,a4]@16, f#3 [b3,b4] ~, ~@6 [e4,a4]@4 ~@3 e4@3 ~@8, ~@29 [g3,f#4]@16 ~@3]/3", // A G5 Asus4 B A5 Gmaj7
  AM: "[f#3,a3,c#4]", AN: "[b3,d4,g4]", AO: "[d4,e4,a4]", AP: "[a3,c#4,f#4]@2 [d4,b4] [e4,a4]",
  AQ: "[d4,e4,a4]@13 [d4,e4,a4]@3, a3", AR: "~@3 d5 c#5 a4 f#4@2 [a3,d4]@4 [a3,e4]@3 ~, [a3,c#4] ~, f#4@3 ~@5",
  AS: "[b3,d4,g4]@10 [a3,b3,d4]@3 [a3,b3,d4]@3", AT: "[d4,e4,a4]@10 [a3,d4]@3 [a3,d4]@2 ~", AU: "[a3,c#4,f#4]@2 a5 e5",
  AV: "[[b3,d4,g4]@23 ~@6 d5@2 c#5@2 ~ a4@2 ~@2 e4@2 f#4@10 ~@14, ~@3 [a3,c#4]@2 ~@3, ~@6 f#4@3 f#4 ~@6]/4", // G A
})).s("gm_piano").gain(0.32).pan(0.2)

// bass · synth bass 2
const bass = note(`<
  A B C D E B F G H B F D I B F J K L M N O P Q R S T U V W X Y Z AA AB AC AD AC AB AE AF AG@2 AH AI AJ AK AL AM@2 AN B
  F AO K L M AP AQ P Q AR S T U V W X Y Z AA AB AC AD AC AB AE AS AH AT AA AB AC AU AC AB AV AW AX@2 AH AI S AY U AZ W
  BA BB BC BD BE AC BF AA BG AC BH BD BE AC BF AA BI BJ@4
>`.pickRestart({
  A: "d1@3 d1@3 a1@2", B: "e1", C: "f#1@3 d2", D: "g1@9 ~ g1@6", E: "a1@3 d2@3 a1@2", F: "f#1",
  G: "g1@8 ~ g1 d2@2 e2@2 d2@2", H: "d1", I: "a1@3 d2@5", J: "g1@6 g1@3 g1!2 ~ f1@4", K: "d1@4 ~@2 d1@5 ~@5",
  L: "e1@2 ~ e1@2 ~ e1 f1", M: "f#1@5 ~ f#1@4 ~@6", N: "g1@2 ~ g1@2 e1 f1@2", O: "d2@6 d1@3 ~ e1@2 f#1@2 d1@2",
  P: "e1@4 ~@2 e1@3 ~@3 e1@4", Q: "f#1@5 ~ f#1@4 ~@4 f#1 ~", R: "g1@5 ~@3 d2@2 g2@2 d2@3 ~", S: "g1@5 ~ d1@2 g1@3 ~@5",
  T: "f#1 ~@2 d1 f#1 ~ d2@2", U: "e1@5 ~ e1@2 e1@3 ~@5", V: "b1@4 ~@2 b2@4 a2@2 e2@3 ~", W: "g1@4 ~@2 d1@2 g1@3 ~@5",
  X: "f#1@3 ~@3 d1@2 f#1@2 ~@2 d2@3 ~", Y: "e1@8 f#1@5 ~ f#1 ~", Z: "g1 ~ g2 ~ g2 ~ g1@2 a2@8",
  AA: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~", AB: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1!2",
  AC: "e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~", AD: "a1@4 a1 ~ a1 ~ a1@3 ~ a1@4",
  AE: "b1 ~ b1 ~ b1 ~ b1 ~ b1@2 f#1@2 a1@2 b1 ~", AF: "b1 ~ b1@2 a1 f#1 e1@2 g1@2 e1@2 f#1@2 a1@2",
  AG: "[g1@2 g1 ~@3 a1@8 c1@7 ~ d1@4 a1@2 d2@4]/2", AH: "e1 ~ e1 ~ e1 ~ e1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~",
  AI: "g1 ~ g1 ~ g1 ~ g1!2 a1 ~ a1 ~ a1@4", AJ: "g1 ~ g1 ~@3 g1@9 ~", AK: "b1@6 e2@4 d3@5 ~",
  AL: "g1@5 ~ g1@4 g1@2 a1@2 a#1@2", AM: "[b0@15 ~]/2", AN: "d1@3 d2@5", AO: "g1@3 f1", AP: "g1@4 ~@2 g1@4 g1 ~ f1@4",
  AQ: "d2@6 d1@3 ~ a1@2 d2@4", AR: "g1@5 ~ g1@4 g2@2 g2@4", AS: "b1 ~ b1@2 b1 ~ b1@2 g1@2 e1@2 f#1@2 a1@2",
  AT: "g1 ~ g1 ~ g1 ~ g1!2 a1@4 a2@4", AU: "a1 ~ a1 ~ a1 ~ a1 ~ a1@3 ~ a1@4",
  AV: "b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1!2", AW: "b1 ~ b1@2 b1 ~ b1 ~ b1 a1 f#1@2 e1@2 f#1@2",
  AX: "[g1@5 ~ a1@8 c1@7 ~ d1@4 a1@2 d2@4]/2", AY: "f#1@2 ~@5 f#1 f#1@2 a1@2 d2@2 f#1@2",
  AZ: "b1@4 ~@3 d2!2 c#2 b1 a1 a1@4", BA: "f#1@5 ~@3 d2@2 a1@2 f#1@3 ~", BB: "e1@5 ~ e1 ~ e1@8",
  BC: "b1@4 ~@2 f#1!2 b1!2 f#1 ~ a1@2 f#1 ~", BD: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ b1@2 d2@2",
  BE: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ a1@2 d2@2", BF: "b1 ~ b1 ~ b1 ~ f#1!2 b1!3 ~ f#1@2 b1@2",
  BG: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ a1 d2", BH: "b1 ~ b1 ~ b1 ~ a1 ~ b1@4 b1@4",
  BI: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~", BJ: "[e1@23 ~ b1@37 ~@3]/4",
})).s("gm_synth_bass_2").gain(0.56)

// other · electric guitar muted
const electric_guitar_muted = note("<~@52 A B C D E D C D E ~@56>".pickRestart({
  A: "~@15 a3", B: "~@7 a3 ~ a3!2 ~@5", C: "~@4 g3 ~@2 g3 ~ g3!2 ~@5", D: "~@2 a3 ~ a3 ~@2 a3 ~ a3!2 ~@5",
  E: "~@4 b3 ~@2 b3 ~ b3!2 ~@5",
})).s("gm_electric_guitar_muted").gain(0.4)

// other · pad new age
const pad_new_age = note(`<
  ~@31 A B C D@2 B C E@2 F@2 G H I J I K@2 ~@19 A B C D@2 B C L@2 G M B C D@2 B C E@2 F@2 G H ~@7 A B C N@2 B C N@2 B C
  N@2 B C O@4
>`.pickRestart({
  A: "~@2 d5 e5", B: "f#5@3 g5@3 f#5@2", C: "e5@3 d5@3 a4@2", D: "[b4@3 d5@2 b4@2 a4@5 d5@2 e5@2]/2",
  E: "[b4@3 d5@2 e5@2 c#5@5 d5@2 e5@2]/2", F: "[f#5@3 g5@4 a5@4 g5@5]/2", G: "g5 a5", H: "b5@2 a5!2", I: "f#5@3 b5",
  J: "f#5@3 a5", K: "c#6/2", L: "[b4@3 d5@3 e5 c#5@5 e5@2 f#5@2]/2", M: "b5@2 d5 e5",
  N: "[b4@3 d5@2 e5@2 e5@5 d5@2 e5@2]/2", O: "[b4@8 ~ d5@5 e5@6 e5@41 ~@3]/4",
})).s("gm_pad_new_age").gain(0.36).pan(0.4)

// other · woodblock
const woodblock = note("<~@24 A B C D A E F G ~@29 A B C D A E F G ~@22 A B C D A B C D ~@18>".pickRestart({
  A: "b5 ~@11 b5 ~@3", B: "a5 ~@11 a5 ~@3", C: "g5 ~@15", D: "f#5 ~@15", E: "a5 ~@15", F: "f#5 ~@7 a5 ~@7",
  G: "b5 ~@15",
})).s("gm_woodblock").gain(0.48).pan(1)

// chords · epiano2
const epiano2 = note(`<
  A B C D@2 E C F G B C H@2 E I J G K C J L B M F N M B O N M P Q N R S T U V W@2 X@2 Y Z AA AB AC AD@2 AE B C J G K C J
  L B M F N M B O N M P Q N R S T U V AF@2 Y Q N R S T U V W@2 X@2 Y Z N M B O N M B O N AG AH AI N AG AH AI N AG AH AI
  N AG AJ@4
>`.pickRestart({
  A: "[f#3,a3,d4]@3 a3", B: "[g3,b3,d4]", C: "[a3,d4]", D: "[[a3,b3,d4]@15 ~ [f#3,a3]@12 a3@4, ~@15 d4@13 ~@4]/2",
  E: "[g3,b3,d4]@10 [f#3,d4]@3 [g3,d4]@3", F: "[f#3,b3,d4]", G: "[f#3,a3,d4]",
  H: "[[a3,b3,d4]@15 ~ [f#3,a3]@16, ~@15 d4@16 ~]/2", I: "[a3,e4]", J: "[f#3,b3,d4]@3 [f3,b3,d4]",
  K: "b3@3 b3, [g3,d4]", L: "a3@3 a3, [f#3,d4]", M: "[a3,d4,e4]", N: "[b3,d4,f#4]", O: "[f#3,a3,c#4,d4]",
  P: "[g3,b3,d4] [a3,d4,e4]", Q: "[b3,d4,f#4]@2 [a3,d4,e4,a4] [c#4,e4,a4]", R: "[a3,e4]@6 d4@9 ~", S: "[a3,b3,d4]@15 ~",
  T: "[a3,d4,e4]@2 f#4 [c4,e4]", U: "[g3,b3,d4]@15 ~", V: "[a3,e4,a4]@6 d4@9 ~",
  W: "[[b3,d4,f#4]@7 [a3,c#4,e4]@5 f#4@2 e4@2, ~@3 a3]/2", // Bm A
  X: "[[f#3,a3,d4]@3 [g3,c4,d4]@4 [a3,c4,d4]@4 [a3,c4,d4]@5]/2", Y: "[b3,d4,g4] [d4,f#4,a4]",
  Z: "b3@3 b3 c#4 d4 [e4,a4]@2, [d4,f#4] ~", AA: "~@3 b4, [b3,d4,f#4]", AB: "~@3 a4, [a3,c#4,f#4]@15 ~",
  AC: "[a3,b3,d4,f#4]@3 [b3,b4]", AD: "[[a3,c#4,e4,c#5]@15 ~]/2", AE: "d4@3 d4, [f#3,a3]",
  AF: "[[b3,d4,f#4]@7 [a3,c#4,e4]@5 e4@2 f#4@2, ~@3 a3]/2", AG: "e4@6 d4@9 ~, [a3,a4]", AH: "[b3,d4,g4]@15 ~",
  AI: "c#4@2 d4 e4, a3, f#4@3 ~", AJ: "[[b3,d4,g4]@22 ~@2 [a3,c#4,f#4]@37 ~@3]/4",
})).s("gm_epiano2").gain(0.48).pan(0.9)

// chords · synth strings 1
const synth_strings_1 = note(`<
  A B A B C D E F A B A B C D E G C D E G C D E F H I D J H I K L H I M@2 H I N@2 O@2 P Q H R S T@2 C D E G C D E G C D
  E F H I D J H I K L H I M@2 H I N@2 P U H I M@2 H I N@2 O@2 P Q H V D W H V D J H I D X H I D X H I D X H I Y@4
>`.pickRestart({
  A: "[f#3,a3,d4]", B: "[g3,b3,d4]", C: "[a3,d4,f#4]", D: "[b3,d4,g4]", E: "[d4,e4,a4]", F: "[d4,f#4,b4]",
  G: "[f#4,b4]@3 [f4,a4], d4", H: "[b3,d4,f#4,b4]", I: "[a3,d4,e4,a4]", J: "[a3,c#4,f#4]",
  K: "[b3,d4,f#4] [a3,d4,e4,a4]", L: "[b3,d4,f#4,b4]@2 [d4,e4,b4] [c#4,e4,a4]",
  M: "[b4@5 b4@2 ~ e4@4 f#4@2 [c4,e4]@2, [d4,g4] a3, ~@7 a4@9, ~@4 d4@3 ~]/2", // C G5
  N: "[[a3,d4,f#4,a4]@7 [a3,c#4,e4,a4]@5 [a3,d4,f#4,a4]@2 [c#4,e4,a4]@2]/2", // D A D A
  O: "[[d4,f#4,a4]@3 [c4,d4,g4,a4]@4 [d4,g4,a4,c5]@4 [c4,d4,g4,a4]@5]/2", P: "[b3,e4,g4,b4] [a3,d4,f#4,a4]",
  Q: "[b3,d4,b4]@2 ~ e4, f#4@3 ~, ~ [a3,c#4,a4]", R: "[a3,c#4,f#4,a4]", S: "[b3,d4,f#4]", T: "[[a3,c#4,e4]@15 ~]/2",
  U: "[b3,d4,b4]@2 [b3,d4,b4] [a3,c#4,e4,a4], f#4@3 ~", V: "a4@3 f#4, [a3,d4,e4]", W: "[c#4,f#4]@3 [e4,a4], a3",
  X: "[c#4,f#4]@2 f#4 e4, a3", Y: "[[b3,d4,g4]@23 ~ [a3,c#4,f#4]@37 ~@3]/4",
})).s("gm_synth_strings_1").gain(0.25)

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

// drums · rim
const rim = s("rim").struct("<[~ x ~ x]!16 ~@31 [~ x ~ x]!6 ~@64>").gain(0.64)

// drums · snare
const snare = s("sd").struct("<~@16 A@25 B A@5 ~@6 A@15 C A@9 B A@9 B A B A@15 B A@6 ~@4>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x!2 ~@2", C: "~ x ~@2",
})).gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@31 [~@7 x] ~@36 [~@10 x!2 ~@2 x ~] ~@37 [~@14 x!2] ~@10>").gain(0.4)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@31 A ~@36 B ~@21 C ~@15 D ~@10>".pickRestart({
  A: "~@12 x!2 ~@2", B: "~@6 x!2 ~@4 x!2 ~@2", C: "~@10 x!2 ~@4", D: "~@5 x ~@2",
})).gain(0.48)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A@2 B ~ A@2 B ~ C@2 D C@2 A B ~ E ~@3 E ~ F ~ E ~ E ~@15 G ~@2 F H I C J ~ K ~ E ~ L E@2 ~ F E ~@2 M ~@13 N ~@3 N
  ~@5 N ~ O E ~@6 P ~@15 Q ~@2
>`.pickRestart({
  A: "x", B: "x ~@6 x", C: "~ x", D: "~@4 x ~@2 x", E: "~@7 x", F: "~@15 x", G: "~@5 x!2 ~", H: "~@3 x!2 ~ x ~",
  I: "x!4", J: "~@4 x!2 ~@2", K: "~@8 x ~@6 x", L: "~@14 x!2", M: "~@10 x ~@4 x", N: "~@5 x ~@2", O: "~ x!2 ~",
  P: "~@5 x!3", Q: "~@6 x!4 ~@6",
})).gain(0.32)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@46 A@2 B ~@3 A ~@11 A ~@49 C ~@2>".pickRestart({
  A: "~@7 x", B: "~@11 x ~@4", C: "~@5 x ~@10",
})).gain(0.16)

// drums · high tom
const high_tom = s("ht").struct("<~@31 A ~@9 B ~@26 C ~@9 B ~@9 B ~ B ~@26>".pickRestart({
  A: "~@4 x!2 ~@2", B: "~@7 x", C: "~@8 x!2 ~@6",
})).gain(0.56)

// drums · crash
const crash = s("cr").struct(`<
  A ~@7 A ~@7 A ~@3 A ~@3 A ~@3 A ~ B A@2 ~@2 C A ~@2 C D E B A@2 ~@8 A ~@3 A ~@3 A ~@3 A ~ B A@2 ~@2 C A ~@2 C B@2 A
  ~@2 C A ~@3 D F B A@2 ~@3 A ~@3 A ~@3 A ~@3 A ~@2 C A C A G ~@2
>`.pickRestart({
  A: "x", B: "x!2", C: "~@3 x", D: "x ~@2 x ~@3 x", E: "~@3 x ~@4", F: "~@6 x ~@8 x", G: "~@9 x ~@6",
})).gain(0.4)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<[x!16]!78 [x!15 ~] [x!16]!34 x ~@3>").gain(1.22)

stack(
  piano, bass, electric_guitar_muted, pad_new_age, woodblock, epiano2, synth_strings_1, kick, rim, snare, low_tom,
  hihat, mid_tom, open_hat, open_hat_soft, high_tom, crash, cabasa
)

More by Raf