It's gonna take quite a while.
A few thoughts, I''ve choosen a wavetable size of 1024words for the moment and with the current development coreboard(altera cyclone iV) I can fit about 25waveforms in memory. should I have fewer wavetables with higher quality?
The first waves are obvoius, sine,triange,square,etc but the rest of them, do you have any wavetable that you can not live without in a synth?. I dont want to just steal the ideas from other synths.
It's based around a nco and today I managed implement a kind of pwm for all waveforms..
Here is a teaser with a small ackumulator so the frequency is not perfect..
-----------------
Project progress:
Made a "ring mod", trided both XOR and Multiplication.. ..Xor sounds like s***t

Made oscillator hard sync.
Made more oscillators. got 4 of them now with pwm..
hehe..
To do, optimize, Code takes ca 4450LE's now(almost half) .
To do, write control mechanisms. and more tests..
---
Rewrote the entire code to arrays and loops -style.. takes a little more space but easier to read and vary nr of channels..
also optimized pwm. four channels with pwm now takes 2700Le's (of 6000 in the smallest cyclone 4 fpga)..
---
Further optimization on the way, trying to write time share code for pwm calc.. I 'think' it works now, but further testing has to be done, if it works I can add a LOT of oscillators with very few logical elements. I created a 2 bit counter and I load values from different channels depending on value. Down to 1126Le's now.. A new channel should now take very little amount of resources.
ALso added proper code for oscillator hard sync.
---
Harder than I thought to program ADSR generator. but getting there. got a working prototype.
Problem was I tried to do it "proper" way first with proper edge detectors. (always @(posedge ...) it sucks..
Seems like bit-banging is the way to go, less code and works better.. if (!res && !gate) gate=1;..
---
Optimized time-control for adsr and also added different modes.. normal is, release starts where you release the key, be high or low volume. alternative mode is that it actually always follow the adsr curve.
Although the adsr code is like 14lines(quite a lot) it does'nt take much LE space at all in the fpga..
Here is some actual code before any paramter arrays is added and such.. :
http://nikwal.in-earth.org/adsrBETA.txt
Also added non linearity to the adsr code.. hmm optional or not, dont know yet....
---
Wrote mux-code for ram, to be able to read same waveform multiple times. It can be optimized because its already dual port in hardware,but there is not much point yet to write it dual port since I can switch about a maximum of 500 to a 1000 waves before it becomes a problem.
----
I can now control if a waveform is to be placed in "ram" or in "Logical elements", for example basic triangle and squarewave take almost no space as logical elements. This means more waves. Thankyou quartus for optimizing the crud out of my waves

---
Made code for two's complement conversion, since waveforms are stored as 0-65535 data with 32768 as 0 and it would be a pita to convert them now. Now the signal level is actually in the middle as it should. volume change works properly too.
---
octave/note to tuningword translation done
---
SPI dac output done! finally got rid of the 2r2 dac..
---
To do
waveform crossfade?
ringmod?
waveform fm and/or am?
portamento?
updated151210