Strudelify

Gabbertje

Hakkuhbar

KeyG majorTempo172 bpm
0:00/0:00
// Gabbertje — Hakkuhbar
// 172 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 123 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(172/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 · synth bass 1 · "#CM-O.Hih"
const bass = note("<~@2 A@36 B@3 C B@3 C D@8 A@32 B@3 C B@3 C ~@8 A@20 ~>".pickRestart({
  A: "~@2 g#2 ~@3 g#2 ~@3 g#2 ~@3 g#2 ~", B: "g2!2 [g2,g#2] g2!3 [g2,g#2] g2 g#2!4 a#2!2 [g#2,a#2] a#2",
  C: "a#2!2 [g#2,a#2] a#2!3 [g#2,a#2] a#2 g#2!8", D: "g2!12 a#2!4",
})).s("gm_synth_bass_1").gain(0.59)

// chords · banjo · "#Mtd.Banj"
const banjo = note(`<
  ~@2 A@3 B@4 A C D C ~@9 C D C ~@9 A E B F ~@16 A@3 B@4 A C D C ~@9 A E B F A@3 B@4 A ~@16 A@3 B@4 A C D C ~@10
>`.pickRestart({
  A: "~@2 [b3,d4,g4] ~@3 [b3,d4,g4] ~@3 [b3,d4,g4] ~@3 [b3,d4,g4] ~", // G
  B: "~@2 [a3,d4,f#4] ~@3 [a3,d4,f#4] ~@3 [a3,d4,f#4] ~@3 [a3,d4,f#4] ~", // D
  C: "~@2 [g3,c4,e4] ~@3 [g3,c4,e4] ~@3 [g3,c4,e4] ~@3 [g3,c4,e4] ~", // C
  D: "~@2 [g3,b3,d4] ~@3 [g3,b3,d4] ~@3 [g3,b3,d4] ~@3 [g3,b3,d4] ~", // G
  E: "~@2 [b3,d4,g4] ~@3 [b3,d4,g4] ~@3 [a3,d4,f#4] ~@3 [a3,d4,f#4] ~", // G D
  F: "~@2 [a3,d4,f#4] ~@3 [a3,d4,f#4] ~@3 [b3,d4,g4] ~@3 [b3,d4,g4] ~", // D G
})).s("gm_banjo").gain(0.33)

// bass · synth bass 2 · "#Mdlr.Bas"
const bass_2 = note(`<
  ~@2 A@3 B@3 C D E F E G A@3 B@3 C D E F E G A@3 B@3 C D A H B I ~@16 A@3 B@3 C D E F E G A@3 B@3 C D J K L M A@3 B@3 C
  D ~@16 A@3 B@3 C D E F E G A@3 B@3 C D ~
>`.pickRestart({
  A: "g2@3 ~ d2@3 ~ g2@3 ~ d2@3 ~", B: "a2@3 ~ d2@3 ~ a2@3 ~ d2@3 ~", C: "a2@3 ~ d2@3 ~ a2@3 a2 d2@2 f#2@2",
  D: "g2@3 ~ d2@3 ~ g2@3 g2 d2@2 g2 ~", E: "c2@3 ~ e2@3 ~ c2@3 ~ e2@2 c2@2", F: "g2@3 ~ d2@3 ~ g2@2 ~ g2 d2@2 g2@2",
  G: "g2@2 ~ g2 g#2 ~ g#2 ~ a2 ~@3 d2@2 e2@2", H: "g2@3 ~ d2@3 ~ a2@3 ~ d2@3 ~", I: "d2@2 ~ d2 e2@2 f#2@2 g2@3 ~@5",
  J: "g1@3 ~ d1@3 ~ g1@3 ~ d1@3 ~", K: "g1@3 ~ d1@3 ~ a1@3 ~ d1@3 ~", L: "a1@3 ~ d1@3 ~ a1@3 ~ d1@3 ~",
  M: "d1@2 ~ d1 e1@2 f#1@2 g1@3 ~@5",
})).s("gm_synth_bass_2").gain(0.66)

