[sdiy] FPGA 2-OP FM MIDI Polysynth

Scott Gravenhorst music.maker at gte.net
Thu Apr 30 23:21:46 CEST 2009


Eric Brombaugh <ebrombaugh1 at cox.net> wrote:
>Scott Gravenhorst wrote:
>> I put another sample file on the FPGA synth wiki, it's a high quality mono MP3 file
>> made from me noodling with settings while the recorder was running.  Then edit out
>> the crap and silences.  This shows a wider range of the kinds of tonal sounds I've
>> obtained.  There is also a range of dissonant sounds possible that are not represented.
>> 
>> http://www.fpga.synth.net/pmwiki/uploads/FPGASynth/8vFM-2x4_random_samples.mp3
>> 
>> synth site again:
>> 
>> http://www.fpga.synth.net/pmwiki/pmwiki.php?n=FPGASynth.8vFM-2x4
>
>Scott -
>
>Nice stuff. The polyphony allows some nice sustains and tasking several 
>2-op generators per note allows for interesting dissonance.
>
>I hadn't looked at your wiki page until just now. Well described. I did 
>note something interesting in your block diagram though: You have a 
>separate NCO for the modulation and carrier. If you look at the equation 
>for the FM process, you'll see that w(t) occurs twice - in principle you 
>could eliminate the NCO that you're multiplying by B for the modulation 
>source and just use the output of the 1st NCO. All the FM work that I've 
>done has relied on this to simplify the circuits some.

I don't understand how this is done...  I tried to multiply the phase accumulator output by B and I
got weird stuff because the thing would binary wrap.  My phase accumulators are designed to do a
binary wrap - is that the problem?  I use a phase increment value to define the frequency.  Each
clock the phase increment value is added to the phase accumulator.  That provides a sawtooth that
wraps naturally.

>If you're using separate NCOs then you don't really need the B 
>multiplier - just load the 2nd NCO with a different frequency. 

What I envisioned when I wrote the code was that w(t) represents the phase of a zero to 2*pi
incrementing "wheel" whose phase value is presented to a sine table as an address.  So I took this
to imply a phase accumulator attached to a sine table.

>OTOH, using just one NCO allows the phasing of the modulation waveform to be 
>somewhat more predictable since it's always in sync. It's all a tradeoff 
>depending on resources and what sounds you're shooting for.

I couldn't figure out how to do this: [use a single NCO and still provide w(t) and B*w(t)] without
actually implementing the phase accumulator for each w(t).  Now that you point it out, I could have
eliminated a multiplier and let the VB.NET patch program do that multiply and just supply a pitch
value B times the w(t) value.  How to do this with only one phase accumulator escapes me.

-- ScottG
________________________________________________________________________
-- Scott Gravenhorst
-- FPGA MIDI Synthesizer Information: home1.gte.net/res0658s/FPGA_synth/
-- FatMan: home1.gte.net/res0658s/fatman/
-- NonFatMan: home1.gte.net/res0658s/electronics/
-- When the going gets tough, the tough use the command line.




More information about the Synth-diy mailing list