Browse Source

cmScoreProc.c : Reorganized the score processor to support plugging in different

score processing algorithms without changing the processor.
Created the shell code for generating performance editing data.
master
Kevin Larke 9 years ago
parent
commit
88d5d9a499
1 changed files with 298 additions and 171 deletions
  1. 298
    171
      app/cmScoreProc.c

+ 298
- 171
app/cmScoreProc.c View File

28
   kTimeLineFailSpRC,
28
   kTimeLineFailSpRC,
29
   kScoreMatchFailSpRC,
29
   kScoreMatchFailSpRC,
30
   kFileFailSpRC,
30
   kFileFailSpRC,
31
+  kProcFailSpRC
31
 };
32
 };
32
 
33
 
33
-typedef struct _cmScMeas_t
34
+typedef enum
34
 {
35
 {
35
-  cmTlMarker_t*       markPtr;  // time-line marker in which this 'set' exists
36
-  cmScoreSet_t*       setPtr;   // score set on which this measurment is based
37
-  double              value;    // the value of the measurement
38
-  double              cost;     // the quality of the perf->score match 
39
-  struct _cmScMeas_t* link;
40
-} _cmScMeas_t;
36
+  kBeginSectionSpId,
37
+  kEndSectionSpId
38
+} cmScoreProcSelId_t;
41
 
39
 
40
+struct cmSp_str;
42
 
41
 
43
-typedef struct
42
+typedef cmSpRC_t (*cmScoreProcCb_t)( void* arg, struct cmSp_str* p, cmScoreProcSelId_t id, cmTlMarker_t* curMarkPtr );
43
+
44
+typedef struct cmSp_str
44
 {
45
 {
45
   cmErr_t         err;          // score proc object error state
46
   cmErr_t         err;          // score proc object error state
46
   cmCtx*          ctx;          // application context
47
   cmCtx*          ctx;          // application context
51
   unsigned*       dynArray;     // dynArray[dynCnt] dynamics reference array
52
   unsigned*       dynArray;     // dynArray[dynCnt] dynamics reference array
52
   unsigned        dynCnt;       // 
53
   unsigned        dynCnt;       // 
53
   double          srate;        // 
54
   double          srate;        // 
54
-  cmScMeas*       meas;         // performance analyzer 
55
   cmScMatcher*    match;        // score follower
55
   cmScMatcher*    match;        // score follower
56
 
56
 
57
-  cmTlMarker_t*   curMarkPtr;
58
-  _cmScMeas_t*    list_beg;
59
-  _cmScMeas_t*    list_end;
60
-  _cmScMeas_t*    slist_beg; 
57
+  cmScMatcherCb_t  matchCb;     // score follower callback
58
+  cmScoreProcCb_t  procCb;      // score processor callback
59
+  void*            cbArg;       // callback arg. for both matchCb and procCb.
60
+
61
 } cmSp_t;
61
 } cmSp_t;
62
 
62
 
63
 
63
 
81
   return kOkSpRC;  
81
   return kOkSpRC;  
82
 }
82
 }
83
 
83
 
84
-cmSpRC_t _cmScoreProcInit( cmCtx_t* ctx, cmSp_t* p, const cmChar_t* rsrcFn  )
84
+cmSpRC_t _cmScoreProcInit( cmCtx_t* ctx, cmSp_t* p, const cmChar_t* rsrcFn, cmScoreProcCb_t procCb, cmScMatcherCb_t matchCb, void* cbArg  )
85
 {
85
 {
86
   cmSpRC_t        rc     = kOkSpRC;
86
   cmSpRC_t        rc     = kOkSpRC;
87
   const cmChar_t* scFn   = NULL;
87
   const cmChar_t* scFn   = NULL;
88
   const cmChar_t* tlFn   = NULL;
88
   const cmChar_t* tlFn   = NULL;
89
   const cmChar_t* tlPrefixPath = NULL;
89
   const cmChar_t* tlPrefixPath = NULL;
90
 
90
 
91
-  p->srate = 96000;
92
-
93
   cmErrSetup(&p->err,&ctx->rpt,"ScoreProc");
91
   cmErrSetup(&p->err,&ctx->rpt,"ScoreProc");
94
 
92
 
95
   // open the resource file
93
   // open the resource file
129
   }
127
   }
130
 
128
 
131
 
129
 
