cmXScore.h/c : Moved edit file processing into cmXScoreInitialize().

This commit is contained in:
kevin 2016-09-15 18:28:30 -04:00
parent 85878f995b
commit 8e4f32c0c1
2 changed files with 113 additions and 119 deletions

View File

@ -1842,89 +1842,6 @@ cmXsRC_t _cmXScoreProcessGraceNotes( cmXScore_t* p )
return rc; return rc;
} }
cmXsRC_t cmXScoreInitialize( cmCtx_t* ctx, cmXsH_t* hp, const cmChar_t* xmlFn )
{
cmXsRC_t rc = kOkXsRC;
if((rc = cmXScoreFinalize(hp)) != kOkXsRC )
return rc;
cmXScore_t* p = cmMemAllocZ(cmXScore_t,1);
cmErrSetup(&p->err,&ctx->rpt,"XScore");
// create a local linked heap
if( cmLHeapIsValid( p->lhH = cmLHeapCreate(8196,ctx)) == false )
return cmErrMsg(&p->err,kLHeapFailXsRC,"Lheap create failed.");
// open the music xml file
if( cmXmlAlloc(ctx, &p->xmlH, xmlFn) != kOkXmlRC )
{
rc = cmErrMsg(&p->err,kXmlFailXsRC,"Unable to open the MusicXML file '%s'.",cmStringNullGuard(xmlFn));
goto errLabel;
}
//cmXmlPrint(p->xmlH,&ctx->rpt);
// parse the part-list
if((rc = _cmXScoreParsePartList( p )) != kOkXsRC )
goto errLabel;
// parse each score 'part'
cmXsPart_t* pp = p->partL;
for(; pp!=NULL; pp=pp->link)
if((rc = _cmXScoreParsePart(p,pp)) != kOkXsRC )
goto errLabel;
// fill in the note->slink chain to link the notes in each measure in time order
_cmXScoreSort(p);
_cmXScoreSpreadGraceNotes(p);
_cmXScoreSort(p);
_cmXScoreResolveTiesAndLoc(p);
_cmXScoreRemoveDuplicateNotes(p);
_cmXScoreSetMeasGroups(p,kEvenXsFl);
_cmXScoreSetMeasGroups(p,kDynXsFl);
_cmXScoreSetMeasGroups(p,kTempoXsFl);
//_cmXScoreResolveOctaveShift(p);
// CSV output initialize failed.
if( cmCsvInitialize(&p->csvH,ctx) != kOkCsvRC )
rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV output object create failed.");
errLabel:
if( rc != kOkXsRC )
_cmXScoreFinalize(p);
else
hp->h = p;
return rc;
}
cmXsRC_t cmXScoreFinalize( cmXsH_t* hp )
{
cmXsRC_t rc = kOkXsRC;
if( hp == NULL || cmXScoreIsValid(*hp)==false )
return kOkXsRC;
cmXScore_t* p = _cmXScoreHandleToPtr(*hp);
if((rc = _cmXScoreFinalize(p)) != kOkXsRC )
return rc;
hp->h = NULL;
return rc;
}
bool cmXScoreIsValid( cmXsH_t h )
{ return h.h != NULL; }
//------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------
@ -2365,12 +2282,11 @@ cmXsRC_t _cmXScoreReorderParsePitch(cmXScore_t* p, const cmChar_t* b, unsigned
return rc; return rc;
} }
cmXsRC_t cmXScoreReorder( cmXsH_t h, const cmChar_t* fn ) cmXsRC_t _cmXsApplyEditFile( cmXScore_t* p, const cmChar_t* fn )
{ {
typedef enum { kFindMeasStId, kFindEventStId, kReadEventStId } stateId_t; typedef enum { kFindMeasStId, kFindEventStId, kReadEventStId } stateId_t;
cmXsRC_t rc = kOkXsRC; cmXsRC_t rc = kOkXsRC;
cmXScore_t* p = _cmXScoreHandleToPtr(h);
cmFileH_t fH = cmFileNullHandle; cmFileH_t fH = cmFileNullHandle;
cmChar_t* b = NULL; cmChar_t* b = NULL;
unsigned bN = 0; unsigned bN = 0;
@ -2538,6 +2454,107 @@ cmXsRC_t cmXScoreReorder( cmXsH_t h, const cmChar_t* fn )
cmXsRC_t cmXScoreInitialize( cmCtx_t* ctx, cmXsH_t* hp, const cmChar_t* xmlFn, const cmChar_t* editFn )
{
cmXsRC_t rc = kOkXsRC;
if((rc = cmXScoreFinalize(hp)) != kOkXsRC )
return rc;
cmXScore_t* p = cmMemAllocZ(cmXScore_t,1);
cmErrSetup(&p->err,&ctx->rpt,"XScore");
// create a local linked heap
if( cmLHeapIsValid( p->lhH = cmLHeapCreate(8196,ctx)) == false )
return cmErrMsg(&p->err,kLHeapFailXsRC,"Lheap create failed.");
// open the music xml file
if( cmXmlAlloc(ctx, &p->xmlH, xmlFn) != kOkXmlRC )
{
rc = cmErrMsg(&p->err,kXmlFailXsRC,"Unable to open the MusicXML file '%s'.",cmStringNullGuard(xmlFn));
goto errLabel;
}
//cmXmlPrint(p->xmlH,&ctx->rpt);
// parse the part-list
if((rc = _cmXScoreParsePartList( p )) != kOkXsRC )
goto errLabel;
// parse each score 'part'
cmXsPart_t* pp = p->partL;
for(; pp!=NULL; pp=pp->link)
if((rc = _cmXScoreParsePart(p,pp)) != kOkXsRC )
goto errLabel;
// fill in the note->slink chain to link the notes in each measure in time order
_cmXScoreSort(p);
_cmXScoreSpreadGraceNotes(p);
_cmXScoreSort(p);
_cmXScoreResolveTiesAndLoc(p);
_cmXScoreRemoveDuplicateNotes(p);
_cmXScoreSetMeasGroups(p,kEvenXsFl);
_cmXScoreSetMeasGroups(p,kDynXsFl);
_cmXScoreSetMeasGroups(p,kTempoXsFl);
//_cmXScoreResolveOctaveShift(p);
// CSV output initialize failed.
if( cmCsvInitialize(&p->csvH,ctx) != kOkCsvRC )
rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV output object create failed.");
if( editFn != NULL )
{
if((rc = _cmXsApplyEditFile(p,editFn)) != kOkXsRC )
{
cmErrMsg(&ctx->err,rc,"XScore reorder failed.");
goto errLabel;
}
}
// assign durations to pedal down events
_cmXScoreProcessPedals(p);
// remove some notes which share a pitch and are overlapped or embedded within another note.
_cmXScoreProcessOverlappingNotes(p);
errLabel:
if( rc != kOkXsRC )
_cmXScoreFinalize(p);
else
hp->h = p;
return rc;
}
cmXsRC_t cmXScoreFinalize( cmXsH_t* hp )
{
cmXsRC_t rc = kOkXsRC;
if( hp == NULL || cmXScoreIsValid(*hp)==false )
return kOkXsRC;
cmXScore_t* p = _cmXScoreHandleToPtr(*hp);
if((rc = _cmXScoreFinalize(p)) != kOkXsRC )
return rc;
hp->h = NULL;
return rc;
}
bool cmXScoreIsValid( cmXsH_t h )
{ return h.h != NULL; }
/* CSV score columns /* CSV score columns
@ -3626,32 +3643,21 @@ cmXsRC_t _cmXScoreGenSvg( cmCtx_t* ctx, cmXsH_t h, const cmChar_t* dir, const cm
return _cmXsWriteMidiSvg( ctx, p, &mf, dir, fn ); return _cmXsWriteMidiSvg( ctx, p, &mf, dir, fn );
} }
cmXsRC_t cmXScoreTest( cmXsRC_t cmXScoreTest(
cmCtx_t* ctx, cmCtx_t* ctx,
const cmChar_t* xmlFn, const cmChar_t* xmlFn,
const cmChar_t* reorderFn, const cmChar_t* editFn,
const cmChar_t* csvOutFn, const cmChar_t* csvOutFn,
const cmChar_t* midiOutFn) const cmChar_t* midiOutFn)
{ {
cmXsRC_t rc; cmXsRC_t rc;
cmXsH_t h = cmXsNullHandle; cmXsH_t h = cmXsNullHandle;
if((rc = cmXScoreInitialize( ctx, &h, xmlFn)) != kOkXsRC ) // Parse the XML file and apply the changes in editFn.
if((rc = cmXScoreInitialize( ctx, &h, xmlFn,editFn)) != kOkXsRC )
return cmErrMsg(&ctx->err,rc,"XScore alloc failed."); return cmErrMsg(&ctx->err,rc,"XScore alloc failed.");
if( reorderFn != NULL )
if((rc = cmXScoreReorder(h,reorderFn)) != kOkXsRC )
{
cmErrMsg(&ctx->err,rc,"XScore reorder failed.");
goto errLabel;
}
// assign durations to pedal down events
_cmXScoreProcessPedals(_cmXScoreHandleToPtr(h));
// remove some notes which share a pitch and are overlapped or embedded within another note.
_cmXScoreProcessOverlappingNotes(_cmXScoreHandleToPtr(h));
if( csvOutFn != NULL ) if( csvOutFn != NULL )
{ {
cmScH_t scH = cmScNullHandle; cmScH_t scH = cmScNullHandle;
@ -3694,7 +3700,6 @@ cmXsRC_t cmXScoreTest(
//cmXScoreReport(h,&ctx->rpt,true); //cmXScoreReport(h,&ctx->rpt,true);
errLabel:
return cmXScoreFinalize(&h); return cmXScoreFinalize(&h);
} }

View File

@ -43,26 +43,15 @@ extern "C" {
// //
// M-x load-file ~/src/emacs/proc_music_xml.el // M-x load-file ~/src/emacs/proc_music_xml.el
// //
// 3) How to assigned dynamic markings (they are not attached to notes). (from MIDI file?)
// 4) Tempo syntax is inconsistent (only a problem in full part2 score)
// 5) Heel is being parsed but not used.
// 6) Sostenuto pedal events are not being parsed because they are not pedal events.
// 7) What is a 'pedal-change' event vs. a 'pedal-stop' event.
// 8) Verify the colors. (done)
// 9) Remove blank bars at end (done in xml - do in score)
//10) Need to assign section targets (always default to next section)
//11) Mark tied notes for skip. (done)
//12) Determine note off locations based on ties and slurs - defer 'pedal' to player
//13) Check that the measures are given in sorted order.
//14) Current implementation assumes meter changes only occur at measure boundaries.
//15) Score Fixes: Add meter to bar 1, fix time errors (shown in voice report)
//16) The order of notes is now correct (4/6/16) after applying
// the grace note ordering changed specified in 'score_print_mk_edit.txt',
// via cmXScoreReorder() however the ticks are now incorrect - fix them.
cmXsRC_t cmXScoreInitialize( cmCtx_t* ctx, cmXsH_t* hp, const cmChar_t* xmlFn ); // Initialize an cmXScore object from a Sibelius generated MusicXML file.
// Optionally include an 'edit' file to attach additional score information.
// Note that the 'edit' file is created by marking up a file created via
// cmXScoreReport().
cmXsRC_t cmXScoreInitialize( cmCtx_t* ctx, cmXsH_t* hp, const cmChar_t* xmlFn, const cmChar_t* editFn );
cmXsRC_t cmXScoreFinalize( cmXsH_t* hp ); cmXsRC_t cmXScoreFinalize( cmXsH_t* hp );
bool cmXScoreIsValid( cmXsH_t h ); bool cmXScoreIsValid( cmXsH_t h );
cmXsRC_t cmXScoreWriteCsv( cmXsH_t h, const cmChar_t* csvFn ); cmXsRC_t cmXScoreWriteCsv( cmXsH_t h, const cmChar_t* csvFn );