// 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 = ""; 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
 
" } 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(""); $("#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"); }