A Java-based interactive piano learning system that detects piano notes in real-time and provides visual feedback through LEDs, OLED display, and spectrograms. The system integrates audio processing with Arduino hardware to create an engaging learning experience.
- Real-time Note Detection: Detects piano notes (C4-B4) from microphone input or MP3 files
- Audio Processing: Uses TarsosDSP for pitch detection and signal processing
- Arduino Integration:
- Controls 7 LEDs corresponding to piano notes
- Displays note information on SSD1306 OLED display
- Button input via resistor ladder for interactive control
- Visual Feedback:
- Real-time spectrogram visualization
- Frequency domain analysis
- Time-domain waveform display
- Recording & Playback: Record practice sessions and play them back for analysis
- Calibration System: Calibrate button inputs for accurate note selection
The application consists of several key components:
Main.java: Application entry pointPianoNoteApp.java: Main controller coordinating all componentsPianoAudioProcessor.java: Handles audio recording, processing, and note detectionArduinoController.java: Manages Arduino hardware communication (LEDs, buttons, OLED)VisualizationManager.java: Creates spectrograms and audio visualizationsNoteEvent.java: Data model for detected musical notesPianoNoteDetector.java: Legacy standalone implementation
- Arduino board (Uno, Mega, or compatible)
- Arduino Grove Base Shield or equivalent
- 7 LEDs connected to digital pins 2, 3, 7, 8, 9, 10, 11
- 7-button resistor ladder connected to analog pin A0
- SSD1306 OLED display (128x64) via I2C (address 0x3C)
- StandardFirmata firmware loaded on Arduino
Button resistor ladder voltage levels:
- Button 1 (C4): 2.5V
- Button 2 (D4): 3.3V
- Button 3 (E4): 3.7V
- Button 4 (F4): 4.0V
- Button 5 (G4): 4.1V
- Button 6 (A4): 4.2V
- Button 7 (B4): 4.3V
- Java 8+
- TarsosDSP: Audio processing and pitch detection
- Firmata4j: Arduino communication via Firmata protocol
- Apache Commons Math3: FFT and signal processing
- JFreeChart: Data visualization and charting
- Java Sound API: Audio input/output
-
Clone the repository
git clone https://github.com/jazzhatcoder/Piano-Teacher.git cd Piano-Teacher -
Install StandardFirmata on Arduino
- Open Arduino IDE
- File → Examples → Firmata → StandardFirmata
- Upload to your Arduino board
-
Add required JAR dependencies Ensure the following libraries are in your classpath:
TarsosDSP-x.x.jarfirmata4j-x.x.jarcommons-math3-x.x.jarjfreechart-x.x.jarjcommon-x.x.jar
-
Compile the project
javac -d bin src/*.java -
Run the application
java -cp bin Main
- Connect Arduino: Plug in your Arduino board via USB
- Launch Application: Run
Main.java - Calibrate Buttons (first time setup):
- Click the "Calibrate" button
- Follow on-screen instructions to press each button
- Calibration data is saved to
button_calibration.txt
-
Record Audio:
- Click "Start Recording"
- Play piano notes (C4-B4 range)
- Click "Stop Recording"
-
Load MP3 File:
- Click "Load MP3"
- Select an MP3 file containing piano notes
- The system will process and detect notes
-
Play Detected Notes:
- After detection, click "Play"
- LEDs light up corresponding to detected notes
- OLED display shows current note information
- Visual spectrogram displays frequency analysis
- Press physical buttons on the Arduino to manually trigger specific notes
- LEDs provide immediate visual feedback
- OLED displays the selected note name and frequency
- Sample Rate: 44.1 kHz
- Buffer Size: 1024 samples
- Overlap: 768 samples (75%)
- Frequency Range: C4 (261.63 Hz) to B4 (493.88 Hz)
- Frequency Tolerance: ±15 Hz
- Minimum Note Duration: 0.2 seconds
- Pitch Detection: YIN algorithm via TarsosDSP
The application provides two types of spectrograms:
- Raw Audio Spectrogram: Shows the unprocessed frequency content
- Filtered Audio Spectrogram: Displays filtered audio focusing on piano note frequencies
Spectrograms use Fast Fourier Transform (FFT) with:
- Window size: 512 samples
- Hop size: 256 samples
- Multi-threaded processing for performance
Unit tests are provided for key components:
ArduinoControllerTest.java: Tests Arduino communication and hardware controlPianoAudioProcessorTest.java: Tests audio processing and note detection
Run tests using your preferred Java testing framework.
- TarsosDSP: Excellent audio processing library
- Firmata4j: Seamless Arduino integration
- Apache Commons Math: Robust mathematical functions
- JFreeChart: Powerful visualization capabilities