Update of /cvsroot/pure-data/externals/tb/chaos/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14428/src
Modified Files: chaos_dsp.hpp Log Message: cleaner behaviour for high frequency resampling
Index: chaos_dsp.hpp =================================================================== RCS file: /cvsroot/pure-data/externals/tb/chaos/src/chaos_dsp.hpp,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** chaos_dsp.hpp 9 Oct 2005 09:55:24 -0000 1.11 --- chaos_dsp.hpp 9 Oct 2005 10:21:36 -0000 1.12 *************** *** 37,42 **** --- 37,46 ---- /* linear interpolation */ void m_signal_l(int n, t_sample *const *insigs,t_sample *const *outsigs); + /* linear interpolation for high frequencies */ + void m_signal_l_hf(int n, t_sample *const *insigs,t_sample *const *outsigs); /* cubic interpolation */ void m_signal_c(int n, t_sample *const *insigs,t_sample *const *outsigs); + /* cubic interpolation for high frequencies */ + void m_signal_c_hf(int n, t_sample *const *insigs,t_sample *const *outsigs); virtual void CbSignal() *************** *** 67,72 **** float m_freq; /* frequency of oscillations */ float m_invfreq; /* inverse frequency */ ! int m_phase; /* phase counter */ ! float m_fphase; /* phase for high frequency linear interpolation */ float m_sr; /* sample rate */ --- 71,75 ---- float m_freq; /* frequency of oscillations */ float m_invfreq; /* inverse frequency */ ! float m_phase; /* phase */ float m_sr; /* sample rate */ *************** *** 119,123 **** } } ! }
--- 122,126 ---- } } ! set_freq(m_freq); }
*************** *** 134,151 **** if( f <= m_sr * 0.1 ) { ! if (m_freq >= m_sr * 0.5) ! set_imethod(m_imethod); ! m_freq = f; ! m_invfreq = 1.f / f; } ! else if (f > m_sr * 0.1) { ! m_freq = f; ! m_invfreq = 1.f / f; ! ! m_routine = &thisType::m_signal_n_hf; } ! else ! post("frequency out of range"); } --- 137,175 ---- if( f <= m_sr * 0.1 ) { ! switch(m_imethod) ! { ! case 0: ! m_routine = &thisType::m_signal_n; ! break; ! case 1: ! m_routine = &thisType::m_signal_l; ! break; ! case 2: ! m_routine = &thisType::m_signal_c; ! break; ! default: ! assert(false); ! } } ! else { ! switch(m_imethod) ! { ! case 0: ! m_routine = &thisType::m_signal_n_hf; ! break; ! case 1: ! m_routine = &thisType::m_signal_l_hf; ! break; ! case 2: ! m_routine = &thisType::m_signal_c_hf; ! break; ! default: ! assert(false); ! } } ! ! m_freq = f; ! m_invfreq = 1.f / f; } *************** *** 227,231 **** template <class system> void chaos_dsp<system>::m_signal_(int n, t_sample *const *insigs, ! t_sample *const *outsigs) { int outlets = m_system->get_num_eq(); --- 251,255 ---- template <class system> void chaos_dsp<system>::m_signal_(int n, t_sample *const *insigs, ! t_sample *const *outsigs) { int outlets = m_system->get_num_eq(); *************** *** 248,252 **** int outlets = m_system->get_num_eq(); ! float phase = m_fphase; int offset = 0; --- 272,276 ---- int outlets = m_system->get_num_eq(); ! float phase = m_phase; int offset = 0; *************** *** 268,272 **** offset += next; } ! m_fphase = phase; }
--- 292,296 ---- offset += next; } ! m_phase = phase; }
*************** *** 274,282 **** template <class system> void chaos_dsp<system>::m_signal_n(int n, t_sample *const *insigs, ! t_sample *const *outsigs) { int outlets = m_system->get_num_eq(); ! int phase = m_phase; int offset = 0; --- 298,306 ---- template <class system> void chaos_dsp<system>::m_signal_n(int n, t_sample *const *insigs, ! t_sample *const *outsigs) { int outlets = m_system->get_num_eq(); ! int phase = int(m_phase); int offset = 0; *************** *** 305,313 **** template <class system> void chaos_dsp<system>::m_signal_l(int n, t_sample *const *insigs, ! t_sample *const *outsigs) { int outlets = m_system->get_num_eq(); ! int phase = m_phase;
int i = 0; --- 329,337 ---- template <class system> void chaos_dsp<system>::m_signal_l(int n, t_sample *const *insigs, ! t_sample *const *outsigs) { int outlets = m_system->get_num_eq(); ! int phase = int(m_phase);
int i = 0; *************** *** 342,352 ****
template <class system> void chaos_dsp<system>::m_signal_c(int n, t_sample *const *insigs, ! t_sample *const *outsigs) { int outlets = m_system->get_num_eq(); ! int phase = m_phase;
int i = 0; --- 366,416 ----
+ + template <class system> + void chaos_dsp<system>::m_signal_l_hf(int n, t_sample *const *insigs, + t_sample *const *outsigs) + { + int outlets = m_system->get_num_eq(); + + float phase = int(m_phase); + + int i = 0; + + while (n) + { + if (phase == 0) + { + m_system->m_perform(); + phase = int (m_sr * m_invfreq); + + for (int j = 0; j != outlets; ++j) + m_slopes[j] = (m_system->get_data(j) - m_values[j]) / phase; + } + + int next = (phase < n) ? int(ceilf (phase)) : n; + n -= next; + phase -=next; + + while (next--) + { + for (int j = 0; j != outlets; ++j) + { + outsigs[j][i] = m_values[j]; + m_values[j]+=m_slopes[j]; + } + ++i; + } + } + m_phase = phase; + } + + template <class system> void chaos_dsp<system>::m_signal_c(int n, t_sample *const *insigs, ! t_sample *const *outsigs) { int outlets = m_system->get_num_eq(); ! int phase = int(m_phase);
int i = 0; *************** *** 370,374 **** float fseglen = (float)phase; m_curves[j] = 2.f * (m_nextmidpts[j] - m_values[j] - ! fseglen * m_slopes[j]) / (fseglen * fseglen + fseglen); } --- 434,438 ---- float fseglen = (float)phase; m_curves[j] = 2.f * (m_nextmidpts[j] - m_values[j] - ! fseglen * m_slopes[j]) / (fseglen * fseglen + fseglen); } *************** *** 392,393 **** --- 456,509 ---- m_phase = phase; } + + + template <class system> + void chaos_dsp<system>::m_signal_c_hf(int n, t_sample *const *insigs, + t_sample *const *outsigs) + { + int outlets = m_system->get_num_eq(); + + float phase = m_phase; + + int i = 0; + + while (n) + { + if (phase == 0) + { + m_system->m_perform(); + phase = int (m_sr * m_invfreq); + phase = (phase > 2) ? phase : 2; + + for (int j = 0; j != outlets; ++j) + { + t_sample value = m_nextvalues[j]; + m_nextvalues[j]= m_system->get_data(j); + + m_values[j] = m_nextmidpts[j]; + m_nextmidpts[j] = (m_nextvalues[j] + value) * 0.5f; + + float fseglen = (float)phase; + m_curves[j] = 2.f * (m_nextmidpts[j] - m_values[j] - + fseglen * m_slopes[j]) + / (fseglen * fseglen + fseglen); + } + } + + int next = (phase < n) ? int(ceilf (phase)) : n; + n -= next; + phase -=next; + + while (next--) + { + for (int j = 0; j != outlets; ++j) + { + outsigs[j][i] = m_values[j]; + m_slopes[j]+=m_curves[j]; + m_values[j]+=m_slopes[j]; + } + ++i; + } + } + m_phase = phase; + }