Csound Csound-dev Csound-tekno Search About

[Csnd] Using Pvsftw for onset detection

Date2011-10-20 18:17
FromEd Costello
Subject[Csnd] Using Pvsftw for onset detection
Hey List,

I want to compare the summed amplitudes of consecutive spectral frames in order to make a note onset detector in Csound. It looks like I need to use pvsftw to accomplish this. I was just wondering how pvsftw works as I can't figure out how it goes about reading frames, does it just read each frame as they are streamed to it from a pvstanal or similar?
Thanks
Ed

Date2011-10-20 19:09
Frompeiman khosravi
SubjectRe: [Csnd] Using Pvsftw for onset detection
Hi Ed,

Yes.

The kflag will be 1 when a new frame is written. So something like
this would work:

kflag	pvsftw	fsrc,ifn		; export amps to table
if (kflag==1) then
;do something to the frame (I insert an UDO here)
	pvsftr	fsrc,ifn
endif


For this kind of thing I usually make a UDO and pass the ftable to it,
which is being read frame-by-frame.

I have an article that discusses this method and might be worth
looking at. http://www.csounds.com/journal/issue12/implementingFrequencyWarping.html

Best,

Peiman

On 20 October 2011 18:17, Ed Costello  wrote:
> Hey List,
> I want to compare the summed amplitudes of consecutive spectral frames in
> order to make a note onset detector in Csound. It looks like I need to
> use pvsftw to accomplish this. I was just wondering how pvsftw works as I
> can't figure out how it goes about reading frames, does it just read each
> frame as they are streamed to it from a pvstanal or similar?
> Thanks
> Ed


Send bugs reports to the Sourceforge bug tracker
            https://sourceforge.net/tracker/?group_id=81968&atid=564599
Discussions of bugs and features can be posted here
To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe csound"


Date2011-10-20 19:22
Frompeiman khosravi
SubjectRe: [Csnd] Using Pvsftw for onset detection
To be more specific.

The analysed frames streamed from 'pvsanal' are written to table
consecutively by 'pvsftw'. So if you want to get the bin data you need
to process your table on each frame (once the data has been written).
For this you can use kflag as demonstrated in my last reply.

So upon receiving each new frame you need to then loop through your
table indices in order to extract the data (now we can use the new t
signals too I guess for array operations).

Once you get used to it it's actually a piece of cake, much easier to
how fft data is dealt with in maxmsp.


P


On 20 October 2011 19:09, peiman khosravi  wrote:
> Hi Ed,
>
> Yes.
>
> The kflag will be 1 when a new frame is written. So something like
> this would work:
>
> kflag   pvsftw  fsrc,ifn                ; export amps to table
> if (kflag==1) then
> ;do something to the frame (I insert an UDO here)
>        pvsftr  fsrc,ifn
> endif
>
>
> For this kind of thing I usually make a UDO and pass the ftable to it,
> which is being read frame-by-frame.
>
> I have an article that discusses this method and might be worth
> looking at. http://www.csounds.com/journal/issue12/implementingFrequencyWarping.html
>
> Best,
>
> Peiman
>
> On 20 October 2011 18:17, Ed Costello  wrote:
>> Hey List,
>> I want to compare the summed amplitudes of consecutive spectral frames in
>> order to make a note onset detector in Csound. It looks like I need to
>> use pvsftw to accomplish this. I was just wondering how pvsftw works as I
>> can't figure out how it goes about reading frames, does it just read each
>> frame as they are streamed to it from a pvstanal or similar?
>> Thanks
>> Ed
>


Send bugs reports to the Sourceforge bug tracker
            https://sourceforge.net/tracker/?group_id=81968&atid=564599
Discussions of bugs and features can be posted here
To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe csound"


Date2011-10-20 19:24
Frompeiman khosravi
SubjectRe: [Csnd] Using Pvsftw for onset detection
* much easier [compared] to....

On 20 October 2011 19:22, peiman khosravi  wrote:
> To be more specific.
>
> The analysed frames streamed from 'pvsanal' are written to table
> consecutively by 'pvsftw'. So if you want to get the bin data you need
> to process your table on each frame (once the data has been written).
> For this you can use kflag as demonstrated in my last reply.
>
> So upon receiving each new frame you need to then loop through your
> table indices in order to extract the data (now we can use the new t
> signals too I guess for array operations).
>
> Once you get used to it it's actually a piece of cake, much easier to
> how fft data is dealt with in maxmsp.
>
>
> P
>
>
> On 20 October 2011 19:09, peiman khosravi  wrote:
>> Hi Ed,
>>
>> Yes.
>>
>> The kflag will be 1 when a new frame is written. So something like
>> this would work:
>>
>> kflag   pvsftw  fsrc,ifn                ; export amps to table
>> if (kflag==1) then
>> ;do something to the frame (I insert an UDO here)
>>        pvsftr  fsrc,ifn
>> endif
>>
>>
>> For this kind of thing I usually make a UDO and pass the ftable to it,
>> which is being read frame-by-frame.
>>
>> I have an article that discusses this method and might be worth
>> looking at. http://www.csounds.com/journal/issue12/implementingFrequencyWarping.html
>>
>> Best,
>>
>> Peiman
>>
>> On 20 October 2011 18:17, Ed Costello  wrote:
>>> Hey List,
>>> I want to compare the summed amplitudes of consecutive spectral frames in
>>> order to make a note onset detector in Csound. It looks like I need to
>>> use pvsftw to accomplish this. I was just wondering how pvsftw works as I
>>> can't figure out how it goes about reading frames, does it just read each
>>> frame as they are streamed to it from a pvstanal or similar?
>>> Thanks
>>> Ed
>>
>


