Strudelify

Mockin' Bird Hill

Roots Syndicate

KeyG majorTempo133 bpm
0:00/0:00
// Mockin' Bird Hill — Roots Syndicate
// 133 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 1 "Piano" piano (copy of ch 5 "CleanGtr" electric guitar clean)
// note: Full arrangement: all 104 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(133/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 · fretless bass · "Basgitaar"
const bass = note(`<
  A B C D E B C D F G H I J K L M N G O P J K L M N G O P J K L M N G O P J K L M N G O P J K L M N G H P J K L M N G H
  I J K L M N G H I J K L M N G O I J K L M N G O P J K L M N G O P J K L M N G O P J K L ~
>`.pickRestart({
  A: "~@12 b1@3 ~ d2@2 e2@2 d2 ~ b1@2", B: "g1@2 ~ b1@2 ~ g2@2 ~ d2@2 b1", C: "c2@2 ~ e2@2 ~ a2@3 ~@2 a2",
  D: "d2@2 ~ d2@2 a1 d2@2 ~ d2@2 a1", E: "g1 ~ g1 d2@2 ~ g2@2 ~ d2@2 b1", F: "g1 ~ g1 d2@2 ~ d2@3 d2@3",
  G: "g1@2 ~@2 g1@2 b1@3 ~@3 g2@4 ~@2 d2@2 ~@2 b1@2", H: "g1@3 ~ g1 ~ b1@3 ~@3 g2@4 ~@2 b1@2 ~@2 b1@2",
  I: "c2@4 ~@6 e2@2 g2@2 ~@2 g2 ~ a2@3 ~ g2@2", J: "c2@6 ~@4 e2@2 g2@2 ~@2 g2@2 a2@3 ~ a2@2",
  K: "d2@3 ~@3 d2@3 ~ a1@2 d2@2 ~@2 d2 ~ b1@3 ~ a1@2", L: "~@4 d2@2 ~@4 d2@2 f#2@2 ~@2 a2@2 c3@3 ~@3",
  M: "g1@3 ~ g1 ~ g1@4 ~@2 c2@4 ~@2 e2@3 ~@3", N: "g1@3 ~ g1@2 ~@4 a#1@2 b1@3 ~ d2 ~ e2@3 ~ d2@2",
  O: "g1@3 ~ g1@2 b1@3 ~@3 g2@4 ~@2 b1@2 ~@2 b1@2", P: "c2@4 ~@6 e2@2 g2@2 ~@2 g2@2 a2@3 ~ g2@2",
})).s("gm_fretless_bass").gain(0.45)

// other · lead 3 calliope · "Fluit"
const lead_3_calliope = note("<A B C D E B C D F ~@95>".pickRestart({
  A: "~@12 b5@3 ~ d6 ~ e6 d6 ~@2 b5 ~", B: "g5@3 ~ b5@2 ~@2 d6@2 ~@2 g6@3 ~ d6@2 ~@2 b5@2 ~@2",
  C: "a5@3 ~ c6@2 ~@2 e6@2 ~@2 a6@6 ~@2 f#6 ~ e6 ~", D: "d6@3 ~ f#6@2 ~@2 a6@2 ~@2 c7@2 ~@2 a6@3 ~ c7@3 ~",
  E: "b6@3 ~ g6@2 ~@2 e6@2 ~@2 d6@5 ~@3 d6 ~ b5 ~", F: "b6@3 ~ g6@2 ~@2 e6@2 ~@2 g6@5 ~@7",
})).s("gm_lead_3_calliope").gain(0.21)

// chords · electric guitar jazz · "JazzGitaa" · G Am G Am G Am G Am
const electric_guitar_jazz = note(`<
  ~
  [~@10 [g4,b4]@2 [a4,c5]@3 ~ [g4,b4]@2 ~@6]
  [~@3 [a4,c5] ~@2]!2
  [~@12 [e4,a4,c5]@5 ~@7]
  [~@10 [g4,b4]@2 [a4,c5]@3 ~ [g4,b4]@2 ~@6]
  [~@3 [a4,c5] ~@2]!2
  [~@12 [e4,a4,c5]@5 ~@7]
  ~@95
>`).s("gm_electric_guitar_jazz").gain(0.25).pan(0.8)

// chords · electric guitar clean · "CleanGtr"
const electric_guitar_clean = note(`<
  ~ A B C A@2 B C A@3 B@2 C@2 D A@3 B@2 C@2 D A@3 B@2 C@2 D A@3 B@2 C@2 D A@3 B@2 C@2 D A@3 B@2 C@2 D A@3 B@2 C@2 D A@3
  B@2 C@2 D A@3 B@2 C@2 D A@3 B@2 C@2 D A@3 B@2 C@2 D A@3 B@2 C E ~
>`.pickRestart({
  A: "~@4 [d4,g4,b4] ~@5 [d4,g4,b4] ~@5 [d4,g4,b4] ~@5 [d4,g4,b4] ~", // G
  B: "~@4 [e4,g4,c5] ~@5 [e4,g4,c5] ~@5 [e4,g4,c5] ~@5 [e4,g4,c5] ~", // C
  C: "~@4 [f#4,a4,d5] ~@5 [f#4,a4,d5] ~@5 [f#4,a4,d5] ~@5 [f#4,a4,d5] ~", // D
  D: "~@4 [d4,g4,b4] ~@5 [d4,g4,b4] ~@5 [e4,g4,c5] ~@5 [e4,g4,c5] ~", // G C
  E: "~@4 [f#4,a4,d5] ~@5 [f#4,a4,d5] ~@5 [f#4,a4,d5] ~@7", // D
})).s("gm_electric_guitar_clean").gain(0.52).pan(0.2)

