AudioHTML/ducking.html

744 lines
39 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/app.css" rel="stylesheet">
<link href="css/roundslider.min.css" rel="stylesheet">
<script src="js/jquery-3.7.1.js"></script>
<script src="js/roundslider.min.js"></script>
</head>
<body class="h-100 text-center text-bg-dark content-warp">
<div class="d-flex w-100 h-100 mx-auto flex-column">
<header class="mb-auto pb-5">
<div class="dotblock d-flex justify-content-between px-5 py-4">
<div class="fs-3">GEAZAN</div>
<div></div>
</div>
<div class="fw-bold border-black nav-bar" style="position:relative;">
<div class="d-flex nav justify-content-center">
<div class="">
<a href="home.html">HOME</a>
</div>
<div class=""><a href="filter.html">FILTER</a></div>
<div class=""><a href="fs.html">FS</div>
<div class=""><a href="eq.html">EQ</a></div>
<div class="active"><a href="ducking.html">DUCKING</a></div>
<div class=""><a href="network.html">NETWORK</a></div>
<div class="">
<a href="security.html">SECURITY</a>
</div>
<div class=""><a href="control.html">CONTROL</a></div>
<div class="last "><a href="system.html">SYSTEM</a></div>
</div>
<div class="d-flex float-end ps-5 align-items-center" style="position:absolute; right: 10px;top: 3px;">
<button class="btn btn-dark border-black" id="blink">
<svg t="1699500251819" class="icon" viewBox="0 0 1024 1024" version="1.1"
xmlns="http://www.w3.org/2000/svg" p-id="4301" xmlns:xlink="http://www.w3.org/1999/xlink"
width="20" height="20">
<path
d="M513.3 239.9c-73.5 0-142.6 28.6-194.6 80.6-52 52-80.6 121.1-80.6 194.6s28.6 142.6 80.6 194.6c52 52 121.1 80.6 194.6 80.6s142.6-28.6 194.6-80.6c52-52 80.6-121.1 80.6-194.6s-28.6-142.6-80.6-194.6c-52-52-121.1-80.6-194.6-80.6z m0 482.3c-114.2 0-207.2-92.9-207.2-207.2S399 307.8 513.3 307.8c114.2 0 207.2 92.9 207.2 207.2s-92.9 207.2-207.2 207.2zM637.9 803.6H388.7c-18.8 0-34 15.2-34 34s15.2 34 34 34h249.2c18.8 0 34-15.2 34-34s-15.2-34-34-34zM588.1 885H438.6c-18.8 0-34 15.2-34 34s15.2 34 34 34h149.5c18.8 0 34-15.2 34-34s-15.2-34-34-34zM513.3 227.5c18.8 0 34-15.2 34-34V97c0-18.8-15.2-34-34-34s-34 15.2-34 34v96.5c0 18.7 15.2 34 34 34zM701.3 276.9c5.9 4.2 12.7 6.2 19.5 6.2 10.7 0 21.3-5.1 27.9-14.5l55.3-79c10.8-15.4 7-36.6-8.3-47.4-15.4-10.8-36.6-7-47.4 8.3l-55.3 79c-10.8 15.4-7.1 36.6 8.3 47.4zM938 357.6c-6.6-17.6-26.2-26.5-43.8-19.9l-90.4 33.8c-17.6 6.6-26.5 26.2-19.9 43.8 5.1 13.7 18.1 22.1 31.9 22.1 4 0 8-0.7 11.9-2.2l90.4-33.8c17.6-6.6 26.5-26.2 19.9-43.8zM283.4 252.5c6.6 9.4 17.2 14.5 27.9 14.5 6.7 0 13.5-2 19.5-6.2 15.4-10.8 19.1-32 8.3-47.4l-55.3-79c-10.8-15.4-32-19.1-47.4-8.3-15.4 10.8-19.1 32-8.3 47.4l55.3 79zM248.1 399.1c6.6-17.6-2.4-37.2-19.9-43.8l-90.4-33.8c-17.6-6.6-37.2 2.4-43.8 19.9-6.6 17.6 2.4 37.2 19.9 43.8l90.4 33.8c3.9 1.5 7.9 2.2 11.9 2.2 13.8 0 26.8-8.4 31.9-22.1z"
fill="#ffffff" p-id="4302" data-spm-anchor-id="a313x.search_index.0.i3.5b953a811enFNb"
class="selected"></path>
</svg>
</button>
</div>
</div>
</header>
<main class="px-3 d-flex justify-content-center">
<div class="content-container">
<div class="d-flex">
<div class="me-3"
style="border-left: 2px solid #000;border-right: 2px solid #000;border-bottom: 2px solid #000;">
<div class="divider">
<div class="divider-text"><span class="fw-bold">Priority</span></div>
</div>
<div class="p-3 d-flex justify-content-center">
<div style="width: 200px;">
<div class="d-flex justify-content-center align-items-center" style="height: 30px;">
<div class="d-flex redio-switche">
<input type="checkbox" class="btn-check" name="mic1" id="mic1">
<label class="btn btn-sm redio-btn on-btn" for="mic1">Mic1</label>
</div>
</div>
<div class="d-flex justify-content-center align-items-center" style="height: 30px;">
<div class="d-flex redio-switche">
<input type="checkbox" class="btn-check" name="mic2" id="mic2">
<label class="btn btn-sm redio-btn on-btn" for="mic2">Mic2</label>
</div>
</div>
</div>
</div>
</div>
<div class="me-3"
style="border-left: 2px solid #000;border-right: 2px solid #000;border-bottom: 2px solid #000;">
<div class="divider">
<div class="divider-text"><span class="fw-bold">Parameters</span></div>
</div>
<div class="p-3 d-flex justify-content-center">
<div class="d-flex">
<div class="volume-slider-container mx-3">
<div class="d-flex justify-content-center">
<div class="me-3" id="threshold">
<div class="d-flex justify-content-center align-items-center mb-3"
style="height: 30px;">
Threshold
</div>
<div class="d-flex justify-content-center">
<div class="volume-slider-box">
<div class="volume-slider">
<input type="range" orient="vertical" min="0" max="100"
step="0.01">
<div class="range-slider-bar" style="height: calc(45% + 15px);">
</div>
<div class="range-slider-thumb" style="bottom: 45%;"></div>
</div>
</div>
<div>
<section class="volume-ruler">
<section class="cm">
<span>0</span>
<section class="mm"></section>
</section>
<section class="cm">
<span>-10</span>
<section class="mm"></section>
</section>
<section class="cm">
<span>-20</span>
<section class="mm"></section>
</section>
<section class="cm">
<span>-30</span>
<section class="mm"></section>
</section>
<section class="cm">
<span>-40</span>
<section class="mm"></section>
</section>
<section class="cm">
<span>-50</span>
<section class="mm"></section>
</section>
<section class="cm">
<span>-60</span>
</section>
</section>
</div>
</div>
<div class="slider-value-box input-group justify-content-center mt-3">
<div>
<input class="slider-value text-center" type="number"
id="thresholdslidervalue" style="width: 50px;" />
</div>
<span
style="font-size: 12px; color: #555; padding-left: 6px; padding-top: 5px;">dB</span>
</div>
</div>
</div>
</div>
<div class="volume-slider-container mx-3">
<div class="d-flex justify-content-center">
<div class="me-3" id="ducklevel">
<div class="d-flex justify-content-center align-items-center mb-3"
style="height: 30px;">
DuckLevel
</div>
<div class="d-flex justify-content-center">
<div class="volume-slider-box">
<div class="volume-slider" data-slider-value="50">
<input type="range" orient="vertical" min="0" max="100"
step="0.1" value="30">
<div class="range-slider-bar" style="height: calc(45% + 15px);">
</div>
<div class="range-slider-thumb" style="bottom: 45%;"></div>
</div>
</div>
<div>
<section class="volume-ruler">
<section class="cm">
<span>0</span>
<section class="mm"></section>
</section>
<section class="cm">
<!-- <span>-10</span> -->
<section class="mm"></section>
</section>
<section class="cm">
<!-- <span>-20</span> -->
<section class="mm"></section>
</section>
<section class="cm">
<span>-45</span>
<section class="mm"></section>
</section>
<section class="cm">
<!-- <span>-40</span> -->
<section class="mm"></section>
</section>
<section class="cm">
<!-- <span>-50</span> -->
<section class="mm"></section>
</section>
<section class="cm">
<span>-100</span>
</section>
</section>
</div>
</div>
<div class="slider-value-box input-group justify-content-center mt-3">
<div>
<input class="slider-value text-center" type="number"
id="ducklevelslidervalue" style="width: 50px;" />
</div>
<span
style="font-size: 12px; color: #555; padding-left: 6px; padding-top: 5px;">dB</span>
</div>
</div>
</div>
</div>
<div class="volume-slider-container mx-3">
<div class="d-flex justify-content-center">
<div class="me-3" id="attack">
<div class="d-flex justify-content-center align-items-center mb-3"
style="height: 30px;">
Attack
</div>
<div class="d-flex justify-content-center">
<div class="volume-slider-box">
<div class="volume-slider">
<input type="range" orient="vertical" min="0" max="100"
step="0.01">
<div class="range-slider-bar" style="height: calc(45% + 15px);">
</div>
<div class="range-slider-thumb" style="bottom: 45%;"></div>
</div>
</div>
<div>
<section class="volume-ruler">
<section class="cm">
<span>500</span>
<section class="mm"></section>
</section>
<section class="cm">
<!-- <span>-10</span> -->
<section class="mm"></section>
</section>
<section class="cm">
<!-- <span>-20</span> -->
<section class="mm"></section>
</section>
<section class="cm">
<span>245</span>
<section class="mm"></section>
</section>
<section class="cm">
<!-- <span>-40</span> -->
<section class="mm"></section>
</section>
<section class="cm">
<!-- <span>-50</span> -->
<section class="mm"></section>
</section>
<section class="cm">
<span>10</span>
</section>
</section>
</div>
</div>
<div class="slider-value-box input-group justify-content-center mt-3">
<div>
<input class="slider-value text-center" type="number"
id="attackslidervalue" style="width: 50px;" />
</div>
<span
style="font-size: 12px; color: #555; padding-left: 6px; padding-top: 5px;">ms</span>
</div>
</div>
</div>
</div>
<div class="volume-slider-container mx-3">
<div class="d-flex justify-content-center">
<div class="me-3" id="release">
<div class="d-flex justify-content-center align-items-center mb-3"
style="height: 30px;">
Release
</div>
<div class="d-flex justify-content-center">
<div class="volume-slider-box">
<div class="volume-slider" data-slider-value="50">
<input type="range" orient="vertical" min="0" max="100"
step="0.1" value="30">
<div class="range-slider-bar" style="height: calc(45% + 15px);">
</div>
<div class="range-slider-thumb" style="bottom: 45%;"></div>
</div>
</div>
<div>
<section class="volume-ruler">
<section class="cm">
<span>2000</span>
<section class="mm"></section>
</section>
<section class="cm">
<!-- <span>-10</span> -->
<section class="mm"></section>
</section>
<section class="cm">
<!-- <span>-20</span> -->
<section class="mm"></section>
</section>
<section class="cm">
<span>-995</span>
<section class="mm"></section>
</section>
<section class="cm">
<!-- <span>-40</span> -->
<section class="mm"></section>
</section>
<section class="cm">
<!-- <span>-50</span> -->
<section class="mm"></section>
</section>
<section class="cm">
<span>10</span>
</section>
</section>
</div>
</div>
<div class="slider-value-box input-group justify-content-center mt-3">
<div>
<input class="slider-value text-center" type="number"
id="releaseslidervalue" style="width: 50px;" />
</div>
<span
style="font-size: 12px; color: #555; padding-left: 6px; padding-top: 5px;">ms</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="mb-3">
<div class="d-flex justify-content-center align-items-center" style="height: 30px;">
<div class="d-flex redio-switche">
<input type="radio" class="btn-check" name="switch" id="switch-on" value="enable">
<label class="btn btn-sm redio-btn on-btn" for="switch-on">ON</label>
<input type="radio" class="btn-check" name="switch" id="switch-off" value="disable">
<label class="btn btn-sm redio-btn off-btn" for="switch-off">OFF</label>
</div>
</div>
</div>
</div>
</div>
<div class="row d-flex">
</div>
</div>
</main>
<footer class="mt-auto text-white-50">
<div class="dotblock d-flex justify-content-between px-5 py-4">
<div class="">Geazan</div>
<div>www.geazan.com</div>
</div>
</footer>
</div>
<script>
var data = {}
let thresholdValue = 0
let duckLevelValue = 0
let attackValue = 0
let releaseValue = 0
let thresholdPost = false
let duckLevelPost = false
let attackPost = false
let releasePost = false
document.addEventListener("DOMContentLoaded", function () {
//初始化配置
loadData();
})
$(document).ready(function () {
let mic1 = $("#mic1")
let mic2 = $("#mic2")
$("input[name='switch']").on('change', function () {
let $value = $("input[name='switch']:checked").val()
let url = 'http://192.168.0.116/cgi-bin/test.cgi';
let postData = {
action: "ducker_set",
state: $value,
}
$.ajax({
type: 'POST',
url: url,
data: postData,
dataType: "json",
//contentType: "application/json; charset=utf-8",
success: function (res) {
console.log('返回数据', typeof (res), res)
if (res.success) {
data = res.content
}
else {
alert(res.message)
}
},
error: function (res) {
}
})
})
mic1.on('change', function () {
var isChecked = mic1.prop('checked');
// alert(isChecked)
micChange(mic1.prop('checked'), mic2.prop('checked'))
})
mic2.on('change', function () {
var isChecked = mic2.prop('checked');
// alert(isChecked)
micChange(mic1.prop('checked'), mic2.prop('checked'))
})
$("#thresholdslidervalue").change(function () {
thresholdPost = false
thresholdSlider($("#thresholdslidervalue").val())
})
$("#attackslidervalue").change(function () {
thresholdPost = false
attackSlider($("#attackslidervalue").val())
})
$("#ducklevelslidervalue").change(function () {
thresholdPost = false
ducklevelSlider($("#ducklevelslidervalue").val())
})
$("#releaseslidervalue").change(function () {
releasePost = false
releaseSlider($("#releaseslidervalue").val())
})
})
function micChange(mic1, mic2) {
let url = 'http://192.168.0.116/cgi-bin/test.cgi';
let postData = {
action: "ducker_set",
mic1: mic1 ? "open" : "close",
mic2: mic2 ? "open" : "close",
}
$.ajax({
type: 'POST',
url: url,
data: postData,
dataType: "json",
//contentType: "application/json; charset=utf-8",
success: function (res) {
console.log('返回数据', typeof (res), res)
if (res.success) {
data = res.content
}
else {
alert(res.message)
}
},
error: function (res) {
}
})
}
function loadData() {
let url = 'http://192.168.0.116/cgi-bin/test.cgi?action=ducker_get';
$.ajax({
type: "GET",
url: url,
success: function (res) {
data = res.content
thresholdValue = data.parameters.threshold.toFixed(1)
attackValue = data.parameters.attack.toFixed(1)
duckLevelValue = data.parameters.ducklevel.toFixed(1)
releaseValue = data.parameters.release.toFixed(1)
bindData()
},
error: function () {
data = {
parameters: {
threshold: -30,
attack: 200,
ducklevel: -3,
release: 1000,
state: "enable"
},
mic1: "close",
mic2: "open"
}
thresholdValue = data.parameters.threshold
attackValue = data.parameters.attack
duckLevelValue = data.parameters.ducklevel
releaseValue = data.parameters.release
bindData()
}
})
}
function bindData() {
$("input[name='switch']").val([`${data.parameters.state}`])
$("#mic1").prop("checked", data.mic1 == 'open')
$("#mic2").prop("checked", data.mic2 == 'open')
attackSlider(data.parameters.attack);
thresholdSlider(data.parameters.threshold);
ducklevelSlider(data.parameters.ducklevel);
releaseSlider(data.parameters.release);
}
function attackSlider(number) {
let element = $('#attack')
let input = $("#attack .volume-slider input")
input.attr('value', (parseInt(number) - 10) / (490 / 100))
updateAttackSlider(element, false);
input.on('input', function () {
updateAttackSlider(element, true);
})
input.on('change', function () {
updateAttackSlider(element, false);
})
}
function updateAttackSlider(element, isInput) {
let box = element.children().find(".volume-slider")
let input = element.children().find(".volume-slider input")
let $thumb = element.children().find(".range-slider-thumb")
let $bar = element.children().find(".range-slider-bar")
let $value = element.children().find(".slider-value")
pct = input.val() * ((box[0].clientHeight - $thumb[0].clientHeight) / box[0].clientHeight);
$thumb.attr('style', `bottom:${pct}%`)
let barHeight = `calc(${pct}% + ${$thumb[0].clientHeight / 2}px)`;
$bar.attr('style', `height:${barHeight}`)
let number = ((input.val() * (490 / 100)) + 10).toFixed(1)
$value.val(`${number}`);
//调用接口提交数据
if (number == -0) {
number = 0
}
if (number != attackValue && isInput == false) {
if (attackPost == false) {
attackPost = true
changeInputValue('attack', number)
}
}
}
function thresholdSlider(number) {
let element = $('#threshold')
let input = $("#threshold .volume-slider input")
input.attr('value', (parseInt(number) + 60) / (60 / 100))
updateThresholdSlider(element, false);
input.on('input', function () {
updateThresholdSlider(element, true);
})
input.on('change', function () {
updateThresholdSlider(element, false);
})
}
function updateThresholdSlider(element, isInput) {
let box = element.children().find(".volume-slider")
let input = element.children().find(".volume-slider input")
let $thumb = element.children().find(".range-slider-thumb")
let $bar = element.children().find(".range-slider-bar")
let $value = element.children().find(".slider-value")
pct = input.val() * ((box[0].clientHeight - $thumb[0].clientHeight) / box[0].clientHeight);
$thumb.attr('style', `bottom:${pct}%`)
let barHeight = `calc(${pct}% + ${$thumb[0].clientHeight / 2}px)`;
$bar.attr('style', `height:${barHeight}`)
let number = ((input.val() * (60 / 100)) - 60).toFixed(1)
$value.val(`${number}`);
//调用接口提交数据
if (number == -0) {
number = 0
}
if (number != thresholdValue && isInput == false) {
if (thresholdPost == false) {
thresholdPost = true
changeInputValue('threshold', number)
}
}
}
function ducklevelSlider(number) {
let element = $('#ducklevel')
let input = $("#ducklevel .volume-slider input")
input.attr('value', (parseInt(number) + 100) / (100 / 100))
updateDucklevelSlider(element, false);
input.on('input', function () {
updateDucklevelSlider(element, true);
})
input.on('change', function () {
updateDucklevelSlider(element, false);
})
}
function updateDucklevelSlider(element, isInput) {
let box = element.children().find(".volume-slider")
let input = element.children().find(".volume-slider input")
let $thumb = element.children().find(".range-slider-thumb")
let $bar = element.children().find(".range-slider-bar")
let $value = element.children().find(".slider-value")
pct = input.val() * ((box[0].clientHeight - $thumb[0].clientHeight) / box[0].clientHeight);
$thumb.attr('style', `bottom:${pct}%`)
let barHeight = `calc(${pct}% + ${$thumb[0].clientHeight / 2}px)`;
$bar.attr('style', `height:${barHeight}`)
let number = ((input.val() * (100 / 100)) - 100).toFixed(1)
$value.val(`${number}`);
//调用接口提交数据
if (number == -0) {
number = 0
}
if (number != duckLevelValue && isInput == false) {
if (duckLevelPost == false) {
duckLevelPost = true
changeInputValue('ducklevel', number)
}
}
}
function releaseSlider(number) {
console.log(number, releaseValue)
let element = $('#release')
let input = $("#release .volume-slider input")
input.attr('value', (parseInt(number) - 10) / (1990 / 100))
updateReleaseSlider(element, false);
input.on('input', function () {
updateReleaseSlider(element, true);
})
input.on('change', function () {
updateReleaseSlider(element, false);
})
}
function updateReleaseSlider(element, isInput) {
let box = element.children().find(".volume-slider")
let input = element.children().find(".volume-slider input")
let $thumb = element.children().find(".range-slider-thumb")
let $bar = element.children().find(".range-slider-bar")
let $value = element.children().find(".slider-value")
pct = input.val() * ((box[0].clientHeight - $thumb[0].clientHeight) / box[0].clientHeight);
$thumb.attr('style', `bottom:${pct}%`)
let barHeight = `calc(${pct}% + ${$thumb[0].clientHeight / 2}px)`;
$bar.attr('style', `height:${barHeight}`)
let number = ((input.val() * (1990 / 100)) + 10).toFixed(1)
$value.val(`${number}`);
//调用接口提交数据
console.log(number, releaseValue)
if (number != releaseValue && isInput == false) {
if (releasePost == false) {
releasePost = true
changeInputValue('release', number)
}
}
}
function changeInputValue(module, number) {
let url = "http://192.168.0.116/cgi-bin/test.cgi"
let postData = {
action: 'ducker_set',
subaction: module,
audio: number,
type: module
}
$.ajax({
type: 'POST',
url: url,
data: postData,
dataType: "json",
//contentType: "application/json; charset=utf-8",
success: function (res) {
if (res.success) {
data = res.content
if (module == 'attack') {
attackValue = data.parameters.attack.toFixed(1)
attackSlider(attackValue)
attackPost = false
}
if (module == 'threshold') {
thresholdValue = data.parameters.threshold.toFixed(1)
thresholdSlider(thresholdValue)
thresholdPost = false
}
if (module == 'ducklevel') {
duckLevelValue = data.parameters.ducklevel.toFixed(1)
ducklevelSlider(duckLevelValue)
duckLevelPost = false
}
if (module == 'release') {
releaseValue = data.parameters.release.toFixed(1)
releaseSlider(releaseValue)
releasePost = false
}
bindData()
}
else {
alert(res.message)
}
},
error: function (res) {
}
})
}
</script>
<script src="js/main.js"></script>
</body>
</html>