Strudelify

Hold Me In Your Arms

Rick Astley

KeyD♭ majorTempo96 bpm
0:00/0:00
// Hold Me In Your Arms — Rick Astley
// 96 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: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 105 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(96/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.

// bass · acoustic bass
const bass = note(`<
  A B C D A E C F G H I J G H I K L M N O A B C P A E C Q G H I J G H R S L T N U L T N V A B C P A E C Q W X Y Z W AA L
  AB AC AD AE AF AG AH AI AJ AK@2 ~ AL@2 AM AN AL AA C AO AL@2 AM AN AL AA C AP AL@2 AM AN AL AA C AQ AL@2 AM AN AL AA C
  AR AS@2
>`.pickRestart({
  A: "db2@3 db2 ~@3 eb2", B: "f2@3 f2 ~@2 f2 gb2", C: "eb2@3 eb2 ~@3 eb2", D: "ab2@3 ab2@2 ab2 ab2@2",
  E: "f2@3 f2 ~@3 f2", F: "ab2@6 ab2@4 bb2@2 ab2 bb2 ab2@2", G: "db2@3 db2@3 ~@2", H: "f2@3 f2@3 ~@2",
  I: "gb2@3 gb2@3 ~@2", J: "eb2 f2 gb2 ab2@2 ab2 ab2@2", K: "eb2 f2 gb2 ab2@3 eb2 f2", L: "gb2@3 gb2@3 f2 gb2",
  M: "ab2@3 ab2@2 eb2 ab2 eb2", N: "f2@3 f2@3 eb2 f2", O: "gb2@2 gb2 ab2@2 ab2!3", P: "ab2@2 ab2 ab2@3 ab2@2",
  Q: "ab2@4 ab2@2 ab2@4 ab2 bb2 ab2 f2 eb2@2", R: "gb2@3 gb2@3 ~ gb2", S: "eb2 f2 gb2 ab2@2 ab2!2 f2",
  T: "ab2@3 ab2@2 eb2 f2 gb2", U: "gb2 ab2 gb2 f2 gb2@2 ab2@2", V: "gb2 f2 gb2 ab2@2 ab2!3", W: "a2@3 a2@3 ~ ab1",
  X: "db2@3 db2 ~@2 f2 ab2", Y: "a2@3 a2@3 ~ ab2", Z: "db3@2 db3 ab2 ~@2 b2@2", AA: "db2@3 db2 ~@3 db2",
  AB: "ab2@3 ab2@3 eb2 ab2", AC: "a2@3 a2@2 ~@2 ab1", AD: "db2@3 db2@3 ab2@2", AE: "a2@3 a2@4 ab2",
  AF: "db3@2 db2 ab2@3 b2@2", AG: "a2@3 a2@3 ~ c2", AH: "db2@3 db2 ~@2 db2!2", AI: "gb2@3 gb2@3 gb2!2",
  AJ: "gb2@2 gb2 gb2@3 eb2@2", AK: "[ab2@3 ab2@3 ab2@10]/2", AL: "db2@3 db2 ~@4", AM: "eb2@3 eb2 ~@4",
  AN: "eb2@3 eb2 ~ f2 eb2@2", AO: "ab2@3 ab2@4 ab1", AP: "ab2@2 ab2 ab2@3 ab1@2", AQ: "ab2!3 ab2@2 ab2 ab1@2",
  AR: "ab2@2 ab2 ab2@2 ab2 ab1@2", AS: "db2/2",
})).s("gm_acoustic_bass").gain(0.4)

