2012-05-23 25 views
7

Tôi đang làm một số công việc với binaural beats và đang cố gắng xây dựng một ứng dụng Java có thể phát hai âm thanh tại hơi tần số khác nhau ... khoảng chênh lệch 25-30Hz.Trong Java, có cách nào để tổng hợp một giai điệu của một tần số cụ thể không?

Trong một thế giới hoàn hảo, tôi muốn cung cấp cho Java hai đầu vào số nguyên, nói 440 và 410 và có Java phát lại âm 440Hz và âm 410Hz.

Với những gì tôi đã thấy trong các lớp học javax.sound.*, có vẻ như Java chỉ hỗ trợ tương đương với ghi chú piano ... A4 @ 440Hz, sau đó A-sharp-4 @ 466.164Hz và theo hướng khác, G -sharp-4 @ 415.305Hz. Trong khi "lân cận" thường nằm trong phạm vi để tạo ra một nhịp hai tai, tôi đang cố gắng để đạt được kiểm soát nhiều hơn trong tần số của các tông màu của tôi.

Kể từ khi tổng hợp âm thanh đơn giản là không có gì hơn tần số, cường độ và thời gian-of-thời gian, nó sẽ xuất hiện với tôi rằng ở đâu đó trong lòng của javax.sound.* lớp học, có một số loại tra cứu nói rằng khi tôi nói với Java để chơi "A4", đó là 440Hz. Câu hỏi đặt ra là có hay không có cách nào để hack bảng đó để nói rằng "A4.1" là tương đương với 449Hz.

Tôi đã gây rối với javax.sound.midi, chưa khám phá javax.sound.sampled; có vẻ như tôi cần lấy mẫu nhạc của mình để sử dụng các lớp học sampled; Tôi thích tổng hợp hơn. Chỉ đạo tôi ngay nếu tôi nhầm.

Hầu hết các giao diện của bên thứ ba mà tôi thấy đều hướng đến sản xuất và thao tác âm nhạc, và, như vậy, bị hạn chế trong khả năng làm việc với microtones. Có ai có bất kỳ kinh nghiệm với hoặc khuyến nghị cho một giải pháp?

+0

Bạn đang sử dụng 'javax.sound.midi' hoặc' javax.sound.sampled'? –

+0

@LaurenceGonsalves Tôi đã rối tung với 'midi', chưa khám phá' lấy mẫu '; có vẻ như tôi cần phải lấy mẫu các tông màu của mình để sử dụng các lớp 'lấy mẫu'; Tôi thích tổng hợp hơn. Chỉ đạo tôi ngay nếu tôi nhầm. – dwwilson66

+0

Tôi sẽ không mong đợi midi cung cấp gần như kiểm soát hạt mịn đó. Nó có nghĩa là giao diện điều khiển giữa các thiết bị khác nhau và có số lượng ghi chú hạn chế. –

Trả lời

5

Bạn có thể tạo mẫu và gửi mẫu tới soundcard bằng các lớp trong javax.sound.sampled.*; về cơ bản tạo ra một bộ dao động phần mềm.

Nó đòi hỏi một số kiến ​​thức, nhưng có thể thực sự thú vị khi bạn nhận được nó để làm việc;)

Tôi đã chơi với những phân loại khi tôi tạo này: http://bobusumisu.net/testing/bobusynth-alpha1/

Dưới đây là hướng dẫn đó đã cho tôi bắt đầu : http://www.drdobbs.com/jvm/230500178

+0

Ứng dụng synth gọn gàng! javax.sound.sampled chắc chắn là con đường để đi. Cảm ơn bạn đã liên kết hướng dẫn, tôi rất mong được đọc chi tiết. Nhân tiện, khi tôi chơi synth, tôi bị "kẹt" ở sóng tam giác. Các nút bấm khác hoạt động tốt cho tôi. –

4

Đây chỉ là để bổ sung câu trả lời đã được cung cấp và chấp nhận (mà tôi đã cung cấp +1).

Bạn có thể sử dụng wavetables làm phương án thay thế để chạy các chức năng trig khi đang di chuyển - sắp xếp một nửa mẫu/nửa tổng hợp. Tôi cũng sử dụng một bảng sóng sin với sáu con trỏ độc lập chỉ vào nó để tổng hợp FM, và đã sao chép một số bản vá lỗi Yamaha DX7 theo cách này. Nhưng điều này được thực hiện thông qua javax.sound.sampled. Khi một synth mềm đã được xây dựng, bạn có thể muốn điều khiển nó với các lớp thư viện midi.

Giả sử bạn điền một mảng 1K có phao nổi cho một sóng sin đơn.

Nếu bạn "phát" bảng sóng bằng cách tăng dần và lặp lại nó và trích xuất từng thành viên mảng (để ghi vào thẻ âm thanh qua SourceDataLine), bạn sẽ nhận được quảng cáo chiêu hàng trực tiếp liên quan đến tốc độ mẫu của bạn. Đối với 44100 mẫu mỗi giây, mảng 1024 thành viên sẽ chu kỳ 44100/1024 = 43.066 ... lần để điền vào "giây" đó với dữ liệu (một khoảng rất thấp - khoảng 43 Hz). Nếu bạn bỏ qua tất cả các thành viên bảng thứ hai, sân là gấp đôi, v.v.Để có được sân 440, cần tìm chính xác "gia số" để sử dụng để bước qua mảng bảng sóng, có thể tìm thấy: incr = (kích thước của waveTable * độ cao mong muốn)/tỷ lệ mẫu

Ví dụ (1024 * 440)/44100 cho số gia tăng là: 10.21678 ... Do đó, nếu giá trị đầu tiên từ waveTable ở vị trí mảng 0, giá trị thứ hai được sử dụng sẽ nằm giữa các vị trí 10 và 11. Để có được một giá trị nằm giữa hai vị trí mảng, sử dụng nội suy tuyến tính.

Tôi sử dụng phương pháp này, với thư viện javax.sound.sampled, cho "Theremin" tại liên kết này. Có một bàn phím được hiển thị, nhưng bạn có thể dễ dàng nghe/xem điều khiển microtonal khi bạn di chuyển chuột qua các phím.

http://www.hexara.com/VSL/JTheremin.htm

Ở phía trên, vị trí chuột (gọi qua MouseMotionListener) được sử dụng để tính toán sân mong muốn thông qua chức năng này:

return Math.pow(2, ((mouseX + tuningLoc)/(octaveWidth))); 

nơi octaveWidth là số điểm ảnh bao gồm một quãng tám.

+0

@philfreihofer - swoon. Tôi chơi một trò chơi, và đang ở giữa cố gắng để hack một cảm biến chuyển động xbox kinect để tạo đầu vào cho một phần mềm theremin. Liên kết này chỉ f'n đá. Bạn đã cho tôi một cái gì đó để gây rối xung quanh với cuối tuần này. Bảng sóng cũng là một ý tưởng thú vị. :) – dwwilson66

+0

Vui mừng khi biết bạn đang tận hưởng liên kết! : D Tôi nên đề cập đến, có một số biến chứng trong xử lý một dòng sự kiện khi kiểm soát khối lượng/pitch mà tôi đã không hoàn toàn "giải quyết" - nhưng việc thực hiện vẫn còn khá tốt về mặt đáp ứng. (Java không cung cấp đảm bảo "thời gian thực"). Tôi rất sẵn lòng cung cấp thêm thông tin khi bạn đến đó. Khá thú vị mà bạn có và chơi một Theremin! Bạn là người chơi Theremin đầu tiên đưa ra phản hồi cho tôi và tôi rất vui khi được nghe ý kiến. –

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