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
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.
Kiểm tra http://www.harmony-central.com/Computer/Programming và http://www.developer.com/java/other/article.php/3071021 để biết một số thông tin liên quan đến Java.
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
Đị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.
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:
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:
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.
Đó là JFugue tại http: //www.jfugue.org –
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
@MusiGenesis - Bạn có nghiêm túc không? LOL – Krakkos
- 1. Beginner to Swing
- 2. Phần mềm Thư viện Synth cho Java
- 3. Parse Lego Digital Designer * .lxf files
- 4. Visual C# Beginner Empty Project Trợ giúp?
- 5. Beginner ILNumerics: cài đặt theo VS2012
- 6. C++ con trỏ đến chức năng, Beginner Câu hỏi
- 7. Kích hoạt tính năng IsSelected của listview (Beginner)
- 8. Điều gì sai với thiết kế synth FM đơn giản này?
- 9. Beginner JavaScript: Làm việc với JSON và các đối tượng trong JavaScript
- 10. gwt beginner- error "không thể tìm thấy bất kỳ trang máy chủ nào trong dự án '
- 11. Guice Beginner - Làm thế nào để ràng buộc các lớp cụ thể?
- 12. Kiểm tra nhiều mục trong mảng bằng cách sử dụng .include? - Ruby Beginner
- 13. Đi qua những thay đổi biến giữa các chủ đề trong Python chức năng [Beginner]
- 14. Django/Python Beginner: Lỗi khi thực thi python manage.py syncdb - psycopg2 không tìm thấy
- 15. Giá trị thông báo sai cho chữ ký xml bằng cách sử dụng Java XML Digital Signature API
- 16. Thấy gì phiên bản đi kèm với một thẻ trong Git
- 17. Tôi có thể tìm thông số DLNA đầy đủ ở đâu?
- 18. có chức năng hợp nhất AutoMapper không?
- 19. giá trị chiết xuất sử dụng biểu thức chính quy trong mysql
- 20. Thực hiện làm mờ hình tròn với OpenCV
- 21. Triển khai thư viện chuẩn C++ trong các trình biên dịch khác nhau
- 22. TTS để phát trực tuyến bằng SpeechAudioFormatInfo sử dụng SpeechSynthesizer
- 23. array_diff & phím số renumbering
- 24. Làm thế nào để chèn mục mới vào IEnumerable
- 25. reinterpret_cast
- 26. Photoshop Mock Up Font là không giống như trong HTML
- 27. Tạo, cục bộ, Ruby-on-Rails danh sách-of-giá trị linh hoạt
- 28. lý do tại sao undefined trong node.js xin chào ví dụ thế giới sau console.log
- 29. Làm thế nào để thực hiện một cref để quá tải phương thức trong một thẻ <seealso> trong C#?
- 30. Mô-đun Python đáng đọc nhất
giấy rất hữu ích, đặc biệt cho những điều cơ bản. – leolobato