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

    int8_t repeat;    // 0 = continuous, 1 - 7 = finite repeats
  };

  DUINO_WidgetContainer<3> * container_outer_;
  DUINO_WidgetContainer<2> * container_loop_repeat_;
  DUINO_WidgetContainer<8> * container_points_;

          if (reverse)
          {
            // if we're pointed backward, add the current point's rate
            pointer += rate_to_ms(p, true);
          }
          else
          {
            // if we're pointed forward, add the next point's rate
            pointer += rate_to_ms(p + 1, true);
          }
        }

        if (pointer < elapsed)
        {
          // done looping, sustain at point 3
          cv_current_ = level_to_cv(3, true);
        }
        else
        {
          // linearly interpolate between current and next point
          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;
        }
      }
