- unsigned int r,rs,rd;int i;\r
-\r
- memset(RateTable,0,sizeof(unsigned long)*160); // build the rate table according to Neill's rules (see at bottom of file)\r
-\r
- r=3;rs=1;rd=0;\r
-\r
- for(i=32;i<160;i++) // we start at pos 32 with the real values... everything before is 0\r
- {\r
- if(r<0x3FFFFFFF)\r
- {\r
- r+=rs;\r
- rd++;if(rd==5) {rd=1;rs*=2;}\r
- }\r
- if(r>0x3FFFFFFF) r=0x3FFFFFFF;\r
-\r
- RateTable[i]=r;\r
- }\r
+ int lcv, denom;\r
+\r
+ // Optimize table - Dr. Hell ADSR math\r
+ for (lcv = 0; lcv < 48; lcv++)\r
+ {\r
+ RateTableAdd[lcv] = (7 - (lcv&3)) << (11 + 16 - (lcv >> 2));\r
+ RateTableSub[lcv] = (-8 + (lcv&3)) << (11 + 16 - (lcv >> 2));\r
+ }\r
+\r
+ for (; lcv < 128; lcv++)\r
+ {\r
+ denom = 1 << ((lcv>>2) - 11);\r
+\r
+ RateTableAdd[lcv] = ((7 - (lcv&3)) << 16) / denom;\r
+ RateTableSub[lcv] = ((-8 + (lcv&3)) << 16) / denom;\r
+ }\r