Sounds analysieren...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Sounds analysieren...

Beitrag von Tafkadasom2k5 »

Ist es möglich, mit PureBasic eine .wav (oder andere Sound-Datei) auszulesen, und mit verschiedenen Herz-Frequenzen abzugleichen?

Mein erstes Ziel wär ein kleines Stimmgerät für die E-Gitarre.
Man müsste aber sone Art Stochastik einbauen, um halt Störgeräuschen zu entgehen.

Sozusagen Ton "A" (2% Match); Ton "C" (25% Match) <---Also wird C geschrieben, da warscheinlicher ist, dass "C" und nicht "A" gespielt wurde.

Aber zum Testen kan man ja auch die von PureBasic erzeugten Herz-Sounds nehmen (da wird dann ja auch keine Stochastik benötigt ;) ).

Aber die Hauptfrage ist einfach nur:
Hat jemand Ahnung, wie man einen Bruchteil einer Sounddatei analysieren kann?
(Also 1/100Sek des Liedes austrennen, Auseinandernehmen, Ausgabe, die nächste 1/100Sek des Liedes austrennen....)


Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

mit der FMOD.DLL sollte das gehen. Such mal danach im Forum und bei FMOD.org
Zuletzt geändert von bobobo am 28.07.2006 12:05, insgesamt 1-mal geändert.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Jau, du brauchst die sogenannte FFT (Fast Fourier Transformation)
FMOD stellt diese recht komfortabel bereit.

Du nimmst das Mikrofonsignal auf, schickst es durch die FFT und erhälst stets die aktuellen Frequenzanteile als float-Werte von 0.0 bis 1.0 in einem Array.
!UD2
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

mh..
Ich habe leide No_ahnung von FMOD...

A)Ist das kostenpflichtig?
B)Welche F-Mod brauche ich dafür?
C)Wohin muss das kopiert werden und wie nutze ich das in PB?
D)von welchem Teil wird mir der Frequenzbereich angezeigt? (also was für Bruchteile analysiert er da?)

Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von Programie »

F-Mod ist kostenlos.

Klick
BildBildBildBild
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

OK, jetzt weis ich, das es kostenlos ist und wo ich es herunterladen kann.

Aber wie wende ich das an?
Hat irgendjemand vielleicht ein Beispiel, wie man das o.g. anwendet?

Gr33tz
Tafkadasom2k5 :roll: :allright:
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> F-Mod ist kostenlos.
Bei Verwendung in Freeware-Projekten, ansonsten ist die erforderliche Lizenz
nicht gerade billig.
FMOD.de hat geschrieben: * FMOD darf in sämtlichen Produkten, hinter denen keine Gewinnerzielungsabsicht steht, für die also insbesondere auf keine Weise Geld bezahlt werden muss, völlig kostenlos verwendet werden!
* FMOD wird daher häufig während der Entwicklung eines kommerziellen Produktes kostenlos bis zum Zeitpunkt der Veröffentlichung verwendet. So läßt sich der Nutzen von FMOD für die eigene Software ohne jegliche vorherige Verpflichtugen evaluieren!
* Wenn du FMOD in einem kommerziellen Produkt verwenden willst, dann lese bitte die folgenden Bedingungen sorgfältig durch (beachte ggf. die umfangreichen Ermäßigungen für Shareware-Titel).
Win32 Lizenz ansonsten ab ca. 2000$
Zuletzt geändert von ts-soft am 21.12.2005 12:10, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Schau mal nach 'Spectrum Analyzer' (o.ä.) im Pure-Code-Archiv.
Da wird das Spektrum einer Audio-Datei während der Wiedergabe visualisiert. Um direkt die Aufnahme hierfür zu nutzen, musst Du ein paar nicht-triviale Umwege gehen. Dafür solltest Du dich per englischer fmod-help-chm und dem recording-tutorial, sowie den tutorials in der fmod.chm beschäftigen.
Das Vorhaben ist leider nicht ganz so simpel, als dass es mit nur 2 Codezeilen zu realisieren wäre. Viel Glück, und bei konkreten Fragen wieder fragen :wink:
!UD2
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag von Jilocasin »

Hmm.. ich weiß der Thread iss schon ne Weile alt, aber ich wollte keinen neuen mehr aufmachen 8)

Ich hab mir mal die FMOD runtergeladen und den ganzen Kram korrekt in die Ordner gelegt...
Jetzt kommt bei mir für folgenden Code
http://www.purebasic.fr/german/archive/ ... php?t=1621

der Fehler
FSOUND_Stream_OpenFile() is not a function.. blablabla
Kann mir mal jemand ein funktionierendes Beispiel (mit erklärung) zum Spektrum-Analysieren geben :(
da wär ich seeehr froh drüber :)
Bild
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Hier ein einfacher Spektrum-Analyser für FMODEX ohne irgendeine Import-lib:

Code: Alles auswählen

; How to use FMODEX and its FFT with PB
; needs the fmodex.dll inside the program's directory
;
; by Froggerprogger 05.08.06 

;- declarations and initialisations
#FSOUND_SOFTWARE = $00000040

Declare updateFFT(Value) 

Global soundfile.s
Global logscale.b, resume.b, visual.b 
Global fmodsystem, channel
Global Dim FFTArray.f(512)