// chords · epiano1
const epiano1 = note(`<
  A B C D A B C D A E F@2 A E F@2 G H I J A B C K A B C L A E M@2 A E F@2 N H I O P H I Q A B C L A B C L R S R A R S T
  U R S R A R V W X Y Z@2 AA AB@2 AC@2 AB@2 AD AA AB@2 AC@2 AB@2 AD AA AB@2 AC@2 AB@2 AD AA AB@2 AC@2 AB@2 AD AE@2
>`.pickRestart({
  A: "[ab4,db5,f5]", B: "[ab4,c5,f5]", C: "[gb4,bb4,eb5]", D: "~@5 eb5@3, ~ ab4@3, ~@3 db5@5", E: "[a4,c5,f5]",
  F: "[~@7 db5, ~@2 gb4@6 gb4@3 db5@2 eb5@3, ~@3 ab4@6 ab4@7, ~@5 db5@5 bb4@6, ~@7 eb4@9]/2", G: "[bb4,db5,gb5]",
  H: "[ab4,c5,eb5]@3 [ab4,c5,eb5]@5", I: "[a4,c5,f5]@3 [a4,c5,f5]@5", J: "[bb4,db5,gb5]@2 gb5 ab5, ~ [bb4,db5]",
  K: "~@3 db5@2 db5@3, ~ ab4@7, ~ bb4@3", L: "~@3 db5@2 db5 db5@2, ~ ab4@7, ~ bb4@3",
  M: "[~@7 db5, ~@2 gb4@5 gb4@9, ~@3 ab4@5 ab4@8, ~@5 db5@5 db5@3 eb5@3, ~@9 bb4@7]/2", N: "[gb4,bb4,db5]",
  O: "[bb4,db5,gb5]@2 db5 eb5, ~ [bb4,gb5]", P: "[gb4,bb4,db5]@3 [gb4,bb4,db5]@5", Q: "[bb4,db5,gb5]@2 [bb4,eb5,gb5]!2",
  R: "[db5,e5,ab5]@3 [db5,eb5,gb5]@5", S: "[bb4,eb5,gb5]@3 [ab4,db5,f5]@5", T: "[a4,db5,gb5]@3 [a4,db5,gb5]@5",
  U: "[e5,ab5] [eb5,gb5] [db5,e5] [eb5,gb5]", V: "[db5,eb5,gb5]@3 [bb4,db5,f5]@5", W: "[a4,db5,ab5]@3 [a4,db5,gb5]@5",
  X: "[a4,db5,gb5]@3 [gb4,bb4,eb5]@5", Y: "[ab4,db5,eb5]@3 ab4@3 ab4@2, ~@3 [db5,eb5]@5",
  Z: "[~@7 db6 db6@8, ab4@4 gb5 ab5 bb5@10, ~ bb4@15, ~ db5@7, ~@3 eb5@13]/2", AA: "[ab4,db5,f5]!4 ~ [ab4,db5,f5]!3",
  AB: "[[ab4,db5,f5]!4 ~ [ab4,db5,f5]!2 [bb4,eb5,gb5]@2 [bb4,eb5,gb5]!3 ~ [bb4,eb5,gb5]!3]/2", // Db Ebm
  AC: "[[bb4,eb5,gb5]!4 ~ [bb4,eb5,gb5]!2 [ab4,db5,f5]@2 [ab4,db5,f5]!3 ~ [ab4,db5,f5]!3]/2", // Ebm Db
  AD: "[bb4,eb5,gb5]!4 ~ [bb4,eb5,gb5]!3", AE: "[ab4,db5,f5]/2",
})).s("gm_epiano1").gain(0.3)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  A B C D@2 E F B G H G I G H I J K L@2 M E N F O F P F B G H G Q R H S@2 K L@2 T@2 L@2 U E N F O F P F B ~@27 V@2 W@2
  V@2 W@2 V@2 W@2 V@2 W@2 V@2 W@2 V@2 W@2 V@2
