equalizer
This commit is contained in:
parent
f3a7309175
commit
07118197c9
7 changed files with 242 additions and 2 deletions
|
@ -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",
|
||||||
|
|
|
@ -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": {
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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: {},
|
||||||
|
|
|
@ -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");
|
||||||
|
|
108
src/renderer/views/components/equalizer.ejs
Normal file
108
src/renderer/views/components/equalizer.ejs
Normal 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>
|
|
@ -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')
|
||||||
%>
|
%>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue