рд╡реЛрдХреЛрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдбрд┐рдпреЛ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдСрдбрд┐рдпреЛ рдПрдкреАрдЖрдИ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдП рдФрд░ рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝рд░ рд▓рд┐рдЦрд╛ред рдЕрдм рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдФрд░ рдирдП рдПрдкреАрдЖрдИ рдЪрд┐рдкреНрд╕ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдПрдХ рд▓рдХреНрд╖реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдХреЗрдд рдФрд░ рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдордЬрд╛рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдПрдХ рдЫреЛрдЯрд╛ рд╡реЛрдХрдбрд░ рд▓рд┐рдЦреЗрдВрдЧреЗред

рдЪреВрдВрдХрд┐ рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓реЗрдЦ рдСрдбрд┐рдпреЛ рдПрдкреАрдЖрдИ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЕрдВрд╢реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧрд╛ред рдмреЗрд╢рдХ , рдЖрдк рдбреЗрдореЛ рдкрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


рд╕реНрд░реЛрдд рдЪрдпрди


рдЗрд╕рд▓рд┐рдП рдСрдбрд┐рдпреЛ рдПрдкреАрдЖрдИ рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рдЧреНрдирд▓ рд╕реНрд░реЛрдд рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ:
  1. рдСрдбрд┐рдпреЛ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╕реНрд░реЛрдд
  2. рдСрдбрд┐рдпреЛ рдмрдлрд░
  3. рдмрд╛рд╣рд░реА рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо (рд╕реНрдЯреНрд░реАрдо) (рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рдпрд╛ рдмрд╛рд╣рд░реА рд╕рд╣рд┐рдд рдХреЛрдИ рдЕрдиреНрдп рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо)

рдбреЗрдореЛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ , рд╕рднреА рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд░реЛрдд рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЙрдирдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рд╣реЛрддреА рд╣реИред рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рд╢рд╛рдпрдж, рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк, рдЕрд░реНрдерд╛рддреН рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рд╕реЗ рдмрд╛рд╣рд░реА рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдоред

рдЕрдкрдиреЗ рд╕реНрд░реЛрдд рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рд▓реЗрдиреА рд╣реЛрдЧреА рдФрд░ рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЯрди рдХреЗ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ getUserMedia рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рджреБрдИ ff рддреАрди рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ:
  1. рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдлреЙрд░реНрдо рдХрд╛ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рд╣реИ -
    {video: true, audio: true} 
  2. рдПрдХ рдореАрдбрд┐рдпрд╛ рдХреИрдкреНрдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХреИрдкреНрдЪрд░ рд╕реНрдЯреНрд░реАрдо рд▓реЗрддрд╛ рд╣реИред
  3. рдХреИрдкреНрдЪрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдХрд╛рд░реНрдпред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╡рд┐рднрд┐рдиреНрди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд╣рдорд╛рд░реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
 var d = document, w = window, context = null, dest = null, source = null; var init = function () { try { var audioContext = w.AudioContext || w.webkitAudioContext; navigator.getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; //  context = new audioContext(); //   dest = context.destination; var bufferLoader = new BufferLoader(context, ["effects/reverb.wav"], function (buffers) { navigator.getMedia({ audio: true }, function (striam) { //       source = context.createMediaStreamSource(striam); }, function (e) { alert(e); }); }); bufferLoader.load(); } catch (e) { alert (e.message); } }; 


рдЧреМрд░ рдХреАрдЬрд┐рдП рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдбрд┐рдпреЛ-рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ (рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рдлрд┐рд░ рд╣рдо рдирдпрд╛ рдмрдлрд╝рд░рд▓реЛрдбрд░ рдлрд╝рдВрдХреНрд╢рди рджреЗрдЦрддреЗ рд╣реИрдВред рд╡рд╣ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдПрдХреНрд╕рдПрдЪрдЖрд░ 2 рдХреА рдорджрдж рд╕реЗ рд╡рд╣ рдмрд╛рд╣рд░реА рдСрдбрд┐рдпреЛ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреАрдВрдЪрддреА рд╣реИ рдФрд░ рдзреНрдпрд╛рди рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдмрдлрд░ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рддреА рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдСрдбрд┐рдпреЛ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдорд╛рдирдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
 //    var BufferLoader = function (context, urlList, callback) { this.context = context; this.urlList = urlList; this.onload = callback; this.bufferList = new Array(); this.loadCount = 0; }; BufferLoader.prototype.load = function () { for (var i = 0; i < this.urlList.length; ++i) { this.loadBuffer(this.urlList[i], i); } }; BufferLoader.prototype.loadBuffer = function (url, index) { var request = new XMLHttpRequest(); request.open("GET", url, true); request.responseType = "arraybuffer"; var loader = this; request.onload = function () { loader.context.decodeAudioData( request.response, function (buffer) { if (!buffer) { alert('error decoding file data: ' + url); return; } loader.bufferList[index] = buffer; if (++loader.loadCount == loader.urlList.length) { loader.onload(loader.bufferList); } }, function (error) { console.error('decodeAudioData error', error); } ); } request.onerror = function () { alert('BufferLoader: XHR error'); } request.send(); }; 

рдкреНрд░рднрд╛рд╡ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд╕рд┐рдЧреНрдирд▓ рдХреЛ рд╣рдорд╛рд░реЗ рдСрдбрд┐рдпреЛ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо f-th createMediaStreamSource рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рд╣рдорд╛рд░рд╛ рдЗрдирдкреБрдЯ рд╕рд┐рдЧреНрдирд▓ рд╣рдорд╛рд░реЗ рдкреВрд░реНрдг рдирд┐рдкрдЯрд╛рди рдореЗрдВ рд╣реИ рдФрд░, рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рд╣рдо рдЗрд╕реЗ рдордЬрд╛рдХ рдореЗрдВ рдЙрдбрд╝рд╛рддреЗ рд╣реИрдВред

рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди


рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдЬреЛ рдирд┐рд░реНрджрдпрддрд╛ рд╕реЗ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдПрдЧрд╛ред рдЙрди рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рдирдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

рд╣рдо рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╣рдорд╛рд░реЗ рдПрдл-рд╡реЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ:
 var AudioModulation = function (buffers, source) { var am = this; //  var sourceGain = context.createGain(); sourceGain.gain.value = 2; //        var sourceConvolver = context.createConvolver(); sourceConvolver.buffer = buffers[0]; //   var sourceCompressor = context.createDynamicsCompressor(); sourceCompressor.threshold.value = -18.2; sourceCompressor.ratio.value = 4; //    source.connect(sourceGain); sourceGain.connect(sourceConvolver); sourceConvolver.connect(sourceCompressor); //   sourceCompressor.connect(dest); } 


рд╕рднреА рдорд╛рдиреЛрдВ, рдЬреИрд╕реЗ рд╡реЙрд▓реНрдпреВрдо рдпрд╛ рдореВрд▓реНрдп рдЬрд┐рд╕ рдкрд░ рд╕рдВрдкреАрдбрд╝рди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдбреЗрдореЛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд┐рдЧреНрдирд▓ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдПрдХ рдЧреВрдВрдЬ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдкреНрд░рд╡рд░реНрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ (рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕рд┐рд░ рдкрд░ рдмрд╛рд▓реНрдЯреА рдХреЗ рд╕рд╛рде рдпрд╛ рд╣реЗрд▓рдореЗрдЯ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ)ред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдПрдХ рдореМрд▓рд┐рдХ рдирдИ рдзреНрд╡рдирд┐ рдЕрднреА рддрдХ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреА, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВред рдЕрдЧрд▓рд╛ рдХрджрдо рд░рд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓реЗрд╢рди рдкреНрд░рднрд╛рд╡ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рд╣реИред

рд░рд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓реЗрд╢рди


рд░рд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓реЗрд╢рди рдПрдХ рдСрдбрд┐рдпреЛ рдкреНрд░рднрд╛рд╡ рд╣реИ рдЬреЛ "рдЭрдмрд░рд╛" рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдерд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд╛рдХреНрд╖рд╕реЛрдВ рдФрд░ рд░реЛрдмреЛрдЯреЛрдВ рдХреА рдЖрд╡рд╛рдЬрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдЖрд╢рдп рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╕рдВрдХреЗрдд рд╣реИрдВ, рдПрдХ рдХреЛ рд╡рд╛рд╣рдХ (рдХреИрд░рд┐рдпрд░) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдордирдорд╛рдиреА рдЖрд╡реГрддреНрддрд┐ рдХрд╛ рдПрдХ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рд╕рдВрдХреЗрдд рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрдХреЗрдд рд╣реИ, рдФрд░ рдпреЗ рд╕рдВрдХреЗрдд рдХрдИ рдЧреБрдирд╛ рд╣реИрдВред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рд╡рд┐рдХреГрддрд┐рдпреЛрдВ рдФрд░ рдзрд╛рддреБ рдиреЛрдЯреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИред рдЗрд╕ рдЪрдорддреНрдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдЦреИрд░, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, AudioImodulation рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЗрд╕рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб
 var AudioModulation = function (buffers, source) { var am = this; //  var sourceGain = context.createGain(); sourceGain.gain.value = 2; //        var sourceConvolver = context.createConvolver(); sourceConvolver.buffer = buffers[0]; //   var sourceCompressor = context.createDynamicsCompressor(); sourceCompressor.threshold.value = -18.2; sourceCompressor.ratio.value = 4; //    source.connect(sourceGain); sourceGain.connect(sourceConvolver); sourceConvolver.connect(sourceCompressor); //  var ringGain = this.ringModulation(); sourceCompressor.connect(ringGain); //   ringGain.connect(dest); } AudioModulation.prototype.ringModulation = function () { //,   var ringGain = context.createGain(); ringGain.gain.value = 1; //  ringCarrier = context.createOscillator(); //     40 ringCarrier.type = ringCarrier.SINE; ringCarrier.frequency.value = 40; //    ringCarrier.detune.value = 600; // ,      10 var ngHigpass = context.createBiquadFilter(); ngHigpass.type = ngHigpass.HIGHPASS; ngHigpass.frequency.value = 10; //    ,        ringCarrier.connect(ngHigpass); ngHigpass.connect(ringGain.gain); return ringGain; }; 


рдЦреИрд░, рдпрд╣ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдорд╛рдорд▓рд╛ рд╣реИ, рдЗрд╕ рд╕рдм рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдПрдХ рдмрд▓реНрдХрд┐ "рд░реЛрдмреЛрдЯрд┐рдХ рд╕рд┐рдЧреНрдирд▓" рдорд┐рд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдореИрдиреБрдЕрд▓ рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рднреА рднрд╡реНрдпрддрд╛ рдореЗрдВ рдПрдХ рддреБрд▓реНрдпрдХрд╛рд░рдХ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдФрд░ рд╣рдореЗрдВ рдПрд╣рд╕рд╛рд╕ рд╣реЛрдЧрд╛ рдпрд╣ рдкрд░рд┐рдЪрд┐рдд f- рдФрд░ createBiquadFilter рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рд╣рд╛рдИрд╢реЗрд▓рдл рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ред

рдмрд╛рд░-рдмрд╛рд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдирд╛рдПрдВрдЧреЗ:
 var filters = [{gain: 1,frequency: 40},{gain: 3,frequency: 120},....,{gain: -2,frequency: 16000}]; 

рдЗрд╕рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд▓рд╛рдн рд╕реНрддрд░ рдФрд░ рдЖрд╡реГрддреНрддрд┐ рд╣реИрдВред рдЕрдм рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓:
 AudioModulation.prototype.setFilters = function (source) { var fil = [{ gain: 1, frequency: 40 }, { gain: 3, frequency: 120 }, { gain: -2, frequency: 16000}], out = null, ln = fil.length; for (var i = 0; i < ln; i++) { var loc = fil[i], currFilter = null; currFilter = context.createBiquadFilter(); currFilter.type = currFilter.HIGHSHELF; currFilter.gain.value = loc.gain; currFilter.Q.value = 1; currFilter.frequency.value = loc.frequency; if (!out) { source.connect(currFilter); out = currFilter; } else { out.connect(currFilter); out = currFilter; } } return out; }; 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд░реВрдкрд╛рдВрддрд░рдг рд░реВрдк рд▓реЗрддрд╛ рд╣реИ:
рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб
 var AudioModulation = function (buffers, source) { var am = this; //  var sourceGain = context.createGain(); sourceGain.gain.value = 2; //        var sourceConvolver = context.createConvolver(); sourceConvolver.buffer = buffers[0]; //   var sourceCompressor = context.createDynamicsCompressor(); sourceCompressor.threshold.value = -18.2; sourceCompressor.ratio.value = 4; //    source.connect(sourceGain); sourceGain.connect(sourceConvolver); sourceConvolver.connect(sourceCompressor); //  var ringGain = this.ringModulation(); sourceCompressor.connect(ringGain); //  var outFilters = this.setFilters(sourceCompressor); //   outFilters.connect(dest); } //  AudioModulation.prototype.ringModulation = function () { //,   var ringGain = context.createGain(); ringGain.gain.value = 1; //  ringCarrier = context.createOscillator(); //     40 ringCarrier.type = ringCarrier.SINE; ringCarrier.frequency.value = 40; //    ringCarrier.detune.value = 600; // ,      10 var ngHigpass = context.createBiquadFilter(); ngHigpass.type = ngHigpass.HIGHPASS; ngHigpass.frequency.value = 10; //    ,        ringCarrier.connect(ngHigpass); ngHigpass.connect(ringGain.gain); return ringGain; }; // AudioModulation.prototype.setFilters = function (source) { var fil = [{ gain: 1, frequency: 40 }, { gain: 3, frequency: 120 }, { gain: -2, frequency: 16000}], out = null, ln = fil.length; while (ln--) { var loc = fil[ln], currFilter = null; currFilter = context.createBiquadFilter(); currFilter.type = currFilter.HIGHSHELF; currFilter.gain.value = loc.gain; currFilter.Q.value = 1; currFilter.frequency.value = loc.frequency; if (!out) { source.connect(currFilter); out = currFilter; } else { out.connect(currFilter); out = currFilter; } } return out; }; 


рдЦреИрд░ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реНрдг-рд╕рдорддреБрд▓реНрдп рддреБрд▓реНрдпрдХрд╛рд░рдХ рд╣реИ рдФрд░ рд╣рдо рд╕рд┐рдЧреНрдирд▓ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдмрдврд╝рд╛ рдпрд╛ рдХрдордЬреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рд╣рдо "рд▓рд╛рд▓рдХреА" рдереЗ, рддреЛ рд╣рдо рдЬреЛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕ рдкрд░ рд░реЛрдХ рджреЗрдВрдЧреЗ рдФрд░ рд╢рд╛рдВрдд рд╡рд┐рд╡реЗрдХ рдХреЗ рд╕рд╛рде рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реБрдП рдорд╛рдЗрдХреНрд░реЛрдлреЛрди рдХреЛ рдкреАрдбрд╝рд╛ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдзрд┐рдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрдХ рдореЗрдВ рдПрдХ рдЪреЗрд░реА рдЬреЛрдбрд╝реЗрдВ - рд╣рдо рдкрд┐рдЪ рд╢рд┐рдлреНрдЯрд░ рдирд╛рдордХ рдПрдХ рдкреНрд░рднрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред

рдореБрдЦреНрдп рдкрд░рд┐рд╡рд░реНрддрди


рдкреНрд░рднрд╛рд╡ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕рд┐рдЧреНрдирд▓ рдореЗрдВ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рджреЛ рдЯрди рдКрдкрд░ рдпрд╛ рдиреАрдЪреЗ рдХрд┐рд╕реА рднреА рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рдореБрдЦреНрдп рд╕реНрд╡рд░ рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдлреИрд╢рдиреЗрдмрд▓ рдкреНрд░рднрд╛рд╡ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЛрд▓реЗрдВрдЧреЗред
рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рд╣рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрд╕рддрдд рдлреВрд░рд┐рдпрд░ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо (рдпрд╛, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд╡рд░реНрдЬрди рд╡рд┐рдВрдбреЛ рдлреВрд░рд┐рдпрд░ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ ) рдФрд░ рдкрд┐рдЫрд▓реЗ рдЖрд░реНрдЯрд┐рдХрд▓ рд╕реЗ рд╣рдореЗрдВ рдЬреНрдЮрд╛рдд рд╡рд┐рдзрд┐ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ , Scriptрд╕реНрдХреНрд░рд┐рдкреНрдЯрдкреНрд░реЛрд╕реЗрд╕рд░ ред рдпрд╣ рддреАрди рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ: рдмрдлрд░ (рдлрд╝реНрд░реЗрдо рдпрд╛ рдбреЗрдЯрд╛ рд╡рд┐рдВрдбреЛ рдХрд╛ рдЖрдХрд╛рд░ рдЬреЛ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рддрд┐ рдпреВрдирд┐рдЯ рд╕рдордп рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ), рдирдВрдмрд░рдСрдлрдЗрдирдкреБрдЯ рдЪреИрдирд▓ (рдЗрдирдкреБрдЯ рдЪреИрдирд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛), рдирдВрдмрд░рдСрдлреБрдЯрдкреБрдЯрдЪреИрдирд▓реНрд╕ (рдЖрдЙрдЯрдкреБрдЯ рдЪреИрдирд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛)ред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреНрд░рд╛рдкреНрдд рд╡рд╕реНрддреБ рдХреА рдЕрдкрдиреА рдПрдХ onaudioprocess рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╣рд░ рдмрд╛рд░ рд╕рд┐рдЧреНрдирд▓ рд╕реЗ рдПрдХ рдирдпрд╛ рдбреЗрдЯрд╛ рдирдореВрдирд╛ рд▓реЗрдиреЗ рдкрд░ рдЪрд▓рддреА рд╣реИред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╣рдорд╛рд░реЗ рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
 var currentGrainSize = 512 var currentOverLap = 0.50; var currentShiftRatio = 0.77; var node = context.createScriptProcessor(currentGrainSize, 1, 1); //       -   (     ) node.grainWindow = hannWindow(currentGrainSize); // ,        node.buffer = new Float32Array(currentGrainSize* 2); node.onaudioprocess = function (event) { //  var input = event.inputBuffer.getChannelData(0); //  output = event.outputBuffer.getChannelData(0), ln = input.length; for (i = 0; i < ln; i++) { //    input[i] *= this.grainWindow[i]; //     this.buffer[i] = this.buffer[i + currentGrainSize]; //   this.buffer[i + currentGrainSize] = 0.0; } //   var grainData = new Float32Array(currentGrainSize * 2); for (var i = 0, j = 0.0; i < currentGrainSize; i++, j += currentShiftRatio) { var index = Math.floor(j) % currentGrainSize; var a = input[index]; var b = input[(index + 1) % currentGrainSize]; grainData[i] += linearInterpolation(a, b, j % 1.0) * this.grainWindow[i]; } //  for (i = 0; i < currentGrainSize; i += Math.round(currentGrainSize * (1 - currentOverLap))) { for (j = 0; j <= currentGrainSize; j++) { this.buffer[i + j] += grainData[j]; } } //      for (i = 0; i < currentGrainSize; i++) { output[i] = this.buffer[i]; } } 

рдЕрдм, рдЪрд░рдг рдФрд░ рдУрд╡рд░рд▓реИрдк рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЙрдЪреНрдЪрд╛рд░рдг рдХреЛ рддреЗрдЬ рдпрд╛ рдзреАрдорд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ hannWindow f- th ( рд╣реИрди рд╡рд┐рдВрдбреЛ рдЧрдгрдирд╛ fth ) рдФрд░ рд▓реАрдирд┐рдпрд░рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди (рд▓реАрдирд┐рдпрд░ рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди f-th) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╣рдорд╛рд░реЗ рдПрдл-рдПрдВрдб рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдЧрд╛:
рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб
 var AudioModulation = function (buffers, source) { var am = this, currentGrainSize = 512, currentOverLap = 0.50, currentShiftRatio = 0.77, node = context.createScriptProcessor(currentGrainSize, 1, 1); //  var sourceGain = context.createGain(); sourceGain.gain.value = 2; //        var sourceConvolver = context.createConvolver(); sourceConvolver.buffer = buffers[0]; //   var sourceCompressor = context.createDynamicsCompressor(); sourceCompressor.threshold.value = -18.2; sourceCompressor.ratio.value = 4; //    source.connect(sourceGain); sourceGain.connect(sourceConvolver); sourceConvolver.connect(sourceCompressor); //  var ringGain = this.ringModulation(); sourceCompressor.connect(ringGain); //  var outFilters = this.setFilters(sourceCompressor); //   outFilters.connect(dest); //       -   (     ) node.grainWindow = this.hannWindow(currentGrainSize); // ,        node.buffer = new Float32Array(currentGrainSize* 2); node.onaudioprocess = function (event) { //  var input = event.inputBuffer.getChannelData(0); //  output = event.outputBuffer.getChannelData(0), ln = input.length; for (i = 0; i < ln; i++) { //    input[i] *= this.grainWindow[i]; //     this.buffer[i] = this.buffer[i + currentGrainSize]; //   this.buffer[i + currentGrainSize] = 0.0; } //   var grainData = new Float32Array(currentGrainSize * 2); for (var i = 0, j = 0.0; i < currentGrainSize; i++, j += currentShiftRatio) { var index = Math.floor(j) % currentGrainSize; var a = input[index]; var b = input[(index + 1) % currentGrainSize]; grainData[i] += am.linearInterpolation(a, b, j % 1.0) * this.grainWindow[i]; } //  for (i = 0; i < currentGrainSize; i += Math.round(currentGrainSize * (1 - currentOverLap))) { for (j = 0; j <= currentGrainSize; j++) { this.buffer[i + j] += grainData[j]; } } //      for (i = 0; i < currentGrainSize; i++) { output[i] = this.buffer[i]; } } } AudioModulation.prototype.hannWindow = function (length) { var window = new Float32Array(length); for (var i = 0; i < length; i++) { window[i] = 0.5 * (1 - Math.cos(2 * Math.PI * i / (length - 1))); } return window; }; AudioModulation.prototype.linearInterpolation = function (a, b, t) { return a + (b - a) * t; }; //  AudioModulation.prototype.ringModulation = function () { //,   var ringGain = context.createGain(); ringGain.gain.value = 1; //  ringCarrier = context.createOscillator(); //     40 ringCarrier.type = ringCarrier.SINE; ringCarrier.frequency.value = 40; //    ringCarrier.detune.value = 600; // ,      10 var ngHigpass = context.createBiquadFilter(); ngHigpass.type = ngHigpass.HIGHPASS; ngHigpass.frequency.value = 10; //    ,        ringCarrier.connect(ngHigpass); ngHigpass.connect(ringGain.gain); return ringGain; }; // AudioModulation.prototype.setFilters = function (source) { var fil = [{ gain: 1, frequency: 40 }, { gain: 3, frequency: 120 }, { gain: -2, frequency: 16000}], out = null, ln = fil.length; while (ln--) { var loc = fil[ln], currFilter = null; currFilter = context.createBiquadFilter(); currFilter.type = currFilter.HIGHSHELF; currFilter.gain.value = loc.gain; currFilter.Q.value = 1; currFilter.frequency.value = loc.frequency; if (!out) { source.connect(currFilter); out = currFilter; } else { out.connect(currFilter); out = currFilter; } } return out; }; 


рдЦреИрд░ рдЕрдм, рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡реЗрдХ рдХреЗ рд╕рд╛рде, рд╣рдо рдХрд┐рдП рдЧрдП рдХрд╛рдо рдХрд╛ рдЖрдирдВрдж рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЖрдк рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд░реБрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝рд░, рдлреЗрдЬрд░ рдЬреИрд╕реЗ рдХреБрдЫ рдлреИрд╢рдиреЗрдмрд▓ рдкреНрд░рднрд╛рд╡ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЗ рдКрдкрд░ рд╣реИред рдЕрдм, рдСрдбрд┐рдпреЛ рдПрдкреАрдЖрдИ рд╕реЗ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛ рдЦреЛрджрдиреЗ рдкрд░, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдм рдЙрдкрд▓рдмреНрдз рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдСрдбрд┐рдпреЛ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдкреНрд░рднрд╛рд╡ рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЖрдк рдХреЗрд╡рд▓ рдЕрдкрдиреА рдХрд▓реНрдкрдирд╛ рд╕реЗ рд╕реАрдорд┐рдд рд╣реИрдВред
рдЖрдк рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рд╕рд┐рдЧреНрдирд▓ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

рдЙрдкрдпреЛрдЧреА рд╕рд╛рд╣рд┐рддреНрдп рдФрд░ рд╕реНрд░реЛрдд:



рдХреНрд░реЛрдо рдФрд░ рдУрдкреЗрд░рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ PS рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддрд╛рдХрд┐ рдЙрдирдореЗрдВ рд╕рдм рдХреБрдЫ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░реЗред рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ, рд╡рд┐рднрд┐рдиреНрди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИрдВ (рдЬреЛ рдореИрдВ рд╕рдордп рдкрд░ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛)ред рдЖрдк IE рдХреЛ рднреА рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/In211905/


All Articles