00001
00002
00003
00004
00005 #include "osc.h"
00006 namespace osc{
00007
00008
00009
00010
00011 extern shortfract co_h[];
00012
00013
00014
00015
00016 extern shortfract co_l[];
00017
00018
00019
00020
00021 extern shortfract si_h[];
00022
00023
00024
00025
00026 extern shortfract si_l[];
00027
00028
00029 COscillator::COscillator( int freq )
00030 {
00031 this->setFreq( freq );
00032 this->setPhase( 0 );
00033 }
00034
00035
00036 void COscillator::setFreq( int freq )
00037 {
00038 this->frequency = freq;
00039 }
00040
00041
00042 void COscillator::setPhase( unsigned int phase )
00043 {
00044 this->phase = phase;
00045 }
00046
00047
00048
00049 void CTableLookup::run( shortfract i[], shortfract q[], int count )
00050 {
00051 for ( int j=0; j<count; j++ ){
00052
00053 unsigned int hi = ( this->phase >> 24 ) & 0xFF;
00054 unsigned int lo = ( this->phase >> 16 ) & 0xFF;
00055
00056
00057
00058
00059 asm( "a0 = %2*%3;\n"
00060 "%0=(a0-=%4*%5);\n"
00061 "a0 = %4*%3;\n"
00062 "%1=(a0+=%2*%5);\n"
00063 : "=&l"(i[j].v), "=&l"(q[j].v)
00064 : "l"(co_h[hi].v), "l"(co_l[lo].v), "l"(si_h[hi].v), "l"(si_l[lo].v)
00065 : "a0"
00066 );
00067
00068 this->phase += this->frequency;
00069 }
00070 }
00071
00072 void CTableLookup::run( shortfract i[], int count )
00073 {
00074 for ( int j=0; j<count; j++ ){
00075
00076 unsigned int hi = ( this->phase >> 24 ) & 0xFF;
00077 unsigned int lo = ( this->phase >> 16 ) & 0xFF;
00078
00079
00080 asm( "a0 = %1*%2;\n"
00081 "%0=(a0-=%3*%4);\n"
00082 : "=l"(i[j].v)
00083 : "l"(co_h[hi].v), "l"(co_l[lo].v), "l"(si_h[hi].v), "l"(si_l[lo].v)
00084 : "a0"
00085 );
00086
00087 this->phase += this->frequency;
00088
00089 }
00090 }
00091
00092 void CTableLookup::run( shortfract i[], int deviation[], int count )
00093 {
00094 for ( int j=0; j<count; j++ ){
00095
00096 unsigned int hi = ( this->phase >> 24 ) & 0xFF;
00097 unsigned int lo = ( this->phase >> 16 ) & 0xFF;
00098
00099
00100 asm( "a0 = %1*%2;\n"
00101 "%0=(a0-=%3*%4);\n"
00102 : "=l"(i[j].v)
00103 : "l"(co_h[hi].v), "l"(co_l[lo].v), "l"(si_h[hi].v), "l"(si_l[lo].v)
00104 : "a0"
00105 );
00106
00107 this->phase += this->frequency + deviation[j];
00108
00109 }
00110 }
00111
00112
00113
00114
00115
00116
00117 const int tableSize = 256;
00118
00119
00120
00121
00122
00123 shortfract co_h[tableSize]= {
00124 32767,
00125 32757,
00126 32728,
00127 32678,
00128 32609,
00129 32521,
00130 32412,
00131 32285,
00132 32137,
00133 31971,
00134 31785,
00135 31580,
00136 31356,
00137 31113,
00138 30852,
00139 30571,
00140 30273,
00141 29956,
00142 29621,
00143 29268,
00144 28898,
00145 28510,
00146 28105,
00147 27683,
00148 27245,
00149 26790,
00150 26319,
00151 25832,
00152 25329,
00153 24811,
00154 24279,
00155 23731,
00156 23170,
00157 22594,
00158 22005,
00159 21403,
00160 20787,
00161 20159,
00162 19519,
00163 18868,
00164 18204,
00165 17530,
00166 16846,
00167 16151,
00168 15446,
00169 14732,
00170 14010,
00171 13279,
00172 12539,
00173 11793,
00174 11039,
00175 10278,
00176 9512,
00177 8739,
00178 7962,
00179 7179,
00180 6393,
00181 5602,
00182 4808,
00183 4011,
00184 3212,
00185 2410,
00186 1608,
00187 804,
00188 0,
00189 -804,
00190 -1608,
00191 -2410,
00192 -3212,
00193 -4011,
00194 -4808,
00195 -5602,
00196 -6393,
00197 -7179,
00198 -7962,
00199 -8739,
00200 -9512,
00201 -10278,
00202 -11039,
00203 -11793,
00204 -12539,
00205 -13279,
00206 -14010,
00207 -14732,
00208 -15446,
00209 -16151,
00210 -16846,
00211 -17530,
00212 -18204,
00213 -18868,
00214 -19519,
00215 -20159,
00216 -20787,
00217 -21403,
00218 -22005,
00219 -22594,
00220 -23170,
00221 -23731,
00222 -24279,
00223 -24811,
00224 -25329,
00225 -25832,
00226 -26319,
00227 -26790,
00228 -27245,
00229 -27683,
00230 -28105,
00231 -28510,
00232 -28898,
00233 -29268,
00234 -29621,
00235 -29956,
00236 -30273,
00237 -30571,
00238 -30852,
00239 -31113,
00240 -31356,
00241 -31580,
00242 -31785,
00243 -31971,
00244 -32137,
00245 -32285,
00246 -32412,
00247 -32521,
00248 -32609,
00249 -32678,
00250 -32728,
00251 -32757,
00252 -32767,
00253 -32757,
00254 -32728,
00255 -32678,
00256 -32609,
00257 -32521,
00258 -32412,
00259 -32285,
00260 -32137,
00261 -31971,
00262 -31785,
00263 -31580,
00264 -31356,
00265 -31113,
00266 -30852,
00267 -30571,
00268 -30273,
00269 -29956,
00270 -29621,
00271 -29268,
00272 -28898,
00273 -28510,
00274 -28105,
00275 -27683,
00276 -27245,
00277 -26790,
00278 -26319,
00279 -25832,
00280 -25329,
00281 -24811,
00282 -24279,
00283 -23731,
00284 -23170,
00285 -22594,
00286 -22005,
00287 -21403,
00288 -20787,
00289 -20159,
00290 -19519,
00291 -18868,
00292 -18204,
00293 -17530,
00294 -16846,
00295 -16151,
00296 -15446,
00297 -14732,
00298 -14010,
00299 -13279,
00300 -12539,
00301 -11793,
00302 -11039,
00303 -10278,
00304 -9512,
00305 -8739,
00306 -7962,
00307 -7179,
00308 -6393,
00309 -5602,
00310 -4808,
00311 -4011,
00312 -3212,
00313 -2410,
00314 -1608,
00315 -804,
00316 0,
00317 804,
00318 1608,
00319 2410,
00320 3212,
00321 4011,
00322 4808,
00323 5602,
00324 6393,
00325 7179,
00326 7962,
00327 8739,
00328 9512,
00329 10278,
00330 11039,
00331 11793,
00332 12539,
00333 13279,
00334 14010,
00335 14732,
00336 15446,
00337 16151,
00338 16846,
00339 17530,
00340 18204,
00341 18868,
00342 19519,
00343 20159,
00344 20787,
00345 21403,
00346 22005,
00347 22594,
00348 23170,
00349 23731,
00350 24279,
00351 24811,
00352 25329,
00353 25832,
00354 26319,
00355 26790,
00356 27245,
00357 27683,
00358 28105,
00359 28510,
00360 28898,
00361 29268,
00362 29621,
00363 29956,
00364 30273,
00365 30571,
00366 30852,
00367 31113,
00368 31356,
00369 31580,
00370 31785,
00371 31971,
00372 32137,
00373 32285,
00374 32412,
00375 32521,
00376 32609,
00377 32678,
00378 32728,
00379 32757
00380 };
00381
00382
00383
00384
00385 shortfract co_l[tableSize]= {
00386 32767,
00387 32767,
00388 32767,
00389 32767,
00390 32767,
00391 32767,
00392 32767,
00393 32767,
00394 32767,
00395 32767,
00396 32767,
00397 32767,
00398 32767,
00399 32767,
00400 32767,
00401 32767,
00402 32767,
00403 32767,
00404 32767,
00405 32767,
00406 32767,
00407 32767,
00408 32767,
00409 32767,
00410 32767,
00411 32767,
00412 32767,
00413 32767,
00414 32767,
00415 32767,
00416 32767,
00417 32767,
00418 32767,
00419 32767,
00420 32767,
00421 32767,
00422 32767,
00423 32767,
00424 32767,
00425 32767,
00426 32767,
00427 32767,
00428 32767,
00429 32767,
00430 32767,
00431 32767,
00432 32767,
00433 32767,
00434 32767,
00435 32767,
00436 32767,
00437 32767,
00438 32767,
00439 32767,
00440 32767,
00441 32767,
00442 32767,
00443 32767,
00444 32766,
00445 32766,
00446 32766,
00447 32766,
00448 32766,
00449 32766,
00450 32766,
00451 32766,
00452 32766,
00453 32766,
00454 32766,
00455 32766,
00456 32766,
00457 32766,
00458 32766,
00459 32766,
00460 32766,
00461 32766,
00462 32766,
00463 32766,
00464 32766,
00465 32766,
00466 32766,
00467 32766,
00468 32766,
00469 32766,
00470 32766,
00471 32766,
00472 32766,
00473 32766,
00474 32766,
00475 32766,
00476 32766,
00477 32766,
00478 32766,
00479 32766,
00480 32766,
00481 32766,
00482 32766,
00483 32766,
00484 32766,
00485 32766,
00486 32765,
00487 32765,
00488 32765,
00489 32765,
00490 32765,
00491 32765,
00492 32765,
00493 32765,
00494 32765,
00495 32765,
00496 32765,
00497 32765,
00498 32765,
00499 32765,
00500 32765,
00501 32765,
00502 32765,
00503 32765,
00504 32765,
00505 32765,
00506 32765,
00507 32765,
00508 32765,
00509 32765,
00510 32765,
00511 32765,
00512 32765,
00513 32765,
00514 32765,
00515 32764,
00516 32764,
00517 32764,
00518 32764,
00519 32764,
00520 32764,
00521 32764,
00522 32764,
00523 32764,
00524 32764,
00525 32764,
00526 32764,
00527 32764,
00528 32764,
00529 32764,
00530 32764,
00531 32764,
00532 32764,
00533 32764,
00534 32764,
00535 32764,
00536 32764,
00537 32764,
00538 32764,
00539 32763,
00540 32763,
00541 32763,
00542 32763,
00543 32763,
00544 32763,
00545 32763,
00546 32763,
00547 32763,
00548 32763,
00549 32763,
00550 32763,
00551 32763,
00552 32763,
00553 32763,
00554 32763,
00555 32763,
00556 32763,
00557 32763,
00558 32763,
00559 32762,
00560 32762,
00561 32762,
00562 32762,
00563 32762,
00564 32762,
00565 32762,
00566 32762,
00567 32762,
00568 32762,
00569 32762,
00570 32762,
00571 32762,
00572 32762,
00573 32762,
00574 32762,
00575 32762,
00576 32762,
00577 32762,
00578 32761,
00579 32761,
00580 32761,
00581 32761,
00582 32761,
00583 32761,
00584 32761,
00585 32761,
00586 32761,
00587 32761,
00588 32761,
00589 32761,
00590 32761,
00591 32761,
00592 32761,
00593 32761,
00594 32760,
00595 32760,
00596 32760,
00597 32760,
00598 32760,
00599 32760,
00600 32760,
00601 32760,
00602 32760,
00603 32760,
00604 32760,
00605 32760,
00606 32760,
00607 32760,
00608 32760,
00609 32760,
00610 32759,
00611 32759,
00612 32759,
00613 32759,
00614 32759,
00615 32759,
00616 32759,
00617 32759,
00618 32759,
00619 32759,
00620 32759,
00621 32759,
00622 32759,
00623 32759,
00624 32758,
00625 32758,
00626 32758,
00627 32758,
00628 32758,
00629 32758,
00630 32758,
00631 32758,
00632 32758,
00633 32758,
00634 32758,
00635 32758,
00636 32758,
00637 32758,
00638 32757,
00639 32757,
00640 32757,
00641 32757
00642 };
00643
00644
00645
00646
00647 shortfract si_h[tableSize]= {
00648 0,
00649 804,
00650 1608,
00651 2410,
00652 3212,
00653 4011,
00654 4808,
00655 5602,
00656 6393,
00657 7179,
00658 7962,
00659 8739,
00660 9512,
00661 10278,
00662 11039,
00663 11793,
00664 12539,
00665 13279,
00666 14010,
00667 14732,
00668 15446,
00669 16151,
00670 16846,
00671 17530,
00672 18204,
00673 18868,
00674 19519,
00675 20159,
00676 20787,
00677 21403,
00678 22005,
00679 22594,
00680 23170,
00681 23731,
00682 24279,
00683 24811,
00684 25329,
00685 25832,
00686 26319,
00687 26790,
00688 27245,
00689 27683,
00690 28105,
00691 28510,
00692 28898,
00693 29268,
00694 29621,
00695 29956,
00696 30273,
00697 30571,
00698 30852,
00699 31113,
00700 31356,
00701 31580,
00702 31785,
00703 31971,
00704 32137,
00705 32285,
00706 32412,
00707 32521,
00708 32609,
00709 32678,
00710 32728,
00711 32757,
00712 32767,
00713 32757,
00714 32728,
00715 32678,
00716 32609,
00717 32521,
00718 32412,
00719 32285,
00720 32137,
00721 31971,
00722 31785,
00723 31580,
00724 31356,
00725 31113,
00726 30852,
00727 30571,
00728 30273,
00729 29956,
00730 29621,
00731 29268,
00732 28898,
00733 28510,
00734 28105,
00735 27683,
00736 27245,
00737 26790,
00738 26319,
00739 25832,
00740 25329,
00741 24811,
00742 24279,
00743 23731,
00744 23170,
00745 22594,
00746 22005,
00747 21403,
00748 20787,
00749 20159,
00750 19519,
00751 18868,
00752 18204,
00753 17530,
00754 16846,
00755 16151,
00756 15446,
00757 14732,
00758 14010,
00759 13279,
00760 12539,
00761 11793,
00762 11039,
00763 10278,
00764 9512,
00765 8739,
00766 7962,
00767 7179,
00768 6393,
00769 5602,
00770 4808,
00771 4011,
00772 3212,
00773 2410,
00774 1608,
00775 804,
00776 0,
00777 -804,
00778 -1608,
00779 -2410,
00780 -3212,
00781 -4011,
00782 -4808,
00783 -5602,
00784 -6393,
00785 -7179,
00786 -7962,
00787 -8739,
00788 -9512,
00789 -10278,
00790 -11039,
00791 -11793,
00792 -12539,
00793 -13279,
00794 -14010,
00795 -14732,
00796 -15446,
00797 -16151,
00798 -16846,
00799 -17530,
00800 -18204,
00801 -18868,
00802 -19519,
00803 -20159,
00804 -20787,
00805 -21403,
00806 -22005,
00807 -22594,
00808 -23170,
00809 -23731,
00810 -24279,
00811 -24811,
00812 -25329,
00813 -25832,
00814 -26319,
00815 -26790,
00816 -27245,
00817 -27683,
00818 -28105,
00819 -28510,
00820 -28898,
00821 -29268,
00822 -29621,
00823 -29956,
00824 -30273,
00825 -30571,
00826 -30852,
00827 -31113,
00828 -31356,
00829 -31580,
00830 -31785,
00831 -31971,
00832 -32137,
00833 -32285,
00834 -32412,
00835 -32521,
00836 -32609,
00837 -32678,
00838 -32728,
00839 -32757,
00840 -32767,
00841 -32757,
00842 -32728,
00843 -32678,
00844 -32609,
00845 -32521,
00846 -32412,
00847 -32285,
00848 -32137,
00849 -31971,
00850 -31785,
00851 -31580,
00852 -31356,
00853 -31113,
00854 -30852,
00855 -30571,
00856 -30273,
00857 -29956,
00858 -29621,
00859 -29268,
00860 -28898,
00861 -28510,
00862 -28105,
00863 -27683,
00864 -27245,
00865 -26790,
00866 -26319,
00867 -25832,
00868 -25329,
00869 -24811,
00870 -24279,
00871 -23731,
00872 -23170,
00873 -22594,
00874 -22005,
00875 -21403,
00876 -20787,
00877 -20159,
00878 -19519,
00879 -18868,
00880 -18204,
00881 -17530,
00882 -16846,
00883 -16151,
00884 -15446,
00885 -14732,
00886 -14010,
00887 -13279,
00888 -12539,
00889 -11793,
00890 -11039,
00891 -10278,
00892 -9512,
00893 -8739,
00894 -7962,
00895 -7179,
00896 -6393,
00897 -5602,
00898 -4808,
00899 -4011,
00900 -3212,
00901 -2410,
00902 -1608,
00903 -804
00904 };
00905
00906
00907
00908
00909 shortfract si_l[tableSize]= {
00910 0,
00911 3,
00912 6,
00913 9,
00914 13,
00915 16,
00916 19,
00917 22,
00918 25,
00919 28,
00920 31,
00921 35,
00922 38,
00923 41,
00924 44,
00925 47,
00926 50,
00927 53,
00928 57,
00929 60,
00930 63,
00931 66,
00932 69,
00933 72,
00934 75,
00935 79,
00936 82,
00937 85,
00938 88,
00939 91,
00940 94,
00941 97,
00942 101,
00943 104,
00944 107,
00945 110,
00946 113,
00947 116,
00948 119,
00949 123,
00950 126,
00951 129,
00952 132,
00953 135,
00954 138,
00955 141,
00956 145,
00957 148,
00958 151,
00959 154,
00960 157,
00961 160,
00962 163,
00963 166,
00964 170,
00965 173,
00966 176,
00967 179,
00968 182,
00969 185,
00970 188,
00971 192,
00972 195,
00973 198,
00974 201,
00975 204,
00976 207,
00977 210,
00978 214,
00979 217,
00980 220,
00981 223,
00982 226,
00983 229,
00984 232,
00985 236,
00986 239,
00987 242,
00988 245,
00989 248,
00990 251,
00991 254,
00992 258,
00993 261,
00994 264,
00995 267,
00996 270,
00997 273,
00998 276,
00999 280,
01000 283,
01001 286,
01002 289,
01003 292,
01004 295,
01005 298,
01006 302,
01007 305,
01008 308,
01009 311,
01010 314,
01011 317,
01012 320,
01013 324,
01014 327,
01015 330,
01016 333,
01017 336,
01018 339,
01019 342,
01020 346,
01021 349,
01022 352,
01023 355,
01024 358,
01025 361,
01026 364,
01027 368,
01028 371,
01029 374,
01030 377,
01031 380,
01032 383,
01033 386,
01034 390,
01035 393,
01036 396,
01037 399,
01038 402,
01039 405,
01040 408,
01041 412,
01042 415,
01043 418,
01044 421,
01045 424,
01046 427,
01047 430,
01048 434,
01049 437,
01050 440,
01051 443,
01052 446,
01053 449,
01054 452,
01055 456,
01056 459,
01057 462,
01058 465,
01059 468,
01060 471,
01061 474,
01062 477,
01063 481,
01064 484,
01065 487,
01066 490,
01067 493,
01068 496,
01069 499,
01070 503,
01071 506,
01072 509,
01073 512,
01074 515,
01075 518,
01076 521,
01077 525,
01078 528,
01079 531,
01080 534,
01081 537,
01082 540,
01083 543,
01084 547,
01085 550,
01086 553,
01087 556,
01088 559,
01089 562,
01090 565,
01091 569,
01092 572,
01093 575,
01094 578,
01095 581,
01096 584,
01097 587,
01098 591,
01099 594,
01100 597,
01101 600,
01102 603,
01103 606,
01104 609,
01105 613,
01106 616,
01107 619,
01108 622,
01109 625,
01110 628,
01111 631,
01112 635,
01113 638,
01114 641,
01115 644,
01116 647,
01117 650,
01118 653,
01119 657,
01120 660,
01121 663,
01122 666,
01123 669,
01124 672,
01125 675,
01126 679,
01127 682,
01128 685,
01129 688,
01130 691,
01131 694,
01132 697,
01133 701,
01134 704,
01135 707,
01136 710,
01137 713,
01138 716,
01139 719,
01140 722,
01141 726,
01142 729,
01143 732,
01144 735,
01145 738,
01146 741,
01147 744,
01148 748,
01149 751,
01150 754,
01151 757,
01152 760,
01153 763,
01154 766,
01155 770,
01156 773,
01157 776,
01158 779,
01159 782,
01160 785,
01161 788,
01162 792,
01163 795,
01164 798,
01165 801
01166 };
01167 };
01168