diff --git a/src/i18n/en_US.jsonc b/src/i18n/en_US.jsonc index cffdda4a..fa095aff 100644 --- a/src/i18n/en_US.jsonc +++ b/src/i18n/en_US.jsonc @@ -98,6 +98,8 @@ "term.developer": "Developer", "term.socialTeam": "Social Team", "term.contributors": "Contributors", + "term.equalizer": "Equalizer", + "term.reset": "Reset", // Home "home.title": "Home", diff --git a/src/main/base/store.ts b/src/main/base/store.ts index bc495822..cd7fe219 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -49,6 +49,18 @@ export class ConfigStore { "down": '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": { diff --git a/src/renderer/audio/audio.js b/src/renderer/audio/audio.js index 64118b7c..6697d908 100644 --- a/src/renderer/audio/audio.js +++ b/src/renderer/audio/audio.js @@ -5,6 +5,7 @@ var CiderAudio = { gainNode : null, spatialNode : null, spatialInput: null, + audioBands : null, }, init: function (cb = function () { }) { //AudioOutputs.fInit = true; @@ -42,6 +43,7 @@ var CiderAudio = { if (app.cfg.audio.spatial){ CiderAudio.spatialOn() } + CiderAudio.equalizer() }, normalizerOn: function (){}, normalizerOff: function (){ @@ -49,7 +51,7 @@ var CiderAudio = { }, spatialOn: function (){ 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.output.connect(CiderAudio.context.destination); 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); + } + + }); } } diff --git a/src/renderer/index.js b/src/renderer/index.js index 1c470073..13168409 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -297,7 +297,8 @@ const app = new Vue({ modals: { addToPlaylist: false, spatialProperties: false, - qrcode: false + qrcode: false, + equalizer: false, }, socialBadges: { badgeMap: {}, diff --git a/src/renderer/style.less b/src/renderer/style.less index 8ceefcb2..934c1330 100644 --- a/src/renderer/style.less +++ b/src/renderer/style.less @@ -5699,4 +5699,72 @@ body.no-gpu { 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"); diff --git a/src/renderer/views/components/equalizer.ejs b/src/renderer/views/components/equalizer.ejs new file mode 100644 index 00000000..5ae27962 --- /dev/null +++ b/src/renderer/views/components/equalizer.ejs @@ -0,0 +1,108 @@ + + + \ No newline at end of file diff --git a/src/renderer/views/main.ejs b/src/renderer/views/main.ejs index 5337cb17..5b2f56dd 100644 --- a/src/renderer/views/main.ejs +++ b/src/renderer/views/main.ejs @@ -264,6 +264,10 @@ +