cmOnset.h/c : Replaced cmOnsetExec() with cmOnsetProc() and cmOnsetWrite().
This commit is contained in:
parent
2d85218c4b
commit
6a46695080
116
app/cmOnset.c
116
app/cmOnset.c
@ -36,6 +36,7 @@ typedef struct
|
|||||||
unsigned frmCnt; // spectral frame count
|
unsigned frmCnt; // spectral frame count
|
||||||
cmReal_t* sfV; // sfV[frmCnt] spectral flux vector
|
cmReal_t* sfV; // sfV[frmCnt] spectral flux vector
|
||||||
cmReal_t* dfV; // dfV[frmCnt] onset function vector
|
cmReal_t* dfV; // dfV[frmCnt] onset function vector
|
||||||
|
cmReal_t maxSf;
|
||||||
|
|
||||||
cmAudioFileInfo_t afInfo;
|
cmAudioFileInfo_t afInfo;
|
||||||
unsigned fftSmpCnt;
|
unsigned fftSmpCnt;
|
||||||
@ -139,15 +140,12 @@ cmOnRC_t cmOnsetFinalize( cmOnH_t* hp )
|
|||||||
bool cmOnsetIsValid( cmOnH_t h )
|
bool cmOnsetIsValid( cmOnH_t h )
|
||||||
{ return h.h!=NULL; }
|
{ return h.h!=NULL; }
|
||||||
|
|
||||||
cmOnRC_t _cmOnsetExec( _cmOn_t* p, unsigned chCnt )
|
cmOnRC_t _cmOnsetExec( _cmOn_t* p )
|
||||||
{
|
{
|
||||||
cmOnRC_t rc = kOkOnRC;
|
cmOnRC_t rc = kOkOnRC;
|
||||||
int fi = 0;
|
int fi = 0;
|
||||||
unsigned binCnt = p->binCnt; //p->pvocPtr->binCnt;
|
unsigned binCnt = p->binCnt; //p->pvocPtr->binCnt;
|
||||||
cmReal_t mag0V[ binCnt ];
|
cmReal_t mag0V[ binCnt ];
|
||||||
cmSample_t out0V[ p->hopSmpCnt ];
|
|
||||||
cmSample_t out1V[ p->hopSmpCnt ];
|
|
||||||
cmSample_t* aoutV[chCnt];
|
|
||||||
double prog = 0.1;
|
double prog = 0.1;
|
||||||
cmReal_t b0 = 1;
|
cmReal_t b0 = 1;
|
||||||
cmReal_t b[] = {1 };
|
cmReal_t b[] = {1 };
|
||||||
@ -155,11 +153,6 @@ cmOnRC_t _cmOnsetExec( _cmOn_t* p, unsigned chCnt )
|
|||||||
cmReal_t d[] = {0};
|
cmReal_t d[] = {0};
|
||||||
cmReal_t maxVal = 0;
|
cmReal_t maxVal = 0;
|
||||||
|
|
||||||
if( chCnt > 0 )
|
|
||||||
aoutV[0] = out0V;
|
|
||||||
|
|
||||||
if( chCnt > 1 )
|
|
||||||
aoutV[1] = out1V;
|
|
||||||
|
|
||||||
cmVOR_Zero(mag0V,binCnt);
|
cmVOR_Zero(mag0V,binCnt);
|
||||||
|
|
||||||
@ -206,11 +199,11 @@ cmOnRC_t _cmOnsetExec( _cmOn_t* p, unsigned chCnt )
|
|||||||
cmReal_t stdDev = sqrt(cmVOR_Variance(p->sfV, p->frmCnt, &mean ));
|
cmReal_t stdDev = sqrt(cmVOR_Variance(p->sfV, p->frmCnt, &mean ));
|
||||||
cmVOR_SubVS(p->sfV,p->frmCnt,mean);
|
cmVOR_SubVS(p->sfV,p->frmCnt,mean);
|
||||||
cmVOR_DivVS(p->sfV,p->frmCnt,stdDev);
|
cmVOR_DivVS(p->sfV,p->frmCnt,stdDev);
|
||||||
cmReal_t maxSf = cmVOR_Max(p->sfV,p->frmCnt,1);
|
p->maxSf = cmVOR_Max(p->sfV,p->frmCnt,1);
|
||||||
prog = 0.1;
|
prog = 0.1;
|
||||||
|
|
||||||
printf("max:%f ",maxVal);
|
printf("max:%f ",maxVal);
|
||||||
printf("mean:%f max:%f sd:%f\n",mean,maxSf,stdDev);
|
printf("mean:%f max:%f sd:%f\n",mean,p->maxSf,stdDev);
|
||||||
|
|
||||||
// Pick peaks from the onset detection function using a subset
|
// Pick peaks from the onset detection function using a subset
|
||||||
// of the rules from Dixon, 2006, Onset Detection Revisited.
|
// of the rules from Dixon, 2006, Onset Detection Revisited.
|
||||||
@ -222,9 +215,6 @@ cmOnRC_t _cmOnsetExec( _cmOn_t* p, unsigned chCnt )
|
|||||||
int nn = ei - bi; // wnd frm cnt
|
int nn = ei - bi; // wnd frm cnt
|
||||||
int wi = fi < p->cfg.wndFrmCnt ? fi : p->cfg.wndFrmCnt; // cur wnd index
|
int wi = fi < p->cfg.wndFrmCnt ? fi : p->cfg.wndFrmCnt; // cur wnd index
|
||||||
|
|
||||||
// initialize the out
|
|
||||||
cmVOS_Fill(out1V,p->hopSmpCnt,p->sfV[fi]/maxSf);
|
|
||||||
cmVOS_Zero(out0V,p->hopSmpCnt);
|
|
||||||
|
|
||||||
p->dfV[fi] = 0;
|
p->dfV[fi] = 0;
|
||||||
|
|
||||||
@ -239,25 +229,10 @@ cmOnRC_t _cmOnsetExec( _cmOn_t* p, unsigned chCnt )
|
|||||||
if( p->sfV[fi] > cmVOR_Mean(p->sfV + bi, nn ) + p->cfg.threshold )
|
if( p->sfV[fi] > cmVOR_Mean(p->sfV + bi, nn ) + p->cfg.threshold )
|
||||||
{
|
{
|
||||||
p->dfV[fi] = p->sfV[fi];
|
p->dfV[fi] = p->sfV[fi];
|
||||||
out0V[ p->hopSmpCnt/2 ] = p->sfV[fi]/maxSf;
|
|
||||||
|
|
||||||
unsigned smpIdx = fi * p->hopSmpCnt + p->hopSmpCnt/2;
|
|
||||||
|
|
||||||
// write the output text file
|
|
||||||
if( cmFilePrintf(p->txH, "[ %i, %f ]\n", smpIdx, p->sfV[fi] ) != kOkFileRC )
|
|
||||||
{
|
|
||||||
rc = cmErrMsg(&p->err,kDspTextFileFailOnRC,"Text output write to '%s' failed.", cmFileName(p->txH));
|
|
||||||
goto errLabel;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// write the output audio file
|
|
||||||
if( cmAudioFileWriteFloat(p->afH, p->hopSmpCnt, chCnt, aoutV ) != kOkAfRC )
|
|
||||||
{
|
|
||||||
rc = cmErrMsg(&p->err,kDspAudioFileFailOnRC,"Audio file write to '%s' failed.",cmAudioFileName(p->afH));
|
|
||||||
goto errLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( fi >= prog*p->frmCnt )
|
if( fi >= prog*p->frmCnt )
|
||||||
{
|
{
|
||||||
@ -267,16 +242,13 @@ cmOnRC_t _cmOnsetExec( _cmOn_t* p, unsigned chCnt )
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
errLabel:
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmOnRC_t cmOnsetExec( cmOnH_t h, const cmOnsetCfg_t* cfg, const cmChar_t* inAudioFn, const cmChar_t* outAudioFn, const cmChar_t* outTextFn )
|
cmOnRC_t cmOnsetProc( cmOnH_t h, const cmOnsetCfg_t* cfg, const cmChar_t* inAudioFn )
|
||||||
{
|
{
|
||||||
cmOnRC_t rc = kOkOnRC;
|
cmOnRC_t rc = kOkOnRC;
|
||||||
_cmOn_t* p = _cmOnsetHandleToPtr(h);
|
_cmOn_t* p = _cmOnsetHandleToPtr(h);
|
||||||
unsigned audioOutChCnt = 2;
|
|
||||||
p->cfg = *cfg;
|
p->cfg = *cfg;
|
||||||
|
|
||||||
// get the audio file header information
|
// get the audio file header information
|
||||||
@ -307,9 +279,29 @@ cmOnRC_t cmOnsetExec( cmOnH_t h, const cmOnsetCfg_t* cfg, const cmChar_t* inAudi
|
|||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rc = _cmOnsetExec(p);
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmOnRC_t cmOnsetWrite( cmOnH_t h, const cmChar_t* outAudioFn, const cmChar_t* outTextFn)
|
||||||
|
{
|
||||||
|
enum { kChCnt = 2 };
|
||||||
|
cmOnRC_t rc = kOkOnRC;
|
||||||
|
_cmOn_t* p = _cmOnsetHandleToPtr(h);
|
||||||
|
|
||||||
|
cmSample_t out0V[ p->hopSmpCnt ];
|
||||||
|
cmSample_t out1V[ p->hopSmpCnt ];
|
||||||
|
cmSample_t* aoutV[kChCnt];
|
||||||
|
|
||||||
|
aoutV[0] = out0V;
|
||||||
|
aoutV[1] = out1V;
|
||||||
|
|
||||||
// initalize the audio output file
|
// initalize the audio output file
|
||||||
if( outAudioFn != NULL )
|
if( outAudioFn != NULL )
|
||||||
if( cmAudioFileIsValid( p->afH = cmAudioFileNewCreate( outAudioFn, p->afInfo.srate, p->afInfo.bits, audioOutChCnt, NULL, p->err.rpt)) == false )
|
if( cmAudioFileIsValid( p->afH = cmAudioFileNewCreate( outAudioFn, p->afInfo.srate, p->afInfo.bits, kChCnt, NULL, p->err.rpt)) == false )
|
||||||
{
|
{
|
||||||
rc = cmErrMsg(&p->err,kDspAudioFileFailOnRC, "The audio output file '%s' could not be opened.", outAudioFn);
|
rc = cmErrMsg(&p->err,kDspAudioFileFailOnRC, "The audio output file '%s' could not be opened.", outAudioFn);
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
@ -327,9 +319,47 @@ cmOnRC_t cmOnsetExec( cmOnH_t h, const cmOnsetCfg_t* cfg, const cmChar_t* inAudi
|
|||||||
cmFilePrint(p->txH,"{\n onsetArray : \n[\n");
|
cmFilePrint(p->txH,"{\n onsetArray : \n[\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = _cmOnsetExec(p,audioOutChCnt);
|
// rewind the audio file
|
||||||
|
cmAudioFileRdSeek(p->afRdPtr,0);
|
||||||
|
|
||||||
errLabel:
|
unsigned fi;
|
||||||
|
for(fi=0; fi<p->frmCnt; ++fi)
|
||||||
|
{
|
||||||
|
// audio channel 1 is filled with the spectral flux
|
||||||
|
// initialize the out
|
||||||
|
cmVOS_Fill(out1V,p->hopSmpCnt,p->sfV[fi]/p->maxSf);
|
||||||
|
cmVOS_Zero(out0V,p->hopSmpCnt);
|
||||||
|
|
||||||
|
if( p->dfV[fi] > 0 )
|
||||||
|
{
|
||||||
|
// audio channel 0 is set with the detection indicators
|
||||||
|
unsigned smpIdx = fi * p->hopSmpCnt + p->hopSmpCnt/2;
|
||||||
|
out0V[ p->hopSmpCnt/2 ] = p->sfV[fi]/p->maxSf;
|
||||||
|
|
||||||
|
|
||||||
|
// write the output text file
|
||||||
|
if( cmFileIsValid(p->txH) )
|
||||||
|
if( cmFilePrintf(p->txH, "[ %i, %f ]\n", smpIdx, p->sfV[fi] ) != kOkFileRC )
|
||||||
|
{
|
||||||
|
rc = cmErrMsg(&p->err,kDspTextFileFailOnRC,"Text output write to '%s' failed.", cmFileName(p->txH));
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// write the output audio file
|
||||||
|
if( cmAudioFileIsValid(p->afH) && cmAudioFileRdRead(p->afRdPtr) == cmOkRC )
|
||||||
|
{
|
||||||
|
aoutV[0] = p->afRdPtr->outV;
|
||||||
|
|
||||||
|
if( cmAudioFileWriteFloat(p->afH, p->hopSmpCnt, kChCnt, aoutV ) != kOkAfRC )
|
||||||
|
{
|
||||||
|
rc = cmErrMsg(&p->err,kDspAudioFileFailOnRC,"Audio file write to '%s' failed.",cmAudioFileName(p->afH));
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// close the output audio file
|
// close the output audio file
|
||||||
if( cmAudioFileDelete(&p->afH) != kOkAfRC )
|
if( cmAudioFileDelete(&p->afH) != kOkAfRC )
|
||||||
rc = cmErrMsg(&p->err,kDspAudioFileFailOnRC,"The audio file close failed.");
|
rc = cmErrMsg(&p->err,kDspAudioFileFailOnRC,"The audio file close failed.");
|
||||||
@ -342,9 +372,11 @@ cmOnRC_t cmOnsetExec( cmOnH_t h, const cmOnsetCfg_t* cfg, const cmChar_t* inAudi
|
|||||||
if( cmFileClose(&p->txH) != kOkFileRC )
|
if( cmFileClose(&p->txH) != kOkFileRC )
|
||||||
rc = cmErrMsg(&p->err,kDspTextFileFailOnRC,"The text file close failed.");
|
rc = cmErrMsg(&p->err,kDspTextFileFailOnRC,"The text file close failed.");
|
||||||
}
|
}
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
cmOnRC_t cmOnsetTest( cmCtx_t* c )
|
cmOnRC_t cmOnsetTest( cmCtx_t* c )
|
||||||
{
|
{
|
||||||
@ -367,7 +399,9 @@ cmOnRC_t cmOnsetTest( cmCtx_t* c )
|
|||||||
if((rc = cmOnsetInitialize(c,&h)) != kOkOnRC )
|
if((rc = cmOnsetInitialize(c,&h)) != kOkOnRC )
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
|
|
||||||
rc = cmOnsetExec(h,&cfg,inAudioFn,outAudioFn,outTextFn);
|
if((rc = cmOnsetProc(h,&cfg,inAudioFn)) == kOkOnRC )
|
||||||
|
cmOnsetWrite(h,outAudioFn,outTextFn);
|
||||||
|
|
||||||
|
|
||||||
errLabel:
|
errLabel:
|
||||||
cmOnsetFinalize(&h);
|
cmOnsetFinalize(&h);
|
||||||
|
@ -38,12 +38,15 @@ extern "C" {
|
|||||||
|
|
||||||
bool cmOnsetIsValid( cmOnH_t h );
|
bool cmOnsetIsValid( cmOnH_t h );
|
||||||
|
|
||||||
cmOnRC_t cmOnsetExec(
|
cmOnRC_t cmOnsetProc(
|
||||||
cmOnH_t h,
|
cmOnH_t h,
|
||||||
const cmOnsetCfg_t* cfg,
|
const cmOnsetCfg_t* cfg,
|
||||||
const cmChar_t* inAudioFn,
|
const cmChar_t* inAudioFn );
|
||||||
|
|
||||||
|
cmOnRC_t cmOnsetWrite(
|
||||||
|
cmOnH_t h,
|
||||||
const cmChar_t* outAudioFn,
|
const cmChar_t* outAudioFn,
|
||||||
const cmChar_t* outTextFn );
|
const cmChar_t* outTextFn);
|
||||||
|
|
||||||
cmOnRC_t cmOnsetTest( cmCtx_t* c );
|
cmOnRC_t cmOnsetTest( cmCtx_t* c );
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user