Dexed FM synthesizer similar to DX7 running on a bare metal Raspberry Pi

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). Currently it is not functional yet. 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 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
  • Get 8 Dexed instances to run simultaneously (like in a TX816) and mix their output together
  • Add functionality for loading .syx files (e.g., from Dexed_cart_1.0.zip)
  • Add a way to configure each Dexed instance
  • Allow for each Dexed instance to be stereo shifted
  • Add reverb effect

I am wondering whether Dexed could be ported to Circle, in order to recreate basically an open source equivalent of the TX802 (8 DX7 instances without the keyboard in one box).

Usage

  • Download from GitHub Releases
  • Unzip
  • Put the files into the root directory of a FAT32 formatted partition on microSD card
  • Boot in Raspberry Pi 4

Building locally

E.g., on Ubuntu 20.04:

git clone https://github.com/probonopd/MiniDexed
cd MiniDexed

# Recursively pull git submodules
git submodule update --init --recursive

# Install toolchain
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
tar xf gcc-arm-*-*.tar.xz 
export PATH=$(readlink -f ./gcc-*/bin/):$PATH

# Build circle-stdlib library
cd circle-stdlib/
./configure -r 4 --prefix "aarch64-none-elf-"
make -j$(nproc)
cd ..

# Build MiniDexed
export PATH=$(readlink -f ./gcc-*/bin/):$PATH
cd src
make -j$(nproc)
ls *.img
cd ..

# Get Raspberry Pi boot files
cd ./circle-stdlib/libs/circle/boot
make
make armstub64
cd -

