diff --git a/samplebrain/Makefile.in b/samplebrain/Makefile.in index c13d21b..67aeb3b 100644 --- a/samplebrain/Makefile.in +++ b/samplebrain/Makefile.in @@ -16,7 +16,7 @@ SRCS := src/fft.cpp \ TARGET_SRCS := src/main.cpp # @CFLAGS@ -CCFLAGS = -Ofast -march=native -mtune=native -std=c++11 -ffast-math -Wno-unused -Isrc -I/opt/local/include +CCFLAGS = -g -Ofast -march=native -mtune=native -std=c++11 -ffast-math -Wno-unused -Isrc -I/opt/local/include LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ diff --git a/samplebrain/interface/buttons.svg b/samplebrain/interface/buttons.svg new file mode 100644 index 0000000..f689ce8 --- /dev/null +++ b/samplebrain/interface/buttons.svg @@ -0,0 +1,156 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/samplebrain/interface/samplebrain.ui b/samplebrain/interface/samplebrain.ui index 00de903..edda3a6 100644 --- a/samplebrain/interface/samplebrain.ui +++ b/samplebrain/interface/samplebrain.ui @@ -6,12 +6,12 @@ 0 0 - 643 - 619 + 1134 + 691 - samplebrain 0.0.5 + samplebrain 0.6 @@ -31,7 +31,7 @@ search - + @@ -77,6 +77,9 @@ plain fft match vs mfcc values + + 100 + 50 @@ -134,6 +137,9 @@ match original or normalised blocks + + 100 + 0 @@ -273,6 +279,9 @@ use new blocks rather than similar ones + + 100 + 0 @@ -333,6 +342,9 @@ how long it takes for the novelty to ware off + + 100 + 0 @@ -363,27 +375,151 @@ - - - - 0 - 0 - - - - + + + + + + Comic Sans MS + 9 + 75 + true + + + + + + + synpases + + + + + + + + 0 + 0 + + + + how many connections to search (ordered in closeness) + + + 1000 + + + 20 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + how many connections to search (ordered in closeness) + + + 1000 + + + 20 + + + + + + + + + + Comic Sans MS + 10 + 75 + true + - search for least similar - - - - 16 - 16 - + algorithm + + + + + + full brain search + + + basic + + + true + + + buttonGroup_3 + + + + + + + full brain reverse search + + + rev basic + + + buttonGroup_3 + + + + + + + search based on synapse connections + + + synaptic + + + false + + + buttonGroup_3 + + + + + + + false + + + search based on synapses and sonify search process + + + synaptic slide + + + true + + + buttonGroup_3 + + + + + @@ -391,7 +527,7 @@ - 40 + 21 20 @@ -641,6 +777,9 @@ bartlett + + buttonGroup_2 + @@ -648,6 +787,9 @@ blackman + + buttonGroup_2 + @@ -655,6 +797,9 @@ gaussian + + buttonGroup_2 + @@ -662,6 +807,9 @@ hamming + + buttonGroup_2 + @@ -669,6 +817,9 @@ hann + + buttonGroup_2 + @@ -676,6 +827,9 @@ flat top + + buttonGroup_2 + @@ -686,6 +840,9 @@ true + + buttonGroup_2 + @@ -693,6 +850,9 @@ rectangle + + buttonGroup_2 + @@ -733,13 +893,6 @@ - - - - - brain - - @@ -818,14 +971,27 @@ - - + + - bartlett + gaussian + + buttonGroup + - + + + + hamming + + + buttonGroup + + + + dodgy @@ -833,51 +999,62 @@ true + + buttonGroup + - + blackman + + buttonGroup + - - - - gaussian - - - - - - - hamming - - - - - - - hann - - - - - - - flat top - - - - + rectangle + + buttonGroup + - + + + + bartlett + + + buttonGroup + + + + + + + flat top + + + buttonGroup + + + + + + + hann + + + buttonGroup + + + + window shape @@ -896,14 +1073,14 @@ - (re)generate + (re)generate brain - + Comic Sans MS @@ -912,7 +1089,7 @@ - load + load brain @@ -926,7 +1103,7 @@ - save + save brain @@ -1245,22 +1422,6 @@ - - spinBoxBlockSize - valueChanged(int) - MainWindow - block_size(int) - - - 188 - 105 - - - 399 - 301 - - - pushButtonLoadTarget released() @@ -1357,54 +1518,6 @@ - - pushButtonGenerate - released() - MainWindow - generate() - - - 131 - 204 - - - 399 - 301 - - - - - pushButtonLoadSound - released() - MainWindow - load_sound() - - - 381 - 544 - - - 399 - 301 - - - - - doubleSpinBoxBlockOverlap - valueChanged(double) - MainWindow - block_overlap(double) - - - 188 - 138 - - - 361 - 301 - - - radioButton_hammingTarget toggled(bool) @@ -1421,22 +1534,6 @@ - - pushButtonDeleteSound - released() - MainWindow - delete_sound() - - - 476 - 544 - - - 361 - 301 - - - doubleSpinBoxBlockOverlapTarget valueChanged(double) @@ -1453,150 +1550,6 @@ - - radioButton_dodgy - toggled(bool) - MainWindow - window_dodgy(bool) - - - 75 - 203 - - - 361 - 301 - - - - - radioButton_blackman - toggled(bool) - MainWindow - window_blackman(bool) - - - 75 - 261 - - - 361 - 301 - - - - - radioButton_hann - toggled(bool) - MainWindow - window_hann(bool) - - - 188 - 261 - - - 361 - 301 - - - - - radioButton_hamming - toggled(bool) - MainWindow - window_hamming(bool) - - - 188 - 232 - - - 361 - 301 - - - - - radioButton_gaussian - toggled(bool) - MainWindow - window_gaussian(bool) - - - 188 - 203 - - - 361 - 301 - - - - - pushButtonClearBrain - released() - MainWindow - clear_brain() - - - 590 - 544 - - - 361 - 301 - - - - - radioButton_bartlett - toggled(bool) - MainWindow - window_bartlett(bool) - - - 75 - 232 - - - 361 - 301 - - - - - radioButton_flattop - toggled(bool) - MainWindow - window_flattop(bool) - - - 75 - 290 - - - 361 - 301 - - - - - radioButton_rectagle - toggled(bool) - MainWindow - window_rectangle(bool) - - - 188 - 290 - - - 361 - 301 - - - radioButton_rectangleTarget toggled(bool) @@ -1757,22 +1710,6 @@ - - checkBoxInvert - toggled(bool) - MainWindow - invert_slot(bool) - - - 189 - 313 - - - 361 - 306 - - - sliderNMix valueChanged(int) @@ -1901,6 +1838,390 @@ + + sliderSynapses + valueChanged(int) + spinBoxSynapses + setValue(int) + + + 237 + 289 + + + 341 + 289 + + + + + sliderSynapses + valueChanged(int) + MainWindow + synapses(int) + + + 237 + 289 + + + 566 + 345 + + + + + spinBoxSynapses + valueChanged(int) + sliderSynapses + setValue(int) + + + 341 + 289 + + + 237 + 289 + + + + + spinBoxSynapses + valueChanged(int) + MainWindow + synapses(int) + + + 341 + 289 + + + 566 + 345 + + + + + radioButtonAlgoBasic + toggled(bool) + MainWindow + algo_basic(bool) + + + 51 + 348 + + + 566 + 345 + + + + + radioButtonAlgoRevBasic + toggled(bool) + MainWindow + algo_rev_basic(bool) + + + 129 + 348 + + + 566 + 345 + + + + + radioButtonSynaptic + toggled(bool) + MainWindow + algo_synaptic(bool) + + + 215 + 348 + + + 566 + 345 + + + + + radioButtonSynapticSlide + toggled(bool) + MainWindow + algo_synaptic_slide(bool) + + + 314 + 348 + + + 566 + 345 + + + + + pushButtonLoadBrain + released() + MainWindow + load_brain() + + + 615 + 357 + + + 566 + 345 + + + + + pushButtonSaveBrain + released() + MainWindow + save_brain() + + + 728 + 357 + + + 566 + 345 + + + + + spinBoxBlockSize + valueChanged(int) + MainWindow + block_size(int) + + + 728 + 109 + + + 566 + 345 + + + + + doubleSpinBoxBlockOverlap + valueChanged(double) + MainWindow + block_overlap(double) + + + 728 + 145 + + + 566 + 345 + + + + + radioButton_dodgy + toggled(bool) + MainWindow + window_dodgy(bool) + + + 615 + 203 + + + 566 + 345 + + + + + radioButton_bartlett + toggled(bool) + MainWindow + window_bartlett(bool) + + + 615 + 232 + + + 566 + 345 + + + + + radioButton_blackman + toggled(bool) + MainWindow + window_blackman(bool) + + + 615 + 261 + + + 566 + 345 + + + + + radioButton_flattop + toggled(bool) + MainWindow + window_flattop(bool) + + + 615 + 290 + + + 566 + 345 + + + + + radioButton_gaussian + toggled(bool) + MainWindow + window_gaussian(bool) + + + 728 + 203 + + + 566 + 345 + + + + + radioButton_hamming + toggled(bool) + MainWindow + window_hamming(bool) + + + 728 + 232 + + + 566 + 345 + + + + + radioButton_hann + toggled(bool) + MainWindow + window_hann(bool) + + + 728 + 261 + + + 566 + 345 + + + + + radioButton_rectagle + toggled(bool) + MainWindow + window_target_rectangle(bool) + + + 728 + 290 + + + 566 + 345 + + + + + pushButtonGenerate + released() + MainWindow + generate() + + + 671 + 322 + + + 566 + 345 + + + + + pushButtonLoadSound + released() + MainWindow + load_sound() + + + 841 + 550 + + + 566 + 345 + + + + + pushButtonDeleteSound + released() + MainWindow + delete_sound() + + + 951 + 550 + + + 566 + 345 + + + + + pushButtonClearBrain + released() + MainWindow + clear_brain() + + + 1061 + 550 + + + 566 + 345 + + + play_slot() @@ -1955,5 +2276,17 @@ novelty_slot(double) boredom_slot(int) boredom_slot(double) + synapses(int) + algo_basic(bool) + algo_rev_basic(bool) + algo_synaptic(bool) + algo_synaptic_slide(bool) + load_brain() + save_brain() + + + + + diff --git a/samplebrain/qt/MainWindow.h b/samplebrain/qt/MainWindow.h index a56bea3..9129177 100644 --- a/samplebrain/qt/MainWindow.h +++ b/samplebrain/qt/MainWindow.h @@ -92,7 +92,9 @@ private slots: lo_send(m_audio_address,"/boredom","f",s); m_Ui.sliderBoredom->setValue(s*100); } - + void synapses(int s) { + lo_send(m_audio_address,"/synapses","i",s); + } void target_mix_slot(int s) { lo_send(m_audio_address,"/target_mix","f",s/100.0f); m_Ui.doubleSpinBoxTargetMix->setValue(s/100.0f); @@ -103,11 +105,12 @@ private slots: } void volume_slot(int s) { lo_send(m_audio_address,"/volume","f",s/100.0f); } - void invert_slot(bool s) { if (s) { - lo_send(m_audio_address,"/search_algo","i",1); - } else { - lo_send(m_audio_address,"/search_algo","i",0); - }} + + void algo_basic(bool s) { if (s) lo_send(m_audio_address,"/search_algo","i",0); } + void algo_rev_basic(bool s) { if (s) lo_send(m_audio_address,"/search_algo","i",1); } + void algo_synaptic(bool s) { if (s) lo_send(m_audio_address,"/search_algo","i",2); } + void algo_synaptic_slide(bool s) { if (s) lo_send(m_audio_address,"/search_algo","i",3); } + void run_slot() {} void load_target() { m_last_file=QFileDialog::getOpenFileName( @@ -196,6 +199,26 @@ private slots: lo_send(m_audio_address,"/stop",""); } + void load_brain() { + m_last_file=QFileDialog::getOpenFileName( + this, + QString("Select a brain file"), + m_last_file, + QString("Brains (*.brain)")); + + lo_send(m_process_address,"/load_brain","s",m_last_file.toStdString().c_str()); + } + void save_brain() { + m_last_file=QFileDialog::getSaveFileName( + this, + QString("Select a brain file"), + m_last_file, + QString("Brains (*.brain)")); + + lo_send(m_process_address,"/save_brain","s",m_last_file.toStdString().c_str()); + } + + void update_status() { m_feedback.poll(m_Ui.statusbar); } diff --git a/samplebrain/qt/audio_thread.cpp b/samplebrain/qt/audio_thread.cpp index a26448e..37a3994 100644 --- a/samplebrain/qt/audio_thread.cpp +++ b/samplebrain/qt/audio_thread.cpp @@ -37,9 +37,7 @@ static bool state = 1; audio_thread::~audio_thread() { state=0; - cerr<<"deleting audio device"<set_playing(true); } @@ -117,6 +115,9 @@ void audio_thread::process(sample &s, sample &s2) { if (name=="/boredom") { m_renderer->get_source().set_usage_falloff(cmd.get_float(0)); } + if (name=="/synapses") { + m_renderer->get_params()->m_num_synapses=cmd.get_int(0); + } } s.zero(); diff --git a/samplebrain/qt/audio_thread.h b/samplebrain/qt/audio_thread.h index 42367b9..7287ca9 100644 --- a/samplebrain/qt/audio_thread.h +++ b/samplebrain/qt/audio_thread.h @@ -33,10 +33,11 @@ public: static void run_audio(void* c, unsigned int frames); audio_device *m_audio_device; + renderer *m_renderer; + private: void start_audio(); - renderer *m_renderer; OSC_server m_osc; process_thread &m_process_thread; pthread_mutex_t* m_brain_mutex; diff --git a/samplebrain/qt/generated/ui_samplebrain.h b/samplebrain/qt/generated/ui_samplebrain.h index d2262ea..fe30b05 100644 --- a/samplebrain/qt/generated/ui_samplebrain.h +++ b/samplebrain/qt/generated/ui_samplebrain.h @@ -1,20 +1,19 @@ /******************************************************************************** -** Form generated from reading UI file 'samplebraing19815.ui' +** Form generated from reading UI file 'samplebrainuQB562.ui' ** -** Created: Mon Jul 27 14:41:28 2015 +** Created: Tue Aug 4 16:33:54 2015 ** by: Qt User Interface Compiler version 4.8.1 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ -#ifndef SAMPLEBRAING19815_H -#define SAMPLEBRAING19815_H +#ifndef SAMPLEBRAINUQB562_H +#define SAMPLEBRAINUQB562_H #include #include #include #include -#include #include #include #include @@ -43,7 +42,7 @@ public: QVBoxLayout *verticalLayout_4; QTabWidget *tabWidget; QWidget *controlTab; - QHBoxLayout *horizontalLayout_17; + QHBoxLayout *horizontalLayout_19; QVBoxLayout *verticalLayout_3; QLabel *label_19; QHBoxLayout *horizontalLayout_16; @@ -68,7 +67,16 @@ public: QLabel *label_25; QSlider *sliderBoredom; QDoubleSpinBox *doubleSpinBoxBoredom; - QCheckBox *checkBoxInvert; + QHBoxLayout *horizontalLayout_17; + QLabel *label_26; + QSlider *sliderSynapses; + QSpinBox *spinBoxSynapses; + QLabel *label_27; + QHBoxLayout *horizontalLayout_18; + QRadioButton *radioButtonAlgoBasic; + QRadioButton *radioButtonAlgoRevBasic; + QRadioButton *radioButtonSynaptic; + QRadioButton *radioButtonSynapticSlide; QSpacerItem *horizontalSpacer_2; QSpacerItem *verticalSpacer_3; QLabel *label_23; @@ -101,8 +109,6 @@ public: QLabel *label_14; QPushButton *pushButtonGenerateTarget; QSpacerItem *verticalSpacer; - QWidget *sampleTab; - QHBoxLayout *horizontalLayout_5; QVBoxLayout *verticalLayout_2; QLabel *label_3; QHBoxLayout *horizontalLayout_4; @@ -112,18 +118,18 @@ public: QLabel *label_2; QDoubleSpinBox *doubleSpinBoxBlockOverlap; QGridLayout *gridLayout; - QRadioButton *radioButton_bartlett; - QRadioButton *radioButton_dodgy; - QRadioButton *radioButton_blackman; QRadioButton *radioButton_gaussian; QRadioButton *radioButton_hamming; - QRadioButton *radioButton_hann; - QRadioButton *radioButton_flattop; + QRadioButton *radioButton_dodgy; + QRadioButton *radioButton_blackman; QRadioButton *radioButton_rectagle; + QRadioButton *radioButton_bartlett; + QRadioButton *radioButton_flattop; + QRadioButton *radioButton_hann; QLabel *label_4; QPushButton *pushButtonGenerate; QHBoxLayout *horizontalLayout_7; - QPushButton *pushButtonLosdBrain; + QPushButton *pushButtonLoadBrain; QPushButton *pushButtonSaveBrain; QSpacerItem *verticalSpacer_2; QVBoxLayout *verticalLayout; @@ -145,12 +151,15 @@ public: QSpacerItem *horizontalSpacer; QLabel *label_13; QStatusBar *statusbar; + QButtonGroup *buttonGroup; + QButtonGroup *buttonGroup_2; + QButtonGroup *buttonGroup_3; void setupUi(QMainWindow *MainWindow) { if (MainWindow->objectName().isEmpty()) MainWindow->setObjectName(QString::fromUtf8("MainWindow")); - MainWindow->resize(643, 619); + MainWindow->resize(1134, 691); centralwidget = new QWidget(MainWindow); centralwidget->setObjectName(QString::fromUtf8("centralwidget")); verticalLayout_4 = new QVBoxLayout(centralwidget); @@ -164,8 +173,8 @@ public: tabWidget->setFont(font); controlTab = new QWidget(); controlTab->setObjectName(QString::fromUtf8("controlTab")); - horizontalLayout_17 = new QHBoxLayout(controlTab); - horizontalLayout_17->setObjectName(QString::fromUtf8("horizontalLayout_17")); + horizontalLayout_19 = new QHBoxLayout(controlTab); + horizontalLayout_19->setObjectName(QString::fromUtf8("horizontalLayout_19")); verticalLayout_3 = new QVBoxLayout(); verticalLayout_3->setObjectName(QString::fromUtf8("verticalLayout_3")); label_19 = new QLabel(controlTab); @@ -199,6 +208,7 @@ public: sizePolicy.setVerticalStretch(0); sizePolicy.setHeightForWidth(sliderRatio->sizePolicy().hasHeightForWidth()); sliderRatio->setSizePolicy(sizePolicy); + sliderRatio->setMaximum(100); sliderRatio->setValue(50); sliderRatio->setOrientation(Qt::Horizontal); @@ -232,6 +242,7 @@ public: sliderNRatio->setObjectName(QString::fromUtf8("sliderNRatio")); sizePolicy.setHeightForWidth(sliderNRatio->sizePolicy().hasHeightForWidth()); sliderNRatio->setSizePolicy(sizePolicy); + sliderNRatio->setMaximum(100); sliderNRatio->setValue(0); sliderNRatio->setOrientation(Qt::Horizontal); @@ -303,6 +314,7 @@ public: sliderNovelty->setObjectName(QString::fromUtf8("sliderNovelty")); sizePolicy.setHeightForWidth(sliderNovelty->sizePolicy().hasHeightForWidth()); sliderNovelty->setSizePolicy(sizePolicy); + sliderNovelty->setMaximum(100); sliderNovelty->setValue(0); sliderNovelty->setOrientation(Qt::Horizontal); @@ -333,6 +345,7 @@ public: sliderBoredom->setObjectName(QString::fromUtf8("sliderBoredom")); sizePolicy.setHeightForWidth(sliderBoredom->sizePolicy().hasHeightForWidth()); sliderBoredom->setSizePolicy(sizePolicy); + sliderBoredom->setMaximum(100); sliderBoredom->setValue(0); sliderBoredom->setOrientation(Qt::Horizontal); @@ -351,14 +364,83 @@ public: verticalLayout_3->addLayout(horizontalLayout_11); - checkBoxInvert = new QCheckBox(controlTab); - checkBoxInvert->setObjectName(QString::fromUtf8("checkBoxInvert")); - checkBoxInvert->setSizeIncrement(QSize(0, 0)); - checkBoxInvert->setIconSize(QSize(16, 16)); + horizontalLayout_17 = new QHBoxLayout(); + horizontalLayout_17->setObjectName(QString::fromUtf8("horizontalLayout_17")); + label_26 = new QLabel(controlTab); + label_26->setObjectName(QString::fromUtf8("label_26")); + label_26->setFont(font2); - verticalLayout_3->addWidget(checkBoxInvert); + horizontalLayout_17->addWidget(label_26); - horizontalSpacer_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + sliderSynapses = new QSlider(controlTab); + sliderSynapses->setObjectName(QString::fromUtf8("sliderSynapses")); + sizePolicy.setHeightForWidth(sliderSynapses->sizePolicy().hasHeightForWidth()); + sliderSynapses->setSizePolicy(sizePolicy); + sliderSynapses->setMaximum(1000); + sliderSynapses->setValue(20); + sliderSynapses->setOrientation(Qt::Horizontal); + + horizontalLayout_17->addWidget(sliderSynapses); + + spinBoxSynapses = new QSpinBox(controlTab); + spinBoxSynapses->setObjectName(QString::fromUtf8("spinBoxSynapses")); + sizePolicy1.setHeightForWidth(spinBoxSynapses->sizePolicy().hasHeightForWidth()); + spinBoxSynapses->setSizePolicy(sizePolicy1); + spinBoxSynapses->setMaximum(1000); + spinBoxSynapses->setValue(20); + + horizontalLayout_17->addWidget(spinBoxSynapses); + + + verticalLayout_3->addLayout(horizontalLayout_17); + + label_27 = new QLabel(controlTab); + label_27->setObjectName(QString::fromUtf8("label_27")); + QFont font3; + font3.setFamily(QString::fromUtf8("Comic Sans MS")); + font3.setPointSize(10); + font3.setBold(true); + font3.setWeight(75); + label_27->setFont(font3); + + verticalLayout_3->addWidget(label_27); + + horizontalLayout_18 = new QHBoxLayout(); + horizontalLayout_18->setObjectName(QString::fromUtf8("horizontalLayout_18")); + radioButtonAlgoBasic = new QRadioButton(controlTab); + buttonGroup_3 = new QButtonGroup(MainWindow); + buttonGroup_3->setObjectName(QString::fromUtf8("buttonGroup_3")); + buttonGroup_3->addButton(radioButtonAlgoBasic); + radioButtonAlgoBasic->setObjectName(QString::fromUtf8("radioButtonAlgoBasic")); + radioButtonAlgoBasic->setChecked(true); + + horizontalLayout_18->addWidget(radioButtonAlgoBasic); + + radioButtonAlgoRevBasic = new QRadioButton(controlTab); + buttonGroup_3->addButton(radioButtonAlgoRevBasic); + radioButtonAlgoRevBasic->setObjectName(QString::fromUtf8("radioButtonAlgoRevBasic")); + + horizontalLayout_18->addWidget(radioButtonAlgoRevBasic); + + radioButtonSynaptic = new QRadioButton(controlTab); + buttonGroup_3->addButton(radioButtonSynaptic); + radioButtonSynaptic->setObjectName(QString::fromUtf8("radioButtonSynaptic")); + radioButtonSynaptic->setChecked(false); + + horizontalLayout_18->addWidget(radioButtonSynaptic); + + radioButtonSynapticSlide = new QRadioButton(controlTab); + buttonGroup_3->addButton(radioButtonSynapticSlide); + radioButtonSynapticSlide->setObjectName(QString::fromUtf8("radioButtonSynapticSlide")); + radioButtonSynapticSlide->setEnabled(false); + radioButtonSynapticSlide->setCheckable(true); + + horizontalLayout_18->addWidget(radioButtonSynapticSlide); + + + verticalLayout_3->addLayout(horizontalLayout_18); + + horizontalSpacer_2 = new QSpacerItem(21, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); verticalLayout_3->addItem(horizontalSpacer_2); @@ -434,7 +516,7 @@ public: verticalLayout_3->addLayout(horizontalLayout_9); - horizontalLayout_17->addLayout(verticalLayout_3); + horizontalLayout_19->addLayout(verticalLayout_3); verticalLayout_6 = new QVBoxLayout(); verticalLayout_6->setObjectName(QString::fromUtf8("verticalLayout_6")); @@ -490,42 +572,52 @@ public: gridLayout_2 = new QGridLayout(); gridLayout_2->setObjectName(QString::fromUtf8("gridLayout_2")); radioButton_bartlettTarget = new QRadioButton(controlTab); + buttonGroup_2 = new QButtonGroup(MainWindow); + buttonGroup_2->setObjectName(QString::fromUtf8("buttonGroup_2")); + buttonGroup_2->addButton(radioButton_bartlettTarget); radioButton_bartlettTarget->setObjectName(QString::fromUtf8("radioButton_bartlettTarget")); gridLayout_2->addWidget(radioButton_bartlettTarget, 3, 0, 1, 1); radioButton_blackmanTarget = new QRadioButton(controlTab); + buttonGroup_2->addButton(radioButton_blackmanTarget); radioButton_blackmanTarget->setObjectName(QString::fromUtf8("radioButton_blackmanTarget")); gridLayout_2->addWidget(radioButton_blackmanTarget, 4, 0, 1, 1); radioButton_gaussianTarget = new QRadioButton(controlTab); + buttonGroup_2->addButton(radioButton_gaussianTarget); radioButton_gaussianTarget->setObjectName(QString::fromUtf8("radioButton_gaussianTarget")); gridLayout_2->addWidget(radioButton_gaussianTarget, 2, 1, 1, 1); radioButton_hammingTarget = new QRadioButton(controlTab); + buttonGroup_2->addButton(radioButton_hammingTarget); radioButton_hammingTarget->setObjectName(QString::fromUtf8("radioButton_hammingTarget")); gridLayout_2->addWidget(radioButton_hammingTarget, 3, 1, 1, 1); radioButton_hannTarget = new QRadioButton(controlTab); + buttonGroup_2->addButton(radioButton_hannTarget); radioButton_hannTarget->setObjectName(QString::fromUtf8("radioButton_hannTarget")); gridLayout_2->addWidget(radioButton_hannTarget, 4, 1, 1, 1); radioButton_flattopTarget = new QRadioButton(controlTab); + buttonGroup_2->addButton(radioButton_flattopTarget); radioButton_flattopTarget->setObjectName(QString::fromUtf8("radioButton_flattopTarget")); gridLayout_2->addWidget(radioButton_flattopTarget, 5, 0, 1, 1); radioButton_dodgyTarget = new QRadioButton(controlTab); + buttonGroup_2->addButton(radioButton_dodgyTarget); radioButton_dodgyTarget->setObjectName(QString::fromUtf8("radioButton_dodgyTarget")); radioButton_dodgyTarget->setChecked(true); gridLayout_2->addWidget(radioButton_dodgyTarget, 2, 0, 1, 1); radioButton_rectangleTarget = new QRadioButton(controlTab); + buttonGroup_2->addButton(radioButton_rectangleTarget); radioButton_rectangleTarget->setObjectName(QString::fromUtf8("radioButton_rectangleTarget")); gridLayout_2->addWidget(radioButton_rectangleTarget, 5, 1, 1, 1); @@ -549,16 +641,11 @@ public: verticalLayout_6->addItem(verticalSpacer); - horizontalLayout_17->addLayout(verticalLayout_6); + horizontalLayout_19->addLayout(verticalLayout_6); - tabWidget->addTab(controlTab, QString()); - sampleTab = new QWidget(); - sampleTab->setObjectName(QString::fromUtf8("sampleTab")); - horizontalLayout_5 = new QHBoxLayout(sampleTab); - horizontalLayout_5->setObjectName(QString::fromUtf8("horizontalLayout_5")); verticalLayout_2 = new QVBoxLayout(); verticalLayout_2->setObjectName(QString::fromUtf8("verticalLayout_2")); - label_3 = new QLabel(sampleTab); + label_3 = new QLabel(controlTab); label_3->setObjectName(QString::fromUtf8("label_3")); label_3->setFont(font1); @@ -566,13 +653,13 @@ public: horizontalLayout_4 = new QHBoxLayout(); horizontalLayout_4->setObjectName(QString::fromUtf8("horizontalLayout_4")); - label = new QLabel(sampleTab); + label = new QLabel(controlTab); label->setObjectName(QString::fromUtf8("label")); label->setFont(font); horizontalLayout_4->addWidget(label); - spinBoxBlockSize = new QSpinBox(sampleTab); + spinBoxBlockSize = new QSpinBox(controlTab); spinBoxBlockSize->setObjectName(QString::fromUtf8("spinBoxBlockSize")); spinBoxBlockSize->setMaximum(99999); spinBoxBlockSize->setValue(3000); @@ -584,13 +671,13 @@ public: horizontalLayout_6 = new QHBoxLayout(); horizontalLayout_6->setObjectName(QString::fromUtf8("horizontalLayout_6")); - label_2 = new QLabel(sampleTab); + label_2 = new QLabel(controlTab); label_2->setObjectName(QString::fromUtf8("label_2")); label_2->setFont(font); horizontalLayout_6->addWidget(label_2); - doubleSpinBoxBlockOverlap = new QDoubleSpinBox(sampleTab); + doubleSpinBoxBlockOverlap = new QDoubleSpinBox(controlTab); doubleSpinBoxBlockOverlap->setObjectName(QString::fromUtf8("doubleSpinBoxBlockOverlap")); doubleSpinBoxBlockOverlap->setMaximum(1); doubleSpinBoxBlockOverlap->setSingleStep(0.01); @@ -603,56 +690,66 @@ public: gridLayout = new QGridLayout(); gridLayout->setObjectName(QString::fromUtf8("gridLayout")); - radioButton_bartlett = new QRadioButton(sampleTab); - radioButton_bartlett->setObjectName(QString::fromUtf8("radioButton_bartlett")); + radioButton_gaussian = new QRadioButton(controlTab); + buttonGroup = new QButtonGroup(MainWindow); + buttonGroup->setObjectName(QString::fromUtf8("buttonGroup")); + buttonGroup->addButton(radioButton_gaussian); + radioButton_gaussian->setObjectName(QString::fromUtf8("radioButton_gaussian")); - gridLayout->addWidget(radioButton_bartlett, 3, 0, 1, 1); + gridLayout->addWidget(radioButton_gaussian, 3, 1, 1, 1); - radioButton_dodgy = new QRadioButton(sampleTab); + radioButton_hamming = new QRadioButton(controlTab); + buttonGroup->addButton(radioButton_hamming); + radioButton_hamming->setObjectName(QString::fromUtf8("radioButton_hamming")); + + gridLayout->addWidget(radioButton_hamming, 4, 1, 1, 1); + + radioButton_dodgy = new QRadioButton(controlTab); + buttonGroup->addButton(radioButton_dodgy); radioButton_dodgy->setObjectName(QString::fromUtf8("radioButton_dodgy")); radioButton_dodgy->setChecked(true); - gridLayout->addWidget(radioButton_dodgy, 2, 0, 1, 1); + gridLayout->addWidget(radioButton_dodgy, 3, 0, 1, 1); - radioButton_blackman = new QRadioButton(sampleTab); + radioButton_blackman = new QRadioButton(controlTab); + buttonGroup->addButton(radioButton_blackman); radioButton_blackman->setObjectName(QString::fromUtf8("radioButton_blackman")); - gridLayout->addWidget(radioButton_blackman, 4, 0, 1, 1); + gridLayout->addWidget(radioButton_blackman, 5, 0, 1, 1); - radioButton_gaussian = new QRadioButton(sampleTab); - radioButton_gaussian->setObjectName(QString::fromUtf8("radioButton_gaussian")); - - gridLayout->addWidget(radioButton_gaussian, 2, 1, 1, 1); - - radioButton_hamming = new QRadioButton(sampleTab); - radioButton_hamming->setObjectName(QString::fromUtf8("radioButton_hamming")); - - gridLayout->addWidget(radioButton_hamming, 3, 1, 1, 1); - - radioButton_hann = new QRadioButton(sampleTab); - radioButton_hann->setObjectName(QString::fromUtf8("radioButton_hann")); - - gridLayout->addWidget(radioButton_hann, 4, 1, 1, 1); - - radioButton_flattop = new QRadioButton(sampleTab); - radioButton_flattop->setObjectName(QString::fromUtf8("radioButton_flattop")); - - gridLayout->addWidget(radioButton_flattop, 5, 0, 1, 1); - - radioButton_rectagle = new QRadioButton(sampleTab); + radioButton_rectagle = new QRadioButton(controlTab); + buttonGroup->addButton(radioButton_rectagle); radioButton_rectagle->setObjectName(QString::fromUtf8("radioButton_rectagle")); - gridLayout->addWidget(radioButton_rectagle, 5, 1, 1, 1); + gridLayout->addWidget(radioButton_rectagle, 6, 1, 1, 1); - label_4 = new QLabel(sampleTab); + radioButton_bartlett = new QRadioButton(controlTab); + buttonGroup->addButton(radioButton_bartlett); + radioButton_bartlett->setObjectName(QString::fromUtf8("radioButton_bartlett")); + + gridLayout->addWidget(radioButton_bartlett, 4, 0, 1, 1); + + radioButton_flattop = new QRadioButton(controlTab); + buttonGroup->addButton(radioButton_flattop); + radioButton_flattop->setObjectName(QString::fromUtf8("radioButton_flattop")); + + gridLayout->addWidget(radioButton_flattop, 6, 0, 1, 1); + + radioButton_hann = new QRadioButton(controlTab); + buttonGroup->addButton(radioButton_hann); + radioButton_hann->setObjectName(QString::fromUtf8("radioButton_hann")); + + gridLayout->addWidget(radioButton_hann, 5, 1, 1, 1); + + label_4 = new QLabel(controlTab); label_4->setObjectName(QString::fromUtf8("label_4")); - gridLayout->addWidget(label_4, 1, 0, 1, 1); + gridLayout->addWidget(label_4, 2, 0, 1, 1); verticalLayout_2->addLayout(gridLayout); - pushButtonGenerate = new QPushButton(sampleTab); + pushButtonGenerate = new QPushButton(controlTab); pushButtonGenerate->setObjectName(QString::fromUtf8("pushButtonGenerate")); pushButtonGenerate->setFont(font); @@ -660,13 +757,13 @@ public: horizontalLayout_7 = new QHBoxLayout(); horizontalLayout_7->setObjectName(QString::fromUtf8("horizontalLayout_7")); - pushButtonLosdBrain = new QPushButton(sampleTab); - pushButtonLosdBrain->setObjectName(QString::fromUtf8("pushButtonLosdBrain")); - pushButtonLosdBrain->setFont(font); + pushButtonLoadBrain = new QPushButton(controlTab); + pushButtonLoadBrain->setObjectName(QString::fromUtf8("pushButtonLoadBrain")); + pushButtonLoadBrain->setFont(font); - horizontalLayout_7->addWidget(pushButtonLosdBrain); + horizontalLayout_7->addWidget(pushButtonLoadBrain); - pushButtonSaveBrain = new QPushButton(sampleTab); + pushButtonSaveBrain = new QPushButton(controlTab); pushButtonSaveBrain->setObjectName(QString::fromUtf8("pushButtonSaveBrain")); pushButtonSaveBrain->setFont(font); @@ -680,36 +777,36 @@ public: verticalLayout_2->addItem(verticalSpacer_2); - horizontalLayout_5->addLayout(verticalLayout_2); + horizontalLayout_19->addLayout(verticalLayout_2); verticalLayout = new QVBoxLayout(); verticalLayout->setObjectName(QString::fromUtf8("verticalLayout")); - label_5 = new QLabel(sampleTab); + label_5 = new QLabel(controlTab); label_5->setObjectName(QString::fromUtf8("label_5")); label_5->setFont(font); verticalLayout->addWidget(label_5); - listWidgetSounds = new QListWidget(sampleTab); + listWidgetSounds = new QListWidget(controlTab); listWidgetSounds->setObjectName(QString::fromUtf8("listWidgetSounds")); verticalLayout->addWidget(listWidgetSounds); horizontalLayout_2 = new QHBoxLayout(); horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2")); - pushButtonLoadSound = new QPushButton(sampleTab); + pushButtonLoadSound = new QPushButton(controlTab); pushButtonLoadSound->setObjectName(QString::fromUtf8("pushButtonLoadSound")); pushButtonLoadSound->setFont(font); horizontalLayout_2->addWidget(pushButtonLoadSound); - pushButtonDeleteSound = new QPushButton(sampleTab); + pushButtonDeleteSound = new QPushButton(controlTab); pushButtonDeleteSound->setObjectName(QString::fromUtf8("pushButtonDeleteSound")); pushButtonDeleteSound->setFont(font); horizontalLayout_2->addWidget(pushButtonDeleteSound); - pushButtonClearBrain = new QPushButton(sampleTab); + pushButtonClearBrain = new QPushButton(controlTab); pushButtonClearBrain->setObjectName(QString::fromUtf8("pushButtonClearBrain")); pushButtonClearBrain->setFont(font); @@ -719,9 +816,9 @@ public: verticalLayout->addLayout(horizontalLayout_2); - horizontalLayout_5->addLayout(verticalLayout); + horizontalLayout_19->addLayout(verticalLayout); - tabWidget->addTab(sampleTab, QString()); + tabWidget->addTab(controlTab, QString()); logTab = new QWidget(); logTab->setObjectName(QString::fromUtf8("logTab")); horizontalLayout_15 = new QHBoxLayout(logTab); @@ -809,28 +906,14 @@ public: QObject::connect(dialVolume, SIGNAL(sliderMoved(int)), MainWindow, SLOT(volume_slot(int))); QObject::connect(pushButtonStopRecord, SIGNAL(released()), MainWindow, SLOT(stop_record())); QObject::connect(pushButtonRecord, SIGNAL(released()), MainWindow, SLOT(record())); - QObject::connect(spinBoxBlockSize, SIGNAL(valueChanged(int)), MainWindow, SLOT(block_size(int))); QObject::connect(pushButtonLoadTarget, SIGNAL(released()), MainWindow, SLOT(load_target())); QObject::connect(pushButtonGenerateTarget, SIGNAL(released()), MainWindow, SLOT(generate_target_blocks())); QObject::connect(spinBoxBlockSizeTarget, SIGNAL(valueChanged(int)), MainWindow, SLOT(target_block_size(int))); QObject::connect(doubleSpinBoxRatio, SIGNAL(valueChanged(double)), MainWindow, SLOT(ratio_slot(double))); QObject::connect(spinBoxFFT1Start, SIGNAL(valueChanged(int)), MainWindow, SLOT(fft1_start_slot(int))); QObject::connect(spinBoxFFT1End, SIGNAL(valueChanged(int)), MainWindow, SLOT(fft1_end_slot(int))); - QObject::connect(pushButtonGenerate, SIGNAL(released()), MainWindow, SLOT(generate())); - QObject::connect(pushButtonLoadSound, SIGNAL(released()), MainWindow, SLOT(load_sound())); - QObject::connect(doubleSpinBoxBlockOverlap, SIGNAL(valueChanged(double)), MainWindow, SLOT(block_overlap(double))); QObject::connect(radioButton_hammingTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_hamming(bool))); - QObject::connect(pushButtonDeleteSound, SIGNAL(released()), MainWindow, SLOT(delete_sound())); QObject::connect(doubleSpinBoxBlockOverlapTarget, SIGNAL(valueChanged(double)), MainWindow, SLOT(target_block_overlap(double))); - QObject::connect(radioButton_dodgy, SIGNAL(toggled(bool)), MainWindow, SLOT(window_dodgy(bool))); - QObject::connect(radioButton_blackman, SIGNAL(toggled(bool)), MainWindow, SLOT(window_blackman(bool))); - QObject::connect(radioButton_hann, SIGNAL(toggled(bool)), MainWindow, SLOT(window_hann(bool))); - QObject::connect(radioButton_hamming, SIGNAL(toggled(bool)), MainWindow, SLOT(window_hamming(bool))); - QObject::connect(radioButton_gaussian, SIGNAL(toggled(bool)), MainWindow, SLOT(window_gaussian(bool))); - QObject::connect(pushButtonClearBrain, SIGNAL(released()), MainWindow, SLOT(clear_brain())); - QObject::connect(radioButton_bartlett, SIGNAL(toggled(bool)), MainWindow, SLOT(window_bartlett(bool))); - QObject::connect(radioButton_flattop, SIGNAL(toggled(bool)), MainWindow, SLOT(window_flattop(bool))); - QObject::connect(radioButton_rectagle, SIGNAL(toggled(bool)), MainWindow, SLOT(window_rectangle(bool))); QObject::connect(radioButton_rectangleTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_rectangle(bool))); QObject::connect(radioButton_flattopTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_flattop(bool))); QObject::connect(radioButton_blackmanTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_blackman(bool))); @@ -841,7 +924,6 @@ public: QObject::connect(sliderRatio, SIGNAL(valueChanged(int)), MainWindow, SLOT(ratio_slot(int))); QObject::connect(sliderNRatio, SIGNAL(valueChanged(int)), MainWindow, SLOT(n_ratio_slot(int))); QObject::connect(doubleSpinBoxNRatio, SIGNAL(valueChanged(double)), MainWindow, SLOT(n_ratio_slot(double))); - QObject::connect(checkBoxInvert, SIGNAL(toggled(bool)), MainWindow, SLOT(invert_slot(bool))); QObject::connect(sliderNMix, SIGNAL(valueChanged(int)), MainWindow, SLOT(n_mix_slot(int))); QObject::connect(sliderTargetMix, SIGNAL(valueChanged(int)), MainWindow, SLOT(target_mix_slot(int))); QObject::connect(doubleSpinBoxNMix, SIGNAL(valueChanged(double)), MainWindow, SLOT(n_mix_slot(double))); @@ -850,6 +932,30 @@ public: QObject::connect(sliderBoredom, SIGNAL(valueChanged(int)), MainWindow, SLOT(boredom_slot(int))); QObject::connect(doubleSpinBoxNovelty, SIGNAL(valueChanged(double)), MainWindow, SLOT(novelty_slot(double))); QObject::connect(sliderNovelty, SIGNAL(valueChanged(int)), MainWindow, SLOT(novelty_slot(int))); + QObject::connect(sliderSynapses, SIGNAL(valueChanged(int)), spinBoxSynapses, SLOT(setValue(int))); + QObject::connect(sliderSynapses, SIGNAL(valueChanged(int)), MainWindow, SLOT(synapses(int))); + QObject::connect(spinBoxSynapses, SIGNAL(valueChanged(int)), sliderSynapses, SLOT(setValue(int))); + QObject::connect(spinBoxSynapses, SIGNAL(valueChanged(int)), MainWindow, SLOT(synapses(int))); + QObject::connect(radioButtonAlgoBasic, SIGNAL(toggled(bool)), MainWindow, SLOT(algo_basic(bool))); + QObject::connect(radioButtonAlgoRevBasic, SIGNAL(toggled(bool)), MainWindow, SLOT(algo_rev_basic(bool))); + QObject::connect(radioButtonSynaptic, SIGNAL(toggled(bool)), MainWindow, SLOT(algo_synaptic(bool))); + QObject::connect(radioButtonSynapticSlide, SIGNAL(toggled(bool)), MainWindow, SLOT(algo_synaptic_slide(bool))); + QObject::connect(pushButtonLoadBrain, SIGNAL(released()), MainWindow, SLOT(load_brain())); + QObject::connect(pushButtonSaveBrain, SIGNAL(released()), MainWindow, SLOT(save_brain())); + QObject::connect(spinBoxBlockSize, SIGNAL(valueChanged(int)), MainWindow, SLOT(block_size(int))); + QObject::connect(doubleSpinBoxBlockOverlap, SIGNAL(valueChanged(double)), MainWindow, SLOT(block_overlap(double))); + QObject::connect(radioButton_dodgy, SIGNAL(toggled(bool)), MainWindow, SLOT(window_dodgy(bool))); + QObject::connect(radioButton_bartlett, SIGNAL(toggled(bool)), MainWindow, SLOT(window_bartlett(bool))); + QObject::connect(radioButton_blackman, SIGNAL(toggled(bool)), MainWindow, SLOT(window_blackman(bool))); + QObject::connect(radioButton_flattop, SIGNAL(toggled(bool)), MainWindow, SLOT(window_flattop(bool))); + QObject::connect(radioButton_gaussian, SIGNAL(toggled(bool)), MainWindow, SLOT(window_gaussian(bool))); + QObject::connect(radioButton_hamming, SIGNAL(toggled(bool)), MainWindow, SLOT(window_hamming(bool))); + QObject::connect(radioButton_hann, SIGNAL(toggled(bool)), MainWindow, SLOT(window_hann(bool))); + QObject::connect(radioButton_rectagle, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_rectangle(bool))); + QObject::connect(pushButtonGenerate, SIGNAL(released()), MainWindow, SLOT(generate())); + QObject::connect(pushButtonLoadSound, SIGNAL(released()), MainWindow, SLOT(load_sound())); + QObject::connect(pushButtonDeleteSound, SIGNAL(released()), MainWindow, SLOT(delete_sound())); + QObject::connect(pushButtonClearBrain, SIGNAL(released()), MainWindow, SLOT(clear_brain())); tabWidget->setCurrentIndex(0); @@ -859,7 +965,7 @@ public: void retranslateUi(QMainWindow *MainWindow) { - MainWindow->setWindowTitle(QApplication::translate("MainWindow", "samplebrain 0.0.5", 0, QApplication::UnicodeUTF8)); + MainWindow->setWindowTitle(QApplication::translate("MainWindow", "samplebrain 0.6", 0, QApplication::UnicodeUTF8)); label_19->setText(QApplication::translate("MainWindow", "brain tweaks", 0, QApplication::UnicodeUTF8)); label_6->setText(QApplication::translate("MainWindow", "fft / mfcc", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP @@ -896,9 +1002,32 @@ public: sliderBoredom->setToolTip(QApplication::translate("MainWindow", "how long it takes for the novelty to ware off", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP #ifndef QT_NO_TOOLTIP - checkBoxInvert->setToolTip(QString()); + label_26->setToolTip(QString()); #endif // QT_NO_TOOLTIP - checkBoxInvert->setText(QApplication::translate("MainWindow", "search for least similar", 0, QApplication::UnicodeUTF8)); + label_26->setText(QApplication::translate("MainWindow", "synpases", 0, QApplication::UnicodeUTF8)); +#ifndef QT_NO_TOOLTIP + sliderSynapses->setToolTip(QApplication::translate("MainWindow", "how many connections to search (ordered in closeness)", 0, QApplication::UnicodeUTF8)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_TOOLTIP + spinBoxSynapses->setToolTip(QApplication::translate("MainWindow", "how many connections to search (ordered in closeness)", 0, QApplication::UnicodeUTF8)); +#endif // QT_NO_TOOLTIP + label_27->setText(QApplication::translate("MainWindow", "algorithm", 0, QApplication::UnicodeUTF8)); +#ifndef QT_NO_TOOLTIP + radioButtonAlgoBasic->setToolTip(QApplication::translate("MainWindow", "full brain search", 0, QApplication::UnicodeUTF8)); +#endif // QT_NO_TOOLTIP + radioButtonAlgoBasic->setText(QApplication::translate("MainWindow", "basic", 0, QApplication::UnicodeUTF8)); +#ifndef QT_NO_TOOLTIP + radioButtonAlgoRevBasic->setToolTip(QApplication::translate("MainWindow", "full brain reverse search", 0, QApplication::UnicodeUTF8)); +#endif // QT_NO_TOOLTIP + radioButtonAlgoRevBasic->setText(QApplication::translate("MainWindow", "rev basic", 0, QApplication::UnicodeUTF8)); +#ifndef QT_NO_TOOLTIP + radioButtonSynaptic->setToolTip(QApplication::translate("MainWindow", "search based on synapse connections", 0, QApplication::UnicodeUTF8)); +#endif // QT_NO_TOOLTIP + radioButtonSynaptic->setText(QApplication::translate("MainWindow", "synaptic", 0, QApplication::UnicodeUTF8)); +#ifndef QT_NO_TOOLTIP + radioButtonSynapticSlide->setToolTip(QApplication::translate("MainWindow", "search based on synapses and sonify search process", 0, QApplication::UnicodeUTF8)); +#endif // QT_NO_TOOLTIP + radioButtonSynapticSlide->setText(QApplication::translate("MainWindow", "synaptic slide", 0, QApplication::UnicodeUTF8)); label_23->setText(QApplication::translate("MainWindow", "mix", 0, QApplication::UnicodeUTF8)); label_21->setText(QApplication::translate("MainWindow", "dynamic / normalised ", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP @@ -922,27 +1051,26 @@ public: radioButton_rectangleTarget->setText(QApplication::translate("MainWindow", "rectangle", 0, QApplication::UnicodeUTF8)); label_14->setText(QApplication::translate("MainWindow", "window shape", 0, QApplication::UnicodeUTF8)); pushButtonGenerateTarget->setText(QApplication::translate("MainWindow", "(re)generate blocks", 0, QApplication::UnicodeUTF8)); - tabWidget->setTabText(tabWidget->indexOf(controlTab), QApplication::translate("MainWindow", "search", 0, QApplication::UnicodeUTF8)); label_3->setText(QApplication::translate("MainWindow", "brain parameters", 0, QApplication::UnicodeUTF8)); label->setText(QApplication::translate("MainWindow", "block size", 0, QApplication::UnicodeUTF8)); label_2->setText(QApplication::translate("MainWindow", "block overlap", 0, QApplication::UnicodeUTF8)); - radioButton_bartlett->setText(QApplication::translate("MainWindow", "bartlett", 0, QApplication::UnicodeUTF8)); - radioButton_dodgy->setText(QApplication::translate("MainWindow", "dodgy", 0, QApplication::UnicodeUTF8)); - radioButton_blackman->setText(QApplication::translate("MainWindow", "blackman", 0, QApplication::UnicodeUTF8)); radioButton_gaussian->setText(QApplication::translate("MainWindow", "gaussian", 0, QApplication::UnicodeUTF8)); radioButton_hamming->setText(QApplication::translate("MainWindow", "hamming", 0, QApplication::UnicodeUTF8)); - radioButton_hann->setText(QApplication::translate("MainWindow", "hann", 0, QApplication::UnicodeUTF8)); - radioButton_flattop->setText(QApplication::translate("MainWindow", "flat top", 0, QApplication::UnicodeUTF8)); + radioButton_dodgy->setText(QApplication::translate("MainWindow", "dodgy", 0, QApplication::UnicodeUTF8)); + radioButton_blackman->setText(QApplication::translate("MainWindow", "blackman", 0, QApplication::UnicodeUTF8)); radioButton_rectagle->setText(QApplication::translate("MainWindow", "rectangle", 0, QApplication::UnicodeUTF8)); + radioButton_bartlett->setText(QApplication::translate("MainWindow", "bartlett", 0, QApplication::UnicodeUTF8)); + radioButton_flattop->setText(QApplication::translate("MainWindow", "flat top", 0, QApplication::UnicodeUTF8)); + radioButton_hann->setText(QApplication::translate("MainWindow", "hann", 0, QApplication::UnicodeUTF8)); label_4->setText(QApplication::translate("MainWindow", "window shape", 0, QApplication::UnicodeUTF8)); - pushButtonGenerate->setText(QApplication::translate("MainWindow", "(re)generate", 0, QApplication::UnicodeUTF8)); - pushButtonLosdBrain->setText(QApplication::translate("MainWindow", "load", 0, QApplication::UnicodeUTF8)); - pushButtonSaveBrain->setText(QApplication::translate("MainWindow", "save", 0, QApplication::UnicodeUTF8)); + pushButtonGenerate->setText(QApplication::translate("MainWindow", "(re)generate brain", 0, QApplication::UnicodeUTF8)); + pushButtonLoadBrain->setText(QApplication::translate("MainWindow", "load brain", 0, QApplication::UnicodeUTF8)); + pushButtonSaveBrain->setText(QApplication::translate("MainWindow", "save brain", 0, QApplication::UnicodeUTF8)); label_5->setText(QApplication::translate("MainWindow", "brain contents", 0, QApplication::UnicodeUTF8)); pushButtonLoadSound->setText(QApplication::translate("MainWindow", "load sound", 0, QApplication::UnicodeUTF8)); pushButtonDeleteSound->setText(QApplication::translate("MainWindow", "delete selected", 0, QApplication::UnicodeUTF8)); pushButtonClearBrain->setText(QApplication::translate("MainWindow", "clear brain", 0, QApplication::UnicodeUTF8)); - tabWidget->setTabText(tabWidget->indexOf(sampleTab), QApplication::translate("MainWindow", "brain", 0, QApplication::UnicodeUTF8)); + tabWidget->setTabText(tabWidget->indexOf(controlTab), QApplication::translate("MainWindow", "search", 0, QApplication::UnicodeUTF8)); tabWidget->setTabText(tabWidget->indexOf(logTab), QApplication::translate("MainWindow", "log", 0, QApplication::UnicodeUTF8)); pushButtonPlay->setText(QString()); pushButtonStop->setText(QString()); @@ -959,4 +1087,4 @@ namespace Ui { QT_END_NAMESPACE -#endif // SAMPLEBRAING19815_H +#endif // SAMPLEBRAINUQB562_H diff --git a/samplebrain/qt/process_thread.cpp b/samplebrain/qt/process_thread.cpp index ebff323..cd96302 100644 --- a/samplebrain/qt/process_thread.cpp +++ b/samplebrain/qt/process_thread.cpp @@ -56,7 +56,7 @@ void process_thread::process() { while(true) { while (m_osc.get(cmd)) { string name = cmd.m_name; - cerr<reset(); pthread_mutex_unlock(m_brain_mutex); } if (name=="/load_target") { @@ -90,11 +92,9 @@ void process_thread::process() { } if (name=="/target_overlap") { m_target_overlap = m_target_block_size*cmd.get_float(0); - cerr< #pragma once @@ -27,11 +28,20 @@ public: process_thread(); ~process_thread(); - brain m_source, m_target; pthread_mutex_t* m_brain_mutex; + void register_renderer(renderer *p) { m_renderer=p; } + void process(); + void load_source(const std::string &filename); + void load_target(const std::string &filename); + void save_source(const std::string &filename); + void save_target(const std::string &filename); + + // only for use in mutex + brain m_source, m_target; + private: OSC_server m_osc; u32 m_source_block_size; @@ -41,6 +51,9 @@ private: window::type m_window_type; window::type m_target_window_type; pthread_t *m_thread; + + // only use in mutex obvs... + renderer *m_renderer; }; } diff --git a/samplebrain/qt/qtmain.cpp b/samplebrain/qt/qtmain.cpp index abffd6b..44fa52e 100644 --- a/samplebrain/qt/qtmain.cpp +++ b/samplebrain/qt/qtmain.cpp @@ -33,6 +33,7 @@ int main( int argc , char *argv[] ){ process_thread pt; audio_thread at(pt); + pt.register_renderer(at.m_renderer); return app.exec(); } diff --git a/samplebrain/src/aquila/filter/MelFilter.dep b/samplebrain/src/aquila/filter/MelFilter.dep index 7f839c8..a8f6135 100644 --- a/samplebrain/src/aquila/filter/MelFilter.dep +++ b/samplebrain/src/aquila/filter/MelFilter.dep @@ -1,2 +1,2 @@ MelFilter.o: src/aquila/filter/MelFilter.cpp \ - src/aquila/filter/MelFilter.h src/aquila/filter/../global.h + src/aquila/filter/MelFilter.h src/aquila/filter/../global.h diff --git a/samplebrain/src/aquila/filter/MelFilterBank.dep b/samplebrain/src/aquila/filter/MelFilterBank.dep index c185fee..66f6b52 100644 --- a/samplebrain/src/aquila/filter/MelFilterBank.dep +++ b/samplebrain/src/aquila/filter/MelFilterBank.dep @@ -1,3 +1,3 @@ MelFilterBank.o: src/aquila/filter/MelFilterBank.cpp \ - src/aquila/filter/MelFilterBank.h src/aquila/filter/../global.h \ - src/aquila/filter/MelFilter.h + src/aquila/filter/MelFilterBank.h src/aquila/filter/../global.h \ + src/aquila/filter/MelFilter.h diff --git a/samplebrain/src/aquila/transform/Dct.dep b/samplebrain/src/aquila/transform/Dct.dep index 728d5d1..42a89f3 100644 --- a/samplebrain/src/aquila/transform/Dct.dep +++ b/samplebrain/src/aquila/transform/Dct.dep @@ -1,2 +1,2 @@ Dct.o: src/aquila/transform/Dct.cpp src/aquila/transform/Dct.h \ - src/aquila/transform/../global.h + src/aquila/transform/../global.h diff --git a/samplebrain/src/block.cpp b/samplebrain/src/block.cpp index 73d369d..1425a92 100644 --- a/samplebrain/src/block.cpp +++ b/samplebrain/src/block.cpp @@ -84,6 +84,7 @@ block::block(const string &filename, const sample &pcm, u32 rate, const window & // rerun the normalised version normalise(m_n_pcm); + w.run(m_n_pcm); process(m_n_pcm,m_n_fft,m_n_mfcc); if (ditchpcm) { @@ -180,8 +181,24 @@ double block::compare(const block &other, const search_params ¶ms) const { other.m_usage, params.m_usage_importance); } +ios &spiralcore::operator||(ios &s, block &b) { + u32 version=1; + string id("block"); + s||id||version; + + s||b.m_pcm||b.m_fft||b.m_mfcc; + s||b.m_n_pcm||b.m_n_fft||b.m_n_mfcc; + + s||b.m_block_size||b.m_rate||b.m_orig_filename; + stream_vector(s,b.m_synapse); + return s; +} + + bool block::unit_test() { + stream_unit_test(); + sample ntest(3); u32 idx=0; ntest[idx++]=-1; @@ -228,6 +245,25 @@ bool block::unit_test() { assert(bb.m_rate==44100); assert(bb.m_block_size==data.get_length()); + ofstream of("test_data/blocktest.bin",ios::binary); + of||bb; + of.close(); + + cerr<<"written"< m_synapse; float m_usage; + friend ios &operator||(ios &s, block &b); + }; +ios &operator||(ios &s, block &b); + } #endif diff --git a/samplebrain/src/brain.cpp b/samplebrain/src/brain.cpp index f18378e..ccd836d 100644 --- a/samplebrain/src/brain.cpp +++ b/samplebrain/src/brain.cpp @@ -25,6 +25,9 @@ using namespace std; using namespace spiralcore; +static const u32 NUM_FIXED_SYNAPSES = 1000; +static const double usage_factor = 1000000; + brain::brain() : m_current_block_index(0), m_average_error(0), @@ -89,8 +92,6 @@ const block &brain::get_block(u32 index) const { return m_blocks[index]; } -static const double usage_factor = 1000000; - // returns index to block u32 brain::search(const block &target, const search_params ¶ms) { double closest = FLT_MAX; @@ -129,6 +130,7 @@ u32 brain::rev_search(const block &target, const search_params ¶ms) { return furthest_index; } +// really slow - every to every comparison of blocks calculating average distance double brain::calc_average_diff(search_params ¶ms) { double diff=0; for (vector::const_iterator i=m_blocks.begin(); i!=m_blocks.end(); ++i) { @@ -140,16 +142,17 @@ double brain::calc_average_diff(search_params ¶ms) { return diff; } -void brain::build_synapses(search_params ¶ms, double thresh) { +void brain::build_synapses_thresh(search_params ¶ms, double thresh) { m_average_error = calc_average_diff(params)*thresh; - double err=m_average_error*thresh; + double err = m_average_error*thresh; u32 brain_size = m_blocks.size(); - u32 outer_index=0; + u32 outer_index = 0; for (vector::iterator i=m_blocks.begin(); i!=m_blocks.end(); ++i) { u32 index = 0; status::update("building synapses %d%%",(int)(outer_index/(float)brain_size*100)); for (vector::const_iterator j=m_blocks.begin(); j!=m_blocks.end(); ++j) { if (index!=outer_index) { + // collect connections that are under threshold in closeness double diff = i->compare(*j,params); if (diffget_synapse().push_back(index); @@ -161,21 +164,83 @@ void brain::build_synapses(search_params ¶ms, double thresh) { } } +void brain::build_synapses_fixed(search_params ¶ms) { + //m_average_error = calc_average_diff(params)*thresh; + u32 brain_size = m_blocks.size(); + u32 outer_index = 0; + u32 num_synapses = NUM_FIXED_SYNAPSES; + if (num_synapses>=m_blocks.size()) num_synapses=m_blocks.size()-1; + + for (vector::iterator i=m_blocks.begin(); i!=m_blocks.end(); ++i) { + status::update("building synapses %d%%",(int)(outer_index/(float)brain_size*100)); + u32 index = 0; + vector> collect; + + // collect comparisons to all other blocks + for (vector::const_iterator j=m_blocks.begin(); j!=m_blocks.end(); ++j) { + assert(indexcompare(*j,params); + collect.push_back(pair(index,diff)); + } + ++index; + } + + // sort them by closeness + sort(collect.begin(),collect.end(), + [](const pair &a, + const pair &b) -> bool { + return a.secondget_synapse().push_back(collect[n].first); + } + + ++outer_index; + } +} + + +void brain::jiggle() { + if (m_blocks.size()>0) { + m_current_block_index=rand()%m_blocks.size(); + } else { + m_current_block_index=0; + } +} + + u32 brain::search_synapses(const block &target, search_params ¶ms) { const block ¤t = get_block(m_current_block_index); double closest = DBL_MAX; u32 closest_index = 0; // find nearest in synaptic connections + if (current.get_synapse_const().size()params.m_num_synapses); + + u32 synapse_count=0; + // use m_num_synapses to restrict search + // only makes sense when ordered by closeness in fixed mode + vector::const_iterator i=current.get_synapse_const().begin(); + while (i!=current.get_synapse_const().end() && + synapse_count::const_iterator i=current.get_synapse_const().begin(); - i!=current.get_synapse_const().end(); ++i) { const block &other = get_block(*i); double diff = target.compare(other,params); if (diffm_ratio=0.5; + rr.get_params()->m_ratio=0; rr.get_params()->m_usage_importance=0.5; + rr.get_params()->m_num_synapses=150; rr.set_slide_error(5.5); rr.set_search_algo(renderer::SYNAPTIC); diff --git a/samplebrain/src/renderer.cpp b/samplebrain/src/renderer.cpp index 0043e2b..0d19c29 100644 --- a/samplebrain/src/renderer.cpp +++ b/samplebrain/src/renderer.cpp @@ -43,6 +43,7 @@ void renderer::reset() { m_render_time=0; m_target_index=0; m_render_blocks.clear(); + m_source.jiggle(); } void renderer::process(u32 nframes, float *buf) { @@ -170,8 +171,10 @@ bool renderer::unit_test() { renderer rr(source,target); rr.set_playing(true); - float *buf=new float[10]; + float *buf=new float[400]; rr.process(10,buf); + rr.process(10,buf); + assert(rr.m_render_blocks.size()==2); rr.process(10,buf); assert(rr.m_render_blocks.size()==2); @@ -184,7 +187,10 @@ bool renderer::unit_test() { target.init(10,5,window::RECTANGLE); rr.process(10,buf); - assert(rr.m_render_blocks.size()==5); + rr.process(10,buf); + rr.process(10,buf); + rr.process(10,buf); + assert(rr.m_render_blocks.size()==4); delete[] buf; } diff --git a/samplebrain/src/search_params.h b/samplebrain/src/search_params.h index f7c90b8..58eb535 100644 --- a/samplebrain/src/search_params.h +++ b/samplebrain/src/search_params.h @@ -26,13 +26,16 @@ public: m_n_ratio(n_ratio), m_fft1_start(s1), m_fft1_end(e1), - m_usage_importance(usage_importance) {} + m_usage_importance(usage_importance), + m_num_synapses(20) + {} float m_ratio; float m_n_ratio; - int m_fft1_start; - int m_fft1_end; + u32 m_fft1_start; + u32 m_fft1_end; float m_usage_importance; + u32 m_num_synapses; }; } diff --git a/samplebrain/src/window.cpp b/samplebrain/src/window.cpp index 6243c38..e038624 100644 --- a/samplebrain/src/window.cpp +++ b/samplebrain/src/window.cpp @@ -108,3 +108,25 @@ void window::run(const sample &input) const { input[n]*=(*m_windows[m_current_type])[n]; } } + +ios &spiralcore::operator||(ios &s, window &b) { + u32 version=0; + string id("window"); + s||id||version; + s||b.m_current_type; + std::ofstream *pos=dynamic_cast(&s); + if (pos!=NULL) { + u32 size=0; + // get the size from the first window + if (b.m_windows.size()>0) { + size=b.m_windows[0]->get_length(); + } + s||size; + } else { + u32 size=0; + s||size; + // reinit using size if we are reading in + b.init(size); + } + return s; +} diff --git a/samplebrain/src/window.h b/samplebrain/src/window.h index e60d3ab..a4e29ba 100644 --- a/samplebrain/src/window.h +++ b/samplebrain/src/window.h @@ -44,6 +44,8 @@ public: void set_current_type(type t) { m_current_type=t; } void run(const sample &sample) const; + friend ios &operator||(ios &s, window &b); + private: void clear(); @@ -53,6 +55,8 @@ private: }; +ios &operator||(ios &s, window &b); + } #endif diff --git a/samplebrain/test_data/noise.wav b/samplebrain/test_data/noise.wav new file mode 100644 index 0000000..1855b33 Binary files /dev/null and b/samplebrain/test_data/noise.wav differ diff --git a/samplebrain/test_data/up.wav b/samplebrain/test_data/up.wav new file mode 100644 index 0000000..f5d6f40 Binary files /dev/null and b/samplebrain/test_data/up.wav differ diff --git a/test.cpp b/test.cpp index d9830d6..3bc0031 100644 --- a/test.cpp +++ b/test.cpp @@ -4,6 +4,9 @@ #include #include +#include + + using namespace std; class desc { @@ -54,9 +57,89 @@ public: } }; + + +templateios &operator||(ios &s, T &v) { + ofstream *pos=dynamic_cast(&s); + if (pos!=NULL) { + ofstream &os = *pos; + return os.write((char*)(&v),sizeof(T)); + } + else + { + ifstream *pis=dynamic_cast(&s); + assert(pis); + ifstream &is = *pis; + return is.read((char *)(&v),sizeof(T)); + } +} + +templateios &stream_array(ios &s, T *v, size_t &len) { + ofstream *pos=dynamic_cast(&s); + if (pos!=NULL) { + ofstream &os = *pos; + os||len; + return os.write((char*)v,sizeof(T)*len); + } + else + { + ifstream *pis=dynamic_cast(&s); + assert(pis); + ifstream &is = *pis; + is||len; + return is.read((char *)v,sizeof(T)*len); + } +} + + + + +class sertest { +public: + sertest() { + size = 100; + buf = new float[size]; + } + + void build() { + for (unsigned int n=0; n