diff --git a/README.md b/README.md index 824ef4b..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 @@ -41,12 +45,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/app/MainWindow.cpp b/app/MainWindow.cpp index 623f583..1625daf 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), @@ -157,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 9b97127..6b86771 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,15 @@ 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; + m_Ui.labelTargetSound->setText("loaded: "+QFileInfo(path).fileName()); + 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 +224,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 +242,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 +319,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 +344,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 +450,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; diff --git a/app/gui/samplebrain.ui b/app/gui/samplebrain.ui index e3626eb..0a2158c 100644 --- a/app/gui/samplebrain.ui +++ b/app/gui/samplebrain.ui @@ -728,6 +728,13 @@ + + + + no target sound loaded + + + @@ -1112,8 +1119,8 @@ - 20 - 40 + 17 + 13 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 Thu, 29 Oct 2022 08:47:10 +0100 - -- Dave Griffiths Thu, 08 Sep 2022 13:08:26 +0100