Skip to content

Commit 6e6d472

Browse files
committed
Implement IR MIX mode
1 parent c5239db commit 6e6d472

File tree

8 files changed

+278
-35
lines changed

8 files changed

+278
-35
lines changed

NeuralRack/clap/NeuralRack.cc

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ class NeuralRack
8383

8484
param.registerParam("IR Out Gain L", "IR", -20,20,0,0.1, (void*)&engine.IRoutputGain, false, Is_FLOAT);
8585
param.registerParam("IR Out Gain R", "IR", -20,20,0,0.1, (void*)&engine.IRoutputGain1, false, Is_FLOAT);
86+
87+
param.registerParam("IR Mode", "IR", 0,1,0,1, (void*)&engine.IRmode, true, IS_UINT);
88+
param.registerParam("IR Mix", "IR", 0,1,0.5,0.01,(void*)&engine.IRmix, false, Is_FLOAT);
89+
param.registerParam("Master", "IR", -20,20,0,0.1, (void*)&engine.MasterOutGain, false, Is_FLOAT);
8690
}
8791

8892
void startGui(Window window) {
@@ -273,9 +277,12 @@ class NeuralRack
273277
adj_set_value(ui->widget[21]->adj, engine.peq->fVslider3);
274278
adj_set_value(ui->widget[22]->adj, engine.peq->fVslider4);
275279
adj_set_value(ui->widget[23]->adj, engine.peq->fVslider5);
276-
adj_set_value(ui->widget[24]->adj, engine.eqOnOff);
280+
adj_set_value(ui->widget[24]->adj, static_cast<float>(engine.eqOnOff));
277281
adj_set_value(ui->widget[25]->adj, engine.ngate->threshold);
278-
adj_set_value(ui->widget[26]->adj, engine.ngOnOff);
282+
adj_set_value(ui->widget[26]->adj, static_cast<float>(engine.ngOnOff));
283+
adj_set_value(ui->widget[27]->adj, static_cast<float>(engine.IRmode));
284+
adj_set_value(ui->widget[28]->adj, engine.IRmix);
285+
adj_set_value(ui->widget[29]->adj, engine.MasterOutGain);
279286
}
280287

