annotate plugins/SpecDesc.cpp @ 198:3a76aa26b578 tip master

wscript: check for 64bit using sys.maxsize (closes #3)
author Paul Brossier <piem@piem.org>
date Mon, 04 Dec 2017 01:42:19 +0100
parents 767ead1cee18
children
rev   line source
piem@89 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
piem@89 2
piem@89 3 /*
piem@89 4 Vamp feature extraction plugins using Paul Brossier's Aubio library.
piem@89 5
piem@89 6 Copyright (C) 2006-2015 Paul Brossier <piem@aubio.org>
piem@89 7
piem@110 8 This file is part of vamp-aubio-plugins.
piem@89 9
piem@89 10 vamp-aubio is free software: you can redistribute it and/or modify
piem@89 11 it under the terms of the GNU General Public License as published by
piem@89 12 the Free Software Foundation, either version 3 of the License, or
piem@89 13 (at your option) any later version.
piem@89 14
piem@89 15 vamp-aubio is distributed in the hope that it will be useful,
piem@89 16 but WITHOUT ANY WARRANTY; without even the implied warranty of
piem@89 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
piem@89 18 GNU General Public License for more details.
piem@89 19
piem@89 20 You should have received a copy of the GNU General Public License
piem@89 21 along with aubio. If not, see <http://www.gnu.org/licenses/>.
piem@89 22
piem@89 23 */
piem@89 24
piem@89 25 #include <math.h>
piem@89 26 #include "SpecDesc.h"
piem@89 27
piem@89 28 using std::string;
piem@89 29 using std::vector;
piem@89 30 using std::cerr;
piem@89 31 using std::endl;
piem@89 32
piem@89 33 SpecDesc::SpecDesc(float inputSampleRate) :
piem@89 34 Plugin(inputSampleRate),
piem@89 35 m_ibuf(0),
piem@89 36 m_pvoc(0),
piem@89 37 m_ispec(0),
piem@89 38 m_specdesc(0),
piem@89 39 m_out(0),
piem@89 40 m_specdesctype(SpecDescFlux)
piem@89 41 {
piem@89 42 }
piem@89 43
piem@89 44 SpecDesc::~SpecDesc()
piem@89 45 {
piem@89 46 if (m_specdesc) del_aubio_specdesc(m_specdesc);
piem@89 47 if (m_pvoc) del_aubio_pvoc(m_pvoc);
piem@89 48 if (m_ibuf) del_fvec(m_ibuf);
piem@89 49 if (m_ispec) del_cvec(m_ispec);
piem@89 50 if (m_out) del_fvec(m_out);
piem@89 51 }
piem@89 52
piem@89 53 string
piem@89 54 SpecDesc::getIdentifier() const
piem@89 55 {
piem@89 56 return "aubiospecdesc";
piem@89 57 }
piem@89 58
piem@89 59 string
piem@89 60 SpecDesc::getName() const
piem@89 61 {
piem@89 62 return "Aubio Spectral Descriptor";
piem@89 63 }
piem@89 64
piem@89 65 string
piem@89 66 SpecDesc::getDescription() const
piem@89 67 {
piem@89 68 return "Compute spectral descriptor";
piem@89 69 }
piem@89 70
piem@89 71 string
piem@89 72 SpecDesc::getMaker() const
piem@89 73 {
piem@89 74 return "Paul Brossier";
piem@89 75 }
piem@89 76
piem@89 77 int
piem@89 78 SpecDesc::getPluginVersion() const
piem@89 79 {
piem@89 80 return 2;
piem@89 81 }
piem@89 82
piem@89 83 string
piem@89 84 SpecDesc::getCopyright() const
piem@89 85 {
piem@89 86 return "GPL";
piem@89 87 }
piem@89 88
piem@89 89 bool
piem@89 90 SpecDesc::initialise(size_t channels, size_t stepSize, size_t blockSize)
piem@89 91 {
piem@89 92 if (channels != 1) {
piem@89 93 std::cerr << "SpecDesc::initialise: channels must be 1" << std::endl;
piem@89 94 return false;
piem@89 95 }
piem@89 96
piem@89 97 m_stepSize = stepSize;
piem@89 98 m_blockSize = blockSize;
piem@89 99
piem@89 100 m_ibuf = new_fvec(stepSize);
piem@89 101 m_ispec = new_cvec(blockSize);
piem@89 102 m_out = new_fvec(1);
piem@89 103
piem@89 104 reset();
piem@89 105
piem@89 106 return true;
piem@89 107 }
piem@89 108
piem@89 109 void
piem@89 110 SpecDesc::reset()
piem@89 111 {
piem@89 112 if (m_pvoc) del_aubio_pvoc(m_pvoc);
piem@89 113 if (m_specdesc) del_aubio_specdesc(m_specdesc);
piem@89 114
piem@89 115 m_specdesc = new_aubio_specdesc
piem@89 116 (const_cast<char *>(getAubioNameForSpecDescType(m_specdesctype)),
piem@89 117 m_blockSize);
piem@89 118
piem@89 119 m_pvoc = new_aubio_pvoc(m_blockSize, m_stepSize);
piem@89 120 }
piem@89 121
piem@89 122 size_t
piem@89 123 SpecDesc::getPreferredStepSize() const
piem@89 124 {
piem@89 125 return 512;
piem@89 126 }
piem@89 127
piem@89 128 size_t
piem@89 129 SpecDesc::getPreferredBlockSize() const
piem@89 130 {
piem@89 131 return 2 * getPreferredStepSize();
piem@89 132 }
piem@89 133
piem@89 134 SpecDesc::ParameterList
piem@89 135 SpecDesc::getParameterDescriptors() const
piem@89 136 {
piem@89 137 ParameterList list;
piem@89 138
piem@89 139 ParameterDescriptor desc;
piem@89 140 desc.identifier = "specdesctype";
piem@89 141 desc.name = "Spectral Descriptor Type";
piem@89 142 desc.description = "Type of spectral descriptor to use";
piem@89 143 desc.minValue = 0;
piem@89 144 desc.maxValue = 7;
piem@89 145 desc.defaultValue = (int)SpecDescFlux;
piem@89 146 desc.isQuantized = true;
piem@89 147 desc.quantizeStep = 1;
piem@89 148 desc.valueNames.push_back("Spectral Flux");
piem@89 149 desc.valueNames.push_back("Spectral Centroid");
piem@89 150 desc.valueNames.push_back("Spectral Spread");
piem@89 151 desc.valueNames.push_back("Spectral Skewness");
piem@89 152 desc.valueNames.push_back("Spectral Kurtosis");
piem@89 153 desc.valueNames.push_back("Spectral Slope");
piem@89 154 desc.valueNames.push_back("Spectral Decrease");
piem@89 155 desc.valueNames.push_back("Spectral Rolloff");
piem@89 156 list.push_back(desc);
piem@89 157
piem@89 158 return list;
piem@89 159 }
piem@89 160
piem@89 161 float
piem@89 162 SpecDesc::getParameter(std::string param) const
piem@89 163 {
piem@89 164 if (param == "specdesctype") {
piem@89 165 return m_specdesctype;
piem@89 166 } else {
piem@89 167 return 0.0;
piem@89 168 }
piem@89 169 }
piem@89 170
piem@89 171 void
piem@89 172 SpecDesc::setParameter(std::string param, float value)
piem@89 173 {
piem@89 174 if (param == "specdesctype") {
piem@89 175 switch (lrintf(value)) {
piem@89 176 case 0: m_specdesctype = SpecDescFlux; break;
piem@89 177 case 1: m_specdesctype = SpecDescCentroid; break;
piem@89 178 case 2: m_specdesctype = SpecDescSpread; break;
piem@89 179 case 3: m_specdesctype = SpecDescSkeweness; break;
piem@89 180 case 4: m_specdesctype = SpecDescKurtosis; break;
piem@89 181 case 5: m_specdesctype = SpecDescSlope; break;
piem@89 182 case 6: m_specdesctype = SpecDescDecrease; break;
piem@89 183 case 7: m_specdesctype = SpecDescRolloff; break;
piem@89 184 }
piem@89 185 }
piem@89 186 }
piem@89 187
piem@89 188 SpecDesc::OutputList
piem@89 189 SpecDesc::getOutputDescriptors() const
piem@89 190 {
piem@89 191 OutputList list;
piem@89 192
piem@89 193 OutputDescriptor d;
piem@89 194 d.identifier = "specdesc";
piem@89 195 d.name = "Spectral descriptor output";
piem@89 196 d.description = "Output of the spectral descpriptor";
piem@89 197 d.binCount = 1;
piem@89 198 d.isQuantized = true;
piem@89 199 d.quantizeStep = 1.0;
piem@89 200 d.sampleType = OutputDescriptor::OneSamplePerStep;
piem@89 201 list.push_back(d);
piem@89 202
piem@89 203 return list;
piem@89 204 }
piem@89 205
piem@89 206 SpecDesc::FeatureSet
piem@89 207 SpecDesc::process(const float *const *inputBuffers,
piem@134 208 UNUSED Vamp::RealTime timestamp)
piem@89 209 {
piem@89 210 for (size_t i = 0; i < m_stepSize; ++i) {
piem@89 211 fvec_set_sample(m_ibuf, inputBuffers[0][i], i);
piem@89 212 }
piem@89 213
piem@89 214 aubio_pvoc_do(m_pvoc, m_ibuf, m_ispec);
piem@89 215 aubio_specdesc_do(m_specdesc, m_ispec, m_out);
piem@89 216
piem@89 217 FeatureSet returnFeatures;
piem@89 218
piem@89 219 Feature specdesc;
piem@89 220 specdesc.hasTimestamp = false;
piem@89 221 specdesc.values.push_back(m_out->data[0]);
piem@89 222 returnFeatures[0].push_back(specdesc);
piem@89 223
piem@89 224 return returnFeatures;
piem@89 225 }
piem@89 226
piem@89 227 SpecDesc::FeatureSet
piem@89 228 SpecDesc::getRemainingFeatures()
piem@89 229 {
piem@89 230 return FeatureSet();
piem@89 231 }
piem@89 232