(function ( w, d, PKAE ) { 'use strict'; // STORING THE CUSTOM FX PRESETS IN LOCALSTORAGE function PK_FX_PRESETS () { var presets = {}; this.Set = function (filter_id, obj) { var arr = presets[ filter_id ]; if (!arr) { arr = []; presets[ filter_id ] = arr; } arr.push (obj); localStorage.setItem ('pk_presetfx', JSON.stringify (presets)); return (arr); } this.Save = function () { localStorage.setItem ('pk_presetfx', JSON.stringify (presets)); }; this.Get = function ( filter_id ) { if (!filter_id) return (presets); return (presets[ filter_id ]); }; this.GetSingle = function ( filter_id, custom_id ) { if (!filter_id) return (false); if (!custom_id) return (false); var arr = presets[ filter_id ]; var l = arr.length; var found = null; while (l-- > 0) { if (arr[l].id === custom_id) { found = arr[l]; break; } } if (found) return (found); return (false); }; this.Del = function ( filter_id, custom_id ) { if (!filter_id) return (presets); var arr = presets[ filter_id ]; var l = arr.length; var found = false; while (l-- > 0) { if (arr[l].id === custom_id) { arr.splice (l, 1); found = true; break; } } if (found) localStorage.setItem ('pk_presetfx', JSON.stringify (presets)); return (arr); }; // loadCustomPresets if (!w.localStorage) { this.Set = function(){}; return ; } var json = w.localStorage.getItem ('pk_presetfx'); var tmp = null; if (!json) return ; try { tmp = JSON.parse (json); } catch (e){} if (tmp) presets = tmp; }; function PKUI_FX ( app ) { var UI = app.ui; var curr_filter_ui = null; var modal_name = 'modalfx'; var modal_esc_key = modal_name + 'esc'; var custom_presets = new PK_FX_PRESETS (); app.listenFor ('DidCloseFX_UI', function () { curr_filter_ui = null; }); app.listenFor ('DidOpenFX_UI', function ( modal ) { curr_filter_ui = modal; }); app.listenFor ('RequestFXUI_SELCUT', function () { var eng = app.engine; var wv = eng.wavesurfer; var bk = wv.backend; var rate = bk.buffer.sampleRate; var region = wv.regions.list[0]; if (!region) return (false); app.fireEvent('RequestPause'); // mark the region as region.element.style.background = 'red'; var reg = { pos: { start: (region.start * rate) >> 0, end: (region.end * rate) >> 0 }, initpos: { start: (region.start * rate) >> 0, end: (region.end * rate) >> 0 } }; wv.backend.reg = reg; var update_reg = function( region ) { reg.pos.start = (region.start * rate) >> 0; reg.pos.end = (region.end * rate) >> 0; wv.drawBuffer (true); }; wv.on ('region-updated', update_reg); // -- now make sure we resize it if needed be }); app.listenFor ('RequestFXUI_Gain', function () { app.fireEvent ('RequestSelect', 1); var filter_id = 'gain'; var auto = null; var getvalue = function ( q ) { var value; if (auto) { value = auto.GetValue (); } else { var input = q.el_body.getElementsByTagName('input')[0]; value = [{val: input.value / 1}]; } return (value); }; var x = new PKAudioFXModal({ id: filter_id, title:'Apply Gain to selected range', presets:[ {name:'Silence',val:0}, {name:'-50%',val:0.5}, {name:'-25%',val:0.75}, {name:'+25%',val:1.25}, {name:'+50%',val:1.5}, {name:'+100%',val:2} ], custom_pres:custom_presets.Get (filter_id), ondestroy: function ( q ) { app.ui.InteractionHandler.on = false; app.ui.KeyHandler.removeCallback (modal_esc_key); }, preview: function ( q ) { var value = getvalue ( q ); app.fireEvent ('RequestActionFX_PREVIEW_GAIN', value); }, buttons: [ { title:'Apply Gain', clss:'pk_modal_a_accpt', callback: function( q ) { var value = getvalue ( q ); if (value[0].val != 1.0) app.fireEvent ('RequestActionFX_GAIN', value); q.Destroy (); } } ], body:'
' + ''+ '100%
' + '
', // 'Volume Graph
', setup:function( q ) { var range = q.el_body.getElementsByTagName ('input')[0]; var span = q.el_body.getElementsByTagName ('span')[0]; var graph_btn = q.el_body.getElementsByTagName ('a')[0]; range.oninput = function() { span.innerHTML = ((range.value * 100) >> 0) + '%'; app.fireEvent ('RequestActionFX_UPDATE_PREVIEW', [{val: range.value / 1}]); }; //graph_btn.onclick = function () { // auto = new PKAudioEditor._deps.FxAUT (app, q); //}; app.fireEvent ('RequestPause'); app.ui.InteractionHandler.checkAndSet (modal_name); app.ui.KeyHandler.addCallback (modal_esc_key, function ( e ) { if (!app.ui.InteractionHandler.check (modal_name)) return ; q.Destroy (); }, [27]); } }, app); x.Show(); }); app.listenFor ('RequestActionFXUI_Rate', function () { app.fireEvent ('RequestSelect', 1); var filter_id = 'speed'; var x = new PKAudioFXModal({ id: filter_id, title:'Change Speed', presets:[ {name:'A lot slower',val:0.65}, {name:'Slightly slower',val:0.85}, {name:'Slightly faster',val:1.15}, {name:'Blazing Fast',val:1.4} ], custom_pres:custom_presets.Get (filter_id), ondestroy: function ( q ) { app.ui.InteractionHandler.on = false; app.ui.KeyHandler.removeCallback (modal_esc_key); }, preview: function ( q ) { var input = q.el_body.getElementsByTagName('input')[0]; var value = input.value.trim() / 1; app.fireEvent ('RequestActionFX_PREVIEW_RATE', value); }, buttons: [ { title:'Apply Rate', clss:'pk_modal_a_accpt', callback: function( q ) { var input = q.el_body.getElementsByTagName('input')[0]; var value = input.value.trim() / 1; if (value != 1.0) app.fireEvent ('RequestActionFX_RATE', value); q.Destroy (); } } ], body:'
' + ''+ '1.0
', setup:function( q ) { var range = q.el_body.getElementsByTagName('input')[0]; var span = q.el_body.getElementsByTagName('span')[0]; range.oninput = function() { span.innerHTML = range.value; app.fireEvent ('RequestActionFX_UPDATE_PREVIEW', range.value/1); }; app.fireEvent ('RequestPause'); app.ui.InteractionHandler.checkAndSet (modal_name); app.ui.KeyHandler.addCallback (modal_esc_key, function ( e ) { if (!app.ui.InteractionHandler.check (modal_name)) return ; q.Destroy (); }, [27]); } }, app); x.Show(); }); app.listenFor ('RequestActionFXUI_Speed', function () { app.fireEvent ('RequestSelect', 1); var filter_id = 'speed'; var x = new PKAudioFXModal({ id: filter_id, title:'Change Speed', presets:[ {name:'-1/4',val:0.25}, {name:'-1/2',val:0.5}, {name:'Slightly slower',val:0.85}, {name:'Slightly faster',val:1.1}, {name:'+1/4',val:1.25}, {name:'+1/2',val:1.5} ], custom_pres:custom_presets.Get (filter_id), ondestroy: function ( q ) { app.ui.InteractionHandler.on = false; app.ui.KeyHandler.removeCallback (modal_esc_key); }, preview: function ( q ) { var input = q.el_body.getElementsByTagName('input')[0]; var value = input.value.trim() / 1; app.fireEvent ('RequestActionFX_PREVIEW_SPEED', value); }, buttons: [ { title:'Apply Rate', clss:'pk_modal_a_accpt', callback: function( q ) { var input = q.el_body.getElementsByTagName('input')[0]; var value = input.value.trim() / 1; if (value != 1.0) app.fireEvent ('RequestActionFX_SPEED', value); q.Destroy (); } } ], body:'
' + ''+ '1.0
', setup:function( q ) { var range = q.el_body.getElementsByTagName('input')[0]; var span = q.el_body.getElementsByTagName('span')[0]; range.oninput = function() { span.innerHTML = range.value; app.fireEvent ('RequestActionFX_UPDATE_PREVIEW', range.value/1); }; app.fireEvent ('RequestPause'); app.ui.InteractionHandler.checkAndSet (modal_name); app.ui.KeyHandler.addCallback (modal_esc_key, function ( e ) { if (!app.ui.InteractionHandler.check (modal_name)) return ; q.Destroy (); }, [27]); } }, app); x.Show(); }); app.listenFor ('RequestActionFXUI_Flip', function () { if (!PKAudioEditor.engine.is_ready) return ; app.fireEvent ( 'RequestRegionClear'); app.fireEvent ('RequestSelect', 1); var filter_id = 'flip'; var mode = 0; var x = new PKAudioFXModal({ id: filter_id, title:'Channel Info', ondestroy: function ( q ) { app.ui.InteractionHandler.on = false; app.ui.KeyHandler.removeCallback (modal_esc_key); }, buttons: [ { title:'Apply Changes', clss:'pk_modal_a_accpt', callback: function( q ) { if (mode === 1) { // check if we are doing force mono, or force flip var mono = q.el_body.getElementsByClassName('pk_c_mm')[0]; var flip = q.el_body.getElementsByClassName('pk_c_fl')[0]; if (mono.checked) { var chans = q.el_body.getElementsByClassName('pk_c_c'); // check which channel we pick if (chans[0].checked) { app.fireEvent ('RequestActionFX_Flip', 'mono', 0); } else if (chans[1].checked) { app.fireEvent ('RequestActionFX_Flip', 'mono', 1); } } else if (flip.checked) { app.fireEvent ('RequestActionFX_Flip', 'flip'); } } else if (mode === 2) { var stereo = q.el_body.getElementsByClassName('pk_c_ms')[0]; if (stereo.checked) { app.fireEvent ('RequestActionFX_Flip', 'stereo'); } } q.Destroy (); } } ], body:'' + '', setup:function( q ) { var main = null; var num = PKAudioEditor.engine.wavesurfer.backend.buffer.numberOfChannels; if (num === 2) { mode = 1; main = q.el_body.getElementsByClassName('pk_mm')[0]; var mono = main.getElementsByClassName('pk_c_mm')[0]; var flip = main.getElementsByClassName('pk_c_fl')[0]; var chans = main.getElementsByClassName('pk_c_c'); var tmp = main.getElementsByClassName('pk_dis'); var lbls = [tmp[0], tmp[1]]; mono.onchange = function( e ) { if (mono.checked) { flip.checked = false; chans[0].checked = true; lbls[0].className = ''; lbls[1].className = ''; } else { chans[0].checked = false; chans[1].checked = false; lbls[0].className = 'pk_dis'; lbls[1].className = 'pk_dis'; } }; flip.onchange = function( e ) { if (flip.checked) { mono.checked = false; mono.onchange (); } }; } else { mode = 2; main = q.el_body.getElementsByClassName('pk_ms')[0]; } main.style.display = 'block'; // -- app.fireEvent ('RequestPause'); app.ui.InteractionHandler.checkAndSet (modal_name); app.ui.KeyHandler.addCallback (modal_esc_key, function ( e ) { if (!app.ui.InteractionHandler.check (modal_name)) return ; q.Destroy (); }, [27]); } }, app); x.Show(); }); app.listenFor ('RequestFXUI_Silence', function () { var x = new PKSimpleModal({ title: 'Insert Silence', ondestroy: function( q ) { UI.InteractionHandler.on = false; UI.KeyHandler.removeCallback ('modalTemp'); }, buttons:[ { title:'Insert Silence', clss:'pk_modal_a_accpt', callback: function( q ) { var input = q.el_body.getElementsByClassName('pk_horiz')[0]; var value = input.value.trim() / 1; var radios = q.el_body.getElementsByClassName('pk_check'); var offset = 0; if (radios[1].checked) offset = PKAudioEditor.engine.wavesurfer.getCurrentTime().toFixed(3)/1; if (value > 0.001) UI.fireEvent ('RequestActionSilence', offset, value); q.Destroy (); } } ], body:'
'+ '
' + ''+ '
'+ '
'+ ''+ '5s
', setup:function( q ) { var cursor_pos_el = q.el_body.getElementsByClassName('pkcdpk')[0]; cursor_pos_el.innerHTML = PKAudioEditor.engine.wavesurfer.getCurrentTime().toFixed(2) + 's'; var range = q.el_body.getElementsByClassName('pk_horiz')[0]; var span = q.el_body.getElementsByClassName('pk_val')[0]; range.oninput = function() { span.innerHTML = (range.value/1).toFixed (2) + 's'; }; UI.fireEvent ('RequestPause'); UI.InteractionHandler.checkAndSet ('modal'); UI.KeyHandler.addCallback ('modalTemp', function ( e ) { q.Destroy (); }, [27]); } }); x.Show(); }); app.listenFor ('RequestActionFXUI_Compressor', function () { app.fireEvent ('RequestSelect', 1); var filter_id = 'compressor'; var auto = null; var getvalue = function ( q ) { var ret; var value = []; if (auto) { value = auto.GetValue (); } else { var inputs = q.el_body.getElementsByTagName('input'); value[0] = {val:inputs[0].value / 1}; value[1] = {val:inputs[1].value / 1}; value[2] = {val:inputs[2].value / 1}; value[3] = {val:inputs[3].value / 1}; value[4] = {val:inputs[4].value / 1}; } ret = { threshold: value[0], knee: value[1], ratio: value[2], attack: value[3], release: value[4] }; return (ret); }; var x = new PKAudioFXModal({ id : filter_id, title : 'Apply Compression to selected range', clss : 'pk_bigger', ondestroy: function ( q ) { app.ui.InteractionHandler.on = false; app.ui.KeyHandler.removeCallback (modal_esc_key); }, presets:[ {name:'Classic',val:'-40,5,7,0.002,0.1'}, {name:'Light',val:'-6,2,2.5,0.002,0.05'}, {name:'Dashed Distortion',val:'-45,26,2.05,0.233,0.0'}, {name:'Chaotic Distortion',val:'-60,14,11.07,0.036,0.00'} ], custom_pres:custom_presets.Get (filter_id), preview: function ( q ) { var inputs = q.el_body.getElementsByTagName('input'); var val = getvalue (q); app.fireEvent ('RequestActionFX_PREVIEW_COMPRESSOR', val); }, buttons: [ { title:'Apply', clss:'pk_modal_a_accpt', callback: function( q ) { var inputs = q.el_body.getElementsByTagName('input'); var val = getvalue ( q ); app.fireEvent ('RequestActionFX_Compressor', val); q.Destroy (); } } ], body:'
' + ''+ '-24.0
'+ '
' + ''+ '30.0
'+ '
' + ''+ '12.0
'+ '
' + ''+ '0.003
'+ '
' + ''+ '0.25
', //'Volume Graph', setup:function( q ) { var inputs = q.el_body.getElementsByTagName ('input'); for (var i = 0; i < inputs.length; ++i) { inputs[i].oninput = function () { var span = this.parentNode.getElementsByTagName ('span')[0]; span.innerHTML = (this.value/1).toFixed (3); updateFilter (); }; } //var graph_btn = q.el_body.getElementsByTagName ('a')[0]; //graph_btn.onclick = function () { // auto = new PKAudioEditor._deps.FxAUT (PKAudioEditor, q); //}; function updateFilter() { var val = getvalue ( q ); app.fireEvent ('RequestActionFX_UPDATE_PREVIEW', val); } app.fireEvent ('RequestPause'); app.ui.InteractionHandler.checkAndSet (modal_name); app.ui.KeyHandler.addCallback (modal_esc_key, function ( e ) { if (!app.ui.InteractionHandler.check (modal_name)) return ; q.Destroy (); }, [27]); // --- } }, app); x.Show(); }); app.listenFor ('RequestActionFXUI_Normalize', function () { app.fireEvent ('RequestSelect', 1); var x = new PKSimpleModal({ title: 'Normalize', ondestroy: function( q ) { app.ui.InteractionHandler.on = false; app.ui.KeyHandler.removeCallback ('modalTemp'); }, buttons:[ { title:'Normalize Audio', clss:'pk_modal_a_accpt', callback: function( q ) { var input = q.el_body.getElementsByClassName('pk_horiz')[0]; var value = (input.value / 1); var toggle = q.el_body.getElementsByClassName('pk_check')[0].checked; app.fireEvent ('RequestActionFX_Normalize', [toggle, value]); q.Destroy (); } } ], body:'
'+ ''+ '
' + '
'+ ''+ '100%
', setup:function( q ) { var range = q.el_body.getElementsByClassName('pk_horiz')[0]; var span = q.el_body.getElementsByClassName('pk_val')[0]; range.oninput = function() { span.innerHTML = (((range.value/1)*100) >> 0) + '%'; }; app.fireEvent ('RequestPause'); app.ui.InteractionHandler.checkAndSet ('modal'); app.ui.KeyHandler.addCallback ('modalTemp', function ( e ) { q.Destroy (); }, [27]); } });x.Show(); }); app.listenFor ('RequestActionFXUI_ParaGraphicEQ', function () { PKAudioEditor._deps.FxEQ (app, custom_presets); }); app.listenFor ('RequestActionTempo', function () { PKAudioEditor._deps.FxTMP (app); }); app.listenFor ('RequestActionNewRec', function () { PKAudioEditor._deps.FxREC (app); }); //app.listenFor ('RequestActionAUTO', function ( filter ) { // PKAudioEditor._deps.FxAUT (app, filter); //}); app.listenFor ('RequestActionFXUI_GraphicEQ', function ( num_of_bands ) { app.fireEvent ('RequestSelect', 1); var filter_id = 'graph_eq'; var auto = null; var getvalue = function ( ranges ) { var val = {}; if (auto) { val = auto.GetValue (); } else { val = []; var len = ranges.length; for (var i = 0; i < len; ++i) { var range = ranges [ i ]; val.push ({ 'type' : range.getAttribute ('data-type'), 'freq' : range.getAttribute ('data-freq')/1, 'val' : range.value / 1, 'q' : band_q }); } } return (val); }; var bands_str = '
0 db'+ ''+ '< 32hz
'+ '
0 db'+ ''+ '64hz
'+ '
0 db'+ ''+ '125hz
'+ '
0 db'+ ''+ '250hz
'+ '
0 db'+ ''+ '500hz
'+ '
0 db'+ ''+ '1000hz
'+ '
0 db'+ ''+ '2000hz
'+ '
0 db'+ ''+ '4000hz
'+ '
0 db'+ ''+ '8000hz
'+ '
0 db'+ ''+ ' >16000hz
'; var presets = [ {name:'Reset', val:'0,0,0,0,0,0,0,0,0,0'}, {name:'Old Radio', val:'-25,-22,-20,-18,-9,0,8,10,-8,-25'}, {name:'Lo Fi', val:'-18,-12,0,2,0,4,4,-1,-6,-8'} ]; var band_q = 4.6; if (num_of_bands === 20) { filter_id += '_2'; presets = null; // maybe add presets? band_q = 10.2; bands_str = '
0 db'+ ''+ '< 31hz
'+ '
0 db'+ ''+ '44hz
'+ '
0 db'+ ''+ '63hz
'+ '
0 db'+ ''+ '88hz
'+ '
0 db'+ ''+ '125hz
'+ '
0 db'+ ''+ '180hz
'+ '
0 db'+ ''+ '250hz
'+ '
0 db'+ ''+ '335hz
'+ '
0 db'+ ''+ '500hz
'+ '
0 db'+ ''+ '710hz
'+ '
0 db'+ ''+ '1khz
'+ '
0 db'+ ''+ '1.4khz
'+ '
0 db'+ ''+ '2khz
'+ '
0 db'+ ''+ '2.8khz
'+ '
0 db'+ ''+ '4khz
'+ '
0 db'+ ''+ '5.6khz
'+ '
0 db'+ ''+ '8khz
'+ '
0 db'+ ''+ '11.3khz
'+ '
0 db'+ ''+ '16k
'+ '
0 db'+ ''+ ' >22khz
'; } var x = new PKAudioFXModal({ id: filter_id, title:'Graphic EQ', clss: num_of_bands === 20 ? 'pk_dens' : '', custom_pres:custom_presets.Get (filter_id), ondestroy: function ( q ) { app.ui.InteractionHandler.on = false; app.ui.KeyHandler.removeCallback (modal_esc_key); }, preview: function ( q ) { var ranges = q.el_body.getElementsByTagName('input'); var len = ranges.length; app.fireEvent ('RequestActionFX_PREVIEW_PARAMEQ', getvalue (ranges)); }, buttons: [ { title:'Apply EQ', clss:'pk_modal_a_accpt', callback: function( q ) { var ranges = q.el_body.getElementsByTagName('input'); app.fireEvent ('RequestActionFX_PARAMEQ', getvalue (ranges)); q.Destroy (); } } ], presets:presets, body:'
' + bands_str+ '
', //'Volume Graph', setup:function( q ) { var ranges = q.el_body.getElementsByTagName('input'); var len = ranges.length; //var graph_btn = q.el_body.getElementsByTagName ('a')[0]; //graph_btn.onclick = function () { // auto = new PKAudioEditor._deps.FxAUT (PKAudioEditor, q, function ( obj, range ) { // obj.type = range.getAttribute ('data-type'); // obj.freq = range.getAttribute ('data-freq')/1; // obj.q = band_q; // }); //}; for (var i = 0; i < len; ++i) { var range = ranges[i]; range.oninput = function() { var span = this.parentNode.getElementsByTagName('span')[0]; span.innerHTML = ((this.value) >> 0) + ' db'; app.fireEvent ('RequestActionFX_UPDATE_PREVIEW', getvalue (ranges)); }; } app.fireEvent ('RequestPause'); app.ui.InteractionHandler.checkAndSet (modal_name); app.ui.KeyHandler.addCallback (modal_esc_key, function ( e ) { if (!app.ui.InteractionHandler.check (modal_name)) return ; q.Destroy (); }, [27]); } }, app); x.Show(); }); app.listenFor ('RequestActionFXUI_HardLimiter', function () { app.fireEvent ('RequestSelect', 1); var x = new PKAudioFXModal({ title: 'Hard Limiting', ondestroy: function( q ) { app.ui.InteractionHandler.on = false; app.ui.KeyHandler.removeCallback ('modalTemp'); }, buttons:[ { title:'Hard Limiting', clss:'pk_modal_a_accpt', callback: function( q ) { app.fireEvent ('RequestActionFX_HardLimit', q.updateFilter (q)); q.Destroy (); } } ], preview: function ( q ) { app.fireEvent ('RequestActionFX_PREVIEW_HardLimit', q.updateFilter ( q )); }, body: '
'+ '
' + '
'+ ''+ '99%
'+ '
'+ ''+ 'Ratio 0%
'+ '
'+ ''+ '10 ms
', updateFilter : function ( q ) { var val = [q.el_body.getElementsByClassName('pk_check')[0].checked]; var ranges = q.el_body.getElementsByClassName('pk_horiz'); for (var i = 0; i < ranges.length; ++i) { var range = ranges [ i ]; val.push (range.value / 1); } return (val); }, setup:function( q ) { var ranges = q.el_body.getElementsByClassName('pk_horiz'); ranges[0].oninput = function() { var span = this.parentNode.getElementsByTagName('span')[0]; span.innerHTML = (((this.value/1)*100) >> 0) + '%'; app.fireEvent ('RequestActionFX_UPDATE_PREVIEW', q.updateFilter (q)); }; ranges[1].oninput = function() { var span = this.parentNode.getElementsByTagName('span')[0]; span.innerHTML = 'Ratio ' + (((this.value/1)*100) >> 0) + '%'; app.fireEvent ('RequestActionFX_UPDATE_PREVIEW', q.updateFilter (q)); }; ranges[2].oninput = function() { var span = this.parentNode.getElementsByTagName('span')[0]; span.innerHTML = (this.value/1) + 'ms'; app.fireEvent ('RequestActionFX_UPDATE_PREVIEW', q.updateFilter (q)); }; app.fireEvent ('RequestPause'); app.ui.InteractionHandler.checkAndSet ('modal'); app.ui.KeyHandler.addCallback ('modalTemp', function ( e ) { q.Destroy (); }, [27]); } }, app);x.Show(); }); app.listenFor ('RequestActionFXUI_Delay', function () { app.fireEvent ('RequestSelect', 1); var filter_id = 'delay'; var auto = null; var getvalue = function ( q ) { var ret; var value = []; if (auto) { value = auto.GetValue (); } else { var inputs = q.el_body.getElementsByTagName('input'); value[0] = {val:inputs[0].value / 1}; value[1] = {val:inputs[1].value / 1}; value[2] = {val:inputs[2].value / 1}; } ret = { delay: value[0], feedback: value[1], mix: value[2] }; return (ret); }; var x = new PKAudioFXModal({ id : filter_id, title : 'Apply Delay to selected range', clss : 'pk_bigger', ondestroy: function ( q ) { app.ui.InteractionHandler.on = false; app.ui.KeyHandler.removeCallback (modal_esc_key); }, presets:[ {name:'Classic',val:'0.3,0.4,0.4'}, {name:'Spacey',val:'3.0,0.6,0.3'} ], custom_pres:custom_presets.Get (filter_id), preview: function ( q ) { var val = getvalue (q); app.fireEvent ('RequestActionFX_PREVIEW_DELAY', val); }, buttons: [ { title:'Apply', clss:'pk_modal_a_accpt', callback: function( q ) { var val = getvalue (q); app.fireEvent ('RequestActionFX_DELAY', val); q.Destroy (); } } ], body:'
' + ''+ '0.28
'+ '
' + ''+ '0.5
'+ '
' + ''+ '0.4
', //'Volume Graph', setup:function( q ) { var inputs = q.el_body.getElementsByTagName ('input'); for (var i = 0; i < inputs.length; ++i) { inputs[i].oninput = function () { var span = this.parentNode.getElementsByTagName ('span')[0]; span.innerHTML = (this.value/1).toFixed (3); updateFilter (); }; } //var graph_btn = q.el_body.getElementsByTagName ('a')[0]; //graph_btn.onclick = function () { // auto = new PKAudioEditor._deps.FxAUT (app, q); //}; function updateFilter() { var val = getvalue (q); app.fireEvent ('RequestActionFX_UPDATE_PREVIEW', val); } app.fireEvent ('RequestPause'); app.ui.InteractionHandler.checkAndSet (modal_name); app.ui.KeyHandler.addCallback (modal_esc_key, function ( e ) { if (!app.ui.InteractionHandler.check (modal_name)) return ; q.Destroy (); }, [27]); // --- } }, app); x.Show(); }); app.listenFor ('RequestActionFXUI_Distortion', function () { app.fireEvent ('RequestSelect', 1); var filter_id = 'dist'; var auto = null; var getvalue = function ( q ) { var value; if (auto) { value = auto.GetValue (); } else { var input = q.el_body.getElementsByTagName('input')[0]; value = [{val: input.value / 1}]; } return (value); }; var x = new PKAudioFXModal({ id : filter_id, title : 'Apply Distortion to selected range', clss : 'pk_bigger', ondestroy: function ( q ) { app.ui.InteractionHandler.on = false; app.ui.KeyHandler.removeCallback (modal_esc_key); }, preview: function ( q ) { var val = getvalue (q); app.fireEvent ('RequestActionFX_PREVIEW_DISTORT', val); }, buttons: [ { title:'Apply', clss:'pk_modal_a_accpt', callback: function( q ) { var val = getvalue (q); app.fireEvent ('RequestActionFX_DISTORT', val); q.Destroy (); } } ], body:'
' + ''+ '0.5
', // 'Volume Graph', setup:function( q ) { var inputs = q.el_body.getElementsByTagName ('input'); for (var i = 0; i < inputs.length; ++i) { inputs[i].oninput = function () { var span = this.parentNode.getElementsByTagName ('span')[0]; span.innerHTML = (this.value/1).toFixed (2); updateFilter (); }; } //var graph_btn = q.el_body.getElementsByTagName ('a')[0]; //graph_btn.onclick = function () { // auto = new PKAudioEditor._deps.FxAUT (app, q); //}; function updateFilter() { var val = getvalue (q); app.fireEvent ('RequestActionFX_UPDATE_PREVIEW', val); } app.fireEvent ('RequestPause'); app.ui.InteractionHandler.checkAndSet (modal_name); app.ui.KeyHandler.addCallback (modal_esc_key, function ( e ) { if (!app.ui.InteractionHandler.check (modal_name)) return ; q.Destroy (); }, [27]); // --- } }, app); x.Show(); }); app.listenFor ('RequestActionFXUI_Reverb', function () { app.fireEvent ('RequestSelect', 1); var filter_id = 'reverb'; var x = new PKAudioFXModal({ id : filter_id, title : 'Apply Reverb to selected range', clss : 'pk_bigger', ondestroy: function ( q ) { app.ui.InteractionHandler.on = false; app.ui.KeyHandler.removeCallback (modal_esc_key); }, presets:[ {name:'Classic',val:'0.3,0.4,0.4'}, {name:'Spacey',val:'3.0,0.6,0.3'} ], custom_pres:custom_presets.Get (filter_id), preview: function ( q ) { var inputs = q.el_body.getElementsByTagName('input'); var val = { time: inputs[0].value/1, decay: inputs[1].value/1, mix: inputs[2].value/1 }; app.fireEvent ('RequestActionFX_PREVIEW_REVERB', val); }, buttons: [ { title:'Apply', clss:'pk_modal_a_accpt', callback: function( q ) { var inputs = q.el_body.getElementsByTagName('input'); var val = { time: inputs[0].value/1, decay: inputs[1].value/1, mix: inputs[2].value/1 }; app.fireEvent ('RequestActionFX_REVERB', val); q.Destroy (); } } ], body:'
' + ''+ '0.3
'+ '
' + ''+ '0.05
'+ '
' + ''+ '0.6
', setup:function( q ) { var inputs = q.el_body.getElementsByTagName ('input'); for (var i = 0; i < inputs.length; ++i) { inputs[i].oninput = function () { var span = this.parentNode.getElementsByTagName ('span')[0]; span.innerHTML = (this.value/1).toFixed (3); updateFilter (); }; } function updateFilter() { var inputs = q.el_body.getElementsByTagName('input'); var val = { time: inputs[0].value/1, decay: inputs[1].value/1, mix: inputs[2].value/1 }; app.fireEvent ('RequestActionFX_UPDATE_PREVIEW', val); } app.fireEvent ('RequestPause'); app.ui.InteractionHandler.checkAndSet (modal_name); app.ui.KeyHandler.addCallback (modal_esc_key, function ( e ) { if (!app.ui.InteractionHandler.check (modal_name)) return ; q.Destroy (); }, [27]); // --- } }, app); x.Show(); }); // ----- var current_tags = null; app.listenFor ('RequestActionID3', function (flag, new_tags) { if (flag) { current_tags = new_tags; return ; } var modal_id = '_id3'; var render_tags = function ( el, tags ) { var str = '
'; str += '
Artist' + (tags.artist || '-') + '
'; str += '
Title' + (tags.title || '-') + '
'; str += '
Album' + (tags.album || '-') + '
'; str += '
Year' + (tags.year || '-') + '
'; str += '
Genre' + (tags.genre || '-') + '
'; str += '
Comment' + ((tags.comment||{}).text || '-') + '
'; str += '
Track' + (tags.track || '-') + '
'; str += '
Lyrics' + ((tags.lyrics||{}).lyrics || '-') + '
'; if ('picture' in tags) { var image = tags.picture; var base64str = ''; for (var i = 0; i < image.data.length; ++i) { base64str += String.fromCharCode (image.data[i]); } str += '
Cover' + '
'; } el.innerHTML = str + '
'; }; new PKSimpleModal({ title:'ID3 Metatags Explorer', ondestroy: function( q ) { app.ui.InteractionHandler.forceUnset (modal_id); app.ui.KeyHandler.removeCallback (modal_id + 'esc'); }, buttons:[ ], body:''+ '
Choose file to view audio metatags!
', setup:function( q ) { var input = q.el_body.getElementsByTagName ('input')[0]; var txt_el = q.el_body.getElementsByClassName ('pk_ttx')[0]; input.onchange = function ( e ) { var reader = new FileReader(); reader.onload = function() { var tags = PKAudioEditor.engine.ID3 (this.result); if (!tags) { txt_el.innerHTML = '
No audio metadata found...
'; } else { render_tags (txt_el, tags); } }; reader.readAsArrayBuffer(this.files[0]); }; if (current_tags) { render_tags (txt_el, current_tags); } app.ui.InteractionHandler.forceSet (modal_id); app.ui.KeyHandler.addCallback (modal_id + 'esc', function ( e ) { if (!app.ui.InteractionHandler.check (modal_id)) return ; q.Destroy (); }, [27]); } }).Show(); }); // ---- save presets app.listenFor ('RequestSavePreset', function () { if (!curr_filter_ui) return ; var el = curr_filter_ui.el_body; if (!el) return ; var escapeHtml = function (text) { var map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return text.replace(/[&<>"']/g, function(m) { return map[m]; }); }; // check if the preset is custom var is_new = true; var custom_id = null; var el_presets = curr_filter_ui.el_presets; var sel_opt = el_presets.options[el_presets.selectedIndex]; var inputs = el.querySelectorAll('select, input'); var preset_obj = { target:curr_filter_ui.id, name:'My Preset', id:curr_filter_ui.id + '_' + ((Math.random() * 99) >> 0), date:Date.now(), val:'' }; if (sel_opt && sel_opt.getAttribute('data-custom')) { is_new = false; custom_id = sel_opt.getAttribute('data-custom'); } // ---------- for (var i = 0; i < inputs.length; ++i) { if (inputs[i].type === 'checkbox') { preset_obj.val += (inputs[i].checked ? '1' : '0') + ','; } else { preset_obj.val += inputs[i].value + ','; } } if (preset_obj.val.length > 0) { preset_obj.val = preset_obj.val.substring(0, preset_obj.val.length - 1); // open ui for setting preset name var modal_id = '_ctPr'; var default_txt = ''; var btn_delete = {}; var btn_update = {}; var custom_obj = null; if (!is_new) { custom_obj = custom_presets.GetSingle (preset_obj.target, custom_id); default_txt = 'value="' + custom_obj.name + '"'; btn_delete = { title:'Delete', clss:'pk_modal_a_red', callback: function( q ) { OneUp ('Successfully deleted preset!', 1400); var custom = custom_presets.Del (preset_obj.target, custom_id); app.fireEvent ('DidSetPresets', preset_obj.target, custom); q.Destroy (); // - } }; btn_update = { title:'Update', callback: function( q ) { if (custom_obj) { var input = q.el_body.getElementsByTagName ('input')[0]; var value = input.value.trim (); value = escapeHtml (value); if (value.length > 0) { OneUp ('Successfully updated preset!', 1400); // add preset to localStorage custom_obj.name = value; custom_obj.val = preset_obj.val; custom_presets.Save (); var arr = custom_presets.Get (preset_obj.target); app.fireEvent ('DidSetPresets', preset_obj.target, arr); q.Destroy (); } else { OneUp ('Name is too short...', 1200); } } // - } }; } var title = 'Save Custom Preset for filter "' + curr_filter_ui.id + '"'; if (!is_new) { var cname = custom_obj.name; title = 'Edit Custom Preset "' + cname + '", for filter "' + curr_filter_ui.id + '"'; } new PKSimpleModal({ title:title, ondestroy: function( q ) { app.ui.InteractionHandler.forceUnset (modal_id); app.ui.KeyHandler.removeCallback (modal_id + 'esc'); app.ui.KeyHandler.removeCallback (modal_id + 'ent'); }, buttons:[ { title: is_new ? 'Save' : 'Save As New', clss:'pk_modal_a_accpt', callback: function( q ) { var input = q.el_body.getElementsByTagName ('input')[0]; var value = input.value.trim (); value = escapeHtml (value); if (value.length > 0) { OneUp ('Successfully saved preset!', 1400); // add preset to localStorage preset_obj.name = value; var custom = custom_presets.Set (preset_obj.target, preset_obj); app.fireEvent ('DidSetPresets', preset_obj.target, custom); app.fireEvent ('RequestSetPresetActive', preset_obj.target, preset_obj.id); q.Destroy (); } else { OneUp ('Name is too short...', 1200); } // - } }, btn_update, btn_delete ], body:'' + '', setup:function( q ) { // app.fireEvent ('RequestPause'); app.ui.InteractionHandler.forceSet (modal_id); app.ui.KeyHandler.addCallback (modal_id + 'esc', function ( e ) { if (!app.ui.InteractionHandler.check (modal_id)) return ; q.Destroy (); }, [27]); app.ui.KeyHandler.addCallback (modal_id + 'en', function ( e ) { if (!app.ui.InteractionHandler.check (modal_id)) return ; q.els.bottom[0].click (); }, [13]); setTimeout(function() { if (q.el) { var inp = q.el.getElementsByTagName('input')[0]; inp.focus (); if (inp.value.length > 0) { inp.selectionStart = inp.selectionEnd = inp.value.length; } } },20); } }).Show(); // --- } // document.querySelector('.pk_modal_main').getElementsByTagName('input')[0].value }); // ---- windows ---- var eq_win = {}; app.listenFor ('WillUnload', function () { var cur; for (var k in eq_win) { cur = eq_win[k]; if (cur && !cur.type) { cur.destroy && cur.destroy (); } } eq_win = {}; }); app.listenFor ('RequestDragI', function ( url ) { if (app.isMobile) { alert ('unsupported on mobile'); return ; } var cur_win = eq_win[url]; if (!cur_win || !cur_win.el) return ; cur_win.el.style.pointerEvents = 'none'; cur_win.el.style.zIndex = '9'; cur_win.win.document.body.classList.add ('c'); var el_back = document.createElement ('div'); el_back.className = 'pk_modal_back'; document.body.appendChild (el_back); var is_drag = true; var x = 0; var y = 0; var moved = 2; var top = parseInt (cur_win.el.style.top) || 0; var left = parseInt (cur_win.el.style.left) || 0; app.ui.InteractionHandler.on = true; setTimeout (function() { if (cur_win && cur_win.el) { cur_win.el.style.display = 'none'; setTimeout(function() { cur_win.el.style.display = 'block'; },0); el_back.focus (); } }, 60); el_back.onmousemove = function ( e ) { if (!is_drag) return ; if (x === 0 && y === 0) { x = e.pageX; y = e.pageY; return ; } var dist_x = e.pageX - x; var dist_y = e.pageY - y; top += dist_y; left += dist_x; cur_win.el.style.top = top + 'px'; cur_win.el.style.left = left + 'px'; x = e.pageX; y = e.pageY; --moved; }; el_back.onmouseup = function ( e ) { is_drag = false; cur_win.win.document.body.classList.remove ('c'); cur_win.el.style.pointerEvents = ''; cur_win.el.style.zIndex = '7'; app.ui.InteractionHandler.on = false; document.body.removeChild (el_back); if (e.type === 'mouseup') { if (moved > 0) { cur_win.el.style.top = '0px'; var ch = app.ui.BarBtm.el.childNodes; var lw = 0; for (var ji = 0; ji < ch.length; ++ji) { if (cur_win.el === ch[ji]) break; lw += ch[ji].clientWidth + 18; } cur_win.el.style.left = lw + 'px'; // ---- } // check if we didn't move - in that return } el_back.onmousemove = null; el_back.onmouseleave = null; el_back.onmouseup = null; el_back = null; }; el_back.onmouseleave = function ( e ) { el_back.onmouseup ( e ); app.fireEvent ('RequestShowFreqAn', url, [ [(window.screenLeft + e.pageX)||0, (window.screenTop + e.pageY)||0], 0]); }; }); app.listenFor ('RequestShowFreqAn', function ( url, args_arr ) { if (app.isMobile) { alert ('Currently unsupported on mobile'); return ; } var toggle = args_arr[ 0 ]; var type = args_arr[ 1 ]; var title = 'Frequency Analysis'; var curr_win = eq_win[ url ]; if (url === 'sp') title = 'Spectrum Analysis'; var toggled = false; if (curr_win && toggle) { var ext = false; if (curr_win.type === type) ext = true; curr_win.destroy (); curr_win = null; eq_win[url] = null; if (ext) return ; toggled = true; } var freq_cb = function (_, freq) { curr_win && curr_win.win.update && curr_win.win.update (freq); }; var setEvents = function ( obj, _url ) { obj.win.destroy = function () { app.stopListeningFor ('DidAudioProcess', freq_cb); app.fireEvent ('DidToggleFreqAn', _url, null); // if (obj && obj.type === undefined) { if (obj && obj === eq_win[url]) { eq_win[url] = null; } var stop = true; for (var k in eq_win) { if (eq_win[k]) { stop = false; break; } } if (stop) app.engine.wavesurfer.backend.logFrequencies = false; }; app.listenFor ('DidAudioProcess', freq_cb); app.fireEvent ('DidToggleFreqAn', _url, curr_win); app.engine.wavesurfer.backend.logFrequencies = true; }; if (!type) { var makePopup = function ( dat ) { var extra = ''; if (dat && dat[0]) { dat[0] = Math.max (0, dat[0] - 200) >> 0; dat[1] = Math.max (0, dat[1]) >> 0; extra = ',left=' + dat[0] + ',top=' + dat[1]; } var wnd = window.open ('/' + url + '.html', title, "directories=no,titlebar=no,toolbar=no,"+ "location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=600,height=188" + extra); if (!wnd) { OneUp ('Please allow pop-ups for AudioMass!', 3600, 'pk_r'); return ; } eq_win[url] = { type : type, el : null, win : wnd, destroy : function () { wnd && wnd.close && wnd.close (); } }; curr_win = eq_win[url]; // wnd.moveTo(500, 100); setEvents ( curr_win, url ); }; if (!toggled) makePopup (toggle); else setTimeout(function(){makePopup (toggle)}, 130); } else if (type === 1) { var iframe = document.createElement ('iframe'); iframe.className = 'pk_frqan'; iframe.id = 'pk_fr' + url; if (app.ui.BarBtm.on) { var ch = app.ui.BarBtm.el.childNodes; var lw = 0; for (var ji = 0; ji < ch.length; ++ji) { lw += ch[ji].clientWidth + 18; } iframe.style.left = lw + 'px'; } app.ui.BarBtm.el.appendChild( iframe ); app.ui.BarBtm.Show (); eq_win[url] = { type : type, el : iframe, win : null, destroy : function () { iframe.parentNode.removeChild ( iframe ); iframe = null; var ch = app.ui.BarBtm.el.childNodes; if (ch.length === 0) { app.ui.BarBtm.Hide (); return ; } setTimeout(function () { var lw = 0; for (var ji = 0; ji < ch.length; ++ji) { if (!ch[ji] || !ch[ji].parentNode) continue; if (ch[ji].offsetTop > -20) { ch[ji].style.top = '0px'; ch[ji].style.left = lw + 'px'; } lw += ch[ji].clientWidth + 18; } },198); // -- } }; curr_win = eq_win[url]; iframe.onload = function (e) { if (curr_win && curr_win.type === type) { curr_win.win = iframe.contentWindow; setEvents ( curr_win, url ); } }; iframe.src = '/' + url + '.html?iframe=1'; } // --- }); // ---- }; PKAE._deps.uifx = PKUI_FX; })( window, document, PKAudioEditor );