Advertisement
Guest User

Untitled

a guest
Apr 14th, 2025
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 32.74 KB | Music | 0 0
  1. import random
  2. from random import randint, uniform, choice
  3. from typing import Any
  4.  
  5.  
  6. class Generator:
  7.     def __init__(self, bankname:str):
  8.         self.gestures:list = []
  9.         self.bankname:str = bankname
  10.         self.possible_effects:list = ["Highpass",
  11.                                  "Tapestop",
  12.                                  "Flanger",
  13.                                  "Lofi",
  14.                                  "Crusher",
  15.                                  "Reverb",
  16.                                  "Chorus",
  17.                                  "CombFilter",
  18.                                  "Phaser",
  19.                                  "Lowpass",
  20.                                  "Distort",
  21.                                  "Limiter",
  22.                                  "Delay",
  23.                                  "WetGain",
  24.                                  "DryGain",
  25.                                  "Pan",
  26.                                  "Gate"]
  27.         self.active_effects:list = []
  28.         self.inactive_effects:list =[]
  29.         self.gesture_string:str = ""
  30.         self.rhythms:list =[
  31.             "1/2", "1/4", "1/8", "1/16", "1/32", "1/64", "1/128", "1/256", "1/512", "1/1024"
  32.         ]
  33.         self.jitter_rhythms: list = [
  34.             "1/2", "1/4", "1/8", "1/16"
  35.         ]
  36.         self.used_rhythms_notes:list = []
  37.         self.possible_notes:list = []
  38.         self.possible_chordshapes:dict = {
  39.             "maj": [
  40.                 [0, 4, 7],
  41.                 [0, 3, 8],
  42.                 [0, 5, 9]
  43.             ],
  44.             "min": [
  45.                 [0, 3, 7],
  46.                 [0, 4, 9],
  47.                 [0, 5, 8]
  48.             ],
  49.             "dim": [
  50.                 [0, 3, 6],
  51.                 [0, 3, 9],
  52.                 [0, 6, 9]
  53.             ],
  54.             "aug": [
  55.                 [0, 4, 8],
  56.                 [0, 4, 8],
  57.                 [0, 4, 8]
  58.             ],
  59.             "sus2": [
  60.                 [0, 2, 7],
  61.                 [0, 5, 10],
  62.                 [0, 5, 7]
  63.             ],
  64.             "sus4": [
  65.                 [0, 5, 7],
  66.                 [0, 2, 7],
  67.                 [0, 5, 10]
  68.             ],
  69.             "maj7": [
  70.                 [0, 4, 7, 11],
  71.                 [0, 3, 7, 9],
  72.                 [0, 4, 8, 9],
  73.                 [0, 1, 5, 8]
  74.             ],
  75.             "min7": [
  76.                 [0, 3, 7, 10],
  77.                 [0, 4, 7, 9],
  78.                 [0, 3, 6, 9],
  79.                 [0, 2, 5, 9]
  80.             ],
  81.             "dom7": [
  82.                 [0, 4, 7, 10],
  83.                 [0, 3, 6, 8],
  84.                 [0, 3, 6, 10],
  85.                 [0, 2, 6, 9]
  86.             ],
  87.             "dim7": [
  88.                 [0, 3, 6, 9],
  89.                 [0, 3, 6, 9],
  90.                 [0, 3, 6, 9],
  91.                 [0, 3, 6, 9]
  92.             ],
  93.             "halfdim7": [
  94.                 [0, 3, 6, 10],
  95.                 [0, 3, 7, 9],
  96.                 [0, 4, 6, 9],
  97.                 [0, 2, 6, 9]
  98.             ],
  99.             "minMaj7": [
  100.                 [0, 3, 7, 11],
  101.                 [0, 4, 8, 9],
  102.                 [0, 4, 5, 9],
  103.                 [0, 1, 5, 8]
  104.             ],
  105.             "augMaj7": [
  106.                 [0, 4, 8, 11],
  107.                 [0, 4, 7, 9],
  108.                 [0, 3, 5, 8],
  109.                 [0, 1, 4, 8]
  110.             ],
  111.             "sus2min7": [
  112.                 [0, 2, 7, 10],
  113.                 [0, 5, 8, 10],
  114.                 [0, 3, 5, 10],
  115.                 [0, 2, 5, 8]
  116.             ],
  117.             "sus4min7": [
  118.                 [0, 5, 7, 10],
  119.                 [0, 2, 5, 9],
  120.                 [0, 4, 7, 10],
  121.                 [0, 3, 5, 7]
  122.             ],
  123.             "sus2dom7": [
  124.                 [0, 2, 7, 10],
  125.                 [0, 5, 8, 10],
  126.                 [0, 3, 5, 10],
  127.                 [0, 2, 5, 8]
  128.             ],
  129.             "sus4dom7": [
  130.                 [0, 5, 7, 10],
  131.                 [0, 2, 5, 9],
  132.                 [0, 4, 7, 10],
  133.                 [0, 3, 5, 7]
  134.             ]
  135.         }
  136.         self.chordal:bool = False
  137.         self.possible_speeds:list = [0.25, 0.33, 0.5, 0.66, 0.75, 1.0, 1.25, 1.33, 1.5, 1.66, 1.75, 2.0, 3.0, 4.0]
  138.         self.effect_arguments:list = []
  139.         self.subeffect_arguments:list = []
  140.  
  141.     def GenerateGraph(self, subdiv:int, graph_min_max:tuple, value_type:list, step:bool, rhy:bool, n:bool) -> tuple[list[Any], list[float], list[float]]:
  142.         value, position, alpha = [], [], []
  143.         possible_values:list = []
  144.  
  145.         for div in range(subdiv):
  146.             # Generate possible values
  147.             possible_values.clear()
  148.             if value_type.count("r") >= 1:
  149.                 rhythms = randint(1,6)
  150.                 for i in range(rhythms):
  151.                     chosen_rhythm = f"\"{random.choice(self.rhythms)}" + str(random.choice(["|n|rhythm", "|d|rhythm", "|t|rhythm"])) + f"\""
  152.                     possible_values.append(chosen_rhythm)
  153.                     if self.used_rhythms_notes.count(chosen_rhythm) == 0:
  154.                         self.used_rhythms_notes.append(chosen_rhythm)
  155.             if (value_type.count("n") >= 1) and self.chordal:
  156.                 notes = randint(1,4)
  157.                 for i in range(notes):
  158.                     chosen_note = f"\"{random.choice(self.possible_notes)}|note\""
  159.                     possible_values.append(chosen_note)
  160.                     if self.used_rhythms_notes.count(chosen_note) == 0:
  161.                         self.used_rhythms_notes.append(chosen_note)
  162.  
  163.  
  164.             if value_type.count("v") >= 1:
  165.                 if (random.random() >= 0.6) and ((value_type.count("r") >= 1) or (value_type.count("n") >= 1)):
  166.                     chosen:str = random.choice(possible_values)
  167.                     value.append(chosen)
  168.                     if self.used_rhythms_notes.count(chosen) == 0:
  169.                         self.used_rhythms_notes.append(chosen)
  170.                     chosen = ""
  171.                 else:
  172.                     value.append(f"\"{round(uniform(graph_min_max[0], graph_min_max[1]),3)}\"")
  173.             elif value_type.count("h") >= 1:
  174.                 if (random.random() >= 0.6) and ((value_type.count("r") >= 1) or (value_type.count("n") >= 1)):
  175.                     value.append(random.choice(possible_values))
  176.                 else:
  177.                     value.append(f"\"{round(uniform(graph_min_max[0], graph_min_max[1]),3)}" + f"|hz\"")
  178.             elif value_type.count("m") >= 1:
  179.                 if (random.random() >= 0.6) and ((value_type.count("r") >= 1) or (value_type.count("n") >= 1)):
  180.                     value.append(random.choice(possible_values))
  181.                 else:
  182.                     value.append(f"\"{round(uniform(graph_min_max[0], graph_min_max[1]),3)}" + f"|ms\"")
  183.             else:
  184.                 print("Subeffect is missing value, ms, or hz.\n")
  185.                 value.append(f"\"{round(uniform(graph_min_max[0], graph_min_max[1]),3)}\"")
  186.  
  187.             #Generate positions
  188.             position.append(div/subdiv)
  189.  
  190.             #Generate alphas
  191.             alpha.append(round(uniform(-20.0, 20.0),3))
  192.  
  193.             if step:
  194.                 value.append(value[len(value)-1])
  195.                 position.append((div+1)/subdiv)
  196.                 alpha.append(round(uniform(-20.0, 20.0),3))
  197.  
  198.         return value, position, alpha
  199.  
  200.     def ChooseEffects(self):
  201.         self.active_effects = []
  202.         self.inactive_effects = []
  203.         gesture_types:list = []
  204.  
  205.         gesture_types.clear()
  206.         gesture_types.extend(self.possible_effects)
  207.         number_effects:int = randint(1, len(self.possible_effects))
  208.  
  209.         for i in range(number_effects):
  210.             rand_choice:int = randint(0, len(gesture_types) - 1)
  211.             self.active_effects.append(gesture_types[rand_choice])
  212.             gesture_types.pop(rand_choice)
  213.  
  214.         self.inactive_effects = gesture_types
  215.  
  216.  
  217.     def GenerateEnvelopes(self, name: str,
  218.                           subnames: list[str],
  219.                           subdivisions: int,
  220.                           min_max: list[tuple[float, float]],
  221.                           types: list,
  222.                           effect_decorators: dict,
  223.                           rhythm: bool,
  224.                           note: bool
  225.                           ) -> str:
  226.         output_string: str = ""
  227.         non_chain_fx = ["Position", "Jitter", "LeftJitter", "RightJitter", "GestureProcessor", "StutterRateJitter"]
  228.         non_chain_fx_toggle = randint(0,1)
  229.  
  230.         if (self.active_effects.count(name) != 0) or (non_chain_fx.count(name) != 0):
  231.             # Add effect decorators and header
  232.             if len(effect_decorators) > 0:
  233.                 effect_decorator_string: str = ""
  234.                 for x, y in effect_decorators.items():
  235.                     if (x, y) == next(reversed(effect_decorators.items())):
  236.                         effect_decorator_string += f"{x}=\"{y}\""
  237.                     else:
  238.                         effect_decorator_string += f"{x}=\"{y}\" "
  239.                 if ["LeftJitter", "RightJitter", "StutterRateJitter"].count(name) > 0:
  240.                     output_string += "  "
  241.  
  242.  
  243.                 if name == "GestureProcessor":
  244.                     stutter_on = randint(0,1)
  245.                     output_string += f"      <{name} stutterActive=\"{stutter_on}\" {effect_decorator_string}>\n"
  246.                 else:
  247.                     if non_chain_fx.count(name) != 0:
  248.                         non_chain_fx_toggle = randint(0, 1)
  249.                         output_string += f"      <{name} active=\"{non_chain_fx_toggle}\" {effect_decorator_string}>\n"
  250.                     else:
  251.                         output_string += f"      <{name} active=\"1\" {effect_decorator_string}>\n"
  252.                 effect_decorator_string = ""
  253.             else:
  254.                 output_string += f"      <{name} active=\"1\">\n"
  255.  
  256.             #Generate subeffects
  257.             for i, sub in enumerate(subnames):
  258.                 temp_line:str = ""
  259.  
  260.                 #Precision-enable for rhythms/notes
  261.                 precision_enable:str = ""
  262.                 if (types[i].count("r") != 0) or (types[i].count("n") != 0) :
  263.                     precision_enable = " precisionEnabled=\"0\""
  264.  
  265.                 #Per-Envelope stepwise enable
  266.                 if random.random() >= 0.2:
  267.                     stepwise = True
  268.                 else:
  269.                     stepwise = False
  270.  
  271.                 #Delay-specific logic
  272.                 if name == "Delay":
  273.                     if effect_decorators.get("channelsLocked") == 0:
  274.                         output_string += f"        <Left>\n"
  275.                         sub_value, sub_position, sub_alpha = self.GenerateGraph(subdivisions, min_max[i], types[i],
  276.                                                                                 stepwise,
  277.                                                                                 rhythm, note)
  278.                         temp_line += f"          <{sub} start={sub_value[0]} end={sub_value[len(sub_value) - 1]} speed=\"{random.choice(self.possible_speeds)}\" {precision_enable}>\n"
  279.                         for j, value in enumerate(sub_value):
  280.                             temp_line += f"            <Point value={value} position=\"{sub_position[j]}\" alpha=\"{sub_alpha[j]}\"/>\n"
  281.                         temp_line += f"        </{sub}>\n"
  282.                         output_string += temp_line
  283.                         output_string += f"        </Left>\n        <Right>\n"
  284.                         temp_line = ""
  285.                         sub_value, sub_position, sub_alpha = self.GenerateGraph(subdivisions, min_max[i], types[i],
  286.                                                                                 stepwise,
  287.                                                                                 rhythm, note)
  288.                         temp_line += f"          <{sub} start={sub_value[0]} end={sub_value[len(sub_value) - 1]} speed=\"{random.choice(self.possible_speeds)}\">\n"
  289.                         for j, value in enumerate(sub_value):
  290.                             temp_line += f"            <Point value={value} position=\"{sub_position[j]}\" alpha=\"{sub_alpha[j]}\"/>\n"
  291.                         temp_line += f"        </{sub}>\n"
  292.                         output_string += temp_line
  293.                         output_string += f"        </Right>\n"
  294.                         temp_line = ""
  295.  
  296.                         output_string += f"      </{name}>\n"
  297.  
  298.                         return output_string
  299.  
  300.                 sub_value, sub_position, sub_alpha = self.GenerateGraph(subdivisions, min_max[i], types[i],
  301.                                                                             stepwise,
  302.                                                                             rhythm, note)
  303.                 #Outlier effect logic
  304.                 if name == "Position":
  305.                     temp_line += f"        <{sub} start={sub_value[0]} end={sub_value[len(sub_value) - 1]} speed=\"{random.choice(self.possible_speeds)}\" gridResolution=\"{random.choice(self.jitter_rhythms) + '|n'}\" alpha=\"{round(uniform(-20.0, 20.0),3)}\">\n"
  306.                 elif ["MaximumRhythmOffset", "PitchOffset"].count(sub) > 0:
  307.                     temp_line += f"          <{sub} start={sub_value[0]} end={sub_value[len(sub_value) - 1]} speed=\"{random.choice(self.possible_speeds)}\">\n"
  308.                 # Add subeffect headers
  309.                 else:
  310.                     temp_line += f"        <{sub} start={sub_value[0]} end={sub_value[len(sub_value) - 1]} speed=\"{random.choice(self.possible_speeds)}\"{precision_enable}>\n"
  311.  
  312.                 #Adds envelope graph points
  313.                 for j, value in enumerate(sub_value):
  314.                     if ["MaximumRhythmOffset", "PitchOffset"].count(sub) > 0:
  315.                         temp_line += f"            <Point value={value} position=\"{sub_position[j]}\" alpha=\"{sub_alpha[j]}\"/>\n"
  316.                     else:
  317.                         temp_line += f"          <Point value={value} position=\"{sub_position[j]}\" alpha=\"{sub_alpha[j]}\"/>\n"
  318.  
  319.                 temp_line += f"        </{sub}>\n"
  320.  
  321.                 # Jitter-specific logic
  322.                 if sub == "MaximumRhythmOffset":
  323.                     temp_line += f"          <RhythmOffsetValues/>\n"
  324.                 if sub == "PitchOffset":
  325.                     #Positive Depth
  326.                     temp_line += "          <PitchPositiveDepth>\n"
  327.                     positive_value, positive_position, positive_alpha = self.GenerateGraph(2 ** randint(1, 5),
  328.                                                                                            (0.0, 2.0), ["v"], stepwise,False, False)
  329.                     for j, value in enumerate(positive_value):
  330.                         temp_line += f"            <Point value={value} position=\"{positive_position[j]}\" alpha=\"{positive_alpha[j]}\"/>\n"
  331.                     temp_line += "          </PitchPositiveDepth>\n"
  332.                     # Negative Depth
  333.                     temp_line += "          <PitchNegativeDepth>\n"
  334.                     negative_value, negative_position, negative_alpha = self.GenerateGraph(2 ** randint(1, 5),
  335.                                                                                            (0.0, -2.0), ["v"], stepwise,False, False)
  336.  
  337.                     for j, value in enumerate(negative_value):
  338.                         temp_line += f"            <Point value={value} position=\"{negative_position[j]}\" alpha=\"{negative_alpha[j]}\"/>\n"
  339.                     temp_line += "          </PitchNegativeDepth>\n"
  340.  
  341.                 output_string += temp_line
  342.                 temp_line = ""
  343.         else:
  344.             output_string += f"      <{name} active=\"0\">\n"
  345.  
  346.         # Jitter-specific logic
  347.         if name == "Position":
  348.             l_jitter = self.GenerateEnvelopes("LeftJitter",
  349.                                               ["MaximumRhythmOffset", "PitchOffset"],
  350.                                               2 ** randint(1, 5),
  351.                                               [(1.0, 666.7),(-24.0, 24.0)],
  352.                                               [["m", "r"], ["v"]],
  353.                                               {"type": randint(0,1), "rate": round(randint(1,10),1)},
  354.                                               True,
  355.                                               False)
  356.             output_string += l_jitter
  357.  
  358.             r_jitter = self.GenerateEnvelopes("RightJitter",
  359.                                               ["MaximumRhythmOffset", "PitchOffset"],
  360.                                               2 ** randint(1, 5),
  361.                                               [(1.0, 666.7), (-24.0, 24.0)],
  362.                                               [["m", "r"], ["v"]],
  363.                                               {"type": randint(0, 1), "rate": round(randint(1,10),1)},
  364.                                               True,
  365.                                               False)
  366.             output_string += r_jitter
  367.  
  368.         elif name == "GestureProcessor":
  369.             stutter_jitter = self.GenerateEnvelopes("StutterRateJitter",
  370.                                               ["MaximumRhythmOffset", "PitchOffset"],
  371.                                               2 ** randint(1, 5),
  372.                                               [(1.0, 666.7), (-24.0, 24.0)],
  373.                                               [["m", "r"], ["v"]],
  374.                                               {"type": randint(0, 1), "rate": round(randint(1,10),1)},
  375.                                               True,
  376.                                               True)
  377.             output_string += stutter_jitter
  378.  
  379.         # Fixing spacing issues in XML
  380.         if ["LeftJitter", "RightJitter", "StutterRateJitter"].count(name) > 0:
  381.             output_string += f"        </{name}>\n"
  382.         else:
  383.             output_string += f"      </{name}>\n"
  384.  
  385.         return output_string
  386.  
  387.     def GenerateGesture(self, index:int) -> str:
  388.         self.gesture_string = ""
  389.         self.ChooseEffects()
  390.  
  391.         #Chooses a chord for the gesture, if applicable
  392.         self.chordal = True
  393.         if self.chordal:
  394.             chosen_chord, inversions = random.choice(list(self.possible_chordshapes.items()))
  395.             offset:int = randint(0,5)
  396.             classes = {(i + offset) % 12 for i in random.choice(inversions)}
  397.             self.possible_notes = [n for n in range(36, 71 + 1) if n % 12 in classes]
  398.  
  399.         #Generate Wet
  400.         wet = self.GenerateEnvelopes("WetGain",
  401.                                      ["Level"],
  402.                                      2 ** randint(1,5),
  403.                                      [(-50.0, 12.0)],
  404.                                      [["v"]],
  405.                                      {},
  406.                                      False,
  407.                                      False)
  408.  
  409.         #Generate Crusher
  410.         crusher = self.GenerateEnvelopes("Crusher",
  411.                                          ["BitDepth", "DryWet"],
  412.                                          2 ** randint(1,5),
  413.                                          [(1.0, 16.0), (0.0, 1.0)],
  414.                                          [["v"], ["v"]],
  415.                                          {},
  416.                                          False,
  417.                                          False)
  418.  
  419.         #Generate Flanger
  420.  
  421.         flanger = self.GenerateEnvelopes("Flanger",
  422.                                          ["Delay", "SweepRate", "SweepWidth", "Feedback", "DryWet"],
  423.                                          2 ** randint(1, 5),
  424.                                          [(0.1, 30.0), (0.01, 20000.0), (0.0, 4.0), (0.0, 0.9), (0.0, 1.0)],
  425.                                          [["m", "n", "r"], ["h","r","n"], ["m", "n"], ["v"], ["v"]],
  426.                                          {"waveform": randint(0,6)},
  427.                                          False,
  428.                                          False)
  429.  
  430.         #Generate Chorus
  431.         chorus = self.GenerateEnvelopes("Chorus",
  432.                                          ["Delay", "SweepRate", "SweepWidth", "Feedback", "DryWet", "VoiceSpread", "StereoSpread"],
  433.                                          2 ** randint(1, 5),
  434.                                          [(0.1, 30.0), (0.01, 10.00), (0.0, 10.0), (-0.9, 0.9), (0.0, 1.0), (0.0, 1.0), (0.0, 1.0)],
  435.                                          [["m", "n", "r"], ["h", "r"], ["m", "n", "r"], ["v"], ["v"], ["v"], ["v"]],
  436.                                          {},
  437.                                          False,
  438.                                          False)
  439.  
  440.         #Generate Comb
  441.         comb = self.GenerateEnvelopes("CombFilter",
  442.                                          ["Frequency", "Spacing", "DryWet", "Feedback"],
  443.                                          2 ** randint(1, 5),
  444.                                          [(1.0, 20000.0), (-1.0, 1.0), (0.0, 1.0), (-0.9, 0.9)],
  445.                                          [["h","r","n"],["v"],["v"],["v"]],
  446.                                          {"inverted": randint(0,1)},
  447.                                          False,
  448.                                          False)
  449.  
  450.         #Generate Phaser
  451.         phaser = self.GenerateEnvelopes("Phaser",
  452.                                          ["Cutoff", "Amount", "Feedback", "Spacing", "DryWet", "SweepRate"],
  453.                                          2 ** randint(1, 5),
  454.                                          [(40.0, 20000.0), (0.0, 1.0), (-0.9, 0.9), (0.0, 1000.0), (0.0, 1.0), (0.01, 100.00)],
  455.                                          [["v"],["v"],["v"],["v"],["v"],["h", "n", "r"]],
  456.                                          {"numPoles": randint(1, 6), "waveform": randint(0, 6)},
  457.                                          False,
  458.                                          False)
  459.  
  460.         #Generate Tapestop
  461.         tapestop = self.GenerateEnvelopes("Tapestop",
  462.                                          ["Slowdown", "DryWet"],
  463.                                          2 ** randint(1, 5),
  464.                                          [(0.0, 1.0), (0.0, 1.0)],
  465.                                          [["v"],["v"]],
  466.                                          {},
  467.                                          False,
  468.                                          False)
  469.  
  470.         #Generate Limiter
  471.         limiter = self.GenerateEnvelopes("Limiter",
  472.                                          ["Threshold", "OutputGain"],
  473.                                          2 ** randint(1, 5),
  474.                                          [(-70.0, 0.0), (-20.0, 20.0)],
  475.                                          [["v"], ["v"]],
  476.                                          {},
  477.                                          False,
  478.                                          False)
  479.  
  480.         #Generate Reverb
  481.         reverb = self.GenerateEnvelopes("Reverb",
  482.                                          ["LFORate", "Predelay", "PostDelay", "Feedback", "PostFeedback", "Damping", "DryWet", "Size", "Brightness", "LFOAmount", "Width"],
  483.                                          2 ** randint(1, 5),
  484.                                          [(0.01, 20000.0), (0.0, 1.0), (0.0, 2000.0), (0.0, 1.0), (0.0, 1.0), (0.0, 1.0), (0.0, 1.0), (0.2, 15.0), (0.0, 1.0), (0.0, 1.0), (0.0, 1.0)],
  485.                                          [["h", "r"],["m", "r", "n"],["m", "r", "n"],["v"],["v"],["v"],["v"],["v"],["v"],["v"],["v"]],
  486.                                          {"cutOnRelease": randint(0,1), "waveform": randint(0,6)},
  487.                                          False,
  488.                                          False)
  489.  
  490.         #Generate Distort
  491.         distort = self.GenerateEnvelopes("Distortion",
  492.                                          ["DriveLowBand", "DriveHighBand", "Tone", "DcOffset", "DryWet", "BandsCrossover"],
  493.                                          2 ** randint(1, 5),
  494.                                          [(0.0, 30.0), (0.0, 30.0), (0.0, 1.0), (0.0, 1.0), (0.0, 1.0), (20.0, 20000.0)],
  495.                                          [["v"],["v"],["v"],["v"],["v"],["v"]],
  496.                                          {"mode":randint(0,1), "typeLowBand":randint(0,16), "typeHighBand":randint(0,16)},
  497.                                          False,
  498.                                          False)
  499.  
  500.         #Generate Lofi
  501.         lofi = self.GenerateEnvelopes("Lofi",
  502.                                          ["SampleRate", "DryWet"],
  503.                                          2 ** randint(1, 5),
  504.                                          [(20.0, 20000.0), (0.0, 1.0)],
  505.                                          [["v"],["v"]],
  506.                                          {},
  507.                                          False,
  508.                                          False)
  509.  
  510.         #Generate Lowpass
  511.         lowpass = self.GenerateEnvelopes("Lowpass",
  512.                                          ["Cutoff", "Resonance", "DryWet"],
  513.                                          2 ** randint(1, 5),
  514.                                          [(15.0, 20000.0), (0.0, 12.0), (0.0, 1.0)],
  515.                                          [["v"],["v"],["v"]],
  516.                                          {},
  517.                                          False,
  518.                                          False)
  519.  
  520.         #Generate Highpass
  521.         highpass = self.GenerateEnvelopes("Highpass",
  522.                                          ["Cutoff", "Resonance", "DryWet"],
  523.                                          2 ** randint(1, 5),
  524.                                          [(15.0, 20000.0), (0.0, 12.0), (0.0, 1.0)],
  525.                                          [["v"],["v"],["v"]],
  526.                                          {},
  527.                                          False,
  528.                                          False)
  529.  
  530.         #Generate Delay
  531.         delay = self.GenerateEnvelopes("Delay",
  532.                                          ["DryWet", "Feedback", "Time"],
  533.                                          2 ** randint(1, 5),
  534.                                          [(0.0, 1.0), (0.0, 1.0), (0.5, 2666.7)],
  535.                                          [["v"],["v"],["m", "n", "r"]],
  536.                                          {"channelsLocked":randint(0,1), "cutOnRelease":randint(0,1)},
  537.                                          False,
  538.                                          False)
  539.  
  540.         #Generate Bandpass
  541.         bandpass = self.GenerateEnvelopes("Bandpass",
  542.                                          ["LeftCutoff", "RightCutoff", "LeftResonance", "RightResonance"],
  543.                                          2 ** randint(1, 5),
  544.                                          [(15.0, 20000.0), (0.0, 1.0), (15.0, 20000.0), (0.0, 1.0)],
  545.                                          [["v"],["v"],["v"],["v"]],
  546.                                          {},
  547.                                          False,
  548.                                          False)
  549.  
  550.         #Generate DryGain
  551.         dry = self.GenerateEnvelopes("DryGain",
  552.                                          ["Level"],
  553.                                          2 ** randint(1, 5),
  554.                                          [(-50.0, 0.0)],
  555.                                          [["v"]],
  556.                                          {},
  557.                                          False,
  558.                                          False)
  559.  
  560.         #Generate Pan
  561.         pan = self.GenerateEnvelopes("Pan",
  562.                                          ["Width", "Centre"],
  563.                                          2 ** randint(1, 5),
  564.                                          [(0.0, 1.0), (0.0, 1.0)],
  565.                                          [["v"],["v"]],
  566.                                          {},
  567.                                          False,
  568.                                          False)
  569.  
  570.         #Generate Gate
  571.         gate = self.GenerateEnvelopes("Gate",
  572.                                      ["Width"],
  573.                                      2 ** randint(1, 5),
  574.                                      [(0.0, 1.0)],
  575.                                      [["v"]],
  576.                                      {"tail":random.random()},
  577.                                      False,
  578.                                      False)
  579.  
  580.  
  581.         #Generate Buffer and Jitter
  582.         buffer:str = ""
  583.         active:int = 1 #randint(0,1)
  584.         locked:int = randint(0,1)
  585.         reverseLeft = randint(0, 1)
  586.  
  587.         if locked == 1:
  588.             reverseRight= None
  589.         else:
  590.             reverseRight = randint(0,1)
  591.  
  592.         if active == 0:
  593.             buffer = (f"      <Position active=\"{active}\">\n"
  594.                       f"        <Left/>\n"
  595.                       f"        <Right/>\n"
  596.                       f"      </Position>\n")
  597.  
  598.         else:
  599.             buffer = self.GenerateEnvelopes("Position",
  600.                                         ["Left", "Right"],
  601.                                         2 ** randint(1, 5),
  602.                                         [(0.0, 1.0), (0.0, 1.0)],
  603.                                         [["v"], ["v"]],
  604.                                         {"leftRightLocked": locked, "reverseLeft": reverseLeft, "reverseRight" : reverseRight, "gridSize" : randint(0,10), "movementMode":randint(0,2)},
  605.                                         False,
  606.                                         False
  607.                                         )
  608.  
  609.         #Generate Stutter
  610.             #Generate FX Chain
  611.         effect_chain:str = ""
  612.         total_effects = []
  613.         total_effects.extend(self.active_effects)
  614.         total_effects.extend(self.inactive_effects)
  615.  
  616.         for i, effect in enumerate(total_effects):
  617.             if ["Limiter", "Delay", "Bandpass", "DryGain", "Gate", "Pan", "WetGain"].count(effect) > 0:
  618.                 continue
  619.             if effect == total_effects[len(total_effects)-1]:
  620.                 if effect == "Crusher":
  621.                     effect = "Bitcrush"
  622.                 if effect == "CombFilter":
  623.                     effect = "Comb"
  624.                 effect_chain += str(effect)
  625.             else:
  626.                 if effect == "Crusher":
  627.                     effect = "Bitcrush"
  628.                 if effect == "CombFilter":
  629.                     effect = "Comb"
  630.                 effect_chain += str(effect) + ","
  631.  
  632.  
  633.         stutter = self.GenerateEnvelopes("GestureProcessor",
  634.                                         ["StepTime", "StutterRate"],
  635.                                         2 ** randint(1, 5),
  636.                                         [(0.0, 1.0), (0.0, 1.0)],
  637.                                         [["h", "r", "n"], ["h", "r", "n"]],
  638.                                         {"stepActive": randint(0,1), "stepMode" : randint(0,5), "effectChain": effect_chain,
  639.                                          "palindromeActive":(randint(0,1)), "holdActive":(randint(0,1)),  "holdLength":(randint(0,8)), "grid":(randint(0,8)), "releaseMode":(randint(0,4)), "gestureLength": (randint(0,12))},
  640.                                         True,
  641.                                         True
  642.                                         )
  643.  
  644.         #Generate Header
  645.         header = "    <StutterRateValueSet>\n"
  646.         for i in self.used_rhythms_notes:
  647.             header += f"      <PeriodicValue value={i}/>\n"
  648.         header += "    </StutterRateValueSet>\n    <Effects>\n"
  649.  
  650.         #Generate Footer
  651.         footer = "    </Effects>\n  </Gesture>\n"
  652.  
  653.         # Put it all together
  654.         self.gesture_string += header
  655.  
  656.         self.gesture_string += wet
  657.         self.gesture_string += crusher
  658.         self.gesture_string += flanger
  659.         self.gesture_string += chorus
  660.         self.gesture_string += comb
  661.         self.gesture_string += phaser
  662.         self.gesture_string += tapestop
  663.         self.gesture_string += limiter
  664.         self.gesture_string += reverb
  665.         self.gesture_string += distort
  666.         self.gesture_string += lofi
  667.         self.gesture_string += lowpass
  668.         self.gesture_string += highpass
  669.         self.gesture_string += delay
  670.         self.gesture_string += bandpass
  671.         self.gesture_string += dry
  672.         self.gesture_string += pan
  673.         self.gesture_string += gate
  674.         self.gesture_string += buffer
  675.         self.gesture_string += stutter
  676.  
  677.         self.gesture_string += footer
  678.  
  679.         return f"  <Gesture name=\"Gesture {index + 1}\" empty=\"0\">\n{self.gesture_string}"
  680.  
  681.     def GenerateBank(self, bankname):
  682.         # Generate the bank header and footer
  683.         beginstr = ("""<?xml version=\"1.0\" encoding\=\"UTF-8\"?>
  684.  
  685. <Bank version=\"2.1.0b2\">
  686. """)
  687.         endstr = "</Bank>"
  688.  
  689.         for i in range(128):
  690.             self.gestures.append(self.GenerateGesture(i))
  691.  
  692.         gestures: str = ""
  693.         for i in self.gestures:
  694.             gestures = gestures + i
  695.  
  696.         # Make sure the file is there and write the
  697.         try:
  698.             f = open(bankname, "w")
  699.         except FileNotFoundError:
  700.             f = open(bankname, "a")
  701.  
  702.         f.write(beginstr + gestures + endstr)
  703.         f.close()
  704.  
  705.  
  706. for i in range(10):
  707.     bank = Generator(f"Generated Bank {i+1}.sebank")
  708.     bank.GenerateBank(bank.bankname)
  709.     del bank
  710.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement