Chris@298: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@298: Chris@298: /* Chris@298: Silvet Chris@298: Chris@298: A Vamp plugin for note transcription. Chris@298: Centre for Digital Music, Queen Mary University of London. Chris@298: Chris@298: This program is free software; you can redistribute it and/or Chris@298: modify it under the terms of the GNU General Public License as Chris@298: published by the Free Software Foundation; either version 2 of the Chris@298: License, or (at your option) any later version. See the file Chris@298: COPYING included with this distribution for more information. Chris@298: */ Chris@298: Chris@298: #include "LiveInstruments.h" Chris@298: Chris@298: #include "data/include/templates.h" Chris@298: Chris@301: #include Chris@301: Chris@298: using namespace std; Chris@298: Chris@298: InstrumentPack Chris@298: LiveAdapter::adapt(const InstrumentPack &original) Chris@298: { Chris@298: vector templates; Chris@298: Chris@301: cerr << "LiveAdapter: reduced template height is " << SILVET_TEMPLATE_HEIGHT/5 << endl; Chris@301: Chris@298: for (vector::const_iterator i = Chris@298: original.templates.begin(); Chris@298: i != original.templates.end(); ++i) { Chris@298: Chris@298: InstrumentPack::Templates t; Chris@298: t.lowestNote = i->lowestNote; Chris@298: t.highestNote = i->highestNote; Chris@298: t.data.resize(i->data.size()); Chris@298: Chris@298: for (int j = 0; j < int(i->data.size()); ++j) { Chris@301: Chris@298: t.data[j].resize(SILVET_TEMPLATE_HEIGHT/5); Chris@301: Chris@299: float sum = 0.f; Chris@301: Chris@298: for (int k = 0; k < SILVET_TEMPLATE_HEIGHT/5; ++k) { Chris@301: Chris@301: t.data[j][k] = 0.f; Chris@301: Chris@301: for (int m = 0; m < 5; ++m) { Chris@301: t.data[j][k] += i->data[j][k * 5 + m + 2]; Chris@301: } Chris@301: Chris@299: sum += t.data[j][k]; Chris@298: } Chris@301: Chris@299: // re-normalise Chris@302: if (sum > 0.f) { Chris@302: for (int k = 0; k < (int)t.data[j].size(); ++k) { Chris@302: t.data[j][k] *= 1.f / sum; Chris@302: } Chris@299: } Chris@298: } Chris@299: Chris@298: templates.push_back(t); Chris@298: } Chris@298: Chris@298: InstrumentPack live(original.lowestNote, Chris@298: original.highestNote, Chris@298: original.name, Chris@298: templates); Chris@298: Chris@298: live.templateHeight = SILVET_TEMPLATE_HEIGHT/5; Chris@298: live.templateMaxShift = 0; Chris@298: live.templateSize = live.templateHeight; Chris@298: Chris@298: live.maxPolyphony = original.maxPolyphony; Chris@298: live.pitchSparsity = original.pitchSparsity; Chris@298: live.sourceSparsity = original.sourceSparsity; Chris@300: live.levelThreshold = original.levelThreshold/10; //!!! but why? Chris@298: Chris@298: return live; Chris@298: } Chris@298: Chris@298: vector Chris@298: LiveAdapter::adaptAll(const vector &v) Chris@298: { Chris@298: vector out; Chris@298: for (int i = 0; i < (int)v.size(); ++i) { Chris@298: InstrumentPack p(LiveAdapter::adapt(v[i])); Chris@298: out.push_back(p); Chris@298: } Chris@298: return out; Chris@298: }