diff --git a/README.md b/README.md index 80a40a5..80bdd88 100644 --- a/README.md +++ b/README.md @@ -59,13 +59,17 @@ ### Keybindings -* **Quitting**: q. -* **Change drawing mode (style)**: Space bar -* **Move status panel** (if built with libmpdclient): up / down / left / right keys -* **Reset status panel position**: r -* **Toggle status display**: t -* **Toggle beat display**: s -* **Print help**: h +* Quit: **q** +* Change drawing mode (style): **Space bar** +* Move status panel (if built with libmpdclient): **up / down / left / right keys** +* Reset status panel position: **r** +* Toggle status display: **t** +* Toggle beat display: **b** +* Increase base frequency of logarithmic bins: **F** +* Decrease base frequency of logarithmic bins: **f** +* Decrease octave divider of logarithmic bins: **O** +* Increase octave divider of logarithmic bins: **o** +* Print this help: **h** ## Configuration diff --git a/src/fft.c b/src/fft.c index 5a5f53b..0b37c77 100644 --- a/src/fft.c +++ b/src/fft.c @@ -114,16 +114,15 @@ // average fftBuf using a logarithmic scale for bins, to respect octaves void -average_signal(unsigned int *fftBuf, const int inLen, const int max, unsigned int* fftAvg) +average_signal(unsigned int *fftBuf, const int inLen, const int max, const double bf, const int oratio, unsigned int* fftAvg) { int i = 0; int j = 0; int amp = 0; int first = 0; int last = 1; - int oratio = 24; - double f = 80; int div = 43; + double f = bf; while(last <= inLen/2) { @@ -147,7 +146,7 @@ if(j < max) fftAvg[j] = val; } - //fprintf(stderr, "%d: %d, first: %d, f: %f, last: %d\n", i, fftAvg[i], first, f, last); + /* fprintf(stderr, "%d: %d, first: %d, f: %f, last: %d\n", i, fftAvg[i], first, f, last); */ amp = 0; i += FOCUS; diff --git a/src/fft.h b/src/fft.h index 67b4de8..77f5da5 100644 --- a/src/fft.h +++ b/src/fft.h @@ -16,5 +16,5 @@ void print_components(cplx *a, int len); unsigned int amplitude(cplx c, unsigned int n); void fast_fft(int inLen, uint16_t *sig, unsigned int* fftSig); -void average_signal(unsigned int *fftBuf, int inLen, int maxC, unsigned int *fftAvg); +void average_signal(unsigned int *fftBuf, int inLen, int maxC, const double f, const int oratio, unsigned int *fftAvg); void avgEnergy(unsigned int* fftBuf, const int inLen, unsigned int* energyBuf); diff --git a/src/music_visualizer.c b/src/music_visualizer.c index d346751..0e1572c 100644 --- a/src/music_visualizer.c +++ b/src/music_visualizer.c @@ -37,14 +37,15 @@ void process_fifo (uint16_t* buf, unsigned int* fftBuf, unsigned int* fftAvg, \ - cebuffer* energyBuffer, int nsamples, unsigned int* energyThreshold, bool* beat) + cebuffer* energyBuffer, int nsamples, unsigned int* energyThreshold, bool* beat, + const double basefreq, const int oratio) { // fft of samples array fast_fft(nsamples, (uint16_t*)buf, fftBuf); // computes an average of the signals in fftBuf // based on the number of columns of the screen - average_signal(fftBuf, nsamples, maxC, fftAvg); + average_signal(fftBuf, nsamples, maxC, basefreq, oratio, fftAvg); unsigned int avg = 0; if(energyBuffer->count > 0) { @@ -65,7 +66,7 @@ // main loop to print column by column for(i=0; i= 150 && basefreq < 2000) basefreq -= 20; + else basefreq -= 200; + break; + case 'F': + if(basefreq >= 22100) break; + if(basefreq < 250) basefreq += 2; + else if(basefreq >= 150 && basefreq < 2000) basefreq += 20; + else basefreq += 200; + break; + case 'o': + if(oratio <= 1) break; + oratio -= 1; + break; + case 'O': + if(oratio >= 64) break; + oratio += 1; + break; default: break; } @@ -174,7 +197,7 @@ ret = read(fifo, (uint16_t*)buf, 2*nsamples); // process read buffer if(cnt == NICENESS) { - process_fifo(buf, fftBuf, fftAvg, &energyBuffer, nsamples, &energyThreshold, &beat); + process_fifo(buf, fftBuf, fftAvg, &energyBuffer, nsamples, &energyThreshold, &beat, basefreq, oratio); cnt = 0; } else { cnt++; @@ -213,10 +236,10 @@ // print mpd status even if no new data is avaiable if (toggleStatus) { if (status && status->song && status->song->duration_sec) { - print_rate_info(sampleRate, nsamples, maxC, status->song->duration_sec, beat); + print_rate_info(sampleRate, nsamples, maxC, status->song->duration_sec, basefreq, oratio); cnt_over = 0; } - print_mpd_status(status, maxC, maxR/2-statusHeight-2, statusCol); + print_mpd_status(status, maxC, maxR/6-statusHeight-2, statusCol); } #endif // refresh screen diff --git a/src/settings.h b/src/settings.h index b422699..bdcb74b 100644 --- a/src/settings.h +++ b/src/settings.h @@ -73,13 +73,13 @@ // subtracted to each component (visualized column) // adjust according to screen height -#define Y_CORRECTION 35 +#define Y_CORRECTION 40 // adjust lateral shift on screen // some optimal values are provided // adjust based on terminal dimensions -/* #define X_CORRECTION 0 // 1280x1024 screens (5:4) */ -#define X_CORRECTION 8 // 1920x1080 screens (16:9) +#define X_CORRECTION 1 // 1280x1024 screens (5:4) +/* #define X_CORRECTION 8 // 1920x1080 screens (16:9) */ /* =========== ALSA Support (WIP) ============ */ diff --git a/src/utils_curses.c b/src/utils_curses.c index c59fa24..46b715c 100644 --- a/src/utils_curses.c +++ b/src/utils_curses.c @@ -128,8 +128,8 @@ print_subw(WINDOW* sub, const bool beat, const int maxR, const int maxC) { int row, col; - int color = 5; - + int bcolor = 6; + int ncolor = 0; int rr = genrand_int32() % maxR/3; rr += maxR/3; @@ -149,9 +149,12 @@ } } } + + wcolor_set(sub, bcolor, NULL); mvwprintw(sub, 1, maxC/2-6, " ---------- "); mvwprintw(sub, 2, maxC/2-6, " || BEAT || "); mvwprintw(sub, 3, maxC/2-6, " ---------- "); + wcolor_set(sub, ncolor, NULL); } @@ -165,15 +168,19 @@ mvprintw(2, 0, "Configuration: see src/settings.h"); mvprintw(4, 0, "Keybindings:"); color_set(3, NULL); - mvprintw(5, 0, "* Quit: q"); - mvprintw(6, 0, "* Change drawing mode (style): Space bar"); - mvprintw(7, 0, "* Move status panel (if built with libmpdclient): up / down / left / right keys"); - mvprintw(8, 0, "* Reset status panel position: r"); - mvprintw(9, 0, "* Toggle status display: t"); - mvprintw(10, 0, "* Toggle beat display: s"); - mvprintw(11, 0, "* Print this help: h"); + mvprintw(5, 0, "* Quit: \t\t\t\t\t\tq"); + mvprintw(6, 0, "* Change drawing mode (style): \t\t\t\tSpace bar"); + mvprintw(7, 0, "* Move status panel (if built with libmpdclient): \tup / down / left / right keys"); + mvprintw(8, 0, "* Reset status panel position: \t\t\t\tr"); + mvprintw(9, 0, "* Toggle status display: \t\t\t\tt"); + mvprintw(10, 0, "* Toggle beat display: \t\t\t\t\tb"); + mvprintw(11, 0, "* Increase base frequency of logarithmic bins: \t\tF"); + mvprintw(12, 0, "* Decrease base frequency of logarithmic bins: \t\tf"); + mvprintw(13, 0, "* Decrease octave divider of logarithmic bins: \t\tO"); + mvprintw(14, 0, "* Increase octave divider of logarithmic bins: \t\to"); + mvprintw(15, 0, "* Print this help: \t\t\t\t\th"); color_set(1, NULL); - mvprintw(12, 0, "--> Press any key to continue."); + mvprintw(16, 0, "--> Press any key to continue."); timeout(-1); getch(); timeout(0); @@ -181,23 +188,24 @@ #ifdef STATUS_CHECK void -print_rate_info(const int rate, const int nsamples, const int maxC, int seed, const bool beat) +print_rate_info(const int rate, const int nsamples, const int maxC, int seed, const double basefreq, const int oratio) { - int center = (int) maxC/2-18; // adjust to screen center + int center = (int) maxC/2-33; // adjust to screen center int i; srand(seed); color_set(rand() % 7, NULL); - mvprintw(1, center, " || rate: %d - samples: %d || ", rate, nsamples); - if (nsamples != 512 && rate > 0) { - mvprintw(0, center, " --------------------------------- ", rate, nsamples); - mvprintw(2, center, " -------------[mvc]--------------- ", rate, nsamples); - } else if (rate == 0) { - mvprintw(0, center, " ----------------------------- ", rate, nsamples); - mvprintw(2, center, " -----------[mvc]------------- ", rate, nsamples); + mvprintw(1, center, " || rate: %d - samples: %d - base freq: %.0f Hz - 1/%d octave || ", rate, nsamples, basefreq, oratio); + if (nsamples != 512 && rate > 0 && basefreq < 100 && oratio >= 10) { + mvprintw(2, center, " ------------------------------[mvc]------------------------------- "); + } else if (oratio < 10 && basefreq >= 100) { + mvprintw(2, center, " ------------------------------[mvc]------------------------------- "); + } else if (oratio < 10 && basefreq < 100) { + mvprintw(2, center, " ------------------------------[mvc]------------------------------ "); + } else if (basefreq >= 100) { + mvprintw(2, center, " ------------------------------[mvc]-------------------------------- "); } else { - mvprintw(0, center, " -------------------------------- ", rate, nsamples); - mvprintw(2, center, " ------------[mvc]--------------- ", rate, nsamples); + mvprintw(2, center, " ------------------------------[mvc]------------------------------- "); } } diff --git a/src/utils_curses.h b/src/utils_curses.h index c0f466a..dab3b46 100644 --- a/src/utils_curses.h +++ b/src/utils_curses.h @@ -10,7 +10,7 @@ WINDOW* curses_init(); void print_col(int col, int length, const int maxR, const int maxC, PATTERN pattern, int seed); void print_subw(WINDOW* sub, const bool beat, const int maxR, const int maxC); -void print_rate_info(const int rate, const int nsamples, const int maxC, int seed, const bool beat); +void print_rate_info(const int rate, const int nsamples, const int maxC, int seed, const double basefreq, const int oratio); void print_help(const int maxR, const int maxC); #ifdef STATUS_CHECK