Asio frequenz ausgeben



  • Hallo,
    Ich bin neu in diesem Forum und ich hoffe ihr könnt mir meine erste Frage beantworten. Und zwar:

    Ich habe eine Gitarre und einen Audio Interface (Toneport GX - Asio Treibe) un möchte gerne die Frequenz die ich gerade spiele (sagen wir ein A - das ist glaub 440 Hz) Ausgeben lassen.

    1. Ist das kompliziert?
    2. Was benötige ich dafür (ich habe irgent etwas von "Boost" oder "Asio-SDK" gelesen aber bei google habe ich nichts gefunden, was mir witergeholfen hat)?

    Mfg,
    Mick



  • Ich kenne keine Fertiglösungen -- also keine C++ Bibliothek, die man einfach einbinden kann und eine Funktion direkt zur Verfügung stellt, die genau das macht, was Du willst. Du musst wahrscheinlich das Problem in kleine Teilprobleme zerlegen und selbst Hand anlegen.

    Das erste Teilproblem ist die Aufnahme von Audiodaten. Such Dir für Dein Betriebssystem eine entsprechende Schnittstelle/Bibliothek raus, lies Dir die Doku durch u.s.w. Leider hast Du Dein Betriebssystem nicht erwähnt. Mir fallen spontan auch nur Sachen für Linux ein (ALSA, Pulse Audio). Falls Du unter Linux arbeitest, würde ich Pulse Audio empfehlen. Pulse Audio bietet zwei Schnittstellen an. Eine einfache und eine etwas komplexere/flexiblere. Die Aufnahme von Audio kann da so einfach sein wie das Öffnen und Lesen einer Datei. Aus der Windows-Welt kann ich mich noch dunkel an die vom Betriebssystem bereitgestellte MMSYSTEM-API erinnern. Das ist aber möglicherweise nicht mehr modern. Von ASIO hab ich absolut keinen Plan. Beachte, Boost.Asio ist etwas ganz anderes als ASIO. Das eine steht für "ASynchronous I/O" und das andere für "Audio Stream I/O".

    Nachdem Du das mit der Aufnahme zum Laufen bekommen hast, müsstest Du das Audiosignal irgendwie analysieren. Da fallen mir spontan zwei verwandte Ansätze ein. Spectralanalyse (per FFT) und Autokorrelation (per FFT). Die FFT kann hier also sehr praktisch sein. Selbst programmieren muss man die nicht. Da gibt es eine nette Bibliothek namens FFTW, welche mit einer GPL-Lizenz daher kommt. Aber Du solltest schon Ahnung von digitaler Signalverarbeitung haben. Fragen zu DSP sind hier allerdings off-topic.

    Gruß,
    SP



  • danke für den post.

    aber weis jemand etwas genaueres, um auf den asio treiber zuzugreifen? notfals geht auch dieses direktaudio. ich möchte es so einfach wie möglich und so wenig code wie möglich.

    mfg,
    mick



  • ich möchte es so einfach wie möglich und so wenig code wie möglich.

    Aha.

    Was hast Du denn bisher unternommen, Dein Problem zu lösen -- außer hier einen Thread zu öffnen?

    Wie sieht's denn mit dem ASIO SDK aus? Mal runtergeladen und angeguckt?

    Gruß,
    SP



  • ich hab lange ohne ergebnis gegoogelt auf asio sdk bin ich auch schon gestoßen, hab aber keinen download gefunden.
    dann hab ich das hier entdeckt:
    http://www.codeproject.com/KB/audio-video/fister.aspx
    funktioniert aber nicht weden dem afxwin weil ich borland c++ hab oder so und zu letzt hab ich mir noch dieses "portaudio" angesehn, da versteh ich nicht wie ich das mit borland machen soll.



  • Guck Dir mal Portaudio an. Das ist eine Multiplattform Audio-API die verschiedenen Backends ein einheitliches Interface verpasst. Eines dieser Backends ist z.B. ASIO.

    Das Standard-Interface ist zwar pures C, jedoch ist die Benutzung dennoch recht einfach. Wenn es unbedingt sein muss gibt es auch noch einen C++-Wrapper, aber den finde ich persönlich umständlicher als die C-API.
    Wie man die Bibliotheken baut steht eigentlich relativ ausführlich in Tutorial.

    Damit kannst Du den Ton vom Mikrofon erstmal A/D-Wandeln.

    Für die Bestimmung des Tons brauchst Du noch irgendetwas zur Frequenzanalyse. Da kann man z.B. die bereits angesprochenen FFT-Bibliotheken benutzen. Je nach gewünschter Genauigkeit und dem Vorwissen über das zu analysierende Signal könnte man ggf. auch andere (Pseudo-) Spektralschätzer (also keine FFT) benutzen um die Genauigkeit zu erhöhen. MUSIC wäre z.B. sowas.



  • portaudio hab ich mir, wie bereits erwähnt, doch ich hab die benutzung mit borland nicht so richtig hinbekommen. kann mir da vielleicht jemand helfen?
    was ist C++-Wrapper? "schriebt" das den C code auf C++ um oder wie? In C will ich nämlich nicht schreiben. Weist du was ich vor der benutzung alles machen muss, damit portaudio mit Borland C++ Builder 5 funktioniert?

    Das mit FFT scheint mir aber eine gute lösung zu sein.

    danke für die posts.

    mfg,
    mick



  • Lass mich dir einen Rat geben: Lass die Finger von Borland/Codegear/Embarcadero, lad dir die Visual C++ Express Version von Microsoft runter und mach´s damit.



  • dass will ich nicht wirklich, da wir in der schule auch mit borland "arbeiten" und somit lern ich das dann gleich. außerdem bräuchte das wieder unnötig zeit mich in vc++ einzuarbeiten. hab's mir zwar gestern runtergelanden, hab aber schon mit meinem kleinen programm in borland angefangen. also wäre wirklich nett, könnte mir das jemand mit borland und portaudio erklären.

    oder:
    was haltet ihr von dem hier?
    https://ccrma.stanford.edu/software/stk/information.html

    mfg,
    mick

    EDIT:
    ich habe jetzt etwas rumprobiert und hab ein kleines problem und zwar "winmm.lib" wie kann ich die in borland einbinden? ich hab sowas noch nie verwendet.

    das ist mein versuch:

    #pragma comment(lib, "winmm.lib")
    

    aber es kommt ein linker fehler mit "winmm.lib contains invalid OMF record, typ 0x21 (possibly COFF)"

    kennt sich da jemand aus?



  • Jau, Borland/Codegear/Embarcadero unterstützen das COFF Format vieler Bibliotheken nicht, stattdessen benutzen sie das OMF Format. Du kannst (wenn du Glück hast), eine COFF Bibliothek mit dem mitgeliferten Tool COFF2OMF in eine OMF Bibliothek konvertieren. Leider klappt das nicht immer (das ist z.B. einer der Gründe, warum ich zu MS VS rate).


Anmelden zum Antworten