1 #include "httplib/httplib.h"
14 #include "AudioFile.h"
32 SampleSplitter(
double threshold,
double grace_time,
double updates_per_export_attempt):Process(
"sample splitter") {
33 upea = updates_per_export_attempt;
44 audioFile.load (filename);
50 watch(
"set bit depth", [
this](Event& e) {
51 bit_depth = e.value();
53 watch(
"set sample rate", [
this](Event& e) {
54 sample_rate = e.value();
64 if ( channel(
"left audio").nonempty() && channel(
"right audio").nonempty() ) {
66 read_data_packet(channel(
"left audio").latest(), channel(
"right audio").latest());
68 if (backlog[0].size() > (
int) (gt*sample_rate) && upea_counter > upea){
69 attempt_live_export(th, gt);
78 void set_threshold(
double threshold);
81 void set_grace_time(
double grace_time);
87 double number_of_samples();
101 void split_samples(
double threshold,
double grace_time);
108 void export_sample(
double sample_number, std::string file_name);
113 void export_all_samples();
119 void export_all_samples(vector<std::string> file_names);
129 void split_and_export_samples(
double threshold,
double grace_time,
bool export_files);
137 void read_data_packet(json left_data, json right_data);
144 void attempt_live_export(
double threshold,
double grace_time);
160 int upea_counter = 0;
169 AudioFile<double>::AudioBuffer backlog;
171 AudioFile<double> audioFile;
174 vector<AudioFile<double>::AudioBuffer> sample_list;
177 int export_number = 1;
194 std::cout <<
"Can't find number of samples in live mode." <<std::endl;
196 return sample_list.size();
202 std::cout <<
"Can't find max in live mode." <<std::endl;
207 for (
int i = 0; i < audioFile.getNumSamplesPerChannel(); i++)
209 if (audioFile.samples[0][i]> max){
210 max = audioFile.samples[0][i];
218 std::cout <<
"Can't find min in live mode." <<std::endl;
223 for (
int i = 0; i < audioFile.getNumSamplesPerChannel(); i++)
225 if (audioFile.samples[0][i]< min){
226 min = audioFile.samples[0][i];
235 std::cout <<
"Can't manually split and export samples in live mode" << std::endl;
238 AudioFile<double>::AudioBuffer buffer;
240 bool recording =
false;
241 int grace_sample_num = (int) (audioFile.getSampleRate()*grace_time);
242 int grace_period = 0;
244 std::string file_name;
245 AudioFile<double> output_file;
246 output_file.setBitDepth (audioFile.getBitDepth());
247 output_file.setSampleRate (audioFile.getSampleRate());
249 for (
int i = 0; i < audioFile.getNumSamplesPerChannel(); i++)
252 if ((audioFile.samples[0][i]>threshold || audioFile.samples[1][i]>threshold)
253 && grace_period <= 0 && !recording){
255 grace_period = grace_sample_num;
256 }
else if ((audioFile.samples[0][i]>threshold || audioFile.samples[1][i]>threshold)
257 && grace_period <= 0 && recording){
259 file_name =
"sample_" + std::to_string(file_number) +
".wav";
260 output_file.setAudioBuffer (buffer);
261 output_file.save (file_name);
266 grace_period = grace_sample_num;
271 buffer[0].push_back(audioFile.samples[0][i]);
272 buffer[1].push_back(audioFile.samples[1][i]);
280 file_name =
"sample_" + std::to_string(file_number) +
".wav";
281 output_file.setAudioBuffer (buffer);
282 output_file.save (file_name);
288 std::cout <<
"Exported " << (file_number) <<
" sample files." << std::endl;
290 std::cout <<
"Would have exported " << (file_number) <<
" sample files." << std::endl;
297 std::cout <<
"Can't manually split samples in live mode" << std::endl;
300 AudioFile<double>::AudioBuffer buffer;
302 bool recording =
false;
303 int grace_sample_num = (int) (audioFile.getSampleRate()*grace_time);
304 int grace_period = 0;
306 std::string file_name;
308 for (
int i = 0; i < audioFile.getNumSamplesPerChannel(); i++)
311 if ((audioFile.samples[0][i]>threshold || audioFile.samples[1][i]>threshold)
312 && grace_period <= 0 && !recording){
314 grace_period = grace_sample_num;
315 }
else if ((audioFile.samples[0][i]>threshold || audioFile.samples[1][i]>threshold)
316 && grace_period <= 0 && recording){
318 file_name =
"sample_" + std::to_string(file_number) +
".wav";
319 sample_list.push_back(buffer);
324 grace_period = grace_sample_num;
329 buffer[0].push_back(audioFile.samples[0][i]);
330 buffer[1].push_back(audioFile.samples[1][i]);
337 file_name =
"sample_" + std::to_string(file_number) +
".wav";
338 sample_list.push_back(buffer);
342 std::cout <<
"Split " << (file_number) <<
" sample files." << std::endl;
350 std::cout <<
"Can't export a specific samples in live mode" << std::endl;
351 std::cout <<
"No samples were exported" << std::endl;
353 if (sample_list.size() == 0){
354 std::cout <<
"No samples to export" << std::endl;
355 std::cout <<
"Did you split the original file into samples first?" << std::endl;
357 }
else if(sample_number > 0 && sample_number <= sample_list.size()){
358 AudioFile<double> output_file;
359 output_file.setBitDepth (audioFile.getBitDepth());
360 output_file.setSampleRate (audioFile.getSampleRate());
361 output_file.setAudioBuffer (sample_list.at(sample_number-1));
362 output_file.save (file_name);
363 std::cout << file_name <<
" was exported." << std::endl;
365 std::cout <<
"There are " << sample_list.size() <<
" samples." << std::endl;
366 std::cout <<
"You asked for sample number " << sample_number << std::endl;
367 std::cout <<
"No sample was exported" << std::endl;
374 std::cout <<
"Can't export all samples in live mode" << std::endl;
375 std::cout <<
"No samples were exported" << std::endl;
377 if (sample_list.size() == 0){
378 std::cout <<
"No samples to export" << std::endl;
379 std::cout <<
"Did you split the original file into samples first?" << std::endl;
380 std::cout <<
"No samples were exported" << std::endl;
382 std::string file_name;
383 for (
int i = 1; i <= sample_list.size(); i++){
384 file_name =
"sample_" + std::to_string(i) +
".wav";
385 export_sample(i,file_name);
393 std::cout <<
"Can't manually export all samples in live mode" << std::endl;
394 std::cout <<
"No samples were exported" << std::endl;
396 if (sample_list.size() == 0){
397 std::cout <<
"No samples to export" << std::endl;
398 std::cout <<
"Did you split the original file into samples first?" << std::endl;
399 std::cout <<
"No samples were exported" << std::endl;
400 }
else if(sample_list.size() != file_names.size()){
401 std::cout <<
"The number of file names does not match the number of samples." << std::endl;
402 std::cout <<
"No samples were exported" << std::endl;
404 for (
int i = 1; i <= sample_list.size(); i++){
405 export_sample(i,file_names.at(i-1));
416 AudioFile<double>::AudioBuffer buffer;
418 bool recording =
false;
419 int grace_sample_num = (int) (sample_rate*grace_time);
420 int grace_period = 0;
422 std::string file_name;
423 AudioFile<double> output_file;
424 output_file.setBitDepth (bit_depth);
425 output_file.setSampleRate (sample_rate);
427 for (
int i = 0; i < backlog[0].size(); i++)
430 if ((backlog[0][i]>threshold || backlog[1][i]>threshold)
431 && grace_period <= 0 && !recording){
433 grace_period = grace_sample_num;
434 }
else if ((backlog[0][i]>threshold || backlog[1][i]>threshold)
435 && grace_period <= 0 && recording){
437 file_name =
"sample_" + std::to_string(export_number) +
".wav";
438 output_file.setAudioBuffer (buffer);
439 output_file.save (file_name);
440 std::cout <<
"Exported " << file_name << std::endl;
445 grace_period = grace_sample_num;
450 buffer[0].push_back(backlog[0][i]);
451 buffer[1].push_back(backlog[1][i]);
463 for(
int i = 0; i < buffer[0].size(); i++){
464 backlog[0].push_back(buffer[0][i]);
465 backlog[1].push_back(buffer[1][i]);
468 std::cout <<
"attempt_live_export is a live mode exclusive function" << std::endl;
474 for (
int i = 0; i < left_data.size(); i++){
475 backlog[0].push_back(left_data[i]);
476 backlog[1].push_back(right_data[i]);
479 std::cout <<
"read_data_packet is a live mode exclusive function" << std::endl;
void split_and_export_samples(double threshold, double grace_time, bool export_files)
void init()
Listens to the manager for its bit depth and sample rate when initialized.
SampleSplitter(std::string filename)
void export_all_samples()
void export_sample(double sample_number, std::string file_name)
void split_samples(double threshold, double grace_time)
void set_grace_time(double grace_time)
SampleSplitter(double threshold, double grace_time, double updates_per_export_attempt)
void set_threshold(double threshold)
double number_of_samples()
void read_data_packet(json left_data, json right_data)
void attempt_live_export(double threshold, double grace_time)
Takes audio data, splits it and exports it as several audio samples.