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;
};
}