>`.pickRestart({
  A: "f4", B: "ab4", C: "bb4", D: "db5/2", E: "f5", F: "db5", G: "db4", H: "c4", I: "ab3", J: "db4 ab4", K: "[db4,gb4]",
  L: "[eb4 f4, c4]/2", M: "ab4 bb4 db5 eb5", N: "eb5", O: "gb4", P: "c5 eb5", Q: "eb4", R: "db4 f4", S: "[db4@3 ab4]/2",
  T: "[db4,gb4]/2", U: "ab4 bb4 c5 eb5", V: "[db4,f4]/2", W: "[eb4,gb4]/2",
})).s("gm_string_ensemble_1").gain(0.3)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  A B C D A B C D E F G H E F G H I J K L A B C D A B C D E F G H E F G H I J K L I J K L A B C D A B C D M N M O P N Q
  R M N M O M N S T U@2 ~ V@2 W@2 V@2 W@2 V@2 W@2 V@2 W@2 V@2 W@2 V@2 W@2 V@2 W@2 V@2 W@2 X@2
>`.pickRestart({
  A: "[ab4,db5,f5]@2 [ab4,db5,f5]!3 ~ [ab4,db5,f5]@3 ~ [ab4,db5,f5]@2 [ab4,db5,f5]@2 [ab4,db5,f5]@2", // Db
  B: "[ab4,c5,f5]@2 [ab4,c5,f5]!3 ~ [ab4,c5,f5]@3 ~ [ab4,c5,f5]@2 [ab4,c5,f5]@2 [ab4,c5,f5]@2", // Fm
  C: "[gb4,bb4,eb5]@2 [gb4,bb4,eb5]!3 ~ [gb4,bb4,eb5]@3 ~ [gb4,bb4,eb5]@2 [gb4,bb4,eb5]@2 [gb4,bb4,eb5]@2", // Ebm
  D: "[ab4,db5,eb5]@2 [ab4,db5,eb5]!3 ~ [ab4,db5,eb5]@3 ~ [ab4,db5,eb5]@2 [ab4,db5,eb5]@2 [ab4,db5,eb5]@2", // Absus4
  E: "~@4 [ab4,db5,f5] ~@5 [ab4,db5,f5] ~@5", F: "~@4 [a4,c5,f5] ~@5 [a4,c5,f5] ~@5",
  G: "~@4 [bb4,db5,gb5] ~@5 [bb4,db5,gb5] ~@5", H: "~@4 [bb4,eb5,gb5] ~@5 [bb4,eb5,gb5] ~@5",
  I: "[bb4,db5,gb5]@2 [bb4,db5,gb5]!3 ~ [bb4,db5,gb5]@4 [bb4,db5,gb5]@2 [bb4,db5,gb5]@2 [bb4,db5,gb5]@2", // Gb
  J: "[c5,eb5,ab5]@2 [c5,eb5,ab5]!3 ~ [c5,eb5,ab5]@4 [c5,eb5,ab5]@2 [c5,eb5,ab5]@2 [c5,eb5,ab5]@2", // Ab
  K: "[c5,f5,a5]@2 [c5,f5,a5]!3 ~ [c5,f5,a5]@4 [c5,f5,a5]@2 [c5,f5,a5]@2 [c5,f5,a5]@2", // F
  L: "[bb4,db5,gb5]@2 [bb4,db5,gb5]!3 ~ [bb4,eb5,gb5]@4 [bb4,eb5,gb5]@2 [bb4,eb5,gb5]@2 [bb4,eb5,gb5]@2", // Gb Ebm
  M: "[db5,e5,ab5]!5 ~ [db5,eb5,gb5]@4 [db5,eb5,gb5]@2 [db5,eb5,gb5]@2 [db5,eb5,gb5]@2", // Dbm Ebm7
  N: "[bb4,eb5,gb5]!5 ~ [ab4,db5,f5]@4 [ab4,db5,f5]@2 [ab4,db5,f5]@2 [ab4,db5,f5]@2", // Ebm Db
  O: "[ab4,db5,f5]!5 ~ [ab4,db5,f5]@4 [ab4,db5,f5]@2 [ab4,db5,f5]@2 [ab4,db5,f5]@2", // Db
  P: "[db5,ab5] [db5,e5,ab5]!4 ~ [db5,eb5,gb5]@4 [db5,eb5,gb5]@2 [db5,eb5,gb5]@2 [db5,eb5,gb5]@2", // Db5 Dbm Ebm7
  Q: "[a4,db5,gb5]!5 ~ [a4,db5,gb5]@4 [a4,db5,gb5]@2 [a4,db5,gb5]@2 [a4,db5,gb5]@2", R: "e5 eb5 db5 eb5",
  S: "[a4,db5,gb5] [a4,db5] [a4,db5,gb5] [a4,db5] [a4,db5,gb5] ~ [a4,db5,gb5]@4 [a4,db5,gb5]@2 [a4,db5,gb5]@2 [a4,db5,gb5]@2", // Gbm A Gbm A Gbm
  T: "[gb4,a4,e5]!5 ~ [gb4,a4,eb5]@4 [gb4,a4,eb5]@2 [gb4,a4,eb5]@2 [gb4,a4,eb5]@2", // Gbm7 Ebdim
  U: "[[ab4,db5,eb5] ~ [ab4,db5,eb5]!3 ~ [ab4,db5,eb5]@4 [ab4,db5,eb5]@22]/2", // Absus4
  V: "[f4,ab4,db5]@2 [f4,ab4,db5]!4 [f4,ab4,db5]@4 [f4,ab4,db5]@2 [f4,ab4,db5]@2 [f4,ab4,db5]@2", // Db
  W: "[gb4,bb4,eb5]@2 [gb4,bb4,eb5]!4 [gb4,bb4,eb5]@4 [gb4,bb4,eb5]@2 [gb4,bb4,eb5]@2 [gb4,bb4,eb5]@2", // Ebm
  X: "[ab4,db5,f5]/2", // Db
})).s("gm_electric_guitar_clean").gain(0.25)

