cmScore.c/h Added score display to gv. Many changes.

This commit is contained in:
kevin 2012-11-02 19:06:34 -07:00
parent f1e70ee42a
commit b096ef30d7
2 changed files with 118 additions and 15 deletions

View File

@ -60,6 +60,9 @@ typedef struct
cmScoreEvt_t* array; cmScoreEvt_t* array;
unsigned cnt; unsigned cnt;
cmCsvH_t cH; cmCsvH_t cH;
cmScCb_t cbFunc;
void* cbArg;
cmChar_t* fn;
} cmSc_t; } cmSc_t;
cmScEvtRef_t _cmScEvtRefArray[] = cmScEvtRef_t _cmScEvtRefArray[] =
@ -111,7 +114,7 @@ unsigned _cmScEvtTypeLabelToId( const cmChar_t* label )
return kInvalidEvtScId; return kInvalidEvtScId;
} }
const cmChar_t* _cmScEvtTypeIdToLabel( unsigned id ) const cmChar_t* cmScEvtTypeIdToLabel( unsigned id )
{ {
cmScEvtRef_t* r = _cmScEvtRefArray; cmScEvtRef_t* r = _cmScEvtRefArray;
for(; r->id != kInvalidEvtScId; ++r ) for(; r->id != kInvalidEvtScId; ++r )
@ -129,7 +132,7 @@ unsigned _cmScDynLabelToId( const cmChar_t* label )
return kInvalidDynScId; return kInvalidDynScId;
} }
const cmChar_t* _cmScDynIdToLabel( unsigned id ) const cmChar_t* cmScDynIdToLabel( unsigned id )
{ {
cmScEvtRef_t* r = _cmScDynRefArray; cmScEvtRef_t* r = _cmScDynRefArray;
for(; r->id != kInvalidDynScId; ++r ) for(; r->id != kInvalidDynScId; ++r )
@ -173,15 +176,20 @@ cmScRC_t _cmScFinalize( cmSc_t* p )
if( cmCsvFinalize(&p->cH) != kOkCsvRC ) if( cmCsvFinalize(&p->cH) != kOkCsvRC )
return rc; return rc;
cmMemFree(p->fn);
cmMemFree(p->array); cmMemFree(p->array);
cmMemFree(p); cmMemFree(p);
return rc; return rc;
} }
cmScRC_t _cmScParseBar( cmSc_t* p, unsigned rowIdx, int* barNumb ) cmScRC_t _cmScParseBar( cmSc_t* p, unsigned rowIdx, cmScoreEvt_t* s, int* barNumb )
{ {
if((*barNumb = cmCsvCellInt(p->cH,rowIdx,kBarColScIdx)) == INT_MAX ) if((*barNumb = cmCsvCellInt(p->cH,rowIdx,kBarColScIdx)) == INT_MAX )
return cmErrMsg(&p->err,kSyntaxErrScRC,"Unable to parse the bar number."); return cmErrMsg(&p->err,kSyntaxErrScRC,"Unable to parse the bar number.");
s->type = kBarEvtScId;
s->dsecs = 0;
s->barNumb = *barNumb;
return kOkScRC; return kOkScRC;
} }
@ -223,6 +231,7 @@ cmScRC_t _cmScParseNoteOn( cmSc_t* p, unsigned rowIdx, cmScoreEvt_t* s, int barN
} }
s->type = kNonEvtScId; s->type = kNonEvtScId;
s->dsecs = dsecs;
s->pitch = midiPitch; s->pitch = midiPitch;
s->flags = flags; s->flags = flags;
s->dynVal = dynVal; s->dynVal = dynVal;
@ -235,8 +244,10 @@ cmScRC_t _cmScParseNoteOn( cmSc_t* p, unsigned rowIdx, cmScoreEvt_t* s, int barN
cmScRC_t _cmScParseFile( cmSc_t* p, cmCtx_t* ctx, const cmChar_t* fn ) cmScRC_t _cmScParseFile( cmSc_t* p, cmCtx_t* ctx, const cmChar_t* fn )
{ {
cmScRC_t rc = kOkScRC; cmScRC_t rc = kOkScRC;
unsigned barNoteIdx; unsigned barNoteIdx = 0;
int barNumb; int barEvtIdx = cmInvalidIdx;
int barNumb = 0;
double secs;
if( cmCsvInitialize(&p->cH, ctx ) != kOkCsvRC ) if( cmCsvInitialize(&p->cH, ctx ) != kOkCsvRC )
{ {
@ -280,19 +291,25 @@ cmScRC_t _cmScParseFile( cmSc_t* p, cmCtx_t* ctx, const cmChar_t* fn )
break; break;
} }
secs = DBL_MAX;
switch(tid) switch(tid)
{ {
case kBarEvtScId: case kBarEvtScId:
// parse bar lines // parse bar lines
if((rc = _cmScParseBar(p,i,&barNumb)) == kOkScRC ) if((rc = _cmScParseBar(p,i,p->array+j,&barNumb)) == kOkScRC )
{
barNoteIdx = 0; barNoteIdx = 0;
barEvtIdx = j;
++j;
}
break; break;
case kNonEvtScId: case kNonEvtScId:
// parse note-on events // parse note-on events
if((rc = _cmScParseNoteOn(p, i, p->array + j, barNumb, barNoteIdx )) == kOkScRC ) if((rc = _cmScParseNoteOn(p, i, p->array + j, barNumb, barNoteIdx )) == kOkScRC )
{ {
secs = p->array[j].dsecs;
if( cmIsFlag(p->array[j].flags,kSkipScFl) == false ) if( cmIsFlag(p->array[j].flags,kSkipScFl) == false )
++j; ++j;
@ -301,9 +318,20 @@ cmScRC_t _cmScParseFile( cmSc_t* p, cmCtx_t* ctx, const cmChar_t* fn )
break; break;
default: default:
// Returns DBL_MAX on error.
secs = cmCsvCellDouble(p->cH, i, kDSecsColScIdx );
break; break;
} }
// the bar lines don't have times so set the time of the bar line to the
// time of the first event in the bar.
if( barEvtIdx != cmInvalidIdx && secs != DBL_MAX )
{
assert( p->array[ barEvtIdx ].type == kBarEvtScId );
p->array[ barEvtIdx ].dsecs = secs;
barEvtIdx = cmInvalidIdx;
}
} }
if( rc == kSyntaxErrScRC ) if( rc == kSyntaxErrScRC )
@ -319,7 +347,7 @@ cmScRC_t _cmScParseFile( cmSc_t* p, cmCtx_t* ctx, const cmChar_t* fn )
return rc; return rc;
} }
cmScRC_t cmScoreInitialize( cmCtx_t* ctx, cmScH_t* hp, const cmChar_t* fn ) cmScRC_t cmScoreInitialize( cmCtx_t* ctx, cmScH_t* hp, const cmChar_t* fn, cmScCb_t cbFunc, void* cbArg )
{ {
cmScRC_t rc = kOkScRC; cmScRC_t rc = kOkScRC;
if((rc = cmScoreFinalize(hp)) != kOkScRC ) if((rc = cmScoreFinalize(hp)) != kOkScRC )
@ -332,6 +360,10 @@ cmScRC_t cmScoreInitialize( cmCtx_t* ctx, cmScH_t* hp, const cmChar_t* fn )
if((rc = _cmScParseFile(p,ctx,fn)) != kOkScRC ) if((rc = _cmScParseFile(p,ctx,fn)) != kOkScRC )
goto errLabel; goto errLabel;
p->cbFunc = cbFunc;
p->cbArg = cbArg;
p->fn = cmMemAllocStr(fn);
hp->h = p; hp->h = p;
errLabel: errLabel:
@ -358,6 +390,12 @@ cmScRC_t cmScoreFinalize( cmScH_t* hp )
return rc; return rc;
} }
const cmChar_t* cmScoreFileName( cmScH_t h )
{
cmSc_t* p = _cmScHandleToPtr(h);
return p->fn;
}
bool cmScoreIsValid( cmScH_t h ) bool cmScoreIsValid( cmScH_t h )
{ return h.h != NULL; } { return h.h != NULL; }
@ -378,6 +416,42 @@ cmScoreEvt_t* cmScoreEvt( cmScH_t h, unsigned idx )
return p->array + idx; return p->array + idx;
} }
cmScRC_t cmScoreSeqNotify( cmScH_t h )
{
cmScRC_t rc = kOkScRC;
cmSc_t* p = _cmScHandleToPtr(h);
cmScMsg_t m;
unsigned i;
if( p->cbFunc != NULL )
{
memset(&m.evt,0,sizeof(m.evt));
m.typeId = kBeginMsgScId;
p->cbFunc(p->cbArg,&m,sizeof(m));
m.typeId = kEventMsgScId;
for(i=0; i<p->cnt; ++i)
{
m.evt = p->array[i];
p->cbFunc(p->cbArg,&m,sizeof(m));
}
memset(&m.evt,0,sizeof(m.evt));
m.typeId = kEndMsgScId;
p->cbFunc(p->cbArg,&m,sizeof(m));
}
return rc;
}
cmScRC_t cmScoreDecode( const void* msg, unsigned msgByteCnt, cmScMsg_t* m)
{
cmScMsg_t* mp = (cmScMsg_t*)msg;
*m = *mp;
return kOkScRC;
}
void cmScorePrint( cmScH_t h, cmRpt_t* rpt ) void cmScorePrint( cmScH_t h, cmRpt_t* rpt )
{ {
cmSc_t* p = _cmScHandleToPtr(h); cmSc_t* p = _cmScHandleToPtr(h);
@ -392,12 +466,12 @@ void cmScorePrint( cmScH_t h, cmRpt_t* rpt )
i, i,
r->barNumb, r->barNumb,
r->barNoteIdx, r->barNoteIdx,
_cmScEvtTypeIdToLabel(r->type), cmScEvtTypeIdToLabel(r->type),
r->pitch, r->pitch,
cmIsFlag(r->flags,kEvenScFl) ? 'e' : ' ', cmIsFlag(r->flags,kEvenScFl) ? 'e' : ' ',
cmIsFlag(r->flags,kTempoScFl) ? 't' : ' ', cmIsFlag(r->flags,kTempoScFl) ? 't' : ' ',
cmIsFlag(r->flags,kDynScFl) ? 'd' : ' ', cmIsFlag(r->flags,kDynScFl) ? 'd' : ' ',
cmIsFlag(r->flags,kDynScFl) ? _cmScDynIdToLabel(r->dynVal) : ""); cmIsFlag(r->flags,kDynScFl) ? cmScDynIdToLabel(r->dynVal) : "");
break; break;
default: default:
@ -603,7 +677,7 @@ cmScRC_t cmScoreSyncTimeLineTest( cmCtx_t* ctx, const cmChar_t* timeLineJsFn, c
if(1) if(1)
{ {
if((rc = cmScoreInitialize(ctx,&scH,scoreCsvFn)) != kOkScRC ) if((rc = cmScoreInitialize(ctx,&scH,scoreCsvFn,NULL,NULL)) != kOkScRC )
goto errLabel; goto errLabel;
@ -626,7 +700,7 @@ cmScRC_t cmScoreSyncTimeLineTest( cmCtx_t* ctx, const cmChar_t* timeLineJsFn, c
void cmScoreTest( cmCtx_t* ctx, const cmChar_t* fn ) void cmScoreTest( cmCtx_t* ctx, const cmChar_t* fn )
{ {
cmScH_t h = cmScNullHandle; cmScH_t h = cmScNullHandle;
if( cmScoreInitialize(ctx,&h,fn) != kOkScRC ) if( cmScoreInitialize(ctx,&h,fn,NULL,NULL) != kOkScRC )
return; return;
cmScorePrint(h,&ctx->rpt); cmScorePrint(h,&ctx->rpt);

View File

@ -51,15 +51,25 @@ extern "C" {
unsigned barNoteIdx; // index of this note in this bar unsigned barNoteIdx; // index of this note in this bar
} cmScoreEvt_t; } cmScoreEvt_t;
typedef void (*cmScCb_t)( void* arg, const void* data, unsigned byteCnt );
typedef cmRC_t cmScRC_t; typedef cmRC_t cmScRC_t;
typedef cmHandle_t cmScH_t; typedef cmHandle_t cmScH_t;
typedef void (*cmScCb_t)( void* arg, const void* data, unsigned byteCnt );
extern cmScH_t cmScNullHandle; extern cmScH_t cmScNullHandle;
const cmChar_t* cmScEvtTypeIdToLabel( unsigned id );
const cmChar_t* cmScDynIdToLabel( unsigned id );
// Initialize a score object from a CSV File generated from a score spreadsheet. // Initialize a score object from a CSV File generated from a score spreadsheet.
cmScRC_t cmScoreInitialize( cmCtx_t* ctx, cmScH_t* hp, const cmChar_t* fn ); cmScRC_t cmScoreInitialize( cmCtx_t* ctx, cmScH_t* hp, const cmChar_t* fn, cmScCb_t cbFunc, void* cbArg );
cmScRC_t cmScoreFinalize( cmScH_t* hp ); cmScRC_t cmScoreFinalize( cmScH_t* hp );
// Filename of last successfuly loaded score file.
const cmChar_t* cmScoreFileName( cmScH_t h );
bool cmScoreIsValid( cmScH_t h ); bool cmScoreIsValid( cmScH_t h );
@ -67,13 +77,32 @@ extern "C" {
unsigned cmScoreEvtCount( cmScH_t h ); unsigned cmScoreEvtCount( cmScH_t h );
cmScoreEvt_t* cmScoreEvt( cmScH_t h, unsigned idx ); cmScoreEvt_t* cmScoreEvt( cmScH_t h, unsigned idx );
cmScRC_t cmScoreSeqNotify( cmScH_t h );
typedef enum
{
kInvalidMsgScId,
kBeginMsgScId,
kEventMsgScId,
kEndMsgScId
} cmScMsgTypeId_t;
typedef struct
{
cmScMsgTypeId_t typeId;
cmScoreEvt_t evt; // only used when typeId == kEventMsgScId
} cmScMsg_t;
cmScRC_t cmScoreDecode( const void* msg, unsigned msgByteCnt, cmScMsg_t* );
void cmScorePrint( cmScH_t h, cmRpt_t* rpt ); void cmScorePrint( cmScH_t h, cmRpt_t* rpt );
cmScRC_t cmScoreSyncTimeLine( cmScH_t scH, cmTlH_t tlH, unsigned editDistWndCnt, cmReal_t maxNoteOffsetSecs ); cmScRC_t cmScoreSyncTimeLine( cmScH_t scH, cmTlH_t tlH, unsigned editDistWndCnt, cmReal_t maxNoteOffsetSecs );
cmScRC_t cmScoreSyncTimeLineTest( cmCtx_t* ctx, const cmChar_t* timeLineJsFn, const cmChar_t* scoreCsvFn ); cmScRC_t cmScoreSyncTimeLineTest( cmCtx_t* ctx, const cmChar_t* timeLineJsFn, const cmChar_t* scoreCsvFn );
void cmScoreTest( cmCtx_t* ctx, const cmChar_t* fn ); void cmScoreTest( cmCtx_t* ctx, const cmChar_t* fn );
#ifdef __cplusplus #ifdef __cplusplus
} }