From 45f7028f4e38af089b24fdbb35b44741a64e726b Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Sat, 17 Dec 2016 19:47:52 +0000 Subject: [PATCH] Optimized the parameter change method. --- src/dexed.cpp | 314 ++++++++++++++++++++++++++------------------------ src/dexed.h | 3 +- 2 files changed, 163 insertions(+), 154 deletions(-) diff --git a/src/dexed.cpp b/src/dexed.cpp index 660a456..98f3ad1 100644 --- a/src/dexed.cpp +++ b/src/dexed.cpp @@ -152,157 +152,157 @@ void Dexed::set_params(void) } // OP6 - onParam(0,static_cast(*p(p_op6_eg_rate_1))); - onParam(1,static_cast(*p(p_op6_eg_rate_2))); - onParam(2,static_cast(*p(p_op6_eg_rate_3))); - onParam(3,static_cast(*p(p_op6_eg_rate_4))); - onParam(4,static_cast(*p(p_op6_eg_level_1))); - onParam(5,static_cast(*p(p_op6_eg_level_2))); - onParam(6,static_cast(*p(p_op6_eg_level_3))); - onParam(7,static_cast(*p(p_op6_eg_level_4))); - onParam(8,static_cast(*p(p_op6_kbd_lev_scl_brk_pt))); - onParam(9,static_cast(*p(p_op6_kbd_lev_scl_lft_depth))); - onParam(10,static_cast(*p(p_op6_kbd_lev_scl_rht_depth))); - onParam(11,static_cast(*p(p_op6_kbd_lev_scl_lft_curve))); - onParam(12,static_cast(*p(p_op6_kbd_lev_scl_rht_curve))); - onParam(13,static_cast(*p(p_op6_kbd_rate_scaling))); - onParam(14,static_cast(*p(p_op6_amp_mod_sensitivity))); - onParam(15,static_cast(*p(p_op6_key_vel_sensitivity))); - onParam(16,static_cast(*p(p_op6_operator_output_level))); - onParam(17,static_cast(*p(p_op6_osc_mode))); - onParam(18,static_cast(*p(p_op6_osc_freq_coarse))); - onParam(19,static_cast(*p(p_op6_osc_freq_fine))); - onParam(20,static_cast(*p(p_op6_osc_detune)+7)); + onParam(0,*p(p_op6_eg_rate_1)); + onParam(1,*p(p_op6_eg_rate_2)); + onParam(2,*p(p_op6_eg_rate_3)); + onParam(3,*p(p_op6_eg_rate_4)); + onParam(4,*p(p_op6_eg_level_1)); + onParam(5,*p(p_op6_eg_level_2)); + onParam(6,*p(p_op6_eg_level_3)); + onParam(7,*p(p_op6_eg_level_4)); + onParam(8,*p(p_op6_kbd_lev_scl_brk_pt)); + onParam(9,*p(p_op6_kbd_lev_scl_lft_depth)); + onParam(10,*p(p_op6_kbd_lev_scl_rht_depth)); + onParam(11,*p(p_op6_kbd_lev_scl_lft_curve)); + onParam(12,*p(p_op6_kbd_lev_scl_rht_curve)); + onParam(13,*p(p_op6_kbd_rate_scaling)); + onParam(14,*p(p_op6_amp_mod_sensitivity)); + onParam(15,*p(p_op6_key_vel_sensitivity)); + onParam(16,*p(p_op6_operator_output_level)); + onParam(17,*p(p_op6_osc_mode)); + onParam(18,*p(p_op6_osc_freq_coarse)); + onParam(19,*p(p_op6_osc_freq_fine)); + onParam(20,*p(p_op6_osc_detune)+7); // OP5 - onParam(21,static_cast(*p(p_op5_eg_rate_1))); - onParam(22,static_cast(*p(p_op5_eg_rate_2))); - onParam(23,static_cast(*p(p_op5_eg_rate_3))); - onParam(24,static_cast(*p(p_op5_eg_rate_4))); - onParam(25,static_cast(*p(p_op5_eg_level_1))); - onParam(26,static_cast(*p(p_op5_eg_level_2))); - onParam(27,static_cast(*p(p_op5_eg_level_3))); - onParam(28,static_cast(*p(p_op5_eg_level_4))); - onParam(29,static_cast(*p(p_op5_kbd_lev_scl_brk_pt))); - onParam(30,static_cast(*p(p_op5_kbd_lev_scl_lft_depth))); - onParam(31,static_cast(*p(p_op5_kbd_lev_scl_rht_depth))); - onParam(32,static_cast(*p(p_op5_kbd_lev_scl_lft_curve))); - onParam(33,static_cast(*p(p_op5_kbd_lev_scl_rht_curve))); - onParam(34,static_cast(*p(p_op5_kbd_rate_scaling))); - onParam(35,static_cast(*p(p_op5_amp_mod_sensitivity))); - onParam(36,static_cast(*p(p_op5_key_vel_sensitivity))); - onParam(37,static_cast(*p(p_op5_operator_output_level))); - onParam(38,static_cast(*p(p_op5_osc_mode))); - onParam(39,static_cast(*p(p_op5_osc_freq_coarse))); - onParam(40,static_cast(*p(p_op5_osc_freq_fine))); - onParam(41,static_cast(*p(p_op5_osc_detune)+7)); + onParam(21,*p(p_op5_eg_rate_1)); + onParam(22,*p(p_op5_eg_rate_2)); + onParam(23,*p(p_op5_eg_rate_3)); + onParam(24,*p(p_op5_eg_rate_4)); + onParam(25,*p(p_op5_eg_level_1)); + onParam(26,*p(p_op5_eg_level_2)); + onParam(27,*p(p_op5_eg_level_3)); + onParam(28,*p(p_op5_eg_level_4)); + onParam(29,*p(p_op5_kbd_lev_scl_brk_pt)); + onParam(30,*p(p_op5_kbd_lev_scl_lft_depth)); + onParam(31,*p(p_op5_kbd_lev_scl_rht_depth)); + onParam(32,*p(p_op5_kbd_lev_scl_lft_curve)); + onParam(33,*p(p_op5_kbd_lev_scl_rht_curve)); + onParam(34,*p(p_op5_kbd_rate_scaling)); + onParam(35,*p(p_op5_amp_mod_sensitivity)); + onParam(36,*p(p_op5_key_vel_sensitivity)); + onParam(37,*p(p_op5_operator_output_level)); + onParam(38,*p(p_op5_osc_mode)); + onParam(39,*p(p_op5_osc_freq_coarse)); + onParam(40,*p(p_op5_osc_freq_fine)); + onParam(41,*p(p_op5_osc_detune)+7); // OP4 - onParam(42,static_cast(*p(p_op4_eg_rate_1))); - onParam(43,static_cast(*p(p_op4_eg_rate_2))); - onParam(44,static_cast(*p(p_op4_eg_rate_3))); - onParam(45,static_cast(*p(p_op4_eg_rate_4))); - onParam(46,static_cast(*p(p_op4_eg_level_1))); - onParam(47,static_cast(*p(p_op4_eg_level_2))); - onParam(48,static_cast(*p(p_op4_eg_level_3))); - onParam(49,static_cast(*p(p_op4_eg_level_4))); - onParam(50,static_cast(*p(p_op4_kbd_lev_scl_brk_pt))); - onParam(51,static_cast(*p(p_op4_kbd_lev_scl_lft_depth))); - onParam(52,static_cast(*p(p_op4_kbd_lev_scl_rht_depth))); - onParam(53,static_cast(*p(p_op4_kbd_lev_scl_lft_curve))); - onParam(54,static_cast(*p(p_op4_kbd_lev_scl_rht_curve))); - onParam(55,static_cast(*p(p_op4_kbd_rate_scaling))); - onParam(56,static_cast(*p(p_op4_amp_mod_sensitivity))); - onParam(57,static_cast(*p(p_op4_key_vel_sensitivity))); - onParam(58,static_cast(*p(p_op4_operator_output_level))); - onParam(59,static_cast(*p(p_op4_osc_mode))); - onParam(60,static_cast(*p(p_op4_osc_freq_coarse))); - onParam(61,static_cast(*p(p_op4_osc_freq_fine))); - onParam(62,static_cast(*p(p_op4_osc_detune)+7)); + onParam(42,*p(p_op4_eg_rate_1)); + onParam(43,*p(p_op4_eg_rate_2)); + onParam(44,*p(p_op4_eg_rate_3)); + onParam(45,*p(p_op4_eg_rate_4)); + onParam(46,*p(p_op4_eg_level_1)); + onParam(47,*p(p_op4_eg_level_2)); + onParam(48,*p(p_op4_eg_level_3)); + onParam(49,*p(p_op4_eg_level_4)); + onParam(50,*p(p_op4_kbd_lev_scl_brk_pt)); + onParam(51,*p(p_op4_kbd_lev_scl_lft_depth)); + onParam(52,*p(p_op4_kbd_lev_scl_rht_depth)); + onParam(53,*p(p_op4_kbd_lev_scl_lft_curve)); + onParam(54,*p(p_op4_kbd_lev_scl_rht_curve)); + onParam(55,*p(p_op4_kbd_rate_scaling)); + onParam(56,*p(p_op4_amp_mod_sensitivity)); + onParam(57,*p(p_op4_key_vel_sensitivity)); + onParam(58,*p(p_op4_operator_output_level)); + onParam(59,*p(p_op4_osc_mode)); + onParam(60,*p(p_op4_osc_freq_coarse)); + onParam(61,*p(p_op4_osc_freq_fine)); + onParam(62,*p(p_op4_osc_detune)+7); // OP3 - onParam(63,static_cast(*p(p_op3_eg_rate_1))); - onParam(64,static_cast(*p(p_op3_eg_rate_2))); - onParam(65,static_cast(*p(p_op3_eg_rate_3))); - onParam(66,static_cast(*p(p_op3_eg_rate_4))); - onParam(67,static_cast(*p(p_op3_eg_level_1))); - onParam(68,static_cast(*p(p_op3_eg_level_2))); - onParam(69,static_cast(*p(p_op3_eg_level_3))); - onParam(70,static_cast(*p(p_op3_eg_level_4))); - onParam(71,static_cast(*p(p_op3_kbd_lev_scl_brk_pt))); - onParam(72,static_cast(*p(p_op3_kbd_lev_scl_lft_depth))); - onParam(73,static_cast(*p(p_op3_kbd_lev_scl_rht_depth))); - onParam(74,static_cast(*p(p_op3_kbd_lev_scl_lft_curve))); - onParam(75,static_cast(*p(p_op3_kbd_lev_scl_rht_curve))); - onParam(76,static_cast(*p(p_op3_kbd_rate_scaling))); - onParam(77,static_cast(*p(p_op3_amp_mod_sensitivity))); - onParam(78,static_cast(*p(p_op3_key_vel_sensitivity))); - onParam(79,static_cast(*p(p_op3_operator_output_level))); - onParam(80,static_cast(*p(p_op3_osc_mode))); - onParam(81,static_cast(*p(p_op3_osc_freq_coarse))); - onParam(82,static_cast(*p(p_op3_osc_freq_fine))); - onParam(83,static_cast(*p(p_op3_osc_detune)+7)); + onParam(63,*p(p_op3_eg_rate_1)); + onParam(64,*p(p_op3_eg_rate_2)); + onParam(65,*p(p_op3_eg_rate_3)); + onParam(66,*p(p_op3_eg_rate_4)); + onParam(67,*p(p_op3_eg_level_1)); + onParam(68,*p(p_op3_eg_level_2)); + onParam(69,*p(p_op3_eg_level_3)); + onParam(70,*p(p_op3_eg_level_4)); + onParam(71,*p(p_op3_kbd_lev_scl_brk_pt)); + onParam(72,*p(p_op3_kbd_lev_scl_lft_depth)); + onParam(73,*p(p_op3_kbd_lev_scl_rht_depth)); + onParam(74,*p(p_op3_kbd_lev_scl_lft_curve)); + onParam(75,*p(p_op3_kbd_lev_scl_rht_curve)); + onParam(76,*p(p_op3_kbd_rate_scaling)); + onParam(77,*p(p_op3_amp_mod_sensitivity)); + onParam(78,*p(p_op3_key_vel_sensitivity)); + onParam(79,*p(p_op3_operator_output_level)); + onParam(80,*p(p_op3_osc_mode)); + onParam(81,*p(p_op3_osc_freq_coarse)); + onParam(82,*p(p_op3_osc_freq_fine)); + onParam(83,*p(p_op3_osc_detune)+7); // OP2 - onParam(84,static_cast(*p(p_op2_eg_rate_1))); - onParam(85,static_cast(*p(p_op2_eg_rate_2))); - onParam(86,static_cast(*p(p_op2_eg_rate_3))); - onParam(87,static_cast(*p(p_op2_eg_rate_4))); - onParam(88,static_cast(*p(p_op2_eg_level_1))); - onParam(89,static_cast(*p(p_op2_eg_level_2))); - onParam(90,static_cast(*p(p_op2_eg_level_3))); - onParam(91,static_cast(*p(p_op2_eg_level_4))); - onParam(92,static_cast(*p(p_op2_kbd_lev_scl_brk_pt))); - onParam(93,static_cast(*p(p_op2_kbd_lev_scl_lft_depth))); - onParam(94,static_cast(*p(p_op2_kbd_lev_scl_rht_depth))); - onParam(95,static_cast(*p(p_op2_kbd_lev_scl_lft_curve))); - onParam(96,static_cast(*p(p_op2_kbd_lev_scl_rht_curve))); - onParam(97,static_cast(*p(p_op2_kbd_rate_scaling))); - onParam(98,static_cast(*p(p_op2_amp_mod_sensitivity))); - onParam(99,static_cast(*p(p_op2_key_vel_sensitivity))); - onParam(100,static_cast(*p(p_op2_operator_output_level))); - onParam(101,static_cast(*p(p_op2_osc_mode))); - onParam(102,static_cast(*p(p_op2_osc_freq_coarse))); - onParam(103,static_cast(*p(p_op2_osc_freq_fine))); - onParam(104,static_cast(*p(p_op2_osc_detune)+7)); + onParam(84,*p(p_op2_eg_rate_1)); + onParam(85,*p(p_op2_eg_rate_2)); + onParam(86,*p(p_op2_eg_rate_3)); + onParam(87,*p(p_op2_eg_rate_4)); + onParam(88,*p(p_op2_eg_level_1)); + onParam(89,*p(p_op2_eg_level_2)); + onParam(90,*p(p_op2_eg_level_3)); + onParam(91,*p(p_op2_eg_level_4)); + onParam(92,*p(p_op2_kbd_lev_scl_brk_pt)); + onParam(93,*p(p_op2_kbd_lev_scl_lft_depth)); + onParam(94,*p(p_op2_kbd_lev_scl_rht_depth)); + onParam(95,*p(p_op2_kbd_lev_scl_lft_curve)); + onParam(96,*p(p_op2_kbd_lev_scl_rht_curve)); + onParam(97,*p(p_op2_kbd_rate_scaling)); + onParam(98,*p(p_op2_amp_mod_sensitivity)); + onParam(99,*p(p_op2_key_vel_sensitivity)); + onParam(100,*p(p_op2_operator_output_level)); + onParam(101,*p(p_op2_osc_mode)); + onParam(102,*p(p_op2_osc_freq_coarse)); + onParam(103,*p(p_op2_osc_freq_fine)); + onParam(104,*p(p_op2_osc_detune)+7); // OP1 - onParam(105,static_cast(*p(p_op1_eg_rate_1))); - onParam(106,static_cast(*p(p_op1_eg_rate_2))); - onParam(107,static_cast(*p(p_op1_eg_rate_3))); - onParam(108,static_cast(*p(p_op1_eg_rate_4))); - onParam(109,static_cast(*p(p_op1_eg_level_1))); - onParam(110,static_cast(*p(p_op1_eg_level_2))); - onParam(111,static_cast(*p(p_op1_eg_level_3))); - onParam(112,static_cast(*p(p_op1_eg_level_4))); - onParam(113,static_cast(*p(p_op1_kbd_lev_scl_brk_pt))); - onParam(114,static_cast(*p(p_op1_kbd_lev_scl_lft_depth))); - onParam(115,static_cast(*p(p_op1_kbd_lev_scl_rht_depth))); - onParam(116,static_cast(*p(p_op1_kbd_lev_scl_lft_curve))); - onParam(117,static_cast(*p(p_op1_kbd_lev_scl_rht_curve))); - onParam(118,static_cast(*p(p_op1_kbd_rate_scaling))); - onParam(119,static_cast(*p(p_op1_amp_mod_sensitivity))); - onParam(120,static_cast(*p(p_op1_key_vel_sensitivity))); - onParam(121,static_cast(*p(p_op1_operator_output_level))); - onParam(122,static_cast(*p(p_op1_osc_mode))); - onParam(123,static_cast(*p(p_op1_osc_freq_coarse))); - onParam(124,static_cast(*p(p_op1_osc_freq_fine))); - onParam(125,static_cast(*p(p_op1_osc_detune)+7)); + onParam(105,*p(p_op1_eg_rate_1)); + onParam(106,*p(p_op1_eg_rate_2)); + onParam(107,*p(p_op1_eg_rate_3)); + onParam(108,*p(p_op1_eg_rate_4)); + onParam(109,*p(p_op1_eg_level_1)); + onParam(110,*p(p_op1_eg_level_2)); + onParam(111,*p(p_op1_eg_level_3)); + onParam(112,*p(p_op1_eg_level_4)); + onParam(113,*p(p_op1_kbd_lev_scl_brk_pt)); + onParam(114,*p(p_op1_kbd_lev_scl_lft_depth)); + onParam(115,*p(p_op1_kbd_lev_scl_rht_depth)); + onParam(116,*p(p_op1_kbd_lev_scl_lft_curve)); + onParam(117,*p(p_op1_kbd_lev_scl_rht_curve)); + onParam(118,*p(p_op1_kbd_rate_scaling)); + onParam(119,*p(p_op1_amp_mod_sensitivity)); + onParam(120,*p(p_op1_key_vel_sensitivity)); + onParam(121,*p(p_op1_operator_output_level)); + onParam(122,*p(p_op1_osc_mode)); + onParam(123,*p(p_op1_osc_freq_coarse)); + onParam(124,*p(p_op1_osc_freq_fine)); + onParam(125,*p(p_op1_osc_detune)+7); // Global for all OPs - onParam(126,static_cast(*p(p_pitch_eg_rate_1))); - onParam(127,static_cast(*p(p_pitch_eg_rate_2))); - onParam(128,static_cast(*p(p_pitch_eg_rate_3))); - onParam(129,static_cast(*p(p_pitch_eg_rate_4))); - onParam(130,static_cast(*p(p_pitch_eg_level_1))); - onParam(131,static_cast(*p(p_pitch_eg_level_2))); - onParam(132,static_cast(*p(p_pitch_eg_level_3))); - onParam(133,static_cast(*p(p_pitch_eg_level_4))); - onParam(134,static_cast(*p(p_algorithm_num)-1)); - onParam(135,static_cast(*p(p_feedback))); - onParam(136,static_cast(*p(p_oscillator_sync))); - onParam(137,static_cast(*p(p_lfo_speed))); - onParam(138,static_cast(*p(p_lfo_delay))); - onParam(139,static_cast(*p(p_lfo_pitch_mod_depth))); - onParam(140,static_cast(*p(p_lfo_amp_mod_depth))); - onParam(141,static_cast(*p(p_lfo_sync))); - onParam(142,static_cast(*p(p_lfo_waveform))); - onParam(143,static_cast(*p(p_pitch_mod_sensitivity))); - onParam(144,static_cast(*p(p_transpose))); + onParam(126,*p(p_pitch_eg_rate_1)); + onParam(127,*p(p_pitch_eg_rate_2)); + onParam(128,*p(p_pitch_eg_rate_3)); + onParam(129,*p(p_pitch_eg_rate_4)); + onParam(130,*p(p_pitch_eg_level_1)); + onParam(131,*p(p_pitch_eg_level_2)); + onParam(132,*p(p_pitch_eg_level_3)); + onParam(133,*p(p_pitch_eg_level_4)); + onParam(134,*p(p_algorithm_num)-1); + onParam(135,*p(p_feedback)); + onParam(136,*p(p_oscillator_sync)); + onParam(137,*p(p_lfo_speed)); + onParam(138,*p(p_lfo_delay)); + onParam(139,*p(p_lfo_pitch_mod_depth)); + onParam(140,*p(p_lfo_amp_mod_depth)); + onParam(141,*p(p_lfo_sync)); + onParam(142,*p(p_lfo_waveform)); + onParam(143,*p(p_pitch_mod_sensitivity)); + onParam(144,*p(p_transpose)); // 10 bytes (145-154) are the name of the patch onParam(155,0x3f); // operator on/off => All OPs on @@ -627,15 +627,23 @@ TRACE("pitch=%d\n",pitch); TRACE("Bye"); } -void Dexed::onParam(uint8_t param_num,uint8_t param_val) +void Dexed::onParam(uint8_t param_num,float param_val) { - if(param_val!=data[param_num]) - { - if(param_num==144) - panic(); - refreshVoice=true; - data[param_num]=param_val; - } + if(param_val!=data_float[param_num]) + { +#ifdef DEBUG + uint8_t tmp=data[param_num]; +#endif + + if(param_num==144) + panic(); + + refreshVoice=true; + data[param_num]=static_cast(param_val); + data_float[param_num]=param_val; + + TRACE("Parameter %d change from %d to %d",param_num, tmp, data[param_num]); + } } uint8_t Dexed::getEngineType() { diff --git a/src/dexed.h b/src/dexed.h index 40039dc..6e730e9 100644 --- a/src/dexed.h +++ b/src/dexed.h @@ -90,7 +90,7 @@ class Dexed : public lvtk::Synth protected: void ProcessMidiMessage(const uint8_t *buf, uint32_t buf_size); - void onParam(uint8_t param_num,uint8_t param_val); + void onParam(uint8_t param_num,float param_val); void keyup(uint8_t pitch); void keydown(uint8_t pitch, uint8_t velo); void panic(void); @@ -116,6 +116,7 @@ class Dexed : public lvtk::Synth private: uint8_t _param_counter; + float data_float[156]; uint8_t data[156]; double _rate; /* uint8_t data[156]={