From 46ab0a131a7d014a82a648cd6ea292e79cbd43ca Mon Sep 17 00:00:00 2001 From: Dave Griffiths Date: Thu, 20 Oct 2022 21:15:27 +0100 Subject: [PATCH 1/7] optimisation from Claude - fixes: #27 --- brain/src/block.cpp | 1 + brain/src/block_stream.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/brain/src/block.cpp b/brain/src/block.cpp index 149e399..4286d32 100644 --- a/brain/src/block.cpp +++ b/brain/src/block.cpp @@ -112,6 +112,7 @@ void block::process(const sample &pcm, sample &fft, sample &mfcc, float &freq) { // calculate fft std::vector > mfspec; + mfspec.reserve(m_block_size); for (u32 i=0; i(m_fftw->m_spectrum[i][0], m_fftw->m_spectrum[i][1])); diff --git a/brain/src/block_stream.cpp b/brain/src/block_stream.cpp index ec554b6..2c69e77 100644 --- a/brain/src/block_stream.cpp +++ b/brain/src/block_stream.cpp @@ -79,6 +79,7 @@ void block_stream::init(u32 block_size, u32 overlap, window::type t, bool ditchp m_window.set_current_type(t); m_blocks.clear(); + m_blocks.reserve(MAX_BLOCKS); sample dummy(block_size); for (u32 i=0; i Date: Thu, 20 Oct 2022 21:22:23 +0100 Subject: [PATCH 2/7] commented out unused and confusing old code - fixes: #28 --- brain/src/brain.cpp | 2 ++ brain/src/brain.h | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/brain/src/brain.cpp b/brain/src/brain.cpp index 7625cb4..73af15d 100644 --- a/brain/src/brain.cpp +++ b/brain/src/brain.cpp @@ -228,6 +228,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; @@ -261,6 +262,7 @@ void brain::build_synapses_thresh(search_params ¶ms, double thresh) { ++outer_index; } } +*/ void brain::build_synapses_fixed(search_params ¶ms) { //m_average_error = calc_average_diff(params)*thresh; diff --git a/brain/src/brain.h b/brain/src/brain.h index f7dc1e4..6b11bfa 100644 --- a/brain/src/brain.h +++ b/brain/src/brain.h @@ -62,8 +62,8 @@ public: u32 rev_search(const block &target, const search_params ¶ms); // synaptic search - double calc_average_diff(search_params ¶ms); - void build_synapses_thresh(search_params ¶ms, double threshold); + // double calc_average_diff(search_params ¶ms); + // void build_synapses_thresh(search_params ¶ms, double threshold); void build_synapses_fixed(search_params ¶ms); u32 search_synapses(const block &target, search_params ¶ms); double get_current_error() { return m_current_error; } From f9f3557b795137738ec217c11240ad1e012d5ef3 Mon Sep 17 00:00:00 2001 From: Dave Griffiths Date: Sun, 23 Oct 2022 09:34:46 +0100 Subject: [PATCH 3/7] sorted file paths so we have separate ones for each dialog - fixes: #75 --- app/MainWindow.cpp | 6 +- app/MainWindow.h | 142 +++++++++++++++++++++++++-------------------- 2 files changed, 83 insertions(+), 65 deletions(-) diff --git a/app/MainWindow.cpp b/app/MainWindow.cpp index 623f583..a5d0525 100644 --- a/app/MainWindow.cpp +++ b/app/MainWindow.cpp @@ -28,7 +28,11 @@ using namespace std; MainWindow::MainWindow(const string &port, const string &audio_port, const string &process_port, QSettings *settings) : - m_last_file("."), + m_last_sound_file("."), + m_last_target_file("."), + m_last_brain_file("."), + m_last_session_file("."), + m_last_recording_file("."), m_feedback(port), m_audio_port(audio_port), m_process_port(process_port), diff --git a/app/MainWindow.h b/app/MainWindow.h index 48ab6b5..6f29449 100644 --- a/app/MainWindow.h +++ b/app/MainWindow.h @@ -67,7 +67,7 @@ public: } } } - + void send_process_osc(const char *name, const char *types) { for (auto dest:m_destinations) { if (dest.m_enabled) { @@ -206,12 +206,14 @@ private slots: void run_slot() {} void load_target() { - m_last_file=QFileDialog::getOpenFileName(this, - QString("Select an audio file"), - m_last_file, - m_format_string); - - send_process_osc("/load_target","s",m_last_file.toStdString().c_str()); + QString path=QFileDialog::getOpenFileName(this, + QString("Select an audio file"), + m_last_target_file, + m_format_string); + if (m_last_target_file!="") { + m_last_target_file=path; + send_process_osc("/load_target","s",m_last_target_file.toStdString().c_str()); + } } void target_block_size(int s) { send_process_osc("/target_block_size","i",s); } void target_block_overlap(double s) { send_process_osc("/target_overlap","f",s); } @@ -221,14 +223,15 @@ private slots: void fft_spectrum_size(int) {} void generate() { send_process_osc("/generate_brain",""); } void load_sound() { - m_last_file=QFileDialog::getOpenFileName(this, - QString("Select a wav file"), - m_last_file, - m_format_string); + QString path=QFileDialog::getOpenFileName(this, + QString("Select a wav file"), + m_last_sound_file, + m_format_string); - if (m_last_file!="") { - send_process_osc("/load_sample","s",m_last_file.toStdString().c_str()); - sound_items::sound_item &si = m_sound_items.add(m_Ui.brain_contents, m_last_file.toStdString(),true); + if (path!="") { + m_last_sound_file=path; + send_process_osc("/load_sample","s",m_last_sound_file.toStdString().c_str()); + sound_items::sound_item &si = m_sound_items.add(m_Ui.brain_contents, m_last_sound_file.toStdString(),true); QObject::connect(si.m_enable, SIGNAL(clicked()), m_sound_item_enable_mapper, SLOT(map())); m_sound_item_enable_mapper->setMapping(si.m_enable, si.m_id); QObject::connect(si.m_del, SIGNAL(clicked()), m_sound_item_delete_mapper, SLOT(map())); @@ -238,25 +241,27 @@ private slots: void load_sounds() { - m_last_file=QFileDialog::getExistingDirectory(this, - QString("Select a directory of wav files"), - m_last_file); + QString path=QFileDialog::getExistingDirectory(this, + QString("Select a directory of wav files"), + m_last_directory_file); + if (path!="") { + m_last_directory_file=path; + QDirIterator dirIt(m_last_directory_file,QDirIterator::Subdirectories); + while (dirIt.hasNext()) { + dirIt.next(); + if (QFileInfo(dirIt.filePath()).isFile() && + QFileInfo(dirIt.filePath()).suffix() == "wav") { + send_process_osc("/load_sample","s",dirIt.filePath().toStdString().c_str()); - QDirIterator dirIt(m_last_file,QDirIterator::Subdirectories); - while (dirIt.hasNext()) { - dirIt.next(); - if (QFileInfo(dirIt.filePath()).isFile() && - QFileInfo(dirIt.filePath()).suffix() == "wav") { - send_process_osc("/load_sample","s",dirIt.filePath().toStdString().c_str()); + sound_items::sound_item &si = m_sound_items.add(m_Ui.brain_contents, dirIt.filePath().toStdString(),true); - sound_items::sound_item &si = m_sound_items.add(m_Ui.brain_contents, dirIt.filePath().toStdString(),true); - - QObject::connect(si.m_enable, SIGNAL(clicked()), m_sound_item_enable_mapper, SLOT(map())); - m_sound_item_enable_mapper->setMapping(si.m_enable, si.m_id); - QObject::connect(si.m_del, SIGNAL(clicked()), m_sound_item_delete_mapper, SLOT(map())); - m_sound_item_delete_mapper->setMapping(si.m_del, si.m_id); + QObject::connect(si.m_enable, SIGNAL(clicked()), m_sound_item_enable_mapper, SLOT(map())); + m_sound_item_enable_mapper->setMapping(si.m_enable, si.m_id); + QObject::connect(si.m_del, SIGNAL(clicked()), m_sound_item_delete_mapper, SLOT(map())); + m_sound_item_delete_mapper->setMapping(si.m_del, si.m_id); + } } } } @@ -313,12 +318,11 @@ private slots: void record() { if (m_save_wav=="") { - m_last_file=QFileDialog::getSaveFileName( - this, - QString("Select a wav file"), - m_last_file, - QString("Sounds (*.wav);;All files (*.*)")); - m_save_wav = m_last_file.toStdString(); + m_last_recording_file=QFileDialog::getSaveFileName(this, + QString("Select a wav file"), + m_last_recording_file, + QString("Sounds (*.wav);;All files (*.*)")); + m_save_wav = m_last_recording_file.toStdString(); // chop off .wav size_t pos = m_save_wav.find_last_of("."); if (pos!=string::npos) { @@ -339,43 +343,48 @@ private slots: } void load_brain() { - m_last_file=QFileDialog::getOpenFileName( - this, - QString("Select a brain file"), - m_last_file, - QString("Brains (*.brain);;All files (*.*)")); + QString path=QFileDialog::getOpenFileName(this, + QString("Select a brain file"), + m_last_brain_file, + QString("Brains (*.brain);;All files (*.*)")); - send_process_osc("/load_brain","s",m_last_file.toStdString().c_str()); + if (path!="") { + m_last_brain_file=path; + send_process_osc("/load_brain","s",m_last_brain_file.toStdString().c_str()); + } } void save_brain() { - m_last_file=QFileDialog::getSaveFileName( - this, - QString("Select a brain file"), - m_last_file, - QString("Brains (*.brain);;All files (*.*)")); - - send_process_osc("/save_brain","s",m_last_file.toStdString().c_str()); + QString path=QFileDialog::getSaveFileName(this, + QString("Select a brain file"), + m_last_brain_file, + QString("Brains (*.brain);;All files (*.*)")); + if (path!="") { + m_last_brain_file=path; + send_process_osc("/save_brain","s",m_last_brain_file.toStdString().c_str()); + } } void load_session() { - m_last_file=QFileDialog::getOpenFileName( - this, - QString("Select a session file"), - m_last_file, - QString("Sessions *.samplebrain (*.samplebrain);;All files (*.*)")); - - send_process_osc("/load_session","s",m_last_file.toStdString().c_str()); - init_from_session(m_last_file.toStdString()); + QString path=QFileDialog::getOpenFileName(this, + QString("Select a session file"), + m_last_session_file, + QString("Sessions *.samplebrain (*.samplebrain);;All files (*.*)")); + if (path!="") { + m_last_session_file=path; + send_process_osc("/load_session","s",m_last_session_file.toStdString().c_str()); + init_from_session(m_last_session_file.toStdString()); + } } void save_session() { - m_last_file=QFileDialog::getSaveFileName( - this, - QString("Select a session file"), - m_last_file, - QString("Sessions *.samplebrain (*.samplebrain)")); - - send_process_osc("/save_session","s",m_last_file.toStdString().c_str()); + QString path=QFileDialog::getSaveFileName(this, + QString("Select a session file"), + m_last_session_file, + QString("Sessions *.samplebrain (*.samplebrain)")); + if (path!="") { + m_last_session_file=path; + send_process_osc("/save_session","s",m_last_session_file.toStdString().c_str()); + } } void update_status() { @@ -440,7 +449,12 @@ private: QSignalMapper* enable_mapper); string m_save_wav; - QString m_last_file; + QString m_last_sound_file; + QString m_last_target_file; + QString m_last_directory_file; + QString m_last_brain_file; + QString m_last_session_file; + QString m_last_recording_file; unsigned int m_record_id; Ui_MainWindow m_Ui; feedback m_feedback; From bc8002a9f0931f24b8078a956a9b73f09300f566 Mon Sep 17 00:00:00 2001 From: Dave Griffiths Date: Sun, 23 Oct 2022 10:06:23 +0100 Subject: [PATCH 4/7] added target filename to GUI - not adding brain session or directory as less need for it/more clutter... partially fixes: #76 --- app/MainWindow.cpp | 6 ++++++ app/MainWindow.h | 1 + gui/samplebrain.ui | 11 +++++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/MainWindow.cpp b/app/MainWindow.cpp index a5d0525..1625daf 100644 --- a/app/MainWindow.cpp +++ b/app/MainWindow.cpp @@ -161,6 +161,12 @@ void MainWindow::init_from_session(const string &filename) { m_Ui.spinBoxSlideError->setValue(r.get_slide_error()); // target + if (t.get_samples().size()>0) { + // extract target filename from brain sample + string fn = t.get_samples().begin()->m_filename; + m_Ui.labelTargetSound->setText("loaded: "+QFileInfo(QString::fromStdString(fn)).fileName()); + } + m_Ui.spinBoxBlockSizeTarget->setValue(t.get_block_size()); m_Ui.doubleSpinBoxBlockOverlapTarget->setValue(t.get_overlap()/(float)t.get_block_size()); diff --git a/app/MainWindow.h b/app/MainWindow.h index 6f29449..ed27ef2 100644 --- a/app/MainWindow.h +++ b/app/MainWindow.h @@ -212,6 +212,7 @@ private slots: m_format_string); if (m_last_target_file!="") { m_last_target_file=path; + m_Ui.labelTargetSound->setText("loaded: "+QFileInfo(path).fileName()); send_process_osc("/load_target","s",m_last_target_file.toStdString().c_str()); } } diff --git a/gui/samplebrain.ui b/gui/samplebrain.ui index 45d8d2c..e2e381b 100644 --- a/gui/samplebrain.ui +++ b/gui/samplebrain.ui @@ -728,6 +728,13 @@ + + + + no target sound loaded + + + @@ -1112,8 +1119,8 @@ - 20 - 40 + 17 + 13 From 1b766822f636f9df32e24a3d0bf6e7668c9d438a Mon Sep 17 00:00:00 2001 From: Dave Griffiths Date: Sat, 29 Oct 2022 08:35:34 +0100 Subject: [PATCH 5/7] new version README update --- README.md | 14 +++++++++----- changelog.md | 9 +++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 824ef4b..33cb3e1 100644 --- a/README.md +++ b/README.md @@ -41,12 +41,16 @@ written to run on a couple of computers!) you will have to bear with us as we gradually stabilise things based on your feedback. There might currently be problems running it on 64bit Windows. -* **Windows**: [samplebrain_0.18.4_win.zip](https://static.thentrythis.org/samplebrain/samplebrain_0.18.4_win.zip) -* **Mac (intel/m1)**: [samplebrain_0.18.4_macintel.zip](https://static.thentrythis.org/samplebrain/samplebrain_0.18.4_macintel.app.zip) +* **Windows**: [samplebrain_0.18.5_win.zip](https://static.thentrythis.org/samplebrain/samplebrain_0.18.5_win.zip) +* **Mac (intel/m1)**: [samplebrain_0.18.5_macintel.zip](https://static.thentrythis.org/samplebrain/samplebrain_0.18.5_macintel.app.zip) -Changes in 0.18.4: New audio device settings window and updated -windows build. Better default block size, tool tip tweaks and fixes -for dark themes by [Claude Heiland-Allen](https://mathr.co.uk/). +Changes in 0.18.5 (relased 28/10/22): + +* target sound filename shown (and tells you if you don't have one) +* more soundfile formats supported (aiff,aifc,au,snd,fasttracker xi,flac) +* new configurable OSC ports in settings +* warning boxes if the OSC network connection fails +* file path memory per-dialog rather than global For old versions see the [changelog](changelog.md) diff --git a/changelog.md b/changelog.md index f49a480..5b96697 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,14 @@ # Changlog +0.18.4 + +* **Windows**: [samplebrain_0.18.4_win.zip](https://static.thentrythis.org/samplebrain/samplebrain_0.18.4_win.zip) +* **Mac (intel/m1)**: [samplebrain_0.18.4_macintel.zip](https://static.thentrythis.org/samplebrain/samplebrain_0.18.4_macintel.app.zip) + +Changes in 0.18.4: New audio device settings window and updated +windows build. Better default block size, tool tip tweaks and fixes +for dark themes by [Claude Heiland-Allen](https://mathr.co.uk/). + 0.18.3 * **Windows**: [samplebrain_0.18.3_win.zip](https://static.thentrythis.org/samplebrain/samplebrain_0.18.3_win.zip) From 2e517e3bff474f9612c84a642ffcde4668d63eb2 Mon Sep 17 00:00:00 2001 From: Dave Griffiths Date: Sat, 29 Oct 2022 08:48:13 +0100 Subject: [PATCH 6/7] changelog update --- README.md | 10 +++++----- debian/changelog | 11 ++++++++--- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 33cb3e1..98e3db7 100644 --- a/README.md +++ b/README.md @@ -46,11 +46,11 @@ might currently be problems running it on 64bit Windows. Changes in 0.18.5 (relased 28/10/22): -* target sound filename shown (and tells you if you don't have one) -* more soundfile formats supported (aiff,aifc,au,snd,fasttracker xi,flac) -* new configurable OSC ports in settings -* warning boxes if the OSC network connection fails -* file path memory per-dialog rather than global +* Target sound filename shown (and tells you if you don't have one) +* More soundfile formats supported (aiff,aifc,au,snd,fasttracker xi,flac) +* New configurable OSC ports in settings +* Warning boxes if the OSC network connection fails +* File path memory per-dialog rather than global For old versions see the [changelog](changelog.md) diff --git a/debian/changelog b/debian/changelog index 4bd5875..1d9f0f4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,11 @@ -samplebrain (0.18rc2-1ubuntu0~bionic4) bionic; urgency=medium +samplebrain (0.18.5rc1-1ubuntu0~bionic1) bionic; urgency=medium - * Initial release +* Target sound filename shown (and tells you if you don't have one) +* More soundfile formats supported (aiff,aifc,au,snd,fasttracker xi,flac) +* New configurable OSC ports in settings +* Warning boxes if the OSC network connection fails +* File path memory per-dialog rather than global + + -- Dave Griffiths Thu, 29 Oct 2022 08:47:10 +0100 - -- Dave Griffiths Thu, 08 Sep 2022 13:08:26 +0100 From edf2071467b22ec12918f03ec0a418ef16fce930 Mon Sep 17 00:00:00 2001 From: Dave Griffiths Date: Sat, 29 Oct 2022 12:39:18 +0100 Subject: [PATCH 7/7] added reddit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 98e3db7..a1ebf23 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,10 @@ both the target and brain samples). The original samples used to create the demo session [can be found here for testing](https://static.thentrythis.org/samplebrain/samples/). +# Community + +* https://www.reddit.com/r/samplebrain/ + # Download As this is experimental non-commercial software (only originally