// chords · string ensemble 1 · "#St.Strin"
const string_ensemble_1 = note("<~@46 A@8 ~@40 A@8 ~@21>".pickRestart({
  A: "[b4@2 a#4 b4, [g4,d5]]/8", // G5
})).s("gm_string_ensemble_1").gain(0.33)

// chords · harmonica
const harmonica = note(`<
  A B ~@11 C D@3 E F G H D ~@3 C D@3 E F G H D ~@31 C D@3 E F G H D ~@4 D@3 E F G H D ~@16 D@3 E F G H D ~@3 C D@3 E F G
  H D ~
>`.pickRestart({
  A: "[g4,b4,d5,g5,b5]@2 ~ [f#4,a4,d5,f#5,a5] [g4,b4,d5,g5] ~ [e4,g4,c5,e5,g5] ~ [d4,g4,b4,d5]@2 [e4,g4,c5,e5]@2 [g4,b4,d5,g5]@2 [d4,g4,b4,d5,g5]!2", // G D G C G C G
  B: "[g4,b4,d5,g5] [d4,f#4,a4,c5] [b3,d4,g4,b4] [a3,d4,f#4,a4,c5] [g3,b3,d4,g4,b4] ~@3", C: "~@6 d4 e4",
  D: "[b4,d5,g5]!3 ~ [b4,d5,g5]!3 ~ [b4,d5,g5]!3 ~ [b4,d5,g5]!3 ~", // G
  E: "[a4,d5,g5]!3 ~ [a4,d5,g5]!3 ~ [a4,d5,f#5]!3 ~ [a4,d5,f#5]!3 ~", // Dsus4 D
  F: "[g4,c5,e5]!3 ~ [g4,c5,e5]!3 ~ [a4,d5,f#5]!3 ~ [a4,d5,f#5]!3 ~", // C D
  G: "[g4,c5,e5]!3 ~ [g4,c5,e5] [g4,c5] [g4,c5,e5] ~ [a4,d5,f#5]!3 ~ [a4,d5,f#5]!3 ~", // C C5 C D
  H: "[g4,c5,e5]!3 ~ [a4,d5,f#5]!3 ~ [g4,c5,e5]!3 ~ [a4,d5,f#5]!3 ~", // C D C D
})).s("gm_harmonica").gain(0.52)

// other · accordion
const accordion = note("<~ A ~@23 B ~@7 C D E F G ~@15 H ~@19 I D E F J ~@23 A ~@11 A ~@9>".pickRestart({
  A: "~@6 d5 e5", B: "g4!2 ~ g4 g#4 ~ g#4@2 a4@2 ~@2 d4@4", C: "~@5 d4 e4 d4",
  D: "[d4,g4] ~ [d4,g4]@3 ~ d4@2 [g4,b4] ~ [g4,b4]@3 ~ d4@2", E: "e4 ~ d4 ~ e4@2 d4 ~ [d4,f#4]@4 ~@2 d4 ~",
  F: "e4 ~ d4 ~ e4@2 d4 ~ [f#4,a4] ~ [f#4,a4]@3 ~ a4 ~", G: "d5 ~ c5 ~ b4 ~ a4 ~ g4@4 ~@4", H: "~@6 d4 e4",
  I: "~@2 d4@2 g4 d4 e4 d4", J: "d5 ~ c5 ~ b4 ~ a4 ~ g4@4 d5@2 e5@2",
})).s("gm_accordion").gain(0.7)

// chords · lead 2 sawtooth · "#LA Saw"
const lead_2_sawtooth = note(`<
  ~@2 A@3 B@4 A C D C E A@3 F G@2 H A C D C E A@3 F G@2 H A@2 I B J ~@15 K A@3 B@4 A C D C E A@3 F G@2 H A@2 I B J A@3
  B@4 A ~@16 A@3 B@4 A C D C E A@3 F G@2 H A ~
>`.pickRestart({
  A: "~@2 [b4,d5,g5] ~@3 [b4,d5,g5] ~@3 [b4,d5,g5] ~@3 [b4,d5,g5] ~", // G
  B: "~@2 [a4,d5,f#5] ~@3 [a4,d5,f#5] ~@3 [a4,d5,f#5] ~@3 [a4,d5,f#5] ~", // D
  C: "~@2 [g4,c5,e5] ~@3 [g4,c5,e5] ~@3 [g4,c5,e5] ~@3 [g4,c5,e5] ~", // C
  D: "~@2 [g4,b4,d5] ~@3 [g4,b4,d5] ~@3 [g4,b4,d5] ~@3 [g4,b4,d5] ~", E: "g4 ~@2 g4 g#4 ~ g#4 ~ a4 ~@7",
  F: "~@2 [a4,d5,g5] ~@3 [a4,d5,g5] ~@3 [a4,d5,f#5] ~@3 [a4,d5,f#5] ~", // Dsus4 D
  G: "~@2 [g4,c5,e5] ~@3 [g4,c5,e5] ~@3 [a4,d5,f#5] ~@3 [a4,d5,f#5] ~", // C D
  H: "~@2 [g4,c5,e5] ~@3 [a4,d5,f#5] ~@3 [g4,c5,e5] ~@3 [a4,d5,f#5] ~", // C D C D
  I: "~@2 [b4,d5,g5] ~@3 [b4,d5,g5] ~@3 [a4,d5,f#5] ~@3 [a4,d5,f#5] ~", // G D
  J: "~@2 [a4,d5,f#5] ~@3 [a4,d5,f#5] ~@3 [b4,d5,g5] ~@3 [b4,d5,g5] ~", K: "~@6 d5 e5",
})).s("gm_lead_2_sawtooth").gain(0.45)

// other · trumpet · "#Warm TP"
const trumpet = note(`<
  ~@29 A ~@2 B C ~@23 A ~@2 D C ~@4 E@2 F G H I J K ~@7 A ~@2 D C ~@19 A ~@2 D C ~@3 L E@2 F G H I J M ~
>`.pickRestart({
  A: "e4@3 d4 e4@2 g4@2 f#4@4 ~@4", B: "d5@5 ~ d5 ~ d5@2 c5@2 b4@2 a4@2", C: "g4 ~@3",
  D: "d5@4 ~@2 d5 ~ d5@2 c5@2 b4@2 a4@2", E: "b4 ~ b4 ~ b4@4 ~@4 d4@2 e4@2",
  F: "b4 ~ b4 ~ b4 ~ b4 ~ b4 ~ b4 ~ a4@2 b4@2", G: "c5@2 a4 b4 c5@2 a4@2 d5@4 ~@4", H: "~@2 d5 ~ d5@2 ~@10",
  I: "~@2 d5 ~ d5@3 ~@9", J: "d5@5 ~ e5@2 d5@2 c5@2 b4@2 a4@2", K: "g4@3 ~ d4@4 g4@2 d4@2 e4@2 d4@2",
  L: "g4 ~@2 g4 g#4 ~ g#4 ~ a4@4 d4@4", M: "g4@3 ~ d4@4 g4@3 ~@5",
})).s("gm_trumpet").gain(0.49).pan(0.4)

