Миди на Teensy4.0

Здравствуйте! Помогите решить проблему. Написан скетч для мидиконтроллера на Teensy4.0. К ней подключено 18 фэйдеров, 4 энкодера и матрица кнопок. Скетч состоит из файлов .ino .cpp .h. Фэйдеры и энкодеры находятся в файле .ino , и выходят в usbmidi нормально, а кнопки находятся в файле .cpp и в usbmidi никак не хотят выходить. Хотя они работают и в serial monitore их видно. Скорее всего недостаток какой то строки в файле .срр. Спасибо($) откликнувшимся!

что бы это значило?

и что, даже это предположение не навело вас на мысль, что надо показывать код???

Здравствуйте! На форуме впервые! Конечно я понял ошибку. Но код на домашнем компе. Выложу только вечером, сейчас на работе. Спасибо за отклик!

После загрузки кода, на выходе Usbmidi (смотрю в Midi View) сообщения от потенциометров и энкодеров приходят. От кнопок нет, хотя , в Serial Monitor видно, что срабатывают. Извините, что своими словами

тогда вечером и надо было тему создавать.

Без кода обсуждать нечего.

Прошу прощения за слова “Скорее всего недостаток какой то строки в файле .срр.” Сделал вывод за Вас. Ведь совершенно не уверен, что дело в этом

sketch_jan28a.ino

#include <Encoder.h>
#include <MIDI.h>
#include "matrix_buttons.h"
#include <MIDIUSB.h>

// === Распределение пинов ===
const int muxSelectPins[] = {14, 15, 16, 17}; // Пины для селекторов мультиплексора
const int muxOutputPin = 18; // Аналоговый выход мультиплексора
Encoder encoders[] = {
  Encoder(10, 11),
  Encoder(0, 1),
  Encoder(22, 23),
  Encoder(24, 25)
};

const int additionalPotPins[] = {34, 35}; // Новые потенциометры
int additionalPotValues[2] = {0}; // Значения потенциометров
int lastAdditionalPotValues[2] = {0};

// === Переменные ===
int potentiometerValues[16] = {0}; // Изменено на 16
int lastPotentiometerValues[16] = {0}; // Изменено на 16
long encoderValues[4] = {0};
long lastEncoderValues[4] = {0};

// === Настройки ===
const int potentiometerThreshold = 2; // Гистерезис для потенциометров
const int encoderStep = 4;            // Шаг для энкодеров

void setup() {
  // Настройка пинов селекторов мультиплексора
  for (int i = 0; i < 4; i++) {
    pinMode(muxSelectPins[i], OUTPUT);
  }
  
  // Настройка пинов для дополнительных потенциометров
  for (int i = 0; i < 2; i++) {
    pinMode(additionalPotPins[i], INPUT);
  }
  
  // Инициализация Serial для отладки
  Serial.begin(9600);

  // Инициализация матрицы кнопок
  setupMatrixButtons();

  // Инициализация MIDI
  usbMIDI.begin();
}

void loop() {
  // --- Потенциометры (через мультиплексор) ---
  for (int i = 0; i < 16; i++) {
    // Устанавливаем селекторы для мультиплексора
    for (int j = 0; j < 4; j++) {
      digitalWrite(muxSelectPins[j], (i >> j) & 1);
    }

    // Читаем значение с выходного пина мультиплексора
    int value = analogRead(muxOutputPin) / 8; // Приводим к диапазону 0-127
    if (abs(value - lastPotentiometerValues[i]) > potentiometerThreshold) { // Проверяем порог
      usbMIDI.sendControlChange(46 + i, value, 1); // CC №1-16 для потенциометров
      lastPotentiometerValues[i] = value;
    }
  }

  // --- Новые потенциометры (прямое подключение) ---
  for (int i = 0; i < 2; i++) {
    int value = analogRead(additionalPotPins[i]) / 8; // Приводим к диапазону 0-127
    if (abs(value - lastAdditionalPotValues[i]) > potentiometerThreshold) { // Проверяем порог
      usbMIDI.sendControlChange(62 + i, value, 1); // CC №17-18 для новых потенциометров
      lastAdditionalPotValues[i] = value;
    }
  }

  // --- Матрица кнопок ---
  readMatrixButtons();
  // printMatrixButtons(); // Для отладки (убрать в финальной версии)

  // --- Энкодеры ---
  for (int i = 0; i < 4; i++) {
    long value = encoders[i].read();
    if (abs(value - lastEncoderValues[i]) >= encoderStep) { // Проверяем шаг
      if (value > lastEncoderValues[i]) {
        usbMIDI.sendControlChange(20 + i, 1, 1); // Увеличение CC №9-12
      } else {
        usbMIDI.sendControlChange(20 + i, 127, 1); // Уменьшение CC №9-12
      }
      lastEncoderValues[i] = value;
    }
  }

  // Убери `delay(100)` в финальной версии, если хочешь быструю реакцию.
  delay(10); // Пауза для отладки
}

