내가 Audiolet를 사용하여 자바 스크립트에서 야마하 YM3812 사운드 칩 (일명 OPL2 http://en.wikipedia.org/wiki/YM3812)의 일부 기능을 구현하기 위해 노력하고있어 (합성 라이브러리는 http://oampo.github.io/Audiolet/api.html)이 간단한 FM 신디 디자인에있어 문제가 있습니까?
Audiolet는 (노드의 그래프로 오실레이터 신디사이저를 구축 할 수 있습니다 , DSP, 봉투 생성기 등).
OPL2에는 2 개의 연산자 (발진기)가있는 9 개의 채널이 있습니다. 일반적으로 각 채널의 한 오실레이터가 다른 채널의 주파수를 변조합니다.
신디사이저 노드 체인 (한 아홉 개 채널)
노드 체인 생성 및 접속 코드 :이 시뮬레이션하기 위해, 나는 각 채널에 대해 노드의 체인을 구축했습니다
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
};
그러나 변조기 및 캐리어 노드의 매개 변수 (발진기 파형, 상대 주파수, atten ADSR 매개 변수) 및 트리거 노트를 사용하면 출력은 거의 동일한 매개 변수를 갖는 적절한 OPL2 에뮬레이터와 거의 유사하지 않습니다. 일부 소리가 야구장에 있습니다. 다른 것들은 상당히 불쾌합니다.
진행 방법에 대한 아이디어가 있습니다. (여러 단계의 출력물을 플로팅하는 것이 좋은 출발점이 될 것이라고 생각합니다.)하지만 경험이 풍부한 사람이 올바른 방향으로 나를 가리키게하거나 분명히 잘못된 것을 지적하기를 바랍니다. 내가하는 일로. 신호 처리 나 강력한 수학적 배경이 없습니다. 나는 FM에 대한 깊은 직관적 인 이해가 없다. 내가 의심
일부 문제는 다음과 같습니다
1) 내 FM 구현() 위 근본적으로 잘못 때문이다. 또한합니다 (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) FM 신디사이저의 출력은 매우 민감 할 수있다 변조기 ADSR envelope의 모양이 약간 다르다면 (이것이 사실인지 말해주십시오!), ADSR envelope은 실제 OPL2의 ADSRs에서 조잡한 근사치입니다. 구현시 상대적으로 중요하지 않은 기능 (예 : 키 스케일링)이 없지만 FM 신디사이저의 사운드에 큰 영향을 미칠 수있는 기능이 누락되었습니다 (다시는 확실하지 않습니다).
이미지를 보면, 변조기는 반송파 주파수 및 이득이 아닌 링크되어야합니다 (예 : https://en.wikipedia.org/wiki/Frequency_modulation#/media/File:Amfm3-en-de.gif). – Elric
일반적으로 변조기의 이득 단계에주의하고 너무 많은 이득과 변조를 적용하지 않으려합니다. 변조가 너무 큰 경우 변조를 통해 "불쾌한 소리"를 얻습니다. 나는 이것이 당신이 묘사하는 것이 확실치 않습니다. – noumenal
다이어그램을 기반으로하는 Elric은 변조기가 이득과 연결되어있는 것처럼 보입니다. 제가 Audiolet을 보았을 때 너무 오래되었습니다. 지금 무슨 일이 일어나고 있는지 확실하지 않습니다. 나는 그것으로 발굴을 할 것이다. – bsa