![]() |
Amplitude und Frequenz durch BASS_ChannelGetData
Hallo,
Ich versuche seit einer Woche eine Möglichkeit zu finden, bei der ich eine Amplitude und Frequenz des momentanen Audioausgang Channels zu bekommen. Nach erstenversuchen direkt den iTunes Com-Port zu benutzen musste ich festellen, dass dies dort nicht geht. Nach etwas weiterem suchen, bin ich auf die Bass.dll gestoßen. Durch Google und diversen Foren bin ich dann auf 'BASS_ChannelGetData' gekommen. Da ich Delphi in der Schule seit nem Monat ca. beigebracht bekomme und dies recht langwierig sich zieht, habe ich noch nicht genpügend Kenntnisse bei Feinheiten in Delphi :cry: Ich habe durhc Suchen in Foren rausbekommen, dass die Funktion 'BASS_ChannelGetData' genau meine Bedürfnisse dekcen sollte. Doch leider habe ich nirgends gefunden, wie genau ich diese in meine procedure einzubinden habe, und wie ich die Daten dann vernünftig auslesen kann. Ich glaube es liegt an meinen Mangelnden Kenntnissen von Arrays und Pointern, die diese Funktion anscheinend braucht. Deswegen hier meine Frage: wie habe ich BASS_ChannelGetData richtig einzubinden, damit ich auslesen kann, wie hoch der aktuele Pegel einer bestimmt Frequenz ist :?: Meine bisherigen Versuche sind leider alle kläglich gescheiter.
Delphi-Quellcode:
Dies ist glaue ich mehr falsch als richtig, deswegen würde ich euch bitten, mir einmal zu erklären wie das funktioniert und wie ich das einzubinden habe etc.
data := BASS_ChannelGetData(ch,@fft,BASS_DATA_FFT1024);
Falls noch fragen sind beantworte ich diese gerne. Grüße Killerregenwurm |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
*Push*
Kann mir da echt keiner weiterhelfen? |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
nahc langem tüfteln und rumprobieren bin ich endlich ein Stpck weiter:
Delphi-Quellcode:
dies habe ich auf grundlagen von dieser
procedure TmfMovinhead.btItunesClick(Sender: TObject);
var ch:HMusic; fft : array[1..256] of single; n,i : integer; begin self.laItunetrackOut.caption := getCurrentTitle(iTunesApp); BASS_ChannelGetData(ch,@fft,BASS_DATA_FFT512); PaintBox1.Canvas.FillRect(rect(0, 0, paintbox1.width, paintbox1.height)); PaintBox1.Canvas.Pen.Color := clBlack; for i := 1 to 256 do begin n := round(fft[i]); PaintBox1.Canvas.PenPos := point(i, 100); PaintBox1.Canvas.LineTo(i, 100 - n); self.Label3.Caption := self.Label3.Caption+ IntToStr(i) + ':' + intToStr(n) + ' ,'; end; end; ![]() der fft wird richtig belegt, nur kommt nach dem runden 0 als n raus und und nach dem zweiten Schleifendurchgang bricht das Programm ab und gibt an 'ungültige Gleitkommaoperation' Kann es sein, dass ich den Channel falsch belegt habe? ich möchte den normalen ausgang überprüfen, auf dem Musik und so die Soundkarte verlässt. Ich freue mich sehr über jede Antwort die mir hilft. Grüße |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
Liste der Anhänge anzeigen (Anzahl: 1)
|
Re: Amplitude und Frequenz durch BASS_ChannelGetData
vielen dank.
Das ist mal nen Beispiel das direkt funktioniert. Allerdings bräuchte ich dies für den Output Kanal, nicht wie dort für Input (also mikro). Was muss ich dennd ann ändern? Grüße Killerregenwurm |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
Du kannst den Eingang selber wählen.
Ob du an den Masterausgang kommst, liegt an deiner Soundkarte und deinem Treiber. Über den "Stereo Mix" oder ähnliche Bezeichnung kannst du an deine Masterspur kommen. Siehe dazu auch ![]() Gruss Thorsten |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
der Link ist zwar ganz nett, aber so wirklich weitergebracht hat er mich nicht.
Ich suche wirklich nur noch die möglichkeit den Soundmix in
Delphi-Quellcode:
BASS_ChannelGetData(channel,@fft,BASS_DATA_FFT512);
in den Handle Channelden Soundmix reinzubekommen.... Habe jetzt versucht durch die BassTest oben den richtigen device und kanalauszuwählen aber kein erfolg :( Das geht doch bestimmt, aber irgendwie stehen ich hier gerade voll auf dem Schlauch.... |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
Schade das du das nicht verstanden hast.
Der Link sollte nur die Problematik verdeutlichen. Das was du willst muss deine Soundkarte unterstützen. Dies geht über den Aufnahmeeingang "Stereo Mix", dieser wird aber bei neueren Soundkarten von den Herstellern unterdrückt. Falls du also so einen Eingang nicht hast, dann hast du leider Pech gehabt. Da kannst du dann auch nichts machen. Ich weiss nicht was daran jetzt so unverständlich ist. Endweder hat deine Soundkarte eine Möglichkeit den Gesamtausgang aufnehmen zu können und über diesen Aufnahmeeingang an alles was du in deinen Lautsprechern hörst ranzukommen, dann kannst du das über mein Programm auswählen oder eben nicht. Wenn nicht, dann geht das nicht. Dies ist kein Softwareproblem sondern ein Hardwareproblem. Sorry, aber wie oft soll ich es noch wiederholen? Gruss Thorsten |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
den Aufnahme Kanal StereoMix habe ich.
Doch auch wenn ich diesen, über die Windows Soundcontrol auswähle aus Aufnahme Kanal ändert dies nichts im Programm BassTest. Dies hatte ich schon vorher ausprobiert. Fakt ist, da ich StereoMix habe, dass ich als channel in Bass_channelGetData diesen Stereomix angeben kann. Doch dies bekomme ich nicht gebacken... Muss ich also, wenn ich StereoMix als Aufnahme Kanal ausgweählt habe, den Channel den typ HRecord zuweisen? und muss dem Channel dann noch der Kanal oder ähnliches genannt werden? |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
Ok, du hast also so einen Aufnahmeeingang. Das ist doch schonmal eine Aussage.
Wieso wählst du das im Windows Controlcenter aus? In meinem Beispiel hast du doch zwei Auswahlboxen über die Erste wählt du die zuverwendende Soundkarte (wenn mehr als eine vorhanden ist) und über die zweite Auswahlbox wählst du den Aufnahmeeingang. Wenn du Start aktiviert hast und eine Soundausgabe vorliegt, wird dir das Spektrum angezeigt. Hast du damit Probleme oder wie du das jetzt in Delphi selber machst? Ich werde aus deinem Text leider nicht schlau, kannst du nicht etwas konkreter sein? Gruss Thorsten |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
zum einen: Ja ich habe damit Probleme wie Delphi das macht^^
zum anderen, ich kann bei deinem Test Programm nach wählen des Sounddevices also meiner Soundkarte nur ein Mirko auswählen :( Aber bei delphi muss ich dann erstmal über BASS_RecordSetDevice(i); die Karte Auswählen und danach über BASS_RecordSetInput(i, BASS_INPUT_ON) den richtigen Kanal, oder? |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
Ok, ich glaube ich verstehe jetzt langsam dein Problem.
Du möchtest ein Programm schreiben das immer den Masterausgang anzeigt. Dein Problem dabei ist welcher Eingang ist das? Aber das ist doch die ganze Zeit auch schon das Thema hier. Da du nicht weißt was auf anderen Rechnern für Soundkarten eingebaut sind kannst du das eigentlich nie genau automatisch rausfinden. Es kann Soundkarten geben, die solch einen Ausgang gar nicht haben oder er heisst dort anders oder er ist an einem anderen Indexplatz. Du könntest nach dem Namen suchen und einen Auswahlvorschlag machen. Trotzdem würde ich aber immer auch die Auswahlmöglichkeit lassen. Was ist wenn es den Mastereingang nicht gibt und der Benutzer aber gerne den WAVE-Eingang ansehen möchte? Vielleicht verstehe ich dich aber auch nicht richtig, sorry. Meine Frage ist eigentlich erstmal nur eine funktioniert das Beispielprogramm bei dir? Kannst du da ein Spektrum sehen. Das ist doch nur ein minimal Beispiel, das du erstmal verstehen musst und dann kannst du anfangen alles umzubauen oder zu erweitern. Edit: und ja deine Frage: ja das ist richtig. Gruss Thorsten |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
ok,
das Programm muss auch gar nicht auf anderen Rechnern erstmal laufen, da es im eh bestimme Externe Hardware braucht, die nur an diesem Rechner existiert. Bei deinem Programm sehe ich ein Spektrum des Mikro einganges. Bei Sounddevice kann ich zwischen meiner webcam(oben) und meiner Soundkarte(unten) wählen. Also ist die Webcam sounddevice 0 und die Soundkarte 1, oder? bei Input kann ich beidemale nur ein Mikrofon wählen. leider hier nicht Stereomix oder den line Eingang, den ich auch habe. Ob das Programm Master oder Wave abgreift, ist eher egal, da ich als Hauptziel das Spektrum der Musik haben möchte wäre Wave komfortabler. Dies halte ich aber erstmal für nebensächlich, da es ja erstmal überhaupt gehen sollte *grins* Was ich bei deinem Programm nicht ganz durschaue ist, bei RecordingCallback den Handle belegts. Achja kannst du mir mal sagen wofür eigentlich das @ genau macht, ich hab das jetzt einfach so benutzt weiß aber ehrlich nicht genau was das bewirkt. |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
Liste der Anhänge anzeigen (Anzahl: 1)
Ups, da war noch ein Fehler. Beim wechseln des Devices wurden die Eingänge nicht neu geladen. Ich vermute mal dein Webcam-Device ist das erste Device und hat nur das Mikrofon. Versuch es mal mit der neuen Version.
Über
Delphi-Quellcode:
wird die Aufnahme gestartet. Dabei enthält _Channel den Aufnahmehandle, dies ist hier aber nur für das Stoppen wichtig.
_Channel:=BASS_RecordStart(44100, 2, 0, @RecordingCallback, 0);
Delphi-Quellcode:
Beim Start wird nämlich eine Callback-Routine installiert, die von der Bass.dll automatisch aufgerufen wird.
BASS_ChannelStop(_Channel);
Delphi-Quellcode:
und dieser Routine übergibt die Bass.dll den Kanalhandle, wenn sie die Routine aufruft.
function RecordingCallback(Handle: HRECORD; buffer: Pointer; length,
user: DWord): boolean; stdcall; Das @-Zeichen weisst den Delphicompiler an die Adresse der Routine zu übergeben, damit die Dll von "außen" deine Routine findet und aufrufen kann. In dem ![]() Gruss Thorsten |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
vielen dank langsam raff ich es :coder2: :D
Delphi-Quellcode:
procedure TmfMovinhead.btItunesClick(Sender: TObject);
var _Channel:HStream; fft : array[1..512] of single; n,i : integer; dName: PChar; begin BASS_RecordInit(-1); self.laDevice.caption := BASS_RecordGetDeviceDescription(0); BASS_RecordSetDevice(0); self.laInput.Caption := BASS_RecordGetInputName(3); BASS_RecordSetInput(3, BASS_INPUT_ON); _Channel:=BASS_RecordStart(44100, 2, 0, nil , 0); self.laItunetrackOut.caption := getCurrentTitle(iTunesApp); BASS_ChannelGetData(_Channel,@fft,BASS_DATA_FFT512); PaintBox1.Canvas.FillRect(rect(0, 0, paintbox1.width, paintbox1.height)); PaintBox1.Canvas.Pen.Color := clBlack; for i := 1 to 256 do begin n := round(fft[i]*100); PaintBox1.Canvas.PenPos := point(i, 100); PaintBox1.Canvas.LineTo(i, 100 - n); self.Label3.Caption := self.Label3.Caption+ IntToStr(i) + ':' + intToStr(n) + ' ,'; end; BASS_ChannelStop(_Channel); bass_free; end; endlich klappt es so wie es soll :bounce1: :) danke echt, ich war schon kurz vorm verzweifeln. Hab einfach bei mir die Webcam gezogen, dann konnte ich die verschieden Inputs auhc wählen, aber ich glaub das refreshen beim wechseln des Inputs hat nun auch noch nicht ganz so geklappt wie es sollte bei dir. Müsste ich nochmal genau beobachten wennd ie Webcam wieder angeschlossen ist. Falls ich nochmal probleme habe komm ich einfach auf dich zurück :cheers: |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
Schön das du weiterkommst.
Zitat:
Gruss Thorsten |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
also das updaten der InputListe funktioniert noch nicht bei device change.
wenn du willst kann ich das dann noch für dich testen bis das klappt ;) |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
Liste der Anhänge anzeigen (Anzahl: 1)
Hier nochmal ein neuer Versuch...
|
Re: Amplitude und Frequenz durch BASS_ChannelGetData
:dancer: nice klappt jetzt
|
Re: Amplitude und Frequenz durch BASS_ChannelGetData
Hallo,
bei mir klappt das überhaupt nicht habe Probleme mit der bass.dll. Es wäre nett wenn du die mal posten könntest. Prozedureinstiegspunkt Bass_recordsetdevice wurde in der bass.dll nicht gefunden. Grüsse Rainer |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
Ich war eigentlich der Meinung ich hätte die neuste Version benutzt. Link siehe Post 14.
Gruss Thorsten |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
Ich hoffe ich bin nicht zu spät ;). Ich habe es ausprobiert(Bass.dll in ordner reingepackt) auf jedenfall Kommen bei mir gleich 2 Fehler.
Zitat:
Zitat:
|
Re: Amplitude und Frequenz durch BASS_ChannelGetData
Ich habe keine Ahnung was da bei euch nicht geht.
Ich habe mein letztes Archiv nochmal heruntergeladen + ![]() |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
Zitat:
gruss Emil |
Re: Amplitude und Frequenz durch BASS_ChannelGetData
schön schön,
ist ja schonmal das, was ich haben möchte. nur wie baue ich jetzt die balkenansicht aus dem beispiel samplevis ein? also mit den peaks und konsorten. steh da nen bissel auf dem schlauch. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 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