Strudelify

Hand in Hand

Dune

KeyD♭ majorTempo168 bpm
0:00/0:00
// Hand in Hand — Dune
// 168 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 160 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(168/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.

// other · music box
const music_box = note(`<
  ~@47 A B C D E F G H A I C J K F L M ~@40 A I C J K F L M A B C D E F G H A I C J K F L M A B C D E F G H A I C J K F
  L M A B C D E F G H A I C J K F L M ~
>`.pickRestart({
  A: "~@8 f6@3 ~ gb6@3 ~", B: "ab6@7 ~ bb6@7 ~", C: "ab6@7 ~ bb6@3 ~ c7@3 ~", D: "db7@7 ~ c7@7 ~",
  E: "bb6@6 ~@2 db7@3 ~ bb6@3 ~", F: "ab6@7 ~ f6@3 ~ gb6@3 ~", G: "ab6@3 ~ bb6@3 ~ f6@3 ~ eb6@4", H: "f6 ~",
  I: "ab6@7 ~ bb6@6 ~@2", J: "db7@7 ~ c7@6 ~@2", K: "bb6@7 ~ db7@3 ~ bb6@3 ~", L: "ab6@3 ~ ab6@3 ~ bb6@3 ~ c7@3 ~",
  M: "db7@15 ~",
})).s("gm_music_box").gain(0.21)

// bass · synth bass 2
const bass = note(`<
  ~@24 A@16 ~@24 A B C D A B A@3 B C D A B A@3 B C D A B A@3 B C D A B A@2 E F G H E F E@3 F G H E F E@2 A B C D A B A@3
  B C D A B A@3 B C D A B A@3 B C D A B A@3 B C D A B A@2 I J K H E F E@2
>`.pickRestart({
  A: "db1@2 ~ ab1 db2!2 ab1@2 db2!2 ab1@2 db2!2 ab1@2", B: "ab1 ~@2 eb1 ab1!2 eb1@2 ab1!2 eb1@2 ab1!2 eb1@2",
  C: "bb1@2 ~ f1 bb1!2 f1@2 bb1!2 f1@2 bb1!2 f1@2", D: "gb1@2 ~ db1 gb1!2 db1@2 gb1!2 db1@2 gb1!2 db1@2", E: "db2 ~@7",
  F: "ab1 ~@7", G: "bb1 ~@7", H: "gb1 ~@7", I: "db2 ~@15", J: "ab1 ~@15", K: "bb1 ~@15",
})).s("gm_synth_bass_2").gain(0.44)

// other · synth bass 1
const synth_bass_1 = note("<~@24 A B@2 C B@2 C D@2 B@2 D B@2 E D ~@104 A B D C D B C D ~@8>".pickRestart({
  A: "~@2 db3@2 ~ db3!3 db4 ~ db4 ~ ab3 ~ db4 ~", B: "ab3 ~ db3@2 ~ db3!3 db4 ~ db4 ~ ab3 ~ db4 ~",
  C: "ab3 ~ db3 ~@3 db3!2 db4 ~ db4 ~ ab3 ~ db4 ~", D: "ab3 ~ db3@2 ~@2 db3!2 db4 ~ db4 ~ ab3 ~ db4 ~",
  E: "ab3 ~ db3@2 ~ db3!3 db4 ~ db4@2 ab3 ~ db4 ~",
})).s("gm_synth_bass_1").gain(0.21).pan(0.7)

// other · synth bass 1 · soft notes
const synth_bass_1_soft = note("<~@27 A ~@2 A@3 ~@2 A ~@3 A ~@106 A@3 ~ A@2 ~@8>".pickRestart({
  A: "~@5 db3 ~@10",
})).s("gm_synth_bass_1").gain(0.12).pan(0.7)

// other · synth bass 1
const synth_bass_1_2 = note(`<
  ~@24 A@3 B A@2 B A@7 C A ~@24 A@3 B A@2 B A@7 C A@4 B A@2 B A@7 C A ~@16 A@3 B A@2 B A@7 C A@4 B A@2 B A@7 C A@4 B A@2
  B A ~@8
>`.pickRestart({
  A: "db3@2 ~ db3!3 db4 ~ db4 ~ ab3 ~ db4 ~ ab3 ~", B: "db3 ~@2 db3!3 db4 ~ db4 ~ ab3 ~ db4 ~ ab3 ~",
  C: "db3@2 ~ db3!3 db4 ~ db4@2 ab3 ~ db4 ~ ab3 ~",
})).s("gm_synth_bass_1").gain(0.29).pan(0.3)

// other · lead 2 sawtooth
const lead_2_sawtooth = note(`<
  A B C D E B F G H B C D E B C I H B C D E B C I ~@16 A B C D E B F G H B C D E B C I H B C D E B C I ~@32 J K L M N K
  O P Q K L M R K L S ~@40 H B C D E B C I
>`.pickRestart({
  A: "~@4 db4 ~@3 db4 ~@5 db4 ~", B: "~@2 db4 ~ eb4 ~@3 eb4 ~@5 eb4 ~", C: "~@2 eb4 ~ f4 ~@3 f4 ~@5 f4 ~",
  D: "~@2 f4 ~ gb4 ~@3 gb4 ~@5 gb4 ~", E: "~@2 gb4 ~ db4 ~@3 db4 ~@5 db4 ~", F: "~@2 eb4 ~ gb4 ~@3 gb4 ~@5 gb4 ~",
  G: "~@2 gb4 ~ f4 ~@3 f4 ~@5 f4 ~", H: "~@2 f4 ~ db4 ~@3 db4 ~@5 db4 ~", I: "~@2 f4 ~ f4 ~@3 f4 ~@5 f4 ~",
  J: "~@4 db4 ~@11", K: "~ db4 eb4 ~@5", L: "~ eb4 f4 ~@5", M: "~ f4 gb4 ~@5", N: "~@2 gb4@2 db4 ~@11",
  O: "~ eb4 gb4 ~@5", P: "~@2 gb4 ~ f4@2 ~@10", Q: "~@2 db4 ~@5", R: "~ gb4 db4 ~@5", S: "~@2 f4 ~ f4 ~@11",
})).s("gm_lead_2_sawtooth").gain(0.2).pan(0.7)

// other · lead 2 sawtooth
const lead_2_sawtooth_2 = note(`<
  A B C D A B D C A B C D A B C@2 A B C D A B C@2 ~@16 A B C D A B D C A B C D A B C@2 A B C D A B C@2 ~@32 E F G H E F
  I J K F G H K F L M ~@40 A B C D A B C@2
>`.pickRestart({
  A: "db4 ~@9 db4 ~@5", B: "eb4 ~@9 eb4 ~@5", C: "f4 ~@9 f4 ~@5", D: "gb4 ~@9 gb4 ~@5", E: "db4 ~@13 db4@2",
  F: "eb4 ~@6 eb4", G: "f4 ~@6 f4", H: "gb4 ~@6 gb4", I: "gb4@2 ~@12 gb4 ~", J: "f4 ~@7", K: "db4 ~@6 db4",
  L: "f4@2 ~@12 f4 ~", M: "f4 ~@15",
})).s("gm_lead_2_sawtooth").gain(0.26).pan(0.3)

// chords · synth strings 1
const synth_strings_1 = note(`<
  A@8 B@2 C@2 B@2 D@2 B@2 C@2 B@2 E@2 ~@16 A@8 B@2 C@2 B@2 D@2 B@2 C@2 B@2 E@2 F@2 G@2 F@2 H@2 F@2 G@2 F@2 H@2 F@2 G@2
  F@2 H@2 F@2 G@2 F@2 H@2 ~@16 F@2 G@2 F@2 H@2 F@2 G@2 F@2 H@2 F@2 G@2 F@2 H@2 F@2 G@2 F@2 H@2 F@2 G@2 F@2 H@2 ~@8
>`.pickRestart({
  A: "db2/8", B: "[[db4,f5]@2 ab3 c5, ab5, db5@3 ~, ~ eb5]/2", C: "[[bb3,f5] [gb3,gb5], [db5,bb5]]/2",
  D: "[db4,ab4,db5,f5]/2", E: "[db3,ab4,db5,f5]/2", F: "[f5@2 ~ c5, ab5, ~ eb5]/2", G: "[db5,bb5]/2", H: "[db5,f5]/2",
})).s("gm_synth_strings_1").gain(0.11)

// drums · kick
const kick = s("bd").struct("<~@32 [x!4]!8 ~@24 [x!4]!32 ~@16 [x!4]!40 x!8>").gain(0.44)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@104 [x ~@5 x ~@4 x ~@4]!7 ~@49>").gain(0.19)

// drums · snare
const snare = s("sd").struct("<~@21 A B@2 ~@5 A B@2 C@8 ~@21 A B@2 ~@29 A B@2 ~@29 A B@2 ~@13 A B@2 ~@16>".pickRestart({
  A: "~@11 x!5", B: "x!16", C: "~@4 x ~@2 x ~@4 x ~@2 x",
})).gain(0.24)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@21 A ~@7 A ~@31 A ~@31 A ~@31 A ~@15 A ~@18>".pickRestart({
  A: "x!11 ~@5",
})).gain(0.1)

// drums · clap
const clap = s("cp").struct(`<
  ~@16 A B A C A B A C ~@8 D E@7 ~@24 A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C ~@16 A B A C A B A
  C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C ~@8
>`.pickRestart({
  A: "x ~@3 x ~ x!3 ~@3 x ~ x!2", B: "x ~@3 x ~ x!3 ~ x ~ x!4", C: "x ~@3 x ~ x ~ x!3 ~ x!4", D: "~@4 x ~@6 x!2 ~@3",
  E: "~@3 x!2 ~@6 x!2 ~@3",
})).gain(0.29)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@24 A@16 ~@24 A@32 ~@8 B@7 C B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D B D ~@8
>`.pickRestart({
  A: "x ~@3 x ~@3 x ~@3 x ~@2 x", B: "x!4", C: "x", D: "x ~@3 x ~@5 x ~ x!2 ~@2",
})).gain(0.34)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@24 A@16 ~@24 A@32 ~@8 B@7 ~ C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D ~@8
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2", C: "~@2 x ~@3 x!2 ~@2 x ~@3 x!2",
  D: "~@2 x ~@3 x ~ x ~@2 x ~@2 x ~",
})).gain(0.34)

// drums · crash
const crash = s("cr").struct("<~@24 A ~@7 B@8 A ~@23 B@32 A ~@15 A ~@14 B@17 A ~@6 B A@8>".pickRestart({
  A: "x", B: "x!4",
})).gain(0.19)

stack(
  music_box, bass, synth_bass_1, synth_bass_1_soft, synth_bass_1_2, lead_2_sawtooth, lead_2_sawtooth_2, synth_strings_1,
  kick, kick_soft, snare, snare_soft, clap, hihat, open_hat, crash
)

More by Dune