In diesem Artikel möchte ich zeigen, wie man einen einfachen Sinus-Generator in .NET erstellen kann.
Zunächst ein Quelltextausschnitt, danach erkläre ich, was es damit aufsich hat:
const double frequency = 1000; const double amplitude = 20000; const long sampleRate = 44100; const int durationSec = 5; long sampleCount = sampleRate * durationSec; double timeStep = 1.0 / (double)sampleRate; double time = 0; int[] values = new int[sampleCount]; for (long i = 0; i < sampleCount; i++) { values[i] = (int)(amplitude * Math.Sin(2 * Math.PI * frequency * time)); time = time + timeStep; }
Gut, nun also ein paar Erklärungen:
- Zeilen 1-4: Einige Konstanten, die geändert werden können, um z. B. die Frequenz anzupassen.
Hinweis: Die Frequenz kann maximal die Hälfte der Abtastrate betragen. - Zeile 6: Berechnung der Anzahl an Abtastpunkten.
- Zeile 8: Berechnung der Zeit zwischen zwei Abtastpunkten.
- Zeilen 10-11: Ein paar Variablen-Initialisierungen.
- Zeilen 12-15: Hier wird schlussendlich der Wert für jeden Abtastpunkt berechnet.
Und nun noch der entsprechende Quelltext für Visual Basic .NET:
const frequency as double = 1000 const amplitude as double = 20000 const sampleRate As Long = 44100 const durationSec As Integer = 5 Dim sampleCount As Long sampleCount = sampleRate * durationSec Dim timeStep As Double timeStep = 1.0 / sampleRate Dim time As Double = 0 Dim values(0 To sampleCount - 1) As Integer For i As Long = 0 To sampleCount - 1 values(i) = amplitude * Math.Sin(2 * Math.PI * frequency * time) time = time + timeStep Next i
Um das Ganze abzuspielen, kann man nun entweden einen API-Aufruf wie PlaySound (von winmm.dll) oder die Lösung dieses super Artikels (Englisch) verwenden.
Haben Sie auch bereits einmal einen Sinus in .NET generieren müssen?
Der Artikel ist auch in English verfügbar.