Here I will gather all info I can find out about the different force effects and
their USB commands. All values seem to be little-endian.
Also, general note, it seems like some effects are affected by the direction of
the force, denoted by ***

As far as I can tell, fade_level and attack_level values are calculated by
mapping the u16 into s16 and taking the absolute value, and after that
multiplying by the direction. 

All values are examples of actual commands that I captured on the USB interface,
not the only ones available.

GENERAL:

    Playing:
    60 00 - standard header
    01 - ID
    89 - playing options
    01 - play
    00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


    Stopping/removing: (why are they rolled into one?)
    60 00 - standard header 
    01 - ID
    89 - playing options
    00 - stop
    00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

FF_CONSTANT:
    Initialization:
    60 00 - standard header
    01 - ID
    6a - new constant effect(?)
    fe ff - strength ***
    00 00 - attack_length
    00 00 - attack_level ***
    00 00 - fade_length
    00 00 - fade_level ***
    00 4f - ?
    f7 17 - time in milliseconds, unsigned
    00 00
    07 00 - offset from start(?)
    00 ff ff - end of new effect(?)
    00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


    Modifying: (It may be possible to modify the effects all at once, not sure)
        (In any case, so far I only investigated the constant modifiers)
        Direction: n/a
        
        Constant force:
        60 00 - standard header
        01 - ID
        0a - modify constant force
        05 16 - constant force
        00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        
        Envelope:
        60 00 - standard header
        01 - ID
        31 - modify envelope
        84 - ID of envelope attribute ( attack_level 82,
                                        attack_length 81,
                                        fade_level 88,
                                        fade_length 84  )
        63 04 - value attribute should be set to
        00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

        Duration:
        60 00 - standard header
        01 - ID
        49 00 41 - modify timing?
        6c 20 - length in milliseconds
        00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


FF_RAMP:
    (Why on earth is it this difficult to figure out how a fucking ramp works?)
    Init:
    60 00 - standard header
    01 - ID
    6b - new ramp effect 
    f6 7f - difference *** 
    fe ff - level? *** (level = (if end_level > start_level, end_level, else
    start_level) - difference?) (signed)
    00 00
    f7 17 - time
    00 80 - some kind of marker
    00 00 - attack_length
    f6 7f - attack_level ***
    00 00 - fade_length
    f6 7f - fade_level***
    04 - invert (going "down", 05, going "up", 04)
    4f  
    f7 17 - time again?
    00 00
    00 00 - offset 
    00 ff ff - end of init
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

FF_SPRING:
    Init:
    60 00 - standard header
    01 - ID
    64 - new conditional effect
    fc 7f - positive coefficient (right?)
    fc 7f - negative coefficient (left?)
    fe ff - deadband (left?) (deadband + offset) (fe ff means no deadband)
    fe ff - deadband (right?) (deadband + offset)
    a6 6a a6 6a fe ff fe ff fe ff fe ff df 58 a6 6a 06 - some weird hard-coded
                                                    values to do with springs?

    4f
    f7 17 - duration
    00 00 
    00 00 - offset 
    00 ff ff - end of init
    00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

FF_DAMPER + FF_FRICTION + FF_INERTIA:
    Init:
    60 00 - standard header
    02 -ID
    64 - new conditional effect
    fc 7f - positive coefficient (right?)
    fc 7f - negative coefficient (left?)
    fe ff - deadband (left?) (deadband + offset) (fe ff means no deadband)
    fe ff - deadband (right?) (deadband + offset)
    fc 7f fc 7f fe ff fe ff fe ff fe ff fc 7f fc 7f 07 - some weird hard-coded
                                                    values to do with friction?
    4f
    f7 17 - duration
    00 00 
    00 00 - offset
    00 ff ff - end of init
    00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

FF_PERIODIC:
    60 00 - standard header
    01 - ID
    6b - new periodic effect
    00 00 - magnitude ***
    fe ff - phase (left/right)
    00 00 - offset of effect (forward/backward)
    e8 03 - period
    00 80 
    00 00 - attack_length
    00 00 - attack_level ***
    00 00 - fade_length
    00 00 - fade_level ***
    01 - type of periodic ( square 01,
                            sine 03,
                            triangle 02,
                            sawtooth down 05,
                            sawtooth up 04  )
    4f
    f7 17 - duration
    00 00
    00 00 - offset
    00 ff ff - end of init
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

FF_AUTOCENTER:
    60 08 - header plus settings?
    03 - set autocenter force
    8f 02 - force (between ff ff and 00 00)
    00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

FF_GAIN:
    60 02 - header plus gain?
    bf - gain (between ff and 00)
    00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Rotation angle:
    60 08 - header plus settings?
    11 - set rotation angle
    55 d5 - angle (between ff ff and 7b 09, one degree is roughly 3c)
    00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Open:
    60 01 - standard header?
    04 - ?
    00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    
    (this command doesn't appear every time, odd)
    60 12 - ?
    bf 04 00 00 03 b7 1e - ?
    00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    60 01 - ?
    05 - ?
    00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Close:
    60 01 - standard header?
    00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

