Strudelify

MMMbop

Hanson

KeyA majorTempo104 bpm
0:00/0:00
// MMMbop — Hanson
// 104 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 100 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(104/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 · epiano1
const epiano1 = note(`<
  A B A B A B A B A B A B A B A B A B A B A B A B ~@8 A B A B A B A B A B A B ~@8 A B A B A B A B ~@8 A B A B A B A B
  ~@24
>`.pickRestart({
  A: "[e4,a4,c#5]@3 ~ [e4,g#4,b4]@3 ~", B: "[f#4,a4,d5]@3 ~ [e4,g#4,b4]@3 ~",
})).s("gm_epiano1").gain(0.42)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  ~@14 A B C D ~@14 A B C D A B C D A B C D ~@8 A B C D A B C D ~@8 A B C D A B C D ~@24
>`.pickRestart({
  A: "[a3,c#4,e4]@3 ~ [a3,c#4,e4]@2 ~ [a3,c#4,e4] ~ [g#3,b3,c4,e4] [g#3,b3] ~ [g#3,b3,e4]@3 ~", // A E G#m E
  B: "[f#3,a3,d4]@3 ~ [f#3,a3,d4]@3 [g#3,b3,e4] ~ [g#3,b3,e4]!2 ~ [g#3,b3,e4]@3 ~", // D E
  C: "[a3,c#4,e4]@3 ~ [a3,c#4,e4]@3 [a3,c#4,e4] ~ [g#3,b3,e4]!2 ~ [g#3,b3,e4]@3 ~", // A E
  D: "[f#3,a3,d4]@3 ~ [f#3,a3,d4]@3 [g#3,b3,e4] ~ [g#3,b3,e4]!2 ~ [g#3,b3,e4]@2 ~@2", // D E
})).s("gm_overdriven_guitar").gain(0.57).pan(0.7)

// chords · distortion guitar
const distortion_guitar = note("<A B A B A B A B A B A B A B ~@86>".pickRestart({
  A: "a3 e4 c#4 a3 g#3 e4 b3 g#3", B: "a3 f#4 d4 b3 g#3 e4 b3 g#3",
})).s("gm_distortion_guitar").gain(0.35).pan(0.3)

// chords · rock organ · A E D E A E D E …
const rock_organ = note(`<
  ~@18
  [[a4,c#5,e5]@7 ~ [g#4,b4,e5]@7 ~]
  [[f#4,a4,d5]@7 ~ [g#4,b4,e5]@7 ~]
  [[a4,c#5,e5]@7 ~ [g#4,b4,e5]@7 ~]
  [[f#4,a4,d5]@7 ~ [g#4,b4,e5]@7 ~]
  [[a4,c#5,e5]@7 ~ [g#4,b4,e5]@7 ~]
  [[f#4,a4,d5]@7 ~ [g#4,b4,e5]@7 ~]
  ~@76
>`).s("gm_rock_organ").gain(0.29).pan(0.6)

// bass · electric bass pick
const bass = note(`<
  A B A C D E F G H G I E D J F K F L F E F K F E M N O P Q R S T F K F L F K F L F K F L M N O P Q R S T F K F L F K F
  L M N O P Q R S T F K F L F K F L M N O P Q R S T M N O P Q R S T M N O P Q R U ~
>`.pickRestart({
  A: "a2 b2", B: "d3 b2", C: "d3@8 b2@5 ~@3", D: "a1@3 ~ a1@3 e2 ~ e2!2 ~ e2@4", E: "d2@3 ~ d2@3 e2 ~ e2!2 ~ e2@4",
  F: "a1@3 ~ a1@3 e2 ~ e2!2 ~ e2@3 ~", G: "d2@3 ~ d2@3 e2 ~ e2!2 ~ e2@3 ~", H: "a1@3 ~ a1@3 e2 ~ e2 [d2,e2] ~ e2@3 ~",
  I: "a1@3 ~ a1@3 [d#2,e2] ~ e2!2 ~ e2@3 ~", J: "d2@3 ~ d2@3 e2 ~ e2 [d2,e2] ~ e2@4",
  K: "d2@3 ~ d2@2 ~ e2 ~ e2!2 ~ e2@4", L: "d2@3 ~ d2@3 e2 ~ e2!2 ~ e2@4, ~@4 d#2 ~@11",
  M: "a1@3 ~ a1@3 ~ a1 ~@2 a1 ~ a1 a1@2", N: "d2@3 ~ d2@2 ~@2 d2@3 d2 ~ d2!2 ~",
  O: "a1@3 ~ a1@2 ~@2 a1@2 ~ a1 ~ a1!2 ~", P: "e1@3 ~ e1@2 ~ e1@3 ~ e1@2 f#1 g#1 ~",
  Q: "a1@3 ~ a1@3 ~ a1@2 ~ a1 ~ a1!2 ~", R: "d2@3 ~ d2@3 ~ d2@2 ~@2 d2 ~ d2 ~, c2 ~@15",
  S: "a1@2 ~@2 a1@2 ~ a1@2 ~@2 a1 ~ a1!2 ~", T: "e1@3 ~ e1@3 ~ f#1@3 ~ g#1@2 ~@2", U: "a1@2 ~@2 a1@2 ~ a1@2 ~@7",
})).s("gm_electric_bass_pick").gain(0.8).pan(0.4)

// chords · lead 8 bass lead
const lead_8_bass_lead = note(`<
  ~@2 A B C D E B F ~@15 G H I@2 J H I@2 ~@12 G H I@2 G H I@2 ~@8 G H I@2 G H I@2 ~@8 K H L@2 K H M@2 G H I@2 J H I@2 G
  H I@2 G H N ~
>`.pickRestart({
  A: "a4@13 ~@3", B: "~@2 c#5 b4", C: "a4@15 ~", D: "~@7 f#4@4 ~ e4@4", E: "a4", F: "a4@3 ~",
  G: "[a3,c#4,e4,a4]@3 ~ [a3,c#4,e4,a4]@3 ~@4 [a3,c#4,e4,a4] ~ [a3,c#4,e4,a4]@2 ~", // A
  H: "[a3,d4,f#4]@3 ~ [a3,d4,f#4]@2 ~@4 d5@2 c#5 ~ b4@2", // D
  I: "[[a3,c#4,e4,a4]@2 ~@2 [a3,c#4,e4,a4]@3 ~@3 [a3,c#4,e4,a4]@3 [a3,c#4,e4,a4]@2 [g#3,b3,e4,g#4]@3 [e3,g#3,b3,f#4] [e3,g#3,b3,e4]@5 ~@8]/2", // A E
  J: "[a3,c#4,e4,a4]@2 ~@2 [a3,c#4,e4,a4]@3 ~@4 [a3,c#4,e4,a4] ~ [a3,c#4,e4,a4]@2 ~", // A
  K: "[a3,c#4,e4,a4]@3 ~ [a3,c#4,e4,a4]@3 ~@9", // A
  L: "[[a3,c#4,e4,a4]@2 ~@2 [a3,c#4,e4,a4]@3 ~@6 b4@2 g#4@3 f#4 e4@5 ~@8]/2", // A
  M: "[[a3,c#4,e4,a4]@2 ~@2 [a3,c#4,e4,a4]@3 ~@6 a4@2 g#4@3 f#4 e4@5 ~@8]/2", // A
  N: "[a3,c#4,e4,a4]@2 ~@2 [a3,c#4,e4,a4]@3 ~@3 [a3,c#4,e4,a4]@3 ~@3", // A
})).s("gm_lead_8_bass_lead").gain(0.51).pan(0.7)

// chords · brass section
const brass_section = note(`<
  ~@24 A B C D A B A D ~@12 E B C D A B A D ~@8 E B C D A B A D ~@8 E B C D A B A D E B C D A B A D E B C D A B A ~
>`.pickRestart({
  A: "[c#4,e4,a4,c#5] ~ [c#4,e4,a4,c#5] ~@5", B: "[d4,f#4,a4,d5] ~ [d4,f#4,a4,d5] ~@5",
  C: "[c#4,e4,a4,c#5]@3 ~ [c#4,e4,a4,c#5]@2 ~@10", D: "[d4,e4,g#4,b4] ~@3", E: "~@2 [c#4,e4,a4,c#5] ~@5",
})).s("gm_brass_section").gain(0.8).pan(0.2)

// chords · percussive organ
const percussive_organ = note(`<
  ~@24 A B C D A E F@2 ~@12 A B C D A E F@2 ~@8 A B C D A E F@2 ~@8 A B C D A E F@2 A B C D A E F@2 A B C D A E A ~
>`.pickRestart({
  A: "[a5,c#6,e6]@15 ~", B: "[a5,d6,f#6]", C: "[a5,c#6,e6]", D: "[g#5,b5,e6]", E: "[a5,d6,f#6]@15 ~",
  F: "[[a5,c#6,e6]@15 ~ g#5@14 ~@2, ~@15 [b5,e6]@15 ~@2]/2", // A E5
})).s("gm_percussive_organ").gain(0.48).pan(0.6)

// chords · percussive organ
const percussive_organ_2 = note(`<
  ~@2 A B C D E B F ~@15 G H I@2 J H I@2 ~@12 G H I@2 G H I@2 ~@8 G H I@2 G H I@2 ~@8 K H L@2 K H M@2 G H I@2 J H I@2 G
  H I@2 G H N ~
>`.pickRestart({
  A: "a5@13 ~@3", B: "~@2 c#6 b5", C: "a5@15 ~", D: "~@7 f#5@4 ~ e5@4", E: "a5", F: "a5@3 ~",
  G: "[a4,c#5,e5,a5]@3 ~ [a4,c#5,e5,a5]@3 ~@4 [a4,c#5,e5,a5] ~ [a4,c#5,e5,a5]@2 ~", // A
  H: "[a4,d5,f#5]@3 ~ [a4,d5,f#5]@2 ~@4 d6@2 c#6 ~ b5@2", // D
  I: "[[a4,c#5,e5,a5]@2 ~@2 [a4,c#5,e5,a5]@3 ~@3 [a4,c#5,e5,a5]@3 [a4,c#5,e5,a5]@2 [g#4,b4,e5,g#5]@3 [e4,g#4,b4,f#5] [e4,g#4,b4,e5]@5 ~@8]/2", // A E
  J: "[a4,c#5,e5,a5]@2 ~@2 [a4,c#5,e5,a5]@3 ~@4 [a4,c#5,e5,a5] ~ [a4,c#5,e5,a5]@2 ~", // A
  K: "[a4,c#5,e5,a5]@3 ~ [a4,c#5,e5,a5]@3 ~@9", // A
  L: "[[a4,c#5,e5,a5]@2 ~@2 [a4,c#5,e5,a5]@3 ~@6 b5@2 g#5@3 f#5 e5@5 ~@8]/2", // A
  M: "[[a4,c#5,e5,a5]@2 ~@2 [a4,c#5,e5,a5]@3 ~@6 a5@2 g#5@3 f#5 e5@5 ~@8]/2", // A
  N: "[a4,c#5,e5,a5]@2 ~@2 [a4,c#5,e5,a5]@3 ~@3 [a4,c#5,e5,a5]@3 ~@3", // A
})).s("gm_percussive_organ").gain(0.51).pan(0.3)

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

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!98 [~ x ~@2] ~>").gain(0.8)

// drums · snare
const snare = s("sd").struct("<A@23 B C@8 A@11 B A C@7 A@7 B A C@7 A@7 B A C@6 D A C@6 D A C@5 E ~>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@4 x!7", C: "x!2 ~ x", D: "x ~@3 x ~@4 x!7", E: "x!2 ~@2",
})).gain(0.8)

// drums · pedal hat
const pedal_hat = s("hh").struct("<A@2 B C D A@13 B C D A@77 E ~>".pickRestart({
  A: "x ~ x ~ x ~ x!2 ~ x!4 ~ x ~", B: "x ~ x ~ x ~ x!2 ~ x!3 ~@2 x ~", C: "x ~ x!2 ~@2 x!2 ~ x!4 ~ x ~",
  D: "x!2 ~@2 x ~ x!2 ~ x!4 ~ x ~", E: "x ~ x ~ x ~ x!2 ~ x!3 ~@4",
})).gain(0.8)

// drums · guiro
const guiro = s("guiro:0").struct("<[~ x!3 ~ x!3]!98 [~ x!3 ~ x ~@2] ~>").gain(16.9)

stack(
  epiano1, overdriven_guitar, distortion_guitar, rock_organ, bass, lead_8_bass_lead, brass_section, percussive_organ,
  percussive_organ_2, kick, clap, snare, pedal_hat, guiro
)

More by Hanson