Send bugs reports to the Sourceforge bug tracker
            https://sourceforge.net/tracker/?group_id=81968&atid=564599
Discussions of bugs and features can be posted here
To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe csound"


Date2011-10-20 20:05
FromEd Costello
SubjectRe: [Csnd] Using Pvsftw for onset detection
Thanks a million Pieman, 
It looks like it will be easier than expected to get onset detection working :)
Cheers
Ed

On 20 October 2011 19:24, peiman khosravi <peimankhosravi@gmail.com> wrote:
* much easier [compared] to....

On 20 October 2011 19:22, peiman khosravi <peimankhosravi@gmail.com> wrote:
> To be more specific.
>
> The analysed frames streamed from 'pvsanal' are written to table
> consecutively by 'pvsftw'. So if you want to get the bin data you need
> to process your table on each frame (once the data has been written).
> For this you can use kflag as demonstrated in my last reply.
>
> So upon receiving each new frame you need to then loop through your
> table indices in order to extract the data (now we can use the new t
> signals too I guess for array operations).
>
> Once you get used to it it's actually a piece of cake, much easier to
> how fft data is dealt with in maxmsp.
>
>
> P
>
>
> On 20 October 2011 19:09, peiman khosravi <peimankhosravi@gmail.com> wrote:
>> Hi Ed,
>>
>> Yes.
>>
>> The kflag will be 1 when a new frame is written. So something like
>> this would work:
>>
>> kflag   pvsftw  fsrc,ifn                ; export amps to table
>> if (kflag==1) then
>> ;do something to the frame (I insert an UDO here)
>>        pvsftr  fsrc,ifn
>> endif
>>
>>
>> For this kind of thing I usually make a UDO and pass the ftable to it,
>> which is being read frame-by-frame.
>>
>> I have an article that discusses this method and might be worth
>> looking at. http://www.csounds.com/journal/issue12/implementingFrequencyWarping.html
>>
>> Best,
>>
>> Peiman
>>
>> On 20 October 2011 18:17, Ed Costello <edwardcostello@gmail.com> wrote:
>>> Hey List,
>>> I want to compare the summed amplitudes of consecutive spectral frames in
>>> order to make a note onset detector in Csound. It looks like I need to
>>> use pvsftw to accomplish this. I was just wondering how pvsftw works as I
>>> can't figure out how it goes about reading frames, does it just read each
>>> frame as they are streamed to it from a pvstanal or similar?
>>> Thanks
>>> Ed
>>
>


Send bugs reports to the Sourceforge bug tracker
           https://sourceforge.net/tracker/?group_id=81968&atid=564599
Discussions of bugs and features can be posted here
To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe csound"



Date2011-10-20 20:08
Frompeiman khosravi
SubjectRe: [Csnd] Using Pvsftw for onset detection
I'd love to study your code when it's done :-)

P

On 20 October 2011 20:05, Ed Costello  wrote:
> Thanks a million Pieman,
> It looks like it will be easier than expected to get onset detection working
> :)
> Cheers
> Ed
>
> On 20 October 2011 19:24, peiman khosravi  wrote:
>>
>> * much easier [compared] to....
>>
>> On 20 October 2011 19:22, peiman khosravi 
>> wrote:
>> > To be more specific.
>> >
>> > The analysed frames streamed from 'pvsanal' are written to table
>> > consecutively by 'pvsftw'. So if you want to get the bin data you need
>> > to process your table on each frame (once the data has been written).
>> > For this you can use kflag as demonstrated in my last reply.
>> >
>> > So upon receiving each new frame you need to then loop through your
>> > table indices in order to extract the data (now we can use the new t
>> > signals too I guess for array operations).
>> >
>> > Once you get used to it it's actually a piece of cake, much easier to
>> > how fft data is dealt with in maxmsp.
>> >
>> >
>> > P
>> >
>> >
>> > On 20 October 2011 19:09, peiman khosravi 
>> > wrote:
>> >> Hi Ed,
>> >>
>> >> Yes.
>> >>
>> >> The kflag will be 1 when a new frame is written. So something like
>> >> this would work:
>> >>
>> >> kflag   pvsftw  fsrc,ifn                ; export amps to table
>> >> if (kflag==1) then
>> >> ;do something to the frame (I insert an UDO here)
>> >>        pvsftr  fsrc,ifn
>> >> endif
>> >>
>> >>
>> >> For this kind of thing I usually make a UDO and pass the ftable to it,
>> >> which is being read frame-by-frame.
>> >>
>> >> I have an article that discusses this method and might be worth
>> >> looking at.
>> >> http://www.csounds.com/journal/issue12/implementingFrequencyWarping.html
>> >>
>> >> Best,
>> >>
>> >> Peiman
>> >>
>> >> On 20 October 2011 18:17, Ed Costello  wrote:
>> >>> Hey List,
>> >>> I want to compare the summed amplitudes of consecutive spectral frames
>> >>> in
>> >>> order to make a note onset detector in Csound. It looks like I need to
>> >>> use pvsftw to accomplish this. I was just wondering how pvsftw works
>> >>> as I
>> >>> can't figure out how it goes about reading frames, does it just read
>> >>> each
>> >>> frame as they are streamed to it from a pvstanal or similar?
>> >>> Thanks
>> >>> Ed
>> >>
>> >
>>
>>
>> Send bugs reports to the Sourceforge bug tracker
>>            https://sourceforge.net/tracker/?group_id=81968&atid=564599
>> Discussions of bugs and features can be posted here
>> To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe
>> csound"
>>
>
>


