probonopd
ed4a501d34
|
3 years ago | |
---|---|---|
.github/workflows | 3 years ago | |
CMSIS_5@18205c6c2b | 3 years ago | |
Synth_Dexed@c58ac7c289 | 3 years ago | |
circle-stdlib@61cf3a47bf | 3 years ago | |
src | 3 years ago | |
.gitignore | 3 years ago | |
.gitmodules | 3 years ago | |
README.md | 3 years ago | |
build.sh | 3 years ago | |
getsysex.sh | 3 years ago |
README.md
MiniDexed
MiniDexed is a FM synthesizer closely modeled on the famous DX7 by a well-known Japanese manufacturer running on a bare metal Raspberry Pi (without a Linux kernel or operating system). On Raspberry Pi 2 and larger, it can run 8 tone generators, not unlike the TX816/TX802 (8 DX7 instances without the keyboard in one box). Featured on HACKADAY.
Features
- Uses Synth_Dexed with circle-stdlib
- SD card contents can be downloaded from GitHub Releases
- Runs on Raspberry Pi Zero, Raspberry Pi 1, 2, 3, 4, 400
- produces sound on the headphone jack, HDMI (better), or a dedicated DAC (best)
- Supports multiple voices through Program Change and Bank Change LSB/MSB MIDI messages
- Loads
.syx
files from SD card (e.g., usinggetsysex.sh
or from Dexed_cart_1.0.zip) - Menu structure on optional HD44780 display and rotary encoder
- Runs up to 8 Dexed instances simultaneously (like in a TX816) and mixes their output together
- Allows for each Dexed instance to be detuned and stereo shifted
- Allows to configure multiple Dexed instances through
performance.ini
files - Compressor effect
- Reverb effect
TODO
- Make it possible to assign voice parameters to sliders and knobs on MIDI controllers
- https://github.com/probonopd/MiniDexed/issues
Introduction
Video about this project by Floyd Steinberg:
System Requirements
- Raspberry Pi 1, 2, 3, 4, or 400 (Zero and Zero 2 can be used but need HDMI or a supported i2s DAC for audio out). On Raspberry Pi 1 and on Raspberry Pi Zero there will be severely limited functionality (only one tone generator instead of 8)
- A PCM5102A or PCM5122 based DAC or HDMI display or audio extractor for good sound quality. If you don't have this, you can use the headphone jack on the Raspberry Pi but on anything but the Raspberry 4 the sound quality will be seriously limited
- Optionally (but highly recommended), an alphanumeric 1602 LCD Display and a KY-040 rotary encoder
Usage
- In the case of Raspberry Pi 4, Update the firmware and bootloader to the latest version (not doing this may cause USB reliability issues)
- Download from GitHub Releases
- Unzip
- Put the files into the root directory of a FAT32 formatted partition on SD/microSD card
- Put SD/microSD card into Raspberry Pi 1, 2, 3 or 4, or 400 (Zero and Zero 2 can be used but need HDMI or a supported i2c DAC for audio out)
- Attach headphones to the headphone jack using
SoundDevice=pwm
inminidexed.ini
(default) (poor audio quality) - Alternatively, attach a PCM5102A or PCM5122 based DAC and select i2c sound output using
SoundDevice=i2s
inminidexed.ini
(best audio quality) - Alternatively, attach a HDMI display with sound and select HDMI sound output using
SoundDevice=hdmi
inminidexed.ini
(this may introduce slight latency) - Attach a MIDI keyboard via USB
- Boot
- Start playing
- See the Wiki for Menu operation
Pinout
All devices on Raspberry Pi GPIOs are optional.
CAUTION: All GPIO numbers are chip numbers, not header positions.
GPIO | Device | Function | Direction | Comment | |
---|---|---|---|---|---|
14 | UART | TXD | OUT | ||
15 | UART | RXD | IN | ||
18 | DAC | CLK | OUT | ||
19 | DAC | FS | OUT | ||
21 | DAC | DOUT | OUT | ||
02 | I2C | SDA | IN/OUT | ||
03 | I2C | SCL | OUT | ||
17 | LCD | EN | OUT | ||
27 | LCD | RS | OUT | ||
16 | LCD | RW | OUT | ||
22 | LCD | D4 | OUT | ||
23 | LCD | D5 | OUT | ||
24 | LCD | D6 | OUT | ||
25 | LCD | D7 | OUT | ||
05 | ROTARY ENCODER | CLK (ENC A) | IN | default setting | |
06 | ROTARY ENCODER | DT (ENC B) | IN | default setting | |
26 | ROTARY ENCODER | SW | IN | ||
12 | PWM AUDIO | PWM0 | OUT | ||
13 | PWM AUDIO | PWM1 | OUT | ||
07 | SPI | /CE1 | OUT | ||
08 | SPI | /CE0 | OUT | ||
09 | SPI | MISO | IN | ||
10 | SPI | MOSI | OUT | ||
11 | SPI | SCLK | OUT | ||
04 | NONE | ||||
20 | NONE |
Downloading
Compiled versions are available on GitHub Releases. Just download and put on a FAT32 formatted SD card.
Building locally
Normal users do not need to build the source code, as compiled versions are provided for download (see above). If you are a developer and want to build the source code yourself, you can use the following example, e.g., to build for Raspberry Pi 4 on a Ubuntu 20.04 build system. See build.yml
for complete build steps that create versions for Raspberry Pi 1, 2, 3,and 4 in 32-bit and 64-bit as required.
# Choose your RPi
export RPI=4
git clone https://github.com/probonopd/MiniDexed
cd MiniDexed
mkdir -p kernels sdcard
# Recursively pull git submodules
git submodule update --init --recursive
# Install toolchain
if [ "${RPI}" -gt 2 ]
then
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz
else
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi.tar.xz
fi
tar xvf gcc-arm-*-*.tar.xz
export PATH=$(readlink -f ./gcc-*/bin/):$PATH
# Build dependencies and MiniDexed
./build.sh
cp ./src/kernel*.img ./kernels/
# Get Raspberry Pi boot files
cd ./circle-stdlib/libs/circle/boot
make
if [ "${RPI}" -gt 2 ]
then
make armstub64
fi
cd -
# Make zip that contains Raspberry Pi 4 boot files. The contents can be copied to a FAT32 formatted partition on a microSD card
cd sdcard
../getsysex.sh
cd ..
cp -r ./circle-stdlib/libs/circle/boot/* sdcard
rm -rf sdcard/config*.txt sdcard/README sdcard/Makefile sdcard/armstub sdcard/COPYING.linux
cp ./src/config.txt ./src/minidexed.ini ./src/*img ./src/performance.ini sdcard/
echo "usbspeed=full" > sdcard/cmdline.txt
cd sdcard
cp ../kernels/* . || true
zip -r ../MiniDexed_$GITHUB_RUN_NUMBER_$(date +%Y-%m-%d).zip *
cd -
# Optionally, create a RPi image. This can be written to a microSD card using tools like Etcher or dd
sudo apt install --yes mount parted
IMG="`date +%Y-%m-%d`_minidexed-RPi${RPI}.img"
dd of="${IMG}" seek=50MiB bs=1 count=0
sudo parted "${IMG}" mktable msdos
sudo parted "${IMG}" mkpart primary fat32 2048s 100%
DEV=`sudo losetup --find --partscan --show "${IMG}"`
sudo mkfs.vfat -F 32 -n BOOT "${DEV}p1"
mkdir boot
sudo mount "${DEV}p1" boot
sudo cp -R sdcard/* boot
sudo umount boot
sudo losetup -d "${DEV}"
rm -r boot
# Write to SD card
sudo dd if="${IMG}" of=/dev/mmcblk0 bs=512k status=progress && sync
Discussions
https://github.com/probonopd/MiniDexed/discussions
Wiki
https://github.com/probonopd/MiniDexed/wiki
Acknowledgements
This project stands on the shoulders of giants. Special thanks to:
- raphlinus for the MSFA sound engine
- asb2m10 for the Dexed software
- dcoredump for https://codeberg.org/dcoredump/Synth_Dexed, a port of Dexed for embedded systems
- rsta2 for https://github.com/rsta2/circle, the library to run code on bare metal Raspberry Pi (without a Linux kernel or operating system) and for the bulk of the MiniDexed code
- smuehlst for https://github.com/smuehlst/circle-stdlib, a version with Standard C and C++ library support