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 }
|