/[svn]/libgig/trunk/src/gig.cpp
ViewVC logotype

Diff of /libgig/trunk/src/gig.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 282 by schoenebeck, Wed Oct 13 20:05:42 2004 UTC revision 308 by schoenebeck, Sun Nov 21 18:02:21 2004 UTC
# Line 836  namespace gig { Line 836  namespace gig {
836              pVelocityAttenuationTable = (*pVelocityTables)[tableKey];              pVelocityAttenuationTable = (*pVelocityTables)[tableKey];
837          }          }
838          else {          else {
839              pVelocityAttenuationTable = new double[128];              pVelocityAttenuationTable =
840              switch (VelocityResponseCurve) { // calculate the new table                  CreateVelocityTable(VelocityResponseCurve,
841                  case curve_type_nonlinear:                                      VelocityResponseDepth,
842                      for (int velocity = 0; velocity < 128; velocity++) {                                      VelocityResponseCurveScaling);
                         pVelocityAttenuationTable[velocity] =  
                             GIG_VELOCITY_TRANSFORM_NONLINEAR(((double)velocity),((double)VelocityResponseDepth),((double)VelocityResponseCurveScaling));  
                         if      (pVelocityAttenuationTable[velocity] > 1.0)   pVelocityAttenuationTable[velocity] = 1.0;  
                         else if (pVelocityAttenuationTable[velocity] < 1e-15) pVelocityAttenuationTable[velocity] = 0.0;  
                      }  
                      break;  
                 case curve_type_linear:  
                     for (int velocity = 0; velocity < 128; velocity++) {  
                         pVelocityAttenuationTable[velocity] =  
                             GIG_VELOCITY_TRANSFORM_LINEAR(((double)velocity),((double)VelocityResponseDepth),((double)VelocityResponseCurveScaling));  
                         if      (pVelocityAttenuationTable[velocity] > 1.0)   pVelocityAttenuationTable[velocity] = 1.0;  
                         else if (pVelocityAttenuationTable[velocity] < 1e-15) pVelocityAttenuationTable[velocity] = 0.0;  
                     }  
                     break;  
                 case curve_type_special:  
                     for (int velocity = 0; velocity < 128; velocity++) {  
                         pVelocityAttenuationTable[velocity] =  
                             GIG_VELOCITY_TRANSFORM_SPECIAL(((double)velocity),((double)VelocityResponseDepth),((double)VelocityResponseCurveScaling));  
                         if      (pVelocityAttenuationTable[velocity] > 1.0)   pVelocityAttenuationTable[velocity] = 1.0;  
                         else if (pVelocityAttenuationTable[velocity] < 1e-15) pVelocityAttenuationTable[velocity] = 0.0;  
                     }  
                     break;  
                 case curve_type_unknown:  
                 default:  
                     throw gig::Exception("Unknown transform curve type.");  
             }  
843              (*pVelocityTables)[tableKey] = pVelocityAttenuationTable; // put the new table into the tables map              (*pVelocityTables)[tableKey] = pVelocityAttenuationTable; // put the new table into the tables map
844          }          }
845      }      }
# Line 1018  namespace gig { Line 992  namespace gig {
992          return pVelocityAttenuationTable[MIDIKeyVelocity];          return pVelocityAttenuationTable[MIDIKeyVelocity];
993      }      }
994    
995        double* DimensionRegion::CreateVelocityTable(curve_type_t curveType, uint8_t depth, uint8_t scaling) {
996            
997            // line-segment approximations of the 15 velocity curves
998    
999            // linear
1000            const int lin0[] = { 1, 1, 127, 127 };
1001            const int lin1[] = { 1, 21, 127, 127 };
1002            const int lin2[] = { 1, 45, 127, 127 };
1003            const int lin3[] = { 1, 74, 127, 127 };
1004            const int lin4[] = { 1, 127, 127, 127 };
1005    
1006            // non-linear
1007            const int non0[] = { 1, 4, 24, 5, 57, 17, 92, 57, 122, 127, 127, 127 };
1008            const int non1[] = { 1, 4, 46, 9, 93, 56, 118, 106, 123, 127,
1009                                 127, 127 };
1010            const int non2[] = { 1, 4, 46, 9, 57, 20, 102, 107, 107, 127,
1011                                 127, 127 };
1012            const int non3[] = { 1, 15, 10, 19, 67, 73, 80, 80, 90, 98, 98, 127,
1013                                 127, 127 };
1014            const int non4[] = { 1, 25, 33, 57, 82, 81, 92, 127, 127, 127 };
1015            
1016            // special
1017            const int spe0[] = { 1, 2, 76, 10, 90, 15, 95, 20, 99, 28, 103, 44,
1018                                 113, 127, 127, 127 };
1019            const int spe1[] = { 1, 2, 27, 5, 67, 18, 89, 29, 95, 35, 107, 67,
1020                                 118, 127, 127, 127 };
1021            const int spe2[] = { 1, 1, 33, 1, 53, 5, 61, 13, 69, 32, 79, 74,
1022                                 85, 90, 91, 127, 127, 127 };
1023            const int spe3[] = { 1, 32, 28, 35, 66, 48, 89, 59, 95, 65, 99, 73,
1024                                 117, 127, 127, 127 };
1025            const int spe4[] = { 1, 4, 23, 5, 49, 13, 57, 17, 92, 57, 122, 127,
1026                                 127, 127 };
1027            
1028            const int* const curves[] = { non0, non1, non2, non3, non4,
1029                                          lin0, lin1, lin2, lin3, lin4,
1030                                          spe0, spe1, spe2, spe3, spe4 };
1031            
1032            double* const table = new double[128];
1033    
1034            const int* curve = curves[curveType * 5 + depth];
1035            const int s = scaling == 0 ? 20 : scaling; // 0 or 20 means no scaling
1036            
1037            table[0] = 0;
1038            for (int x = 1 ; x < 128 ; x++) {
1039    
1040                if (x > curve[2]) curve += 2;
1041                double y = curve[1] + (x - curve[0]) *
1042                    (double(curve[3] - curve[1]) / (curve[2] - curve[0]));
1043                y = y / 127;
1044    
1045                // Scale up for s > 20, down for s < 20. When
1046                // down-scaling, the curve still ends at 1.0.
1047                if (s < 20 && y >= 0.5)
1048                    y = y / ((2 - 40.0 / s) * y + 40.0 / s - 1);
1049                else
1050                    y = y * (s / 20.0);
1051                if (y > 1) y = 1;
1052    
1053                table[x] = y;
1054            }
1055            return table;
1056        }
1057    
1058    
1059  // *************** Region ***************  // *************** Region ***************

Legend:
Removed from v.282  
changed lines
  Added in v.308

  ViewVC Help
Powered by ViewVC