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 &);