// chords · rock organ · "Orgel"
const rock_organ = note(`<
  ~@9 A B C D E@2 F@2 A B C D E@2 F@2 G H@2 I J K L M G N@2 I J O L M A B C P E@2 F@2 A B C P E@2 F@2 G Q@2 R S O T U G
  Q@2 I S K T U A B C D E@2 F@2 A B C D E@2 F@2 A B C D E@2 F@2 A B C P E@2 ~
>`.pickRestart({
  A: "~@10 b4@2 [b4,d5]@3 ~ [g4,b4] ~@7, ~@10 g4 ~@13", B: "~@10 d5@2 g5@3 ~ [b4,d5] ~@7, ~@10 b4 ~ d5 ~@11",
  C: "~@10 [a4,c5] ~ [c5,e5]@3 ~ c5@2 ~@6, ~@16 a4 ~@7", D: "~@10 e5@2 [c5,e5] ~@3 c5@2 ~@6, ~@10 c5 ~ g5@2 ~@2 e5 ~@7",
  E: "[[a4,d5]@47 ~, f#4@15 ~]/2", F: "[[d4,b4] c5 [d4,b4]@2, g4, ~@6 e4@5 ~@13]/2",
  G: "[d4,g4,b4]@3 ~ [d4,g4,b4] ~@5 [g4,b4]@2 [d4,g4,b4]@3 ~ [d4,g4,b4] ~@7, ~@10 d4 ~@13", // G
  H: "[[d4,g4,b4]@3 ~ [d4,g4,b4] ~@5 [d4,g4,b4] ~ [d4,g4,b4]@3 ~ [d4,g4,b4] ~@5 [d4,b4] ~ [e4,c5]@3 ~ [e4,g4] ~@5 [e4,g4] ~ [g4,c5]@3 ~ [g4,c5] ~@7, ~@22 g4@5 ~ c5@2 ~@4 c5@2 e4@4 ~@8]/2", // G C Em C5
  I: "[e4,g4,c5]@3 ~ [e4,g4,c5] ~@5 [e4,g4,c5] ~ [e4,g4,c5]@3 ~ [e4,g4,c5]@2 ~@4 [e4,g4,c5] ~", // C
  J: "[f#4,a4,d5]@4 [a4,d5] ~@5 [f#4,a4,d5] ~ [f#4,a4,d5]@3 ~ [f#4,d5]@2 ~@6, ~@16 a4 ~@7", // D D5 D
  K: "[f#4,a4,d5]@3 ~ [f#4,a4,d5] ~@5 [f#4,a4,d5] ~ [a4,d5]@3 ~ d5@2 ~@4 [f#4,a4,d5] ~, ~@2 f#4 ~, ~@16 a4 ~@7", // D D5 D
  L: "[d4,g4,b4]@3 ~ [d4,g4] ~@5 [d4,b4] ~ [e4,c5]@3 ~ [e4,g4] ~@5 [g4,c5]@2, ~@4 b4@2 ~@4 g4@5 ~ c5@2 ~@6", // G G5 G C Em C5
  M: "[d4,g4,b4]@3 ~ [d4,g4,b4] ~@5 [d4,g4] ~@5 [d4,g4,b4]@2 ~@4 [g4,b4]@2, ~@10 b4@2 ~@10 d4 ~", // G G5 G
  N: "[[d4,g4,b4]@3 ~ [d4,g4,b4] ~@5 [d4,g4,b4] ~ [d4,g4,b4]@3 ~ [d4,g4] ~@5 [d4,b4] ~ [e4,c5]@3 ~ [e4,g4,c5] ~@5 [e4,g4] ~ [g4,c5]@3 ~ [g4,c5] ~@7, ~@16 b4@2 ~@4 g4@5 ~@7 c5@2 e4@4 ~@8]/2", // G G5 G C Em C5
  O: "[f#4,a4,d5]@3 ~ [f#4,a4,d5] ~@5 [f#4,a4,d5] ~ [a4,d5]@3 ~ [a4,d5]@2 ~@4 [f#4,a4,d5] ~, ~@2 f#4 ~", // D D5 D
  P: "~@5 e5 [e5,g5] ~ c5 ~@3, ~@10 c5 ~ c5 ~@3 e5 ~@7", // Em
  Q: "[[d4,g4,b4]@3 ~ [d4,g4,b4] ~@5 [d4,g4,b4] ~ [d4,g4,b4]@3 ~ [d4,g4] ~@5 [d4,b4] ~ [e4,c5]@3 ~ [e4,g4] ~@5 [e4,g4,c5] ~ [g4,c5]@3 ~ [g4,c5] ~@7, ~@16 b4@2 ~@4 g4@5 ~ c5@2 ~@6 e4@4 ~@8]/2", // G G5 G C Em C C5
  R: "[e4,g4,c5]@3 ~ [e4,g4,c5] ~@5 [e4,g4,c5] ~ [e4,g4,c5]@3 ~ [e4,g4] ~@5 [e4,g4,c5] ~, ~@8 c5 ~@3", // C Em C
  S: "[f#4,a4,d5]@4 [a4,d5] ~@5 [f#4,a4] ~ [f#4,a4,d5]@3 ~ [f#4,d5]@2 ~@6, ~@10 d5@2 ~@4 a4 ~@7", // D D5 F#m D
  T: "[d4,g4,b4]@3 ~ [d4,g4] ~@5 [d4,b4] ~ [e4,c5]@3 ~ [e4,g4] ~@5 c5@2, ~@4 b4@2 ~@4 g4@5 ~ c5@2 ~@4 g4 ~", // G G5 G C Em
  U: "[d4,g4,b4]@3 ~ [d4,g4,b4] ~@5 [g4,b4]@2 ~@4 [d4,g4,b4]@2 ~@4 [d4,g4,b4] ~, ~@10 d4 ~@13", // G
})).s("gm_rock_organ").gain(0.25).pan(0.3)

