00001 /* 00002 * LPFILTER.C 00003 * 00004 * Low-pass filter script. 00005 * Uses exponential averaging: 00006 * out = history = in * Factor + history * (1 - Factor) 00007 * The filter factor comes from the context. 00008 * Uses a storage buffer and reset mechanism similar to the 00009 * envelope script. 00010 */ 00011 #include "scripts.h" 00012 00013 void lpfilter_script(void) 00014 { 00015 mgk_data_type type; 00016 lpfilter_script_context *cxt = mgk_node_context(mgk_current_node(),&type); 00017 printf("lpfilter\n"); 00018 fflush(stdout); 00019 if(cxt && (type & T_BUFFER)) { 00020 int i,size,do_reset = FALSE; 00021 float *data = mgk_receive(0,&type); 00022 if((data) && 00023 (type == (T_FLOAT | T_BUFFER)) && 00024 ((size = mgk_buffer_size(data) / sizeof(float)) > 0)) { 00025 if(!cxt->Buffer) { 00026 cxt->Buffer = mgk_allocate_buffer((sizeof(float) * size),0); 00027 if(!cxt->Buffer) { 00028 return; 00029 } 00030 mgk_protect_buffer(cxt->Buffer); 00031 do_reset = TRUE; 00032 } 00033 if(gui_get_button_value(FILT_RESET)) { 00034 (*cxt->Reset)++; 00035 } 00036 if(*cxt->Reset != cxt->LastReset) { 00037 do_reset = TRUE; 00038 cxt->LastReset = *cxt->Reset; 00039 } 00040 if(do_reset) { 00041 for(i = 0; i < size; i++) { 00042 ((float *)(cxt->Buffer))[i] = data[i]; 00043 } 00044 } 00045 else { 00046 for(i = 0; i < size; i++) { 00047 data[i] = ((float *)(cxt->Buffer))[i] = (float)( 00048 data[i] * cxt->Factor + 00049 ((float *)(cxt->Buffer))[i] * (1.0 - cxt->Factor)); 00050 } 00051 } 00052 mgk_propagate(0,data,(T_BUFFER | T_FLOAT)); 00053 } 00054 } 00055 } 00056