# Matrix (Javadocs: controlP5)
Date: 2014-04-27

controlP5

## Class Matrix

- java.lang.Object
- - controlP5.Controller<Matrix>
  - - controlP5.Matrix

All Implemented Interfaces:
  CDrawable, ControllerInterface<Matrix>, ControlP5Constants

    public class Matrix
    extends Controller<Matrix>

A matrix is a 2d array with a pointer that traverses through the matrix in a timed interval. if an item of a matrix-column is active, the x and y position of the corresponding cell will trigger an event and notify the program. see the ControlP5matrix example for more information.

+Example
  `

      /**
       * ControlP5 Matrix
       *
       * A matrix can be used for example as a sequencer, a drum machine.
       *
       * find a list of public methods available for the Matrix Controller
       * at the bottom of this sketch.
       *
       * by Andreas Schlegel, 2012
       * www.sojamo.de/libraries/controlp5
       *
       */

      import controlP5.*;

      ControlP5 cp5;

      Dong[][] d;
      int nx = 10;
      int ny = 10;

      void setup() {
        size(700, 400);

        cp5 = new ControlP5(this);

        cp5.addMatrix("myMatrix")
           .setPosition(50, 100)
           .setSize(200, 200)
           .setGrid(nx, ny)
           .setGap(10, 1)
           .setInterval(200)
           .setMode(ControlP5.MULTIPLES)
           .setColorBackground(color(120))
           .setBackground(color(40))
           ;

        cp5.getController("myMatrix").getCaptionLabel().alignX(CENTER);

        // use setMode to change the cell-activation which by
        // default is ControlP5.SINGLE_ROW, 1 active cell per row,
        // but can be changed to ControlP5.SINGLE_COLUMN or
        // ControlP5.MULTIPLES

          d = new Dong[nx][ny];
        for (int x = 0;x<nx;x++) {
          for (int y = 0;y<ny;y++) {
            d[x][y] = new Dong();
          }
        }
        noStroke();
        smooth();
      }

      void draw() {
        background(0);
        fill(255, 100);
        pushMatrix();
        translate(width/2 + 150, height/2);
        rotate(frameCount*0.001);
        for (int x = 0;x<nx;x++) {
          for (int y = 0;y<ny;y++) {
            d[x][y].display();
          }
        }
        popMatrix();
      }

      void myMatrix(int theX, int theY) {
        println("got it: "+theX+", "+theY);
        d[theX][theY].update();
      }

      void keyPressed() {
        if (key=='1') {
          cp5.get(Matrix.class, "myMatrix").set(0, 0, true);
        }
        else if (key=='2') {
          cp5.get(Matrix.class, "myMatrix").set(0, 1, true);
        }
        else if (key=='3') {
          cp5.get(Matrix.class, "myMatrix").trigger(0);
        }
        else if (key=='p') {
          if (cp5.get(Matrix.class, "myMatrix").isPlaying()) {
            cp5.get(Matrix.class, "myMatrix").pause();
          }
          else {
            cp5.get(Matrix.class, "myMatrix").play();
          }
        }
        else if (key=='0') {
          cp5.get(Matrix.class, "myMatrix").clear();
        }
      }

      void controlEvent(ControlEvent theEvent) {
      }

      class Dong {
        float x, y;
        float s0, s1;

        Dong() {
          float f= random(-PI, PI);
          x = cos(f)*random(100, 150);
          y = sin(f)*random(100, 150);
          s0 = random(2, 10);
        }

        void display() {
          s1 += (s0-s1)*0.1;
          ellipse(x, y, s1, s1);
        }

        void update() {
          s1 = 50;
        }
      }

      /*
      a list of all methods available for the Matrix Controller
       use ControlP5.printPublicMethodsFor(Matrix.class);
       to print the following list into the console.

       You can find further details about class Matrix in the javadoc.

       Format:
       ClassName : returnType methodName(parameter type)

       controlP5.Matrix : Matrix clear()
       controlP5.Matrix : Matrix isPlaying()
       controlP5.Matrix : Matrix pause()
       controlP5.Matrix : Matrix play()
       controlP5.Matrix : Matrix plugTo(Object)
       controlP5.Matrix : Matrix plugTo(Object, String)
       controlP5.Matrix : Matrix set(int, int, boolean)
       controlP5.Matrix : Matrix setCells(int[][])
       controlP5.Matrix : Matrix setGap(int, int)
       controlP5.Matrix : Matrix setGrid(int, int)
       controlP5.Matrix : Matrix setInterval(int)
       controlP5.Matrix : Matrix setMode(int)
       controlP5.Matrix : Matrix setValue(float)
       controlP5.Matrix : Matrix stop()
       controlP5.Matrix : Matrix trigger(int)
       controlP5.Matrix : Matrix update()
       controlP5.Matrix : boolean get(int, int)
       controlP5.Matrix : int getInterval()
       controlP5.Matrix : int getMode()
       controlP5.Matrix : int[][] getCells()
       controlP5.Matrix : void remove()
       controlP5.Controller : CColor getColor()
       controlP5.Controller : ControlBehavior getBehavior()
       controlP5.Controller : ControlWindow getControlWindow()
       controlP5.Controller : ControlWindow getWindow()
       controlP5.Controller : ControllerProperty getProperty(String)
       controlP5.Controller : ControllerProperty getProperty(String, String)
       controlP5.Controller : Label getCaptionLabel()
       controlP5.Controller : Label getValueLabel()
       controlP5.Controller : List getControllerPlugList()
       controlP5.Controller : Matrix addCallback(CallbackListener)
       controlP5.Controller : Matrix addListener(ControlListener)
       controlP5.Controller : Matrix align(int, int, int, int)
       controlP5.Controller : Matrix bringToFront()
       controlP5.Controller : Matrix bringToFront(ControllerInterface)
       controlP5.Controller : Matrix hide()
       controlP5.Controller : Matrix linebreak()
       controlP5.Controller : Matrix listen(boolean)
       controlP5.Controller : Matrix lock()
       controlP5.Controller : Matrix plugTo(Object)
       controlP5.Controller : Matrix plugTo(Object, String)
       controlP5.Controller : Matrix plugTo(Object[])
       controlP5.Controller : Matrix plugTo(Object[], String)
       controlP5.Controller : Matrix registerProperty(String)
       controlP5.Controller : Matrix registerProperty(String, String)
       controlP5.Controller : Matrix registerTooltip(String)
       controlP5.Controller : Matrix removeBehavior()
       controlP5.Controller : Matrix removeCallback()
       controlP5.Controller : Matrix removeCallback(CallbackListener)
       controlP5.Controller : Matrix removeListener(ControlListener)
       controlP5.Controller : Matrix removeProperty(String)
       controlP5.Controller : Matrix removeProperty(String, String)
       controlP5.Controller : Matrix setArrayValue(float[])
       controlP5.Controller : Matrix setArrayValue(int, float)
       controlP5.Controller : Matrix setBehavior(ControlBehavior)
       controlP5.Controller : Matrix setBroadcast(boolean)
       controlP5.Controller : Matrix setCaptionLabel(String)
       controlP5.Controller : Matrix setColor(CColor)
       controlP5.Controller : Matrix setColorActive(int)
       controlP5.Controller : Matrix setColorBackground(int)
       controlP5.Controller : Matrix setColorCaptionLabel(int)
       controlP5.Controller : Matrix setColorForeground(int)
       controlP5.Controller : Matrix setColorValueLabel(int)
       controlP5.Controller : Matrix setDecimalPrecision(int)
       controlP5.Controller : Matrix setDefaultValue(float)
       controlP5.Controller : Matrix setHeight(int)
       controlP5.Controller : Matrix setId(int)
       controlP5.Controller : Matrix setImage(PImage)
       controlP5.Controller : Matrix setImage(PImage, int)
       controlP5.Controller : Matrix setImages(PImage, PImage, PImage)
       controlP5.Controller : Matrix setImages(PImage, PImage, PImage, PImage)
       controlP5.Controller : Matrix setLabelVisible(boolean)
       controlP5.Controller : Matrix setLock(boolean)
       controlP5.Controller : Matrix setMax(float)
       controlP5.Controller : Matrix setMin(float)
       controlP5.Controller : Matrix setMouseOver(boolean)
       controlP5.Controller : Matrix setMoveable(boolean)
       controlP5.Controller : Matrix setPosition(PVector)
       controlP5.Controller : Matrix setPosition(float, float)
       controlP5.Controller : Matrix setSize(PImage)
       controlP5.Controller : Matrix setSize(int, int)
       controlP5.Controller : Matrix setStringValue(String)
       controlP5.Controller : Matrix setUpdate(boolean)
       controlP5.Controller : Matrix setValue(float)
       controlP5.Controller : Matrix setValueLabel(String)
       controlP5.Controller : Matrix setView(ControllerView)
       controlP5.Controller : Matrix setVisible(boolean)
       controlP5.Controller : Matrix setWidth(int)
       controlP5.Controller : Matrix show()
       controlP5.Controller : Matrix unlock()
       controlP5.Controller : Matrix unplugFrom(Object)
       controlP5.Controller : Matrix unplugFrom(Object[])
       controlP5.Controller : Matrix unregisterTooltip()
       controlP5.Controller : Matrix update()
       controlP5.Controller : Matrix updateSize()
       controlP5.Controller : PVector getAbsolutePosition()
       controlP5.Controller : PVector getPosition()
       controlP5.Controller : String getAddress()
       controlP5.Controller : String getInfo()
       controlP5.Controller : String getName()
       controlP5.Controller : String getStringValue()
       controlP5.Controller : String toString()
       controlP5.Controller : Tab getTab()
       controlP5.Controller : boolean isActive()
       controlP5.Controller : boolean isBroadcast()
       controlP5.Controller : boolean isInside()
       controlP5.Controller : boolean isLabelVisible()
       controlP5.Controller : boolean isListening()
       controlP5.Controller : boolean isLock()
       controlP5.Controller : boolean isMouseOver()
       controlP5.Controller : boolean isMousePressed()
       controlP5.Controller : boolean isMoveable()
       controlP5.Controller : boolean isUpdate()
       controlP5.Controller : boolean isVisible()
       controlP5.Controller : float getArrayValue(int)
       controlP5.Controller : float getDefaultValue()
       controlP5.Controller : float getMax()
       controlP5.Controller : float getMin()
       controlP5.Controller : float getValue()
       controlP5.Controller : float[] getArrayValue()
       controlP5.Controller : int getDecimalPrecision()
       controlP5.Controller : int getHeight()
       controlP5.Controller : int getId()
       controlP5.Controller : int getWidth()
       controlP5.Controller : int listenerSize()
       controlP5.Controller : void remove()
       controlP5.Controller : void setView(ControllerView, int)
       java.lang.Object : String toString()
       java.lang.Object : boolean equals(Object)

       */
      </pre>

  `

### Field Summary

### Fields inherited from class controlP5.Controller

`autoHeight, autoSpacing, autoWidth`

### Fields inherited from interface controlP5.ControlP5Constants

`acceptClassList, ACTION_BROADCAST, ACTION_CLICK, ACTION_DRAG, ACTION_ENTER, ACTION_EXIT, ACTION_LEAVE, ACTION_MOVE, ACTION_PRESS, ACTION_PRESSED, ACTION_RELEASE, ACTION_RELEASED, ACTION_RELEASEDOUTSIDE, ACTION_WHEEL, ACTIVE, ALL, ALT, AQUA, ARC, ARRAY, BACKSPACE, BASELINE, BITFONT, BLACK, BLUE, BOOLEAN, BOTTOM, BOTTOM_OUTSIDE, CAPTIONLABEL, CENTER, CHECKBOX, COMMANDKEY, CONTROL, controlEventClass, CUSTOM, DECREASE, DEFAULT, DELETE, DONE, DOWN, DROPDOWN, ELLIPSE, ENTER, ESCAPE, EVENT, eventMethod, FADEIN, FADEOUT, FIELD, FLOAT, FUCHSIA, GRAY, GREEN, grixel, HALF_PI, HIDE, HIGHLIGHT, HORIZONTAL, IDLE, IMAGE, INACTIVE, INCREASE, INTEGER, INVALID, J2D, KEYCONTROL, LEFT, LEFT_OUTSIDE, LIME, LINE, LIST, LOAD, MAROON, MENU, METHOD, MOVE, MULTI, MULTIPLES, NAVY, OLIVE, ORANGE, OVER, P2D, P3D, PI, PRESSED, PRINT, PURPLE, RED, RELEASE, RESET, RIGHT, RIGHT_OUTSIDE, SAVE, SHIFT, SILVER, SINGLE, SINGLE_COLUMN, SINGLE_ROW, SPRITE, standard56, standard58, STRING, SWITCH, SWITCH_BACK, SWITCH_FORE, synt24, TAB, TEAL, THEME_A, THEME_CP52014, THEME_CP5BLUE, THEME_RED, THEME_RETRO, THEME_WHITE, TOP, TOP_OUTSIDE, TRANSITION_WAIT_FADEIN, TREE, TWO_PI, UP, VALUELABEL, VERBOSE, VERTICAL, WAIT, WHITE, YELLOW`