130
+  // load the time-line file
131
+  if( cmTimeLineInitializeFromFile(ctx, &p->tlH, NULL, NULL, tlFn, tlPrefixPath ) != kOkTlRC )
132
+  {
133
+    rc = cmErrMsg(&p->err,kTimeLineFailSpRC,"Time line load failed for time line file:%s.",cmStringNullGuard(tlFn));
134
+    goto errLabel;
135
+  }
136
+
137
+  p->srate = cmTimeLineSampleRate(p->tlH);
138
+
132
   // load the score file
139
   // load the score file
133
   if( cmScoreInitialize(ctx, &p->scH, scFn, p->srate, NULL, 0, NULL, NULL, cmSymTblNullHandle ) != kOkScRC )
140
   if( cmScoreInitialize(ctx, &p->scH, scFn, p->srate, NULL, 0, NULL, NULL, cmSymTblNullHandle ) != kOkScRC )
134
   {
141
   {
136
     goto errLabel;
143
     goto errLabel;
137
   }
144
   }
138
 
145
 
139
-  // load the time-line file
140
-  if( cmTimeLineInitializeFromFile(ctx, &p->tlH, NULL, NULL, tlFn, tlPrefixPath ) != kOkTlRC )
146
+  p->ctx  = cmCtxAlloc(NULL, &ctx->rpt, cmLHeapNullHandle, cmSymTblNullHandle );
147
+  p->matchCb = matchCb;
148
+  p->procCb  = procCb;
149
+  p->cbArg   = cbArg;
150
+
151
+ errLabel:
152
+  return rc;
153
+}
154
+
155
+
156
+cmSpRC_t _cmScoreProcProcess(cmCtx_t* ctx, cmSp_t* sp)
157
+{
158
+  cmSpRC_t rc     = kOkSpRC;
159
+  unsigned midiN  = 7;
160
+  unsigned scWndN = 10;
161
+  unsigned seqN   = cmTimeLineSeqCount(sp->tlH);
162
+  double   srate  = cmTimeLineSampleRate(sp->tlH);
163
+  unsigned seqId;
164
+
165
+  assert( sp->srate == srate);
166
+
167
+  // allocate the score matcher
168
+  sp->match = cmScMatcherAlloc(sp->ctx,NULL,sp->srate,sp->scH,scWndN,midiN,sp->matchCb,sp->cbArg);
169
+  assert(sp->match != NULL );
170
+
171
+  
172
+  // for each time line sequence
173
+  for(seqId=0; seqId<seqN; ++seqId)
141
   {
174
   {
142
-    rc = cmErrMsg(&p->err,kTimeLineFailSpRC,"Time line load failed for time line file:%s.",cmStringNullGuard(tlFn));
143
-    goto errLabel;
175
+    cmTlObj_t* o0p = NULL;
176
+  
177
+    // for each 'marker' in this time line sequence
178
+    while(  (o0p = cmTimeLineNextTypeObj(sp->tlH, o0p, seqId, kMarkerTlId)) != NULL )
179
+    {
180
+      // get the 'marker' recd
181
+      cmTlMarker_t* markPtr = cmTimeLineMarkerObjPtr(sp->tlH,o0p);
182
+      assert( markPtr != NULL );
183
+
184
+      // if the marker does not have a valid start bar location
185
+      if( markPtr->bar == 0 )
186
+        continue;
187
+
188
+      // get the end-of-marker time as a sample index
189
+      unsigned markEndSmpIdx = markPtr->obj.seqSmpIdx + markPtr->obj.durSmpCnt;
190
+
191
+      // get the score event associated with the marker's bar number.
192
+      const cmScoreEvt_t* evtPtr = cmScoreBarEvt(sp->scH,markPtr->bar);
193
+      assert( evtPtr != NULL );
194
+
195
+
196
+      // get the score location associated with the markers bar score event
197
+      const cmScoreLoc_t* locPtr = cmScoreEvtLoc(sp->scH,evtPtr);
198
+      assert( locPtr != NULL );
199
+
200
+      cmRptPrintf(&ctx->rpt,"Processing loc:%i seq:%i %s %s\n",locPtr->index,seqId,cmStringNullGuard(markPtr->obj.name),cmStringNullGuard(markPtr->text));
201
+
202
+      // inform the score processor that we are about to start a new section
203
+      if( sp->procCb( sp->cbArg, sp, kBeginSectionSpId, markPtr ) != kOkSpRC )
204
+      {
205
+        cmErrMsg(&sp->err,kProcFailSpRC,"The score process object failed on reset.");
206
+        continue;
207
+      }
208
+
209
+      // reset the score matcher to begin searching at the bar location
210
+      if( cmScMatcherReset(sp->match, locPtr->index ) != cmOkRC )
211
+      {
212
+        cmErrMsg(&sp->err,kScoreMatchFailSpRC,"The score matcher reset failed on location: %i.",locPtr->index);
213
+        continue;
214
+      }
215
+
216
+      cmTlObj_t* o1p = o0p;
217
+
218
+      // as long as more MIDI events are available get the next MIDI msg 
219
+      while( (rc == kOkSpRC) && (o1p = cmTimeLineNextTypeObj(sp->tlH, o1p, seqId, kMidiEvtTlId )) != NULL )
220
+      {
221
+        cmTlMidiEvt_t* mep = cmTimeLineMidiEvtObjPtr(sp->tlH,o1p);
222
+        assert(mep != NULL );
223
+
224
+        // if the msg falls after the end of the marker then we are done
225
+        if( mep->obj.seqSmpIdx != cmInvalidIdx && mep->obj.seqSmpIdx > markEndSmpIdx )
226
+          break;
227
+        
228
+        // if the time line MIDI msg a note-on
229
+        if( mep->msg->status == kNoteOnMdId )
230
+        {
231
+          cmRC_t cmRC = cmScMatcherExec(sp->match, mep->obj.seqSmpIdx, mep->msg->status, mep->msg->u.chMsgPtr->d0, mep->msg->u.chMsgPtr->d1, NULL );
232
+
233
+          switch( cmRC )
234
+          {
235
+            case cmOkRC:         // continue processing MIDI events
236
+              break;
237
+
238
+            case cmEofRC:        // end of the score was encountered
239
+              break;
240
+
241
+            case cmInvalidArgRC: // p->eli was not set correctly
242
+              rc = cmErrMsg(&sp->err,kScoreMatchFailSpRC,"The score matcher failed due to an invalid argument.");
243
+              goto errLabel;
244
+              break;
245
+
246
+            case cmSubSysFailRC: // scan resync failed
247
+              rc = cmErrMsg(&sp->err,kScoreMatchFailSpRC,"The score matcher failed on resync.");
248
+              cmScMatcherPrint(sp->match);
249
+              //goto errLabel;
250
+              break;
251
+
252
+            default:
253
+              { assert(0); }
254
+          }
255
+        }
256
+      }
257
+
258
+      // inform the score processor that we done processing a section
259
+      if( sp->procCb( sp->cbArg, sp, kEndSectionSpId, NULL ) != kOkSpRC )
260
+        cmErrMsg(&sp->err,kProcFailSpRC,"The score process object failed on reset.");
261
+
262
+      rc = kOkSpRC;
263
+    }
144
   }
264
   }
145
 
265
 
146
-  p->ctx  = cmCtxAlloc(NULL, &ctx->rpt, cmLHeapNullHandle, cmSymTblNullHandle );
147
 
266
 
148
  errLabel:
267
  errLabel:
268
+
269
+
270
+  if( cmScMatcherFree(&sp->match) != cmOkRC )
271
+    cmErrMsg(&sp->err,kScoreMatchFailSpRC,"The score matcher release failed.");
272
+
149
   return rc;
273
   return rc;
150
 }
