probonopd
87513f4736
|
3 years ago | |
---|---|---|
.github/workflows | 3 years ago | |
CMSIS_5@18205c6c2b | 3 years ago | |
Synth_Dexed@31733bceea | 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
Dexed is a FM synthesizer closely modeled on the famous DX7 by a well-known Japanese manufacturer. MiniDexed is a port to run it on a bare metal Raspberry Pi (without a Linux kernel or operating system). This is a work in progress. Contributions are highly welcome.
TODO
Contributions are highly welcome.
- Get Synth_Dexed to build with circle-stdlib
- Upload SD card contents to GitHub Releases
- Get it to build for and boot on a Raspberry Pi 4
- Get it to react to USB MIDI
- Get it to react to MIDI via Raspberry Pi 4 GPIO
- Get it to produce some sound on the headphone jack
- Get it to produce some sound produced by Dexed
- Load a default (hardcoded) sysex
- Get it to build for and boot on a Raspberry Pi 3
- Get it to build for and boot on a Raspberry Pi 2
- Get it to build for and boot on a Raspberry Pi 1 and Raspberry Pi Zero
- Support multiple voices through Program Change and Bank Change LSB/MSB MIDI messages
- Add functionality for loading
.syx
files from SD card (e.g., usinggetsysex.sh
or from Dexed_cart_1.0.zip) - Show voice name on optional HD44780 display
- Support selecting patches using MIDI Bank Change and Program Change messages
- Get 8 Dexed instances to run simultaneously (like in a TX816) and mix their output together
- Add a way to configure multiple Dexed instances through Performance sysex messages
- Allow for each Dexed instance to be stereo shifted
- Add reverb effect
I am wondering whether we can run multiple Dexed instances, in order to recreate basically an open source equivalent of the TX802 (8 DX7 instances without the keyboard in one box).
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 (Zero and Zero 2 can probably 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) - Alternatively, attach a PCM5102A or PCM5122 based DAC and select i2c sound output using
SoundDevice=i2s
inminidexed.ini
- 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
- Stat playing
Pinout
All devices on Raspberry Pi GPIOs are optional.
CAUTION: All GPIO numbers are chip numbers, not header positions.
GPIO | Device | Function | Direction | Commant | |
---|---|---|---|---|---|
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 |
Building locally
E.g., to build for Raspberry Pi 4 on a Ubuntu 20.04 build system, you can use the following example. 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.
git clone https://github.com/probonopd/MiniDexed
cd MiniDexed
# Recursively pull git submodules
git submodule update --init --recursive
# Choose your RPi
export RPI=4
# Install toolchain
if [ "${RPI}" -gt 2 ]
then
wget -q 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 -q 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 xf gcc-arm-*-*.tar.xz
export PATH=$(readlink -f ./gcc-*/bin/):$PATH
# Build dependencies and MiniDexed
./build.sh
# 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
mkdir -p sdcard
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 sdcard/
zip -r MiniDexed_Raspberry_Pi_${RPI}.zip sdcard/*
# 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=128k status=progress
Acknowledgements
- asb2m10 for the Dexed sound engine
- 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 betal Raspberry Pi (without a Linux kernel or operating system) and for the initial MiniDexed code
- smuehlst for https://github.com/smuehlst/circle-stdlib, a version with Standard C and C++ library support