From 114816653713dc750bcc0acb476c618ee44fc6b1 Mon Sep 17 00:00:00 2001 From: Dave Griffiths Date: Tue, 21 Jul 2015 18:13:39 +0100 Subject: [PATCH] freq/dynamics stuff --- samplebrain/interface/samplebrain.ui | 877 +++++++++++----------- samplebrain/qt/MainWindow.h | 2 + samplebrain/qt/audio_thread.cpp | 3 + samplebrain/qt/generated/ui_samplebrain.h | 199 ++--- samplebrain/qt/images/at.jpg | Bin 0 -> 13869 bytes samplebrain/qt/images/at.png | Bin 0 -> 2464 bytes samplebrain/qt/images/pause.png | Bin 0 -> 2890 bytes samplebrain/qt/images/play.png | Bin 0 -> 3396 bytes samplebrain/qt/images/record.png | Bin 0 -> 5099 bytes samplebrain/qt/images/stop.png | Bin 0 -> 2827 bytes samplebrain/qt/samplebrain.qrc | 9 + samplebrain/src/block.cpp | 139 +++- samplebrain/src/block.h | 11 + samplebrain/src/brain.cpp | 2 +- samplebrain/src/fft.cpp | 18 +- samplebrain/src/fft.h | 18 +- samplebrain/src/main.cpp | 20 +- samplebrain/src/renderer.cpp | 1 + samplebrain/src/renderer.h | 6 +- samplebrain/src/search_params.h | 21 +- 20 files changed, 708 insertions(+), 618 deletions(-) create mode 100644 samplebrain/qt/images/at.jpg create mode 100644 samplebrain/qt/images/at.png create mode 100644 samplebrain/qt/images/pause.png create mode 100644 samplebrain/qt/images/play.png create mode 100644 samplebrain/qt/images/record.png create mode 100644 samplebrain/qt/images/stop.png create mode 100644 samplebrain/qt/samplebrain.qrc diff --git a/samplebrain/interface/samplebrain.ui b/samplebrain/interface/samplebrain.ui index 52ca655..23734f0 100644 --- a/samplebrain/interface/samplebrain.ui +++ b/samplebrain/interface/samplebrain.ui @@ -49,197 +49,184 @@ + + + + + Comic Sans MS + 14 + 75 + true + + + + fft <-> mfcc ratio + + + - - - - Comic Sans MS - 14 - 75 - true - + + + + 0 + 0 + - - fft <-> mfcc ratio + + 50 - - - - - - - - - 0 - 0 - - - - 50 - - - Qt::Horizontal - - - - - - - 1.000000000000000 - - - 0.010000000000000 - - - 0.500000000000000 - - - - - - - - - - Comic Sans MS - 14 - 75 - true - - - - fft subsection 1 - - - - - - - - - - Comic Sans MS - 75 - true - - - - Start - - - - - - - - - - - - - - - Comic Sans MS - 75 - true - - - - End - - - - - - - 99 - - - - - - - - - - - - - - Comic Sans MS - 14 - 75 - true - - - - fft subsection 2 - - - - - - - - - - Comic Sans MS - 75 - true - - - - Start - - - - - - - - - - - - - - - Comic Sans MS - 75 - true - - - - End - - - - - - - 99 - - - - - - - - Qt::Vertical + Qt::Horizontal - - - 20 - 40 - + + + + + + + 0 + 0 + - + + 1.000000000000000 + + + 0.010000000000000 + + + 0.500000000000000 + + + + + + + Comic Sans MS + 14 + 75 + true + + + + freq & dynamics <-> freq ratio + + + + + + + + + + 0 + 0 + + + + 50 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + 1.000000000000000 + + + 0.010000000000000 + + + 0.500000000000000 + + + + + + + + + + Comic Sans MS + 14 + 75 + true + + + + fft subsection + + + + + + + + + + Comic Sans MS + 75 + true + + + + Start + + + + + + + + + + + Comic Sans MS + 75 + true + + + + End + + + + + + + 99 + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + @@ -259,20 +246,6 @@ - - - - - Comic Sans MS - 75 - true - - - - no sound yet... - - - @@ -908,6 +881,118 @@ + + dialVolume + sliderMoved(int) + MainWindow + volume_slot(int) + + + 189 + 480 + + + 361 + 301 + + + + + pushButtonStopRecord + released() + MainWindow + stop_record() + + + 328 + 543 + + + 361 + 306 + + + + + pushButtonRecord + released() + MainWindow + record() + + + 236 + 543 + + + 361 + 306 + + + + + spinBoxBlockSize + valueChanged(int) + MainWindow + block_size(int) + + + 188 + 105 + + + 399 + 301 + + + + + pushButtonLoadTarget + released() + MainWindow + load_target() + + + 277 + 103 + + + 399 + 301 + + + + + pushButtonGenerateTarget + released() + MainWindow + generate_target_blocks() + + + 277 + 202 + + + 399 + 301 + + + + + spinBoxBlockSizeTarget + valueChanged(int) + MainWindow + target_block_size(int) + + + 313 + 136 + + + 399 + 301 + + + doubleSpinBoxRatio valueChanged(double) @@ -956,102 +1041,6 @@ - - spinBoxFFT2Start - valueChanged(int) - MainWindow - fft2_start_slot(int) - - - 154 - 366 - - - 399 - 301 - - - - - spinBoxFFT2End - valueChanged(int) - MainWindow - fft2_end_slot(int) - - - 154 - 399 - - - 399 - 301 - - - - - pushButtonLoadTarget - released() - MainWindow - load_target() - - - 277 - 103 - - - 399 - 301 - - - - - spinBoxBlockSizeTarget - valueChanged(int) - MainWindow - target_block_size(int) - - - 313 - 136 - - - 399 - 301 - - - - - pushButtonGenerateTarget - released() - MainWindow - generate_target_blocks() - - - 277 - 202 - - - 399 - 301 - - - - - spinBoxBlockSize - valueChanged(int) - MainWindow - block_size(int) - - - 188 - 105 - - - 399 - 301 - - - pushButtonGenerate released() @@ -1084,22 +1073,6 @@ - - dialVolume - sliderMoved(int) - MainWindow - volume_slot(int) - - - 189 - 480 - - - 361 - 301 - - - doubleSpinBoxBlockOverlap valueChanged(double) @@ -1116,6 +1089,38 @@ + + radioButton_hammingTarget + toggled(bool) + MainWindow + window_target_hamming(bool) + + + 619 + 290 + + + 361 + 301 + + + + + pushButtonDeleteSound + released() + MainWindow + delete_sound() + + + 476 + 544 + + + 361 + 301 + + + doubleSpinBoxBlockOverlapTarget valueChanged(double) @@ -1133,14 +1138,14 @@ - pushButtonClearBrain - released() + radioButton_dodgy + toggled(bool) MainWindow - clear_brain() + window_dodgy(bool) - 590 - 544 + 75 + 203 361 @@ -1149,13 +1154,77 @@ - pushButtonDeleteSound - released() + radioButton_blackman + toggled(bool) MainWindow - delete_sound() + window_blackman(bool) - 476 + 75 + 261 + + + 361 + 301 + + + + + radioButton_hann + toggled(bool) + MainWindow + window_hann(bool) + + + 188 + 261 + + + 361 + 301 + + + + + radioButton_hamming + toggled(bool) + MainWindow + window_hamming(bool) + + + 188 + 232 + + + 361 + 301 + + + + + radioButton_gaussian + toggled(bool) + MainWindow + window_gaussian(bool) + + + 188 + 203 + + + 361 + 301 + + + + + pushButtonClearBrain + released() + MainWindow + clear_brain() + + + 590 544 @@ -1180,38 +1249,6 @@ - - radioButton_blackman - toggled(bool) - MainWindow - window_blackman(bool) - - - 75 - 261 - - - 361 - 301 - - - - - radioButton_dodgy - toggled(bool) - MainWindow - window_dodgy(bool) - - - 75 - 203 - - - 361 - 301 - - - radioButton_flattop toggled(bool) @@ -1228,54 +1265,6 @@ - - radioButton_gaussian - toggled(bool) - MainWindow - window_gaussian(bool) - - - 188 - 203 - - - 361 - 301 - - - - - radioButton_hamming - toggled(bool) - MainWindow - window_hamming(bool) - - - 188 - 232 - - - 361 - 301 - - - - - radioButton_hann - toggled(bool) - MainWindow - window_hann(bool) - - - 188 - 261 - - - 361 - 301 - - - radioButton_rectagle toggled(bool) @@ -1293,46 +1282,14 @@ - radioButton_bartlettTarget + radioButton_rectangleTarget toggled(bool) MainWindow - window_target_bartlett(bool) + window_target_rectangle(bool) - 449 - 290 - - - 361 - 301 - - - - - radioButton_blackmanTarget - toggled(bool) - MainWindow - window_target_blackman(bool) - - - 449 - 319 - - - 361 - 301 - - - - - radioButton_dodgyTarget - toggled(bool) - MainWindow - window_target_dodgy(bool) - - - 449 - 261 + 619 + 348 361 @@ -1357,14 +1314,14 @@ - radioButton_gaussianTarget + radioButton_blackmanTarget toggled(bool) MainWindow - window_target_gaussian(bool) + window_target_blackman(bool) - 619 - 261 + 449 + 319 361 @@ -1373,13 +1330,13 @@ - radioButton_hammingTarget + radioButton_bartlettTarget toggled(bool) MainWindow - window_target_hamming(bool) + window_target_bartlett(bool) - 619 + 449 290 @@ -1388,6 +1345,22 @@ + + radioButton_dodgyTarget + toggled(bool) + MainWindow + window_target_dodgy(bool) + + + 449 + 261 + + + 361 + 301 + + + radioButton_hannTarget toggled(bool) @@ -1405,14 +1378,14 @@ - radioButton_rectangleTarget + radioButton_gaussianTarget toggled(bool) MainWindow - window_target_rectangle(bool) + window_target_gaussian(bool) 619 - 348 + 261 361 @@ -1437,14 +1410,14 @@ - pushButtonStopRecord - released() + sliderNRatio + valueChanged(int) MainWindow - stop_record() + n_ratio_slot(int) - 328 - 543 + 159 + 211 361 @@ -1453,14 +1426,14 @@ - pushButtonRecord - released() + doubleSpinBoxNRatio + valueChanged(double) MainWindow - record() + n_ratio_slot(double) - 236 - 543 + 330 + 211 361 @@ -1511,5 +1484,7 @@ window_target_rectangle(bool) record() stop_record() + n_ratio_slot(int) + n_ratio_slot(double) diff --git a/samplebrain/qt/MainWindow.h b/samplebrain/qt/MainWindow.h index bc59aab..a5c48d3 100644 --- a/samplebrain/qt/MainWindow.h +++ b/samplebrain/qt/MainWindow.h @@ -42,6 +42,8 @@ private slots: void stop_slot() { lo_send(m_audio_address,"/pause",""); } void ratio_slot(int s) { lo_send(m_audio_address,"/ratio","f",s/100.0f); } void ratio_slot(double s) { lo_send(m_audio_address,"/ratio","f",s); } + void n_ratio_slot(int s) { lo_send(m_audio_address,"/n_ratio","f",s/100.0f); } + void n_ratio_slot(double s) { lo_send(m_audio_address,"/n_ratio","f",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 fft2_start_slot(int s){} // { m_renderer->get_params()->m_fft2_start=s; } diff --git a/samplebrain/qt/audio_thread.cpp b/samplebrain/qt/audio_thread.cpp index 75edb97..b3ade9e 100644 --- a/samplebrain/qt/audio_thread.cpp +++ b/samplebrain/qt/audio_thread.cpp @@ -67,6 +67,9 @@ void audio_thread::process(sample &s, sample &s2) { 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); } diff --git a/samplebrain/qt/generated/ui_samplebrain.h b/samplebrain/qt/generated/ui_samplebrain.h index 3344aba..a31be08 100644 --- a/samplebrain/qt/generated/ui_samplebrain.h +++ b/samplebrain/qt/generated/ui_samplebrain.h @@ -1,7 +1,7 @@ /******************************************************************************** ** Form generated from reading UI file 'samplebrainB32443.ui' ** -** Created: Tue Jul 21 14:56:57 2015 +** Created: Tue Jul 21 15:50:16 2015 ** by: Qt User Interface Compiler version 4.8.1 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! @@ -45,30 +45,23 @@ public: QHBoxLayout *horizontalLayout_8; QVBoxLayout *verticalLayout_3; QLabel *label_19; - QHBoxLayout *horizontalLayout_16; QLabel *label_6; + QHBoxLayout *horizontalLayout_16; QSlider *sliderRatio; QDoubleSpinBox *doubleSpinBoxRatio; - QVBoxLayout *verticalLayout_4; + QLabel *label_20; + QHBoxLayout *horizontalLayout; + QSlider *sliderNRatio; + QDoubleSpinBox *doubleSpinBoxNRatio; QLabel *label_7; QHBoxLayout *horizontalLayout_3; QLabel *label_9; QSpinBox *spinBoxFFT1Start; - QHBoxLayout *horizontalLayout_9; QLabel *label_10; QSpinBox *spinBoxFFT1End; - QVBoxLayout *verticalLayout_5; - QLabel *label_8; - QHBoxLayout *horizontalLayout_10; - QLabel *label_11; - QSpinBox *spinBoxFFT2Start; - QHBoxLayout *horizontalLayout_11; - QLabel *label_12; - QSpinBox *spinBoxFFT2End; QSpacerItem *verticalSpacer_3; QVBoxLayout *verticalLayout_6; QLabel *label_16; - QLabel *label_15; QPushButton *pushButtonLoadTarget; QHBoxLayout *horizontalLayout_13; QLabel *label_17; @@ -166,8 +159,6 @@ public: verticalLayout_3->addWidget(label_19); - horizontalLayout_16 = new QHBoxLayout(); - horizontalLayout_16->setObjectName(QString::fromUtf8("horizontalLayout_16")); label_6 = new QLabel(controlTab); label_6->setObjectName(QString::fromUtf8("label_6")); QFont font2; @@ -177,11 +168,10 @@ public: font2.setWeight(75); label_6->setFont(font2); - horizontalLayout_16->addWidget(label_6); - - - verticalLayout_3->addLayout(horizontalLayout_16); + verticalLayout_3->addWidget(label_6); + horizontalLayout_16 = new QHBoxLayout(); + horizontalLayout_16->setObjectName(QString::fromUtf8("horizontalLayout_16")); sliderRatio = new QSlider(controlTab); sliderRatio->setObjectName(QString::fromUtf8("sliderRatio")); QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); @@ -192,23 +182,59 @@ public: sliderRatio->setValue(50); sliderRatio->setOrientation(Qt::Horizontal); - verticalLayout_3->addWidget(sliderRatio); + horizontalLayout_16->addWidget(sliderRatio); doubleSpinBoxRatio = new QDoubleSpinBox(controlTab); doubleSpinBoxRatio->setObjectName(QString::fromUtf8("doubleSpinBoxRatio")); + QSizePolicy sizePolicy1(QSizePolicy::Fixed, QSizePolicy::Fixed); + sizePolicy1.setHorizontalStretch(0); + sizePolicy1.setVerticalStretch(0); + sizePolicy1.setHeightForWidth(doubleSpinBoxRatio->sizePolicy().hasHeightForWidth()); + doubleSpinBoxRatio->setSizePolicy(sizePolicy1); doubleSpinBoxRatio->setMaximum(1); doubleSpinBoxRatio->setSingleStep(0.01); doubleSpinBoxRatio->setValue(0.5); - verticalLayout_3->addWidget(doubleSpinBoxRatio); + horizontalLayout_16->addWidget(doubleSpinBoxRatio); + + + verticalLayout_3->addLayout(horizontalLayout_16); + + label_20 = new QLabel(controlTab); + label_20->setObjectName(QString::fromUtf8("label_20")); + label_20->setFont(font2); + + verticalLayout_3->addWidget(label_20); + + horizontalLayout = new QHBoxLayout(); + horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout")); + sliderNRatio = new QSlider(controlTab); + sliderNRatio->setObjectName(QString::fromUtf8("sliderNRatio")); + sizePolicy.setHeightForWidth(sliderNRatio->sizePolicy().hasHeightForWidth()); + sliderNRatio->setSizePolicy(sizePolicy); + sliderNRatio->setValue(50); + sliderNRatio->setOrientation(Qt::Horizontal); + + horizontalLayout->addWidget(sliderNRatio); + + doubleSpinBoxNRatio = new QDoubleSpinBox(controlTab); + doubleSpinBoxNRatio->setObjectName(QString::fromUtf8("doubleSpinBoxNRatio")); + sizePolicy1.setHeightForWidth(doubleSpinBoxNRatio->sizePolicy().hasHeightForWidth()); + doubleSpinBoxNRatio->setSizePolicy(sizePolicy1); + doubleSpinBoxNRatio->setMaximum(1); + doubleSpinBoxNRatio->setSingleStep(0.01); + doubleSpinBoxNRatio->setValue(0.5); + + horizontalLayout->addWidget(doubleSpinBoxNRatio); + + + verticalLayout_3->addLayout(horizontalLayout); - verticalLayout_4 = new QVBoxLayout(); - verticalLayout_4->setObjectName(QString::fromUtf8("verticalLayout_4")); label_7 = new QLabel(controlTab); label_7->setObjectName(QString::fromUtf8("label_7")); label_7->setFont(font2); - verticalLayout_4->addWidget(label_7); + verticalLayout_3->addWidget(label_7); horizontalLayout_3 = new QHBoxLayout(); horizontalLayout_3->setObjectName(QString::fromUtf8("horizontalLayout_3")); @@ -223,76 +249,24 @@ public: horizontalLayout_3->addWidget(spinBoxFFT1Start); - - verticalLayout_4->addLayout(horizontalLayout_3); - - horizontalLayout_9 = new QHBoxLayout(); - horizontalLayout_9->setObjectName(QString::fromUtf8("horizontalLayout_9")); label_10 = new QLabel(controlTab); label_10->setObjectName(QString::fromUtf8("label_10")); label_10->setFont(font); - horizontalLayout_9->addWidget(label_10); + horizontalLayout_3->addWidget(label_10); spinBoxFFT1End = new QSpinBox(controlTab); spinBoxFFT1End->setObjectName(QString::fromUtf8("spinBoxFFT1End")); spinBoxFFT1End->setValue(99); - horizontalLayout_9->addWidget(spinBoxFFT1End); + horizontalLayout_3->addWidget(spinBoxFFT1End); - verticalLayout_4->addLayout(horizontalLayout_9); - - - verticalLayout_3->addLayout(verticalLayout_4); - - verticalLayout_5 = new QVBoxLayout(); - verticalLayout_5->setObjectName(QString::fromUtf8("verticalLayout_5")); - label_8 = new QLabel(controlTab); - label_8->setObjectName(QString::fromUtf8("label_8")); - label_8->setFont(font2); - - verticalLayout_5->addWidget(label_8); - - horizontalLayout_10 = new QHBoxLayout(); - horizontalLayout_10->setObjectName(QString::fromUtf8("horizontalLayout_10")); - label_11 = new QLabel(controlTab); - label_11->setObjectName(QString::fromUtf8("label_11")); - label_11->setFont(font); - - horizontalLayout_10->addWidget(label_11); - - spinBoxFFT2Start = new QSpinBox(controlTab); - spinBoxFFT2Start->setObjectName(QString::fromUtf8("spinBoxFFT2Start")); - - horizontalLayout_10->addWidget(spinBoxFFT2Start); - - - verticalLayout_5->addLayout(horizontalLayout_10); - - horizontalLayout_11 = new QHBoxLayout(); - horizontalLayout_11->setObjectName(QString::fromUtf8("horizontalLayout_11")); - label_12 = new QLabel(controlTab); - label_12->setObjectName(QString::fromUtf8("label_12")); - label_12->setFont(font); - - horizontalLayout_11->addWidget(label_12); - - spinBoxFFT2End = new QSpinBox(controlTab); - spinBoxFFT2End->setObjectName(QString::fromUtf8("spinBoxFFT2End")); - spinBoxFFT2End->setValue(99); - - horizontalLayout_11->addWidget(spinBoxFFT2End); - - - verticalLayout_5->addLayout(horizontalLayout_11); + verticalLayout_3->addLayout(horizontalLayout_3); verticalSpacer_3 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); - verticalLayout_5->addItem(verticalSpacer_3); - - - verticalLayout_3->addLayout(verticalLayout_5); + verticalLayout_3->addItem(verticalSpacer_3); horizontalLayout_8->addLayout(verticalLayout_3); @@ -305,12 +279,6 @@ public: verticalLayout_6->addWidget(label_16); - label_15 = new QLabel(controlTab); - label_15->setObjectName(QString::fromUtf8("label_15")); - label_15->setFont(font); - - verticalLayout_6->addWidget(label_15); - pushButtonLoadTarget = new QPushButton(controlTab); pushButtonLoadTarget->setObjectName(QString::fromUtf8("pushButtonLoadTarget")); pushButtonLoadTarget->setFont(font); @@ -673,41 +641,41 @@ public: retranslateUi(MainWindow); QObject::connect(pushButtonPlay, SIGNAL(released()), MainWindow, SLOT(play_slot())); QObject::connect(pushButtonStop, SIGNAL(released()), MainWindow, SLOT(stop_slot())); + QObject::connect(dialVolume, SIGNAL(sliderMoved(int)), MainWindow, SLOT(volume_slot(int))); + QObject::connect(pushButtonStopRecord, SIGNAL(released()), MainWindow, SLOT(stop_record())); + QObject::connect(pushButtonRecord, SIGNAL(released()), MainWindow, SLOT(record())); + QObject::connect(spinBoxBlockSize, SIGNAL(valueChanged(int)), MainWindow, SLOT(block_size(int))); + QObject::connect(pushButtonLoadTarget, SIGNAL(released()), MainWindow, SLOT(load_target())); + QObject::connect(pushButtonGenerateTarget, SIGNAL(released()), MainWindow, SLOT(generate_target_blocks())); + QObject::connect(spinBoxBlockSizeTarget, SIGNAL(valueChanged(int)), MainWindow, SLOT(target_block_size(int))); QObject::connect(doubleSpinBoxRatio, SIGNAL(valueChanged(double)), MainWindow, SLOT(ratio_slot(double))); QObject::connect(spinBoxFFT1Start, SIGNAL(valueChanged(int)), MainWindow, SLOT(fft1_start_slot(int))); QObject::connect(spinBoxFFT1End, SIGNAL(valueChanged(int)), MainWindow, SLOT(fft1_end_slot(int))); - QObject::connect(spinBoxFFT2Start, SIGNAL(valueChanged(int)), MainWindow, SLOT(fft2_start_slot(int))); - QObject::connect(spinBoxFFT2End, SIGNAL(valueChanged(int)), MainWindow, SLOT(fft2_end_slot(int))); - QObject::connect(pushButtonLoadTarget, SIGNAL(released()), MainWindow, SLOT(load_target())); - QObject::connect(spinBoxBlockSizeTarget, SIGNAL(valueChanged(int)), MainWindow, SLOT(target_block_size(int))); - QObject::connect(pushButtonGenerateTarget, SIGNAL(released()), MainWindow, SLOT(generate_target_blocks())); - QObject::connect(spinBoxBlockSize, SIGNAL(valueChanged(int)), MainWindow, SLOT(block_size(int))); QObject::connect(pushButtonGenerate, SIGNAL(released()), MainWindow, SLOT(generate())); QObject::connect(pushButtonLoadSound, SIGNAL(released()), MainWindow, SLOT(load_sound())); - QObject::connect(dialVolume, SIGNAL(sliderMoved(int)), MainWindow, SLOT(volume_slot(int))); QObject::connect(doubleSpinBoxBlockOverlap, SIGNAL(valueChanged(double)), MainWindow, SLOT(block_overlap(double))); - QObject::connect(doubleSpinBoxBlockOverlapTarget, SIGNAL(valueChanged(double)), MainWindow, SLOT(target_block_overlap(double))); - QObject::connect(pushButtonClearBrain, SIGNAL(released()), MainWindow, SLOT(clear_brain())); - QObject::connect(pushButtonDeleteSound, SIGNAL(released()), MainWindow, SLOT(delete_sound())); - QObject::connect(radioButton_bartlett, SIGNAL(toggled(bool)), MainWindow, SLOT(window_bartlett(bool))); - QObject::connect(radioButton_blackman, SIGNAL(toggled(bool)), MainWindow, SLOT(window_blackman(bool))); - QObject::connect(radioButton_dodgy, SIGNAL(toggled(bool)), MainWindow, SLOT(window_dodgy(bool))); - QObject::connect(radioButton_flattop, SIGNAL(toggled(bool)), MainWindow, SLOT(window_flattop(bool))); - QObject::connect(radioButton_gaussian, SIGNAL(toggled(bool)), MainWindow, SLOT(window_gaussian(bool))); - QObject::connect(radioButton_hamming, SIGNAL(toggled(bool)), MainWindow, SLOT(window_hamming(bool))); - QObject::connect(radioButton_hann, SIGNAL(toggled(bool)), MainWindow, SLOT(window_hann(bool))); - QObject::connect(radioButton_rectagle, SIGNAL(toggled(bool)), MainWindow, SLOT(window_rectangle(bool))); - QObject::connect(radioButton_bartlettTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_bartlett(bool))); - QObject::connect(radioButton_blackmanTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_blackman(bool))); - QObject::connect(radioButton_dodgyTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_dodgy(bool))); - QObject::connect(radioButton_flattopTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_flattop(bool))); - QObject::connect(radioButton_gaussianTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_gaussian(bool))); QObject::connect(radioButton_hammingTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_hamming(bool))); - QObject::connect(radioButton_hannTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_hann(bool))); + QObject::connect(pushButtonDeleteSound, SIGNAL(released()), MainWindow, SLOT(delete_sound())); + QObject::connect(doubleSpinBoxBlockOverlapTarget, SIGNAL(valueChanged(double)), MainWindow, SLOT(target_block_overlap(double))); + QObject::connect(radioButton_dodgy, SIGNAL(toggled(bool)), MainWindow, SLOT(window_dodgy(bool))); + QObject::connect(radioButton_blackman, SIGNAL(toggled(bool)), MainWindow, SLOT(window_blackman(bool))); + QObject::connect(radioButton_hann, SIGNAL(toggled(bool)), MainWindow, SLOT(window_hann(bool))); + QObject::connect(radioButton_hamming, SIGNAL(toggled(bool)), MainWindow, SLOT(window_hamming(bool))); + QObject::connect(radioButton_gaussian, SIGNAL(toggled(bool)), MainWindow, SLOT(window_gaussian(bool))); + QObject::connect(pushButtonClearBrain, SIGNAL(released()), MainWindow, SLOT(clear_brain())); + QObject::connect(radioButton_bartlett, SIGNAL(toggled(bool)), MainWindow, SLOT(window_bartlett(bool))); + QObject::connect(radioButton_flattop, SIGNAL(toggled(bool)), MainWindow, SLOT(window_flattop(bool))); + QObject::connect(radioButton_rectagle, SIGNAL(toggled(bool)), MainWindow, SLOT(window_rectangle(bool))); QObject::connect(radioButton_rectangleTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_rectangle(bool))); + QObject::connect(radioButton_flattopTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_flattop(bool))); + QObject::connect(radioButton_blackmanTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_blackman(bool))); + QObject::connect(radioButton_bartlettTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_bartlett(bool))); + QObject::connect(radioButton_dodgyTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_dodgy(bool))); + QObject::connect(radioButton_hannTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_hann(bool))); + QObject::connect(radioButton_gaussianTarget, SIGNAL(toggled(bool)), MainWindow, SLOT(window_target_gaussian(bool))); QObject::connect(sliderRatio, SIGNAL(valueChanged(int)), MainWindow, SLOT(ratio_slot(int))); - QObject::connect(pushButtonStopRecord, SIGNAL(released()), MainWindow, SLOT(stop_record())); - QObject::connect(pushButtonRecord, SIGNAL(released()), MainWindow, SLOT(record())); + QObject::connect(sliderNRatio, SIGNAL(valueChanged(int)), MainWindow, SLOT(n_ratio_slot(int))); + QObject::connect(doubleSpinBoxNRatio, SIGNAL(valueChanged(double)), MainWindow, SLOT(n_ratio_slot(double))); tabWidget->setCurrentIndex(0); @@ -720,14 +688,11 @@ public: MainWindow->setWindowTitle(QApplication::translate("MainWindow", "samplebrain 0.0.4", 0, QApplication::UnicodeUTF8)); label_19->setText(QApplication::translate("MainWindow", "tweakage", 0, QApplication::UnicodeUTF8)); label_6->setText(QApplication::translate("MainWindow", "fft <-> mfcc ratio", 0, QApplication::UnicodeUTF8)); - label_7->setText(QApplication::translate("MainWindow", "fft subsection 1", 0, QApplication::UnicodeUTF8)); + label_20->setText(QApplication::translate("MainWindow", "freq & dynamics <-> freq ratio", 0, QApplication::UnicodeUTF8)); + label_7->setText(QApplication::translate("MainWindow", "fft subsection", 0, QApplication::UnicodeUTF8)); label_9->setText(QApplication::translate("MainWindow", "Start", 0, QApplication::UnicodeUTF8)); label_10->setText(QApplication::translate("MainWindow", "End", 0, QApplication::UnicodeUTF8)); - label_8->setText(QApplication::translate("MainWindow", "fft subsection 2", 0, QApplication::UnicodeUTF8)); - label_11->setText(QApplication::translate("MainWindow", "Start", 0, QApplication::UnicodeUTF8)); - label_12->setText(QApplication::translate("MainWindow", "End", 0, QApplication::UnicodeUTF8)); label_16->setText(QApplication::translate("MainWindow", "target sound", 0, QApplication::UnicodeUTF8)); - label_15->setText(QApplication::translate("MainWindow", "no sound yet...", 0, QApplication::UnicodeUTF8)); pushButtonLoadTarget->setText(QApplication::translate("MainWindow", "load target", 0, QApplication::UnicodeUTF8)); label_17->setText(QApplication::translate("MainWindow", "block size", 0, QApplication::UnicodeUTF8)); label_18->setText(QApplication::translate("MainWindow", "block overlap", 0, QApplication::UnicodeUTF8)); diff --git a/samplebrain/qt/images/at.jpg b/samplebrain/qt/images/at.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc7ec5b56329ddd60105b2a3c409f1abff18fd01 GIT binary patch literal 13869 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 literal 0 HcmV?d00001 diff --git a/samplebrain/qt/images/at.png b/samplebrain/qt/images/at.png new file mode 100644 index 0000000000000000000000000000000000000000..1fa84f0392759659be53003bb8f6a0a4fe19ed44 GIT binary patch literal 2464 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 literal 0 HcmV?d00001 diff --git a/samplebrain/qt/images/record.png b/samplebrain/qt/images/record.png new file mode 100644 index 0000000000000000000000000000000000000000..128f7c00b8bc15a77f12dd89d77c38cd14b181e2 GIT binary patch literal 5099 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 VwC4*+DT0qH$j;UtS8MH)@?S{;`v?F4 literal 0 HcmV?d00001 diff --git a/samplebrain/qt/samplebrain.qrc b/samplebrain/qt/samplebrain.qrc new file mode 100644 index 0000000..834ac79 --- /dev/null +++ b/samplebrain/qt/samplebrain.qrc @@ -0,0 +1,9 @@ + + + images/at.png + images/pause.png + images/play.png + images/record.png + images/stop.png + + diff --git a/samplebrain/src/block.cpp b/samplebrain/src/block.cpp index 005a990..9b6e975 100644 --- a/samplebrain/src/block.cpp +++ b/samplebrain/src/block.cpp @@ -15,6 +15,7 @@ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include +#include #include #include "block.h" @@ -26,11 +27,41 @@ Aquila::Mfcc *block::m_mfcc_proc; static const int MFCC_FILTERS=12; +void normalise(sample &in) { + // find min/max + float max = 0; + float min = FLT_MAX; + for (u32 i=0; imax) max=in[i]; + } + + float mid = min+(max-min)/2.0f; + + // remove dc + for (u32 i=0; iimpulse2freq(m_pcm.get_non_const_buffer()); + // rerun the normalised version + normalise(m_n_pcm); + process(m_n_pcm,m_n_fft,m_n_mfcc); - std::vector > mfspec; - - for (u32 i=0; im_spectrum[i][0]; - - mfspec.push_back(std::complex(m_fftw->m_spectrum[i][0], - m_fftw->m_spectrum[i][1])); + if (ditchpcm) { + m_pcm.clear(); + m_n_pcm.clear(); } - - if (m_block_size>100) m_fft.crop_to(100); - if (ditchpcm) m_pcm.clear(); - - // calculate mfcc - std::vector m = m_mfcc_proc->calculate(mfspec,MFCC_FILTERS); - - for (u32 i=0; im_length!=block_size) { @@ -74,48 +94,101 @@ void block::init_fft(u32 block_size) } } +void block::process(const sample &pcm, sample &fft, sample &mfcc) { + m_fftw->impulse2freq(pcm.get_buffer()); + + // calculate fft + std::vector > mfspec; + for (u32 i=0; im_spectrum[i][0]; + mfspec.push_back(std::complex(m_fftw->m_spectrum[i][0], + m_fftw->m_spectrum[i][1])); + } + + if (m_block_size>100) fft.crop_to(100); + + // calculate mfcc + std::vector m = m_mfcc_proc->calculate(mfspec,MFCC_FILTERS); + for (u32 i=0; im_fft.get_length()) fft_end=m_fft.get_length(); -*/ s32 fft_start = params.m_fft1_start; s32 fft_end = fmin(params.m_fft1_end,m_fft.get_length()); if (params.m_ratio==0) { for (u32 i=fft_start; i #include @@ -19,7 +35,7 @@ FFT::~FFT() fftw_destroy_plan(m_plan); } -void FFT::impulse2freq(float *imp) +void FFT::impulse2freq(const float *imp) { unsigned int i; diff --git a/samplebrain/src/fft.h b/samplebrain/src/fft.h index 4d6bfa7..c43d71b 100644 --- a/samplebrain/src/fft.h +++ b/samplebrain/src/fft.h @@ -1,3 +1,19 @@ +// Copyright (C) 2015 Foam Kernow +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + #include #ifndef SPIRALCORE_FFT @@ -12,7 +28,7 @@ class FFT public: FFT(int length); ~FFT(); - void impulse2freq(float *imp); + void impulse2freq(const float *imp); fftw_plan m_plan; unsigned int m_length; diff --git a/samplebrain/src/main.cpp b/samplebrain/src/main.cpp index a4c108f..6211444 100644 --- a/samplebrain/src/main.cpp +++ b/samplebrain/src/main.cpp @@ -59,19 +59,19 @@ int main(int argc, char *argv[]) brain source, target; // source.load_sound("../sound/source/shostakovich6.wav"); -// source.load_sound("../sound/source/808.wav"); -// source.load_sound("../sound/source/joey.wav"); -// source.load_sound("../sound/source/pw2.wav"); -// source.load_sound("../sound/source/pw3.wav"); -// source.load_sound("../sound/source/claps.wav"); -// source.load_sound("../sound/source/eagle.wav"); + source.load_sound("../sound/source/808.wav"); + source.load_sound("../sound/source/joey.wav"); + source.load_sound("../sound/source/pw2.wav"); + source.load_sound("../sound/source/pw3.wav"); + source.load_sound("../sound/source/claps.wav"); + source.load_sound("../sound/source/eagle.wav"); -// source.load_sound("../sound/source/sailingbybit.wav"); - source.load_sound("../sound/source/rise.wav"); + target.load_sound("../sound/source/apache.wav"); +// source.load_sound("../sound/source/rise.wav"); //target.load_sound("../sound/source/sb-left.wav"); - target.load_sound("../sound/source/rise.wav"); +// target.load_sound("../sound/source/rise.wav"); cerr<<"loaded sounds"<m_ratio=0; + rr.get_params()->m_ratio=0.5; a->m_client.set_callback(run_audio, &rr); diff --git a/samplebrain/src/renderer.cpp b/samplebrain/src/renderer.cpp index 4a75bfb..2ee5e10 100644 --- a/samplebrain/src/renderer.cpp +++ b/samplebrain/src/renderer.cpp @@ -46,6 +46,7 @@ void renderer::process(u32 nframes, float *buf) { return; } + // cerr<<"-----------------"<