Hallo.
Ich bin dabei ein Klavier mit einer Keyboardtastatur zu bauen (Derzeitige Hardware besteht aus: ESP32, SX1509, shifting microSD-Card-Modul (um später gespeicherte Lieder abspielen zu können), UDA1334A) .
Die Tastatur verfügt über 2 Flachbankkabel. Einmal mit 7 Kabelsträngen und einmal mit 8 Kabelsträngen. Dies lässt sich für mich darauf schließen, dass eine Matrix dahinter steckt.
Ich habe also diese zwei Flachbandkabel mit Hilfe eines SX1509-Moduls an meinen ESP32 verbunden (8er-Leiste von PIN 0-7 und 7er-Leiste von PIN 8-14 des SX1509).
Durch das UDA1334A Modul lasse ich den Ton auf einen JBL-Lautsprecher ausgeben.
Bisher habe ich es geschafft einen Code zu schreiben, der durch betätigen einer Taste den richten Midi-Ton dazu ausgibt. Verwenden tue ich dabei die STK-Library für die Tonausgabe mit Midi-Noten.
Jetzt zu meinem Problem: Wenn ich 2 Tasten gleichzeitig drücke spielt er abwechselnd die jeweiligen Töne und nicht gleichzeitig.
Meine Frage ist jetzt: Hat jemand schon Erfahrung mit sowas gemacht und kann mir sagen, wie ich es schaffe mehrere Tasten der Klaviatur geleichzeitig zu lesen und auszugeben?
Der schon vorhandene Code:
#include <Wire.h>
#include <SparkFunSX1509.h>
#include "AudioTools.h"
#include "StkAll.h"
#include "Moog.h"
#include "Arduino.h"
#include "Audio.h"
#include "SPI.h"
#include "SD.h"
#include "FS.h"
#define KEY_ROWS 8
#define KEY_COLS 8
#define SD_CS 5
#define SPI_MOSI 23
#define SPI_MISO 19
#define SPI_SCK 18
const byte SX1509_ADDRESS = 0x3E;
SX1509 io;
I2SStream i2s;
ArdStreamOut output(i2s, 1);
Moog moog;
Voicer voicer;
int group = 0;
float amplitude = 15;
int note = 0;
byte keyMap[KEY_ROWS][KEY_COLS] = {
// 1 2 3 4 5 6 7 8
{ 0, 1, 2, 3, 4, 5, 6, 7}, // 1
{ 8, 9, 10, 11, 12, 13, 14, 15}, // 2
{16, 17, 18, 19, 20, 21, 22, 23}, // 3
{24, 25, 26, 27, 28, 29, 30, 31}, // 4
{32, 33, 34, 35 , 36, 37, 38, 39}, // 5
{40, 41, 42, 43, 44, 45, 46, 47}, // 6
{48, 49, 50, 51, 52, 53, 54, 55}, // 7
{56, 57, 58, 59, 60, 61, 62, 63} // 8
};
byte notes_midi[64] = {
0, 52, 44, 36, 28, 20, 12, 0,
0, 53, 45, 37, 29, 21, 13, 0,
0, 54, 46, 38, 30, 22, 14, 0,
0, 55, 47, 39, 31, 23, 15, 0,
0, 56, 48, 40, 32, 24, 16, 0,
0, 57, 49, 41, 33, 25, 17, 0,
0, 58, 50, 42, 34, 26, 18, 0,
0, 59, 51, 43, 35, 27, 19, 0
};
void setup() {
Serial.begin(115200);
voicer.addInstrument(&moog, group);
while (!Serial);
Serial.println("Setup-Start");
Serial.println("SX1509 keypad tone");
Wire.begin();
Serial.println("Wire.begin() done");
if (io.begin(SX1509_ADDRESS) == false) {
Serial.println("Failed to communicate. Check wiring and address of SX1509.");
Serial.print(SX1509_ADDRESS);
while (1);
}
auto cfg = i2s.defaultConfig(TX_MODE);
cfg.bits_per_sample = 16;
cfg.sample_rate = Stk::sampleRate();
cfg.channels = 1;
cfg.pin_bck = 27; //#define I2S_BCLK 27
cfg.pin_ws = 26; //#define I2S_LRC 26
cfg.pin_data = 25; //#define I2S_DOUT 25
i2s.begin(cfg);
unsigned int sleepTime = 256;
byte scanTime = 50;
byte debounceTime = 25;
io.keypad(KEY_ROWS, KEY_COLS, sleepTime, scanTime, debounceTime);
long endTime = millis() + 1000;
voicer.noteOn(90, amplitude, group);
while (millis() + 2000 < endTime) {
output.tick(voicer.tick());
}
}
void loop() {
unsigned long startTime = micros();
unsigned int keyData = io.readKeypad();
unsigned long endTimeMicros = micros();
long endTime = millis() + 500;
if (keyData != 0) {
Serial.print("Time taken: ");
Serial.print(endTimeMicros - startTime);
Serial.println(" microseconds");
byte row = io.getRow(keyData);
byte col = io.getCol(keyData);
byte key = keyMap[row][col];
if (key >= 0 && key < 64) {
note = notes_midi[key];
Serial.println(notes_midi[key]);
moog.noteOn(note, amplitude);
while (millis() < endTime) {
output.tick(moog.tick());
}
}
}
}
Bei Unklarheiten gerne fragen.
Ich freue mich auf weiterbringende Antworten.