// chords · accordion · "Accordeon"
const accordion = note(`<
  ~@9 A B C D E F G@2 A B C H I J K@2 ~@6 L M ~@6 L M A B C N E O G@2 A B C H I J K@2 ~@16 A B C D E F G@2 A B C H I J
  K@2 A B C N E O G@2 A B C H I P ~
>`.pickRestart({
  A: "~@6 [b4,d5]@3 ~ a4@2 [g4,b4]@3 ~ [g4,b4]@2 ~@6, ~@10 c5 ~@13", // Bm G
  B: "~@6 [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~ [b4,d5,g5]@3 ~ [b4,d5,g5]@2 ~@6", // G
  C: "~@6 [a4,c5]@3 ~ b4@2 ~ c5@3 [g4,c5]@2 ~@6, ~@10 d5 ~ a4@3 ~@9", // Am C5
  D: "~@6 [g4,c5,e5] ~ [g4,c5,e5] ~ [g4,c5,e5] ~ [c5,e5,g5]@5 ~@5 [c5,e5] ~", // C
  E: "[d5,f#5]@3 ~@3 [d5,f#5]@3 ~@9 [d5,f#5]@3 ~ d5@2, ~@22 f#5 ~", // D
  F: "[b4,e5]@3 ~ [a4,d5]@3 ~@11 [c5,e5]@3 ~ e5@2, ~@22 c5 ~", // E5 D5 C
  G: "[[g4,b4,d5]@11 ~ [e4,g4,b4]@5 ~ [e4,b4]@3 ~ [d4,g4,b4]@10 ~@16]/2", // G Em E5 G
  H: "~@6 [g4,c5,e5] ~ [g4,c5,e5] ~ [g4,c5] ~ [c5,e5,g5]@5 ~@7, ~@5 e5 ~@6", // C C5 C
  I: "[f#4,a4,d5]@3 ~@3 [f#4,a4,d5]@3 ~@3 [f#4,a4,d5]@3 ~@3 [f#4,a4,d5]@3 ~ [f#4,a4] ~, ~@11 e5", // D F#m
  J: "~ f#4@2 ~ [f#4,a4]@3 ~@11 [f#4,a4]@2 ~@2 [f#4,a4]@2, [a4,b4]@2 ~@7 c5@2 ~", // F#m Asus2
  K: "[[d4,g4,b4]@6 [e4,g4]@3 [c4,e4,a4]@2 [b3,g4]@8 ~@5, ~@6 b4@2 ~@3 d4@7 ~@6]/2", // G Em Am Em
  L: "[b4,d5]@10 ~@2 [b4,d5]@5 ~ [a4,c5]@5 ~", M: "[g4,b4] ~",
  N: "~@6 [g4,c5,e5] ~ [g4,c5,e5] ~ [g4,c5,e5] ~ [c5,e5,g5]@5 ~@5 c5@2, ~@22 e5 ~", // C
  O: "[b4,e5]@3 ~ [a4,d5]@3 ~@11 [c5,e5]@3 ~ [c5,e5]@2", // E5 D5 C
  P: "~ f#4@2 ~ [f#4,a4]@3 ~@11 [f#4,a4]@2 ~@4, [a4,b4]@4 ~@14 c5@5 ~", // F#m Asus2
})).s("gm_accordion").gain(0.45).pan(0.8)