// other · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  A B C D A ~@6 E ~@3 F ~@5 G ~ H ~ I J ~@18 G ~ H ~ I K ~@18 L@2 ~@34
>`.pickRestart({
  A: "~ eb4 db4@5 ~", B: "~ eb4 ab4 c5!2 ab4 eb4 c4", C: "~@4 f4!2 eb4 bb3", D: "~@6 eb4 bb3", E: "~@5 db4 bb3!2",
  F: "~@2 db5@2 db5@2 db4 ~@3 ab4@2 eb4 db4 bb3!2", G: "~@10 eb4@2 eb4@2 c4 ~", H: "~@5 ab4 eb4 bb3",
  I: "~@5 ab4!2 gb4", J: "gb4 ~@7", K: "gb4@5 ~@11", L: "[ab4 eb4@2 ab5 eb5@2 db5 bb4@2 ~@6 ab5]/2",
})).s("gm_acoustic_guitar_nylon").gain(0.35)

// other · pad new age
const pad_new_age = note(`<
  A B C D@2 B C E@2 ~@10 F A B C D@2 B G@3 ~@14 F A B C D@2 B G@3 ~@7 H I J K H I L M N@2 K A B C O A B C D@2 B C O A B
  C D@2 B C O A B C D@2 B C O A B C P@3
>`.pickRestart({
  A: "~ f5 eb5 db5", B: "ab4@3 ~", C: "~ gb5 f5 eb5", D: "[~@2 gb5@2 f5@2 eb5 db5@3 f5@2 eb5@2 db5@2]/2",
  E: "[~@2 gb5@2 f5@2 eb5 db5@5 ~@4]/2", F: "ab4 bb4 db5 eb5", G: "[~@2 gb5@2 f5@2 eb5@3 ~ gb5@2 f5@2 eb5 db5@7 ~@2]/3",
  H: "ab5@3 gb5@5", I: "gb5@3 f5@5", J: "ab5@3 gb5@3 b5@2", K: "ab5", L: "b5@2 a5 a5@3 ab5@2", M: "ab5@3 gb5@3 e5@2",
  N: "ab5/2", O: "bb4@3 ~", P: "[~@2 gb5@2 f5@2 eb5 db5@17]/3",
})).s("gm_pad_new_age").gain(0.3)

// other · trumpet
const trumpet = note(`<
  ~@27 A B ~@2 C ~@3 D ~@2 E F ~@2 G H ~@7 I J@2 K@2 L M N O ~ P Q R ~@2 S T U@3 ~@11 V W X Y Z ~@8 AA AB@3 AC AD AE AF
  AG@2
>`.pickRestart({
  A: "~@3 f4 ~ db4 ~ bb3", B: "db4 ~", C: "eb4@8 ~@2 ab4 ~ bb4 ~ db5 ~", D: "~ f4 ~ db4 ~ eb4@3", E: "f4@7 db4",
  F: "~ eb4 ~ f4 ~ db4 bb3 ab3", G: "f4@7 eb4", H: "~ db4 ~ bb3 db4@2 eb4 ~", I: "~@12 ab4 bb4 db5 ~",
  J: "[db5@5 b4 a4 ab4@7 ~@2]/2", K: "[~ ab4 ~ gb4 ~ gb4 ~ eb4@4 db4@2 eb4 e4 gb4]/2", L: "ab4@3 gb4 ~@4",
  M: "gb4@3 f4@3 eb4 ~", N: "[ab4,b4]@2 [gb4,a4] [gb4,b4]@3 [e4,ab4]@2", O: "[e4,ab4] [eb4,gb4] [db4,e4] [eb4,gb4]",
  P: "~@10 ab4@2 db5 ~ db5@2", Q: "[bb4,b4] ~@11 b4@4, a4@3 ~", R: "ab4 ~@3",
  S: "[ab4,b4]@2 ~@2 [gb4,a4] ~ [gb4,b4]@6 [e4,ab4]@2 ~@2", T: "[e4,ab4]@3 [eb4,gb4]@3 [db4,e4] ~",
  U: "[[eb4,ab4]@11 ~@5]/3", V: "~@4 ab4 bb4 db5 ab4", W: "[a4,bb4,b4,c5] ~@15, db5 ~@7", X: "~@2 f4 ab4", Y: "gb4",
  Z: "~@8 gb5 f5 ~ db5 eb5 bb4 db5 ~", AA: "~@7 eb5", AB: "[~ db5 ~ ab4 ~@2 ab4 ab4@3 ~ gb4 ~ f4 ~ eb4@7 ~@2]/3",
  AC: "~@6 ab4 db5", AD: "~@2 ab4 eb5 ~@2 ab4 f5", AE: "~ eb5 ~ db5@3 ab4 ~", AF: "~@8 f5 eb5@2 db5 ~ bb4 ab4 ~",
  AG: "db5/2",
})).s("gm_trumpet").gain(0.45).pan(0.7)

// chords · trombone
const trombone = note(`<
  ~@27 A B ~@2 C ~@2 D@2 E@2 F ~ E@2 F ~@9 G H I@2 J K L M N O P Q R S P@2 T@3 ~@24 U@2 V@2 U@2 V@2 W@2
