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 (mailto: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 (mailto: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"