Strudelify

Funkytown

Theo

KeyC minorTempo120 bpm
0:00/0:00
// Funkytown — Theo
// 120 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 2 "Hammond Organ" named as an organ, played on drawbar organ (its clavinet patch is not one)
// note: Transcription provider: pdmx. https://musescore.com/score/5386945; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 108 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 · violin
const violin = note("<~@42 A B C D A B C D E F E G@2 F E H@2 ~@45 A B C D>".pickRestart({
  A: "~@3 g4 bb4 g4 bb4 g4", B: "~@3 g4 bb4 g4 eb5@2", C: "~@3 g4 bb4 g4 bb4 c5", D: "~@3 g4 c5!2 eb4@2",
  E: "~@6 f4 eb4", F: "f4@2 eb4@2 f4@2 eb4@2 ~ c5 ~ ab4@5, ~@4 bb4 ~@3",
  G: "[ab4@2 g4@2 f4@2 eb4@2 eb4@3 f4@9 ~@8 f4@2 eb4@2]/2", H: "[ab4@2 g4@2 f4@2 eb4@2 eb4@3 f4@9 ~@12]/2",
})).s("gm_violin").gain(0.3)

// bass · electric bass pick · "Bass Guitar [Tablature]"
const bass = note(`<
  A@14 B@4 C D A@8 C D E ~ F G F G F G F G F G F G F G F G F G H ~ H ~ H ~ H ~ F G F G F G F G A@14 B@4 C D A@8 C D E ~
  F G F G F G F G F G
>`.pickRestart({
  A: "c2 c3 c2 c3 c2 c3 c2 c3", B: "g2 g3 g2 g3 g2 g3 g2 g3", C: "g2 g3 g2 g3 f2 f3 f2 f3",
  D: "e2 e3 e2 e3 d2 d3 d2 d3", E: "c2 ~@7", F: "c2!2 g1!2 bb1!2 b1!2", G: "c2!2 g1!2 bb1!2 b1 ~",
  H: "f2 f2@2 f2 ~ f2 ~ f2 f2@4 ~@4",
})).s("gm_electric_bass_pick").gain(0.12)

// chords · electric guitar clean · "Electric Guitar [Tablature]"
const electric_guitar_clean = note("<~@34 A@16 B ~ B ~ B ~ B ~ A@8 ~@34 A@8>".pickRestart({
  A: "[bb3,eb4,g4]@3 [bb3,eb4,g4] [bb3,eb4,g4]@2 ~@10", // Eb
  B: "[f3,c4,f4,a4,c5] [f3,c4,f4,a4,c5]@2 [f3,c4,f4,a4,c5] ~ [f3,c4,f4,a4,c5] ~ [f3,c4,f4,a4,c5] [f3,c4,f4,a4,c5]@4 ~@4", // F
})).s("gm_electric_guitar_clean").gain(0.3)

// drums · kick
const kick = s("bd").struct("<A@30 B C B C D@8 ~@8 D@16 A@30 B C B C D@8>".pickRestart({
  A: "x!2", B: "x ~@2 x!2 ~@3", C: "x!2 ~ x!2 ~@3", D: "x!4",
})).gain(0.3)

// drums · snare
const snare = s("sd").struct("<A@42 ~@8 B ~ B ~ B ~ B ~ A@50>".pickRestart({
  A: "~ x ~ x", B: "x!2 ~ x ~ x ~ x!2 ~@7",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<A@21 B A B A B A B A B C@4 A@8 ~@16 A@29 B A B A B A B A B C@4 A@8>".pickRestart({
  A: "x!8", B: "x ~ x ~ x ~ x!3 ~ x!3 ~ x ~", C: "x!4",
})).gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<~@2 A@19 B A B A B A B A B ~@38 A@19 B A B A B A B A B ~@12>".pickRestart({
  A: "~@5 x ~@2", B: "~@6 x!3 ~ x!3 ~@3",
})).gain(0.3)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<[x ~@8 x!7]!30 ~@36 [x ~@8 x!7]!30 ~@12>").gain(0.43)

// drums · woodblocks
const woodblocks_2 = s("woodblock:4").struct("<[~@2 x!7 ~@7]!30 ~@36 [~@2 x!7 ~@7]!30 ~@12>").gain(0.43)

stack(violin, bass, electric_guitar_clean, kick, snare, hihat, tambourine, woodblocks, woodblocks_2)