![]() |
equalizer mit der bass.dll
Hallo, ich mach gerade nen mediaplayer mit der bass.dll.
hab das teil jetzt auch zum laufen bekommen, und wollte nen equalizer einbauen. Ich weiß, gleich will mir wieder einer nen link andrehen, aber ich hab auch schon selbs gesucht, und nicht wiklich eine gute beschreibung gefunden. und ich kenn mir auch noch nicht gut mit der bass dll aus, deshalb brauch ich da was ausführlicheres. Also? kann mir jamand helfen? |
Re: equalizer mit der bass.dll
Hast Du schon einmal bei Demo Samples der Bass.dll reingeschaut ?
...bass21\Delphi\fxtest\FXTest.dpr <- Ein einfaches Beispiel für einen EQ |
Re: equalizer mit der bass.dll
ja, gerade eben, es tut zwar, aber richtig verstanden hab ichs net
warum braucht man das?
Delphi-Quellcode:
und für was ist
fx[1] := BASS_ChannelSetFX(chan, BASS_FX_PARAMEQ, 1);
fx[2] := BASS_ChannelSetFX(chan, BASS_FX_PARAMEQ, 1); fx[3] := BASS_ChannelSetFX(chan, BASS_FX_PARAMEQ, 1); fBandwidth := 18; da? [edit=alcaeus]delphi-Tags Mfg, alcaeus[/edit] |
Re: equalizer mit der bass.dll
Delphi-Quellcode:
Damit wird der Effekt auf/zum dem aktuellem Stream ( Channel ) gesetzt, mit der Priorität 1.
... := BASS_ChannelSetFX(chan, BASS_FX_PARAMEQ, 1);
Also den aktuellen Stream den EQ- Effekt zuweisen. Mann kann somit auch einzelnen Kanälen verschiedene Effekte zuweisen. z.B.: - MP3-Kanal bekommt einen Halleffect, - Musick–Kanal einen Chorus, …usw. fBandwidth - da wird irgend eine Bandbreite gesetzt (in Semitones) 1 bis 36. Semitones: kann ich jetzt nicht genau sagen (¿ Durchschnittliche Töne ?) |
Re: equalizer mit der bass.dll
ok, danke.
Kann mir jezt noch jemand sagen, wie ich mit BASS_ChannelGetData ne visualisierung machen kann. es soll nur was einfaches sein! und gibts vieleicht ein gutes tutorial auf deutsch zu der bass.dll? |
Re: equalizer mit der bass.dll
Delphi-Quellcode:
isch das schon eine?
image1.Picture.LoadFromFile('J:\mediaplayer\bass\a.bmp');
Bass_ChannelGetData(stream, @data, BASS_DATA_FFT512); for i := 1 to 256 do begin image1.Canvas.LineTo(i, strtoint(formatfloat('0',450-data[i]*2000)) ); end; end; also ausshen tuts schon wie eine! [edit=alcaeus]Delphi-Tags Mfg, alcaeus[/edit] |
Re: equalizer mit der bass.dll
Ich würde es eher so machen (Spectrumanalyzer) :
Delphi-Quellcode:
var data : array[1..255] of Single; i : byte; begin Bass_ChannelGetData(stream, @data, BASS_DATA_FFT512); Paintbox1.Canvas.FillRect(Paintbox1.ClientRect); Paintbox1.canvas.Lineto(0, Paintbox1.height); for i := 0 to 255 do begin Paintbox1.Canvas.Lineto(i, Paintbox1.Height - round( Data[i] * 200 ) ); // strtoint(formatfloat('0',450-data[i]*2000)) ); ??? end; ... |
Re: equalizer mit der bass.dll
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich das so mach, wie von Dr. No vorgeschlagen, kommt etwa sowas bei raus: (siehe Anhang)
Der Abstand zwischen den Balken gibt zwar schon die Frequen an, aber so richtig schön (Oszillokop wie bei Winamp) ist es nicht grad.... Wie geht´s ??? (habe die Schleife aber bis 2048 laufen lassen, weil ich der Meinung bin, dass ich das irgendwo in der Bass.dll gelesen hätte) |
Re: equalizer mit der bass.dll
Ich fasse mal eine Antwort aus deinen beiden Fragen (hier und
![]() padavan hat im anderen Thread geschrieben: Hab immer die maximale Amplitude und die Frequenz stellt sich im Abstand der Balken dar. Kleine Begriffsklärung: Die X-Achse stellt die Zeit da. Somit ist der Begriff "Frequenz" an dieser Stelle missverständlich - ich musste 3 Mal drüberlesen ;) Wie greifst du auf die Bass.dll zu? GetWaveData z.B. ist kein nativer Aufruf an die DLL. Dort hieße es ChannelGetData, und dort wird erst via Parameter angegeben ob man FFT oder Wave haben möchte. Von daher wäre es schonmal gut wenn du die entsprechenden Funktionen dazuschreiben könntest. Dazu wäre auch der QT deiner Zeichenmethode sehr interessant - die aktuellen Infos sind zu knapp. Zudem sind die Wertebereiche von Wave- und FFT-Daten wenn ich mich nicht irre unterschiedlich. Die Schleife bis 2048 laufen zu lassen ist auch nicht per se richtig. Die gewünschte Länge kann der Bass.dll angegeben werden. Gruss, Fabian |
Re: equalizer mit der bass.dll
Sorry,
du hast natürlich recht, der Quelltext ist recht knapp, hab aber nichts richtiges Vorzuweisen, da ich hin und her probiere. Ich benutze eine Komponente die ich hier gefunden habe, in der die Bass.Dll zur Verfügung gestellt wird. Dort ist der Aufruf BassDllplayer1.Getwavedata wohl das was dir mit ChannelGetData bekannt ist. Das ist mein letzter Versuch
Delphi-Quellcode:
(danke für´s drüber nachdenken)
procedure TForm1.Timer1Timer(Sender: TObject); // Draw Vis.
var data: TFFTData; data1: TwaveData; i: integer; tmpBitmap: TBitmap; begin data1 := BassdllPlayer1.GetwaveData; Paintbox1.Canvas.MoveTo(0, Paintbox1.height div 2); for i := 0 to 255 do begin Paintbox1.Canvas.pen.color := RGB(255 - i, i, 0); Paintbox1.Canvas.LineTo(i,Paintbox1.height div 2 - Data1[i] div Trackbar1.position); // als Offset quasi... end; |
Re: equalizer mit der bass.dll
Die Deklaration von TWaveData wäre an dieser Stelle interessant, wobei es ja aber denk ich ein array of Integer (oder anderem vorzeichenbehafteten Ganzzahltyp) sein müsste. An sich sehe ich in dem QT oben soweit keine groben Schnitzer. Eventuell einfach mal testweise statt der Paintbox.Height und Trackbar.Position fixe Werte einsetzen und schauen ob's ähnlich wird. Aber sonst gäbe es nach dem zu urteilen was du schreibst nur noch 2 Möglichkeiten:
1) Die verwendete Unit macht beim Abholen der Wavedaten Murks (ein Link zur entsprechenden wäre echt hilfreich, oder im Zweifel nochmal hier anhängen) 2) Du hast ein komisches Soundfile :D Ah, ich schau grad in eine Bass-Unit die ich hier von Gandalfus habe. Die Bezeichner sehen doch recht ähnlich aus - evtl. ist sie das ja. Dort ist TWaveData als "array[0..2048] of smallint" deklariert, also wie vermutet. Die Funktion zum Befüllen sieht dort so aus:
Delphi-Quellcode:
...und das nutze ich 1:1 so in meinem Player der damit manche seiner Visuals realisiert. Schau mal nach wie "GetWavedata" bei deiner Unit implementiert ist, und ob TWaveData ähnlich ausschaut. Probier auch mal verschiedene Musikfiles aus, um das als Fehlerquelle auszuschließen.
function TBassPlayer.getwavedata: TWaveData;
begin Bass_ChannelGetData(Channel, @result, 2048); end; Btw noch ein heisser Tipp! Bei Stereo-Daten werden diese in dem Array "interleaved", d.h. in den geraden Indezes des Arrays sind die Daten für den linken Kanal, und in den ungeraden für den rechten :!: Gruss, Fabian |
Re: equalizer mit der bass.dll
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm,
1. Soundfiles sind diverse Musikstücke, würde dies als Fehlerquelle auschließen. 2. Paintbox1.height div 2 setzt in die Mitte, lass ich das weg ist es am oberen Anschlag, bringt auch nichts 3. mir ist nicht klar, welche Unit beim Abholen evtl. murks macht. Ich nehme an, du meinst die Komponente in der die Bass.dll zur Verfügung gestellt wird?! (Hab die Komponente "TBassDllPlayer" mal angehängt.) 4. Das die geraden den linken und die ungeraden den rechten Kanal ausgeben habe ich nicht gewusst, dass war in der Tat ein heißer Tipp :-D Trotzdem hat´s am aussehen nichts geändert. Der Pegel der Visalisierung erinnert nach wie vor eher an einen Gleichstromsteller für Elektromotoren als an Musik :( Ich hab das Gefühl, dass ich sehr nah dran bin, aber irgendwie....
Delphi-Quellcode:
Paintbox1.Canvas.pen.color := RGB(255 - i, i, 0); if i mod 2 = 0 then Paintbox1.Canvas.LineTo(i,Paintbox1.height div 2 - Data1[i] div trackbar3.position); Paintbox1.Canvas.pen.color := clyellow; if i mod 2 = 1 then Paintbox1.Canvas.LineTo(i,Paintbox1.height div 2 - Data1[i] div trackbar3.position); |
Re: equalizer mit der bass.dll
Den "TBassDllPlayer" kann man hier im DP-Forum hrunterladen. :wink:
Besser wäre es wenn du einfach mal Deinen Code anhängen wurdest. Dein QT ist ein bissel knapp. Ich würde mir gern die Zusammenhäng anschauen. Was für eine Vis willst du überhaupt erstellen (Spectrum, Oscilloscop)? |
Re: equalizer mit der bass.dll
Oszilloskop hätte ich gern, Spectrum klappt ja bereits einwandfrei mit FFTData.
Delphi-Quellcode:
Das war´s, erst mal auf´s wesentliche runtergebrochen.
procedure TForm1.FormCreate(Sender: TObject);
begin OpenDialog1.Filter := BassDLLPlayerFileFilter; bkBitmap := TBitmap.Create; bkBitmap.Width := 30; bkBitmap.Height := 30; bkBitmap.Canvas.Brush.Color := clBlack; bkBitmap.Canvas.FillRect(Rect(0, 0, 30, 30)); BitmapRect := Rect(0, 0, bkBitmap.Width, bkBitmap.Height); end; procedure TForm1.Button1Click(Sender: TObject); begin // Open File & Play if Opendialog1.Execute then begin if BassdllPlayer1.LoadFromFile(Opendialog1.FileName) then begin BassdllPlayer1.Play; end; end; (* um nur eine "Probe zu holen" *) procedure TForm1.Button2Click(Sender: TObject); var Data1: Twavedata; i: integer; begin data1 := BassdllPlayer1.GetwaveData; Paintbox1.Canvas.CopyRect(Paintbox1.ClientRect, bkBitmap.Canvas, BitmapRect); Paintbox1.Canvas.MoveTo(0, Paintbox1.height div 2); for i := 0 to 2048 do begin Paintbox1.Canvas.pen.color := RGB(255 - i, i, 0); if i mod 2 = 0 then Paintbox1.Canvas.LineTo(i,Paintbox1.height div 2 - Data1[i] div trackbar3.position); // test für rechten Kanal // Paintbox1.Canvas.pen.color := clyellow; // if i mod 2 = 1 then // Paintbox1.Canvas.LineTo(i,Paintbox1.height div 2 - Data1[i] div trackbar3.position); end; end; hier das für´s Spectrum, was wiegesagt aber schon funzt...
Delphi-Quellcode:
PS: Also um´s auf den Punkt zu bringen:
procedure TForm1.Timer2Timer(Sender: TObject); // Draw Vis.
var data: TFFTData; i: integer; tmpBitmap: TBitmap; begin data := BassdllPlayer1.GetfftData; for i := 0 to 255 do Data[i] := Data[i] * ln(i + 1) * Trackbar1.Position * Paintbox1.ClientHeight; Paintbox1.Canvas.CopyRect(Paintbox1.ClientRect, bkBitmap.Canvas, BitmapRect); Paintbox1.Canvas.MoveTo(0, Paintbox1.height div 2); for i := 0 to 255 do begin Paintbox1.Canvas.pen.color := RGB(255 - i, i, 0); Paintbox1.Canvas.LineTo(i, Paintbox1.height div 2 - round(Data[i])); end; end; Die Frequenz des Lieder wird richtig dargestellt, nur die Spannungshöhe/ der Pegel ist irgendwie falsch, da es wiegesagt mehr an eine Pulsweitenmodulation ausschaut, aber irgendwie gar nicht wie Musik eben. |
Re: equalizer mit der bass.dll
Liste der Anhänge anzeigen (Anzahl: 1)
Ich denke ich bin dem Problem jetzt ganz nah auch die Schliche gekommen.
Habe mal einen 100Hz Ton abgespielt, im Anhang ist zu sehen, was dabei herauskam. Es liegt einfach daran, das ich nicht weiß, was ich mit den Werten aus GetWaveData machen muss, denn: Es ist jetzt eindeutig zu erkennen, dass der Kurvenverlauf an sich ja stimmt, nur das Quasi zwischen jeder Halbwelle irgendwie einen "rießen Offset" reinkommt, der die Welle dann nach oben bzw. nach unten "schiebt". |
Re: equalizer mit der bass.dll
Zitat:
:gruebel:
Delphi-Quellcode:
;-)
RechterKanal := LoWord(WaveData[i]);
LinkerKanal := HiWord(WaveData[i]);
Delphi-Quellcode:
Ähnlichkeiten zu anderen Codes können durchaus entstanden sein. ;-)
procedure OscDraw(Paintbox: TPaintBox; WaveData : TWaveData; ScopeOff: Word);
const DrawRes = 2; // "Genauigkeit" var i, YPos : LongInt; HalfHeight : Integer; R, L : SmallInt; begin With PaintBox do begin // Zeichenstifte setzen Canvas.Pen.Color := clBlack; Canvas.Brush.Color := clBlack; // Hintergrund löschen Canvas.Rectangle(0, 0, Width, Height); // halbe höhe der PaintBox HalfHeight := Height div 2; // Zeichenstifte setzen Canvas.Pen.Color := clRed; Canvas.Pen.Width := 1; // Anfangspos setzen Canvas.moveto(0, HalfHeight); // Daten Zeichnen for i := 0 to 255 do begin R := SmallInt(Loword(WaveData[i * DrawRes])); // Rechter Kanal L := SmallInt(HIword(WaveData[i * DrawRes])); // Linker Kanal // Zusammenrechnen der Kanäle + Zoom YPos := Trunc( ((R + L) / (2 * 65535)) * ScopeOff ) ; Canvas.lineto(i, HalfHeight + YPos); end; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin OscDraw(Paintbox1, BassdllPlayer1.getWaveData, 250); end; Beispiele zu VIS sind im Ordner ..\bass21\Delphi\SampleVis :hi: ...ohne Worte... |
Re: equalizer mit der bass.dll
Liste der Anhänge anzeigen (Anzahl: 1)
WOW,
ich bin offiziell begeistert. Muss mir jetzt erstmal reinziehen was du da gemacht hast, aber ich hab´s übernommen und es funzt genauso wie ich wollte. Vielen Vielen Dank!!! :dancer: |
Re: equalizer mit der bass.dll
Genau deswegen war mir wichtig welche der Bass.dll Wrapper du verwendest - und um den Anhang hatte ich gebeten turboPASCAL, das war schon okay :).
Weil so ist klar was falsch lief. In meiner Version habe ich ein Array von SmallInts, und somit auf jedem Index auch nur einen Wert liegen, wodurch es kommt dass linker und rechter Kanal auf geraden bzw. ungeraden Indezes liegen. Bei der Variante von tP hast du jedoch ein Array von Integern oder Cardinals, die doppelt so breit sind wie SmallInts, und somit landen beide Kanäle auf ein und dem selben Index, nämlich einer im High- und der andere im Low-Word. Beide Varianten sind möglich, und letztlich Geschmackssache was man bevorzugt. Das wäre bei sofortigem Posten der verwendeten Komponente übrigends sofort aufgefallen :zwinker: Gruss, Fabian |
Re: equalizer mit der bass.dll
Liste der Anhänge anzeigen (Anzahl: 2)
Hi, hab noch ein bissel rum gebastelt ;-)
Zitat:
Zitat:
:hi: |
DP-Maintenance
Dieses Thema wurde von "alcaeus" von "Programmieren allgemein" nach "Multimedia" verschoben.
Spaet aber doch...ab nach Multimedia |
Re: equalizer mit der bass.dll
Zitat:
Ich hatte es nicht gleich begriffen :roteyes: Sehr schöne kleine Demo übrigens, gefällt mir. Danke für eure Hilfe nochmal Hoffe dem ursprünglichen Poster hat´s auch noch was gebracht!!! |
Re: equalizer mit der bass.dll
Hab noch oben schnell 'ne Test-MP3 hinzugefügt, für den Soundcheck. ;)
|
Re: equalizer mit der bass.dll
Liste der Anhänge anzeigen (Anzahl: 1)
und ich noch schnell ne Spielerei reingebastelt....
|
Re: equalizer mit der bass.dll
nice. ;)
|
Re: equalizer mit der bass.dll
Bei mir laufen die Beispiele nicht, liegt das an den verschiedenen Delphi Versionen ?
|
Re: equalizer mit der bass.dll
Zitat:
|
Re: equalizer mit der bass.dll
Bei mir stimmt die größe der Analyse nicht (sie ist also zu klein :wink:).
Ich Idiot. Hab vergessen PaintBox mit PaintBox2 zu verwechseln :wall: |
Re: equalizer mit der bass.dll
Liste der Anhänge anzeigen (Anzahl: 1)
Ich schon wieder,
eigentlich wieder ein wenig am Thema des Titels vorbei, aber es hat sich grad so schön warmgelabert :cheers: Hat jemand ne Idee, wie man eine "nachleuchtende" Visualisierung erstellen könnte? Bisher hab ich keinen besseren Ansatz als das was im Anhang zu finden ist. Kommt auf dem Bild nicht so rüber, sieht aber in Aktion gar nicht so schlecht aus. Das Problem ist aber, dass es nicht wirklich nachleuchtend ist, sondern eher gemogelt, setze nämlich via Zufall zwischen jeder 10ten Aufzeichnung einfach eine recht üppige Anzahl von Punkten in Hintergrundfarbe, was sich natürlich "ein wenig" negativ auf die Performance auswirkt, hehe. Sowas in der Art was ich suche, habe ich schon mal hier im Forum gesehen, beim "FKBassplayer", Hut ab vor diesem Teil, da ist sowas auch realisiert. (ich bekomm aber die Komponenten nicht installiert um das nachzuvollziehen). |
Re: equalizer mit der bass.dll
Hi.
@padavan, mach doch bitte einen neuen Thread auf für deine Frage und verlinke dann von hier. |
Re: equalizer mit der bass.dll
Yo, hast ja recht!
:roll: |
Re: equalizer mit der bass.dll
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:
Zitat:
Intern mit einem Bitmap ungefähr so vorgehen: - Bitmap abdunkeln - neu auf das Bitmap zeichnen - das ganze wieder von vorn ... |
Re: equalizer mit der bass.dll
He, erst maßregelst du mich :warn: und dann bringst du mir doch die coole :???: Lösung meines Problems...
Danke dir :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz