MP3 - Höhen-Tiefen Kennlinien anzeigen
-
Guten Tag zusammen,
hat einer eine Idee, wie man die Höhen und Tiefen einer MP3 auslesen und grafisch darstellen kann?Bei schnittprogrammen wie Wavelab werden beispielsweise die MP3's grafisch dargestellt. Währe super wenn mir einer ein paar tipps geben könnte wie das angestellt wird!
Gruß Staati
-
Bei schnittprogrammen wie Wavelab werden beispielsweise die MP3's grafisch dargestellt. Währe super wenn mir einer ein paar tipps geben könnte wie das angestellt wird!
Die Datei wird dekodiert und dann werden die Samplewerte durch Linien dargestellt.
hat einer eine Idee, wie man die Höhen und Tiefen einer MP3 auslesen und grafisch darstellen kann?
Mit einem Filter in zwei Bänder teilen? Keine Ahnung, was du dir da vorstellst.
-
So hab ich mir das vorgestellt:
http://www.musikchannel.at/images/wavelab-mix-2.gifWeißt du ob es libs zum decodieren gibt oder gibts da ein bekanntes verfahren?
Gruß Staati
-
am besten du machst es wie in meinem Linux MultiMedia Studio... SDL_sound benutzen, damit kannst du beliebige Sound-Files dekodieren. dann habe ich selber eine einfache funktion geschrieben, die die wave-daten anzeigt:
void audioFileProcessor::draw_wave_data (QPainter * p, QRect wave_rect, t_wave_draw_method wdm) { //p->fillRect (wave_rect, QColor(0x00, 0x00, 0x00)); p->setPen (QColor(0x77, 0x99, 0x77)); for (int x = 0; x < wave_rect.width(); x += 20) p->drawLine (x+wave_rect.x(), 0+wave_rect.y(), x+wave_rect.x(), wave_rect.height()+wave_rect.y()); for (int y = 0; y < wave_rect.height(); y += 10) p->drawLine (0+wave_rect.x(), y+wave_rect.y(), wave_rect.width()+wave_rect.x(), y+wave_rect.y()); p->setPen (QColor(0x00, 0xFF, 0x88)); if (wdm == LINE_CONNECT) { int old_x = 0; int old_y = wave_rect.height()/2; for (Uint32 sample_num = 0; sample_num < this->p_snd_sample->buffer_size/BYTES_PER_SAMPLE; ++sample_num) { int y = (wave_rect.height()/2) + ((signed short int *) this->p_snd_sample->buffer)[sample_num] * (wave_rect.height()/2-2) / 32768; int x = sample_num*wave_rect.width() / (this->p_snd_sample->buffer_size/BYTES_PER_SAMPLE); p->drawLine (old_x+wave_rect.x(), old_y+wave_rect.y(), x+wave_rect.x(), y+wave_rect.y()); old_x = x; old_y = y; } } else if (wdm == DOTS) { for (Uint32 sample_num = 0; sample_num < this->p_snd_sample->buffer_size/BYTES_PER_SAMPLE; ++sample_num) { int y = (wave_rect.height()/2) + ((signed short int *) this->p_snd_sample->buffer)[sample_num] * (wave_rect.height()/2-2) / 32768; int x = sample_num*wave_rect.width() / (this->p_snd_sample->buffer_size/BYTES_PER_SAMPLE); p->drawPoint (x+wave_rect.x(), y + wave_rect.y()); } } }
is jetzt bloß ein kurzer auszug... mehr gibts unter www.todo-online.de.vu -> Programmierprojekte -> LMMS *werbung mach*