Tôi đang cố gắng để thực hiện một số tính năng của một con chip âm thanh Yamaha YM3812 (aka OPL2 http://en.wikipedia.org/wiki/YM3812) trong JavaScript sử dụng Audiolet (thư viện tổng hợp, http://oampo.github.io/Audiolet/api.html)Điều gì sai với thiết kế synth FM đơn giản này?
Audiolet cho phép bạn xây dựng một bộ tổng hợp như một đồ thị của các nút (dao động , DSP, máy tạo phong bì, v.v.).
OPL2 có chín kênh với hai toán tử (bộ dao động). Thông thường, một bộ dao động trong mỗi kênh điều chỉnh tần số của kênh kia. Để mô phỏng này, tôi đã xây dựng một chuỗi các nút cho mỗi kênh:
chuỗi nút Synth (một trong chín kênh)
Node tạo chuỗi và mã kết nối:
var FmChannel = function(audiolet) {
this.car = new ModifiedSine(audiolet);
this.carMult = 1;
this.setCarrierWaveform(this.SIN);
this.mod = new ModifiedSine(audiolet);
this.modMult = 1;
this.setModulatorWaveform(this.SIN);
this.modMulAdd = new MulAdd(audiolet);
this.carGain = new Gain(audiolet);
this.carEnv = new ADSREnvelope(audiolet, 0, 0.1, 0.1, 0.1, 0.1,
function() {
this.carEnv.reset();
}.bind(this)
);
this.carAtten = new Multiply(audiolet);
this.modGain = new Gain(audiolet);
this.modEnv = new ADSREnvelope(audiolet, 0, 0.1, 0.1, 0.1, 0.1,
function() {
this.modEnv.reset();
}.bind(this)
);
this.modAtten = new Multiply(audiolet);
this.modEnv.connect(this.modGain, 0, 1);
this.mod.connect(this.modGain);
this.modGain.connect(this.modAtten);
this.modAtten.connect(this.modMulAdd);
this.modMulAdd.connect(this.car);
this.carEnv.connect(this.carGain, 0, 1);
this.car.connect(this.carGain);
this.carGain.connect(this.carAtten);
// connect carAtten to the mixer from outside
};
Tuy nhiên, khi tôi đặt thông số của nút điều biến và sóng mang (dao động dạng sóng, tần số tương đối, atten các tham số uation, ADSR) và các ghi chú kích hoạt, kết quả đầu ra rất ít giống với một trình giả lập OPL2 phong nha với các tham số tương tự. Một số âm thanh đang ở trong sân chơi bóng chày. Những người khác khá khó chịu.
Tôi có một số ý tưởng về cách tiến hành (tôi đoán âm mưu đầu ra ở các giai đoạn khác nhau sẽ là điểm khởi đầu tốt), nhưng tôi hy vọng ai đó có kinh nghiệm có thể chỉ cho tôi đúng hướng hoặc chỉ ra điều gì đó rõ ràng là sai với những gì tôi đang làm. Tôi không có nền tảng xử lý tín hiệu hoặc toán học mạnh mẽ. Tôi không hiểu rõ về FM.
Một số vấn đề tôi nghi ngờ là:
1) My thực hiện FM (như hình trên) về cơ bản là sai. Ngoài ra, có thể là một vấn đề trong chức năng nơi đóng nốt (thiết lập tần số dao động, và quy mô và bù đắp cho điều biến trước khi kích hoạt các phong bì ADSR):
FmChannel.prototype.noteOn = function (frq) {
var Fc = frq*this.carMult;
this.car.reset(Fc);
this.mod.reset(frq*this.modMult);
// scale and offset modulator from range (-1, 1) to (0, 2*Fc)
// (scale and offset is after ADSR gain and fixed attenuation is applied)
this.modMulAdd.mul.setValue(Fc);
this.modMulAdd.add.setValue(Fc);
this.carEnv.reset();
this.modEnv.reset();
this.carEnv.gate.setValue(1);
Thethis.modEnv.gate.setValue(1);
};
2) Sản lượng synths FM có thể có độ nhạy cao sự khác biệt nhỏ trong hình dạng của phong bì ADSR modulator (hãy cho tôi biết nếu điều này là đúng!), và phong bì ADSR của tôi là xấp xỉ thô tốt nhất của ADSRs trong một OPL2 thực. Việc triển khai của tôi cũng thiếu một số tính năng có vẻ tương đối không quan trọng (ví dụ: tỷ lệ khóa), nhưng điều này có thể ảnh hưởng đến âm thanh của một synth FM đáng kể (một lần nữa, tôi không chắc chắn).
Tìm hình ảnh của bạn, bộ điều biến phải được liên kết với tần số sóng mang và không đạt được (như sau: https://en.wikipedia.org/wiki/Frequency_modulation#/media/File:Amfm3-en-de.gif). – Elric
Thông thường, bạn sẽ muốn cẩn thận với giai đoạn đạt được của bộ điều biến và không áp dụng tăng quá nhiều và do đó điều chế. Nếu điều chế quá lớn, bạn nhận được "âm thanh khó chịu" với điều chế thống trị trên sóng mang. Tôi không chắc đây là những gì bạn mô tả. – noumenal
Elric, dựa trên sơ đồ nó chắc chắn trông giống như bộ điều biến được liên kết để đạt được. Đã quá lâu kể từ khi tôi làm việc này hoặc nhìn vào Audiolet rằng tôi thực sự không chắc chắn bây giờ nếu đó là những gì đang xảy ra! Tôi sẽ đào sâu vào nó. – bsa