Strudelify

A Campfire Song

10,000 Maniacs

KeyD majorTempo135 bpm
0:00/0:00
// A Campfire Song — 10,000 Maniacs
// 135 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 4 "Guitar" acoustic guitar nylon (copy of ch 2 "Organs" drawbar organ); ch 10 "Drums" piano (copy of ch 9 "Bass" acoustic bass)
// note: Full arrangement: all 100 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(135/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 · drawbar organ · "Organs"
const drawbar_organ = note(`<
  A@2 B@2 C@2 D E F@2 G@2 H I J K L M N O P Q R O S T U V B@2 C@2 D E F@2 G@2 H I J K L M N O P Q R O S T U W X ~@3 Y Z
  AA AB Y Z AA AC AD AE@2 AF@4 AG@2 D AH AI AJ N O P Q R O S AK AL@2 AM@2 AN AO AP AQ AR AS AT AU@2
>`.pickRestart({
  A: "[[a4,d5,f#5]@3 ~ [a4,e5] ~ [f#4,b4,d5] ~@3 [e4,a4,c#5]@4 [d4,b4]@10 ~@4 [e4,c#5]@3 ~]/2", // D A5 Bm A G C#m
  B: "[[f#4,a4,d5]@3 ~ [a3,d4] ~ [d4,f#4]@3 ~ g4 ~ [d4,f#4] ~ [c#4,e4]@2 [c#4,e4]@3 ~ [a3,c#4,f#4]@3 ~ [a3,c#4,e4]@3 ~ d4 ~ d4 ~, ~@4 f#4@2 a3@6 a3@2 a3@5 ~@13]/2", // D D5 D C#m F#m A
  C: "[[b3,d4,f#4]@3 ~ [b3,d4,f#4] ~ f#4 ~ [b3,e4]@3 ~ [b3,e4] ~ [b3,d4]@11 ~@7]/2", // Bm E5 Bm
  D: "~@4 [d4,f#4]@3 ~ [d4,f#4]@3 ~ [d4,f#4,a4]@3 ~", E: "[c#4,e4,a4]@3 ~ g4 ~ [c#4,f#4]@3 ~ [c#4,f#4]@3 ~ f#4 ~",
  F: "[[b3,d4,f#4]@3 ~ [b3,d4]@3 ~ [b3,d4]@3 ~ [b3,d4,f#4] ~ [a3,c#4,e4]@10 ~@8]/2", // Bm A
  G: "[~@4 [d4,f#4] ~ [a3,d4,f#4]@3 ~ g4@2 [a3,d4,f#4]@2 [a3,c#4,e4]@5 ~ [a3,c#4,f#4]@3 ~ [a3,c#4,e4]@3 ~ d4 ~ d4 ~, ~@2 a3 ~@13]/2", // D A F#m A
  H: "[b3,d4,f#4] ~ [b3,d4,f#4]@3 ~ [b3,e4]@3 ~ [b3,d4]@3 ~ d4 ~", I: "[g3,b3] ~",
  J: "a3@4 ~@2 [a3,d4,f#4]@3 ~ [a3,d4,f#4]@3 ~ e4 ~", K: "[g3,c#4,e4] ~ [a3,c#4,f#4]@3 ~ [a3,c#4,e4]@4 ~@2 d4 ~ e4 ~",
  L: "[g3,b3,e4]@5 ~@3 [g3,b3,d4]@3 ~ [g3,b3]@3 ~", M: "[a3,c#4,e4]@5 ~@3 [a3,c#4,f#4]@3 ~ [a3,c#4,f#4]@3 ~",
  N: "[g3,b3]@2 [g3,b3,d4]@4 ~@4 [b3,d4,f#4] ~ [b3,d4,f#4] ~ [b3,d4,f#4] ~, e4 ~@15", // G Bm
  O: "[a3,d4,f#4]@3 ~ [a3,d4]@5 ~@5 a3 ~", P: "[g3,b3,e4]@3 ~ [g3,b3,d4]@5 ~@3 [b3,d4,f#4]@3 ~",
  Q: "[b3,d4,g4]@3 ~ f#4 ~ [a3,c#4,e4]@4 ~@2 [a3,c#4,f#4]@3 ~", // G A F#m
  R: "[g3,b3,e4]@3 ~ [g3,b3,d4]@5 ~@3 [b3,d4,f#4] ~ [b3,d4,f#4] ~", S: "[g3,b3,e4]@3 ~ [g3,b3,d4]@5 ~@5 f#4 ~",
  T: "[b3,d4,g4]@3 ~ f#4 ~ [a3,d4,f#4]@3 ~ e4 ~ e4 ~ d4 ~", // G D
  U: "[b3,d4]@3 ~ [d4,f#4] ~ [a3,c#4,e4]@2 [a3,c#4,e4]@6 ~@2, ~@4 b3@9 ~@3", // Bm D A
  V: "[d4,g4,b4]@4 ~@2 [d4,g4,b4]@2 [d4,g4,b4]@3 ~ [e4,a4,c#5]@3 ~", // G A
  W: "~@4 [b3,d4,g4]@3 ~ [b3,d4,g4] ~ f#4 ~ [a3,c#4,e4] ~ [a3,d4,f#4]@2", // G A D
  X: "~@2 d4 ~ a4 ~@3 [c#4,e4] ~ [d4,f#4]@4 ~@2, ~@6 a3@5 ~@5", Y: "[b3,d4]@3 ~ [b3,g4] ~ [b3,d4]@5 ~@3 d4 ~",
  Z: "[c#4,e4]@3 ~ [d4,f#4] ~ [a3,d4]@8 ~@2", AA: "~@4 [b3,d4]@3 ~@3 [b3,d4,g4]@4 ~@2",
  AB: "[a3,c#4,g4] ~ [a3,c#4,f#4]@3 ~ [a3,c#4,e4]@4 ~@4 d4 ~", // A7 F#m A
  AC: "[a3,c#4,g4] ~ [a3,c#4,f#4]@3 ~ [a3,c#4,e4]@4 ~@2 [a3,c#4,f#4]@3 ~", AD: "[b3,d4]@8 ~@6 d4 ~",
  AE: "[[c#4,e4]@3 ~ [d4,f#4] ~ [b3,d4]@3 ~ f#4 ~ e4 ~ [b3,d4]@10 ~@6 a3 ~]/2", // C#m D Bm
  AF: "[[a3,d4,f#4]@3 ~ [a3,f#4] ~ [a3,e4]@3 ~ [a3,d4,f#4]@3 ~ [g3,b3,d4]@7 ~@3 g4 ~ f#4 ~ e4 ~ [a3,d4,f#4]@5 ~ [a3,d4,f#4] ~ [a3,d4,f#4]@3 ~ g4 ~ [a3,d4,f#4] ~ [a3,c#4,e4]@5 ~ [a3,c#4,f#4]@3 ~ [a3,c#4,e4]@3 ~ d4 ~ d4 ~]/4", // D A5 D G D A F#m A
  AG: "[[b3,d4,f#4]@3 ~ [b3,d4,f#4]@3 ~ [b3,e4]@3 ~ [b3,d4] ~ [b3,d4]@10 ~@8]/2", // Bm E5 Bm
  AH: "[c#4,e4,a4]@3 ~ [c#4,e4,g4]@3 ~ [c#4,f#4]@3 ~ c#4@2 f#4 ~, ~@12 g4 ~@3", // A C#dim F#5
  AI: "[b3,d4,f#4]@3 ~ [b3,d4]@2 f#4 ~ [b3,e4]@3 ~ [b3,d4]@3 ~, ~@4 g4 ~@11", // Bm E5 Bm
  AJ: "[a3,c#4,e4]@4 [a3,c#4,f#4]@3 ~ [a3,c#4,f#4]@3 ~ [a3,c#4,f#4]@3 ~", // A F#m
  AK: "[b3,d4,g4] ~ [b3,d4,g4]@3 ~ [d4,f#4,a4]@4 ~@2 [d4,f#4,a4] ~ f#4 ~", // G D
  AL: "[[d4,f#4,g4]@4 a4@2 [c#4,e4]@2 [c#4,e4]@2 g4 ~ f#4 ~ [b3,d4,g4]@5 ~ [b3,d4,g4]@3 ~ [b3,d4,g4] ~ a4 ~ [b3,d4,g4] ~ [a3,d4,f#4]@2, ~@8 a4 ~@23]/2", // Gmaj7 C#m G D
  AM: "[~@2 [a3,d4]@4 ~@2 [a3,e4] ~ f#4 ~ d4 ~ b3@7 ~@3 [b3,d4] ~ e4 ~ [b3,d4,f#4]@3 ~]/2", // D5 A5 Bm
  AN: "[b3,d4,g4]@3 ~ f#4 ~ [a3,c#4]@2 [a3,c#4,f#4]@5 ~@3, ~@6 f#4 ~@9", // G A F#m
  AO: "[b3,d4,g4]@3 ~ [b3,d4,g4]@3 ~ [b3,d4,g4] ~ [b3,d4,a4]@4 ~@2", // G Bm7
  AP: "[d4,f#4]@2 [d4,f#4,a4]@3 ~ [a3,e4]@3 ~ [a3,d4]@4 ~@2, b4 ~@15", AQ: "~@8 [b3,d4] ~ [b3,e4] ~ [b3,d4,f#4]@3 ~",
  AR: "[b3,d4,g4] ~ [b3,d4,f#4]@3 ~ [a3,e4]@3 ~ [a3,d4,f#4]@4 ~@2", AS: "d4@3 ~ c#4 ~ [a3,d4]@4 ~@2 [a3,c#4]@3 ~",
  AT: "[b3,d4]@3 ~ [a3,c#4]@3 ~ [g3,d4]@3 ~ [a3,c#4]@3 ~", AU: "[~@2 [a4,d5,f#5] ~, [a3,d4]@3 ~]/2",
})).s("gm_drawbar_organ").gain(0.4).pan(0.4)

