MiniDexed TX816

As soon as I started playing with MiniDexed and found out it supported 8 tone generators, I wondered if it would be possible to build an interface to it to make it look like a Yamaha TX816 tone module.

This is the first in a series of posts looking at what a TX816 is and why I wanted to do it.  Ok, forget the “why” bit, its really how I eventually did it. I’m still working on the “why” 🙂

Note that I’m not really writing this one up as a guide in quite the same way as many of my other posts.  I seriously doubt anyone would follow in these footsteps, so it is more just “notes to self” and for general curiosity.

Posts in this series:

  • Part 1: Introduction, context, and high-level design.
  • Part 2: PCB design.
  • Part 3: Panel design.
  • Part 4: PCB assembly.
  • Part 5: Mechanical assembly.
  • Part 6: Pico MIDI Router and TX816 IO Code.
  • Part 7: In use!

Warning! I strongly recommend using old or second hand equipment for your experiments.  I am not responsible for any damage to expensive instruments!

If you are new to microcontrollers and single board computers, see the Getting Started pages.

What is the TX816?

TX816-TWROB

The simple version, is that it is a 19″ rack-mounted set of eight 6-operator, 32-algorithm, 16-note polyphonic FM sound engines (“TF1” units – basically a Yamaha DX7 in a box) from the mid-1980s.  At the time I believe they cost around $5000.  There was also a 2-TF1 version (TX216) that supported just two of the tone generators.  It looks like you could probably pick up a second hand TX816 for around $800-1200 these days.

I believe I first came across them on Tomorrow’s World At Large’s “Roll Over Beethoven” from 1987 that looked at the state of the art of electronic music production at the time and the rising use of computers for music – it was introduced as the “digital sequencer” in Howard Stableford’s band at the start of the programme.  During those few years the TX816 was a common fixture of bands and studios around the country.

For more details, take a look at:

And for more DX7 information, I can recommend the following:

Digging around online it is possible to get hold of scanned copies of the following manuals for the TX816:

  • TX216-TX816 Owners manual – this is the main “user manual”.
  • TX216-TX816 Operations directory – this is a reference for all the operations possible with the device.
  • TX816 Performance notes –  I believe this is a detailed reference for the “out of the box” voices and all the voice and performance data.
  • TX216-TX816 Service manual – detailed hardware details of the TF1 modules and the 19″ “MIDI rack frame” that supports them.

Controlling MiniDexed

MiniDexed gives the ability to emulate 8 DX7s on a Raspberry Pi 3 or 4. It can also be used on a Pi 1 or 2 but with less functionality (and only a single tone generator on a Pi 1).  After my initial experiments, I’ve spent a bit of time developing some add-on PCBs to use with it and started getting more involved in adding features to the project itself.

Some ideas for getting a TX816 out of it include:

  • Using 8 Raspberry Pi Zeros, running a single tone generator each.
  • Adding some kind of additional IO front panel to a Raspberry Pi 3 or 4 running the full MiniDexed.
  • Creating a MIDI front panel using a microcontroller to emulate the interface of the TX816 and send commands over MIDI to a Pi 3 or 4 running full MiniDexed.

Whilst I really like the idea of effectively building a TF1 from a Pi Zero (I’d love to be able to “plug them in” like the original TF1s), that is both a lot of work, somewhat redundant given a Pi 3 or 4 can do the job.  And given the difficulties of getting a Pi Zero at the moment, not particularly feasible.

I did wonder about creating a fork of the MiniDexed code to support a TX816 multi-module interface itself using spare GPIO and then building an IO front panel.  But if I can get away without requiring a custom version of MiniDexed then that would be advantageous to me.

So that leaves some kind of independent front panel using a microcontroller and controlling the main MiniDexed instance over MIDI.  That is the approach taken in this project.  I’m building an IO panel around a Raspberry Pi Pico that will communicate over MIDI via a direct UART connection, to a Raspberry Pi.

Required Functionality

Having settled on a (what appears to be) feasible approach, what exactly should it do?  My core goals here are as follows:

  • Maintain the “look and feel” of the TX816, but I’m not bothered about reproducing every facet of the interface.
  • Implement a few front-panel functions that make sense, but not re-implement the menu structure and programmability of the original.
  • Maintain the MiniDexed rotary encoder and OLED display for most tone generator editing.
  • Support the TX816 idea of “common or individual” tone generators when being played over MIDI.
  • Not worry about independent audio outputs – the single audio output from the MiniDexed is fine.

The manual may well boast that “through the use of state-of-the-art microcomputer circuitry , the wide range of functions can be controlled by just three buttons mounted on the front panel of each module”, but I suspect the reality of three buttons and a single two-digit 7-segment display means an awful lot of up/down navigating of menu hierarchy to get anything done!  So I’m completely ignoring the actual built-in editing functionality an instead will just accept whatever is available in MiniDexed and exposed via MIDI.

To get to grips with the actual TX816 user interface, it is worth taking a look at the panels and block diagram from the service manual.

TX816-FrontPanelTX816-ReadPanelTX816-BlockDiagram

