def set_props(item, bl_item, val): global qf_frame if len(val) == 1: val = val[0] func = item['func'] result = func(bl_item, item, val) post_func = item['post_func'] if bl_item.is_str2eval: g_vars.evalprop(bl_item.str2eval, bl_item.withctx) prop = g_vars.eval_prop ref = g_vars.eval_ref else: ref = item['ref'] prop = item['prop'] if bl_item.is_array and (bl_item.use_array is False): current = getattr(ref, prop)[bl_item.array] getattr(ref, prop)[bl_item.array] = post_func(current, result, bl_item) else: current = getattr(ref, prop) result2 = post_func(current, result, bl_item) setattr(ref, prop, result2) # insert keyframe print(qf_frame) if bl_item.record and (bpy.data.screens[0].is_animation_playing or qf_frame is not None): if bl_item.is_array and (bl_item.use_array is False): index = bl_item.array ref.keyframe_insert(data_path=prop, index=index, **item['ks_params'], **qf_frame) else: ref.keyframe_insert(data_path=prop, **item['ks_params'], **qf_frame)
def set_props(item, bl_item, val): global midifile_conv # testing rescale feature mode if bl_item.rescale_mode == 'Direct': result = val elif bl_item.rescale_mode == 'Auto': # no need to clamp result = rescale(val, bl_item.rescale_blender_low, bl_item.rescale_blender_high, item['quant']) elif bl_item.rescale_mode == "Cut": if val < bl_item.rescale_outside_low or val > bl_item.rescale_outside_high: return else: val = clamp(bl_item.rescale_outside_low, val, bl_item.rescale_outside_high) result = rescale(val, bl_item.rescale_blender_low, bl_item.rescale_blender_high, item['quant']) elif bl_item.rescale_mode == 'Wrap': val = clamp(bl_item.rescale_outside_low, val, bl_item.rescale_outside_high) result = rescale(val, bl_item.rescale_blender_low, bl_item.rescale_blender_high, item['quant']) func = item['func'] result = func(bl_item, item, result) post_func = item['post_func'] if bl_item.is_str2eval: g_vars.evalprop(bl_item.str2eval, bl_item.withctx) prop = g_vars.eval_prop ref = g_vars.eval_ref else: ref = item['ref'] prop = item['prop'] if bl_item.is_array: current = getattr(ref, prop)[bl_item.array] getattr(ref, prop)[bl_item.array] = post_func(current, result, bl_item) else: current = getattr(ref, prop) result2 = post_func(current, result, bl_item) setattr(ref, prop, result2) # insert keyframe if bl_item.record and (bpy.data.screens[0].is_animation_playing or midifile_conv): if bl_item.is_array: index = bl_item.array ref.keyframe_insert(data_path=prop, index=index, **item['ks_params'], **mf_frame) else: ref.keyframe_insert(data_path=prop, **item['ks_params'], **mf_frame)
def actua_bl(): prefs = bpy.context.preferences.addons['AddRoutes'].preferences in_len = len(g_vars.blemote_fb) if in_len > prefs.overflow: g_vars.blemote_fb = g_vars.blemote_fb[:prefs.overflow] bpy.context.window_manager.n_overflow += 1 for i in range(prefs.overflow): if len(g_vars.blemote_fb) == 0: break else: msg = g_vars.blemote_fb.pop(0) bl_item = msg[0] item = msg[1] val = float(msg[2]) func = item['func'] post_func = item['post_func'] # scene can change in the meanwhile try: result = func(bl_item, item, val) if bl_item.is_str2eval: g_vars.evalprop(bl_item.str2eval, bl_item.withctx) prop = g_vars.eval_prop ref = g_vars.eval_ref else: ref = item['ref'] prop = item['prop'] if bl_item.is_array: current = getattr(ref, prop)[bl_item.array] getattr(ref, prop)[bl_item.array] = post_func( current, result, bl_item) else: current = getattr(ref, prop) result2 = post_func(current, result, bl_item) setattr(ref, prop, result2) # insert keyframe if bl_item.record and bpy.data.screens[0].is_animation_playing: if bl_item.is_array: index = bl_item.array ref.keyframe_insert(data_path=prop, index=index, **item['ks_params']) else: ref.keyframe_insert(data_path=prop, **item['ks_params']) except: print( "Error while sending, improper Blemote route parameters with: " + repr(bl_item)) return prefs.refresh / 1000
def osc_frame_upd(scn): # kludge to avoid error while changing scene if g_vars.scene is not scn: return # send osc events bcw = bpy.context.window_manager osc = OSCClient(bcw.addroutes_osc_udp_out, bcw.addroutes_osc_port_out, encoding='utf8') if bcw.addroutes_osc_out_enable is True: for bl_item, item in g_vars.addroutes_osc_out: # getting current value if bl_item.is_str2eval: g_vars.evalprop(bl_item.str2eval, bl_item.withctx) prop = g_vars.eval_prop ref = g_vars.eval_ref else: ref = item['ref'] prop = item['prop'] # apply func func = item['func'] try: if bl_item.is_array: if bl_item.use_array is False: val = getattr(ref, prop)[bl_item.array] val2 = [func(bl_item, item, val)] else: val = getattr(ref, prop) val2 = list(func(bl_item, item, val)) else: val = getattr(ref, prop) val2 = [func(bl_item, item, val)] # the value has changed if val2 != item['val']: item['val'] = val2 # for multi routes val3 = val2.copy() if bl_item.is_multi: val3.insert(0, item['idx']) addr = str.encode(item['address']) osc.send_message(addr, val3) except: print("Error while sending, improper OSC route #", item["n"], 'category :', bl_item.category) break
def midi_frame_upd(scn): # kludge to avoid error while changing scene if g_vars.scene is not scn: return # for midifile live playing global midifile_array, prev_frame # frame change pre is buggy ! # print(scn.frame_current) if scn.mf_play and bpy.data.screens[0].is_animation_playing: n_to_play = scn.frame_current - scn.mf_offset if (len(midifile_array) > n_to_play) and (n_to_play >= 0): for msg in midifile_array[n_to_play]: arr = decode(scn, msg) actualise(scn, arr) # this is for SPP out new_frame = scn.frame_current if scn.SPP_out and midiout.is_port_open(): # for restarting while playing in loop mode OR when not playing if ((new_frame != prev_frame + 1) and is_playing) or is_playing is False: pos_sec = scn.frame_current / scn.render.fps beats = (pos_sec / 60 ) * scn.tempo * 4 # in fact 16th not beat, hence the "4" p2 = int(beats / 128) p1 = beats % 128 midiout.send_message([242, p1, p2]) prev_frame = new_frame # send midi events for bl_item, item in g_vars.addroutes_out: # getting current value if bl_item.is_str2eval: g_vars.evalprop(bl_item.str2eval, bl_item.withctx) prop = g_vars.eval_prop ref = g_vars.eval_ref else: ref = item['ref'] prop = item['prop'] try: if bl_item.is_array: val = getattr(ref, prop)[bl_item.array] else: val = getattr(ref, prop) # apply func func = item['func'] val = func(bl_item, item, val) # testing rescale feature mode scale = item['rescale_bl'] quant = item['quant'] if bl_item.rescale_mode == 'Direct': val2 = int(clamp(0, val, quant)) if bl_item.rescale_mode == 'Auto': val2 = rescale(val, 0, quant, scale) val2 = int(clamp(0, val2, quant)) elif bl_item.rescale_mode == "Cut": if val < bl_item.rescale_outside_low or val > bl_item.rescale_outside_high: return else: val2 = rescale(val, 0, quant, scale) val2 = int( clamp(bl_item.rescale_outside_low, val2, bl_item.rescale_outside_high)) elif bl_item.rescale_mode == 'Wrap': val2 = rescale(val, 0, quant, scale) val2 = int( clamp(bl_item.rescale_outside_low, val2, bl_item.rescale_outside_high)) # the value has changed if val2 != item['val']: item['val'] = val2 # simple 7bit parameter like pgm change and mono AT if item['lenx'] == 1: midiout.send_message([item['midi'], val2]) # others 2 bytes msg elif item['reg'] is None: # for poly AT, cc7 if item['quant'] == 127: midiout.send_message( [item['midi'], item['filter'], val2]) # for pitchbend else: LSB = val2 % 128 MSB = int(val2 / 128) midiout.send_message([item['midi'], LSB, MSB]) # for rpn/nrpn 7bit and 14bit else: # 7bit if item['quant'] == 127: for msg in item['reg']: midiout.send_message( [item['midi'], msg[0], eval(msg[1])]) # 14bit msg else: LSB = val2 % 128 MSB = int(val2 / 128) for msg in item['reg']: midiout.send_message( [item['midi'], msg[0], eval(msg[1])]) except: print("Error while sending, improper MIDI route #", item["n"], 'category :', bl_item.category)