Introduction
This as a project that I’ve been considering for a while (too many toys, not enough time.) If I design it as a building block I can re-use it in my other projects.
Overview
The audio output of the computer can be connected to the training cable input jack on the DX7 using a specially configured cable that can be constructed using audio adapters. A Direct Show source filter will be used to synthesize the signal for the transmitter. The signal will be sent to the default audio output device and then on to the DX7.
Reverse Engineering the DX7 Interface
The first step is to look at the signal being sent by the DX7 with an oscilloscope to take measurements. I had found a free oscilloscope program that uses the audio input of the computer to take measurements, and I was curious to see how it would compare to the BK Precision 2160 Oscilloscope on my bench. The results can be seen in these photos.
The image on the left is the software oscilloscope, and on the right is the BK Precision. The plot produced by the software is distorted due to the bandwidth limitations of the PC’s audio card, and contains artifacts that I suspect are the result of the audio input decoupling capacitor.
I used the BK Precision to take measurements and documented the results below.
The long flat section at the beginning of the signal is used to tell the receiver where the signal begins. Following that are 8 channels of data that are separated by 0.4 millisecond stop pulses (the ones that go negative.) The positive going pulses vary in duration from 0.7 to 1.5 milliseconds to control the position of the servo arm.
The gray numbers within the positive pulses indicate the channel assignment. Refer to the table at the right titled ‘Channel Assignments’.
Signal Synthesis
I divided the frame into 18 sections corresponding to the state transitions in the signal.
I placed the information for each section in two tables, one for duration and the other for amplitude.
The servo pulse duration is recalculated when a new value arrives.
With the table to guide the process, it’s a simple matter to write a function to synthesize the signal.
Since the signal is cyclic, the first step is to determine where ‘t’ falls within the cycle. The input value ‘t’ could be greater than a cycle, so the input time is divided by the cycle time and the remainder ‘tm’ is used as the position within the current cycle.
The output value is calculated by iterating through the duration table, subtracting the duration of each section from tm until the result goes negative. That indicates that tm fell within the current section, and the corresponding value is looked up in the amplitude table and returned as the result.
The function is continuous so it can calculate discrete samples for any sample rate or buffer size (time span.)
This photo shows the signal at the audio-output jack of my laptop.
I’ve adjusted the amplitude of the waveform in the software to produce a signal that’s 1.4 volts peak to peak.
There’s some ringing at the top and bottom of the pulses that I suspect is caused by the output circuitry of the sound card.
The ringing shouldn’t be an issue since the DX7 (probably) has input conditioning circuits to reject such noise.
Transmitter Interface Test Panel (software)
I wrote a test program in C# to exercise the interface. Marshaling was used to import the functions from the API dll, and C# wrappers were written around the marshaled functions to provide an interface to the synthesizer.
The program has a DirectShow test graph that splits the output of the synthesizer. One feed goes to the audio output jack and the other goes to a software oscilloscope so I can view the waveform in real time.
There’s a slider for each servo channel (even channel 8), with a checkbox for reversing the direction of operation. The numeric read-outs above the sliders show the servo position value (16 bits, unsigned, 0..65535) that was read back from the synthesizer as a means of confirming the values it’s receiving.
The ‘Start’ and ‘Stop’ buttons are used to control the DS filter graph, and were added for debugging purposes. Normally the graph would run continuously until the program is shut down.
I’ve tested the program with my DX7 transmitter and the Animal-X Biplane (prop removed, of course.) All of the channels work and the servo motion is smooth and free of jitter.
I observed a 2 second delay (latency) between the slider movement and the servo response. The synthesizer was sending frames too quickly, so they were backing up in the audio output queue. Think of it as a lineup in a convenience store. If customers are coming in more quickly than the cashier can deal with them then a lineup forms. The idea here is to avoid a lineup.
I modified the synthesizer to limit the number of frames being sent out each second in order to prevent stale data from collecting in the audio output buffer. The careful starving of the downstream buffer prevents too much stale information from accumulating. As a result, when the servo position is updated the new data is sent out immediately and doesn’t have to wait.
Testing of the modified algorithm indicates that the response to the slider movement is immediate when the signal is observed on the oscilloscope.
Cable Specifications
The output amplifier of a typical PC sound card is analog. These amplifiers are not current limited, so if you short them out or place too small a load on them the amplifier will be damaged.
Great care must be taken to configure the cable that connects the PC to the transmitter in order to avoid damaging the sound card.
The objective is to wire one of the output channels to the input of the DX7. This can be hard wired, or audio cables and adapters can be used.
Get a stereo mini to RCA cable and RCA to mini adapter. I had a stereo adapter, but a mono adapter would be better. Connect one of the RCA plugs from the audio cable to an RCA jack on the adapter. Leave the other one disconnected! The objective is to connect the output signal from the PC to the tip of the mini plug going into the DX7. If the ‘NO TRAINEE’ message comes on the radio screen, move the RCA plug to the other jack on the adapter.
To Do:
- Test the transmitter and model to see if latency is still an issue.








Great project. Can I have a copy of your software?
Thank you for your interest in the project, but the software isn’t ready to be released just yet.