   }
 
  private:
+  void update_clock()
+  {
+    // TODO: replace encoder clock with timer2?
+    //Timer1.detachInterrupt();
+    if(!seq_values.clock_ext)
+    {
+      //Timer1.initialize(seq_values.clock_period * 1000);
+      //Timer1.attachInterrupt(clock_isr);
+    }
+  }
+
   float note_to_cv(int8_t note)
   {
     return ((float)note - 36.0) / 12.0;

    }
    seq_values.clock_period = bpm_to_ms(params.vals.clock_bpm);
    seq_values.clock_ext = !(bool)params.vals.clock_bpm;

    // draw global elements
    display->draw_char(38, 2, '0' + params.vals.stage_count, DUINO_SSD1306::White);

    }

    // set gate state
    switch(seq_values.stage_gate[cached_stage])
    {
      case GATE_NONE:
