Strudelify

Banana Republic

Gregori

KeyG majorTempo115 bpm
0:00/0:00
// Banana Republic — Gregori
// 115 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 92 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(115/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 · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~ A B C D E F G H@2 I J K L M N O P I J K L M N O P Q@2 R S T U V W Q@2 X Y A B Z AA A B C D E F G H@2 I J K L M N O P
  I AB K L M N O P Q@2 R AC AD U AE W Q@2 X Y A B Z AA A B C D E F AF@2 ~
>`.pickRestart({
  A: "d2@7 ~@2 d2 ~@2 d2@12", B: "g1@7 ~@2 g1@2 ~ c2@4 ~@2 c2@4 ~@2", C: "d2@7 ~@2 d2@3 c2@3 ~@3 c2@6",
  D: "g1@4 ~@2 g1@6 a1@6 b1@5 ~", E: "d2@7 ~@2 d2 ~@2 d2@11 ~", F: "g1@7 ~@2 g1@3 c2@5 ~ c2@5 ~",
  G: "d2@8 ~ d2@3 c2@12", H: "[g1@43 ~@5]/2", I: "g1@2 ~ g1@3 b1 d2", J: "g1@4 ~@5 g1@9 b1@6",
  K: "a1@4 ~@5 a1@7 ~@2 d1@6", L: "a1 ~@2 a1@3 b1@2", M: "d2@3 ~@6 d2@9 b1@5 ~", N: "d1@4 ~@5 d1@9 a1@6",
  O: "g1 ~@2 g1@3 d1@2", P: "g1@2 ~@7 g1@8 ~ d2@6", Q: "d2@6 ~@3 d2 ~@2 d2@9 ~@3", R: "a1@7 ~@2 a1 ~@2 a1@9 ~@3",
  S: "a1@7 ~@2 a1 ~@2 a1@5 ~ b1@6", T: "d2@6 ~@3 d2 ~@2 d2@6 c2@6", U: "g1@7 ~@2 g1@3 c2@4 ~@2 c2@4 ~@2",
  V: "g1@7 ~@2 g1@2 ~@7 d2@6, ~@3 d1@2 ~", W: "g1@7 ~@2 g1 ~@2 g1@7 ~@5", X: "d#2@7 ~@2 d#2 ~@2 d#2@9 ~@3", Y: "d2",
  Z: "g1@7 ~@2 g1@3 d2@3 ~@3 d2@6", AA: "g1 ~@3", AB: "g1@5 ~@4 g1@9 b1@6", AC: "a1@7 ~@2 a1 ~@2 a1@6 b1@6",
  AD: "d2@6 ~@3 d2 ~@2 d2@5 ~ c2@6", AE: "g1@7 ~@2 g1@2 ~ d1@6 d2@6",
  AF: "[d2@8 ~ d2@3 c2@3 ~@3 c2 ~@2 g1@7 ~@2 g1@16 ~@2]/2",
})).s("gm_electric_bass_finger").gain(0.64)

// other · french horn · "HORN/E.PNO"
const french_horn = note("<A B C D E B C D ~@33 A B C D E B C D ~@33 A B C D E B C D ~@2>".pickRestart({
  A: "~@6 b4@6 c5@6 b4@5 ~", B: "d5 a4", C: "~@2 b4 g4@3 e4@2", D: "f#5@3 g5 e5@2 f#5 d5", E: "~ b4 c5 b4",
})).s("gm_french_horn").gain(0.67)

// chords · epiano2 · "HORN/E.PNO"
const epiano2 = note(`<
  ~@9 A@3 B@2 C@2 D@2 E@2 F@2 G@4 H@2 I@2 J K L M H@2 N ~ O P Q ~@9 R@5 C@2 D@2 E@2 S@2 G@4 H@2 I@2 J K L M H@2 N ~ O P
  Q ~@10
