Author: Scott Gravenhorst
Verilog, designed for Spartan-3E SK, certainly adaptable for others.
This is a simple MIDI controlled monosynth with one NCO, one NCF (single stage IIR) one NCA and 2 ADSRs, one ADSR controls the NCA, the other ADSR controls the NCF. The NCO's PWM output is connected to the NCF input and PWM duty cycle is controlled by the MIDI Modulation Wheel. FPGA implementation is brute force.
The file package MONOSYNTH_SG0001.zip contains all of the files necessary to create and compile this project using WebPack ISE 8.2i. The package includes the PicoBlaze source code for the MIDI MonoSynth controller as well as the compiled .v file.
You can play with the ADSR numbers to change the sound made, you can also change the NCO output waveform from PWM to TRI or SAW with simple edits, however with SAW or TRI, the mod wheel does nothing.
This is really a proof of concept project, but it does work and it's fun to mess with.
MIDI channel is configured in the 4 slide switches, 0000 is channel 1, 0001 is channel 2 etc.
The LEDs display the number of keys currently held down.
Please note that while I've tried to comment this stuff accurately, there may be errors and omissions, so please bear with that.
The project files below contain basically the same monosynth as above with the addition of portamento. Portamento is provided by an IIR filter that uses no multipliers (design idea provided by Eric Brombaugh). The portamento module is Eric's IIR filter with additional code to provide a clock divider that controls portamento time. In this project, the portamento time is set to a static value. You can change the value by locating the portamento module instantiation in the main project file and changing the clk_div value.
Here for your listening pleasure (ahem):
One MP3 (0003F_PWM.mp3) demonstrates portamento at 0003F (time) and the modulation wheel is connected to PWM.
Same structure as above, but with pitch noise modulation amount applied to the MIDI modulation wheel. I have a keyboard with a MIDI joystick, so that is hooked up to portamento time and PWM duty cycle.
Here's a short sample that demonstrates noise modulation of pitch:
MIDI Interface Note: I used a 6N138 for my MIDI input interface. This IC does not require inverting the MIDI data stream. In the main project file, there is a place near the top to add inversion if it's required. Also note that you may be using an FPGA pin other than IO12, you can change this in the user constraints file. In the zip file, you will find a GIF schematic of the 6N138 MIDI receiver I used.