Browse Source

cmScore.c/h Added score display to gv. Many changes.

master
kevin 11 years ago
parent
commit
b096ef30d7
2 changed files with 118 additions and 15 deletions
  1. 86
    12
      app/cmScore.c
  2. 32
    3
      app/cmScore.h

+ 86
- 12
app/cmScore.c View File

60
   cmScoreEvt_t* array;
60
   cmScoreEvt_t* array;
61
   unsigned      cnt;
61
   unsigned      cnt;
62
   cmCsvH_t      cH;
62
   cmCsvH_t      cH;
63
+  cmScCb_t      cbFunc;
64
+  void*         cbArg;
65
+  cmChar_t*     fn;
63
 } cmSc_t;
66
 } cmSc_t;
64
 
67
 
65
 cmScEvtRef_t _cmScEvtRefArray[] = 
68
 cmScEvtRef_t _cmScEvtRefArray[] = 
111
   return kInvalidEvtScId;
114
   return kInvalidEvtScId;
112
 }
115
 }
113
 
116
 
114
-const cmChar_t* _cmScEvtTypeIdToLabel( unsigned id )
117
+const cmChar_t* cmScEvtTypeIdToLabel( unsigned id )
115
 {
118
 {
116
   cmScEvtRef_t* r = _cmScEvtRefArray;
119
   cmScEvtRef_t* r = _cmScEvtRefArray;
117
   for(; r->id != kInvalidEvtScId; ++r )
120
   for(; r->id != kInvalidEvtScId; ++r )
129
   return kInvalidDynScId;
132
   return kInvalidDynScId;
130
 }
133
 }
131
 
134
 
132
-const cmChar_t* _cmScDynIdToLabel( unsigned id )
135
+const cmChar_t* cmScDynIdToLabel( unsigned id )
133
 {
136
 {
134
   cmScEvtRef_t* r = _cmScDynRefArray;
137
   cmScEvtRef_t* r = _cmScDynRefArray;
135
   for(; r->id != kInvalidDynScId; ++r )
138
   for(; r->id != kInvalidDynScId; ++r )
173
   if( cmCsvFinalize(&p->cH) != kOkCsvRC )
176
   if( cmCsvFinalize(&p->cH) != kOkCsvRC )
174
     return rc;
177
     return rc;
175
 
178
 
179
+  cmMemFree(p->fn);
176
   cmMemFree(p->array);
180
   cmMemFree(p->array);
177
   cmMemFree(p);
181
   cmMemFree(p);
178
   return rc;
182
   return rc;
179
 }
183
 }
180
 
184
 
181
-cmScRC_t _cmScParseBar( cmSc_t* p, unsigned rowIdx, int* barNumb )
185
+cmScRC_t _cmScParseBar( cmSc_t* p, unsigned rowIdx, cmScoreEvt_t* s, int* barNumb )
182
 {
186
 {
183
   if((*barNumb = cmCsvCellInt(p->cH,rowIdx,kBarColScIdx)) == INT_MAX )
187
   if((*barNumb = cmCsvCellInt(p->cH,rowIdx,kBarColScIdx)) == INT_MAX )
184
     return cmErrMsg(&p->err,kSyntaxErrScRC,"Unable to parse the bar number.");
188
     return cmErrMsg(&p->err,kSyntaxErrScRC,"Unable to parse the bar number.");
189
+
190
+  s->type    = kBarEvtScId;
191
+  s->dsecs   = 0;
192
+  s->barNumb = *barNumb;
185
   return kOkScRC;
193
   return kOkScRC;
186
 }
194
 }
187
 
195
 
223
   }
231
   }
224
 
232
 
225
   s->type       = kNonEvtScId;
233
   s->type       = kNonEvtScId;
234
+  s->dsecs      = dsecs;
226
   s->pitch      = midiPitch;
235
   s->pitch      = midiPitch;
227
   s->flags      = flags;
236
   s->flags      = flags;
228
   s->dynVal     = dynVal; 
237
   s->dynVal     = dynVal; 
235
 cmScRC_t _cmScParseFile( cmSc_t* p, cmCtx_t* ctx, const cmChar_t* fn )
244
 cmScRC_t _cmScParseFile( cmSc_t* p, cmCtx_t* ctx, const cmChar_t* fn )
