37

मैं Audiolet का उपयोग कर जावास्क्रिप्ट में एक Yamaha YM3812 ध्वनि चिप (उर्फ OPL2 http://en.wikipedia.org/wiki/YM3812) की कुछ सुविधाओं को लागू करने की कोशिश कर रहा हूँ (एक संश्लेषण पुस्तकालय, http://oampo.github.io/Audiolet/api.html)इस साधारण एफएम synth डिजाइन के साथ क्या गलत है?

Audiolet आप (दोलन नोड्स के एक ग्राफ के रूप में एक सिंथेसाइज़र बनाने की अनुमति देता , डीएसपी, लिफाफा जनरेटर आदि)।

ओपीएल 2 में नौ ऑपरेटरों (ओसीलेटर) प्रत्येक के साथ नौ चैनल हैं। आमतौर पर, प्रत्येक चैनल में एक ऑसीलेटर दूसरे की आवृत्ति को संशोधित करता है।

सिंथ नोड श्रृंखला (नौ में से एक चैनल)

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 
}; 

हालांकि, जब मैं न्यूनाधिक और वाहक नोड्स के मानकों (दोलक 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 की ध्वनि को महत्वपूर्ण रूप से प्रभावित कर सकती है (फिर से, मुझे यकीन नहीं है)।

+4

अपनी छवि को देखते हुए, मॉड्यूलर को वाहक आवृत्ति से जोड़ा जाना चाहिए और लाभ नहीं लेना चाहिए (इस तरह: https://en.wikipedia.org/wiki/Frequency_modulation#/media/File:Amfm3-en-de.gif)। – Elric

+0

आमतौर पर, आप मॉड्यूलर के लाभ चरण से सावधान रहना चाहते हैं और बहुत अधिक लाभ और इसलिए मॉड्यूलेशन लागू नहीं करना चाहते हैं। यदि मॉडुलन बहुत बड़ा है तो आपको वाहक पर हावी होने वाले मॉड्यूलेशन के साथ "अप्रिय आवाज़ें" मिलती हैं। मुझे यकीन नहीं है कि आप यही वर्णन करते हैं। – noumenal

+0

एलीक, आरेख पर आधारित यह निश्चित रूप से मॉड्यूलर की तरह दिखता है जैसे लाभ से जुड़ा हुआ है। यह बहुत लंबा रहा है क्योंकि मैंने इस पर काम किया है या ऑडियोलेट को देखा है कि अब मुझे यकीन नहीं है कि क्या हो रहा है! मैं इसमें एक खुदाई होगी। – bsa

उत्तर

1

अधिकांश सिंथेसाइज़र वास्तव में 'एफएम' पेश करते हैं, वास्तव में चरण मॉड्यूलेशन करते हैं (पीएम, https://en.wikipedia.org/wiki/Phase_modulation देखें)। कुछ फायदे हैं (ज्यादातर बड़ी टोनल रेंज पर अधिक स्थिर ध्वनि की ओर अग्रसर होते हैं)। ओपीएल 2 इसका भी उपयोग कर सकता है, मुझे कोई स्पष्ट सबूत नहीं मिला, लेकिन विकिपीडिया लेख 'चरण मॉड्यूलेशन' शब्द का भी उपयोग करता है।

संक्षेप में, 'एफएम' लेबल वाले कई संगीत सिंथेसाइज़र वास्तव में 'पीएम' दिखाते हैं, इसलिए आप इसके साथ जाने का प्रयास कर सकते हैं और जांच सकते हैं कि यह अपेक्षित ओपीएल 2 ध्वनियों के अनुकूल है या नहीं।

एक त्वरित नज़र से ऑडियोलेट स्रोत तक, मुझे लगता है कि Sine ओएससीलेटर वास्तविक एफएम कर रहा है, इसलिए आपको इसे बदलने और चरण मॉड्यूलेशन की अनुमति देने के लिए चरण इनपुट जोड़ने की आवश्यकता हो सकती है।

मूल रूप से

, लाइन

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

वाहक oscilator की Sine द्वारा प्रयोग किया जाता है जैसे

output.samples[0] = Math.sin(this.phase+phase_offset); 
phase_offset आवृत्ति के बजाय आधुनिक oscilator द्वारा नियंत्रित के साथ

कुछ पढ़ने के लिए होगा।

+0

प्रसिद्ध यामाहा डीएक्स 7 कीबोर्ड, ओपीएल 2 के समान निर्माता द्वारा एक ही समय में, चरण मॉड्यूलेशन का उपयोग करने के बावजूद 'एफएम संश्लेषण' लेबल किया गया था। – dronus

+0

उत्तर के लिए धन्यवाद। आप सही हैं, ओपीएल चरण मॉड्यूलेशन का उपयोग करता है, और मैंने सोचा कि मेरा कार्यान्वयन "असली" एफएम कर रहा था, लेकिन यह बहुत लंबा रहा है क्योंकि मैंने इसे देखा है, मैं वास्तव में अब नहीं कह सकता :)। मेरी समझ यह थी कि साइन लहरों के लिए, चरण मॉडुलन और आवृत्ति मॉडुलन बराबर हैं, इसलिए मैं इस तरह एक समान ध्वनि प्राप्त कर सकता था। – bsa

+0

नहीं, एफएम और पीएम कई संपत्तियों को साझा करने के बगल में काफी अलग हैं। हालांकि, अस्थायी आवृत्ति परिवर्तन एफएम के लिए स्थायी चरण शिफ्ट जोड़ने के लिए समय के साथ एकीकृत होता है। पीएम पर, एक अस्थायी मॉड्यूलेशन एक अस्थायी चरण शिफ्ट जोड़ता है। – dronus

संबंधित मुद्दे