Hi Bart,

Glad you like it. I guess this is something quite expected as it gives access 
to so many applications. Let’s distribute it under the terms of GNU General 
Public License, as published by the FSF, v2 or any later version.

I will give it some more time to test the accuracy. Consider this code as a POC 
and try to increase the BufferLength to something over 300 if possible. It 
depends on ur lowest frequency and SR actually.

Nicolas



> On 7 May 2020, at 15:48, Bart Brouns <[email protected]> wrote:
> 
> 
> Hi all,
> 
> This is very exciting to me, since I've been looking for a way to integrate 
> the pitchtracker of https://magnetophon.github.io/VoiceOfFaust/ into the 
> binary, instead of using an external pd patch.
> So many thanks to Nicolas for writing it!
> Is it open source? What license?
> 
> 
> Julius's solution didn't work for me, but this at least compiles and runs:
> i = +(1) ~_ :min(1e9):max(0);
> 
> Unfortunately it doesn't track the pitch here.
> I connected an oscillator but the bargraph stays at 0.
> 
> 
> Also, I don't understand any of the algorithm, but shouldn't "i" get reset at 
> some point, so it doesn't run into the min clause?
> That would happen after 1e9/48000/60/60 = almost 6 hours at 48k SR, right?
> 
> 
> Cheers,
> Bart
> 
> 
> 
> Julius Smith <[email protected]> writes:
> 
>> Hi Nicolas,
>> 
>> It looks like you are asking for unbounded correlation lags. Try limiting
>> it with something like   i = min(1e8,+(1)) ~_ ;
>> 
>> - Julius
>> 
>> On Tue, May 5, 2020 at 11:56 PM Nicolas Gravillon <[email protected]>
>> wrote:
>> 
>>> Hi everyone,
>>> 
>>> First of all, thank you all for your amazing achievement with Faust. I am
>>> delighted to use it and amazed by all this work. Regarding my problem, I
>>> try for some time now to implement a pitch tracker implementing
>>> autocorrelation, for a more reliable metering than the zero crossing
>>> method. I ended with the following version, strongly inspired from Tiziano
>>> Bole work :
>>> 
>>> import("stdfaust.lib");
>>> 
>>> BufferLength=4;
>>> 
>>> pitch(x) = ma.SR / max(M, 1) - ma.SR * (M == 0)
>>>  with {
>>>  AC(x, k) = sum(j, BufferLength, (x@(j))*(x@(j+k))) /   (BufferLength) ;
>>> // Correlating two signals, on the buffer length, ideally over 600 samples
>>> with actual SR
>>>  i = +(1) ~_ ;
>>>  U = AC(x,i)  >  AC(x,0)/2;             // Detection of a good
>>> correlation, AC(x,0) being the highest possible value, so its half becomes
>>> the detection threshold
>>>  V = AC(x,i)  <= AC(x,i+1);
>>>  W = AC(x,i+1) > AC(x,i+2);
>>>  Y = U: *(V) : *(W);
>>> 
>>>  N = (+(1) : *(1 - Y)) ~ _;
>>>  M = (N' + 1) : ba.sAndH(Y);
>>> };
>>> 
>>> process = pitch : hbargraph(“Frequency", 50, 2000);
>>> 
>>> The problem seems to be located in the Autocorrelation function :   AC(x,
>>> k) = sum(j, BufferLength, (x@(j))*(x@(j+k))) / (BufferLength) since the
>>> error says “can’t compute the min and max values of […] used in delay
>>> expression […] (probably a recursive signal).
>>> 
>>> Any chance to get it working? I do not see actually how to fix boundaries
>>> for the delay lines, or get rid of the recursive guess from the compiler.
>>> 
>>> Thanks for reading this,
>>> 
>>> Nicolas
>>> _______________________________________________
>>> Faudiostream-users mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/faudiostream-users
>>> 
> 



_______________________________________________
Faudiostream-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to