/*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ // (c) 2001 hans_meine@gmx.net #include "pitchablespeed.h" #include #include #include #include #include #include #include #include #include #include #include #include extern "C" { TDE_EXPORT Plugin* create_plugin() { TDEGlobal::locale()->insertCatalogue("pitchablespeed"); return new PitchableSpeed(); } } const int PitchableSpeed::DEFAULT_OFFSET = 5; const int PitchableSpeed::DEFAULT_RANGE = 10; PitchableSpeed::PitchableSpeed() : Plugin(), offset(DEFAULT_OFFSET), range(DEFAULT_RANGE) , frequenciesPreserved(false) { rangeInput->setRange(2,150,1,false); rangeInput->setValue(range); offsetInput->setRange(-5,15,1,false); offsetInput->setValue(offset); setupSliderRange(); connect(napp->player(), TQ_SIGNAL(changed()), this, TQ_SLOT(newSong())); connect(preserveFrequencies, TQ_SIGNAL(toggled(bool)), this, TQ_SLOT(preserveFrequenciesChanged(bool))); //show(); } PitchableSpeed::~PitchableSpeed() { napp->pluginMenuRemove(pluginMenuItem); Arts::PlayObject playobject= napp->player()->engine()->playObject(); Arts::PitchablePlayObject pitchable= Arts::DynamicCast(playobject); if (!pitchable.isNull()) pitchable.speed(1.0); if (frequenciesPreserved) napp->player()->engine()->effectStack()->remove(pitchShiftEffectID); } void PitchableSpeed::newSong() { setSpeed(); Arts::PlayObject playobject= napp->player()->engine()->playObject(); Arts::PitchablePlayObject pitchable= Arts::DynamicCast(playobject); slider->setEnabled(!pitchable.isNull()); } float PitchableSpeed::sliderSpeed() { return 1.0f - slider->value()/1000.0f; } void PitchableSpeed::setSpeed() { Arts::PlayObject playobject= napp->player()->engine()->playObject(); Arts::PitchablePlayObject pitchable= Arts::DynamicCast(playobject); float newSpeed= 1.0f; if (!pitchable.isNull()) { newSpeed= sliderSpeed(); pitchable.speed(newSpeed); if (frequenciesPreserved) pitchShift.speed(1.f/newSpeed); } TQString percentStr; percentStr.setNum((newSpeed-1.f)*100.f,'f',1); if (newSpeed<=0) percentStr.prepend('+').append(' ').append('%'); currentValEdit->setText(percentStr); } void PitchableSpeed::setupSliderRange() { int min= (-offset+range)<99 ? (-offset+range)*10 : 990; slider->setRange((-offset-range)*10,min); slider->setTickInterval(10); } void PitchableSpeed::speedChanged(int ) { setSpeed(); } void PitchableSpeed::offsetChanged(int newOffset) { offset= newOffset; setupSliderRange(); } void PitchableSpeed::rangeChanged(int newRange) { range= newRange; setupSliderRange(); } void PitchableSpeed::preserveFrequenciesChanged(bool preserveNow) { if (preserveNow==frequenciesPreserved) return; if (preserveNow) { pitchShift = Arts::DynamicCast(napp->player()->engine()->server()-> createObject("Arts::Synth_STEREO_PITCH_SHIFT")); pitchShift.frequency(10.f); // TODO: might have to experiment a bit with this pitchShift.speed(1.f/sliderSpeed()); pitchShift.start(); pitchShiftEffectID= napp->player()->engine()->effectStack()-> insertTop(pitchShift, "correcting pitch shift"); } else { napp->player()->engine()->effectStack()->remove(pitchShiftEffectID); pitchShift.stop(); pitchShift = Arts::Synth_STEREO_PITCH_SHIFT::null(); } frequenciesPreserved= preserveNow; } void PitchableSpeed::init() { pluginMenuItem = napp->pluginMenuAdd(i18n("Toggle Speed Slider"), this, TQ_SLOT(toggle(void))); } void PitchableSpeed::toggle(void) { show(); raise(); } void PitchableSpeed::closeEvent(TQCloseEvent *) { hide(); } #include "pitchablespeed.moc"