# Make zip that contains Raspberry Pi 4 boot files
mkdir -p sdcard
cp -r ./circle-stdlib/libs/circle/boot/* sdcard
mv sdcard/config64.txt sdcard/config.txt
rm -rf sdcard/config32.txt sdcard/README sdcard/Makefile sdcard/armstub sdcard/COPYING.linux
cp ./src/*img sdcard/
zip -r MiniDexed_Raspberry_Pi_4.zip sdcard/*

Acknowledgements

Comments
  • Configurable GPIO buttons

    Configurable GPIO buttons

    Thanks @diyelectromusic and @stevelittlefish

    (This is a continuation of #271 and includes that PR, so only one of the two should be merged eventually.)

  • Support for Portamento and Pitch Bender parameters

    Support for Portamento and Pitch Bender parameters

    Hi everybody, I bring you my proposal to include control over the Portamento and Pitch bender parameters. This enhancement is necessary in order to play more expressive solos. Musicians will be grateful.

  • Change default pinout

    Change default pinout

    EDIT: The pinout in this post is outdated. See newer posts below for the recent one.

    Continuation from here:

    For maximum device compatibliity (including Raspberry Pi 1), we want to have a pinout that needs none of the extra pins introduced with the Raspberry Pi 2.

    Since more and more people are building their hardware now, I'd like to propose the new default pinout rather sooner than later.

    image

    Should we ever use i2c for the display (easier cabling with fewer wires, potentiometer onboard but ~3 EUR more expensive), then we could even have room for SPI:

    image

    What do you think? Feedback appreciated.

    Notes:

    • 2.2k resistor betweeen LCD pin 1 (VSS) and LCD pin 3 (V0) (10k potentiometer would be better)
    • Backlight enabled like this (note the balck and red short wires on the upper left of the green LCD board. K bridged to right side of C2, topmost right side pin of unpopulated chip footprint U3 bridged to the right side of the resistor. CAUTION: Don't blindly do this, measure with a multimeter and understand what you do first! No guarantees.)

    minidexed-2

    MiniDexed_Pinout.zip

  • Raspberry Pi 1 nonfunctional

    Raspberry Pi 1 nonfunctional

    Raspberry Pi 1 seems to be nonfunctional since at least 2022-04-05: The last message is minidexed: Serial MIDI interface enabled, thereafter it seems frozen.

    On 2022-02-28 it was definitely working: https://github.com/probonopd/MiniDexed/issues/12#issuecomment-1054505774

    Raspberry Pi Zero continues to work, also in the latest builds. What gives?

  • Switchable performance files improvements + Poly/Mono  + Fix to #298 and #83 issues

    Switchable performance files improvements + Poly/Mono + Fix to #298 and #83 issues

    Hi @probonopd , in order to complement the swichable Performance solution, I have added these additional features to improve the usability of the solution: -Custom defined new performance name: predefined Performance name can be modified. Characters are input by the rotary encoder, to move the cursor, hold down the encoder and turn right or left. Then just double click to confirm. -Delete Performance files: This allows to delete perfomance files from the list. To do that, just double click on the already loaded performance and confirm yes or no. The default performance.ini file in the root directory can't be deleted. -Change voice name: Edited voice can have a custom name (and will be saved on performance file). -Some minor improvements on related Methods.

  • Support for Yamaha DX7 SysEx commands

    Support for Yamaha DX7 SysEx commands

    Use this in combination with the latest Synth_Dexed (added a method called checkSystemExclusive()) which checks parameters, checksums, ... and returns a value for further actions).

    This works for MicroDexed but I have no hardware for checking with MiniDexed.

    SysEx master volume is currently not supported.

  • Freezing a few seconds after boot

    Freezing a few seconds after boot

    I'm using an RPi 3 (FAT32) with a USB MIDI controller, but it seems to freeze after about 5-10 seconds whether the controller is plugged in or not. It sounds great right up until then, though :)

    Is there any way to do diagnostics/logging?

    As an aside, I'm really happy to see someone working on this. I've been checking around for exactly this (headless dexed on RPi) every few months and was going to put in a feature request with dopefish to see if he would consider adding it to mt32-pi when i saw there was already a ticket for it. Then, I saw your comment about this project in the ticket comments! Exciting stuff.

  • Some voices are not played

    Some voices are not played

    https://yamahablackboxes.com/patches/dx7/factory/rom3a.syx

    • 17=SAX BC
    • 24=VOICES BC

    https://yamahablackboxes.com/patches/dx7/factory/rom4a.syx

    • 10=BRASS BC

    https://yamahablackboxes.com/patches/dx7/vrc/vrc106a.syx

    • 17=SYN.BRA. 4

    https://yamahablackboxes.com/patches/dx7/vrc/vrc106b.syx

    • 25=SYN.GUITAR

    https://yamahablackboxes.com/patches/dx7/vrc/vrc108a.syx

    • 15=Good-Vibes

    https://yamahablackboxes.com/patches/dx7/vrc/vrc108b.syx

    • 20=BCTrumpet

    TODO: Test with other software instruments

  • Support selecting patches using MIDI Bank Change and Program Change messages

    Support selecting patches using MIDI Bank Change and Program Change messages

    Many USB keyboards can send Bank LSB and Bank MSB Changes, and Program Changes. If we put several .syx files on the microSD card, then we might use Bank LSB and Bank MSB Changes to select those .syx files, and Program Changes to select patches.

    (Once #8 is implemented I can say which MIDI messages we need to react to.)

  • Multi-core support

    Multi-core support

    This PR modifies the following:

    • Update submodule circle-stdlib to v15.12
      • System options can be defined cleaner using the "-o" option
      • Include KY-040 driver from Circle (removed from MiniDexed)
    • Render sound on secondary CPU core 1
      • Enable multi-core support on Raspberry Pi 2-4
      • Does still work on the Raspberry Pi 1 with restrictions
      • Use CSoundBaseDevice::Write() instead overriding GetChunk()
      • CMiniDexed is not derived from the sound device classes any more
      • Add option SCREEN_DMA_BURST_LENGTH=1 to relieve bus congestion
    • Add volume control to MIDI CC and UI

    There is a new menu item in the UI, which controls the volume level.

    The MIDI message dump and profiling should be disabled on the Raspberry Pi 1, otherwise one hears audio drops, when the screen scrolls.

    Tested on RPi 1A+ (PWM, HDMI), 2B (PWM, I2S, HDMI) and 4B (PWM, I2S, HDMI). The UI has been tested with a RPi 1A+ only (because my hardware is connected there).

  • I2C display support

    I2C display support

    Hi, just wondering, what's the current plan on this? I'm willing to further reduce the size of MiniDexed and just limited with parallel LCD options... In particular, OLED 128x32 would be the best.

  • Automatic bank jumping from voice menu

    Automatic bank jumping from voice menu

    Hi everybody, this PR allows to jump to the next or previous Bank from Voice menu when move beyond the last (32) or the first (1) voice in a continues way. This avoid to go back and forth between Voice and Bank menus when exploring different patches.

    This solve #338 posted by @diyelectromusic

  • Might be nice if scrolling through voices automatically moves to next bank

    Might be nice if scrolling through voices automatically moves to next bank

    When scrolling through voices on one voice bank, then it might be useful to be able to configure the system so that the next voice bank is automatically selected when then end of one bank is reached, with wrap-around for the last bank back to the first one. If you see what I mean...

  • Overlapping pin configurations can generate weird error messages

    Overlapping pin configurations can generate weird error messages

    We probably need some configuration sanity checking on the range of possibilities for GPIO button configurations now. In particular, if the rotary encoder is configured with duplicate GPIO pins by mistake, there is an assert failure that isn't very easy to track down. It might be quite handy to eliminate (or at least warn about) other potential clashes with "fixed pins" - e.g. with I2C, the LCD, I2S, MIDI (depending on the other settings of course).

    I suspect we ought to do some checking on the buttons in general or maybe at least echo the current "in use" configuration to the display to aid debugging configuration issues?

    Aside: I was also wondering if it was possible to have two hardware buttons configured for the same job? I was initially thinking of a board that allows either the rotary encoder switch for select, but also a separate hardware button for select too, but having dropped the RE switch configuration, this is no longer possible.

    I know this is now somewhat contradictory to my above comment about checking for duplicates! :)

    Kevin

  • Use buttons on MIDI controllers instead of RPi GPIO buttons

    Use buttons on MIDI controllers instead of RPi GPIO buttons

    It would be nice if we could use buttons on MIDI controllers instead of GPIO buttons on the Raspberry Pi. This way, one would not have to deal with connecting physical buttons to Raspberry Pi pins but could use the buttons built into many MIDI controllers.

    E.g., these guys:

    image

    (Example shows the Nektar Impact LX61+.)

    The buttons toggle between 0 and 127: B0 xx 7F (key down), B0 xx 00 (key up) with xx being different for each button.

    Maybe we could have in minidexed.ini something like this:

    MidiButtonPrev=0xB001
    MidiButtonNext=0xB002
    MidiButtonBack=0xB003
    MidiButtonSelect=0xB004
    MidiButtonHome=0xB005
    MidiButtonShortcut=0xB006
    

    Value 0x7F means "button down", value 0x00 means "button up".

    @diyelectromusic and @stevelittlefish do you think this could be wired into the existing logic for interpreting clicks, double-clicks, and long-presses?

  • Unison mode

    Unison mode

    Looks like, e.g., the Korg opsix has a Unison mode, where you set up one voice, and then just enable Unison with three parameters:

    • How many voices to use (2...8),

    • Spread (how much Stereo Pan to use),

    • Detune (how large the overall range for is for Detune across all voices).

    • See the Unison, Detune, Spread sections in the Korg opsix manual.

    WIth more powerful Raspberry Pis, maybe we can have more than just 8 voices in total? 8 TGs wich can have Unison would theoretically give us up to 64...

  • "Send to all" button?

    While I love having all of the duplicate instances for the rich, fat tone, it makes it a hassle to change things like voices on the fly, and it would be nice to be able to send a setting to all of the instances at once. I figured it could work as one of the assignable functions for the pins/buttons as mentioned in the button section of the wiki.

    However, I understand that the "shortcut" function (rotary press-and-turn) is intended to fulfill much the same functionality, so it won't hurt my feelings if you guys don't consider this worth the additional effort. :)

    Unrelated, is the STL file for this case available somewhere? I didn't see it linked anywhere on the wiki.

Because why not? Pi Zero bare metal project that ends in an RTOS implementation

PiZeroRTOS Because why not? This repo starts out as a Pi Zero bare metal project and it could very well end up as a viable RTOS implementation with a

Feb 13, 2022
A bare metal SDK for the ESP32 & ESP32C3
A bare metal SDK for the ESP32 & ESP32C3

MDK (Minimal Development Kit) - a baremetal ESP32/ESP32C3 SDK An bare metal, make-based SDK for the ESP32, ESP32C3 chips. It is written from scratch u

Sep 23, 2022
Microshell - a lightweight pure C implementation of shell emulator dedicated for embedded bare-metal systems.
Microshell - a lightweight pure C implementation of shell emulator dedicated for embedded bare-metal systems.

MicroShell Lightweight pure C implementation of virtual shell, compatible with VT100 terminal. Support root tree, run-time mounting paths, global comm

Sep 26, 2022
Running Docker container on Raspberry Pi (armhf)

Running Docker container on Raspberry Pi (armhf)

Nov 15, 2021
Prueba del Raspberry PI PICO con un display Raspberry PI TFT 3.5"

Raspberry-PI-PICO-display-RPI35 Prueba del Raspberry PI PICO con un display Raspberry PI TFT 3.5" Con ayuda de la libreria https://github.com/khoih-pr

Nov 10, 2021
Wasserstein Inverted Frequency Modulation Synthesizer

Wasserstein Inverted Frequency Modulation Synthesizer 発表資料: https://speakerdeck.com/fadis/wassersteinni-fmyin-yuan 発表動画: https://youtu.be/VF9VX01QYs0

May 25, 2022
A simple wrapper for 'pacman' with a syntax similar to 'apt' to help people transitioning to Arch and Arch based distributions like Manjaro.

aptpac aptpac is a program which helps with the transition to Arch Linux and Arch based distros like Manjaro. It simplifies using pacman as it works l

Sep 26, 2022
Process Ghosting - a PE injection technique, similar to Process Doppelgänging, but using a delete-pending file instead of a transacted file
Process Ghosting - a PE injection technique, similar to Process Doppelgänging, but using a delete-pending file instead of a transacted file

Process Ghosting This is my implementation of the technique presented by Gabriel Landau: https://www.elastic.co/blog/process-ghosting-a-new-executable

Sep 27, 2022
sap is a document typesetting/preparation system similar in concept to LaTeX

sap is a document typesetting/preparation system similar in concept to LaTeX

Mar 29, 2022
Lo-Fi SAMD21 based mini chip tune synthesizer - Seeed Studio - Seeeduino XIAO arduino project
Lo-Fi SAMD21 based mini chip tune synthesizer - Seeed Studio - Seeeduino XIAO arduino project

samd21_mini_synth Lo-Fi SAMD21 based mini chip tune synthesizer Seeed Studio - Seeeduino XIAO arduino project link to the video Description This time

Sep 23, 2022
My_Shell is a user-defined interactive shell written in C that works similar to the original shell in linux

MY_SHELL Overview My_Shell is a user-defined interactive shell written in C that works similar to the original shell and it can execeute many of the l

Nov 22, 2021
4 channel servo controller code for Arduino Mega 2560 for AASD-15A and similar motor driver

eh-msc-4dof 4 channel servo controller code for Arduino Mega 2560 for AASD-15A and similar motor driver Arduino sketch for generating pulses needed to

Sep 9, 2022
A CPU implemented in an analog modular synthesizer
 A CPU implemented in an analog modular synthesizer

A CPU implemented in an analog modular synthesizer This runs in the VCV Rack eurorack simulator. I wrote a thread explaining the CPU on twitter and a

Sep 22, 2022
synthv1 - an old-school polyphonic synthesizer

synthv1 - an old-school polyphonic synthesizer

May 7, 2022
A lightweight additive chiptune synthesizer (LV2 and Unity Plugin)

OvenMit Synthesizer kenakofer's first ever synthesizer! Coming initially out of BMusic's excellent tutoral series for lv2 synthesizers, the developer

Apr 18, 2022
Jeannie 8-voice polyphonic open source synthesizer
Jeannie 8-voice polyphonic open source synthesizer

Jeannie 8-voice polyphonic open source synthesizer Jeannie is an 8-voice polyphonic open source synthesizer kit with digital sound synthesis and digit

Sep 19, 2022
Open-source Qt Quick & c++ wavetable synthesizer
Open-source Qt Quick & c++ wavetable synthesizer

?? OOSC! OOSC is a two-oscillator wavetable driving synthesizer written with Qt, QML and C++. Have some included effects like a Reverb, Flanger, EQ et

Sep 2, 2022
A python library to run metal compute kernels on MacOS

metalcompute for Python A python library to run metal compute kernels on MacOS Usage Example execution from M1-based Mac running MacOS 12.0: > ./build

Sep 18, 2022
Metal lathe electronic lead screw project built on top of Russian-speaking DigitalFeed ELS system by Oleg A. and contributors from ChipMaker.ru
Metal lathe electronic lead screw project built on top of Russian-speaking DigitalFeed ELS system by Oleg A. and contributors from ChipMaker.ru

This software and instructions are provided as is, without warranty of any kind. This is a hobby project. Using this might damage your equipment, caus

Aug 29, 2022