#include <AH/STL/bitset>
 
 
constexpr uint8_t rows = 10;
constexpr uint8_t columns = 8;
 
static_assert(rows <= 10, "Error: TC4028 only has 10 outputs");
 
  {1, 2, 3, 4, 5, 6, 7, 8},        
  {9, 10, 11, 12, 13, 14, 15, 16}, 
  
}};
 
const PinList<4> addressPins = {{2, 3, 4, 5}};
const PinList<columns> columnPins = {{6, 7, 8, 9, 10, 11, 12, 13}};
 
void selectLine(uint8_t line) {
  uint8_t mask = 1;
  for (
pin_t addressPin : addressPins) {
 
    mask <<= 1;
  }
}
 
void setup() {
  for (
pin_t addressPin : addressPins)
 
  for (
pin_t columnPin : columnPins)
 
 
  midi.begin();
}
 
std::bitset<rows * columns> previousStates;
 
void loop() {
  for (uint8_t row = 0; row < rows; ++row) {
    selectLine(row);
    for (uint8_t col = 0; col < columns; ++col) {
      uint8_t index = row * columns + col; 
      
      if (newState != previousStates[index]) {
        
        
        uint8_t velocity = newState * 0x7F;
        midi.sendNoteOn({notes[row][col], channel}, velocity);
        
        previousStates[index] = newState;
        
      }
    }
  }
  midi.update(); 
}