2008-08-31 23 views
5

Tôi đang tìm cách viết một bộ tạo âm thanh trong Java, và tự hỏi liệu có ai có lời khuyên hay tài nguyên tốt để viết một chương trình như vậy không. Tôi đang tìm kiếm thông tin về việc tạo ra các sóng âm thanh thô, cách xuất chúng thành một dạng có thể sử dụng (chơi qua loa), cũng như lý thuyết chung về chủ đề. Cảm ơn các bạn.Beginner Digital Synth

Trả lời

6
  1. Vấn đề này là cơ bản về chức năng lập bản đồ để mảng các con số. Một ngôn ngữ hỗ trợ các hàm hạng nhất sẽ thực sự có ích ở đây.

  2. Kiểm tra http://www.harmony-central.com/Computer/Programminghttp://www.developer.com/java/other/article.php/3071021 để biết một số thông tin liên quan đến Java.

  3. Nếu bạn không biết những khái niệm cơ bản về mã hóa dữ liệu âm thanh, sau đó đọc http://en.wikipedia.org/wiki/Sampling_rate

  4. Định dạng WAVE kinh điển là rất đơn giản, xem http://www.lightlink.com/tjweber/StripWav/Canon.html. Tiêu đề (44 byte đầu tiên) + dữ liệu sóng. Bạn không cần bất kỳ thư viện nào để thực hiện điều đó.

Trong C/C++, cấu trúc dữ liệu tương ứng sẽ giống như thế này:

typedef struct _WAVstruct 
{ 
    char headertag[4]; 
    unsigned int remnantlength; 
    char fileid[4]; 

    char fmtchunktag[4]; 
    unsigned int fmtlength; 
    unsigned short fmttag; 
    unsigned short channels; 
    unsigned int samplerate; 
    unsigned int bypse; 
    unsigned short ba; 
    unsigned short bipsa; 

    char datatag[4]; 
    unsigned int datalength; 

    void* data; //<--- that's where the raw sound-data goes 
}* WAVstruct; 

Tôi không chắc chắn về Java. Tôi đoán bạn sẽ phải thay thế "struct" với "class" và "void * data" với dữ liệu "char []" hoặc "short []" hoặc "int []", tương ứng với số bit trên mỗi mẫu, như được định nghĩa trong trường bipsa.

Để lấp đầy nó với dữ liệu, bạn sẽ sử dụng một cái gì đó như thế trong C/C++:

int data2WAVstruct(unsigned short channels, unsigned short bipsa, unsigned int samplerate, unsigned int datalength, void* data, WAVstruct result) 
{ 
    result->headertag[0] = 'R'; 
    result->headertag[1] = 'I'; 
    result->headertag[2] = 'F'; 
    result->headertag[3] = 'F'; 
    result->remnantlength = 44 + datalength - 8; 
    result->fileid[0] = 'W'; 
    result->fileid[1] = 'A'; 
    result->fileid[2] = 'V'; 
    result->fileid[3] = 'E'; 

    result->fmtchunktag[0] = 'f'; 
    result->fmtchunktag[1] = 'm'; 
    result->fmtchunktag[2] = 't'; 
    result->fmtchunktag[3] = ' '; 
    result->fmtlength = 0x00000010; 
    result->fmttag = 1; 
    result->channels = channels; 
    result->samplerate = samplerate; 
    result->bipsa = bipsa; 
    result->ba = channels*bipsa/8; 
    result->bypse = samplerate*result->ba; 

    result->datatag[0] = 'd'; 
    result->datatag[1] = 'a'; 
    result->datatag[2] = 't'; 
    result->datatag[3] = 'a'; 
    result->datalength = datalength; 

    result->data = data; // <--- that's were the data comes in 

    return 0; // an error code, not implemented, yet ...; in Java: return result 
} 

Một lần nữa, tôi không chắc chắn về Java nhưng việc chuyển đổi nên đơn giản nếu bạn chuyển đổi các void-con trỏ vào một mảng tương ứng với tốc độ bit.

Sau đó, chỉ cần viết toàn bộ cấu trúc vào một tệp để nhận tệp sóng có thể phát.

2

Kiểm tra Frinika. Đó là một máy trạm âm nhạc đầy đủ tính năng được triển khai trong Java (mã nguồn mở). Sử dụng API, bạn có thể chạy các sự kiện midi thông qua bộ tổng hợp, đọc đầu ra âm thanh thô và ghi nó vào một tệp WAV (xem liên kết mã nguồn bên dưới).

thông tin bổ sung:

2

Trong khi học văn bằng của tôi, dự án luận án của tôi là tạo ra một bộ tổng hợp mô-đun dựa trên Java, và Đại học mà tôi đã nghiên cứu thấy phù hợp để làm cho báo cáo của tôi công bố rộng rãi:

A Software Based Modular Synthesiser in Java

+0

giấy rất hữu ích, đặc biệt cho những điều cơ bản. – leolobato

1

Tôi không Nếu bạn có thể sử dụng MIDI cho bất cứ điều gì, bạn nên kiểm tra JFuge.

+1

Đó là JFugue tại http: //www.jfugue.org –

+0

MIDI giống như flint-knapping: nó xứng đáng được tôn trọng bởi vì dịch vụ của nó đối với nhân loại trong quá khứ xa xôi, nhưng nó không phải là thứ mà bất cứ ai cũng nên sử dụng nghiêm túc ngày nay. – MusiGenesis

+2

@MusiGenesis - Bạn có nghiêm túc không? LOL – Krakkos

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