Send bugs reports to the Sourceforge bug tracker
            https://sourceforge.net/tracker/?group_id=81968&atid=564599
Discussions of bugs and features can be posted here
To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe csound"


Date2011-10-20 20:13
FromEd Costello
SubjectRe: [Csnd] Using Pvsftw for onset detection
No problem, I'll try and get something up by the weekend, 
Ed

On 20 October 2011 20:08, peiman khosravi <peimankhosravi@gmail.com> wrote:
I'd love to study your code when it's done :-)

P

On 20 October 2011 20:05, Ed Costello <edwardcostello@gmail.com> wrote:
> Thanks a million Pieman,
> It looks like it will be easier than expected to get onset detection working
> :)
> Cheers
> Ed
>
> On 20 October 2011 19:24, peiman khosravi <peimankhosravi@gmail.com> wrote:
>>
>> * much easier [compared] to....
>>
>> On 20 October 2011 19:22, peiman khosravi <peimankhosravi@gmail.com>
>> wrote:
>> > To be more specific.
>> >
>> > The analysed frames streamed from 'pvsanal' are written to table
>> > consecutively by 'pvsftw'. So if you want to get the bin data you need
>> > to process your table on each frame (once the data has been written).
>> > For this you can use kflag as demonstrated in my last reply.
>> >
>> > So upon receiving each new frame you need to then loop through your
>> > table indices in order to extract the data (now we can use the new t
>> > signals too I guess for array operations).
>> >
>> > Once you get used to it it's actually a piece of cake, much easier to
>> > how fft data is dealt with in maxmsp.
>> >
>> >
>> > P
>> >
>> >
>> > On 20 October 2011 19:09, peiman khosravi <peimankhosravi@gmail.com>
>> > wrote:
>> >> Hi Ed,
>> >>
>> >> Yes.
>> >>
>> >> The kflag will be 1 when a new frame is written. So something like
>> >> this would work:
>> >>
>> >> kflag   pvsftw  fsrc,ifn                ; export amps to table
>> >> if (kflag==1) then
>> >> ;do something to the frame (I insert an UDO here)
>> >>        pvsftr  fsrc,ifn
>> >> endif
>> >>
>> >>
>> >> For this kind of thing I usually make a UDO and pass the ftable to it,
>> >> which is being read frame-by-frame.
>> >>
>> >> I have an article that discusses this method and might be worth
>> >> looking at.
>> >> http://www.csounds.com/journal/issue12/implementingFrequencyWarping.html
>> >>
>> >> Best,
>> >>
>> >> Peiman
>> >>
>> >> On 20 October 2011 18:17, Ed Costello <edwardcostello@gmail.com> wrote:
>> >>> Hey List,
>> >>> I want to compare the summed amplitudes of consecutive spectral frames
>> >>> in
>> >>> order to make a note onset detector in Csound. It looks like I need to
>> >>> use pvsftw to accomplish this. I was just wondering how pvsftw works
>> >>> as I
>> >>> can't figure out how it goes about reading frames, does it just read
>> >>> each
>> >>> frame as they are streamed to it from a pvstanal or similar?
>> >>> Thanks
>> >>> Ed
>> >>
>> >
>>
>>
>> Send bugs reports to the Sourceforge bug tracker
>>            https://sourceforge.net/tracker/?group_id=81968&atid=564599
>> Discussions of bugs and features can be posted here
>> To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe
>> csound"
>>
>
>


Send bugs reports to the Sourceforge bug tracker
           https://sourceforge.net/tracker/?group_id=81968&atid=564599
Discussions of bugs and features can be posted here
To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe csound"