236
 {
245
 {
237
   cmScRC_t rc = kOkScRC;
246
   cmScRC_t rc = kOkScRC;
238
-  unsigned barNoteIdx;
239
-  int      barNumb;
247
+  unsigned barNoteIdx = 0;
248
+  int      barEvtIdx = cmInvalidIdx;
249
+  int      barNumb   = 0;
250
+  double   secs;
240
 
251
 
241
   if( cmCsvInitialize(&p->cH, ctx ) != kOkCsvRC )
252
   if( cmCsvInitialize(&p->cH, ctx ) != kOkCsvRC )
242
   {
253
   {
280
       break;
291
       break;
281
     }
292
     }
282
 
293
 
283
-    
294
+    secs = DBL_MAX;
295
+
284
     switch(tid)
296
     switch(tid)
285
     {
297
     {
286
       case kBarEvtScId:
298
       case kBarEvtScId:
287
         // parse bar lines
299
         // parse bar lines
288
-        if((rc = _cmScParseBar(p,i,&barNumb)) == kOkScRC )
300
+        if((rc = _cmScParseBar(p,i,p->array+j,&barNumb)) == kOkScRC )
301
+        {
289
           barNoteIdx = 0;
302
           barNoteIdx = 0;
303
+          barEvtIdx  = j;
304
+          ++j;
305
+        }
290
         break;
306
         break;
291
 
307
 
292
       case kNonEvtScId:
308
       case kNonEvtScId:
293
         // parse note-on events
309
         // parse note-on events
294
         if((rc =  _cmScParseNoteOn(p, i, p->array + j, barNumb, barNoteIdx )) == kOkScRC )
310
         if((rc =  _cmScParseNoteOn(p, i, p->array + j, barNumb, barNoteIdx )) == kOkScRC )
295
         {
311
         {
312
+          secs = p->array[j].dsecs;
296
           if( cmIsFlag(p->array[j].flags,kSkipScFl) == false )
313
           if( cmIsFlag(p->array[j].flags,kSkipScFl) == false )
297
             ++j;
314
             ++j;
298
 
315
 
301
         break;
318
         break;
302
 
319
 
303
       default:
320
       default:
321
+        // Returns DBL_MAX on error.
322
+        secs =  cmCsvCellDouble(p->cH, i, kDSecsColScIdx );
304
         break;
323
         break;
305
     }
324
     }
306
     
325
     
326
+    // the bar lines don't have times so set the time of the bar line to the
327
+    // time of the first event in the bar.
328
+    if( barEvtIdx != cmInvalidIdx && secs != DBL_MAX )
329
+    {
330
+      assert( p->array[ barEvtIdx ].type == kBarEvtScId );
331
+      p->array[ barEvtIdx ].dsecs = secs;
332
+      barEvtIdx = cmInvalidIdx;
333
+    }
334
+    
307
   }
335
   }
308
 
336
 
309
   if( rc == kSyntaxErrScRC )
337
   if( rc == kSyntaxErrScRC )
319
   return rc;
347
   return rc;
320
 }
348
 }
321
 
349
 
322
-cmScRC_t cmScoreInitialize( cmCtx_t* ctx, cmScH_t* hp, const cmChar_t* fn )
350
+cmScRC_t cmScoreInitialize( cmCtx_t* ctx, cmScH_t* hp, const cmChar_t* fn, cmScCb_t cbFunc, void* cbArg )
323
 {
351
 {
324
   cmScRC_t rc = kOkScRC;
352
   cmScRC_t rc = kOkScRC;
325
   if((rc = cmScoreFinalize(hp)) != kOkScRC )
353
   if((rc = cmScoreFinalize(hp)) != kOkScRC )
332
   if((rc = _cmScParseFile(p,ctx,fn)) != kOkScRC )
360
   if((rc = _cmScParseFile(p,ctx,fn)) != kOkScRC )
333
     goto errLabel;
361
     goto errLabel;
334
 
362
 
363
+  p->cbFunc = cbFunc;
364
+  p->cbArg  = cbArg;
365
+  p->fn     = cmMemAllocStr(fn);
366
+
335
   hp->h = p;
367
   hp->h = p;
336
 
368
 
337
  errLabel:
369
  errLabel:
358
   return rc;
390
   return rc;
359
 }
391
 }
360
 
392
 
393
+const cmChar_t* cmScoreFileName( cmScH_t h )
394
+{
395
+  cmSc_t* p = _cmScHandleToPtr(h);
396
+  return p->fn;
397
+}
398
+
361
 bool     cmScoreIsValid( cmScH_t h )
