diff --git a/samplebrain/qt/process_thread.h b/samplebrain/qt/process_thread.h index 9df8a0f..6155462 100644 --- a/samplebrain/qt/process_thread.h +++ b/samplebrain/qt/process_thread.h @@ -32,6 +32,11 @@ public: 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); + private: OSC_server m_osc; u32 m_source_block_size; diff --git a/samplebrain/src/brain.cpp b/samplebrain/src/brain.cpp index 3fefb9e..21f1677 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,7 +142,7 @@ 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; u32 brain_size = m_blocks.size(); @@ -150,6 +152,7 @@ void brain::build_synapses(search_params ¶ms, double thresh) { 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,6 +164,46 @@ 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; + for (vector::iterator i=m_blocks.begin(); i!=m_blocks.end(); ++i) { + u32 index = 0; + vector> collect; + status::update("building synapses %d%%",(int)(outer_index/(float)brain_size*100)); + + // collect comparisons to all other blocks + for (vector::const_iterator j=m_blocks.begin(); j!=m_blocks.end(); ++j) { + if (index!=outer_index) { + double diff = i->compare(*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() { + m_current_block_index=rand()%m_blocks.size(); +} + + u32 brain::search_synapses(const block &target, search_params ¶ms) { const block ¤t = get_block(m_current_block_index); double closest = DBL_MAX; @@ -168,14 +211,20 @@ u32 brain::search_synapses(const block &target, search_params ¶ms) { // find nearest in synaptic connections // cerr<<"searching "<::const_iterator i=current.get_synapse_const().begin(); - i!=current.get_synapse_const().end(); ++i) { + vector::const_iterator i=current.get_synapse_const().begin(); + u32 synapse_count=0; + // use m_num_synapses to restrict search + // only makes sense when ordered by closeness in fixed mode + while (i!=current.get_synapse_const().end() && + synapse_countm_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 9bf9403..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) { diff --git a/samplebrain/src/search_params.h b/samplebrain/src/search_params.h index f7c90b8..10ded88 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(100) + {} 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; }; }