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@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@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@298: t.data[j].resize(SILVET_TEMPLATE_HEIGHT/5); Chris@299: float sum = 0.f; Chris@298: for (int k = 0; k < SILVET_TEMPLATE_HEIGHT/5; ++k) { Chris@298: t.data[j][k] = i->data[j][k * 5 + 2 - SILVET_TEMPLATE_MAX_SHIFT]; Chris@299: sum += t.data[j][k]; Chris@298: } Chris@299: // re-normalise Chris@299: for (int k = 0; k < (int)t.data[j].size(); ++k) { Chris@299: t.data[j][k] *= 1.f / sum; 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: }