37

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)

OPL2 channel as implemented

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).

+4

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

+0

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

+0

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

Trả lời

1

Hầu hết các bộ tổng hợp được thử nghiệm 'FM' trên thực tế là điều chế pha (PM, xem https://en.wikipedia.org/wiki/Phase_modulation). Có một số lợi ích (chủ yếu là dẫn đến âm thanh ổn định hơn trên một phạm vi âm lớn). OPL2 cũng có thể sử dụng điều này, tôi không tìm thấy bằng chứng rõ ràng, nhưng bài viết trên Wikipedia cũng sử dụng thuật ngữ 'điều chế pha'.

Tóm lại, nhiều bộ tổng hợp âm nhạc có nhãn 'FM' trên thực tế có 'PM', vì vậy bạn có thể thử làm điều đó và kiểm tra xem nó có phù hợp hơn với âm thanh OPL2 dự kiến ​​hay không.

Từ một cái nhìn nhanh về nguồn Audiolet, tôi đoán bộ vi xử lý Sine đang hoạt động đúng FM, vì vậy bạn có thể cần phải thay thế và thêm đầu vào pha để cho phép điều chế pha.

Về cơ bản, dòng

output.samples[0] = Math.sin(this.phase); 

sử dụng bởi Sine của Oscilator hãng sẽ phải đọc một cái gì đó giống như

output.samples[0] = Math.sin(this.phase+phase_offset); 

với phase_offset điều khiển bởi Oscilator mod thay vì tần số.

+0

Bàn phím Yamaha DX7 nổi tiếng, cùng lúc với nhà sản xuất tương tự như OPL2, được dán nhãn 'tổng hợp FM' mặc dù sử dụng điều chế pha quá. – dronus

+0

Cảm ơn câu trả lời. Bạn nói đúng, OPL không sử dụng điều chế pha, và tôi nghĩ rằng việc thực hiện của tôi đã làm FM "thực", nhưng nó đã quá lâu kể từ khi tôi nhìn vào nó, tôi thực sự không thể nói bây giờ :). Sự hiểu biết của tôi là cho sóng sin, điều chế pha và điều chế tần số là tương đương, vì vậy tôi mặc dù tôi có thể đạt được một âm thanh tương tự như vậy. – bsa

+0

Không, FM và PM khá khác nhau bên cạnh việc chia sẻ nhiều thuộc tính. Tuy nhiên, các thay đổi tần số tạm thời tích hợp theo thời gian cho FM để thêm ca lệch vĩnh viễn. Trên PM, một điều chế tạm thời cho biết thêm một sự thay đổi pha tạm thời. – dronus

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