fixes for autotune

This commit is contained in:
dave griffiths 2015-09-25 09:14:01 +01:00
parent 44be9d76cb
commit 62d4574eee
9 changed files with 341 additions and 292 deletions

Binary file not shown.

View File

@ -60,6 +60,16 @@ private slots:
m_Ui.sliderNRatio->setValue(s*100); m_Ui.sliderNRatio->setValue(s*100);
} }
void autotune(int s) {
lo_send(m_audio_address,"/autotune","f",s/100.0f);
m_Ui.doubleSpinBoxAutotune->setValue(s/100.0f);
}
void autotune(double s) {
lo_send(m_audio_address,"/autotune","f",s);
m_Ui.sliderAutotune->setValue(s*100);
}
void fft1_start_slot(int s) { lo_send(m_audio_address,"/fft1_start","i",s); } void fft1_start_slot(int s) { lo_send(m_audio_address,"/fft1_start","i",s); }
void fft1_end_slot(int s) { lo_send(m_audio_address,"/fft1_end","i",s); } void fft1_end_slot(int s) { lo_send(m_audio_address,"/fft1_end","i",s); }
void fft2_start_slot(int s){} // { m_renderer->get_params()->m_fft2_start=s; } void fft2_start_slot(int s){} // { m_renderer->get_params()->m_fft2_start=s; }

View File

@ -21,121 +21,124 @@ using namespace spiralcore;
using namespace std; using namespace std;
audio_thread::audio_thread(process_thread &p) : audio_thread::audio_thread(process_thread &p) :
m_audio_device(NULL), m_audio_device(NULL),
m_osc("8888"), m_osc("8888"),
m_process_thread(p), m_process_thread(p),
m_brain_mutex(p.m_brain_mutex) m_brain_mutex(p.m_brain_mutex)
{ {
start_audio(); start_audio();
pthread_mutex_lock(m_brain_mutex); pthread_mutex_lock(m_brain_mutex);
m_renderer = new renderer(p.m_source,p.m_target); m_renderer = new renderer(p.m_source,p.m_target);
pthread_mutex_unlock(m_brain_mutex); pthread_mutex_unlock(m_brain_mutex);
m_osc.run(); m_osc.run();
} }
static bool state = 1; static bool state = 1;
audio_thread::~audio_thread() { audio_thread::~audio_thread() {
state=0; state=0;
if (m_audio_device!=NULL) delete m_audio_device; if (m_audio_device!=NULL) delete m_audio_device;
delete m_renderer; delete m_renderer;
} }
void audio_thread::start_audio() { void audio_thread::start_audio() {
if (m_audio_device!=NULL) delete m_audio_device; if (m_audio_device!=NULL) delete m_audio_device;
m_audio_device = new audio_device("samplebrain",44100,2048); m_audio_device = new audio_device("samplebrain",44100,2048);
m_audio_device->m_client.set_callback(run_audio, this); m_audio_device->m_client.set_callback(run_audio, this);
} }
void audio_thread::run_audio(void* c, unsigned int frames) { void audio_thread::run_audio(void* c, unsigned int frames) {
if (state) { if (state) {
audio_thread *at = (audio_thread*)c; audio_thread *at = (audio_thread*)c;
at->m_audio_device->left_out.zero(); at->m_audio_device->left_out.zero();
at->process(at->m_audio_device->left_out, at->process(at->m_audio_device->left_out,
at->m_audio_device->right_out); at->m_audio_device->right_out);
at->m_audio_device->maybe_record(); at->m_audio_device->maybe_record();
} }
} }
void audio_thread::process(sample &s, sample &s2) { void audio_thread::process(sample &s, sample &s2) {
command_ring_buffer::command cmd; command_ring_buffer::command cmd;
while (m_osc.get(cmd)) { while (m_osc.get(cmd)) {
string name = cmd.m_name; string name = cmd.m_name;
//cerr<<name<<endl; //cerr<<name<<endl;
if (name=="/start") { if (name=="/start") {
m_renderer->set_playing(true); m_renderer->set_playing(true);
}
if (name=="/pause") {
m_renderer->set_playing(false);
}
if (name=="/ratio") {
m_renderer->get_params()->m_ratio = cmd.get_float(0);
}
if (name=="/n_ratio") {
m_renderer->get_params()->m_n_ratio = cmd.get_float(0);
}
if (name=="/fft1_start") {
m_renderer->get_params()->m_fft1_start = cmd.get_int(0);
}
if (name=="/fft1_end") {
m_renderer->get_params()->m_fft1_end = cmd.get_int(0);
}
if (name=="/novelty") {
m_renderer->get_params()->m_usage_importance = cmd.get_float(0);
}
if (name=="/stickyness") {
m_renderer->get_params()->m_stickyness = cmd.get_float(0);
}
if (name=="/restart_audio") {
start_audio();
}
if (name=="/volume") {
m_renderer->set_volume(cmd.get_float(0)*10);
}
if (name=="/search_algo") {
switch(cmd.get_int(0)) {
case 0: m_renderer->set_search_algo(renderer::BASIC); break;
case 1: m_renderer->set_search_algo(renderer::REV_BASIC); break;
case 2: m_renderer->set_search_algo(renderer::SYNAPTIC); break;
case 3: m_renderer->set_search_algo(renderer::SYNAPTIC_SLIDE); break;
}
}
if (name=="/n_mix") {
m_renderer->set_n_mix(cmd.get_float(0));
}
if (name=="/target_mix") {
m_renderer->set_target_mix(cmd.get_float(0));
}
if (name=="/record") {
m_renderer->set_playing(true);
m_audio_device->start_recording(cmd.get_string(0));
}
if (name=="/stop") {
m_audio_device->stop_recording();
m_renderer->set_playing(false);
}
if (name=="/boredom") {
m_renderer->get_source().set_usage_falloff(cmd.get_float(0));
}
if (name=="/synapses") {
m_renderer->get_params()->m_num_synapses=cmd.get_int(0);
}
if (name=="/search-stretch") {
m_renderer->set_stretch(cmd.get_int(0));
}
if (name=="/slide-error") {
m_renderer->set_slide_error(cmd.get_int(0));
}
} }
if (name=="/pause") {
m_renderer->set_playing(false);
}
if (name=="/ratio") {
m_renderer->get_params()->m_ratio = cmd.get_float(0);
}
if (name=="/n_ratio") {
m_renderer->get_params()->m_n_ratio = cmd.get_float(0);
}
if (name=="/fft1_start") {
m_renderer->get_params()->m_fft1_start = cmd.get_int(0);
}
if (name=="/fft1_end") {
m_renderer->get_params()->m_fft1_end = cmd.get_int(0);
}
if (name=="/novelty") {
m_renderer->get_params()->m_usage_importance = cmd.get_float(0);
}
if (name=="/stickyness") {
m_renderer->get_params()->m_stickyness = cmd.get_float(0);
}
if (name=="/autotune") {
m_renderer->set_autotune(cmd.get_float(0));
}
if (name=="/restart_audio") {
start_audio();
}
if (name=="/volume") {
m_renderer->set_volume(cmd.get_float(0)*10);
}
if (name=="/search_algo") {
switch(cmd.get_int(0)) {
case 0: m_renderer->set_search_algo(renderer::BASIC); break;
case 1: m_renderer->set_search_algo(renderer::REV_BASIC); break;
case 2: m_renderer->set_search_algo(renderer::SYNAPTIC); break;
case 3: m_renderer->set_search_algo(renderer::SYNAPTIC_SLIDE); break;
}
}
if (name=="/n_mix") {
m_renderer->set_n_mix(cmd.get_float(0));
}
if (name=="/target_mix") {
m_renderer->set_target_mix(cmd.get_float(0));
}
if (name=="/record") {
m_renderer->set_playing(true);
m_audio_device->start_recording(cmd.get_string(0));
}
if (name=="/stop") {
m_audio_device->stop_recording();
m_renderer->set_playing(false);
}
if (name=="/boredom") {
m_renderer->get_source().set_usage_falloff(cmd.get_float(0));
}
if (name=="/synapses") {
m_renderer->get_params()->m_num_synapses=cmd.get_int(0);
}
if (name=="/search-stretch") {
m_renderer->set_stretch(cmd.get_int(0));
}
if (name=="/slide-error") {
m_renderer->set_slide_error(cmd.get_int(0));
}
}
s.zero(); s.zero();
s2.zero(); s2.zero();
if (!pthread_mutex_trylock(m_brain_mutex)) { if (!pthread_mutex_trylock(m_brain_mutex)) {
m_renderer->process(s.get_length(),s.get_non_const_buffer()); m_renderer->process(s.get_length(),s.get_non_const_buffer());
pthread_mutex_unlock(m_brain_mutex); pthread_mutex_unlock(m_brain_mutex);
s2=s; s2=s;
} else { } else {
cerr<<"audio no lock..."<<endl; cerr<<"audio no lock..."<<endl;
} }
} }

View File

@ -1,13 +1,13 @@
/******************************************************************************** /********************************************************************************
** Form generated from reading UI file 'samplebrainJ11878.ui' ** Form generated from reading UI file 'samplebrainPm4153.ui'
** **
** Created by: Qt User Interface Compiler version 4.8.6 ** Created by: Qt User Interface Compiler version 4.8.6
** **
** WARNING! All changes made in this file will be lost when recompiling UI file! ** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/ ********************************************************************************/
#ifndef SAMPLEBRAINJ11878_H #ifndef SAMPLEBRAINPM4153_H
#define SAMPLEBRAINJ11878_H #define SAMPLEBRAINPM4153_H
#include <QtCore/QVariant> #include <QtCore/QVariant>
#include <QtGui/QAction> #include <QtGui/QAction>
@ -88,17 +88,6 @@ public:
QLabel *label_29; QLabel *label_29;
QSlider *sliderSlideError; QSlider *sliderSlideError;
QSpinBox *spinBoxSlideError; QSpinBox *spinBoxSlideError;
QSpacerItem *horizontalSpacer_2;
QSpacerItem *verticalSpacer_3;
QLabel *label_23;
QHBoxLayout *horizontalLayout_8;
QLabel *label_21;
QSlider *sliderNMix;
QDoubleSpinBox *doubleSpinBoxNMix;
QHBoxLayout *horizontalLayout_9;
QLabel *label_22;
QSlider *sliderTargetMix;
QDoubleSpinBox *doubleSpinBoxTargetMix;
QVBoxLayout *verticalLayout_6; QVBoxLayout *verticalLayout_6;
QLabel *label_16; QLabel *label_16;
QPushButton *pushButtonLoadTarget; QPushButton *pushButtonLoadTarget;
@ -119,9 +108,27 @@ public:
QRadioButton *radioButton_rectangleTarget; QRadioButton *radioButton_rectangleTarget;
QLabel *label_14; QLabel *label_14;
QPushButton *pushButtonGenerateTarget; QPushButton *pushButtonGenerateTarget;
QLabel *label_23;
QHBoxLayout *horizontalLayout_22;
QLabel *label_31;
QSlider *sliderAutotune;
QDoubleSpinBox *doubleSpinBoxAutotune;
QHBoxLayout *horizontalLayout_8;
QLabel *label_21;
QSlider *sliderNMix;
QDoubleSpinBox *doubleSpinBoxNMix;
QHBoxLayout *horizontalLayout_9;
QLabel *label_22;
QSlider *sliderTargetMix;
QDoubleSpinBox *doubleSpinBoxTargetMix;
QSpacerItem *verticalSpacer; QSpacerItem *verticalSpacer;
QVBoxLayout *verticalLayout_2; QVBoxLayout *verticalLayout;
QLabel *label_3; QLabel *label_3;
QListWidget *listWidgetSounds;
QHBoxLayout *horizontalLayout_2;
QPushButton *pushButtonLoadSound;
QPushButton *pushButtonDeleteSound;
QPushButton *pushButtonClearBrain;
QHBoxLayout *horizontalLayout_4; QHBoxLayout *horizontalLayout_4;
QLabel *label; QLabel *label;
QSpinBox *spinBoxBlockSize; QSpinBox *spinBoxBlockSize;
@ -129,8 +136,8 @@ public:
QLabel *label_2; QLabel *label_2;
QDoubleSpinBox *doubleSpinBoxBlockOverlap; QDoubleSpinBox *doubleSpinBoxBlockOverlap;
QGridLayout *gridLayout; QGridLayout *gridLayout;
QRadioButton *radioButton_gaussian;
QRadioButton *radioButton_hamming; QRadioButton *radioButton_hamming;
QRadioButton *radioButton_gaussian;
QRadioButton *radioButton_dodgy; QRadioButton *radioButton_dodgy;
QRadioButton *radioButton_blackman; QRadioButton *radioButton_blackman;
QRadioButton *radioButton_rectagle; QRadioButton *radioButton_rectagle;
@ -142,14 +149,6 @@ public:
QHBoxLayout *horizontalLayout_7; QHBoxLayout *horizontalLayout_7;
QPushButton *pushButtonLoadBrain; QPushButton *pushButtonLoadBrain;
QPushButton *pushButtonSaveBrain; QPushButton *pushButtonSaveBrain;
QSpacerItem *verticalSpacer_2;
QVBoxLayout *verticalLayout;
QLabel *label_5;
QListWidget *listWidgetSounds;
QHBoxLayout *horizontalLayout_2;
QPushButton *pushButtonLoadSound;
QPushButton *pushButtonDeleteSound;
QPushButton *pushButtonClearBrain;
QWidget *logTab; QWidget *logTab;
QHBoxLayout *horizontalLayout_15; QHBoxLayout *horizontalLayout_15;
QPlainTextEdit *plainTextEdit; QPlainTextEdit *plainTextEdit;
@ -170,7 +169,7 @@ public:
{ {
if (MainWindow->objectName().isEmpty()) if (MainWindow->objectName().isEmpty())
MainWindow->setObjectName(QString::fromUtf8("MainWindow")); MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
MainWindow->resize(1220, 755); MainWindow->resize(1012, 707);
centralwidget = new QWidget(MainWindow); centralwidget = new QWidget(MainWindow);
centralwidget->setObjectName(QString::fromUtf8("centralwidget")); centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
verticalLayout_4 = new QVBoxLayout(centralwidget); verticalLayout_4 = new QVBoxLayout(centralwidget);
@ -546,81 +545,6 @@ public:
verticalLayout_3->addLayout(horizontalLayout_20); verticalLayout_3->addLayout(horizontalLayout_20);
horizontalSpacer_2 = new QSpacerItem(21, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
verticalLayout_3->addItem(horizontalSpacer_2);
verticalSpacer_3 = new QSpacerItem(240, 574, QSizePolicy::Minimum, QSizePolicy::Expanding);
verticalLayout_3->addItem(verticalSpacer_3);
label_23 = new QLabel(controlTab);
label_23->setObjectName(QString::fromUtf8("label_23"));
label_23->setFont(font1);
verticalLayout_3->addWidget(label_23);
horizontalLayout_8 = new QHBoxLayout();
horizontalLayout_8->setObjectName(QString::fromUtf8("horizontalLayout_8"));
label_21 = new QLabel(controlTab);
label_21->setObjectName(QString::fromUtf8("label_21"));
label_21->setFont(font2);
horizontalLayout_8->addWidget(label_21);
sliderNMix = new QSlider(controlTab);
sliderNMix->setObjectName(QString::fromUtf8("sliderNMix"));
sizePolicy.setHeightForWidth(sliderNMix->sizePolicy().hasHeightForWidth());
sliderNMix->setSizePolicy(sizePolicy);
sliderNMix->setValue(0);
sliderNMix->setOrientation(Qt::Horizontal);
horizontalLayout_8->addWidget(sliderNMix);
doubleSpinBoxNMix = new QDoubleSpinBox(controlTab);
doubleSpinBoxNMix->setObjectName(QString::fromUtf8("doubleSpinBoxNMix"));
sizePolicy1.setHeightForWidth(doubleSpinBoxNMix->sizePolicy().hasHeightForWidth());
doubleSpinBoxNMix->setSizePolicy(sizePolicy1);
doubleSpinBoxNMix->setMaximum(1);
doubleSpinBoxNMix->setSingleStep(0.01);
doubleSpinBoxNMix->setValue(0);
horizontalLayout_8->addWidget(doubleSpinBoxNMix);
verticalLayout_3->addLayout(horizontalLayout_8);
horizontalLayout_9 = new QHBoxLayout();
horizontalLayout_9->setObjectName(QString::fromUtf8("horizontalLayout_9"));
label_22 = new QLabel(controlTab);
label_22->setObjectName(QString::fromUtf8("label_22"));
label_22->setFont(font2);
horizontalLayout_9->addWidget(label_22);
sliderTargetMix = new QSlider(controlTab);
sliderTargetMix->setObjectName(QString::fromUtf8("sliderTargetMix"));
sizePolicy.setHeightForWidth(sliderTargetMix->sizePolicy().hasHeightForWidth());
sliderTargetMix->setSizePolicy(sizePolicy);
sliderTargetMix->setValue(0);
sliderTargetMix->setSliderPosition(0);
sliderTargetMix->setOrientation(Qt::Horizontal);
horizontalLayout_9->addWidget(sliderTargetMix);
doubleSpinBoxTargetMix = new QDoubleSpinBox(controlTab);
doubleSpinBoxTargetMix->setObjectName(QString::fromUtf8("doubleSpinBoxTargetMix"));
sizePolicy1.setHeightForWidth(doubleSpinBoxTargetMix->sizePolicy().hasHeightForWidth());
doubleSpinBoxTargetMix->setSizePolicy(sizePolicy1);
doubleSpinBoxTargetMix->setMaximum(1);
doubleSpinBoxTargetMix->setSingleStep(0.01);
doubleSpinBoxTargetMix->setValue(0);
horizontalLayout_9->addWidget(doubleSpinBoxTargetMix);
verticalLayout_3->addLayout(horizontalLayout_9);
horizontalLayout_5->addLayout(verticalLayout_3); horizontalLayout_5->addLayout(verticalLayout_3);
@ -742,6 +666,104 @@ public:
verticalLayout_6->addWidget(pushButtonGenerateTarget); verticalLayout_6->addWidget(pushButtonGenerateTarget);
label_23 = new QLabel(controlTab);
label_23->setObjectName(QString::fromUtf8("label_23"));
label_23->setFont(font1);
verticalLayout_6->addWidget(label_23);
horizontalLayout_22 = new QHBoxLayout();
horizontalLayout_22->setObjectName(QString::fromUtf8("horizontalLayout_22"));
label_31 = new QLabel(controlTab);
label_31->setObjectName(QString::fromUtf8("label_31"));
label_31->setFont(font2);
horizontalLayout_22->addWidget(label_31);
sliderAutotune = new QSlider(controlTab);
sliderAutotune->setObjectName(QString::fromUtf8("sliderAutotune"));
sizePolicy.setHeightForWidth(sliderAutotune->sizePolicy().hasHeightForWidth());
sliderAutotune->setSizePolicy(sizePolicy);
sliderAutotune->setValue(0);
sliderAutotune->setSliderPosition(0);
sliderAutotune->setOrientation(Qt::Horizontal);
horizontalLayout_22->addWidget(sliderAutotune);
doubleSpinBoxAutotune = new QDoubleSpinBox(controlTab);
doubleSpinBoxAutotune->setObjectName(QString::fromUtf8("doubleSpinBoxAutotune"));
sizePolicy1.setHeightForWidth(doubleSpinBoxAutotune->sizePolicy().hasHeightForWidth());
doubleSpinBoxAutotune->setSizePolicy(sizePolicy1);
doubleSpinBoxAutotune->setMaximum(1);
doubleSpinBoxAutotune->setSingleStep(0.01);
doubleSpinBoxAutotune->setValue(0);
horizontalLayout_22->addWidget(doubleSpinBoxAutotune);
verticalLayout_6->addLayout(horizontalLayout_22);
horizontalLayout_8 = new QHBoxLayout();
horizontalLayout_8->setObjectName(QString::fromUtf8("horizontalLayout_8"));
label_21 = new QLabel(controlTab);
label_21->setObjectName(QString::fromUtf8("label_21"));
label_21->setFont(font2);
horizontalLayout_8->addWidget(label_21);
sliderNMix = new QSlider(controlTab);
sliderNMix->setObjectName(QString::fromUtf8("sliderNMix"));
sizePolicy.setHeightForWidth(sliderNMix->sizePolicy().hasHeightForWidth());
sliderNMix->setSizePolicy(sizePolicy);
sliderNMix->setValue(0);
sliderNMix->setOrientation(Qt::Horizontal);
horizontalLayout_8->addWidget(sliderNMix);
doubleSpinBoxNMix = new QDoubleSpinBox(controlTab);
doubleSpinBoxNMix->setObjectName(QString::fromUtf8("doubleSpinBoxNMix"));
sizePolicy1.setHeightForWidth(doubleSpinBoxNMix->sizePolicy().hasHeightForWidth());
doubleSpinBoxNMix->setSizePolicy(sizePolicy1);
doubleSpinBoxNMix->setMaximum(1);
doubleSpinBoxNMix->setSingleStep(0.01);
doubleSpinBoxNMix->setValue(0);
horizontalLayout_8->addWidget(doubleSpinBoxNMix);
verticalLayout_6->addLayout(horizontalLayout_8);
horizontalLayout_9 = new QHBoxLayout();
horizontalLayout_9->setObjectName(QString::fromUtf8("horizontalLayout_9"));
label_22 = new QLabel(controlTab);
label_22->setObjectName(QString::fromUtf8("label_22"));
label_22->setFont(font2);
horizontalLayout_9->addWidget(label_22);
sliderTargetMix = new QSlider(controlTab);
sliderTargetMix->setObjectName(QString::fromUtf8("sliderTargetMix"));
sizePolicy.setHeightForWidth(sliderTargetMix->sizePolicy().hasHeightForWidth());
sliderTargetMix->setSizePolicy(sizePolicy);
sliderTargetMix->setValue(0);
sliderTargetMix->setSliderPosition(0);
sliderTargetMix->setOrientation(Qt::Horizontal);
horizontalLayout_9->addWidget(sliderTargetMix);
doubleSpinBoxTargetMix = new QDoubleSpinBox(controlTab);
doubleSpinBoxTargetMix->setObjectName(QString::fromUtf8("doubleSpinBoxTargetMix"));
sizePolicy1.setHeightForWidth(doubleSpinBoxTargetMix->sizePolicy().hasHeightForWidth());
doubleSpinBoxTargetMix->setSizePolicy(sizePolicy1);
doubleSpinBoxTargetMix->setMaximum(1);
doubleSpinBoxTargetMix->setSingleStep(0.01);
doubleSpinBoxTargetMix->setValue(0);
horizontalLayout_9->addWidget(doubleSpinBoxTargetMix);
verticalLayout_6->addLayout(horizontalLayout_9);
verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
verticalLayout_6->addItem(verticalSpacer); verticalLayout_6->addItem(verticalSpacer);
@ -749,13 +771,41 @@ public:
horizontalLayout_5->addLayout(verticalLayout_6); horizontalLayout_5->addLayout(verticalLayout_6);
verticalLayout_2 = new QVBoxLayout(); verticalLayout = new QVBoxLayout();
verticalLayout_2->setObjectName(QString::fromUtf8("verticalLayout_2")); verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
label_3 = new QLabel(controlTab); label_3 = new QLabel(controlTab);
label_3->setObjectName(QString::fromUtf8("label_3")); label_3->setObjectName(QString::fromUtf8("label_3"));
label_3->setFont(font1); label_3->setFont(font1);
verticalLayout_2->addWidget(label_3); verticalLayout->addWidget(label_3);
listWidgetSounds = new QListWidget(controlTab);
listWidgetSounds->setObjectName(QString::fromUtf8("listWidgetSounds"));
verticalLayout->addWidget(listWidgetSounds);
horizontalLayout_2 = new QHBoxLayout();
horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
pushButtonLoadSound = new QPushButton(controlTab);
pushButtonLoadSound->setObjectName(QString::fromUtf8("pushButtonLoadSound"));
pushButtonLoadSound->setFont(font);
horizontalLayout_2->addWidget(pushButtonLoadSound);
pushButtonDeleteSound = new QPushButton(controlTab);
pushButtonDeleteSound->setObjectName(QString::fromUtf8("pushButtonDeleteSound"));
pushButtonDeleteSound->setFont(font);
horizontalLayout_2->addWidget(pushButtonDeleteSound);
verticalLayout->addLayout(horizontalLayout_2);
pushButtonClearBrain = new QPushButton(controlTab);
pushButtonClearBrain->setObjectName(QString::fromUtf8("pushButtonClearBrain"));
pushButtonClearBrain->setFont(font);
verticalLayout->addWidget(pushButtonClearBrain);
horizontalLayout_4 = new QHBoxLayout(); horizontalLayout_4 = new QHBoxLayout();
horizontalLayout_4->setObjectName(QString::fromUtf8("horizontalLayout_4")); horizontalLayout_4->setObjectName(QString::fromUtf8("horizontalLayout_4"));
@ -773,7 +823,7 @@ public:
horizontalLayout_4->addWidget(spinBoxBlockSize); horizontalLayout_4->addWidget(spinBoxBlockSize);
verticalLayout_2->addLayout(horizontalLayout_4); verticalLayout->addLayout(horizontalLayout_4);
horizontalLayout_6 = new QHBoxLayout(); horizontalLayout_6 = new QHBoxLayout();
horizontalLayout_6->setObjectName(QString::fromUtf8("horizontalLayout_6")); horizontalLayout_6->setObjectName(QString::fromUtf8("horizontalLayout_6"));
@ -792,24 +842,24 @@ public:
horizontalLayout_6->addWidget(doubleSpinBoxBlockOverlap); horizontalLayout_6->addWidget(doubleSpinBoxBlockOverlap);
verticalLayout_2->addLayout(horizontalLayout_6); verticalLayout->addLayout(horizontalLayout_6);
gridLayout = new QGridLayout(); gridLayout = new QGridLayout();
gridLayout->setObjectName(QString::fromUtf8("gridLayout")); gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
radioButton_gaussian = new QRadioButton(controlTab); radioButton_hamming = new QRadioButton(controlTab);
buttonGroup = new QButtonGroup(MainWindow); buttonGroup = new QButtonGroup(MainWindow);
buttonGroup->setObjectName(QString::fromUtf8("buttonGroup")); buttonGroup->setObjectName(QString::fromUtf8("buttonGroup"));
buttonGroup->addButton(radioButton_gaussian);
radioButton_gaussian->setObjectName(QString::fromUtf8("radioButton_gaussian"));
gridLayout->addWidget(radioButton_gaussian, 3, 1, 1, 1);
radioButton_hamming = new QRadioButton(controlTab);
buttonGroup->addButton(radioButton_hamming); buttonGroup->addButton(radioButton_hamming);
radioButton_hamming->setObjectName(QString::fromUtf8("radioButton_hamming")); radioButton_hamming->setObjectName(QString::fromUtf8("radioButton_hamming"));
gridLayout->addWidget(radioButton_hamming, 4, 1, 1, 1); gridLayout->addWidget(radioButton_hamming, 4, 1, 1, 1);
radioButton_gaussian = new QRadioButton(controlTab);
buttonGroup->addButton(radioButton_gaussian);
radioButton_gaussian->setObjectName(QString::fromUtf8("radioButton_gaussian"));
gridLayout->addWidget(radioButton_gaussian, 3, 1, 1, 1);
radioButton_dodgy = new QRadioButton(controlTab); radioButton_dodgy = new QRadioButton(controlTab);
buttonGroup->addButton(radioButton_dodgy); buttonGroup->addButton(radioButton_dodgy);
radioButton_dodgy->setObjectName(QString::fromUtf8("radioButton_dodgy")); radioButton_dodgy->setObjectName(QString::fromUtf8("radioButton_dodgy"));
@ -853,13 +903,13 @@ public:
gridLayout->addWidget(label_4, 2, 0, 1, 1); gridLayout->addWidget(label_4, 2, 0, 1, 1);
verticalLayout_2->addLayout(gridLayout); verticalLayout->addLayout(gridLayout);
pushButtonGenerate = new QPushButton(controlTab); pushButtonGenerate = new QPushButton(controlTab);
pushButtonGenerate->setObjectName(QString::fromUtf8("pushButtonGenerate")); pushButtonGenerate->setObjectName(QString::fromUtf8("pushButtonGenerate"));
pushButtonGenerate->setFont(font); pushButtonGenerate->setFont(font);
verticalLayout_2->addWidget(pushButtonGenerate); verticalLayout->addWidget(pushButtonGenerate);
horizontalLayout_7 = new QHBoxLayout(); horizontalLayout_7 = new QHBoxLayout();
horizontalLayout_7->setObjectName(QString::fromUtf8("horizontalLayout_7")); horizontalLayout_7->setObjectName(QString::fromUtf8("horizontalLayout_7"));
@ -876,50 +926,7 @@ public:
horizontalLayout_7->addWidget(pushButtonSaveBrain); horizontalLayout_7->addWidget(pushButtonSaveBrain);
verticalLayout_2->addLayout(horizontalLayout_7); verticalLayout->addLayout(horizontalLayout_7);
verticalSpacer_2 = new QSpacerItem(20, 508, QSizePolicy::Minimum, QSizePolicy::Expanding);
verticalLayout_2->addItem(verticalSpacer_2);
horizontalLayout_5->addLayout(verticalLayout_2);
verticalLayout = new QVBoxLayout();
verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
label_5 = new QLabel(controlTab);
label_5->setObjectName(QString::fromUtf8("label_5"));
label_5->setFont(font);
verticalLayout->addWidget(label_5);
listWidgetSounds = new QListWidget(controlTab);
listWidgetSounds->setObjectName(QString::fromUtf8("listWidgetSounds"));
verticalLayout->addWidget(listWidgetSounds);
horizontalLayout_2 = new QHBoxLayout();
horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
pushButtonLoadSound = new QPushButton(controlTab);
pushButtonLoadSound->setObjectName(QString::fromUtf8("pushButtonLoadSound"));
pushButtonLoadSound->setFont(font);
horizontalLayout_2->addWidget(pushButtonLoadSound);
pushButtonDeleteSound = new QPushButton(controlTab);
pushButtonDeleteSound->setObjectName(QString::fromUtf8("pushButtonDeleteSound"));
pushButtonDeleteSound->setFont(font);
horizontalLayout_2->addWidget(pushButtonDeleteSound);
pushButtonClearBrain = new QPushButton(controlTab);
pushButtonClearBrain->setObjectName(QString::fromUtf8("pushButtonClearBrain"));
pushButtonClearBrain->setFont(font);
horizontalLayout_2->addWidget(pushButtonClearBrain);
verticalLayout->addLayout(horizontalLayout_2);
horizontalLayout_5->addLayout(verticalLayout); horizontalLayout_5->addLayout(verticalLayout);
@ -1070,6 +1077,8 @@ public:
QObject::connect(sliderSlideError, SIGNAL(valueChanged(int)), MainWindow, SLOT(slide_error(int))); QObject::connect(sliderSlideError, SIGNAL(valueChanged(int)), MainWindow, SLOT(slide_error(int)));
QObject::connect(doubleSpinBoxStickyness, SIGNAL(valueChanged(double)), MainWindow, SLOT(stickyness_slot(double))); QObject::connect(doubleSpinBoxStickyness, SIGNAL(valueChanged(double)), MainWindow, SLOT(stickyness_slot(double)));
QObject::connect(sliderStickyness, SIGNAL(valueChanged(int)), MainWindow, SLOT(stickyness_slot(int))); QObject::connect(sliderStickyness, SIGNAL(valueChanged(int)), MainWindow, SLOT(stickyness_slot(int)));
QObject::connect(doubleSpinBoxAutotune, SIGNAL(valueChanged(double)), MainWindow, SLOT(autotune(double)));
QObject::connect(sliderAutotune, SIGNAL(sliderMoved(int)), MainWindow, SLOT(autotune(int)));
tabWidget->setCurrentIndex(0); tabWidget->setCurrentIndex(0);
@ -1079,13 +1088,13 @@ public:
void retranslateUi(QMainWindow *MainWindow) void retranslateUi(QMainWindow *MainWindow)
{ {
MainWindow->setWindowTitle(QApplication::translate("MainWindow", "samplebrain 0.10", 0, QApplication::UnicodeUTF8)); MainWindow->setWindowTitle(QApplication::translate("MainWindow", "samplebrain 0.11", 0, QApplication::UnicodeUTF8));
label_19->setText(QApplication::translate("MainWindow", "brain tweaks", 0, QApplication::UnicodeUTF8)); label_19->setText(QApplication::translate("MainWindow", "brain tweaks", 0, QApplication::UnicodeUTF8));
label_6->setText(QApplication::translate("MainWindow", "fft / mfcc", 0, QApplication::UnicodeUTF8)); label_6->setText(QApplication::translate("MainWindow", "fft / mfcc", 0, QApplication::UnicodeUTF8));
#ifndef QT_NO_TOOLTIP #ifndef QT_NO_TOOLTIP
sliderRatio->setToolTip(QApplication::translate("MainWindow", "plain fft match vs mfcc values ", 0, QApplication::UnicodeUTF8)); sliderRatio->setToolTip(QApplication::translate("MainWindow", "plain fft match vs mfcc values ", 0, QApplication::UnicodeUTF8));
#endif // QT_NO_TOOLTIP #endif // QT_NO_TOOLTIP
label_20->setText(QApplication::translate("MainWindow", "freq & dynamics / freq only", 0, QApplication::UnicodeUTF8)); label_20->setText(QApplication::translate("MainWindow", "dynamics / freq", 0, QApplication::UnicodeUTF8));
#ifndef QT_NO_TOOLTIP #ifndef QT_NO_TOOLTIP
sliderNRatio->setToolTip(QApplication::translate("MainWindow", "match original or normalised blocks", 0, QApplication::UnicodeUTF8)); sliderNRatio->setToolTip(QApplication::translate("MainWindow", "match original or normalised blocks", 0, QApplication::UnicodeUTF8));
#endif // QT_NO_TOOLTIP #endif // QT_NO_TOOLTIP
@ -1120,7 +1129,7 @@ public:
#endif // QT_NO_TOOLTIP #endif // QT_NO_TOOLTIP
label_30->setText(QApplication::translate("MainWindow", "stickyness", 0, QApplication::UnicodeUTF8)); label_30->setText(QApplication::translate("MainWindow", "stickyness", 0, QApplication::UnicodeUTF8));
#ifndef QT_NO_TOOLTIP #ifndef QT_NO_TOOLTIP
sliderStickyness->setToolTip(QApplication::translate("MainWindow", "how long it takes for the novelty to wear off", 0, QApplication::UnicodeUTF8)); sliderStickyness->setToolTip(QApplication::translate("MainWindow", "prioritise brain order over closeness", 0, QApplication::UnicodeUTF8));
#endif // QT_NO_TOOLTIP #endif // QT_NO_TOOLTIP
#ifndef QT_NO_TOOLTIP #ifndef QT_NO_TOOLTIP
label_28->setToolTip(QString()); label_28->setToolTip(QString());
@ -1140,7 +1149,7 @@ public:
#ifndef QT_NO_TOOLTIP #ifndef QT_NO_TOOLTIP
radioButtonAlgoRevBasic->setToolTip(QApplication::translate("MainWindow", "full brain reverse search", 0, QApplication::UnicodeUTF8)); radioButtonAlgoRevBasic->setToolTip(QApplication::translate("MainWindow", "full brain reverse search", 0, QApplication::UnicodeUTF8));
#endif // QT_NO_TOOLTIP #endif // QT_NO_TOOLTIP
radioButtonAlgoRevBasic->setText(QApplication::translate("MainWindow", "rev basic", 0, QApplication::UnicodeUTF8)); radioButtonAlgoRevBasic->setText(QApplication::translate("MainWindow", "rev", 0, QApplication::UnicodeUTF8));
#ifndef QT_NO_TOOLTIP #ifndef QT_NO_TOOLTIP
radioButtonSynaptic->setToolTip(QApplication::translate("MainWindow", "search based on synapse connections", 0, QApplication::UnicodeUTF8)); radioButtonSynaptic->setToolTip(QApplication::translate("MainWindow", "search based on synapse connections", 0, QApplication::UnicodeUTF8));
#endif // QT_NO_TOOLTIP #endif // QT_NO_TOOLTIP
@ -1168,15 +1177,6 @@ public:
#endif // QT_NO_TOOLTIP #endif // QT_NO_TOOLTIP
#ifndef QT_NO_TOOLTIP #ifndef QT_NO_TOOLTIP
spinBoxSlideError->setToolTip(QApplication::translate("MainWindow", "how many connections to search (ordered in closeness)", 0, QApplication::UnicodeUTF8)); spinBoxSlideError->setToolTip(QApplication::translate("MainWindow", "how many connections to search (ordered in closeness)", 0, QApplication::UnicodeUTF8));
#endif // QT_NO_TOOLTIP
label_23->setText(QApplication::translate("MainWindow", "mix", 0, QApplication::UnicodeUTF8));
label_21->setText(QApplication::translate("MainWindow", "dynamic / normalised ", 0, QApplication::UnicodeUTF8));
#ifndef QT_NO_TOOLTIP
sliderNMix->setToolTip(QApplication::translate("MainWindow", "mix in the normalised blocks", 0, QApplication::UnicodeUTF8));
#endif // QT_NO_TOOLTIP
label_22->setText(QApplication::translate("MainWindow", "brain / target", 0, QApplication::UnicodeUTF8));
#ifndef QT_NO_TOOLTIP
sliderTargetMix->setToolTip(QApplication::translate("MainWindow", "mix in the original blocks", 0, QApplication::UnicodeUTF8));
#endif // QT_NO_TOOLTIP #endif // QT_NO_TOOLTIP
label_16->setText(QApplication::translate("MainWindow", "target sound", 0, QApplication::UnicodeUTF8)); label_16->setText(QApplication::translate("MainWindow", "target sound", 0, QApplication::UnicodeUTF8));
pushButtonLoadTarget->setText(QApplication::translate("MainWindow", "load target", 0, QApplication::UnicodeUTF8)); pushButtonLoadTarget->setText(QApplication::translate("MainWindow", "load target", 0, QApplication::UnicodeUTF8));
@ -1192,11 +1192,27 @@ public:
radioButton_rectangleTarget->setText(QApplication::translate("MainWindow", "rectangle", 0, QApplication::UnicodeUTF8)); radioButton_rectangleTarget->setText(QApplication::translate("MainWindow", "rectangle", 0, QApplication::UnicodeUTF8));
label_14->setText(QApplication::translate("MainWindow", "window shape", 0, QApplication::UnicodeUTF8)); label_14->setText(QApplication::translate("MainWindow", "window shape", 0, QApplication::UnicodeUTF8));
pushButtonGenerateTarget->setText(QApplication::translate("MainWindow", "(re)generate blocks", 0, QApplication::UnicodeUTF8)); pushButtonGenerateTarget->setText(QApplication::translate("MainWindow", "(re)generate blocks", 0, QApplication::UnicodeUTF8));
label_3->setText(QApplication::translate("MainWindow", "brain parameters", 0, QApplication::UnicodeUTF8)); label_23->setText(QApplication::translate("MainWindow", "mix", 0, QApplication::UnicodeUTF8));
label_31->setText(QApplication::translate("MainWindow", "autotune", 0, QApplication::UnicodeUTF8));
#ifndef QT_NO_TOOLTIP
sliderAutotune->setToolTip(QApplication::translate("MainWindow", "amount to match the frequency", 0, QApplication::UnicodeUTF8));
#endif // QT_NO_TOOLTIP
label_21->setText(QApplication::translate("MainWindow", "dynamic / normalised ", 0, QApplication::UnicodeUTF8));
#ifndef QT_NO_TOOLTIP
sliderNMix->setToolTip(QApplication::translate("MainWindow", "mix in the normalised blocks", 0, QApplication::UnicodeUTF8));
#endif // QT_NO_TOOLTIP
label_22->setText(QApplication::translate("MainWindow", "brain / target", 0, QApplication::UnicodeUTF8));
#ifndef QT_NO_TOOLTIP
sliderTargetMix->setToolTip(QApplication::translate("MainWindow", "mix in the original blocks", 0, QApplication::UnicodeUTF8));
#endif // QT_NO_TOOLTIP
label_3->setText(QApplication::translate("MainWindow", "brain contents", 0, QApplication::UnicodeUTF8));
pushButtonLoadSound->setText(QApplication::translate("MainWindow", "load sound", 0, QApplication::UnicodeUTF8));
pushButtonDeleteSound->setText(QApplication::translate("MainWindow", "delete selected", 0, QApplication::UnicodeUTF8));
pushButtonClearBrain->setText(QApplication::translate("MainWindow", "clear brain", 0, QApplication::UnicodeUTF8));
label->setText(QApplication::translate("MainWindow", "block size", 0, QApplication::UnicodeUTF8)); label->setText(QApplication::translate("MainWindow", "block size", 0, QApplication::UnicodeUTF8));
label_2->setText(QApplication::translate("MainWindow", "block overlap", 0, QApplication::UnicodeUTF8)); label_2->setText(QApplication::translate("MainWindow", "block overlap", 0, QApplication::UnicodeUTF8));
radioButton_gaussian->setText(QApplication::translate("MainWindow", "gaussian", 0, QApplication::UnicodeUTF8));
radioButton_hamming->setText(QApplication::translate("MainWindow", "hamming", 0, QApplication::UnicodeUTF8)); radioButton_hamming->setText(QApplication::translate("MainWindow", "hamming", 0, QApplication::UnicodeUTF8));
radioButton_gaussian->setText(QApplication::translate("MainWindow", "gaussian", 0, QApplication::UnicodeUTF8));
radioButton_dodgy->setText(QApplication::translate("MainWindow", "dodgy", 0, QApplication::UnicodeUTF8)); radioButton_dodgy->setText(QApplication::translate("MainWindow", "dodgy", 0, QApplication::UnicodeUTF8));
radioButton_blackman->setText(QApplication::translate("MainWindow", "blackman", 0, QApplication::UnicodeUTF8)); radioButton_blackman->setText(QApplication::translate("MainWindow", "blackman", 0, QApplication::UnicodeUTF8));
radioButton_rectagle->setText(QApplication::translate("MainWindow", "rectangle", 0, QApplication::UnicodeUTF8)); radioButton_rectagle->setText(QApplication::translate("MainWindow", "rectangle", 0, QApplication::UnicodeUTF8));
@ -1207,10 +1223,6 @@ public:
pushButtonGenerate->setText(QApplication::translate("MainWindow", "(re)generate brain", 0, QApplication::UnicodeUTF8)); pushButtonGenerate->setText(QApplication::translate("MainWindow", "(re)generate brain", 0, QApplication::UnicodeUTF8));
pushButtonLoadBrain->setText(QApplication::translate("MainWindow", "load brain", 0, QApplication::UnicodeUTF8)); pushButtonLoadBrain->setText(QApplication::translate("MainWindow", "load brain", 0, QApplication::UnicodeUTF8));
pushButtonSaveBrain->setText(QApplication::translate("MainWindow", "save brain", 0, QApplication::UnicodeUTF8)); pushButtonSaveBrain->setText(QApplication::translate("MainWindow", "save brain", 0, QApplication::UnicodeUTF8));
label_5->setText(QApplication::translate("MainWindow", "brain contents", 0, QApplication::UnicodeUTF8));
pushButtonLoadSound->setText(QApplication::translate("MainWindow", "load sound", 0, QApplication::UnicodeUTF8));
pushButtonDeleteSound->setText(QApplication::translate("MainWindow", "delete selected", 0, QApplication::UnicodeUTF8));
pushButtonClearBrain->setText(QApplication::translate("MainWindow", "clear brain", 0, QApplication::UnicodeUTF8));
tabWidget->setTabText(tabWidget->indexOf(controlTab), QApplication::translate("MainWindow", "search", 0, QApplication::UnicodeUTF8)); tabWidget->setTabText(tabWidget->indexOf(controlTab), QApplication::translate("MainWindow", "search", 0, QApplication::UnicodeUTF8));
tabWidget->setTabText(tabWidget->indexOf(logTab), QApplication::translate("MainWindow", "log", 0, QApplication::UnicodeUTF8)); tabWidget->setTabText(tabWidget->indexOf(logTab), QApplication::translate("MainWindow", "log", 0, QApplication::UnicodeUTF8));
pushButtonPlay->setText(QString()); pushButtonPlay->setText(QString());
@ -1228,4 +1240,4 @@ namespace Ui {
QT_END_NAMESPACE QT_END_NAMESPACE
#endif // SAMPLEBRAINJ11878_H #endif // SAMPLEBRAINPM4153_H

View File

@ -23,7 +23,7 @@
#include "process_thread.h" #include "process_thread.h"
#include "audio_thread.h" #include "audio_thread.h"
#include "pitchshift.h" //#include "pitchshift.h"
using namespace std; using namespace std;
@ -32,7 +32,7 @@ int main( int argc , char *argv[] ){
MainWindow mainWin; MainWindow mainWin;
mainWin.show(); mainWin.show();
pitchshift::init(44100); //pitchshift::init(44100);
process_thread pt; process_thread pt;
audio_thread at(pt); audio_thread at(pt);

View File

@ -25,7 +25,6 @@ SOURCES += MainWindow.cpp \
../src/renderer.cpp \ ../src/renderer.cpp \
../src/status.cpp \ ../src/status.cpp \
../src/window.cpp \ ../src/window.cpp \
../src/pitchshift.cpp \
../src/aquila/filter/MelFilterBank.cpp \ ../src/aquila/filter/MelFilterBank.cpp \
../src/aquila/filter/MelFilter.cpp \ ../src/aquila/filter/MelFilter.cpp \
../src/aquila/transform/Dct.cpp \ ../src/aquila/transform/Dct.cpp \
@ -39,7 +38,7 @@ SOURCES += MainWindow.cpp \
../../../jellyfish/src/core/stream.cpp ../../../jellyfish/src/core/stream.cpp
INCLUDEPATH += ../src INCLUDEPATH += ../src
LIBS += -L.. -lrubberband -lportaudio -lfftw3 -lsndfile -llo -ldl -lpthread -lm LIBS += -L.. -lportaudio -lfftw3 -lsndfile -llo -ldl -lpthread -lm
#CONFIG+=debug #CONFIG+=debug
QMAKE_CXXFLAGS += -Wall -Wno-unused -std=c++11 -DDONT_USE_FLUXA_GRAPH QMAKE_CXXFLAGS += -Wall -Wno-unused -std=c++11 -DDONT_USE_FLUXA_GRAPH

View File

@ -65,7 +65,9 @@ float FFT::calculate_dominant_freq() {
highest=t; highest=t;
} }
} }
return index * (SRATE/(float)m_length); float freq = index * (SRATE/(float)m_length);
if (freq<0.01) freq=0.01;
return freq;
} }
void FFT::calculate_bins() { void FFT::calculate_bins() {

View File

@ -16,7 +16,7 @@
#include "renderer.h" #include "renderer.h"
#include <iostream> #include <iostream>
#include "pitchshift.h" //#include "pitchshift.h"
using namespace spiralcore; using namespace spiralcore;
using namespace std; using namespace std;
@ -157,14 +157,17 @@ void renderer::render(u32 nframes, float *buf) {
// get the sample offset into the buffer // get the sample offset into the buffer
s32 offset = i->m_time-m_render_time; s32 offset = i->m_time-m_render_time;
u32 block_length = pcm.get_length();
// assume midway through block // assume midway through block
u32 block_start = offset; u32 block_start = offset;
u32 buffer_start = 0; u32 buffer_start = 0;
if (offset<0) { if (offset<0) {
block_start=-offset; block_start=-offset;
if (block_start>=pcm.get_length() || if (block_start>=block_length &&
i->m_position>=pcm.get_length()) i->m_finished=true; i->m_position>=block_length) {
i->m_finished=true;
}
} else { // block is midway through buffer } else { // block is midway through buffer
block_start=0; block_start=0;
buffer_start=offset; buffer_start=offset;
@ -174,35 +177,54 @@ void renderer::render(u32 nframes, float *buf) {
// cerr<<"block start:"<<block_start<<endl; // cerr<<"block start:"<<block_start<<endl;
// cerr<<"buffer start:"<<buffer_start<<endl; // cerr<<"buffer start:"<<buffer_start<<endl;
float pitch_scale = m_target.get_block(i->m_tgt_index).get_freq() /
m_source.get_block(i->m_index).get_freq();
// fade in/out autotune // fade in/out autotune
pitch_scale = pitch_scale*m_autotune + 1.0f*(1-m_autotune); //pitch_scale = pitch_scale*m_autotune + 1.0f*(1-m_autotune);
float pitch_scale = 1;
if (m_autotune>0) {
pitch_scale = m_target.get_block(i->m_tgt_index).get_freq() /
m_source.get_block(i->m_index).get_freq();
float max = 1+(m_autotune*m_autotune)*100.0f;
if (pitch_scale>(max)) pitch_scale=max;
if (pitch_scale<(1/max)) pitch_scale=1/max;
}
//pitchshift::process(pcm,pitch_scale,render_pcm); //pitchshift::process(pcm,pitch_scale,render_pcm);
if (!i->m_finished) { if (!i->m_finished) {
// mix in // mix in
u32 buffer_pos = buffer_start; u32 buffer_pos = buffer_start;
u32 block_pos = block_start; u32 block_pos = block_start;
u32 block_end = pcm.get_length(); u32 block_end = pcm.get_length();
while (i->m_position<block_end && buffer_pos<nframes) {
while (block_pos<block_end && buffer_pos<nframes) {
// mix with normalised version // mix with normalised version
float brain_sample = (pcm[i->m_position]*(1-m_n_mix)+ float brain_sample = (pcm[i->m_position]*(1-m_n_mix)+
n_pcm[block_pos]*m_n_mix); n_pcm[i->m_position]*m_n_mix);
// for mixing with target audio float target_sample = 0;
float target_sample = target_pcm[block_pos];
// if playback scale is lower than target then we may
// run off the end of the target block
if (block_pos<block_length) {
// for mixing with target audio
target_sample = target_pcm[block_pos];
}
buf[buffer_pos]+=(brain_sample*(1-m_target_mix) + buf[buffer_pos]+=(brain_sample*(1-m_target_mix) +
target_sample*m_target_mix)*0.2*m_volume; target_sample*m_target_mix)*0.2*m_volume;
i->m_position+=pitch_scale; i->m_position+=pitch_scale;
// repeat fast blocks if we are still playing the source
if (block_pos<block_length &&
i->m_position>block_end) {
i->m_position=0;
}
++buffer_pos; ++buffer_pos;
++block_pos; ++block_pos;
} }

View File

@ -52,6 +52,7 @@ namespace spiralcore {
void set_target_mix(float s) { m_target_mix=s; } void set_target_mix(float s) { m_target_mix=s; }
void set_slide_error(double s) { m_slide_error=s; } void set_slide_error(double s) { m_slide_error=s; }
void set_stretch(u32 s) { m_stretch=s; } void set_stretch(u32 s) { m_stretch=s; }
void set_autotune(float s) { m_autotune=s; }
search_params *get_params() { return &m_search_params; } search_params *get_params() { return &m_search_params; }
brain &get_source() { return m_source; } brain &get_source() { return m_source; }