TX Library Help – Version: 00173a, Revision: 174
 ALL  Windows graphics in a sandbox

TXWaveExample.cpp

См. документацию.
00001 //{================================================================================================================
00009 //              $Copyright: (C) Ded (Ilya Dedinsky, http://txlib.ru) <mail@txlib.ru> $
00010 //}================================================================================================================
00011 
00012 #include "..\TXWave.h"
00013 
00014 #include <algorithm>
00015 
00016 //-----------------------------------------------------------------------------------------------------------------
00017 
00018 void BeepDemo();
00019 void SinusDemo();
00020 void StereoDemo();
00021 void Sort1Demo();
00022 void Sort2Demo();
00023 void Sort3Demo();
00024 void BeepDemo2();
00025 void WaveformDemo();
00026 void CatPurrDemo();
00027 void RecordingDemo();
00028 bool MonitorProc (HWAVEIN, txWaveData_t& data, void*);
00029 void Banner (const char* text);
00030 void Pause();
00031 
00032 namespace Kernel32 { _TX_DLLIMPORT ("Kernel32", HWND, GetConsoleWindow, (void)); }
00033 
00034 //-----------------------------------------------------------------------------------------------------------------
00035 
00036 int main()
00037     {
00038     txDisableAutoPause();
00039 
00040     printf ("\n");
00041 
00042     Banner ("1/10: Beep demo");
00043     BeepDemo();
00044     Pause();
00045 
00046     txCreateWindow (800, 600);
00047 
00048     Banner ("2/10: Sinus demo");
00049     SinusDemo();
00050     Pause();
00051 
00052     printf ("\n" "For idea of the sorting demos see: https://www.youtube.com/watch?v=kPRA0W1kECg\n\n");
00053 
00054     Banner ("3/10: Shaker Sort demo");
00055     Sort1Demo();
00056     Pause();
00057 
00058     Banner ("4/10: std::sort (QuickSort) demo");
00059     Sort2Demo();
00060     Pause();
00061 
00062     Banner ("5/10: std::stable_sort (MergeSort) demo");
00063     Sort3Demo();
00064     Pause();
00065 
00066     ShowWindow (Kernel32::GetConsoleWindow(), SW_SHOW);
00067     ShowWindow (txWindow(), SW_HIDE);
00068 
00069     Banner ("6/10: Stereo demo");
00070     StereoDemo();
00071     Pause();
00072 
00073     Banner ("7/10: Beep demo 2");
00074     BeepDemo2();
00075     Pause();
00076 
00077     Banner ("8/10: Waveform demo");
00078     WaveformDemo();
00079     Pause();
00080 
00081     Banner ("9/10: Cat purr demo");
00082     CatPurrDemo();
00083     Pause();
00084 
00085     Banner ("10/10: Recording demo");
00086     RecordingDemo();
00087     Pause();
00088 
00089     Banner ("All demos done");
00090     return 0;
00091     }
00092 
00093 //-----------------------------------------------------------------------------------------------------------------
00094 
00095 void BeepDemo()
00096     {
00097     txWaveOut (250, 880);
00098     }
00099 
00100 //-----------------------------------------------------------------------------------------------------------------
00101 
00102 void SinusDemo()
00103     {
00104     POINT size = txGetExtent();
00105 
00106     double x0 = -2*M_PI, x1 = +2*M_PI;
00107     double zoom = 50;
00108 
00109     for (int i = -10; i <= 10; i++)
00110         {
00111         txSetColor (i? TX_DARKGRAY : TX_WHITE);
00112 
00113         txLine (0, size.y/2 + i*zoom, size.x, size.y/2 + i*zoom);
00114         txLine (size.x/2 + i*zoom, 0, size.x/2 + i*zoom, size.y);
00115         }
00116 
00117     Banner ("\f" "SinusDemo. Press any key to stop...");
00118 
00119     for (double x = x0; x <= x1 && !_kbhit(); x += (x1 - x0) / 101)
00120         {
00121         double y = 5 * sin (x);
00122 
00123         txWaveOut (50, 880 + 88 * y);
00124 
00125         txCircle (x*zoom + size.x/2, -y*zoom + size.y/2, 5);
00126         }
00127     }
00128 
00129 //-----------------------------------------------------------------------------------------------------------------
00130 
00131 void StereoDemo()
00132     {
00133     for (double t = -0.1; !_kbhit(); t += 0.1)
00134         {
00135         txWaveOut (50, 880 + 88 * cos (t), 100,
00136                        880 + 88 * sin (t), 100);
00137 
00138         const char line[] = "----------------------------------------";
00139         const int  lineSz = sizeof (line) - 1;
00140 
00141         int sz = (int) ROUND ((1 + cos (t))/2 * lineSz);
00142         printf ("Press any key to stop...     [%.*s|%.*s]  \r", lineSz-sz, line, sz, line);
00143         }
00144 
00145     printf ("\n\n");
00146     }
00147 
00148 //-----------------------------------------------------------------------------------------------------------------
00149 
00150 void BeepDemo2()
00151     {
00152     int time = 2000;
00153     txWaveData_t wav (ROUND (time * txWaveSampleRate));
00154 
00155     printf ("Generating the waveform ~880 Hz...\n");
00156 
00157     for (unsigned i = 0; i < wav.size(); i++)
00158         wav[i][0] = wav[i][1] = (short) (sin (i*0.125) * txWaveVolMax);  // * 2*M_PI/44100 * 880
00159 
00160     printf ("Playing %d sec...\n\n", time/1000);
00161 
00162     txWaveOut (wav);
00163     txWaveOut();
00164     }
00165 
00166 //-----------------------------------------------------------------------------------------------------------------
00167 
00168 void WaveformDemo()
00169     {
00170     int time = 90000;
00171     txWaveData_t buf (ROUND (time * txWaveSampleRate));
00172     unsigned size = (unsigned) buf.size();
00173 
00174     printf ("Generating the wave: (t >> 7 | t | t >> 6) * 10 + 4 * (t & t >> 13 | t >> 6)...\n"
00175             "See: http://countercomplex.blogspot.ru/2011/10/algorithmic-symphonies-from-one-line-of.html\n\n");
00176 
00177     for (unsigned i = 0; i < size; i++)
00178         {
00179         int t   = i/5;
00180         int val = (((t >> 7) | t | (t >> 6)) * 10 + 4 * ((t & (t >> 13)) | (t >> 6))) & 0xFF;
00181 
00182         buf[i][0] = buf[i][1] = (short) ((val/127.0 - 1) / (1 + pow (15, 17.0*i/size - 15)) * txWaveVolMax);
00183         }
00184 
00185     printf ("Now playing, press a key to stop...\n\n");
00186 
00187     HWAVEOUT waveOut = txWaveOut (buf);
00188 
00189     while (waveOut && !_kbhit())
00190         {
00191         unsigned long pos = txWaveGetPosition (waveOut);
00192         unsigned done = (unsigned) (100 * pos/size);
00193 
00194         const char line[] = "----------------------------------------";
00195         const int  lineSz = sizeof (line) - 1;
00196 
00197         printf ("Done %7lu/%7u samples [%.*s|%.*s] %3u%%  \r",
00198                  pos, size, (int) (lineSz*done/100), line, (int) (lineSz - lineSz*done/100), line, done);
00199 
00200         if (done >= 100) break;
00201         Sleep (100);
00202         }
00203 
00204     txWaveOut (0);
00205     printf ("\n\n");
00206     }
00207 
00208 //-----------------------------------------------------------------------------------------------------------------
00209 
00210 void CatPurrDemo()
00211     {
00212     txWaveData_t purr = txWaveLoadWav ("Purr.wav");
00213 
00214     txWaveOut (purr);
00215 
00216     printf ("Uninterruptable... do relax and wait %ld sec\n\n", ROUND ((int) purr.size() / txWaveSampleRate / 1000));
00217 
00218     txWaveOut();
00219     }
00220 
00221 //-----------------------------------------------------------------------------------------------------------------
00222 
00223 void RecordingDemo()
00224     {
00225     Banner ("\r" "Turn on the microphone and get prepared for a recording."); Pause();
00226 
00227     int time = 20000;
00228 
00229     printf ("Recording %2d sec...\n",   time/1000);
00230 
00231     txWaveData_t wav = txWaveIn (time, MonitorProc);
00232     time = ROUND ((int) wav.size() / txWaveSampleRate);
00233 
00234     printf ("\nRecorded: %2d sec\n",  time/1000);
00235     printf ("\nPlaying %2d sec...\n", time/1000);
00236 
00237     HWAVEOUT waveOut = txWaveOut (wav);
00238     while (!_kbhit() && txWaveGetPosition (waveOut) < wav.size()) Sleep (100);
00239     txWaveOut (0);
00240 
00241     printf ("\nSaving to WAV file...\n\n");
00242     txWaveSaveWav (wav, "Recording.wav");
00243     }
00244 
00245 bool MonitorProc (HWAVEIN, txWaveData_t& data, void*)
00246     {
00247     static const char line1[] = "---------------";
00248     static const char line2[] = "|||||||||||||||";
00249     static const int  lineSz  = sizeof (line1) - 1;
00250 
00251     unsigned pos  = (unsigned) data.size();
00252     unsigned size = (unsigned) data.capacity();
00253     unsigned done = (unsigned) (100 * pos/size);
00254 
00255     double avr = 10;
00256     if (pos >= 100) for (unsigned i = pos - 100; i < pos; i++) avr += (abs (data[i][0]) + abs (data[i][1])) / txWaveVolMax;
00257     int vol = (avr <= 100)? (int) avr : 100;
00258 
00259     printf ("Done %6u/%6u samples   [%.*s|%.*s] %3u%%  [%.*s%.*s%s %3d%%  \r",
00260              pos, size,
00261              (int) (lineSz*done/100), line1, (int) (lineSz - lineSz*done/100), line1,                         done,
00262              (int) (lineSz*vol /100), line2, (int) (lineSz - lineSz*vol /100), line1, (vol < 100? "]" : "X"), vol);
00263 
00264     return (_kbhit()? ((void) _getch(), false) : true);
00265     }
00266 
00267 //-----------------------------------------------------------------------------------------------------------------
00268 
00269 // For idea of this demo see: https://www.youtube.com/watch?v=kPRA0W1kECg
00270 
00271 struct Number_t
00272     {
00273     int val_;
00274 
00275     Number_t();
00276 
00277     Number_t& operator = (const Number_t& that);
00278     bool      operator < (const Number_t& that) const;
00279 
00280     bool draw (COLORREF color, COLORREF fillColor) const;
00281 
00282     static void setinfo (const Number_t* data, size_t size);
00283 
00284     static const Number_t* data__;
00285     static       size_t    size__;
00286     };
00287 
00288 const Number_t* Number_t::data__   = NULL;
00289       size_t    Number_t::size__   = 0;
00290 
00291 Number_t::Number_t() :
00292     val_ (88 + rand() % 2552)
00293     {}
00294 
00295 void Number_t::setinfo (const Number_t* data, size_t size)
00296     {
00297     data__ = data;
00298     size__ = size;
00299 
00300     for (unsigned i = 0; i < size__; i++) data__[i].draw (RGB (64, 64, 64), RGB (32, 32, 32));
00301     }
00302 
00303 bool Number_t::draw (COLORREF color, COLORREF fillColor) const
00304     {
00305     if (_kbhit()) throw EOF;
00306 
00307     const int width = 9;
00308 
00309     int n = (int) (this - data__);
00310     if (!data__ || !(0 <= n && n < (int) size__)) return false;
00311 
00312     int x0 = txGetExtentX()/2 - width * (int)size__/2;
00313 
00314     txSetColor (TX_BLACK); txSetFillColor (TX_BLACK);
00315     txRectangle (x0 + n*width, 500, x0 + (n+1)*width, 500 - 400);
00316 
00317     txSetColor (color); txSetFillColor (fillColor);
00318     txRectangle (x0 + n*width, 500, x0 + (n+1)*width, 500 - val_/10);
00319 
00320     return true;
00321     }
00322 
00323 Number_t& Number_t::operator = (const Number_t& that)
00324     {
00325     if (_kbhit()) throw EOF;
00326 
00327     val_ = that.val_;
00328     draw (TX_WHITE, TX_LIGHTGRAY);
00329 
00330     return *this;
00331     }
00332 
00333 bool Number_t::operator < (const Number_t& that) const
00334     {
00335     if (_kbhit()) throw EOF;
00336 
00337     this->draw (TX_LIGHTRED, TX_RED);
00338     that. draw (TX_LIGHTRED, TX_RED);
00339 
00340     txWaveOut (50, val_, 10, that.val_, 10);
00341 
00342     this->draw (TX_WHITE, TX_LIGHTGRAY);
00343     that. draw (TX_WHITE, TX_LIGHTGRAY);
00344 
00345     return val_ < that.val_;
00346     }
00347 
00348 void Sort1Demo()
00349     {
00350     try
00351         {
00352         Number_t data[16];
00353         Number_t::setinfo (data, sizearr (data));
00354 
00355         for (int left = 0, right = (int) sizearr (data) - 1; left < right; )
00356             {
00357             bool change = false;
00358 
00359             for (int i = left; i < right; i++)
00360                 if (data[i+1] < data[i]) { std::swap (data[i+1], data[i]); change = true; }
00361 
00362             right--;
00363             if (!change) break;
00364 
00365             change = false;
00366 
00367             for (int i = right-1; i >= left; i--)
00368                 if (data[i+1] < data[i]) { std::swap (data[i+1], data[i]); change = true; }
00369 
00370             left++;
00371             if (!change) break;
00372             }
00373         }
00374 
00375     catch (...) {}
00376     }
00377 
00378 void Sort2Demo()
00379     {
00380     try
00381         {
00382         Number_t data[32];
00383         Number_t::setinfo (data, sizearr (data));
00384 
00385         std::sort (data, data + sizearr (data));
00386         }
00387 
00388     catch (...) {}
00389     }
00390 
00391 void Sort3Demo()
00392     {
00393     try
00394         {
00395         Number_t data[32];
00396         Number_t::setinfo (data, sizearr (data));
00397 
00398         std::stable_sort (data, data + sizearr (data));
00399         }
00400 
00401     catch (...) {}
00402     }
00403 
00404 //-----------------------------------------------------------------------------------------------------------------
00405 
00406 void Banner (const char* text)
00407     {
00408     if (txWindow() && IsWindowVisible (txWindow()))
00409         {
00410         static POINT size = txGetExtent();
00411 
00412         if (*text != '\f')
00413             {
00414             txSetFillColor (TX_BLACK);
00415             txClear();
00416             }
00417         else
00418             text++;
00419 
00420         if (*text == '\r') text++;
00421         if (*text == '\t') text++;
00422 
00423         txSetFillColor (TX_WHITE);
00424         txSetTextAlign (TA_CENTER);
00425 
00426         txSetColor (TX_WHITE); txRectangle (0, size.y * 0.95, size.x, size.y);
00427         txSetColor (TX_BLACK); txDrawText  (0, size.y * 0.95, size.x, size.y, text);
00428         txSleep (0);
00429 
00430         txSetColor (TX_WHITE);
00431         }
00432     else
00433         {
00434         $y;
00435         if (*text == '\f') {     text++; }
00436         if (*text == '\r') { $r; text++; }
00437         if (*text == '\t') { $d; text++; }
00438 
00439         printf ("%s\n\n", text);
00440 
00441         $d;
00442         }
00443     }
00444 
00445 void Pause()
00446     {
00447     Banner ("\f\t" "Press a key to continue...");
00448 
00449     while (_kbhit()) (void) _getch();
00450     (void) _getch();
00451     }