Browse Source

cmXScore.c : Preliminary work on fixing reordering.

master
kevin 8 years ago
parent
commit
0fe627884f
1 changed files with 101 additions and 9 deletions
  1. 101
    9
      app/cmXScore.c

+ 101
- 9
app/cmXScore.c View File

@@ -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
 

Loading…
Cancel
Save