>`.pickRestart({
  A: "[~@23 g2@48 ~, ~@21 d4@50 ~, ~@21 b3@46 ~@5, ~@22 a3@45 ~@5, ~@23 g3@44 ~@5]/3", B: "[[a2,e3], [a3,c4]@15 ~]/2",
  C: "[[d3,a3]@47 ~, [f#3,d4]@11 ~]/2", D: "[[g2,d4]@7 [a2,a3,c4], [g3,b3]@20 ~ e3@2 ~]/2",
  E: "[[g2,d3,b3], g3@43 ~@5]/2", F: "[[a2,a3]@41 ~ e4@5 ~, [e3,c4]@21 a3 ~@2, ~@41 a2@7]/2",
  G: "[[f#3,a3,d4]@39 ~@3 [f#3,d4]@5 ~ [g2,g3,b3,d4]@44 ~@4, d3@38 ~ d3@7 ~@50, ~@14 a3@17 ~]/4", // D G
  H: "[[c4,d4,f4,a4] ~@8 [c4,d4,f4,a4]@34 ~@5]/2", I: "[[c4,e4,g4,a4] ~@8 [c4,e4,g4,a4]@34 ~@5]/2",
  J: "[d4,e4,f#4,a4] ~@8 [d4,e4,f#4,a4]@10 ~@5", K: "[a4,a#4] b4@2 g4 ~@2 e4 ~@2 [d4,g4]@10 ~@5, d5 ~@11",
  L: "[b3,d4,g4] ~@8 [c4,e4,g4]@13 ~@2", M: "[b3,d4,g4]@5 ~", N: "[a#3,d#4]@3 ~, d#2@5 ~", O: "[a3,d4,f#4]@7 ~",
  P: "[g3,b3,d4]@8 ~ [g3,c4,e4]@12 ~@3", Q: "[g3,b3,d4]@2 ~ [f#3,a3,d4]@2 ~",
  R: "[~@23 g2@48 ~ [a2,e3]@48, ~@21 d4@50 ~@49, ~@7 b3@15 ~@2 c4@15 ~, ~@22 a3@45 ~@4 a3@44 ~@5, ~@23 g3@44 ~@53]/5", // A5
  S: "[[e3,c4]@7 [a2,e4], [a2,a3]@41 ~ a3@2 ~@4]/2", // C A5 A
})).s("gm_epiano2").gain(0.53)

// other · fretless bass · "VIBE/FRTLS"
const fretless_bass = note(`<
  ~@9
  [~@3 d4 ~@2 g4 ~@2 b4 ~@2 e5 ~@11]
  ~@40
  [~@3 d4 ~@2 g4 ~@2 b4 ~@2 e5 ~@11]
  ~@40
  [~@3 d4 ~@2 g4 ~@2 b4 ~@2 e5 ~@11]
