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