274
 }
151
 
275
 
169
   return rc;
293
   return rc;
170
 }
294
 }
171
 
295
 
172
-unsigned _cmScMeasSectCount( cmSp_t* sp )
173
-{
174
-  const _cmScMeas_t* mp = sp->list_beg;
175
-  unsigned n = 0;
176
-  for(; mp != NULL; mp=mp->link)
177
-    n += mp->setPtr->sectCnt;
178
-
179
-  return n;
180
-}
296
+//==================================================================================================
181
 
297
 
298
+typedef struct _cmSpMeas_t
299
+{
300
+  cmTlMarker_t*       markPtr;  // time-line marker in which this 'set' exists
301
+  cmScoreSet_t*       setPtr;   // score set on which this measurment is based
302
+  double              value;    // the value of the measurement
303
+  double              cost;     // the quality of the perf->score match 
304
+  struct _cmSpMeas_t* link;
305
+} _cmSpMeas_t;
182
 
306
 
307
+typedef struct
308
+{  
309
+  struct cmSp_str* sp;  
310
+  cmScMeas*        meas;         // performance analyzer 
311
+  cmTlMarker_t*    curMarkPtr;   //
312
+  _cmSpMeas_t*     list_beg;     //
313
+  _cmSpMeas_t*     list_end;     //
314
+  _cmSpMeas_t*     slist_beg;    //
315
+} _cmSpMeasProc_t;
183
 