// other · orchestra hit · "Orch.Hit"
const orchestra_hit = note("<~@46 A B ~@2 A ~ A C D ~@39 A B ~@2 A ~ A E D ~@20>".pickRestart({
  A: "[g2,a#2,d3,g3] ~@15", B: "~@15 [g2,a#2,d3,g3]",
  C: "~ [d#2,d#3] [e2,e3] [f2,f3] [f#2,f#3] [g2,g3] [g#2,g#3] [a2,a3] [a#2,a#3] [b2,b3] [c3,c4] [c#3,c#4] [d3,d4] [d#3,d#4] [e3,e4] [f3,f4]", // D# E F F# G G# A A# …
  D: "[g3,g4] ~@15", E: "~@6 [g#2,g#3] [a2,a3] [a#2,a#3] [b2,b3] [c3,c4] [c#3,c#4] [d3,d4] [d#3,d#4] [e3,e4] [f3,f4]",
})).s("gm_orchestra_hit").gain(0.48)

// other · orchestra hit · "Orch.Hit" · soft notes · D D# E F F# G
const orchestra_hit_soft = note(`<
  ~@53
  [[d2,d3] ~@15]
  ~@47
  [[d2,d3] [d#2,d#3] [e2,e3] [f2,f3] [f#2,f#3] [g2,g3] ~@10]
  ~@21
>`).s("gm_orchestra_hit").gain(0.24)

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

// drums · crash
const crash = s("cr").struct(`<
  ~@10 A ~@11 A ~@3 A ~@7 A ~@3 A ~@3 A ~@11 A ~@7 A ~@11 A ~@3 A ~@7 A ~@3 A ~@11 A ~@7 A ~@3 A ~@7 A
>`.pickRestart({
  A: "x",
})).gain(0.56)

// drums · ride bell
const ride_bell = s("rd").struct(`<
  ~@2 A B A B A B A@3 B A C A B A B A B A@3 B A C A B A B A B A D A B A B A B A B A E A B ~@7 F A B A B A B A C A B A C
  A B A B A B A G A B A B A B A B A B A C A B A B A E A B ~@7 F A B A B A B A C A B A C A B A B A B A G H
>`.pickRestart({
  A: "x!4", B: "x ~@3 x ~@3 x ~@3 x ~@2 x", C: "x ~@3 x ~@3 x ~@2 x!2 ~ x!2", D: "x ~@3 x ~@3 x ~ x ~ x!4",
  E: "x ~ x ~ x ~ x!2", F: "x ~@3 x ~@2 x!2 ~ x ~ x ~ x ~", G: "x ~@3 x ~@3 x ~@2 x ~@2 x!2", H: "x",
})).gain(0.72)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@38
  [~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2]!8
  ~@40
  [~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2]!8
  ~@20
  [x ~ x!7 ~ x!6]!8
  ~
>`).gain(0.56)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@114 [~ x ~@7 x ~@6]!8 ~>").gain(0.32)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct(`<
  ~@2 A@3 B A@3 C A@3 B A@3 B A@3 C A@3 B A@3 B A@3 C ~@4 A@8 ~@8 A@3 B A@3 B A C A B A@3 B A@3 C ~@4 A@3 B A@3 B A@8
  ~@8 A@3 B A@3 B A C A B A@3 B A@3 C ~
>`.pickRestart({
  A: "x!4", B: "x ~@3 x ~@3 x ~@3 x ~@2 x", C: "x ~@3 x ~@3 x ~@3 x!4",
})).gain(0.81)

// drums · shaker
const shaker = s("sh").struct(`<
  ~@2 A@7 B A@3 C A@7 B A@3 C A@7 B A@3 D A@6 E@2 ~@6 E@2 A@11 C A@7 E A@3 F A@14 E@2 ~@6 E@2 A@11 C A@7 E ~
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~@2 x!3 ~ x ~ x!8", C: "x ~@2 x!2 ~ x ~ x ~@7", D: "~@2 x ~@3 x!7 ~ x!2", E: "x!16",
  F: "~@2 x ~@3 x ~@3 x ~@3 x!2",
})).gain(0.56)

stack(
  bass, banjo, bass_2, string_ensemble_1, harmonica, accordion, lead_2_sawtooth, trumpet, orchestra_hit,
  orchestra_hit_soft, clap, crash, ride_bell, tambourine, tambourine_soft, woodblocks, shaker
)