![]() |
TX Library Help – Version: 00173a, Revision: 174
|
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 }