You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
probonopd 646c17a12b
Update README.md
3 years ago
.github/workflows Use a default performance.ini 3 years ago
CMSIS_5@18205c6c2b Only small changes for README.md, so images for RPi2/RPi3 can now created alsoOnly small fixes. (#44) 3 years ago
Synth_Dexed@70293ae599 Added code for enabling compressor (compressor code is in Synth_Dexed) / Fixes for README.md / Added stereo plate reverb (#59) 3 years ago
circle-stdlib@61cf3a47bf Multi-core support (#47) 3 years ago
src Support hierarchic menus (#61) 3 years ago
.gitignore Ignoring *.img in git commit. 3 years ago
.gitmodules Only small changes for README.md, so images for RPi2/RPi3 can now created alsoOnly small fixes. (#44) 3 years ago
README.md Update README.md 3 years ago
build.sh Added code for enabling compressor (compressor code is in Synth_Dexed) / Fixes for README.md / Added stereo plate reverb (#59) 3 years ago
getsysex.sh Use MIDI messages 0-127 3 years ago

README.md

MiniDexed

image

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., using getsysex.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
  • Allow for each Dexed instance to be detuned and stereo shifted
  • Add a way to configure multiple Dexed instances through performance.ini files
  • Add a way to configure multiple Dexed instances through Performance .syx files
  • Add a way to configure multiple Dexed instances through Performance sysex messages
  • Add compressor effect
  • Add reverb effect
  • Make it possible to assign voice parameters to sliders and knobs on MIDI controllers

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 in minidexed.ini (default) (poor audio quality)
  • Alternatively, attach a PCM5102A or PCM5122 based DAC and select i2c sound output using SoundDevice=i2s in minidexed.ini (best audio quality)
  • Alternatively, attach a HDMI display with sound and select HDMI sound output using SoundDevice=hdmi in minidexed.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 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.

# 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

Acknowledgements