Ejemplo n.º 1
0
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