Date2011-10-21 14:25
FromEdward Costello
SubjectRe: [Csnd] Using Pvsftw for onset detection
AttachmentsNone  None  

Date2011-10-21 14:34
Frompeiman khosravi
SubjectRe: [Csnd] Using Pvsftw for onset detection
Very nice. Thanks for sharing. I can't wait to study it.

Best,

Peiman

On 21 October 2011 14:25, Edward Costello  wrote:
> So this is what I came up with
> 
> 
> 
> 
> sr = 44100
> ksmps = 128
> nchnls = 2
> 0dbfs  = 1
>
> instr Init
> i_Threshold = 1.7
> i_MovingAverageSize = 64
>
> i_FFTSize = 1024
> i_HopSize = i_FFTSize / 4
> gi_AudioFileTable ftgen 0, 0, 0, -1, "major.wav", 0, 0, 1
> gi_PreviousMagnitudesTable ftgen 0, 0, i_FFTSize / 2, 2, 0
> gi_MovingAverageTable ftgen 0, 0, i_MovingAverageSize, 2, 0
> k_Trigger init 0
> gi_FFTFrameAmp ftgen 0, 0, i_FFTSize / 2, 2, 0
> f_AudioFile pvstanal 1, 1, 1, gi_AudioFileTable, 0, 0, 0, i_FFTSize,
> i_HopSize, 0
> k_Flag pvsftw f_AudioFile, gi_FFTFrameAmp
> if k_Flag == 1 then
> k_Index = 0
> k_Sum = 0
> k_Flux = 0
> AmpLoop:
>
> k_Amp table k_Index, gi_FFTFrameAmp
> k_PreviousAmp table k_Index, gi_PreviousMagnitudesTable
> k_Flux = k_Flux + abs(k_Amp - k_PreviousAmp)
> tablew k_Amp, k_Index, gi_PreviousMagnitudesTable
> loop_le k_Index, 1, i_FFTSize / 2, AmpLoop
> k_ShiftIndex = i_MovingAverageSize
> ShiftLoop:
>
>     k_Shift table k_ShiftIndex - 1, gi_MovingAverageTable
>     tablew k_Shift, k_ShiftIndex, gi_MovingAverageTable
>
> loop_ge k_ShiftIndex, 1, 0, ShiftLoop
>
> k_AverageSum = 0
> k_AverageIndex = 0
> k_Index = 0
> AverageLoop:
>
>     k_AverageVal table k_Index, gi_MovingAverageTable
> k_AverageSum = k_AverageSum + k_AverageVal
> loop_le k_Index, 1, i_MovingAverageSize, AverageLoop
> k_MovingAverage = k_AverageSum / i_MovingAverageSize
> tablew k_Flux, 0,gi_MovingAverageTable
> endif
> a_Out pvsynth f_AudioFile
> ; printk2 k_Flux
> ; printk2 k_MovingAverage,5
> if k_Flux > k_MovingAverage * i_Threshold then
> if k_Trigger == 0 then
> k_Trigger = 1
> schedkwhen k_Trigger, 0, 1, "Beep", 0, 0.05
> endif
> endif
> if k_Flux >= k_MovingAverage * i_Threshold then
> k_Trigger = 0
> endif
> outs a_Out, a_Out
> endin
> instr Beep
> ares vco2 .2, 440
> outs ares, ares
> endin
> 
> 
> i "Init" 0 10
>
> 
> 
>
> The amplitudes of each bin are read and are subtracted from the previous
> bins amplitude, the absolute value of this figure for every bin is added
> together and this gives the flux value, this value is then written to a
> table which is used to take a running average of the flux. An onset is
> detected when the current flux value is larger than the current running
> average value multiplied by a threshold value, which is 1.7 in this example.
> It works ok but there are still plenty of false positives, you really need
> to tune the running average size and threshold values for the best results.
> Ed
>
>
>
>
>
> On 20 October 2011 20:13, Ed Costello  wrote:
>
> No problem, I'll try and get something up by the weekend,
> Ed
>
> On 20 October 2011 20:08, peiman khosravi  wrote:
>
> I'd love to study your code when it's done :-)
>
> P
>
> On 20 October 2011 20:05, Ed Costello  wrote:
>> Thanks a million Pieman,
>> It looks like it will be easier than expected to get onset detection
>> working
>> :)
>> Cheers
>> Ed
>>
>> On 20 October 2011 19:24, peiman khosravi 
>> wrote:
>>>
>>> * much easier [compared] to....
>>>
>>> On 20 October 2011 19:22, peiman khosravi 
>>> wrote:
>>> > To be more specific.
>>> >
>>> > The analysed frames streamed from 'pvsanal' are written to table
>>> > consecutively by 'pvsftw'. So if you want to get the bin data you need
>>> > to process your table on each frame (once the data has been written).
>>> > For this you can use kflag as demonstrated in my last reply.
>>> >
>>> > So upon receiving each new frame you need to then loop through your
>>> > table indices in order to extract the data (now we can use the new t
>>> > signals too I guess for array operations).
>>> >
>>> > Once you get used to it it's actually a piece of cake, much easier to
>>> > how fft data is dealt with in maxmsp.
>>> >
>>> >
>>> > P
>>> >
>>> >
>>> > On 20 October 2011 19:09, peiman khosravi 
>>> > wrote:
>>> >> Hi Ed,
>>> >>
>>> >> Yes.
>>> >>
>>> >> The kflag will be 1 when a new frame is written. So something like
>>> >> this would work:
>>> >>
>>> >> kflag   pvsftw  fsrc,ifn                ; export amps to table
>>> >> if (kflag==1) then
>>> >> ;do something to the frame (I insert an UDO here)
>>> >>        pvsftr  fsrc,ifn
>>> >> endif
>>> >>
>>> >>
>>> >> For this kind of thing I usually make a UDO and pass the ftable to it,
>>> >> which is being read frame-by-frame.
>>> >>
>>> >> I have an article that discusses this method and might be worth
>>> >> looking at.
>>> >>
>>> >> http://www.csounds.com/journal/issue12/implementingFrequencyWarping.html
>>> >>
>>> >> Best,
>>> >>
>>> >> Peiman
>>> >>
>>> >> On 20 October 2011 18:17, Ed Costello 
>>> >> wrote:
>>> >>> Hey List,
>>> >>> I want to compare the summed amplitudes of consecutive spectral
>>> >>> frames
>>> >>> in
>>> >>> order to make a note onset detector in Csound. It looks like I need
>>> >>> to
>>> >>> use pvsftw to accomplish this. I was just wondering how pvsftw works
>>> >>> as I
>>> >>> can't figure out how it goes about reading frames, does it just read
>>> >>> each
>>> >>> frame as they are streamed to it from a pvstanal or similar?
>>> >>> Thanks
>>> >>> Ed
>>> >>
>>> >
>>>
>>>
>>> Send bugs reports to the Sourceforge bug tracker
>>>            https://sourceforge.net/tracker/?group_id=81968&atid=564599
>>> Discussions of bugs and features can be posted here
>>> To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe
>>> csound"
>>>
>>
>>
>
>
> Send bugs reports to the Sourceforge bug tracker
>            https://sourceforge.net/tracker/?group_id=81968&atid=564599
> Discussions of bugs and features can be posted here
> To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe
> csound"
>
>
>
>