### Constructor Summary

Constructors
Constructor and Description
`Matrix(ControlP5 theControlP5, ControllerGroup<?> theParent, java.lang.String theName, int theCellX, int theCellY, int theX, int theY, int theWidth, int theHeight)`
`Matrix(ControlP5 theControlP5, java.lang.String theName)` Convenience constructor to extend Matrix.

### Method Summary

Methods
`Matrix` `clear()`
`boolean` `get(int theX, int theY)`
`int[][]` `getCells()`
`int` `getInterval()`
`int` `getMode()`
`static int` `getX(float thePosition)`
`static int` `getX(int thePosition)`
`static int` `getY(float thePosition)`
`static int` `getY(int thePosition)`
`boolean` `isPlaying()`
`void` `mousePressed()`
`void` `mouseReleased()`
`Matrix` `pause()`
`Matrix` `play()`
`Matrix` `plugTo(java.lang.Object theObject)`
`Matrix` `plugTo(java.lang.Object theObject, java.lang.String thePlugName)`
`void` `remove()` removes a controller from controlP5.
`Matrix` `set(int theX, int theY, boolean theValue)` set the state of a particular cell inside a matrix.
`Matrix` `setBackground(int c)`
`Matrix` `setCells(int[][] theCells)`
`Matrix` `setGap(int theX, int theY)`
`Matrix` `setGrid(int theCellX, int theCellY)`
`Matrix` `setInterval(int theInterval)` set the speed of intervals in millis iterating through the matrix.
`Matrix` `setMode(int theMode)` use setMode to change the cell-activation which by default is ControlP5.SINGLE_ROW, 1 active cell per row, but can be changed to ControlP5.SINGLE_COLUMN or ControlP5.MULTIPLES
`Matrix` `setValue(float theValue)`
`Matrix` `stop()`
`Matrix` `trigger(int theColumn)`
`Matrix` `update()` updates the value of the controller without having to set the value explicitly.
`Matrix` `updateDisplayMode(int theMode)`
`Matrix` `updateInternalEvents(processing.core.PApplet theApplet)` a method for putting input events like e.g.

