Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Amplitude und Frequenz durch BASS_ChannelGetData (https://www.delphipraxis.net/108604-amplitude-und-frequenz-durch-bass_channelgetdata.html)

Killerregenwurm 16. Feb 2008 11:07


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:
data := BASS_ChannelGetData(ch,@fft,BASS_DATA_FFT1024);
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.

Falls noch fragen sind beantworte ich diese gerne.

Grüße
Killerregenwurm

Killerregenwurm 20. Feb 2008 12:59

Re: Amplitude und Frequenz durch BASS_ChannelGetData
 
*Push*

Kann mir da echt keiner weiterhelfen?

Killerregenwurm 23. Feb 2008 13:31

Re: Amplitude und Frequenz durch BASS_ChannelGetData
 
nahc langem tüfteln und rumprobieren bin ich endlich ein Stpck weiter:
Delphi-Quellcode:
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;
dies habe ich auf grundlagen von dieser Quelle erreicht.

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

omata 23. Feb 2008 22:31

Re: Amplitude und Frequenz durch BASS_ChannelGetData
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal ein Beispiel...

Vielleicht hilft dir das hier auch weiter.

Gruss
Thorsten

Killerregenwurm 23. Feb 2008 22:42

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

omata 23. Feb 2008 22:52

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 hier.

Gruss
Thorsten

Killerregenwurm 24. Feb 2008 09:38

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....

omata 24. Feb 2008 15:36

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

Killerregenwurm 24. Feb 2008 16:20

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?

omata 24. Feb 2008 16:33

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

Killerregenwurm 24. Feb 2008 16:41

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?

omata 24. Feb 2008 16:50

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

Killerregenwurm 24. Feb 2008 17:05

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.

omata 24. Feb 2008 17:27

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:
  _Channel:=BASS_RecordStart(44100, 2, 0, @RecordingCallback, 0);
wird die Aufnahme gestartet. Dabei enthält _Channel den Aufnahmehandle, dies ist hier aber nur für das Stoppen wichtig.
Delphi-Quellcode:
  BASS_ChannelStop(_Channel);
Beim Start wird nämlich eine Callback-Routine installiert, die von der Bass.dll automatisch aufgerufen wird.
Delphi-Quellcode:
function RecordingCallback(Handle: HRECORD; buffer: Pointer; length,
                           user: DWord): boolean; stdcall;
und dieser Routine übergibt die Bass.dll den Kanalhandle, wenn sie die Routine aufruft.

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 Bass-Archiv findest du auch eine bass.chm Datei, die die einzelnen Befehle der bass.dll erklärt.

Gruss
Thorsten

Killerregenwurm 24. Feb 2008 22:14

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:

omata 24. Feb 2008 22:17

Re: Amplitude und Frequenz durch BASS_ChannelGetData
 
Schön das du weiterkommst.

Zitat:

Zitat von Killerregenwurm
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.

Ich habe hier leider nur eine Soundkarte und kann das deshalb nicht wirklich testen. Wäre toll wenn du das nochmal ausprobieren könntest.

Gruss
Thorsten

Killerregenwurm 24. Feb 2008 22:40

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 ;)

omata 24. Feb 2008 22:53

Re: Amplitude und Frequenz durch BASS_ChannelGetData
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier nochmal ein neuer Versuch...

Killerregenwurm 24. Feb 2008 22:57

Re: Amplitude und Frequenz durch BASS_ChannelGetData
 
:dancer: nice klappt jetzt

WS1976 25. Feb 2008 05:51

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

omata 25. Feb 2008 14:00

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

if_then_Anweisung 12. Apr 2008 13:21

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 von 1. Fehler
Fehler beim starten des Programms
Die Datei BASSTEST.EXE ist verknüpft mit dem fehlenden Export-BASS.DLL:BASS_RecordSetDevice.

Zitat:

Zitat von 2. Fehler
ERROR
Unable to create process: ein an das System angeschlossenes Gerät funktioniert nicht.

Ich werde daraus leider nicht schlau. kann mir jemand helfen?

omata 13. Apr 2008 00:06

Re: Amplitude und Frequenz durch BASS_ChannelGetData
 
Ich habe keine Ahnung was da bei euch nicht geht.

Ich habe mein letztes Archiv nochmal heruntergeladen + BassArchiv, die bass.dll aus dem Archiv in das Projektverzeichnis kopiert und kompiliert. Das Programm funktioniert.

EWeiss 13. Apr 2008 14:41

Re: Amplitude und Frequenz durch BASS_ChannelGetData
 
Zitat:

Zitat von omata
Ich habe keine Ahnung was da bei euch nicht geht.

Ich habe mein letztes Archiv nochmal heruntergeladen + BassArchiv, die bass.dll aus dem Archiv in das Projektverzeichnis kopiert und kompiliert. Das Programm funktioniert.

Jo die knallen die 24 da rein und wundern sich das es nicht geht.

gruss Emil

S4SH1981 13. Jul 2009 16:44

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 16:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz