Strudelify

Sing Hallelujah!

Dr. Alban

KeyF minorTempo131 bpm
0:00/0:00
// Sing Hallelujah! — Dr. Alban
// 131 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 124 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(131/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 · "A.PIANO 3"
const piano = note(`<
  ~@8 A B C D E B C D F ~@14 G H I J G H I J B C D E B C D K ~@14 G H I J G H I J B C D E B C D K ~@34 B C D E G H I J G
  H I J L
>`.pickRestart({
  A: "~@12 [c3,d3,e3] [f3,g3,a3,b3] [c4,d4,e4,f4] [g4,a4,b4]", // C G7 Dm7 G
  B: "[f2,f4,ab4,c5] ~@3 [f4,ab4,c5] ~@3 [f2,f4,ab4,c5] ~ [f2,f4,ab4,c5] ~@3 [f4,bb4,c5] ~, ~@2 f2 ~@4 bb1", // Fm Fsus4
  C: "~@2 [f4,bb4,c5] ~@3 [f4,bb4,c5] ~ [c2,eb4,ab4,bb4] ~@3 [c2,eb4,g4,bb4]@2 eb2 ~, ~ bb1 ~ bb1 ~@4", // Fsus4 Ab Cm7
  D: "[f2,f4,ab4,c5] ~@3 [f4,ab4,c5] ~@3 [f2,f4,ab4,c5] ~ [f2,f4,ab4,c5] ~@3 [f4,bb4,c5] ~, ~@2 f2 ~@4 bb2", // Fm Fsus4
  E: "~@2 [f4,bb4,c5] ~@3 [f4,bb4,c5] ~ [ab2,eb4,ab4,bb4] ~@3 [g2,eb4,g4,bb4]@2 g2 ~, ~ bb2 ~ ab2 ~@4", // Fsus4 Absus2 Eb
  F: "~@2 [f4,bb4,c5] ~@3 [f4,bb4,c5] ~ [ab2,eb4,ab4,bb4] ~@3 [g2,eb4,g4,bb4]@2 ~@2, ~ bb2 ~ ab2 ~@4", // Fsus4 Absus2 Eb
  G: "[f2,f4,bb4,c5] ~@3 [f4,ab4,c5] ~ c3@2 f3 ~ [f3,f4,bb4,c5] ~ c3@2 [db4,f4,ab4] ~, ~@2 f3 ~@4 bb2", // Fsus4 Fm Fsus4 Db
  H: "~@2 [ab2,db4,f4,ab4] ~ bb2 ~ [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~ c3 ~ c3@2, ~@3 c3 ~ bb2 ~@2", // Db Eb
  I: "[f2,f4,bb4,c5] ~@3 [f4,ab4,c5] ~ c3@2 ~@2 [f3,f4,bb4,c5] ~ c3@2 [eb3,db4,f4,ab4] ~, ~@2 f3 ~@5", // Fsus4 Fm Fsus4 Db
  J: "~@2 [eb3,db4,f4,ab4] ~@3 [eb3,eb4,g4,bb4] ~@3 [eb3,eb4,g4,bb4] ~@3 eb3@2", K: "~ [bb2,f4,bb4,c5]@2 ~@5",
  L: "[f2,f4,ab4,c5] ~@15", // Fm
})).s("gm_piano").gain(0.18)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  A B C B C B C B C D A D E F G F G H I F G F G F G F J K L K L M N O P M N Q R S T U V W X W Y H I F G F G F G F J K L
  K L M N O P M N Q R S T U V W X W Y H I F G F G F G F J K L K L ~@20 Z T AA AB M N Q AC M N Q R AD