399
 bool     cmScoreIsValid( cmScH_t h )
362
 { return h.h != NULL; }
400
 { return h.h != NULL; }
363
 
401
 
378
   return p->array + idx;
416
   return p->array + idx;
379
 }
417
 }
380
 
418
 
419
+cmScRC_t      cmScoreSeqNotify( cmScH_t h )
420
+{
421
+  cmScRC_t  rc = kOkScRC;
422
+  cmSc_t*   p  = _cmScHandleToPtr(h);
423
+  cmScMsg_t m;
424
+  unsigned  i;
425
+
426
+  if( p->cbFunc != NULL )
427
+  {
428
+    memset(&m.evt,0,sizeof(m.evt));
429
+    m.typeId = kBeginMsgScId;
430
+    p->cbFunc(p->cbArg,&m,sizeof(m));
431
+
432
+    m.typeId = kEventMsgScId;
433
+    for(i=0; i<p->cnt; ++i)
434
+    {
435
+      m.evt = p->array[i];
436
+      p->cbFunc(p->cbArg,&m,sizeof(m));
437
+    }
438
+
439
+    memset(&m.evt,0,sizeof(m.evt));
440
+    m.typeId = kEndMsgScId;
441
+    p->cbFunc(p->cbArg,&m,sizeof(m));
442
+
443
+  }
444
+  return rc;
445
+}
446
+
447
+cmScRC_t      cmScoreDecode( const void* msg, unsigned msgByteCnt, cmScMsg_t* m)
448
+{
449
+  cmScMsg_t* mp = (cmScMsg_t*)msg;
450
+  *m = *mp;
451
+  return kOkScRC;
452
+}
453
+
454
+
381
 void cmScorePrint( cmScH_t h, cmRpt_t* rpt )
455
 void cmScorePrint( cmScH_t h, cmRpt_t* rpt )
382
 {
456
 {
383
   cmSc_t* p = _cmScHandleToPtr(h);
457
   cmSc_t* p = _cmScHandleToPtr(h);
392
           i,
466
           i,
393
           r->barNumb,
467
           r->barNumb,
394
           r->barNoteIdx,
468
           r->barNoteIdx,
395
-          _cmScEvtTypeIdToLabel(r->type),
469
+          cmScEvtTypeIdToLabel(r->type),
396
           r->pitch,
470
           r->pitch,
397
           cmIsFlag(r->flags,kEvenScFl)  ? 'e' : ' ',
471
           cmIsFlag(r->flags,kEvenScFl)  ? 'e' : ' ',
398
           cmIsFlag(r->flags,kTempoScFl) ? 't' : ' ',
472
           cmIsFlag(r->flags,kTempoScFl) ? 't' : ' ',
399
           cmIsFlag(r->flags,kDynScFl)   ? 'd' : ' ',
473
           cmIsFlag(r->flags,kDynScFl)   ? 'd' : ' ',
400
-          cmIsFlag(r->flags,kDynScFl)   ? _cmScDynIdToLabel(r->dynVal) : "");          
474
+          cmIsFlag(r->flags,kDynScFl)   ? cmScDynIdToLabel(r->dynVal) : "");          
401
         break;
475
         break;
402
 
476
 
403
       default:
477
       default:
603
 
677
 
604
   if(1)
678
   if(1)
