arduino_midi_player/Midi/arduino-midi-player-master/README.md
2025-03-24 14:30:56 +08:00

46 lines
2.1 KiB
Markdown

Arduino MIDI Player
===================
This program plays MIDI music on Arduino by generating analog/PWM waves on a port connected to a speaker/buzzer. We use timer 2 to do direct digital synthesis (DDS).
Features
--------
- **Chords/multiple notes!** The DDS can add multiple waves together on a single timer and single port. Unlike `tone()` which you can only run one frequency at any time.
- **Sine waves!** You can define any arbitrary function/wave sample to use as the instrument in `smf2seq.js`. No more square waves of the built-in `tone()` function.
- **Tested on UNO!** Though it might not work directly on other models, after some modification the concept should work on any Arduino. (since UNO is the crappiest model)
How to use
----------
**Hardware**
1. Connect buzzer/speaker to PWM port 11. Use a proper resister.
2. A variable-resistance resister is recommended to adjust the volume.
3. (Optional) Connect LEDs to port 2-7.
4. Ground everything.
**Software**
1. Place your `.mid` file under the main directory
2. Run `node smf2seq.js <your_midi_song.mid>` to generate `sequence.h` (You will need to install node.js if you don't have one)
3. Open `arduino-midi-player.ino` in Arduino IDE
4. Compile & Upload
Limitations
-----------
Due to the hardware of Arduino, your MIDI might not work perfectly. (Apparently an Arduino UNO will NEVER be able to handle a black MIDI)
- **Large files.** The max internal storage is 32KB and `smf2seq.js` use 6 bytes for each note.
- **Short time intervals/High BPM.** 1/2048 notes will not likely to play because of the internal clock
- **High/Low pitches.** The clock might not be fast enough to generate a desired wave of the specified frequency
- **Complex chords.** The clock interrupt cannot only process a limit number (4-6) of notes within the clock interval. Lower notes that exceed the limit of `KEYBUF_SIZE` will be discarded
- **Instruments.** MIDI instruments will be disregarded and everything will be sine waves
Notes
-----
- macros like `sbi`, `cbi`, `OCR2A` are used instead of API functions like `digitalWrite` to improve performance. Google them for more details