Chắc chắn bạn có thể, nó chỉ không tầm thường để làm cho nó nghe "tốt đẹp".
Tôi không biết làm thế nào để làm điều đó trong Linux, nhưng nếu bạn có thể chơi bộ đệm PCM, tất cả những gì bạn phải làm là lấp đầy nó bằng bất cứ điều gì bạn muốn.
Vì vậy, giả sử bộ đệm của bạn được đặt ở chế độ đơn âm, các mẫu 16 bit đã ký, ở mức 44100 mẫu mỗi giây, tạo ra âm thanh A4 (hình sin) thuần túy (440 Hz) đơn giản như
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);
}
Tuy nhiên, âm thanh này có lẽ rất buồn cho sở thích của bạn, vì vậy bạn phải làm một số điều phức tạp hơn. Nói chung, có hai loại tổng hợp âm thanh: Phụ gia và Subtractive . Có nhiều người khác, nhưng hai người này có lẽ là những người đơn giản nhất. Hôm nay tôi sẽ chỉ nói về tổng hợp phụ gia.
Để tổng hợp phụ gia, bạn làm điều tương tự như tôi đã làm ở đó, nhưng thay vì chỉ sử dụng một tần số ở một biên độ, bạn cộng nhiều sóng lại với nhau. Điều này giống như nhấn một vài phím trên đàn piano cùng một lúc. Vì vậy, bạn sửa đổi mã của mình để trông giống như thế này:
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);
}
}
và sau đó sử dụng nó như thế này:
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);
Bằng cách này, tôi nhận được tần số của tôi từ đây (Tôi đang sử dụng khí bình đẳng , nhưng có rất nhiều của khác lên dây có sẵn).
Lưu ý rằng cho đến nay tôi chỉ sử dụng sóng hình sin, nhưng các bộ tổng hợp cũ cũng hỗ trợ các sóng vuông , tam giác và cưa , mỗi loại đều có các thuộc tính âm thanh thú vị riêng. Thực hiện những điều này là khá đơn giản.
Những thứ khác bạn có thể làm để tăng sự đa dạng của âm thanh bạn có thể tạo là:
- Điều chế biên độ : Thay đổi biên độ của sóng trong toàn bộ đệm
- Điều chế tần số : Thay đổi tần số của sóng trong toàn bộ bộ đệm
- Reverb : Lặp lại một mẫu bằng cách thay đổi hình dạng và vị trí của nó trong bộ đệm. Chính nó là một chủ đề rất phức tạp.
- Bao bọc : Thay đổi biên độ của mẫu để mang lại sức sống hơn
Vấn đề ở đây là bản thân các kỹ thuật không khó lắm, vì vậy bạn không thực sự cần một thư viện để tóm tắt chúng cho bạn. Đó là sử dụng chúng để tạo ra âm thanh thú vị, những gì khó khăn.
Một lưu ý cuối cùng. Khi thử nghiệm với âm thanh như thế này, có thể thực sự hữu ích khi lưu dữ liệu của bạn vào các tệp WAV và sau đó hiển thị chúng trong một số phần mềm như Audacity. Bằng cách đó bạn có thể thấy những gì bạn đang làm rõ ràng hơn.