// other · tenor sax
const tenor_sax = note(`<
  ~@25 A B C D E F G H A B C I E F G H A B C I E F G J A B C I E K G J A B C D E K G J A B C D E K G J A B C D E K G H A
  B C D E F G H A B C D E F G H A B C I E F ~
>`.pickRestart({
  A: "~@4 g2@2 b2@4 c3@2 d3@3 ~ e3@2 d3@3 ~@3", B: "~@4 g2@2 b2@4 c3@2 d3@5 ~ e3@3 ~ d3@2",
  C: "c3@3 ~@7 e3@2 g3@2 ~@2 g3@2 a3@4 g3@2", D: "c3@3 ~ c3@2 e3@3 ~ g3@2 ~@4 g3@2 a3@4 ~@2",
  E: "~@2 d3 ~@2 d3 ~@2 d3 b2@2 a2", F: "~@10 f#2@2 a2@3 ~ b2 ~ c3@2 ~@2 b2 ~",
  G: "g2@2 ~@2 g2@2 b2@3 ~ d3@3 ~@3 d3@2 e3@3 ~ d3@2", H: "g2@2 ~@2 g2 ~ b2@3 ~ d3@5 ~ d3@2 e3@3 ~ d3@2",
  I: "c3@3 ~ c3@2 e3@3 ~ g3@2 ~@4 g3 ~ a3@4 ~@2", J: "g2@2 ~@2 g2@2 b2@3 ~ d3@5 ~ d3@2 e3@3 ~ d3@2",
  K: "~@10 f#2@2 a2@3 ~ b2@2 c3@2 ~@2 b2 ~",
})).s("gm_tenor_sax").gain(0.35).pan(0.3)

// drums · kick
const kick = s("bd").struct("<~ [x!2 ~ x] [~ x ~ x]!3 [x!2 ~ x] [~ x ~ x]!97 ~>").gain(0.54)

// drums · rim
const rim = s("rim").struct("<~ [~ x ~ x]!102 ~>").gain(0.54)

// drums · snare
const snare = s("sd").struct("<[~@6 x ~ x!4] ~@103>").gain(0.48)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B
  A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@2 ~
>`.pickRestart({
  A: "x ~ x!2 ~ x!2 ~ x!2 ~ x", B: "x ~ x!2 ~ x!2 ~ x!2 ~@2",
})).gain(0.48)

// drums · open hat
const open_hat = s("oh").struct(`<
  A ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B
  ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3 B ~@3
>`.pickRestart({
  A: "~ x", B: "~@11 x",
})).gain(0.48)

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

// drums · ride
const ride = s("rd").struct(`<
  ~@65
  [~@2 x!2 ~ x!2 ~ x!2 ~ x]
  [x ~ x!2 ~ x!2 ~ x!2 ~ x]!3
  [~@2 x!2 ~ x!2 ~ x!2 ~ x]
  [x ~ x!2 ~ x!2 ~ x!2 ~ x]!3
  ~@31
>`).gain(0.48)

// drums · congas
const congas = s("conga:13").struct(`<
  ~ A@15 B A@7 B A@7 B A@7 B A@7 B A@7 B A@7 B A@7 B A@7 B A@7 B A@7 B A@5 C ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@3 x ~@4 x!4", C: "~ x ~@2",
})).gain(1.54)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~ A ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3
  ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~@2
>`.pickRestart({
  A: "~@11 x",
})).gain(1.54)

// drums · ht
const ht = s("ht").struct(`<
  ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
  A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@4
>`.pickRestart({
  A: "~@11 x",
})).gain(0.36)

// drums · shaker
const shaker = s("sh").struct(`<
  ~ A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B
  C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B ~
>`.pickRestart({
  A: "~@3 x!4 ~@7 x ~@3 x ~@3 x ~", B: "~@9 x!4 ~ x ~ x ~@3 x ~@3", C: "x ~@3 x ~ x ~ x ~@3 x ~@3 x ~ x ~ x!4",
  D: "x ~@3 x ~@3 x ~@3 x ~@2 x!4 ~ x ~ x ~",
})).gain(0.3)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct(`<
  ~@2 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
  A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~
>`.pickRestart({
  A: "~ x ~ x ~@8",
})).gain(0.18)

stack(
  bass, lead_3_calliope, electric_guitar_jazz, electric_guitar_clean, rock_organ, accordion, tenor_sax, kick, rim,
// … 2 more lines