281288
// send value changes from GUI to the engine
@@ -409,6 +416,18 @@ class NeuralRack
409416
engine.ngOnOff = static_cast<uint32_t>(value);
410417
param.setParamDirty(2 , true);
411418
break;
419+
case 33:
420+
engine.IRmode = static_cast<uint32_t>(value);
421+
param.setParamDirty(19 , true);
422+
break;
423+
case 34:
424+
engine.IRmix = value;
425+
param.setParamDirty(20 , true);
426+
break;
427+
case 35:
428+
engine.MasterOutGain = value;
429+
param.setParamDirty(21 , true);
430+
break;
412431
default:
413432
break;
414433
}
@@ -532,6 +551,15 @@ class NeuralRack
532551
engine.ngate->threshold = check_stod(value);
533552
buf >> value;
534553
engine.ngOnOff = static_cast<uint32_t>(check_stod(value));
554+
// break here in case a old preset is in use
555+
if(buf.peek() == decltype(buf)::traits_type::eof()) continue;
556+
buf >> value;
557+
if (value.compare("|") == 0) continue;
558+
engine.IRmode = static_cast<uint32_t>(check_stod(value));
559+
buf >> value;
560+
engine.IRmix = check_stod(value);
561+
buf >> value;
562+
engine.MasterOutGain = check_stod(value);
535563
} else if (key.compare("[Model]") == 0) {
536564
engine.model_file = remove_sub(line, "[Model] ");
537565
engine._ab.fetch_add(1, std::memory_order_relaxed);
@@ -585,6 +613,9 @@ class NeuralRack
585613
buffer << engine.eqOnOff << " ";
586614
buffer << engine.ngate->threshold << " ";
587615
buffer << engine.ngOnOff << " ";
616+
buffer << engine.IRmode << " ";
617+
buffer << engine.IRmix << " ";
618+
buffer << engine.MasterOutGain << " ";
588619
buffer << "|";
589620
buffer << "[Model] " << engine.model_file << "|";
590621
buffer << "[Model1] " << engine.model_file1 << "|";

NeuralRack/engine/engine.h

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ class Engine
105105
float outputGain1;
106106
float IRoutputGain;
107107
float IRoutputGain1;
108+
float MasterOutGain;
109+
float IRmix;
108110
float buffered;
109111
float latency;
110112
float XrunCounter;
@@ -119,6 +121,7 @@ class Engine
119121
uint32_t buffersize;
120122
uint32_t eqOnOff;
121123
uint32_t ngOnOff;
124+
uint32_t IRmode;
122125
int phaseOffset;
123126

124127
std::string model_file;
@@ -162,6 +165,8 @@ class Engine
162165
double fRec1[2];
163166
double fRec4[2];
164167
double fRec5[2];
168+
double fRec6[2];
169+
double fRec7[2];
165170

166171
inline void processConv1();
167172
inline void processBuffer();
@@ -196,6 +201,7 @@ inline Engine::Engine() :
196201
bypass = 0;
197202
eqOnOff = 0;
198203
ngOnOff = 0;
204+
IRmode = 0;
199205
normSlotA = 0;
200206
normSlotB = 0;
201207
inputGain = 0.0;
@@ -204,6 +210,8 @@ inline Engine::Engine() :
204210
outputGain1 = 0.0;
205211
IRoutputGain = 0.0;
206212
IRoutputGain1 = 0.0;
213+
MasterOutGain = 0.0;
214+
IRmix = 0.0;
207215
buffered = 0.0;
208216
latency = 0.0;
209217
XrunCounter = 0.0;
@@ -276,6 +284,8 @@ inline void Engine::init(uint32_t rate, int32_t rt_prio_, int32_t rt_policy_) {
276284
for (int l0 = 0; l0 < 2; l0 = l0 + 1) fRec1[l0] = 0.0;
277285
for (int l0 = 0; l0 < 2; l0 = l0 + 1) fRec4[l0] = 0.0;
278286
for (int l0 = 0; l0 < 2; l0 = l0 + 1) fRec5[l0] = 0.0;
287+
for (int l0 = 0; l0 < 2; l0 = l0 + 1) fRec6[l0] = 0.0;
288+
for (int l0 = 0; l0 < 2; l0 = l0 + 1) fRec7[l0] = 0.0;
279289
};
280290

281291
void Engine::clean_up()
@@ -286,6 +296,8 @@ void Engine::clean_up()
286296
for (int l0 = 0; l0 < 2; l0 = l0 + 1) fRec1[l0] = 0.0;
287297
for (int l0 = 0; l0 < 2; l0 = l0 + 1) fRec4[l0] = 0.0;
288298
for (int l0 = 0; l0 < 2; l0 = l0 + 1) fRec5[l0] = 0.0;
299+
for (int l0 = 0; l0 < 2; l0 = l0 + 1) fRec6[l0] = 0.0;
300+
for (int l0 = 0; l0 < 2; l0 = l0 + 1) fRec7[l0] = 0.0;
289301
// delete the internal DSP mem
290302
}
291303

@@ -534,23 +546,48 @@ inline void Engine::processDsp(uint32_t n_samples, float* output, float* output1
534546
}
535547
}
536548

