From e5d053d06e341333e8aaaf9018669d2faca13085 Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Sun, 8 Jan 2017 18:04:07 +0000 Subject: [PATCH] Fixed mono-mode. But it sound not really good... Optimized LFO start, so it is only started when no key is currently pressed. Added some debug messages to locate the problem of setting mod ranges from 99 to 0 at startup. --- src/dexed.cpp | 81 ++++++++++++++++++++++++------------------ src/dexed.h | 7 ++-- src/msfa/controllers.h | 4 +-- 3 files changed, 52 insertions(+), 40 deletions(-) diff --git a/src/dexed.cpp b/src/dexed.cpp index d9d77de..bfcc196 100644 --- a/src/dexed.cpp +++ b/src/dexed.cpp @@ -41,8 +41,11 @@ Dexed::Dexed(double rate) : lvtk::Synth(p_n_ports, p_midi_in) voices[i].live = false; } - for(i=0;i<160;++i) + for(i=0;i<167;++i) + { data_float[i]=static_cast(data[i]); + TRACE("%d->%f",i,data_float[i]); + } currentNote = 0; memset(&controllers.values_, 0, sizeof(controllers.values_)); @@ -106,8 +109,6 @@ void Dexed::activate(void) { TRACE("Hi"); - set_params(); - Plugin::activate(); TRACE("Bye"); @@ -315,19 +316,19 @@ void Dexed::set_params(void) onParam(143,*p(p_pitch_mod_sensitivity)); onParam(144,*p(p_transpose)); // 10 bytes (145-154) are the name of the patch - + // 155 is reserved for bit-mask of enabled OPs (normaly 0x3f every time) // Controllers (added at the end of the data[]) - onParam(155,*p(p_pitch_bend_range)); - onParam(156,*p(p_pitch_bend_step)); - onParam(157,*p(p_mod_wheel_range)); - onParam(158,*p(p_mod_wheel_assign)); - onParam(159,*p(p_foot_ctrl_range)); - onParam(160,*p(p_foot_ctrl_assign)); - onParam(161,*p(p_breath_ctrl_range)); - onParam(162,*p(p_breath_ctrl_assign)); - onParam(163,*p(p_aftertouch_range)); - onParam(164,*p(p_aftertouch_assign)); - onParam(165,*p(p_master_tune)); + onParam(156,*p(p_pitch_bend_range)); + onParam(157,*p(p_pitch_bend_step)); + onParam(158,*p(p_mod_wheel_range)); + onParam(159,*p(p_mod_wheel_assign)); + onParam(160,*p(p_foot_ctrl_range)); + onParam(161,*p(p_foot_ctrl_assign)); + onParam(162,*p(p_breath_ctrl_range)); + onParam(163,*p(p_breath_ctrl_assign)); + onParam(164,*p(p_aftertouch_range)); + onParam(165,*p(p_aftertouch_assign)); + onParam(166,*p(p_master_tune)); if(_param_change_counter>PARAM_CHANGE_LEVEL) panic(); @@ -344,7 +345,7 @@ void Dexed::run (uint32_t sample_count) Plugin::run(sample_count); - if(++_param_counter%16) + if(++_k_rate_counter%16) { set_params(); // pre_process: copy actual voice params } @@ -459,7 +460,7 @@ void Dexed::GetSamples(uint32_t n_samples, float* buffer) extra_buf_size_ = i - n_samples; } - if(++_param_counter%32) + if(++_k_rate_counter%32 && !monoMode) { uint8_t op_carrier=controllers.core->get_carrier_operators(data[134]); // look for carriers @@ -491,7 +492,9 @@ void Dexed::GetSamples(uint32_t n_samples, float* buffer) { // all carrier-operators are silent -> disable the voice voices[i].live=false; - TRACE("Shutting down Voice[%2d]",i); + voices[i].sustained=false; + voices[i].keydown=false; + TRACE("Shutted down Voice[%2d]",i); } } // TRACE("Voice[%2d] live=%d keydown=%d",i,voices[i].live,voices[i].keydown); @@ -591,10 +594,11 @@ TRACE("pitch=%d, velo=%d\n",pitch,velo); } uint8_t note = currentNote; + uint8_t keydown_counter=0; + for (uint8_t i=0; ioscSync(); break; } + else + keydown_counter++; + note = (note + 1) % MAX_ACTIVE_NOTES; } + if(keydown_counter==0) + lfo.keydown(); if ( monoMode ) { for(uint8_t i=0; itransferSignal(*voices[i].dx7_note); @@ -650,9 +659,9 @@ TRACE("pitch=%d\n",pitch); } if ( monoMode ) { - uint8_t highNote = -1; - int target = 0; - for (int i=0; i highNote ) { target = i; highNote = voices[i].midi_note; @@ -676,8 +685,10 @@ TRACE("Bye"); void Dexed::onParam(uint8_t param_num,float param_val) { + if(param_val!=data_float[param_num]) { + TRACE("Parameter %d change from %f to %f",param_num, data_float[param_num], param_val); #ifdef DEBUG uint8_t tmp=data[param_num]; #endif @@ -693,43 +704,43 @@ void Dexed::onParam(uint8_t param_num,float param_val) switch(param_num) { - case 155: + case 156: controllers.values_[kControllerPitchRange]=data[param_num]; break; - case 156: + case 157: controllers.values_[kControllerPitchStep]=data[param_num]; break; - case 157: + case 158: controllers.wheel.setRange(data[param_num]); break; - case 158: + case 159: controllers.wheel.setConfig(data[param_num]); break; - case 159: + case 160: controllers.foot.setRange(data[param_num]); break; - case 160: + case 161: controllers.foot.setConfig(data[param_num]); break; - case 161: + case 162: controllers.breath.setRange(data[param_num]); break; - case 162: + case 163: controllers.breath.setConfig(data[param_num]); break; - case 163: + case 164: controllers.at.setRange(data[param_num]); break; - case 164: + case 165: controllers.at.setConfig(data[param_num]); break; - case 165: + case 166: int32_t tune=param_val*0x4000; controllers.masterTune=(tune<<11)*(1.0/12); break; } - TRACE("Parameter %d change from %d to %d",param_num, tmp, data[param_num]); + TRACE("Done :Parameter %d changed from %d to %d",param_num, tmp, data[param_num]); } } diff --git a/src/dexed.h b/src/dexed.h index 8073fe7..e1d4002 100644 --- a/src/dexed.h +++ b/src/dexed.h @@ -119,10 +119,10 @@ class Dexed : public lvtk::Synth private: double _rate; - uint8_t _param_counter; + uint8_t _k_rate_counter; uint8_t _param_change_counter; float data_float[166]; - uint8_t data[166]={ + uint8_t data[167]={ 95, 29, 20, 50, 99, 95, 00, 00, 41, 00, 19, 00, 00, 03, 00, 06, 79, 00, 01, 00, 14, 95, 20, 20, 50, 99, 95, 00, 00, 00, 00, 00, 00, 00, 03, 00, 00, 99, 00, 01, 00, 00, 95, 29, 20, 50, 99, 95, 00, 00, 00, 00, 00, 00, 00, 03, 00, 06, 89, 00, 01, 00, 07, @@ -134,8 +134,9 @@ class Dexed : public lvtk::Synth 34, 33, 00, 00, 00, 04, 03, 24, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, + 63, 01, 00, 99, 00, 99, 00, 99, 00, 99, 00, - 63 + 00 }; }; diff --git a/src/msfa/controllers.h b/src/msfa/controllers.h index b2d50bf..3997cfe 100755 --- a/src/msfa/controllers.h +++ b/src/msfa/controllers.h @@ -58,10 +58,10 @@ public: if(assign & 1) pitch=true; - if(assign & (1<<1)) + if(assign & 2) amp=true; - if(assign & (1<<2)) + if(assign & 4) eg=true; } };