### Methods inherited from class controlP5.Controller

`add, addCallback, addListener, align, bringToFront, bringToFront, changeValue, continuousUpdateEvents, draw, getAbsolutePosition, getAddress, getArrayValue, getArrayValue, getBehavior, getCaptionLabel, getColor, getControllerPlugList, getControlWindow, getDecimalPrecision, getDefaultValue, getHeight, getId, getInfo, getLabel, getMax, getMin, getName, getParent, getPickingColor, getPointer, getPosition, getProperty, getProperty, getStringValue, getTab, getValue, getValueLabel, getView, getWidth, getWindow, hide, init, isActive, isBroadcast, isInside, isLabelVisible, isListening, isLock, isMouseOver, isMousePressed, isMoveable, isUpdate, isUserInteraction, isVisible, keyEvent, linebreak, listen, listenerSize, lock, moveTo, moveTo, moveTo, moveTo, moveTo, moveTo, moveTo, moveTo, moveTo, plugTo, plugTo, registerProperty, registerProperty, registerTooltip, remove, removeBehavior, removeCallback, removeCallback, removeListener, removeProperty, removeProperty, setAbsolutePosition, setAddress, setArrayValue, setArrayValue, setBehavior, setBroadcast, setCaptionLabel, setColor, setColorActive, setColorBackground, setColorCaptionLabel, setColorForeground, setColorValueLabel, setDecimalPrecision, setDefaultValue, setGroup, setGroup, setHeight, setId, setImage, setImage, setImages, setImages, setImages, setLabelVisible, setLock, setMax, setMin, setMouseOver, setMousePressed, setMoveable, setParent, setPosition, setPosition, setSize, setSize, setStringValue, setTab, setTab, setUpdate, setUserInteraction, setValueLabel, setValueSelf, setView, setView, setVisible, setWidth, show, toString, unlock, unplugFrom, unplugFrom, unregisterTooltip, updateAbsolutePosition, updateEvents, updateSize`

### Methods inherited from class java.lang.Object

`equals, getClass, hashCode, notify, notifyAll, wait, wait, wait`

### Methods inherited from interface controlP5.ControllerInterface

`parent, setColorLabel, setColorValue, setLabel`

### Constructor Detail

#### Matrix

    public Matrix(ControlP5 theControlP5,
          ControllerGroup<?> theParent,
          java.lang.String theName,
          int theCellX,
          int theCellY,
          int theX,
          int theY,
          int theWidth,
          int theHeight)

#### Matrix

    public Matrix(ControlP5 theControlP5,
          java.lang.String theName)

Convenience constructor to extend Matrix.

Parameters:
  `theControlP5` -
  `theName` -

+Example
  `

      /**
       * ControlP5 extending Controllers
       *
       * the following example shows how to extend the Controller class to
       * create customizable Controllers. You can either extend the Controller class itself,
       * or any class that extends Controller itself like the Slider, Button, DropdownList, etc.
       *
       * How to:
       *
       * 1) do a super call to the convenience constructor requiring
       * 2 parameter (ControlP5 instance, name)
       *
       * 2) the Controller class has a set of empty methods that allow you to capture
       * inputs from the mouse including
       * onEnter(), onLeave(), onPress(), onRelease(), onClick(), onScroll(int), onDrag()
       * These you can override and include functionality as needed.
       *
       * 3) use method getPointer() to return the local (relative)
       * xy-coordinates of the controller
       *
       * 4) after instantiation custom controllers are treated the same
       * as default controlP5 controllers.
       *
       * by Andreas Schlegel, 2012
       * www.sojamo.de/libraries/controlp5
       *
       */

      import controlP5.*;

      ControlP5 cp5;
      PApplet p;

      void setup() {
        size(400, 400);
        cp5 = new ControlP5(this);

        // create 2 groups to show nesting of custom controllers and
        //
        Group g1 = cp5.addGroup("a").setPosition(0,100).setWidth(180);
        Group g2 = cp5.addGroup("b").setPosition(0,10).setWidth(180);
        g2.moveTo(g1);

        // create 2 custom Controllers from class MyButton
        // MyButton extends Controller and inherits all methods accordingly.
        new MyButton(cp5, "b1").setPosition(0, 0).setSize(180, 200).moveTo(g2);
        new MyButton(cp5, "b2").setPosition(205, 15).setSize(180, 200);

      }

      void draw() {
        background(0);
      }

      // b1 will be called from Controller b1
      public void b1(float theValue) {
        println("yay button "+theValue);
      }

      public void controlEvent(ControlEvent theEvent) {
        println("controlEvent : "+theEvent);
      }

      // Create a custom Controller, please not that
      // MyButton extends Controller<MyButton>, <MyButton>
      // is an indicator for the super class about the type of
      // custom controller to be created.

      class MyButton extends Controller<MyButton> {

        int current = 0xffff0000;

        float a = 128;

        float na;

        int y;

        // use the convenience constructor of super class Controller
        // MyButton will automatically registered and move to the
        // default controlP5 tab.

        MyButton(ControlP5 cp5, String theName) {
          super(cp5, theName);

          // replace the default view with a custom view.
          setView(new ControllerView() {
            public void display(PApplet p, Object b) {
              // draw button background
              na += (a-na) * 0.1;
              p.fill(current,na);
              p.rect(0, 0, getWidth(), getHeight());

              // draw horizontal line which can be moved on the x-axis
              // using the scroll wheel.
              p.fill(0,255,0);
              p.rect(0,y,width,10);

              // draw the custom label
              p.fill(128);
              translate(0,getHeight()+14);
              p.text(getName(),0,0);
              p.text(getName(),0,0);

            }
          }
          );
        }

        // override various input methods for mouse input control
        void onEnter() {
          cursor(HAND);
          println("enter");
          a = 255;
        }

        void onScroll(int n) {
          println("scrolling");
          y -= n;
          y = constrain(y,0,getHeight()-10);
        }

        void onPress() {
          println("press");
          current = 0xffffff00;
        }

        void onClick() {
          Pointer p1 = getPointer();
          println("clicked at "+p1.x()+", "+p1.y());
          current = 0xffffff00;
          setValue(y);
        }

        void onRelease() {
          println("release");
          current = 0xffffffff;
        }

        void onMove() {
          println("moving "+this+" "+_myControlWindow.getMouseOverList());
        }

        void onDrag() {
          current = 0xff0000ff;
          Pointer p1 = getPointer();
          float dif = dist(p1.px(),p1.py(),p1.x(),p1.y());
          println("dragging at "+p1.x()+", "+p1.y()+" "+dif);
        }

        void onReleaseOutside() {
          onLeave();
        }

        void onLeave() {
          println("leave");
          cursor(ARROW);
          a = 128;
        }
      }

  `

### Method Detail

#### clear

    public Matrix clear()

#### get

    public boolean get(int theX,
              int theY)

#### getCells

    public int[][] getCells()

#### getInterval

    public int getInterval()

#### getMode

    public int getMode()

#### getX

    public static int getX(float thePosition)

#### getX

    public static int getX(int thePosition)

#### getY

    public static int getY(float thePosition)

#### getY

    public static int getY(int thePosition)

#### isPlaying

    public boolean isPlaying()

#### mousePressed

    public void mousePressed()

#### mouseReleased

    public void mouseReleased()

#### pause

    public Matrix pause()

#### play

    public Matrix play()

#### plugTo

    public Matrix plugTo(java.lang.Object theObject)

Overrides:
  `plugTo` in class `Controller<Matrix>`
Returns:
  Controller

#### plugTo

    public Matrix plugTo(java.lang.Object theObject,
                java.lang.String thePlugName)

Overrides:
  `plugTo` in class `Controller<Matrix>`

#### remove

    public void remove()

Description copied from class: `Controller`
removes a controller from controlP5.

Specified by:
  `remove` in interface `ControllerInterface<Matrix>`
Overrides:
  `remove` in class `Controller<Matrix>`

#### set

    public Matrix set(int theX,
             int theY,
             boolean theValue)

set the state of a particular cell inside a matrix. use true or false for parameter theValue

Parameters:
  `theX` -
  `theY` -
  `theValue` -
Returns:
  Matrix

#### setBackground

    public Matrix setBackground(int c)

#### setCells

    public Matrix setCells(int[][] theCells)

#### setGap

    public Matrix setGap(int theX,
                int theY)

#### setGrid

    public Matrix setGrid(int theCellX,
                 int theCellY)

#### setInterval

    public Matrix setInterval(int theInterval)

set the speed of intervals in millis iterating through the matrix.

Parameters:
  `theInterval` - int
Returns:
  Matrix

#### setMode

    public Matrix setMode(int theMode)

use setMode to change the cell-activation which by default is ControlP5.SINGLE_ROW, 1 active cell per row, but can be changed to ControlP5.SINGLE_COLUMN or ControlP5.MULTIPLES

Parameters:
  `theMode` - return Matrix

#### setValue

    public Matrix setValue(float theValue)

Specified by:
  `setValue` in interface `ControllerInterface<Matrix>`
Overrides:
  `setValue` in class `Controller<Matrix>`
Parameters:
  `theValue` - float

#### stop

    public Matrix stop()

#### trigger

    public Matrix trigger(int theColumn)

#### update

    public Matrix update()

Description copied from class: `Controller`
updates the value of the controller without having to set the value explicitly. update does not visually update the controller. the updating status can be set with setUpdate(true/false) and checked with isUpdate().

Specified by:
  `update` in interface `ControllerInterface<Matrix>`
Overrides:
  `update` in class `Controller<Matrix>`
Returns:
  Controller
See Also:
  `Controller.setUpdate(boolean)`, `Controller.isUpdate()`

#### updateDisplayMode

    public Matrix updateDisplayMode(int theMode)

#### updateInternalEvents

    public Matrix updateInternalEvents(processing.core.PApplet theApplet)

Description copied from interface: `ControllerInterface`
a method for putting input events like e.g. mouse or keyboard events and queries. this has been taken out of the draw method for better overwriting capability.

Specified by:
  `updateInternalEvents` in interface `ControllerInterface<Matrix>`
Overrides:
  `updateInternalEvents` in class `Controller<Matrix>`
See Also:
  `ControllerInterface.updateInternalEvents`