>`.pickRestart({
  A: "~@3 c2", B: "f1 ~@3 f1 ~@3 f1 ~@3 f1 ~@3", C: "f1 ~@3 f1 ~@3 f1 ~@3 c2@4", D: "f1 ~@15", E: "~@8 c2 ~@5 c2 ~",
  F: "eb2 ~ f2 ~ bb1 ~ c2 ~ eb2 ~ f2 ~ c2 ~ bb1 ~", G: "~@2 bb1 ~@3 bb1 ~ c2 ~ c2 ~ c2 ~ eb2 ~",
  H: "eb2 ~ f2 ~@3 bb1 ~ b1 ~ c2 ~@3 eb1 ~", I: "e1 ~ f1 ~@3 ab1@4 ~@6", J: "~@2 bb1 ~@3 bb1 ~ c2 ~ c2 ~ bb1!2 ab1 ~",
  K: "f2 ~@3 f2 ~ f2 ~ f2 ~@3 f2 ~@3", L: "f2 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~@3 c2@4",
  M: "f2 ~ f2 ~@3 c2 ~ f2 ~ f2 ~ c2 ~ bb1 ~", N: "~@2 ab1 ~ bb1 ~ c2 ~@3 bb1 ~ c2 ~ eb2 ~",
  O: "f2 ~ f2 ~@3 c2 ~@3 f2 ~ c2 ~ eb2 ~", P: "~@2 eb2 ~@3 eb1 ~@3 eb1 ~@3 eb2 ~",
  Q: "f1 ~ f2 ~@3 c2 ~@3 f2 ~ c2 ~ eb2 ~", R: "~@6 eb2 ~@3 eb2 ~@3 eb2 ~", S: "f2 ~@3 f2 ~@3 f2 ~ f2 ~@3 bb1 ~",
  T: "~@2 bb1 ~@3 bb1 ~ c2 ~@3 c2 ~ eb2 ~", U: "f2 ~@3 f2 ~@3 f2 ~ f2 ~@3 bb2 ~",
  V: "~@2 bb2 ~@3 ab2 ~ ab2 ~@3 g2 ~ g2 ~", W: "f2 ~@3 f2 ~@3 f2 ~ f2 ~ ab2 ~ bb2 ~",
  X: "~@2 bb2 ~@3 bb2 ~ c2 ~@3 c2 ~ eb2 ~", Y: "~@2 bb2 ~@11 c2 ~", Z: "f2 ~@3 f2 ~ c2 ~ f2 ~ f2 ~@3 bb1 ~",
  AA: "f2 ~@3 f2 ~ c2 ~ f2 ~ f2 ~@3 bb2 ~", AB: "~@2 bb2 ~@3 ab2 ~ c2 ~ c2 ~ c2 ~ eb2 ~",
  AC: "~@2 eb2 ~@3 eb1 ~@3 eb1 ~@3 eb1 ~", AD: "f2 ~@15",
})).s("gm_electric_bass_finger").gain(0.35)

// chords · percussive organ · "ORGAN 2"
const percussive_organ = note(`<
  ~@19 A B A B A B A B ~ C ~@20 A B A B A B A B ~ C ~@20 A B A B A B A B ~ C ~@2 D@2 E@2 F@2 G H D@2 E@2 F@2 I@2 J@2 K@2
  ~@13
>`.pickRestart({
  A: "~ [f4,c5,f5,ab5] ~ [f4,c5,f5,ab5] ~ [f4,c5,f5,ab5] ~ [f4,bb4,eb5,f5,bb5]", // Fm Ebsus2
  B: "~@2 [f4,bb4,eb5,ab5]@2 ~@2 [f4,bb4,eb5,ab5]@2 ~@2 [f4,bb4,eb5,g5] ~@3 [f4,c5,f5,ab5]@2", // Fm7 Eb Fm
  C: "~@10 [f4,bb4,eb5,g5] ~@3 [f4,c5,f5,ab5]@2", D: "[c5,f5,ab5]/2", E: "[db5,f5,ab5]/2", F: "[ab5 g5, [eb5,bb5]]/2",
  G: "[f5,bb5,c6]", H: "[ab5,bb5,eb6]", I: "[f5 eb5, [bb5,c6]]/2", J: "[eb3,f5,g5,bb5,eb6]/2",
  K: "[f3,ab5,bb5,c6,f6]/2", // Fm
})).s("gm_percussive_organ").gain(0.16)

// chords · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz = note(`<
  ~@8 A@2 ~@9 B C@2 D@2 E F@2 ~ G H I@3 J@4 K@3 ~@3 L@2 M@2 ~@2 B C@2 D@2 E F@2 ~ G H I@3 J@4 K@3 ~@3 L@2 M@2 ~ N O P ~
  Q R S T U ~ G H V@3 W@12 X@4 Y@2 Z AA Z AB@3 J@4 AC@3
>`.pickRestart({
  A: "[~@10 c5 ~ eb5@2 c5 f5@2 ~ f5 ~@13]/2", B: "~@2 bb3!3 ~ c4 ~ bb3 ~ ab3 ~ ab3 ~@2 bb3",
  C: "[bb3 ~@2 bb3!3 ~ bb3!2 ~ ab3 ~ c4@2 bb3 ab3@9 ~@8]/2",
  D: "[~@2 bb3@2 ~@2 bb3 ~ bb3 ~ bb3 ~ c4@2 bb3 ab3@5 ~@12]/2", E: "~@2 bb3@3 ~ bb3 ~ bb3@3 ~ c4@3 ~",
  F: "[bb3@3 ~ c4@2 ~ ab3@3 ~@2 c4@2 bb3 ab3@8 ~@9, ~@3 bb3 ~@12]/2", G: "~@3 f4", H: "eb4 f4@3 ~@4",
  I: "[~@10 [c4,eb4,ab4,c5] ~ [eb4,g4,c5,eb5]@2 [c4,eb4,ab4,c5] [f4,bb4,c5,f5]@3 [f4,ab4,c5,f5]@6 ~@4 [c4,ab4] ~ [db4,ab4]@5 ~ [c4,ab4]@2 [bb3,g4]@6 [ab3,g4]@2 ~@2]/3", // Ab Cm Ab Fsus4 Fm Db5 Fm Eb …
  J: "[[f4,ab4,c5,f5]@2 [f4,ab4,c5,f5]@2 ~@4 [f4,ab4,c5,f5]@2 ~@2 [c4,ab4] ~ [db4,ab4]@5 ~ [db4,ab4]@2 [eb4,bb4]@4 [c4,eb4,ab4,bb4,c5] ~ [eb4,g4,c5,eb5]@2 [c4,eb4,ab4,c5] [f4,bb4,c5,f5]@3 [f4,ab4,c5,f5]@6 ~@4 [c4,ab4] ~ [db4,ab4]@5 ~ [c4,ab4]@2 [bb3,g4]@6 [ab3,g4]@2 ~@2]/4", // Fm Db5 Eb5 Ab Cm Ab Fsus4 Fm …
  K: "[[f4,ab4,c5,f5]@2 [f4,ab4,c5,f5]@2 ~@4 [f4,ab4,c5,f5]@2 ~@2 [c4,ab4] ~ [db4,ab4]@5 ~ [db4,ab4]@2 [eb4,bb4]@4 [c4,eb4,ab4,bb4,c5] ~ [eb4,g4,c5,eb5]@2 [c4,eb4,ab4,c5] [f4,bb4,c5,f5]@3 [f4,ab4,c5,f5]@6 ~@8]/3", // Fm Db5 Eb5 Ab Cm Ab Fsus4 Fm
  L: "[~@4 [bb3,f4,bb4] ~@3 [ab3,eb4,ab4]@3 ~ [ab3,eb4,ab4]@2 [bb3,d4,f4,bb4]@4 [bb3,d4,f4,bb4] ~@3 [bb3,d4,eb4,bb4]@4 [c4,f4,c5] ~@5]/2", // Bb5 Ab5 Bb Ebmaj7 F5
  M: "[~@4 [bb3,f4,bb4] ~@3 [ab3,eb4,ab4]@3 ~ [ab3,eb4,ab4]@2 [bb3,d4,f4,bb4]@4 [bb3,d4,f4,bb4] ~@3 [bb3,c4,ab4,bb4]@4 [ab3,eb4,f4,c5] ~@5]/2", // Bb5 Ab5 Bb Fm Fm7
  N: "~@6 c4 bb3", O: "ab3@5 ~@11", P: "~@2 bb3@3 ~ bb3 ~ bb3 ~ bb3 ~ c4@2 bb3@2", Q: "~@2 bb3@3 ~ bb3 ~ bb3@3 ~ c4@4",
  R: "bb3@2 ab3@3 ~@11", S: "~@2 bb3@3 ~ bb3 ~ bb3@4 c4@2 bb3@2", T: "ab3@3 ~ c4@2 bb3@2 ab3@4 c4@2 bb3@2",
  U: "ab3 ~@3", V: "[~@10 c5@2 eb5@2 c5 f5@3 f5@3 ~@7 c4@2 db4@6 c4@2 bb3@6 ~@4]/3", W: "[~@6 c4 db4@3 c4 bb3@3 ~@2]/2",
  X: "[~@12 c4@2 db4@6 c4@2 bb3@6 ~@20 g5@15 ~, ~@28 eb4@35 ~, ~@32 [g4,eb5]@31 ~]/4", Y: "[[f3,f4,ab4,f5,ab5]@31 ~]/2",
  Z: "~@4 [f4,ab4,c5,f5]!2 ~@2", AA: "~@4 [f4,ab4,c5,f5] ~@3",
  AB: "[~@2 [f4,ab4,c5,f5]@6 ~@2 [c4,eb4,ab4,c5] ~ [eb4,g4,c5,eb5]@2 [c4,eb4,ab4,c5] [f4,bb4,c5,f5]@3 [f4,ab4,c5,f5]@6 ~@4 [c4,ab4] ~ [db4,ab4]@5 ~ [c4,ab4]@2 [bb3,g4]@6 [ab3,g4]@2 ~@2]/3", // Fm Ab Cm Ab Fsus4 Fm Db5 Fm …
  AC: "[[f4,ab4,c5,f5]@2 [f4,ab4,c5,f5]@2 ~@4 [f4,ab4,c5,f5]@2 ~@2 [c4,ab4] ~ [db4,ab4]@5 ~ [db4,ab4]@2 [eb4,bb4]@4 [c4,eb4,ab4,bb4,c5] ~ [eb4,g4,c5,eb5]@2 [c4,eb4,ab4,c5] [f4,bb4,c5,f5]@3 [f4,ab4,c5,f5]@14]/3", // Fm Db5 Eb5 Ab Cm Ab Fsus4 Fm
})).s("gm_electric_guitar_jazz").gain(0.3)

// chords · electric guitar jazz · "JAZZ GTR" · soft notes
const electric_guitar_jazz_2 = note("<~@81 A ~@9 B@4 C@2 D@2 B@4 C@2 E@4 ~@15>".pickRestart({
  A: "ab3 ~@3", B: "[~@12 f3@2 f3@6 f3@2 f3@6 [f3,ab3]@3 ~]/2", C: "[~@12 eb3@2 eb3@6 eb3@2 eb3@6 [eb3,ab3]@3 ~]/2",
  D: "[~@12 eb3@2 eb3@6 eb3@2 eb3@6 [ab3,eb4]@3 ~]/2", E: "[~@12 f3@2 f3@6 f3@2 f3@6 eb3@35 ~]/4",
})).s("gm_electric_guitar_jazz").gain(0.15)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@91 A@2 B@2 C@2 D E A@2 B@2 C@2 D F@3 G@2 ~@13>".pickRestart({
  A: "[[c5,c6]@26 [g5,g6]@3 [ab5,ab6]@3]/2", B: "[[db5,db6]@26 [g5,g6]@3 [ab5,ab6]@3]/2",
  C: "[[bb4,bb5]@26 [g5,g6]@3 [ab5,ab6]@3]/2", D: "[c5,c6]", E: "[bb4,bb5]", F: "[eb5,eb6]/3", G: "[f5,f6]/2",
})).s("gm_string_ensemble_1").gain(0.25)

// chords · clavinet
const clavinet = note(`<
  ~@13 A B A B ~@2 A B A B A B A B A B A B ~@18 A B A B A B A B A B A B ~@18 A B A B A B A B A B A ~@34
