Mercurial > hg > silvet
changeset 309:07ee4ebea57c
Add chromagram output
author | Chris Cannam |
---|---|
date | Mon, 19 Jan 2015 11:23:07 +0000 |
parents | 04a3c152e590 |
children | 37d2d04d94db |
files | src/Silvet.cpp src/Silvet.h |
diffstat | 2 files changed, 63 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/src/Silvet.cpp Fri Dec 05 16:46:57 2014 +0000 +++ b/src/Silvet.cpp Mon Jan 19 11:23:07 2015 +0000 @@ -88,7 +88,7 @@ int Silvet::getPluginVersion() const { - return 2; + return 3; } string @@ -290,17 +290,43 @@ m_pitchOutputNo = list.size(); list.push_back(d); + d.identifier = "chroma"; + d.name = "Pitch chroma distribution"; + d.description = "Pitch chroma distribution formed by wrapping the un-thresholded pitch activation distribution into a single octave of semitone bins."; + d.unit = ""; + d.hasFixedBinCount = true; + d.binCount = 12; + d.binNames.clear(); + if (m_cq) { + for (int i = 0; i < 12; ++i) { + d.binNames.push_back(chromaName(i)); + } + } + d.hasKnownExtents = false; + d.isQuantized = false; + d.sampleType = OutputDescriptor::FixedSampleRate; + d.sampleRate = m_colsPerSec; + d.hasDuration = false; + m_chromaOutputNo = list.size(); + list.push_back(d); + return list; } std::string -Silvet::noteName(int note, int shift, int shiftCount) const +Silvet::chromaName(int pitch) const { static const char *names[] = { "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#" }; - const char *n = names[note % 12]; + return names[pitch]; +} + +std::string +Silvet::noteName(int note, int shift, int shiftCount) const +{ + string n = chromaName(note % 12); int oct = (note + 9) / 12; @@ -314,11 +340,11 @@ } if (pshift > 0.f) { - sprintf(buf, "%s%d+%dc", n, oct, int(round(pshift * 100))); + sprintf(buf, "%s%d+%dc", n.c_str(), oct, int(round(pshift * 100))); } else if (pshift < 0.f) { - sprintf(buf, "%s%d-%dc", n, oct, int(round((-pshift) * 100))); + sprintf(buf, "%s%d-%dc", n.c_str(), oct, int(round((-pshift) * 100))); } else { - sprintf(buf, "%s%d", n, oct); + sprintf(buf, "%s%d", n.c_str(), oct); } return buf; @@ -575,16 +601,28 @@ for (int i = 0; i < width; ++i) { + // This returns a filtered column, and pushes the + // up-to-max-polyphony activation column to m_pianoRoll vector<double> filtered = postProcess (localPitches[i], localBestShifts[i], wantShifts); + RealTime timestamp = getColumnTimestamp(m_pianoRoll.size() - 1); + float inputGain = getInputGainAt(timestamp); + Feature f; for (int j = 0; j < (int)filtered.size(); ++j) { - float v(filtered[j]); + float v = filtered[j]; if (v < pack.levelThreshold) v = 0.f; - f.values.push_back(v); + f.values.push_back(v / inputGain); } fs[m_pitchOutputNo].push_back(f); + + f.values.clear(); + f.values.resize(12); + for (int j = 0; j < (int)filtered.size(); ++j) { + f.values[j % 12] += filtered[j] / inputGain; + } + fs[m_chromaOutputNo].push_back(f); FeatureList noteFeatures = noteTrack(shiftCount); @@ -851,6 +889,16 @@ } } +RealTime +Silvet::getColumnTimestamp(int column) +{ + double columnDuration = 1.0 / m_colsPerSec; + int postFilterLatency = int(m_postFilter[0]->getSize() / 2); + + return m_startTime + RealTime::fromSeconds + (columnDuration * (column - postFilterLatency) + 0.02); +} + Silvet::Feature Silvet::makeNoteFeature(int start, int end, @@ -859,18 +907,13 @@ int shiftCount, int velocity) { - double columnDuration = 1.0 / m_colsPerSec; - int postFilterLatency = int(m_postFilter[0]->getSize() / 2); - Feature f; f.hasTimestamp = true; - f.timestamp = m_startTime + RealTime::fromSeconds - (columnDuration * (start - postFilterLatency) + 0.02); + f.timestamp = getColumnTimestamp(start); f.hasDuration = true; - f.duration = RealTime::fromSeconds - (columnDuration * (end - start)); + f.duration = getColumnTimestamp(end) - f.timestamp; f.values.clear();
--- a/src/Silvet.h Fri Dec 05 16:46:57 2014 +0000 +++ b/src/Silvet.h Mon Jan 19 11:23:07 2015 +0000 @@ -100,7 +100,9 @@ void emitNote(int start, int end, int note, int shiftCount, FeatureList ¬eFeatures); - + + Vamp::RealTime getColumnTimestamp(int column); + Feature makeNoteFeature(int start, int end, int note, int shift, int shiftCount, int velocity); @@ -108,6 +110,7 @@ FeatureSet transcribe(const Grid &); + string chromaName(int n) const; string noteName(int n, int shift, int shiftCount) const; float noteFrequency(int n, int shift, int shiftCount) const; @@ -119,6 +122,7 @@ mutable int m_notesOutputNo; mutable int m_fcqOutputNo; mutable int m_pitchOutputNo; + mutable int m_chromaOutputNo; }; #endif