diff options
Diffstat (limited to 'src/sms')
-rw-r--r-- | src/sms/analysis.c | 39 | ||||
-rw-r--r-- | src/sms/fileIO.c | 3 | ||||
-rw-r--r-- | src/sms/sms.c | 27 | ||||
-rw-r--r-- | src/sms/sms.h | 15 | ||||
-rw-r--r-- | src/sms/synthesis.c | 4 |
5 files changed, 60 insertions, 28 deletions
diff --git a/src/sms/analysis.c b/src/sms/analysis.c index 89d4b4a..c7aae0b 100644 --- a/src/sms/analysis.c +++ b/src/sms/analysis.c @@ -174,19 +174,36 @@ int sms_findPeaks(int sizeWaveform, sfloat *pWaveform, SMS_AnalParams *pAnalPara sms_analyzeFrame(iCurrentFrame, pAnalParams, fRefFundamental); /* set the size of the next analysis window */ - if(pAnalParams->ppFrames[iCurrentFrame]->fFundamental > 0 && - pAnalParams->iSoundType != SMS_SOUND_TYPE_NOTE) - pAnalParams->windowSize = sms_sizeNextWindow(iCurrentFrame, pAnalParams); + /* if(pAnalParams->ppFrames[iCurrentFrame]->fFundamental > 0 && */ + /* pAnalParams->iSoundType != SMS_SOUND_TYPE_NOTE) */ + /* { */ + /* pAnalParams->windowSize = sms_sizeNextWindow(iCurrentFrame, pAnalParams); */ + /* } */ - /* figure out how much needs to be read next time - * how many processed - sample no. of end of next frame - * = no. samples that we haven't processed yet from whenever, if sizeNextRead was 0 - */ - iExtraSamples = (pAnalParams->soundBuffer.iMarker + pAnalParams->soundBuffer.sizeBuffer) - - (pAnalParams->ppFrames[iCurrentFrame]->iFrameSample + pAnalParams->sizeHop); + if(pAnalParams->realtime == 0) + { + /* set the size of the next analysis window */ + if(pAnalParams->ppFrames[iCurrentFrame]->fFundamental > 0 && + pAnalParams->iSoundType != SMS_SOUND_TYPE_NOTE) + { + pAnalParams->windowSize = sms_sizeNextWindow(iCurrentFrame, pAnalParams); + } - pAnalParams->sizeNextRead = MAX(0, (pAnalParams->windowSize+1)/2 - iExtraSamples); - ReAnalyzeFrame(iCurrentFrame, pAnalParams); + /* figure out how much needs to be read next time + * how many processed - sample no. of end of next frame + * = no. samples that we haven't processed yet from whenever, if sizeNextRead was 0 + */ + iExtraSamples = (pAnalParams->soundBuffer.iMarker + pAnalParams->soundBuffer.sizeBuffer) - + (pAnalParams->ppFrames[iCurrentFrame]->iFrameSample + pAnalParams->sizeHop); + + pAnalParams->sizeNextRead = MAX(0, (pAnalParams->windowSize+1)/2 - iExtraSamples); + ReAnalyzeFrame(iCurrentFrame, pAnalParams); + } + else + { + pAnalParams->windowSize = sizeWaveform; + pAnalParams->sizeNextRead = sizeWaveform; + } /* save peaks */ pSpectralPeaks->nPeaksFound = pAnalParams->ppFrames[iCurrentFrame]->nPeaks; diff --git a/src/sms/fileIO.c b/src/sms/fileIO.c index e870c5a..240a266 100644 --- a/src/sms/fileIO.c +++ b/src/sms/fileIO.c @@ -63,9 +63,8 @@ void sms_initHeader(SMS_Header *pSmsHeader) * * \param pSmsHeader header for SMS file (to be stored) * \param pAnalParams structure of analysis parameters - * \param pProgramString pointer to a string containing the name of the program that made the analysis data */ -void sms_fillHeader(SMS_Header *pSmsHeader, SMS_AnalParams *pAnalParams, char *pProgramString) +void sms_fillHeader(SMS_Header *pSmsHeader, SMS_AnalParams *pAnalParams) { sms_initHeader(pSmsHeader); pSmsHeader->nFrames = pAnalParams->nFrames; diff --git a/src/sms/sms.c b/src/sms/sms.c index 8501d4d..59e9fa9 100644 --- a/src/sms/sms.c +++ b/src/sms/sms.c @@ -112,6 +112,7 @@ void sms_initAnalParams(SMS_AnalParams *pAnalParams) pAnalParams->fPeakContToGuide = .4; pAnalParams->fFundContToGuide = .5; pAnalParams->fFreqDeviation = .45; + pAnalParams->realtime = 0; pAnalParams->iSamplingRate = 44100; /* should be set to the real samplingrate with sms_initAnalysis */ pAnalParams->iDefaultSizeWindow = 1001; pAnalParams->windowSize = 0; @@ -839,7 +840,6 @@ int sms_initFrame(int iCurrentFrame, SMS_AnalParams *pAnalParams, int sizeWindow pAnalParams->ppFrames[iCurrentFrame]->iFrameNum = pAnalParams->ppFrames[iCurrentFrame - 1]->iFrameNum + 1; - pAnalParams->ppFrames[iCurrentFrame]->iFrameSize = sizeWindow; /* if first frame set center of data around 0 */ if(pAnalParams->ppFrames[iCurrentFrame]->iFrameNum == 1) @@ -849,19 +849,30 @@ int sms_initFrame(int iCurrentFrame, SMS_AnalParams *pAnalParams, int sizeWindow pAnalParams->ppFrames[iCurrentFrame]->iFrameSample = pAnalParams->ppFrames[iCurrentFrame-1]->iFrameSample + pAnalParams->sizeHop; - /* check for end of sound */ - if((pAnalParams->ppFrames[iCurrentFrame]->iFrameSample + (sizeWindow+1)/2) >= pAnalParams->iSizeSound - && pAnalParams->iSizeSound > 0) + if(pAnalParams->realtime == 0) { - pAnalParams->ppFrames[iCurrentFrame]->iFrameNum = -1; - pAnalParams->ppFrames[iCurrentFrame]->iFrameSize = 0; - pAnalParams->ppFrames[iCurrentFrame]->iStatus = SMS_FRAME_END; + pAnalParams->ppFrames[iCurrentFrame]->iFrameSize = sizeWindow; + + /* check for end of sound */ + if((pAnalParams->ppFrames[iCurrentFrame]->iFrameSample + (sizeWindow+1)/2) >= pAnalParams->iSizeSound + && pAnalParams->iSizeSound > 0) + { + pAnalParams->ppFrames[iCurrentFrame]->iFrameNum = -1; + pAnalParams->ppFrames[iCurrentFrame]->iFrameSize = 0; + pAnalParams->ppFrames[iCurrentFrame]->iStatus = SMS_FRAME_END; + } + else + { + /* good status, ready to start computing */ + pAnalParams->ppFrames[iCurrentFrame]->iStatus = SMS_FRAME_READY; + } } else { - /* good status, ready to start computing */ + pAnalParams->ppFrames[iCurrentFrame]->iFrameSize = pAnalParams->iSamplingRate / pAnalParams->iFrameRate; pAnalParams->ppFrames[iCurrentFrame]->iStatus = SMS_FRAME_READY; } + return SMS_OK; } diff --git a/src/sms/sms.h b/src/sms/sms.h index 0613ab3..d1ac049 100644 --- a/src/sms/sms.h +++ b/src/sms/sms.h @@ -58,7 +58,7 @@ * the documentation will be updated to reflect which members of the header * are useful in manipulations, and what functions to use for these manipulatinos */ -typedef struct +typedef struct SMSHeader { int iSmsMagic; /*!< identification constant */ int iHeadBSize; /*!< size in bytes of header */ @@ -88,7 +88,7 @@ typedef struct * pFSinPha is optional in the final output, but it is always used to construct the * residual signal. */ -typedef struct +typedef struct SMSData { sfloat *pSmsData; /*!< pointer to all SMS data */ int sizeData; /*!< size of all the data */ @@ -132,7 +132,7 @@ typedef struct } SMS_Peak; /* a collection of spectral peaks */ -typedef struct +typedef struct SMSSpectralPeaks { SMS_Peak *pSpectralPeaks; int nPeaks; @@ -193,7 +193,7 @@ typedef struct * This structure contains all the necessary settings and memory for residual synthesis. * */ -typedef struct +typedef struct SMSResidualParams { int samplingRate; int hopSize; @@ -228,7 +228,7 @@ typedef struct * and peak detection/continuation process can be re-computed with more accuracy. * */ -typedef struct +typedef struct SMSAnalysisParams { int iDebugMode; /*!< debug codes enumerated by SMS_DBG \see SMS_DBG */ int iFormat; /*!< analysis format code defined by SMS_Format \see SMS_Format */ @@ -242,6 +242,7 @@ typedef struct sfloat fPeakContToGuide; /*!< contribution of previous peak to current guide (between 0 and 1) */ sfloat fFundContToGuide; /*!< contribution of current fundamental to current guide (between 0 and 1) */ sfloat fFreqDeviation; /*!< maximum deviation from peak to peak */ + int realtime; /*!< perform realtime analysis */ int iSamplingRate; /*! sampling rate of sound to be analyzed */ int iDefaultSizeWindow; /*!< default size of analysis window in samples */ int windowSize; /*!< the current window size */ @@ -320,7 +321,7 @@ typedef struct * synthesized frame. * */ -typedef struct +typedef struct SMSSynthParams { int iStochasticType; /*!< type of stochastic model defined by SMS_StocSynthType \see SMS_StocSynthType */ @@ -671,7 +672,7 @@ void sms_sineSynthFrame(SMS_Data *pSmsFrame, sfloat *pBuffer, void sms_initHeader(SMS_Header *pSmsHeader); int sms_getHeader(char *pChFileName, SMS_Header **ppSmsHeader, FILE **ppInputFile); -void sms_fillHeader(SMS_Header *pSmsHeader, SMS_AnalParams *pAnalParams, char *pProgramString); +void sms_fillHeader(SMS_Header *pSmsHeader, SMS_AnalParams *pAnalParams); int sms_writeHeader(char *pFileName, SMS_Header *pSmsHeader, FILE **ppOutSmsFile); int sms_writeFile(FILE *pSmsFile, SMS_Header *pSmsHeader); int sms_initFrame(int iCurrentFrame, SMS_AnalParams *pAnalParams, int sizeWindow); diff --git a/src/sms/synthesis.c b/src/sms/synthesis.c index bc739d0..35e91a4 100644 --- a/src/sms/synthesis.c +++ b/src/sms/synthesis.c @@ -195,7 +195,9 @@ void sms_approxResidual(int sizeResidual, sfloat* residual, /* generate random phases */ for(i = 0; i < residualParams->sizeStocMagSpectrum; i++) + { residualParams->stocPhaseSpectrum[i] = TWO_PI * sms_random(); + } /* IFFT with 50% overlap */ sms_invQuickSpectrumW(residualParams->stocMagSpectrum, @@ -208,7 +210,9 @@ void sms_approxResidual(int sizeResidual, sfloat* residual, /* output */ for(i = 0; i < sizeApprox; i++) + { approx[i] = residualParams->approx[i] * residualParams->windowScale; + } } /*! \brief synthesizes one frame of SMS data |