Sicher können Sie, es ist einfach nicht trivial, es "schön" klingen zu lassen.
Ich weiß nicht, wie es unter Linux geht, aber wenn Sie einen PCM-Puffer abspielen können, müssen Sie ihn nur mit dem füllen, was Sie wollen.
Angenommen, Ihr Puffer ist so eingestellt, dass er in monauralen, vorzeichenbehafteten 16-Bit-Samples mit 44100 Samples pro Sekunde abgespielt wird. Die Erzeugung eines reinen (sinusförmigen) A4-Sounds (440 Hz) ist so einfach wie
int16_t buffer[44100];
float frequency = 440.0f;
float sampling_ratio = 44100.0f;
float amplitude = 0.5f;
float t;
for (int i = 0; i < 44100; i++)
{
float theta = ((float)i / sampling_ratio) * PI;
buffer[i] = (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
}
Dieser Sound ist jedoch wahrscheinlich sehr langweilig für Ihre Interessen, so dass Sie einige kompliziertere Dinge tun müssen. Im Allgemeinen gibt es zwei Arten der Klangsynthese: Additiv und Subtraktiv . Es gibt viele andere, aber diese beiden sind wahrscheinlich die einfachsten. Heute werde ich nur über additive Synthese sprechen.
Für die additive Synthese machen Sie dasselbe wie ich dort oben, aber anstatt nur eine Frequenz mit einer Amplitude zu verwenden, addieren Sie mehrere Wellen. Dies ist wie das gleichzeitige Drücken mehrerer Tasten auf einem Klavier. Sie ändern Ihren Code also so, dass er ungefähr so aussieht:
void add_sine_wave(int16_t* buffer, int buffer_length, float frequency, float sampling_ratio, float amplitude)
{
for (int i = 0; i < buffer_length; i++)
{
float theta = ((float)i / sampling_ratio) * M_PI;
// make sure to correct for overflows and underflows
buffer[i] += (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
}
}
und dann benutze es so:
int16_t buffer[44100];
memset(buffer, 0, sizeof(buffer));
// Create an A Major chord
add_sine_wave(buffer, 44100, 440.0f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 554.37f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 659.26f, 44100.0f, 0.5f);
By the way, ich bin immer meine Frequenzen von hier (ich verwende gleich Temperament , aber es gibt viele von anderen Tunings erhältlich).
Beachten Sie, dass bisher habe ich nur Sinuswellen benutzen, aber alte Synthesizern auch unterstützen Platz , dreieckige und Säge Wellen als auch, jeder mit seinen eigenen interessanten Klangeigenschaften. Die Implementierung ist ziemlich einfach.
Andere Dinge, die Sie tun können, um die Vielfalt der Sounds zu erhöhen, die Sie erstellen können, sind:
- Amplitudenmodulation : Ändern der Amplitude der Welle im gesamten Puffer
- Frequenzmodulation : Ändern der Frequenz der Welle im gesamten Puffer
- Reverb : Wiederholen eines Samples durch Ändern seiner Form und Position im Puffer. Selbst ein sehr komplexes Thema.
- Hüllkurve : Ändern der Amplitude einer Probe, um ihr mehr Leben zu geben
Der Punkt hier ist, dass die Techniken selbst nicht sehr schwierig sind, so dass Sie nicht wirklich eine Bibliothek benötigen, um sie für Sie zu abstrahieren. Es benutzt sie, um interessante Klänge zu erzeugen, was schwierig ist.
Eine letzte Anmerkung. Wenn Sie mit einem solchen Sound experimentieren, kann es sehr nützlich sein, Ihre Daten in WAV-Dateien zu speichern und sie dann in einer Software wie Audacity zu visualisieren. Auf diese Weise können Sie klarer sehen, was Sie tun.