Vamp feature extraction plugins using Paul Brossier's Aubio library.
Centre for Digital Music, Queen Mary, University of London.
- This file copyright 2006 Chris Cannam.
+ This file copyright 2006-2008 Chris Cannam and QMUL.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
int
Silence::getPluginVersion() const
{
- return 1;
+ return 4;
}
string
bool
Silence::initialise(size_t channels, size_t stepSize, size_t blockSize)
{
- m_channelCount = channels;
+ if (channels != 1) {
+ std::cerr << "Silence::initialise: channels must be 1" << std::endl;
+ return false;
+ }
+
m_stepSize = stepSize;
m_blockSize = blockSize;
- m_ibuf = new_fvec(stepSize, channels);
- m_pbuf = new_fvec(stepSize, channels);
+ m_ibuf = new_fvec(stepSize);
+ m_pbuf = new_fvec(stepSize);
m_tmpptrs = new smpl_t *[channels];
return true;
OutputList list;
OutputDescriptor d;
- d.identifier = "silencestart";
- d.name = "Beginnings of Silent Regions";
- d.description = "Return a single instant at the point where each silent region begins";
+
+ d.identifier = "silent";
+ d.name = "Silent Regions";
+ d.description = "Return an interval covering each silent region";
d.hasFixedBinCount = true;
d.binCount = 0;
+ d.hasKnownExtents = false;
d.sampleType = OutputDescriptor::VariableSampleRate;
d.sampleRate = 0;
+ d.hasDuration = true;
list.push_back(d);
- d.identifier = "silenceend";
- d.name = "Ends of Silent Regions";
- d.description = "Return a single instant at the point where each silent region ends";
+ d.identifier = "noisy";
+ d.name = "Non-Silent Regions";
+ d.description = "Return an interval covering each non-silent region";
d.hasFixedBinCount = true;
d.binCount = 0;
+ d.hasKnownExtents = false;
d.sampleType = OutputDescriptor::VariableSampleRate;
d.sampleRate = 0;
+ d.hasDuration = true;
list.push_back(d);
d.identifier = "silencelevel";
feature.timestamp = featureStamp;
feature.values.push_back(silent ? 0 : 1);
returnFeatures[2].push_back(feature);
+
feature.values.clear();
- if (silent) {
- returnFeatures[0].push_back(feature);
- } else {
- returnFeatures[1].push_back(feature);
- }
+ if (!m_first) {
+ feature.timestamp = m_lastChange;
+ feature.hasDuration = true;
+ feature.duration = featureStamp - m_lastChange;
+ if (silent) {
+ // non-silent regions feature
+ // (becoming silent, so this is a non-silent region)
+ returnFeatures[1].push_back(feature);
+ } else {
+ // silent regions feature
+ // (becoming non-silent, so this is a silent region)
+ returnFeatures[0].push_back(feature);
+ }
+ }
+ m_lastChange = featureStamp;
m_prevSilent = silent;
m_first = false;
m_ibuf->data = m_pbuf->data;
m_pbuf->data = tmpdata;
+ m_lastTimestamp = timestamp;
+
return returnFeatures;
}
Silence::FeatureSet
Silence::getRemainingFeatures()
{
- return FeatureSet();
+ FeatureSet returnFeatures;
+
+// std::cerr << "Silence::getRemainingFeatures: m_lastTimestamp = " << m_lastTimestamp << ", m_lastChange = " << m_lastChange << ", m_apiVersion = " << m_apiVersion << ", m_prevSilent = " << m_prevSilent << std::endl;
+
+ if (m_lastTimestamp > m_lastChange) {
+
+ Feature feature;
+ feature.hasTimestamp = true;
+
+ feature.timestamp = m_lastChange;
+ feature.hasDuration = true;
+ feature.duration = m_lastTimestamp - m_lastChange;
+ if (m_prevSilent) {
+ // silent regions feature
+ returnFeatures[0].push_back(feature);
+ } else {
+ // non-silent regions feature
+ returnFeatures[1].push_back(feature);
+ }
+
+ if (!m_prevSilent) {
+ Feature silenceTestFeature;
+ silenceTestFeature.hasTimestamp = true;
+ silenceTestFeature.timestamp = m_lastTimestamp;
+ silenceTestFeature.values.push_back(0);
+ returnFeatures[2].push_back(silenceTestFeature);
+ }
+ }
+
+ return returnFeatures;
}