void COpOscCircle::Proc() { OP_GENERIC_CODE_PROC_PROLOG(); if( m_poIn[OP_OCR_IN_CLEAR].IsValid() ) if( m_poIn[OP_OCR_IN_CLEAR].Proc() > 0.0 ) Reset(); const double dFreq = m_poIn[OP_OCR_IN_FREQ].Proc(); if( dFreq != m_dFreqLast ) InitFreq( dFreq ); // Nur einmal hier prüfen, da Oversamplingrate und die Filtergrösse 2er-Potenzen sind! // Das geht immer schön auf, und innerhalb der Oversample-Schleife kommt es zu keinem Underrun. if( !m_uiBufferInPos ) m_uiBufferInPos = m_uiFilterSize; double *pdB = m_atBufferIn + m_uiBufferInPos; double dFT = m_dFT; unsigned int i = m_uiOverSample; if( m_poIn[OP_OCR_IN_PHASE].IsValid() ) { dFT += m_poIn[OP_OCR_IN_PHASE].Proc(); do { --i; --pdB; const double dT = fmod( dFT, 2.0 ) - 1.0; *pdB = ( ( fmod( dFT, 4.0 ) <= 2.0 ) ? +1.0 : -1.0 ) * sqrt( 1.0 - dT * dT ); dFT += m_dFTStpAA; } while( i ); } else { do { --i; --pdB; const double dT = fmod( dFT, 2.0 ) - 1.0; *pdB = ( ( fmod( dFT, 4.0 ) <= 2.0 ) ? +1.0 : -1.0 ) * sqrt( 1.0 - dT * dT ); dFT += m_dFTStpAA; } while( i ); } m_uiBufferInPos -= m_uiOverSample; m_dFT += m_dFTStp; m_pdOut[OP_OCR_OUT_DST] = COpTkFltAA44100<double>::Filter(); //*pdB }
Timer::Timer() { lastTick = 0; elapsedTime = 0; lastTime = 0; rate = 0; factor = 0; static bool is_init = false; if (!is_init) { InitFreq(); is_init = true; } }
COpOscCircle::COpOscCircle() : COp( 3, 1 ) , COpTkFltAA44100<double>() , m_uiFilterIndex( 0 ) { Init(); OP_SET_NAME_INSTANCE( "oCir" ); m_poIn[OP_OCR_IN_PHASE].SetFlags( OP_LINK_FLAG_OPTIONAL ); m_poIn[OP_OCR_IN_CLEAR].SetFlags( OP_LINK_FLAG_OPTIONAL ); OP_SET_NAME_AND_INFO_INPUT( OP_OCR_IN_FREQ, "f", OP_OCR_IN_FREQ_INFO ); OP_SET_NAME_AND_INFO_INPUT( OP_OCR_IN_PHASE, "p", OP_OCR_IN_PHASE_INFO ); OP_SET_NAME_AND_INFO_INPUT( OP_OCR_IN_CLEAR, "cl", OP_OCR_IN_CLEAR_INFO ); OP_SET_NAME_AND_INFO_OUTPUT( OP_OCR_OUT_DST, "o", OP_OCR_OUT_DST_INFO ); OP_SET_COUNT_ROUTINE( 1 ); OP_SET_NAME_AND_INFO_ROUTINE( 0, "o" OP_STR_ROUTINE, OP_OCR_ROUTINE_AA_INFO ); Reset(); Update(); Validate(); InitFreq( 0.0 ); }