TeensyMIDIAudio PCB and MicroDexed/MicroMDAEPiano: Synths based on the Teensy

C0d3man

Well-known member
Hi all,

I started in May'18 to port Dexed to the Teensy+audio-board. I also created a modular PCB (see https://forum.pjrc.com/threads/5212...ement-with-Dexed-on-a-Teensy?highlight=Dexed)) for this and now the prototypes (Rev. 1.7) are ready.

With TeensyMIDIAudio-PCB (https://codeberg.org/dcoredump/TeensyMIDIAudio) and MicroDexed (a 6 operator FM synth, compatible with a famous FM synth from Japan: https://codeberg.org/dcoredump/MicroDexed) or MicroMDAEPiano (a nice Rhodes sounding sampler: https://codeberg.org/dcoredump/MicroMDAEpiano) and the really nice Teensy-Audio library you get a nice synth module which has support for MIDI (DIN or USB).

Of course you don't need the PCB if you decide to organize your MIDI input and operating elements by yourself. Give it a try and have fun - the complete project is OpenSoftware/OpenHardware!

Some pictures and a thread for this project is located at the Zynthian forum: https://discourse.zynthian.org/t/microdexed-dx7-to-go/1989/89. Currently there are two kits left (Rev. 1.7 based) if you want to build your own. If you are interested you can send me an email. I think I will make more PCBs/kits the next months.

Regards, Holger

P.S.: Pictures of several building steps are located here: https://codeberg.org/dcoredump/TeensyMIDIAudio-Pictures/src/branch/master/Rev-1.7
 
This is a really cool project. I was working my way toward a project like this and now will have to find something else to do! I never even thought of porting Dexed! I was gonna try to do it from scratch... Am I glad I found this! Some questions:

1. The board is kind of big with a bunch of room for additions. Is this the intention? Are these for different apps, expanding controls and interface kinda stuff? Am I correct in assuming this is the purpose of all the breakout options?

2. Would you mind if I made a "lite" version of a board for essentially just a MicroDexed and posted the designs for people maybe wanting a cheap/quick build? Is all that is essential for the firmware to run is a 3.6, Audio Shield, MIDI in and usb host bits?

3. Does it have the exact same MIDI implementation as a dx7? Perhaps this is off topic but I had a TX812 about 5 years ago (while it was conveniently forgotten by the whole entire world and dirt cheap // 8 dx7s for half the price of one) the interface was pretty much a d-pad, so I did some digging and found a midi controller that could be programmed through SysEx to change whatever parameters you wanted to that were pages deep in the menu. This opened up a new world with what sounds I could get out of that thing, I'm talking some really wild stuff here. Perhaps, if the software is already similar to the way the DX7 handled programming messages, perhaps this would be a cool easy thing to try to replicate instead of hacking the firmware to accept alternative control signals?

4.. I haven't gotten a chance to check out the code yet because I'm busy working on a sequencer (that I can wait to pair up with a little MicroDexed), but once I do I'd love to try to help out. I'm only a year into programming but, I think this would be a great project to contribute to if I can. Any recommendations on where to start?
 
Hi @ValStorm

This is a really cool project. I was working my way toward a project like this and now will have to find something else to do! I never even thought of porting Dexed! I was gonna try to do it from scratch... Am I glad I found this!

Thanks! More than a year ago I also thought about trying to recreate the DX7 natively. However, I already had some experience in converting the original dexed to a pure LV2 version for the MOD duo. And then I stumbled over the possibilities of the Teensy by chance. Really impressive what you can do with it!

Some questions:

1. The board is kind of big with a bunch of room for additions. Is this the intention? Are these for different apps, expanding controls and interface kinda stuff? Am I correct in assuming this is the purpose of all the breakout options?

I wanted to get the board in a suitable case and since I still had numerous old Rittal-CMC cases, I chose the dimensions so that it fits: https://codeberg.org/dcoredump/TeensyMIDIAudio-Pictures/src/branch/master/Rev-1.7/IMG_20180909_171146.jpg

I thought it would be good to route the free I/O pins for extensions on pin rows. Not everyone has such a suitable housing and should nevertheless have the possibility to connect their own control elements. Since the source code is freely available, you can write the extensions by yourself. Furthermore, the board should not be exclusively for Dexed. I also have the MDAEPiano running successfully on the board. You can also use it with the existing effects and an audio input as an effects device etc. Flexibility is important to me.

2. Would you mind if I made a "lite" version of a board for essentially just a MicroDexed and posted the designs for people maybe wanting a cheap/quick build? Is all that is essential for the firmware to run is a 3.6, Audio Shield, MIDI in and usb host bits?

Absolutely no problem! It's open source hardware and software!

It would be great if you could include your work in the project. If that's OK for you, we can talk directly via email (wirtz@parasitstudio.de). At the moment I am building a website with a forum, so that we can exchange ideas there directly.

But I have a question back: How do you want to select the parameters with such a small device (bank, voice, volume, ...)? And if it's ready, I need one ;-)!

Currently my synths look like this: https://codeberg.org/dcoredump/TeensyMIDIAudio-Pictures/src/branch/master/Rev-1.7/IMG_20181202_182815.jpg

3. Does it have the exact same MIDI implementation as a dx7? Perhaps this is off topic but I had a TX812 about 5 years ago (while it was conveniently forgotten by the whole entire world and dirt cheap // 8 dx7s for half the price of one) the interface was pretty much a d-pad, so I did some digging and found a midi controller that could be programmed through SysEx to change whatever parameters you wanted to that were pages deep in the menu. This opened up a new world with what sounds I could get out of that thing, I'm talking some really wild stuff here. Perhaps, if the software is already similar to the way the DX7 handled programming messages, perhaps this would be a cool easy thing to try to replicate instead of hacking the firmware to accept alternative control signals?

Actually I tried to take over the complete MIDI command set from the DX7 - also SYSEX parameter changes. The whole thing is in the program code, but unfortunately not tested. And I have to admit that I didn't achieve anything with a careful test from Linux.

I also tried to change parameters with the CTRLR software - it didn't work either. Without a functional soft-/hardware I don't know how to debug...

4.. I haven't gotten a chance to check out the code yet because I'm busy working on a sequencer (that I can wait to pair up with a little MicroDexed), but once I do I'd love to try to help out. I'm only a year into programming but, I think this would be a great project to contribute to if I can. Any recommendations on where to start?

I also wanted to build a step sequencer once... maybe in my next life :) I have at least copied the BEAT707 and it works quite well. Only it doesn't have a housing yet.

MicroDexed is quite a bunch of software, whereby I took a lot directly from the Dexed or msfa and hardly had to touch anything. The main part of the MicroDexed is located inside MicroDexed.ino.

You definitely need some experience in C/C++ programming. And it is very helpful to understand how sound generators work in audio software (sample rate, block size, latency, memory management, ...). I did this as "learning-by-doing". If you can do C/C++, then start with the loop() function. It's relatively short and that's where the really important things happen: Allocate audio block, call engine and calculate data, move MIDI data into a queue for the engine. Around it has a few debugging things (measuring times to see if you're producing underruns, ...).

The best thing is to take a look and ask me by email. Maybe MicroMDAEPiano is easier to get started with, because the whole UI is still missing and the engine is "smaller". There is no direct calculation, but the basis is sample data from the program memory.

Regards, Holger
 
Hi

I figured it try this out (it does make sound!), but I'm having trouble with using/loading sysex files. It does seem to find the files but I keep getting a "Bulk checksum mismatch" error (see "debug" output below). The sysex files come from here: https://asb2m10.github.io/dexed/ ... any pointers?

thanks

10:34:27.839 -> SD card found.
10:34:27.839 -> Found bank [DX1A1.SYX]
10:34:27.839 -> Created sysex_filename from bank 0 and name DX1A1.SYX: [/0/DX1A1.SYX]
10:34:27.839 -> Reading voice names for bank [/0/DX1A1.SYX]
10:34:27.839 -> Bulk checksum : 0x10 [0xFFFFFF90]
10:34:27.839 -> E : Bulk checksum mismatch : 0x10 != 0xFFFFFF90
10:34:27.872 -> Bank [DX1A1.SYX/DX1A1]
10:34:27.872 -> 0[HORN SEC.A]
10:34:27.872 -> 1[TRUMPET A]
10:34:27.872 -> 2[SYN BRS 1A]
10:34:27.872 -> 3[TIGHT BR.A]
10:34:27.872 -> 4[SYN BRS 2A]
10:34:27.872 -> 5[SYN BRS 3A]
10:34:27.872 -> 6[CS80 BRS A]
10:34:27.872 -> 7[BRIGHT ST.]
10:34:27.872 -> 8[CELLOS 1A]
10:34:27.872 -> 9[VIOLINS A]
10:34:27.872 -> 10[ST.ENS. 1A]
10:34:27.872 -> 11[MID.STRG A]
10:34:27.872 -> 12[AN.STRG 1A]
10:34:27.872 -> 13[CELLOS 2A]
10:34:27.872 -> 14[ST.ENS. 2A]
10:34:27.872 -> 15[STRINGS A]
10:34:27.872 -> 16[PIANO 1A]
10:34:27.872 -> 17[PIANO 2A]
10:34:27.872 -> 18[ELEC GRD A]
10:34:27.872 -> 19[E.PIANO 1A]
10:34:27.872 -> 20[E.PIANO 2A]
10:34:27.872 -> 21[E.PIANO 3A]
10:34:27.872 -> 22[CLAV. A]
10:34:27.872 -> 23[HARPSI. 1A]
10:34:27.872 -> 24[PIPES A]
10:34:27.872 -> 25[E.ORGAN 1A]
10:34:27.872 -> 26[E.ORGAN 2A]
10:34:27.872 -> 27[E.PIANO 4A]
10:34:27.872 -> 28[ELEC.BASS ]
10:34:27.872 -> 29[DBL.HARP A]
10:34:27.872 -> 30[A.MALLET A]
10:34:27.872 -> 31[VIBES A]
10:34:27.872 -> Created sysex_filename from bank 0 and name DX1A1.SYX: [/0/DX1A1.SYX]
10:34:27.872 -> Bulk checksum : 0x10 [0xFFFFFF90]
10:34:27.872 -> E : Bulk checksum mismatch : 0x10 != 0xFFFFFF90
10:34:27.872 -> E : Cannot load voice data
10:34:27.872 -> E : File not found.
10:34:27.872 -> Bank/Voice from EEPROM [255/255]
 
Hi,

Hi

I figured it try this out (it does make sound!), but I'm having trouble with using/loading sysex files. It does seem to find the files but I keep getting a "Bulk checksum mismatch" error (see "debug" output below). The sysex files come from here: https://asb2m10.github.io/dexed/ ... any pointers?

thanks

wow - cool! You are the first one who tried without a kit!

Have you used the latest commit of MicroDexed?
Have you tried to use the files from the repository (https://codeberg.org/dcoredump/MicroDexed/src/branch/master/addon/SD)?

Regards, Holger
 
Have you tried to use the files from the repository

Ah, no, missed those. I'd used the ones from the Dexed site. Thank you!, that did the trick.

I'm pleasantly surprised by the sounds, more to my liking than PreenFM2 ... out of curiosity, was there any technical reason why this is built around the "AudioPlayQueue"-Object rather than turning it into an Audio-Library-compatible object itself?
 
Ah, no, missed those. I'd used the ones from the Dexed site. Thank you!, that did the trick.

MicroDexed loads standard DX7-SYSEX - currently only soundbanks of 32 voices. I don't know if the original Dexed has another format for SYSEX, but it seems like it has...

I'm pleasantly surprised by the sounds, more to my liking than PreenFM2 ... out of curiosity, was there any technical reason why this is built around the "AudioPlayQueue"-Object rather than turning it into an Audio-Library-compatible object itself?

Nice! I noticed some high frequency audio resposnes for some sounds. In the branch "revise" I added a low-pass filter to avoid this.

Why I am unsing "AudioPlayQueue"? Because I don't know better :)
I think the Dexed engine is a little bit too complicated to put it into a single audio object. Does that make any sense at all? Would you achieve better latency or need less CPU time?

Regards, Holger
 
fwiw, i've also given this a spin on some prototype module i had lying around https://www.instagram.com/p/BujANL0ot-o/ ... butchered up the code a bit to make it work with CV/gate. it's great fun; too bad coming up with a decent UI and so on would be a bit of an undertaking ...

Nice!

I'm no UI expert but, I've got nothing better to do... Anyone have any advice on keeping it portable and not specific to whatever hardware I'm using? Or is the whole point of UI to be hardware specific?
 
But I have a question back: How do you want to select the parameters with such a small device (bank, voice, volume, ...)? And if it's ready, I need one ;-)!

Good question... My initial thoughts, and what I had done previously with a midi controller, is get 4 controls for ADSR and page buttons that could jump through all the operators and peg controls. This was really helpful for speeding up programming. The drag with the way my controller worked is that if I wanted to copy an envelope over to a new operator I had to lightly tap the sliders to register their value.

I had immediate access to algorithm which is sometimes handy, sometimes not that interesting.

Presets are great starting points, and because the overwhelming amount of parameters, usually as far as anyone gets with these style of synths. I personally don't use them that way unless I'm creating rhythms by rotating through a few different patches. I think it would be fun to get an interface to the point where you don't care about saving patches anymore, that getting one up and running is simple. The amount of DX7 sysex libraries is obscenely large and only a fraction of them really start to break into the magic of that instrument.

I'm thinking about really expanding the internal LFO capabilities and having those more 'upfront'.

It would be great if the interface could know which operators were modulators, and looking at the way those are implemented I think that is totally possible. Changing the ratio of a carrier doesn't seem too important when you can just play higher/multiple pitches. One control to switch between modulating operators and one to change their ratio would be a fast way to get results maybe...

I'm almost done with this sequencer/controller and ready to jump in. Definitiely brain storming... Anyone have any other insights or things not to be overlooked?
 
...
It would be great if the interface could know which operators were modulators, and looking at the way those are implemented I think that is totally possible. Changing the ratio of a carrier doesn't seem too important when you can just play higher/multiple pitches. One control to switch between modulating operators and one to change their ratio would be a fast way to get results maybe...

I'm almost done with this sequencer/controller and ready to jump in. Definitiely brain storming... Anyone have any other insights or things not to be overlooked?

My current UI implementation is based on an I2C Display and two rotaries (see https://codeberg.org/dcoredump/TeensyMIDIAudio-Pictures/src/branch/master/Rev-1.7). This is only for selecting some parameters (volume, effects, bank, voice) and not for programming. It is not perfect and I have plans to reorganize it, because I want it also use for the MicroMDAEpiano.

MIDI bank and voice selection is implemented (but untested) AND changing parameters via SYSEX is also implemented (and untested). So you should have FULL access to edit everything. I have bought a Nextion display (a big one) for building a remote editor as a seperate project - currently not started.

Regards, Holger
 
Hello,

I just finished a beta version of the MicroMDAEPiano. It's not all perfect yet, but at least I'm on my way to a usable EPiano based on the MDA-EPiano.

What's new?
- Complete menu based on LiquidMenu for a 16*2 LCD and two encoders
- Save and recall the saved settings in 99 memory locations
- Using the Compressor/Bass-Boost/EQs of the SGTL5000 (sorry, support for other audio cards has been left behind for now)
- Using the Freeverb of the Teensy Audio Lib
- Parameters of the MDA-EPiano adjustable in the menu
- MIDI-SoftThru: incoming MIDI signals are forwarded to other MIDI interfaces.
- Maximum number of voices: 48

Comments:
- Currently most features are only available for the SGTL5000 audio card.
- The menu is already prepared for a modulated chorus effect, but this is not yet implemented.
- Unfortunately the sound is interrupted when changing menus or turning the encoders... to avoid this, i currently only have the idea to use a second uC for controlling the display - maybe later on
- The volume ratios are not yet optimized. Distortions sometimes occur.
- The SGTL5000 compressor isn't really easy to use - I'll have to try it a little until I understand how it works.
- There is no documentation how to build and what libraries are needed available
- A suitable video is missing - hopefully I will make it in the next weeks...

The source code is available at https://codeberg.org/dcoredump/MicroMDAEPiano . There is also a HEX file for the Teensy-3.6 stored, who doesn't want to take the trouble to install all necessary libraries.

A sound demo (in combination with MicroDexed can be listened to at https://www.parasitstudio.de/).

Regards, Holger
 
Back
Top