If OpenLibrary(0, "fmodex.dll") = 0
  MessageRequester("error", "Cannot find fmodex.dll")
  End
EndIf

If CallFunction(0, "FMOD_System_Create", @fmodsystem)
  MessageRequester("error", "Error on FMOD_System_Create")
  End
EndIf

InitSprite()

logscale = 1  
visual = 1 

;- open a window
hwnd = OpenWindow(1,0,0,520,265,"FMODEX | FFT-Spectrum Visualization 1.0 | by Froggerprogger", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
OpenWindowedScreen(hwnd,4,40,512,200,0,0,0) 

CreateSprite(1,512,200,0)

;- create menu + gadgets 
If CallFunction(0, "FMOD_System_Init", fmodsystem, 16, 0, 0)
  MessageRequester("error", "Error on FMOD_System_Init")
  End
EndIf
If hwnd <> 0 And CreateMenu(1,hwnd) And CreateGadgetList(hwnd) 
  MenuItem(1, "play") 
  MenuTitle("options") 
  MenuItem(2, "toggle y-scale") 
  SetMenuItemState(1,2,logscale) 
  MenuItem(3, "toggle style") 
  SetMenuItemState(1,3,visual) 

  resume=1 

  TextGadget(1,5,10,512,20,"Music-File:   "+soundfile,0)  
EndIf 

;- main loop 
hthread=CreateThread(@updateFFT(),0) 

While resume 
  event = WindowEvent() 
  If event 
   Select event 

    Case #PB_Event_Menu 
      Select EventMenu() 
        Case 1 ;(Play) 
          temp_filename.s = OpenFileRequester("","","PCM-MusicFiles (*.mp3, *.wav, *.mp2, *.ogg, *.raw)|*.mp3;*.wav;*.mp2;*.ogg;*.raw|*.*|*.*",0,0) 
          If temp_filename  
              soundfile.s = temp_filename  
              SetGadgetText(1,soundfile)  
          EndIf

          CallFunction(0, "FMOD_System_CreateStream", fmodsystem, @soundfile, #FSOUND_SOFTWARE, 0, @hstream)
          CallFunction(0, "FMOD_System_PlaySound", fmodsystem, 0, hstream, 0, @channel)
          IsSoundPlaying = 1 

        Case 2 ;(options|logarithmic y-scale) 
          logscale!1 
          SetMenuItemState(1,2,logscale) 
        
        Case 3 ;(options|toggle style) 
          visual!1 
          SetMenuItemState(1,3,visual) 
          
      EndSelect 

    Case #PB_Event_CloseWindow ;(close window & exit) 
      resume=0
      WaitThread(hthread)

      CallFunction(0, "FMOD_System_Release", fmodsystem) ;shut down FSOUND 
    Default 

   EndSelect 
  Else 
   Delay(1) 
  EndIf 
  
  ; get the current cpu-usage
  CallFunction(0, "FMOD_System_GetCPUUsage", fmodsystem, 0, 0, 0, @cpu.f)
  cpuusage.s="CPU: " + StrF(cpu, 3) + "%"
Wend

;- the drawing-callback
;The following procedure is called as a thread and updates the fft-visualisation 
Procedure updateFFT(Value) 
    Shared logscale, resume, visual 
    Shared resume, cpuusage, IsSoundPlaying 

        While resume
            ; fill the FFT-data of the given channel into FFTArray()
            CallFunction(0, "FMOD_Channel_GetSpectrum", channel, FFTArray(), 512, 0, 0)
            
            ; display the FFT-data
            StartDrawing(SpriteOutput(1))
                If visual = 1 
                    Box(0,0,512,200,$000000) 
                    For actscale=1 To 25 
                        If logscale = 1 
                            actdBline_y.f = Pow(0.0000001, 1 / actscale) * 199 
                        Else 
                            actdBline_y.f = 199-199/actscale 
                        EndIf    
                          Box(0,actdBline_y,511,1,RGB(150-actscale*6,150-actscale*6,150-actscale*6)) 
                        Next 
                Else 
                    Box(0,0,512,200,$FF0000) 
                EndIf

              Select visual 
                Case 0 
                     If IsSoundPlaying 

                        For i=0 To 511 
                            If logscale = 1 
                                actfftvalue.f = Pow(0.0000001, FFTArray(i)) * 199 
                            Else 
                                actfftvalue.f = 199-FFTArray(i)*199 
                            EndIf    
                            Box(i,0,1,1+actfftvalue,$000000+actfftvalue) 
                        Next 
                     EndIf 
                Case 1 
                     If IsSoundPlaying 
                        For i=0 To 511 
                            If logscale = 1 
                                actfftvalue.f = 199-Pow(0.0000001, FFTArray(i)) * 199 
                            Else 
                                actfftvalue.f = FFTArray(i)*199 
                            EndIf    
                            Box(i,200,1,-1-actfftvalue, (255-actfftvalue) * $000100 + actfftvalue * $000001) 
                        Next 
                     EndIf 
              EndSelect 

              DrawingMode(1) 
              FrontColor($FFFFFF) 
              DrawText(420 , 4, cpuusage) 

            StopDrawing()    
            FlipBuffers() 
            DisplaySprite(1,0,0) 
            
            ; wait for 20ms
            Delay(20)
        Wend 
EndProcedure
!UD2
Antworten