matrix_buttons.cpp

#include "matrix_buttons.h"
#include <Arduino.h>
#include <MIDIUSB.h>

// Определяем константы и глобальные переменные


const int numRows = 3; // Количество строк
const int numCols = 4; // Количество столбцов

const int rowPins[numRows] = {19, 20, 21}; // Пины строк
const int colPins[numCols] = {2, 3, 4, 5}; // Пины столбцов

bool matrixButtons[3][4] = {{false}}; // Состояние кнопок (изначально false)

// Определяем функции
void setupMatrixButtons() {
    Serial.println("Инициализация матрицы кнопок с переключением INPUT/OUTPUT...");

    // Настраиваем строки и столбцы как входы с подтяжкой
    for (int i = 0; i < numRows; i++) {
        pinMode(rowPins[i], INPUT_PULLUP);
    }
    for (int j = 0; j < numCols; j++) {
        pinMode(colPins[j], INPUT_PULLUP);
    }

    Serial.println("Матрица кнопок инициализирована.");
}

void readMatrixButtons() {
    // Считываем состояние кнопок в матрице
    for (int i = 0; i < numRows; i++) {
        // Активируем строку: переводим её в OUTPUT и ставим LOW
        pinMode(rowPins[i], OUTPUT);
        digitalWrite(rowPins[i], LOW);
        delayMicroseconds(5); // Даем сигналу стабилизироваться

        for (int j = 0; j < numCols; j++) {
            // Читаем состояние столбца
            bool currentState = !digitalRead(colPins[j]);

            // Проверяем состояние кнопки
            if (currentState && !matrixButtons[i][j]) {
                matrixButtons[i][j] = true;
                Serial.print("Нажата кнопка: строка ");
                Serial.print(i);
                Serial.print(", столбец ");
                Serial.println(j);
            } else if (!currentState && matrixButtons[i][j]) {
                matrixButtons[i][j] = false;
            }
        }

        // Возвращаем строку в режим INPUT
        pinMode(rowPins[i], INPUT_PULLUP);
    }
}




void printMatrixButtons() {
    // Выводим состояние кнопок в Serial
    Serial.println("Состояние кнопок:");
    for (int i = 0; i < numRows; i++) {
        for (int j = 0; j < numCols; j++) {
            Serial.print(matrixButtons[i][j]);
            Serial.print(" ");
        }
        Serial.println();
    }
}
// Отправка MIDI Note On
void sendNoteOn(byte pitch, byte velocity) {
    midiEventPacket_t noteOn = {0x09, 0x90, pitch, velocity};
    MidiUSB.sendMIDI(noteOn);
    MidiUSB.flush();
}

// Отправка MIDI Note Off
void sendNoteOff(byte pitch, byte velocity) {
    midiEventPacket_t noteOff = {0x08, 0x80, pitch, velocity};
    MidiUSB.sendMIDI(noteOff);
    MidiUSB.flush();
}

matrix_buttons.h

#ifndef MATRIXBUTTONSH // Начало защиты от повторного включения
#define MATRIXBUTTONSH

#include <Arduino.h> // Подключаем Arduino.h для byte и других типов

// Объявляем константы и глобальные переменные
extern const int numRows;
extern const int numCols;
extern const int rowPins[];
extern const int colPins[];
extern bool matrixButtons[3][4]; // Пример для матрицы 6x9

// Объявляем функции
void setupMatrixButtons();
void readMatrixButtons();
void printMatrixButtons();

#endif // MATRIXBUTTONSH

Потенциометры 16 шт подключены через мультиплексор 74hc4067 S0, S1, S2, S3 - 14, 15, 16, 17. SIG- 18. EN-GND. Два потенциометра подключены напрямую на пины 34, 35. Энкодеры и матрица кнопок подключены напрямую на пины, в коде видно

Похоже вы совсем совсем не понимаете работу программы, если это так, то советы скорее всего не помогут.
По существу.
Кнопки у вас и не пытаются ничего отправлять в MIDI.
Не знаю, какая команда нужна при нажатии отпускании, но скорее всего надо добавить после
matrixButtons[i][j] = true;
вызов
sendNoteOn(byte pitch, byte velocity); где pitch определяется нажатой кнопкой

а после
matrixButtons[i][j] = false;
вызов
sendNoteOff(byte pitch, byte velocity);

Да! Не сильно разбираюсь еще. И написал в соответствующей ветке. Есть желание разбираться дальше и спрашивать буду если что, но в других ветках. А пока прошу помощь в исправлении скетча. То что Вы предложили не сработало, компилятор выдал много ошибок

Покажите новую версию кода, которая у вас получилась после исправления по совету @Upper .
Если компилятор дает ошибки - приведите их полностью (текстом)

PS Вы, похожеЮ так и не разобрались, как общаться на этом форуме. Любые вопросы по программе - только с кодом!