feat: refine exploration presentation and audio flow
This commit is contained in:
@@ -1,4 +1,8 @@
|
||||
import type { AmbienceTrackKey, MusicTrackKey } from '../audio/audioAssets';
|
||||
import {
|
||||
musicTrackIntegratedLoudnessLufs,
|
||||
type AmbienceTrackKey,
|
||||
type MusicTrackKey
|
||||
} from '../audio/audioAssets';
|
||||
import type { CampSkinId } from './campSkins';
|
||||
|
||||
export type CampMusicGroupId = 'rally' | 'wayfarer' | 'grand-strategy' | 'frontier';
|
||||
@@ -117,3 +121,41 @@ export function getCampSoundscape(skinId: CampSkinId): CampSoundscape {
|
||||
ambience: campAmbienceDefinitions[mapping.ambienceId]
|
||||
};
|
||||
}
|
||||
|
||||
export function campMusicVolumeForTrackKey(
|
||||
trackKey: string,
|
||||
fallbackVolume = 0.2
|
||||
) {
|
||||
return Object.values(campMusicGroups).find(
|
||||
(definition) => definition.trackKey === trackKey
|
||||
)?.volume ?? fallbackVolume;
|
||||
}
|
||||
|
||||
export function musicVolumeMatchedToCampTrack(
|
||||
trackKey: MusicTrackKey,
|
||||
referenceTrackKey: CampMusicTrackKey = 'camp-rally',
|
||||
fallbackVolume = campMusicVolumeForTrackKey(referenceTrackKey)
|
||||
) {
|
||||
const trackLoudness = musicTrackIntegratedLoudnessLufs[trackKey];
|
||||
const referenceLoudness =
|
||||
musicTrackIntegratedLoudnessLufs[referenceTrackKey];
|
||||
const referenceVolume = campMusicVolumeForTrackKey(
|
||||
referenceTrackKey,
|
||||
fallbackVolume
|
||||
);
|
||||
if (
|
||||
!Number.isFinite(trackLoudness) ||
|
||||
!Number.isFinite(referenceLoudness) ||
|
||||
!Number.isFinite(referenceVolume) ||
|
||||
referenceVolume <= 0
|
||||
) {
|
||||
return fallbackVolume;
|
||||
}
|
||||
|
||||
const matchedVolume =
|
||||
referenceVolume *
|
||||
10 ** ((referenceLoudness - trackLoudness) / 20);
|
||||
return Math.round(
|
||||
Math.min(1, Math.max(0.01, matchedVolume)) * 1000
|
||||
) / 1000;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user