Author: Scott Gravenhorst
Verilog, designed for Spartan-3E SK, certainly adaptable for others.
8 Voice LA/FM Polysynth
This project is an 8 voice linear arithmetic with FM polysynth. It is controlled with an embedded PicoBlaze MIDI controller.
The structure of each voice is based on the GateMan monosynth.
As can be seen in the diagram above, each of the 8 voices uses 4 NCOs for a total of 32 NCOs. Each NCO can produce one of 4 waveforms. Pitch can be band limited noise modulated (FM). NCOs use 33 bit phase accumulators for high pitch resolution.
This is a basic design that I am sure will morph and change over time. The design currently uses about 35% of the FPGA's slice resources. 14 block RAMs or dedicated multipliers remain free. The design uses 4 dedicated multipliers and 2 block RAMs.
The design uses a 50 MHz system clock and a sample rate of 250 KHz.
Synth parameters can be updated either by MIDI system exclusive messages or via a serial port connection.
The sample rate allows for a useful range of f and Q parameters for the state variable filter. Maximum Q is about 10.
This synthesizer contains 32 NCOs, 16 ADSRs, 32 noise generators, 32 single stage IIR noise filters, 8 NCAs and 8 state variable filters.
MIDI Input and Audio Output Circuits:
GateManPoly Source Code
- ver_k: Move divide by 12 from hardware ROM to software in the MCU. Reduce computation of each NCO from 4 clocks to 3. This allows for an additional clock for more features to be added. Fix noise modulation calculation, add noise signal boost control
- ver_l: Add better gain adjustment windowing for both DAC and noise
- ver_m: Had to fall back to 4 clocks per NCO, sinewave output was corrupted because the ROM lookup table needed an extra clock. Sample rate is still 250 KHz. Fixed PicoBlaze code that handles real note off messages.
GateManPoly Patch Editor
- GateManPoly_Patch_Editor.zip - This is a VB project which runs under the FREE VB2008 Express Edition by Microsoft. It has a GUI with sliders and other controls to visually set up a patch. The program communicates through a serial port to the synth.
- test_patch.zip - A test patch file is inside.
- GateManPoly_demo_01.mp3 - One key is held as a drone while other keys are used to play a melody. The ADSRs have a long release time, so the polyphony comes into play to sustain those notes until they die out naturally. The patch is 3 NCOs set to saw, 2 an octave up. The 4th NCO is set to triangle and is 19 semitones up (octave+fifth). SVF Q is 8.1. All NCOs are pitch modulated with heavily lowpass filtered LFSR noise. This creates the unpredictable timbre behavior noticable especially in the drone. This is only one patch and sound type this synthesizer can do. This demo was done using only one FPGA dev board. No effect was used to process the demo.
- gatemanpoly_steeldrums.mp3 - Some keyboard diddling using a patch that has steel drum qualities (to my ears). This demo was done using only one FPGA dev board. No effect was used to process the demo.
- This synth design initializes all synth parameters to zero on startup. As such, the synth will make no sound until a patch is configured to allow at least one NCO to sound (all NCO levels are zero at startup).
- When sending patch data using the RS232 port, MIDI must not transmit messages otherwise the synth gets confused. This is because the interface for RS232 and MIDI share the same driver code which is very dumb. If the patch messages are sent via MIDI using a sequencer, this will not happen because the sequencer will be smart enough not to disobey the rules for sending system exclusive messages.