summaryrefslogtreecommitdiff
path: root/src/sms
diff options
context:
space:
mode:
Diffstat (limited to 'src/sms')
-rw-r--r--src/sms/analysis.c39
-rw-r--r--src/sms/fileIO.c3
-rw-r--r--src/sms/sms.c27
-rw-r--r--src/sms/sms.h15
-rw-r--r--src/sms/synthesis.c4
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