/*
* Created on 21 Dec 2007
*
* Copyright (c) 2004-2007 Paul John Leonard
*
* http://www.frinika.com
*
* This file is part of Frinika.
*
* Frinika 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.
* Frinika is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Frinika; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.frinika.audio.analysis.constantq;
import com.frinika.audio.io.LimitedAudioReader;
import java.util.Observable;
import java.util.Observer;
import java.util.Vector;
import javax.swing.JPanel;
import com.frinika.util.tweaks.gui.TweakerPanel;
import com.frinika.util.tweaks.Tweakable;
import com.frinika.util.tweaks.TweakableDouble;
import com.frinika.util.tweaks.TweakableInt;
import com.frinika.audio.analysis.Mapper;
import com.frinika.audio.analysis.SpectrumController;
public class ConstantQSpectrumController implements SpectrumController {
Vector<Tweakable> tweaks = new Vector<Tweakable>();
TweakableDouble minFreqT = new TweakableDouble(tweaks, 1.0, 1000.0, 55.0,
1.0, "min Freq");
TweakableDouble maxFreqT = new TweakableDouble(tweaks, 2.0, 20000.0,
6000.0, 5.0, "max Freq");
TweakableInt binsPerOctave = new TweakableInt(tweaks, 1, 64, 48,
"bins/Octave");
TweakableDouble threshold = new TweakableDouble(tweaks, 0.0, 0.1, .01, .05,
"threshold");
TweakableDouble dt = new TweakableDouble(tweaks, 0.001, 0.02, .01, .001,
"dt");
TweakableDouble spread = new TweakableDouble(tweaks, 0.1, 50.0, 1.0, .001,
"spread");
class FreqMapper implements Mapper {
double minFreq = minFreqT.doubleValue();
double maxFreq = maxFreqT.doubleValue();
public final float eval(float val) {
double x = Math.log(val / minFreq);
double mx = Math.log(maxFreq / minFreq);
return (float) (x / mx);
}
void update() {
minFreq = minFreqT.doubleValue();
maxFreq = maxFreqT.doubleValue();
}
}
FreqMapper freqMapper;
Observer reco;
public ConstantQSpectrumController(final ConstantQSpectrogramDataBuilder spectroData, final LimitedAudioReader reader) {
freqMapper = new FreqMapper();
reco = new Observer() {
public void update(Observable o, Object arg) {
freqMapper.update();
spectroData.setParameters(reader, minFreqT.doubleValue(),
maxFreqT.doubleValue(), binsPerOctave.intValue(),
threshold.doubleValue(), spread.doubleValue(), dt.doubleValue());
}
};
binsPerOctave.addObserver(reco);
maxFreqT.addObserver(reco);
minFreqT.addObserver(reco);
threshold.addObserver(reco);
dt.addObserver(reco);
spread.addObserver(reco);
}
public Mapper getFrequencyMapper() {
// TODO Auto-generated method stub
return freqMapper;
}
public void update() {
reco.update(null, null);
}
public JPanel getTweakPanel() {
TweakerPanel tpanel = new TweakerPanel(2, 4);
for (Tweakable t : tweaks) {
tpanel.addSpinTweaker(t);
}
return tpanel;
}
}