>`.pickRestart({
  A: "~@3 f3 ~ db3 ~ bb2", B: "db3 ~", C: "eb3@8 ~@2 ab3 ~ bb3 ~ db4 ~", D: "[~ db4 ~ bb3 ~ f3 gb3 ab3@8 ~]/2",
  E: "[gb3@10 f3 ~ gb3 ~ ab3@16 ~@2]/2", F: "a3@7 ~", G: "ab3@3 gb3@5", H: "eb3@3 f3@4 ~",
  I: "[db3@4 ~ eb3 ~ f3@7 ~@2]/2", J: "[gb3,a3,db4]@3 [gb3,a3,eb4] ~@4",
  K: "[gb3,bb3,eb4]@3 [f3,ab3,db4]@3 [f3,ab3,db4] ~", L: "[db3,gb3,a3]", M: "[db4,e4] [c4,eb4] [bb3,db4] [c4,eb4], gb3",
  N: "[gb3,a3,db4]@3 [gb3,a3,db4]@3 [gb3,a3,eb4]@2", O: "[bb3,eb4,gb4]@3 [ab3,db4,f4]@5",
  P: "[gb3,a3,db4]@3 [gb3,a3,db4]@5", Q: "[f3,ab3,db4]@7 ~", R: "[gb3,ab3,a3,db4]@3 [gb3,a3,db4]@3 [gb3,a3,eb4]@2",
  S: "[a3,eb4,gb4]@3 [ab3,db4,f4]@5", T: "[[db3,db4]@6 [eb3,eb4]@6 [ab2,ab3]@23 ~@13]/3",
  U: "[ab3,db4,f4] ~@2 [ab3,db4,f4] ~@4", V: "[bb3,eb4,gb4] ~@2 [bb3,eb4,gb4] ~@4", W: "[ab3,db4,f4]/2",
})).s("gm_trombone").gain(0.45).pan(0.3)

// drums · kick
const kick = s("bd").struct(`<
  [x ~@2 x ~@3 x]!58
  [x ~@2 x!2 ~@2 x]
  [x ~@2 x ~@3 x]!10
  x
  [~@7 x]
  [x ~@2 x ~@3 x]!32
  x
  ~
>`).gain(0.4)

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

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ B ~ A ~ B ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ B ~ C ~ A ~ A ~ B ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~
  B ~ A ~ A ~ A ~ A@2 ~ B ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ A ~@2
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@3 x ~@3 x", C: "~@7 x",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct("<~@70 x ~@34>").gain(0.2)

// drums · tambourine
const tambourine = s("tb").struct("<~@69 [~@4 x!2 ~@2] ~@35>").gain(0.25)

// drums · congas
const congas = s("conga:18").struct("<~@69 [~ x ~@5 x] ~@35>").gain(0.79)

// drums · congas
const congas_2 = s("conga:33").struct("<~@69 [~@4 x ~@5 x!3 ~@3] ~@35>").gain(0.79)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  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 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 C ~ 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: "~@6 x!3 ~@7", B: "~@8 x!3 ~@5", C: "~@6 x!2 ~@8",
})).gain(1.26)

// drums · claves
const claves = s("clave:2").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2
>`.pickRestart({
  A: "~@5 x ~@2",
})).gain(1.46)

// … 4 more lines

More by Rick Astley