Pianoinator

Typ_projektu
Arduino
Zdjecie główne
Krótki opis projektu

Projekt to interaktywny system edukacyjny do nauki gry na klawiaturze MIDI. Wykorzystuje Arduino Uno i matrycę LED 16x16 do wizualizacji naciśnięć klawiszy. System wyświetla paski odpowiadające dźwiękom, ułatwiając naukę utworów muzycznych poprzez intuicyjne, wizualne wskazówki. Użytkownik naciska wskazane przyciski i uczy się grać odpowiednie utwory

Niezbędne elementy

1. Płytka Arduino UNO

2. Uniwersalna płytka perforowana 5x7cm

3. Dioda

4. Rezystory 2 x 330ohm 1x1k ohm

5. Transoptor 6N138

6. Wtyczka pięcio-pinowa DIN

7. Klawiatura MIDI+x3mini

8. Matryca LED 16x16

9. Przewody połączeniowe

Sprzęt

1. Komputer z oprogramowaniem Arduino oraz do obsługi MIDI np. Garageband

 

Opis projektu

Projekt stanowi interaktywny system edukacyjny do nauki gry na klawiaturze MIDI, zbudowany z kilku współpracujących ze sobą komponentów: klawiatury MIDI, komputera z oprogramowaniem, mikrokontrolera Arduino Uno oraz wyświetlacza LED o rozdzielczości 16 na 16 pikseli. Całość została połączona w spójny i w pełni działający system, który umożliwia wizualne przedstawienie naciśnięć klawiszy oraz wspomaga użytkownika w nauce konkretnych utworów muzycznych poprzez dynamiczne wskazówki wyświetlane na matrycy LED. Centralnym elementem logiki systemu jest mikrokontroler Arduino Uno, który pełni rolę łąćznika pomiędzy klawiaturą MIDI a wyświetlaczem LED. Na płytkę Arduino wgrano specjalnie przygotowany program, którego zadaniem jest odczytywanie danych z interfejsu MIDI, rozpoznawanie, który klawisz został wciśnięty. Dodatkowo Arduino kontroluje matrycę LED i wyświetla na niej odpowiednio paski 2x16. Pasek ten symbolizuje konkretne naciśnięcie – jego pozycja na matrycy odpowiada danemu klawiszowi, a jego pojawienie się sygnalizuje użytkownikowi konieczność naciśnięcia danego dźwięku. Wyświetlacz LED 16x16 pełni funkcję wizualnego interfejsu użytkownika. Dzięki niewielkim rozmiarom i kwadratowej rozdzielczości możliwe jest wyświetlanie prostych, ale czytelnych reprezentacji zdarzeń MIDI – w szczególności pionowych pasków symbolizujących klawisze lub dźwięki. Każde kolejne naciśnięcie na klawiaturze MIDI skutkuje pojawieniem się nowego paska na matrycy, co tworzy sekwencję wizualnych wskazówek. Dzięki temu użytkownik widzi, jakie dźwięki są grane i w jakiej kolejności, co ułatwia zrozumienie struktury utworu oraz ćwiczenie jego wykonania. Całość projektu została zaprojektowana w sposób umożliwiający intuicyjną obsługę, nawet dla osób początkujących. Użytkownik może rozpocząć naukę gry na klawiaturze, śledząc pojawiające się na matrycy LED paski, które pełnią rolę wizualnych nut. Program może także zawierać proste mechanizmy oceny poprawności – na przykład poprzez zmianę koloru paska po poprawnym naciśnięciu odpowiedniego klawisza()jest to natomiast kolejny krok w rozwoju naszego projektu, który planujemy zrealizować w przyszłości). Projekt ten stanowi prosty, ale skuteczny sposób nauki gry na instrumentach muzycznych z wykorzystaniem nowoczesnych technologii i wizualizacji.

Zdjęcia
kod programu
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

#define MATRIX_PIN 6
#define LED_PIN LED_BUILTIN

#define MATRIX_WIDTH 16
#define MATRIX_HEIGHT 16

#define MIDI_BAUD 31250

#define NOTE_MIN 73
#define NOTE_MAX 88
#define NOTE_COUNT 16

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(
  MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_PIN,
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800
);

// Sekwencja przesunięta o 12
const byte sequence[] = {
  88, 88, 88, 76,
  87, 87, 87, 75,
  85, 85, 85, 73,
  81, 81, 80, 88
};

const int sequenceLength = sizeof(sequence) / sizeof(sequence[0]);
const int repeatCount = 3;
const int delayAfterCorrect = 400;

int sequenceIndex = 0;
int repeat = 0;
bool noteActive = false;
byte currentNote = 0;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);

  Serial.begin(MIDI_BAUD);
  matrix.begin();
  matrix.setBrightness(40);
  matrix.fillScreen(0);
  matrix.show();
}

void loop() {
  if (!noteActive && repeat < repeatCount) {
    currentNote = sequence[sequenceIndex];
    drawNote(currentNote);
    noteActive = true;
  }

  if (Serial.available() >= 3) {
    byte status = Serial.read();

    if ((status & 0xF0) == 0x90) {  // Note ON
      byte note = Serial.read();
      byte velocity = Serial.read();

      if (note == currentNote && velocity > 0) {
        noteActive = false;
        clearMatrix();
        blinkLED();

        delay(delayAfterCorrect);

        sequenceIndex++;
        if (sequenceIndex >= sequenceLength) {
          sequenceIndex = 0;
          repeat++;
        }
      }
    } else {
      // discard remaining bytes
      Serial.read();
      Serial.read();
    }
  }
}

void drawNote(byte note) {
  if (note < NOTE_MIN || note > NOTE_MAX) return;

  byte index = note - NOTE_MIN;
  byte xStart = index;  // 1 LED wide per klawisz (16 total)

  for (int y = 0; y < MATRIX_HEIGHT; y++) {
    matrix.drawPixel(xStart, y, matrix.Color(0, 0, 150));
  }
  matrix.show();
}

void clearMatrix() {
  matrix.fillScreen(0);
  matrix.show();
}

void blinkLED() {
  digitalWrite(LED_PIN, HIGH);
  delay(100);
  digitalWrite(LED_PIN, LOW);
}
Youtube
Tagi
#Piano #Music #Nauka #ZagrajToSam #Fun #PolishBoys #RockAndRoll