If you were to ask me, here would be my rough plan for your first FPGA experiments.
It is a design of two halves - one half being the MIDI side, the other half being the audio side. They can be built independently and integrated as needed.
This link message will help with MIDI messages :
https://www.midi.org/specifications/item/table-1-summary-of-midi-messageYou could use a basic FPGA board from Ali Express, but I would suggest you get an entry level FPGA board from Terasic or Digilent, along with a compatible I2S DAC addon.
Anyway, on with the design:
MIDI control (can be done independently)
- Build the H/W side of the MIDI interface (Just an optoisolator with a pullup IIRC)
- Build an FPGA component to receive MIDI and display the message on the devboard LEDs.
- Enhance it to receive MIDI, filter channels, and display the message on LEDs.
- Enhance it to act on key down/key up message, and turn the LEDs into a display of active notes.
The audio design is where most of the work is needed.
First audio design- Create an square wave oscillator (maybe tuned to A 440Hz)
- Attach it to an amp/speaker somehow - e.g resistor divider and and cap to block DC. Or maybe a R2R ladder if you want to get fancy.
- Create some way to switch it off and on, maybe use a button on the dev board
- If you have the MIDI control block, attach it to the signal on the control block that turns on when the 'A' note on MIDI message is received.
You can now play an 'A' note over MIDI or using a button.
Adding an cheap DAC- Create a cheap and cheerfull one-bit DAC in the FPGA
- Change the oscillator to a DDS Sine wave, rather than a square wave.
- Sort out your understanding of signed vs unsigned samples, so it sounds like a sine wave

- Now play an 'A' as a sine wave.
- Maybe add options for more waveforms via switches.
Going polyphonic (one octave)- Create 11 more copies of the oscillator, tuned to different notes of an octave.
- Wire each to the control section (or buttons if you haven't got that far).
- Add a simple (sum all channels) mixer, to mix the values heading into the DAC
Adding envelopes- Create a timer for each channel
- Have it mute the note after a short period of time, or when MIDI note off is seen
- You can now play 'beep' 'beep' 'beep'
- Use the timer counter to index an envelope, and use that to multiply the oscillator output before going to the mixer
- You should now have something vaguely musical.
Add an I2S DAC- Create an I2S transmitter
- Redesign your design to get the clocking friendly with I2S
- Have a reasonable high quality output
If you get this far, then you should have enough FPGA skills and experience to make useful judgement for your next synth project. One that actually is properly designed from the outset - e.g. rather than having an oscillator for each note you time-slice the logic between channels.
You can also look at adding DSP effects (e.g. reverb), to make it sound better.
Allow about a month of dedicated hobby time (maybe a 60-100hr project if you haven't touched HDL before).