Mercurial > hg > silvet
changeset 246:70773820e719 norm eval-norm-u4
Use flattendynamics code within Silvet
author | Chris Cannam |
---|---|
date | Tue, 22 Jul 2014 16:11:20 +0100 |
parents | 4411aff3df52 |
children | 6b7e78cf96c9 |
files | .hgsubstate Makefile.inc src/Silvet.cpp src/Silvet.h |
diffstat | 4 files changed, 49 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgsubstate Tue Jul 22 15:40:45 2014 +0100 +++ b/.hgsubstate Tue Jul 22 16:11:20 2014 +0100 @@ -1,3 +1,3 @@ a2621605a8c2119bb063c59e83f4fe792a58e4ac bqvec e6b00b4788bedadb1ca855ea4f67a765fbe52034 constant-q-cpp -0e28664bc4fc91ad086cc6cb0ad83956754e5201 flattendynamics +7bb35203a7bd254b08aad37fdc11b67393401ba7 flattendynamics
--- a/Makefile.inc Tue Jul 22 15:40:45 2014 +0100 +++ b/Makefile.inc Tue Jul 22 16:11:20 2014 +0100 @@ -5,6 +5,7 @@ CQ_DIR ?= constant-q-cpp BQVEC_DIR ?= bqvec/src +FD_DIR ?= flattendynamics PLUGIN_EXT ?= .so @@ -12,7 +13,7 @@ CC ?= gcc CFLAGS := $(CFLAGS) -CXXFLAGS := $(CFLAGS) -I. -I$(VAMPSDK_DIR) -I$(CQ_DIR) -I$(BQVEC_DIR) $(CXXFLAGS) +CXXFLAGS := $(CFLAGS) -I. -I$(VAMPSDK_DIR) -I$(CQ_DIR) -I$(BQVEC_DIR) -I$(FD_DIR) $(CXXFLAGS) LDFLAGS := $(LDFLAGS) PLUGIN_LDFLAGS := $(LDFLAGS) $(PLUGIN_LDFLAGS) @@ -25,8 +26,11 @@ BQVEC_HEADERS := $(BQVEC_DIR)/Allocators.h $(BQVEC_DIR)/Restrict.h $(BQVEC_DIR)/VectorOps.h BQVEC_SOURCES := $(BQVEC_DIR)/Allocators.cpp -HEADERS := $(PLUGIN_HEADERS) $(BQVEC_HEADERS) -SOURCES := $(PLUGIN_SOURCES) $(BQVEC_SOURCES) +FD_HEADERS := $(FD_DIR)/flattendynamics-ladspa.h +FD_SOURCES := $(FD_DIR)/flattendynamics-ladspa.cpp + +HEADERS := $(PLUGIN_HEADERS) $(BQVEC_HEADERS) $(FD_HEADERS) +SOURCES := $(PLUGIN_SOURCES) $(BQVEC_SOURCES) $(FD_SOURCES) OBJECTS := $(SOURCES:.cpp=.o) OBJECTS := $(OBJECTS:.c=.o) @@ -50,17 +54,20 @@ src/Silvet.o: src/Silvet.h src/MedianFilter.h src/Instruments.h src/EM.h src/Silvet.o: constant-q-cpp/src/dsp/Resampler.h +src/Silvet.o: flattendynamics/flattendynamics-ladspa.h src/EM.o: src/EM.h src/Instruments.h src/Instruments.o: src/Instruments.h data/include/templates.h src/Instruments.o: data/include/bassoon.h data/include/cello.h src/Instruments.o: data/include/clarinet.h data/include/flute.h src/Instruments.o: data/include/guitar.h data/include/horn.h src/Instruments.o: data/include/oboe.h data/include/tenorsax.h -src/Instruments.o: data/include/violin.h data/include/piano1.h -src/Instruments.o: data/include/piano2.h data/include/piano3.h +src/Instruments.o: data/include/violin.h data/include/viola.h +src/Instruments.o: data/include/piano1.h data/include/piano2.h +src/Instruments.o: data/include/piano3.h data/include/pianorwc.h src/libmain.o: src/Silvet.h src/MedianFilter.h src/Instruments.h bqvec/src/Allocators.o: bqvec/src/Allocators.h bqvec/src/VectorOps.h bqvec/src/Allocators.o: bqvec/src/Restrict.h +flattendynamics/flattendynamics-ladspa.o: flattendynamics/flattendynamics-ladspa.h src/Silvet.o: src/MedianFilter.h src/Instruments.h bqvec/src/Allocators.o: bqvec/src/VectorOps.h bqvec/src/Restrict.h bqvec/src/VectorOps.o: bqvec/src/Restrict.h
--- a/src/Silvet.cpp Tue Jul 22 15:40:45 2014 +0100 +++ b/src/Silvet.cpp Tue Jul 22 16:11:20 2014 +0100 @@ -20,6 +20,7 @@ #include "MedianFilter.h" #include "constant-q-cpp/src/dsp/Resampler.h" +#include "flattendynamics-ladspa.h" #include <vector> @@ -38,6 +39,7 @@ Plugin(inputSampleRate), m_instruments(InstrumentPack::listInstrumentPacks()), m_resampler(0), + m_flattener(0), m_cq(0), m_hqMode(true), m_fineTuning(false), @@ -49,6 +51,7 @@ Silvet::~Silvet() { delete m_resampler; + delete m_flattener; delete m_cq; for (int i = 0; i < (int)m_postFilter.size(); ++i) { delete m_postFilter[i]; @@ -230,7 +233,7 @@ d.hasKnownExtents = false; d.isQuantized = false; d.sampleType = OutputDescriptor::VariableSampleRate; - d.sampleRate = m_inputSampleRate / (m_cq ? m_cq->getColumnHop() : 62); + d.sampleRate = processingSampleRate / (m_cq ? m_cq->getColumnHop() : 62); d.hasDuration = true; m_notesOutputNo = list.size(); list.push_back(d); @@ -346,6 +349,7 @@ Silvet::reset() { delete m_resampler; + delete m_flattener; delete m_cq; if (m_inputSampleRate != processingSampleRate) { @@ -354,6 +358,9 @@ m_resampler = 0; } + m_flattener = new FlattenDynamics(m_inputSampleRate); // before resampling + m_flattener->reset(); + double minFreq = 27.5; if (!m_hqMode) { @@ -388,6 +395,7 @@ m_postFilter.push_back(new MedianFilter<double>(3)); } m_pianoRoll.clear(); + m_inputGains.clear(); m_columnCount = 0; m_startTime = RealTime::zeroTime; } @@ -398,17 +406,29 @@ if (m_columnCount == 0) { m_startTime = timestamp; } + + vector<float> flattened(m_blockSize); + float gain = 1.f; + m_flattener->connectInputPort + (FlattenDynamics::AudioInputPort, inputBuffers[0]); + m_flattener->connectOutputPort + (FlattenDynamics::AudioOutputPort, &flattened[0]); + m_flattener->connectOutputPort + (FlattenDynamics::GainOutputPort, &gain); + m_flattener->process(m_blockSize); + + m_inputGains.push_back(gain); vector<double> data; for (int i = 0; i < m_blockSize; ++i) { - double d = inputBuffers[0][i]; + double d = flattened[i]; data.push_back(d); } if (m_resampler) { data = m_resampler->process(data.data(), data.size()); } - + Grid cqout = m_cq->process(data); FeatureSet fs = transcribe(cqout); return fs; @@ -777,7 +797,16 @@ } } - int v = strength * 2; + //!!! todo: do something with input gain. Presumably we need + //!!! to index it by something close to, but not actually, i + //!!! (depending on cq latency) + + cerr << "i = " << i << ", gain length = " << m_inputGains.size() + << ", cq latency = " << m_cq->getLatency() << " (as columns = " + << m_cq->getLatency() / m_cq->getColumnHop() << ", as input blocks = " + << m_cq->getLatency() / m_blockSize << ")" << endl; + + int v = round(strength * 2); if (v > 127) v = 127; if (v > partVelocity) {
--- a/src/Silvet.h Tue Jul 22 15:40:45 2014 +0100 +++ b/src/Silvet.h Tue Jul 22 16:11:20 2014 +0100 @@ -32,6 +32,7 @@ class Resampler; class CQSpectrogram; +class FlattenDynamics; class Silvet : public Vamp::Plugin { @@ -74,6 +75,7 @@ const std::vector<InstrumentPack> m_instruments; Resampler *m_resampler; + FlattenDynamics *m_flattener; CQSpectrogram *m_cq; bool m_hqMode; @@ -86,6 +88,7 @@ vector<MedianFilter<double> *> m_postFilter; vector<map<int, double> > m_pianoRoll; vector<map<int, int> > m_pianoRollShifts; + vector<float> m_inputGains; Grid preProcess(const Grid &);