private Quaternion calculateChangeForGyro(GyroscopeDataEventArgs prev, GyroscopeDataEventArgs effective)
    {
        TimeSpan dt = effective.Timestamp.Subtract(prev.Timestamp);

        Thalmic.Myo.Vector3 avg = (effective.Gyroscope + prev.Gyroscope) * .5f;

        double dts = dt.TotalSeconds;

        double rx = avg.X * dts;
        double ry = avg.Y * dts;
        double rz = avg.Z * dts;

        double  magnitude = Math.Sqrt(rx * rx + ry * ry + rz * rz);
        Vector3 myoAxis   = new Vector3((float)(rx / magnitude), (float)(ry / magnitude), (float)(rz / magnitude));
        Vector3 axis      = new Vector3(-myoAxis.y, myoAxis.z, myoAxis.x);
        float   angle     = (float)magnitude;

        // Unity is left handed. therefore the angle should be reversed.
        Quaternion dq = Quaternion.AngleAxis(-angle, axis);

        return(dq);
    }
 void myo_OnGyroscopeData(object sender, Thalmic.Myo.GyroscopeDataEventArgs e)
 {
     lock (_lock) {
         _myoGyroscope = e.Gyroscope;
     }
 }
 void myo_OnAccelerometerData(object sender, Thalmic.Myo.AccelerometerDataEventArgs e)
 {
     lock (_lock) {
         _myoAccelerometer = e.Accelerometer;
     }
 }
 static private Vector3 myoToUnity(Thalmic.Myo.Vector3 myo)
 {
     return(new Vector3(-myo.Y, myo.Z, myo.X));
 }