           if (reverse)
           {
             // if we're pointed backward, add the current point's rate
-            pointer += rate_to_ms(p);
+            pointer += rate_to_ms(p, true);
           }
           else
           {
             // if we're pointed forward, add the next point's rate
-            pointer += rate_to_ms(p + 1);
+            pointer += rate_to_ms(p + 1, true);
           }
         }
 
         if (pointer < elapsed)
         {
           // done looping, sustain at point 3
-          cv_current_ = level_to_cv(3);
+          cv_current_ = level_to_cv(3, true);
         }
         else
         {
           // linearly interpolate between current and next point
-          const float cv_start = level_to_cv(p);
-          const float cv_end = level_to_cv(reverse ? p - 1 : p + 1);
-          const float remaining = (float)(pointer - elapsed) / (float)rate_to_ms(reverse ? p : p + 1);
+          const float cv_start = level_to_cv(p, true);
+          const float cv_end = level_to_cv(reverse ? p - 1 : p + 1, true);
+          const float remaining = (float)(pointer - elapsed) / (float)rate_to_ms(reverse ? p : p + 1, true);
           cv_current_ = cv_end + (cv_start - cv_end) * remaining;
         }
       }

      gate_time_ = 0;
      release_time_ = 0;
      retrigger_ = false;
    }

    if (gate_time_)

          if (p == 3)
          {
            // if we've hit point 3 the repeat count times...
            if (cached_params_.repeat && ++repeat_count == cached_params_.repeat)
            {
              // stop looping
              loop_reverse = loop = false;
