*/
+#include <math.h>
#include "Onset.h"
using std::string;
m_pv(0),
m_peakpick(0),
m_onsetdet(0),
- m_onsettype(aubio_onset_mkl),
+ m_onsettype(aubio_onset_complex),
m_threshold(0.3),
m_silence(-90),
m_channelCount(1)
m_stepSize = stepSize;
m_blockSize = blockSize;
- size_t processingBlockSize;
- if (m_onsettype == aubio_onset_energy ||
- m_onsettype == aubio_onset_hfc) {
- processingBlockSize = stepSize * 2;
- } else {
- processingBlockSize = stepSize * 4;
- }
-
m_ibuf = new_fvec(stepSize, channels);
m_onset = new_fvec(1, channels);
- m_fftgrain = new_cvec(processingBlockSize, channels);
- m_pv = new_aubio_pvoc(processingBlockSize, stepSize, channels);
+ m_fftgrain = new_cvec(blockSize, channels);
+ m_pv = new_aubio_pvoc(blockSize, stepSize, channels);
m_peakpick = new_aubio_peakpicker(m_threshold);
- m_onsetdet = new_aubio_onsetdetection(m_onsettype, processingBlockSize, channels);
+ m_onsetdet = new_aubio_onsetdetection(m_onsettype, blockSize, channels);
+
+ m_delay = Vamp::RealTime::frame2RealTime(4 * stepSize,
+ lrintf(m_inputSampleRate));
+
+ m_lastOnset = Vamp::RealTime::zeroTime - m_delay - m_delay;
return true;
}
size_t
Onset::getPreferredStepSize() const
{
- if (m_onsettype == aubio_onset_energy ||
- m_onsettype == aubio_onset_hfc) {
- return 512;
- } else {
- return 128;
- }
+ return 512;
}
size_t
Onset::getPreferredBlockSize() const
{
- return getPreferredStepSize();
+ return 2 * getPreferredStepSize();
}
Onset::ParameterList
desc.description = "Onset Detection Function Type";
desc.minValue = 0;
desc.maxValue = 6;
- desc.defaultValue = (int)aubio_onset_mkl;
+ desc.defaultValue = (int)aubio_onset_complex;
desc.isQuantized = true;
desc.quantizeStep = 1;
desc.valueNames.push_back("Energy Based");
d.description = "Onsets";
d.hasFixedBinCount = true;
d.binCount = 0;
- d.sampleType = OutputDescriptor::OneSamplePerStep;
+ d.sampleType = OutputDescriptor::VariableSampleRate;
+ d.sampleRate = 0;
list.push_back(d);
d = OutputDescriptor();
}
Onset::FeatureSet
-Onset::process(float **inputBuffers, Vamp::RealTime /* timestamp */)
+Onset::process(float **inputBuffers, Vamp::RealTime timestamp)
{
for (size_t i = 0; i < m_stepSize; ++i) {
for (size_t j = 0; j < m_channelCount; ++j) {
FeatureSet returnFeatures;
if (isonset) {
- returnFeatures[0].push_back(Feature());
+ if (timestamp - m_lastOnset >= m_delay) {
+ Feature onsettime;
+ onsettime.hasTimestamp = true;
+ if (timestamp < m_delay) timestamp = m_delay;
+ onsettime.timestamp = timestamp - m_delay;
+ returnFeatures[0].push_back(onsettime);
+ m_lastOnset = timestamp;
+ }
}
Feature feature;
for (size_t j = 0; j < m_channelCount; ++j) {