/* * Copyright (c) 1983-2013 Trevor Wishart and Composers Desktop Project Ltd * http://www.trevorwishart.co.uk * http://www.composersdesktop.com * This file is part of the CDP System. The CDP System is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The CDP System 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the CDP System; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* floatsam version */ #include #include #include #include #include #include #include #include #include #include #include #include static int advance_func(int *current_pos_in_buf,dataptr dz); /**************************** DISTORT_OMT ****************************** * * keep 'keep' cycles, omit 'omit' cycles. */ int distort_omt(int *current_pos_in_buf,int inital_phase,dataptr dz) { int exit_status; register int n; int i = *current_pos_in_buf; float *b = dz->sampbuf[0]; int keep = dz->iparam[DISTORTO_KEEP] - dz->iparam[DISTORTO_OMIT]; switch(inital_phase) { case(1): for(n=0;n=0.0) { if((exit_status = advance_func(&i,dz))!=CONTINUE) return(exit_status); } while(b[i]<=0.0) { if((exit_status = advance_func(&i,dz))!=CONTINUE) return(exit_status); } } for(n=0;niparam[DISTORTO_OMIT];n++) { while(b[i]>=0.0) { b[i] = 0; if((exit_status = advance_func(&i,dz))!=CONTINUE) return(exit_status); } while(b[i]<=0.0) { b[i] = 0.0; if((exit_status = advance_func(&i,dz))!=CONTINUE) return(exit_status); } } break; case(-1): for(n=0;n=0.0) { if((exit_status = advance_func(&i,dz))!=CONTINUE) return(exit_status); } } for(n=0;niparam[DISTORTO_OMIT];n++) { while(b[i]<=00) { b[i] = 0.0; if((exit_status = advance_func(&i,dz))!=CONTINUE) return(exit_status); } while(b[i]>=0.0) { b[i] = 0.0; if((exit_status = advance_func(&i,dz))!=CONTINUE) return(exit_status); } } break; } *current_pos_in_buf = i; return(CONTINUE); } /******************************** ADVANCE_FUNC ***************************/ int advance_func(int *current_pos_in_buf,dataptr dz) { int exit_status; if(++(*current_pos_in_buf) >= dz->ssampsread) { if(dz->ssampsread > 0) { if((exit_status = write_samps(dz->sampbuf[0],dz->ssampsread,dz))<0) return(exit_status); } if(dz->samps_left <= 0) return(FINISHED); if((exit_status = read_samps(dz->sampbuf[0],dz))<0) return(exit_status); *current_pos_in_buf = 0; } return(CONTINUE); }