2012-02-04 44 views
10

Tôi đang cố tìm tài liệu, hướng dẫn, ví dụ về cách tạo âm thanh. Tôi có nghĩa là không sử dụng một thư viện mà sẽ ẩn tất cả những thứ thú vị.Tạo âm thanh không có thư viện?

Tôi rất thú vị về âm thanh và tôi muốn bắt đầu làm điều gì đó với nó nhưng tôi không biết bắt đầu từ đâu.

Sửa lỗi nếu tôi sai nhưng mức thấp nhất để tạo âm thanh là một trong số này (DirectSound , CoreAudio, ALSA, OSS) tùy thuộc vào hệ điều hành. Vì vậy, tôi phải chọn một hệ điều hành và tìm hiểu hệ thống âm thanh thích hợp?

Điều này thực sự có giá trị hay tôi chỉ nên tìm hiểu một thư viện kết thúc tốt đẹp tất cả những điều trên và cung cấp khả năng tương thích nền tảng chéo?

Có lẽ câu hỏi này không rõ ràng lắm và tôi xin lỗi vì điều đó nhưng hóa ra tôi thậm chí không biết mình muốn gì. Tôi chỉ đang cố gắng tìm một cái gì đó thú vị cho luận án của tôi.

+1

Bạn nên cung cấp cho SDL một shot. –

+0

Điều này không trực tiếp trả lời câu hỏi của bạn, ngoại trừ việc đó là một sự kiện thú vị về một nhạc sĩ tạo ra âm thanh với một chiếc máy tính không được tạo âm thanh: http://en.wikipedia.org/wiki/Aphex_Twin#ZX81_competition –

+0

@AlexReynolds Đó là cảm hứng. – kechapito

Trả lời

7

Dưới đây là ví dụ để giúp bạn bắt đầu.

// filename "wf.cpp" (simple wave-form generator) 

    #include <iostream> 
    #include <cmath> 
    #include <stdint.h> 

int main() 
    { 

    const double R=8000; // sample rate (samples per second) 
    const double C=261.625565; // frequency of middle-C (hertz) 
    const double F=R/256; // bytebeat frequency of 1*t due to 8-bit truncation (hertz) 
    const double V=127; // a volume constant 

    for (int t=0; ; t++) 
     { 
     uint8_t temp = (sin(t*2*M_PI/R*C)+1)*V; // pure middle C sine wave 
    // uint8_t temp = t/F*C; // middle C saw wave (bytebeat style) 
    // uint8_t temp = (t*5&t>>7)|(t*3&t>>10); // viznut bytebeat composition 
     std::cout<<temp; 
     } 

    } 

biên dịch và chạy trên Linux qua ALSA giao diện:

make wf && ./wf |aplay 

biên dịch và chạy trên Linux qua GStreamer giao diện:

make wf && ./wf |gst-launch-0.10 -v filesrc location=/dev/stdin ! 'audio/x-raw-int,rate=8000,channels=1,depth=8' ! autoaudiosink 

GStreamer tuyên bố để được cross-nền tảng . Đó là tính năng quan tâm chính là bạn có thể tạo (hoặc sử dụng các plugin hiện có) để xây dựng một đường ống của các bộ lọc âm thanh.

+0

Ví dụ của tôi sử dụng đơn âm 8 bit nhưng có thể dễ dàng sửa đổi để sử dụng các định dạng khác (ví dụ: âm thanh nổi 16 bit). – nobar

+0

Đó là những gì tôi cần. Cảm ơn bạn. – kechapito

+0

Phát đĩa CD: 'tìm/chạy/người dùng/$ {USER}/gvfs/cdd * -iname" * .wav "-print0 | xargs -0 aplay' – nobar

5

Trên một số hệ thống Unix (ish), bạn có thể just write audio data to /dev/audio (or /dev/dsp) và nó sẽ phát. Trên các hệ thống Linux hiện đại sử dụng ALSA, bạn có thể cần phải đặt đường ống đó cho aplay. Trong cả hai trường hợp, mặc dù, bạn không cần phải sử dụng bất kỳ thư viện âm thanh cụ thể — chỉ cần mở một dòng đầu ra và ghi vào nó. Đây là cách tất cả những người bytebeat một lót làm điều đó.

+0

+1. Tổng quan về bytebeaters tại đây: http://www.metafilter.com/tags/bytebeat –

2

Bạn cần phải comunicate với các phần cứng âm thanh, nhưng những lần mà bạn có thể làm điều đó trực tiếp là dài hơn ...

I có thể đề nghị OpenAL?

2

Tất cả các câu trả lời khác chỉ đề xuất một số trừu tượng hoặc thư viện. Luôn có khả năng quay trở lại trực tiếp trên phần cứng. (Cho dù đây là một ý tưởng tốt hay không là hoàn toàn khác và bạn hoàn toàn quyết định)

Tôi có thể đề xuất xem mã trình điều khiển âm thanh không? Trình điều khiển Emu10k1 chỉ là một ví dụ có sẵn trong các nguồn Linux.

Cũng đáng xem là thế này: "Creating a Kernel Driver for the PC-Speaker"

Tôi cũng nhớ những ngày trên Amiga, nơi một số anh chàng hài hước tạo ra một chương trình (không) sử dụng Floppy drive stepper motor as an audio output.

Các vấn đề liên quan