Mikrofonsignale in Werte umwandeln

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von fraju.

    Mikrofonsignale in Werte umwandeln

    Hallo,
    ich benutze das hier vorgestellte kleine Skript um mein Mikro zu steuern:
    [VB.NET] Sounds aufnhemen

    Nun soll per akustischem Signal das Programm auslösen ( z.B. Händeklatschen ).
    Um dieses Signal zu identifizieren, benötige ich die Daten in Form von Werten. Welche einfache Möglichkeit bietet sich da an ? Achja, wenn möglich in Echtzeit d.h. nicht erst die Wav abspeichern sondern während der Aufnahme.. Danke
    Hallo,

    ich weiß ja nicht, was du jetzt genau genommen hast, aber google doch einfach mal nach ".NET DirectX Record microphone" da kannst du auch Frequenz und ähnliches auslesen...

    Mfg jvbsl
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @fraju : Danke für das Beispiel, ich zerfleddere es gerade nach für mich brauchbaren :)

    Nun würde mich noch interessieren ob bzw wie ich an die Daten des Buffers herankomme. Ich nutze ja MciStringcommand:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. If Ready.Text = "Ende" Then
    3. Select Case Takt
    4. Case 0 ' Aufnahme
    5. rs = New String(" ", 128)
    6. Call mciSendString("Open New Type waveaudio Alias capture", rs, 128, cb)
    7. Call mciSendString("record capture", rs, 128, cb)
    8. Case 1 ' Ende
    9. Call mciSendString("Stop capture", rs, 128, cb)
    10. Call mciSendString("save capture " & Path(1), rs, 128, cb)
    11. Call mciSendString("Close capture", rs, 128, cb)
    12. Case 2 ' Anzeigen
    13. Timer1.Enabled = False
    14. Dim SoundData = My.Computer.FileSystem.ReadAllBytes(Path(1))
    15. FillChart(SoundData, ZedGraphControl1)
    16. End Select
    17. If Takt < 2 Then
    18. Takt = Takt + 1
    19. Else
    20. Takt = 0
    21. End If
    22. End If
    23. End Sub


    Da ich derzeit immer alle 1200 ms per Timer abspeichere und dann das Signal darstelle, habe ich natürlich keine Echtzeitdarstellung. Viel kürzer geht es nicht, da dann die Datei nach dem Schreiben noch nicht geschlossen wurde und ein Zugriff zum Auslesen nicht möglich ist.

    Ich bräuchte also so etwas wie einen Stream den ich abgreifen kann, oder die Möglichkeit den Buffer nicht erst abspeichern und dann wieder laden zu müssen, sondern direkt auf den Buffer von MCI zugreifen zu können. Gibt es da einen Ansatz ? Die MciStringCommands haben wohl nichts passendes im Repertoire, sind ja auch eigentlich nicht dafür gedacht. Irgendwo müssen die Bufferdaten doch aber im Speicher liegen. Kann ich da rankommen ?
    Jetzt bin ich zwar weiter, stosse aber dennoch auf ein Verständnisproblem.
    Ich will den Pegel bei der Aufnahme auslesen. Hier zu gibt es das MCI Komando : Status mit dem Flag Level:

    VB.NET-Quellcode

    1. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    2. Call mciSendString("Status capture level ", SoundLevel, 2, 0)
    3. Label5.Text = Asc(SoundLevel)
    4. End Sub

    Wenn man jedoch mal bei MSN nachschaut msdn.microsoft.com/en-us/library/dd798683(VS.85).aspx
    dann steht dort :
    "The following table lists the flags that can be specified in the lpszRequest parameter and their meanings."
    Dort findet sich AUDIO Input mit der Beschreibung:

    Returns the approximate instantaneous audio level of the analog input audio signal. A value greater than 1000 implies clipping distortion. Some devices can return this value only while recording audio. The value has no associated set or setaudio command.
    Wie aber bekomme ich dieses Flag im Commandstring unter ?

    Dieser soll so aussehen:

    _stprintf_s(
    lpszCommand,
    TEXT("status %s %s %s"),
    lpszDeviceID,
    lpszRequest,
    lpszFlags
    );
    Ich habe nicht verstanden in welcher Form ich das Flag Audio Input verwenden kann ?(
    Kann mir einer der Profi Informatiker vllt. mal erklären wie das gehen soll ?

    VB.NET-Quellcode

    1. Call mciSendString("Status capture level ", SoundLevel, 2, 0)


    Liefert nämlich nur "0" als Ergebnis wird aber auf vielen Seiten als richtiges Kommando wiedergegeben ( z.B. [url]http://www.directorforum.de/threads/21-Director-digitales-Audio-mit-MCI-und-Lingo-(PC)[/url] ). Googlen hat bei anderen das selbe Problem erbracht.
    Danke....
    Nach 2 Tagen und Nächten zerknirschtem "Fummeln" habe ich das Geheimnis gelüftet und möchte es daher nicht vorenthalten.

    Eine Mikrofonpegelanzeige mit WIn Bordmitteln ist auf primitivste Weise möglich. Dabei kann man im 1ms Takt den Pegel von 0 bis 255 abrufen.
    Im einfachsten Fall nimmt man eine Progressbar zur Anzeige.

    VB.NET-Quellcode

    1. Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal Command As String, _
    2. Optional ByVal ReturnString As String = " ", Optional ByVal ReturnLength As Integer = 0, Optional ByVal Callback As Integer = 0) As Integer
    3. Dim rs As String ' Returnstring
    4. Dim SoundLevel, Mode As New String(" ", 20)
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. Call mciSendString("Open New Type waveaudio Alias MySound", rs, 128, 0)
    7. Call mciSendString("record MySound", rs, 128, 0)
    8. Call mciSendString("Stop MySound", rs, 128, 0)
    9. End Sub
    10. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    11. Call mciSendString("status MySound level", SoundLevel, 20, cb)
    12. ProgressBar1.Value = Val(SoundLevel)
    13. Call mciSendString("status MySound mode", Mode, 128, cb)
    14. Label1.Text = Mode
    15. End Sub


    Kochanleitung :
    1 x Form
    1 x Timer1 ( kann ruhig auf 1 ms stehen, enabled !)
    1 x Progressbar1 ( Max 256 )
    1 x Label1

    Wie man Speichert, Stop,Pause usw. spar ich mir mal an dieser Stelle.
    Der Knackpunkt bei der Sache ist allerdings, dass die Pegelanzeige NUR etwas zurückliefert wenn zuvor der "Record" Befehl gesandt wurde, auch wenn danach ein "STOP" folgte.
    Sobald sie aufgerufen wurde setzt sie das Device auf "PAUSE". Es ist also nicht möglich gleichzeitig aufzunehmen UND den Pegel zu betrachten, sondern nur das eine oder das andere. Selbst wenn man per Timer hin und herswitcht bricht die Aufnahme irgendwann ab.
    Hallo
    Habe es mal kurz getestet.
    cb habe ich als Integer=0 Deklariert ?
    Die Pegelabfrage scheint vor dem Lautstärkemixer zu sein.
    Kann Mikro Empfindlichkeit nicht einstellen.

    Es ist aber sehr schön das bei einen Erfolg das Ergebnis der Öffentlichkeit mitgeteilt wird.
    Leider kommt das nicht sehr oft vor.

    Gruß