Send bugs reports to the Sourceforge bug tracker
            https://sourceforge.net/tracker/?group_id=81968&atid=564599
Discussions of bugs and features can be posted here
To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe csound"


Date2011-10-21 17:54
FromEd Costello
SubjectRe: [Csnd] Using Pvsftw for onset detection
Would it be possible to do this faster than real time? It would be great to get the onsets as phase values of the waveform.

On 21 October 2011 14:34, peiman khosravi <peimankhosravi@gmail.com> wrote:
Very nice. Thanks for sharing. I can't wait to study it.

Best,

Peiman

On 21 October 2011 14:25, Edward Costello <edwardcostello@gmail.com> wrote:
> So this is what I came up with
> <CsoundSynthesizer>
> <CsOptions>
> </CsOptions>
> <CsInstruments>
> sr = 44100
> ksmps = 128
> nchnls = 2
> 0dbfs  = 1
>
> instr Init
> i_Threshold = 1.7
> i_MovingAverageSize = 64
>
> i_FFTSize = 1024
> i_HopSize = i_FFTSize / 4
> gi_AudioFileTable ftgen 0, 0, 0, -1, "major.wav", 0, 0, 1
> gi_PreviousMagnitudesTable ftgen 0, 0, i_FFTSize / 2, 2, 0
> gi_MovingAverageTable ftgen 0, 0, i_MovingAverageSize, 2, 0
> k_Trigger init 0
> gi_FFTFrameAmp ftgen 0, 0, i_FFTSize / 2, 2, 0
> f_AudioFile pvstanal 1, 1, 1, gi_AudioFileTable, 0, 0, 0, i_FFTSize,
> i_HopSize, 0
> k_Flag pvsftw f_AudioFile, gi_FFTFrameAmp
> if k_Flag == 1 then
> k_Index = 0
> k_Sum = 0
> k_Flux = 0
> AmpLoop:
>
> k_Amp table k_Index, gi_FFTFrameAmp
> k_PreviousAmp table k_Index, gi_PreviousMagnitudesTable
> k_Flux = k_Flux + abs(k_Amp - k_PreviousAmp)
> tablew k_Amp, k_Index, gi_PreviousMagnitudesTable
> loop_le k_Index, 1, i_FFTSize / 2, AmpLoop
> k_ShiftIndex = i_MovingAverageSize
> ShiftLoop:
>
>     k_Shift table k_ShiftIndex - 1, gi_MovingAverageTable
>     tablew k_Shift, k_ShiftIndex, gi_MovingAverageTable
>
> loop_ge k_ShiftIndex, 1, 0, ShiftLoop
>
> k_AverageSum = 0
> k_AverageIndex = 0
> k_Index = 0
> AverageLoop:
>
>     k_AverageVal table k_Index, gi_MovingAverageTable
> k_AverageSum = k_AverageSum + k_AverageVal
> loop_le k_Index, 1, i_MovingAverageSize, AverageLoop
> k_MovingAverage = k_AverageSum / i_MovingAverageSize
> tablew k_Flux, 0,gi_MovingAverageTable
> endif
> a_Out pvsynth f_AudioFile
> ; printk2 k_Flux
> ; printk2 k_MovingAverage,5
> if k_Flux > k_MovingAverage * i_Threshold then
> if k_Trigger == 0 then
> k_Trigger = 1
> schedkwhen k_Trigger, 0, 1, "Beep", 0, 0.05
> endif
> endif
> if k_Flux >= k_MovingAverage * i_Threshold then
> k_Trigger = 0
> endif
> outs a_Out, a_Out
> endin
> instr Beep
> ares vco2 .2, 440
> outs ares, ares
> endin
> </CsInstruments>
> <CsScore>
> i "Init" 0 10
>
> </CsScore>
> </CsoundSynthesizer>
>
> The amplitudes of each bin are read and are subtracted from the previous
> bins amplitude, the absolute value of this figure for every bin is added
> together and this gives the flux value, this value is then written to a
> table which is used to take a running average of the flux. An onset is
> detected when the current flux value is larger than the current running
> average value multiplied by a threshold value, which is 1.7 in this example.
> It works ok but there are still plenty of false positives, you really need
> to tune the running average size and threshold values for the best results.
> Ed
>
>
>
>
>
> On 20 October 2011 20:13, Ed Costello <edwardcostello@gmail.com> wrote:
>
> No problem, I'll try and get something up by the weekend,
> Ed
>
> On 20 October 2011 20:08, peiman khosravi <peimankhosravi@gmail.com> wrote:
>
> I'd love to study your code when it's done :-)
>
> P
>
> On 20 October 2011 20:05, Ed Costello <edwardcostello@gmail.com> wrote:
>> Thanks a million Pieman,
>> It looks like it will be easier than expected to get onset detection
>> working
>> :)
>> Cheers
>> Ed
>>
>> On 20 October 2011 19:24, peiman khosravi <peimankhosravi@gmail.com>
>> wrote:
>>>
>>> * much easier [compared] to....
>>>
>>> On 20 October 2011 19:22, peiman khosravi <peimankhosravi@gmail.com>
>>> wrote:
>>> > To be more specific.
>>> >
>>> > The analysed frames streamed from 'pvsanal' are written to table
>>> > consecutively by 'pvsftw'. So if you want to get the bin data you need
>>> > to process your table on each frame (once the data has been written).
>>> > For this you can use kflag as demonstrated in my last reply.
>>> >
>>> > So upon receiving each new frame you need to then loop through your
>>> > table indices in order to extract the data (now we can use the new t
>>> > signals too I guess for array operations).
>>> >
>>> > Once you get used to it it's actually a piece of cake, much easier to
>>> > how fft data is dealt with in maxmsp.
>>> >
>>> >
>>> > P
>>> >
>>> >
>>> > On 20 October 2011 19:09, peiman khosravi <peimankhosravi@gmail.com>
>>> > wrote:
>>> >> Hi Ed,
>>> >>
>>> >> Yes.
>>> >>
>>> >> The kflag will be 1 when a new frame is written. So something like
>>> >> this would work:
>>> >>
>>> >> kflag   pvsftw  fsrc,ifn                ; export amps to table
>>> >> if (kflag==1) then
>>> >> ;do something to the frame (I insert an UDO here)
>>> >>        pvsftr  fsrc,ifn
>>> >> endif
>>> >>
>>> >>
>>> >> For this kind of thing I usually make a UDO and pass the ftable to it,
>>> >> which is being read frame-by-frame.
>>> >>
>>> >> I have an article that discusses this method and might be worth
>>> >> looking at.
>>> >>
>>> >> http://www.csounds.com/journal/issue12/implementingFrequencyWarping.html
>>> >>
>>> >> Best,
>>> >>
>>> >> Peiman
>>> >>
>>> >> On 20 October 2011 18:17, Ed Costello <edwardcostello@gmail.com>
>>> >> wrote:
>>> >>> Hey List,
>>> >>> I want to compare the summed amplitudes of consecutive spectral
>>> >>> frames
>>> >>> in
>>> >>> order to make a note onset detector in Csound. It looks like I need
>>> >>> to
>>> >>> use pvsftw to accomplish this. I was just wondering how pvsftw works
>>> >>> as I
>>> >>> can't figure out how it goes about reading frames, does it just read
>>> >>> each
>>> >>> frame as they are streamed to it from a pvstanal or similar?
>>> >>> Thanks
>>> >>> Ed
>>> >>
>>> >
>>>
>>>
>>> Send bugs reports to the Sourceforge bug tracker
>>>            https://sourceforge.net/tracker/?group_id=81968&atid=564599
>>> Discussions of bugs and features can be posted here
>>> To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe
>>> csound"
>>>
>>
>>
>
>
> Send bugs reports to the Sourceforge bug tracker
>            https://sourceforge.net/tracker/?group_id=81968&atid=564599
> Discussions of bugs and features can be posted here
> To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe
> csound"
>
>
>
>