316
 
184
 typedef struct
317
 typedef struct
185
 {
318
 {
192
   const cmChar_t* dstSectLabelStr;
325
   const cmChar_t* dstSectLabelStr;
193
   double          value;
326
   double          value;
194
   double          cost;
327
   double          cost;
195
-} _cmScMeasSect_t;
328
+} _cmSpMeasSect_t;
329
+
330
+unsigned _cmSpMeasSectCount( _cmSpMeasProc_t* m )
331
+{
332
+  const _cmSpMeas_t* mp = m->list_beg;
333
+  unsigned n = 0;
334
+  for(; mp != NULL; mp=mp->link)
335
+    n += mp->setPtr->sectCnt;
336
+
337
+  return n;
338
+}
196
 
339
 
197
-int _cmScMeasSectCompare( const void* p0, const void* p1 )
340
+int _cmSpMeasSectCompare( const void* p0, const void* p1 )
198
 {
341
 {
199
-  _cmScMeasSect_t* m0 = (_cmScMeasSect_t*)p0;
200
-  _cmScMeasSect_t* m1 = (_cmScMeasSect_t*)p1;
342
+  _cmSpMeasSect_t* m0 = (_cmSpMeasSect_t*)p0;
343
+  _cmSpMeasSect_t* m1 = (_cmSpMeasSect_t*)p1;
201
 
344
 
202
   return (int)m0->dstScLocIdx - (int)m1->dstScLocIdx;
345
   return (int)m0->dstScLocIdx - (int)m1->dstScLocIdx;
203
 }
346
 }
204
 
347
 