// bass · acoustic bass · "Bass"
const bass = note(`<
  A@2 B C D E F G H G I C D E I J E K E L M N E L O P Q R B C D E F G H G I C D E I J E K E L M N E L O P Q S L G H G T
  U V G W X V G W Y Z AA@2 I AB AC E L G E K E L M N E L O AD AE H I O N E L M P AE R AF@2
>`.pickRestart({
  A: "[d3@3 ~ c#3 ~ b2 ~@3 a2@3 ~ g2@10 ~@4 a2 ~ a2 ~]/2", B: "d2@5 ~ d2@4 ~@2 d3@3 ~",
  C: "a2@3 ~@3 a2@4 ~@2 a2 ~ f#2 ~", D: "b2@3 ~@3 b2@4 ~@2 b2 ~ a2 ~", E: "g2@3 ~@3 g2@4 ~@2 g2 ~ g2 ~",
  F: "d2@3 ~@3 d2@4 ~@2 a2 ~ a2 ~", G: "a2@3 ~@3 a2@4 ~@2 a2 ~ a2 ~", H: "g2@3 ~@3 g2@4 ~@2 g2@3 ~",
  I: "d2@3 ~@3 d2@4 ~@2 d3@3 ~", J: "a2@3 ~@3 g2@4 ~@2 b2 ~ a2 ~", K: "a2@3 ~@3 a2@3 ~ a2 ~ a2 ~ a2 ~",
  L: "d2@3 ~@3 d2@4 ~@2 d3 ~ d3 ~", M: "g2@3 ~@3 g2@3 ~ g2 ~ b2 ~ d3 ~", N: "g2@4 ~@2 a2@4 ~@2 a2 ~ a2 ~",
  O: "g2@3 ~@3 g2@4 g2 ~ b2 ~ d3 ~", P: "g2@4 ~@2 d2@4 ~@2 d3@3 ~", Q: "b2@4 ~@2 a2@4 a2 ~ a2 ~@3",
  R: "g2@4 ~@2 g2 ~ b2@3 ~ a2@3 ~", S: "g2@3 ~@3 g2@4 ~@2 a2@3 ~", T: "g2@3 ~@3 f#2@4 ~@2 g2 ~ b2 ~",
  U: "d3@3 ~@3 f#2@4 ~@2 f#2 ~ f#2 ~", V: "d3@3 ~@3 g2@4 ~@2 b2 ~ d3 ~", W: "g2@3 ~@3 f2@4 ~@2 g2 ~ b2 ~",
  X: "d3@3 ~@3 f2@4 ~@2 f2 ~ f2 ~", Y: "d3@3 ~@3 f2@4 ~@2 f2@3 ~", Z: "g2@3 ~@3 g2@4 a2 ~ b2 ~ c3 ~",
  AA: "[d3@3 ~ c3 ~ b2@3 ~ a2@3 ~ g2@10 ~@4 a2 ~ a2 ~]/2", AB: "a2@3 ~@3 a2@4 ~@2 a2 ~ f2 ~",
  AC: "b2@3 ~@3 b2@4 ~@2 b2 ~ f2 ~", AD: "g2@4 ~@2 d2@4 ~@2 d3 ~ c#3 ~", AE: "b2@4 ~@2 a2 ~ a2@5 ~@3", AF: "[d2@3 ~]/2",
})).s("gm_acoustic_bass").gain(0.4).pan(0.4)

// chords · violin · "Violin Fill"
const violin = note("<A@2 ~@25 B ~@27 C D E ~@42>".pickRestart({
  A: "[[a4,d5,f#5]@3 ~ [a4,e5] ~ [f#4,b4,d5] ~@3 [e4,a4,c#5]@4 [d4,b4]@10 ~@4 [e4,c#5]@3 ~]/2", // D A5 Bm A G C#m
  B: "[d4,g4,b4]@4 ~@2 [d4,g4,b4]@2 [d4,g4,b4]@3 ~ [e4,a4,c#5]@3 ~", // G A
  C: "d4 ~ f#4 ~ a4 ~ [c#4,e4,a4]@5 ~@3 f#4 ~, b3 ~@3", // A
  D: "[b3,f#4,a4] ~ [b3,f#4,a4]@3 ~ f#4 ~ [b3,f#4,a4]@3 ~ f#4 ~ [b3,d4,g4,a4]@2", // B7 G
  E: "~@2 [b3,d4,g4,a4]@3 ~ [b3,d4,g4,a4]@4 ~@4 d4 ~", // G
})).s("gm_violin").gain(0.4).pan(0.4)

stack(drawbar_organ, bass, violin)