Send bugs reports to the Sourceforge bug tracker
           https://sourceforge.net/tracker/?group_id=81968&atid=564599
Discussions of bugs and features can be posted here
To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe csound"



Date2011-10-21 19:01
Frompeiman khosravi
SubjectRe: [Csnd] Using Pvsftw for onset detection
You could run the CSD in non-real-time and write the onset times to a
text-file for later use.

P

On 21 October 2011 17:54, Ed Costello  wrote:
> Would it be possible to do this faster than real time? It would be great to
> get the onsets as phase values of the waveform.
>
> On 21 October 2011 14:34, peiman khosravi  wrote:
>>
>> Very nice. Thanks for sharing. I can't wait to study it.
>>
>> Best,
>>
>> Peiman
>>
>> On 21 October 2011 14:25, Edward Costello 
>> wrote:
>> > So this is what I came up with
>> > 
>> > 
>> > 
>> > 
>> > sr = 44100
>> > ksmps = 128
>> > nchnls = 2
>> > 0dbfs  = 1
>> >
>> > instr Init
>> > i_Threshold = 1.7
>> > i_MovingAverageSize = 64
>> >
>> > i_FFTSize = 1024
>> > i_HopSize = i_FFTSize / 4
>> > gi_AudioFileTable ftgen 0, 0, 0, -1, "major.wav", 0, 0, 1
>> > gi_PreviousMagnitudesTable ftgen 0, 0, i_FFTSize / 2, 2, 0
>> > gi_MovingAverageTable ftgen 0, 0, i_MovingAverageSize, 2, 0
>> > k_Trigger init 0
>> > gi_FFTFrameAmp ftgen 0, 0, i_FFTSize / 2, 2, 0
>> > f_AudioFile pvstanal 1, 1, 1, gi_AudioFileTable, 0, 0, 0, i_FFTSize,
>> > i_HopSize, 0
>> > k_Flag pvsftw f_AudioFile, gi_FFTFrameAmp
>> > if k_Flag == 1 then
>> > k_Index = 0
>> > k_Sum = 0
>> > k_Flux = 0
>> > AmpLoop:
>> >
>> > k_Amp table k_Index, gi_FFTFrameAmp
>> > k_PreviousAmp table k_Index, gi_PreviousMagnitudesTable
>> > k_Flux = k_Flux + abs(k_Amp - k_PreviousAmp)
>> > tablew k_Amp, k_Index, gi_PreviousMagnitudesTable
>> > loop_le k_Index, 1, i_FFTSize / 2, AmpLoop
>> > k_ShiftIndex = i_MovingAverageSize
>> > ShiftLoop:
>> >
>> >     k_Shift table k_ShiftIndex - 1, gi_MovingAverageTable
>> >     tablew k_Shift, k_ShiftIndex, gi_MovingAverageTable
>> >
>> > loop_ge k_ShiftIndex, 1, 0, ShiftLoop
>> >
>> > k_AverageSum = 0
>> > k_AverageIndex = 0
>> > k_Index = 0
>> > AverageLoop:
>> >
>> >     k_AverageVal table k_Index, gi_MovingAverageTable
>> > k_AverageSum = k_AverageSum + k_AverageVal
>> > loop_le k_Index, 1, i_MovingAverageSize, AverageLoop
>> > k_MovingAverage = k_AverageSum / i_MovingAverageSize
>> > tablew k_Flux, 0,gi_MovingAverageTable
>> > endif
>> > a_Out pvsynth f_AudioFile
>> > ; printk2 k_Flux
>> > ; printk2 k_MovingAverage,5
>> > if k_Flux > k_MovingAverage * i_Threshold then
>> > if k_Trigger == 0 then
>> > k_Trigger = 1
>> > schedkwhen k_Trigger, 0, 1, "Beep", 0, 0.05
>> > endif
>> > endif
>> > if k_Flux >= k_MovingAverage * i_Threshold then
>> > k_Trigger = 0
>> > endif
>> > outs a_Out, a_Out
>> > endin
>> > instr Beep
>> > ares vco2 .2, 440
>> > outs ares, ares
>> > endin
>> > 
>> > 
>> > i "Init" 0 10
>> >
>> > 
>> > 
>> >
>> > The amplitudes of each bin are read and are subtracted from the previous
>> > bins amplitude, the absolute value of this figure for every bin is added
>> > together and this gives the flux value, this value is then written to a
>> > table which is used to take a running average of the flux. An onset is
>> > detected when the current flux value is larger than the current running
>> > average value multiplied by a threshold value, which is 1.7 in this
>> > example.
>> > It works ok but there are still plenty of false positives, you really
>> > need
>> > to tune the running average size and threshold values for the best
>> > results.
>> > Ed
>> >
>> >
>> >
>> >
>> >
>> > On 20 October 2011 20:13, Ed Costello  wrote:
>> >
>> > No problem, I'll try and get something up by the weekend,
>> > Ed
>> >
>> > On 20 October 2011 20:08, peiman khosravi 
>> > wrote:
>> >
>> > I'd love to study your code when it's done :-)
>> >
>> > P
>> >
>> > On 20 October 2011 20:05, Ed Costello  wrote:
>> >> Thanks a million Pieman,
>> >> It looks like it will be easier than expected to get onset detection
>> >> working
>> >> :)
>> >> Cheers
>> >> Ed
>> >>
>> >> On 20 October 2011 19:24, peiman khosravi 
>> >> wrote:
>> >>>
>> >>> * much easier [compared] to....
>> >>>
>> >>> On 20 October 2011 19:22, peiman khosravi 
>> >>> wrote:
>> >>> > To be more specific.
>> >>> >
>> >>> > The analysed frames streamed from 'pvsanal' are written to table
>> >>> > consecutively by 'pvsftw'. So if you want to get the bin data you
>> >>> > need
>> >>> > to process your table on each frame (once the data has been
>> >>> > written).
>> >>> > For this you can use kflag as demonstrated in my last reply.
>> >>> >
>> >>> > So upon receiving each new frame you need to then loop through your
>> >>> > table indices in order to extract the data (now we can use the new t
>> >>> > signals too I guess for array operations).
>> >>> >
>> >>> > Once you get used to it it's actually a piece of cake, much easier
>> >>> > to
>> >>> > how fft data is dealt with in maxmsp.
>> >>> >
>> >>> >
>> >>> > P
>> >>> >
>> >>> >
>> >>> > On 20 October 2011 19:09, peiman khosravi 
>> >>> > wrote:
>> >>> >> Hi Ed,
>> >>> >>
>> >>> >> Yes.
>> >>> >>
>> >>> >> The kflag will be 1 when a new frame is written. So something like
>> >>> >> this would work:
>> >>> >>
>> >>> >> kflag   pvsftw  fsrc,ifn                ; export amps to table
>> >>> >> if (kflag==1) then
>> >>> >> ;do something to the frame (I insert an UDO here)
>> >>> >>        pvsftr  fsrc,ifn
>> >>> >> endif
>> >>> >>
>> >>> >>
>> >>> >> For this kind of thing I usually make a UDO and pass the ftable to
>> >>> >> it,
>> >>> >> which is being read frame-by-frame.
>> >>> >>
>> >>> >> I have an article that discusses this method and might be worth
>> >>> >> looking at.
>> >>> >>
>> >>> >>
>> >>> >> http://www.csounds.com/journal/issue12/implementingFrequencyWarping.html
>> >>> >>
>> >>> >> Best,
>> >>> >>
>> >>> >> Peiman
>> >>> >>
>> >>> >> On 20 October 2011 18:17, Ed Costello 
>> >>> >> wrote:
>> >>> >>> Hey List,
>> >>> >>> I want to compare the summed amplitudes of consecutive spectral
>> >>> >>> frames
>> >>> >>> in
>> >>> >>> order to make a note onset detector in Csound. It looks like I
>> >>> >>> need
>> >>> >>> to
>> >>> >>> use pvsftw to accomplish this. I was just wondering how pvsftw
>> >>> >>> works
>> >>> >>> as I
>> >>> >>> can't figure out how it goes about reading frames, does it just
>> >>> >>> read
>> >>> >>> each
>> >>> >>> frame as they are streamed to it from a pvstanal or similar?
>> >>> >>> Thanks
>> >>> >>> Ed
>> >>> >>
>> >>> >
>> >>>
>> >>>
>> >>> Send bugs reports to the Sourceforge bug tracker
>> >>>            https://sourceforge.net/tracker/?group_id=81968&atid=564599
>> >>> Discussions of bugs and features can be posted here
>> >>> To unsubscribe, send email sympa@lists.bath.ac.uk with body
>> >>> "unsubscribe
>> >>> csound"
>> >>>
>> >>
>> >>
>> >
>> >
>> > Send bugs reports to the Sourceforge bug tracker
>> >            https://sourceforge.net/tracker/?group_id=81968&atid=564599
>> > Discussions of bugs and features can be posted here
>> > To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe
>> > csound"
>> >
>> >
>> >
>> >
>>
>>
>> Send bugs reports to the Sourceforge bug tracker
>>            https://sourceforge.net/tracker/?group_id=81968&atid=564599
>> Discussions of bugs and features can be posted here
>> To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe
>> csound"
>>
>
>


Send bugs reports to the Sourceforge bug tracker
            https://sourceforge.net/tracker/?group_id=81968&atid=564599
Discussions of bugs and features can be posted here
To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe csound"