Có thư viện âm thanh nào cho C để tạo các mẫu âm thanh từ mã không? [đóng cửa]


10

Tôi đang làm việc trên một công cụ cho một trò chơi theo phong cách retro ở C. Tôi đang tìm một thư viện âm thanh tạo ra âm thanh chip từ mã ... Tôi muốn tạo trình theo dõi chiptune đơn giản của riêng mình cho công cụ để tạo nhạc. Có một điều như vậy tồn tại?

Tôi cũng quan tâm đến một thư viện để sử dụng các tệp .nsf trong dự án của tôi.

Tôi đang sử dụng Linux để phát triển.


Tôi nghĩ rằng câu hỏi này thuộc danh mục "Công nghệ nào sẽ sử dụng". Mặc dù, thông thường, các yêu cầu thích hợp này không tạo ra một danh sách lớn các phản hồi, tôi nghĩ rằng nó không mang tính xây dựng.
MichaelHouse

Chà, vấn đề là dường như tôi không thể tìm thấy gì. Tôi thậm chí không biết bắt đầu từ đâu ... Mọi thư viện tôi tìm thấy tập trung vào việc tải từ các tệp như .wav. Tôi có thể sử dụng libmikmod nếu tôi chỉ muốn tải mô-đun .mod hoặc .xm, nhưng đó không phải là điều tôi muốn làm.
rzrscm

Tôi không nghĩ rằng điều này thực sự rơi vào phát triển trò chơi. Nó là phương tiện truyền thông chung hơn các trò chơi.
PixelArtDragon

Hãy thử tìm kiếm "mod tracker" hoặc có thể là "demoscene tracker" để có kiến ​​thức và tài nguyên tổng quát hơn.
Patrick Hughes

1
Cá nhân tôi thấy câu hỏi này là một câu hỏi hay. Vì tôi thích lập trình các trò chơi theo phong cách retro, thật khó để tìm tài nguyên cho những thứ như thế này mà không phải là một phần của cộng đồng tối nghĩa.
Zack The Human

Câu trả lời:



16

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ụ giaSubtractive . 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áccư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à:

  1. Điều chế biên độ : Thay đổi biên độ của sóng trong toàn bộ đệm
  2. Điều chế tần số : Thay đổi tần số của sóng trong toàn bộ bộ đệm
  3. 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.
  4. 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.


+1 để tự lăn. Tôi không thấy nhiều lib Linux sẽ hỗ trợ NSF. Nhưng, đây là thông số: webcache.googleusercontent.com/ từ
michael.bartnett

Cảm ơn bạn đã thông tin. Bây giờ tôi có thể gắn bó với việc tạo các tệp .nsf cho dự án của mình để tôi nhận ra mình cần bao nhiêu để âm thanh phát ra vừa phải.
rzrscm

+1 Tôi cho rằng bất kỳ câu trả lời cho câu hỏi này sẽ là tẻ nhạt. Tôi không biết nhiều về AM / FM nhưng nhìn chung các sóng sẽ được chuyển đến bộ lọc trước, như trong tổng hợp trừ. Ngoài ra, ví dụ của bạn về nhiều ghi chú piano là chính xác, một ví dụ tốt hơn sẽ chỉ là một ghi chú! Một nốt piano duy nhất sẽ tạo ra nhiều giai điệu mang lại cho nó âm sắc. Một cây đàn piano sẽ tạo ra> 5 sóng cộng lại với nhau trong khi trong hầu hết các synth 2 hoặc 3 sẽ ổn.
Tony

cách chính xác để kiểm tra tràn trong hàm "add_sine_wave" là gì?
eadmaster

@eadmaster: Ý tôi là cắt. Hãy chắc chắn rằng giá trị phù hợp với một shorttrước khi bạn chuyển nó thành a short.
Panda Pajama

4

Đối với hiệu ứng âm thanh chiptune, có một câu trả lời chắc chắn: sfxr .

Đây là một ứng dụng độc lập mà bạn có thể sử dụng để tạo mẫu, nhưng mã nguồn cũng có sẵn nếu bạn muốn tích hợp nó vào mã của mình.


3

Cá nhân tôi có thể giới thiệu các thư viện âm thanh của Blargg . Thứ có thể khiến bạn quan tâm đặc biệt là Blip_Buffer của anh ấy .

Trang web của Blargg có một số trình tổng hợp âm thanh "retro" và tôi đang tích cực sử dụng Game_Music_Emu của mình để phát các tệp NSF trong bản sao Mega Man mà tôi đang viết.

Nhiều thư viện được viết bằng C ++ nhưng một số thư viện cũng cung cấp giao diện C.


Chắc chắn sẽ thử một vài trong số này ... Chúng có thể chỉ là những gì tôi đang tìm kiếm vì tôi đang làm việc trên một công cụ trò chơi nhằm mô phỏng giao diện của một trò chơi NES.
rzrscm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.