It's summer time again, and a few days away from home really gets my creativity going!
This time I've started looking at the output module for the synth. I have several goals for the output:
- Design should support 16 voices
- Stereo, with per-voice panning
- Individual outputs per voice
- Multiple (2 or more) stereo FX pipelines
- Voice chaining through the voice's ext input, with summing of multiple voices to each input and return to same voice
I also want the following to make a future vocoder feature possible
- Each voice's SVF can be used as a carrier modulation channel
- Selectable vocoder carrier: Voice 1 Juno LPF, Sum of multiple voices, external input, noise (for voiced/unvoiced)
- Voiced/unvoiced selector that effects return to voice
Outputs
We can use two 16 x 16 crosspoint switches (left and right) to select one of 16 outputs for each of the 16 voices. This will support both individual outs and grouping of multiple voices into a single output group. For example channel 1 to 4 can be output 1, 5 to 16 as output 2 etc. We would also need a similar setup to send the effect outputs to the right output groups. PS: Unless we have the same number of FX pipelines as we have voices, it won't be possible to have per-voice effects at the output.
Thought: Do we need per-voice group output amps or will it be enough to use the amps on each voice card?
Effect pipelines
I've designed each voice card with two FX outputs. I intended this to be one output per FX pipeline, but I'm reconsidering using them as left and right outputs instead. I COULD have just tapped the main L/R voicecard outputs, but this will let us pan the FX and main outputs separately - not sure if it is anything worth doing but since the outputs and VCAs are already there it might be a cool feature.
As a start, each pipeline should consist of a chorus module and a DSP based multieffects module. These will be chained, with the chorus feeding into the DSP. Both chorus and DSP should be possible to disable/bypass. As a side note, the juno chorus always mixes its output with the dry output. In my pipeline the dry signal is completely separate, so if we include the original signal in the chorus output, the base signal will be twice as high as all other delayed signals. If we REMOVE the original, we need to consider what should happen when chaining, will the original be included in the DSP input??
|
Either chorus is always added to the input before the fx dsp (but with mute possibility), which adds the original dry signal to the mix - or the chorus replaces the dry signal before the FX, but that means we have to re-add the dry signal later. Not sure it really matters but lets test. Also, the input to FX DSP at the bottom is missing.
|
At the moment I have two options for the DSP. The Spin Semiconductor FV-1 or the Daisy seed. The FV-1 has a lot of ready-made effects and may be compatible with cards from Tiptop audio. It is however harder to control as it doesn't have any digital inputs and is limited to three analog CVs. It is also limited to a fixed set of effects (8?) but that can be worked around.
The Daisy is a more modern platform with a much higher-performing DSP and DACs. I think it can be digitally controlled as well as controlled using CVs.
It would be a good idea to see if a future proof FX pipeline bus can be made - using a fixed number of CVs and I2C/SPI bus inputs.
Vocoding
Now, this is something I promised myself not to work too much on, but it would be stupid not to include support for it, so here goes.
Each voice card has a state variable filter that can be used to create separate bands from the synth/carrier signal by feeding it into the external audio input of each voice. We can then (obviously) use an external synth as the carrier.
A vocoder switches between a carrier signal (normally a harmonics rich synth sound) and a noise source to make voiced/unvoiced sounds, so we need to be able to select between these. By adding an input selector mux to the external input signal, this can select between external input and noise.
It would be cool to be able to use the synth engine of the XM8 itself for the synth part. I previously considered using voice 1's LPF output as the synth/carrier for all bands. This would let us use the SVF of voice 1 for vocoding as well, giving us up to 16 bands.
I've since reconsidered this, perhaps it would be cool to be able to sum multiple of the voices to get a more harmonic-rich signal? By summing multiple voices and sending them to the external input of every other voice card, we can get a compromise between the number of voice cards used as vocoder bands and voice cards used for generating the carrier. For example, voice 1 to 3 can generate the carrier, and the remaining 13 channels can be vocoder bands.
We do get an issue though, as we need to change the center frequencies of each vocoder band when we reduce the number of bands. This means that instead of having fixed filter frequencies in the vocoder analyzis module, we need voltage controlled ones. These can use a subset of the JP6 SVF, requiring two LM13700 per band.
The first and last bands (LPF and HPF respectively) may stay the same but their CVs must be routed to different voices (at least one of them - we can let the top band always map to the last voice card).
External input select vs voiced/unvoiced
Given the following four channel mux selection truth table:
A B = SRC
---------
0 0 = external input
0 1 = Voice card 1 juno LPF
1 0 = Voice 1 return channel
1 1 = Vocoder noise source.
If we OR the selector signals A and B from the MCU with the V/U signal from the vocoder analyzis module, the V/U will override the MCU, turning on the noise whenever needed.
Return routing
We should make it possible to return the signal from any voicecard to itself or any other voice card. It should also be possible to sum and route multiple voices to the same target. All this can be achieved with a 16 x 16 crosspoint switch. The switching point should be at the summing point of an op amp at each output. This will, however, mean that an input may be routed to ONE output at a time. We can still route multiple inputs to the same output though. Also, we may have to add a resistor to ground at the summing point, to be used when no inputs are connected to that channel?
It must then be possible to select between (global) external in and the per-voicecard return as inputs to the voice card's external input.
Some uses of this would be:
- Overdrive/feedback - by returning the signal to the same voice card (in phase!) we can make up for the lack of feedback-based overdrive in the filter module. This is how the minimoog does it. It may still lock up filtes though, so it must be properly tested.
- Phasing - we can sum a set of voices and then chain the output through the rest of the voices' SVF filters, which each one having a different notch frequency set. NB:
- Vocoding - return routing lets us sum multiple voices to use as the carrier signal. This requires a special case for the first voice where the routing output is sent to the external input selector to be used as external input for all the other voices
A suggested output block schema
EDIT:
As the ETI vocoder has 14 bands, a simplification would be to allow two of the 16 XM8 voices to generate the carrier, and use the 14 others for vocoding. By doing this, and not allowing a varying number of vocoder bands, we greatly simplify the analysis module - it can have fixed frequency filters and fixed output routing. Two voices for carrier will still mean 6 oscillators which should be plenty for making a complex signal.
We could then also leave out the LPF input to the ext in mux, making the voiced/unvoiced switching much simpler (no need for or-gates).
We should even tap the carrier signal before the return mux to make the routing logic simpler. We need a way to disable output of the two carrier voices from the output. Since the Voice out signal is pre-output VCAs we can tap this and just turn down the voice output VCAs.