cmXScore.c : Added the 'uid' field to cmXScoreNote_t to hold a unique id for each note record.

This commit is contained in:
kevin 2016-03-02 18:52:40 -05:00
parent 63fff58dd8
commit 1bc5d4dc65

View File

@ -56,6 +56,7 @@ struct cmXsVoice_str;
typedef struct cmXsNote_str typedef struct cmXsNote_str
{ {
unsigned uid; // unique id of this note record
unsigned flags; // See k???XsFl unsigned flags; // See k???XsFl
unsigned pitch; // midi pitch unsigned pitch; // midi pitch
unsigned velocity; // midi velocity unsigned velocity; // midi velocity
@ -126,6 +127,7 @@ typedef struct
cmCsvH_t csvH; cmCsvH_t csvH;
cmXsSpan_t* spanL; cmXsSpan_t* spanL;
unsigned nextUid;
} cmXScore_t; } cmXScore_t;
cmXScore_t* _cmXScoreHandleToPtr( cmXsH_t h ) cmXScore_t* _cmXScoreHandleToPtr( cmXsH_t h )
@ -210,6 +212,7 @@ cmXsRC_t _cmXScorePushNote( cmXScore_t* p, cmXsMeas_t* meas, unsigned voiceId, c
} }
note->voice = v; note->voice = v;
note->uid = p->nextUid++;
return kOkXsRC; return kOkXsRC;
} }
@ -982,7 +985,7 @@ cmXsRC_t _cmXScoreWriteScorePlotFile( cmXScore_t* p, const cmChar_t* fn )
{ {
onset_secs += (np->tick - tick0) / ticks_per_sec; onset_secs += (np->tick - tick0) / ticks_per_sec;
tick0 = np->tick; tick0 = np->tick;
cmFilePrintf(fH,"n %f %f %s %s\n",onset_secs,np->duration/ticks_per_sec,cmMidiToSciPitch(np->pitch,NULL,0),cmIsFlag(np->flags,kGraceXsFl)?"G":"N"); cmFilePrintf(fH,"n %f %f %i %s %s\n",onset_secs,np->duration/ticks_per_sec,np->uid,cmMidiToSciPitch(np->pitch,NULL,0),cmIsFlag(np->flags,kGraceXsFl)?"G":"N");
} }
} }
} }
@ -1007,7 +1010,7 @@ cmXsRC_t _cmXScoreWriteMidiPlotFile( cmXScore_t* p, cmChar_t* fn, const cmMidiTr
for(i=0; i<mN; ++i) for(i=0; i<mN; ++i)
if( (m[i]!=NULL) && cmMidiIsChStatus(m[i]->status) && cmMidiIsNoteOn(m[i]->status) && (m[i]->u.chMsgPtr->d1>0) ) if( (m[i]!=NULL) && cmMidiIsChStatus(m[i]->status) && cmMidiIsNoteOn(m[i]->status) && (m[i]->u.chMsgPtr->d1>0) )
cmFilePrintf(fH,"n %f %f %s\n",m[i]->amicro/1000000.0,m[i]->u.chMsgPtr->durMicros/1000000.0,cmMidiToSciPitch(m[i]->u.chMsgPtr->d0,NULL,0)); cmFilePrintf(fH,"n %f %f %i %s\n",m[i]->amicro/1000000.0,m[i]->u.chMsgPtr->durMicros/1000000.0,m[i]->uid,cmMidiToSciPitch(m[i]->u.chMsgPtr->d0,NULL,0));
cmFileClose(&fH); cmFileClose(&fH);
@ -1028,7 +1031,7 @@ cmXsRC_t _cmXScoreProcessMidi(cmXScore_t* p, cmCtx_t* ctx, const cmChar_t* mi
if( cmMidiFileOpen(ctx, &mfH, midiFn ) != kOkMfRC ) if( cmMidiFileOpen(ctx, &mfH, midiFn ) != kOkMfRC )
return cmErrMsg(&p->err,kMidiFailXsRC,"The MIDI file object could not be opened from '%s'.",cmStringNullGuard(midiFn)); return cmErrMsg(&p->err,kMidiFailXsRC,"The MIDI file object could not be opened from '%s'.",cmStringNullGuard(midiFn));
cmMidiFilePrintMsgs(mfH, p->err.rpt ); //cmMidiFilePrintMsgs(mfH, p->err.rpt );
if( (m = cmMidiFileMsgArray(mfH)) == NULL || (mN = cmMidiFileMsgCount(mfH)) == 0 ) if( (m = cmMidiFileMsgArray(mfH)) == NULL || (mN = cmMidiFileMsgCount(mfH)) == 0 )
{ {
@ -1256,7 +1259,7 @@ cmXsRC_t _cmXScoreWriteCsvHdr( cmXScore_t* p )
unsigned i; unsigned i;
for(i=1; s[i]!=NULL; ++i) for(i=1; s[i]!=NULL; ++i)
{ {
if( cmCsvInsertTextColAfter(p->csvH, lcp, &lcp, s[i], 0 ) != kOkCsvRC ) if( cmCsvInsertIdentColAfter(p->csvH, lcp, &lcp, s[i], 0 ) != kOkCsvRC )
return cmErrMsg(&p->err,kCsvFailXsRC,"CSV error inserting CSV title %i.\n",i); return cmErrMsg(&p->err,kCsvFailXsRC,"CSV error inserting CSV title %i.\n",i);
} }
@ -1268,7 +1271,7 @@ cmXsRC_t _cmXScoreWriteCsvBlankCols( cmXScore_t* p, unsigned cnt, cmCsvCell_t**
{ {
unsigned i; unsigned i;
for(i=0; i<cnt; ++i) for(i=0; i<cnt; ++i)
if( cmCsvInsertTextColAfter(p->csvH,*leftCellPtrPtr,leftCellPtrPtr,0,0) != kOkCsvRC ) if( cmCsvInsertIdentColAfter(p->csvH,*leftCellPtrPtr,leftCellPtrPtr,"",0) != kOkCsvRC )
return cmErrMsg(&p->err,kCsvFailXsRC,"CSV output failed on blank column."); return cmErrMsg(&p->err,kCsvFailXsRC,"CSV output failed on blank column.");
return kOkCsvRC; return kOkCsvRC;
@ -1277,6 +1280,7 @@ cmXsRC_t _cmXScoreWriteCsvBlankCols( cmXScore_t* p, unsigned cnt, cmCsvCell_t**
cmXsRC_t _cmXScoreWriteCsvRow( cmXsRC_t _cmXScoreWriteCsvRow(
cmXScore_t* p, cmXScore_t* p,
unsigned rowIdx, unsigned rowIdx,
unsigned uid,
unsigned bar, unsigned bar,
const cmChar_t* sectionStr, const cmChar_t* sectionStr,
const cmChar_t* opCodeStr, const cmChar_t* opCodeStr,
@ -1284,7 +1288,7 @@ cmXsRC_t _cmXScoreWriteCsvRow(
double secs, double secs,
unsigned d0, unsigned d0,
unsigned d1, unsigned d1,
unsigned pitch, unsigned pitch, // set to -1 if the pitch is not valid
double frac, double frac,
unsigned flags ) unsigned flags )
{ {
@ -1306,13 +1310,29 @@ cmXsRC_t _cmXScoreWriteCsvRow(
goto errLabel; goto errLabel;
} }
*/ */
// cols 1,2
if((rc = _cmXScoreWriteCsvBlankCols(p,2,&lcp)) != kOkXsRC )
goto errLabel;
// col 1 : track (always 1)
if( cmCsvInsertUIntColAfter(p->csvH,lcp,&lcp,1,0) != kOkCsvRC )
{
rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on 'd0'.");
goto errLabel;
}
// col 2 : evt (set to event uid, or blank if uid == -1)
if( uid == -1 )
{
if((rc = _cmXScoreWriteCsvBlankCols(p,1,&lcp)) != kOkXsRC )
goto errLabel;
}
else
if( cmCsvInsertUIntColAfter(p->csvH,lcp,&lcp,uid,0) != kOkCsvRC )
{
rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on 'd0'.");
goto errLabel;
}
// col 3 : output the opcode // col 3 : output the opcode
if( cmCsvInsertTextColAfter(p->csvH,lcp,&lcp,opCodeStr,0) != kOkCsvRC ) if( cmCsvInsertIdentColAfter(p->csvH,lcp,&lcp,opCodeStr,0) != kOkCsvRC )
{ {
rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on opcode label."); rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on opcode label.");
goto errLabel; goto errLabel;
@ -1351,10 +1371,18 @@ cmXsRC_t _cmXScoreWriteCsvRow(
} }
// col 11 : pitch // col 11 : pitch
if( cmCsvInsertUIntColAfter(p->csvH,lcp,&lcp,pitch,0) != kOkCsvRC ) if( pitch == -1 )
{ {
rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on 'pitch'."); if((rc = _cmXScoreWriteCsvBlankCols(p,1,&lcp)) != kOkXsRC )
goto errLabel; goto errLabel;
}
else
{
if( cmCsvInsertIdentColAfter(p->csvH,lcp,&lcp,cmMidiToSciPitch(pitch,NULL,0),0) != kOkCsvRC )
{
rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on 'pitch'.");
goto errLabel;
}
} }
// col 12 : blanks // col 12 : blanks
@ -1374,23 +1402,23 @@ cmXsRC_t _cmXScoreWriteCsvRow(
// col 14 : skip (blank for now) // col 14 : skip (blank for now)
if((rc = _cmXScoreWriteCsvBlankCols(p,1,&lcp)) != kOkXsRC ) if((rc = _cmXScoreWriteCsvBlankCols(p,1,&lcp)) != kOkXsRC )
goto errLabel; goto errLabel;
// col 15: even // col 15: even (all grace notes are 'even' notes
if( cmCsvInsertTextColAfter(p->csvH,lcp,&lcp,cmIsFlag(flags,kEvenXsFl) ? "e" : "",0) != kOkCsvRC ) if( cmCsvInsertIdentColAfter(p->csvH,lcp,&lcp, cmIsFlag(flags,kGraceXsFl) | cmIsFlag(flags,kEvenXsFl) ? "e" : "",0) != kOkCsvRC )
{ {
rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on eveness flag label."); rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on eveness flag label.");
goto errLabel; goto errLabel;
} }
// col 16: grace // col 16: grace
if( cmCsvInsertTextColAfter(p->csvH,lcp,&lcp,cmIsFlag(flags,kGraceXsFl) ? "g" : "",0) != kOkCsvRC ) if( cmCsvInsertIdentColAfter(p->csvH,lcp,&lcp,cmIsFlag(flags,kGraceXsFl) ? "g" : "",0) != kOkCsvRC )
{ {
rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on eveness flag label."); rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on eveness flag label.");
goto errLabel; goto errLabel;
} }
// col 17: tempo // col 17: tempo
if( cmCsvInsertTextColAfter(p->csvH,lcp,&lcp,cmIsFlag(flags,kTempoXsFl) ? "t" : "",0) != kOkCsvRC ) if( cmCsvInsertIdentColAfter(p->csvH,lcp,&lcp,cmIsFlag(flags,kTempoXsFl) ? "t" : "",0) != kOkCsvRC )
{ {
rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on eveness flag label."); rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on eveness flag label.");
goto errLabel; goto errLabel;
@ -1416,13 +1444,12 @@ cmXsRC_t _cmXScoreWriteCsvRow(
goto errLabel; goto errLabel;
// col 20: section // col 20: section
if( cmCsvInsertTextColAfter(p->csvH,lcp,&lcp,cmIsFlag(flags,kSectionXsFl) ? sectionStr : "",0) != kOkCsvRC ) if( cmCsvInsertIdentColAfter(p->csvH,lcp,&lcp,cmIsFlag(flags,kSectionXsFl) ? sectionStr : "",0) != kOkCsvRC )
{ {
rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on eveness flag label."); rc = cmErrMsg(&p->err,kCsvFailXsRC,"CSV insert failed on eveness flag label.");
goto errLabel; goto errLabel;
} }
// col 21, 22 : recd-play, remark (blank for now) // col 21, 22 : recd-play, remark (blank for now)
if((rc = _cmXScoreWriteCsvBlankCols(p,2,&lcp)) != kOkXsRC ) if((rc = _cmXScoreWriteCsvBlankCols(p,2,&lcp)) != kOkXsRC )
goto errLabel; goto errLabel;
@ -1485,7 +1512,7 @@ cmXsRC_t cmXScoreWriteCsv( cmXsH_t h, const cmChar_t* csvFn )
// if this is a bar event // if this is a bar event
if( cmIsFlag(np->flags,kBarXsFl) ) if( cmIsFlag(np->flags,kBarXsFl) )
{ {
_cmXScoreWriteCsvRow(p,rowIdx,mp->number,NULL,"bar",dsecs,sec1,0,0,0,0,np->flags); _cmXScoreWriteCsvRow(p,rowIdx,-1,mp->number,NULL,"bar",dsecs,sec1,0,0,-1,0,np->flags);
} }
else else
@ -1494,18 +1521,18 @@ cmXsRC_t cmXScoreWriteCsv( cmXsH_t h, const cmChar_t* csvFn )
{ {
unsigned d0 = 64; // pedal MIDI ctl id unsigned d0 = 64; // pedal MIDI ctl id
unsigned d1 = cmIsFlag(np->flags,kPedalDnXsFl) ? 64 : 0; // pedal-dn: d1>=64 pedal-up:<64 unsigned d1 = cmIsFlag(np->flags,kPedalDnXsFl) ? 64 : 0; // pedal-dn: d1>=64 pedal-up:<64
_cmXScoreWriteCsvRow(p,rowIdx,mp->number,NULL,"ctl",dsecs,sec1,d0,d1,0,0,np->flags); _cmXScoreWriteCsvRow(p,rowIdx,-1,mp->number,NULL,"ctl",dsecs,sec1,d0,d1,-1,0,np->flags);
} }
else else
// if this is a sounding note event // if this is a sounding note event
if( cmIsNotFlag(np->flags,kRestXsFl) ) if( cmIsFlag(np->flags,kOnsetXsFl) )
{ {
double frac = np->rvalue + (cmIsFlag(np->flags,kDotXsFl) ? (np->rvalue/2) : 0); double frac = np->rvalue + (cmIsFlag(np->flags,kDotXsFl) ? (np->rvalue/2) : 0);
// //
_cmXScoreWriteCsvRow(p,rowIdx,mp->number,sectionIdStr,"non",dsecs,sec1,0,0,np->pitch,frac,np->flags); _cmXScoreWriteCsvRow(p,rowIdx,np->uid,mp->number,sectionIdStr,"non",dsecs,sec1,np->pitch,60,np->pitch,frac,np->flags);
sectionIdStr = NULL; sectionIdStr = NULL;
} }