Procházet zdrojové kódy

cmXScore.c : Minor improvements and bug-fixes for _cmXsMeasComplexity()

master
kevin před 8 roky
rodič
revize
85878f995b
1 změnil soubory, kde provedl 28 přidání a 33 odebrání
  1. 28
    33
      app/cmXScore.c

+ 28
- 33
app/cmXScore.c Zobrazit soubor

@@ -3111,13 +3111,15 @@ unsigned _cmXsHistValue( cmXsHist_t* hist, unsigned histN )
3111 3111
   return n;
3112 3112
 }
3113 3113
 
3114
+// Measure the score complexity for the the time window 'wndSecs' seconds
3115
+// prior to the note n1 and following n0.
3114 3116
 const cmXsNote_t*  _cmXsMeasComplexityInWindow( const cmXsNote_t* n0, cmXsNote_t* n1, double wndSecs )
3115 3117
 {
3116 3118
   const cmXsNote_t* n2          = NULL;
3117 3119
   unsigned    l_pch_0     = 0;
3118 3120
   unsigned    l_pch_value = 0;
3119
-  unsigned    l_pch_cnt   = 0;
3120
-  unsigned    r_pch_0     = 0;
3121
+  unsigned    l_pch_cnt   = n1->staff==1 ? 0 : 1;
3122
+  unsigned    r_pch_0     = n1->staff==1 ? 1 : 0;
3121 3123
   unsigned    r_pch_value = 0;
3122 3124
   unsigned    r_pch_cnt   = 0;
3123 3125
   unsigned    i           = 0;
@@ -3137,44 +3139,35 @@ const cmXsNote_t*  _cmXsMeasComplexityInWindow( const cmXsNote_t* n0, cmXsNote_t
3137 3139
     // if this event is less than wndSecs behind 'n1' and is not a sounding note ...
3138 3140
     if( n1->secs - n->secs <= wndSecs && cmIsFlag(n->flags,kOnsetXsFl) )
3139 3141
     {
3140
-      // if this is not the first note in the window
3141
-      if( i > 0 )
3142
+      _cmXsHistUpdateI( velHist,  histN, n->dynamics );
3143
+      _cmXsHistUpdateF( rymHist,  histN, n->rvalue );
3144
+
3145
+      switch( n->staff )
3142 3146
       {
3143
-        _cmXsHistUpdateI( velHist,  histN, n->dynamics );
3144
-        _cmXsHistUpdateF( rymHist,  histN, n->rvalue );         
3145
-      
3146
-        switch( n->staff )
3147
-        {
3148
-          case 1:
3147
+        case 1:        // treble cleff
3148
+          if( i > 0 )
3149
+          {
3149 3150
             r_pch_value += r_pch_0 > n->pitch ? r_pch_0-n->pitch : n->pitch-r_pch_0;
3150 3151
             r_pch_cnt   += 1;
3151
-            break;
3152
-          
3153
-          case 2:
3154
-            l_pch_value += l_pch_0 > n->pitch ? l_pch_0-n->pitch : n->pitch-l_pch_0;
3155
-            r_pch_cnt   += 1;
3156
-            break;
3152
+          }
3157 3153
           
3158
-          default:
3159
-            { assert(0); }
3160
-        }
3161
-      }
3162
-
3163
-      // store the pitch values to compare on the next interation
3164
-      switch( n->staff )
3165
-      {
3166
-        case 1:
3167 3154
           r_pch_0 = n->pitch;
3168 3155
           break;
3169
-        
3170
-        case 2:
3171
-          l_pch_0 = n->pitch;
3156
+          
3157
+        case 2:        // bass cleff
3158
+          if( i > 0 )
3159
+          {
3160
+            l_pch_value += l_pch_0 > n->pitch ? l_pch_0-n->pitch : n->pitch-l_pch_0;
3161
+            l_pch_cnt   += 1;
3162
+          }
3163
+          
3164
+          l_pch_0 = n->pitch;                      
3172 3165
           break;
3173
-        
3166
+          
3174 3167
         default:
3175 3168
           { assert(0); }
3176 3169
       }
3177
-
3170
+      
3178 3171
       // track the first note that is inside the window
3179 3172
       if( i == 0 )
3180 3173
         n2 = n;
@@ -3202,6 +3195,7 @@ const cmXsNote_t*  _cmXsMeasComplexityInWindow( const cmXsNote_t* n0, cmXsNote_t
3202 3195
     
3203 3196
   }
3204 3197
 
3198
+  // update the cplx record in n1 with the results of this window analysis
3205 3199
   n1->cplx.sum_d_vel  = _cmXsHistValue( velHist, histN );
3206 3200
   n1->cplx.sum_d_rym  = _cmXsHistValue( rymHist, histN );
3207 3201
   n1->cplx.sum_d_lpch = l_pch_value;
@@ -3212,6 +3206,8 @@ const cmXsNote_t*  _cmXsMeasComplexityInWindow( const cmXsNote_t* n0, cmXsNote_t
3212 3206
   return n2;
3213 3207
 }
3214 3208
 
3209
+// Measure the score complexity and fill in the cmXsComplexity_t record associated
3210
+// with the cmXsNote_t record of each sounding note.
3215 3211
 cmXsRC_t _cmXsMeasComplexity( cmXsH_t h, double wndSecs )
3216 3212
 {
3217 3213
   cmXsRC_t    rc = kOkXsRC;
@@ -3361,8 +3357,6 @@ cmXsRC_t _cmXsWriteMidiFile( cmCtx_t* ctx, cmXsH_t h, const cmChar_t* dir, const
3361 3357
   return rc;
3362 3358
 }
3363 3359
 
3364
-
3365
-
3366 3360
 typedef struct cmXsSvgEvt_str
3367 3361
 {
3368 3362
   unsigned         flags;     // k???XsFl
@@ -3630,7 +3624,6 @@ cmXsRC_t _cmXScoreGenSvg( cmCtx_t* ctx, cmXsH_t h, const cmChar_t* dir, const cm
3630 3624
 
3631 3625
 
3632 3626
   return _cmXsWriteMidiSvg( ctx, p, &mf, dir, fn );
3633
-
3634 3627
 }
3635 3628
 
3636 3629
 cmXsRC_t cmXScoreTest(
@@ -3683,6 +3676,8 @@ cmXsRC_t cmXScoreTest(
3683 3676
   
3684 3677
   if( midiOutFn != NULL )
3685 3678
   {
3679
+
3680
+    // measure the score complexity
3686 3681
     double wndSecs = 1.0;
3687 3682
     _cmXsMeasComplexity(h,wndSecs);
3688 3683
 

Načítá se…
Zrušit
Uložit