मैं Audiolet का उपयोग कर जावास्क्रिप्ट में एक Yamaha YM3812 ध्वनि चिप (उर्फ OPL2 http://en.wikipedia.org/wiki/YM3812) की कुछ सुविधाओं को लागू करने की कोशिश कर रहा हूँ (एक संश्लेषण पुस्तकालय, http://oampo.github.io/Audiolet/api.html)इस साधारण एफएम synth डिजाइन के साथ क्या गलत है?
Audiolet आप (दोलन नोड्स के एक ग्राफ के रूप में एक सिंथेसाइज़र बनाने की अनुमति देता , डीएसपी, लिफाफा जनरेटर आदि)।
ओपीएल 2 में नौ ऑपरेटरों (ओसीलेटर) प्रत्येक के साथ नौ चैनल हैं। आमतौर पर, प्रत्येक चैनल में एक ऑसीलेटर दूसरे की आवृत्ति को संशोधित करता है।
सिंथ नोड श्रृंखला (नौ में से एक चैनल)
नोड श्रृंखला निर्माण और कनेक्शन कोड: इस अनुकरण करने के लिए, मैं प्रत्येक चैनल के लिए नोड्स की एक श्रृंखला का निर्माण किया है
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
};
हालांकि, जब मैं न्यूनाधिक और वाहक नोड्स के मानकों (दोलक waveforms, रिश्तेदार आवृत्तियों निर्धारित करते हैं, atten यूशन, एडीएसआर पैरामीटर) और ट्रिगर नोट्स, आउटपुट लगभग एक ही पैरामीटर के साथ एक सभ्य ओपीएल 2 एमुलेटर के लिए बहुत कम समानता भालू। कुछ आवाज ballpark में हैं। अन्य काफी अप्रिय हैं।
मेरे पास आगे बढ़ने के बारे में कुछ विचार हैं (मुझे लगता है कि अलग-अलग चरणों में आउटपुट प्लॉट करना एक अच्छा प्रारंभिक बिंदु होगा), लेकिन मुझे उम्मीद है कि कोई अनुभवी व्यक्ति मुझे सही दिशा में इंगित कर सकता है, या कुछ गलत तरीके से इंगित कर सकता है मैं क्या कर रहा हूँ के साथ। मेरे पास सिग्नल प्रोसेसिंग या मजबूत गणितीय पृष्ठभूमि नहीं है। मुझे एफएम की गहरी अंतर्ज्ञानी समझ नहीं है।
कुछ मुद्दों मुझे लगता है कर रहे हैं:
1) मेरे एफएम कार्यान्वयन (जैसा कि ऊपर दिखाया गया है) मौलिक रूप से गलत है। इसके अलावा, वहाँ जहां (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) एफएम synths के उत्पादन अत्यधिक संवेदनशील हो सकता है मॉड्यूलर एडीएसआर लिफाफे के आकार में छोटे मतभेदों के लिए (कृपया मुझे बताएं कि यह सच है!), और मेरे एडीएसआर लिफाफे वास्तविक ओपीएल 2 में एडीएसआर के सर्वश्रेष्ठ पर कच्चे अनुमान हैं। मेरे कार्यान्वयन में कुछ विशेषताएं भी अनुपलब्ध हैं जो अपेक्षाकृत महत्वहीन (जैसे कुंजी स्केलिंग) लगती हैं, लेकिन जो एफएम synth की ध्वनि को महत्वपूर्ण रूप से प्रभावित कर सकती है (फिर से, मुझे यकीन नहीं है)।
अपनी छवि को देखते हुए, मॉड्यूलर को वाहक आवृत्ति से जोड़ा जाना चाहिए और लाभ नहीं लेना चाहिए (इस तरह: https://en.wikipedia.org/wiki/Frequency_modulation#/media/File:Amfm3-en-de.gif)। – Elric
आमतौर पर, आप मॉड्यूलर के लाभ चरण से सावधान रहना चाहते हैं और बहुत अधिक लाभ और इसलिए मॉड्यूलेशन लागू नहीं करना चाहते हैं। यदि मॉडुलन बहुत बड़ा है तो आपको वाहक पर हावी होने वाले मॉड्यूलेशन के साथ "अप्रिय आवाज़ें" मिलती हैं। मुझे यकीन नहीं है कि आप यही वर्णन करते हैं। – noumenal
एलीक, आरेख पर आधारित यह निश्चित रूप से मॉड्यूलर की तरह दिखता है जैसे लाभ से जुड़ा हुआ है। यह बहुत लंबा रहा है क्योंकि मैंने इस पर काम किया है या ऑडियोलेट को देखा है कि अब मुझे यकीन नहीं है कि क्या हो रहा है! मैं इसमें एक खुदाई होगी। – bsa