I'm currently using an oscillator that has high levels of harmonics filtered by several bandpass filters in parallel to generate formants, and that works pretty well. I'm interested in other ways of generating formants. I've seen old references to fof~ and vosim~, but these objects are old and apparently unsupported. Does anyone know of current versions of these? Or other ways to generate formants in Pd?
-
Objects for formant synthesis?
-
@jamcultur said:
I'd prefer to specify the bandwidth in hertz.
just divide the bw freq by the fundamental (and keep [max~ 1])
-
@jamcultur said:
I just found this paper that says "SuperCollider has a uGen formlet [14] dating back to 2002 which forms a FOF-type wave burst
I've mentioend it and I've implemented it like I said
check my comments carefully please 
-
@jamcultur said:
I don't know what the first example is, but it is not a correct implementation of FOF.
I didn't say it's FOF, but I said many times it's the basis of it, the starting point, the core... and if you check the CSound and FAUST code you'll see what I mean.
It looks like the Formant UGen example might be an implementation of FOF, based on the formants it produces.
It might be what you wish FOF would do, but it's not FOF, it's not implementing FOF, it's not the same algorithm as the CSound and FAUST code. Like I said, it's something related but I don't know about its actual source/reference.
-
just added a very much simplified version of Miller's paf~ external code, with the ability of setting parameters as arguments and the main parameters as signal inputs! I will now expand it and add MC support. There's no vibrato but I think that is trivial to implement as a patch!
see:
https://github.com/porres/pd-else/commit/fddcc9597cf17c977abb14d5409cffd329b6abf5
get it at
https://github.com/porres/pd-else/actions/runs/20529081595 -
@porres I got this when I tried to use paf~

-
have you updated and used all binaries from the download?
-
@porres I copied everything and I'm not getting that message anymore, but else/paf~ does not give the same results as Miller Puckette's paf~. The first image shows spectrograms from both versions of paf~ with the first six harmonics of the fundamental frequency=264, the formant center frequency=650, and the bandwidth=80. Miller Puckette's paf~ is at the top, and else/paf~ is at the bottom. The second and third harmonics are about the same in both, but the other harmonics are significantly higher in else/paf~.

The second image is the same except with bandwidth=10 in both versions of paf~. Changing the bandwidth to 10 made a big difference in Miller Puckette's paf~. All but the second and third harmonics were eliminated. Changing bandwidth to 10 in else/paf~ made almost no difference in the spectrogram or in the sound.

The third image shows both version of paf~ with bandwidth=500. The results were much closer, but not identical. The highest peak in Miller Puckette's paf~ was at 528 hz, while the highest peak in else/paf~ was at 793 hz.

-
@jamcultur said:
The second and third harmonics are about the same in both, but the other harmonics are significantly higher in else/paf~.
nice and thanks for deeply testing this.
One thing I can think of is that I am using 'sines' and not 'cosines'. The thing is that you can change the phase offset in both mine and miller's, so I didn't bother. Maybe I should default to cosine? I thought about that, but this is still in the oven, so... I can think some more and maybe revert it to cosine!
Can you see if changing that aligns things better?
cheers
-
we're back to cosines in https://github.com/porres/pd-else/actions/runs/20608031480
-
@porres The cosine version looks the same as before with fundamental=264, formant=650, bandwidth=10. The top spectrogram is Miller Puckette's paf~, bottom is else/paf~

I just noticed one small difference; the cosine version has a small peak below 40hz that the previous version didn't have. -
can you upload your patch?
-
What I can tell you is that there's no audible difference for me over here. I have all literally dozens iterations of code changes/overhaul from Miller's original code. Testing the original and my latest version basically sounds the same. But I haven't put it into the test like you with a deep spectral analysis
-
@porres My patch used some of my own objects so I made a new patch that doesn't use them. Oops, there was a problem with the first one so I uploaded it again.
paf~test.pdI multiplied the output of else/paf~ by 1.3 so that the level of the highest peak would match Puckette's paf~. I used a frequency range of 30 hz to 2024 hz in audiolab/pp.spectrum~
-
@porres I can easily hear the difference between Puckette's paf~ and else/paf~ with bandwidth set to lower values. The difference is more subtle with higher bandwidth values. When using formants to create vowel sounds, the bandwidth is normally under 200.
-
geez... you have an amp value of '100', it should be '1'

-
@porres I already uploaded the fix.
-
well, it looks and sounds the same here with an amp of '1'...

-
ok, looking closely with my glasses on, I can see the top one having a bit more spectral floor noise, but I can't hear it...
-
@porres It's easier to see and hear with bandwidth = 10. It's also easier to see if you set the top of the pp.spectrum~ range to 2024.
-
well, can you send the patch again?
this is what I have... with a bandwidth of 10... looks the same, sounds the same! I really cannot reproduce and confirm what you're saying.

the patch: