"normalize audio"

This commit is contained in:
vapormusic 2021-12-29 20:48:28 +07:00
parent 1ad7012e32
commit ddbc3236fd
6 changed files with 96 additions and 8 deletions

View file

@ -20,8 +20,9 @@ const configSchema = {
"favoriteItems": [] "favoriteItems": []
}, },
"audio": { "audio": {
"quality": "extreme", "quality": "990",
"seamless_audio": true "seamless_audio": true,
"normalization": false,
}, },
"visual": { "visual": {
"theme": "", "theme": "",
@ -44,6 +45,9 @@ const configSchema = {
"auth_token": "", "auth_token": "",
"enabledRemoveFeaturingArtists" : true, "enabledRemoveFeaturingArtists" : true,
"NowPlaying": "true" "NowPlaying": "true"
},
"advanced": {
"AudioContext" : true,
} }
} }

View file

@ -0,0 +1,63 @@
var CiderAudio = {
context : null,
source : null,
audioNodes : {
gainNode : null,
compressorNode : null,
},
init: function (cb = function () { }) {
//AudioOutputs.fInit = true;
searchInt = setInterval(function () {
if (document.getElementById("apple-music-player")) {
//AudioOutputs.eqReady = true;
document.getElementById("apple-music-player").crossOrigin = "anonymous";
CiderAudio.connectContext(document.getElementById("apple-music-player"), 0);
cb();
clearInterval(searchInt);
}
}, 1000);
},
connectContext: function (mediaElem){
CiderAudio.context = new (window.AudioContext || window.webkitAudioContext);
CiderAudio.source = CiderAudio.context.createMediaElementSource(mediaElem);
CiderAudio.audioNodes.gainNode = CiderAudio.context.createGain()
CiderAudio.source.connect(CiderAudio.audioNodes.gainNode);
CiderAudio.audioNodes.gainNode.connect(CiderAudio.context.destination);
if(app.cfg.audio.normalization){
CiderAudio.normalizerOn()
}
},
normalizerOn: function (){
let tuna = Tuna(CiderAudio.context)
if (!CiderAudio.audioNodes.compressorNode){
CiderAudio.audioNodes.compressorNode = new tuna.Compressor({
threshold: -80, //-100 to 0
makeupGain: 5, //0 and up (in decibels)
attack: 2, //0 to 1000
release: 200, //0 to 3000
ratio: 8, //1 to 20
knee: 0, //0 to 40
automakeup: false, //true/false
bypass: 0
});
}
try{
CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);
} catch (e){}
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.compressorNode);
CiderAudio.audioNodes.compressorNode.connect(CiderAudio.context.destination);
},
normalizerOff: function (){
try{
CiderAudio.audioNodes.compressorNode.disconnect();
CiderAudio.audioNodes.compressorNode = null
} catch (e){}
CiderAudio.audioNodes.gainNode.connect(CiderAudio.context.destination);
}
}
if (app.cfg.advanced.AudioContext){
CiderAudio.init()
}

File diff suppressed because one or more lines are too long

View file

@ -390,6 +390,9 @@ const app = new Vue({
window.localStorage.setItem("currentQueue", JSON.stringify(app.mk.queue.items)) window.localStorage.setItem("currentQueue", JSON.stringify(app.mk.queue.items))
}; };
// Load saved quality
app.mk.bitrate = app.cfg.audio.quality
// load last played track // load last played track
try { try {
let lastItem = window.localStorage.getItem("currentTrack") let lastItem = window.localStorage.getItem("currentTrack")

View file

@ -585,5 +585,7 @@
} }
</script> </script>
<script src="index.js?v=1"></script> <script src="index.js?v=1"></script>
<script src="/audio/tuna.js?v=1"></script>
<script src="/audio/audio.js?v=1"></script>
</body> </body>
</html> </html>

View file

@ -9,10 +9,10 @@
Audio Quality Audio Quality
</div> </div>
<div class="md-option-segment md-option-segment_auto"> <div class="md-option-segment md-option-segment_auto">
<select class="md-select" style="width:180px;"> <select class="md-select" style="width:180px;" v-model="app.cfg.audio.quality" v-on:change="changeAudioQuality">
<option value="extreme">Extreme</option> <option value="990">Extreme</option>
<option value="high">High</option> <option value="256">High</option>
<option value="low">Low</option> <option value="64">Low</option>
<option value="auto">Auto</option> <option value="auto">Auto</option>
</select> </select>
</div> </div>
@ -25,6 +25,14 @@
<input type="checkbox" v-model="app.cfg.audio.seamless_audio" switch/> <input type="checkbox" v-model="app.cfg.audio.seamless_audio" switch/>
</div> </div>
</div> </div>
<div class="md-option-line">
<div class="md-option-segment">
Audio Normalization
</div>
<div class="md-option-segment md-option-segment_auto">
<input type="checkbox" v-model="app.cfg.audio.normalization" v-on:change="toggleNormalization" switch/>
</div>
</div>
<div class="md-option-header"> <div class="md-option-header">
<span>Visual</span> <span>Visual</span>
</div> </div>
@ -72,7 +80,7 @@
<small>(Requires relaunch)</small> <small>(Requires relaunch)</small>
</div> </div>
<div class="md-option-segment md-option-segment_auto"> <div class="md-option-segment md-option-segment_auto">
<select class="md-select" style="width:180px;" v-model="app.cfg.visual.hw_acceleration"> <select class="md-select" style="width:180px;" v-model="app.cfg.visual.hw_acceleration" >
<option value="default">Default</option> <option value="default">Default</option>
<option value="webgpu">WebGPU</option> <option value="webgpu">WebGPU</option>
<option value="disabled">Disabled</option> <option value="disabled">Disabled</option>
@ -547,7 +555,14 @@
} }
}, },
methods: { methods: {
toggleNormalization : function(){
if (app.cfg.audio.normalization){
CiderAudio.normalizerOn()
} else {CiderAudio.normalizerOff()}
},
changeAudioQuality : function(){
app.mk.bitrate = app.cfg.audio.quality
}
} }
}) })
</script> </script>