>`.pickRestart({
  A: "[c4,f4,ab4]!4 [eb4,f4,ab4]!12", B: "[d4,f4,bb4]!8 [db4,eb4,bb4]!4 [c4,eb4,bb4]!4",
})).s("gm_clavinet").gain(0.13)

// drums · kick
const kick = s("bd").struct(`<
  ~ A@11 B A@3 C A@5 C A@3 C A@3 ~ A@3 C A@3 C A@3 C A@3 C A@5 C A@3 C A@3 D A@3 C A@3 C A@3 C A@3 C A@5 C A@3 C A@3 E
  ~@20 A@3 F A@3 C A@3 C E
>`.pickRestart({
  A: "x!4", B: "x ~ x ~@2 x ~ x", C: "x ~ x ~ x ~ x!2", D: "~@7 x", E: "x", F: "x!2 ~ x ~ x!3",
})).gain(0.4)

// drums · clap
const clap = s("cp").struct("<~ [~ x ~ x]!122 ~>").gain(0.4)

// drums · snare
const snare = s("sd").struct(`<
  ~@5 A@4 ~@3 B ~ C ~ C ~ D ~ C ~ C ~ C ~ C ~@3 E ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ D ~ C ~ C ~ C ~ C ~@3 F ~ C ~ C ~ C
  ~ C ~ C ~ C ~ C ~ C ~ D ~ C ~ C ~ C ~ C ~@2 D G ~@4 H@14 A@2 ~@3 I ~ C ~ C ~ C ~ C ~
