 
   DU_SEQ_Parameters params;
 
+  DUINO_WidgetContainer<6> * container_outer_;
+  DUINO_WidgetContainer<5> * container_top_;
+  DUINO_DisplayWidget * widget_save_;
+  DUINO_DisplayWidget * widget_count_;
+  DUINO_DisplayWidget * widget_diradd_;
+  DUINO_DisplayWidget * widget_slew_;
+  DUINO_DisplayWidget * widget_gate_;
+  DUINO_DisplayWidget * widget_clock_;
+  DUINO_MultiDisplayWidget<8> * widgets_pitch_;
+  DUINO_MultiDisplayWidget<8> * widgets_steps_;
+  DUINO_MultiDisplayWidget<8> * widgets_gate_;
+  DUINO_MultiDisplayWidget<8> * widgets_slew_;
+
   uint8_t cached_stage, cached_step;
   bool cached_clock_gate, cached_retrigger;
   unsigned long clock_time;
-
-  uint8_t main_selected;  // 0 - save, 1 - top, 2 - pitch, 3 - steps, 4 - gate, 5 - slew
-  uint8_t top_selected;   // 0 - count, 1 - dir/add, 2 - slew, 3 - gate, 4 - clock
-  uint8_t stage_selected;
 
   bool last_gate;
   uint8_t last_stage;

  {
    if(bpm == 0)
    {
      display->draw_text(x, y, "EXT", color);
    }
    else
    {
      display->draw_char(x, y, '0' + bpm / 10, color);
      display->draw_char(x + 6, y, '0' + bpm % 10, color);
      display->draw_char(x + 12, y, '0', color);
    }
  }

  void display_note(int16_t x, int16_t y, int8_t note, DUINO_SH1106::SH1106Color color)
  {
    // draw octave
    display->draw_char(x + 9, y + 7, '0' + note / 12, color);

    // draw note
    display->draw_char(x + 2, y + 4, semitone_lt[note % 12], color);
    
    // draw intonation symbol
    switch(semitone_in[note % 12])
    {
      case IF:
        display->draw_vline(x + 9, y + 1, 5, color);
        display->draw_pixel(x + 10, y + 3, color);
        display->draw_pixel(x + 10, y + 5, color);
        display->draw_vline(x + 11, y + 4, 2, color);
        break;
      case IS:
        display->draw_vline(x + 9, y + 1, 5, color);
        display->draw_pixel(x + 10, y + 2, color);
        display->draw_pixel(x + 10, y + 4, color);
        display->draw_vline(x + 11, y + 1, 5, color);
        break;
    }
  }

  void display_reverse_address(int16_t x, int16_t y)
  {
    display->fill_rect(x, y, 5, 7, DUINO_SH1106::Black);

    if(seq_values.diradd_mode)
    {
      display->draw_char(30, 12, '1' + stage, DUINO_SH1106::White);
    }
    else
    {
      display->draw_char(30, 12, 0x10 + (unsigned char)reverse, DUINO_SH1106::White);
    }
  }

  void invert_current_selection()
  {
    switch(main_selected)
    {
      case 0: // save
        display->fill_rect(121, 0, 7, 7, DUINO_SH1106::Inverse);
        display->display(121, 127, 0, 0);
        break;
      case 1: // top
        switch(top_selected)
        {
          case 0: // count
            display->fill_rect(9, 11, 7, 9, DUINO_SH1106::Inverse);
            display->display(9, 15, 1, 2);
            break;
          case 1: // dir/add
            display->fill_rect(21, 11, 7, 9, DUINO_SH1106::Inverse);
            display->display(21, 27, 1, 2);
            break;
          case 2: // slew
            display->fill_rect(58, 11, 20, 9, DUINO_SH1106::Inverse);
            display->display(58, 77, 1, 2);
            break;
          case 3: // gate
            display->fill_rect(83, 11, 20, 9, DUINO_SH1106::Inverse);
            display->display(83, 102, 1, 2);
            break;
          case 4: // clock
            display->fill_rect(108, 11, 19, 9, DUINO_SH1106::Inverse);
            display->display(108, 126, 1, 2);
            break;
        }
        break;
      case 2: // pitch
        display->fill_rect(16 * stage_selected, 32, 16, 15, DUINO_SH1106::Inverse);
        display->display(16 * stage_selected, 16 * stage_selected + 15, 4, 5);
        break;
      case 3: // steps
        display->fill_rect(16 * stage_selected, 48, 7, 9, DUINO_SH1106::Inverse);
        display->display(16 * stage_selected, 16 * stage_selected + 6, 6, 7);
        break;
      case 4: // gate
        display->fill_rect(16 * stage_selected + 7, 48, 9, 9, DUINO_SH1106::Inverse);
        display->display(16 * stage_selected + 7, 16 * stage_selected + 15, 6, 7);
        break;
      case 5: // slew
        display->fill_rect(16 * stage_selected, 58, 16, 6, DUINO_SH1106::Inverse);
        display->display(16 * stage_selected, 16 * stage_selected + 15, 7, 7);
        break;
    }
  }

  void display_gate(uint8_t stage, DUINO_SH1106::SH1106Color color)
  {
    display->fill_rect(16 * stage + 6, 26, 4, 4, color);
  }

  struct DU_SEQ_Parameter_Values {

      display_reverse_address(30, 12);
      last_diradd_mode = seq_values.diradd_mode;
      last_reverse = reverse;
      Display.display(30, 34, 1, 2);
    }

    // display gate
