diff --git a/samplebrain/interface/samplebrain.ui b/samplebrain/interface/samplebrain.ui index bb74099..a277ec8 100644 --- a/samplebrain/interface/samplebrain.ui +++ b/samplebrain/interface/samplebrain.ui @@ -6,12 +6,12 @@ 0 0 - 1134 - 707 + 1220 + 755 - samplebrain 0.8 + samplebrain 0.10 @@ -374,6 +374,69 @@ + + + + + + + Comic Sans MS + 9 + 75 + true + + + + + + + stickyness + + + + + + + + 0 + 0 + + + + how long it takes for the novelty to wear off + + + 100 + + + 0 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + 1.000000000000000 + + + 0.010000000000000 + + + 0.000000000000000 + + + + + @@ -671,6 +734,19 @@ + + + + Qt::Vertical + + + + 240 + 574 + + + + @@ -803,19 +879,6 @@ - - - - Qt::Vertical - - - - 20 - 40 - - - - @@ -2456,6 +2519,38 @@ + + doubleSpinBoxStickyness + valueChanged(double) + MainWindow + stickyness_slot(double) + + + 385 + 296 + + + 609 + 377 + + + + + sliderStickyness + valueChanged(int) + MainWindow + stickyness_slot(int) + + + 266 + 296 + + + 609 + 377 + + + play_slot() @@ -2519,6 +2614,8 @@ save_brain() slide_error(int) search_stretch(int) + stickyness_slot(int) + stickyness_slot(double) diff --git a/samplebrain/qt/MainWindow.h b/samplebrain/qt/MainWindow.h index ae9b3c9..2d24c4d 100644 --- a/samplebrain/qt/MainWindow.h +++ b/samplebrain/qt/MainWindow.h @@ -109,6 +109,14 @@ private slots: void slide_error(int s) { lo_send(m_audio_address,"/slide-error","i",s); } + void stickyness_slot(int s) { + lo_send(m_audio_address,"/stickyness","f",s/100.0f); + m_Ui.doubleSpinBoxStickyness->setValue(s/100.0f); + } + void stickyness_slot(double s) { + lo_send(m_audio_address,"/stickyness","f",s); + m_Ui.sliderStickyness->setValue(s*100); + } void volume_slot(int s) { lo_send(m_audio_address,"/volume","f",s/100.0f); } diff --git a/samplebrain/qt/audio_thread.cpp b/samplebrain/qt/audio_thread.cpp index c85e607..bde4b72 100644 --- a/samplebrain/qt/audio_thread.cpp +++ b/samplebrain/qt/audio_thread.cpp @@ -22,9 +22,9 @@ using namespace std; audio_thread::audio_thread(process_thread &p) : m_audio_device(NULL), + m_osc("8888"), m_process_thread(p), - m_brain_mutex(p.m_brain_mutex), - m_osc("8888") + m_brain_mutex(p.m_brain_mutex) { start_audio(); pthread_mutex_lock(m_brain_mutex); @@ -84,6 +84,9 @@ void audio_thread::process(sample &s, sample &s2) { if (name=="/novelty") { m_renderer->get_params()->m_usage_importance = cmd.get_float(0); } + if (name=="/stickyness") { + m_renderer->get_params()->m_stickyness = cmd.get_float(0); + } if (name=="/restart_audio") { start_audio(); } diff --git a/samplebrain/qt/generated/ui_samplebrain.h b/samplebrain/qt/generated/ui_samplebrain.h index b6f3da5..979b3b5 100644 --- a/samplebrain/qt/generated/ui_samplebrain.h +++ b/samplebrain/qt/generated/ui_samplebrain.h @@ -1,14 +1,13 @@ /******************************************************************************** -** Form generated from reading UI file 'samplebrainj21537.ui' +** Form generated from reading UI file 'samplebrainJ11878.ui' ** -** Created: Fri Aug 7 09:55:34 2015 -** by: Qt User Interface Compiler version 4.8.1 +** Created by: Qt User Interface Compiler version 4.8.6 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ -#ifndef SAMPLEBRAINJ21537_H -#define SAMPLEBRAINJ21537_H +#ifndef SAMPLEBRAINJ11878_H +#define SAMPLEBRAINJ11878_H #include #include @@ -67,6 +66,10 @@ public: QLabel *label_25; QSlider *sliderBoredom; QDoubleSpinBox *doubleSpinBoxBoredom; + QHBoxLayout *horizontalLayout_21; + QLabel *label_30; + QSlider *sliderStickyness; + QDoubleSpinBox *doubleSpinBoxStickyness; QHBoxLayout *horizontalLayout_19; QLabel *label_28; QSlider *sliderSearchStretch; @@ -86,6 +89,7 @@ public: QSlider *sliderSlideError; QSpinBox *spinBoxSlideError; QSpacerItem *horizontalSpacer_2; + QSpacerItem *verticalSpacer_3; QLabel *label_23; QHBoxLayout *horizontalLayout_8; QLabel *label_21; @@ -95,7 +99,6 @@ public: QLabel *label_22; QSlider *sliderTargetMix; QDoubleSpinBox *doubleSpinBoxTargetMix; - QSpacerItem *verticalSpacer_3; QVBoxLayout *verticalLayout_6; QLabel *label_16; QPushButton *pushButtonLoadTarget; @@ -167,7 +170,7 @@ public: { if (MainWindow->objectName().isEmpty()) MainWindow->setObjectName(QString::fromUtf8("MainWindow")); - MainWindow->resize(1134, 707); + MainWindow->resize(1220, 755); centralwidget = new QWidget(MainWindow); centralwidget->setObjectName(QString::fromUtf8("centralwidget")); verticalLayout_4 = new QVBoxLayout(centralwidget); @@ -372,6 +375,37 @@ public: verticalLayout_3->addLayout(horizontalLayout_11); + horizontalLayout_21 = new QHBoxLayout(); + horizontalLayout_21->setObjectName(QString::fromUtf8("horizontalLayout_21")); + label_30 = new QLabel(controlTab); + label_30->setObjectName(QString::fromUtf8("label_30")); + label_30->setFont(font2); + + horizontalLayout_21->addWidget(label_30); + + sliderStickyness = new QSlider(controlTab); + sliderStickyness->setObjectName(QString::fromUtf8("sliderStickyness")); + sizePolicy.setHeightForWidth(sliderStickyness->sizePolicy().hasHeightForWidth()); + sliderStickyness->setSizePolicy(sizePolicy); + sliderStickyness->setMaximum(100); + sliderStickyness->setValue(0); + sliderStickyness->setOrientation(Qt::Horizontal); + + horizontalLayout_21->addWidget(sliderStickyness); + + doubleSpinBoxStickyness = new QDoubleSpinBox(controlTab); + doubleSpinBoxStickyness->setObjectName(QString::fromUtf8("doubleSpinBoxStickyness")); + sizePolicy1.setHeightForWidth(doubleSpinBoxStickyness->sizePolicy().hasHeightForWidth()); + doubleSpinBoxStickyness->setSizePolicy(sizePolicy1); + doubleSpinBoxStickyness->setMaximum(1); + doubleSpinBoxStickyness->setSingleStep(0.01); + doubleSpinBoxStickyness->setValue(0); + + horizontalLayout_21->addWidget(doubleSpinBoxStickyness); + + + verticalLayout_3->addLayout(horizontalLayout_21); + horizontalLayout_19 = new QHBoxLayout(); horizontalLayout_19->setObjectName(QString::fromUtf8("horizontalLayout_19")); label_28 = new QLabel(controlTab); @@ -516,6 +550,10 @@ public: verticalLayout_3->addItem(horizontalSpacer_2); + verticalSpacer_3 = new QSpacerItem(240, 574, QSizePolicy::Minimum, QSizePolicy::Expanding); + + verticalLayout_3->addItem(verticalSpacer_3); + label_23 = new QLabel(controlTab); label_23->setObjectName(QString::fromUtf8("label_23")); label_23->setFont(font1); @@ -583,10 +621,6 @@ public: verticalLayout_3->addLayout(horizontalLayout_9); - verticalSpacer_3 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); - - verticalLayout_3->addItem(verticalSpacer_3); - horizontalLayout_5->addLayout(verticalLayout_3); @@ -1034,6 +1068,8 @@ public: QObject::connect(sliderSlideError, SIGNAL(valueChanged(int)), spinBoxSlideError, SLOT(setValue(int))); QObject::connect(spinBoxSlideError, SIGNAL(valueChanged(int)), sliderSlideError, SLOT(setValue(int))); QObject::connect(sliderSlideError, SIGNAL(valueChanged(int)), MainWindow, SLOT(slide_error(int))); + QObject::connect(doubleSpinBoxStickyness, SIGNAL(valueChanged(double)), MainWindow, SLOT(stickyness_slot(double))); + QObject::connect(sliderStickyness, SIGNAL(valueChanged(int)), MainWindow, SLOT(stickyness_slot(int))); tabWidget->setCurrentIndex(0); @@ -1043,7 +1079,7 @@ public: void retranslateUi(QMainWindow *MainWindow) { - MainWindow->setWindowTitle(QApplication::translate("MainWindow", "samplebrain 0.9", 0, QApplication::UnicodeUTF8)); + MainWindow->setWindowTitle(QApplication::translate("MainWindow", "samplebrain 0.10", 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 @@ -1079,6 +1115,13 @@ public: #ifndef QT_NO_TOOLTIP sliderBoredom->setToolTip(QApplication::translate("MainWindow", "how long it takes for the novelty to wear off", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP +#ifndef QT_NO_TOOLTIP + label_30->setToolTip(QString()); +#endif // QT_NO_TOOLTIP + label_30->setText(QApplication::translate("MainWindow", "stickyness", 0, QApplication::UnicodeUTF8)); +#ifndef QT_NO_TOOLTIP + sliderStickyness->setToolTip(QApplication::translate("MainWindow", "how long it takes for the novelty to wear off", 0, QApplication::UnicodeUTF8)); +#endif // QT_NO_TOOLTIP #ifndef QT_NO_TOOLTIP label_28->setToolTip(QString()); #endif // QT_NO_TOOLTIP @@ -1185,4 +1228,4 @@ namespace Ui { QT_END_NAMESPACE -#endif // SAMPLEBRAINJ21537_H +#endif // SAMPLEBRAINJ11878_H diff --git a/samplebrain/qt/samplebrain.pro b/samplebrain/qt/samplebrain.pro index 70775b5..ba3cbe9 100644 --- a/samplebrain/qt/samplebrain.pro +++ b/samplebrain/qt/samplebrain.pro @@ -41,7 +41,7 @@ INCLUDEPATH += ../src LIBS += -L.. -lportaudio -lfftw3 -lsndfile -llo -ldl -lpthread -lm #CONFIG+=debug -QMAKE_CXXFLAGS += -Wunused-parameter -std=c++11 -DDONT_USE_FLUXA_GRAPH +QMAKE_CXXFLAGS += -Wall -Wno-unused -std=c++11 -DDONT_USE_FLUXA_GRAPH # assets RESOURCES = samplebrain.qrc 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 1425a92..ca39155 100644 --- a/samplebrain/src/block.cpp +++ b/samplebrain/src/block.cpp @@ -63,7 +63,8 @@ void normalise(sample &in) { } } -block::block(const string &filename, const sample &pcm, u32 rate, const window &w, bool ditchpcm) : +block::block(u64 id, const string &filename, const sample &pcm, u32 rate, const window &w, bool ditchpcm) : + m_id(id), m_pcm(pcm), m_fft(pcm.get_length()), m_mfcc(MFCC_FILTERS), @@ -143,8 +144,8 @@ double block::_compare(const sample &fft_a, const sample &mfcc_a, double mfcc_acc=0; double fft_acc=0; - s32 fft_start = params.m_fft1_start; - s32 fft_end = fmin(params.m_fft1_end,m_fft.get_length()); + u32 fft_start = params.m_fft1_start; + u32 fft_end = fmin(params.m_fft1_end,m_fft.get_length()); if (params.m_ratio==0) { for (u32 i=fft_start; i1) s||b.m_id; + s||b.m_pcm||b.m_fft||b.m_mfcc; s||b.m_n_pcm||b.m_n_fft||b.m_n_mfcc; @@ -236,7 +239,7 @@ bool block::unit_test() { w.init(data.get_length()); w.set_current_type(window::RECTANGLE); - block bb("test",data,44100,w); + block bb(0,"test",data,44100,w); assert(bb.m_pcm.get_length()==data.get_length()); //assert(bb.m_fft.get_length()==data.get_length()); @@ -265,7 +268,7 @@ bool block::unit_test() { search_params p(0,0,0,100,0); - block bb2("test",data,44100,w); + block bb2(0,"test",data,44100,w); assert(bb.compare(bb2,p)==0); p.m_ratio=1; assert(bb.compare(bb2,p)==0); @@ -277,9 +280,9 @@ bool block::unit_test() { data2[i]=i%10; } - block cpy("test",data,100,w); + block cpy(0,"test",data,100,w); { - block bb3("test",data2,44100,w); + block bb3(0,"test",data2,44100,w); p.m_ratio=0.0; assert(bb.compare(bb3,p)!=0); assert(bb.compare(bb3,p)!=0); diff --git a/samplebrain/src/block.h b/samplebrain/src/block.h index a247763..3628ca0 100644 --- a/samplebrain/src/block.h +++ b/samplebrain/src/block.h @@ -32,7 +32,7 @@ namespace spiralcore { class block { public: // runs analysis on pcm - block(const std::string &filename, const sample &pcm, u32 rate, const window &w, bool ditchpcm=false); + block(u64 id, const std::string &filename, const sample &pcm, u32 rate, const window &w, bool ditchpcm=false); block() {} // returns distance based on ratio of fft-mfcc values @@ -56,6 +56,8 @@ private: const sample &fft_b, const sample &mfcc_b, const search_params ¶ms) const; + u64 m_id; + sample m_pcm; sample m_fft; sample m_mfcc; diff --git a/samplebrain/src/brain.cpp b/samplebrain/src/brain.cpp index 62eaad4..d77a1fd 100644 --- a/samplebrain/src/brain.cpp +++ b/samplebrain/src/brain.cpp @@ -30,8 +30,8 @@ static const double usage_factor = 1000; brain::brain() : m_current_block_index(0), - m_average_error(0), m_current_error(0), + m_average_error(0), m_usage_falloff(0.9) { status::update("brain ready..."); @@ -83,7 +83,7 @@ void brain::chop_and_add(const sample &s, u32 count, bool ditchpcm) { status::update("processing sample %d: %d%%",count,(int)(pos/(float)s.get_length()*100)); sample region; s.get_region(region,pos,pos+m_block_size-1); - m_blocks.push_back(block("",region,44100,m_window,ditchpcm)); + m_blocks.push_back(block(m_blocks.size(),"",region,44100,m_window,ditchpcm)); pos += (m_block_size-m_overlap); } } @@ -92,6 +92,26 @@ const block &brain::get_block(u32 index) const { return m_blocks[index]; } +// helper to do the stickyness comparison and sort out current_block_index +u32 brain::stickify(const block &target, u32 closest_index, f32 dist, const search_params ¶ms) { + u32 next_index = m_current_block_index+1; + + // if we have stickyness turned on and the next block exists + if (params.m_stickyness>0 && next_index::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; + 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)); + collect.push_back(pair(index,diff)); } ++index; } // sort them by closeness sort(collect.begin(),collect.end(), - [](const pair &a, - const pair &b) -> bool { + [](const pair &a, + const pair &b) -> bool { return a.second m_blocks; std::list m_samples; diff --git a/samplebrain/src/renderer.cpp b/samplebrain/src/renderer.cpp index 7b60854..a381e34 100644 --- a/samplebrain/src/renderer.cpp +++ b/samplebrain/src/renderer.cpp @@ -372,4 +372,5 @@ bool renderer::unit_test() { assert(rr.m_render_blocks.size()==4); delete[] buf; + return true; } diff --git a/samplebrain/src/search_params.h b/samplebrain/src/search_params.h index 58eb535..9ca9abd 100644 --- a/samplebrain/src/search_params.h +++ b/samplebrain/src/search_params.h @@ -27,7 +27,8 @@ public: m_fft1_start(s1), m_fft1_end(e1), m_usage_importance(usage_importance), - m_num_synapses(20) + m_num_synapses(20), + m_stickyness(0) {} float m_ratio; @@ -36,6 +37,7 @@ public: u32 m_fft1_end; float m_usage_importance; u32 m_num_synapses; + f32 m_stickyness; }; }