The features that I’m not bothered about (or aren’t really relevant to a MiniDexed) are:

  • Front panel: Memory protect; Error LED; MIDI OUT display/selecting.
  • Rear panel: Individual audio; individual MIDI.
  • Front panel switch “long presses”.

What I’d like to maintain:

  • A means to select the voice for each tone generator and show the patch number on the display.
  • The “common”/”individual” option to select if the tone generators are being used independently or as a single instrument.
  • Front panel MIDI and power, adding in the audio output and the MiniDexed controls.

Consequently the only functionality I actually plan to implement on the front panel of each tone generator will be:

  • A switch to select between common or individual mode.
  • The two LEDs to indicate the mode.
  • A two-digit, 7-segment display to show the current voice number.
  • I’d like some kind of rotary control to select the voice for that tone generator (the original used up/down buttons).

I plan to retain the following from MiniDexed in addition to the tone generators, giving access to the full menu structure within MiniDexed:

  • OLED display.
  • Rotary encoder.
  • MIDI IN and OUT.
  • Audio OUT.
  • Power switch and LED.

I’m going to be implementing the common/individual selecting and all MIDI routing using the Raspberry Pi Pico.  None of it will actually be done in hardware – just the buttons, controls, and displays handled by the microcontroller and the appropriate routing and actions performed in software.

In terms of rotary control for the voice selection, the ideal would be the use of a rotary encoder, but I thought the complications of managing 8 encoders would start to become significant.  So I’ve opted for 8 potentiometers instead.  This means that the absolute position of each potentiometer will be significant – half way round, should always select the same voice, and so on.

I’ll have to experiment with sensitivity too.  From previous experiments I think a 1 to 64 voice selection should work fine, but increasing it much beyond that might become problematic.  Some further experimentation may be required.

Additional thoughts:

  • It might be nice to make the “mode” LED flash with MIDI note activity.
  • I’d like this in one of my CD Rack Synthesizer Project formats.

MIDI Control

If I’m to use MIDI to link between the front panel and MiniDexed then I need to decide on a MIDI configuration.  After some thought, I’ve decided that the MiniDexed will be configured for each tone generator to have its own MIDI channel (TG1 to TG8 on MIDI channels 1 to 8 respectively) and the “individual/common” routing will be handled by the Pico which will redirect incoming MIDI messages as appropriate to one or more tone generators.

This means that the front panel controls can be hard-coded to specific MIDI channels for each tone generator.

One thing I wondered about – what happens if a program change comes in over MIDI or happens via the MiniDexed interface?  Could that be reflected in the 7-segment display for that tone module?

Well it turns out, I think it can, as the MiniDexed will currently send out a “voice parameter dump” over MIDI when the voice changes.  Now I’m not sure if this is truly desired functionality in all cases (and I think there is a bug in it, which I’ve submitted a patch for), but that could work in my favour here – the Pico can spot these voice dump SysEx messages and extract the MIDI channel number from them and consequently update the display accordingly.

The limitation will be that as the front panel control is a potentiometer, its current position will be out of step with the selected voice, so there will be a “jump” when it is next turned. I’ll also have to ensure that the position of the pot doesn’t override the MIDI or menu voice change too, but that should all be manageable in software.

Proposed Hardware Architecture

Taking all the above into account, this is the proposed hardware interface for each tone generator.

IMG_6809

This is going to require 2xLEDs, 1x push-switch, 1x 2-digit 7-segment display, one potentiometer – per tone generator; so after some initial experiments and a bit of thinking this is what I’m planning.

The main details of what is proposed:

  • Drive the 16 LEDs by the use of two HC595 shift registers, using 3 GPIO from the Pico.
  • Handle the 8 switches using direct GPIO from the Pico.
  • Handle the 8 potentiometers using a MCP3008 over SPI bus 1.
  • Handle the 8 2-digit, 7-segment displays using two MAX7219s over SPI bus 0.

One slight complication is that the MAX7219 requires a 5V SPI interface, so I plan to use a 74HCT125 as a level shifter for SPI 0 to make it a 5V interface.

The original TX816 had a bespoke 2-digit, 7-segment display which included two “dots” in opposite corners (see the front panel diagram again). I’m just going to use a standard off-the-shelf 2-digit display, where each digit has its own decimal point.

I started to put together some elements of this using solderless breadboard, but it was proving very unreliable, so actually I gave up and just “went for it” and designed some PCBs based on the above ideas.

But I’ll come back to that in the next part.

IMG_6812

Closing Thoughts

This is perhaps one of the most complex single projects I’ve attempted to put together so far, but I’m hopeful the approach will work. It is a bit of a risk jumping straight into circuit board design at this stage, but all of the elements of the design are fairly well-trodden paths with microcontrollers and attempting to prototype on solderless breadboard was proving useless!

One possible problem might be the performance of the Pico. I’ll start off in Micropython and see how it goes, but this might be the point to jump over to C/C++ to get the performance I need.

Ideally I’d be able to have one core of the Pico handling the MIDI routing from outside to the tone generators on the MiniDexed, and the other core handling the TX816 front panel IO.

Watch this space.

Kevin

Leave a comment