annotate src/LiveInstruments.cpp @ 325:4cf4313d7e30 livemode

Always use q=0.8 and accept the hit on speed -- the templates are made for that configuration and it does work better. Also some adjustments to thresholding and peak picking for live mode in particular.
author Chris Cannam
date Mon, 18 May 2015 13:58:27 +0100
parents 7dda913d820b
children df9a8e16bae6 5acce45e2ec6
rev   line source
Chris@298 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@298 2
Chris@298 3 /*
Chris@298 4 Silvet
Chris@298 5
Chris@298 6 A Vamp plugin for note transcription.
Chris@298 7 Centre for Digital Music, Queen Mary University of London.
Chris@298 8
Chris@298 9 This program is free software; you can redistribute it and/or
Chris@298 10 modify it under the terms of the GNU General Public License as
Chris@298 11 published by the Free Software Foundation; either version 2 of the
Chris@298 12 License, or (at your option) any later version. See the file
Chris@298 13 COPYING included with this distribution for more information.
Chris@298 14 */
Chris@298 15
Chris@298 16 #include "LiveInstruments.h"
Chris@298 17
Chris@298 18 #include "data/include/templates.h"
Chris@298 19
Chris@301 20 #include <iostream>
Chris@301 21
Chris@298 22 using namespace std;
Chris@298 23
Chris@298 24 InstrumentPack
Chris@298 25 LiveAdapter::adapt(const InstrumentPack &original)
Chris@298 26 {
Chris@298 27 vector<InstrumentPack::Templates> templates;
Chris@298 28
Chris@303 29 // cerr << "LiveAdapter: reduced template height is " << SILVET_TEMPLATE_HEIGHT/5 << endl;
Chris@298 30
Chris@322 31 bool merge = false;
Chris@322 32 // The live template for piano has only one piano in it, so as
Chris@322 33 // to process faster. We make it by averaging the originals
Chris@322 34 if (original.name == "Piano") {
Chris@322 35 merge = true;
Chris@322 36 }
Chris@298 37
Chris@322 38 InstrumentPack::Templates t;
Chris@322 39 bool first = true;
Chris@322 40
Chris@322 41 for (const auto &origt: original.templates) {
Chris@322 42
Chris@322 43 t.lowestNote = origt.lowestNote;
Chris@322 44 t.highestNote = origt.highestNote;
Chris@322 45 t.data.resize(origt.data.size());
Chris@322 46
Chris@322 47 for (int j = 0; j < int(origt.data.size()); ++j) {
Chris@301 48
Chris@298 49 t.data[j].resize(SILVET_TEMPLATE_HEIGHT/5);
Chris@301 50
Chris@298 51 for (int k = 0; k < SILVET_TEMPLATE_HEIGHT/5; ++k) {
Chris@301 52
Chris@322 53 if (!merge || first) {
Chris@322 54 t.data[j][k] = 0.f;
Chris@322 55 }
Chris@301 56
Chris@301 57 for (int m = 0; m < 5; ++m) {
Chris@322 58 t.data[j][k] += origt.data[j][k * 5 + m + 2];
Chris@301 59 }
Chris@298 60 }
Chris@298 61 }
Chris@299 62
Chris@322 63 if (!merge) {
Chris@322 64 templates.push_back(t);
Chris@322 65 t = InstrumentPack::Templates();
Chris@322 66 }
Chris@315 67
Chris@322 68 first = false;
Chris@322 69 }
Chris@322 70
Chris@322 71 if (merge) {
Chris@322 72 templates.push_back(t);
Chris@322 73 }
Chris@322 74
Chris@322 75 // re-normalise
Chris@322 76 for (auto &t: templates) {
Chris@322 77 for (auto &d: t.data) {
Chris@322 78 float sum = 0.f;
Chris@322 79 for (auto v: d) sum += v;
Chris@322 80 for (auto &v: d) v /= sum;
Chris@315 81 }
Chris@298 82 }
Chris@298 83
Chris@298 84 InstrumentPack live(original.lowestNote,
Chris@298 85 original.highestNote,
Chris@298 86 original.name,
Chris@298 87 templates);
Chris@298 88
Chris@298 89 live.templateHeight = SILVET_TEMPLATE_HEIGHT/5;
Chris@298 90 live.templateMaxShift = 0;
Chris@298 91 live.templateSize = live.templateHeight;
Chris@298 92
Chris@298 93 live.maxPolyphony = original.maxPolyphony;
Chris@298 94 live.pitchSparsity = original.pitchSparsity;
Chris@298 95 live.sourceSparsity = original.sourceSparsity;
Chris@325 96 live.levelThreshold = original.levelThreshold / 15;
Chris@298 97
Chris@298 98 return live;
Chris@298 99 }
Chris@298 100
Chris@298 101 vector<InstrumentPack>
Chris@298 102 LiveAdapter::adaptAll(const vector<InstrumentPack> &v)
Chris@298 103 {
Chris@298 104 vector<InstrumentPack> out;
Chris@298 105 for (int i = 0; i < (int)v.size(); ++i) {
Chris@298 106 InstrumentPack p(LiveAdapter::adapt(v[i]));
Chris@298 107 out.push_back(p);
Chris@298 108 }
Chris@298 109 return out;
Chris@298 110 }