// // audioReflectorTools.js // hifi // // Created by Brad Hefta-Gaub on 2/14/14. // Copyright (c) 2014 HighFidelity, Inc. All rights reserved. // // Tools for manipulating the attributes of the AudioReflector behavior // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // Script.include("libraries/globals.js"); var delayScale = 100.0; var fanoutScale = 10.0; var speedScale = 20; var factorScale = 5.0; var localFactorScale = 1.0; var reflectiveScale = 100.0; var diffusionScale = 100.0; var absorptionScale = 100.0; var combFilterScale = 50.0; var originalScale = 2.0; var echoesScale = 2.0; // these three properties are bound together, if you change one, the others will also change var reflectiveRatio = AudioReflector.getReflectiveRatio(); var diffusionRatio = AudioReflector.getDiffusionRatio(); var absorptionRatio = AudioReflector.getAbsorptionRatio(); var reflectiveThumbX; var diffusionThumbX; var absorptionThumbX; function setReflectiveRatio(reflective) { var total = diffusionRatio + absorptionRatio + (reflective / reflectiveScale); diffusionRatio = diffusionRatio / total; absorptionRatio = absorptionRatio / total; reflectiveRatio = (reflective / reflectiveScale) / total; updateRatioValues(); } function setDiffusionRatio(diffusion) { var total = (diffusion / diffusionScale) + absorptionRatio + reflectiveRatio; diffusionRatio = (diffusion / diffusionScale) / total; absorptionRatio = absorptionRatio / total; reflectiveRatio = reflectiveRatio / total; updateRatioValues(); } function setAbsorptionRatio(absorption) { var total = diffusionRatio + (absorption / absorptionScale) + reflectiveRatio; diffusionRatio = diffusionRatio / total; absorptionRatio = (absorption / absorptionScale) / total; reflectiveRatio = reflectiveRatio / total; updateRatioValues(); } function updateRatioSliders() { reflectiveThumbX = reflectiveMinThumbX + ((reflectiveMaxThumbX - reflectiveMinThumbX) * reflectiveRatio); diffusionThumbX = diffusionMinThumbX + ((diffusionMaxThumbX - diffusionMinThumbX) * diffusionRatio); absorptionThumbX = absorptionMinThumbX + ((absorptionMaxThumbX - absorptionMinThumbX) * absorptionRatio); Overlays.editOverlay(reflectiveThumb, { x: reflectiveThumbX } ); Overlays.editOverlay(diffusionThumb, { x: diffusionThumbX } ); Overlays.editOverlay(absorptionThumb, { x: absorptionThumbX } ); } function updateRatioValues() { AudioReflector.setReflectiveRatio(reflectiveRatio); AudioReflector.setDiffusionRatio(diffusionRatio); AudioReflector.setAbsorptionRatio(absorptionRatio); } var topY = 250; var sliderHeight = 35; var delayY = topY; topY += sliderHeight; var delayLabel = Overlays.addOverlay("text", { x: 40, y: delayY, width: 60, height: sliderHeight, color: { red: 0, green: 0, blue: 0}, textColor: { red: 255, green: 255, blue: 255}, topMargin: 12, leftMargin: 5, text: "Delay:" }); var delaySlider = Overlays.addOverlay("image", { // alternate form of expressing bounds bounds: { x: 100, y: delayY, width: 150, height: sliderHeight}, subImage: { x: 46, y: 0, width: 200, height: 71 }, imageURL: HIFI_PUBLIC_BUCKET + "images/slider.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var delayMinThumbX = 110; var delayMaxThumbX = delayMinThumbX + 110; var delayThumbX = delayMinThumbX + ((delayMaxThumbX - delayMinThumbX) * (AudioReflector.getPreDelay() / delayScale)); var delayThumb = Overlays.addOverlay("image", { x: delayThumbX, y: delayY + 9, width: 18, height: 17, imageURL: HIFI_PUBLIC_BUCKET + "images/thumb.png", color: { red: 255, green: 0, blue: 0}, alpha: 1 }); var fanoutY = topY; topY += sliderHeight; var fanoutLabel = Overlays.addOverlay("text", { x: 40, y: fanoutY, width: 60, height: sliderHeight, color: { red: 0, green: 0, blue: 0}, textColor: { red: 255, green: 255, blue: 255}, topMargin: 12, leftMargin: 5, text: "Fanout:" }); var fanoutSlider = Overlays.addOverlay("image", { // alternate form of expressing bounds bounds: { x: 100, y: fanoutY, width: 150, height: sliderHeight}, subImage: { x: 46, y: 0, width: 200, height: 71 }, imageURL: HIFI_PUBLIC_BUCKET + "images/slider.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var fanoutMinThumbX = 110; var fanoutMaxThumbX = fanoutMinThumbX + 110; var fanoutThumbX = fanoutMinThumbX + ((fanoutMaxThumbX - fanoutMinThumbX) * (AudioReflector.getDiffusionFanout() / fanoutScale)); var fanoutThumb = Overlays.addOverlay("image", { x: fanoutThumbX, y: fanoutY + 9, width: 18, height: 17, imageURL: HIFI_PUBLIC_BUCKET + "images/thumb.png", color: { red: 255, green: 255, blue: 0}, alpha: 1 }); var speedY = topY; topY += sliderHeight; var speedLabel = Overlays.addOverlay("text", { x: 40, y: speedY, width: 60, height: sliderHeight, color: { red: 0, green: 0, blue: 0}, textColor: { red: 255, green: 255, blue: 255}, topMargin: 6, leftMargin: 5, text: "Speed\nin ms/m:" }); var speedSlider = Overlays.addOverlay("image", { // alternate form of expressing bounds bounds: { x: 100, y: speedY, width: 150, height: sliderHeight}, subImage: { x: 46, y: 0, width: 200, height: 71 }, imageURL: HIFI_PUBLIC_BUCKET + "images/slider.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var speedMinThumbX = 110; var speedMaxThumbX = speedMinThumbX + 110; var speedThumbX = speedMinThumbX + ((speedMaxThumbX - speedMinThumbX) * (AudioReflector.getSoundMsPerMeter() / speedScale)); var speedThumb = Overlays.addOverlay("image", { x: speedThumbX, y: speedY+9, width: 18, height: 17, imageURL: HIFI_PUBLIC_BUCKET + "images/thumb.png", color: { red: 0, green: 255, blue: 0}, alpha: 1 }); var factorY = topY; topY += sliderHeight; var factorLabel = Overlays.addOverlay("text", { x: 40, y: factorY, width: 60, height: sliderHeight, color: { red: 0, green: 0, blue: 0}, textColor: { red: 255, green: 255, blue: 255}, topMargin: 6, leftMargin: 5, text: "Attenuation\nFactor:" }); var factorSlider = Overlays.addOverlay("image", { // alternate form of expressing bounds bounds: { x: 100, y: factorY, width: 150, height: sliderHeight}, subImage: { x: 46, y: 0, width: 200, height: 71 }, imageURL: HIFI_PUBLIC_BUCKET + "images/slider.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var factorMinThumbX = 110; var factorMaxThumbX = factorMinThumbX + 110; var factorThumbX = factorMinThumbX + ((factorMaxThumbX - factorMinThumbX) * (AudioReflector.getDistanceAttenuationScalingFactor() / factorScale)); var factorThumb = Overlays.addOverlay("image", { x: factorThumbX, y: factorY+9, width: 18, height: 17, imageURL: HIFI_PUBLIC_BUCKET + "images/thumb.png", color: { red: 0, green: 0, blue: 255}, alpha: 1 }); var localFactorY = topY; topY += sliderHeight; var localFactorLabel = Overlays.addOverlay("text", { x: 40, y: localFactorY, width: 60, height: sliderHeight, color: { red: 0, green: 0, blue: 0}, textColor: { red: 255, green: 255, blue: 255}, topMargin: 6, leftMargin: 5, text: "Local\nFactor:" }); var localFactorSlider = Overlays.addOverlay("image", { // alternate form of expressing bounds bounds: { x: 100, y: localFactorY, width: 150, height: sliderHeight}, subImage: { x: 46, y: 0, width: 200, height: 71 }, imageURL: HIFI_PUBLIC_BUCKET + "images/slider.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var localFactorMinThumbX = 110; var localFactorMaxThumbX = localFactorMinThumbX + 110; var localFactorThumbX = localFactorMinThumbX + ((localFactorMaxThumbX - localFactorMinThumbX) * (AudioReflector.getLocalAudioAttenuationFactor() / localFactorScale)); var localFactorThumb = Overlays.addOverlay("image", { x: localFactorThumbX, y: localFactorY+9, width: 18, height: 17, imageURL: HIFI_PUBLIC_BUCKET + "images/thumb.png", color: { red: 0, green: 128, blue: 128}, alpha: 1 }); var combFilterY = topY; topY += sliderHeight; var combFilterLabel = Overlays.addOverlay("text", { x: 40, y: combFilterY, width: 60, height: sliderHeight, color: { red: 0, green: 0, blue: 0}, textColor: { red: 255, green: 255, blue: 255}, topMargin: 6, leftMargin: 5, text: "Comb Filter\nWindow:" }); var combFilterSlider = Overlays.addOverlay("image", { // alternate form of expressing bounds bounds: { x: 100, y: combFilterY, width: 150, height: sliderHeight}, subImage: { x: 46, y: 0, width: 200, height: 71 }, imageURL: HIFI_PUBLIC_BUCKET + "images/slider.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var combFilterMinThumbX = 110; var combFilterMaxThumbX = combFilterMinThumbX + 110; var combFilterThumbX = combFilterMinThumbX + ((combFilterMaxThumbX - combFilterMinThumbX) * (AudioReflector.getCombFilterWindow() / combFilterScale)); var combFilterThumb = Overlays.addOverlay("image", { x: combFilterThumbX, y: combFilterY+9, width: 18, height: 17, imageURL: HIFI_PUBLIC_BUCKET + "images/thumb.png", color: { red: 128, green: 128, blue: 0}, alpha: 1 }); var reflectiveY = topY; topY += sliderHeight; var reflectiveLabel = Overlays.addOverlay("text", { x: 40, y: reflectiveY, width: 60, height: sliderHeight, color: { red: 0, green: 0, blue: 0}, textColor: { red: 255, green: 255, blue: 255}, topMargin: 6, leftMargin: 5, text: "Reflective\nRatio:" }); var reflectiveSlider = Overlays.addOverlay("image", { // alternate form of expressing bounds bounds: { x: 100, y: reflectiveY, width: 150, height: sliderHeight}, subImage: { x: 46, y: 0, width: 200, height: 71 }, imageURL: HIFI_PUBLIC_BUCKET + "images/slider.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var reflectiveMinThumbX = 110; var reflectiveMaxThumbX = reflectiveMinThumbX + 110; reflectiveThumbX = reflectiveMinThumbX + ((reflectiveMaxThumbX - reflectiveMinThumbX) * AudioReflector.getReflectiveRatio()); var reflectiveThumb = Overlays.addOverlay("image", { x: reflectiveThumbX, y: reflectiveY+9, width: 18, height: 17, imageURL: HIFI_PUBLIC_BUCKET + "images/thumb.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var diffusionY = topY; topY += sliderHeight; var diffusionLabel = Overlays.addOverlay("text", { x: 40, y: diffusionY, width: 60, height: sliderHeight, color: { red: 0, green: 0, blue: 0}, textColor: { red: 255, green: 255, blue: 255}, topMargin: 6, leftMargin: 5, text: "Diffusion\nRatio:" }); var diffusionSlider = Overlays.addOverlay("image", { // alternate form of expressing bounds bounds: { x: 100, y: diffusionY, width: 150, height: sliderHeight}, subImage: { x: 46, y: 0, width: 200, height: 71 }, imageURL: HIFI_PUBLIC_BUCKET + "images/slider.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var diffusionMinThumbX = 110; var diffusionMaxThumbX = diffusionMinThumbX + 110; diffusionThumbX = diffusionMinThumbX + ((diffusionMaxThumbX - diffusionMinThumbX) * AudioReflector.getDiffusionRatio()); var diffusionThumb = Overlays.addOverlay("image", { x: diffusionThumbX, y: diffusionY+9, width: 18, height: 17, imageURL: HIFI_PUBLIC_BUCKET + "images/thumb.png", color: { red: 0, green: 255, blue: 255}, alpha: 1 }); var absorptionY = topY; topY += sliderHeight; var absorptionLabel = Overlays.addOverlay("text", { x: 40, y: absorptionY, width: 60, height: sliderHeight, color: { red: 0, green: 0, blue: 0}, textColor: { red: 255, green: 255, blue: 255}, topMargin: 6, leftMargin: 5, text: "Absorption\nRatio:" }); var absorptionSlider = Overlays.addOverlay("image", { // alternate form of expressing bounds bounds: { x: 100, y: absorptionY, width: 150, height: sliderHeight}, subImage: { x: 46, y: 0, width: 200, height: 71 }, imageURL: HIFI_PUBLIC_BUCKET + "images/slider.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var absorptionMinThumbX = 110; var absorptionMaxThumbX = absorptionMinThumbX + 110; absorptionThumbX = absorptionMinThumbX + ((absorptionMaxThumbX - absorptionMinThumbX) * AudioReflector.getAbsorptionRatio()); var absorptionThumb = Overlays.addOverlay("image", { x: absorptionThumbX, y: absorptionY+9, width: 18, height: 17, imageURL: HIFI_PUBLIC_BUCKET + "images/thumb.png", color: { red: 255, green: 0, blue: 255}, alpha: 1 }); var originalY = topY; topY += sliderHeight; var originalLabel = Overlays.addOverlay("text", { x: 40, y: originalY, width: 60, height: sliderHeight, color: { red: 0, green: 0, blue: 0}, textColor: { red: 255, green: 255, blue: 255}, topMargin: 6, leftMargin: 5, text: "Original\nMix:" }); var originalSlider = Overlays.addOverlay("image", { // alternate form of expressing bounds bounds: { x: 100, y: originalY, width: 150, height: sliderHeight}, subImage: { x: 46, y: 0, width: 200, height: 71 }, imageURL: HIFI_PUBLIC_BUCKET + "images/slider.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var originalMinThumbX = 110; var originalMaxThumbX = originalMinThumbX + 110; var originalThumbX = originalMinThumbX + ((originalMaxThumbX - originalMinThumbX) * (AudioReflector.getOriginalSourceAttenuation() / originalScale)); var originalThumb = Overlays.addOverlay("image", { x: originalThumbX, y: originalY+9, width: 18, height: 17, imageURL: HIFI_PUBLIC_BUCKET + "images/thumb.png", color: { red: 128, green: 128, blue: 0}, alpha: 1 }); var echoesY = topY; topY += sliderHeight; var echoesLabel = Overlays.addOverlay("text", { x: 40, y: echoesY, width: 60, height: sliderHeight, color: { red: 0, green: 0, blue: 0}, textColor: { red: 255, green: 255, blue: 255}, topMargin: 6, leftMargin: 5, text: "Echoes\nMix:" }); var echoesSlider = Overlays.addOverlay("image", { // alternate form of expressing bounds bounds: { x: 100, y: echoesY, width: 150, height: sliderHeight}, subImage: { x: 46, y: 0, width: 200, height: 71 }, imageURL: HIFI_PUBLIC_BUCKET + "images/slider.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var echoesMinThumbX = 110; var echoesMaxThumbX = echoesMinThumbX + 110; var echoesThumbX = echoesMinThumbX + ((echoesMaxThumbX - echoesMinThumbX) * (AudioReflector.getEchoesAttenuation() / echoesScale)); var echoesThumb = Overlays.addOverlay("image", { x: echoesThumbX, y: echoesY+9, width: 18, height: 17, imageURL: HIFI_PUBLIC_BUCKET + "images/thumb.png", color: { red: 128, green: 128, blue: 0}, alpha: 1 }); // When our script shuts down, we should clean up all of our overlays function scriptEnding() { Overlays.deleteOverlay(factorLabel); Overlays.deleteOverlay(factorThumb); Overlays.deleteOverlay(factorSlider); Overlays.deleteOverlay(combFilterLabel); Overlays.deleteOverlay(combFilterThumb); Overlays.deleteOverlay(combFilterSlider); Overlays.deleteOverlay(localFactorLabel); Overlays.deleteOverlay(localFactorThumb); Overlays.deleteOverlay(localFactorSlider); Overlays.deleteOverlay(speedLabel); Overlays.deleteOverlay(speedThumb); Overlays.deleteOverlay(speedSlider); Overlays.deleteOverlay(delayLabel); Overlays.deleteOverlay(delayThumb); Overlays.deleteOverlay(delaySlider); Overlays.deleteOverlay(fanoutLabel); Overlays.deleteOverlay(fanoutThumb); Overlays.deleteOverlay(fanoutSlider); Overlays.deleteOverlay(reflectiveLabel); Overlays.deleteOverlay(reflectiveThumb); Overlays.deleteOverlay(reflectiveSlider); Overlays.deleteOverlay(diffusionLabel); Overlays.deleteOverlay(diffusionThumb); Overlays.deleteOverlay(diffusionSlider); Overlays.deleteOverlay(absorptionLabel); Overlays.deleteOverlay(absorptionThumb); Overlays.deleteOverlay(absorptionSlider); Overlays.deleteOverlay(echoesLabel); Overlays.deleteOverlay(echoesThumb); Overlays.deleteOverlay(echoesSlider); Overlays.deleteOverlay(originalLabel); Overlays.deleteOverlay(originalThumb); Overlays.deleteOverlay(originalSlider); } Script.scriptEnding.connect(scriptEnding); var count = 0; // Our update() function is called at approximately 60fps, and we will use it to animate our various overlays function update(deltaTime) { count++; } Script.update.connect(update); // The slider is handled in the mouse event callbacks. var movingSliderDelay = false; var movingSliderFanout = false; var movingSliderSpeed = false; var movingSliderFactor = false; var movingSliderCombFilter = false; var movingSliderLocalFactor = false; var movingSliderReflective = false; var movingSliderDiffusion = false; var movingSliderAbsorption = false; var movingSliderOriginal = false; var movingSliderEchoes = false; var thumbClickOffsetX = 0; function mouseMoveEvent(event) { if (movingSliderDelay) { newThumbX = event.x - thumbClickOffsetX; if (newThumbX < delayMinThumbX) { newThumbX = delayMinThumbX; } if (newThumbX > delayMaxThumbX) { newThumbX = delayMaxThumbX; } Overlays.editOverlay(delayThumb, { x: newThumbX } ); var delay = ((newThumbX - delayMinThumbX) / (delayMaxThumbX - delayMinThumbX)) * delayScale; AudioReflector.setPreDelay(delay); } if (movingSliderFanout) { newThumbX = event.x - thumbClickOffsetX; if (newThumbX < fanoutMinThumbX) { newThumbX = fanoutMinThumbX; } if (newThumbX > fanoutMaxThumbX) { newThumbX = fanoutMaxThumbX; } Overlays.editOverlay(fanoutThumb, { x: newThumbX } ); var fanout = Math.round(((newThumbX - fanoutMinThumbX) / (fanoutMaxThumbX - fanoutMinThumbX)) * fanoutScale); AudioReflector.setDiffusionFanout(fanout); } if (movingSliderSpeed) { newThumbX = event.x - thumbClickOffsetX; if (newThumbX < speedMinThumbX) { newThumbX = speedMminThumbX; } if (newThumbX > speedMaxThumbX) { newThumbX = speedMaxThumbX; } Overlays.editOverlay(speedThumb, { x: newThumbX } ); var speed = ((newThumbX - speedMinThumbX) / (speedMaxThumbX - speedMinThumbX)) * speedScale; AudioReflector.setSoundMsPerMeter(speed); } if (movingSliderFactor) { newThumbX = event.x - thumbClickOffsetX; if (newThumbX < factorMinThumbX) { newThumbX = factorMminThumbX; } if (newThumbX > factorMaxThumbX) { newThumbX = factorMaxThumbX; } Overlays.editOverlay(factorThumb, { x: newThumbX } ); var factor = ((newThumbX - factorMinThumbX) / (factorMaxThumbX - factorMinThumbX)) * factorScale; AudioReflector.setDistanceAttenuationScalingFactor(factor); } if (movingSliderCombFilter) { newThumbX = event.x - thumbClickOffsetX; if (newThumbX < combFilterMinThumbX) { newThumbX = combFilterMminThumbX; } if (newThumbX > combFilterMaxThumbX) { newThumbX = combFilterMaxThumbX; } Overlays.editOverlay(combFilterThumb, { x: newThumbX } ); var combFilter = ((newThumbX - combFilterMinThumbX) / (combFilterMaxThumbX - combFilterMinThumbX)) * combFilterScale; AudioReflector.setCombFilterWindow(combFilter); } if (movingSliderLocalFactor) { newThumbX = event.x - thumbClickOffsetX; if (newThumbX < localFactorMinThumbX) { newThumbX = localFactorMminThumbX; } if (newThumbX > localFactorMaxThumbX) { newThumbX = localFactorMaxThumbX; } Overlays.editOverlay(localFactorThumb, { x: newThumbX } ); var localFactor = ((newThumbX - localFactorMinThumbX) / (localFactorMaxThumbX - localFactorMinThumbX)) * localFactorScale; AudioReflector.setLocalAudioAttenuationFactor(localFactor); } if (movingSliderAbsorption) { newThumbX = event.x - thumbClickOffsetX; if (newThumbX < absorptionMinThumbX) { newThumbX = absorptionMminThumbX; } if (newThumbX > absorptionMaxThumbX) { newThumbX = absorptionMaxThumbX; } Overlays.editOverlay(absorptionThumb, { x: newThumbX } ); var absorption = ((newThumbX - absorptionMinThumbX) / (absorptionMaxThumbX - absorptionMinThumbX)) * absorptionScale; setAbsorptionRatio(absorption); } if (movingSliderReflective) { newThumbX = event.x - thumbClickOffsetX; if (newThumbX < reflectiveMinThumbX) { newThumbX = reflectiveMminThumbX; } if (newThumbX > reflectiveMaxThumbX) { newThumbX = reflectiveMaxThumbX; } Overlays.editOverlay(reflectiveThumb, { x: newThumbX } ); var reflective = ((newThumbX - reflectiveMinThumbX) / (reflectiveMaxThumbX - reflectiveMinThumbX)) * reflectiveScale; setReflectiveRatio(reflective); } if (movingSliderDiffusion) { newThumbX = event.x - thumbClickOffsetX; if (newThumbX < diffusionMinThumbX) { newThumbX = diffusionMminThumbX; } if (newThumbX > diffusionMaxThumbX) { newThumbX = diffusionMaxThumbX; } Overlays.editOverlay(diffusionThumb, { x: newThumbX } ); var diffusion = ((newThumbX - diffusionMinThumbX) / (diffusionMaxThumbX - diffusionMinThumbX)) * diffusionScale; setDiffusionRatio(diffusion); } if (movingSliderEchoes) { newThumbX = event.x - thumbClickOffsetX; if (newThumbX < echoesMinThumbX) { newThumbX = echoesMminThumbX; } if (newThumbX > echoesMaxThumbX) { newThumbX = echoesMaxThumbX; } Overlays.editOverlay(echoesThumb, { x: newThumbX } ); var echoes = ((newThumbX - echoesMinThumbX) / (echoesMaxThumbX - echoesMinThumbX)) * echoesScale; AudioReflector.setEchoesAttenuation(echoes); } if (movingSliderOriginal) { newThumbX = event.x - thumbClickOffsetX; if (newThumbX < originalMinThumbX) { newThumbX = originalMminThumbX; } if (newThumbX > originalMaxThumbX) { newThumbX = originalMaxThumbX; } Overlays.editOverlay(originalThumb, { x: newThumbX } ); var original = ((newThumbX - originalMinThumbX) / (originalMaxThumbX - originalMinThumbX)) * originalScale; AudioReflector.setOriginalSourceAttenuation(original); } } // we also handle click detection in our mousePressEvent() function mousePressEvent(event) { var clickedOverlay = Overlays.getOverlayAtPoint({x: event.x, y: event.y}); if (clickedOverlay == delayThumb) { movingSliderDelay = true; thumbClickOffsetX = event.x - delayThumbX; } if (clickedOverlay == fanoutThumb) { movingSliderFanout = true; thumbClickOffsetX = event.x - fanoutThumbX; } if (clickedOverlay == speedThumb) { movingSliderSpeed = true; thumbClickOffsetX = event.x - speedThumbX; } if (clickedOverlay == factorThumb) { movingSliderFactor = true; thumbClickOffsetX = event.x - factorThumbX; } if (clickedOverlay == localFactorThumb) { movingSliderLocalFactor = true; thumbClickOffsetX = event.x - localFactorThumbX; } if (clickedOverlay == combFilterThumb) { movingSliderCombFilter = true; thumbClickOffsetX = event.x - combFilterThumbX; } if (clickedOverlay == diffusionThumb) { movingSliderDiffusion = true; thumbClickOffsetX = event.x - diffusionThumbX; } if (clickedOverlay == absorptionThumb) { movingSliderAbsorption = true; thumbClickOffsetX = event.x - absorptionThumbX; } if (clickedOverlay == reflectiveThumb) { movingSliderReflective = true; thumbClickOffsetX = event.x - reflectiveThumbX; } if (clickedOverlay == originalThumb) { movingSliderOriginal = true; thumbClickOffsetX = event.x - originalThumbX; } if (clickedOverlay == echoesThumb) { movingSliderEchoes = true; thumbClickOffsetX = event.x - echoesThumbX; } } function mouseReleaseEvent(event) { if (movingSliderDelay) { movingSliderDelay = false; var delay = ((newThumbX - delayMinThumbX) / (delayMaxThumbX - delayMinThumbX)) * delayScale; AudioReflector.setPreDelay(delay); delayThumbX = newThumbX; } if (movingSliderFanout) { movingSliderFanout = false; var fanout = Math.round(((newThumbX - fanoutMinThumbX) / (fanoutMaxThumbX - fanoutMinThumbX)) * fanoutScale); AudioReflector.setDiffusionFanout(fanout); fanoutThumbX = newThumbX; } if (movingSliderSpeed) { movingSliderSpeed = false; var speed = ((newThumbX - speedMinThumbX) / (speedMaxThumbX - speedMinThumbX)) * speedScale; AudioReflector.setSoundMsPerMeter(speed); speedThumbX = newThumbX; } if (movingSliderFactor) { movingSliderFactor = false; var factor = ((newThumbX - factorMinThumbX) / (factorMaxThumbX - factorMinThumbX)) * factorScale; AudioReflector.setDistanceAttenuationScalingFactor(factor); factorThumbX = newThumbX; } if (movingSliderCombFilter) { movingSliderCombFilter = false; var combFilter = ((newThumbX - combFilterMinThumbX) / (combFilterMaxThumbX - combFilterMinThumbX)) * combFilterScale; AudioReflector.setCombFilterWindow(combFilter); combFilterThumbX = newThumbX; } if (movingSliderLocalFactor) { movingSliderLocalFactor = false; var localFactor = ((newThumbX - localFactorMinThumbX) / (localFactorMaxThumbX - localFactorMinThumbX)) * localFactorScale; AudioReflector.setLocalAudioAttenuationFactor(localFactor); localFactorThumbX = newThumbX; } if (movingSliderReflective) { movingSliderReflective = false; var reflective = ((newThumbX - reflectiveMinThumbX) / (reflectiveMaxThumbX - reflectiveMinThumbX)) * reflectiveScale; setReflectiveRatio(reflective); reflectiveThumbX = newThumbX; updateRatioSliders(); } if (movingSliderDiffusion) { movingSliderDiffusion = false; var diffusion = ((newThumbX - diffusionMinThumbX) / (diffusionMaxThumbX - diffusionMinThumbX)) * diffusionScale; setDiffusionRatio(diffusion); diffusionThumbX = newThumbX; updateRatioSliders(); } if (movingSliderAbsorption) { movingSliderAbsorption = false; var absorption = ((newThumbX - absorptionMinThumbX) / (absorptionMaxThumbX - absorptionMinThumbX)) * absorptionScale; setAbsorptionRatio(absorption); absorptionThumbX = newThumbX; updateRatioSliders(); } if (movingSliderEchoes) { movingSliderEchoes = false; var echoes = ((newThumbX - echoesMinThumbX) / (echoesMaxThumbX - echoesMinThumbX)) * echoesScale; AudioReflector.setEchoesAttenuation(echoes); echoesThumbX = newThumbX; } if (movingSliderOriginal) { movingSliderOriginal = false; var original = ((newThumbX - originalMinThumbX) / (originalMaxThumbX - originalMinThumbX)) * originalScale; AudioReflector.setOriginalSourceAttenuation(original); originalThumbX = newThumbX; } } Controller.mouseMoveEvent.connect(mouseMoveEvent); Controller.mousePressEvent.connect(mousePressEvent); Controller.mouseReleaseEvent.connect(mouseReleaseEvent);