205
-cmSpRC_t _cmScWriteMeasFile( cmCtx_t* ctx, cmSp_t* sp, const cmChar_t* outFn )
348
+cmSpRC_t _cmScWriteMeasFile( cmCtx_t* ctx, cmSp_t* sp, _cmSpMeasProc_t* m, const cmChar_t* outFn )
206
 {
349
 {
207
   cmFileH_t fH = cmFileNullHandle;
350
   cmFileH_t fH = cmFileNullHandle;
208
   cmSpRC_t rc = kOkSpRC;
351
   cmSpRC_t rc = kOkSpRC;
209
   unsigned i,j,k;
352
   unsigned i,j,k;
210
-  _cmScMeas_t* mp = sp->list_beg;
353
+  _cmSpMeas_t* mp = m->list_beg;
211
 
354
 
212
-  unsigned scnt = _cmScMeasSectCount(sp);
213
-  _cmScMeasSect_t sarray[ scnt ];
355
+  unsigned scnt = _cmSpMeasSectCount(m);
356
+  _cmSpMeasSect_t sarray[ scnt ];
214
   for(i=0,k=0; k<scnt && mp!=NULL; ++i,mp=mp->link)
357
   for(i=0,k=0; k<scnt && mp!=NULL; ++i,mp=mp->link)
215
   {
358
   {
216
     const cmChar_t* typeLabel = NULL;
359
     const cmChar_t* typeLabel = NULL;
225
 
368
 
226
     for(j=0; j<mp->setPtr->sectCnt; ++j,++k)
369
     for(j=0; j<mp->setPtr->sectCnt; ++j,++k)
227
     {
370
     {
228
-      _cmScMeasSect_t* r = sarray + k;
371
+      _cmSpMeasSect_t* r = sarray + k;
229
 
372
 
230
         r->srcSeqId        = mp->markPtr->obj.seqId,
373
         r->srcSeqId        = mp->markPtr->obj.seqId,
231
         r->srcMarkNameStr  = cmStringNullGuard(mp->markPtr->obj.name),
374
         r->srcMarkNameStr  = cmStringNullGuard(mp->markPtr->obj.name),
242
 
385
 
243
   assert(mp==NULL && k==scnt);
386
   assert(mp==NULL && k==scnt);
244
 
387
 
245
-  qsort(sarray,scnt,sizeof(sarray[0]),_cmScMeasSectCompare);
388
+  qsort(sarray,scnt,sizeof(sarray[0]),_cmSpMeasSectCompare);
246
 
389
 
247
   if( cmFileOpen(&fH,outFn,kWriteFileFl,&ctx->rpt) != kOkFileRC )
390
   if( cmFileOpen(&fH,outFn,kWriteFileFl,&ctx->rpt) != kOkFileRC )
248
   {
391
   {
254
 
397
 
255
   for(i=0; i<scnt; ++i)
398
   for(i=0; i<scnt; ++i)
256
   {
399
   {
257
-    _cmScMeasSect_t* r = sarray + i;
400
+    _cmSpMeasSect_t* r = sarray + i;
258
 
401
 
259
       cmFilePrintf(fH,"[  \"%s\"  \"%s\"  %f %f  %i %i %i \"%s\" %i ]\n",
402
       cmFilePrintf(fH,"[  \"%s\"  \"%s\"  %f %f  %i %i %i \"%s\" %i ]\n",
260
         r->dstSectLabelStr,
403
         r->dstSectLabelStr,
300
   return rc;
443
   return rc;
301
 }
444
 }
302
 
445
 
303
-
304
-void _cmScMatchCb( cmScMatcher* p, void* arg, cmScMatcherResult_t* rp )
446
+// score matcher callback
447
+void _cmSpMatchMeasCb( cmScMatcher* p, void* arg, cmScMatcherResult_t* rp )
305
 {
448
 {
306
-  cmSp_t*   sp = (cmSp_t*)arg;
307
-  cmScMeas* sm = sp->meas;
449
+  _cmSpMeasProc_t* m  = (_cmSpMeasProc_t*)arg;
450
+  cmScMeas*        sm = m->meas;
308
 
451
 
309
   if( cmScMeasExec(sm, rp->mni, rp->locIdx, rp->scEvtIdx, rp->flags, rp->smpIdx, rp->pitch, rp->vel ) == cmOkRC )
452
   if( cmScMeasExec(sm, rp->mni, rp->locIdx, rp->scEvtIdx, rp->flags, rp->smpIdx, rp->pitch, rp->vel ) == cmOkRC )
310
   {
453
   {
313
       // ignore set's which did not produce a valid value
456
       // ignore set's which did not produce a valid value
314
       if(sm->set[i].value != DBL_MAX )
457
       if(sm->set[i].value != DBL_MAX )
315
       {
458
       {
316
-        _cmScMeas_t* r = cmMemAllocZ(_cmScMeas_t,1);
317
-        r->markPtr = sp->curMarkPtr;
459
+        _cmSpMeas_t* r = cmMemAllocZ(_cmSpMeas_t,1);
460
+        r->markPtr = m->curMarkPtr;
318
         r->setPtr  = sm->set[i].sp;
461
         r->setPtr  = sm->set[i].sp;
319
         r->value   = sm->set[i].value;
462
         r->value   = sm->set[i].value;
320
         r->cost    = sm->set[i].match_cost;
463
         r->cost    = sm->set[i].match_cost;
321
 
464
 
322
-        if( sp->list_beg == NULL )
465
+        if( m->list_beg == NULL )
323
         {
466
         {
324
-          sp->list_beg = r;
325
-          sp->list_end = r;
467
+          m->list_beg = r;
468
+          m->list_end = r;
326
         }
469
         }
327
         else
470
         else
328
         {
471
         {
329
-          sp->list_end->link = r;
330
-          sp->list_end       = r;
472
+          m->list_end->link = r;
473
+          m->list_end       = r;
331
         }
474
         }
332
       }    
475
       }    
333
   }
476
   }
334
 }
477
 }
335
 
478
 
336
-
337
-cmSpRC_t _cmScoreGenAllMeasurements(cmCtx_t* ctx, cmSp_t* sp, const cmChar_t* outFn)
479
+// measurement proc callback
480
+cmSpRC_t  _cmSpProcMeasCb( void* arg, cmSp_t* sp, cmScoreProcSelId_t id, cmTlMarker_t* curMarkPtr )
338
 {
481
 {
339
-  cmSpRC_t rc     = kOkSpRC;
340
-  unsigned midiN  = 7;
341
-  unsigned scWndN = 10;
342
-  unsigned seqN   = cmTimeLineSeqCount(sp->tlH);
343
-  double   srate  = cmTimeLineSampleRate(sp->tlH);
344
-  unsigned seqId;
482
+  cmSpRC_t         rc = kOkSpRC;
483
+  _cmSpMeasProc_t* m = (_cmSpMeasProc_t*)arg;
345
 
484
 
346
-  assert( sp->srate == srate);
347
-
348
-  // allocate the performance eval. object
349
-  sp->meas = cmScMeasAlloc( sp->ctx, NULL, sp->scH, sp->srate, sp->dynArray, sp->dynCnt );
350
-  assert( sp->meas != NULL );
351
-
352
-  // allocate the score matcher
353
-  sp->match = cmScMatcherAlloc(sp->ctx,NULL,sp->srate,sp->scH,scWndN,midiN,_cmScMatchCb,sp);
354
-  assert(sp->match != NULL );
355
-
356
-  
357
-  // for each time line sequence
358
-  for(seqId=0; seqId<seqN; ++seqId)
485
+  switch( id )
359
   {
486
   {
360
-    cmTlObj_t* o0p = NULL;
361
-  
362
-    // for each 'marker' in this time line sequence
363
-    while(  (o0p = cmTimeLineNextTypeObj(sp->tlH, o0p, seqId, kMarkerTlId)) != NULL )
364
-    {
365
-      // get the 'marker' recd
366
-      cmTlMarker_t* markPtr = cmTimeLineMarkerObjPtr(sp->tlH,o0p);
367
-      assert( markPtr != NULL );
368
-
369
-      // if the marker does not have a valid start bar location
370
-      if( markPtr->bar == 0 )
371
-        continue;
372
-
373
-      // set the marker ptr (which is used in _cmScMatchCb())
374
-      sp->curMarkPtr = markPtr;
375
-
376
-      // get the end-of-marker time as a sample index
377
-      unsigned markEndSmpIdx = markPtr->obj.seqSmpIdx + markPtr->obj.durSmpCnt;
378
-
379
-      // get the score event associated with the marker's bar number.
380
-      const cmScoreEvt_t* evtPtr = cmScoreBarEvt(sp->scH,markPtr->bar);
381
-      assert( evtPtr != NULL );
382
-
383
-
384
-      // get the score location associated with the markers bar score event
385
-      const cmScoreLoc_t* locPtr = cmScoreEvtLoc(sp->scH,evtPtr);
386
-      assert( locPtr != NULL );
387
-
388
-      cmRptPrintf(&ctx->rpt,"Processing loc:%i seq:%i %s %s\n",locPtr->index,seqId,cmStringNullGuard(markPtr->obj.name),cmStringNullGuard(markPtr->text));
487
+    case kBeginSectionSpId:
389
 
488
 
390
       // reset the performance evaluation object
489
       // reset the performance evaluation object
391
-      if( cmScMeasReset(sp->meas) != cmOkRC )
392
-      {
393
-        cmErrMsg(&sp->err,kScoreMatchFailSpRC,"The score performance evaluation object failed on reset.");
394
-        continue;
395
-      }
396
-      
397
-      // reset the score matcher to begin searching at the bar location
398
-      if( cmScMatcherReset(sp->match, locPtr->index ) != cmOkRC )
399
-      {
400
-        cmErrMsg(&sp->err,kScoreMatchFailSpRC,"The score matcher reset failed on location: %i.",locPtr->index);
401
-        continue;
402
-      }
403
-
404
-      cmTlObj_t* o1p = o0p;
490
+      if( cmScMeasReset(m->meas) != cmOkRC )
491
+        rc = cmErrMsg(&sp->err,kScoreMatchFailSpRC,"The score performance evaluation object failed on reset.");
405
 
492
 
406
-      // as long as more MIDI events are available get the next MIDI msg 
407
-      while( (rc == kOkSpRC) && (o1p = cmTimeLineNextTypeObj(sp->tlH, o1p, seqId, kMidiEvtTlId )) != NULL )
408
-      {
409
-        cmTlMidiEvt_t* mep = cmTimeLineMidiEvtObjPtr(sp->tlH,o1p);
410
-        assert(mep != NULL );
493
+      m->curMarkPtr = curMarkPtr;
494
+      break;
411
 
495
 
412
-        // if the msg falls after the end of the marker then we are done
413
-        if( mep->obj.seqSmpIdx != cmInvalidIdx && mep->obj.seqSmpIdx > markEndSmpIdx )
414
-          break;
496
+    case kEndSectionSpId:
497
+      break;
498
+  }
415
 
499
 
416
-        
417
-        // if the time line MIDI msg a note-on
418
-        if( mep->msg->status == kNoteOnMdId )
419
-        {
420
-          cmRC_t cmRC = cmScMatcherExec(sp->match, mep->obj.seqSmpIdx, mep->msg->status, mep->msg->u.chMsgPtr->d0, mep->msg->u.chMsgPtr->d1, NULL );
500
+  return rc;
501
+}
421
 
502
 
422
-          switch( cmRC )
423
-          {
424
-            case cmOkRC:         // continue processing MIDI events
425
-              break;
426
 
503
 
427
-            case cmEofRC:        // end of the score was encountered
428
-              break;
504
+cmSpRC_t _cmScoreProcGenAllMeasurementsMain(cmCtx_t* ctx)
505
+{
506
+  const cmChar_t*  rsrcFn = "/home/kevin/.kc/time_line.js";
507
+  const cmChar_t*  outFn  = "/home/kevin/src/cmkc/src/kc/data/meas0.js";
429
 
508
 
430
-            case cmInvalidArgRC: // p->eli was not set correctly
431
-              rc = cmErrMsg(&sp->err,kScoreMatchFailSpRC,"The score matcher failed due to an invalid argument.");
432
-              goto errLabel;
433
-              break;
509
+  cmSpRC_t         rc = kOkSpRC;
510
+  _cmSpMeasProc_t* m  = cmMemAllocZ(_cmSpMeasProc_t,1);
511
+  cmSp_t           s;
512
+  cmSp_t*          sp = &s;
434
 
513
 
435
-            case cmSubSysFailRC: // scan resync failed
436
-              rc = cmErrMsg(&sp->err,kScoreMatchFailSpRC,"The score matcher failed on resync.");
437
-              cmScMatcherPrint(sp->match);
438
-              //goto errLabel;
439
-              break;
514
+  memset(sp,0,sizeof(s));
440
 
515
 
441
-            default:
442
-              { assert(0); }
443
-          }
444
-        }
445
-      }
516
+  cmRptPrintf(&ctx->rpt,"Score Performance Evaluation Start\n");
446
 
517
 
447
-      rc = kOkSpRC;
448
-    }
449
-  }
518
+  // initialize the score processor
519
+  if((rc = _cmScoreProcInit(ctx,sp,rsrcFn,_cmSpProcMeasCb,_cmSpMatchMeasCb,m)) != kOkSpRC )
520
+    goto errLabel;
450
 
521
 
522
+  // allocate the performance evaluation measurement object
523
+  m->meas     = cmScMeasAlloc( sp->ctx, NULL, sp->scH, sp->srate, sp->dynArray, sp->dynCnt );
524
+  m->sp       = sp;
451
 
525
 
452
- errLabel:
526
+  // run the score processor
527
+  _cmScoreProcProcess(ctx,sp);
453
 
528
 
454
-  if((rc = _cmScWriteMeasFile(ctx, sp, outFn )) != kOkSpRC )
529
+  // write the results of the performance evaluation
530
+  if((rc = _cmScWriteMeasFile(ctx, sp, m, outFn )) != kOkSpRC )
455
     cmErrMsg(&sp->err,kFileFailSpRC,"The measurement output did not complete without errors."); 
531
     cmErrMsg(&sp->err,kFileFailSpRC,"The measurement output did not complete without errors."); 
456
 
532
 
457
-  _cmScMeas_t* mp = sp->list_beg;
533
+  // free the measurement linked list
534
+  _cmSpMeas_t* mp = m->list_beg;
458
   while(mp!=NULL)
535
   while(mp!=NULL)
459
   {
536
   {
460
-    _cmScMeas_t* np = mp->link;
537
+    _cmSpMeas_t* np = mp->link;
461
     cmMemFree(mp);
538
     cmMemFree(mp);
462
     mp = np;
539
     mp = np;
463
   }
540
   }
464
 
541
 
465
-  if( cmScMatcherFree(&sp->match) != cmOkRC )
466
-    cmErrMsg(&sp->err,kScoreMatchFailSpRC,"The score matcher release failed.");
467
-
468
-  if( cmScMeasFree(&sp->meas) != cmOkRC )
542
+  // free the performance evaluation object
543
+  if( cmScMeasFree(&m->meas) != cmOkRC )
469
     cmErrMsg(&sp->err,kScoreMatchFailSpRC,"The performance evaluation object failed.");
544
     cmErrMsg(&sp->err,kScoreMatchFailSpRC,"The performance evaluation object failed.");
470
 
545
 
546
+  //cmScorePrint(sp.scH,&ctx->rpt);
547
+  //cmScorePrintLoc(sp.scH);
548
+
549
+ 
550
+ errLabel:
551
+  _cmScoreProcFinal(sp);
552
+
553
+  cmMemFree(m);
554
+
555
+  cmRptPrintf(&ctx->rpt,"Score Proc End\n");
471
 
556
 
472
   return rc;
557
   return rc;
558
+  
473
 }
559
 }
474
 
560
 
475
-
476
 //==================================================================================================
561
 //==================================================================================================
562
+typedef struct
563
+{
564
+  cmSp_t* sp; 
565
+} cmSpPerfProc_t;
477
 
566
 
478
-unsigned cmScoreProc(cmCtx_t* ctx)
567
+void _cmSpMatchPerfCb( cmScMatcher* p, void* arg, cmScMatcherResult_t* rp )
568
+{
569
+  cmSpPerfProc_t* m = (cmSpPerfProc_t*)arg;
570
+  
571
+}
572
+
573
+cmSpRC_t  _cmSpProcPerfCb( void* arg, cmSp_t* sp, cmScoreProcSelId_t id, cmTlMarker_t* curMarkPtr )
574
+{
575
+  cmSpPerfProc_t* m = (cmSpPerfProc_t*)arg;
576
+
577
+}
578
+
579
+cmSpRC_t _cmScoreProcGenPerfMain(cmCtx_t* ctx)
479
 {
580
 {
480
-  cmSpRC_t rc = kOkSpRC;
481
   const cmChar_t* rsrcFn = "/home/kevin/.kc/time_line.js";
581
   const cmChar_t* rsrcFn = "/home/kevin/.kc/time_line.js";
482
   const cmChar_t* outFn  = "/home/kevin/src/cmkc/src/kc/data/meas0.js";
582
   const cmChar_t* outFn  = "/home/kevin/src/cmkc/src/kc/data/meas0.js";
483
-  cmSp_t sp;
484
 
583
 
485
-  memset(&sp,0,sizeof(sp));
584
+  cmSpRC_t        rc     = kOkSpRC;
585
+  cmSpPerfProc_t* m      = cmMemAllocZ(cmSpPerfProc_t,1);
586
+  cmSp_t          s;
587
+  cmSp_t*         sp     = &s;
588
+
589
+  memset(sp,0,sizeof(s));
486
 
590
 
487
-  cmRptPrintf(&ctx->rpt,"Score Proc Start\n");
591
+  cmRptPrintf(&ctx->rpt,"Score Performance Start\n");
488
 
592
 
489
-  if((rc = _cmScoreProcInit(ctx,&sp,rsrcFn)) != kOkSpRC )
593
+  // initialize the score processor
594
+  if((rc = _cmScoreProcInit(ctx,sp,rsrcFn,_cmSpProcPerfCb,_cmSpMatchPerfCb,m)) != kOkSpRC )
490
     goto errLabel;
595
     goto errLabel;
491
-  
492
-  _cmScoreGenAllMeasurements(ctx,&sp,outFn);
596
+
597
+  m->sp = sp;
598
+
599
+  // run the score processor
600
+  _cmScoreProcProcess(ctx,sp);
601
+
602
+  // write the results of the performance evaluation
603
+  if((rc = _cmScWriteMeasFile(ctx, sp, m, outFn )) != kOkSpRC )
604
+    cmErrMsg(&sp->err,kFileFailSpRC,"The measurement output did not complete without errors."); 
493
 
605
 
494
   //cmScorePrint(sp.scH,&ctx->rpt);
606
   //cmScorePrint(sp.scH,&ctx->rpt);
495
   //cmScorePrintLoc(sp.scH);
607
   //cmScorePrintLoc(sp.scH);
496
-
497
  
608
  
498
  errLabel:
609
  errLabel:
499
-  _cmScoreProcFinal(&sp);
610
+  _cmScoreProcFinal(sp);
611
+
612
+  cmMemFree(m);
500
 
613
 
501
   cmRptPrintf(&ctx->rpt,"Score Proc End\n");
614
   cmRptPrintf(&ctx->rpt,"Score Proc End\n");
502
 
615
 
504
   
617
   
505
 }
618
 }
506
 
619
 
620
+
621
+
622
+//==================================================================================================
623
+
624
+cmSpRC_t cmScoreProc(cmCtx_t* ctx)
625
+{
626
+  cmSpRC_t rc = kOkSpRC;
627
+
628
+  _cmScoreProcGenAllMeasurementsMain(ctx);
629
+
630
+  return rc;
631
+  
632
+}
633
+

Loading…
Cancel
Save