Import upstream version 0.99.2
[fmit.git] / src / CustomInstrumentTunerForm.cpp
index e5a70d5..d639cd8 100644 (file)
@@ -43,21 +43,30 @@ using namespace std;
 #include <qdatetime.h>
 #include <qradiobutton.h>
 
-#include <qtextedit.h>
+#include <qtextbrowser.h>
 #include <qpushbutton.h>
-
+#include <qwidgetaction.h>
+#include <qevent.h>
+#include <qabstracttextdocumentlayout.h>
 #include <Music/Convolution.h>
 using namespace Music;
 #include "modules/View.h"
 
 CustomInstrumentTunerForm::CustomInstrumentTunerForm()
-: m_capture_thread("fmit")
-, m_timer_refresh(this, "m_timer_refresh")
+: m_config_form(this)
+, m_capture_thread("fmit")
+, m_timer_refresh(this)
 , m_algo_combedfft(NULL)
 , m_range_filter(&m_dummy_range_filter)
 , m_quantizer(&m_latency_quantizer)
-, m_settings("gillesdegottex.ch", "fmit", "009700")    // not necessarily equal to the soft version
+, m_settings("fmit", "fmit", "009801") // not necessarily equal to the soft version
 {
+       setupUi(this);
+
+       /*QWidgetAction* viewsCaption = new QWidgetAction(ui_tbViews);
+       viewsCaption->setDefaultWidget(new QLabel(tr("Views"), ui_tbViews));
+       ui_tbViews->addAction(viewsCaption);*/
+
        View::s_settings = &m_settings;
        m_settings.add(m_config_form.ui_chkFullScreen);
        m_settings.add(m_config_form.ui_chkAutoSaveOnExit);
@@ -117,7 +126,7 @@ CustomInstrumentTunerForm::CustomInstrumentTunerForm()
        m_algo_combedfft = new CombedFT();
 
        for(int i=0; i<m_capture_thread.getTransports().size(); i++)
-               m_config_form.ui_cbTransports->insertItem(m_capture_thread.getTransports()[i]->getName());
+               m_config_form.ui_cbTransports->addItem(m_capture_thread.getTransports()[i]->getName());
 
        if(m_capture_thread.getTransports().empty())
                QMessageBox::critical(this, "Error", "Please compile me with a capture system ...");
@@ -148,15 +157,15 @@ CustomInstrumentTunerForm::CustomInstrumentTunerForm()
        m_dialTune = new DialView(centralWidget());
        ui_dialTuneLayout->addWidget(m_dialTune);
 
-       m_glGraph = new GLGraph("Graph", centralWidget());
+       m_glGraph = new GLGraph(centralWidget());
        connect(m_glGraph->setting_show, SIGNAL(toggled(bool)), this, SLOT(update_views()));
        connect(m_glGraph->setting_spinMaxHeight, SIGNAL(valueChanged(int)), this, SLOT(update_views()));
-       m_glGraph->setting_show->addTo(ui_tbViews);
+       ui_tbViews->addAction(m_glGraph->setting_show);
        ui_graphLayout->addWidget(m_glGraph);
 
        m_glErrorHistory = new GLErrorHistory(centralWidget());
        connect(m_glErrorHistory->setting_show, SIGNAL(toggled(bool)), this, SLOT(update_views()));
-       m_glErrorHistory->setting_show->addTo(ui_tbViews);
+       ui_tbViews->addAction(m_glErrorHistory->setting_show);
        ui_errorLayout->addWidget(m_glErrorHistory);
 
        // link scales
@@ -168,7 +177,7 @@ CustomInstrumentTunerForm::CustomInstrumentTunerForm()
        m_glVolumeHistory = new GLVolumeHistory(centralWidget());
        connect(m_config_form.ui_spinVolumeTreshold, SIGNAL(valueChanged(int)), m_glVolumeHistory, SLOT(setVolumeTreshold(int)));
        connect(m_glVolumeHistory->setting_show, SIGNAL(toggled(bool)), this, SLOT(update_views()));
-       m_glVolumeHistory->setting_show->addTo(ui_tbViews);
+       ui_tbViews->addAction(m_glVolumeHistory->setting_show);
        ui_volumeLayout->addWidget(m_glVolumeHistory);
 
        // link keep settings
@@ -178,28 +187,28 @@ CustomInstrumentTunerForm::CustomInstrumentTunerForm()
 
        m_glSample = new GLSample(centralWidget());
        connect(m_glSample->setting_show, SIGNAL(toggled(bool)), this, SLOT(update_views()));
-       m_glSample->setting_show->addTo(ui_tbViews);
+       ui_tbViews->addAction(m_glSample->setting_show);
        ui_sampleLayout->addWidget(m_glSample);
 
        m_glFreqStruct = new GLFreqStruct(centralWidget());
        connect(m_glFreqStruct->setting_show, SIGNAL(toggled(bool)), this, SLOT(update_views()));
-       m_glFreqStruct->setting_show->addTo(ui_tbViews);
+       ui_tbViews->addAction(m_glFreqStruct->setting_show);
        ui_formantsLayout->addWidget(m_glFreqStruct);
 
        m_glFT = new GLFT(centralWidget());
        connect(m_glFT->setting_show, SIGNAL(toggled(bool)), this, SLOT(update_views()));
-       m_glFT->setting_show->addTo(ui_tbViews);
+       ui_tbViews->addAction(m_glFT->setting_show);
        ui_FT->addWidget(m_glFT);
 
        m_microtonalView = new MicrotonalView(centralWidget());
        connect(m_microtonalView->setting_show, SIGNAL(toggled(bool)), this, SLOT(update_views()));
        connect(m_microtonalView, SIGNAL(tuningFreqChanged(float)), this, SLOT(tuningFreqChanged(float)));
-       m_microtonalView->setting_show->addTo(ui_tbViews);
+       ui_tbViews->addAction(m_microtonalView->setting_show);
        ui_microtonalLayout->addWidget(m_microtonalView);
 
        m_glStatistics = new GLStatistics(centralWidget());
        connect(m_glStatistics->setting_show, SIGNAL(toggled(bool)), this, SLOT(update_views()));
-       m_glStatistics->setting_show->addTo(ui_tbViews);
+       ui_tbViews->addAction(m_glStatistics->setting_show);
        ui_microtonalLayout->addWidget(m_glStatistics);
 
        connect(m_dialTune->setting_spinScale, SIGNAL(valueChanged(int)), m_glStatistics->setting_spinScale, SLOT(setValue(int)));
@@ -210,7 +219,8 @@ CustomInstrumentTunerForm::CustomInstrumentTunerForm()
        connect(m_dialTune->setting_showTolerance, SIGNAL(toggled(bool)), m_glStatistics->setting_showTolerance, SLOT(setOn(bool)));
        connect(m_glStatistics->setting_showTolerance, SIGNAL(toggled(bool)), m_dialTune->setting_showTolerance, SLOT(setOn(bool)));
 
-       connect(m_config_form.buttonOk, SIGNAL(clicked()), this, SLOT(configure_ok()));
+    connect(&m_config_form, SIGNAL(accepted()), this, SLOT(configure_ok()));
+    connect(&m_config_form, SIGNAL(rejected()), this, SLOT(configure_cancel()));
        connect(m_config_form.ui_btnRestoreFactorySettings, SIGNAL(clicked()), this, SLOT(restoreFactorySettings()));
        connect(m_config_form.ui_spinMinHT, SIGNAL(valueChanged(int)), this, SLOT(noteRangeChanged()));
        connect(m_config_form.ui_spinMaxHT, SIGNAL(valueChanged(int)), this, SLOT(noteRangeChanged()));
@@ -238,14 +248,16 @@ CustomInstrumentTunerForm::CustomInstrumentTunerForm()
        m_time.start();
        connect((QObject*)&m_timer_refresh, SIGNAL(timeout()), this, SLOT(refresh()));
        m_timer_refresh.start(m_config_form.ui_spinRefreshTime->value());
+
+//     cerr << __FILE__ << " " << __LINE__ << endl;
 }
 
 void CustomInstrumentTunerForm::transportChanged(const QString& name)
 {
        selectTransport(name);
 
-       if(m_capture_thread.getCurrentTransportIndex()!=m_config_form.ui_cbTransports->currentItem())
-               m_config_form.ui_cbTransports->setCurrentItem(m_capture_thread.getCurrentTransportIndex());
+       if(m_capture_thread.getCurrentTransportIndex()!=m_config_form.ui_cbTransports->currentIndex())
+               m_config_form.ui_cbTransports->setCurrentIndex(m_capture_thread.getCurrentTransportIndex());
 }
 void CustomInstrumentTunerForm::selectTransport(const QString& name)
 {
@@ -286,26 +298,32 @@ void CustomInstrumentTunerForm::noteRangeChanged()
 {
        //      cerr << "CustomInstrumentTunerForm::noteRangeChanged" << endl;
 
-       m_config_form.ui_txtMinHT->setText(h2n(m_config_form.ui_spinMinHT->value())+" = "+QString::number(h2f(m_config_form.ui_spinMinHT->value()))+" hz");
-       m_config_form.ui_txtMaxHT->setText(h2n(m_config_form.ui_spinMaxHT->value())+" = "+QString::number(h2f(m_config_form.ui_spinMaxHT->value()))+" hz");
+       m_config_form.ui_txtMinHT->setText(QString::fromStdString(h2n(m_config_form.ui_spinMinHT->value())) + " = " + QString::number(h2f(m_config_form.ui_spinMinHT->value())) + " hz");
+       m_config_form.ui_txtMaxHT->setText(QString::fromStdString(h2n(m_config_form.ui_spinMaxHT->value())) + " = " + QString::number(h2f(m_config_form.ui_spinMaxHT->value())) + " hz");
 }
 
 void CustomInstrumentTunerForm::errorRaised(const QString& error)
 {
        //      cerr << "CustomInstrumentTunerForm::errorRaised " << error << endl;
 
-       statusBar()->message(QString("ERROR: ")+error);
+       statusBar()->showMessage(QString("ERROR: ")+error);
 
-       ui_lblSoundStability->setBackgroundColor(QColor(180,74,74));
+       QPalette palette;
+       palette.setColor(ui_lblSoundStability->backgroundRole(), QColor(180,74,74));
+       ui_lblSoundStability->setPalette(palette);
 }
 
 void CustomInstrumentTunerForm::samplingRateChanged(int sampling_rate)
 {
-//     cerr << "CustomInstrumentTunerForm::samplingRateChanged " << sampling_rate << endl;
+       cerr << "CustomInstrumentTunerForm::samplingRateChanged " << sampling_rate << endl;
 
        Music::SetSamplingRate(sampling_rate);
 
-       m_rect_range_filter.reset(int(GetSamplingRate()/h2f(GetSemitoneMin())));
+        m_rect_range_filter.reset(int(GetSamplingRate()/2000.0));
+//         m_fir_range_filter.setImpulseResponse(fir1_lowpass(400, 2/400));
+//     m_rect_range_filter.reset(int(GetSamplingRate()/h2f(GetSemitoneMin())));
+    m_glFT->spinWinLengthChanged(m_glFT->setting_winlen->value());
+    m_glFT->setSamplingRate(sampling_rate);
 
        if(m_config_form.ui_cbTransports->currentText()=="JACK")
                m_config_form.ui_lblJACKSamplingRate->setText(QString::number(sampling_rate));
@@ -314,7 +332,7 @@ void CustomInstrumentTunerForm::samplingRateChanged(int sampling_rate)
 void CustomInstrumentTunerForm::ui_spinAFreq_valueChanged(int AFreq)
 {
        double A = AFreq;
-       if(m_config_form.ui_chkShowA4Offset->isOn())
+       if(m_config_form.ui_chkShowA4Offset->isChecked())
                A = h2f(ui_spinA3Offset->value()*1/100.0f, A);
        Music::SetAFreq(A);
 //     cerr << A << endl;
@@ -322,7 +340,7 @@ void CustomInstrumentTunerForm::ui_spinAFreq_valueChanged(int AFreq)
 void CustomInstrumentTunerForm::ui_spinAOffset_valueChanged(int offset)
 {
        double A = ui_spinAFreq->value();
-       if(m_config_form.ui_chkShowA4Offset->isOn())
+       if(m_config_form.ui_chkShowA4Offset->isChecked())
                A = h2f(offset*1/100.0f, ui_spinAFreq->value());
        Music::SetAFreq(A);
 //     cerr << A << endl;
@@ -337,7 +355,7 @@ void CustomInstrumentTunerForm::tuningFreqChanged(float freq)
                if(m_compared_freq!=0.0f)
                {
                        ui_txtNoteFreq->display(m_compared_freq);
-                       ui_txtNote->setText(h2n(f2h(m_compared_freq)));
+                       ui_txtNote->setText(QString::fromStdString(h2n(f2h(m_compared_freq))));
                }
        }
        else
@@ -371,15 +389,16 @@ void CustomInstrumentTunerForm::refresh()
        QColor ok_color(83,165,105);
 
        // 1/{time between refresh} = {nb refresh by seconds}
-       // limit the nb new data by fs/{nb refresh by seconds}
-       // add 1 to {nb refresh by second} to eventualy recover lags
+       // limit the nb of new data by fs/{nb refresh by seconds}
+       // add 1 to {nb refresh by second} to eventualy recover small lags
+    // (a big lag is managed by m_values.size()>getPacketSizeSinceLastLock())
        int limit = int( m_capture_thread.getSamplingRate() /
                        (1.0/(m_config_form.ui_spinRefreshTime->value()/1000.0) - 1));
 
 //     cerr << "REFRESH ";
 
        m_capture_thread.lock();
-       double max_amplitude = 0.0;
+//     cerr << "CustomInstrumentTunerForm::refresh locked, values to read=" << m_capture_thread.m_values.size() << endl;
        int nb_new_data = 0;
        while(!m_capture_thread.m_values.empty() &&
                          (m_capture_thread.m_values.size()>m_capture_thread.getPacketSizeSinceLastLock() || nb_new_data<limit))
@@ -389,8 +408,6 @@ void CustomInstrumentTunerForm::refresh()
 //             cerr << value << " ";
                m_capture_thread.m_values.pop_back();
 
-               max_amplitude = max(max_amplitude, fabs(value));
-
                m_queue.push_front(value);
                if(m_glGraph)   m_glGraph->addValue(value);
                if(m_glFT)              m_glFT->buff.push_front(value);
@@ -398,6 +415,7 @@ void CustomInstrumentTunerForm::refresh()
                nb_new_data++;
        }
        m_capture_thread.unlock();
+//     cerr << "CustomInstrumentTunerForm::refresh unlocked" << endl;
 
 //     cerr << endl;
 
@@ -412,15 +430,19 @@ void CustomInstrumentTunerForm::refresh()
        // ------- Analysis stage -------
 
        // if something goes wrong in the capture system
-       if(nb_new_data==0 || m_algo_combedfft==NULL
-                  || elapsed_time>8*m_config_form.ui_spinRefreshTime->value())
-               ui_lblSoundStability->setBackgroundColor(capture_failed_color);
+       if(nb_new_data==0 || m_algo_combedfft==NULL || elapsed_time>8*m_config_form.ui_spinRefreshTime->value())
+       {
+               QPalette palette;
+               palette.setColor(ui_lblSoundStability->backgroundRole(), capture_failed_color);
+               ui_lblSoundStability->setPalette(palette);
+       }
        else
        {
                m_algo_combedfft->apply(m_queue);
 
+        // TODO hem ... use energy
                double max_component = 20*log10(m_algo_combedfft->getComponentsMax());
-               ui_pgbVolume->setProgress(100+int(max_component));
+               ui_pgbVolume->setValue(100+int(max_component));
 
                double freq = 0.0;
                if(m_algo_combedfft->hasNoteRecognized())
@@ -451,13 +473,31 @@ void CustomInstrumentTunerForm::refresh()
                m_quantizer->quantize(freq);
 
                if(!m_quantizer->isPlaying())
-                       ui_lblSoundStability->setBackgroundColor(empty_color);
+               {
+                       QPalette palette;
+                       palette.setColor(ui_lblSoundStability->backgroundRole(), empty_color);
+                       ui_lblSoundStability->setPalette(palette);
+               }
                else
                {
+            // Use 100ms rect window
+            int max_amplitude_limit = min(m_queue.size(),size_t(m_capture_thread.getSamplingRate()*100.0/1000));
+            double max_amplitude = 0.0;
+            for(int i=0;i<max_amplitude_limit; i++)
+                max_amplitude = max(max_amplitude, fabs(m_queue[i]));
+
                        if(max_amplitude>=1.0)
-                               ui_lblSoundStability->setBackgroundColor(prb_color);
+                       {
+                               QPalette palette;
+                               palette.setColor(ui_lblSoundStability->backgroundRole(), prb_color);
+                               ui_lblSoundStability->setPalette(palette);
+                       }
                        else
-                               ui_lblSoundStability->setBackgroundColor(ok_color);
+                       {
+                               QPalette palette;
+                               palette.setColor(ui_lblSoundStability->backgroundRole(), ok_color);
+                               ui_lblSoundStability->setPalette(palette);
+                       }
 
                        m_freq = m_quantizer->getAverageFrequency();
                        m_error = f2hf(m_freq, m_compared_freq);
@@ -496,12 +536,12 @@ void CustomInstrumentTunerForm::noteStarted(double freq, double dt)
 //     cerr << "CustomInstrumentTunerForm::noteStarted " << freq << "," << dt << endl;
 
        // set the compared freq
-       if(m_microtonalView->setting_show->isOn() && m_microtonalView->hasTuningFreqSelected())
+       if(m_microtonalView->setting_show->isChecked() && m_microtonalView->hasTuningFreqSelected())
                m_compared_freq = m_microtonalView->getTuningFreq();
        else
                m_compared_freq = m_quantizer->getCenterFrequency();    // h2f(f2h(freq));
 
-       if(m_microtonalView->setting_show->isOn() && m_microtonalView->hasTuningFreqSelected())
+       if(m_microtonalView->setting_show->isChecked() && m_microtonalView->hasTuningFreqSelected())
        {
                ui_txtNoteFreq->display(int(m_microtonalView->getTuningFreq()*100)/100.0);
                ui_txtNote->setText(m_microtonalView->getTuningNoteName());
@@ -519,7 +559,7 @@ void CustomInstrumentTunerForm::noteStarted(double freq, double dt)
        else
        {
                ui_txtNoteFreq->display(m_compared_freq);
-               ui_txtNote->setText(h2n(f2h(m_compared_freq)));
+               ui_txtNote->setText(QString::fromStdString(h2n(f2h(m_compared_freq))));
                m_glErrorHistory->addNote(GLErrorHistory::Note(f2h(m_compared_freq)));
                m_glVolumeHistory->addNote(GLVolumeHistory::Note(f2h(m_compared_freq)));
        }
@@ -532,7 +572,7 @@ void CustomInstrumentTunerForm::noteFinished(double freq, double dt)
 
 void CustomInstrumentTunerForm::refresh_data_sample()
 {
-       if(m_freq==0.0f || !m_glSample->setting_show->isOn())
+       if(m_freq==0.0f || !m_glSample->setting_show->isChecked())
        {
                m_glSample->clear();
                return;
@@ -547,7 +587,7 @@ void CustomInstrumentTunerForm::refresh_data_harmonics()
 {
        if(!(m_algo_combedfft!=NULL &&
                        m_freq>0.0f &&
-                       m_glFreqStruct->setting_show->isOn()))
+                       m_glFreqStruct->setting_show->isChecked()))
                return;
 
        vector<Harmonic> harms = GetHarmonicStruct(m_algo_combedfft->m_plan.out, m_freq, m_glFreqStruct->m_components.size(), m_algo_combedfft->getZeroPaddingFactor());
@@ -570,28 +610,28 @@ void CustomInstrumentTunerForm::refresh_views()
 
 //     m_dialTune->repaint();
 
-       if(m_glGraph->setting_show->isOn())
+       if(m_glGraph->setting_show->isChecked())
                m_glGraph->updateGL();
 
-       if(m_glErrorHistory->setting_show->isOn())
+       if(m_glErrorHistory->setting_show->isChecked())
                m_glErrorHistory->updateGL();
 
-       if(m_glVolumeHistory->setting_show->isOn())
+       if(m_glVolumeHistory->setting_show->isChecked())
                m_glVolumeHistory->updateGL();
 
-       if(m_microtonalView->setting_show->isOn())
+       if(m_microtonalView->setting_show->isChecked())
                m_microtonalView->update();
 
-       if(m_glSample->setting_show->isOn())
+       if(m_glSample->setting_show->isChecked())
                m_glSample->updateGL();
 
-       if(m_glFreqStruct->setting_show->isOn())
+       if(m_glFreqStruct->setting_show->isChecked())
                m_glFreqStruct->updateGL();
 
-       if(m_glFT->setting_show->isOn())
+       if(m_glFT->setting_show->isChecked())
                m_glFT->updateGL();
 
-       if(m_glStatistics->setting_show->isOn())
+       if(m_glStatistics->setting_show->isChecked())
                m_glStatistics->updateGL();
 
        m_time_refresh_views.start();
@@ -599,40 +639,38 @@ void CustomInstrumentTunerForm::refresh_views()
 
 void CustomInstrumentTunerForm::keyPressEvent(QKeyEvent * e)
 {
-       if(e->key()==Key_F)
+       if(e->key()==Qt::Key_F)
                toggleFullScreen();
 }
 
 void CustomInstrumentTunerForm::resizeEvent(QResizeEvent* e)
 {
        update_views();
-
-       InstrumentTunerForm::resizeEvent(e);
 }
 
 void CustomInstrumentTunerForm::update_views()
 {
-       if(     !m_glGraph->setting_show->isOn() &&
-               !m_glErrorHistory->setting_show->isOn() &&
-               !m_glVolumeHistory->setting_show->isOn() &&
-               !m_glSample->setting_show->isOn() &&
-               !m_glFreqStruct->setting_show->isOn() &&
-               !m_glFT->setting_show->isOn())
+       if(     !m_glGraph->setting_show->isChecked() &&
+               !m_glErrorHistory->setting_show->isChecked() &&
+               !m_glVolumeHistory->setting_show->isChecked() &&
+               !m_glSample->setting_show->isChecked() &&
+               !m_glFreqStruct->setting_show->isChecked() &&
+               !m_glFT->setting_show->isChecked())
                        m_dialTune->setMaximumWidth(size().width());
        else
                m_dialTune->setMaximumWidth(ui_rightLayout->minimumSize().width());
 
-       if(m_glGraph->setting_show->isOn() &&
-                       !m_glErrorHistory->setting_show->isOn() &&
-                       !m_glVolumeHistory->setting_show->isOn() &&
-                       !m_glSample->setting_show->isOn() &&
-                       !m_glFreqStruct->setting_show->isOn() &&
-                       !m_glFT->setting_show->isOn())
+       if(m_glGraph->setting_show->isChecked() &&
+                       !m_glErrorHistory->setting_show->isChecked() &&
+                       !m_glVolumeHistory->setting_show->isChecked() &&
+                       !m_glSample->setting_show->isChecked() &&
+                       !m_glFreqStruct->setting_show->isChecked() &&
+                       !m_glFT->setting_show->isChecked())
                m_glGraph->setMaximumHeight(size().height());
        else
                m_glGraph->setMaximumHeight(m_glGraph->setting_spinMaxHeight->value());
 
-       if(!m_glErrorHistory->setting_show->isOn() && !m_glVolumeHistory->setting_show->isOn())
+       if(!m_glErrorHistory->setting_show->isChecked() && !m_glVolumeHistory->setting_show->isChecked())
                ui_btnKeepErrorHistory->hide();
        else
                ui_btnKeepErrorHistory->show();
@@ -640,18 +678,23 @@ void CustomInstrumentTunerForm::update_views()
 
 void CustomInstrumentTunerForm::configure()
 {
+    // Checking PortAudio devices while capturing using ALSA seems to crash ALSA
+    // thus, stop everything while configuring and capture again when exiting the configuration panel
+    m_capture_thread.stopCapture();
+    
        noteRangeChanged();
 
        if(m_capture_thread.getCurrentTransportIndex()<m_config_form.ui_cbTransports->count());
-               m_config_form.ui_cbTransports->setCurrentItem(m_capture_thread.getCurrentTransportIndex());
+               m_config_form.ui_cbTransports->setCurrentIndex(m_capture_thread.getCurrentTransportIndex());
 
 #ifdef CAPTURE_JACK
        // TODO set descr
        m_config_form.ui_grpJACK->setTitle(m_capture_thread.getTransport("JACK")->getDescription());
        m_config_form.ui_lblJACKSamplingRate->setText(QString::number(m_capture_thread.getSamplingRate()));
 #endif
+
 #ifdef CAPTURE_PORTAUDIO
-       m_config_form.ui_grpPortAudio->setTitle(m_capture_thread.getTransport("PortAudio")->getDescription());
+    m_config_form.ui_grpPortAudio->setTitle(m_capture_thread.getTransport("PortAudio")->getDescription());
        m_config_form.ui_spinPortAudioSamplingRate->setValue(m_capture_thread.getSamplingRate());
        if(m_capture_thread.getTransport("PortAudio"))
        {
@@ -662,27 +705,27 @@ void CustomInstrumentTunerForm::configure()
                        if(err != paNoError)
                                throw QString("PortAudio: CustomInstrumentTunerForm::configure:Pa_Initialize ")+Pa_GetErrorText(err);
                        int     numDevices = Pa_GetDeviceCount();
-
                        int current_index = -1;
                        m_config_form.ui_cbPortAudioDeviceName->clear();
-                       m_config_form.ui_cbPortAudioDeviceName->insertItem("default");
                        const PaDeviceInfo* deviceInfo;
                        for(int i=0; i<numDevices; i++)
                        {
                                deviceInfo = Pa_GetDeviceInfo(i);
-                               m_config_form.ui_cbPortAudioDeviceName->insertItem(QString(deviceInfo->name));
+                               m_config_form.ui_cbPortAudioDeviceName->addItem(QString(deviceInfo->name));
                                if(QString(deviceInfo->name)==m_capture_thread.getTransport("PortAudio")->getSource())
-                                       current_index = i+1;
+                                       current_index = i;
                        }
-                       m_config_form.ui_cbPortAudioDeviceName->setCurrentItem(current_index);
+            if(current_index!=-1)
+                m_config_form.ui_cbPortAudioDeviceName->setCurrentIndex(current_index);
                }
                catch(QString error)
                {
-                       cerr << "CustomInstrumentTunerForm: ERROR: " << error << endl;
+                       cerr << "CustomInstrumentTunerForm: ERROR: " << error.toStdString() << endl;
                }
                Pa_Terminate();
        }
 #endif
+
 #ifdef CAPTURE_ALSA
        m_config_form.ui_grpALSA->setTitle(m_capture_thread.getTransport("ALSA")->getDescription());
        m_config_form.ui_spinALSASamplingRate->setValue(m_capture_thread.getSamplingRate());
@@ -692,12 +735,17 @@ void CustomInstrumentTunerForm::configure()
        m_config_form.ui_spinOSSSamplingRate->setValue(m_capture_thread.getSamplingRate());
 #endif
 
-       m_config_form.adjustSize();
+    m_config_form.adjustSize();
        m_config_form.show();
 }
+void CustomInstrumentTunerForm::configure_cancel()
+{
+    if(!pauseAction->isChecked() && !m_capture_thread.isCapturing())
+        m_capture_thread.startCapture();
+}
 void CustomInstrumentTunerForm::configure_ok()
 {
-       switch(m_config_form.ui_cbTuning->currentItem())
+    switch(m_config_form.ui_cbTuning->currentIndex())
        {
        case 0:
                SetTuning(CHROMATIC);
@@ -719,19 +767,19 @@ void CustomInstrumentTunerForm::configure_ok()
                break;
        }
 
-       if(m_config_form.ui_cbTonality->currentItem()==0)               SetTonality(0);
-       else if(m_config_form.ui_cbTonality->currentItem()==1)  SetTonality(+2);
+       if(m_config_form.ui_cbTonality->currentIndex()==0)              SetTonality(0);
+       else if(m_config_form.ui_cbTonality->currentIndex()==1) SetTonality(+2);
        else                                                                                                    SetTonality(-3);
 
-       if(m_config_form.ui_cbNotesName->currentItem()==0)              SetNotesName(LOCAL_ANGLO);
+       if(m_config_form.ui_cbNotesName->currentIndex()==0)             SetNotesName(LOCAL_ANGLO);
        else                                                                                                    SetNotesName(LOCAL_LATIN);
        m_microtonalView->notesNameChanged();
        m_microtonalView->setAFreq(Music::GetAFreq());
 
        SetSemitoneBounds(m_config_form.ui_spinMinHT->value(), m_config_form.ui_spinMaxHT->value());
 
-       ui_spinA3Offset->setShown(m_config_form.ui_chkShowA4Offset->isOn());
-       ui_lblA3Offset->setShown(m_config_form.ui_chkShowA4Offset->isOn());
+       ui_spinA3Offset->setShown(m_config_form.ui_chkShowA4Offset->isChecked());
+       ui_lblA3Offset->setShown(m_config_form.ui_chkShowA4Offset->isChecked());
 
        //      if(m_note!=-1000)
        //              ui_txtNote->setText(h2n(m_note));
@@ -785,18 +833,21 @@ void CustomInstrumentTunerForm::configure_ok()
                        m_capture_thread.setSamplingRate(m_config_form.ui_spinOSSSamplingRate->value());
        }
 #endif
-       m_timer_refresh.changeInterval(m_config_form.ui_spinRefreshTime->value());
+       m_timer_refresh.setInterval(m_config_form.ui_spinRefreshTime->value());
 
        // Views
-       m_glGraph->m_treshold = pow(10, m_config_form.ui_spinVolumeTreshold->value()/20.0);
+       m_glGraph->m_treshold = invlp(m_config_form.ui_spinVolumeTreshold->value());
        m_glGraph->clearValues();
 
 //     cerr << "c" << endl;
 
        if(m_config_form.ui_grpRangeFiltering->isChecked())
        {
+//         cout << "set filters " << GetSamplingRate() << endl;
+//         m_rect_range_filter.reset(int(GetSamplingRate()/6000.0));
                m_rect_range_filter.reset(int(GetSamplingRate()/h2f(GetSemitoneMin())));
-//             m_fir_range_filter.setImpulseResponse(fir1_highpass(int(GetSamplingRate()/h2f(GetSemitoneMin())), ));
+//         m_fir_range_filter.setImpulseResponse(fir1_bandpass(104, 2*1000.0/GetSamplingRate(), 2*2000.0/GetSamplingRate()));
+//             m_fir_range_filter.setImpulseResponse(fir1_highpass(int(GetSamplingRate()/h2f(GetSemitoneMin())), 0.5));
 
                if(m_config_form.ui_rdRangeFilteringRectangular->isChecked())
                        m_range_filter = &m_rect_range_filter;
@@ -809,9 +860,9 @@ void CustomInstrumentTunerForm::configure_ok()
        m_algo_combedfft->setWindowFactor(m_config_form.ui_spinWindowSizeFactor->value());
 //     m_glFT->m_zp_factor = m_config_form.ui_spinWindowSizeFactor->value();
        m_algo_combedfft->useAudibilityRatio(m_config_form.ui_chkAlgoUseSubHarmTresh->isChecked());
-       m_algo_combedfft->setAudibilityRatio(pow(10, -m_config_form.ui_spinCombedFFTAudibilityRatio->value()/20.0));
-       m_algo_combedfft->setAmplitudeTreshold(pow(10, m_config_form.ui_spinVolumeTreshold->value()/20.0));
-       m_algo_combedfft->setComponentTreshold(pow(10, m_config_form.ui_spinVolumeTreshold->value()/20.0));
+       m_algo_combedfft->setAudibilityRatio(invlp(-m_config_form.ui_spinCombedFFTAudibilityRatio->value()));
+       m_algo_combedfft->setAmplitudeTreshold(invlp(double(m_config_form.ui_spinVolumeTreshold->value())));
+       m_algo_combedfft->setComponentTreshold(invlp(double(m_config_form.ui_spinVolumeTreshold->value())));
 
 //     cerr << "d" << endl;
 
@@ -825,9 +876,9 @@ void CustomInstrumentTunerForm::configure_ok()
        else
                m_quantizer = &m_dummy_quantizer;
 
-//     cerr << pow(10, -m_config_form.ui_spinCombedFFTAudibilityRatio->value()/20.0) << endl;
+//     cerr << invlp(-m_config_form.ui_spinCombedFFTAudibilityRatio->value()) << endl;
 
-       if(!pauseAction->isOn() && !m_capture_thread.isCapturing())
+       if(!pauseAction->isChecked() && !m_capture_thread.isCapturing())
                m_capture_thread.startCapture();
 }
 
@@ -837,36 +888,38 @@ void CustomInstrumentTunerForm::saveSettings()
        View::saveAll();
 
        // views
-       m_settings.writeEntry("width", width());
-       m_settings.writeEntry("height", height());
-       m_settings.writeEntry("ui_tbViews", ui_tbViews->isShown());
-       m_settings.writeEntry("ui_tbButtons", ui_tbButtons->isShown());
+       m_settings.setValue("width", width());
+       m_settings.setValue("height", height());
+       //m_settings.setValue("ui_tbViews", QVariant(ui_tbViews->isVisible()));
+       //m_settings.setValue("ui_tbButtons", ui_tbButtons->isVisible());
 
        // sound capture
-       m_settings.writeEntry(m_config_form.ui_cbTransports->name(), m_config_form.ui_cbTransports->currentText());
+       m_settings.setValue(m_config_form.ui_cbTransports->objectName(), m_config_form.ui_cbTransports->currentText());
 #ifdef CAPTURE_PORTAUDIO
-       m_settings.writeEntry(m_config_form.ui_cbPortAudioDeviceName->name(), m_config_form.ui_cbPortAudioDeviceName->currentText());
+       m_settings.setValue(m_config_form.ui_cbPortAudioDeviceName->objectName(), m_config_form.ui_cbPortAudioDeviceName->currentText());
 #endif
 }
 void CustomInstrumentTunerForm::loadSettings()
 {
+//     cerr << __FILE__ << ":" << __LINE__ << endl;
+
        m_settings.load();
        View::loadAll();
 
        // views
-       resize(m_settings.readNumEntry("width", 800), m_settings.readNumEntry("height", 600));
-       ui_tbViews->setShown(m_settings.readBoolEntry("ui_tbViews", ui_tbViews->isShown()));
-       ui_tbButtons->setShown(m_settings.readBoolEntry("ui_tbButtons", ui_tbButtons->isShown()));
+       resize(m_settings.value("width", 800).toInt(), m_settings.value("height", 600).toInt());
+       //ui_tbViews->setVisible(m_settings.value("ui_tbViews", ui_tbViews->isVisible()).toBool());
+       //ui_tbButtons->setVisible(m_settings.value("ui_tbButtons", ui_tbButtons->isVisible()).toBool());
 
        // sound capture
-       QString saved_transport = m_settings.readEntry(m_config_form.ui_cbTransports->name(), "");
+       QString saved_transport = m_settings.value(m_config_form.ui_cbTransports->objectName(), "").toString();
        if(saved_transport!="")
                for(int i=0; i<m_config_form.ui_cbTransports->count(); i++)
-                       if(m_config_form.ui_cbTransports->text(i)==saved_transport)
-                               m_config_form.ui_cbTransports->setCurrentItem(i);
+                       if(m_config_form.ui_cbTransports->itemText(i)==saved_transport)
+                               m_config_form.ui_cbTransports->setCurrentIndex(i);
+
 #ifdef CAPTURE_PORTAUDIO
-//     cerr << "read: " << m_settings.readEntry("ui_cbPortAudioDeviceName", "default") << endl;
-       QString saved_device = m_settings.readEntry(m_config_form.ui_cbPortAudioDeviceName->name(), "default");
+       QString saved_device = m_settings.value(m_config_form.ui_cbPortAudioDeviceName->objectName(), "default").toString();
        try
        {
                PaError err;
@@ -874,21 +927,21 @@ void CustomInstrumentTunerForm::loadSettings()
                if(err != paNoError)
                        throw QString("PortAudio: CustomInstrumentTunerForm::loadSettings:Pa_Initialize ")+Pa_GetErrorText(err);
                int     numDevices = Pa_GetDeviceCount();
-
-               int current_index = 0;
+//         cerr << "PortAudio devices:"<< endl;
+        int saved_index = -1;
                m_config_form.ui_cbPortAudioDeviceName->clear();
-               m_config_form.ui_cbPortAudioDeviceName->insertItem("default");
                const PaDeviceInfo* deviceInfo;
                for(int i=0; i<numDevices; i++)
                {
                        deviceInfo = Pa_GetDeviceInfo(i);
-                       m_config_form.ui_cbPortAudioDeviceName->insertItem(QString(deviceInfo->name));
+//             cerr << "    " << QString(deviceInfo->name).toStdString() << endl;
+                       m_config_form.ui_cbPortAudioDeviceName->addItem(QString(deviceInfo->name));
                        if(QString(deviceInfo->name)==saved_device)
-                               current_index = i+1;
+                               saved_index = i;
                }
-               if(current_index<m_config_form.ui_cbPortAudioDeviceName->count())
-                       m_config_form.ui_cbPortAudioDeviceName->setCurrentItem(current_index);
-       }
+               if(saved_index!=-1)
+                       m_config_form.ui_cbPortAudioDeviceName->setCurrentIndex(saved_index);
+    }
        catch(QString error)
        {
 //             cerr << "CustomInstrumentTunerForm: ERROR: " << error << endl;
@@ -904,12 +957,13 @@ void CustomInstrumentTunerForm::restoreFactorySettings()
                m_settings.clear();
                View::clearAllSettings();
 
-               m_settings.removeEntry("width");
-               m_settings.removeEntry("height");
-               m_settings.removeEntry("ui_tbViews");
-               m_settings.removeEntry("ui_tbButtons");
+               m_settings.remove("width");
+               m_settings.remove("height");
+        m_settings.remove("ui_cbTransports");
+               //m_settings.remove("ui_tbViews");
+               //m_settings.remove("ui_tbButtons");
 
-               m_settings.removeEntry(m_config_form.ui_cbPortAudioDeviceName->name());
+               m_settings.remove(m_config_form.ui_cbPortAudioDeviceName->objectName());
 
                QMessageBox::information(this, tr("Restore Factory Settings"), tr("You can now restart FMIT to get back factory settings"), QMessageBox::Ok, QMessageBox::NoButton);
        }
@@ -923,7 +977,7 @@ void CustomInstrumentTunerForm::helpAbout()
        text += tr("</h3><p><h3>Website:</h3><p>homepage: <a href=\"http://home.gna.org/fmit\">http://home.gna.org/fmit</a>");
        text += tr("<p>development site: <a href=\"http://gna.org/projects/fmit\">http://gna.org/projects/fmit</a>");
        text += tr("<p>donation link: <a href=\"http://home.gna.org/fmit/donation.html\">http://home.gna.org/fmit/donation.html</a>");
-       text += tr("<p><h3>Author:</h3><p>Gilles Degottex [gilles.degottex@net2000.ch]");
+       text += tr("<p><h3>Author:</h3><p>Gilles Degottex <a href=\"mailto:gilles.degottex@gmail.com\">gilles.degottex@gmail.com</a>");
 #ifdef PACKAGER_STRING
        if(PACKAGER_STRING!="")
                text += tr("<p><h3>Packager:</h3><p>")+QString(PACKAGER_STRING).replace(QChar('<'),"[").replace(QChar('>'),"]");
@@ -931,35 +985,47 @@ void CustomInstrumentTunerForm::helpAbout()
 
        QDialog about_dlg(this);
 
-       QTextEdit* textEdit1;
+       QTextBrowser* textBrowser1;
        QPushButton* pushButton1;
        QVBoxLayout* Form2Layout;
        QHBoxLayout* layout1;
        QSpacerItem* spacer1;
        QSpacerItem* spacer2;
 
-       about_dlg.setName( tr("about_box") );
-       about_dlg.setCaption( tr("About Free Music Instrument Tuner") );
-       Form2Layout = new QVBoxLayout( &about_dlg, 11, 6, "Form2Layout");
+       about_dlg.setObjectName( tr("about_box") );
+       about_dlg.setWindowTitle( tr("About Free Music Instrument Tuner") );
+
+       Form2Layout = new QVBoxLayout( &about_dlg );
+       Form2Layout->setMargin(11);
+       Form2Layout->setSpacing(6);
+       about_dlg.setLayout( Form2Layout );
 
-       textEdit1 = new QTextEdit( &about_dlg, "textEdit1" );
-       textEdit1->setText(text);
-       textEdit1->setReadOnly(true);
-       Form2Layout->addWidget( textEdit1 );
+       textBrowser1 = new QTextBrowser( &about_dlg );
+       textBrowser1->setHtml(text);
+       textBrowser1->setOpenExternalLinks(true);
+       textBrowser1->setWordWrapMode(QTextOption::NoWrap);
+       textBrowser1->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+       textBrowser1->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+       textBrowser1->document()->adjustSize();
+       textBrowser1->setMinimumSize(textBrowser1->document()->size().toSize() + QSize(10, 10));
+       Form2Layout->addWidget( textBrowser1 );
+
+       layout1 = new QHBoxLayout();
+       layout1->setMargin(0);
+       layout1->setSpacing(6);
 
-       layout1 = new QHBoxLayout( 0, 0, 6, "layout1");
        spacer1 = new QSpacerItem( 40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
        layout1->addItem( spacer1 );
 
-       pushButton1 = new QPushButton( &about_dlg, "pushButton1" );
-       pushButton1->setText( tr( "OK" ) );
+       pushButton1 = new QPushButton(&about_dlg);
+       pushButton1->setText( tr( "&OK" ) );
        layout1->addWidget( pushButton1 );
        connect(pushButton1, SIGNAL(clicked()), &about_dlg, SLOT(close()));
+
        spacer2 = new QSpacerItem( 40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
        layout1->addItem( spacer2 );
+
        Form2Layout->addLayout( layout1 );
-       about_dlg.resize( QSize(400, textEdit1->heightForWidth(400)+100) );
-//     about_dlg.clearWState( WState_Polished );
 
        about_dlg.exec();
 }