Tonfolge als .wav abspeichern.

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von OnkelR.

    OnkelR schrieb:

    Wie viel Töne sollen es denn sein und wie lang die Pause zwischen den Tönen?
    Es sind immer unterschiedlich viele Töne.
    Ich hab ein Textfeld, in das kann man zahlen eingeben (quasi wie noten) und dann wird analysiert, was da für eine Zahl steht. Und je nach Zahl soll ein anderer Ton kommen.
    Zwischen den Tönen brauch ich keine Pause. Man sollte nur am Ende wieder die Zahlen rauskriegen :)
    Wo man die Frequenz (im Code) ändern kann hab ich schon rausgefunden. (die Zeit ist direkt daneben)

    Warum/Wo muss ich mich da registrieren? Das funktioniert doch auch so?! :D

    Das knackt bei mir am Anfang und am Ende vom Ton immer ganz schrecklich in den Boxen. Und wenn man sich in audacity die Wellenform anzeigen lässt, sieht man dass es schon in der Datei knackt. Kann man das irgendwie beheben? ?(
    Jojo

    LJ Jojo schrieb:

    Kann man das irgendwie beheben?

    Wenn Du das Wave rechnest, musst Du beim Beginn und beim Ende bzw. Übergang auf "weiche Kurven" achten.
    Hast Du den Code zum Wave-generieren?
    Lass mal sehen, da findet sich was.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jo mann, du musst dich nicht registrieren, hast halt dann diesen Bildschirm von Bass jeweils bei Start des Programmes.
    Das knacken bekomm ich bei solch kurzen Geschichten auch nicht raus. Es lässt sich aber beheben in dem man entdsprechende
    Fade-In und Fade-Out Funktionen einbindet. Würde natürlich nicht sehr viel bringen, wenn die Aufnahmedauer sehr kurz ist.
    Ich sage mal so ab 2 Sekunden isses gerade noch machbar, schätze ich.

    Mit der Frequenzhöhe musst Du mal schauen welche Bereiche eigentlich funzen. Ich hatte bisher nur mit festen Frequenzen
    gearbeitet die im Bereich der Frequenzen in der Combobox enthalten sind (für Alarm-Signale).

    mfg OnkelR
    na indem Du

    Freq_calc(_Freq0)
    play_freq_einzeln(_Dauer)

    mehrmals hintereinander aufrufst

    musst aber
    Aufnahme_Start() vor dem 5 oder 10maligen Aufruf und
    Aufnahme_Stop() nach dem 5 oder 10maligen Aufruf setzen.


    Aufnahme_Start()
    Freq_calc(1060)
    play_freq_einzeln(1000)

    Freq_calc(1120)
    play_freq_einzeln(1000)

    Freq_calc(1400)
    play_freq_einzeln(1000)

    Freq_calc(1060)
    play_freq_einzeln(1000)

    Aufnahme_Stop()

    mfg OnkelR

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „OnkelR“ ()

    Bin ich blöd, dass ich das nicht vorher ausprobiert hab. Ich hab nur den ganzen Block

    VB.NET-Quellcode

    1. Private Sub play_freq_einzeln(ByVal _Dauer As Integer)
    in eine Schleife gesetzt (For i=1 To 5).

    OnkelR schrieb:

    Aufnahme_Start() vor dem 5 oder 10maligen Aufruf und

    Aufnahme_Stop() nach dem 5 oder 10maligen Aufruf setzen.
    Was heißt das? Dass nur nach dem 5. oder 10 wiederholen Stop sein darf?? ?( ?( ?(
    Start ist ja am Anfang?!:D

    Jojo :)
    in der Private Sub play_freq_einzeln(ByVal _Dauer As Integer)
    nimmst du die 2 aufrufe raus
    1.Aufnahme_Start()
    2.Aufnahme_Stop()

    dann machste deine sub zum abspielen mehrerer Töne

    VB.NET-Quellcode

    1. Private Sub play_alle_Toene()
    2. Aufnahme_Start()
    3. Freq_calc(1060)
    4. play_freq_einzeln(1000)
    5. Freq_calc(1120)
    6. play_freq_einzeln(1000)
    7. Freq_calc(1400)
    8. play_freq_einzeln(1000)
    9. Freq_calc(1060)
    10. play_freq_einzeln(1000)
    11. Aufnahme_Stop()
    12. End Sub


    Kannste machen wie die Dachdecker, mit for i = 1 to blabla oder
    wie es deinem Programm am besten steht

    mfg OnkelR
    Jetzt hab ich die ganzen Steuerelemente von OnkelR's Programm in eine GroupBox rein und jetzt funktioniert gar nichts mehr... eigentlich dürfte das doch nix machen??
    Ich hab gelesen, dass in einer GrooupBox immer nur ein aktives Element ist, aber das sind ja alles verschiedene?!
    Wenn ich die da drin lassen könnte würde die Programmoberfläche aufgeräumter aussehen. :)
    Aber ich hab jetzt nirgends die Funktion gefunden das zu deaktivieren. :(

    Jojo
    Für sowas brauchst du garantiert keine Bass.
    Du musst nur einen Sinus generieren und jeden abtastwert in ne Datei schreiben. Das ist total einfach und wird genau hier in dem oben verlinken Thread gemacht (wenn auch etwas kompliziert).
    Lies dir ganz unten das Beispiel durch.
    Ändere den MemoryStream in einen Filestream und fertig. Da ist der WAV Header und alles drinnen. Wie gesagt eine WAV Datei erstellen ist das simpelste das es gibt. Bassdll ist hier total fehl am platz.
    Die Frage ist nur wieso willst du die Frequenz wieder rausfiltern. Denn auch mit einer FFT ist das nicht ganz so einfach. Du bekommst dort auch nur Frequenzbänder welche von n -> n+x Hz gehen. Außerdem wenn du diese mit maximaler Genauigkeit willst kannst du die Anzahl der Bänder soo hoch schrauben, dass dabei wieder rechenaufwand drauf geht.

    Kurz das Beste wird sein du stellst zwei Dateiformate zur Verfügung.
    Als erstes ein Format welches Frequenzen + Zeit beinhaltet. Dies kann auch ne Textdatei sein (wenn auch nicht schön).
    Dies kann so aufgebaut sein:
    500,100
    1000,20
    400,2500

    Erste Zahl ist immer Frequenz. Zweite Zahl ist immer Dauer in Ms.

    Dann als zweites Format verwendest du halt das WAV Format. (Kannst es so machen wie es auch AudioEditoren machen. Das erste Format ist eben zum bearbeiten usw. Das WAV Format entsteht beim exportieren. Denn mit einer FFT wirste hier eher nicht ganz so glücklich.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.