Ist es möglich, komplexe Töne in C # zu generieren?

8

Ich muss einen Sound erstellen, der viele verschiedene Frequenzen enthält. Gibt es eine Möglichkeit, dies in C # zu tun?

Die einzigen Ton erzeugenden Methoden, die ich bisher gesehen habe, betreffen console.beep, was funktioniert, aber nur für reine Töne (einzelne Frequenzen).

    
Tom Wright 29.10.2009, 11:37
quelle

6 Antworten

19

Die Audiere -Bibliothek macht dies extrem einfach. Hier ist ein fast vollständiges C # -Programm, um den DTMF-Ton für die "1" -Taste zu erzeugen:

%Vor%

Um Audiere in C # zu verwenden, verwenden Sie am besten Harald Fielkers C # bindend (was er behauptet, arbeitet an Mono und VS; Ich kann bestätigen, dass es sowohl in der Vollversion von VS2005 als auch mit dem separaten Express funktioniert 2008 Versionen von C # und VC ++). Sie müssen die Win32 Audiere DLL, lib und Header (die alle in der gleichen Zip sind) und Sie herunterladen Ich muss die C # -Bindung von der Quelle mit VC ++ und C # erstellen.

Einer der Vorteile von Audiere ist, dass die Anrufe nicht blockiert werden. Sie müssen nicht darauf warten, bis tone1a die Wiedergabe beendet, bevor Sie tone1b starten, was für das Abspielen komplexer Töne eindeutig erforderlich ist. Es sind mir keine harten Obergrenzen für die Anzahl der gleichzeitigen Ausgabeströme bekannt, die Sie verwenden können. Daher ist es wahrscheinlich, was auch immer Ihre Hardware / Ihr Betriebssystem unterstützt. Audiere kann übrigens auch bestimmte Audiodateien abspielen (MP3, WAV, AIFF, MOD, S3M, XM, IT selbst; Ogg Vorbis, Flac, Speex mit externen Bibliotheken), nicht nur rein generierte Töne.

Ein möglicher Nachteil ist, dass beim Starten oder Stoppen eines einzelnen Tons ein leicht hörbares Klicken zu hören ist. Es fällt nicht auf, wenn Sie einem bereits spielenden Ton einen Ton hinzufügen. Die einfachste Problemumgehung, die ich dafür gefunden habe, besteht darin, die Tonlautstärke langsam nach oben oder unten zu erhöhen, wenn Sie den Ton ein- oder ausschalten. Sie müssen vielleicht mit der Rampengeschwindigkeit herumspielen, um es "genau richtig" klingen zu lassen.

Beachten Sie, dass Audiere LGPL-lizensiert ist und der Bindung keine Lizenz beigefügt ist. Sie müssen Ihre Rechtsabteilung konsultieren oder versuchen, Harald zu erreichen, wenn Sie seine Bindung in einem kommerziellen Produkt verwenden möchten; oder Sie könnten einfach Ihre eigene Bindung machen und den Ärger vermeiden.

@ Tom: Da Haralds Bibliothek keine spezielle Lizenz beigefügt ist, bin ich mir nicht sicher, welche Implikationen es hätte, sie zu hosten; Ich glaube jedoch, dass ich Ihnen zumindest genau erklären kann, wie mein libaudieresharpglue-Projekt aufgebaut ist.

Öffnen Sie in Visual C ++ Express 2008 bindings/csharp/libaudieresharpglue/vc8.0/libaudieresharpglue.sln. VC ++, um die Lösung automatisch in eine VS9-Lösung zu konvertieren.

In einem anderen Ordner sollten Sie das Audiere-Paket von Sourceforge haben. Wechseln Sie unter Ihren VC ++ - Projekteigenschaften zu Konfigurationseigenschaften & gt; C / C ++ & gt; Allgemein, und stellen Sie sicher, dass Sie path/to/audiere-1.9.4-win32/include in Ihren "Zusätzlichen Include-Verzeichnissen" haben. Gehen Sie dann in demselben Fenster zu Linker & gt; Allgemein und stellen Sie sicher, dass /path/to/audiere-1.9.4-win32/lib in Ihren "Zusätzlichen Bibliotheksverzeichnissen" enthalten ist. Dann sollten Sie in der Lage sein, das Projekt (vorzugsweise im Release-Modus) und diese Ausgabe libaudieresharpglue.dll in Ihrem vc8.0/Release -Ordner zu erstellen.

Öffnen Sie als Nächstes Visual C # Express 2008. Öffnen Sie bindings\csharp\test\vc8.0\AudiereCSharpTest.sln und lassen Sie die Lösung konvertieren. Das Projekt sollte in Ordnung sein, aber dann erhalten Sie einen Fehler, wenn Sie es ausführen. Das ist gut; In Ihrem csharp/test/vc8.0/bin/Release -Ordner müssen Sie libautieresharglu.dll aus der VC ++ -Lösung und audiere.dll aus dem Paket von Sourceforge hinzufügen.

Nun sollten Sie in der Lage sein AudiereCSharpTest zu erstellen und auszuführen. Beachten Sie, dass #define stream_test standardmäßig nicht am Anfang von AudiereTest.cs auskommentiert ist und auf eine Datei verweist, die sich nicht auf Ihrer Festplatte befindet. Sie können einfach das #define und das Kommentarzeichen noise_test oder square_test auskommentieren.

Das sollte es abdecken; wenn ich irgendwelche Details verpasse, sind sie hoffentlich klein genug, um alleine durchzukommen:)

    
Mark Rushakoff 03.11.2009, 18:11
quelle
4

Sie können immer DirectSound ausprobieren ...

    
FLamparski 29.10.2009 11:46
quelle
3

Ich habe NAudio angeschaut mit dem Ziel, ein Programm zu erstellen, das Feedback simuliert, während ich eine Begleitspur spiele. Es gibt einen Blogbeitrag über die Erzeugung von Sinuswellen bei bestimmten Frequenzen Ich vermute, dass dies angepasst werden könnte, um das zu tun, wonach Sie suchen.

    
Richard Slater 29.10.2009 12:20
quelle
0

Ja, das ist möglich.

Hier ist ein Link zu einem Tutorial dazu. aber natürlich verwendet dies auch Console.Beep

    
Binoj Antony 29.10.2009 11:42
quelle
0

Die MSDN-Dokumentation macht nicht klar, ob Console.Beep asynchron ist oder nicht. Wenn dies der Fall ist, können Sie wahrscheinlich so viele Anrufe tätigen, wie Sie in schneller Folge benötigen, und niemand wird weiser werden. Sie sollten natürlich die Version verwenden, die eine Häufigkeit und eine Dauer benötigt.

    
Drew Hall 29.10.2009 11:47
quelle
0

Im Wesentlichen müssen Sie Ihren eigenen Software-Synthesizer implementieren oder eine Drittanbieter-Bibliothek finden. Siehe: Ссылка

    
CannibalSmith 29.10.2009 12:27
quelle

Tags und Links