// LoopMixer by Tambako
//
// ToDo:
// * Use Hammer to for clicks on SoundButtons
// * Save and load presets in jQuery in LocalStorage
// * Export preset as URL (argument Base64 coded)
// * Save preset in LS when loading exported preset
// * Select filter type: lowpass / highpass
// * Translate analyser object instead of scaling
// * Reset button
// * Delete preset (x) on list
// * Shift/dblclick on soundbutton = solo
// * Add keyboard shortcuts
// * Builtin presets
// * Export: first remove old preset from address
// * Window resize handler
// * Better calculation of the playback speed with min-max BPM
// * About/info panel
// * Draw middle of pan pad
// * Window resize handler: move cursors
// * When load builtin preset: save disabled until something is done. When nothing done, export with preset name
// http://noisehack.com/custom-audio-effects-javascript-web-audio-api/
// https://github.com/Korilakkuma/XSound
var loopSelectOpts = "Acid 1 Beat + Bass Breakbeat Breakbeat House Beat Cymbal House Loop Cymbal House Loop 2 Cymbal House Loop 3 Disco Guitar Loop Disco House Beat 1 Disco House Beat 2 Disco House Beat 3 Disco House Beat 4 Effect House Loop 1 Effect House Loop 2 Effect House Loop 3 Funky Guitar Loop 1 Funky Guitar Loop 2 Guitar Loop Hard House Kick + Bass House Arp Loop 1 House Bass Loop 1 House Bass Loop 2 House Bass Loop 3 House Bass Loop 4 House Bass Loop 5 House Beat 1 House Beat 2 House Beat 3 House Beat 4 House Beat 5 House Chord Loop 1 House Chord Loop 2 House Chord Loop 3 House Chord Loop 4 House Chord Loop 5 House Fill 1 House Fill 2 House Fill 3 House Fill 4 House Fill 5 House Fill 6 House Kick + Snare + Hihat Loop House Kick + Snare Loop House Loop 1 House Loop 2 House Organ Melody House Perc Loop House Perc Loop 2 Latino Fill 1 Latino Fill 2 Latino House Beat 1 Latino House Beat 2 Latino House Beat 3 Latino House Beat 4 Latino House Beat 5 Latino House Beat 6 Latino House Beat 7 Latino House Beat 8 Latino House Loop Latino House Loop 2 Piano Loop 1 Rock House Beat 1 Shaker Loop 1 Simple House Beat 1 Simple House Beat 2 Simple House Beat 3 Simple House Beat 4 Simple House Beat 5 Techno Bass Loop ";
var nbTracks = 8;
var loopBuffer = [];
var loopUrl = [];
var lsPresetKey = "ch.tambako.LoopMixer.Presets.";
var currentPreset = "";
var filterPadTouch = [];
var volumePadTouch = [];
var panPadTouch = [];
var soundButtonTouch = [];
var equalizerTouch = [];
var shiftPressed = false;
var allMuted = false;
var infoShown = false;
var builtinPreset = false;
var padSize;
var cursorSize;
if (screen.width>screen.height)
{
padSize = 85/nbTracks*2-4;
//padSize = 87.5/nbTracks/2-4;
cursorSize = 10/nbTracks*2;
}
else
{
padSize = 78/Math.floor(nbTracks/2);
cursorSize = 10/Math.floor(nbTracks/2);
}
var padUsableSize;
var freqPow = 3;
var startFreq = 50;
var endFreq = 20000;
var maxRes = 30;
var maxResLp = 30;
var maxResBp = 2;
var maxResHp = 20;
var bpm0 = 128;
var bpm = bpm0;
var minBpm = 50;
var maxBpm = 320;
var minBpm2 = 80;
var maxBpm2 = 180;
var soundN = 1;
var texts = {
title: "LoopMixer by Tambako",
bpm: "bpm",
noLoop: "- no loop -",
reset: "Reset",
load: "Load",
save: "Save",
export: "Export",
savePrompt: "Please enter the name of the preset",
presetSaved: "Preset sucessfully saved!",
loadPrompt: "Please choose a preset to load",
noPreset: "No preset yet!",
preset: "Preset: ",
presetExported: "The address has been replaced by an address you can give to your friends, so that they can also hear your creation!",
delConf: "Do you really want to remove this preset?",
about: "About",
aboutText: "
LoopMixer by Tambako Load loops, combine them, change the volume, stereo balance, equalize them, play with the different filter pads, using a low pass, band pass or high pass! Let your creativity rule and present live performances to your friends!
To start, you can load the presets, see how they work and modify them. You can then save or share your new creation! Double-clicking on the controls resets them.
Created as a freetime project to help me to know more about Javascript, CSS, etc.
It is recommended to use the webapp in horizontal format on mobile devices (tablets and phones).
Keyboard shortcuts
ESC
close dialogsSpace
mute/unmute all channelsL
load presetS
save presetE
export preset R
reset all settings1-8
mute/unmute the channelShift + 1-8
solo the channelI
this about box "
}
var builtinPresets = {
"CoolHouseBeat": "eyJuYW1lIjoiQ29vbEhvdXNlQmVhdCIsImJwbSI6MTI4LCJ0cmFja3MiOltudWxsLHsidXJsIjoiQ3ltYmFsSG91c2VMb29wLndhdiIsInZvbHVtZSI6IjAuNDA1MiIsImZmcmVxIjoiMTgwMDAuMDAiLCJmcmVzIjoiMC4wMDAwIiwiZnR5cGUiOiJsb3dwYXNzIiwicGFuIjoiLTAuMTIwMiIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiLTcuNDE5OCJ9LHsiYm9vc3QiOiI3LjYxMTEifSx7ImJvb3N0IjoiNi45MjkwIn1dfSx7InVybCI6IkRpc2NvSG91c2VCZWF0My53YXYiLCJ2b2x1bWUiOiIwLjcxODAiLCJmZnJlcSI6IjE4MDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6IjAuMDYxNCIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiLTcuMDkyNiJ9LHsiYm9vc3QiOiIzLjkwNzQifSx7ImJvb3N0IjoiMi42Mzg5In1dfSx7InVybCI6IlNoYWtlckxvb3AxLndhdiIsInZvbHVtZSI6IjAuNDQyNiIsImZmcmVxIjoiMTgwMDAuMDAiLCJmcmVzIjoiMC4wMDAwIiwiZnR5cGUiOiJsb3dwYXNzIiwicGFuIjoiMC4yMDE3IiwiaXNNdXRlIjpmYWxzZSwiZXFWYWx1ZXMiOltudWxsLHsiYm9vc3QiOiItNy43OTk0In0seyJib29zdCI6IjYuMjkxNyJ9LHsiYm9vc3QiOiI3Ljc3MzkifV19LHsidXJsIjoiTGF0aW5vSG91c2VCZWF0NS53YXYiLCJ2b2x1bWUiOiIwLjMxMDYiLCJmZnJlcSI6IjE4MDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6IjAuMTIxMiIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiMi40OTY5In0seyJib29zdCI6IjkuMDQ2MyJ9LHsiYm9vc3QiOiIzLjU0OTQifV19LHsidXJsIjoiSG91c2VMb29wMS53YXYiLCJ2b2x1bWUiOiIwLjg2ODYiLCJmZnJlcSI6IjE4MDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6Ii0wLjEyNzEiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjAuMDAwMCJ9LHsiYm9vc3QiOiI0LjgyNDEifSx7ImJvb3N0IjoiMi4wOTg4In1dfSx7InVybCI6IlNpbXBsZUhvdXNlQmVhdDUud2F2Iiwidm9sdW1lIjoiMS4wMDAwIiwiZmZyZXEiOiIxODAwMC4wMCIsImZyZXMiOiIwLjAwMDAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjA2MTQiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjYuMzYxMSJ9LHsiYm9vc3QiOiI1LjI2ODUifSx7ImJvb3N0IjoiMC4wMDAwIn1dfSx7InVybCI6IkhvdXNlQmFzc0xvb3AxLndhdiIsInZvbHVtZSI6IjAuMTgzMyIsImZmcmVxIjoiMjU3Ljk3IiwiZnJlcyI6IjE3LjUwODMiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjAzNjEiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjcuNTI0NyJ9LHsiYm9vc3QiOiItOC40MzUyIn0seyJib29zdCI6Ii0xMS4zNjU3In1dfSx7InVybCI6IkJyZWFrYmVhdC53YXYiLCJ2b2x1bWUiOiIwLjY0MzEiLCJmZnJlcSI6IjExNTA0LjYzIiwiZnJlcyI6IjE2LjMwMTEiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjEzNTAiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6Ii0yMC4wMDAwIn0seyJib29zdCI6IjAuNjM0MyJ9LHsiYm9vc3QiOiIxMi4zMjY0In1dfV19",
"LatinoTechHouse": "eyJuYW1lIjoiTGF0aW5vVGVjaEhvdXNlIiwiYnBtIjoxMjgsInRyYWNrcyI6W251bGwseyJ1cmwiOiJIb3VzZUNob3JkTG9vcDIud2F2Iiwidm9sdW1lIjoiMS4wMDAwIiwiZmZyZXEiOiIxODk3MS43OCIsImZyZXMiOiIxLjUyMzkiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjAwMDAiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjEuMDI3OCJ9LHsiYm9vc3QiOiI3LjgyODcifSx7ImJvb3N0IjoiNS44NDQ5In1dfSx7InVybCI6IkhvdXNlS2ljaytTbmFyZStIaWhhdExvb3Aud2F2Iiwidm9sdW1lIjoiMC43MDQ4IiwiZmZyZXEiOiIxODAwMC4wMCIsImZyZXMiOiIwLjAwMDAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjAwMDAiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjYuNDkwNyJ9LHsiYm9vc3QiOiIxLjAwMDAifSx7ImJvb3N0IjoiNC41ODcyIn1dfSx7InVybCI6IkN5bWJhbEhvdXNlTG9vcDIud2F2Iiwidm9sdW1lIjoiMC40OTI2IiwiZmZyZXEiOiIxODAwMC4wMCIsImZyZXMiOiIwLjAwMDAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjAwMDAiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjEuMDAwMCJ9LHsiYm9vc3QiOiIxLjAwMDAifSx7ImJvb3N0IjoiMTAuODIxOCJ9XX0seyJ1cmwiOiJIb3VzZVBlcmNMb29wLndhdiIsInZvbHVtZSI6IjAuNDUzNiIsImZmcmVxIjoiMTgwMDAuMDAiLCJmcmVzIjoiMC4wMDAwIiwiZnR5cGUiOiJsb3dwYXNzIiwicGFuIjoiMC4zMDQ4IiwiaXNNdXRlIjpmYWxzZSwiZXFWYWx1ZXMiOltudWxsLHsiYm9vc3QiOiItNC42NjA1In0seyJib29zdCI6IjQuODM4MCJ9LHsiYm9vc3QiOiIxMS4zNzM1In1dfSx7InVybCI6IkhvdXNlQmVhdDEud2F2Iiwidm9sdW1lIjoiMC41Nzg2IiwiZmZyZXEiOiIxODAwMC4wMCIsImZyZXMiOiIwLjAwMDAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjM3NTEiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6Ii0yMC4wMDAwIn0seyJib29zdCI6Ii01LjQyNTkifSx7ImJvb3N0IjoiMy4yOTg2In1dfSx7InVybCI6IkJyZWFrYmVhdC53YXYiLCJ2b2x1bWUiOiIwLjM2MjQiLCJmZnJlcSI6IjE4MDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6Ii0wLjA1MzIiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6Ii04LjcyODQifSx7ImJvb3N0IjoiMS4wMDAwIn0seyJib29zdCI6IjEuMDAwMCJ9XX0seyJ1cmwiOiJTaW1wbGVIb3VzZUJlYXQxLndhdiIsInZvbHVtZSI6IjAuNTc0NCIsImZmcmVxIjoiMTgwMDAuMDAiLCJmcmVzIjoiMC4wMDAwIiwiZnR5cGUiOiJsb3dwYXNzIiwicGFuIjoiLTAuMjgyNyIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiLTIwLjAwMDAifSx7ImJvb3N0IjoiLTguMDU1NiJ9LHsiYm9vc3QiOiIzLjQ5MTUifV19LHsidXJsIjoiRWZmZWN0SG91c2VMb29wMi53YXYiLCJ2b2x1bWUiOiIwLjQ0MjEiLCJmZnJlcSI6IjIwMDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6IjAuNDIyNiIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiLTIwLjAwMDAifSx7ImJvb3N0IjoiMi41Mjc4In0seyJib29zdCI6Ii03LjA1MjUifV19XX0=",
"TribalLatinoBeat": "eyJuYW1lIjoiVHJpYmFsTGF0aW5vQmVhdCIsImJwbSI6MTI4LCJ0cmFja3MiOltudWxsLHsidXJsIjoiU2ltcGxlSG91c2VCZWF0My53YXYiLCJ2b2x1bWUiOiIxLjAwMDAiLCJmZnJlcSI6IjE4MDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6IjAuMDAwMCIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiOC4wNTg2In0seyJib29zdCI6IjEuMDAwMCJ9LHsiYm9vc3QiOiIxLjAwMDAifV19LHsidXJsIjoiTGF0aW5vSG91c2VMb29wLndhdiIsInZvbHVtZSI6IjAuODI5MiIsImZmcmVxIjoiMTgwMDAuMDAiLCJmcmVzIjoiMC4wMDAwIiwiZnR5cGUiOiJsb3dwYXNzIiwicGFuIjoiMC4xNzE4IiwiaXNNdXRlIjpmYWxzZSwiZXFWYWx1ZXMiOltudWxsLHsiYm9vc3QiOiIxLjAwMDAifSx7ImJvb3N0IjoiMS4wMDAwIn0seyJib29zdCI6IjEuMDAwMCJ9XX0seyJ1cmwiOiJIb3VzZVBlcmNMb29wLndhdiIsInZvbHVtZSI6IjAuNzIzNCIsImZmcmVxIjoiMTgwMDAuMDAiLCJmcmVzIjoiMC4wMDAwIiwiZnR5cGUiOiJsb3dwYXNzIiwicGFuIjoiMC4zNjA0IiwiaXNNdXRlIjpmYWxzZSwiZXFWYWx1ZXMiOltudWxsLHsiYm9vc3QiOiIxLjAwMDAifSx7ImJvb3N0IjoiMS4wMDAwIn0seyJib29zdCI6IjEuMDAwMCJ9XX0seyJ1cmwiOiJIb3VzZUJlYXQ0LndhdiIsInZvbHVtZSI6IjAuNjI5NyIsImZmcmVxIjoiMTgwMDAuMDAiLCJmcmVzIjoiMC4wMDAwIiwiZnR5cGUiOiJsb3dwYXNzIiwicGFuIjoiMC4wMDAwIiwiaXNNdXRlIjpmYWxzZSwiZXFWYWx1ZXMiOltudWxsLHsiYm9vc3QiOiItMjAuMDAwMCJ9LHsiYm9vc3QiOiItMTguMzQ3MiJ9LHsiYm9vc3QiOiI5LjAyNzgifV19LHsidXJsIjoiTGF0aW5vSG91c2VCZWF0NS53YXYiLCJ2b2x1bWUiOiIwLjc4NTIiLCJmZnJlcSI6IjE4MDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6IjAuMTM1MCIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiLTExLjU5NTcifSx7ImJvb3N0IjoiMS4wMDAwIn0seyJib29zdCI6IjEuMDAwMCJ9XX0seyJ1cmwiOiJDeW1iYWxIb3VzZUxvb3Aud2F2Iiwidm9sdW1lIjoiMC42MzgxIiwiZmZyZXEiOiIxODAwMC4wMCIsImZyZXMiOiIwLjAwMDAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjAwMDAiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjEuMDAwMCJ9LHsiYm9vc3QiOiIxLjAwMDAifSx7ImJvb3N0IjoiMS4wMDAwIn1dfSx7InVybCI6IkxhdGlub0hvdXNlQmVhdDIud2F2Iiwidm9sdW1lIjoiMC42NzIyIiwiZmZyZXEiOiIxODAwMC4wMCIsImZyZXMiOiIwLjAwMDAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiItMC4yMDUzIiwiaXNNdXRlIjpmYWxzZSwiZXFWYWx1ZXMiOltudWxsLHsiYm9vc3QiOiItNS45NDE0In0seyJib29zdCI6IjEuMDAwMCJ9LHsiYm9vc3QiOiIxLjAwMDAifV19LHsidXJsIjoiSG91c2VCZWF0My53YXYiLCJ2b2x1bWUiOiIwLjM3MzEiLCJmZnJlcSI6IjE4MDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6Ii0wLjI5MjciLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6Ii0yMC4wMDAwIn0seyJib29zdCI6IjguOTg2MSJ9LHsiYm9vc3QiOiIxLjAwMDAifV19XX0=",
"CoolHouseBeat+Chord": "eyJuYW1lIjoiQ29vbEhvdXNlQmVhdCtDaG9yZCIsImJwbSI6MTI4LCJ0cmFja3MiOltudWxsLG51bGwseyJ1cmwiOiJIYXJkSG91c2VLaWNrK0Jhc3Mud2F2Iiwidm9sdW1lIjoiMS4wMDAwIiwiZmZyZXEiOiIyMDAwMC4wMCIsImZyZXMiOiIwLjAwMDAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjAwMDAiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6Ii0yMC4wMDAwIn0seyJib29zdCI6IjEuMDAwMCJ9LHsiYm9vc3QiOiIxLjAwMDAifV19LHsidXJsIjoiU2ltcGxlSG91c2VCZWF0NS53YXYiLCJ2b2x1bWUiOiIwLjc0ODgiLCJmZnJlcSI6IjIwMDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6IjAuMDAwMCIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiNS44MjcyIn0seyJib29zdCI6IjUuMjAzNyJ9LHsiYm9vc3QiOiIxMC4xNTQzIn1dfSx7InVybCI6IkhvdXNlQmVhdDQud2F2Iiwidm9sdW1lIjoiMC42OTA0IiwiZmZyZXEiOiIyMDAwMC4wMCIsImZyZXMiOiI5Ljk4OTAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjAwMDAiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjEuMDAwMCJ9LHsiYm9vc3QiOiIxLjAwMDAifSx7ImJvb3N0IjoiNy43NDY5In1dfSx7InVybCI6IlNoYWtlckxvb3AxLndhdiIsInZvbHVtZSI6IjAuNzIwNyIsImZmcmVxIjoiMjAwMDAuMDAiLCJmcmVzIjoiMC4wMDAwIiwiZnR5cGUiOiJsb3dwYXNzIiwicGFuIjoiMC4wMDAwIiwiaXNNdXRlIjpmYWxzZSwiZXFWYWx1ZXMiOltudWxsLHsiYm9vc3QiOiIxLjAwMDAifSx7ImJvb3N0IjoiNy4zNzUwIn0seyJib29zdCI6IjguMTcxMyJ9XX0seyJ1cmwiOiJIb3VzZUNob3JkTG9vcDEud2F2Iiwidm9sdW1lIjoiMC41MTA2IiwiZmZyZXEiOiIyMDAwMC4wMCIsImZyZXMiOiIwLjAwMDAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjAwMDAiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjEuMDAwMCJ9LHsiYm9vc3QiOiIxLjAwMDAifSx7ImJvb3N0IjoiMS4wMDAwIn1dfV19",
"HardHouseBeat": "eyJuYW1lIjoiSGFyZEhvdXNlQmVhdCIsImJwbSI6MTM2LCJ0cmFja3MiOltudWxsLHsidXJsIjoiSG91c2VMb29wMi53YXYiLCJ2b2x1bWUiOiIwLjgyMDUiLCJmZnJlcSI6IjExOTExLjQ2IiwiZnJlcyI6IjE0Ljc0ODkiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiItMC4yMDMwIiwiaXNNdXRlIjpmYWxzZSwiZXFWYWx1ZXMiOltudWxsLHsiYm9vc3QiOiItMjAuMDAwMCJ9LHsiYm9vc3QiOiIzLjEwMTgifSx7ImJvb3N0IjoiMi45OTc3In1dfSx7InVybCI6IlNpbXBsZUhvdXNlQmVhdDUud2F2Iiwidm9sdW1lIjoiMS4wMDAwIiwiZmZyZXEiOiIxODAwMC4wMCIsImZyZXMiOiIwLjAwMDAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjAwMDAiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjMuMzkyMCJ9LHsiYm9vc3QiOiIxLjAwMDAifSx7ImJvb3N0IjoiMS4wMDAwIn1dfSx7InVybCI6IkhvdXNlUGVyY0xvb3AyLndhdiIsInZvbHVtZSI6IjAuNDc1NyIsImZmcmVxIjoiMTI1Ni4xMCIsImZyZXMiOiIxMi4wODYxIiwiZnR5cGUiOiJoaWdocGFzcyIsInBhbiI6IjAuMjc3NiIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiLTcuODQyNiJ9LHsiYm9vc3QiOiItNi43MzE1In0seyJib29zdCI6IjE2LjE0MjAifV19LHsidXJsIjoiQ3ltYmFsSG91c2VMb29wMy53YXYiLCJ2b2x1bWUiOiIwLjgxODYiLCJmZnJlcSI6IjE4MDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6IjAuMDAwMCIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiMS4wMDAwIn0seyJib29zdCI6IjIuMDEzOSJ9LHsiYm9vc3QiOiI1LjkzMzYifV19LHsidXJsIjoiRWZmZWN0SG91c2VMb29wMi53YXYiLCJ2b2x1bWUiOiIwLjM2MzIiLCJmZnJlcSI6IjE4MDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6Ii0wLjE3NTQiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6Ii02Ljc5NjMifSx7ImJvb3N0IjoiOC4yMjIyIn0seyJib29zdCI6IjUuNjc5MCJ9XX0seyJ1cmwiOiJIYXJkSG91c2VLaWNrK0Jhc3Mud2F2Iiwidm9sdW1lIjoiMS4wMDAwIiwiZmZyZXEiOiIxMjIuNjUiLCJmcmVzIjoiMy4wMjYxIiwiZnR5cGUiOiJoaWdocGFzcyIsInBhbiI6IjAuMDAwMCIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiMC41MzM5In0seyJib29zdCI6IjEuMDAwMCJ9LHsiYm9vc3QiOiIyLjgyNzkifV19LHsidXJsIjoiQWNpZDEud2F2Iiwidm9sdW1lIjoiMC45MTc5IiwiZmZyZXEiOiI0Mzk3LjgxIiwiZnJlcyI6IjEuNzc0MyIsImZ0eXBlIjoiYmFuZHBhc3MiLCJwYW4iOiIwLjM2NzMiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjEuMDAwMCJ9LHsiYm9vc3QiOiIwLjAwMDAifSx7ImJvb3N0IjoiMC4wMDAwIn1dfV19",
"FunkyGuitarHouse": "eyJuYW1lIjoiRnVuayBHdWl0YXIgSG91c2UiLCJicG0iOjExNywidHJhY2tzIjpbbnVsbCx7InVybCI6IlNpbXBsZUhvdXNlQmVhdDUud2F2Iiwidm9sdW1lIjoiMS4wMDAwIiwiZmZyZXEiOiIxODAwMC4wMCIsImZyZXMiOiIwLjAwMDAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjAwMDAiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjIuOTA0MyJ9LHsiYm9vc3QiOiIxLjAwMDAifSx7ImJvb3N0IjoiLTkuNDg2OSJ9XX0seyJ1cmwiOiJMYXRpbm9Ib3VzZUJlYXQ1LndhdiIsInZvbHVtZSI6IjEuMDAwMCIsImZmcmVxIjoiMTgwMDAuMDAiLCJmcmVzIjoiMC4wMDAwIiwiZnR5cGUiOiJsb3dwYXNzIiwicGFuIjoiLTAuMTY2MiIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiLTExLjIzNzcifSx7ImJvb3N0IjoiMS4wMDAwIn0seyJib29zdCI6Ii0xLjkyMTMifV19LHsidXJsIjoiRnVua3lHdWl0YXJMb29wMi53YXYiLCJ2b2x1bWUiOiIxLjAwMDAiLCJmZnJlcSI6IjIwMDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6IjAuMDAwMCIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiLTIuMjYyNCJ9LHsiYm9vc3QiOiIzLjI2ODUifSx7ImJvb3N0IjoiMS44MDE3In1dfSx7InVybCI6IkhvdXNlUGVyY0xvb3Aud2F2Iiwidm9sdW1lIjoiMC41NjE0IiwiZmZyZXEiOiIxODAwMC4wMCIsImZyZXMiOiIwLjAwMDAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiItMC4zMTM0IiwiaXNNdXRlIjpmYWxzZSwiZXFWYWx1ZXMiOltudWxsLHsiYm9vc3QiOiItMy40OTY5In0seyJib29zdCI6IjMuMjA4MyJ9LHsiYm9vc3QiOiI0Ljc0NTQifV19LHsidXJsIjoiSG91c2VCZWF0MS53YXYiLCJ2b2x1bWUiOiIwLjU2ODYiLCJmZnJlcSI6IjE4MDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6IjAuMTk3MSIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiLTEyLjIyNTMifSx7ImJvb3N0IjoiLTEuOTU4MyJ9LHsiYm9vc3QiOiI2LjcwNTIifV19LHsidXJsIjoiRWZmZWN0SG91c2VMb29wMi53YXYiLCJ2b2x1bWUiOiIwLjUxOTciLCJmZnJlcSI6IjE4MDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6IjAuMzA5OCIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiMS4wMDAwIn0seyJib29zdCI6IjEuMDAwMCJ9LHsiYm9vc3QiOiIxLjAwMDAifV19LHsidXJsIjoiU2hha2VyTG9vcDEud2F2Iiwidm9sdW1lIjoiMC4zNjAwIiwiZmZyZXEiOiIxODAwMC4wMCIsImZyZXMiOiIwLjAwMDAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiItMC4xMzYzIiwiaXNNdXRlIjpmYWxzZSwiZXFWYWx1ZXMiOltudWxsLHsiYm9vc3QiOiIxLjAwMDAifSx7ImJvb3N0IjoiMS4wMDAwIn0seyJib29zdCI6IjIuOTgyMyJ9XX1dfQ==",
"TrancyHouseMelody": "eyJuYW1lIjoiVHJhbmN5IEhvdXNlIE1lbG9keSIsImJwbSI6MTI4LCJ0cmFja3MiOltudWxsLHsidXJsIjoiSG91c2VLaWNrK1NuYXJlK0hpaGF0TG9vcC53YXYiLCJ2b2x1bWUiOiIwLjgzNzciLCJmZnJlcSI6IjIwMDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6IjAuMDAwMCIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiNS4wMDAwIn0seyJib29zdCI6IjEuMDAwMCJ9LHsiYm9vc3QiOiIxLjAwMDAifV19LHsidXJsIjoiRGlzY29Ib3VzZUJlYXQzLndhdiIsInZvbHVtZSI6IjAuODcyNCIsImZmcmVxIjoiMjAwMDAuMDAiLCJmcmVzIjoiMC4wMDAwIiwiZnR5cGUiOiJsb3dwYXNzIiwicGFuIjoiLTAuMTExMCIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiLTIwLjAwMDAifSx7ImJvb3N0IjoiNC4xMTExIn0seyJib29zdCI6IjQuOTM4MyJ9XX0seyJ1cmwiOiJDeW1iYWxIb3VzZUxvb3AzLndhdiIsInZvbHVtZSI6IjAuNjU0NyIsImZmcmVxIjoiMjAwMDAuMDAiLCJmcmVzIjoiMC4wMDAwIiwiZnR5cGUiOiJsb3dwYXNzIiwicGFuIjoiMC4xMTIwIiwiaXNNdXRlIjpmYWxzZSwiZXFWYWx1ZXMiOltudWxsLHsiYm9vc3QiOiIxLjAwMDAifSx7ImJvb3N0IjoiMS4wMDAwIn0seyJib29zdCI6IjYuMzE1NiJ9XX0seyJ1cmwiOiJIb3VzZUJhc3NMb29wNS53YXYiLCJ2b2x1bWUiOiIwLjcyOTYiLCJmZnJlcSI6IjQyOTguODkiLCJmcmVzIjoiMTcuOTcyOCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6IjAuMDAwMCIsImlzTXV0ZSI6ZmFsc2UsImVxVmFsdWVzIjpbbnVsbCx7ImJvb3N0IjoiMy40NDc1In0seyJib29zdCI6IjYuNjM4OSJ9LHsiYm9vc3QiOiIzLjEyODkifV19LHsidXJsIjoiSG91c2VDaG9yZExvb3A0LndhdiIsInZvbHVtZSI6IjAuNTkxMSIsImZmcmVxIjoiNzQuOTEiLCJmcmVzIjoiOS44MzI2IiwiZnR5cGUiOiJoaWdocGFzcyIsInBhbiI6Ii0wLjYzMDciLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6Ii02LjA4NjQifSx7ImJvb3N0IjoiOS40NDQ0In0seyJib29zdCI6IjQuNjcyMSJ9XX0seyJ1cmwiOiJIb3VzZUNob3JkTG9vcDUud2F2Iiwidm9sdW1lIjoiMC41MjU4IiwiZmZyZXEiOiIzNDgwLjU2IiwiZnJlcyI6IjEzLjY0OTciLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjY2ODUiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6Ii00Ljk4MTUifSx7ImJvb3N0IjoiMC45ODYxIn0seyJib29zdCI6IjMuMTkwNiJ9XX0seyJ1cmwiOiJTaGFrZXJMb29wMS53YXYiLCJ2b2x1bWUiOiIwLjYxNzMiLCJmZnJlcSI6IjIwMDAwLjAwIiwiZnJlcyI6IjAuMDAwMCIsImZ0eXBlIjoibG93cGFzcyIsInBhbiI6Ii0wLjQ1MzYiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjEuMDAwMCJ9LHsiYm9vc3QiOiIxLjAwMDAifSx7ImJvb3N0IjoiNS45NTI5In1dfSx7InVybCI6IkhvdXNlUGVyY0xvb3Aud2F2Iiwidm9sdW1lIjoiMC40NzU4IiwiZmZyZXEiOiIyMDAwMC4wMCIsImZyZXMiOiIwLjAwMDAiLCJmdHlwZSI6Imxvd3Bhc3MiLCJwYW4iOiIwLjQyNDgiLCJpc011dGUiOmZhbHNlLCJlcVZhbHVlcyI6W251bGwseyJib29zdCI6IjEuMDAwMCJ9LHsiYm9vc3QiOiI2LjE5OTEifSx7ImJvb3N0IjoiMTEuMjY1NCJ9XX1dfQ=="
};
var _2beq = {
1: {
name: "basses",
color: "#00BB00",
centerFrequency: "100",
q: 0.15,
boost: 20
},
2: {
name: "trebles",
color: "#CC0000",
centerFrequency: "6500",
q: 0.15,
boost: 20
}
}
var _3beq = {
1: {
name: "basses",
color: "#00BB00",
centerFrequency: "75",
q: 0.35,
boost: 20
},
2: {
name: "mids",
color: "#2038FF",
centerFrequency: "1250",
q: 0.35,
boost: 30
},
3: {
name: "trebles",
color: "#CC0000",
centerFrequency: "9000",
q: 0.35,
boost: 25
}
}
var _4beq = {
1: {
name: "basses",
color: "#00BB00",
centerFrequency: "65",
q: 0.45,
boost: 25
},
2: {
name: "low mids",
color: "#2038FF",
centerFrequency: "850",
q: 0.45,
boost: 30
},
3: {
name: "hi mids",
color: "#CCCC00",
centerFrequency: "4000",
q: 0.45,
boost: 30
},
4: {
name: "trebles",
color: "#CC0000",
centerFrequency: "12000",
q: 0.45,
boost: 25
}
}
var _5beq = {
1: {
name: "basses",
color: "#BBBBBB",
centerFrequency: "55",
q: 0.45,
boost: 20
},
2: {
name: "low mids",
color: "#00BB00",
centerFrequency: "710",
q: 0.45,
boost: 20
},
3: {
name: "mids",
color: "#2038FF",
centerFrequency: "2300",
q: 0.35,
boost: 30
},
4: {
name: "hi mids",
color: "#CCCC00",
centerFrequency: "5100",
q: 0.45,
boost: 25
},
5: {
name: "trebles",
color: "#CC0000",
centerFrequency: "14000",
q: 0.45,
boost: 20
}
}
var equalizer = {
maxAngle: 135,
pixelsPerDegree: 0.8,
showlabels: true,
bands: _3beq,
nbBands: function()
{
var v = 1;
while(this.bands[v]!=undefined)
v++;
return v-1;
},
createControls: function(selector)
{
//var totWidth = $("#"+selector).width();
var totWidth = $("#filterPad1").width();
$("#"+selector).append("
");
var nbBands = this.nbBands();
for (b=1; b<=nbBands; b++)
{
$("#eqContainer-"+selector).append("
");
$("#eqBandCursorCont"+b+"-"+selector).append("
");
$("#eqBandCursorCont"+b+"-"+selector).append("
");
if (equalizer.showlabels)
$("#eqBandCursorCont"+b+"-"+selector).append(""+equalizer.bands[b].name+"
");
$("#eqContainer-"+selector).css("max-height", String(cursorSize+1)+"vw");
$("#eqBandCursor"+b+"-"+selector).css("width", cursorSize+"vw").css("height", cursorSize+"vw").css("top", String(-cursorSize-0.3)+"vw").css("background-color", this.bands[b].color);
$("#eqBandLabel"+b+"-"+selector).css("top", String(-cursorSize + 0.2)+"vw");
$("#eqBandCursorShadow"+b+"-"+selector).css("width", cursorSize+"vw").css("height", cursorSize+"vw").css("top", String(-cursorSize-0.575)+"vw")
eqSpacing = (totWidth - nbBands*($("#eqBandCursor"+b+"-"+selector).width()+((3.2-cursorSize)*0.0012+0.001)*Math.max(screen.width, screen.height)))/(nbBands-1);
if (b!=nbBands)
$("#eqBandCursorCont"+b+"-"+selector).css("margin-right", String(eqSpacing+"px"));
else
$("#eqBandCursorCont"+b+"-"+selector).css("margin-right", "0px");
$("#eqBandCursor"+b+"-"+selector).attr("angle", 0);
equalizerTouch["eqBandCursor"+b+"-"+selector] = new Hammer($("#eqBandCursor"+b+"-"+selector)[0], { multiUser: true });
equalizerTouch["eqBandCursor"+b+"-"+selector].get('pan').set(
{
direction: Hammer.DIRECTION_VERTICAL,
threshold: 3
});
equalizerTouch["eqBandCursor"+b+"-"+selector].on("panmove", function(ev)
{
ev.preventDefault();
builtinPreset = false;
equalizerRotate(ev);
});
equalizerTouch["eqBandCursor"+b+"-"+selector].on("panend", function(ev)
{
ev.preventDefault();
builtinPreset = false;
equalizerRotateEnd(ev);
});
$("body").delegate("#eqBandCursor"+b+"-"+selector, "dblclick", function(ev)
{
ev.preventDefault();
ev.stopPropagation();
builtinPreset = false;
equalizerRotateReset(ev);
});
}
$(".eqContainer").css("top", String(-2*cursorSize-0.72)+"vw");
}
}
$(document).ready(function()
{
setTimeout(function ()
{
setWCursor(true);
}, 50);
$("#title").html(texts.title);
setTimeout(function()
{
initSound(function()
{
loadSounds(init);
});
}, 100);
});
function loadSounds(callbackF)
{
if (loopUrl[soundN]>"")
{
loadSound("snd/"+loopUrl[soundN], function()
{
loopBuffer[soundN] = soundBuffer;
soundN++;
if (soundN<=nbTracks)
loadSounds(callbackF);
else
callbackF();
});
}
else
{
soundN++;
if (soundN<=nbTracks)
loadSounds(callbackF);
else
callbackF();
}
}
function init()
{
createControls();
for (p=1; p<=nbTracks; p++)
{
filterPadTouch[p] = new Hammer($("#filterPadTouch"+p)[0], { multiUser: true });
filterPadTouch[p].get('pan').set(
{
direction: Hammer.DIRECTION_ALL,
threshold: 1,
});
filterPadTouch[p].on("pan", function(ev)
{
ev.preventDefault();
builtinPreset = false;
filterPad(ev);
});
volumePadTouch[p] = new Hammer($("#volumePadTouch"+p)[0], { multiUser: true });
volumePadTouch[p].get('pan').set(
{
direction: Hammer.DIRECTION_ALL,
threshold: 1
});
volumePadTouch[p].on("pan", function(ev)
{
ev.preventDefault();
builtinPreset = false;
volumePad(ev);
});
panPadTouch[p] = new Hammer($("#panPadTouch"+p)[0], { multiUser: true });
panPadTouch[p].get('pan').set(
{
direction: Hammer.DIRECTION_ALL,
threshold: 1
});
panPadTouch[p].on("pan", function(ev)
{
ev.preventDefault();
builtinPreset = false;
panPad(ev);
});
soundButtonTouch[p] = new Hammer($("#soundButton"+p)[0], { multiUser: true });
soundButtonTouch[p].on("tap", function(ev)
{
//ev.preventDefault();
//ev.stopPropagation();
builtinPreset = false;
fnum = parseInt(ev.target.id.replace("soundButton", ""));
if (!shiftPressed)
{
if (loopBuffer[fnum]!=undefined)
{
loopBuffer[fnum].isMute = !loopBuffer[fnum].isMute;
muteChannel(fnum, loopBuffer[fnum].isMute);
}
}
else
{
soloChannel(fnum);
}
});
$("body").delegate("#filterPadTouch"+p, "dblclick", function(ev)
{
ev.preventDefault();
ev.stopPropagation();
builtinPreset = false;
fnum = parseInt(ev.target.id.replace("filterPadTouch", ""));
loopBuffer[fnum].filterNode.frequency.value = endFreq;
loopBuffer[fnum].filterNode.Q.value = 0;
$("#filterPadCursor"+fnum).css("left", "0px").css("top", -padSize+"vw");
});
$("body").delegate("#panPadTouch"+p, "dblclick", function(ev)
{
ev.preventDefault();
ev.stopPropagation();
builtinPreset = false;
fnum = parseInt(ev.target.id.replace("panPadTouch", ""));
loopBuffer[fnum].panner.pan.value = 0;
$("#panPadCursor"+fnum).css("left", String(padUsableSize/2)+"px");
});
$("body").delegate("#volumePadTouch"+p, "dblclick", function(ev)
{
ev.preventDefault();
ev.stopPropagation();
builtinPreset = false;
fnum = parseInt(ev.target.id.replace("volumePadTouch", ""));
loopBuffer[fnum].gainNode.gain.value = 1;
$("#volumePadCursor"+fnum).css("top", -padSize+"vw");
});
$("body").delegate("#lowpassSwitch"+p, "click", function(ev)
{
builtinPreset = false;
fnum = parseInt(ev.target.id.replace("lowpassSwitch", ""));
if (loopBuffer[fnum]!=undefined)
{
setFilterType("lowpass", fnum);
}
});
$("body").delegate("#bandpassSwitch"+p, "click", function(ev)
{
builtinPreset = false;
fnum = parseInt(ev.target.id.replace("bandpassSwitch", ""));
if (loopBuffer[fnum]!=undefined)
{
setFilterType("bandpass", fnum);
}
});
$("body").delegate("#highpassSwitch"+p, "click", function(ev)
{
builtinPreset = false;
fnum = parseInt(ev.target.id.replace("highpassSwitch", ""));
if (loopBuffer[fnum]!=undefined)
{
setFilterType("highpass", fnum);
}
});
setTimeout(function() { drawLevels(); });
}
$("body").delegate("#bpmInput", "change", function(ev)
{
builtinPreset = false;
bpm = Math.min(Math.max(ev.target.value, minBpm), maxBpm);
ev.target.value = bpm;
cursObj = $("#bpmPadCursor");
posx = padUsableSize * ((bpm - minBpm)/(maxBpm - minBpm)) + $("#bpmPad").offset().left - cursObj.width()/2;
cursObj.css("left", String(posx)+"px");
setBpm();
});
$("body").delegate("#resetButton", "click", function(ev)
{
builtinPreset = false;
resetAll();
});
$("body").delegate("#saveButton", "click", function(ev)
{
sName = prompt(texts.savePrompt, currentPreset);
if (sName!="" && sName!=null && sName!=undefined)
savePreset(sName);
});
$("body").delegate("#loadButton", "click", function(ev)
{
getPresetsList();
});
$("body").delegate("#exportButton", "click", function(ev)
{
exportCurrentSettings();
});
$("body").delegate(".presetItem", "click", function(ev)
{
ev.preventDefault();
ev.stopPropagation();
$("#presets").fadeOut(200);
prKey = $(ev.target).attr("lsk");
if(prKey.substr(0, 4)=="BIP_")
{
builtinPreset = true;
prCont = atob(builtinPresets[prKey.replace("BIP_", "")]);
}
else
{
builtinPreset = false;
prCont = localStorage[prKey];
}
loadPreset(prCont);
});
$("body").delegate(".deleteButton", "click", function(ev)
{
ev.preventDefault();
ev.stopPropagation();
removePreset($(ev.target).parent().attr("lsk"));
$("#presets").fadeOut(200);
});
$("body").delegate("#presets", "click", function(ev)
{
$("#presets").fadeOut(200);
});
$("body").delegate("#aboutButton", "click", function(ev)
{
if (!infoShown)
showAboutBox();
else
hideAboutBox();
});
$("body").delegate(".loopSelect", "change", function(ev)
{
builtinPreset = false;
setWCursor(true);
var fnum = parseInt(ev.target.id.replace("loopSelect", ""));
var loopUrl = $("#loopSelect"+fnum)[0].value;
loadSample(loopUrl, fnum);
setWCursor(false);
});
bpmPadTouch[p] = new Hammer($("#bpmPadTouch")[0], { multiUser: true });
bpmPadTouch[p].get('pan').set(
{
direction: Hammer.DIRECTION_ALL,
threshold: 1
});
bpmPadTouch[p].on("pan", function(ev)
{
ev.preventDefault();
builtinPreset = false;
cursObj = $("#bpmPadCursor");
var posx = Math.min(Math.max(ev.center.x - $(ev.target).offset().left + $(ev.target).scrollLeft() - cursObj.width()/2, 0), padUsableSize);
cursObj.css("left", String(posx)+"px");
bpm = Math.floor(minBpm + posx/padUsableSize*(maxBpm - minBpm));
$("#bpmInput")[0].value = bpm;
setBpm();
});
$("body").delegate("#bpmPadTouch", "dblclick", function(ev)
{
ev.preventDefault();
ev.stopPropagation();
builtinPreset = false;
bpm = bpm0;
posx = padUsableSize * ((bpm - minBpm)/(maxBpm - minBpm));
cursObj = $("#bpmPadCursor");
cursObj.css("left", String(posx)+"px");
$("#bpmInput")[0].value = bpm;
setBpm();
});
for (p=1; p<=nbTracks; p++)
{
if(loopBuffer[p]!=undefined)
{
playSound(loopBuffer[p], getPbr(p), 1, 20000, 0, true, equalizer);
$("#loopSelect"+p)[0].value = loopUrl[p];
$("#resetButton").removeClass("SquareButton_inactive");
$("#saveButton").removeClass("SquareButton_inactive");
$("#exportButton").removeClass("SquareButton_inactive");
}
else
hideControls(p);
}
for (p=1; p<=nbTracks; p++)
if(loopBuffer[p]!=undefined && loopBuffer[p].currentSource!=undefined)
loopBuffer[p].currentSource.start(0);
$("body").keydown(function(event)
{
//alert(event.which);
if (event.which==16)
shiftPressed = true;
if (event.which==82)
resetAll();
if (event.which==83)
{
sName = prompt(texts.savePrompt, currentPreset);
savePreset(sName);
}
if (event.which==76)
getPresetsList();
if (event.which==27)
{
if (infoShown)
hideAboutBox()
else
$("#presets").fadeOut(200);
}
if (event.which>=49 && event.which<=57)
{
var fnum = event.which-48;
if (!shiftPressed)
{
if (loopBuffer[fnum]!=undefined)
{
loopBuffer[fnum].isMute = !loopBuffer[fnum].isMute;
muteChannel(fnum, loopBuffer[fnum].isMute);
}
}
else
soloChannel(fnum);
}
if (event.which==32)
{
builtinPreset = false;
allMuted = !allMuted;
for (p=1; p<=nbTracks; p++)
{
if (loopBuffer[p]!=undefined)
{
if(loopBuffer[p].isMute!=allMuted)
{
loopBuffer[p].isMute = allMuted;
muteChannel(p, loopBuffer[p].isMute);
}
}
}
}
if (event.which==73)
{
if (!infoShown)
showAboutBox();
else
hideAboutBox();
}
if (event.which==82 || event.which==83 || event.which==76 || event.which==27 || event.which==32 || event.which==73)
event.preventDefault();
});
$("body").keyup(function(event)
{
if (event.which==16)
shiftPressed = false;
});
$("#aboutBox").click(function(event)
{
event.preventDefault();
event.stopPropagation();
hideAboutBox();
});
$(window).resize(function()
{
padUsableSize = 0.96*($("#filterPad1").width() - $("#filterPadCursor1").width());
var nbBands = equalizer.nbBands();
var totWidth = $("#filterPad1").width();
for (p=1; p<=nbTracks; p++)
{
$("#lowpassSwitch"+p).css("left", String($("#filterPad"+p).offset().left - $("#lowpassSwitch"+p).width() - 8)+"px").css("top", "calc("+$("#filterPad"+p).offset().top+"px + "+String(-padSize/35 + 0.1)+"vw)");
$("#bandpassSwitch"+p).css("left", String($("#filterPad"+p).offset().left - $("#lowpassSwitch"+p).width() - 8)+"px").css("top", "calc("+$("#filterPad"+p).offset().top+"px + "+String(-padSize/35 + 1.33)+"vw)");
$("#highpassSwitch"+p).css("left", String($("#filterPad"+p).offset().left - $("#lowpassSwitch"+p).width() - 8)+"px").css("top", "calc("+$("#filterPad"+p).offset().top+"px + "+String(-padSize/35 + 2.56)+"vw)");
if (loopBuffer[p]!=undefined)
{
posx = padUsableSize*loopBuffer[p].filterNode.Q.value/maxRes;
posy = padUsableSize*(1- Math.pow((loopBuffer[p].filterNode.frequency.value - startFreq)/(endFreq - startFreq), 1/freqPow));
$("#filterPadCursor"+p).css("left", String(posx)+"px").css("top", "calc("+String(posy)+"px - "+padSize+"vw)");
amp = Math.log(1 + (Math.E - 1)*loopBuffer[p].gainNode.gain.value);
posy = (1 - amp) * padUsableSize;
$("#volumePadCursor"+p).css("top", "calc("+String(posy)+"px - "+padSize+"vw)");
posx = padUsableSize*(parseFloat(loopBuffer[p].panner.pan.value) + 1)/2
$("#panPadCursor"+p).css("left", String(posx)+"px");
}
selector = "loopControls"+p;
for (b=1; b<=nbBands; b++)
{
eqSpacing = (totWidth - nbBands*($("#eqBandCursor"+b+"-"+selector).width()+((3.2-cursorSize)*0.0012+0.001)*Math.max(screen.width, screen.height)))/(nbBands-1);
if (b!=nbBands)
$("#eqBandCursorCont"+b+"-"+selector).css("margin-right", String(eqSpacing+"px"));
else
$("#eqBandCursorCont"+b+"-"+selector).css("margin-right", "0px");
}
}
});
var settings = getParameterByName("settings");
if (settings>"")
{
if(settings.length<=32)
settings = builtinPresets[settings];
settingsData = atob(settings);
loadPreset(settingsData);
setTimeout(function()
{
savePreset(currentPreset, true);
}, 2000);
}
setWCursor(false);
}
function setBpm()
{
for (p=1; p<=nbTracks; p++)
if(loopBuffer[p]!=undefined && loopBuffer[p].currentSource!=undefined)
loopBuffer[p].currentSource.playbackRate.value = getPbr(p);
}
function getPbr(p)
{
ld = loopBuffer[p].duration;
bpmF = 480;
tmpBpm = bpmF/ld;
while (tmpBpm>maxBpm2 || tmpBpmmaxBpm2)
bpmF/=2;
if(tmpBpm"+texts.title+"");
$("body").append(""+texts.about+"
");
$("body").append("
");
$("body").append("" + texts.aboutText + "
");
$("body").append("
");
$("#bpmPad").append("
");
$("#bpmPad").append("
");
$("body").append(""+texts.bpm+"
");
//$("body").append("
");
$("body").append(""+texts.reset+"
");
$("body").append(""+texts.save+"
");
$("body").append(""+texts.export+"
");
$("body").append(""+texts.load+"
");
$("body").append("
");
for (p=1; p<=nbTracks; p++)
{
$("body").append("
");
$("#loopControls"+p).append(""+texts.noLoop+" "+loopSelectOpts+" ");
$("#loopControls"+p).append("
");
$("#filterPad"+p).append("
");
$("#filterPad"+p).append("
");
$("#filterPad"+p).append(""+p+"
");
$("#loopControls"+p).append("L
");
$("#loopControls"+p).append("B
");
$("#loopControls"+p).append("H
");
$("#loopControls"+p).append("
");
$("#volumePad"+p).append("
");
$("#volumePad"+p).append("
");
$("#volumePad"+p).append("
");
$("#levelMeter"+p).css("left", $("#volumePad"+p).css("left")).css("bottom", $("#volumePad"+p).css("bottom")).css("width", String(cursorSize+0.6)+"vw").css("height", "0px");
$("#loopControls"+p).append("
");
$("#loopControls"+p).append("
");
$("#panPad"+p).append("
");
$("#panPad"+p).append("
");
$("#panPadCenter"+p).css("left", String(padSize/2 + 0.15)+"vw").css("top", String(-cursorSize - 1)+"vw");
$("#loopControls"+p).append("
");
$("#filterPadCursor"+p).css("left", "0px").css("top", "calc("+String($("#filterPadCursor"+p).height()/2)+"px - "+padSize+"vw)");
}
$(".loopControls").css("height", 1.9*padSize+"vw");
$(".filterPad").css("width", padSize+"vw").css("height", padSize+"vw");
$(".volumePad").css("width", String(cursorSize+0.52)+"vw").css("height", padSize+"vw");
$(".panPad").css("width", padSize+"vw").css("height", String(cursorSize+0.52)+"vw");
$(".panPadCenter").css("height", String(cursorSize+0.52)+"vw");
$(".loopSelect").css("width", String(padSize+0.52)+"vw").css("height", String(cursorSize+0.52)+"vw").css("font-size", String(cursorSize*0.75)+"vw");;
$(".padCursor").css("width", cursorSize+"vw").css("height", cursorSize+"vw");
$(".padCursor:not([id^=panPadCursor])").css("top", -padSize+"vw")
$(".label").css("font-size", String(cursorSize*0.94)+"vw");
$(".SquareButton").css("font-size", String(cursorSize*0.94)+"vw");
padUsableSize = 0.96*($("#filterPad1").width() - $("#filterPadCursor1").width());
posx = padUsableSize * ((bpm - minBpm)/(maxBpm - minBpm)) + $("#bpmPad").offset().left - $("#bpmPadCursor").width()/2;
$("#bpmPadCursor").css("top", String(-cursorSize-0.52)+"vw").css("left", String(posx)+"px");
$(".bpmInput").css("width", String(cursorSize*1.7)+"vw").css("height", String(cursorSize+1.02)+"vw").css("font-size", String(cursorSize*0.94)+"vw");
$(".padLabel").css("font-size", padSize*1.2+"vw").css("margin-top", -padSize/2-cursorSize+"vw");
$(".soundButton").css("width", String(cursorSize+1)+"vw").css("height", String(cursorSize+1)+"vw").css("left", String(padSize + 1.1)+"vw").css("top", String(-2*cursorSize - 1.8)+"vw").css("background-size", String(cursorSize*1.01)+"vw");
for (p=1; p<=nbTracks; p++)
{
$("#panPadCursor"+p).css("left", String(padUsableSize/2)+"px").css("top", String(-cursorSize - 0.52)+"vw");
equalizer.createControls("loopControls"+p);
$("#lowpassSwitch"+p).css("left", String($("#filterPad"+p).offset().left - $("#lowpassSwitch"+p).width() - 8)+"px").css("top", "calc("+$("#filterPad"+p).offset().top+"px + "+String(-padSize/35 + 0.1)+"vw)");
$("#bandpassSwitch"+p).css("left", String($("#filterPad"+p).offset().left - $("#lowpassSwitch"+p).width() - 8)+"px").css("top", "calc("+$("#filterPad"+p).offset().top+"px + "+String(-padSize/35 + 1.33)+"vw)");
$("#highpassSwitch"+p).css("left", String($("#filterPad"+p).offset().left - $("#lowpassSwitch"+p).width() - 8)+"px").css("top", "calc("+$("#filterPad"+p).offset().top+"px + "+String(-padSize/35 + 2.56)+"vw)");
}
}
function showAboutBox()
{
if (infoShown)
return;
infoShown = true;
$("#aboutBox").fadeIn(350);
}
function hideAboutBox()
{
infoShown = false;
$("#aboutBox").fadeOut(350, function()
{
// ...
});
}
function hideControls(p)
{
$("#filterPadCursor"+p).hide();
$("#volumePadCursor"+p).hide();
$("#panPadCursor"+p).hide();
$("#filterPadLabel"+p).css("margin-top", String(-padSize/2+0.45)+"vw");
}
function resetControls(p, onlyPads)
{
if (onlyPads==null)
onlyPads = false;
$("#filterPadCursor"+p).css("left", "0px").css("top", -padSize+"vw");
$("#volumePadCursor"+p).css("top", -padSize+"vw");
$("#panPadCursor"+p).css("left", String(padUsableSize/2)+"px")
muteChannel(p, false);
if (!onlyPads)
{
var nbBands = equalizer.nbBands();
for (b=1; b<=nbBands; b++)
$("#eqBandCursor"+b+"-loopControls"+p).css("transform", "rotate(0deg)");
}
}
function showControls(p)
{
$("#filterPadCursor"+p).show();
$("#volumePadCursor"+p).show();
$("#panPadCursor"+p).show();
$("#filterPadLabel"+p).css("margin-top", -padSize/2-cursorSize+"vw");
}
function loadSample(url, fnum)
{
loopUrl[fnum] = url;
var playAttrs = [];
var eqValues = [];
var nbBands = equalizer.nbBands();
if (url>"")
{
for (p=1; p<=nbTracks; p++)
{
if (loopBuffer[p]!=undefined)
{
playAttrs[p] = Array(loopBuffer[p].gainNode.gain.value, loopBuffer[p].filterNode.frequency.value, loopBuffer[p].filterNode.Q.value, loopBuffer[p].filterNode.type, loopBuffer[p].panner.pan.value);
for (b=1; b<=nbBands; b++)
eqValues[p+"-"+b] = loopBuffer[p].eqFilters[b].gain.value;
if (loopBuffer[p].currentSource!=undefined)
loopBuffer[p].currentSource.stop();
}
else
{
playAttrs[p] = Array(1, 20000, 0, "lowpass", 0);
for (b=1; b<=nbBands; b++)
eqValues[p+"-"+b] = 1;
}
}
loadSound("snd/"+url, function()
{
if (loopBuffer[fnum]!=undefined)
{
var tempAmp = loopBuffer[fnum].tempAmp;
var isMute = loopBuffer[fnum].isMute;
}
else
{
var tempAmp = 1;
var isMute = false;
}
loopBuffer[fnum] = soundBuffer;
loopBuffer[fnum].tempAmp = tempAmp;
loopBuffer[fnum].isMute = isMute;
for (p=1; p<=nbTracks; p++)
{
if (loopBuffer[p]!=undefined)
{
$("#resetButton").removeClass("SquareButton_inactive");
$("#saveButton").removeClass("SquareButton_inactive");
$("#exportButton").removeClass("SquareButton_inactive");
playSound(loopBuffer[p], getPbr(p), 0, playAttrs[p][1], playAttrs[p][4], true, equalizer);
loopBuffer[p].gainNode.gain.value = playAttrs[p][0];
loopBuffer[p].filterNode.Q.value = playAttrs[p][2];
loopBuffer[p].filterNode.type = playAttrs[p][3];
for (b=1; b<=nbBands; b++)
loopBuffer[p].eqFilters[b].gain.value = eqValues[p+"-"+b];
}
}
for (p=1; p<=nbTracks; p++)
if(loopBuffer[p]!=undefined && loopBuffer[p].currentSource!=undefined)
loopBuffer[p].currentSource.start(0);
showControls(fnum);
});
}
else
{
resetControls(fnum);
hideControls(fnum);
loopBuffer[fnum].currentSource.stop();
loopBuffer[fnum] = undefined;
$("#levelMeter"+fnum).css("top", $("#volumePad"+p).css("bottom")).css("height", "0px");
}
}
function filterPad(ev)
{
fnum = parseInt(ev.target.id.replace("filterPadTouch", ""));
cursObj = $("#filterPadCursor"+fnum);
var posx = Math.min(Math.max(ev.center.x - $(ev.target).offset().left + $(ev.target).scrollLeft() - cursObj.width()/2, 0), padUsableSize);
var posy = Math.min(Math.max(ev.center.y - $(ev.target).offset().top + $(window).scrollTop() - cursObj.height()/2, 0), padUsableSize);
cursObj.css("left", String(posx)+"px").css("top", "calc("+String(posy)+"px - "+padSize+"vw)");
res = maxRes*posx/padUsableSize;
freq = startFreq + Math.pow(1-posy/padUsableSize, freqPow)*(endFreq - startFreq);
loopBuffer[fnum].filterNode.frequency.value = freq;
loopBuffer[fnum].filterNode.Q.value = res;
}
function volumePad(ev)
{
fnum = parseInt(ev.target.id.replace("volumePadTouch", ""));
cursObj = $("#volumePadCursor"+fnum);
var posy = Math.min(Math.max(ev.center.y - $(ev.target).offset().top + $(window).scrollTop() - cursObj.height()/2, 0), padUsableSize);
cursObj.css("top", "calc("+String(posy)+"px - "+padSize+"vw)");
amp = 1-posy/padUsableSize;
if (loopBuffer[fnum].isMute)
loopBuffer[fnum].tempAmp = (Math.exp(amp) - 1)/(Math.E - 1);
else
loopBuffer[fnum].gainNode.gain.value = (Math.exp(amp) - 1)/(Math.E - 1);
}
function panPad(ev)
{
fnum = parseInt(ev.target.id.replace("panPadTouch", ""));
cursObj = $("#panPadCursor"+fnum);
var posx = Math.min(Math.max(ev.center.x - $(ev.target).offset().left + $(ev.target).scrollLeft() - cursObj.width()/2, 0), padUsableSize);
cursObj.css("left", String(posx)+"px");
pan = 2*(posx/padUsableSize) - 1;
loopBuffer[fnum].panner.pan.value = pan;
}
function equalizerRotate(ev)
{
eqId2 = ev.target.id.replace("eqBandCursor", "").replace("loopControls", "");
eqIda = eqId2.split("-");
eqId = eqIda[0];
fnum = eqIda[1];
if (loopBuffer[fnum]==undefined)
return;
angle = -Math.min(Math.max(-$(ev.target).attr("angle") + (ev.center.y - $(ev.target).offset().top + $(window).scrollTop() - $(ev.target).height()/2 - 10)/equalizer.pixelsPerDegree, -equalizer.maxAngle), equalizer.maxAngle);
$(ev.target).css("transform", "rotate("+angle+"deg)");
boost = equalizer.bands[eqId].boost*angle/equalizer.maxAngle;
loopBuffer[fnum].eqFilters[eqId].gain.value = boost;
}
function equalizerRotateEnd(ev)
{
if (loopBuffer[fnum]==undefined)
return;
angle = -Math.min(Math.max(-$(ev.target).attr("angle") + (ev.center.y - $(ev.target).offset().top + $(window).scrollTop() - $(ev.target).height()/2)/equalizer.pixelsPerDegree, -equalizer.maxAngle), equalizer.maxAngle);
$(ev.target).attr("angle", angle);
}
function equalizerRotateReset(ev)
{
eqId2 = ev.target.id.replace("eqBandCursor", "").replace("loopControls", "");
eqIda = eqId2.split("-");
eqId = eqIda[0];
fnum = eqIda[1];
$(ev.target).css("transform", "rotate(0deg)");
loopBuffer[fnum].eqFilters[eqId].gain.value = 0;
$(ev.target).attr("angle", 0);
}
function setFilterType(type, fnum)
{
loopBuffer[fnum].filterNode.type = type;
if (type=="lowpass")
{
$("#lowpassSwitch"+fnum).addClass("filterTypeSwitch-selected");
$("#bandpassSwitch"+fnum).removeClass("filterTypeSwitch-selected");
$("#highpassSwitch"+fnum).removeClass("filterTypeSwitch-selected");
$("#filterPad"+fnum).removeClass("filterPad-bandpass").removeClass("filterPad-highpass").addClass("filterPad-lowpass");
maxRes = maxResLp;
}
if (type=="bandpass")
{
$("#bandpassSwitch"+fnum).addClass("filterTypeSwitch-selected");
$("#lowpassSwitch"+fnum).removeClass("filterTypeSwitch-selected");
$("#highpassSwitch"+fnum).removeClass("filterTypeSwitch-selected");
$("#filterPad"+fnum).addClass("filterPad-bandpass").removeClass("filterPad-highpass").removeClass("filterPad-lowpass");
maxRes = maxResBp;
}
if (type=="highpass")
{
$("#highpassSwitch"+fnum).addClass("filterTypeSwitch-selected");
$("#bandpassSwitch"+fnum).removeClass("filterTypeSwitch-selected");
$("#lowpassSwitch"+fnum).removeClass("filterTypeSwitch-selected");
$("#filterPad"+fnum).removeClass("filterPad-bandpass").addClass("filterPad-highpass").removeClass("filterPad-lowpass");
maxRes = maxResHp;
}
}
function muteChannel(fnum, mute)
{
if (loopBuffer[fnum]==undefined)
return;
if (mute)
{
$("#soundButton"+fnum).css("background-image", "url('gfx/SoundOn.svg')");
$("#soundButton"+fnum).css("background-size", String(cursorSize*0.97)+"vw");
$("#soundButton"+fnum).css("background-position", "40% 50%");
if (loopBuffer[fnum].gainNode!=undefined)
{
loopBuffer[fnum].tempAmp = loopBuffer[fnum].gainNode.gain.value;
loopBuffer[fnum].gainNode.gain.value = 0;
}
$("#filterPadLabel"+fnum).addClass("padLabel-muted");
}
else
{
$("#soundButton"+fnum).css("background-image", "url('gfx/SoundOff.svg')");
$("#soundButton"+fnum).css("background-size", String(cursorSize)*1.01+"vw");
$("#soundButton"+fnum).css("background-position", "50% 50%");
if (loopBuffer[fnum].gainNode!=undefined)
{
if (loopBuffer[fnum].tempAmp!=undefined)
loopBuffer[fnum].gainNode.gain.value = loopBuffer[fnum].tempAmp;
}
$("#filterPadLabel"+fnum).removeClass("padLabel-muted");
}
}
function soloChannel(fnum)
{
allMuted = true;
for (p=1; p<=nbTracks; p++)
{
if (loopBuffer[p]!=undefined)
{
if (loopBuffer[p].isMute!=undefined)
{
if (p==fnum)
{
if (loopBuffer[p].isMute)
{
loopBuffer[p].isMute = false;
muteChannel(p, loopBuffer[p].isMute);
}
}
else
{
if (!loopBuffer[p].isMute)
{
loopBuffer[p].isMute = true;
muteChannel(p, loopBuffer[p].isMute);
}
}
}
}
}
}
function drawLevels()
{
requestAnimationFrame(drawLevels);
levelSum2 = 0;
nbTracks2 = 0;
for (p=1; p<=nbTracks; p++)
{
if (loopBuffer[p]!=undefined)
{
if (loopBuffer[p].analyser!=undefined)
{
nbTracks2++;
var frequencyData = new Uint8Array(loopBuffer[p].analyser.frequencyBinCount);
loopBuffer[p].analyser.getByteFrequencyData(frequencyData);
levelSum = 0;
for (i=0; i0)
{
var lmPreset = {
name: presetName,
bpm: bpm,
tracks: lmPresets
};
//alert(JSON.stringify(lmPreset));
return JSON.stringify(lmPreset);
}
}
function savePreset(presetName, nomessage)
{
if (nomessage==null)
nomessage = false;
lmPresetT = getPresetT(presetName);
if (lmPresetT>"")
{
localStorage[lsPresetKey+presetName] = lmPresetT;
if (!nomessage)
alert(texts.presetSaved);
$("#presetLabel").html(texts.preset + presetName);
currentPreset = presetName;
}
}
function exportCurrentSettings()
{
var pos1;
var eUrl = "";
presetName = currentPreset>""?currentPreset:"Export";
lmPresetT = getPresetT(presetName);
if (lmPresetT>"")
{
pos1 = window.location.href.indexOf("?settings=");
if (pos1>-1)
eUrl = window.location.href.substr(0, pos1);
else
eUrl = window.location.href
if (builtinPreset)
eUrl+= "?settings="+currentPreset.split(" ").join("");
else
eUrl+= "?settings="+btoa(lmPresetT);
history.pushState({preset: presetName}, '', eUrl);
alert(texts.presetExported);
}
}
function getPresetsList()
{
sLista = [];
sList = "";
$.each(builtinPresets, function(key, value)
{
sLista.push("BIP_"+key);
});
$.each(localStorage, function(key, value)
{
if (key.indexOf(lsPresetKey)!=-1)
sLista.push(key);
});
sLista.sort();
if (sLista.length==0)
sList+= ""+texts.noPreset+" ";
else
{
sList+= ""+texts.loadPrompt+" ";
$.each(sLista, function(key, value)
{
if(value.substr(0, 4)=="BIP_")
{
deleteButton = "";
piclass = "presetItem presetItem_bip";
}
else
{
deleteButton = "
";
piclass = "presetItem";
}
presetName = value.replace(lsPresetKey, "").replace("BIP_", "");
sList+= ""+presetName+deleteButton+" ";
});
sList+= " ";
}
$("#presets").fadeIn(200);
$("#presets").html(sList);
}
function resetAll()
{
$("#resetButton").addClass("SquareButton_inactive");
$("#saveButton").addClass("SquareButton_inactive");
$("#exportButton").addClass("SquareButton_inactive");
currentPreset = "";
$("#presetLabel").html("");
bpm = bpm0;
posx = padUsableSize * ((bpm - minBpm)/(maxBpm - minBpm)) + $("#bpmPad").offset().left - $("#bpmPadCursor").width()/2;
$("#bpmPadCursor").css("top", String(-cursorSize-0.52)+"vw").css("left", String(posx)+"px");
$("#bpmInput")[0].value = bpm;
builtinPreset = false;
for (p=1; p<=nbTracks; p++)
{
$("#loopSelect"+p)[0].value = "";
loopUrl[p] = "";
resetControls(p);
hideControls(p);
if (loopBuffer[p]!=undefined)
{
setFilterType("lowpass", p);
if (loopBuffer[p].currentSource!=undefined)
loopBuffer[p].currentSource.stop();
loopBuffer[p] = undefined;
$("#levelMeter"+p).css("top", $("#volumePad"+p).css("bottom")).css("height", "0px");
}
}
var pos1 = window.location.href.indexOf("?settings=");
if (pos1>-1)
{
var eUrl = window.location.href.substr(0, pos1);
history.pushState({preset: "new"}, '', eUrl);
}
}
function loadPreset(presetDat)
{
setWCursor(true);
if (presetDat>"")
{
var presetObj = $.parseJSON(presetDat);
$("#presetLabel").html(texts.preset + presetObj.name);
currentPreset = presetObj.name;
for (p=1; p<=nbTracks; p++)
{
$("#loopSelect"+p)[0].value = "";
if (loopBuffer[p]!=undefined)
{
resetControls(p);
hideControls(p);
if (loopBuffer[p].currentSource!=undefined)
loopBuffer[p].currentSource.stop();
loopBuffer[p] = undefined;
$("#levelMeter"+p).css("top", $("#volumePad"+p).css("bottom")).css("height", "0px");
}
var trackDat = presetObj.tracks[p];
if (trackDat!=undefined && trackDat.url!=undefined)
loopUrl[p] = trackDat.url;
}
var nbBands = equalizer.nbBands();
soundN = 1;
loadSounds(function()
{
for (p=1; p<=nbTracks; p++)
{
var trackDat = presetObj.tracks[p];
if (loopBuffer[p]!=undefined && trackDat!=null)
{
if (trackDat.url!=undefined)
{
if($("#loopSelect"+p)[0]!=undefined)
$("#loopSelect"+p)[0].value = trackDat.url;
playSound(loopBuffer[p], getPbr(p), 0, trackDat.ffreq, trackDat.pan, true, equalizer);
loopBuffer[p].filterNode.Q.value = trackDat.fres;
setFilterType(trackDat.ftype, p);
posx = padUsableSize*trackDat.fres/maxRes;
posy = padUsableSize*(1- Math.pow((trackDat.ffreq - startFreq)/(endFreq - startFreq), 1/freqPow));
$("#filterPadCursor"+p).css("left", String(posx)+"px").css("top", "calc("+String(posy)+"px - "+padSize+"vw)");
loopBuffer[p].isMute = trackDat.isMute;
if (loopBuffer[p].isMute)
{
$("#soundButton"+p).css("background-image", "url('gfx/SoundOn.svg')").css("background-size", String(cursorSize*0.97)+"vw").css("background-position", "40% 50%");
loopBuffer[p].tempAmp = trackDat.volume;
loopBuffer[p].gainNode.gain.value = 0;
}
else
{
$("#soundButton"+p).css("background-image", "url('gfx/SoundOff.svg')").css("background-size", String(cursorSize)*1.01+"vw").css("background-position", "50% 50%");
loopBuffer[p].gainNode.gain.value = trackDat.volume;
}
amp = Math.log(1 + (Math.E - 1)*trackDat.volume);
posy = (1 - amp) * padUsableSize;
$("#volumePadCursor"+p).css("top", "calc("+String(posy)+"px - "+padSize+"vw)");
posx = padUsableSize*(parseFloat(trackDat.pan) + 1)/2
$("#panPadCursor"+p).css("left", String(posx)+"px");
for (b=1; b<=nbBands; b++)
{
loopBuffer[p].eqFilters[b].gain.value = trackDat.eqValues[b].boost;
angle = trackDat.eqValues[b].boost*equalizer.maxAngle/equalizer.bands[b].boost;
$("#eqBandCursor"+b+"-loopControls"+p).css("transform", "rotate("+angle+"deg)");
}
showControls(p);
}
}
}
bpm = presetObj.bpm;
setBpm();
posx = padUsableSize * ((bpm - minBpm)/(maxBpm - minBpm)) + $("#bpmPad").offset().left - $("#bpmPadCursor").width()/2;
$("#bpmPadCursor").css("top", String(-cursorSize-0.52)+"vw").css("left", String(posx)+"px");
$("#bpmInput")[0].value = bpm;
for (p=1; p<=nbTracks; p++)
if(loopBuffer[p]!=undefined && loopBuffer[p].currentSource!=undefined)
loopBuffer[p].currentSource.start(0);
$("#resetButton").removeClass("SquareButton_inactive");
$("#saveButton").removeClass("SquareButton_inactive");
$("#exportButton").removeClass("SquareButton_inactive");
setWCursor(false);
});
}
}
function removePreset(presetName)
{
if (confirm(texts.delConf))
localStorage.removeItem(presetName);
}
function getParameterByName(name)
{
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^]*)"),
results = regex.exec(location.search);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
function setWCursor(bwait)
{
if (bwait)
$("html").addClass("wait");
else
$("html").removeClass("wait");
}