annotate sv/filter/TimeStretchFilter.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents 8bdfbd9ad418
children
rev   line source
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