         if(release_time)
         {
           uint16_t elapsed = millis() - release_time;
-          if(elapsed < adsr_values.R)
+          if(elapsed < adsr_values.R * ENV_RELEASE_HOLD)
           {
             // release
-            cv_current = (1.0 - float(elapsed) / float(adsr_values.R)) * cv_released;
+            cv_current = exp(ENV_RELEASE_COEFF * (float(elapsed) / float(adsr_values.R))) * cv_released;
           }
           else
           {

  {
    // initialize interface
    selected = 0;
    gate_last = false;
    display_changed = false;

    // initialize ADSR values

    }
    else if(gate)
    {
      gate_time = millis() - (unsigned long)((cv_current / ENV_PEAK) * float(adsr_values.A));
    }
  }

