[Audio] Web Audio API hates me.

This commit is contained in:
maikirakiwi 2022-04-08 14:45:58 -07:00
parent f5e4bd253a
commit 70197fb0ce
9 changed files with 978 additions and 480 deletions

View file

@ -72,6 +72,8 @@ export class Store {
"ciderPPE_value": "MAIKIWI", "ciderPPE_value": "MAIKIWI",
"analogWarmth": false, "analogWarmth": false,
"analogWarmth_value": "SMOOTH", "analogWarmth_value": "SMOOTH",
"atmosphereRealizer": false,
"atmosphereRealizer_value": "NATURAL_STANDARD",
"spatial": false, "spatial": false,
"spatialProfile": "71_420maikiwi", "spatialProfile": "71_420maikiwi",
"vibrantBass": { // Hard coded into the app. Don't include any of this config into exporting presets in store.ts "vibrantBass": { // Hard coded into the app. Don't include any of this config into exporting presets in store.ts

File diff suppressed because it is too large Load diff

View file

@ -775,8 +775,8 @@ const app = new Vue({
} }
numbers.shift() numbers.shift()
let peak = Math.max(numbers[6], numbers[7]) / 32768.0 let peak = Math.max(numbers[6], numbers[7]) / 32768.0
let gain = Math.pow(10, ((-2.5 - (Math.log10(peak) * 20)) / 20))// EBU R 128 Compliant let gain = Math.pow(10, ((0.95 - (Math.log10(peak) * 20)) / 20))// EBU R 128 Compliant
console.debug(`[Cider][MaikiwiSoundCheck] Peak Gain: '${(Math.log10(peak) * 20).toFixed(2)}' dB | Adjusting '${(Math.log10(gain) * 20).toFixed(2)}' dB`) console.debug(`[Cider][MaikiwiSoundCheck] Peak Gain: '${(Math.log10(peak) * 20).toFixed(2)}' dB | Adjusting '${((Math.log10(gain) * 20) - 0.05).toFixed(2)}' dB`)
try { try {
//CiderAudio.audioNodes.gainNode.gain.value = (Math.min(Math.pow(10, (replaygain.gain / 20)), (1 / replaygain.peak))) //CiderAudio.audioNodes.gainNode.gain.value = (Math.min(Math.pow(10, (replaygain.gain / 20)), (1 / replaygain.peak)))
CiderAudio.audioNodes.gainNode.gain.value = gain CiderAudio.audioNodes.gainNode.gain.value = gain

View file

@ -1,271 +1,288 @@
<script type="text/x-template" id="audiolabs-page"> <script type="text/x-template" id="audiolabs-page">
<div class="content-inner audiolabs-page "> <div class="content-inner audiolabs-page ">
<div class="md-option-container"> <div class="md-option-container">
<div class="settings-option-body"> <div class="settings-option-body">
<div class="md-option-line"> <div class="md-option-line">
<b-jumbotron :header="$root.getLz('settings.option.audio.audioLab')" <b-jumbotron :header="$root.getLz('settings.option.audio.audioLab')"
lead="Designed by Cider Acoustic Technologies in California"></b-jumbotron> lead="Designed by Cider Acoustic Technologies in California"></b-jumbotron>
</div> </div>
<div class="md-option-line" v-show="app.cfg.advanced.AudioContext === false"> <div class="md-option-line" v-show="app.cfg.advanced.AudioContext === false">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.warn.audioLab.withoutAF')}} {{$root.getLz('settings.warn.audioLab.withoutAF')}}
</div> </div>
<button class="md-btn" style="margin-top: 5px;" onclick="app.appRoute('settings')"> <button class="md-btn" style="margin-top: 5px;" onclick="app.appRoute('settings')">
{{$root.getLz('term.settings')}} {{$root.getLz('term.settings')}}
</button> </button>
</div> </div>
<div class="md-option-line" v-show="app.cfg.advanced.AudioContext === true"> <div class="md-option-line" v-show="app.cfg.advanced.AudioContext === true">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPE')}} {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPE')}}
<br> <br>
<small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPE.description')}}</small> <small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPE.description')}}</small>
</div> </div>
<div class="md-option-segment md-option-segment_auto"> <div class="md-option-segment md-option-segment_auto">
<input type="checkbox" v-model="app.cfg.audio.maikiwiAudio.ciderPPE" <input type="checkbox" v-model="app.cfg.audio.maikiwiAudio.ciderPPE"
v-on:change="CiderAudio.hierarchical_loading();" switch/> v-on:change="CiderAudio.hierarchical_loading();" switch/>
</div> </div>
</div> </div>
<div class="md-option-line" v-show="app.cfg.audio.maikiwiAudio.ciderPPE === true"> <div class="md-option-line" v-show="app.cfg.audio.maikiwiAudio.ciderPPE === true">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength')}} {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength')}}
<br> <br>
<small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description')}}</small> <small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description')}}</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;" <select class="md-select" style="width:180px;"
v-model="app.cfg.audio.maikiwiAudio.ciderPPE_value" v-model="app.cfg.audio.maikiwiAudio.ciderPPE_value"
v-on:change="CiderAudio.hierarchical_loading()"> v-on:change="CiderAudio.hierarchical_loading()">
<option value="MAIKIWI">Maikiwi</option> <option value="MAIKIWI">Maikiwi</option>
<option value="NATURAL"> <option value="NATURAL">
{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard')}} {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard')}}
</option> </option>
<option value="AGGRESSIVE"> <option value="AGGRESSIVE">
{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive')}} {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive')}}
</option> </option>
</select> </select>
</div> </div>
</div> </div>
<div class="md-option-line" v-show="app.cfg.advanced.AudioContext"> <div class="md-option-line" v-show="app.cfg.advanced.AudioContext">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.analogWarmth')}} {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.analogWarmth')}}
<br> <br>
<small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.analogWarmth.description')}}</small> <small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.analogWarmth.description')}}</small>
</div> </div>
<div class="md-option-segment md-option-segment_auto"> <div class="md-option-segment md-option-segment_auto">
<input type="checkbox" v-model="app.cfg.audio.maikiwiAudio.analogWarmth" <input type="checkbox" v-model="app.cfg.audio.maikiwiAudio.analogWarmth"
v-on:change="CiderAudio.hierarchical_loading();" switch/> v-on:change="CiderAudio.hierarchical_loading();" switch/>
</div> </div>
</div> </div>
<div class="md-option-line" <div class="md-option-line"
v-show="app.cfg.advanced.AudioContext === true && app.cfg.audio.maikiwiAudio.analogWarmth === true"> v-show="app.cfg.advanced.AudioContext === true && app.cfg.audio.maikiwiAudio.analogWarmth === true">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity')}} {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity')}}
<br> <br>
<small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description')}}</small> <small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description')}}</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;" <select class="md-select" style="width:180px;"
v-model="app.cfg.audio.maikiwiAudio.analogWarmth_value" v-model="app.cfg.audio.maikiwiAudio.analogWarmth_value"
v-on:change="ChangeanalogWarmth()"> v-on:change="ChangeanalogWarmth()">
<option value="SMOOTH"> <option value="SMOOTH">
{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth')}} {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth')}}
</option> </option>
<option value="WARM"> <option value="WARM">
{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm')}} {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm')}}
</option> </option>
</select> </select>
</div> </div>
</div> </div>
<div class="md-option-line" v-show="app.cfg.advanced.AudioContext === true"> <div class="md-option-line" v-show="app.cfg.advanced.AudioContext === true">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.audioSpatialization')}} Cider Atmosphere Realizer™
<br> <br>
<small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description')}}</small> <small>Realizes a different musical atmosphere modelled after the state of the art audio setups.</small>
</div> </div>
<div class="md-option-segment md-option-segment_auto"> <div class="md-option-segment md-option-segment_auto">
<input type="checkbox" v-model="app.cfg.audio.spatial" <input type="checkbox" v-model="app.cfg.audio.maikiwiAudio.atmosphereRealizer"
:disabled="app.cfg.audio.maikiwiAudio.spatial === true" v-on:change="toggleSpatial" v-on:change="CiderAudio.hierarchical_loading();" switch/>
switch/> </div>
</div> </div>
</div> <div class="md-option-line" v-show="app.cfg.audio.maikiwiAudio.atmosphereRealizer === true">
<div class="md-option-line" v-show="app.cfg.advanced.AudioContext === true"> <div class="md-option-segment">
<div class="md-option-segment"> Cider Atmosphere Realizer™ Mode
{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization')}} <br>
<br> <small>Changes the mode of operation of the Atmosphere Realizer module.</small>
<small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description')}}</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;"
<input type="checkbox" v-model="app.cfg.audio.maikiwiAudio.spatial" v-model="app.cfg.audio.maikiwiAudio.atmosphereRealizer_value"
:disabled="app.cfg.audio.spatial === false" v-on:change="toggleMaikiwiSpatial" switch/> v-on:change="CiderAudio.hierarchical_loading()">
</div> <option value="NATURAL_STANDARD">Natural (Standard)</option>
</div> <option value="NATURAL_HIGH">Natural (High)</option>
<div class="md-option-line" <option value="NATURAL_PLUS">Natural (Plus)</option>
v-show="app.cfg.audio.maikiwiAudio.spatial === true && app.cfg.audio.spatial === true"> </select>
<div class="md-option-segment"> </div>
{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile')}} </div>
<br> <div class="md-option-line" v-show="app.cfg.advanced.AudioContext === true">
<small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description')}}</small> <div class="md-option-segment">
</div> {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.audioSpatialization')}}
<div class="md-option-segment md-option-segment_auto"> <br>
<select class="md-select" style="width:180px;" <small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description')}}</small>
v-model="$root.cfg.audio.maikiwiAudio.spatialProfile" </div>
v-on:change="toggleMaikiwiSpatial"> <div class="md-option-segment md-option-segment_auto">
<option v-for="profile in spprofiles" :value="profile.id">{{ profile.name }}</option> <input type="checkbox" v-model="app.cfg.audio.spatial"
</select> :disabled="app.cfg.audio.maikiwiAudio.spatial === true" v-on:change="toggleSpatial"
</div> switch/>
</div> </div>
<div class="spprofile-line" v-show="app.cfg.audio.maikiwiAudio.spatial === true && app.cfg.audio.spatial === true"> </div>
<div class="spprofile-viewport"> <div class="md-option-line" v-show="app.cfg.advanced.AudioContext === true">
<button class="spprev" @click="profilePrev"></button> <div class="md-option-segment">
<button class="nextprev" @click="profileNext"></button> {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization')}}
<template v-for="profile in spprofiles" v-if="$root.cfg.audio.maikiwiAudio.spatialProfile == profile.id"> <br>
<transition name="spfade"> <small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description')}}</small>
<div class="spslide" :key="profile.id"> </div>
<img v-if="profile.img" loading="eager" decoding="async" :src="profile.img" alt=""> <div class="md-option-segment md-option-segment_auto">
<h1 class="sptitle">{{ profile.name }}</h1> <input type="checkbox" v-model="app.cfg.audio.maikiwiAudio.spatial"
</div> :disabled="app.cfg.audio.spatial === false" v-on:change="toggleMaikiwiSpatial" switch/>
</transition> </div>
</template> </div>
</div> <div class="md-option-line"
</div> v-show="app.cfg.audio.maikiwiAudio.spatial === true && app.cfg.audio.spatial === true">
<div style="opacity: 0.5; pointer-events: none"> <div class="md-option-segment">
<div class="md-option-header"> {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile')}}
<span>{{$root.getLz('settings.header.unfinished')}}</span> <br>
</div> <small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description')}}</small>
<div class="md-option-line" v-show="app.cfg.advanced.AudioContext === true"> </div>
<div class="md-option-segment"> <div class="md-option-segment md-option-segment_auto">
Cider Atmosphere Realizer™ <select class="md-select" style="width:180px;"
<br> v-model="$root.cfg.audio.maikiwiAudio.spatialProfile"
<small>Realizes an entirely different musical atmosphere only to be found on state of the v-on:change="toggleMaikiwiSpatial">
art audio setups.</small> <option v-for="profile in spprofiles" :value="profile.id">{{ profile.name }}</option>
</div> </select>
<div class="md-option-segment md-option-segment_auto"> </div>
<button class="md-btn"> </div>
Signature <div class="spprofile-line" v-show="app.cfg.audio.maikiwiAudio.spatial === true && app.cfg.audio.spatial === true">
</button> <div class="spprofile-viewport">
<button class="md-btn"> <button class="spprev" @click="profilePrev"></button>
Signature+ <button class="nextprev" @click="profileNext"></button>
</button> <template v-for="profile in spprofiles" v-if="$root.cfg.audio.maikiwiAudio.spatialProfile == profile.id">
</div> <transition name="spfade">
</div> <div class="spslide" :key="profile.id">
<div class="md-option-line" v-show="app.cfg.advanced.AudioContext === true"> <img v-if="profile.img" loading="eager" decoding="async" :src="profile.img" alt="">
<div class="md-option-segment"> <h1 class="sptitle">{{ profile.name }}</h1>
Cider Origami™ Vocal Enhancer/Remasterer </div>
<br> </transition>
<small>Re-textures the vocals by carving out the frequencies and adjusts them to the </template>
selected profile.<br> </div>
<b>Modern:</b> </div>
Modernizes vocals that was recorded on old microphones while preserving the artist's individualistic style.<br> <div style="opacity: 0.5; pointer-events: none">
<b>Articulate:</b> <div class="md-option-header">
Wrapping every detail of the vocal to your ear, resulting in a more expressive voice. <span>{{$root.getLz('settings.header.unfinished')}}</span>
</small> </div>
</div> <div class="md-option-line" v-show="app.cfg.advanced.AudioContext === true">
<div class="md-option-segment md-option-segment_auto"> <div class="md-option-segment">
<select class="md-select"> Cider Origami™ Vocal Enhancer/Remasterer
<option value="none"> <br>
{{$root.getLz('settings.header.visual.windowBackgroundStyle.none')}} <small>Re-textures the vocals by carving out the frequencies and adjusts them to the
</option> selected profile.<br>
<option value="modern"> <b>Modern:</b>
Modern Modernizes vocals that was recorded on old microphones while preserving the artist's individualistic style.<br>
</option> <b>Articulate:</b>
<option value="intimate"> Wrapping every detail of the vocal to your ear, resulting in a more expressive voice.
Intimate </small>
</option> </div>
</select> <div class="md-option-segment md-option-segment_auto">
</div> <select class="md-select">
</div> <option value="none">
</div> {{$root.getLz('settings.header.visual.windowBackgroundStyle.none')}}
</div> </option>
</div> <option value="modern">
</script> Modern
</option>
<script> <option value="intimate">
Vue.component('audiolabs-page', { Intimate
template: "#audiolabs-page", </option>
props: [], </select>
data: function () { </div>
return { </div>
app: this.$root, </div>
spprofiles: CiderAudio.spatialProfiles </div>
} </div>
}, </script>
mounted: function () {
<script>
}, Vue.component('audiolabs-page', {
methods: { template: "#audiolabs-page",
profileNext() { props: [],
var next = this.spprofiles.find(function (profile) { data: function () {
return profile.id === this.$root.cfg.audio.maikiwiAudio.spatialProfile; return {
}.bind(this)); app: this.$root,
if (next) { spprofiles: CiderAudio.spatialProfiles
next = this.spprofiles[this.spprofiles.indexOf(next) + 1]; }
if (next) { },
this.$root.cfg.audio.maikiwiAudio.spatialProfile = next.id; mounted: function () {
} else {
this.$root.cfg.audio.maikiwiAudio.spatialProfile = this.spprofiles[0].id; },
} methods: {
} else { profileNext() {
this.$root.cfg.audio.maikiwiAudio.spatialProfile = this.spprofiles[0].id; var next = this.spprofiles.find(function (profile) {
} return profile.id === this.$root.cfg.audio.maikiwiAudio.spatialProfile;
this.toggleMaikiwiSpatial() }.bind(this));
}, if (next) {
profilePrev() { next = this.spprofiles[this.spprofiles.indexOf(next) + 1];
// select the previous profile based on $root.cfg.audio.maikiwiAudio.spatialProfile if (next) {
var prev = this.spprofiles.find(function (profile) { this.$root.cfg.audio.maikiwiAudio.spatialProfile = next.id;
return profile.id === this.$root.cfg.audio.maikiwiAudio.spatialProfile; } else {
}.bind(this)); this.$root.cfg.audio.maikiwiAudio.spatialProfile = this.spprofiles[0].id;
if (prev) { }
prev = this.spprofiles[this.spprofiles.indexOf(prev) - 1]; } else {
if (prev) { this.$root.cfg.audio.maikiwiAudio.spatialProfile = this.spprofiles[0].id;
this.$root.cfg.audio.maikiwiAudio.spatialProfile = prev.id; }
} else { this.toggleMaikiwiSpatial()
this.$root.cfg.audio.maikiwiAudio.spatialProfile = this.spprofiles[this.spprofiles.length - 1].id; },
} profilePrev() {
} else { // select the previous profile based on $root.cfg.audio.maikiwiAudio.spatialProfile
this.$root.cfg.audio.maikiwiAudio.spatialProfile = this.spprofiles[this.spprofiles.length - 1].id; var prev = this.spprofiles.find(function (profile) {
} return profile.id === this.$root.cfg.audio.maikiwiAudio.spatialProfile;
this.toggleMaikiwiSpatial() }.bind(this));
}, if (prev) {
toggleSpatial: function () { prev = this.spprofiles[this.spprofiles.indexOf(prev) - 1];
if (app.cfg.audio.spatial) { if (prev) {
CiderAudio.spatialOn() this.$root.cfg.audio.maikiwiAudio.spatialProfile = prev.id;
CiderAudio.hierarchical_loading(); } else {
} else { this.$root.cfg.audio.maikiwiAudio.spatialProfile = this.spprofiles[this.spprofiles.length - 1].id;
CiderAudio.spatialOff() }
} } else {
}, this.$root.cfg.audio.maikiwiAudio.spatialProfile = this.spprofiles[this.spprofiles.length - 1].id;
toggleMaikiwiSpatial: function () { }
if (app.cfg.audio.maikiwiAudio.spatial === true) { this.toggleMaikiwiSpatial()
CiderAudio.spatialOn() },
CiderAudio.hierarchical_loading(); toggleSpatial: function () {
//let normalized = Math.pow(10, (((Math.log10(app.mk.volume) * 20) - 14) / 20)); if (app.cfg.audio.spatial) {
//app.mk.volume = normalized CiderAudio.spatialOn()
// -13dBFS Target CiderAudio.hierarchical_loading();
} else { } else {
//let normalized = Math.pow(10, (((Math.log10(app.mk.volume) * 20) + 14) / 20)); CiderAudio.spatialOff()
//app.mk.volume = normalized }
CiderAudio.spatialOn() },
CiderAudio.hierarchical_loading(); toggleMaikiwiSpatial: function () {
} if (app.cfg.audio.maikiwiAudio.spatial === true) {
}, CiderAudio.spatialOn()
ChangeanalogWarmth: function () { CiderAudio.hierarchical_loading();
let WARMTH_GAIN = [-4.81, 0.74, 0.55, -0.84, -1.52, 0.84, 0.66, -0.29, 0.29, 0.94, 1.67, 1.62, -0.53, -0.81, -4.98, 1.43, 0.86, 1.13, -1.06, -0.95, -1.13, 1.78, -3.86]; //let normalized = Math.pow(10, (((Math.log10(app.mk.volume) * 20) - 14) / 20));
//app.mk.volume = normalized
switch (app.cfg.audio.maikiwiAudio.analogWarmth_value) { // -13dBFS Target
case "SMOOTH": } else {
for (let i = 0; i < 23; i++) { //let normalized = Math.pow(10, (((Math.log10(app.mk.volume) * 20) + 14) / 20));
CiderAudio.audioNodes.analogWarmth[i].gain.value = WARMTH_GAIN[i] * 1.25; //app.mk.volume = normalized
} CiderAudio.spatialOn()
break; CiderAudio.hierarchical_loading();
case "WARM": }
for (let i = 0; i < 23; i++) { },
CiderAudio.audioNodes.analogWarmth[i].gain.value = WARMTH_GAIN[i] * 1.75; ChangeanalogWarmth: function () {
} let WARMTH_GAIN = [-4.81, 0.74, 0.55, -0.84, -1.52, 0.84, 0.66, -0.29, 0.29, 0.94, 1.67, 1.62, -0.53, -0.81, -4.98, 1.43, 0.86, 1.13, -1.06, -0.95, -1.13, 1.78, -3.86];
break;
} switch (app.cfg.audio.maikiwiAudio.analogWarmth_value) {
case "SMOOTH":
}, for (let i = 0; i < 23; i++) {
} CiderAudio.audioNodes.analogWarmth[i].gain.value = WARMTH_GAIN[i] * 1.25;
}) }
break;
case "WARM":
for (let i = 0; i < 23; i++) {
CiderAudio.audioNodes.analogWarmth[i].gain.value = WARMTH_GAIN[i] * 1.75;
}
break;
default:
app.cfg.audio.maikiwiAudio.analogWarmth_value = "SMOOTH";
for (let i = 0; i < 23; i++) {
CiderAudio.audioNodes.analogWarmth[i].gain.value = WARMTH_GAIN[i] * 1.25;
}
break;
}
},
}
})
</script> </script>