equalizer

This commit is contained in:
vapormusic 2022-01-26 10:48:06 +07:00
parent f3a7309175
commit 07118197c9
7 changed files with 242 additions and 2 deletions

View file

@ -98,6 +98,8 @@
"term.developer": "Developer", "term.developer": "Developer",
"term.socialTeam": "Social Team", "term.socialTeam": "Social Team",
"term.contributors": "Contributors", "term.contributors": "Contributors",
"term.equalizer": "Equalizer",
"term.reset": "Reset",
// Home // Home
"home.title": "Home", "home.title": "Home",

View file

@ -49,6 +49,18 @@ export class ConfigStore {
"down": 'acoustic-ceiling-tiles', "down": 'acoustic-ceiling-tiles',
"up": 'acoustic-ceiling-tiles', "up": 'acoustic-ceiling-tiles',
} }
},
"equalizer": {
'60' : 0,
'170': 0 ,
'310': 0 ,
'600': 0 ,
'1000': 0 ,
'3000': 0 ,
'6000': 0 ,
'12000': 0 ,
'14000': 0 ,
'16000': 0 ,
} }
}, },
"visual": { "visual": {

View file

@ -5,6 +5,7 @@ var CiderAudio = {
gainNode : null, gainNode : null,
spatialNode : null, spatialNode : null,
spatialInput: null, spatialInput: null,
audioBands : null,
}, },
init: function (cb = function () { }) { init: function (cb = function () { }) {
//AudioOutputs.fInit = true; //AudioOutputs.fInit = true;
@ -42,6 +43,7 @@ var CiderAudio = {
if (app.cfg.audio.spatial){ if (app.cfg.audio.spatial){
CiderAudio.spatialOn() CiderAudio.spatialOn()
} }
CiderAudio.equalizer()
}, },
normalizerOn: function (){}, normalizerOn: function (){},
normalizerOff: function (){ normalizerOff: function (){
@ -49,7 +51,7 @@ var CiderAudio = {
}, },
spatialOn: function (){ spatialOn: function (){
try{ try{
CiderAudio.audioNodes.gainNode.connect(CiderAudio.context.destination);} catch(e){} CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);} catch(e){}
CiderAudio.audioNodes.spatialNode = new ResonanceAudio(CiderAudio.context); CiderAudio.audioNodes.spatialNode = new ResonanceAudio(CiderAudio.context);
CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.context.destination); CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.context.destination);
let roomDimensions = { let roomDimensions = {
@ -90,6 +92,43 @@ var CiderAudio = {
} }
); );
} }
},
equalizer: function (){
const BANDS = [60, 170, 310, 600, 1000, 3000, 6000, 12000, 14000, 16000];
CiderAudio.audioNodes.audioBands = {};
BANDS.forEach((band, i) => {
const filter = CiderAudio.context.createBiquadFilter();
CiderAudio.audioNodes.audioBands[band] = filter;
if (i === 0) {
// The first filter, includes all lower frequencies
filter.type = "lowshelf";
} else if (i === BANDS.length - 1) {
// The last filter, includes all higher frequencies
filter.type = "highshelf";
} else {
filter.type = "peaking";
}
filter.frequency.value = band;
filter.gain.value = 0;
if (i == 0){
if (app.cfg.audio.spatial) {
CiderAudio.audioNodes.spatialNode.output.disconnect(CiderAudio.context.destination);
CiderAudio.audioNodes.spatialNode.output.connect(filter);
} else {
CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);
CiderAudio.audioNodes.gainNode.connect(filter);
}
} else if (i === BANDS.length - 1) {
CiderAudio.audioNodes.audioBands[BANDS[i - 1]].connect(filter);
} else {
CiderAudio.audioNodes.audioBands[BANDS[i - 1]].connect(filter);
filter.connect(CiderAudio.context.destination);
}
});
} }
} }

View file