>`.pickRestart({
  A: "x!16", B: "~@2 x!2", C: "~@11 x ~@4", D: "~@14 x!2", E: "x ~ x!2 ~@2 x!6 ~ x ~@2", F: "x!2 ~ x!2 ~ x!2 ~ x!3 ~@4",
  G: "x!2 ~ x ~@2 x ~ x ~ x ~ x ~@3", H: "~ x!2 ~ x!2 ~ x ~ x!2 ~@2 x!3", I: "~@3 x ~ x ~ x",
})).gain(0.1)

// drums · hihat
const hihat = s("hh").struct("<~@13 A@4 ~@2 A@28 ~@2 A@28 ~@2 A@12 B ~@3 C@4 D@12 B ~@3 A@8 B>".pickRestart({
  A: "x!4", B: "x", C: "x!16", D: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2",
})).gain(0.25)

// drums · open hat
const open_hat = s("oh").struct("<~@13 A@4 ~@2 A@28 ~@2 A@28 ~@2 A@12 ~@8 A@12 ~@4 A@8 ~>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(0.25)

// drums · crash
const crash = s("cr").struct("<~@91 x ~@32>").gain(0.25)

// drums · ride
const ride = s("rd").struct(`<
  ~@26 A ~@15 A ~@3 A ~@3 B ~ A ~ B ~ A ~@5 B ~ B ~ B ~ B ~ B ~ A ~ B ~ A ~@3 B ~ A ~ B ~ A ~@29 B ~ A ~ B ~ A ~
>`.pickRestart({
  A: "~@6 x!2", B: "~@7 x",
})).gain(0.25)

// drums · tambourine
const tambourine = s("tb").struct("<~@13 A@4 ~@2 A@8 ~@4 A@16 ~@2 A@28 ~@2 A@11 ~@25 A@8 ~>".pickRestart({
  A: "x!16",
})).gain(0.2)

// drums · congas
const congas = s("conga:13").struct("<~ A@3 B A@3 B ~@8 A@2 ~@28 A@2 ~@27 A@3 ~@45>".pickRestart({
  A: "~@9 x ~@6", B: "~ x",
})).gain(0.48)

// drums · congas
const congas_2 = s("conga:18").struct("<~ A@3 B A@3 B ~@8 A@2 ~@28 A@2 ~@27 A@3 ~@45>".pickRestart({
  A: "~@3 x ~@8 x ~ x ~", B: "~@3 x ~ x ~@8 x ~",
})).gain(0.48)

// drums · congas
const congas_3 = s("conga:33").struct("<~ A@8 ~@8 A@2 ~@28 A@2 ~@27 A@3 ~@45>".pickRestart({
  A: "~@2 x ~@4 x ~@2 x ~@4 x",
})).gain(0.48)

// drums · triangle
const triangle = s("triangles:30").struct("<~@95 [~@3 x ~@7 x ~@4]!16 ~@13>").gain(0.86)

// drums · triangle
const triangle_2 = s("triangles:35").struct("<~@95 [x!2]!16 ~@13>").gain(0.86)

stack(
  piano, bass, percussive_organ, electric_guitar_jazz, electric_guitar_jazz_2, string_ensemble_1, clavinet, kick, clap,
  snare, hihat, open_hat, crash, ride, tambourine, congas, congas_2, congas_3, triangle, triangle_2
)

More by Dr. Alban