>`).s("gm_lead_8_bass_lead").gain(0.3)

// other · vibraphone · "PRG.CHANGE"
const vibraphone = note("<A B C D A B C E@2 ~@32 A B C D A B C E@2 ~@32 A B F@7 ~>".pickRestart({
  A: "~ b3 c4 b3", B: "d4 a3", C: "~@6 b3@3 g3@8 ~ e3@6", D: "f#4@3 g4 e4@2 f#4 d4",
  E: "[f#4@3 g4 e4@2 f#4 d4@2 ~ [g3,d4]@6]/2", // G5
  F: "[~@6 b3@3 ~@9 e3@6 f#4@9 g4@3 e4@6 f#4@3 d4@4 ~@5 b3@6 c4@6 b3@6 d4@12 a3@12 ~@6 b3@3 ~@9 e3@6 f#4@9 g4@3 e4@6 f#4@3 d4@6 ~@3 d4@18, ~@3 g3@32 g3@21]/7",
})).s("gm_vibraphone").gain(0.56)

// other · electric guitar muted · "PRG.CHANGE"
const electric_guitar_muted = note("<~@51 A B C D E F G H I B C D E F G J ~@25>".pickRestart({
  A: "~@3 d4@2 ~ b4@2 ~ g3@2 ~ a4@3 b4@2 ~ g3@3 g4@2 ~, g3@3 ~@5",
  B: "g3@3 d4@2 ~ b4@2 ~ g3@2 ~ a4@3 b4@2 ~ g3@3 g4@2 ~", C: "c4@2 ~ d4@2 ~ b4@2 ~ c4@2 ~ a4@3 b4@3 c4@2 ~ g4@3",
  D: "c4@2 ~ d4@3 b4@2 ~ g3@2 ~ a4@3 b4@3 c4 ~@2 g4@2 ~", E: "d3@2 ~ d4@2 ~ b4@2 ~ d4 ~@2 a4@3 b4@3 d3 ~@2 f#4@2 ~",
  F: "d3 ~@2 d4@3 b4@3 g3 ~@2 a4@3 b4@3 g3 ~@2 g4@3", G: "g3@2 ~ d4@3 b4@2 ~ g3@2 ~ a4@3 b4@2 ~ g3@2 ~ g4@2 ~",
  H: "g3@2 ~ d4@2 ~ b4@2 ~ g3@2 ~ a4@3 b4@2 ~ g3 ~@2 d4@2 ~", I: "g3@2 ~ d4@2 ~ b4@2 ~ g3@2 ~ a4@3 b4@2 ~ g3@3 g4@2 ~",
  J: "g3@2 ~ d4@2 ~ b4@2 ~ g3@2 ~ a4@3 b4@2 ~ g3@2 ~ d4@2 ~",
})).s("gm_electric_guitar_muted").gain(0.64)

// chords · electric bass pick · "PRG.CHANGE"
const electric_bass_pick = note("<~@26 A B C D E F G H A B I ~@30 J B C D E F G H A B I ~@14>".pickRestart({
  A: "~@6 [a3,d4,f4]@2 ~@10 [a3,f4] ~@5, ~@9 d4 ~@2", B: "~@3 [a3,d4,f4] ~@5 [a3,d4,f4] ~@2",
  C: "~@6 [a3,c4,e4]@2 ~@10 [a3,c4] ~@5, ~@9 e4 ~@2", D: "~@3 [a3,c4,e4] ~@5 [a3,c4,e4] ~@2",
  E: "~@2 [f#3,a3,d4] ~@3 [f#3,a3,d4] ~", F: "~@2 [g3,b3,d4] ~@3 [e3,g3,c4] ~",
  G: "~@6 [g3,b3,d4]@2 ~@10 [f#3,a3,d4]@3 ~@3", H: "~@3 [g3,b3,d4] ~@5 [g3,b3] ~@2, ~@18 d4 ~@5",
  I: "~@3 [c4,d#4,g4] ~@5 [c4,g4] ~@2, ~@18 d#4 ~@5", J: "~@6 [a3,d4,f4]@2 ~@10 [a3,d4,f4] ~@5",
})).s("gm_electric_bass_pick").gain(0.56)

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

// drums · rim
const rim = s("rim").struct("<~ [~@3 x]!7 ~@2 [~@3 x]!16 ~@25 [~@3 x]!16 ~@25>").gain(0.74)

// drums · snare
const snare = s("sd").struct("<~@26 A B@7 A B@2 C B@3 C B@7 ~@18 A B@7 A B@2 C B@3 C B@7 C ~>".pickRestart({
  A: "x!2 ~ x", B: "~ x ~ x", C: "x",
})).gain(0.66)

// drums · mid tom
const mid_tom = s("mt").struct("<~@25 A ~@7 B ~@32 B ~@7 A ~@17>".pickRestart({
  A: "~@5 x ~ x", B: "~@7 x",
})).gain(0.66)

// drums · high tom
const high_tom = s("ht").struct("<~@8 A ~@16 B ~@7 C ~@4 A ~@3 A ~@6 A ~@16 C ~@7 B ~@4 A ~@3 A ~@8>".pickRestart({
  A: "x", B: "~@3 x ~@4", C: "~@5 x!2 ~",
})).gain(0.66)

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

// drums · bongos
const bongos = s("bongo:4").struct(`<
  ~ A@8 ~ A@27 ~@2 A@2 ~ A@2 ~ A@2 ~ A@2 ~ A@27 ~@2 A@2 ~ A@2 ~ A@2 ~ A@2 ~
>`.pickRestart({
  A: "~@3 x ~@4",
})).gain(1.16)

// drums · bongos
const bongos_2 = s("bongo:18").struct(`<
  ~ A B A B A B A B ~ B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@2 A B ~ A B ~ A B ~ A B ~ B A B A B A B A
  B A B A B A B A B A B A B A B A B A B ~@2 A B ~ A B ~ A B ~ A B ~
>`.pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(1.16)

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

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

stack(
  bass, french_horn, epiano2, fretless_bass, vibraphone, electric_guitar_muted, electric_bass_pick, kick, rim, snare,
  mid_tom, high_tom, ride, bongos, bongos_2, congas, shaker
)