Why do you need to modify the color values using HSL? Could you try to specify the problem?

If you need something, then I threw the following GLSL shader code together. It's tested and does seemingly work
Code:
vec3 HSL2RGB(vec3 hsl)
{
   if(hsl.z == 0)
      return vec3(0,0,0);
   else
   {
      if(hsl.y == 0)
         return vec3(hsl.z);
      else
      {
         float tmp2 = 0;
         if&#40;hsl.z<=0.5&#41;
            tmp2 = hsl.z*&#40;1.0+hsl.y&#41;;
         else
            tmp2 = hsl.z+hsl.y-hsl.z*hsl.y;
         float tmp1 = 2.0*hsl.z-tmp2;
         
         vec3 t3 = vec3&#40;hsl.x+1.0/3.0, hsl.x, hsl.x-1.0/3.0&#41;;
         vec3 clr = vec3&#40;0&#41;;
         
         for&#40;int i=0; i<3; i++&#41;
         &#123;
            if&#40;t3&#91;i&#93;<0>1.0&#41;
               t3&#91;i&#93;-=1.0;
            
            if&#40;6.0*t3&#91;i&#93; < 1.0&#41;
               clr&#91;i&#93; = tmp1+&#40;tmp2-tmp1&#41;*t3&#91;i&#93;*6.0;
            else if&#40;2.0*t3&#91;i&#93; < 1.0&#41;
               clr&#91;i&#93; = tmp2;
            else if&#40;3.0*t3&#91;i&#93; < 2.0&#41;
               clr&#91;i&#93; = &#40;tmp1+&#40;tmp2-tmp1&#41;*&#40;&#40;2.0/3.0&#41;-t3&#91;i&#93;&#41;*6.0&#41;;
            else
               clr&#91;i&#93; = tmp1;
         &#125;
         
         return clr;
      &#125;
   &#125;
&#125;

vec3 RGB2HSL&#40;vec3 rgb&#41;
&#123;
   float var_Min = min&#40;min&#40; rgb.x, rgb.y&#41;, rgb.z &#41;;    //Min. value of RGB
   float var_Max = max&#40;max&#40; rgb.x, rgb.y&#41;, rgb.z &#41;;    //Max. value of RGB
   float del_Max = var_Max - var_Min;             //Delta RGB value
   
   float H,S,L;
   
   L = &#40; var_Max + var_Min &#41; / 2.0;
   
   if &#40; del_Max == 0.0 &#41;                     //This is a gray, no chroma...
   &#123;
      H = 0.0;                                //HSL results = 0 ?? 1
      S = 0.0;
   &#125;
   else                                    //Chromatic data...
   &#123;
      if &#40; L < 0.5 &#41; S = del_Max / &#40; var_Max + var_Min &#41;;
      else           S = del_Max / &#40; 2.0 - var_Max - var_Min &#41;;
   
      float del_R = &#40; &#40; &#40; var_Max - rgb.x &#41; / 6.0 &#41; + &#40; del_Max / 2.0 &#41; &#41; / del_Max;
      float del_G = &#40; &#40; &#40; var_Max - rgb.y &#41; / 6.0 &#41; + &#40; del_Max / 2.0 &#41; &#41; / del_Max;
      float del_B = &#40; &#40; &#40; var_Max - rgb.z &#41; / 6.0 &#41; + &#40; del_Max / 2.0 &#41; &#41; / del_Max;
   
      if      &#40; rgb.x == var_Max &#41; H = del_B - del_G;
      else if &#40; rgb.y == var_Max &#41; H = &#40; 1.0 / 3.0 &#41; + del_R - del_B;
      else if &#40; rgb.z == var_Max &#41; H = &#40; 2.0 / 3.0 &#41; + del_G - del_R;
   
      if &#40; H <0> 1.0 &#41;  H -= 1.0;
   &#125;
   
   return vec3&#40;H,S,L&#41;;
&#125;