def build_data(preset, encoder=None): """ Build Sysex preset data to given encoder instance Returns the length of newly-built data. If encoder is None, create a throw-away instance of the encoder, useful for calculating data length in caller """ if encoder is None: encoder = SyxEncoder() rotaries = structs.build_rotaries() longsliders = structs.build_longsliders() hsliders = structs.build_hsliders() vsliders = structs.build_vsliders() # pads, sliders, buttons, etc. for i in range(16): _unwrap(encoder, preset[structs.PADS]["Pad%s" % i], structs.pads) for i in range(2): _unwrap(encoder, preset[structs.ROTARIES]["Rotary%s" % i], rotaries) _unwrap(encoder, preset[structs.LONG_SLIDERS]["LongSlider0"], longsliders) for i in range(4): _unwrap(encoder, preset[structs.H_SLIDERS]["HSlider%s" % i], hsliders) for i in range(4): _unwrap(encoder, preset[structs.V_SLIDERS]["VSlider%s" % i], vsliders) for i in range(4): _unwrap(encoder, preset[structs.LR_BUTTONS]["LeftRightButton%s" % i], structs.lrswitches) for i in range(2): _unwrap(encoder, preset[structs.UD_BUTTONS]["UpDownButton%s" % i], structs.udswitches) _unwrap(encoder, preset[structs.RHOMBUS_BUTTONS]["RhombusButton0"], structs.rhswitches) for i in range(3): _unwrap(encoder, preset[structs.TRANSPORT_BUTTONS]["TransportButton%s" % i], structs.tbuttons) _unwrap(encoder, preset[structs.MODE_BUTTONS]["ModeButton0"], structs.mswitches) # globals for path in structs.globalpaths: x = preset for item in path: x = x[item] encoder.sum_encode(x) # special case: velocity table for velocity in preset[structs.PADS]['padVelocityTable']: encoder.sum_encode(velocity) data_length = encoder.counter return data_length