Tentu Anda bisa, itu tidak sepele untuk membuatnya terdengar "bagus".
Saya tidak tahu bagaimana melakukannya di Linux, tetapi jika Anda dapat memainkan buffer PCM, yang harus Anda lakukan adalah mengisinya dengan apa pun yang Anda inginkan.
Jadi seandainya buffer Anda diatur untuk dimainkan dalam monaural, sampel 16-bit yang ditandatangani, pada 44100 sampel per detik, menciptakan suara A4 (sinusoidal) murni (440 Hz) semudah
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);
}
Namun, suara ini mungkin sangat membosankan untuk minat Anda, jadi Anda harus melakukan beberapa hal yang lebih rumit. Secara umum, ada dua jenis sintesis suara: Aditif dan Subtraktif . Ada banyak yang lain, tetapi keduanya mungkin yang paling sederhana. Hari ini saya hanya akan berbicara tentang sintesis aditif.
Untuk sintesis aditif, Anda melakukan hal yang sama seperti yang saya lakukan di atas sana, tetapi alih-alih hanya menggunakan satu frekuensi pada satu amplitudo, Anda menambahkan beberapa gelombang bersamaan. Ini seperti menekan beberapa tombol pada piano secara bersamaan. Jadi Anda memodifikasi kode Anda agar terlihat seperti ini:
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);
}
}
dan kemudian gunakan seperti ini:
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, saya mendapatkan frekuensi saya dari sini (Saya menggunakan temperamen sama , tetapi ada banyak dari lainnya laras tersedia).
Perhatikan bahwa sejauh ini saya hanya menggunakan gelombang sinus, tetapi synthesizer lama juga mendukung gelombang persegi , segitiga dan melihat , masing-masing dengan sifat suara yang menarik. Menerapkan ini sangat mudah.
Hal lain yang dapat Anda lakukan untuk menambah variasi suara yang dapat Anda buat adalah:
- Modulasi amplitudo : Mengubah amplitudo gelombang di seluruh buffer
- Modulasi frekuensi : Mengubah frekuensi gelombang di seluruh buffer
- Reverb : Mengulang sampel dengan mengubah bentuk dan posisinya di buffer. Itu sendiri topik yang sangat kompleks.
- Enveloping : Mengubah amplitudo sampel untuk memberikan lebih banyak kehidupan
Intinya di sini adalah bahwa teknik-teknik itu sendiri tidak terlalu sulit, jadi Anda tidak benar-benar membutuhkan perpustakaan untuk mengabstraksikannya untuk Anda. Ini menggunakan mereka untuk membuat suara yang menarik apa yang sulit.
Satu catatan terakhir. Saat bereksperimen dengan suara seperti ini, mungkin sangat berguna untuk menyimpan data Anda ke file WAV, dan kemudian memvisualisasikannya dalam beberapa perangkat lunak seperti Audacity. Dengan begitu Anda bisa melihat apa yang Anda lakukan dengan lebih jelas.