diff --git a/src/constants.js b/src/constants.js index 485c9a7..82a8861 100644 --- a/src/constants.js +++ b/src/constants.js @@ -128,4 +128,4 @@ export const FONT_WIDTH = 3; export const FONT_HEIGHT = 5; export const SOUND_MUSIC_VOLUME = 0.3; -export const SOUND_SFX_VOLUME = 0.05; +export const SOUND_SFX_VOLUME = 0.1; diff --git a/src/sound.js b/src/sound.js index 7bd356a..cbd2a44 100644 --- a/src/sound.js +++ b/src/sound.js @@ -2,14 +2,18 @@ import {SOUND_MUSIC_VOLUME, SOUND_SFX_VOLUME} from './constants.js'; // @ts-ignore export const audio = new (window.AudioContext || window.webkitAudioContext)(); +export const volume = createGain(1); +volume.connect(audio.destination); -export const music = audio.createGain(audio); -music.gain.setValueAtTime(SOUND_MUSIC_VOLUME, audio.currentTime); -music.connect(audio.destination); +export const music = createCompressor(); +export const musicGain = createGain(SOUND_MUSIC_VOLUME); +music.connect(musicGain); +musicGain.connect(volume); -export const sfx = audio.createGain(audio); -sfx.gain.setValueAtTime(SOUND_SFX_VOLUME, audio.currentTime); -sfx.connect(audio.destination); +export const sfx = createCompressor(); +export const sfxGain = createGain(SOUND_SFX_VOLUME); +sfx.connect(sfxGain); +sfxGain.connect(volume); export async function createAudioLoop(src) { const file = await fetch(src); @@ -30,6 +34,22 @@ export function createOsc(type='triangle') { return osc; } +export function createGain(amount) { + const gain = audio.createGain(); + gain.gain.setValueAtTime(amount, audio.currentTime); + return gain; +} + +export function createCompressor() { + let compressor = audio.createDynamicsCompressor(); + compressor.threshold.setValueAtTime(-30, audio.currentTime); + compressor.knee.setValueAtTime(40, audio.currentTime); + compressor.ratio.setValueAtTime(12, audio.currentTime); + compressor.attack.setValueAtTime(0, audio.currentTime); + compressor.release.setValueAtTime(0.25, audio.currentTime); + return compressor; +} + export function playTickSound() { const osc = createOsc('triangle'); osc.frequency.setValueAtTime(440, audio.currentTime);