Now that we have totally redesigned our submodular synthesizer, it might be time to review how you could use it to play some music, and how the electrons and bits will flow through. That’s important, because what originally started as a fairly simple switching matrix, eventually turned into a pretty complex sound processing engine. And to better understand where we’re going with all this, it might be a good idea to take another look at our latest block diagram:
First and foremost, the ISHIZENO i8 is both analog and digital. On the faceplate, you have knobs, displays, and ports. While the knobs might look like potentiometers, they’re actually rotary encoders, which means that they work in the digital domain. Similarly, while our OLED screens might be used to display some voltage levels, they are controlled by a digital bus. In fact, the only analog part on our faceplate is the set of 32 input and output ports. And these ports can be used to carry either CV signals or audio signals. Any port can be used for either, and the module does not really care about it. So far, nothing really fancy.
Internally though, things quickly get a lot more complicated, because we want to support both digital and analog submodules, and because we want patches and settings to be stateful, meaning that they can be saved instantly, and reapplied at will. Not only that, but we want to be able to patch any of the 16 input ports to any of the 16 modulation inputs that can be offered by any submodule. As a result, if we were to use analog crosspoint switches like the AD75019 for this type of patching, we would need 16 switches just for that.
In order to work around this problem, we have decided to handle this patching in the digital domain, by converting our 16 analog inputs into digital signals right from the get go. This is what the two AD7606 analog-to-digital converters will be used for. From there, we will remain within the digital domain for quite a while, mostly within the confines of the XMOS XS1-A16A-128 microcontroller.
You can think of this component as the brain of the system. In a nutshell, it’s a set of 16 32-bit logical cores that are programmed in C or C++ like any other microcontroller, and can be used for signal processing, thanks to 64-bit DSP functions. Connecting all these cores is some kind of multiplexing bus, capable of routing 84 I/O ports with low latency and timing determinism. This means that each of our 8 stereophonic channels gets two dedicated core, one for each stereophonic voice. How sweet!
Thanks to its xCONNECT bus, we can use the XMOS for switching and multiplexing our modulation signals. Therefore, every analog input goes to the XMOS, and every audio output goes there too, so that we can use them for modulation as well. In other words, outside of an analog submodule, CV modulation is handled entirely within the digital domain, with 16-bit precision.
To feed these modulation signals to the XMOS, we have our two AD7606 ADC converters upstream. Downstream, things are different whether we’re using a digital or an analog module. For the former, we’re using the SPI bus connecting the XMOS to the DSP of the digital submodule to get modulation signals as well as audio signals from the DSP to the XMOS. And for the latter, we’re taking the analog stereophonic audio output of the analog submodule through a CS42L52 Codec (one per analog sumodule), all the way back to the XMOS. As a result, the XMOS has digital versions of all inputs and outputs, at all times, and can use them for modulation and signal visualization purposes.
This architecture allows the outputs of any module to be patched to the inputs of any other module, whether they are digital or analog. Not only that, but it allows patched signals to be processed by the XMOS by applying some gain, scaling factor, delay, or whatever your C/C++ programming skills let you handle. And because all this processing happens on the backplane, it does not have to be handled by the submodule itself. This is important, because it’s taking our original idea to a whole new level: initially, our goal was to remove the complexity of handling knobs, ports, and displays from the task of developing a submodule. With our new design, we’re not only achieving this result, but we’re also removing the complexity of normalizing CV modulation levels, which is something that I had no appreciation for up until now.
From there, we have modulation signals that we can pass to our submodules. Here, I should point to the fact that our backplane will have 8 submodule bays, which will support both digital and analog submodules, without the need for analog slice boards. Our submodule interconnect will offer all the ports needed to drive both digital and analog modules, or even hybrid ones, whatever that means. This interconnect will provide the following 32 pins:
- 4 SPI pins
- 3 I²S pins
- 16 pins for analog inputs
- 2 pins for stereophonic audio output
- 2 pins for ±12V power supply
- 2 pins for ±5V power supply
- 3 pins for future extensions
The SPI bus will be used for three things:
- Sending modulation signals from the XMOS to the submodule.
- Sending modulation signals from the submodule to the XMOS.
- Sending settings from the Pi to the submodule, through XMOS.
Downstream of a submodule, all that is needed is to process the stereophonic audio signals generated by the submodule. In the case of a digital submodule, we will need to convert a digital stereophonic signal into an analog one. This will be handled by a pair of CS42428 Codecs with 24-bit resolution. These signals will be routed directly to the DB25 interface, and to the mixing section. Should one need to patch one of these signals to one of the 16 analog outputs on the faceplate, the digital signal will be sent from the submodule to the XMOS, then from the XMOS to the AD5360 digital-to-analog converter, then through the AD75019 crosspoint switch, and finally to an analog output of the faceplate. Not exactly trivial…
For an analog submodule, things are a little bit different. Here, we will need to convert our digital modulation signals into analog ones. This will be handled by a set of 8 AD5360 digital-to-analog converters (one per submodule) connected directly to the XMOS. Here, the challenge will be to define how many analog modulation levels we can provide across our analog submodules. This number will be limited by the number of I/O ports offered by the XMOS. Fortunately, we will have 84 ports to our disposal, which could be used in the following fashion:
- 8 for inputs (2 SPI interfaces for the 2 AD7606 converters)
- 32 for digital submodules (8 SPI interfaces)
- 32 for analog submodules (8 SPI interfaces for the 8 AD5360)
- 4 for audio outputs (1 SPI interface for the 8 CS42L52 Codecs)
- 4 for CV outputs (1 SPI interface for the AD5360)
- 4 for the SPI connection to the Raspberry Pi 2
From there, the stereophonic audio output of an analog submodule will be routed in two different places: first, to the AD5360 used to feed the output to the XMOS for patching into another module; second, to the pair AD75019 crosspoint switches used to feed the faceplate’s analog outputs. These two switches will create a 32 × 16 switching matrix with 32 inputs (16 from the XMOS and 16 for the analog submodules) and 16 outputs (the faceplate’s analog outputs).
Finally, the 8 stereophonic audio outputs offered by our 8 submodules will be mixed together using 9 LM833-N operational amplifiers and 3 AD5623 digital potentiometers directly connected to the Raspberry Pi 2. The output of this mixing section will then be statically patched to a 3.5mm jack chassis socket on the faceplate.
And that’s pretty much it… Clearly, we’re dealing with a very complex design here, but its beauty comes from the fact that it’s treating both digital and analog submodules on an equal footing, while enabling dynamic patching and dynamic settings across the board, all through 8 stereophonic channels. And when you remember that you get all this for a BoM costing less than $680, you realize that you’re dealing with something really special…