549+
if (IRmode == 0) { // Stereo mode
537550
// IRoutputGain
538-
for (uint32_t i0 = 0; i0 < n_samples; i0 = i0 + 1) {
539-
fRec1[0] = fSlow1 + 0.999 * fRec1[1];
540-
output[i0] = bufa[i0] * fRec1[0];
541-
fRec1[1] = fRec1[0];
551+
for (uint32_t i0 = 0; i0 < n_samples; i0 = i0 + 1) {
552+
fRec1[0] = fSlow1 + 0.999 * fRec1[1];
553+
output[i0] = bufa[i0] * fRec1[0];
554+
fRec1[1] = fRec1[0];
555+
}
556+
// IRoutputGain1
557+
for (uint32_t i0 = 0; i0 < n_samples; i0 = i0 + 1) {
558+
fRec5[0] = fSlow5 + 0.999 * fRec5[1];
559+
output1[i0] = bufb[i0] * fRec5[0];
560+
fRec5[1] = fRec5[0];
561+
}
562+
} else { // Mix mode
563+
// mix output when needed
564+
double fSlow7 = 0.0010000000000000009 * std::pow(1e+01, 0.05 * double(MasterOutGain));
565+
if ((!_execute.load(std::memory_order_acquire) &&
566+
conv.is_runnable()) && conv1.is_runnable()) {
567+
double fSlow6 = 0.0010000000000000009 * double(IRmix);
568+
for (uint32_t i0 = 0; i0 < n_samples; i0 = i0 + 1) {
569+
fRec6[0] = fSlow6 + 0.999 * fRec6[1];
570+
output[i0] = bufa[i0] * (1.0 - fRec6[0]) + bufb[i0] * fRec6[0];
571+
fRec6[1] = fRec6[0];
572+
}
573+
} else if (!_execute.load(std::memory_order_acquire) && conv.is_runnable()) {
574+
memcpy(output, bufa, n_samples*sizeof(float));
575+
} else if (!_execute.load(std::memory_order_acquire) && conv1.is_runnable()) {
576+
memcpy(output, bufb, n_samples*sizeof(float));
577+
}
578+
// MasterOutGain
579+
for (uint32_t i0 = 0; i0 < n_samples; i0 = i0 + 1) {
580+
fRec7[0] = fSlow7 + 0.999 * fRec7[1];
581+
output[i0] *= fRec7[0];
582+
fRec7[1] = fRec7[0];
583+
}
584+
memcpy(output1, output, n_samples*sizeof(float));
542585
}
543586

544587
// run noisegate
545588
if (ngOnOff)
546589
ngate->computeLeft(n_samples, output);
547590

548-
// IRoutputGain1
549-
for (uint32_t i0 = 0; i0 < n_samples; i0 = i0 + 1) {
550-
fRec5[0] = fSlow5 + 0.999 * fRec5[1];
551-
output1[i0] = bufb[i0] * fRec5[0];
552-
fRec5[1] = fRec5[0];
553-
}
554591

555592
// run noisegate
556593
if (ngOnOff)

NeuralRack/gui/NeuralRack.c

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ void set_custom_theme(X11_UI *ui) {
6767

6868
ui->main.color_scheme->insensitive = (Colors) {
6969
/* cairo / r / g / b / a / */
70-
.fg = { 0.850, 0.850, 0.850, 0.500},
70+
.fg = { 0.450, 0.450, 0.450, 0.500},
7171
.bg = { 0.100, 0.100, 0.100, 0.500},
7272
.base = { 0.000, 0.000, 0.000, 0.500},
7373
.text = { 0.900, 0.900, 0.900, 0.500},
@@ -375,7 +375,7 @@ void plugin_create_controller_widgets(X11_UI *ui, const char * plugin_uri) {
375375
set_widget_color(ui->elem[2], (Color_state)0, (Color_mod)0, 0.322, 0.322, 0.322,1.0);
376376
ui->elem[2]->func.expose_callback = draw_ir_elem;
377377

378-
ui->widget[3] = add_lv2_knob (ui->widget[3], ui->elem[2], 7, "Gain (L)", ui, 25, 15, 70, 80);
378+
ui->widget[3] = add_lv2_knob (ui->widget[3], ui->elem[2], 7, "Gain (L)", ui, 55, 15, 70, 80);
379379
set_adjustment(ui->widget[3]->adj, 0.0, 0.0, -20.0, 20.0, 0.2, CL_CONTINUOS);
380380
// controller label colour
381381
set_widget_color(ui->widget[3], (Color_state)0, (Color_mod)0, 0.592, 0.612, 0.631,1.0);
@@ -384,18 +384,27 @@ void plugin_create_controller_widgets(X11_UI *ui, const char * plugin_uri) {
384384
// controller label colour hover
385385
set_widget_color(ui->widget[3], (Color_state)1, (Color_mod)0, 0.694, 0.714, 0.737,1.0);
386386

387+
ui->widget[28] = add_lv2_knob (ui->widget[28], ui->elem[2], 34, "Mix", ui, 55, 15, 70, 80);
388+
set_adjustment(ui->widget[28]->adj, 0.5, 0.5, 0.0, 1.0, 0.01, CL_CONTINUOS);
389+
// controller label colour
390+
set_widget_color(ui->widget[28], (Color_state)0, (Color_mod)0, 0.592, 0.612, 0.631,1.0);
391+
// controller background colour
392+
set_widget_color(ui->widget[28], (Color_state)0, (Color_mod)1, 0.083, 0.083, 0.083, 1.0);
393+
// controller label colour hover
394+
set_widget_color(ui->widget[28], (Color_state)1, (Color_mod)0, 0.694, 0.714, 0.737,1.0);
395+
387396
ps->ir.fbutton = add_lv2_button(ps->ir.fbutton, ui->elem[2], "", ui, 445, 20, 22, 30);
388397
ps->ir.fbutton->parent_struct = (void*)&ps->ir;
389398
combobox_set_pop_position(ps->ir.fbutton, 0);
390399
combobox_set_entry_length(ps->ir.fbutton, 60);
391400
combobox_add_entry(ps->ir.fbutton, "None");
392401
ps->ir.fbutton->func.value_changed_callback = file_menu_callback;
393402

394-
ps->ir.filebutton = add_lv2_irfile_button (ps->ir.filebutton, ui->elem[2], -3, "IR File", ui, 110, 24, 25, 25);
403+
ps->ir.filebutton = add_lv2_irfile_button (ps->ir.filebutton, ui->elem[2], -3, "IR File", ui, 140, 24, 25, 25);
395404
ps->ir.filebutton->parent_struct = (void*)&ps->ir;
396405
ps->ir.filebutton->func.user_callback = file_load_response;
397406

398-
ui->widget[5] = add_lv2_toggle_button (ui->widget[5], ui->elem[2], 9, "", ui, 140, 24, 25, 25);
407+
ui->widget[5] = add_lv2_toggle_button (ui->widget[5], ui->elem[2], 9, "", ui, 170, 24, 25, 25);
399408
ui->widget[13] = add_lv2_erase_button (ui->widget[13], ui->elem[2], 17, "", ui, 470, 24, 25, 25);
400409

401410
//IR 1
@@ -408,20 +417,32 @@ void plugin_create_controller_widgets(X11_UI *ui, const char * plugin_uri) {
408417
// controller label colour hover
409418
set_widget_color(ui->widget[4], (Color_state)1, (Color_mod)0, 0.694, 0.714, 0.737,1.0);
410419

420+
ui->widget[29] = add_lv2_knob (ui->widget[29], ui->elem[2], 35, "Master", ui, 510, 15, 70, 80);
421+
set_adjustment(ui->widget[29]->adj, 0.0, 0.0, -20.0, 20.0, 0.2, CL_CONTINUOS);
422+
// controller label colour
423+
set_widget_color(ui->widget[29], (Color_state)0, (Color_mod)0, 0.592, 0.612, 0.631,1.0);
424+
// controller background colour
425+
set_widget_color(ui->widget[29], (Color_state)0, (Color_mod)1, 0.083, 0.083, 0.083, 1.0);
426+
// controller label colour hover
427+
set_widget_color(ui->widget[29], (Color_state)1, (Color_mod)0, 0.694, 0.714, 0.737,1.0);
428+
411429
ps->ir1.fbutton = add_lv2_button(ps->ir1.fbutton, ui->elem[2], "", ui, 445, 64, 22, 30);
412430
ps->ir1.fbutton->parent_struct = (void*)&ps->ir1;
413431
combobox_set_pop_position(ps->ir1.fbutton, 0);
414432
combobox_set_entry_length(ps->ir1.fbutton, 60);
415433
combobox_add_entry(ps->ir1.fbutton, "None");
416434
ps->ir1.fbutton->func.value_changed_callback = file_menu_callback;
417435

418-
ps->ir1.filebutton = add_lv2_irfile_button (ps->ir1.filebutton, ui->elem[2], -4, "IR File", ui, 110, 68, 25, 25);
436+
ps->ir1.filebutton = add_lv2_irfile_button (ps->ir1.filebutton, ui->elem[2], -4, "IR File", ui, 140, 68, 25, 25);
419437
ps->ir1.filebutton->parent_struct = (void*)&ps->ir1;
420438
ps->ir1.filebutton->func.user_callback = file_load_response;
421439

422-
ui->widget[6] = add_lv2_toggle_button (ui->widget[6], ui->elem[2], 10, "", ui, 140, 68, 25, 25);
440+
ui->widget[6] = add_lv2_toggle_button (ui->widget[6], ui->elem[2], 10, "", ui, 170, 68, 25, 25);
423441
ui->widget[14] = add_lv2_erase_button (ui->widget[14], ui->elem[2], 18, "", ui, 470, 68, 25, 25);
424442

443+
// switch between Stereo and Mix output
444+
ui->widget[27] = add_lv2_vswitch (ui->widget[27], ui->elem[2], 33, "Stereo", ui, 15, 18, 50, 80);
445+
425446
}
426447

427448

0 commit comments

Comments
 (0)