605
   {
679
   {
606
-    if((rc = cmScoreInitialize(ctx,&scH,scoreCsvFn))  != kOkScRC )
680
+    if((rc = cmScoreInitialize(ctx,&scH,scoreCsvFn,NULL,NULL))  != kOkScRC )
607
       goto errLabel;
681
       goto errLabel;
608
 
682
 
609
 
683
 
626
 void cmScoreTest( cmCtx_t* ctx, const cmChar_t* fn )
700
 void cmScoreTest( cmCtx_t* ctx, const cmChar_t* fn )
627
 {
701
 {
628
   cmScH_t h = cmScNullHandle;
702
   cmScH_t h = cmScNullHandle;
629
-  if( cmScoreInitialize(ctx,&h,fn) != kOkScRC )
703
+  if( cmScoreInitialize(ctx,&h,fn,NULL,NULL) != kOkScRC )
630
     return;
704
     return;
631
 
705
 
632
   cmScorePrint(h,&ctx->rpt);
706
   cmScorePrint(h,&ctx->rpt);

+ 32
- 3
app/cmScore.h View File

51
     unsigned     barNoteIdx;   // index of this note in this bar
51
     unsigned     barNoteIdx;   // index of this note in this bar
52
   } cmScoreEvt_t;
52
   } cmScoreEvt_t;
53
 
53
 
54
+  typedef void (*cmScCb_t)( void* arg, const void* data, unsigned byteCnt );
54
 
55
 
55
   typedef cmRC_t     cmScRC_t;
56
   typedef cmRC_t     cmScRC_t;
56
   typedef cmHandle_t cmScH_t;
57
   typedef cmHandle_t cmScH_t;
58
+
59
+  typedef void (*cmScCb_t)( void* arg, const void* data, unsigned byteCnt );
57
   
60
   
58
   extern cmScH_t cmScNullHandle;
61
   extern cmScH_t cmScNullHandle;
59
 
62
 
63
+  const cmChar_t* cmScEvtTypeIdToLabel( unsigned id );
64
+  const cmChar_t* cmScDynIdToLabel( unsigned id );
65
+
66
+
60
   // Initialize a score object from a CSV File generated from a score spreadsheet.
67
   // Initialize a score object from a CSV File generated from a score spreadsheet.
61
-  cmScRC_t      cmScoreInitialize( cmCtx_t* ctx, cmScH_t* hp, const cmChar_t* fn );
62
-  cmScRC_t      cmScoreFinalize( cmScH_t* hp );
68
+  cmScRC_t      cmScoreInitialize( cmCtx_t* ctx, cmScH_t* hp, const cmChar_t* fn, cmScCb_t cbFunc, void* cbArg );
69
+  cmScRC_t      cmScoreFinalize(   cmScH_t* hp );
70
+
71
+  // Filename of last successfuly loaded score file.
72
+  const cmChar_t* cmScoreFileName( cmScH_t h );
63
 
73
 
64
   bool          cmScoreIsValid( cmScH_t h );
74
   bool          cmScoreIsValid( cmScH_t h );
65
 
75
 
67
   unsigned      cmScoreEvtCount( cmScH_t h );
77
   unsigned      cmScoreEvtCount( cmScH_t h );
68
   cmScoreEvt_t* cmScoreEvt( cmScH_t h, unsigned idx );
78
   cmScoreEvt_t* cmScoreEvt( cmScH_t h, unsigned idx );
69
 
79
 
80
+
81
+  cmScRC_t      cmScoreSeqNotify( cmScH_t h );
82
+  
83
+  typedef enum
84
+  {
85
+    kInvalidMsgScId,
86
+    kBeginMsgScId,
87
+    kEventMsgScId,
88
+    kEndMsgScId
89
+  } cmScMsgTypeId_t;
90
+
91
+  typedef struct
92
+  {
93
+    cmScMsgTypeId_t typeId;
94
+    cmScoreEvt_t    evt;    // only used when typeId == kEventMsgScId
95
+  } cmScMsg_t;
96
+
97
+  cmScRC_t      cmScoreDecode( const void* msg, unsigned msgByteCnt, cmScMsg_t* );
98
+
70
   void          cmScorePrint( cmScH_t h, cmRpt_t* rpt );
99
   void          cmScorePrint( cmScH_t h, cmRpt_t* rpt );
71
 
100
 
72
   cmScRC_t      cmScoreSyncTimeLine( cmScH_t scH, cmTlH_t tlH, unsigned editDistWndCnt, cmReal_t maxNoteOffsetSecs );
101
   cmScRC_t      cmScoreSyncTimeLine( cmScH_t scH, cmTlH_t tlH, unsigned editDistWndCnt, cmReal_t maxNoteOffsetSecs );
73
 
102
 
74
   cmScRC_t      cmScoreSyncTimeLineTest( cmCtx_t* ctx,  const cmChar_t* timeLineJsFn, const cmChar_t* scoreCsvFn );
103
   cmScRC_t      cmScoreSyncTimeLineTest( cmCtx_t* ctx,  const cmChar_t* timeLineJsFn, const cmChar_t* scoreCsvFn );
75
 
104
 
76
-  void           cmScoreTest( cmCtx_t* ctx, const cmChar_t* fn );
105
+  void          cmScoreTest( cmCtx_t* ctx, const cmChar_t* fn );
77
 
106
 
78
 #ifdef __cplusplus
107
 #ifdef __cplusplus
79
 }
108
 }

Loading…
Cancel
Save