annotate src/LiveInstruments.cpp @ 301:00fab71b80ec livemode

More tweaking of frequencies
author Chris Cannam
date Mon, 01 Dec 2014 17:12:19 +0000
parents ba5f3b084466
children cac0be04c43c
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@301 29 cerr << "LiveAdapter: reduced template height is " << SILVET_TEMPLATE_HEIGHT/5 << endl;
Chris@301 30
Chris@298 31 for (vector<InstrumentPack::Templates>::const_iterator i =
Chris@298 32 original.templates.begin();
Chris@298 33 i != original.templates.end(); ++i) {
Chris@298 34
Chris@298 35 InstrumentPack::Templates t;
Chris@298 36 t.lowestNote = i->lowestNote;
Chris@298 37 t.highestNote = i->highestNote;
Chris@298 38 t.data.resize(i->data.size());
Chris@298 39
Chris@298 40 for (int j = 0; j < int(i->data.size()); ++j) {
Chris@301 41
Chris@298 42 t.data[j].resize(SILVET_TEMPLATE_HEIGHT/5);
Chris@301 43
Chris@299 44 float sum = 0.f;
Chris@301 45
Chris@298 46 for (int k = 0; k < SILVET_TEMPLATE_HEIGHT/5; ++k) {
Chris@301 47
Chris@301 48 t.data[j][k] = 0.f;
Chris@301 49
Chris@301 50 for (int m = 0; m < 5; ++m) {
Chris@301 51 t.data[j][k] += i->data[j][k * 5 + m + 2];
Chris@301 52 }
Chris@301 53
Chris@299 54 sum += t.data[j][k];
Chris@298 55 }
Chris@301 56
Chris@299 57 // re-normalise
Chris@299 58 for (int k = 0; k < (int)t.data[j].size(); ++k) {
Chris@299 59 t.data[j][k] *= 1.f / sum;
Chris@299 60 }
Chris@298 61 }
Chris@299 62
Chris@298 63 templates.push_back(t);
Chris@298 64 }
Chris@298 65
Chris@298 66 InstrumentPack live(original.lowestNote,
Chris@298 67 original.highestNote,
Chris@298 68 original.name,
Chris@298 69 templates);
Chris@298 70
Chris@298 71 live.templateHeight = SILVET_TEMPLATE_HEIGHT/5;
Chris@298 72 live.templateMaxShift = 0;
Chris@298 73 live.templateSize = live.templateHeight;
Chris@298 74
Chris@298 75 live.maxPolyphony = original.maxPolyphony;
Chris@298 76 live.pitchSparsity = original.pitchSparsity;
Chris@298 77 live.sourceSparsity = original.sourceSparsity;
Chris@300 78 live.levelThreshold = original.levelThreshold/10; //!!! but why?
Chris@298 79
Chris@298 80 return live;
Chris@298 81 }
Chris@298 82
Chris@298 83 vector<InstrumentPack>
Chris@298 84 LiveAdapter::adaptAll(const vector<InstrumentPack> &v)
Chris@298 85 {
Chris@298 86 vector<InstrumentPack> out;
Chris@298 87 for (int i = 0; i < (int)v.size(); ++i) {
Chris@298 88 InstrumentPack p(LiveAdapter::adapt(v[i]));
Chris@298 89 out.push_back(p);
Chris@298 90 }
Chris@298 91 return out;
Chris@298 92 }