How to build a Yamaha DX7 clone for $10

In this article I will tell you how and from what components you can independently make a clone of the famous Yamaha DX7 synthesizer.

The article is intended mainly for beginners and enthusiasts of retro musical instruments. Don't expect a miracle 🙂

About 10 years ago I had this synthesizer in my collection, but when I moved I had to sell many of my instruments.

Now I am faced with the task of restoring my collection. And at the same time for a minimal budget.

I decided to start with the simplest and cheapest option available – a homemade Yamaha DX7 clone. Searching the Internet, I came across several ready-made solutions.

1. MiniDexed. https://github.com/probonopd/MiniDexed

2. PicoDexed. https://github.com/diyelectromusic/picodexed

3. MicroDexed. https://codeberg.org/dcoredump/MicroDexed.

Option No. 3 was eliminated immediately, since it is based on Teensy, an expensive and hard-to-find component.

There is also a MicroDexed option on ESP32, but the project is crude, the polyphony is reduced, and in this form, without modification, it makes no sense to implement it.

So, option #1: MiniDexed.

In total, this DX7 clone has 8 sound banks of 32 instruments each.

To assemble it you will need a Raspberry Pi 3.4 or Raspberry Pi Zero 2w.

The approximate cost of components for assembly is $50. Depends on the selected version of Raspberry.

In this case, we will get a fairly convenient device with an LCD 1620 screen, buttons, MIDI input and output.

It is compatible with original sound banks and allows you to change sound parameters in real time using an external MIDI controller. (It is assumed that you already have it).

This device is a module and does not have its own keyboard. Accordingly, to use it you will need a MIDI keyboard or a MIDI USB cable to control it from a computer.

Instead of a professional MIDI keyboard, you can use any old children's synthesizer, the main thing is that it has a MIDI OUT connector.

But there is also a cheaper option.

#2: PicoDexed. To assemble it you will need RP2040.

Its price is approximately $3-4. I2S PCM5102 – $3-4.

MIDI connector and power connector $1-2.

An opto-isolator chip such as 6N137, 6N138 or H11L1 is another $1, and a pair of resistors is $0.2.

The body can be made from anything. In total, the price will be approximately $10. I already had a lot of this, and the price for me was $3 for the RP2040.

In this device, the sound quality is in no way inferior to that described above, but the number of simultaneously sounding notes is less.

There are no controls or screen. Control is carried out via MIDI only.

The device body contains only a power button, audio output, MIDI input and power connector.

Despite this, I settled on this option.

MIDI In circuit:

PCM5102 connection diagram:

Since I already have a MIDI controller, and for those who don’t have one, there is a simple option for building a MIDI controller based on Arduino, with buttons for switching presets and banks.

Here is the edited code for building a MIDI controller for switching sound banks and timbres/instruments.

I used Arduino Nano.

2 buttons are used to change timbres, +1 and -1.

2 buttons for switching banks. +1 and -1.

For greater versatility, I added MIDI channel selection buttons. +1, -1 and 16 channel.

Here is an example diagram:

Code for firmware MIDI controller:

#include <MIDI.h>

// #include

MIDI_CREATE_DEFAULT_INSTANCE();

byte patchNum = 1;

byte midiCh = 1;

byte bankNum = 1;

void setup() {

  pinMode(2, INPUT_PULLUP);

  pinMode(3, INPUT_PULLUP);

  pinMode(4, INPUT_PULLUP);

  pinMode(5, INPUT_PULLUP);

  pinMode(6, INPUT_PULLUP);

  pinMode(7, INPUT_PULLUP);

  pinMode(8, INPUT_PULLUP);

  pinMode(9, INPUT_PULLUP);

  pinMode(10, INPUT_PULLUP);

  //pinMode(11, INPUT_PULLUP); // Uncomment this  line for 1 more button

  //pinMode(12, INPUT_PULLUP); // Uncomment this  line for 1 more button

  MIDI.begin(MIDI_CHANNEL_OMNI);

}

void loop() {

  //Serial.print(patchNum);  //bankNum, midiCh);

  if (digitalRead(5) == LOW && patchNum <= 126) {

    bankNum; //

    patchNum++; // advance patch number +1

    MIDI.sendControlChange(32, bankNum, midiCh); //Send CC

    MIDI.sendProgramChange(patchNum, midiCh);    // Send PC

   

    delay(150);

  }

  if (digitalRead(2) == LOW && patchNum >= 1) {

    bankNum;

    patchNum--; // decrease patch number -1

    MIDI.sendControlChange(32, bankNum, midiCh);

    MIDI.sendProgramChange(patchNum, midiCh);

    

    delay(150);

  }

  if (digitalRead(6) == LOW && patchNum <= 126) {

    patchNum++;

    MIDI.sendProgramChange(patchNum, midiCh);

    delay(150);

  }

  if (digitalRead(3) == LOW && patchNum >= 1) {

    patchNum--;

    MIDI.sendProgramChange(patchNum, midiCh);

    delay(150);

  }

  if (digitalRead(7) == LOW && bankNum <= 7) {

   bankNum++; 

   // patchNum=0; Uncomment to reset program # to 0

   MIDI.sendControlChange(32,bankNum, midiCh);

   // MIDI.sendProgramChange(patchNum, midiCh); // Uncomment to send Program Change 0

  

    delay(150);

  }

  if (digitalRead(4) == LOW && bankNum >= 1){

    bankNum--;

    //patchNum=0; Uncomment to reset program # to 0

    MIDI.sendControlChange(32, bankNum, midiCh);

   //  MIDI.sendProgramChange(patchNum, midiCh); // Uncomment to send Program Change 0

    delay(150);

  }

  if (digitalRead(10) == LOW && midiCh < 16) {

    midiCh++;      // Increase MIDI CH +1

    delay(200);

  }

  if (digitalRead(8) == LOW) {  // if(digitalRead(chan)) midiCh= 1;

    midiCh = 16; // MIDI CH=16

    delay(200);

  }

  if (digitalRead(9) == LOW && midiCh > 1) {

    midiCh--; // Lower MIDI CH -1

    delay(200);

  // }

  // if (digitalRead(11) == LOW) { // Uncomment if you want a separate button that resets instrument # to 0

  //   patchNum=0; // Uncomment to reset program # to 0

  //   MIDI.sendProgramChange(patchNum, midiCh); // Uncomment to send Program Change 0

  }

}

Resources:

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *