annotate src/LiveInstruments.cpp @ 372:af71cbdab621 tip

Update bqvec code
author Chris Cannam
date Tue, 19 Nov 2019 10:13:32 +0000
parents 5acce45e2ec6
children
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@346 80 if (sum > 0.f) {
Chris@346 81 for (auto &v: d) v /= sum;
Chris@346 82 }
Chris@315 83 }
Chris@298 84 }
Chris@298 85
Chris@298 86 InstrumentPack live(original.lowestNote,
Chris@298 87 original.highestNote,
Chris@298 88 original.name,
Chris@298 89 templates);
Chris@298 90
Chris@298 91 live.templateHeight = SILVET_TEMPLATE_HEIGHT/5;
Chris@298 92 live.templateMaxShift = 0;
Chris@298 93 live.templateSize = live.templateHeight;
Chris@298 94
Chris@298 95 live.maxPolyphony = original.maxPolyphony;
Chris@298 96 live.pitchSparsity = original.pitchSparsity;
Chris@298 97 live.sourceSparsity = original.sourceSparsity;
Chris@325 98 live.levelThreshold = original.levelThreshold / 15;
Chris@298 99
Chris@298 100 return live;
Chris@298 101 }
Chris@298 102
Chris@298 103 vector<InstrumentPack>
Chris@298 104 LiveAdapter::adaptAll(const vector<InstrumentPack> &v)
Chris@298 105 {
Chris@298 106 vector<InstrumentPack> out;
Chris@298 107 for (int i = 0; i < (int)v.size(); ++i) {
Chris@298 108 InstrumentPack p(LiveAdapter::adapt(v[i]));
Chris@298 109 out.push_back(p);
Chris@298 110 }
Chris@298 111 return out;
Chris@298 112 }