lbajardsilogic@79
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
lbajardsilogic@79
|
2
|
lbajardsilogic@79
|
3 /* Sound Access
|
lbajardsilogic@79
|
4 EASAIER client application.
|
lbajardsilogic@79
|
5 Silogic 2007. Laure Bajard.
|
lbajardsilogic@79
|
6
|
lbajardsilogic@201
|
7 Integration of the filter provided by:
|
lbajardsilogic@201
|
8 Dublin Institute of Technology - Audio Research Group 2007
|
lbajardsilogic@201
|
9 www.audioresearchgroup.com
|
lbajardsilogic@201
|
10 Author: Dan Barry
|
lbajardsilogic@201
|
11
|
lbajardsilogic@79
|
12 This program is free software; you can redistribute it and/or
|
lbajardsilogic@79
|
13 modify it under the terms of the GNU General Public License as
|
lbajardsilogic@79
|
14 published by the Free Software Foundation; either version 2 of the
|
lbajardsilogic@79
|
15 License, or (at your option) any later version. See the file
|
lbajardsilogic@79
|
16 COPYING included with this distribution for more information.
|
lbajardsilogic@79
|
17 */
|
lbajardsilogic@79
|
18
|
lbajardsilogic@79
|
19 #include <math.h>
|
lbajardsilogic@82
|
20 #include <iostream>
|
lbajardsilogic@79
|
21
|
lbajardsilogic@79
|
22 #include "TimeStretchFilter.h"
|
lbajardsilogic@79
|
23
|
lbajardsilogic@79
|
24 #include "FFTReal.h"
|
lbajardsilogic@79
|
25 #include "DSP.h"
|
lbajardsilogic@79
|
26
|
lbajardsilogic@82
|
27 #include "system/System.h"
|
lbajardsilogic@127
|
28 #include "main/MainWindow.h"
|
lbajardsilogic@82
|
29
|
lbajardsilogic@79
|
30 float hopfactor = 1;
|
lbajardsilogic@82
|
31
|
benoitrigolleau@280
|
32 bool freeze;
|
benoitrigolleau@280
|
33
|
lbajardsilogic@79
|
34
|
lbajardsilogic@223
|
35 TimeStretchFilter::TimeStretchFilter() : PropertyContainer(),
|
lbajardsilogic@116
|
36 m_transcheck(true),
|
lbajardsilogic@82
|
37 m_peakcheck(false),
|
benoitrigolleau@276
|
38 m_freezecheck(false),
|
lbajardsilogic@106
|
39 m_interpfactor(1),
|
lbajardsilogic@116
|
40 m_tmaxfactor(2),
|
lbajardsilogic@111
|
41 m_pmaxfactor(2)
|
lbajardsilogic@79
|
42 {
|
lbajardsilogic@223
|
43 setObjectName("Pitch-Time Stretching");
|
benoitrigolleau@280
|
44 freeze = false;
|
lbajardsilogic@225
|
45 setFilterEnabled(false);
|
lbajardsilogic@225
|
46
|
lbajardsilogic@127
|
47 connect(this, SIGNAL(playSpeedChanged(float)),
|
lbajardsilogic@127
|
48 MainWindow::instance(), SLOT(playSpeedChanged(float)));
|
lbajardsilogic@127
|
49
|
lbajardsilogic@173
|
50 hopfactor = 1;
|
lbajardsilogic@79
|
51 }
|
lbajardsilogic@79
|
52
|
lbajardsilogic@79
|
53 TimeStretchFilter::~TimeStretchFilter()
|
lbajardsilogic@79
|
54 {
|
lbajardsilogic@173
|
55 hopfactor = 1;
|
lbajardsilogic@173
|
56
|
lbajardsilogic@137
|
57 emit playSpeedChanged(1);
|
lbajardsilogic@79
|
58 }
|
lbajardsilogic@79
|
59
|
lbajardsilogic@79
|
60 TimeStretchFilter::PropertyList TimeStretchFilter::getProperties() const
|
lbajardsilogic@79
|
61 {
|
lbajardsilogic@116
|
62 PropertyList list;
|
lbajardsilogic@116
|
63 list.push_back("Time");
|
lbajardsilogic@116
|
64 list.push_back("Pitch");
|
lbajardsilogic@225
|
65 list.push_back("Enable");
|
lbajardsilogic@116
|
66 list.push_back("Transdetect");
|
lbajardsilogic@116
|
67 list.push_back("Peaklock");
|
benoitrigolleau@276
|
68 list.push_back("TimeFreeze");
|
lbajardsilogic@79
|
69 return list;
|
lbajardsilogic@79
|
70 }
|
lbajardsilogic@79
|
71
|
lbajardsilogic@116
|
72 QString TimeStretchFilter::getPropertyLabel(const PropertyName &name) const
|
lbajardsilogic@116
|
73 {
|
lbajardsilogic@116
|
74 if (name == "Time") return tr("Time");
|
lbajardsilogic@116
|
75 if (name == "Pitch") return tr("Pitch");
|
lbajardsilogic@223
|
76 //if (name == "Bypass") return tr("Bypass Processing");
|
lbajardsilogic@116
|
77 if (name == "Transdetect") return tr("Transient Detection");
|
lbajardsilogic@116
|
78 if (name == "Peaklock") return tr("Peak Locking");
|
benoitrigolleau@276
|
79 if (name == "TimeFreeze") return tr("Time Freeze");
|
lbajardsilogic@116
|
80 return "";
|
lbajardsilogic@79
|
81 }
|
lbajardsilogic@79
|
82
|
lbajardsilogic@116
|
83 TimeStretchFilter::PropertyType TimeStretchFilter::getPropertyType(const PropertyName &name) const
|
lbajardsilogic@116
|
84 {
|
benoitrigolleau@276
|
85 if (name == "Time") return RangePropertyWithLabel;
|
benoitrigolleau@276
|
86 if (name == "Pitch") return RangePropertyWithLabel;
|
lbajardsilogic@225
|
87 if (name == "Enable") return InvalidProperty;
|
lbajardsilogic@116
|
88 if (name == "Transdetect") return ToggleProperty;
|
lbajardsilogic@116
|
89 if (name == "Peaklock") return ToggleProperty;
|
benoitrigolleau@276
|
90 if (name == "TimeFreeze") return ToggleProperty;
|
lbajardsilogic@116
|
91 return InvalidProperty;
|
lbajardsilogic@116
|
92 }
|
lbajardsilogic@116
|
93
|
lbajardsilogic@116
|
94 int TimeStretchFilter::getPropertyRangeAndValue(const PropertyName &name,
|
lbajardsilogic@116
|
95 int *min, int *max, int *deflt) const
|
lbajardsilogic@116
|
96 {
|
lbajardsilogic@116
|
97 //!!! factor this colour handling stuff out into a colour manager class
|
lbajardsilogic@116
|
98 int val = 0;
|
lbajardsilogic@116
|
99
|
lbajardsilogic@116
|
100 if (name == "Time") {
|
benoitrigolleau@276
|
101 if (min) *min = 50;
|
benoitrigolleau@276
|
102 if (max) *max = 200;
|
benoitrigolleau@276
|
103 if (deflt) *deflt = 100;
|
benoitrigolleau@276
|
104 val = hopfactor*100.0;
|
lbajardsilogic@116
|
105 }
|
lbajardsilogic@116
|
106
|
lbajardsilogic@116
|
107 if (name == "Pitch") {
|
benoitrigolleau@276
|
108 if (min) *min = 50;
|
benoitrigolleau@276
|
109 if (max) *max = 200;
|
benoitrigolleau@276
|
110 if (deflt) *deflt = 100;
|
benoitrigolleau@276
|
111 val = m_interpfactor*100.0;
|
lbajardsilogic@116
|
112 }
|
lbajardsilogic@116
|
113
|
lbajardsilogic@225
|
114 if (name == "Enable") {
|
lbajardsilogic@116
|
115 if (deflt) *deflt = 0;
|
lbajardsilogic@225
|
116 val = (m_enabled ? 1 : 0);
|
lbajardsilogic@225
|
117 }
|
lbajardsilogic@116
|
118
|
lbajardsilogic@116
|
119 if (name == "Transdetect") {
|
lbajardsilogic@116
|
120 if (deflt) *deflt = 0;
|
lbajardsilogic@116
|
121 val = (m_transcheck ? 1 : 0);
|
lbajardsilogic@116
|
122 }
|
lbajardsilogic@116
|
123
|
lbajardsilogic@116
|
124 if (name == "Peaklock") {
|
lbajardsilogic@116
|
125 if (deflt) *deflt = 0;
|
lbajardsilogic@116
|
126 val = (m_peakcheck ? 1 : 0);
|
lbajardsilogic@116
|
127 }
|
benoitrigolleau@276
|
128 if (name == "TimeFreeze") {
|
benoitrigolleau@276
|
129 if (deflt) *deflt = 0;
|
benoitrigolleau@276
|
130 val = (m_freezecheck ? 1 : 0);
|
benoitrigolleau@276
|
131 }
|
lbajardsilogic@116
|
132 #ifdef DEBUG_FILTERS
|
lbajardsilogic@116
|
133 std::cerr << "TimeStretchFilter::getPropertyRangeAndValue = " << val << std::endl;
|
lbajardsilogic@116
|
134 #endif
|
lbajardsilogic@116
|
135 return val;
|
lbajardsilogic@116
|
136 }
|
lbajardsilogic@116
|
137
|
lbajardsilogic@116
|
138 QString TimeStretchFilter::getPropertyValueLabel(const PropertyName &name,
|
lbajardsilogic@116
|
139 int value) const
|
lbajardsilogic@116
|
140 {
|
lbajardsilogic@116
|
141 if (name == "Time") {
|
lbajardsilogic@116
|
142 if (value == -100)
|
lbajardsilogic@116
|
143 return tr("Slow");
|
lbajardsilogic@116
|
144 if (value == 100)
|
lbajardsilogic@116
|
145 return tr("Fast");
|
lbajardsilogic@116
|
146 }
|
lbajardsilogic@116
|
147 return tr("<unknown>");
|
lbajardsilogic@116
|
148 }
|
lbajardsilogic@116
|
149
|
lbajardsilogic@116
|
150 void TimeStretchFilter::setProperty(const PropertyName &name, int value)
|
lbajardsilogic@116
|
151 {
|
lbajardsilogic@116
|
152 if (name == "Time") {
|
benoitrigolleau@276
|
153 hopfactor = ((float)value)/100.0;
|
lbajardsilogic@223
|
154 if (isEnabled())
|
lbajardsilogic@136
|
155 emit playSpeedChanged(hopfactor);
|
lbajardsilogic@127
|
156
|
lbajardsilogic@116
|
157 } else if (name == "Pitch") {
|
benoitrigolleau@276
|
158 m_interpfactor = ((float)value)/100.0;
|
lbajardsilogic@225
|
159 } else if (name == "Enable"){
|
lbajardsilogic@136
|
160 if (value > 0)
|
lbajardsilogic@136
|
161 {
|
lbajardsilogic@225
|
162 m_enabled = true;
|
lbajardsilogic@136
|
163 } else
|
lbajardsilogic@136
|
164 {
|
lbajardsilogic@225
|
165 m_enabled = false;
|
lbajardsilogic@225
|
166 emit playSpeedChanged(hopfactor);
|
lbajardsilogic@225
|
167 }
|
lbajardsilogic@225
|
168 emit propertyChanged("Enable");
|
lbajardsilogic@225
|
169 } else if (name == "Transdetect"){
|
lbajardsilogic@116
|
170 m_transcheck = (value > 0) ? true : false;
|
lbajardsilogic@116
|
171 } else if (name == "Peaklock"){
|
lbajardsilogic@116
|
172 m_peakcheck = (value > 0) ? true : false;
|
benoitrigolleau@276
|
173 } else if (name == "TimeFreeze"){
|
benoitrigolleau@280
|
174 freeze = (value > 0) ? true : false;
|
benoitrigolleau@276
|
175 m_freezecheck = (value > 0) ? true : false;
|
lbajardsilogic@116
|
176 }
|
lbajardsilogic@116
|
177 #ifdef DEBUG_FILTERS
|
lbajardsilogic@116
|
178 std::cerr << "TimeStretchFilter::hopfactor = " << hopfactor << std::endl;
|
lbajardsilogic@116
|
179 std::cerr << "TimeStretchFilter::m_interpfactor = " << m_interpfactor << std::endl;
|
lbajardsilogic@116
|
180 std::cerr << "TimeStretchFilter::m_hop = " << m_hop << std::endl;
|
lbajardsilogic@116
|
181 std::cerr << "TimeStretchFilter::skip = " << getRequiredSkipSamples() << std::endl;
|
lbajardsilogic@116
|
182 #endif
|
lbajardsilogic@116
|
183 }
|
lbajardsilogic@116
|
184
|
lbajardsilogic@223
|
185 void TimeStretchFilter::setFilterEnabled(bool b){
|
lbajardsilogic@223
|
186 m_enabled=b;
|
lbajardsilogic@116
|
187
|
lbajardsilogic@223
|
188 if (m_enabled)
|
lbajardsilogic@223
|
189 emit playSpeedChanged(hopfactor);
|
lbajardsilogic@136
|
190 else
|
lbajardsilogic@136
|
191 emit playSpeedChanged(1);
|
lbajardsilogic@223
|
192
|
lbajardsilogic@223
|
193 emit filterEnabled(m_enabled);
|
lbajardsilogic@136
|
194 }
|
lbajardsilogic@136
|
195
|
lbajardsilogic@136
|
196 void TimeStretchFilter::setFilterEnabled(int b){
|
lbajardsilogic@223
|
197 m_enabled=b;
|
lbajardsilogic@203
|
198
|
lbajardsilogic@223
|
199 if (m_enabled)
|
lbajardsilogic@223
|
200 emit playSpeedChanged(hopfactor);
|
lbajardsilogic@136
|
201 else
|
lbajardsilogic@136
|
202 emit playSpeedChanged(1);
|
lbajardsilogic@223
|
203
|
lbajardsilogic@223
|
204 emit filterEnabled(m_enabled);
|
lbajardsilogic@136
|
205 }
|
lbajardsilogic@203
|
206
|
lbajardsilogic@203
|
207
|