@ -297,7 +297,8 @@ const app = new Vue({
modals: { modals: {
addToPlaylist: false, addToPlaylist: false,
spatialProperties: false, spatialProperties: false,
qrcode: false qrcode: false,
equalizer: false,
}, },
socialBadges: { socialBadges: {
badgeMap: {}, badgeMap: {},

View file

@ -5699,4 +5699,72 @@ body.no-gpu {
overflow-y: hidden; overflow-y: hidden;
} }
.equalizer-panel {
.modal-window {
height: 300px;
max-height: 300px;
width: 400px;
max-width: 400px;
overflow: hidden;
.info-header {
padding-left: 12px;
}
.visual-container {
display: flex;
justify-content: center;
align-items: center;
overflow: hidden;
}
.modal-header {
padding: 16px;
position: relative;
overflow: hidden;
.modal-title {
text-align: center;
}
.close-btn {
width: 50px;
height: 100%;
background-image: var(--gfx-closeBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
appearance: none;
border: 0;
background-color: transparent;
position: absolute;
top: 0;
right: 0;
&:hover {
background-color: rgb(196, 43, 28)
}
}
}
.modal-content{
display: block;
.input-container{
display: inline-grid;
width: 35px;
justify-items: center;
font-size: 0.7em;
}
.reset-button{
width: 50%;
margin-left: 25%;
}
}
}
}
input.eq-slider {
-webkit-appearance: slider-vertical;
width: 5%;
}
@import url("less/compact.less"); @import url("less/compact.less");

View file

@ -0,0 +1,108 @@
<script type="text/x-template" id="eq-view">
<div class="modal-fullscreen equalizer-panel">
<div class="modal-window" >
<div class="modal-header">
<div class="modal-title">{{$root.getLz('term.equalizer')}}</div>
<button class="close-btn" @click="close()"></button>
</div>
<div class="modal-content">
<!-- BANDS = [60, 170, 310, 600, 1000, 3000, 6000, 12000, 14000, 16000]; -->
<div class="inputs-container">
<div class="input-container">
{{app.cfg.audio.equalizer['60']}}
<input type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer['60']" @change="changeGain('60')">
60
</div>
<div class="input-container">
{{app.cfg.audio.equalizer['170']}}
<input type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer['170']" @change="changeGain('170')">
170
</div>
<div class="input-container">
{{app.cfg.audio.equalizer['310']}}
<input type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer['310']" @change="changeGain('310')">
310
</div>
<div class="input-container">
{{app.cfg.audio.equalizer['600']}}
<input type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer['600']" @change="changeGain('600')">
600
</div>
<div class="input-container">
{{app.cfg.audio.equalizer['1000']}}
<input type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer['1000']" @change="changeGain('1000')">
1000
</div>
<div class="input-container">
{{app.cfg.audio.equalizer['3000']}}
<input type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer['3000']" @change="changeGain('3000')">
3000
</div>
<div class="input-container">
{{app.cfg.audio.equalizer['6000']}}
<input type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer['6000']" @change="changeGain('6000')">
6000
</div>
<div class="input-container">
{{app.cfg.audio.equalizer['12000']}}
<input type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer['12000']" @change="changeGain('12000')">
12000
</div>
<div class="input-container">
{{app.cfg.audio.equalizer['14000']}}
<input type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer['14000']" @change="changeGain('14000')">
14000
</div>
<div class="input-container">
{{app.cfg.audio.equalizer['16000']}}
<input type="range" class="eq-slider" orient="vertical" min="-12" max="12" step="0.1" v-model="app.cfg.audio.equalizer['16000']" @change="changeGain('16000')">
16000
</div>
</div>
</br>
<div class="reset-button md-btn" @click="resetGain()">{{$root.getLz('term.reset')}}</div>
</div>
</div>
</div>
</script>
<script>
Vue.component('eq-view', {
template: '#eq-view',
data: function () {
return {
app: this.$root,
}
},
props: ["src", "url"],
mounted() {
},
methods: {
close() {
app.resetState()
},
changeGain(i) {
CiderAudio.audioNodes.audioBands[i].gain.value = app.cfg.audio.equalizer[i]
},
resetGain(){
this.app.cfg.audio.equalizer = {
'60' : 0,
'170': 0 ,
'310': 0 ,
'600': 0 ,
'1000': 0 ,
'3000': 0 ,
'6000': 0 ,
'12000': 0 ,
'14000': 0 ,
'16000': 0 ,
}
for (var i in this.app.cfg.audio.equalizer){
this.changeGain(i)
}
}
}
});
</script>

View file

@ -264,6 +264,10 @@
</div> </div>
</div> </div>
</button> </button>
<button class="usermenu-item" v-if="cfg.advanced.AudioContext"
@click="modals.equalizer = true">
{{$root.getLz('term.equalizer')}}
</button>
<button class="usermenu-item" v-if="cfg.advanced.AudioContext && cfg.audio.spatial" <button class="usermenu-item" v-if="cfg.advanced.AudioContext && cfg.audio.spatial"
@click="modals.spatialProperties = true"> @click="modals.spatialProperties = true">
{{$root.getLz('term.spacializedAudioSetting')}} {{$root.getLz('term.spacializedAudioSetting')}}
@ -619,6 +623,9 @@
<transition name="modal"> <transition name="modal">
<spatial-properties v-if="modals.spatialProperties"></spatial-properties> <spatial-properties v-if="modals.spatialProperties"></spatial-properties>
</transition> </transition>
<transition name="modal">
<eq-view v-if="modals.equalizer"></eq-view>
</transition>
<transition name="modal"> <transition name="modal">
<qrcode-modal v-if="modals.qrcode" :src="webremoteqr" :url="webremoteurl"></qrcode-modal> <qrcode-modal v-if="modals.qrcode" :src="webremoteqr" :url="webremoteurl"></qrcode-modal>
</transition> </transition>
@ -730,6 +737,9 @@
<!-- QRCode Modal --> <!-- QRCode Modal -->
<%- include('components/qrcode-modal') <%- include('components/qrcode-modal')
%> %>
<!-- Equalizer -->
<%- include('components/equalizer')
%>
<!-- Add to playlist --> <!-- Add to playlist -->
<%- include('components/add-to-playlist') <%- include('components/add-to-playlist')
%> %>