       _a = 500 * (f(_X) - f(_Y))
       _b = 200 * (f(_Y) - f(_Z))
       [_L, _a, _b]
-    from: (tuple) ->
-      _L = tuple[0]
-      _a = tuple[1]
-      _b = tuple[2]
+    from: (_L, _a, _b) ->
       f_inv = (t) ->
         if t > 6 / 29
           Math.pow(t, 3)
         else
           3 * Math.pow(6 / 29, 2) * (t - 4 / 29)
-      _Y = f_inv 1 / 116 * (_L + 16)
-      _X = f_inv 1 / 116 * (_L + 16) + 1 / 500 * _a
-      _Z = f_inv 1 / 116 * (_L + 16) - 1 / 200 * _b
+      _Y = white_point[1] * f_inv 1 / 116 * (_L + 16)
+      _X = white_point[0] * f_inv 1 / 116 * (_L + 16) + 1 / 500 * _a
+      _Z = white_point[2] * f_inv 1 / 116 * (_L + 16) - 1 / 200 * _b
       [_X, _Y, _Z]
+  _CIELCH:
+    to: (_X, _Y, _Z) ->
+      [_L, _a, _b] = conv._CIELAB.to([_X, _Y, _Z])
+      _C = Math.pow Math.pow(_a, 2) + Math.pow(_b, 2), 1 / 2
+      _h = Math.atan2 _b, _a
+      [_L, _C, _h]
+    from: (_L, _C, _h) ->
+      _h_rad = _h / 360 * 2 * Math.PI
+      _a = Math.cos(_h_rad) * _C
+      _b = Math.sin(_h_rad) * _C
+      conv._CIELAB.from([_L, _a, _b])
 
 get_color = (space, tuple) ->
-  color = conv["_" + space].from(tuple)
+  color = conv["_" + space].from(tuple...)
   as: (space) ->
-    conv["_" + space].to(color)
+    conv["_" + space].to(color...)
 
 if jQuery?
   exports =

      _G = from_linear res[1][0]
      _B = from_linear res[2][0]
      [_R, _G, _B]
    from: = (tuple) ->
      _R = tuple[0]
      _G = tuple[1]
      _B = tuple[2]
      to_linear = (c) ->
        a = 0.055
        if c <= 0.04045

      res = matrix_mult m, [[rl], [gl], [bl]]
      [res[0][0], res[1][0], res[2][0]]
  _CIExyY:
    to: (_X, _Y, _Z) ->
      sum = _X + _Y + _Z
      [_X / sum, _Y / sum, _Y]
    from: (_x, _y, _Y) ->
      _X = _Y / _y * _x
      _Z = _Y / _y * (1 - _x - _y)
      [_X, _Y, _X]
  _CIELAB:
    to: (_X, _Y, _Z) ->
      _X = _X / white_point[0]
      _Y = _Y / white_point[1]
      _Z = _Z / white_point[2]
      f = (t) ->
        if t > Math.pow(6 / 29, 3)
          Math.pow(t, 1 / 3)
