|
@@ -1335,7 +1335,9 @@ typedef struct
|
1335
|
1335
|
unsigned durtn;
|
1336
|
1336
|
float rval;
|
1337
|
1337
|
unsigned midi;
|
|
1338
|
+ unsigned flags;
|
1338
|
1339
|
cmXsNote_t* note;
|
|
1340
|
+
|
1339
|
1341
|
} cmXsReorder_t;
|
1340
|
1342
|
|
1341
|
1343
|
cmXsNote_t* _cmXsReorderFindNote( cmXScore_t* p, unsigned measNumb, const cmXsReorder_t* r )
|
|
@@ -1354,7 +1356,8 @@ cmXsNote_t* _cmXsReorderFindNote( cmXScore_t* p, unsigned measNumb, const cmXsR
|
1354
|
1356
|
np->tick == r->tick &&
|
1355
|
1357
|
np->duration == r->durtn &&
|
1356
|
1358
|
np->rvalue == r->rval &&
|
1357
|
|
- np->pitch == r->midi )
|
|
1359
|
+ np->pitch == r->midi &&
|
|
1360
|
+ np->flags == r->flags )
|
1358
|
1361
|
{
|
1359
|
1362
|
return np;
|
1360
|
1363
|
}
|
|
@@ -1365,6 +1368,67 @@ cmXsNote_t* _cmXsReorderFindNote( cmXScore_t* p, unsigned measNumb, const cmXsR
|
1365
|
1368
|
return NULL;
|
1366
|
1369
|
}
|
1367
|
1370
|
|
|
1371
|
+// moved forward
|
|
1372
|
+// x 0 0 0 1 0 0 0
|
|
1373
|
+// 0 0 0 1 0 0 0 x
|
|
1374
|
+// 1 2 3 4 2 5 6 7
|
|
1375
|
+// 0 0 0 1 2 1 0 0 = mm_cnt
|
|
1376
|
+//
|
|
1377
|
+// moved backward
|
|
1378
|
+// x 0 0 0 0 1 1 0 0
|
|
1379
|
+// 0 0 0 0 1 1 0 0 x
|
|
1380
|
+// 1 2 3 4 7 6 5 6 7
|
|
1381
|
+// 0 0 0 1 1 2 1 0 0 = mm_cnt
|
|
1382
|
+
|
|
1383
|
+// 1. Iterate through rV[] and assign an index corresponding to the associated
|
|
1384
|
+// cmXsNote_t record in the un-reordered mp->noteL.
|
|
1385
|
+//
|
|
1386
|
+// 2. Iterate through rV[] and assign a mismatch count based equal to:
|
|
1387
|
+// mm_cnt = rV[i-1].index+1 == rV[i].index + rV[i].index == rV[i+1].index-1
|
|
1388
|
+//
|
|
1389
|
+// 3. Mis-match sequences should always begin and end with 1.
|
|
1390
|
+//
|
|
1391
|
+// 4. Iterate through rV[] and update the 'dsecs' of all non-zero mis-match
|
|
1392
|
+// records (except for the leading and trailing) records.
|
|
1393
|
+//
|
|
1394
|
+// 5. Iterate through rV[] and update the 'secs' of all non-zero mis-match
|
|
1395
|
+// records (except for the leading and trailing) records.
|
|
1396
|
+//
|
|
1397
|
+
|
|
1398
|
+
|
|
1399
|
+void _cmXScoreReorderFixTimes( cmXScore_t* p, cmXsMeas_t* mp )
|
|
1400
|
+{
|
|
1401
|
+ cmXsNote_t* n0p = mp->noteL;
|
|
1402
|
+ cmXsNote_t* n1p = NULL;
|
|
1403
|
+ for(; n0p != NULL; n0p=n0p->slink)
|
|
1404
|
+ {
|
|
1405
|
+ if( n1p != NULL && n1p->tick < n0p->tick )
|
|
1406
|
+ {
|
|
1407
|
+ // n1p->tick is before n0p->tick
|
|
1408
|
+ cmXsNote_t* n2p = n1p->slink;
|
|
1409
|
+ unsigned n = 1;
|
|
1410
|
+
|
|
1411
|
+ // advance n2p to the next note that is past n0p in time
|
|
1412
|
+ for(; n2p!=NULL; n2p=n2p->slink,++n)
|
|
1413
|
+ if( n2p->tick > n0p->tick )
|
|
1414
|
+ break;
|
|
1415
|
+
|
|
1416
|
+ double t0 = n0p->secs;
|
|
1417
|
+ double dt = 0;
|
|
1418
|
+ if( n2p!=NULL )
|
|
1419
|
+ dt = (n2p->secs - t0)/(n+1);
|
|
1420
|
+
|
|
1421
|
+ cmXsNOte_t* n3p = n0p->slink;
|
|
1422
|
+ for(i=0; i<n && n2p!=NULL; ++i,n2p=n2p->slink)
|
|
1423
|
+ n2p->secs = n0p->secs + (dt*i);
|
|
1424
|
+
|
|
1425
|
+
|
|
1426
|
+ }
|
|
1427
|
+
|
|
1428
|
+ n1p = n0p;
|
|
1429
|
+ }
|
|
1430
|
+}
|
|
1431
|
+
|
1368
|
1432
|
cmXsRC_t _cmXScoreReorderMeas( cmXScore_t* p, unsigned measNumb, cmXsReorder_t* rV, unsigned rN )
|
1369
|
1433
|
{
|
1370
|
1434
|
unsigned i;
|
|
@@ -1415,7 +1479,8 @@ cmXsRC_t cmXScoreReorder( cmXsH_t h, const cmChar_t* fn )
|
1415
|
1479
|
unsigned ri = 0;
|
1416
|
1480
|
unsigned measNumb = 0;
|
1417
|
1481
|
cmXsReorder_t rV[ rN ];
|
1418
|
|
-
|
|
1482
|
+ cmChar_t B,R,G,D,C,e,d,t,P,S,H,T0,T1,O;
|
|
1483
|
+
|
1419
|
1484
|
if( cmFileOpen(&fH,fn,kReadFileFl,p->err.rpt) != kOkFileRC )
|
1420
|
1485
|
{
|
1421
|
1486
|
rc = cmErrMsg(&p->err,kFileFailXsRC,"The reordering file '%s' could not be opened.",cmStringNullGuard(fn));
|
|
@@ -1440,9 +1505,9 @@ cmXsRC_t cmXScoreReorder( cmXsH_t h, const cmChar_t* fn )
|
1440
|
1505
|
{
|
1441
|
1506
|
cmXsReorder_t r;
|
1442
|
1507
|
char pitchStr[4];
|
1443
|
|
-
|
|
1508
|
+
|
1444
|
1509
|
// parse an event line
|
1445
|
|
- if( sscanf(b,"%i %i %i %i %f %c%c%c",&r.voice,&r.locIdx,&r.tick,&r.durtn,&r.rval,pitchStr,pitchStr+1,pitchStr+2) == 8 )
|
|
1510
|
+ if( sscanf(b,"%i %i %i %i %f %c%c%c %c%c%c%c%c%c%c%c%c%c%c%c%c%c",&r.voice,&r.locIdx,&r.tick,&r.durtn,&r.rval,pitchStr,pitchStr+1,pitchStr+2,&B,&R,&G,&D,&C,&e,&d,&t,&P,&S,&H,&T0,&T1,&O) == 22 )
|
1446
|
1511
|
{
|
1447
|
1512
|
pitchStr[3] = 0;
|
1448
|
1513
|
if( !isdigit(pitchStr[2]) )
|
|
@@ -1458,6 +1523,24 @@ cmXsRC_t cmXScoreReorder( cmXsH_t h, const cmChar_t* fn )
|
1458
|
1523
|
r.midi = cmSciPitchToMidi(pitchStr);
|
1459
|
1524
|
}
|
1460
|
1525
|
|
|
1526
|
+ r.flags = 0;
|
|
1527
|
+ if( B=='|') r.flags += kBarXsFl;
|
|
1528
|
+ if( R=='R') r.flags += kRestXsFl;
|
|
1529
|
+ if( G=='G') r.flags += kGraceXsFl;
|
|
1530
|
+ if( D=='D') r.flags += kDotXsFl;
|
|
1531
|
+ if( C=='C') r.flags += kChordXsFl;
|
|
1532
|
+ if( e=='e') r.flags += kEvenXsFl;
|
|
1533
|
+ if( d=='d') r.flags += kDynXsFl;
|
|
1534
|
+ if( t=='t') r.flags += kTempoXsFl;
|
|
1535
|
+ if( P=='V') r.flags += kPedalDnXsFl;
|
|
1536
|
+ if( P=='^') r.flags += kPedalUpXsFl;
|
|
1537
|
+ if( P=='X') r.flags += kPedalUpDnXsFl;
|
|
1538
|
+ if( S=='S') r.flags += kSectionXsFl;
|
|
1539
|
+ if( H=='H') r.flags += kHeelXsFl;
|
|
1540
|
+ if( T0=='T') r.flags += kTieBegXsFl;
|
|
1541
|
+ if( T1=='_') r.flags += kTieEndXsFl;
|
|
1542
|
+ if( O=='*') r.flags += kOnsetXsFl;
|
|
1543
|
+
|
1461
|
1544
|
// store the record
|
1462
|
1545
|
assert( ri < rN );
|
1463
|
1546
|
rV[ri++] = r;
|
|
@@ -1987,6 +2070,14 @@ cmXsRC_t cmXScoreWriteCsv( cmXsH_t h, const cmChar_t* csvFn )
|
1987
|
2070
|
unsigned d1 = cmIsFlag(np->flags,kPedalDnXsFl) ? 64 : 0; // pedal-dn: d1>=64 pedal-up:<64
|
1988
|
2071
|
_cmXScoreWriteCsvRow(p,rowIdx,-1,mp->number,sectionIdStr,"ctl",np->dsecs,np->secs,d0,d1,-1,0,"",np->flags,"","");
|
1989
|
2072
|
sectionIdStr = NULL;
|
|
2073
|
+
|
|
2074
|
+ if( cmIsFlag(np->flags,kPedalUpDnXsFl) )
|
|
2075
|
+ {
|
|
2076
|
+ rowIdx += 1;
|
|
2077
|
+ double millisecond = 0.0;
|
|
2078
|
+ _cmXScoreWriteCsvRow(p,rowIdx,-1,mp->number,sectionIdStr,"ctl",millisecond,np->secs+millisecond,d0,64,-1,0,"",np->flags,"","");
|
|
2079
|
+ }
|
|
2080
|
+
|
1990
|
2081
|
}
|
1991
|
2082
|
else
|
1992
|
2083
|
{
|
|
@@ -2035,7 +2126,7 @@ cmXsRC_t cmXScoreWriteCsv( cmXsH_t h, const cmChar_t* csvFn )
|
2035
|
2126
|
void _cmXScoreReportTitle( cmRpt_t* rpt )
|
2036
|
2127
|
{
|
2037
|
2128
|
cmRptPrintf(rpt," voc loc tick durtn rval flags\n");
|
2038
|
|
- cmRptPrintf(rpt," --- ----- ------- ----- ---- --- -------------\n");
|
|
2129
|
+ cmRptPrintf(rpt," --- ----- ------- ----- ---- --- --------------\n");
|
2039
|
2130
|
}
|
2040
|
2131
|
|
2041
|
2132
|
void _cmXScoreReportNote( cmRpt_t* rpt, const cmXsNote_t* note )
|
|
@@ -2196,8 +2287,8 @@ cmXsRC_t cmXScoreTest(
|
2196
|
2287
|
if( dynFn != NULL )
|
2197
|
2288
|
cmXScoreInsertDynamics(h, dynFn );
|
2198
|
2289
|
|
2199
|
|
- //if( reorderFn != NULL )
|
2200
|
|
- // cmXScoreReorder(h,reorderFn);
|
|
2290
|
+ if( reorderFn != NULL )
|
|
2291
|
+ cmXScoreReorder(h,reorderFn);
|
2201
|
2292
|
|
2202
|
2293
|
if( outFn != NULL )
|
2203
|
2294
|
{
|
|
@@ -2213,7 +2304,8 @@ cmXsRC_t cmXScoreTest(
|
2213
|
2304
|
cmErrMsg(&ctx->err,kFileFailXsRC,"The generated CSV file could not be parsed.");
|
2214
|
2305
|
else
|
2215
|
2306
|
{
|
2216
|
|
- cmScorePrintSets(scH,&ctx->rpt);
|
|
2307
|
+ //cmScorePrintSets(scH,&ctx->rpt);
|
|
2308
|
+ //cmScorePrint(scH,&ctx->rpt);
|
2217
|
2309
|
|
2218
|
2310
|
cmScoreFinalize(&scH);
|
2219
|
2311
|
}
|
|
@@ -2222,7 +2314,7 @@ cmXsRC_t cmXScoreTest(
|
2222
|
2314
|
|
2223
|
2315
|
}
|
2224
|
2316
|
|
2225
|
|
- //cmXScoreReport(h,&ctx->rpt,true);
|
|
2317
|
+ cmXScoreReport(h,&ctx->rpt,true);
|
2226
|
2318
|
|
2227
|
2319
|
return cmXScoreFinalize(&h);
|
2228
|
2320
|
|