Files

1927 lines
56 KiB
JavaScript
Executable File

(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:'<div class="pk_row" style="border:none"><label>Gain percentage</label>' +
'<input type="range" class="pk_horiz" min="0.0" max="2.5" step="0.01" value="1.0" />'+
'<span class="pk_val">100%</span></div>' +
'<div class="pk_row" style="border:none;padding:0">',
// '<a style="float:left;margin:0" class="pk_modal_a_bottom">Volume Graph</a></div>',
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:'<div class="pk_row" style="border:none"><label>Playback Rate</label>' +
'<input type="range" class="pk_horiz" min="0.2" max="2.0" step="0.05" value="1.0" />'+
'<span class="pk_val">1.0</span></div>',
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:'<div class="pk_row" style="border:none"><label>Playback Rate</label>' +
'<input type="range" class="pk_horiz" min="0.2" max="2.0" step="0.05" value="1.0" />'+
'<span class="pk_val">1.0</span></div>',
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:'<div class="pk_row pk_mm" style="border:none;display:none">'+
'<div class="pk_row">'+
'<input type="checkbox" class="pk_check pk_c_mm" id="xmm" name="makeMono">'+
'<label for="xmm">Make Mono</label></div>' +
'<div class="pk_row" style="padding-left:30px">' +
'<input type="radio" class="pk_check pk_c_c" id="kf6" name="chnl" value="left">'+
'<label class="pk_dis" for="kf6">Left Channel</label>'+
'<input type="radio" class="pk_check pk_c_c" id="kf7" name="chnl" value="right">'+
'<label class="pk_dis" for="kf7">Right Channel</label>'+
'</div>'+
'<div class="pk_row"><input type="checkbox" class="pk_check pk_c_fl" id="xfc" name="flipChn">'+
'<label for="xfc">Flip Channels</label></div>' +
'</div>' +
'<div class="pk_row pk_ms" style="border:none;display:none">'+
'<div class="pk_row"><input type="checkbox" class="pk_check pk_c_ms" id="xms" checked name="makeStereo">'+
'<label for="xms">Make Stereo</label></div>' +
'</div>',
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:'<div class="pk_row"><input type="radio" class="pk_check" id="ifeq" name="rdslnc" value="beginning">'+
'<label for="ifeq">Insert silence at beginning</label><br/>' +
'<input type="radio" class="pk_check" id="vgdja" name="rdslnc" checked value="cursor">'+
'<label for="vgdja">Insert silence at current cursor (<span class="pkcdpk"></span>)</label></div>'+
'<div class="pk_row"><label>Silence in seconds</label>'+
'<input type="range" min="0.0" max="30.0" class="pk_horiz" step="0.01" value="5.0" />'+
'<span class="pk_val">5s</span></div>',
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:'<div class="pk_row"><label class="pk_line">Threshold</label>' +
'<input class="pk_horiz" type="range" min="-100" max="0" step="0.1" value="-24.0" />'+
'<span class="pk_val">-24.0</span></div>'+
'<div class="pk_row"><label class="pk_line">Knee</label>' +
'<input class="pk_horiz" type="range" min="0.0" max="40.0" step="0.01" value="30.0" />'+
'<span class="pk_val">30.0</span></div>'+
'<div class="pk_row"><label class="pk_line">Ratio</label>' +
'<input class="pk_horiz" type="range" min="1.0" max="20.0" step="0.01" value="12.0" />'+
'<span class="pk_val">12.0</span></div>'+
'<div class="pk_row"><label class="pk_line">Attack</label>' +
'<input class="pk_horiz" type="range" min="0.0" max="1.0" step="0.001" value="0.003" />'+
'<span class="pk_val">0.003</span></div>'+
'<div class="pk_row" style="border:none"><label class="pk_line">Release</label>' +
'<input class="pk_horiz" type="range" min="0.0" max="1.0" step="0.001" value="0.25" />'+
'<span class="pk_val">0.25</span></div>',
//'<a style="float:left;margin:0" class="pk_modal_a_bottom">Volume Graph</a></div>',
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:'<div class="pk_row">'+
'<input type="checkbox" id="vhcjgs" class="pk_check" name="normEqually">'+
'<label for="vhcjgs">Normalize L/R Equally</label></div>' +
'<div class="pk_row" style="border:none"><label>Normalize to</label>'+
'<input type="range" min="0.0" max="2.0" class="pk_horiz" step="0.01" value="1.0" />'+
'<span class="pk_val">100%</span></div>',
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 = '<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="32" data-type="lowshelf" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">< 32hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="64" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">64hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="125" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">125hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="250" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">250hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="500" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">500hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="1000" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">1000hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="2000" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">2000hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="4000" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">4000hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="8000" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">8000hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="16000" data-type="highshelf" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm"> >16000hz</span></div>';
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 = '<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="31" data-type="lowshelf" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">< 31hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="44" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">44hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="63" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">63hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="88" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">88hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="125" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">125hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="180" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">180hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="250" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">250hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="335" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">335hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="500" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">500hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="710" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">710hz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="1000" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">1khz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="1400" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">1.4khz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="2000" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">2khz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="2800" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">2.8khz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="4000" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">4khz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="5600" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">5.6khz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="8000" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">8khz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="11300" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">11.3khz</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="16000" data-type="peaking" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm">16k</span></div>'+
'<div class="pk_col"><span class="pk_val">0 db</span>'+
'<input class="pk_vert" data-freq="22000" data-type="highshelf" '+
'type="range" min="-25.0" max="25.0" step="0.01" value="0.0" />'+
'<span class="pk_btm"> >22khz</span></div>';
}
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:'<div class="pk_h200">' +
bands_str+
'<div style="clear:both;"></div></div>',
//'<a style="float:left;margin:0" class="pk_modal_a_bottom">Volume Graph</a></div>',
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:
'<div class="pk_row"><input type="checkbox" class="pk_check" id="xighs" name="normEqually">'+
'<label for="xighs">Hard Limiting</label></div>' +
'<div class="pk_row"><label>Limit to</label>'+
'<input type="range" min="0.1" max="1.0" class="pk_horiz pk_w180" step="0.01" value="0.99" />'+
'<span class="pk_val">99%</span></div>'+
'<div class="pk_row"><label>Ratio between lows and highs</label>'+
'<input type="range" min="0.0" max="1.0" class="pk_horiz pk_w180" step="0.01" value="0.0" />'+
'<span class="pk_val">Ratio 0%</span></div>'+
'<div class="pk_row"><label>Look Ahead (ms)</label>'+
'<input type="range" min="1.0" max="500.0" class="pk_horiz pk_w180" step="0.01" value="10.0" />'+
'<span class="pk_val">10 ms</span></div>',
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:'<div class="pk_row"><label class="pk_line">Delay Time</label>' +
'<input class="pk_horiz" type="range" min="0.0" max="6.0" step="0.01" value="0.28" />'+
'<span class="pk_val">0.28</span></div>'+
'<div class="pk_row"><label class="pk_line">Feedback</label>' +
'<input class="pk_horiz" type="range" min="0.0" max="1.0" step="0.01" value="0.5" />'+
'<span class="pk_val">0.5</span></div>'+
'<div class="pk_row"><label class="pk_line">Wet</label>' +
'<input class="pk_horiz" type="range" min="0.0" max="1.0" step="0.01" value="0.4" />'+
'<span class="pk_val">0.4</span></div>',
//'<a style="float:left;margin:0" class="pk_modal_a_bottom">Volume Graph</a></div>',
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:'<div class="pk_row"><label class="pk_line">Gain</label>' +
'<input class="pk_horiz" type="range" min="0.0" max="2.0" step="0.01" value="0.5" />'+
'<span class="pk_val">0.5</span></div>',
// '<a style="float:left;margin:0" class="pk_modal_a_bottom">Volume Graph</a></div>',
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:'<div class="pk_row"><label class="pk_line">Time</label>' +
'<input class="pk_horiz" type="range" min="0.0" max="3.0" step="0.01" value="0.3" />'+
'<span class="pk_val">0.3</span></div>'+
'<div class="pk_row"><label class="pk_line">Decay</label>' +
'<input class="pk_horiz" type="range" min="0.0" max="3.0" step="0.01" value="0.05" />'+
'<span class="pk_val">0.05</span></div>'+
'<div class="pk_row"><label class="pk_line">Wet</label>' +
'<input class="pk_horiz" type="range" min="0.0" max="1.0" step="0.01" value="0.6" />'+
'<span class="pk_val">0.6</span></div>',
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 = '<div style="margin-top:18px">';
str += '<div><span class="pk_id3ttl">Artist</span><span>' + (tags.artist || '-') + '</span></div>';
str += '<div><span class="pk_id3ttl">Title</span><span>' + (tags.title || '-') + '</span></div>';
str += '<div><span class="pk_id3ttl">Album</span><span>' + (tags.album || '-') + '</span></div>';
str += '<div><span class="pk_id3ttl">Year</span><span>' + (tags.year || '-') + '</span></div>';
str += '<div><span class="pk_id3ttl">Genre</span><span>' + (tags.genre || '-') + '</span></div>';
str += '<div style="max-width:700px"><span class="pk_id3ttl">Comment</span><span>' + ((tags.comment||{}).text || '-') + '</span></div>';
str += '<div><span class="pk_id3ttl">Track</span><span>' + (tags.track || '-') + '</span></div>';
str += '<div style="max-width:700px"><span class="pk_id3ttl">Lyrics</span><span>' + ((tags.lyrics||{}).lyrics || '-') + '</span></div>';
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 += '<div><span style="float:left" class="pk_id3ttl">Cover</span>' +
'<span><img style="max-width:340px" src="data:' +
image.format + ';base64,' + window.btoa(base64str) + '"/></span></div>';
}
el.innerHTML = str + '</div>';
};
new PKSimpleModal({
title:'ID3 Metatags Explorer',
ondestroy: function( q ) {
app.ui.InteractionHandler.forceUnset (modal_id);
app.ui.KeyHandler.removeCallback (modal_id + 'esc');
},
buttons:[
],
body:'<input type="file" accept="audio/*" />'+
'<div class="pk_row pk_ttx">Choose file to view audio metatags!</div>',
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 = '<div style="padding:30px 0">No audio metadata found...</div>';
} 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 = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#039;'
};
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:'<label for="k07">Preset Name</label>' +
'<input style="min-width:340px" maxlength="16" placeholder="Please type a name, eg: My Preset" ' + default_txt + ' class="pk_txt" type="text" id="k07" />',
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 );