lbajardsilogic@79: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@79: lbajardsilogic@79: /* Sound Access lbajardsilogic@79: EASAIER client application. lbajardsilogic@79: Silogic 2007. Laure Bajard. lbajardsilogic@79: lbajardsilogic@201: Integration of the filter provided by: lbajardsilogic@201: Dublin Institute of Technology - Audio Research Group 2007 lbajardsilogic@201: www.audioresearchgroup.com lbajardsilogic@201: Author: Dan Barry lbajardsilogic@201: lbajardsilogic@79: This program is free software; you can redistribute it and/or lbajardsilogic@79: modify it under the terms of the GNU General Public License as lbajardsilogic@79: published by the Free Software Foundation; either version 2 of the lbajardsilogic@79: License, or (at your option) any later version. See the file lbajardsilogic@79: COPYING included with this distribution for more information. lbajardsilogic@79: */ lbajardsilogic@79: lbajardsilogic@79: #include lbajardsilogic@82: #include lbajardsilogic@79: lbajardsilogic@79: #include "TimeStretchFilter.h" lbajardsilogic@79: lbajardsilogic@79: #include "FFTReal.h" lbajardsilogic@79: #include "DSP.h" lbajardsilogic@79: lbajardsilogic@82: #include "system/System.h" lbajardsilogic@127: #include "main/MainWindow.h" lbajardsilogic@82: lbajardsilogic@79: float hopfactor = 1; lbajardsilogic@82: benoitrigolleau@280: bool freeze; benoitrigolleau@280: lbajardsilogic@79: lbajardsilogic@223: TimeStretchFilter::TimeStretchFilter() : PropertyContainer(), lbajardsilogic@116: m_transcheck(true), lbajardsilogic@82: m_peakcheck(false), benoitrigolleau@276: m_freezecheck(false), lbajardsilogic@106: m_interpfactor(1), lbajardsilogic@116: m_tmaxfactor(2), lbajardsilogic@111: m_pmaxfactor(2) lbajardsilogic@79: { lbajardsilogic@223: setObjectName("Pitch-Time Stretching"); benoitrigolleau@280: freeze = false; lbajardsilogic@225: setFilterEnabled(false); lbajardsilogic@225: lbajardsilogic@127: connect(this, SIGNAL(playSpeedChanged(float)), lbajardsilogic@127: MainWindow::instance(), SLOT(playSpeedChanged(float))); lbajardsilogic@127: lbajardsilogic@173: hopfactor = 1; lbajardsilogic@79: } lbajardsilogic@79: lbajardsilogic@79: TimeStretchFilter::~TimeStretchFilter() lbajardsilogic@79: { lbajardsilogic@173: hopfactor = 1; lbajardsilogic@173: lbajardsilogic@137: emit playSpeedChanged(1); lbajardsilogic@79: } lbajardsilogic@79: lbajardsilogic@79: TimeStretchFilter::PropertyList TimeStretchFilter::getProperties() const lbajardsilogic@79: { lbajardsilogic@116: PropertyList list; lbajardsilogic@116: list.push_back("Time"); lbajardsilogic@116: list.push_back("Pitch"); lbajardsilogic@225: list.push_back("Enable"); lbajardsilogic@116: list.push_back("Transdetect"); lbajardsilogic@116: list.push_back("Peaklock"); benoitrigolleau@276: list.push_back("TimeFreeze"); lbajardsilogic@79: return list; lbajardsilogic@79: } lbajardsilogic@79: lbajardsilogic@116: QString TimeStretchFilter::getPropertyLabel(const PropertyName &name) const lbajardsilogic@116: { lbajardsilogic@116: if (name == "Time") return tr("Time"); lbajardsilogic@116: if (name == "Pitch") return tr("Pitch"); lbajardsilogic@223: //if (name == "Bypass") return tr("Bypass Processing"); lbajardsilogic@116: if (name == "Transdetect") return tr("Transient Detection"); lbajardsilogic@116: if (name == "Peaklock") return tr("Peak Locking"); benoitrigolleau@276: if (name == "TimeFreeze") return tr("Time Freeze"); lbajardsilogic@116: return ""; lbajardsilogic@79: } lbajardsilogic@79: lbajardsilogic@116: TimeStretchFilter::PropertyType TimeStretchFilter::getPropertyType(const PropertyName &name) const lbajardsilogic@116: { benoitrigolleau@276: if (name == "Time") return RangePropertyWithLabel; benoitrigolleau@276: if (name == "Pitch") return RangePropertyWithLabel; lbajardsilogic@225: if (name == "Enable") return InvalidProperty; lbajardsilogic@116: if (name == "Transdetect") return ToggleProperty; lbajardsilogic@116: if (name == "Peaklock") return ToggleProperty; benoitrigolleau@276: if (name == "TimeFreeze") return ToggleProperty; lbajardsilogic@116: return InvalidProperty; lbajardsilogic@116: } lbajardsilogic@116: lbajardsilogic@116: int TimeStretchFilter::getPropertyRangeAndValue(const PropertyName &name, lbajardsilogic@116: int *min, int *max, int *deflt) const lbajardsilogic@116: { lbajardsilogic@116: //!!! factor this colour handling stuff out into a colour manager class lbajardsilogic@116: int val = 0; lbajardsilogic@116: lbajardsilogic@116: if (name == "Time") { benoitrigolleau@276: if (min) *min = 50; benoitrigolleau@276: if (max) *max = 200; benoitrigolleau@276: if (deflt) *deflt = 100; benoitrigolleau@276: val = hopfactor*100.0; lbajardsilogic@116: } lbajardsilogic@116: lbajardsilogic@116: if (name == "Pitch") { benoitrigolleau@276: if (min) *min = 50; benoitrigolleau@276: if (max) *max = 200; benoitrigolleau@276: if (deflt) *deflt = 100; benoitrigolleau@276: val = m_interpfactor*100.0; lbajardsilogic@116: } lbajardsilogic@116: lbajardsilogic@225: if (name == "Enable") { lbajardsilogic@116: if (deflt) *deflt = 0; lbajardsilogic@225: val = (m_enabled ? 1 : 0); lbajardsilogic@225: } lbajardsilogic@116: lbajardsilogic@116: if (name == "Transdetect") { lbajardsilogic@116: if (deflt) *deflt = 0; lbajardsilogic@116: val = (m_transcheck ? 1 : 0); lbajardsilogic@116: } lbajardsilogic@116: lbajardsilogic@116: if (name == "Peaklock") { lbajardsilogic@116: if (deflt) *deflt = 0; lbajardsilogic@116: val = (m_peakcheck ? 1 : 0); lbajardsilogic@116: } benoitrigolleau@276: if (name == "TimeFreeze") { benoitrigolleau@276: if (deflt) *deflt = 0; benoitrigolleau@276: val = (m_freezecheck ? 1 : 0); benoitrigolleau@276: } lbajardsilogic@116: #ifdef DEBUG_FILTERS lbajardsilogic@116: std::cerr << "TimeStretchFilter::getPropertyRangeAndValue = " << val << std::endl; lbajardsilogic@116: #endif lbajardsilogic@116: return val; lbajardsilogic@116: } lbajardsilogic@116: lbajardsilogic@116: QString TimeStretchFilter::getPropertyValueLabel(const PropertyName &name, lbajardsilogic@116: int value) const lbajardsilogic@116: { lbajardsilogic@116: if (name == "Time") { lbajardsilogic@116: if (value == -100) lbajardsilogic@116: return tr("Slow"); lbajardsilogic@116: if (value == 100) lbajardsilogic@116: return tr("Fast"); lbajardsilogic@116: } lbajardsilogic@116: return tr(""); lbajardsilogic@116: } lbajardsilogic@116: lbajardsilogic@116: void TimeStretchFilter::setProperty(const PropertyName &name, int value) lbajardsilogic@116: { lbajardsilogic@116: if (name == "Time") { benoitrigolleau@276: hopfactor = ((float)value)/100.0; lbajardsilogic@223: if (isEnabled()) lbajardsilogic@136: emit playSpeedChanged(hopfactor); lbajardsilogic@127: lbajardsilogic@116: } else if (name == "Pitch") { benoitrigolleau@276: m_interpfactor = ((float)value)/100.0; lbajardsilogic@225: } else if (name == "Enable"){ lbajardsilogic@136: if (value > 0) lbajardsilogic@136: { lbajardsilogic@225: m_enabled = true; lbajardsilogic@136: } else lbajardsilogic@136: { lbajardsilogic@225: m_enabled = false; lbajardsilogic@225: emit playSpeedChanged(hopfactor); lbajardsilogic@225: } lbajardsilogic@225: emit propertyChanged("Enable"); lbajardsilogic@225: } else if (name == "Transdetect"){ lbajardsilogic@116: m_transcheck = (value > 0) ? true : false; lbajardsilogic@116: } else if (name == "Peaklock"){ lbajardsilogic@116: m_peakcheck = (value > 0) ? true : false; benoitrigolleau@276: } else if (name == "TimeFreeze"){ benoitrigolleau@280: freeze = (value > 0) ? true : false; benoitrigolleau@276: m_freezecheck = (value > 0) ? true : false; lbajardsilogic@116: } lbajardsilogic@116: #ifdef DEBUG_FILTERS lbajardsilogic@116: std::cerr << "TimeStretchFilter::hopfactor = " << hopfactor << std::endl; lbajardsilogic@116: std::cerr << "TimeStretchFilter::m_interpfactor = " << m_interpfactor << std::endl; lbajardsilogic@116: std::cerr << "TimeStretchFilter::m_hop = " << m_hop << std::endl; lbajardsilogic@116: std::cerr << "TimeStretchFilter::skip = " << getRequiredSkipSamples() << std::endl; lbajardsilogic@116: #endif lbajardsilogic@116: } lbajardsilogic@116: lbajardsilogic@223: void TimeStretchFilter::setFilterEnabled(bool b){ lbajardsilogic@223: m_enabled=b; lbajardsilogic@116: lbajardsilogic@223: if (m_enabled) lbajardsilogic@223: emit playSpeedChanged(hopfactor); lbajardsilogic@136: else lbajardsilogic@136: emit playSpeedChanged(1); lbajardsilogic@223: lbajardsilogic@223: emit filterEnabled(m_enabled); lbajardsilogic@136: } lbajardsilogic@136: lbajardsilogic@136: void TimeStretchFilter::setFilterEnabled(int b){ lbajardsilogic@223: m_enabled=b; lbajardsilogic@203: lbajardsilogic@223: if (m_enabled) lbajardsilogic@223: emit playSpeedChanged(hopfactor); lbajardsilogic@136: else lbajardsilogic@136: emit playSpeedChanged(1); lbajardsilogic@223: lbajardsilogic@223: emit filterEnabled(m_enabled); lbajardsilogic@136: } lbajardsilogic@203: lbajardsilogic@203: