From 6876ae90318ef369ddcf2b13a708f7b93400f36e Mon Sep 17 00:00:00 2001 From: Dave Griffiths Date: Wed, 8 Jul 2015 10:52:30 +0100 Subject: [PATCH] ok so far... --- samplebrain/src/brain.cpp | 31 +++++++++++++++++++++++-------- samplebrain/src/brain.h | 6 +++++- samplebrain/src/brain_block.cpp | 6 ++++++ samplebrain/src/brain_block.h | 2 ++ 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/samplebrain/src/brain.cpp b/samplebrain/src/brain.cpp index 50bb5dd..9c18f4d 100644 --- a/samplebrain/src/brain.cpp +++ b/samplebrain/src/brain.cpp @@ -25,6 +25,8 @@ sample brain::load_sound(std::string filename) { // rewrites whole brain void brain::init(u32 block_size, u32 overlap) { m_blocks.clear(); + m_block_size = block_size; + m_overlap = overlap; for (vector::iterator i=m_samples.begin(); i!=m_samples.end(); ++i) { chop_and_add(*i, block_size, overlap); } @@ -40,12 +42,17 @@ void brain::chop_and_add(const sample &s, u32 block_size, u32 overlap) { } } +const sample &brain::get_block_pcm(u32 index) const { + return m_blocks[index].get_pcm(); +} + + // returns index to block -u32 brain::search(const brain_block &target, float ratio) { +u32 brain::search(const brain_block &target, float ratio) const { double closest = 999999999; u32 closest_index = 0; u32 index = 0; - for (vector::iterator i=m_blocks.begin(); i!=m_blocks.end(); ++i) { + for (vector::const_iterator i=m_blocks.begin(); i!=m_blocks.end(); ++i) { double diff = target.compare(*i,ratio); if (diff::iterator i=m_blocks.begin(); i!=m_blocks.end(); ++i) { + u32 index = other.search(*i,ratio); + out.mix(other.get_block_pcm(index),pos); + pos += m_block_size-m_overlap; + } + return out; } @@ -91,13 +104,15 @@ bool brain::unit_test() { brain b2; b2.load_sound("test_data/100f32.wav"); b2.load_sound("test_data/100f32.wav"); - assert(b.m_samples.size()==2); + assert(b2.m_samples.size()==2); + b2.init(10, 0); b.init(10, 0); - assert(b.m_blocks.size()==20); - + assert(b2.m_blocks.size()==20); assert(b.search(b2.m_blocks[0],1)==0); - assert(b.search(b2.m_blocks[19],1)==19); + assert(b.search(b2.m_blocks[9],1)==9); + sample r = b2.resynth(b,1); + assert(r.get_length()==200); return true; } diff --git a/samplebrain/src/brain.h b/samplebrain/src/brain.h index fdc6c19..f72044b 100644 --- a/samplebrain/src/brain.h +++ b/samplebrain/src/brain.h @@ -20,6 +20,8 @@ public: // todo: add tags sample load_sound(std::string filename); + const sample &get_block_pcm(u32 index) const; + // take another brain and rebuild this brain from bits of that one // (presumably this one is made from a single sample) sample resynth(const brain &other, float ratio); @@ -28,12 +30,14 @@ public: private: - u32 search(const brain_block &target, float ratio); + u32 search(const brain_block &target, float ratio) const; void chop_and_add(const sample &s, u32 block_size, u32 overlap); vector m_blocks; vector m_samples; + u32 m_block_size; + u32 m_overlap; }; #endif diff --git a/samplebrain/src/brain_block.cpp b/samplebrain/src/brain_block.cpp index ff25ce7..74cf815 100644 --- a/samplebrain/src/brain_block.cpp +++ b/samplebrain/src/brain_block.cpp @@ -85,8 +85,14 @@ bool brain_block::unit_test() { data[i]=i; } + brain_block cpy("test",data,100); + { brain_block bb3("test",data2,44100); assert(bb.compare(bb3,1)!=0); + cpy=bb3; + } + + assert(cpy.m_pcm.get_length()==20); return true; } diff --git a/samplebrain/src/brain_block.h b/samplebrain/src/brain_block.h index 569de57..02024fd 100644 --- a/samplebrain/src/brain_block.h +++ b/samplebrain/src/brain_block.h @@ -19,6 +19,8 @@ public: static void init_fft(u32 block_size); static bool unit_test(); + const sample &get_pcm() const { return m_pcm; } + private: sample m_pcm; sample m_fft;