37

내가 Audiolet를 사용하여 자바 스크립트에서 야마하 YM3812 사운드 칩 (일명 OPL2 http://en.wikipedia.org/wiki/YM3812)의 일부 기능을 구현하기 위해 노력하고있어 (합성 라이브러리는 http://oampo.github.io/Audiolet/api.html)이 간단한 FM 신디 디자인에있어 문제가 있습니까?

Audiolet는 (노드의 그래프로 오실레이터 신디사이저를 구축 할 수 있습니다 , DSP, 봉투 생성기 등).

OPL2에는 2 개의 연산자 (발진기)가있는 9 개의 채널이 있습니다. 일반적으로 각 채널의 한 오실레이터가 다른 채널의 주파수를 변조합니다.

신디사이저 노드 체인 (한 아홉 개 채널)

OPL2 channel as implemented

노드 체인 생성 및 접속 코드 :이 시뮬레이션하기 위해, 나는 각 채널에 대해 노드의 체인을 구축했습니다

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 신디사이저의 사운드에 큰 영향을 미칠 수있는 기능이 누락되었습니다 (다시는 확실하지 않습니다).

+4

이미지를 보면, 변조기는 반송파 주파수 및 이득이 아닌 링크되어야합니다 (예 : https://en.wikipedia.org/wiki/Frequency_modulation#/media/File:Amfm3-en-de.gif). – Elric

+0

일반적으로 변조기의 이득 단계에주의하고 너무 많은 이득과 변조를 적용하지 않으려합니다. 변조가 너무 큰 경우 변조를 통해 "불쾌한 소리"를 얻습니다. 나는 이것이 당신이 묘사하는 것이 확실치 않습니다. – noumenal

+0

다이어그램을 기반으로하는 Elric은 변조기가 이득과 연결되어있는 것처럼 보입니다. 제가 Audiolet을 보았을 때 너무 오래되었습니다. 지금 무슨 일이 일어나고 있는지 확실하지 않습니다. 나는 그것으로 발굴을 할 것이다. – bsa

답변

1

대부분의 신디사이저는 'FM'이라고 불리며 실제로 위상 변조 (PM, https://en.wikipedia.org/wiki/Phase_modulation 참조)를 수행합니다. 몇 가지 이점이 있습니다 (주로 큰 음조 범위에서보다 안정된 사운드를 유도합니다). OPL2도 이것을 사용할 수 있습니다. 명확한 증거는 없지만 Wikipedia 기사에서는 '위상 변조'라는 용어도 사용합니다.

요약하면 'FM'이라고 표시된 많은 음악 신디사이저에는 'PM'이 포함되어 있으므로 실제로 시도해보고 예상되는 OPL2 사운드에 더 잘 맞는지 확인할 수 있습니다.

Audiolet 소스를 간략하게 살펴보면, Sine 오실레이터가 진정한 FM을 수행하고 있다고 생각할 수 있습니다. 따라서이를 대체하고 위상 변조를 허용하기 위해 위상 입력을 추가해야 할 수도 있습니다.기본적으로

대신 주파수의 모드 oscilator에 의해 제어 phase_offset

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

같은 것을 읽을 것 캐리어 oscilator의 Sine에 의해 사용되는 라인

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

.

+0

OPL2와 같은 제조사에서 출시 된 유명한 Yamaha DX7 키보드는 위상 변조를 사용 했음에도 불구하고 'FM 합성'이라고 표시되었습니다. – dronus

+0

답변 해 주셔서 감사합니다. 당신 말이 맞아요, OPL은 위상 변조를 사용하고, 제 구현은 "실제"FM을하고 있다고 생각했지만, 지금은 말할 수 없기 때문에 오랜 시간이 걸렸습니다. :) 내 이해는 사인파의 경우 위상 변조와 주파수 변조가 동일하므로 비슷한 방식으로 사운드를 얻을 수는 있지만 마찬가지입니다. – bsa

+0

아니요, FM과 PM은 많은 속성을 공유하는 것과는 아주 다릅니다. 그러나 일시적인 주파수 변화는 시간에 따라 FM에 통합되어 영구적 인 위상 변화를 추가합니다. PM에서 임시 변조는 임시 위상 이동을 추가합니다. – dronus