3 Commits

Author SHA1 Message Date
30e290dcbd Merge branch 'production' into 'production'
Fix the parameter type of default_handler

Closes #96

See merge request then-try-this/samplebrain!16
2024-08-12 13:10:08 +00:00
032fd7c039 Fix the parameter type of default_handler 2024-07-17 02:37:38 +00:00
a8ea957f45 removed reddit link as it's not really used 2023-05-01 16:39:52 +00:00
9 changed files with 44 additions and 67 deletions

View File

@ -34,10 +34,6 @@ both the target and brain samples). The original samples used to
create the demo session [can be found here for create the demo session [can be found here for
testing](https://static.thentrythis.org/samplebrain/samples/). testing](https://static.thentrythis.org/samplebrain/samples/).
# Community
* https://www.reddit.com/r/samplebrain/
# Download # Download
As this is experimental non-commercial software (only originally As this is experimental non-commercial software (only originally

View File

@ -113,8 +113,8 @@ void MainWindow::init_from_session(const string &filename) {
ifstream ifs(filename.c_str(),ios::binary); ifstream ifs(filename.c_str(),ios::binary);
if (!ifs) return; if (!ifs) return;
brain s,t,lt; brain s,t;
u32 version=1; u32 version=0;
ifs||version; ifs||version;
renderer r(s,t); renderer r(s,t);
ifs||r; ifs||r;
@ -133,14 +133,7 @@ void MainWindow::init_from_session(const string &filename) {
ifs||source_window||target_window; ifs||source_window||target_window;
// todo: probably don't need to load all the sample data too :/ // todo: probably don't need to load all the sample data too :/
ifs||s; ifs||s;
ifs||t; // left ifs||t;
ifs||lt; // right
if (version>0) {
ifs||m_stereo;
m_Ui.checkBoxStereo->setChecked(m_stereo);
}
// brain tweaks // brain tweaks
search_params * p = r.get_params(); search_params * p = r.get_params();
@ -205,6 +198,8 @@ void MainWindow::init_from_session(const string &filename) {
m_Ui.sliderAutotune->setValue(r.get_autotune()*100); m_Ui.sliderAutotune->setValue(r.get_autotune()*100);
m_Ui.doubleSpinBoxAutotune->setValue(r.get_autotune()); m_Ui.doubleSpinBoxAutotune->setValue(r.get_autotune());
} }
#endif #endif

View File

@ -393,11 +393,7 @@ private slots:
} }
void stereo_mode(bool s) { void stereo_mode(bool s) {
m_stereo=s;
send_audio_osc("/stereo","i",s); send_audio_osc("/stereo","i",s);
// irritating but need to tell process thread about stereo state
// just to it can save it to the session file
send_process_osc("/stereo","i",s);
} }
void net_enable(int id) { void net_enable(int id) {
@ -473,5 +469,4 @@ private:
string m_audio_port; string m_audio_port;
string m_process_port; string m_process_port;
QString m_format_string; QString m_format_string;
bool m_stereo;
}; };

View File

@ -140,10 +140,6 @@ void process_thread::process() {
if (name=="/save_session") { if (name=="/save_session") {
save_session(cmd.get_string(0)); save_session(cmd.get_string(0));
} }
if (name=="/stereo") {
// only for session file save
m_stereo=cmd.get_int(0);
}
} }
#ifdef WIN32 #ifdef WIN32
Sleep(1); Sleep(1);
@ -178,7 +174,16 @@ void process_thread::load_session(const std::string &filename) {
m_left_target.clear(); m_left_target.clear();
m_right_target.clear(); m_right_target.clear();
ifstream ifs(filename.c_str(),ios::binary); ifstream ifs(filename.c_str(),ios::binary);
stream_session(ifs); u32 version=0;
ifs||version;
ifs||(*m_left_renderer);
ifs||(*m_right_renderer);
ifs||m_source_block_size||m_source_overlap;
ifs||m_target_block_size||m_target_overlap;
ifs||m_window_type||m_target_window_type;
ifs||m_source;
ifs||m_left_target;
ifs||m_right_target;
ifs.close(); ifs.close();
pthread_mutex_unlock(m_brain_mutex); pthread_mutex_unlock(m_brain_mutex);
} }
@ -186,23 +191,16 @@ void process_thread::load_session(const std::string &filename) {
void process_thread::save_session(const std::string &filename) { void process_thread::save_session(const std::string &filename) {
pthread_mutex_lock(m_brain_mutex); pthread_mutex_lock(m_brain_mutex);
ofstream ofs(filename.c_str(),ios::binary); ofstream ofs(filename.c_str(),ios::binary);
stream_session(ofs); u32 version=0;
ofs||version;
ofs||(*m_left_renderer);
ofs||(*m_right_renderer);
ofs||m_source_block_size||m_source_overlap;
ofs||m_target_block_size||m_target_overlap;
ofs||m_window_type||m_target_window_type;
ofs||m_source;
ofs||m_left_target;
ofs||m_right_target;
ofs.close(); ofs.close();
pthread_mutex_unlock(m_brain_mutex); pthread_mutex_unlock(m_brain_mutex);
} }
void process_thread::stream_session(std::ios &fs) {
u32 version=1;
fs||version;
fs||(*m_left_renderer);
fs||(*m_right_renderer);
fs||m_source_block_size||m_source_overlap;
fs||m_target_block_size||m_target_overlap;
fs||m_window_type||m_target_window_type;
fs||m_source;
fs||m_left_target;
fs||m_right_target;
if (version>0) {
fs||m_stereo;
}
}

View File

@ -54,8 +54,6 @@ namespace spiralcore {
brain m_source, m_left_target, m_right_target; brain m_source, m_left_target, m_right_target;
private: private:
void stream_session(std::ios &fs);
OSC_server m_osc; OSC_server m_osc;
u32 m_source_block_size; u32 m_source_block_size;
float m_source_overlap; float m_source_overlap;
@ -63,7 +61,6 @@ namespace spiralcore {
float m_target_overlap; float m_target_overlap;
window::type m_window_type; window::type m_window_type;
window::type m_target_window_type; window::type m_target_window_type;
bool m_stereo;
pthread_t *m_thread; pthread_t *m_thread;
// only use in mutex obvs... // only use in mutex obvs...

View File

@ -60,7 +60,7 @@ void OSC_server::error_handler(int num, const char *msg, const char *path) {
} }
int OSC_server::default_handler(const char *path, const char *types, lo_arg **argv, int OSC_server::default_handler(const char *path, const char *types, lo_arg **argv,
int argc, void *data, void *user_data) { int argc, lo_message data, void *user_data) {
OSC_server *server = (OSC_server*)user_data; OSC_server *server = (OSC_server*)user_data;
if (!server) return -1; if (!server) return -1;

View File

@ -32,7 +32,7 @@ public:
bool ok() { return m_server!=NULL; } bool ok() { return m_server!=NULL; }
private: private:
static int default_handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data); static int default_handler(const char *path, const char *types, lo_arg **argv, int argc, lo_message data, void *user_data);
static void error_handler(int num, const char *m, const char *path); static void error_handler(int num, const char *m, const char *path);
lo_server_thread m_server; lo_server_thread m_server;

View File

@ -51,12 +51,12 @@ void audio_device::connect(const string &output_device_name, const string &clien
m_client.attach(output_device_name,clientname,opt); m_client.attach(output_device_name,clientname,opt);
} }
void audio_device::save_sample(const string &filename, unsigned int channels, const sample s) { void audio_device::save_sample(const string &filename, const sample s) {
SF_INFO sfinfo; SF_INFO sfinfo;
sfinfo.format=SF_FORMAT_WAV | SF_FORMAT_FLOAT; sfinfo.format=SF_FORMAT_WAV | SF_FORMAT_FLOAT;
sfinfo.frames=s.get_length(); sfinfo.frames=s.get_length();
sfinfo.samplerate=m_samplerate; sfinfo.samplerate=m_samplerate;
sfinfo.channels=channels; sfinfo.channels=1;
sfinfo.sections=1; sfinfo.sections=1;
sfinfo.seekable=0; sfinfo.seekable=0;
SNDFILE* f=sf_open(filename.c_str(), SFM_WRITE, &sfinfo); SNDFILE* f=sf_open(filename.c_str(), SFM_WRITE, &sfinfo);
@ -69,7 +69,8 @@ void audio_device::save_sample(const string &filename, unsigned int channels, co
void audio_device::start_recording(std::string filename) { void audio_device::start_recording(std::string filename) {
m_record_filename=filename; m_record_filename=filename;
m_recording=true; m_recording=true;
m_record_buffer.clear(); m_record_buffer_left.clear();
m_record_buffer_right.clear();
m_record_counter=0; m_record_counter=0;
} }
@ -80,18 +81,12 @@ void audio_device::stop_recording() {
void audio_device::maybe_record() { void audio_device::maybe_record() {
if (m_recording) { if (m_recording) {
sample news(left_out.get_length()*2); m_record_buffer_left.add(left_out);
for (unsigned int i=0; i<left_out.get_length(); i++) { m_record_buffer_right.add(right_out);
news[i*2]=left_out[i];
news[i*2+1]=right_out[i];
}
m_record_buffer.add(news);
m_record_counter++; m_record_counter++;
// save "every now and again"
if (m_record_counter%10==0) { if (m_record_counter%10==0) {
save_sample(m_record_filename+".wav",2,m_record_buffer); save_sample(m_record_filename+"-left.wav", m_record_buffer_left);
save_sample(m_record_filename+"-right.wav", m_record_buffer_right);
} }
} }
} }

View File

@ -42,12 +42,13 @@ namespace spiralcore {
portaudio_client m_client; portaudio_client m_client;
void save_sample(const std::string &filename, unsigned int channels, const sample s); void save_sample(const std::string &filename, const sample s);
private: private:
bool m_recording; bool m_recording;
std::string m_record_filename; std::string m_record_filename;
sample m_record_buffer; sample m_record_buffer_left;
sample m_record_buffer_right;
u32 m_record_counter; u32 m_record_counter;
u32 m_samplerate; u32 m_samplerate;
}; };