pax_global_header00006660000000000000000000000064142402357330014515gustar00rootroot0000000000000052 comment=868a42b03167d37c83075aaa52e8e4fa5584d4b1 easyeffects-4.8.7/000077500000000000000000000000001424023573300140365ustar00rootroot00000000000000easyeffects-4.8.7/.circleci/000077500000000000000000000000001424023573300156715ustar00rootroot00000000000000easyeffects-4.8.7/.circleci/config.yml000066400000000000000000000115551424023573300176700ustar00rootroot00000000000000version: 2.0 jobs: archlinux: docker: - image: archlinux/base:latest environment: LANG: C DISPLAY: :10 G_MESSAGES_DEBUG: pulseeffects steps: - run: date +%F > /tmp/date - run: | mkdir -p pacman_cache /root/.ccache pacman -Sy --noconfirm # circleci cache needs tar pacman -S tar --noconfirm - restore_cache: keys: - pacman-cache-{{ checksum "/tmp/date" }} - run: | pacman -Su --cachedir pacman_cache --noconfirm pacman -S --cachedir pacman_cache --noconfirm pkg-config git gcc meson itstool boost appstream-glib gettext gtk3 gtkmm3 glibmm pulseaudio gstreamer gst-plugins-good gst-plugins-bad boost-libs libsigc++ libsndfile libsamplerate zita-convolver libebur128 lilv calf zam-plugins rubberband mda.lv2 lsp-plugins xorg-server-xvfb gawk ccache pacman -Sc --cachedir pacman_cache --noconfirm - save_cache: key: pacman-cache-{{ checksum "/tmp/date" }} paths: - pacman_cache - run: rm -rf pacman_cache - run: name: Starting Xvfb command: Xvfb $DISPLAY -screen 0 1280x1024x24 background: true - run: name: Starting dbus command: | DBUS=$(dbus-launch | awk -F, '{print $1;exit}') && echo $DBUS echo "export $DBUS" >> $BASH_ENV - run: name: Starting Pulseaudio command: | pulseaudio -D --exit-idle-time=-1 pactl load-module module-null-sink sink_name=DummyOutput pactl load-module module-null-source source_name=DummyInput pacmd set-default-source DummyInput pacmd set-default-sink DummyOutput pactl list sinks && pactl list sources - restore_cache: keys: - ccache-{{ checksum "/tmp/date" }} - checkout - run: name: Compile and install PulseEffects command: | meson build && cd build && ninja -j 8 && ninja -j 8 install - save_cache: key: ccache-{{ checksum "/tmp/date" }} paths: - /root/.ccache - run: name: Starting PE in background command: | pulseeffects background: true - run: name: Waiting PulseEffects initialization command: .circleci/wait_pe.sh - run: name: Testing play/pause command: | .circleci/enable_all_plugins.sh # sink inputs gst-launch-1.0 audiotestsrc num-buffers=100 ! queue ! pulsesink gst-launch-1.0 audiotestsrc num-buffers=100 ! queue ! pulsesink # source outputs gst-launch-1.0 pulsesrc num-buffers=100 ! queue ! pulsesink gst-launch-1.0 pulsesrc num-buffers=100 ! queue ! pulsesink - run: name: Simulating audio applications command: | gst-launch-1.0 audiotestsrc ! queue ! pulsesink & gst-launch-1.0 pulsesrc ! queue ! pulsesink background: true - run: name: Testing plugin enable/disable on the fly command: | sleep 5 .circleci/enable_all_plugins.sh sleep 1 .circleci/disable_all_plugins.sh sleep 1 .circleci/enable_all_plugins.sh - run: name: Testing presets command: | sleep 5 cp -v .circleci/presets/soe_preset_disable_all.json /root/.config/PulseEffects/input cp -v .circleci/presets/soe_preset_enable_all.json /root/.config/PulseEffects/input cp -v .circleci/presets/sie_preset_disable_all.json /root/.config/PulseEffects/output cp -v .circleci/presets/sie_preset_enable_all.json /root/.config/PulseEffects/output pulseeffects -l soe_preset_disable_all || true sleep 1 pulseeffects -l soe_preset_enable_all || true sleep 1 pulseeffects -l sie_preset_disable_all || true sleep 1 pulseeffects -l sie_preset_enalbe_all || true - run: name: Reset Configuration command: | sleep 5 pulseeffects -r || true - run: name: Finish PE process command: | sleep 5 pulseeffects -q || true workflows: version: 2 build: jobs: - archlinux easyeffects-4.8.7/.circleci/disable_all_plugins.sh000077500000000000000000000073421424023573300222320ustar00rootroot00000000000000#!/usr/bin/env bash # general settings gsettings set com.github.wwmm.pulseeffects enable-all-sourceoutputs false # effects for sink inputs gsettings set com.github.wwmm.pulseeffects.autogain:/com/github/wwmm/pulseeffects/sinkinputs/autogain/ state false gsettings set com.github.wwmm.pulseeffects.bassenhancer:/com/github/wwmm/pulseeffects/sinkinputs/bassenhancer/ state false gsettings set com.github.wwmm.pulseeffects.compressor:/com/github/wwmm/pulseeffects/sinkinputs/compressor/ state false gsettings set com.github.wwmm.pulseeffects.convolver:/com/github/wwmm/pulseeffects/sinkinputs/convolver/ state false gsettings set com.github.wwmm.pulseeffects.crossfeed:/com/github/wwmm/pulseeffects/sinkinputs/crossfeed/ state false gsettings set com.github.wwmm.pulseeffects.crystalizer:/com/github/wwmm/pulseeffects/sinkinputs/crystalizer/ state false gsettings set com.github.wwmm.pulseeffects.deesser:/com/github/wwmm/pulseeffects/sinkinputs/deesser/ state false gsettings set com.github.wwmm.pulseeffects.delay:/com/github/wwmm/pulseeffects/sinkinputs/delay/ state false gsettings set com.github.wwmm.pulseeffects.equalizer:/com/github/wwmm/pulseeffects/sinkinputs/equalizer/ state false gsettings set com.github.wwmm.pulseeffects.exciter:/com/github/wwmm/pulseeffects/sinkinputs/exciter/ state false gsettings set com.github.wwmm.pulseeffects.filter:/com/github/wwmm/pulseeffects/sinkinputs/filter/ state false gsettings set com.github.wwmm.pulseeffects.gate:/com/github/wwmm/pulseeffects/sinkinputs/gate/ state false gsettings set com.github.wwmm.pulseeffects.limiter:/com/github/wwmm/pulseeffects/sinkinputs/limiter/ state false gsettings set com.github.wwmm.pulseeffects.loudness:/com/github/wwmm/pulseeffects/sinkinputs/loudness/ state false gsettings set com.github.wwmm.pulseeffects.maximizer:/com/github/wwmm/pulseeffects/sinkinputs/maximizer/ state false gsettings set com.github.wwmm.pulseeffects.multibandcompressor:/com/github/wwmm/pulseeffects/sinkinputs/multibandcompressor/ state false gsettings set com.github.wwmm.pulseeffects.multibandgate:/com/github/wwmm/pulseeffects/sinkinputs/multibandgate/ state false gsettings set com.github.wwmm.pulseeffects.pitch:/com/github/wwmm/pulseeffects/sinkinputs/pitch/ state false gsettings set com.github.wwmm.pulseeffects.reverb:/com/github/wwmm/pulseeffects/sinkinputs/reverb/ state false gsettings set com.github.wwmm.pulseeffects.stereotools:/com/github/wwmm/pulseeffects/sinkinputs/stereotools/ state false # effects for source outputs gsettings set com.github.wwmm.pulseeffects.compressor:/com/github/wwmm/pulseeffects/sourceoutputs/compressor/ state false gsettings set com.github.wwmm.pulseeffects.deesser:/com/github/wwmm/pulseeffects/sourceoutputs/deesser/ state false gsettings set com.github.wwmm.pulseeffects.equalizer:/com/github/wwmm/pulseeffects/sourceoutputs/equalizer/ state false gsettings set com.github.wwmm.pulseeffects.filter:/com/github/wwmm/pulseeffects/sourceoutputs/filter/ state false gsettings set com.github.wwmm.pulseeffects.gate:/com/github/wwmm/pulseeffects/sourceoutputs/gate/ state false gsettings set com.github.wwmm.pulseeffects.limiter:/com/github/wwmm/pulseeffects/sourceoutputs/limiter/ state false gsettings set com.github.wwmm.pulseeffects.multibandcompressor:/com/github/wwmm/pulseeffects/sourceoutputs/multibandcompressor/ state false gsettings set com.github.wwmm.pulseeffects.multibandgate:/com/github/wwmm/pulseeffects/sourceoutputs/multibandgate/ state false gsettings set com.github.wwmm.pulseeffects.pitch:/com/github/wwmm/pulseeffects/sourceoutputs/pitch/ state false gsettings set com.github.wwmm.pulseeffects.reverb:/com/github/wwmm/pulseeffects/sourceoutputs/reverb/ state false gsettings set com.github.wwmm.pulseeffects.webrtc:/com/github/wwmm/pulseeffects/sourceoutputs/webrtc/ state false easyeffects-4.8.7/.circleci/enable_all_plugins.sh000077500000000000000000000073021424023573300220510ustar00rootroot00000000000000#!/usr/bin/env bash # general settings gsettings set com.github.wwmm.pulseeffects enable-all-sourceoutputs true # effects for sink inputs gsettings set com.github.wwmm.pulseeffects.autogain:/com/github/wwmm/pulseeffects/sinkinputs/autogain/ state true gsettings set com.github.wwmm.pulseeffects.bassenhancer:/com/github/wwmm/pulseeffects/sinkinputs/bassenhancer/ state true gsettings set com.github.wwmm.pulseeffects.compressor:/com/github/wwmm/pulseeffects/sinkinputs/compressor/ state true gsettings set com.github.wwmm.pulseeffects.convolver:/com/github/wwmm/pulseeffects/sinkinputs/convolver/ state true gsettings set com.github.wwmm.pulseeffects.crossfeed:/com/github/wwmm/pulseeffects/sinkinputs/crossfeed/ state true gsettings set com.github.wwmm.pulseeffects.crystalizer:/com/github/wwmm/pulseeffects/sinkinputs/crystalizer/ state true gsettings set com.github.wwmm.pulseeffects.deesser:/com/github/wwmm/pulseeffects/sinkinputs/deesser/ state true gsettings set com.github.wwmm.pulseeffects.delay:/com/github/wwmm/pulseeffects/sinkinputs/delay/ state true gsettings set com.github.wwmm.pulseeffects.equalizer:/com/github/wwmm/pulseeffects/sinkinputs/equalizer/ state true gsettings set com.github.wwmm.pulseeffects.exciter:/com/github/wwmm/pulseeffects/sinkinputs/exciter/ state true gsettings set com.github.wwmm.pulseeffects.filter:/com/github/wwmm/pulseeffects/sinkinputs/filter/ state true gsettings set com.github.wwmm.pulseeffects.gate:/com/github/wwmm/pulseeffects/sinkinputs/gate/ state true gsettings set com.github.wwmm.pulseeffects.limiter:/com/github/wwmm/pulseeffects/sinkinputs/limiter/ state true gsettings set com.github.wwmm.pulseeffects.loudness:/com/github/wwmm/pulseeffects/sinkinputs/loudness/ state true gsettings set com.github.wwmm.pulseeffects.maximizer:/com/github/wwmm/pulseeffects/sinkinputs/maximizer/ state true gsettings set com.github.wwmm.pulseeffects.multibandcompressor:/com/github/wwmm/pulseeffects/sinkinputs/multibandcompressor/ state true gsettings set com.github.wwmm.pulseeffects.multibandgate:/com/github/wwmm/pulseeffects/sinkinputs/multibandgate/ state true gsettings set com.github.wwmm.pulseeffects.pitch:/com/github/wwmm/pulseeffects/sinkinputs/pitch/ state true gsettings set com.github.wwmm.pulseeffects.reverb:/com/github/wwmm/pulseeffects/sinkinputs/reverb/ state true gsettings set com.github.wwmm.pulseeffects.stereotools:/com/github/wwmm/pulseeffects/sinkinputs/stereotools/ state true # effects for source outputs gsettings set com.github.wwmm.pulseeffects.compressor:/com/github/wwmm/pulseeffects/sourceoutputs/compressor/ state true gsettings set com.github.wwmm.pulseeffects.deesser:/com/github/wwmm/pulseeffects/sourceoutputs/deesser/ state true gsettings set com.github.wwmm.pulseeffects.equalizer:/com/github/wwmm/pulseeffects/sourceoutputs/equalizer/ state true gsettings set com.github.wwmm.pulseeffects.filter:/com/github/wwmm/pulseeffects/sourceoutputs/filter/ state true gsettings set com.github.wwmm.pulseeffects.gate:/com/github/wwmm/pulseeffects/sourceoutputs/gate/ state true gsettings set com.github.wwmm.pulseeffects.limiter:/com/github/wwmm/pulseeffects/sourceoutputs/limiter/ state true gsettings set com.github.wwmm.pulseeffects.multibandcompressor:/com/github/wwmm/pulseeffects/sourceoutputs/multibandcompressor/ state true gsettings set com.github.wwmm.pulseeffects.multibandgate:/com/github/wwmm/pulseeffects/sourceoutputs/multibandgate/ state true gsettings set com.github.wwmm.pulseeffects.pitch:/com/github/wwmm/pulseeffects/sourceoutputs/pitch/ state true gsettings set com.github.wwmm.pulseeffects.reverb:/com/github/wwmm/pulseeffects/sourceoutputs/reverb/ state true gsettings set com.github.wwmm.pulseeffects.webrtc:/com/github/wwmm/pulseeffects/sourceoutputs/webrtc/ state true easyeffects-4.8.7/.circleci/presets/000077500000000000000000000000001424023573300173565ustar00rootroot00000000000000easyeffects-4.8.7/.circleci/presets/sie_preset_disable_all.json000066400000000000000000000230421424023573300247270ustar00rootroot00000000000000{ "spectrum": { "show": "true", "n-points": "100", "height": "100", "use-custom-color": "true", "fill": "true", "show-bar-border": "true", "scale": "1", "exponent": "1", "sampling-freq": "10", "line-width": "2", "type": "Bars", "color": [ "0", "1", "1", "1" ], "gradient-color": [ "0", "1", "1", "0.52364864864864868" ] }, "output": { "blacklist": "", "plugins_order": [ "limiter", "autogain", "exciter", "crystalizer", "loudness", "bass_enhancer", "convolver", "equalizer", "filter", "compressor", "reverb", "crossfeed", "maximizer", "multiband_compressor", "gate", "multiband_gate", "stereo_tools", "deesser", "pitch", "delay" ], "bass_enhancer": { "state": "false", "input-gain": "0", "output-gain": "0", "amount": "-4", "harmonics": "8.5", "scope": "250", "floor": "40", "blend": "0", "floor-active": "true", "listen": "false" }, "compressor": { "state": "false", "detection": "RMS", "stereo-link": "Average", "mix": "0", "attack": "20", "release": "250", "threshold": "-30", "ratio": "4", "knee": "-15", "makeup": "0" }, "crossfeed": { "state": "false", "fcut": "700", "feed": "4.5" }, "deesser": { "state": "false", "detection": "RMS", "mode": "Split", "threshold": "-20", "ratio": "3", "laxity": "15", "makeup": "0", "f1-freq": "10000", "f2-freq": "11000", "f1-level": "0", "f2-level": "12", "f2-q": "2", "sc-listen": "false" }, "equalizer": { "state": "false", "mode": "IIR", "num-bands": "4", "input-gain": "0", "output-gain": "0", "split-channels": "false", "left": { "band0": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "-3.5", "frequency": "500", "q": "0.49999999999999867" }, "band1": { "type": "Resonance", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "-4", "frequency": "4500", "q": "9" }, "band2": { "type": "Bell", "mode": "RLC (BT)", "slope": "x4", "solo": "false", "mute": "false", "gain": "1.5", "frequency": "1600", "q": "2" }, "band3": { "type": "Bell", "mode": "RLC (BT)", "slope": "x4", "solo": "false", "mute": "false", "gain": "-2", "frequency": "5500", "q": "2" } }, "right": { "band0": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "-3.5", "frequency": "500", "q": "0.49999999999999867" }, "band1": { "type": "Resonance", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "-4", "frequency": "4500", "q": "9" }, "band2": { "type": "Bell", "mode": "RLC (BT)", "slope": "x4", "solo": "false", "mute": "false", "gain": "1.5", "frequency": "1600", "q": "2" }, "band3": { "type": "Bell", "mode": "RLC (BT)", "slope": "x4", "solo": "false", "mute": "false", "gain": "-2", "frequency": "5500", "q": "2" } } }, "exciter": { "state": "false", "input-gain": "0", "output-gain": "0", "amount": "-15", "harmonics": "8.5", "scope": "2000", "ceil": "16000", "blend": "0", "ceil-active": "false", "listen": "false" }, "filter": { "state": "false", "input-gain": "0", "output-gain": "0", "frequency": "2000", "resonance": "-3", "mode": "12dB\/oct Lowpass", "inertia": "20" }, "gate": { "state": "false", "detection": "RMS", "stereo-link": "Average", "range": "-24", "attack": "20", "release": "250", "threshold": "-18", "ratio": "2", "knee": "9", "makeup": "0" }, "limiter": { "state": "false", "input-gain": "0", "limit": "-1", "lookahead": "5", "release": "1000", "asc": "true", "asc-level": "1", "oversampling": "1" }, "maximizer": { "state": "false", "release": "3.1600000000000001", "ceiling": "0", "threshold": "0" }, "pitch": { "state": "false", "input-gain": "0", "output-gain": "0", "cents": "0", "semitones": "0", "octaves": "0", "crispness": "3", "formant-preserving": "false", "faster": "false" }, "reverb": { "state": "false", "input-gain": "0", "output-gain": "0", "room-size": "Large", "decay-time": "1.5", "hf-damp": "5000", "diffusion": "0.5", "amount": "-12", "dry": "0", "predelay": "0", "bass-cut": "300", "treble-cut": "5000" }, "multiband_compressor": { "state": "false", "input-gain": "0", "output-gain": "0", "freq0": "120", "freq1": "1000", "freq2": "6000", "mode": "LR8", "subband": { "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "lowband": { "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "midband": { "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "highband": { "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" } }, "loudness": { "state": "false", "loudness": "-2.9999999999999893", "output": "-7", "link": "-9.0000000000000018" }, "multiband_gate": { "state": "false", "input-gain": "0", "output-gain": "0", "freq0": "120", "freq1": "1000", "freq2": "6000", "mode": "LR8", "subband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "lowband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "midband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "highband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" } }, "stereo_tools": { "state": "false", "input-gain": "0", "output-gain": "0", "balance-in": "0", "balance-out": "0", "softclip": "false", "mutel": "false", "muter": "false", "phasel": "false", "phaser": "false", "mode": "LR > LR (Stereo Default)", "side-level": "0", "side-balance": "0", "middle-level": "0", "middle-panorama": "0", "stereo-base": "0", "delay": "0", "sc-level": "1", "stereo-phase": "0" }, "convolver": { "state": "false", "input-gain": "0", "output-gain": "0", "kernel-path": "\/home\/wallace\/.config\/PulseEffects\/irs\/Samsung SoundAlive ((48k Z-Edition)) 10.3D+Clarity.irs", "ir-width": "100", "blocksize": "512" }, "crystalizer": { "state": "false", "input-gain": "0", "output-gain": "-6", "intensity-low": "3", "intensity-mid": "1.5", "intensity-high": "0.75000000000000022", "mute-low": "false", "mute-mid": "false", "mute-high": "false" }, "autogain": { "state": "false", "input-gain": "0", "output-gain": "0", "target": "-23", "weight-m": "1", "weight-s": "2", "weight-i": "3" }, "delay": { "state": "false", "input-gain": "0", "output-gain": "0", "time-l": "0", "time-r": "0" } } }easyeffects-4.8.7/.circleci/presets/sie_preset_enable_all.json000066400000000000000000000344731424023573300245640ustar00rootroot00000000000000{ "spectrum": { "show": "true", "n-points": "100", "height": "100", "use-custom-color": "true", "fill": "true", "show-bar-border": "true", "scale": "1", "exponent": "1", "sampling-freq": "10", "line-width": "2", "type": "Bars", "color": [ "0", "1", "1", "1" ], "gradient-color": [ "0", "1", "1", "0.52364864864864868" ] }, "output": { "blacklist": "", "plugins_order": [ "limiter", "autogain", "multiband_compressor", "convolver", "bass_enhancer", "exciter", "equalizer", "delay", "maximizer", "stereo_tools", "compressor", "reverb", "filter", "crossfeed", "loudness", "gate", "multiband_gate", "deesser", "crystalizer", "pitch" ], "bass_enhancer": { "state": "true", "input-gain": "0", "output-gain": "0", "amount": "0.40000000000000013", "harmonics": "8.5", "scope": "250", "floor": "20", "blend": "0", "floor-active": "true", "listen": "false" }, "compressor": { "state": "true", "input-gain": "0", "output-gain": "0", "mode": "Downward", "attack": "25", "release": "100", "threshold": "-21.072093963623047", "ratio": "4.2500799999999996", "knee": "-20", "makeup": "0", "sidechain": { "listen": "false", "type": "Feed-forward", "mode": "RMS", "source": "Middle", "preamp": "0", "reactivity": "10", "lookahead": "0" } }, "crossfeed": { "state": "true", "fcut": "700", "feed": "4.5" }, "deesser": { "state": "true", "detection": "RMS", "mode": "Wide", "threshold": "-18", "ratio": "3", "laxity": "15", "makeup": "0", "f1-freq": "6000", "f2-freq": "4500", "f1-level": "0", "f2-level": "12", "f2-q": "1", "sc-listen": "false" }, "equalizer": { "state": "true", "mode": "IIR", "num-bands": "4", "input-gain": "0", "output-gain": "0", "split-channels": "false", "left": { "band0": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "-3", "frequency": "500", "q": "0.49999999999999867" }, "band1": { "type": "Resonance", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "-3.5", "frequency": "4500", "q": "9" }, "band2": { "type": "Bell", "mode": "RLC (BT)", "slope": "x4", "solo": "false", "mute": "false", "gain": "1", "frequency": "1600", "q": "2" }, "band3": { "type": "Bell", "mode": "RLC (BT)", "slope": "x4", "solo": "false", "mute": "false", "gain": "-1.5", "frequency": "5500", "q": "2" } }, "right": { "band0": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "-3", "frequency": "500", "q": "0.49999999999999867" }, "band1": { "type": "Resonance", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "-3.5", "frequency": "4500", "q": "9" }, "band2": { "type": "Bell", "mode": "RLC (BT)", "slope": "x4", "solo": "false", "mute": "false", "gain": "1", "frequency": "1600", "q": "2" }, "band3": { "type": "Bell", "mode": "RLC (BT)", "slope": "x4", "solo": "false", "mute": "false", "gain": "-1.5", "frequency": "5500", "q": "2" } } }, "exciter": { "state": "true", "input-gain": "0", "output-gain": "0", "amount": "-8", "harmonics": "8.5", "scope": "2000", "ceil": "16000", "blend": "0", "ceil-active": "false", "listen": "false" }, "filter": { "state": "true", "input-gain": "0", "output-gain": "0", "frequency": "2000", "resonance": "-3", "mode": "12dB\/oct Lowpass", "inertia": "20" }, "gate": { "state": "true", "detection": "RMS", "stereo-link": "Average", "range": "-24", "attack": "20", "release": "250", "threshold": "-18", "ratio": "2", "knee": "9", "makeup": "0" }, "limiter": { "state": "true", "input-gain": "0", "limit": "0", "lookahead": "10", "release": "100", "asc": "true", "asc-level": "1", "oversampling": "1" }, "maximizer": { "state": "true", "release": "3.1600000000000001", "ceiling": "0", "threshold": "-16" }, "pitch": { "state": "true", "input-gain": "0", "output-gain": "0", "cents": "0", "semitones": "0", "octaves": "0", "crispness": "3", "formant-preserving": "false", "faster": "false" }, "reverb": { "state": "true", "input-gain": "0", "output-gain": "0", "room-size": "Large\/smooth", "decay-time": "0.44594499999999998", "hf-damp": "5508.46", "diffusion": "0.54000000000000004", "amount": "-9", "dry": "0", "predelay": "25", "bass-cut": "257.64999999999998", "treble-cut": "20000" }, "multiband_compressor": { "state": "true", "input-gain": "0", "output-gain": "0", "freq0": "300", "freq1": "1000", "freq2": "4000", "mode": "LR8", "subband": { "threshold": "-30", "ratio": "4", "attack": "100", "release": "500", "makeup": "0", "knee": "18", "detection": "Peak", "bypass": "false", "solo": "false" }, "lowband": { "threshold": "-40", "ratio": "2", "attack": "100", "release": "500", "makeup": "0", "knee": "9", "detection": "Peak", "bypass": "false", "solo": "false" }, "midband": { "threshold": "-50", "ratio": "2", "attack": "50", "release": "500", "makeup": "0", "knee": "9", "detection": "Peak", "bypass": "false", "solo": "false" }, "highband": { "threshold": "-40", "ratio": "4", "attack": "100", "release": "500", "makeup": "0", "knee": "18", "detection": "Peak", "bypass": "false", "solo": "false" } }, "loudness": { "state": "true", "loudness": "-3.1000000000000001", "output": "-6", "link": "-9.0999999999999996" }, "multiband_gate": { "state": "true", "input-gain": "0", "output-gain": "0", "freq0": "120", "freq1": "1000", "freq2": "6000", "mode": "LR8", "subband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "lowband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "midband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "highband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" } }, "stereo_tools": { "state": "true", "input-gain": "0", "output-gain": "0", "balance-in": "0", "balance-out": "0", "softclip": "false", "mutel": "false", "muter": "false", "phasel": "false", "phaser": "false", "mode": "LR > LR (Stereo Default)", "side-level": "0", "side-balance": "0", "middle-level": "0", "middle-panorama": "0", "stereo-base": "0", "delay": "1.5000000000000011", "sc-level": "1", "stereo-phase": "0" }, "convolver": { "state": "true", "input-gain": "0", "output-gain": "0", "kernel-path": "\/home\/wallace\/.config\/PulseEffects\/irs\/Samsung SoundAlive Small Room.irs", "ir-width": "150" }, "crystalizer": { "state": "true", "aggressive": "false", "input-gain": "0", "output-gain": "0", "band0": { "intensity": "12", "mute": "false", "bypass": "false" }, "band1": { "intensity": "10", "mute": "false", "bypass": "false" }, "band2": { "intensity": "8", "mute": "false", "bypass": "false" }, "band3": { "intensity": "6", "mute": "false", "bypass": "false" }, "band4": { "intensity": "4", "mute": "false", "bypass": "false" }, "band5": { "intensity": "2", "mute": "false", "bypass": "false" }, "band6": { "intensity": "0", "mute": "false", "bypass": "false" }, "band7": { "intensity": "-2", "mute": "false", "bypass": "false" }, "band8": { "intensity": "-4", "mute": "false", "bypass": "false" }, "band9": { "intensity": "-6", "mute": "false", "bypass": "false" }, "band10": { "intensity": "-8", "mute": "false", "bypass": "false" }, "band11": { "intensity": "-10", "mute": "false", "bypass": "false" }, "band12": { "intensity": "-12", "mute": "false", "bypass": "false" } }, "autogain": { "state": "true", "input-gain": "0", "output-gain": "0", "target": "-23", "weight-m": "3", "weight-s": "2", "weight-i": "1" }, "delay": { "state": "true", "input-gain": "0", "output-gain": "0", "time-l": "0", "time-r": "1.5000000000000011" } } } easyeffects-4.8.7/.circleci/presets/soe_preset_disable_all.json000066400000000000000000000720541424023573300247440ustar00rootroot00000000000000{ "spectrum": { "show": "true", "n-points": "100", "height": "100", "use-custom-color": "true", "fill": "true", "show-bar-border": "true", "scale": "1", "exponent": "1", "sampling-freq": "10", "line-width": "2", "type": "Bars", "color": [ "0", "1", "1", "1" ], "gradient-color": [ "0", "1", "1", "0.52364864864864868" ] }, "input": { "blacklist": "", "plugins_order": [ "limiter", "gate", "webrtc", "multiband_gate", "compressor", "multiband_compressor", "filter", "equalizer", "deesser", "reverb", "pitch" ], "compressor": { "state": "false", "input-gain": "0", "output-gain": "0", "mode": "Downward", "attack": "20", "release": "250", "threshold": "-18", "ratio": "2", "knee": "-6", "makeup": "0", "sidechain": { "listen": "false", "type": "Feed-forward", "mode": "RMS", "source": "Middle", "preamp": "0", "reactivity": "10", "lookahead": "0" } }, "deesser": { "state": "false", "detection": "RMS", "mode": "Wide", "threshold": "-18", "ratio": "3", "laxity": "15", "makeup": "0", "f1-freq": "6000", "f2-freq": "4500", "f1-level": "0", "f2-level": "12", "f2-q": "1", "sc-listen": "false" }, "equalizer": { "state": "false", "mode": "IIR", "num-bands": "30", "input-gain": "0", "output-gain": "0", "split-channels": "false", "left": { "band0": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "22.589254117941671", "q": "4.3600000000000003" }, "band1": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "28.438186042552807", "q": "4.3600000000000003" }, "band2": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "35.801555074299934", "q": "4.3600000000000003" }, "band3": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "45.071487464784603", "q": "4.3600000000000003" }, "band4": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "56.741640916779602", "q": "4.3600000000000003" }, "band5": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "71.433493657033537", "q": "4.3600000000000003" }, "band6": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "89.929440418076979", "q": "4.3600000000000003" }, "band7": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "113.21445781074659", "q": "4.3600000000000003" }, "band8": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "142.52855792044753", "q": "4.3600000000000003" }, "band9": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "179.43282347242823", "q": "4.3600000000000003" }, "band10": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "225.89254117941681", "q": "4.3600000000000003" }, "band11": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "284.3818604255282", "q": "4.3600000000000003" }, "band12": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "358.01555074299949", "q": "4.3600000000000003" }, "band13": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "450.71487464784627", "q": "4.3600000000000003" }, "band14": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "567.41640916779625", "q": "4.3600000000000003" }, "band15": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "714.33493657033569", "q": "4.3600000000000003" }, "band16": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "899.29440418077013", "q": "4.3600000000000003" }, "band17": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "1132.1445781074663", "q": "4.3600000000000003" }, "band18": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "1425.2855792044757", "q": "4.3600000000000003" }, "band19": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "1794.328234724283", "q": "4.3600000000000003" }, "band20": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "2258.9254117941691", "q": "4.3600000000000003" }, "band21": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "2843.8186042552834", "q": "4.3600000000000003" }, "band22": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "3580.1555074299968", "q": "4.3600000000000003" }, "band23": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "4507.1487464784641", "q": "4.3600000000000003" }, "band24": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "5674.1640916779661", "q": "4.3600000000000003" }, "band25": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "7143.3493657033605", "q": "4.3600000000000003" }, "band26": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "8992.9440418077065", "q": "4.3600000000000003" }, "band27": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "11321.445781074672", "q": "4.3600000000000003" }, "band28": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "14252.855792044767", "q": "4.3600000000000003" }, "band29": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "17943.282347242843", "q": "4.3600000000000003" } }, "right": { "band0": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "22.589254117941671", "q": "4.3600000000000003" }, "band1": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "28.438186042552807", "q": "4.3600000000000003" }, "band2": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "35.801555074299934", "q": "4.3600000000000003" }, "band3": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "45.071487464784603", "q": "4.3600000000000003" }, "band4": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "56.741640916779602", "q": "4.3600000000000003" }, "band5": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "71.433493657033537", "q": "4.3600000000000003" }, "band6": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "89.929440418076979", "q": "4.3600000000000003" }, "band7": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "113.21445781074659", "q": "4.3600000000000003" }, "band8": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "142.52855792044753", "q": "4.3600000000000003" }, "band9": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "179.43282347242823", "q": "4.3600000000000003" }, "band10": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "225.89254117941681", "q": "4.3600000000000003" }, "band11": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "284.3818604255282", "q": "4.3600000000000003" }, "band12": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "358.01555074299949", "q": "4.3600000000000003" }, "band13": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "450.71487464784627", "q": "4.3600000000000003" }, "band14": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "567.41640916779625", "q": "4.3600000000000003" }, "band15": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "714.33493657033569", "q": "4.3600000000000003" }, "band16": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "899.29440418077013", "q": "4.3600000000000003" }, "band17": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "1132.1445781074663", "q": "4.3600000000000003" }, "band18": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "1425.2855792044757", "q": "4.3600000000000003" }, "band19": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "1794.328234724283", "q": "4.3600000000000003" }, "band20": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "2258.9254117941691", "q": "4.3600000000000003" }, "band21": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "2843.8186042552834", "q": "4.3600000000000003" }, "band22": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "3580.1555074299968", "q": "4.3600000000000003" }, "band23": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "4507.1487464784641", "q": "4.3600000000000003" }, "band24": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "5674.1640916779661", "q": "4.3600000000000003" }, "band25": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "7143.3493657033605", "q": "4.3600000000000003" }, "band26": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "8992.9440418077065", "q": "4.3600000000000003" }, "band27": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "11321.445781074672", "q": "4.3600000000000003" }, "band28": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "14252.855792044767", "q": "4.3600000000000003" }, "band29": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "17943.282347242843", "q": "4.3600000000000003" } } }, "filter": { "state": "false", "input-gain": "0", "output-gain": "0", "frequency": "2000", "resonance": "-3", "mode": "12dB\/oct Lowpass", "inertia": "20" }, "gate": { "state": "false", "detection": "RMS", "stereo-link": "Average", "range": "-24", "attack": "20", "release": "250", "threshold": "-18", "ratio": "2", "knee": "9", "makeup": "0" }, "limiter": { "state": "false", "input-gain": "0", "limit": "0", "lookahead": "5", "release": "1000", "asc": "true", "asc-level": "1", "oversampling": "1" }, "pitch": { "state": "false", "input-gain": "0", "output-gain": "0", "cents": "0", "semitones": "0", "octaves": "0", "crispness": "3", "formant-preserving": "false", "faster": "false" }, "reverb": { "state": "false", "input-gain": "0", "output-gain": "0", "room-size": "Large", "decay-time": "1.5", "hf-damp": "5000", "diffusion": "0.5", "amount": "-12", "dry": "0", "predelay": "0", "bass-cut": "300", "treble-cut": "5000" }, "webrtc": { "state": "false", "high-pass-filter": "true", "echo-cancel": "true", "echo-suppression-level": "moderate", "noise-suppression": "true", "noise-suppression-level": "moderate", "gain-control": "true", "extended-filter": "true", "delay-agnostic": "false", "target-level-dbfs": "3", "compression-gain-db": "9", "limiter": "true", "gain-control-mode": "adaptive-digital", "voice-detection": "false", "voice-detection-frame-size-ms": "10", "voice-detection-likelihood": "low" }, "multiband_compressor": { "state": "false", "input-gain": "0", "output-gain": "0", "freq0": "120", "freq1": "1000", "freq2": "6000", "mode": "LR8", "subband": { "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "lowband": { "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "midband": { "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "highband": { "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" } }, "multiband_gate": { "state": "false", "input-gain": "0", "output-gain": "0", "freq0": "120", "freq1": "1000", "freq2": "6000", "mode": "LR8", "subband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "lowband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "midband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "highband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" } } } } easyeffects-4.8.7/.circleci/presets/soe_preset_enable_all.json000066400000000000000000000720411424023573300245630ustar00rootroot00000000000000{ "spectrum": { "show": "true", "n-points": "100", "height": "100", "use-custom-color": "true", "fill": "true", "show-bar-border": "true", "scale": "1", "exponent": "1", "sampling-freq": "10", "line-width": "2", "type": "Bars", "color": [ "0", "1", "1", "1" ], "gradient-color": [ "0", "1", "1", "0.52364864864864868" ] }, "input": { "blacklist": "", "plugins_order": [ "limiter", "gate", "webrtc", "multiband_gate", "compressor", "multiband_compressor", "filter", "equalizer", "deesser", "reverb", "pitch" ], "compressor": { "state": "true", "input-gain": "0", "output-gain": "0", "mode": "Downward", "attack": "20", "release": "250", "threshold": "-18", "ratio": "2", "knee": "-6", "makeup": "0", "sidechain": { "listen": "false", "type": "Feed-forward", "mode": "RMS", "source": "Middle", "preamp": "0", "reactivity": "10", "lookahead": "0" } }, "deesser": { "state": "true", "detection": "RMS", "mode": "Wide", "threshold": "-18", "ratio": "3", "laxity": "15", "makeup": "0", "f1-freq": "6000", "f2-freq": "4500", "f1-level": "0", "f2-level": "12", "f2-q": "1", "sc-listen": "false" }, "equalizer": { "state": "true", "mode": "IIR", "num-bands": "30", "input-gain": "0", "output-gain": "0", "split-channels": "false", "left": { "band0": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "22.589254117941671", "q": "4.3600000000000003" }, "band1": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "28.438186042552807", "q": "4.3600000000000003" }, "band2": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "35.801555074299934", "q": "4.3600000000000003" }, "band3": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "45.071487464784603", "q": "4.3600000000000003" }, "band4": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "56.741640916779602", "q": "4.3600000000000003" }, "band5": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "71.433493657033537", "q": "4.3600000000000003" }, "band6": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "89.929440418076979", "q": "4.3600000000000003" }, "band7": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "113.21445781074659", "q": "4.3600000000000003" }, "band8": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "142.52855792044753", "q": "4.3600000000000003" }, "band9": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "179.43282347242823", "q": "4.3600000000000003" }, "band10": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "225.89254117941681", "q": "4.3600000000000003" }, "band11": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "284.3818604255282", "q": "4.3600000000000003" }, "band12": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "358.01555074299949", "q": "4.3600000000000003" }, "band13": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "450.71487464784627", "q": "4.3600000000000003" }, "band14": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "567.41640916779625", "q": "4.3600000000000003" }, "band15": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "714.33493657033569", "q": "4.3600000000000003" }, "band16": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "899.29440418077013", "q": "4.3600000000000003" }, "band17": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "1132.1445781074663", "q": "4.3600000000000003" }, "band18": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "1425.2855792044757", "q": "4.3600000000000003" }, "band19": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "1794.328234724283", "q": "4.3600000000000003" }, "band20": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "2258.9254117941691", "q": "4.3600000000000003" }, "band21": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "2843.8186042552834", "q": "4.3600000000000003" }, "band22": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "3580.1555074299968", "q": "4.3600000000000003" }, "band23": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "4507.1487464784641", "q": "4.3600000000000003" }, "band24": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "5674.1640916779661", "q": "4.3600000000000003" }, "band25": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "7143.3493657033605", "q": "4.3600000000000003" }, "band26": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "8992.9440418077065", "q": "4.3600000000000003" }, "band27": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "11321.445781074672", "q": "4.3600000000000003" }, "band28": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "14252.855792044767", "q": "4.3600000000000003" }, "band29": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "17943.282347242843", "q": "4.3600000000000003" } }, "right": { "band0": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "22.589254117941671", "q": "4.3600000000000003" }, "band1": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "28.438186042552807", "q": "4.3600000000000003" }, "band2": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "35.801555074299934", "q": "4.3600000000000003" }, "band3": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "45.071487464784603", "q": "4.3600000000000003" }, "band4": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "56.741640916779602", "q": "4.3600000000000003" }, "band5": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "71.433493657033537", "q": "4.3600000000000003" }, "band6": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "89.929440418076979", "q": "4.3600000000000003" }, "band7": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "113.21445781074659", "q": "4.3600000000000003" }, "band8": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "142.52855792044753", "q": "4.3600000000000003" }, "band9": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "179.43282347242823", "q": "4.3600000000000003" }, "band10": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "225.89254117941681", "q": "4.3600000000000003" }, "band11": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "284.3818604255282", "q": "4.3600000000000003" }, "band12": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "358.01555074299949", "q": "4.3600000000000003" }, "band13": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "450.71487464784627", "q": "4.3600000000000003" }, "band14": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "567.41640916779625", "q": "4.3600000000000003" }, "band15": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "714.33493657033569", "q": "4.3600000000000003" }, "band16": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "899.29440418077013", "q": "4.3600000000000003" }, "band17": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "1132.1445781074663", "q": "4.3600000000000003" }, "band18": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "1425.2855792044757", "q": "4.3600000000000003" }, "band19": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "1794.328234724283", "q": "4.3600000000000003" }, "band20": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "2258.9254117941691", "q": "4.3600000000000003" }, "band21": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "2843.8186042552834", "q": "4.3600000000000003" }, "band22": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "3580.1555074299968", "q": "4.3600000000000003" }, "band23": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "4507.1487464784641", "q": "4.3600000000000003" }, "band24": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "5674.1640916779661", "q": "4.3600000000000003" }, "band25": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "7143.3493657033605", "q": "4.3600000000000003" }, "band26": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "8992.9440418077065", "q": "4.3600000000000003" }, "band27": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "11321.445781074672", "q": "4.3600000000000003" }, "band28": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "14252.855792044767", "q": "4.3600000000000003" }, "band29": { "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false", "gain": "0", "frequency": "17943.282347242843", "q": "4.3600000000000003" } } }, "filter": { "state": "true", "input-gain": "0", "output-gain": "0", "frequency": "2000", "resonance": "-3", "mode": "12dB\/oct Lowpass", "inertia": "20" }, "gate": { "state": "true", "detection": "RMS", "stereo-link": "Average", "range": "-24", "attack": "20", "release": "250", "threshold": "-18", "ratio": "2", "knee": "9", "makeup": "0" }, "limiter": { "state": "true", "input-gain": "0", "limit": "0", "lookahead": "5", "release": "1000", "asc": "true", "asc-level": "1", "oversampling": "1" }, "pitch": { "state": "true", "input-gain": "0", "output-gain": "0", "cents": "0", "semitones": "0", "octaves": "0", "crispness": "3", "formant-preserving": "false", "faster": "false" }, "reverb": { "state": "true", "input-gain": "0", "output-gain": "0", "room-size": "Large", "decay-time": "1.5", "hf-damp": "5000", "diffusion": "0.5", "amount": "-12", "dry": "0", "predelay": "0", "bass-cut": "300", "treble-cut": "5000" }, "webrtc": { "state": "true", "high-pass-filter": "true", "echo-cancel": "true", "echo-suppression-level": "moderate", "noise-suppression": "true", "noise-suppression-level": "moderate", "gain-control": "true", "extended-filter": "true", "delay-agnostic": "false", "target-level-dbfs": "3", "compression-gain-db": "9", "limiter": "true", "gain-control-mode": "adaptive-digital", "voice-detection": "false", "voice-detection-frame-size-ms": "10", "voice-detection-likelihood": "low" }, "multiband_compressor": { "state": "true", "input-gain": "0", "output-gain": "0", "freq0": "120", "freq1": "1000", "freq2": "6000", "mode": "LR8", "subband": { "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "lowband": { "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "midband": { "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "highband": { "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" } }, "multiband_gate": { "state": "true", "input-gain": "0", "output-gain": "0", "freq0": "120", "freq1": "1000", "freq2": "6000", "mode": "LR8", "subband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "lowband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "midband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" }, "highband": { "reduction": "-24", "threshold": "-12", "ratio": "2", "attack": "150", "release": "300", "makeup": "0", "knee": "9", "detection": "RMS", "bypass": "false", "solo": "false" } } } } easyeffects-4.8.7/.circleci/test.sh000077500000000000000000000076731424023573300172240ustar00rootroot00000000000000#!/usr/bin/env bash # Use shellcheck to check this script after making changes # Try too keep it compatible with both GNU and BSD coreutils # This script is for testing PulseEffects. # Can be ran locally after making changes in code # or in continious integration systems. # Requirements for CI containers: bash ImageMagic scrot Xvfb # Authors: # - Mikhail Novosyolov set -e # fail on any error #set -f # disable globbing #export DISPLAY=:0 # Gurantee consistency of language strings in GUIs and CLI outputs export LANG=c if [ "$(pwd | awk -F '/' '{print $NF}')" = "util" ]; then cd .. ; fi dir0="$PWD" # PulseEffects binary # In PATH, relative or absolute PE_BIN="${PE_BIN:-pulseeffects}" cleanup(){ ( set +e +f while read -r line do kill "$line" # TODO: check if has been actually killed done < <(cat ${tmp_dir}/*.pid) ) if [ -z "$NO_CLEANUP" ]; then rm -fr ${tmp_dir:?}/* ; fi } export -f cleanup trap cleanup EXIT # This test runs a graphical app and checks that it ran OK # The idea is described here (in Russian): # https://lists.altlinux.org/pipermail/sisyphus/2018-April/366621.html graphical_run_test(){ # Xephyr is an X server in a seperate graphical window - for local tests on developer PCs # Xvfb is a headless X server - for automated tests # Let's automatically use Xephyr on developers PCs if [ -n "$DISPLAY" ] && [ -z "$X_SERVER" ]; then X_SERVER=Xephyr fi X_SERVER="${X_SERVER:-Xvfb}" # Keep GUI consistent to compare screenshots export GTK_THEME=Adwaita:light tmp_dir="$(mktemp -d)" mkdir -p "${tmp_dir}" echo "Temp dir: ${tmp_dir}" rm -fvr ${tmp_dir:?}/* virt_display="$(( ( RANDOM % 100 ) + 1 ))" echo "Random DISPLAY = $virt_display" case "$X_SERVER" in Xephyr|xephyr ) echo "Using Xephyr X server" Xephyr -br -ac -noreset -screen 1024x720 ":${virt_display}" & ;; Xvfb|xvfb ) echo "Using Xvfb X server" Xvfb ":${virt_display}" -screen 0 1024x720x24 & ;; esac echo $! > "${tmp_dir}/X-server.pid" # export DISPLAY only after running Xephyr, otherwise Xephyr itself tries to use this $DISPLAY export DISPLAY=":${virt_display}" # now run PulseEffects "$PE_BIN" & echo $! > "${tmp_dir}/pulseeffects.pid" # Check that PulseEffects started # TODO: improve this check # PulseEffects start up time is different on different systems, you make set yours # TODO: writee better code and avois using sleep SLEEP_TIME="${SLEEP_TIME:-10}" sleep "$SLEEP_TIME" if ! ps aux | awk '{print $NF}' | grep -v 'grep ' | grep -q "${PE_BIN}\$"; then echo "$PE_BIN" did not start in "$SLEEP_TIME" seconds, exiting with error! return 1 fi # take screenshot of our seperate X server scrot --quality 100 "${tmp_dir}/current_screenshot_full.png" # master screenshot of test result MASTER_SCREENSHOT="${MASTER_SCREENSHOT:-${dir0}/images/master_screenshot_test.png}" if [ ! -f "$MASTER_SCREENSHOT" ]; then echo "Master screenshot ${MASTER_SCREENSHOT} not found!" return 1 fi # reduce nu,ber of colors in screenshot to remove unneeded artefacts and differences convert +dither -colors 2 "$MASTER_SCREENSHOT" "${tmp_dir}/master_screenshot_reduced.png" convert +dither -colors 2 "${tmp_dir}/current_screenshot_full.png" "${tmp_dir}/current_screenshot_cropped.png" # TODO: what will we do with different default fonts? # https://stackoverflow.com/questions/29229535/measure-similarity-of-two-images-in-java-or-imagemagick screenshots_diff_value="$(compare -metric ae "${tmp_dir}/master_screenshot_reduced.png" "${tmp_dir}/current_screenshot_cropped.png" null: 2>&1)" echo screenshots_diff_value = "$screenshots_diff_value" # 8000 is an experimanental value, probably we can somehow find a more exact value if [ "$screenshots_diff_value" -le 8000 ] then echo "Graphical test: OK" return 0 else echo "Graphical test: FAILED !!!" return 1 fi # trap cleanup will run if nothing else is planned to be after this function } # TODO: parse command line arguements etc. graphical_run_test easyeffects-4.8.7/.circleci/wait_pe.sh000077500000000000000000000003131424023573300176550ustar00rootroot00000000000000#!/usr/bin/env bash while [ -z "`pactl list sinks | awk '/PulseEffects_apps.monitor/{print}'`" ] do sleep 1 echo "waiting PulseEffects initialization" done echo "PulseEffects has been initialized" easyeffects-4.8.7/.clang-format000066400000000000000000000076531424023573300164240ustar00rootroot00000000000000--- Language: Cpp # BasedOnStyle: Chromium AccessModifierOffset: -1 AlignAfterOpenBracket: Align AlignConsecutiveAssignments: false AlignConsecutiveDeclarations: false AlignEscapedNewlines: Left AlignOperands: true AlignTrailingComments: true AllowAllParametersOfDeclarationOnNextLine: false AllowShortBlocksOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false AllowShortFunctionsOnASingleLine: Inline AllowShortIfStatementsOnASingleLine: false AllowShortLoopsOnASingleLine: false AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: true AlwaysBreakTemplateDeclarations: Yes BinPackArguments: true BinPackParameters: false BraceWrapping: AfterClass: false AfterControlStatement: false AfterEnum: false AfterFunction: false AfterNamespace: false AfterObjCDeclaration: false AfterStruct: false AfterUnion: false AfterExternBlock: false BeforeCatch: false BeforeElse: false IndentBraces: false SplitEmptyFunction: true SplitEmptyRecord: true SplitEmptyNamespace: true BreakBeforeBinaryOperators: None BreakBeforeBraces: Attach BreakBeforeInheritanceComma: false BreakInheritanceList: BeforeColon BreakBeforeTernaryOperators: true BreakConstructorInitializersBeforeComma: false BreakConstructorInitializers: BeforeColon BreakAfterJavaFieldAnnotations: false BreakStringLiterals: true ColumnLimit: 120 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 4 Cpp11BracedListStyle: true DerivePointerAlignment: false DisableFormat: false ExperimentalAutoDetectBinPacking: false FixNamespaceComments: true ForEachMacros: - foreach - Q_FOREACH - BOOST_FOREACH IncludeBlocks: Preserve IncludeCategories: - Regex: '^' Priority: 2 - Regex: '^<.*\.h>' Priority: 1 - Regex: '^<.*' Priority: 2 - Regex: '.*' Priority: 3 IncludeIsMainRegex: '([-_](test|unittest))?$' IndentCaseLabels: true IndentPPDirectives: None IndentWidth: 2 IndentWrappedFunctionNames: false JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: false MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: None ObjCBinPackProtocolList: Never ObjCBlockIndentWidth: 2 ObjCSpaceAfterProperty: false ObjCSpaceBeforeProtocolList: true PenaltyBreakAssignment: 2 PenaltyBreakBeforeFirstCallParameter: 1 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000 PenaltyBreakTemplateDeclaration: 10 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 200 PointerAlignment: Left RawStringFormats: - Language: Cpp Delimiters: - cc - CC - cpp - Cpp - CPP - 'c++' - 'C++' CanonicalDelimiter: '' BasedOnStyle: google - Language: TextProto Delimiters: - pb - PB - proto - PROTO EnclosingFunctions: - EqualsProto - EquivToProto - PARSE_PARTIAL_TEXT_PROTO - PARSE_TEST_PROTO - PARSE_TEXT_PROTO - ParseTextOrDie - ParseTextProtoOrDie CanonicalDelimiter: '' BasedOnStyle: google ReflowComments: true SortIncludes: true SortUsingDeclarations: true SpaceAfterCStyleCast: false SpaceAfterTemplateKeyword: true SpaceBeforeAssignmentOperators: true SpaceBeforeCpp11BracedList: false SpaceBeforeCtorInitializerColon: true SpaceBeforeInheritanceColon: true SpaceBeforeParens: ControlStatements SpaceBeforeRangeBasedForLoopColon: true SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 2 SpacesInAngles: false SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false SpacesInParentheses: false SpacesInSquareBrackets: false Standard: Auto TabWidth: 8 UseTab: Never ... easyeffects-4.8.7/.clang-tidy000066400000000000000000000005401424023573300160710ustar00rootroot00000000000000Checks: 'boost-*,bugprone-*,cert-*,cppcoreguidelines-*,modernize-*,performance-*,readability-*, -clang-analyzer-osx*,-cppcoreguidelines-pro-type-cstyle-cast,-cppcoreguidelines-pro-type-vararg, -cppcoreguidelines-non-private-member-variables-in-classes,-cppcoreguidelines-avoid-magic-numbers, -readability-magic-numbers,-cppcoreguidelines-owning-memory'easyeffects-4.8.7/.github/000077500000000000000000000000001424023573300153765ustar00rootroot00000000000000easyeffects-4.8.7/.github/FUNDING.yml000066400000000000000000000000531424023573300172110ustar00rootroot00000000000000liberapay: wwmm patreon: wellingtonwallace easyeffects-4.8.7/.gitignore000066400000000000000000000013751424023573300160340ustar00rootroot00000000000000__pycache__ _build build locale gschemas.compiled obj-*-linux-gnu .vscode node_modules package-lock.json compile_commands.json .clangd .cache # Compiled python modules. *.pyc # binary language files *.mo # patches *.patch \.python-version # exclude debian building logs and other junk debian/* !debian/changelog !debian/changelog.tpl !debian/compat !debian/control !debian/copyright !debian/docs !debian/pycompat !debian/rules !debian/source/format !debian/build-ppa.sh !debian/*.install !debian/*lintian-overrides !debian/watch !debian/patches !debian/patches/*.patch !debian/source /build-ppa.sh # Dolphin file manager creates the file .directory to save some folder-specific settings *.directory *-build-deps*.deb .build-tools.cson ppastats .autobuild easyeffects-4.8.7/CHANGELOG.md000066400000000000000000001235561424023573300156630ustar00rootroot00000000000000# Changelog ## [Unreleased] ## [4.8.7] ### Added - Improved compatibility with `Boost 1.79` ## [4.8.6] ### Fixed - Fixed a crash that happened when the compressor plugin was initialized with LSP `1.2.0` ## [4.8.5] ### Added - Improved compatibility with dconf 0.40. Now our plugins should be enabled when using this version. ## [4.8.4] ### Added - Added Allpass filter in Equalizer plugin. ### Fixed - The equalizer UI is now correctly shown when a profile with 30 bands is loaded at startup. - Added a workaround for systems that were crashing because the locale is not correctly set at system level. ### Note to packagers - This is the last release supporting Pulseaudio. The following PulseEffects releases will be based on the new Pipewire multimedia server and only fixes to critical bugs will be backported to the legacy pulseaudio branch https://github.com/wwmm/pulseeffects/tree/pulseaudio-legacy. ## [4.8.3] ### Added - New Noise Reduction plugin based on the RNNoise library. - Band Quality factor exposed in the Equalizer main interface. - A new settings was added to the general section of our settings menu: `Activity Timeout`. It is the time during which PulseEffects monitors if there is any application playing audio. If there is none we stop our playback stream in order to save cpu usage. This timeout has been in place for a long time but until now its value could not be configured by the user. - When no application is playing audio PulseEffects pipeline is now put in the ready state instead of the paused state. This should help to reduce cpu usage in situations like the ones described in https://github.com/wwmm/pulseeffects/issues/829 - Updated Chinese translation. ### Fixed - Values outside GTK widgets are now shown according to system locale settings. - Applying APO Equalizer preset when locale is different than "C" is now working properly. - Equalizer and Crystalizer UI redesigned: band wrapper is extended to fit all the available horizontal space; homogeneous property has been applied to get the same space between band sliders. - App info and plugin interfaces made scrollable: now PulseEffects window does not change its size when switching beetween plugins. - Loudness plugin: removed reference signal button (test signals can be used in its stead); input value is now saved to preset. ### Note to packagers - The Noise Reduction is an optional plugin. For it to be available to the user the library RNNoise https://github.com/xiph/rnnoise has to be installed when PulseEffects is compiled. ## [4.8.2] ### Fixed - When importing Equalizer APO presets the bands were not being set to the APO mode. ## [4.8.1] ### Added - `Blocklist` adopted and related command modified as a checkbutton inside the app info ui. - Pulseaudio's media name property is shown for each application in the `Applications` section. - Deesser UI redesigned and applied homogeneous property to all plugin UI to get same space between controls and make them fit all the available horizontal space. - Modified `Applications` row in the left side plugin list to show an icon according to input/output effects while the pipeline global level meter is only shown when something is recording/playing. - The feature that shows the last used preset in the preset menu button label was improved. When seeing input effects. widget it shows the last used input preset. And when seeing output effects widgets it shows the last used output preset. - New application icon. ## [4.8.0] ### Added - Loudness plugin has been replaced with the new Loudness Compensator by Linux Studio Plugins. - The Stereo Tools and the Maximizer plugins can now be used when applying effects to microphone signals. - New parameters have been added to the following plugins: Compressor, Gate and Limiter. - Plugin user interfaces have been redesigned with checkbutton list and new global output level meter for both output and input pipelines. - The user has now the ability to change the minimum and maximum frequency in the spectrum user interface. - New command line that allows to hide the window when running PulseEffects in service mode. This will allow tray applets to hide our window. - Initial support to Equalizer APO presets. - Improved Slovak and Czech Translations. ### Removed - The spectrum scaling feature was removed as it leads to wrong mouse hover values when used https://github.com/wwmm/pulseeffects/issues/733. And fixing this will require the addition of an amount of code complexity that does not seem worth it. ### Note to packagers - This release is using GTKMM 3.24 features and Linux Studio Plugins >= `1.1.24`. If you can not use any of these libraries do not upgrade to PulseEffects 4.8.0! - MDA is not needed anymore as optional dependency. ## [4.7.3] ### Added - PulseEffects now searches for presets in /etc/PulseEffects and directories specified by \$XDG_CONFIG_DIRS environment variable. - Our interface now shows third party Plugins credits. - Each plugin now has a reset button - Improved convolver impulse response files plot - Applications entry now have a blacklist button to make it easier to blacklist an application the user does not want effects to be applied. ### Fixed - Fixed a severe memory leak that happened whenever the window was closed. - PulseEffects no longer crashes when an empty or corrupted preset is provided. - Fixed laxity setting not being applied in the deesser ## [4.7.2] ### Added - Compatibility to Linux Studio Plugins `1.1.14` - The convolver plugin now accepts the wav extension in the impulse files. - Checking exceptions in the main function. - Headers deprecated in Boost 1.72 were replaced. ### Notes to package maintainers - As the `bypass` property in Linux Studio Plugins `1.1.14` was renamed to `enabled` this new PulseEffects version won't work with older Linux Studio Plugins versions. Although I could add checks and somehow try to support both versions this makes the code ugly. And I think that nowadays upgrading LSP should not be hard. If it is do not upgrade to PE `4.7.2`. ## [4.7.1] ### Added - Improved Italian and German translations. - Spanish translations for Colombia, Mexico and Venezuela were added. ### Fixed - Global bypass state was not being applied when PulseEffects was restarted. This bug was fixed. ## [4.7.0] ### Added - Improved Italian translations. ### Fixed - Do not open the main window when listing the available presets through command line options. This will also help third party tools like https://github.com/boomshop/pulseffectstray ## [4.6.9] ### Added - Our built-in manual now has a guide about laptop sound enhancement. It was written by Markus Schmidt from Calf Studio. Thanks Markus! :-) - There is now a bypass button that can be used to temporarily disable all effects. It is also possible to do this through a command line option. Take a look at the output of pulseeffects --help. - The autogain plugin now offers the option of estimating the loudness value through a geometric mean of the momentary, short-term and integrated loudness. ## [4.6.8] ### Added - It is now possible to set different buffer and latency values for the pulsesrc and the pulsesink plugins. This means that there is more room to reduce the overall latency. Pulsesrc is at the start of the effects pipeline and pulsesink at its end. - Updated Slovak, Italian and Turkish translations. ### Fixed - The auto gain `detect-silence` key was not being correctly saved to the preset file. ## [4.6.7] ### Added - The autogain plugin now has a button to reset its history and another that allows silence detection to be disabled. Disabling this detection helps with issues like the ones in https://github.com/wwmm/pulseeffects/issues/550. ### Fixed - Fixed a bug that prevented loopback devices from being shown in PulseEffects Applications section. Now it is possible to apply effects for audio sent from mobile devices through a bluetooth connection. It should work for other kinds of loopbacks too. ## [4.6.6] ### Added - Improved preset auto loading. This should fix https://github.com/wwmm/pulseeffects/issues/520 - Improved built-in applications blacklist. We now use the applications id where possible as they are not changed by translations. This should avoid Pavucontrol probes being shown in PE window. ## [4.6.5] ### Added - Delaying preset auto loading by 3 seconds. This should help to fix the issue reported at https://github.com/wwmm/pulseeffects/issues/520 ### Fixed - When PE was executed in an environment without Pulseaudio executable in the system path(like flatpak) a crash would happen because of unhandled execeptions. This was fixed PE should not crash anymore when Pulseaudio exe is not found. ## [4.6.4] ### Removed - The reset settings popup was removed. It does not work reliably outside of Gnome. On other desktops the popup may be shown whenever PE is started. Even if the user select yes or no. As resetting settings after an upgrade hasn't been necessary for a while I removed this feature. ## [4.6.3] ### Fixed - Depending on the hardware we could crash when trying to show the channel mapping in use by Pulseaudio. See https://github.com/wwmm/pulseeffects/pull/522. This was fixed. ### Changed - Maximizer plugin now uses 25 ms as default release value. ## [4.6.2] ### Added - Improved Pipeline state switching when audio applications alternate between the playing and paused state or skip tracks. These operations should cause less problems like the ones saw here https://github.com/wwmm/pulseeffects/issues/504. ### Fixed - Loading presets using the command line does not result in a crash anymore. - Fixed a bug that made PulseEffects crash in systems with custom Pulseaudio version string. - Changing the blocksize while our pipeline is playing should not freeze PulseEffects anymore. - The command line option used to list available presets was not working properly. This was fixed. ## [4.6.1] ### Added - Pulseaudio avoid-resampling feature is now supported. You will need Pulseaudio 13 or later for that. - We now show in the interface Pulseaudio information that you would usually need to use command line tools or opening its configuration files to see. Things like which modules are loaded and the current configuration that its daemon is using. ### Fixed - Changing convolver files should not make us crash anymore. - Changing applications volume will not result in noises anymore. You will need Pulseaudio 13 or later for that. ## [4.6.0] ### Added - Updated Indonesian and Italian translations. - Presets can now be automatically loaded when wired headphones are plugged in the sound card jack. This did not work before because wired headphones do not create a new output device. They are shown as a port in the current default output device. This feature comes with a price. People may have to redefine their automatic preset loading settings. - Ctrl+Q closes the window. ## [4.5.9] ### Added - Drag and drop can be used to change effects order. Take a look at https://github.com/wwmm/pulseeffects/issues/447 for more information. - Improved maximizer and compressor help - Improved Italian translations ### Fixed - fixed wrong release unit in maximizer interface ### Removed - Removed the destructive-action class from the "remove buttons". This used to make them red but in recent GTK versions this has been a little buggy. Sometimes it works sometimes it doesn't... ## [4.5.8] ### Fixed - Fixed problems in pt_BR translation that could make installation fail in some systems. ## [4.5.7] ### Added - Updated Czech and Turkish translations. - Linux Studio Plugins `1.1.7` has new filters in its parametric equalizer that are implemented just like the biquad filters found in Equalizer APO. A very popular equalizer used in Windows. This will help PulseEffects users to properly use headphone correction curves that were designed with Equalizer APO filters in mind. Just choose `APO (DR)` as mode in each band menu. You can have more information about why this is a useful feature here https://github.com/wwmm/pulseeffects/issues/421 and here https://github.com/sadko4u/lsp-plugins/issues/29. ### Note for packagers - PulseEffects will probably still work with older Linux Studio Plugins versions. But I would expect some errors printed in the system log if the user tries to choose the APO filter. ## [4.5.6] ### Added - Chinese and Turkish translations. - Improvements to the Crystalizer plugin. It now shows the loudness range before and after processing. Some improvements to its algorithm were also done. Latency and memory usage were reduced and it now has a toggle button to turn on/off an "Aggressive Mode". ## [4.5.5] ### Fixed - Fixed a memory leak that could happen in the crystalizer plugin in some cases. ## [4.5.4] ### Added - Improved crystalizer algorithm. Some noises that could be created in a few cases do not happen anymore. - Improved Italian translations. ## [4.5.3] ### Added - Improved crystalizer algorithm. Its CPU usage was reduced. - Improved Italian translations. ## [4.5.2] ### Added - Improved crystalizer algorithm. It should preserve more of the original wave shape when increasing the dynamic range. ## [4.5.1] ### Added - Updated help and translations. - Reworked crystalizer plugin. It now has more band filters. - Block size is again a global setting because besides the convolver crystalizer now also needs audio buffer sizes following a power of 2. As before higher block sizes will increase latency but will reduce cpu usage in plugins like the autogain. - The spectrum now has line mode and a switch to enable/disable linear gradient. ### Changed - The compressor(not the multiband) is now from the Linux Studio Plugins package. ## [4.5.0] - Warning: This is not one more of the typical harmless updates I usually do. A few of the many features introduced required a few changes to the preset format. It is not a total break like the last time(still using json) but manual intervention will be necessary in order to use values from the old format. With the exception of the equalizer it is just a matter of doing some copy and paste in a text editor. ### Added - It is now possible to make a preset autoload when an input or output device is plugged in the system. - The Crystalizer plugin now splits the frequency spectrum in three regions. This allows the application of a smaller intensity to high frequencies. - Remember window size. - Updated help and translations. - Added options to show/hide bars borders in the spectrum and to change their line widths. - Improved dynamic pipeline. ### Changed - We now use Linux Studio Plugins "Parametric Equalizer x32 LeftRight" (LV2 version) http://lsp-plug.in/?page=manuals§ion=para_equalizer_x32_lr instead of the one from Gstreamer. Reason: it has more features and supports different settings for each channel natively. Besides the usual high-pass and low-pass it has a notch and a resonant filter. It is also possible to mute each band on the fly and change its filter slope. There is also a "solo" mode where we can easily listen to the effect caused by a specific band without having to manually disable all the others. - The `Enable All Apps` function was split in two. We now have `Process All Outputs` and `Process All Inputs`. This way the user can choose to automatically apply effects to the output of all apps while manually choosing which ones will have their input processed. ### Fixed - Icon is properly rendered in QT environments - Custom spectrum height is applied on startup ## [4.4.7] ### Added - Updated Indonesian and Czech localizations. - Added the delay compensator plugin from Linux Studio Plugins (LV2 library). It is an optional plugin. We used it in the past but it was removed because its license was not as friendly as I would like. Now that their license has changed we are using it again. ## [4.4.6] ### Fixed - When the user loaded a preset file pointing to a impulse file that did not exist the convolver would consume memory crazily while trying to do its setup multiple times. This should not happen anymore. ## [4.4.5] ### Fixed - In some situations where audio devices were added and removed repeatedly very fast a crash would happen when updating the device list in the interface. Read this issue for more information https://github.com/wwmm/pulseeffects/issues/408 This should not cause a crash anymore. ## [4.4.4] Last release of 2018! Happy new year! :D ### Added - The pitch plugin can be used in the applications output too besides the microphone. - Updated Italian translations. ## [4.4.3] ### Added - Added a few preprocessor directives to disable at compile time api that only exists on Linux. Now it should compile on Freebsd. ## [4.4.2] ### Added - It is now possible to change the realtime priority or the niceness value. We do this using RealtimeKit just like Pulseaudio. By default we do not change any of these values. It is up to the user to enable this in the settings menu. Only the Gstreamer threads responsible for the audio processing have their priorities changed. Users wanting to verify if the changes took effect can do this using `ps -m -l pid` where pid is PulseEffects process pid. - Now the user is able to apply different equalizations for the left and the right channels. Just enable the option `Split Channels` in the equalizer menu. This feature is particularly interesting for people with hearing loss. Take a look at this issue opened in our page https://github.com/wwmm/pulseeffects/issues/353 to know more. - The spectrum has more customization options. - The applications blacklist is saved to the user preset. - When alternating presets a large disk activity was generated. In order to avoid this we now check if each gsettings key really needs to be updated. As gsettings does not do that we had to implement our own checks. - Our interface should be a littler closer to the Gnome HIG guidelines. ### Changed - Effects are by default switched on to all audio applications. This can be disabled in the settings menu. ### Fixed - When installed under /usr/local PulseEffects would crash because of not found plugins. This was fixed. ## [4.4.1] ### Added - Updated translations - Improved dynamic pipeline. Alternating presets while playing should cause less crashes. - Improved the adapter plugin used internally by PulseEffects - Using std::async instead of std::thread to do a few background tasks like loading an impulse response file ### Fixed - Fixed presets menu button label not being translated after a reset. It was always being changed to the english label "Presets" ## [4.4.0] ### Added - Better error handling and logs. This will help to remove to remove the segmentation faults a few people were having and with lucky it will be easier to find the source of others. ## [4.3.9] ### Fixed - Fixed a bug that could cause our pipeline to crash when changing the effects order. ## [4.3.8] ### Fixed - Fixed a few sources of segmentation faults I could verify and hopefully a few others that do not happen in my computer. ## [4.3.7] ### Fixed - Using GST_PAD_PROBE_TYPE_IDLE instead of GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM. This seems to fix a rare and hard to find bug where our pipeline crashed with a no linked error when the user switched presets while PulseEffects was paused. ## [4.3.6] ### Added - When no application is playing audio our GStreamer pipeline is now put in the paused state instead of the null state. This should remove undesired choppy sounds that could be listened whenever we restarted the audio processing. ### Fixed - Sometimes the wrong sampling rate could be shown in the headerbar info. It was fixed. ## [4.3.5] ### Added - More space at the right of the up/down buttons used to change effects order. In a few systems GTK is configured to always show the scrollbar. In this case the down button would be partially hidden. - PulseEffects can be reset from the command line "pulseeffects -r". ### Removed - The app menu with the entries quit, about and help was removed. This menu was deprecated by GTK developers so we are just following their guideline. The about button can be found in the general section of the main menu (hamburger). ## [4.3.4] ### Added - PulseEffects is now dbus activatable. Besides improving user experience with gnotifications this also brings the benefit of making the first contact of the user with PulseEffects better. Usually they expect the effects to keep running when the window is closed. But up to now you had to enable "Start Service at Login" and do a logout for this to happen. Now that we are dbus activatable PE will be launched as service and show its window when the user clicks in the PE icon. Effects will remain when the window is closed. But note that enabling "Start Service at Login" is still necessary for autostarting PE in the next login. - A verification was added to verify if the current plugin list has any invalid plugin name. If there is the list is reset to its default value. ## [4.3.3] ### Added - A system notification (gnotification) is show to the user asking if he/she wants to reset PulseEffects settings after an update. ## [4.3.2] ### Added - Settings are automatically reset after an upgrade. If you want to know the reason why take a look at the issues #327, #318 and #293 in PulseEffects github page. A few users have configuration problems after an upgrade that are only solved after resetting PulseEffects settings. In all of the cases I could not reproduce the issue they had in my computers. As in some of the cases the crash was so severe that the only way to reset was using dconf in command line I decided to implement an automatic reset after upgrades or downgrades. As almost all PulseEffects settings are saved to the presets file this shouldn't be too annoying for the users. ## [4.3.1] ### Fixed - One of the help images was not being installed ## [4.3.0] ### Added - The about dialog window "hide" method is explicitly called now. This may fix an issue where this window was not closed for users not using gnome - The user can blacklist applications he/she does not want effects being applied. - We check if there is any forbidden character in the name of the preset that the user is adding. If there is we just clear the field and do not try to add the preset. ## [4.2.9] ### Added - PulseEffects now remembers the custom input and output device selected by the user. In case it does not exists in the next start we fallback to the default device. ## [4.2.8] ### Added - The latency introduced by the Gstreamer pipeline is displayed in the headerbar. ## [4.2.7] ### Added - The adapter plugin used internally by PE reports the latency that it may introduce(proportional to the block size) to GStreamer. Latency is only added when the block size s larger than the number o samples per buffer in Pulseaudio buffer. ### Fixed - Fixed a regression that could cause severe noises when multiple audio apps were playing at the same time. ## [4.2.6] ### Added - Improved the plugin that adapts the size of the buffer given by pulsesrc. - Improved log messages. The name of the audio app related to the failures will be printed together with the error messages. ## [4.2.5] ### Added - Added a plugin that adapts the audio buffer size to a power of 2 value. We were using the block size property of the pulsesrc plugin before but it was not working well. Sometimes Pulseaudio was not able to give a buffer with the size we needed and some noises were created because of GStreamer buffer under flows. Now it should be possible to use higher block sizes without noises. A larger block may be interesting to users using weak processors as a few plugins use less CPU with larger block sizes. As always there is a trade-off. Large blocks increase latency. ## [4.2.4] ### Added - New application icon created by ZenCubic(https://github.com/zencubic). ## [4.2.3] ### Added - Improved the routine responsible to enable or disable audio processing depending on whether there is an audio application playing or not. The previous code wasted cpu resources and on rare occasions could freeze the interface. - The sample format and sampling rate info shown in the headerbar had a few unicode characters replaced by icons. Some fonts do not have the characters that were being used. ## [4.2.2] ### Fixed - Fixed a bug where the interface allowed the user to choose zero weights in the auto gain. The zero value was not passed to the plugin because of a few protections. So this bug did not affected plugin operation. But it makes gsettings crash whenever the value is set to zero and this leads to core dump when PE is closed. ## [4.2.1] ### Added - Added an auto gain plugin based on libebur128. It replaces the previous auto volume feature. It has the advantage of targeting the perceived loudness level. ### Fixed - Sometimes PulseEffects was not paused when there was no application playing audio. Fixed that. ### Note for Packagers - libebur128-dev is now a build time dependency. ## [4.2.0] ### Added - We finally have plugins documentation and a few basic explanations about some sections of the user interface. They can be accessed by clicking in the new help button next to the settings menu button or by clicking the F1 key. - The interface shows a warning when the plugin input is saturated (you really do not want this to happen). The check mark next to the plugin label is temporarily switched to an exclamation mark while the input is saturated. ### Removed - Removed the stereo enhancer. It is a little buggy and most if not all of what it does can be accomplished with the stereo tools. ### Note for Packagers - itstool is now a build time dependency. ## [4.1.9] ### Added - A crystalizer plugin. Useful to add a little of dynamic range to overly compressed songs. It is a port I made of the algorithm in FFMPEG crystalizer plugin to the GStreamer framework. So all the credits should go to the FFMPEG developers. - Audio format and sampling rate of the main processing stages are shown in the GTK headerbar subtitle(below the title). In the section that applies effects for applications output the first info is about the null sink PulseEffects(apps). this is the place applications output are redirected to. The second information shows the format and sampling rate used by the plugins and PulseEffects pipeline. The third information shown is from the current default output device. In the section that applies effects for microphones the idea is the same but the first information show is the one from the source and the last one is about PulseEffects(mic) null sink. Applications like skype will record processed audio from this null sink monitor. ### Note for Packagers - There is no need to add ffmpeg as dependency. ## [4.1.8] ### Added - Improved convolver impulse response autogain calculation. Changing impulse responses on the fly should result in less abrupt volume changes now. - A warning is shown in the convolver interface when the user loads a preset that points to an impulse file that does not exists in PulseEffects folder anymore. - No limit on the number of frames used from impulse response file. It is up to the user to decided if his/her computer is strong enough to handle the impulse file loaded. ## [4.1.7] ### Added - Improved Russian translations - Using a background thread to load the impulse response file in the plugin. This avoids playback stalls when the impulse file is large. ### Fixed - Fixed the meson scripts so that the convolver is optional. This would allow compilation in system that do not have zita-convolver. - Removed a potential crash when the impulse response file was too small. - Removed memory leaks in the convolver interface ## [4.1.6] ### Fixed - PulseEffects now uses the system zita-convolver library. This was request by package managers and after a few exchange of ideas that can be seen here https://github.com/wwmm/pulseeffects/issues/262 I was able to make this move. Zita-convolver version 3 and 4 should work. With this fftwl is not a Pulseeffects dependency anymore but as the zita package needs it users will have to have it anyway. ## [4.1.5] ### Fixed - Fixed a bug that would crash PulseEffects whenever the user tried to load an impulse response file with more than 2 channels(only stereo is supported). ## [4.1.4] ### Added - A convolver plugin. It is the first plugin I have written :D :-) As audio processing is not my original field of expertise I prefer to use plugins from mature projects like Calf. But GStreamer support for LV2 plugins is limited and none of the available convolvers work with it. You can see more details here https://github.com/wwmm/pulseeffects/issues/164. As this situation will not change any time soon I had to put my hands in the dirty. The plugin is based on zita-convolver library and while writing it I took inspiration in the work of other people you can find here https://github.com/tomszilagyi/ir.lv2/ and here https://github.com/x42/convoLV2. For now only stereo impulse response files encoded as wav are supported. - Import presets dialog now has filters to show only presets files (.json). - The impulse response file import dialog also has a filter (.irs). In case your response file is "_.wav" just rename it to "_.irs". - User can change Pulseaudio block size. In order to implement the convolver I had to force Pulseaudio block size to be a power of 2. As I am not sure if the move from an automatic size to a fixed size is going to bring problems to the users I decided to expose this setting so that the user can fine tune it in case there is any noise or other problem related to this parameter. It is also possible to set different block size values for the input effects pipeline and for the output effects pipeline. For some reason I don't know GStreamer's webrtcdsp plugin does not work with block sizes smaller than 512. So users applying effects for microphones while using webrtc should use 512 or above for this parameter. - The convolver spectrum plot color follows the global spectrum color chosen by the user. ### Note for packagers - There is no need to add zita-convolver library as dependency. Its source is shipped with PulseEffects and compiled by PulseEffects scripts. But zita dependencies should still be installed in the system. This means that the library fftw3f that is a Zita dependency is now also a PulseEffects dependency. - gstreamer-fft-1.0 is now a dependency (impulse response file spectrum calculation). ## [4.1.3] ### Fixed - The equalizer presets were not being applied in a few situations ## [4.1.2] ### Added - Multiband gate plugin from Calf Studio - Stereo Tools plugin from Calf Studio - Presets menu label shows the last selected preset when PulseEffects is restarted. - The Deesser can be used in both pipelines. - The so called "perfect eq" preset. Not that there is something we can call a perfect equalizer preset. But people like to use it as a starting point.So I added it. ### Fixed - Deesser "listen" control was not working. ### Removed - Expander plugin. Reason: I thought it was open source but it is proprietary. This complicate packagers life and philosophically I prefer to use only open source plugins. As Calf Gate can be used as an expander it now replaces the plugin from Linux Studio. - Delay plugin. Although its source is distributed its license has very annoying restriction that prohibits packagers to apply patches without the plugin author permission. As Calf Stereo Tools can be used to apply delays between the left and the right channels it now replaces the delay plugin from Linux Studio. - Panorama plugin. Its functionality is also offered by Calf Stereo Tools. ### Packagers - For all the reasons explained above Linux Studio Plugins is not a dependency anymore and can be safely removed from the build scripts. ## [4.1.1] ### Added - Added loudness plugin from MDA.LV2 ## [4.1.0] - Fixed multiband compressor schema not being installed. ## [4.0.9] ### Added - GStreamer 10 bands equalizer presets: rock, soft, pop, etc. - Input gain and output gain controls for the equalizer. - Added Calf Multiband compressor ### Fixed - Compressor and gate plugins knee parameter was always at its default value. Fixed that. - Removed a small memory leak(nothing critical). ### Information for packagers - The limiter plugin in latest Calf Studio release (0.90) has a memory leak. I reported it to Calf developers and it was fixed. See https://github.com/calf-studio-gear/calf/issues/180. But as it may take sometime till the next Calf is released I suggest that everybody using the limiter plugin in PulseEffects either install a Calf package built from git master or backport the bug fix (3 lines) to 0.90 somehow. For most users it is not a critical leak. But people that do not turn off their computers everyday should be concerned as the leak is triggered whenever PulseEffects alternates between the playing and paused state. ## [4.0.8] ### Fixed - Removed more memory leaks(nothing critical) - The presets menu list is scrollable again. ## [4.0.7] ### Fixed - Fixed Limit Parameter of the Limiter plugin being reset to -11 dB whenever a preset was loaded. Now the user value saved in the preset is correctly loaded ## [4.0.6] ### Added - The user can change the spectrum height - More parameters are saved to the user preset: buffer, latency and spectrum parameters. It is particularly useful to have the buffer value saved to the preset because a few devices like bluetooth headphones need values that are very different than the ones used in soundcards. ### Fixed - When the user loaded a preset after upgrading to a PulseEffects version that had a new plugin (not present in the preset) a crash could happen in a few situations. I fixed that. Once the user saves the preset its plugin list will be updated with the new plugin. - Sometimes when the user opened PE window while running in service mode the spectrum was not enabled. I fixed that. ## [4.0.5] ### Added - Expander from Linux Studio Plugins ### Fixed - Replaced a few C++ shared_ptr by unique_ptr. This should lead to less memory overhead. The code refactoring that done for this fixed a bug where sometimes PE did not freed a few resources when closing. - fixed a bug where PE crashed when the pitch plugin was put before the webrtc ## [4.0.4] ### Fixed - Fixed a bug introduced in the last update. Applications widget were not being removed from PE when they were closed ## [4.0.3] ### Added - improved the algorithm used to enable/disable/reorder plugins. ### Changed - The default buffer values were increased from 100 ms to 200 ms. Reason: I noticed that the audio of a few devices like bluetooth headphones have noises when the buffer value is too low. Users who want to lower the values can do so in the main settings menu. ### Fixed - Removed a lot of potential memory leaks. I had a few misconceptions about how GTK builder is supposed to be used in GTKMM. I did a code refactoring to use the api in a safer way. ## [4.0.2] ### Added - improved the algorithm used to enable/disable/reorder plugins. ### Fixed - Spectrum widget being shown even when it is disabled - Fixed excessive level meters readings. - Mouse motion over spectrum updates the displayed magnitude and frequency. ## [4.0.1] ### Fixed - No more crashes when the user tries to enable an optional plugin that is not installed. ## [4.0.0] ### Added - Users can change effects order. This information is saved in the user preset like most of the other settings exposed by PulseEffects. - Users can choose a custom color for the spectrum. - Users can change the number of equalizer bands in the equalizer menu settings. This configuration is also saved to the user preset. In the same menu there is also a facility to calculate the corresponding frequencies of a graphic equalizer with the same number of bands. Users with weak processors will benefit a lot from this setting as the more bands you have the more cpu is used - Calf Filter plugin replaces the high pass and low pass filters from previous PE versions. ### Changed - From PulseEffects 4.0.0 onwards the presets files uses a completely different format(we moved from ini to json). This means users will have to create new presets. I know it sucks but it was necessary. ### Removed - Calf Stereo Spread - Per app level meters. They were the source of many bugs that I could never fix. As it is not a mandatory feature it was best to remove. ### Note for packagers - PE 4.0.0 marks the move from Python to C++. So Python packages like Numpy and Scipy are not a dependency anymore. Gstreamer Insertbin is also not used. C++ Boost is now a dependency. I will leave a python branch on github in case some bug fix is needed for the 3.x series. But my focus from now on will be on the 4.x series. ## [3.2.3] ### Fixed - Fixed input and output limiter presets not being properly loaded ## [3.2.2] ### Added - GStreamer Webrtc plugin - Gate and Deesser Plugins from Calf Studio - Calf Studio compressor replaced the one from swh-plugins - User can select the input and output device used in the current session. The selected devices are not remembered when PulseEffects is closed. - Debug mode: execute PulseEffects doing "PULSEEFFECTS_DEBUG=1 pulseeffects" to see debug messages. - Level meter for recording applications - Buffer and latency of input and output effects can be independently configured in the settings menu - Applications buffer and latency values displayed in the main window is updated every 5 seconds. ### Fixed - too many decimal places in the frequency and intensity shown in the spectrum window when hovering the mouse - Using Gtk.FileChooserNative in the import presets window. Now presets import will work in sandboxed environments like flatpak - Level meter streams are not created when running as service with the window closed. These streams are put in the paused together with the corresponding application. Both changes should help save cpu. ### Removed Dependencies - swh-plugins is not a dependency anymore as the limiter and compressor being used are the ones from Calf Studio Plugins ## [3.2.1] ### Added - Updated Czech and Italian translations - Presets can be loaded from command line. Run 'pulseeffects --help' to see the available options. - Presets can be imported using the presets menu. ## [3.2.0] ### Added - Crossfeed plugin from bs2b library. GStreamer Plugins Bad must be compiled against it. - PulseEffects pipeline enters the playing state only when there is at least one audio application switched on and in the playing state. This will save cpu when the user paused or switched off all audio applications while PulseEffects is running - Log output is a little more clear ### Fixed - Do no try to read delay plugin properties when it is not available. This will flood the system log with error messages ## [3.1.9] ### Fixed - Fixed exciter ceiling parameter not being loaded from the presets file ## [3.1.8] ### Fixed - Fixed a critical bug where plug and unplugging a usb microphone a few times would break PulseEffects routing. ## [3.1.7] ### Added - Delay Compensator plugin from Linux Studio Plugins (LV2 version) - Pitch Shifting plugin from Rubber Band library (Ladspa) - New settings menu. ### Fixed - Do not force the "switch all apps" setting to true when running as service. - Fixed frequency value in band label being slightly different from the one in the frequency menu because of rounding problems - Removed unnecessary spaces between a few elements in the interface - Test signals application automatically switches to the default microphone - Equal loudness test signals frequencies match the equalizer default frequencies ## [3.1.6] ### Added - MultiSpread plugin from Calf Studio ## [3.1.5] ### Added - Stereo Enhancer from Calf Studio ### Fixed - Check marks are not shown for plugins that are not available - Fixed a bug were the volume meter was not updated in applications like the game XCOM ## [3.1.4] ### Added - Maximizer plugin from ZamAudio ## [3.1.3] ### Fixed - Level meters: conversion from decibel to linear scale uses the correct factor - Auto volume: It is working in service mode and it does not reset the limiter gain to -10 dB when the main window is opened anymore. It also makes better use of the limiter attenuation parameter and reduces its input gain whenever there is attenuation in the limiter. - Interface: Uses a little less screen space. ## [3.1.2] ### Fixed - Fixed a bug where the pipeline could be put out of the playing state when running in service mode. - We do not emit level meter and spectrum messages when running in service mode anymore. This should improve service performance on weak CPUs. ## [3.1.1] ### Fixed - Missing Calf plugins do not crash PulseEffects anymore. They are optional. ## [3.1.0] ### Added - Meson: gstreamer-insetbin dependency check - New plugins: Bass Enhancer and Exciter LV2 plugins from Calf Studio - Interface: The enable/disable switch was moved from the plugin selection list to the respective plugin control section. Let's hope this makes things easier new users. At the previous location of the switch users will find a check informing if the plugin is enabled or not. - Autostart service: Added an option in the main menu to autostart pulseeffects in service mode (--gapplication-service) at login. under the hood what is done is copying a .desktop file to the autostart folder in the user config folder (usually ~/.config). ### Fixed Enable all apps settings: it is not reset to true when closing the window The following translations were updated: cs, pt_BR ## [3.0.9] ### Added - Equalizer: it now has 30 bands fully configurable by the user - Global: enable all apps switch added to the main menu - App info: apps on/off switch is now near the apps name and icon. Let's hope that this makes things more obvious to new users. easyeffects-4.8.7/LICENSE.md000066400000000000000000001045051424023573300154470ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {one line to give the program's name and a brief idea of what it does.} Copyright (C) {year} {name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: {project} Copyright (C) {year} {fullname} This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . easyeffects-4.8.7/PKGBUILD000066400000000000000000000023251424023573300151640ustar00rootroot00000000000000# Maintainer: Bleuzen # Contributor: Filipe Laíns (FFY00) # Contributor: Wellington pkgname=pulseeffects-legacy-git pkgver=4.8.4.r0.gcef23707 pkgrel=1 pkgdesc='Audio Effects for Pulseaudio Applications' arch=(x86_64) url='https://github.com/wwmm/pulseeffects' license=('GPL3') depends=('gtk3' 'gtkmm3' 'glibmm' 'pulseaudio' 'gstreamer' 'gst-plugin-gtk' 'gst-plugins-bad' 'lilv' 'boost-libs' 'libsigc++' 'libsndfile' 'libsamplerate' 'zita-convolver' 'libebur128' 'calf' 'lsp-plugins' 'yelp') makedepends=('meson' 'boost' 'itstool' 'appstream-glib' 'zam-plugins' 'rubberband' 'rnnoise') optdepends=('zam-plugins: maximizer' 'rubberband: pitch shifting' 'rnnoise: noise remover') source=("git+https://github.com/wwmm/pulseeffects.git#branch=pulseaudio-legacy") conflicts=(pulseeffects) provides=(pulseeffects) sha512sums=('SKIP') pkgver() { cd pulseeffects git describe --long | sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g' } build() { mkdir -p pulseeffects/build cd pulseeffects/build arch-meson .. ninja } package() { cd pulseeffects/build DESTDIR="$pkgdir" ninja install } easyeffects-4.8.7/README.md000066400000000000000000000076171424023573300153300ustar00rootroot00000000000000# PulseEffects Legacy PulseAudio [![Donate](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/wwmm/donate) This is the old PulseEffects version supporting plain PulseAudio server, not Pipewire. This branch is in maintenance mode and no longer under development. ![](images/pulseeffects.png) ![](images/equalizer1.png) ![](images/equalizer2.png) ![](images/convolver.png) ![](images/test_signals.png) ## Effects available ### Applications output - Auto gain - Bass enhancer - Compressor - Convolver - Crossfeed - Crystalizer - De-esser - Equalizer - Exciter - Expander - Filter (low-pass, high-pass, band-pass and band-reject modes) - Gate - Limiter - Loudness - Maximizer - Multiband compressor - Multiband gate - Noise reduction - Pitch - Reverberation - Stereo tools ### Applications input - Compressor - De-esser - Equalizer - Filter (low-pass, high-pass, band-pass and band-reject modes) - Gate - Limiter - Maximizer - Multiband compressor - Multiband gate - Noise reduction - Pitch - Reverberation - Stereo tools - WebRTC The user has full control over the effects order. Just use the up/down arrows next to the plugin label at the left side. To be able to use all plugins you must have the following installed in your system: - [PulseAudio](https://gitlab.freedesktop.org/pulseaudio/pulseaudio). Version 13 or higher - [GStreamer plugins "Good"](https://github.com/GStreamer/gst-plugins-good). Version 1.12.5 or higher - [GStreamer plugins "Bad"](https://github.com/GStreamer/gst-plugins-bad). Version 1.12.5 or higher - [Linux Studio plugins](http://lsp-plug.in/?page=home). Version 1.1.24 or higher. - [Calf Studio plugins](https://calf-studio-gear.org/). Version 0.90.1 or higher. - [libebur128](https://github.com/jiixyj/libebur128). For Auto Gain. - [ZamAudio plugins](http://www.zamaudio.com/). For Maximizer. - [zita-convolver](https://kokkinizita.linuxaudio.org/linuxaudio/). For Convolver. - [rubberband](https://www.breakfastquay.com/rubberband/). For Pitch Shift. - [RNNoise](https://github.com/xiph/rnnoise). For Noise Reduction. - [libsamplerate](http://www.mega-nerd.com/SRC/index.html) - [libsndfile](http://www.mega-nerd.com/libsndfile/) ## Donate You can help Wellington Wallace to keep developing PulseEffects through donations. Any amount will be greatly appreciated :-)
https://liberapay.com/wwmm Donate using Liberapay
https://www.patreon.com/wellingtonwallace?fan_landing=true Patreon
## Changelog - For information about changes between versions take a look at our [changelog](https://github.com/wwmm/pulseeffects/blob/master/CHANGELOG.md) ## Installation See the wiki: [Installing from Source](https://github.com/wwmm/pulseeffects/wiki/Installation-from-Source), for detailed instructions. ## Documentation PulseEffects documentation can be read inside the GUI installing [yelp](https://gitlab.gnome.org/GNOME/yelp) package. ## Frequently asked questions Take a look at our [FAQ](https://github.com/wwmm/pulseeffects/wiki/FAQ) to see if you are facing a known problem. ## Command-line options See the wiki: [Command Line Options](https://github.com/wwmm/pulseeffects/wiki/Command-Line-Options) ## Community presets See the wiki: [Community presets](https://github.com/wwmm/pulseeffects/wiki/Community-presets) ## Reporting bugs See the wiki: [Reporting Bugs](https://github.com/wwmm/pulseeffects/wiki/Reporting-bugs) ## Translating PulseEffects See the wiki: [Translating PulseEffects](https://github.com/wwmm/pulseeffects/wiki/Translating-PulseEffects), for detailed instructions. ## License PulseEffects is licensed under GNU General Public License version 3. See [LICENSE file](https://github.com/wwmm/pulseeffects/blob/master/LICENSE.md). easyeffects-4.8.7/data/000077500000000000000000000000001424023573300147475ustar00rootroot00000000000000easyeffects-4.8.7/data/com.github.wwmm.pulseeffects.appdata.xml.in000066400000000000000000000331651424023573300252330ustar00rootroot00000000000000 com.github.wwmm.pulseeffects.desktop PulseEffects CC0-1.0 GPL-3.0 Audio Effects for PulseAudio Applications Wellington Wallace

PulseEffects is an advanced audio manipulation tools. It includes an equalizer, limiter, compressor and a reverberation tool, just to mention a few. To complement this there is also a built in spectrum analyzer.

Because PulseEffects uses the default PulseAudio sound server it will work with most, if not all, applications you use. All supported applications are presented in the main window, where each can be enabled individually.

Besides manipulating sound output, PulseEffects is able to apply effects to an input device, such as a microphone. This is, for example, useful in audio recording, but it also works well during voice conversations.

When PulseEffects is launched it will conveniently remember the configuration used in the last session. It is also possible to save all the current settings as profiles.

com.github.wwmm.pulseeffects.desktop https://github.com/wwmm/pulseeffects https://github.com/wwmm/pulseeffects/issues https://github.com/wwmm/pulseeffects/blob/master/README.md https://raw.githubusercontent.com/wwmm/pulseeffects/master/images/appdata-screenshot-01.png Set the volume and turn on/off effects https://raw.githubusercontent.com/wwmm/pulseeffects/master/images/appdata-screenshot-02.png Includes an equalizer with built-in presets https://raw.githubusercontent.com/wwmm/pulseeffects/master/images/appdata-screenshot-03.png Input Limiter https://raw.githubusercontent.com/wwmm/pulseeffects/master/images/appdata-screenshot-04.png Compressor https://raw.githubusercontent.com/wwmm/pulseeffects/master/images/appdata-screenshot-05.png Calibration none none none none none none none none none none none none none none none none none none none none contact_AT_hembas.se PulseEffects
easyeffects-4.8.7/data/com.github.wwmm.pulseeffects.desktop.in000066400000000000000000000006601424023573300244650ustar00rootroot00000000000000[Desktop Entry] Name=PulseEffects GenericName=Equalizer, Compressor and Other Audio Effects Comment=Audio Effects for PulseAudio Applications Keywords=limiter;compressor;reverberation;equalizer;autovolume; Categories=GTK;AudioVideo;Audio; Exec=pulseeffects # Translators: This is an icon name, don't translate! Icon=pulseeffects StartupNotify=true DBusActivatable=true X-GNOME-UsesNotifications=true Terminal=false Type=Application easyeffects-4.8.7/data/com.github.wwmm.pulseeffects.service.in000066400000000000000000000001441424023573300244510ustar00rootroot00000000000000[D-BUS Service] Name=com.github.wwmm.pulseeffects Exec=@bindir@/pulseeffects --gapplication-service easyeffects-4.8.7/data/icons/000077500000000000000000000000001424023573300160625ustar00rootroot00000000000000easyeffects-4.8.7/data/icons/pulseeffects-celsius-symbolic.svg000066400000000000000000000116511424023573300245630ustar00rootroot00000000000000 image/svg+xml easyeffects-4.8.7/data/icons/pulseeffects-db-symbolic.svg000066400000000000000000000126161424023573300235030ustar00rootroot00000000000000 image/svg+xml easyeffects-4.8.7/data/icons/pulseeffects-hz-symbolic.svg000066400000000000000000000076721424023573300235450ustar00rootroot00000000000000 image/svg+xml easyeffects-4.8.7/data/icons/pulseeffects-irs-symbolic.svg000066400000000000000000000144561424023573300237170ustar00rootroot00000000000000 image/svg+xml easyeffects-4.8.7/data/icons/pulseeffects-ms-symbolic.svg000066400000000000000000000132151424023573300235310ustar00rootroot00000000000000 image/svg+xml easyeffects-4.8.7/data/icons/pulseeffects-one-symbolic.svg000066400000000000000000000117561424023573300237030ustar00rootroot00000000000000 image/svg+xml easyeffects-4.8.7/data/icons/pulseeffects-percent-symbolic.svg000066400000000000000000000144201424023573300245510ustar00rootroot00000000000000 image/svg+xml easyeffects-4.8.7/data/icons/pulseeffects-s-symbolic.svg000066400000000000000000000107471424023573300233630ustar00rootroot00000000000000 image/svg+xml easyeffects-4.8.7/data/icons/pulseeffects-sine-symbolic.svg000066400000000000000000000174051424023573300240550ustar00rootroot00000000000000 image/svg+xml easyeffects-4.8.7/data/icons/pulseeffects-us-symbolic.svg000066400000000000000000000126121424023573300235410ustar00rootroot00000000000000 image/svg+xml easyeffects-4.8.7/data/icons/pulseeffects-zero-symbolic.svg000066400000000000000000000124161424023573300240730ustar00rootroot00000000000000 image/svg+xml easyeffects-4.8.7/data/meson.build000066400000000000000000000070551424023573300171200ustar00rootroot00000000000000schemadir = join_paths(datadir, 'glib-2.0', 'schemas') install_data([ 'schemas/com.github.wwmm.pulseeffects.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.spectrum.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.sinkinputs.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.autogain.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.limiter.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.compressor.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.multibandcompressor.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.reverb.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.filter.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.equalizer.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.equalizer.channel.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.exciter.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.bassenhancer.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.crossfeed.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.maximizer.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.loudness.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.pitch.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.gate.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.multibandgate.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.stereotools.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.deesser.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.convolver.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.crystalizer.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.delay.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.sourceoutputs.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.webrtc.gschema.xml', 'schemas/com.github.wwmm.pulseeffects.rnnoise.gschema.xml' ], install_dir: schemadir) appdata_file = i18n_mod.merge_file( input: 'com.github.wwmm.pulseeffects.appdata.xml.in', output: 'com.github.wwmm.pulseeffects.appdata.xml', po_dir: '../po', install: true, install_dir: join_paths(datadir, 'metainfo') ) # Validate merged AppStream appdata file appstream_util = find_program('appstream-util', required: false) if appstream_util.found() test('Validate appstream file', appstream_util, args: ['validate-strict', '--nonet', appdata_file] ) endif desktop_file = i18n_mod.merge_file( input: 'com.github.wwmm.pulseeffects.desktop.in', output: 'com.github.wwmm.pulseeffects.desktop', type: 'desktop', po_dir: '../po', install: true, install_dir: join_paths(datadir, 'applications') ) # Validate merged desktop entry file desktop_utils = find_program('desktop-file-validate', required: false) if desktop_utils.found() test('Validate desktop file', desktop_utils, args: [desktop_file] ) endif icondir = join_paths(datadir, 'icons', 'hicolor') install_data('pulseeffects.svg', install_dir: join_paths(icondir, 'scalable', 'apps') ) conf_glade = configuration_data() conf_glade.set('PROJECT_VERSION', meson.project_version()) glade_about = configure_file(input: 'ui/about.glade.in', output: 'about.glade', configuration: conf_glade) gresources = gnome_mod.compile_resources( 'pulseeffects-resources', 'pulseeffects.gresource.xml', c_name: meson.project_name(), dependencies: [glade_about] ) dbusconf = configuration_data() dbusconf.set('bindir', join_paths(get_option('prefix'), get_option('bindir'))) configure_file( input: 'com.github.wwmm.pulseeffects.service.in', output: 'com.github.wwmm.pulseeffects.service', configuration: dbusconf, install_dir: join_paths(get_option('datadir'), 'dbus-1', 'services'), ) easyeffects-4.8.7/data/presets/000077500000000000000000000000001424023573300164345ustar00rootroot00000000000000easyeffects-4.8.7/data/presets/gstreamer_ballad.json000066400000000000000000000046611424023573300226260ustar00rootroot00000000000000{ "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "4", "frequency": "29.952623149688797", "width": "19.905246299377595", "type": "Lo-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "3.75", "frequency": "59.763340205038524", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "2.5", "frequency": "119.24354052777788", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "0", "frequency": "237.92214271853953", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "-4", "frequency": "474.71708526294935", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "-6", "frequency": "947.18511049703125", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "-3", "frequency": "1889.8827562743609", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "0", "frequency": "3770.8118433037489", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "2.5", "frequency": "7523.7587677823067", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "9", "frequency": "15011.872336272731", "width": "9976.2553274545608", "type": "Hi-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/presets/gstreamer_classic.json000066400000000000000000000046551424023573300230330ustar00rootroot00000000000000{ "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "0", "frequency": "29.952623149688797", "width": "19.905246299377595", "type": "Lo-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "0", "frequency": "59.763340205038524", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "0", "frequency": "119.24354052777788", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "0", "frequency": "237.92214271853953", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "0", "frequency": "474.71708526294935", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "0", "frequency": "947.18511049703125", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "-6", "frequency": "1889.8827562743609", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "-7", "frequency": "3770.8118433037489", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "-7", "frequency": "7523.7587677823067", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "-9.5", "frequency": "15011.872336272731", "width": "9976.2553274545608", "type": "Hi-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/presets/gstreamer_club.json000066400000000000000000000046511424023573300223330ustar00rootroot00000000000000{ "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "0", "frequency": "29.952623149688797", "width": "19.905246299377595", "type": "Lo-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "0", "frequency": "59.763340205038524", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "8", "frequency": "119.24354052777788", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "6", "frequency": "237.92214271853953", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "5.5", "frequency": "474.71708526294935", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "5", "frequency": "947.18511049703125", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "3", "frequency": "1889.8827562743609", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "0", "frequency": "3770.8118433037489", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "0", "frequency": "7523.7587677823067", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "0", "frequency": "15011.872336272731", "width": "9976.2553274545608", "type": "Hi-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/presets/gstreamer_dance.json000066400000000000000000000046601424023573300224600ustar00rootroot00000000000000{ "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "9.6", "frequency": "29.952623149688797", "width": "19.905246299377595", "type": "Lo-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "7", "frequency": "59.763340205038524", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "2.5", "frequency": "119.24354052777788", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "0", "frequency": "237.92214271853953", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "0", "frequency": "474.71708526294935", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "-5.6", "frequency": "947.18511049703125", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "-7", "frequency": "1889.8827562743609", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "-7", "frequency": "3770.8118433037489", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "0", "frequency": "7523.7587677823067", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "0", "frequency": "15011.872336272731", "width": "9976.2553274545608", "type": "Hi-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/presets/gstreamer_more_bass.json000066400000000000000000000046661424023573300233660ustar00rootroot00000000000000{ "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "-8", "frequency": "29.952623149688797", "width": "19.905246299377595", "type": "Lo-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "10", "frequency": "59.763340205038524", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "10", "frequency": "119.24354052777788", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "5.5", "frequency": "237.92214271853953", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "1.5", "frequency": "474.71708526294935", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "-4", "frequency": "947.18511049703125", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "-8", "frequency": "1889.8827562743609", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "-10", "frequency": "3770.8118433037489", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "-11", "frequency": "7523.7587677823067", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "-11", "frequency": "15011.872336272731", "width": "9976.2553274545608", "type": "Hi-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/presets/gstreamer_more_bass_and_treble.json000066400000000000000000000050371424023573300255360ustar00rootroot00000000000000 { "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "8", "frequency": "29.952623149688797", "width": "19.905246299377595", "type": "Lo-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "5.5", "frequency": "59.763340205038524", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "0", "frequency": "119.24354052777788", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "-7", "frequency": "237.92214271853953", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "-5", "frequency": "474.71708526294935", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "1.5", "frequency": "947.18511049703125", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "8", "frequency": "1889.8827562743609", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "11.2", "frequency": "3770.8118433037489", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "12", "frequency": "7523.7587677823067", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "12", "frequency": "15011.872336272731", "width": "9976.2553274545608", "type": "Hi-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/presets/gstreamer_party.json000066400000000000000000000046471424023573300225520ustar00rootroot00000000000000{ "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "7", "frequency": "29.952623149688797", "width": "19.905246299377595", "type": "Lo-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "7", "frequency": "59.763340205038524", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "0", "frequency": "119.24354052777788", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "0", "frequency": "237.92214271853953", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "0", "frequency": "474.71708526294935", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "0", "frequency": "947.18511049703125", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "0", "frequency": "1889.8827562743609", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "0", "frequency": "3770.8118433037489", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "7", "frequency": "7523.7587677823067", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "7", "frequency": "15011.872336272731", "width": "9976.2553274545608", "type": "Hi-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/presets/gstreamer_pop.json000066400000000000000000000046701424023573300222050ustar00rootroot00000000000000{ "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "-1.6", "frequency": "29.952623149688797", "width": "19.905246299377595", "type": "Lo-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "4.5", "frequency": "59.763340205038524", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "7", "frequency": "119.24354052777788", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "8", "frequency": "237.92214271853953", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "5.6", "frequency": "474.71708526294935", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "0", "frequency": "947.18511049703125", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "-2.5", "frequency": "1889.8827562743609", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "-2", "frequency": "3770.8118433037489", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "-1.6", "frequency": "7523.7587677823067", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "-1.5", "frequency": "15011.872336272731", "width": "9976.2553274545608", "type": "Hi-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/presets/gstreamer_reggae.json000066400000000000000000000046561424023573300226450ustar00rootroot00000000000000{ "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "0", "frequency": "29.952623149688797", "width": "19.905246299377595", "type": "Lo-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "0", "frequency": "59.763340205038524", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "0", "frequency": "119.24354052777788", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "-5.5", "frequency": "237.92214271853953", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "0", "frequency": "474.71708526294935", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "6.5", "frequency": "947.18511049703125", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "6.5", "frequency": "1889.8827562743609", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "0", "frequency": "3770.8118433037489", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "0", "frequency": "7523.7587677823067", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "0", "frequency": "15011.872336272731", "width": "9976.2553274545608", "type": "Hi-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/presets/gstreamer_rock.json000066400000000000000000000046611424023573300223450ustar00rootroot00000000000000{ "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "8", "frequency": "29.952623149688797", "width": "19.905246299377595", "type": "Lo-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "5", "frequency": "59.763340205038524", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "-5.5", "frequency": "119.24354052777788", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "-8", "frequency": "237.92214271853953", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "-3", "frequency": "474.71708526294935", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "4", "frequency": "947.18511049703125", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "8", "frequency": "1889.8827562743609", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "11", "frequency": "3770.8118433037489", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "11", "frequency": "7523.7587677823067", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "11.5", "frequency": "15011.872336272731", "width": "9976.2553274545608", "type": "Hi-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/presets/gstreamer_ska.json000066400000000000000000000046571424023573300221720ustar00rootroot00000000000000{ "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "-2.5", "frequency": "29.952623149688797", "width": "19.905246299377595", "type": "Lo-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "-5", "frequency": "59.763340205038524", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "-4", "frequency": "119.24354052777788", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "0", "frequency": "237.92214271853953", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "4", "frequency": "474.71708526294935", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "5.5", "frequency": "947.18511049703125", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "8", "frequency": "1889.8827562743609", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "9", "frequency": "3770.8118433037489", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "11", "frequency": "7523.7587677823067", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "9", "frequency": "15011.872336272731", "width": "9976.2553274545608", "type": "Hi-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/presets/gstreamer_soft.json000066400000000000000000000046561424023573300223660ustar00rootroot00000000000000{ "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "5", "frequency": "29.952623149688797", "width": "19.905246299377595", "type": "Lo-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "1.5", "frequency": "59.763340205038524", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "0", "frequency": "119.24354052777788", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "-2.5", "frequency": "237.92214271853953", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "0", "frequency": "474.71708526294935", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "4", "frequency": "947.18511049703125", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "8", "frequency": "1889.8827562743609", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "9", "frequency": "3770.8118433037489", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "11", "frequency": "7523.7587677823067", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "12", "frequency": "15011.872336272731", "width": "9976.2553274545608", "type": "Hi-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/presets/gstreamer_techno.json000066400000000000000000000046571424023573300226740ustar00rootroot00000000000000{ "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "8", "frequency": "29.952623149688797", "width": "19.905246299377595", "type": "Lo-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "5.5", "frequency": "59.763340205038524", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "0", "frequency": "119.24354052777788", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "-5.5", "frequency": "237.92214271853953", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "-5", "frequency": "474.71708526294935", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "0", "frequency": "947.18511049703125", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "8", "frequency": "1889.8827562743609", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "10", "frequency": "3770.8118433037489", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "10", "frequency": "7523.7587677823067", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "9", "frequency": "15011.872336272731", "width": "9976.2553274545608", "type": "Hi-shelf", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/presets/ziyad_perfecteq.json000066400000000000000000000045741424023573300225170ustar00rootroot00000000000000 { "equalizer": { "state": "true", "mode": "IIR", "num-bands": "10", "input-gain": "0", "output-gain": "0", "band0": { "gain": "4", "frequency": "32", "width": "19.905246299377595", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band1": { "gain": "2", "frequency": "64", "width": "39.716187811321859", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band2": { "gain": "1", "frequency": "125", "width": "79.244212834156855", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band3": { "gain": "0", "frequency": "250", "width": "158.11299154736642", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band4": { "gain": "-1", "frequency": "500", "width": "315.47689354145319", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band5": { "gain": "-2", "frequency": "1000", "width": "629.45915692671076", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band6": { "gain": "0", "frequency": "2000", "width": "1255.9361346279484", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band7": { "gain": "2", "frequency": "4000", "width": "2505.9220394308272", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band8": { "gain": "3", "frequency": "8000", "width": "4999.9718095262879", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" }, "band9": { "gain": "3", "frequency": "16000", "width": "9976.2553274545608", "type": "Bell", "mode": "RLC (BT)", "slope": "x1", "solo": "false", "mute": "false" } } }easyeffects-4.8.7/data/pulseeffects.gresource.xml000066400000000000000000000065671424023573300221740ustar00rootroot00000000000000 about.glade ui/custom.css ui/application.glade ui/app_button_row.glade ui/spectrum.glade ui/spectrum_settings.glade ui/pulse_settings.glade ui/blocklist_settings.glade ui/general_settings.glade ui/effects_base.glade ui/app_info.glade ui/pulse_info.glade ui/module_info.glade ui/client_info.glade ui/pulse_conf_file_line.glade ui/autogain.glade ui/limiter.glade ui/compressor.glade ui/multiband_compressor.glade ui/filter.glade ui/equalizer.glade ui/equalizer_band.glade ui/equalizer_preset_row.glade ui/reverb.glade ui/bass_enhancer.glade ui/exciter.glade ui/crossfeed.glade ui/loudness.glade ui/maximizer.glade ui/stereo_tools.glade ui/gate.glade ui/multiband_gate.glade ui/deesser.glade ui/convolver.glade ui/irs_row.glade ui/crystalizer.glade ui/crystalizer_band.glade ui/delay.glade ui/pitch.glade ui/webrtc.glade ui/rnnoise.glade ui/preset_row.glade ui/presets_menu.glade ui/blocklist_row.glade ui/calibration.glade ui/calibration_signals.glade ui/calibration_mic.glade icons/pulseeffects-sine-symbolic.svg icons/pulseeffects-us-symbolic.svg icons/pulseeffects-db-symbolic.svg icons/pulseeffects-ms-symbolic.svg icons/pulseeffects-s-symbolic.svg icons/pulseeffects-hz-symbolic.svg icons/pulseeffects-celsius-symbolic.svg icons/pulseeffects-zero-symbolic.svg icons/pulseeffects-one-symbolic.svg icons/pulseeffects-percent-symbolic.svg icons/pulseeffects-irs-symbolic.svg presets/gstreamer_ballad.json presets/gstreamer_classic.json presets/gstreamer_club.json presets/gstreamer_dance.json presets/gstreamer_pop.json presets/gstreamer_reggae.json presets/gstreamer_rock.json presets/gstreamer_ska.json presets/gstreamer_soft.json presets/gstreamer_techno.json presets/gstreamer_party.json presets/gstreamer_more_bass.json presets/gstreamer_more_bass_and_treble.json presets/ziyad_perfecteq.json easyeffects-4.8.7/data/pulseeffects.svg000066400000000000000000000036401424023573300201630ustar00rootroot00000000000000 easyeffects-4.8.7/data/schemas/000077500000000000000000000000001424023573300163725ustar00rootroot00000000000000easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.autogain.gschema.xml000066400000000000000000000027131424023573300300470ustar00rootroot00000000000000 false true true 0.0 0.0 -23.0 1 1 1 false false true easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.bassenhancer.gschema.xml000066400000000000000000000027451424023573300307010ustar00rootroot00000000000000 false true true 0.0 0.0 0 8.5 100 20 0 false false easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.compressor.gschema.xml000066400000000000000000000111651424023573300304350ustar00rootroot00000000000000 false true true 0.0 0.0 "Downward" 20.0 100.0 -200.0 -12.0 4.0 -6.0 0.0 -72.0 false "Feed-forward" "RMS" "Middle" 0.0 10.0 0.0 "off" 10.0 "off" 20000.0 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.convolver.gschema.xml000066400000000000000000000016141424023573300302540ustar00rootroot00000000000000 false true true 0.0 0.0 "" 100 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.crossfeed.gschema.xml000066400000000000000000000012341424023573300302120ustar00rootroot00000000000000 false true true 700 4.5 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.crystalizer.gschema.xml000066400000000000000000000116331424023573300306140ustar00rootroot00000000000000 false true true 0.0 0.0 false 12.0 10.0 8.0 6.0 4.0 2.0 0.0 -2.0 -4.0 -6.0 -8.0 -10.0 -12.0 false false false false false false false false false false false false false false false false false false false false false false false false false false easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.deesser.gschema.xml000066400000000000000000000043351424023573300276740ustar00rootroot00000000000000 false true true "RMS" "Wide" -18 3 15 0.0 6000 4500 0.0 12 1 false easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.delay.gschema.xml000066400000000000000000000016531424023573300273400ustar00rootroot00000000000000 false true true 0.0 0.0 0.0 0.0 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.equalizer.channel.gschema.xml000066400000000000000000001027301424023573300316500ustar00rootroot00000000000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22.59 28.44 35.8 45.07 56.74 71.43 89.93 113.21 142.53 179.43 225.89 284.38 358.02 450.72 567.42 714.34 899.29 1132.15 1425.29 1794.33 2258.93 2843.82 3580.16 4507.15 5674.16 7143.35 8992.94 11321.45 14252.86 17943.28 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.equalizer.gschema.xml000066400000000000000000000023251424023573300302400ustar00rootroot00000000000000 false true true 30 0.0 0.0 false "IIR" easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.exciter.gschema.xml000066400000000000000000000027531424023573300277070ustar00rootroot00000000000000 false true true 0.0 0.0 0 8.5 7500 16000 0 false false easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.filter.gschema.xml000066400000000000000000000036101424023573300275220ustar00rootroot00000000000000 false true true 0.0 0.0 2000 -3.0 "12dB/oct Lowpass" 20.0 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.gate.gschema.xml000066400000000000000000000040151424023573300271550ustar00rootroot00000000000000 false true true "RMS" "Average" -24 20.0 250.0 -18 2 9 0.0 0.0 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.gschema.xml000066400000000000000000000062561424023573300262470ustar00rootroot00000000000000 "512" "512" true false false true true "Presets" "Presets" "" "" false [] [] "None" 4 -10 0 0 false 5 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.limiter.gschema.xml000066400000000000000000000027441424023573300277110ustar00rootroot00000000000000 false true true 0.0 0.0 0.0 5.0 50.0 false false 0.5 1 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.loudness.gschema.xml000066400000000000000000000030311424023573300300660ustar00rootroot00000000000000 false true true "4096" "ISO226-2003" 0.0 0.0 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.maximizer.gschema.xml000066400000000000000000000014401424023573300302410ustar00rootroot00000000000000 false true true 25 0.0 0.0 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.multibandcompressor.gschema.xml000066400000000000000000000137211424023573300323350ustar00rootroot00000000000000 false true true 0.0 0.0 120 1000 6000 "LR8" -12 2 150.0 300.0 0.0 9 "RMS" false false -12 2 150.0 300.0 0.0 9 "RMS" false false -12 2 150.0 300.0 0.0 9 "RMS" false false -12 2 150.0 300.0 0.0 9 "RMS" false false easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.multibandgate.gschema.xml000066400000000000000000000144051424023573300310610ustar00rootroot00000000000000 false true true 0.0 0.0 120 1000 6000 "LR8" -24 -12 2 150.0 300.0 0.0 9 "RMS" false false -24 -12 2 150.0 300.0 0.0 9 "RMS" false false -24 -12 2 150.0 300.0 0.0 9 "RMS" false false -24 -12 2 150.0 300.0 0.0 9 "RMS" false false easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.pitch.gschema.xml000066400000000000000000000024071424023573300273470ustar00rootroot00000000000000 false true true 0 0 0 3 false 0.0 0.0 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.reverb.gschema.xml000066400000000000000000000042341424023573300275250ustar00rootroot00000000000000 false true true 0.0 0.0 "Large" 1.5 5000 0.5 -12 0 0 300 5000 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.rnnoise.gschema.xml000066400000000000000000000014031424023573300277100ustar00rootroot00000000000000 false true true 0.0 0.0 "" com.github.wwmm.pulseeffects.sinkinputs.equalizer.rightchannel.gschema.xml000066400000000000000000001007711424023573300350400ustar00rootroot00000000000000easyeffects-4.8.7/data/schemas 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22.59 28.44 35.8 45.07 56.74 71.43 89.93 113.21 142.53 179.43 225.89 284.38 358.02 450.72 567.42 714.34 899.29 1132.15 1425.29 1794.33 2258.93 2843.82 3580.16 4507.15 5674.16 7143.35 8992.94 11321.45 14252.86 17943.28 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 4.36 "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "Bell" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "RLC (BT)" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" "x1" false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.sinkinputs.gschema.xml000066400000000000000000000021201424023573300304370ustar00rootroot00000000000000 ["limiter","autogain","gate","multiband_gate","compressor", "multiband_compressor","convolver","bass_enhancer","exciter", "crystalizer","stereo_tools","reverb","equalizer","delay", "deesser", "crossfeed","loudness","maximizer","filter","pitch","rnnoise"] 200000 10000 200000 10000 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.sourceoutputs.gschema.xml000066400000000000000000000017771424023573300312150ustar00rootroot00000000000000 ["gate","multiband_gate","webrtc","limiter","compressor", "multiband_compressor","filter","equalizer","deesser","reverb", "pitch","stereo_tools","maximizer","rnnoise"] 200000 10000 200000 10000 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.spectrum.gschema.xml000066400000000000000000000035161424023573300301040ustar00rootroot00000000000000 true true true 100 2.0 false true [1.0,1.0,1.0,1.0] [0.0,0.0,0.0,1.0] [1.0,1.0,1.0,1.0] 120 10 "Bars" 20 20000 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.stereotools.gschema.xml000066400000000000000000000060171424023573300306230ustar00rootroot00000000000000 false true true 0.0 0.0 0.0 0.0 false false false false false "LR > LR (Stereo Default)" 0.0 0.0 0.0 0.0 0.0 0.0 1 0 easyeffects-4.8.7/data/schemas/com.github.wwmm.pulseeffects.webrtc.gschema.xml000066400000000000000000000063601424023573300275300ustar00rootroot00000000000000 false true true true true "moderate" true "moderate" true true false 3 9 true "adaptive-digital" false 10 "low" easyeffects-4.8.7/data/ui/000077500000000000000000000000001424023573300153645ustar00rootroot00000000000000easyeffects-4.8.7/data/ui/about.glade.in000066400000000000000000000034471424023573300201110ustar00rootroot00000000000000 False True dialog PulseEffects @PROJECT_VERSION@ Audio effects for PulseAudio applications Wellington Wallace Wellington Wallace Gianluca Boiano ZenCubic pulseeffects gpl-3-0 False vertical 2 False end False False 0 easyeffects-4.8.7/data/ui/app_button_row.glade000066400000000000000000000130401424023573300214220ustar00rootroot00000000000000 True False 7 7 12 True False start 6 False True center audio-speakers-symbolic False True 0 False True center audio-input-microphone-symbolic False True 1 True False center 2 Applications False True 2 False True 0 False True end 2 False True 4 dialog-warning-symbolic False True 0 True False 4 True 4 1 False True 1 True False 4 True 4 1 False True 2 True False 4 dB right 3 True 1 False True 3 False True end 1 easyeffects-4.8.7/data/ui/app_info.glade000066400000000000000000000460541424023573300201660ustar00rootroot00000000000000 True False audio-volume-high-symbolic 100 1 5 True False 12 12 4 24 8 True False 4 True True True True start mute_icon 0 0 True True True volume_adjustment 0 0 right 1 0 True False 1 % 2 0 0 1 True True True True True False True False 4 12 16 True True start center 0 0 True False start True 6 True False image-missing False True 0 True False 2 vertical 2 True False start App True word-char end 80 2 False True 0 True False start Description True word-char end 80 3 False True 1 False True 1 1 0 True True False end True True False start Add to Blocklist 2 0 True False 6 4 12 True True False f 0 1 True False Format 0 0 True False r 1 1 True False Rate 1 0 True False c 2 1 True False Channels 2 0 True False r 3 1 True False Resampler 3 0 True False b 4 1 True False Buffer 4 0 True False sl 5 1 True False Latency 5 0 True False s 6 1 True False State 6 0 0 1 3 0 0 easyeffects-4.8.7/data/ui/application.glade000066400000000000000000000272501424023573300206730ustar00rootroot00000000000000 True False media-playlist-shuffle-symbolic True False help-faq-symbolic True False pulseeffects-sine-symbolic False False True False True True False False 250 crossfade True False True True False center center True False center center PulseEffects 0 0 True False center center True False center info 1 0 True False end center emblem-music-symbolic 1 0 0 True False start center audio-speakers-symbolic 1 2 0 0 1 True False center stack True True True Test Signals center center image_test True 1 True True True Global Bypass center center image_bypass True 2 True True True Settings center center settings_menu True False format-justify-fill-symbolic end 3 True True True Help center center image_help True end 4 True True True center center presets_menu True False Presets end True 50 end 5 False settings_popover_button True False 6 6 6 6 18 True False center center stack_menu_settings 0 0 True False True 250 crossfade 0 1 easyeffects-4.8.7/data/ui/autogain.glade000066400000000000000000001542601424023573300202010ustar00rootroot00000000000000 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Auto Gain False True 1 False True 1 -20 20 0.1 1 -20 20 0.1 1 -100 -23 0.1 1 1 100 1 1 1 1 100 1 1 1 1 100 1 1 1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Based on False True 0 True False libebur128 False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 14 True False center center 48 True Reset History True True True 0 0 Detect Silence True True True 1 0 Use Geometric Mean True True True 2 0 False True 0 True False center 14 True True False center start 2 True False center 2 Target center True 0 0 True True center 7 -23.0 0.5 False number target 1 True if-valid -23 0 1 0 0 True False center start 2 True False center Momentary center True 0 2 True True center 4 1 0.5 False number weight_m True if-valid 1 0 1 True False center 0 0 1 0 True False center start 2 True False center 2 Weights center True 0 0 True False center Short Term center True 0 2 True True center end 4 1 0.5 False number weight_s True if-valid 1 0 1 2 0 True False center start 2 True False center Integrated center True 0 2 True True center end 4 1 0.5 False number weight_i True if-valid 1 0 1 True False center 0 0 3 0 False True 1 True False 20 6 6 True False end Input 0 0 2 True False end Output 0 3 2 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True False center True 2 0 True False center True 2 1 True False center True 2 3 True False center True 2 4 True True center True input_gain 1 right 1 0 2 True True center True output_gain 1 right 1 3 2 True False 5 2 True False 0 2 4 False True 2 True False True 4 6 True False end 3 Momentary 0 1 True False end 3 Short Term 0 2 True False end 3 Integrated 0 3 True False center True 1 1 True False False 2 2 0 7 2 1 True False center True 1 2 True False center True 1 3 True False False 2 2 0 7 2 2 True False False 2 2 0 7 2 3 True False end 3 Relative 0 4 True False end 3 Gain 0 8 True False center True 1 4 True False center True 10 1 8 True False False 2 2 0 7 2 4 True False False 2 2 0 7 2 8 True False end 3 Loudness 0 6 True False center True 1 6 True False False 2 2 0 7 2 6 True False center 6 Output 0 7 3 True False end 3 Range 0 5 True False center True 1 1 30 1 5 True False False 2 2 0 7 2 5 True False center Input 0 0 3 False True 3 0 0 easyeffects-4.8.7/data/ui/bass_enhancer.glade000066400000000000000000001106451424023573300211640ustar00rootroot00000000000000 -100 36 0.1 1 -10 10 1 1 10 120 20 1 10 0.1 10 8.5 0.1 1 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Bass Enhancer False True 1 False True 1 -36 36 0.1 1 -36 36 0.1 1 10 250 100 1 10 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Calf Studio Gears False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 Listen True True True center center False True 0 True False center 6 6 500 True True center True blend 0 0 1 1 True False end 6 3rd 0 1 True False end 6 2nd 2 1 True False center Blend Harmonics 0 0 3 False True 1 True False 6 48 True True False center Amount 0 0 True False center Harmonics 1 0 True False center Scope 2 0 True True center 10 0.0 pulseeffects-db-symbolic False number vertical amount 1 True if-valid 0 1 True True center 10 8.5 False number vertical harmonics 1 True if-valid 8.5 1 1 True True center 10 100 pulseeffects-hz-symbolic False number vertical scope True if-valid 100 2 1 True True center 10 20 pulseeffects-hz-symbolic False number vertical floor True if-valid 20 3 1 Floor True True True center 3 0 False True 2 True False 20 True 6 6 True False end Harmonics 0 6 True False center 4 True 1 6 2 True False center True 2 0 True False center True 2 1 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False end Input 0 0 2 True True center True input_gain 1 right 1 0 2 True False end Output 0 3 2 True True center True output_gain 1 right 1 3 2 True False center True 2 3 True False center True 2 4 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True False False 0 3 3 3 6 3 True False 0 2 4 True False 5 2 True False 0 5 6 False True 3 0 0 easyeffects-4.8.7/data/ui/blocklist_row.glade000066400000000000000000000044011424023573300212360ustar00rootroot00000000000000 True False list-remove-symbolic 2 True True center 6 6 False False True False 6 6 6 True True True image_delete_preset True False True 0 True False Name end True False True 1 easyeffects-4.8.7/data/ui/blocklist_settings.glade000066400000000000000000000316601424023573300222760ustar00rootroot00000000000000 True False list-add-symbolic True False list-add-symbolic True False center 18 True False center blocklist_stack 0 0 True False True 250 slide-left-right True False 18 6 True True True Create Preset image_add_blocklist_in 0 0 True True True Name name 1 0 True False 2 Reconnect the microphone to apply new changes made to the Blocklist True 0 2 2 True False True True 0 in True True True 800 400 True True True False True listbox_blocklist True False True none False 0 1 2 blocklist_in Input Effects audio-input-microphone-symbolic True False 18 6 True True True Create Preset image_add_blocklist_out 0 0 True True True Name name 1 0 True False True True 0 in True True True 800 400 True True True False True listbox_blocklist True False True none False 0 1 2 True False 2 Restart the player to apply new changes made to the Blocklist True 0 2 2 blocklist_out Output Effects audio-speakers-symbolic 1 0 2 True False center 6 6 True False Show Blocklisted Apps in Main Tab 0 0 True True 1 0 0 1 easyeffects-4.8.7/data/ui/calibration.glade000066400000000000000000000305311424023573300206530ustar00rootroot00000000000000 False True False True True vertical True False True True vertical 100 True False GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK True True True True 0 True False 6 6 True True False True True False True True False start 20 Hz False True 0 True False start 47 Hz False True 1 False True 0 True False start 112 Hz False True 1 False True 0 True False True True False start 630 Hz False True 0 True False True True False start 3.5 kHz False True 0 True False True True False start 8.4 kHz False True 0 True False end 20 kHz False True 1 False True 1 False True 2 False True 1 False True 1 0 0 True False start 3 0 1 True False 250 crossfade 0 2 True False PulseEffects 2 True True False center stack 3 easyeffects-4.8.7/data/ui/calibration_mic.glade000066400000000000000000000132701424023573300215040ustar00rootroot00000000000000 1 60 1 5 True False center center 6 6 12 6 24 True False center 6 True False Window 0 0 True True 8 1 0.5 pulseeffects-s-symbolic False number time_window_adjustment True if-valid 1 0 1 0 0 True False 24 True True True True True False 4 True False start True Measure Noise False True 0 True False False True 1 0 0 Subtract Noise True True True 1 0 0 1 easyeffects-4.8.7/data/ui/calibration_signals.glade000066400000000000000000000136401424023573300223750ustar00rootroot00000000000000 23000 1 100 1 0.01 0.1 True False center 6 6 18 6 18 12 True False center Sine Square Saw Triangle Silence White Noise Pink Noise Sine Table Ticks Gaussian Noise Red Noise Blue Noise Violet Noise 0 0 2 True False True 6 True False Volume 0 0 True True True volume_adjustment 2 2 right 1 0 0 2 True True end center 1 2 True False center 6 True True 10 0 0.5 pulseeffects-hz-symbolic False number frequency_adjustment True if-valid 0 1 True False Frequency 0 0 0 1 2 easyeffects-4.8.7/data/ui/client_info.glade000066400000000000000000000035301424023573300206540ustar00rootroot00000000000000 True True 6 6 True False False True False True 6 True False end name 0 0 True False start binary 1 0 easyeffects-4.8.7/data/ui/compressor.glade000066400000000000000000002347561424023573300205770ustar00rootroot00000000000000 2000 20 0.01 0.1 -120 -60 -72 0.1 1 10 20000 10 1 10 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Compressor False True 1 False True 1 -60 60 0.1 1 -23.99 -6 0.01 0.1 20 0.01 0.1 10 20000 20000 1 10 -60 60 0.1 1 -60 60 0.1 1 40 0.1 1 1 100 4 0.01 0.1 250 10 0.01 0.1 5000 100 0.01 0.1 -200 -200 0.1 1 -60 -12 0.1 1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Linux Studio Plugins False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 12 True False center True 12 True False True 250 slide-left-right True False center True 18 True False center True 6 24 True True True center 10 20.00 pulseeffects-ms-symbolic False number vertical attack 2 True if-valid 20 0 1 True True center 10 100.00 pulseeffects-ms-symbolic False number vertical release 2 True if-valid 100 1 1 True False center Threshold 2 0 True True center 10 -12.0 pulseeffects-db-symbolic False number vertical threshold 1 True if-valid -12 2 1 True False center Ratio 3 0 True True center 10 4.00 number vertical ratio 2 True if-valid 4 3 1 True False center Knee 4 0 True True center 10 -6.00 pulseeffects-db-symbolic False number vertical knee 2 True if-valid -6 4 1 True False center Makeup 5 0 True True center 10 0.0 pulseeffects-db-symbolic False False number vertical makeup 1 True if-valid 5 1 True False center Release 1 0 True False center Attack 0 0 0 1 True False center center 6 True False center Downward Upward 0 1 True False center Compression Mode 0 0 0 0 page_compressor Compressor True False center True 18 Listen True True True center center 0 0 True False True 6 24 True True True center 10 0.0 pulseeffects-db-symbolic False number vertical preamp 1 True if-valid 0 3 True False center Pre-amplification 0 2 True True center 10 10.00 pulseeffects-ms-symbolic False number vertical reactivity 2 True if-valid 10 1 3 True False center Reactivity 1 2 True True center 10 0.00 pulseeffects-ms-symbolic False number vertical lookahead 2 True if-valid 2 3 True False center Lookahead 2 2 True False center 18 Feed-forward Feed-back 0 1 True False center Type 0 0 True False center 18 Peak RMS Low-Pass Uniform 1 1 True False center Mode 1 0 True False center 18 Middle Side Left Right 2 1 True False center Source 2 0 0 1 page_sidechain Sidechain 1 True False center True 6 24 True True True center 10 -200.0 pulseeffects-db-symbolic False number vertical release_threshold 1 True if-valid -200 0 3 True True center 10 -72.0 pulseeffects-db-symbolic False number vertical boost_threshold 1 True if-valid -72 1 3 True True center 10 10 pulseeffects-hz-symbolic False number vertical hpf_freq True if-valid 10 2 3 True True center 10 20000 pulseeffects-hz-symbolic False number vertical lpf_freq True if-valid 20000 3 3 True False center Relative Release Threshold 0 2 True False center Boost Threshold 1 2 True False center High-pass Frequency 2 2 True False center Low-pass Frequency 3 2 True False center High-pass Filter Mode 2 0 True False center Low-pass Filter Mode 3 0 True False center 18 Off 12 dB/oct 24 dB/oct 36 dB/oct 2 1 True False center 18 Off 12 dB/oct 24 dB/oct 36 dB/oct 3 1 page_advanced Advanced 2 0 1 True False center center stack 0 0 False True 0 True False 20 6 6 True False end Input 0 0 2 True False end Output 0 3 2 True False center True 2 0 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False center True 2 1 True False center True 2 3 True False center True 2 4 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True False center 4 True 30 1 8 2 True False False 0 2 2 3 8 3 True False end Gain 0 8 True False end Sidechain 0 7 True False center 4 True 1 7 2 True False False 0 2 2 3 7 3 True True center True input_gain 1 right 1 0 2 True True center True output_gain 1 right 1 3 2 True False end Curve 0 6 True False center 4 True 1 6 2 True False False 0 2 2 3 6 3 True False 0 2 4 True False 5 2 True False 0 5 6 False True 1 0 0 easyeffects-4.8.7/data/ui/convolver.glade000066400000000000000000001140671424023573300204100ustar00rootroot00000000000000 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Convolver False True 1 False True 1 True False document-open-symbolic False True False 6 6 6 6 18 Import Impulse True True True Import Impulse Response File center image_import_preset True 0 0 True False True 0 in True True True 800 True True True False True True False True none False 0 1 -20 20 0.1 1 200 100 1 1 -20 20 0.1 1 True False 6 6 True 18 True False True Reset True True True center center right 1 0 True False 4 2 0 True False 0 0 0 1 True True True True True False True False True True vertical 18 True False True 18 18 200 True False True True 250 slide-up-down True False GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK True True left_channel L pulseeffects-zero-symbolic True False GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK True True right_channel R pulseeffects-one-symbolic 1 1 1 True False center 6 24 True True False center Rate 0 0 True False center r 0 1 True False center d 2 1 True False center Duration 2 0 True False center Samples 1 0 True False center s 1 1 1 2 True False center Impulse Response center end 0 0 3 True False center center 18 True True True Select the impulse Response File center menu True False pulseeffects-irs-symbolic 3 0 0 Spectrum True True True center 0 2 True False center 6 True True center 10 100 pulseeffects-percent-symbolic number vertical ir_width True if-valid 100 0 1 True False center Stereo Width 0 0 0 1 2 0 3 True False center center vertical stack 0 0 3 False True 1 True False 20 6 6 True False end Input 0 0 2 True False end Output 0 3 2 True False center True 2 0 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False center True 2 1 True False center True 2 3 True False center True 2 4 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True True center True input_gain 1 right 1 0 2 True True center True output_gain 1 right 1 3 2 True False 5 2 True False 0 2 4 False True 2 0 0 easyeffects-4.8.7/data/ui/crossfeed.glade000066400000000000000000000651361424023573300203520ustar00rootroot00000000000000 300 2000 700 1 10 1 15 4.5 0.1 1 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Crossfeed False True 1 False True 1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False bs2b False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 True False center 12 30 True True False center Presets center 0 0 3 Jmeier True True True 2 1 Default True True True 1 1 Cmoy True True True 0 1 False True 0 True False 6 48 True True False center Cutoff 0 0 True True center 10 700 pulseeffects-hz-symbolic False number vertical fcut True if-valid 700 0 1 True False center Feed 1 0 True True center 10 4.5 pulseeffects-db-symbolic False number vertical feed 1 True if-valid 4.5 1 1 False True 1 True False 20 6 6 True False end 3 Input 0 0 2 True False end 3 Output 0 3 2 True False center True 1 0 True False False 0 3 3 2 0 2 True False center 3 0 5 True False False 1 3 3 4 0 2 True False center True 1 1 True False center True 1 3 True False center True 1 4 True False False 0 3 3 2 3 2 True False False 1 3 3 4 3 2 True False False 0 2 3 True False False 4 2 False True 2 0 0 easyeffects-4.8.7/data/ui/crystalizer.glade000066400000000000000000000647431424023573300207530ustar00rootroot00000000000000 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Crystalizer False True 1 False True 1 -20 20 0.1 1 -20 20 0.1 1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False 4 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 Aggressive Mode True True True center False True 0 True False True True 12 True False True 1 True False 20 6 6 True False end Input 0 0 2 True False end Output 0 3 2 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True False center True 2 0 True False center True 2 1 True False center True 2 3 True False center True 2 4 True True center True input_gain 1 right 1 0 2 True True center True output_gain 1 right 1 3 2 True False 5 2 True False 0 2 4 False True 2 True False 2 6 True False end 3 Before 0 1 True False end 3 After 0 2 True False center True 1 1 30 1 1 True False False 2 2 0 7 2 1 True False center True 1 1 30 1 2 True False False 2 2 0 7 2 2 True False center 2 Loudness Range 0 0 3 False True 3 0 0 easyeffects-4.8.7/data/ui/crystalizer_band.glade000066400000000000000000000120011424023573300217130ustar00rootroot00000000000000 -40 32 1 1 False True False center center 6 6 6 6 6 True Mute True True True 1 0 Bypass True True True 0 0 True False center True True 4 True False band 0 1 150 True True center 6 6 True vertical band_intensity True 0 False False 0 3 True True True center center 8 menu True False emblem-system-symbolic 0 0 True False intensity 0 2 easyeffects-4.8.7/data/ui/custom.css000066400000000000000000000001121424023573300174020ustar00rootroot00000000000000.drag-listboxrow-icon { background: white; border: 1px solid black; } easyeffects-4.8.7/data/ui/deesser.glade000066400000000000000000001525321424023573300200240ustar00rootroot00000000000000 10 18000 6000 1 100 -24 24 1 0.1 1 10 18000 4500 1 100 -24 24 4 0.1 1 0.1 100 1 0.1 1 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Deesser False True 1 False True 1 1 100 15 1 1 36 0.1 1 1 20 3 1 1 -60 -18 0.1 1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Calf Studio Gears False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 Listen True True True center center False True 0 True False True 18 24 True False True 6 24 True True False center F1 Gain 0 0 True False center F2 Level 1 0 True False center F2 Peak Q 2 0 True True center 10 1.0 pulseeffects-db-symbolic False number vertical f1_level 1 True if-valid 1 0 1 True True center 10 4.0 pulseeffects-db-symbolic False number vertical f2_level 1 True if-valid 4 1 1 True True center 10 1.0 number vertical f2_q 1 True if-valid 1 2 1 1 0 True False True 6 24 True True False center Laxity 0 0 True False center Threshold 1 0 True False center Ratio 2 0 True True center 10 15 number vertical laxity True if-valid 15 0 1 True True center 10 -18.0 pulseeffects-db-symbolic False number vertical threshold 1 True if-valid -18 1 1 True True center 10 3 number vertical ratio True if-valid 3 2 1 1 1 True False start True False center Makeup 0 0 True True center True vertical makeup True 1 bottom 0 1 2 0 2 True False center 6 True False end center True 10 6 True False end F1 Split 0 0 True False end F2 Peak 0 1 True True start 9 6000 0.5 pulseeffects-hz-symbolic False number f1_freq True if-valid 6000 1 0 True True start 9 4500 0.5 pulseeffects-hz-symbolic False number f2_freq True if-valid 4500 1 1 0 1 True False center 0 0 0 0 True False center True False end center True 10 6 True False end Detection 0 0 True False end Mode 0 1 True False start Wide Split 1 1 True False start RMS Peak 1 0 0 1 True False center 0 0 0 1 False True 1 True False 20 6 6 True False end 3 Input 0 0 2 True False end 3 Output 0 3 2 True False center True 1 0 True False False 0 3 3 2 0 2 True False center 3 0 5 True False False 1 3 3 4 0 2 True False center True 1 1 True False center True 1 3 True False center True 1 4 True False False center 0 3 3 2 3 2 True False False 1 3 3 4 3 2 True False center True 1 7 True False False 0 2 2 2 7 3 True False end 3 Reduction 0 7 True False end 3 Detected 0 6 True False center True 1 6 True False False 0 2 2 2 6 3 True False False 0 2 3 True False False 4 2 True False False 0 5 5 False True 2 0 0 easyeffects-4.8.7/data/ui/delay.glade000066400000000000000000000614121424023573300174640ustar00rootroot00000000000000 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Delay False True 1 False True 1 -20 20 0.1 1 -20 20 0.1 1 1000 0.01 0.1 1000 0.01 0.1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Linux Studio Plugins False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 True False 6 48 True True False center Left 0 0 True True center 10 0.00 pulseeffects-ms-symbolic False number vertical time_l 2 True if-valid 0 1 True False center Right 1 0 True True center 10 0.00 pulseeffects-ms-symbolic False number vertical time_r 2 True if-valid 1 1 False True 0 True False 20 6 6 True False end Input 0 0 2 True False end Output 0 3 2 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True False center True 2 0 True False center True 2 1 True False center True 2 3 True False center True 2 4 True True center True input_gain 1 right 1 0 2 True True center True output_gain 1 right 1 3 2 True False 5 2 True False 0 2 4 False True 1 0 0 easyeffects-4.8.7/data/ui/effects_base.glade000066400000000000000000000106061424023573300207760ustar00rootroot00000000000000 True False True vertical True False True True vertical False True 0 True False 6 True True never True True False listbox_plugins True False 0 0 True False 6 10 10 True False False 250 crossfade True True never 300 True False True False vertical applications 1 0 False True 1 easyeffects-4.8.7/data/ui/equalizer.glade000066400000000000000000001243131424023573300203670ustar00rootroot00000000000000 True False go-up-symbolic True False go-down-symbolic True False 10 True False start 6 True True False center True False True 0 True False start Equalizer False True 1 False True 0 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 1 -20 20 0.10 1 1 30 30 1 3 False True False 6 6 6 6 True 12 True False True True 250 slide-left-right True False center 6 True True 12 True False center True 12 Flat Response True True True center True 0 0 Calculate Frequencies True True True center True 0 1 0 2 True False center center 6 True 32 True False 6 True False Bands 0 0 True True 30 0.5 number nbands True if-valid 30 0 1 1 0 True False center end True True 6 True False Mode 0 0 True False IIR FIR FFT 0 1 0 0 0 1 True False center center 6 True False end Split Channels 0 0 True True start 1 0 0 0 settings_page Settings True False 6 12 True False True True 0 in True True True True 200 True True True False True True True False True True none False 0 1 Apply APO Preset True True True center 0 0 presets_page Presets 1 0 1 True False center center stack_settings_menu 0 0 -20 20 0.10 1 True False 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Linux Studio Plugins False True 1 2 0 True False 0 0 0 1 True True True True True False True False True True vertical 18 True True True center center menu True False preferences-system-symbolic False True 0 True False True center center stack False True 1 True True True never True True False True none True False True 250 slide-left-right True False True True 12 True left_channel Left True False True True 12 True right_channel Right 1 False True 2 True False 20 6 6 True False end Input 0 0 2 True False end Output 0 3 2 True False False 0 3 3 3 0 2 True False False 1 3 3 5 0 2 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True False center 4 0 5 True False center True 2 1 True False center True 2 4 True False center True 2 0 True False center True 2 3 True True center True output_gain 1 right 1 3 2 True True center True input_gain 1 right 1 0 2 True False 5 2 True False 0 2 4 False True 3 0 0 easyeffects-4.8.7/data/ui/equalizer_band.glade000066400000000000000000000430301424023573300213470ustar00rootroot00000000000000 10 24000 1 10 -35 35 0.01 1 100 4 0.01 0.10 False True False center center 6 6 6 6 24 12 True False 6 18 True True False center Type 0 0 True False Off Bell High Pass High Shelf Low Pass Low Shelf Notch Resonance All Pass 0 1 True False center Mode 1 0 True False RLC (BT) RLC (MT) BWC (BT) BWC (MT) LRX (BT) LRX (MT) APO (DR) 1 1 True False center Slope 2 0 True False x1 x2 x3 x4 2 1 0 0 True False center 6 18 True True False center Frequency 0 0 True True center 12 5 pulseeffects-hz-symbolic False number vertical band_frequency True if-valid 0 1 Reset True True True center 0 2 True False center Quality 2 0 True True center 12 number vertical band_quality 2 True if-valid 2 1 Reset True True True center 2 2 True False center True True False center Width 0 0 True False center w 0 1 1 1 0 1 True False center center 18 True Solo True True True 0 0 Mute True True True 1 0 0 2 True False center True True 4 True False band 0 1 100 True True center 8 8 True vertical band_gain True False 0 4 True True True center center 8 menu True False emblem-system-symbolic 0 0 True False Q 0 2 True False gain 0 3 easyeffects-4.8.7/data/ui/equalizer_preset_row.glade000066400000000000000000000043001424023573300226310ustar00rootroot00000000000000 True True 6 6 6 6 False False True False end center 6 6 10 True False Name end True False True 0 Apply True True True True False True end 1 easyeffects-4.8.7/data/ui/exciter.glade000066400000000000000000001106061424023573300200310ustar00rootroot00000000000000 -100 36 0.1 1 -10 10 1 1 10000 20000 16000 1 100 0.1 10 8.5 0.1 1 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Exciter False True 1 False True 1 -36 36 0.1 1 -36 36 0.1 1 2000 12000 7500 1 100 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Calf Studio Gears False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 Listen True True True center center False True 0 True False center center 6 6 500 True True center True blend 0 0 1 1 True False end 6 3rd 0 1 True False end 6 2nd 2 1 True False center Blend Harmonics 0 0 3 False True 1 True False center 6 48 True True False center Amount 0 0 True False center Harmonics 1 0 True False center Scope 2 0 True True center 10 0.0 pulseeffects-db-symbolic number vertical amount 1 True if-valid 0 1 True True center 10 8.5 number vertical harmonics 1 True if-valid 8.5 1 1 True True center 10 7500 pulseeffects-hz-symbolic False number vertical scope True if-valid 7500 2 1 True True center 10 16000 pulseeffects-hz-symbolic False number vertical ceil True if-valid 16000 3 1 Ceiling True True True center 3 0 False True 2 True False 20 True 6 6 True False end Harmonics 0 6 True False center 4 True 1 6 2 True False center True 2 0 True False center True 2 1 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False end Input 0 0 2 True True center True input_gain 1 right 1 0 2 True False end Output 0 3 2 True True center True output_gain 1 right 1 3 2 True False center True 2 3 True False center True 2 4 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True False False 0 3 3 3 6 3 True False 0 2 4 True False 5 2 True False 0 5 6 False True 3 0 0 easyeffects-4.8.7/data/ui/filter.glade000066400000000000000000001011141424023573300176450ustar00rootroot00000000000000 10 20000 2000 1 100 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Filter False True 1 False True 1 5 100 20 0.01 0.1 -36 36 0.1 1 -36 36 0.1 1 False True False 6 6 6 6 3 True Muted True True True 0 0 Disco True True True 1 0 Distant Headphones True True True 2 0 Default True True True 3 0 -3 30 -3 0.1 1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Calf Studio Gears False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 True True True center presets True False Presets False True 0 True False center 12dB/oct Lowpass 24dB/oct Lowpass 36dB/oct Lowpass 12dB/oct Highpass 24dB/oct Highpass 36dB/oct Highpass 6dB/oct Bandpass 12dB/oct Bandpass 18dB/oct Bandpass 6dB/oct Bandreject 12dB/oct Bandreject 18dB/oct Bandreject False True 1 True False center 6 48 True True False center Frequency 0 0 True True center 10 2000 pulseeffects-hz-symbolic False number vertical frequency True if-valid 2000 0 1 True False center Resonance 1 0 True True center 10 2.0 pulseeffects-db-symbolic number vertical resonance 1 True if-valid 2 1 1 True False center Inertia 2 0 True True center 10 20.00 pulseeffects-ms-symbolic number vertical inertia 2 True if-valid 20 2 1 False True 2 True False 20 6 6 True False end Input 0 0 2 True False end Output 0 3 2 True False center True 2 0 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False center True 2 1 True False center True 2 3 True False center True 2 4 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True True center True input_gain 1 right 1 0 2 True True center True output_gain 1 right 1 3 2 True False 5 2 True False 0 2 4 False True 3 0 0 easyeffects-4.8.7/data/ui/gate.glade000066400000000000000000001353171424023573300173140ustar00rootroot00000000000000 0.01 2000 20 0.01 0.1 True False go-up-symbolic True False go-down-symbolic True False 6 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Gate False True 1 False True 1 -36 36 0.1 1 18 9 0.01 0.1 36 0.1 1 -95 -24 0.1 1 1 20 2 0.01 0.1 0.01 2000 250 0.01 0.1 -60 -18 0.1 1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Calf Studio Gears False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 True False center vertical 18 True False center 100 True True False end vertical 6 True False center Detection False True 0 True False center RMS Peak False True 1 False True 0 True False vertical 6 True False center Maximum Gain Reduction False True 0 True True center 8 -24.0 0.5 pulseeffects-db-symbolic number range 1 True if-valid -24 False True 1 False True 1 True False start vertical 6 True False center Stereo Link False True 0 True False center Average Maximum False True 1 False True 2 False True 0 True False 6 24 True True False center Attack 1 0 True True center 10 20.00 pulseeffects-ms-symbolic False number vertical attack 2 True if-valid 20 1 1 True False center Release 2 0 True True center 10 250.00 pulseeffects-ms-symbolic False number vertical release 2 True if-valid 250 2 1 True False center Threshold 3 0 True True center 10 -18.0 pulseeffects-db-symbolic False number vertical threshold 1 True if-valid -18 3 1 True False center Ratio 4 0 True True center 10 2.00 number vertical ratio 2 True if-valid 2 4 1 True False center Knee 5 0 True True center 10 9.00 pulseeffects-db-symbolic False number vertical knee 2 True if-valid 9 5 1 True False center Makeup 6 0 True True center 10 0.0 pulseeffects-db-symbolic False False number vertical makeup 1 True if-valid 6 1 True False center Input Level 0 0 True True center 10 0.0 pulseeffects-db-symbolic False False number vertical input 1 True if-valid 0 1 False True 1 False True 0 True False 20 6 6 True False end 3 Input 0 0 2 True False end 3 Output 0 3 2 True False center True 1 0 True False False 0 3 3 2 0 2 True False center 3 0 5 True False False 1 3 3 4 0 2 True False center True 1 1 True False center True 1 3 True False center True 1 4 True False False 0 3 3 2 3 2 True False False 1 3 3 4 3 2 True False center True 1 6 True False False 0 2 2 2 6 3 True False end 3 Gating 0 6 True False False 4 2 True False False 0 2 3 True False False 0 5 5 False True 1 0 0 easyeffects-4.8.7/data/ui/general_settings.glade000066400000000000000000000337771424023573300217400ustar00rootroot00000000000000 1 3600 1 10 -20 19 -10 1 5 99 4 1 10 True False center 24 48 True False center center 6 6 True True end center 0 0 True False start center Start Service at Login 1 0 True True end center 0 1 True False start Process All Outputs 1 1 True False start Process All Inputs 1 2 True True end center 0 2 True True end center 0 3 True False start Use Dark Theme 1 3 0 0 True False center center 6 6 True False start Niceness Real Time None 1 0 True True start 8 -10 0.5 number adjustment_niceness -10 1 1 True True start 8 4 0.5 number adjustment_priority 4 1 2 True False end False Priority Type 0 0 True False end Niceness 0 1 True False end Priority 0 2 True False end Activity Timeout 0 3 True True start 8 4 0.5 pulseeffects-s-symbolic number adjustment_audio_activity_timeout 4 1 3 1 0 True False center True 6 True True False end Settings 0 0 Reset True True True start 1 0 0 1 True False True 6 True About True True True end center 0 0 True False start PulseEffects 1 0 1 1 easyeffects-4.8.7/data/ui/irs_row.glade000066400000000000000000000055421424023573300200540ustar00rootroot00000000000000 True False list-remove-symbolic True True end center 6 6 6 6 False False True False 6 6 6 True False Name end True False True 0 Apply True True True False True 1 True True True image_delete True False True 2 easyeffects-4.8.7/data/ui/limiter.glade000066400000000000000000001105331424023573300200320ustar00rootroot00000000000000 1 0.5 0.01 0.1 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Limiter False True 1 False True 1 -36 36 0.1 1 -24 0.1 1 0.1 10 5 0.01 0.1 -36 36 0.1 1 1 4 1 1 1 1 1000 50 0.01 0.1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Calf Studio Gears False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 True False center 80 True Automatic Smoothing Control True True True 1 0 Automatic Leveling True True True 0 0 False True 0 True False 6 24 True True False center Limit 2 0 True True center 10 0.0 pulseeffects-db-symbolic False number vertical limit 1 True if-valid 2 1 True True center 10 50.00 pulseeffects-ms-symbolic False number vertical release 2 True if-valid 50 1 1 True False center Release 1 0 True False center Lookahead 0 0 True True center 10 0.50 pulseeffects-ms-symbolic False number vertical lookahead 2 True if-valid 0.5 0 1 True False center Oversampling 3 0 True True center 10 1 number vertical oversampling True if-valid 1 3 1 True False center 6 True False center ASC 0 0 True True center 10 0.50 number vertical asc_level 2 True if-valid 0.5 0 1 4 0 2 False True 1 True False 20 6 6 True False end Input 0 0 2 True False center True 2 0 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False center True 2 1 True False False 1 3 3 5 3 2 True False end Attenuation 0 6 True False center 4 True 1 6 2 True False False 0 2 2 3 6 3 True False end Output 0 3 2 True False center True 2 4 True False center True 2 3 True False False 0 3 3 3 3 2 True True True input_gain 1 right 1 0 2 True True True output_gain 1 right 1 3 2 True False 5 2 True False 0 2 4 True False 0 5 6 False True 2 0 0 easyeffects-4.8.7/data/ui/loudness.glade000066400000000000000000000720601424023573300202230ustar00rootroot00000000000000 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Loudness Compensator False True 1 False True 1 -60 72 0.1 1 -83 7 0.1 1 True False center 6 6 18 True False True True False end center 4 True False Provided by False True 0 True False Linux Studio Plugins False True 1 2 0 Reset True True True center center right 1 0 True False vertical 0 0 0 1 True True True True True False True False center True vertical 18 True False 6 48 True True False center Input 0 0 True True center 10 0.0 pulseeffects-db-symbolic False number vertical input 1 True if-valid 0 1 True False center Output 2 0 True True center 10 0.0 pulseeffects-db-symbolic False number vertical volume 1 True if-valid 2 1 True False center True False True 0 1 True False center 6 True False center Standard 0 0 True False center Flat ISO226-2003 Fletcher-Munson Robinson-Dadson 0 1 0 0 True False center 6 True False center FFT Size 0 0 True False center 256 512 1024 2048 4096 8192 16384 0 1 0 2 1 0 2 False True 0 True False 20 6 6 True False end 3 Input 0 0 2 True False end 3 Output 0 3 2 True False center True 1 0 True False False 0 3 3 2 0 2 True False center 3 0 5 True False False 1 3 3 4 0 2 True False center True 1 1 True False center True 1 3 True False center True 1 4 True False False 0 3 3 2 3 2 True False False 1 3 3 4 3 2 True False False 0 2 3 True False False 4 2 False True 1 0 0 easyeffects-4.8.7/data/ui/maximizer.glade000066400000000000000000000674311424023573300204020ustar00rootroot00000000000000 -30 0.1 1 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Maximizer False True 1 False True 1 1 100 25 0.01 0.1 -30 0.1 1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False ZamAudio False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 True False 6 48 True True False center Threshold 0 0 True False center Ceiling 1 0 True False center Release 2 0 True True center 10 0.0 pulseeffects-db-symbolic False number vertical threshold 1 True if-valid 0 1 True True center 10 25.00 pulseeffects-ms-symbolic False number vertical release 2 True if-valid 25 2 1 True True center 10 0.0 pulseeffects-db-symbolic False number vertical ceiling 1 True if-valid 1 1 False True 0 True False 20 6 6 True False end 3 Input 0 0 2 True False end 3 Output 0 3 2 True False end 3 Gain Reduction 0 6 True False center True 1 0 True False False 0 3 3 2 0 2 True False center 3 0 5 True False False 1 3 3 4 0 2 True False center True 1 1 True False center True 1 3 True False center True 1 4 True False False 0 3 3 2 3 2 True False False 1 3 3 4 3 2 True False False 0 2 2 2 6 3 True False center True 40 1 6 True False False 0 2 3 True False False 4 2 True False False 0 5 5 False True 1 0 0 easyeffects-4.8.7/data/ui/module_info.glade000066400000000000000000000035341424023573300206670ustar00rootroot00000000000000 True True 6 6 True False False True False True 6 True False end name 0 0 True False start argument 1 0 easyeffects-4.8.7/data/ui/multiband_compressor.glade000066400000000000000000004136521424023573300226300ustar00rootroot00000000000000 0.01 2000 150 0.01 0.1 0.01 2000 150 0.01 0.1 0.01 2000 150 0.01 0.1 0.01 2000 150 0.01 0.1 10 20000 120 1 100 10 20000 1000 1 100 10 20000 6000 1 100 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Multiband Compressor False True 1 False True 1 -36 36 0.1 1 18 9 0.01 0.1 18 9 0.01 0.1 18 9 0.01 0.1 18 9 0.01 0.1 36 0.1 1 36 0.1 1 36 0.1 1 36 0.1 1 -36 36 0.1 1 1 20 2 0.01 0.1 1 20 2 0.01 0.1 1 20 2 0.01 0.1 1 20 2 0.01 0.1 0.01 2000 300 0.01 0.1 0.01 2000 300 0.01 0.1 0.01 2000 300 0.01 0.1 0.01 2000 300 0.01 0.1 -60 -12 0.1 1 -60 -12 0.1 1 -60 -12 0.1 1 -60 -12 0.1 1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Calf Studio Gears False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 True False center center 6 20 True False center center Mode 0 0 True False center center LR4 LR8 0 1 True False center center Split 1/2 1 0 True False center center Split 2/3 2 0 True False center center Split 3/4 3 0 True True 10 120 pulseeffects-hz-symbolic number freq0 True if-valid 120 1 1 True True 10 120 pulseeffects-hz-symbolic number freq1 True if-valid 120 2 1 True True 10 120 pulseeffects-hz-symbolic number freq2 True if-valid 120 3 1 False True 0 True False center True 18 True False center stack 0 0 True False True 250 slide-left-right True False True 18 True False center center 20 True Bypass True True True center 0 0 Solo True True True center 1 0 True False center RMS Peak 2 0 0 0 True False True 6 24 True True False center Attack 0 0 True True center 10 150.00 pulseeffects-ms-symbolic False number vertical attack0 2 True if-valid 150 0 1 True False center Release 1 0 True True center 10 300.00 pulseeffects-ms-symbolic False number vertical release0 2 True if-valid 300 1 1 True False center Threshold 2 0 True True center 10 -12.0 pulseeffects-db-symbolic False number vertical threshold0 1 True if-valid -12 2 1 True False center Ratio 3 0 True True center 10 2.00 number vertical ratio0 2 True if-valid 2 3 1 True False center Knee 4 0 True True center 10 9.00 pulseeffects-db-symbolic False number vertical knee0 2 True if-valid 9 4 1 True False center Makeup 5 0 True True center 10 0.0 pulseeffects-db-symbolic False False number vertical makeup0 1 True if-valid 5 1 0 1 True False 6 True False end 3 Compression 0 1 True False center 4 True 1 1 True False False 0 4 0 2 1 True False end 3 Output 0 0 True False center 4 True 1 0 True False False 0 4 0 2 0 0 2 sub_band Sub Band True False True 18 True False center center 20 True Bypass True True True center 0 0 Solo True True True center 1 0 True False center RMS Peak 2 0 0 0 True False True 6 24 True True False center Attack 0 0 True True center 10 150.00 pulseeffects-ms-symbolic False number vertical attack1 2 True if-valid 150 0 1 True False center Release 1 0 True True center 10 300.00 pulseeffects-ms-symbolic False number vertical release1 2 True if-valid 300 1 1 True False center Threshold 2 0 True True center 10 -12.0 pulseeffects-db-symbolic False number vertical threshold1 1 True if-valid -12 2 1 True False center Ratio 3 0 True True center 10 2.00 number vertical ratio1 2 True if-valid 2 3 1 True False center Knee 4 0 True True center 10 9.00 pulseeffects-db-symbolic False number vertical knee1 2 True if-valid 9 4 1 True False center Makeup 5 0 True True center 10 0.0 pulseeffects-db-symbolic False False number vertical makeup1 1 True if-valid 5 1 0 1 True False 6 True False end 3 Compression 0 1 True False center 4 True 1 1 True False False 0 4 0 2 1 True False end 3 Output 0 0 True False center 4 True 1 0 True False False 0 4 0 2 0 0 2 low_band Low Band 1 True False True 18 True False center center 20 True Bypass True True True center 0 0 Solo True True True center 1 0 True False center RMS Peak 2 0 0 0 True False True 6 24 True True False center Attack 0 0 True True center 10 150.00 pulseeffects-ms-symbolic False number vertical attack2 2 True if-valid 150 0 1 True False center Release 1 0 True True center 10 300.00 pulseeffects-ms-symbolic False number vertical release2 2 True if-valid 300 1 1 True False center Threshold 2 0 True True center 10 -12.0 pulseeffects-db-symbolic False number vertical threshold2 1 True if-valid -12 2 1 True False center Ratio 3 0 True True center 10 2.00 number vertical ratio2 2 True if-valid 2 3 1 True False center Knee 4 0 True True center 10 9.00 pulseeffects-db-symbolic False number vertical knee2 2 True if-valid 9 4 1 True False center Makeup 5 0 True True center 10 0.0 pulseeffects-db-symbolic False False number vertical makeup2 1 True if-valid 5 1 0 1 True False 6 True False end 3 Compression 0 1 True False center 4 True 1 1 True False False 0 4 2 2 1 True False end 3 Output 0 0 True False center 4 True 1 0 True False False 0 4 0 2 0 0 2 mid_band Mid Band 2 True False True 18 True False center center 20 True Bypass True True True center 0 0 Solo True True True center 1 0 True False center RMS Peak 2 0 0 0 True False True 6 24 True True False center Attack 0 0 True True center 10 150.00 pulseeffects-ms-symbolic False number vertical attack3 2 True if-valid 150 0 1 True False center Release 1 0 True True center 10 300.00 pulseeffects-ms-symbolic False number vertical release3 2 True if-valid 300 1 1 True False center Threshold 2 0 True True center 10 -12.0 pulseeffects-db-symbolic False number vertical threshold3 1 True if-valid -12 2 1 True False center Ratio 3 0 True True center 10 2.00 number vertical ratio3 2 True if-valid 2 3 1 True False center Knee 4 0 True True center 10 9.00 pulseeffects-db-symbolic False number vertical knee3 2 True if-valid 9 4 1 True False center Makeup 5 0 True True center 10 0.0 pulseeffects-db-symbolic False False number vertical makeup3 1 True if-valid 5 1 0 1 True False 6 True False end 3 Compression 0 1 True False center 4 True 1 1 True False False 0 4 0 2 1 True False end 3 Output 0 0 True False center 4 True 1 0 True False False 0 4 0 2 0 0 2 high_band High Band 3 0 1 False True 1 True False 20 6 6 True False end Input 0 0 2 True False end Output 0 3 2 True False center True 2 0 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False center True 2 1 True False center True 2 3 True False center True 2 4 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True True center True input_gain 1 right 1 0 2 True True center True output_gain 1 right 1 3 2 True False 5 2 True False 0 2 4 False True 2 0 0 easyeffects-4.8.7/data/ui/multiband_gate.glade000066400000000000000000004376501424023573300213600ustar00rootroot00000000000000 0.01 2000 150 0.01 0.1 0.01 2000 150 0.01 0.1 0.01 2000 150 0.01 0.1 0.01 2000 150 0.01 0.1 10 20000 120 1 100 10 20000 1000 1 100 10 20000 6000 1 100 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Multiband Gate False True 1 False True 1 -36 36 0.1 1 18 9 0.01 0.1 18 9 0.01 0.1 18 9 0.01 0.1 18 9 0.01 0.1 36 0.1 1 36 0.1 1 36 0.1 1 36 0.1 1 -36 36 0.1 1 -95 -24 0.1 1 -95 -24 0.1 1 -95 -24 0.1 1 -95 -24 0.1 1 1 20 2 0.01 0.1 1 20 2 0.01 0.1 1 20 2 0.01 0.1 1 20 2 0.01 0.1 0.01 2000 300 0.01 0.1 0.01 2000 300 0.01 0.1 0.01 2000 300 0.01 0.1 0.01 2000 300 0.01 0.1 -60 -12 0.1 1 -60 -12 0.1 1 -60 -12 0.1 1 -60 -12 0.1 1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Calf Studio Gears False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 True False center center 6 20 True False center center Mode 0 0 True False center center LR4 LR8 0 1 True False center center Split 1/2 1 0 True False center center Split 2/3 2 0 True False center center Split 3/4 3 0 True True 10 120 pulseeffects-hz-symbolic number freq0 True if-valid 120 1 1 True True 10 120 pulseeffects-hz-symbolic number freq1 True if-valid 120 2 1 True True 10 120 pulseeffects-hz-symbolic number freq2 True if-valid 120 3 1 False True 0 True False center True 18 True False center stack 0 0 True False True 250 slide-left-right True False True 18 True False center center 20 True Bypass True True True center 0 0 Solo True True True center 1 0 True False center RMS Peak 2 0 0 0 True False True 6 24 True True False center Attack 0 0 True True center 10 150.00 pulseeffects-ms-symbolic False number vertical attack0 2 True if-valid 150 0 1 True False center Release 1 0 True True center 10 300.00 pulseeffects-ms-symbolic False number vertical release0 2 True if-valid 300 1 1 True False center Threshold 3 0 True True center 10 -12.0 pulseeffects-db-symbolic False number vertical threshold0 1 True if-valid -12 3 1 True False center Ratio 4 0 True True center 10 2.00 number vertical ratio0 2 True if-valid 2 4 1 True False center Knee 5 0 True True center 10 9.00 pulseeffects-db-symbolic False number vertical knee0 2 True if-valid 9 5 1 True False center Makeup 6 0 True True center 10 0.0 pulseeffects-db-symbolic False False number vertical makeup0 1 True if-valid 6 1 True False center Reduction 2 0 True True center 10 0.0 pulseeffects-db-symbolic False number vertical range0 1 True if-valid 2 1 0 1 True False 6 True False end 3 Gating 0 1 True False center 4 True 1 1 True False False 0 4 0 2 1 True False end 3 Output 0 0 True False center 4 True 1 0 True False False 0 4 0 2 0 0 2 sub_band Sub Band True False True 18 True False center center 20 True Bypass True True True center 0 0 Solo True True True center 1 0 True False center RMS Peak 2 0 0 0 True False True 6 24 True True False center Attack 0 0 True True center 10 150.00 pulseeffects-ms-symbolic False number vertical attack1 2 True if-valid 150 0 1 True False center Release 1 0 True True center 10 300.00 pulseeffects-ms-symbolic False number vertical release1 2 True if-valid 300 1 1 True False center Threshold 3 0 True True center 10 -12.0 pulseeffects-db-symbolic False number vertical threshold1 1 True if-valid -12 3 1 True False center Ratio 4 0 True True center 10 2.00 number vertical ratio1 2 True if-valid 2 4 1 True False center Knee 5 0 True True center 10 9.00 pulseeffects-db-symbolic False number vertical knee1 2 True if-valid 9 5 1 True False center Makeup 6 0 True True center 10 0.0 pulseeffects-db-symbolic False False number vertical makeup1 1 True if-valid 6 1 True True center 10 -24.0 pulseeffects-db-symbolic False number vertical range1 1 True if-valid -24 2 1 True False center Reduction 2 0 0 1 True False 6 True False end 3 Gating 0 1 True False center 4 True 1 1 True False False 0 4 0 2 1 True False end 3 Output 0 0 True False center 4 True 1 0 True False False 0 4 0 2 0 0 2 low_band Low Band 1 True False True 18 True False center center 20 True Bypass True True True center 0 0 Solo True True True center 1 0 True False center RMS Peak 2 0 0 0 True False True 6 24 True True False center Attack 0 0 True True center 10 150.00 pulseeffects-ms-symbolic False number vertical attack2 2 True if-valid 150 0 1 True False center Release 1 0 True True center 10 300.00 pulseeffects-ms-symbolic False number vertical release2 2 True if-valid 300 1 1 True False center Threshold 3 0 True True center 10 -12.0 pulseeffects-db-symbolic False number vertical threshold2 1 True if-valid -12 3 1 True False center Ratio 4 0 True True center 10 2.00 number vertical ratio2 2 True if-valid 2 4 1 True False center Knee 5 0 True True center 10 9.00 pulseeffects-db-symbolic False number vertical knee2 2 True if-valid 9 5 1 True False center Makeup 6 0 True True center 10 0.0 pulseeffects-db-symbolic False False number vertical makeup2 1 True if-valid 6 1 True True center 10 -24.0 pulseeffects-db-symbolic False number vertical range2 1 True if-valid -24 2 1 True False center Reduction 2 0 0 1 True False 6 True False end 3 Gating 0 1 True False center 4 True 1 1 True False False 0 4 0 2 1 True False end 3 Output 0 0 True False center 4 True 1 0 True False False 0 4 0 2 0 0 2 mid_band Mid Band 2 True False True 18 True False center center 20 True Bypass True True True center 0 0 Solo True True True center 1 0 True False center RMS Peak 2 0 0 0 True False True 6 24 True True False center Attack 0 0 True True center 10 150.00 pulseeffects-ms-symbolic False number vertical attack3 2 True if-valid 150 0 1 True False center Release 1 0 True True center 10 300.00 pulseeffects-ms-symbolic False number vertical release3 2 True if-valid 300 1 1 True False center Threshold 3 0 True True center 10 -12.0 pulseeffects-db-symbolic False number vertical threshold3 1 True if-valid -12 3 1 True False center Ratio 4 0 True True center 10 2.00 number vertical ratio3 2 True if-valid 2 4 1 True False center Knee 5 0 True True center 10 9.00 pulseeffects-db-symbolic False number vertical knee3 2 True if-valid 9 5 1 True False center Makeup 6 0 True True center 10 0.0 pulseeffects-db-symbolic False False number vertical makeup3 1 True if-valid 6 1 True True center 10 -24.0 pulseeffects-db-symbolic False number vertical range3 1 True if-valid -24 2 1 True False center Reduction 2 0 0 1 True False 6 True False end 3 Gating 0 1 True False center 4 True 1 1 True False False 0 4 0 2 1 True False end 3 Output 0 0 True False center 4 True 1 0 True False False 0 4 0 2 0 0 2 high_band High Band 3 0 1 False True 1 True False 20 6 6 True False end Input 0 0 2 True False end Output 0 3 2 True False center True 2 0 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False center True 2 1 True False center True 2 3 True False center True 2 4 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True True center True input_gain 1 right 1 0 2 True True center True output_gain 1 right 1 3 2 True False 5 2 True False 0 2 4 False True 2 0 0 easyeffects-4.8.7/data/ui/pitch.glade000066400000000000000000000740251424023573300175010ustar00rootroot00000000000000 -100 100 1 1 3 3 1 1 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Pitch False True 1 False True 1 -20 20 0.10 1 -3 3 1 1 -20 20 0.10 1 -12 12 1 1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Rubber Band False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 True False center True 18 True False True 6 48 True True False center Cents 0 0 True True center 10 0 number vertical cents True if-valid 0 1 True False center Semitones 1 0 True True center 10 0 number vertical semitones True if-valid 1 1 True False center Octaves 2 0 True True center 10 0 number vertical octaves True if-valid 2 1 True False center Crispness 3 0 True True center 10 3 number vertical crispness True if-valid 3 3 1 0 1 Preserve Formant True True True center 0 0 False True 0 True False 20 6 6 True False end Input 0 0 2 True False end Output 0 3 2 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True False center True 2 0 True False center True 2 1 True False center True 2 3 True False center True 2 4 True True center True input_gain 1 right 1 0 2 True True center True output_gain 1 right 1 3 2 True False 5 2 True False 0 2 4 False True 1 0 0 easyeffects-4.8.7/data/ui/preset_row.glade000066400000000000000000000112501424023573300205520ustar00rootroot00000000000000 True False emblem-synchronizing-symbolic True False list-remove-symbolic True False document-save-symbolic True True end center 6 6 6 6 False False True False 6 6 6 True False 14 Name end True 0 0 Load True True True 1 0 True True True Save current settings to this preset file image_save True 2 0 True True True Remove this preset file image_delete True 4 0 True True True Automatically apply this preset whenever the currently used device is plugged in the system image_autoload True 3 0 easyeffects-4.8.7/data/ui/presets_menu.glade000066400000000000000000000274701424023573300211050ustar00rootroot00000000000000 True False list-add-symbolic True False list-add-symbolic True False document-open-symbolic True False document-open-symbolic True False 6 6 6 6 18 True False 250 slide-left-right True False 18 6 True True True Name name 2 0 True True True Create Preset image_add_output 1 0 True True True Import Presets image_import_output True 0 0 True False True True 0 in True True True 800 True True True False True True False True none False 0 1 3 page_output Output audio-speakers-symbolic True False 18 6 True True True Name name 2 0 True True True Create Preset image_add_input 1 0 True True True Import Presets image_import_input True 0 0 True False True True 0 in True True True 800 True True True False True True False True none False 0 1 3 page_input Input audio-input-microphone-symbolic 1 0 1 True False center stack 0 0 easyeffects-4.8.7/data/ui/pulse_conf_file_line.glade000066400000000000000000000035161424023573300225320ustar00rootroot00000000000000 True True 6 6 True False False True False True 6 True False end key 0 0 True False start value 1 0 easyeffects-4.8.7/data/ui/pulse_info.glade000066400000000000000000000525401424023573300205330ustar00rootroot00000000000000 True False 6 6 6 6 True True vertical 6 True False center stack False True 0 True False True True 250 slide-left-right True False center 6 12 True False end Name 0 0 True False start name 1 0 True False end Version 0 1 True False start version 1 1 True False end Default Sink 0 7 True False end Default Source 0 8 True False start sink 1 7 True False start source 1 8 True False end Protocol 0 2 True False start protocol 1 2 True False end Default Sample Format 0 3 True False start format 1 3 True False end Default Sampling Rate 0 4 True False start rate 1 4 True False end Channels 0 5 True False start channels 1 5 True False end Channel Mapping 0 6 True False start mapping 1 6 page_server Server True False True True 0 in True True True True True True True False True True True False True True none False page_modules Modules 1 True False True True 0 in True True True True True True True False True True True False True True none False page_clients Clients 2 True False 6 6 True True True True True True True False True True True False True True none False 0 1 2 True False start config file 1 0 True False end File 0 0 page_conf Configuration 3 True True True True True True True False True True True False True True none False page_resamplers Resamplers 4 False True 1 easyeffects-4.8.7/data/ui/pulse_settings.glade000066400000000000000000001010241424023573300214300ustar00rootroot00000000000000 1 10000000 1 100 1 10000000 1 100 1 10000000 1 100 1 10000000 1 100 1 10000000 1 100 1 10000000 1 100 1 10000000 1 100 1 10000000 1 100 True False center 12 True False True 250 slide-left-right True False 8 18 48 True False 6 Use Default True True True 0 0 True False True source_list 1 1 0 0 0 3 True False center True 6 6 True False center Pipeline Input 1 0 True False end Buffer 0 1 True True start 12 0.5 pulseeffects-us-symbolic False number soe_input_buffer True if-valid 1 1 True False end Latency 0 2 True True start 12 0.5 pulseeffects-us-symbolic False number soe_input_latency True if-valid 1 2 True False center 0 0 0 1 True False center True 6 6 True False center Pipeline Output 0 0 True False start Buffer 1 1 True True end 12 0.5 pulseeffects-us-symbolic False number soe_output_buffer True if-valid 0 1 True False start Latency 1 2 True True end 12 0.5 pulseeffects-us-symbolic False number soe_output_latency True if-valid 0 2 True False center 1 0 2 1 True False center start True 6 True False center Block Size 0 0 True False center 64 128 256 512 1024 2048 4096 0 1 1 1 pulse_input Input Effects audio-input-microphone-symbolic True False 8 18 48 True False 6 Use Default True True True 0 0 True False True sink_list 1 1 0 0 0 3 True False center True 6 6 True False center Pipeline Input 1 0 True False end Buffer 0 1 True False end Latency 0 2 True True start 12 0.5 pulseeffects-us-symbolic False number sie_input_buffer True if-valid 1 1 True True start 12 0.5 pulseeffects-us-symbolic False number sie_input_latency True if-valid 1 2 True False center 0 0 0 1 True False center True 6 6 True False center Pipeline Output 0 0 True False start Buffer 1 1 True False start Latency 1 2 True True end 12 0.5 pulseeffects-us-symbolic False number sie_output_buffer True if-valid 0 1 True True end 12 0.5 pulseeffects-us-symbolic False number sie_output_latency True if-valid 0 2 True False center 1 0 2 1 True False center start True 6 True False center Block Size 0 0 True False center 64 128 256 512 1024 2048 4096 0 1 1 1 pulse_output Output Effects audio-speakers-symbolic 1 0 1 True False center pulse_stack 0 0 easyeffects-4.8.7/data/ui/reverb.glade000066400000000000000000001351171424023573300176570ustar00rootroot00000000000000 -100 6 -12 0.1 1 20 20000 300 1 100 0.4 15 1.5 0.01 0.1 1 0.5 0.01 0.1 -100 6 0.1 1 2000 20000 5000 1 100 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Reverberation False True 1 False True 1 -36 36 0.1 1 -36 36 0.1 1 500 0.01 0.1 False True False center center 6 6 6 6 6 6 True Ambience True True True center 2 0 Empty Walls True True True center 1 0 Room True True True center 0 0 Large Empty Hall True True True center 3 0 Disco True True True center 0 1 Large Occupied Hall True True True center 1 1 Default True True True center 2 1 20 20000 5000 1 100 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Calf Studio Gears False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 True True True center presets True False center Presets False True 0 True False center True 18 True False True 6 24 True True True center 10 0.00 pulseeffects-ms-symbolic number vertical predelay 2 True if-valid 0 1 True False center Pre Delay 0 0 True False center Decay Time 1 0 True True center 10 1.50 pulseeffects-s-symbolic number vertical decay_time 2 True if-valid 1.5 1 1 True False center Amount 2 0 True True center 10 -12.0 pulseeffects-db-symbolic number vertical amount 1 True if-valid -12 2 1 True False center Dry 3 0 True True center 10 0.0 pulseeffects-db-symbolic number vertical dry 1 True if-valid 3 1 True False center Bass Cut 4 0 True True center 10 300 pulseeffects-hz-symbolic number vertical bass_cut True if-valid 300 4 1 True True center 10 5000 pulseeffects-hz-symbolic number vertical treble_cut True if-valid 5000 5 1 True False center Treble Cut 5 0 0 1 True False center 6 48 True True True 10 0.50 number diffusion 2 True if-valid 0.5 0 1 True False center Diffusion 0 0 True False center Room Size 1 0 True False Small Medium Large Tunnel Large/smooth Experimental 1 1 True False center High Frequency Damping 2 0 True True 10 5000 pulseeffects-hz-symbolic number hf_damp True if-valid 5000 2 1 0 0 False True 1 True False 20 6 6 True False end Input 0 0 2 True False end Output 0 3 2 True False center True 2 0 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False center True 2 1 True False center True 2 3 True False center True 2 4 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True True center True input_gain 1 right 1 0 2 True True center True output_gain 1 right 1 3 2 True False 5 2 True False 0 2 4 False True 2 0 0 easyeffects-4.8.7/data/ui/rnnoise.glade000066400000000000000000000663161424023573300200530ustar00rootroot00000000000000 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Noise Reduction False True 1 False True 1 True False document-open-symbolic -20 20 0.1 1 -20 20 0.1 1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Based on False True 0 True False RNNoise False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 True False center 6 6 6 6 18 Import Model True True True Import Model File center image_import_preset True 0 2 False True center 0 in True True True True True True True False True True True False True True none False 0 1 True False center 6 True False end Active Model False True 0 True False start Standard RNNoise Model True False True 1 0 0 False True 0 True False 20 6 6 True False end Input 0 0 2 True False end Output 0 3 2 True False False 0 3 3 3 0 2 True False center 4 0 5 True False False 1 3 3 5 0 2 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True False center True 2 3 True False center True 2 4 True True center True input_gain 1 right 1 0 2 True True center True output_gain 1 right 1 3 2 True False 5 2 True False 0 2 4 True False center True 2 1 True False center True 2 0 False True 2 0 0 1000 0.01 0.1 1000 0.01 0.1 easyeffects-4.8.7/data/ui/spectrum.glade000066400000000000000000000023051424023573300202240ustar00rootroot00000000000000 True False 100 True False GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK True 0 0 True False 0 1 easyeffects-4.8.7/data/ui/spectrum_settings.glade000066400000000000000000000525621424023573300221560ustar00rootroot00000000000000 1 1000 100 1 10 0.1 100 2 0.1 1 20 22000 22000 10 100 20 22000 20 10 100 2 1000 1 10 1 200 1 10 True False center 48 True False start center 6 6 True True end center 0 0 True False start Show Spectrum 1 0 True False start Fill 1 1 True True end center 0 1 True True end center 0 2 True False start Border 1 2 True True end center 0 3 True False start Use Custom Color 1 3 True True end center 0 4 True False start Use Gradient 1 4 0 0 True False end center 6 6 True True start 10 2 0.33000001311302185 number n_points True if-valid 2 1 0 True True start 10 100 0.33000001311302185 number height True if-valid 100 1 1 True True start 10 1.0 0.33000001311302185 number line_width 1 True if-valid 1 1 2 True True start 10 15 0.5 pulseeffects-hz-symbolic number sampling_freq True 15 1 3 True True start 10 20 0.5 pulseeffects-hz-symbolic number minimum_frequency True 20 1 4 True True start 10 22000 0.5 pulseeffects-hz-symbolic number maximum_frequency True 22000 1 5 True False end Points 0 0 True False end Height 0 1 True False end Line Width 0 2 True False end Sampling 0 3 True False end Minimum Frequency 0 4 True False end Maximum Frequency 0 5 2 0 True False True True False center center True True 6 6 True False end Spectrum Type 0 0 True False start Bars Lines 1 0 True False end Spectrum Color 0 1 True False end Gradient Color 0 2 True False end Axis Color 0 3 True True True start True 1 1 True True True start True 1 2 True True True start True 1 3 0 0 1 0 easyeffects-4.8.7/data/ui/stereo_tools.glade000066400000000000000000001734161424023573300211170ustar00rootroot00000000000000 -1 1 0.01 0.1 -1 1 0.01 0.1 -20 20 0.01 0.1 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start Stereo Tools False True 1 False True 1 -36 36 0.1 1 -36 36 0.1 1 -1 1 0.01 0.1 -36 36 0.1 1 -1 1 0.01 0.1 1 100 1 0.01 0.1 -36 36 0.1 1 -1 1 0.01 0.1 360 0.01 0.1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False Calf Studio Gears False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 True False center True 18 True False center center stack 0 0 True False True 250 slide-left-right True False center True 18 True False True 6 60 True True False center Balance 0 0 True True center 10 0.00 number vertical balance_in 2 True if-valid 0 1 True False center S/C Level 2 0 True True center 10 1.00 False number vertical sc_level 2 True if-valid 1 2 1 True False center 1 0 Softclip True True True center center 1 1 0 0 input Input True False center True 18 True False True 6 24 True True False center Side Level 0 0 True True center 10 0.0 pulseeffects-db-symbolic number vertical slev 1 True if-valid 0 1 True True center 10 0.00 number vertical sbal 2 True if-valid 1 1 True False center Side Balance 1 0 True True center 10 0.0 pulseeffects-db-symbolic number vertical mlev 1 True if-valid 2 1 True False center Middle Level 2 0 True False center Middle Panorama 3 0 True True center 10 0.00 number vertical mpan 2 True if-valid 3 1 0 1 True False center 6 True False center Mode 0 0 True False center LR > LR (Stereo Default) LR > MS (Stereo to Mid-Side) MS > LR (Mid-Side to Stereo) LR > LL (Mono Left Channel) LR > RR (Mono Right Channel) LR > L+R (Mono Sum L+R) LR > RL (Stereo Flip Channels) 0 1 0 0 stereo_matrix Stereo Matrix 1 True False center True 48 True False center center True 6 6 True True False center Left 0 0 2 Invert Phase True True True 1 1 Mute True True True 0 1 0 0 True False center center True 6 6 True Invert Phase True True True 1 1 True False center Right 0 0 2 Mute True True True 0 1 1 0 channels Channels 2 True False center True 6 24 True True False center Balance 0 0 True True center 10 0.00 number vertical balance_out 2 True if-valid 0 1 True False center Delay L/R 1 0 True True center 10 0.00 pulseeffects-ms-symbolic False number vertical delay 2 True if-valid 1 1 True False center Stereo Base 2 0 True True center 10 0.00 False number vertical stereo_base 2 True if-valid 2 1 True False center Stereo Phase 3 0 True True center 10 0.00 False number vertical stereo_phase 2 True if-valid 3 1 output Output 3 0 1 False True 0 True False 20 6 6 True False end Input 0 0 2 True False end Output 0 3 2 True False False 0 3 3 3 0 2 True False False 1 3 3 5 0 2 True False False 0 3 3 3 3 2 True False False 1 3 3 5 3 2 True False center 4 0 5 True True center True output_gain 1 right 1 3 2 True True center True input_gain 1 right 1 0 2 True False center True 2 1 True False center True 2 4 True False center True 2 3 True False center True 2 0 True False 5 2 True False 0 2 4 False True 1 0 0 easyeffects-4.8.7/data/ui/webrtc.glade000066400000000000000000001470451424023573300176630ustar00rootroot00000000000000 90 9 1 10 True False go-up-symbolic True False go-down-symbolic True False 10 True False end 6 True True True end center image1 True False True 0 True True True end center image2 True False True 1 False True end 0 True False start 6 True True False center True False True 0 True False start WebRTC False True 1 False True 1 31 3 1 1 10 30 10 1 1 True False center 6 6 18 True False True Reset True True True center center right 1 0 True False end center 4 True False Provided by False True 0 True False WebRTC False True 1 2 0 True False 0 0 0 1 True True True True True False True False center True vertical 18 True False True 18 True False True 250 slide-left-right True False center True 16 True Enable True True True center 0 0 True False 8 True 6 48 True Extended Filter True True True center 0 1 High Pass Filter True True True center 2 1 True False center Low Moderate High 1 1 True False center Suppression Level 1 0 True False center 0 0 True False center 2 0 0 1 Delay Agnostic True True True center 0 2 echo_canceller Echo Canceller True False center True 18 True Enable True True True center 0 0 True False center 6 True False center Suppression Level 0 0 True False center Low Moderate High Very High 0 1 0 1 noise_suppressor Noise Suppressor 1 True False center True 18 True Enable True True True center 0 0 True False center 6 True False center Mode 0 0 True False center Adaptive Digital Fixed Digital 0 1 0 1 gain_controller Gain Controller 2 True False center True 18 True True False 6 48 True True False center Target Level 0 0 True True center 10 3 pulseeffects-db-symbolic number vertical target_level_dbfs True if-valid 3 0 1 True False center Maximum Gain 2 0 True True center 10 9 pulseeffects-db-symbolic number vertical compression_gain_db True if-valid 9 2 1 True False center 1 0 Limiter True True True center center 1 1 0 0 compressor Compressor 3 True False center True 18 True Enable True True True center 0 0 True False 6 60 True True False center Detection Likelihood 0 0 True False center Frame Size 1 0 True False center Very Low Low Moderate High 0 1 True True center 8 10 0.5 pulseeffects-ms-symbolic number voice_detection_frame_size True if-valid 10 1 1 0 1 voice_detection Voice Detector 4 0 1 True False center stack 0 0 False True 0 True False 20 6 6 True False end 3 Input 0 0 2 True False end 3 Output 0 3 2 True False center True 1 0 True False False 0 3 3 2 0 2 True False center 3 0 5 True False False 1 3 3 4 0 2 True False center True 1 1 True False center True 1 4 True False False 0 3 3 2 3 2 True False False 1 3 3 4 3 2 True False False 0 2 4 True False False 4 2 True False center True 1 3 False True 1 0 0 easyeffects-4.8.7/debian/000077500000000000000000000000001424023573300152605ustar00rootroot00000000000000easyeffects-4.8.7/debian/build-ppa.sh000077500000000000000000000054101424023573300174740ustar00rootroot00000000000000#!/bin/bash # I use this script to build and publish deb packages in ppa:mikhailnov/pulseeffects (https://launchpad.net/~mikhailnov/+archive/ubuntu/pulseeffects) # I publish it to allow other people to use it and make it possible to maintain a new PPA easily in case I stop doing it for some reason # I think, it can also be used for maintaining packages in mainline Debian (minor modifications required) pkg_name="pulseeffects" # this allows the script to be ran both from the root of the source tree and from ./debian directory dir_start="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" if [ "$(basename "${dir_start}")" = 'debian' ]; then cd .. fi debian/rules clean dir0="$(pwd)" old_header=$(head -1 ./debian/changelog) old_format_source=$(cat ./debian/source/format) tmp_suffix="buildPPA_$(date +%s)_tmp" for i in focal groovy do old_version="$(cat ./debian/changelog | head -n 1 | awk -F "(" '{print $2}' | awk -F ")" '{print $1}')" new_version="${old_version}~${i}1" real_version="$(echo "$old_version" | cut -d'-' -f1)" sed -i -re "s/${old_version}/${new_version}/g" ./debian/changelog sed -i -re "1s/unstable/$i/" ./debian/changelog if grep -q '(git)' ./debian/source/format; then GIT=1 old_source_format="$(cat ./debian/source/format)" # TODO: Launchpad PPA does not accept in '3.0 (git)' for some reasons rm -fv ./debian/source/format git add . # dpkg-buildpackage also tries to diff current git vs tarball if it finds it in ../ while read line do # TODO: check if target file already exists mv -v "$line" "${line}.${tmp_suffix}" done < <(find ../ -maxdepth 1 -name "${pkg_name}_${real_version}.orig.tar*") fi # -I to exclude .git; -d to allow building .changes file without build dependencies installed dpkg-buildpackage -I -S -sa -d sed -i -re "1s/.*/${old_header}/" ./debian/changelog [ "$GIT" = 1 ] && git reset [ -n "$old_source_format" ] && echo "$old_source_format" > ./debian/source/format # dpkg-buildpackage also tries to diff current git vs tarball if it finds it in ../ while read line do new_name="$(echo "$line" | sed -e "s/.${tmp_suffix}$//g")" # TODO: check if target file already exists mv -v "$line" "$new_name" done < <(find ../ -maxdepth 1 -name "*.${tmp_suffix}") cd .. # change PPA names to yours, you may leave only one PPA; I upload pulseeffects to 2 different PPAs at the same time for ppa_name in ppa:mikhailnov/pulseeffects ppa:mikhailnov/utils do # example file name: pulseeffects_4.4.3-1~bionic1_source.changes if [ -f "${pkg_name}_${new_version}_source.changes" ] then dput -f "$ppa_name" "${pkg_name}_${new_version}_source.changes" else echo ".changes file ${pkg_name}_${new_version}_source.changes not found, not uploading anything!" fi done cd "$dir0" sleep 1 done debian/rules clean cd "$dir_start" easyeffects-4.8.7/debian/changelog000066400000000000000000000364061424023573300171430ustar00rootroot00000000000000pulseeffects (4.8.2-1) unstable; urgency=low * Version 4.8.2 upstream (autobuild) -- Mikhail Novosyolov Mon, 21 Sep 2020 20:09:31 +0300 pulseeffects (4.8.1-1) unstable; urgency=low * Version 4.8.1 upstream (autobuild) * Dropped Ubuntu < 20.04 because GTKMM >= 3.24 is required now * Requires lsp-plugins >= 1.1.24 * Dropped soft dependency from mda-lv2 (not needeed any more according to upstream) -- Mikhail Novosyolov Fri, 18 Sep 2020 22:09:17 +0300 pulseeffects (4.7.2-3) unstable; urgency=low * Version 4.7.2 upstream (autobuild) * Requires lsp-plugins >= 1.1.14 * BuildRequires boost >= 1.72 -- Mikhail Novosyolov Sun, 22 Mar 2020 20:03:01 +0300 pulseeffects (4.7.1-1) unstable; urgency=low * Version 4.7.1 upstream (autobuild) -- Mikhail Novosyolov Wed, 15 Jan 2020 00:01:15 +0300 pulseeffects (4.7.0-1) unstable; urgency=low * Version 4.7.0 upstream (autobuild) -- Mikhail Novosyolov Wed, 25 Dec 2019 18:12:04 +0300 pulseeffects (4.6.9-1) unstable; urgency=low * Version 4.6.9 upstream (autobuild) -- Mikhail Novosyolov Tue, 24 Dec 2019 16:12:43 +0300 pulseeffects (4.6.8-3) unstable; urgency=medium * Partial sync with Debian package (minor changes) * Added man page pulseeffects.1 (from Debian) -- Mikhail Novosyolov Fri, 18 Oct 2019 14:43:27 +0300 pulseeffects (4.6.8-2) unstable; urgency=medium * Updated Russian localization -- Mikhail Novosyolov Mon, 16 Sep 2019 18:58:11 +0300 pulseeffects (4.6.8-1) unstable; urgency=low * Version 4.6.8 upstream (autobuild) -- Mikhail Novosyolov Mon, 16 Sep 2019 18:09:56 +0300 pulseeffects (4.6.7-1) unstable; urgency=low * Version 4.6.7 upstream (autobuild) -- Mikhail Novosyolov Sun, 15 Sep 2019 00:09:47 +0300 pulseeffects (4.6.6-1) unstable; urgency=low * Version 4.6.6 upstream (autobuild) -- Mikhail Novosyolov Sun, 18 Aug 2019 01:08:11 +0300 pulseeffects (4.6.5-1) unstable; urgency=low * Version 4.6.5 upstream (autobuild) -- Mikhail Novosyolov Mon, 01 Jul 2019 20:07:54 +0300 pulseeffects (4.6.3-1) unstable; urgency=low * Version 4.6.3 upstream (autobuild) -- Mikhail Novosyolov Sun, 02 Jun 2019 20:06:09 +0300 pulseeffects (4.6.2-1) unstable; urgency=low * Version 4.6.2 upstream (autobuild) -- Mikhail Novosyolov Sat, 01 Jun 2019 11:06:55 +0300 pulseeffects (4.6.0-2-git20190519) unstable; urgency=medium * Build from git 20190519 20:30 UTC+003 to test fix of https://github.com/wwmm/pulseeffects/issues/350 in pulseaudio -- Mikhail Novosyolov Sun, 19 May 2019 20:33:11 +0300 pulseeffects (4.6.0-1) unstable; urgency=low * Version 4.6.0 upstream (autobuild) -- Mikhail Novosyolov Sun, 28 Apr 2019 22:04:13 +0300 pulseeffects (4.5.9-1) unstable; urgency=low * Version 4.5.9 upstream (autobuild) -- Mikhail Novosyolov Sun, 14 Apr 2019 01:04:39 +0300 pulseeffects (4.5.8-1-git20190326) unstable; urgency=low * Version 4.5.8 upstream * Updated Russian translation * New dependency from lsp-plugins-lv2 or lsp-plugins -- Mikhail Novosyolov Tue, 26 Mar 2019 23:13:00 +0300 pulseeffects (4.4.7-1) unstable; urgency=low * Version 4.4.7 upstream (autobuild) -- Mikhail Novosyolov Mon, 21 Jan 2019 22:01:52 +0300 pulseeffects (4.4.6-1) unstable; urgency=low * Version 4.4.6 upstream (autobuild) -- Mikhail Novosyolov Thu, 10 Jan 2019 00:01:01 +0300 pulseeffects (4.4.5-1) unstable; urgency=low * Version 4.4.5 upstream (autobuild) -- Mikhail Novosyolov Tue, 08 Jan 2019 20:01:44 +0300 pulseeffects (4.4.4-1) unstable; urgency=low * Version 4.4.4 upstream (autobuild) -- Mikhail Novosyolov Tue, 01 Jan 2019 15:01:51 +0300 pulseeffects (4.4.3-1) unstable; urgency=low * Version 4.4.3 upstream (autobuild) * Updated Russian translation -- Mikhail Novosyolov Mon, 31 Dec 2018 07:12:30 +0300 pulseeffects (4.4.1-1) unstable; urgency=low * Version 4.4.1 upstream (autobuild) -- Mikhail Novosyolov Tue, 04 Dec 2018 07:12:38 +0300 pulseeffects (4.4.0-1) unstable; urgency=low * Version 4.4.0 upstream (autobuild) -- Mikhail Novosyolov Sun, 25 Nov 2018 21:11:18 +0300 pulseeffects (4.3.9-1) unstable; urgency=low * Version 4.3.9 upstream (autobuild) -- Mikhail Novosyolov Wed, 24 Oct 2018 13:10:55 +0300 pulseeffects (4.3.8-1) unstable; urgency=low * Version 4.3.8 upstream (autobuild) -- Mikhail Novosyolov Wed, 17 Oct 2018 20:10:22 +0300 pulseeffects (4.3.7-1) unstable; urgency=low * Version 4.3.7 upstream (autobuild) -- Mikhail Novosyolov Wed, 26 Sep 2018 16:09:41 +0300 pulseeffects (4.3.5-1) unstable; urgency=low * Version 4.3.5 upstream (autobuild) -- Mikhail Novosyolov Tue, 18 Sep 2018 01:09:27 +0300 pulseeffects (4.3.4-1) unstable; urgency=low * Version 4.3.4 upstream (autobuild) -- Mikhail Novosyolov Sun, 02 Sep 2018 18:09:10 +0300 pulseeffects (4.3.3-1) unstable; urgency=low * Version 4.3.3 upstream * Translated new language strings to Russian -- Mikhail Novosyolov Fri, 31 Aug 2018 16:32:00 +0300 pulseeffects (4.3.2-2) unstable; urgency=low * Version 4.3.2 upstream * Fixed libboost-*-dev build dependencies to fix building on Debian Sid Debian Sid defaults to older libboost version 1.62, while we need >= 1.65 * dconf settings will be reset, see upstream changelog: "Settings are automatically reset after an upgrade. If you want to know the reason why take a look at the issues #327, #318 and #293 in PulseEffects github page. A few users have configuration problems after an upgrade that are only solved after resetting PulseEffects settings. In all of the cases I could not reproduce the issue they had in my computers. As in some of the cases the crash was so severe that the only way to reset was using dconf in command line I decided to implement an automatic reset after upgrades or downgrades. As almost all PulseEffects settings are saved to the presets file this shouldn't be too annoying for the users." -- Mikhail Novosyolov Thu, 30 Aug 2018 22:29:00 +0300 pulseeffects (4.3.1-2) unstable; urgency=low * Fix https://github.com/wwmm/pulseeffects/issues/324 -- Mikhail Novosyolov Wed, 29 Aug 2018 04:35:00 +0300 pulseeffects (4.3.1-1) unstable; urgency=low * version 4.3.1 upstream -- Mikhail Novosyolov Wed, 29 Aug 2018 00:59:00 +0300 pulseeffects (4.2.9-1) unstable; urgency=low * version 4.2.9 upstream -- Mikhail Novosyolov Tue, 26 Aug 2018 23:46:00 +0300 pulseeffects (4.2.8-4) unstable; urgency=low * use dh_scour May help https://github.com/wwmm/pulseeffects/issues/308 But scour seems to fail for this svg for now -- Mikhail Novosyolov Thu, 23 Aug 2018 15:29:00 +0300 pulseeffects (4.2.8-3) unstable; urgency=low * adapter plugin now is a sctrict dependency Fixes https://github.com/wwmm/pulseeffects/issues/307 -- Mikhail Novosyolov Thu, 23 Aug 2018 15:29:00 +0300 pulseeffects (4.2.8-2) unstable; urgency=low * version 4.2.8 upstream -- Mikhail Novosyolov Tue, 21 Aug 2018 20:53:00 +0300 pulseeffects (4.2.6-1) unstable; urgency=low * version 4.2.6 upstream * package adapter gstreamer plugin as gstreamer1.0-adapter-pulseeffects -- Mikhail Novosyolov Sat, 11 Aug 2018 18:35:00 +0300 pulseeffects (4.2.2-2) unstable; urgency=low * version 4.2.2 upstream * small fixes to Russian localization -- Mikhail Novosyolov Mon, 30 Jul 2018 03:31:00 +0300 pulseeffects (4.2.1-3) unstable; urgency=low * add mda-lv2 optional dependency -- Mikhail Novosyolov Sun, 29 Jul 2018 20:54:00 +0300 pulseeffects (4.2.1-1) unstable; urgency=low * update to version 4.2.1 upstream * fixed Russian localization -- Mikhail Novosyolov Sun, 29 Jul 2018 12:54:00 +0300 pulseeffects (4.2.0-1) unstable; urgency=low * update to version 4.2.0 upstream * fixed Russian localization -- Mikhail Novosyolov Wed, 25 Jul 2018 03:13:00 +0300 pulseeffects (4.1.9-6-git20180723) unstable; urgency=low * git code between v4.1.9 and v4.2 * fixes in Russian translation * Started Russian translation of help -- Mikhail Novosyolov Sat, 23 Jul 2018 15:02:00 +0300 pulseeffects (4.1.9-3) unstable; urgency=low * updated Russian translation -- Mikhail Novosyolov Wed, 18 Jul 2018 21:40:00 +0300 pulseeffects (4.1.9-1) unstable; urgency=low * update to version 4.1.9 upstream * package crystalizer gstreamer plugin as gstreamer1.0-crystalizer-pulseeffects -- Mikhail Novosyolov Wed, 18 Jul 2018 20:26:00 +0300 pulseeffects (4.1.8-1) unstable; urgency=low * update to version 4.1.8 upstream -- Mikhail Novosyolov Tue, 17 Jul 2018 11:28:00 +0300 pulseeffects (4.1.7-3) unstable; urgency=low * package gstreamer plugin peconvolver as a separate package gstreamer1.0-convolver-pulseeffects -- Mikhail Novosyolov Mon, 16 Jul 2018 02:20:00 +0300 pulseeffects (4.1.7-1) unstable; urgency=low * update to version 4.1.7 upstream -- Mikhail Novosyolov Sun, 15 Jul 2018 12:13:00 +0300 pulseeffects (4.1.6-2) unstable; urgency=low * Fixed Russian localization a bit (still requires a lot of work and fixes of regressions) -- Mikhail Novosyolov Sun, 15 Jul 2018 01:24:00 +0300 pulseeffects (4.1.6-1) unstable; urgency=low * update to version 4.1.6 upstream * add libzita-convolver-dev build dependency -- Mikhail Novosyolov Sat, 14 Jul 2018 20:56:00 +0300 pulseeffects (4.1.3-1) unstable; urgency=low * update to version 4.1.3 upstream -- Mikhail Novosyolov Sun, 08 Jul 2018 23:10:00 +0300 pulseeffects (4.1.2-2) unstable; urgency=low * update to version 4.1.2 upstream * Preparing to get this package into Debian repository * debian/compat: bump version 10 to 11 * debian/control: bump Standards-Version from 3.9.6 to 4.1.4 -- Mikhail Novosyolov Mon, 02 Jul 2018 09:10:00 +0300 pulseeffects (4.1.1-3) unstable; urgency=low * version dependency 'calf-plugins (>= 0.90.0)' to fix https://github.com/wwmm/pulseeffects/issues/227 -- Mikhail Novosyolov Fri, 29 Jun 2018 18:45:00 +0300 pulseeffects (4.1.1-2) unstable; urgency=low * update to version 4.1.1 upstream -- Mikhail Novosyolov Fri, 29 Jun 2018 18:08:00 +0300 pulseeffects (4.1.0-1) unstable; urgency=low * update to version 4.1.0 upstream -- Mikhail Novosyolov Fri, 22 Jun 2018 00:43:00 +0300 pulseeffects (4.0.8-1) unstable; urgency=low * update to version 4.0.8 upstream -- Mikhail Novosyolov Wed, 20 Jun 2018 15:55:00 +0300 pulseeffects (4.0.7-1) unstable; urgency=low * update to version 4.0.7 upstream -- Mikhail Novosyolov Mon, 18 Jun 2018 11:30:00 +0300 pulseeffects (4.0.4-3) unstable; urgency=low * update to version 4.0.4 upstream -- Mikhail Novosyolov Fri, 15 Jun 2018 12:27:00 +0300 pulseeffects (4.0.0-4) unstable; urgency=low * update to version 4.0 upstream * transition from Python to C++ * new build and runtime dependencies -- Mikhail Novosyolov Mon, 04 Jun 2018 04:40:00 +0300 pulseeffects (3.2.3-1) unstable; urgency=low * update to version 3.2.3 upstream (added gstreamer webrtcdsp plugin) -- Mikhail Novosyolov Sun, 22 Apr 2018 23:59:00 +0300 pulseeffects (3.2.1-4) unstable; urgency=low * Update Russian localization -- Mikhail Novosyolov Fri, 09 Mar 2018 01:55:00 +0300 pulseeffects (3.2.1-1) unstable; urgency=low * update to version 3.2.1 upstream -- Mikhail Novosyolov Tue, 01 Mar 2018 22:01:00 +0300 pulseeffects (3.2.0-1) unstable; urgency=low * update to version 3.2.0 upstream -- Mikhail Novosyolov Tue, 13 Feb 2018 05:12:00 +0300 pulseeffects (3.1.6-2) unstable; urgency=low * update to version 3.1.6 upstream * add zam-plugins as a new dependency -- Mikhail Novosyolov Sun, 21 Jan 2018 00:27:00 +0300 pulseeffects (3.1.3-3) unstable; urgency=low * fix dependency: calf-ladspa --> calf-plugins -- Mikhail Novosyolov Tue, 14 Dec 2017 20:02:00 +0300 pulseeffects (3.1.3-2) unstable; urgency=low * Make the package architecture-independent -- Mikhail Novosyolov Tue, 14 Dec 2017 19:51:00 +0300 pulseeffects (3.1.3) unstable; urgency=low * Level meters: conversion from decibel to linear scale uses the correct factor * Auto volume: It is working in service mode and it does not reset the limiter -- Mikhail Novosyolov Tue, 14 Dec 2017 19:43:00 +0300 pulseeffects (3.1.2-git131220170843msk) unstable; urgency=low * add gstreamer1.0-pulseaudio as a dependency -- Mikhail Novosyolov Wed, 13 Dec 2017 08:43:00 +0300 pulseeffects (3.1.2-git131220170732msk) unstable; urgency=low * version 3.1.2 + latest Git -- Mikhail Novosyolov Wed, 13 Dec 2017 07:33:00 +0300 pulseeffects (3.0.7.5) unstable; urgency=low * fix 3.0.7.4 git merging -- Mikhail Novosyolov Mon, 08 Nov 2017 22:21:00 +0300 pulseeffects (3.0.7.4) unstable; urgency=low * = v3.0.7 upstream (synced with upstream versioning, all previous v3.0.7 here were v.3.0.6+git-master from upstream) -- Mikhail Novosyolov Mon, 08 Nov 2017 22:21:00 +0300 pulseeffects (3.0.7.3) unstable; urgency=high * Additional fixes for https://github.com/wwmm/pulseeffects/issues/111 -- Mikhail Novosyolov Mon, 08 Nov 2017 22:21:00 +0300 pulseeffects (3.0.7.2) unstable; urgency=high * Fix https://github.com/wwmm/pulseeffects/issues/111 (loosing files while building the deb package) -- Mikhail Novosyolov Mon, 06 Nov 2017 22:21:00 +0300 pulseeffects (3.0.7) unstable; urgency=medium * Add Russian (ru) localisation -- Mikhail Novosyolov Mon, 06 Nov 2017 22:21:00 +0300 pulseeffects (3.0.6) unstable; urgency=medium * Package pulseeffects created -- Mikhail Novosyolov Mon, 06 Nov 2017 22:21:00 +0300 easyeffects-4.8.7/debian/changelog.tpl000066400000000000000000000003271424023573300177320ustar00rootroot00000000000000pulseeffects (%new_version%-1) unstable; urgency=low * Version %new_version% upstream (autobuild) -- Mikhail Novosyolov %day_name%, %day_month% %month_name% %year% %time% %timezone% easyeffects-4.8.7/debian/compat000077500000000000000000000000031424023573300164620ustar00rootroot0000000000000011 easyeffects-4.8.7/debian/control000066400000000000000000000063501424023573300166670ustar00rootroot00000000000000Source: pulseeffects Section: sound Priority: optional Maintainer: Mikhail Novosyolov Standards-Version: 4.1.4 Homepage: https://github.com/wwmm/pulseeffects Build-Depends: debhelper (>=11), scour, meson (>=0.40), pkg-config, libgstreamer1.0-dev (>= 1.12.5), libgstreamer-plugins-bad1.0-dev, libpulse-dev, libpango1.0-dev, libgtk-3-dev, libglibmm-2.4-dev, libgtkmm-3.0-dev (>= 3.24), libboost-filesystem-dev (>= 1.72) | libboost-filesystem1.72-dev, libboost-system-dev (>= 1.72) | libboost-system1.72-dev, libbs2b-dev, liblilv-dev, librubberband-dev, libzita-convolver-dev, libsndfile1-dev, libsamplerate0-dev, itstool, libebur128-dev, appstream-util, desktop-file-utils Package: pulseeffects Architecture: any Depends: ${misc:Depends}, ${shlibs:Depends}, pulseaudio, gstreamer1.0-plugins-bad, gstreamer1.0-plugins-good, gir1.2-gst-plugins-bad-1.0, gstreamer1.0-pulseaudio, gstreamer1.0-adapter-pulseeffects # gstreamer1.0-adapter-pulseeffects is a strict dependency, not recommended # see https://github.com/wwmm/pulseeffects/issues/307#issuecomment-415078508 Recommends: calf-plugins (>= 0.90.0), zam-plugins, rubberband-ladspa, liblilv-0-0, lsp-plugins-lv2 (>= 1.1.24) | lsp-plugins (>= 1.1.24), gstreamer1.0-convolver-pulseeffects, gstreamer1.0-crystalizer-pulseeffects, gstreamer1.0-autogain-pulseeffects Description: Sound input and output effects for PulseAudio Many sound effects for PulseAudio input and output. Package: gstreamer1.0-convolver-pulseeffects Architecture: any Multi-Arch: same Depends: ${misc:Depends}, ${shlibs:Depends} Provides: peconvolver, gstreamer1.0-convolver Replaces: pulseeffects (<< 4.1.7-3) Description: Gstreamer convolver Simple Gstreamer crystalizer plugin based on the library Zita-convolver. Package: gstreamer1.0-crystalizer-pulseeffects Architecture: any Multi-Arch: same Depends: ${misc:Depends}, ${shlibs:Depends} Provides: pecrystalizer, gstreamer1.0-crystalizer Description: Gstreamer crystalizer Simple Gstreamer plugin useful to add more dynamic range to songs that were overly compressed. Package: gstreamer1.0-autogain-pulseeffects Architecture: any Multi-Arch: same Depends: ${misc:Depends}, ${shlibs:Depends} Provides: peautogain, gstreamer1.0-autogain Description: Gstreamer crystalizer Simple Gstreamer plugin that changes audio gain to match the levels recommended by the ebur128 standard. Package: gstreamer1.0-adapter-pulseeffects Architecture: any Multi-Arch: same Depends: ${misc:Depends}, ${shlibs:Depends} Provides: peadapter, gstreamer1.0-adapter Description: Gstreamer adapter Simple plugin that gives output buffers with the desired number of samples. . It is used in PulseEffects to ensure that the number of audio samples in the buffer is a power of 2. The convolver needs this. easyeffects-4.8.7/debian/copyright000066400000000000000000000032631424023573300172170ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: pulseeffects Upstream-Contact: Wellington Wallace Source: https://github.com/wwmm/pulseeffects Files: * Copyright: 2017-2019 Wellington Wallace License: GPL-3.0+ Files: debian/* Copyright: Mikhail Novosyolov 2019 Boyuan Yang License: GPL-3.0+ Files: util/autobuild.sh Copyright: Mikhail Novosyolov License: GPL-3.0+ Files: PKGBUILD Copyright: Wellington License: GPL-3.0+ Files: data/com.github.wwmm.pulseeffects.appdata.xml.in Copyright: 2017 Patrik Nilsson License: CC0-1.0 License: GPL-3.0+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. . This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . . On Debian systems, the complete text of the GNU General Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". License: CC0-1.0 On Debian systems, the complete text of the Creative Commons Zero v1.0 Universal License can be found in "/usr/share/common-licenses/CC0-1.0". easyeffects-4.8.7/debian/gstreamer1.0-adapter-pulseeffects.install000066400000000000000000000000531424023573300251620ustar00rootroot00000000000000usr/lib/*/gstreamer-1.0/libgstpeadapter.so easyeffects-4.8.7/debian/gstreamer1.0-autogain-pulseeffects.install000066400000000000000000000000541424023573300253520ustar00rootroot00000000000000usr/lib/*/gstreamer-1.0/libgstpeautogain.so easyeffects-4.8.7/debian/gstreamer1.0-convolver-pulseeffects.install000066400000000000000000000000551424023573300255610ustar00rootroot00000000000000usr/lib/*/gstreamer-1.0/libgstpeconvolver.so easyeffects-4.8.7/debian/gstreamer1.0-crystalizer-pulseeffects.install000066400000000000000000000000571424023573300261210ustar00rootroot00000000000000usr/lib/*/gstreamer-1.0/libgstpecrystalizer.so easyeffects-4.8.7/debian/pulseeffects.1000066400000000000000000000024241424023573300200340ustar00rootroot00000000000000.\" Hey, EMACS: -*- nroff -*- .\" (C) Copyright 2019 Boyuan Yang .\" .TH pulseeffects 1 "2019-03-19" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME pulseeffects \- Audio effects for PulseAudio applications .SH SYNOPSIS .B pulseeffects .RI [ options ] ... .br This manual page documents briefly the .B pulseeffects commands. .PP \fBpulseeffects\fP is a graphical program that tweaks the audio effects system-wide or for individual PulseAudio applications. .SH OPTIONS These programs follow the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. For a complete description, invoke the program with \-\-help option. .TP .B \-h, \-\-help Show summary of options. .SH SEE ALSO The detailed documentation can be found on upstream Wiki page: .br .BR https://github.com/wwmm/pulseeffects/wiki easyeffects-4.8.7/debian/pulseeffects.install000066400000000000000000000000261424023573300213360ustar00rootroot00000000000000usr/share/* usr/bin/* easyeffects-4.8.7/debian/pulseeffects.manpages000066400000000000000000000000261424023573300214630ustar00rootroot00000000000000debian/pulseeffects.1 easyeffects-4.8.7/debian/rules000077500000000000000000000005211424023573300163360ustar00rootroot00000000000000#!/usr/bin/make -f export DH_VERBOSE=255 # Fail the build if some produced files # are not included in neither of multiple packages override_dh_missing: dh_missing --fail-missing override_dh_auto_test: echo "Auto-tests are disabled due to a very strange issue https://github.com/wwmm/pulseeffects/issues/304" %: dh $@ --with scour easyeffects-4.8.7/debian/source/000077500000000000000000000000001424023573300165605ustar00rootroot00000000000000easyeffects-4.8.7/debian/source/format000066400000000000000000000000121424023573300177640ustar00rootroot000000000000003.0 (git) easyeffects-4.8.7/debian/watch000066400000000000000000000002231424023573300163060ustar00rootroot00000000000000version=4 opts=filenamemangle=s/.+\/v?(\d\S+)\.tar\.gz/-$1\.tar\.gz/ \ https://github.com/wwmm/pulseeffects/tags .*/v?(\d\S+)\.tar\.gz easyeffects-4.8.7/help/000077500000000000000000000000001424023573300147665ustar00rootroot00000000000000easyeffects-4.8.7/help/C/000077500000000000000000000000001424023573300151505ustar00rootroot00000000000000easyeffects-4.8.7/help/C/advancedinfo.page000066400000000000000000000013601424023573300204270ustar00rootroot00000000000000 Advanced Information

PulseEffects audio processing is composed by 3 main stages. Each of them needs a specific audio format and sampling rate. This information is show in the headerbar subtitle.

Another important information is the latency introduced by the audio processing. This the the last information shown. The displayed value is in milliseconds.

easyeffects-4.8.7/help/C/autogain.page000066400000000000000000000071411424023573300176200ustar00rootroot00000000000000 Auto Gain

PulseEffects auto gain is based on the library libebur128. It changes the audio volume to a perceived loudness level that can be tweaked by the user.

<em style="strong" its:withinText="nested">Target</em>

Loudness level.

<em style="strong" its:withinText="nested">Reset</em>

Resets the auto gain history.

<em style="strong" its:withinText="nested">Detect Silence</em>

When the momentary loudness is below the relative we assume the audio material is passing through a brief moment of silence and no changes to the output gain are applied. If you do not want this behavior disable the silence detection.

<em style="strong" its:withinText="nested">Use Geometric Mean</em>

The estimated loudness is obtained from the geometric mean of the momentary, short-term and integrated loudness. When this option is disabled a weighted average is used.

<em style="strong" its:withinText="nested">Momentary</em>

Controls how much the momentary term will influence the loudness level estimation.

<em style="strong" its:withinText="nested">Short Term</em>

Controls how much the short term measure will influence the loudness level estimation.

<em style="strong" its:withinText="nested">Integrated</em>

Controls how much the integrated term will influence the loudness level estimation.

<em style="strong" its:withinText="nested">Relative</em>

Relative threshold. It is used to detect silence. Whenever the momentary term is below this threshold modifications to the output gain will be disabled.

<em style="strong" its:withinText="nested">Loudness</em>

Estimated input loudness. The difference between its value and the target loudness determines the output gain.

<em style="strong" its:withinText="nested">Range</em>

Loudness range. Indicates how large is the material dynamic range.

<em style="strong" its:withinText="nested">Gain</em>

Output gain value. The input signal will be multiplied by this correction gain to bring its loudness to the target value.

References

https://tech.ebu.ch/loudness#tab

easyeffects-4.8.7/help/C/bassenhancer.page000066400000000000000000000060671424023573300204530ustar00rootroot00000000000000 Bass Enhancer

The brain perceives the pitch of a tone not only by its fundamental frequency but also by the periodicity implied by the relationship between the higher harmonics. We may perceive the same pitch even if the fundamental frequency is missing from a tone.

PulseEffects uses the bass enhancer developed by Calf Studio.

<em style="strong" its:withinText="nested">Amount</em>

Amount of harmonics added to the original signal.

<em style="strong" its:withinText="nested">Harmonics</em>

Amount of newly created harmonics.

<em style="strong" its:withinText="nested">Scope</em>

The frequency harmonics are produced above.

<em style="strong" its:withinText="nested">Floor(button)</em>

Constrain the enhancement on the lower end.

<em style="strong" its:withinText="nested">Floor(value)</em>

The frequency no harmonics are produced below.

<em style="strong" its:withinText="nested">Blend Harmonics</em>

The "colour" (or octave) of the harmonics.

<em style="strong" its:withinText="nested">Listen</em>

Mute the original signal and listen to the harmonics exclusively.

References

https://calf-studio-gear.org/doc/Bass%20Enhancer.html

https://en.wikipedia.org/wiki/Missing_fundamental

easyeffects-4.8.7/help/C/blocklist.page000066400000000000000000000014031424023573300177720ustar00rootroot00000000000000 Applications Blocklist

In the settings menu there is an option that allows the user to apply effects to all applications without the need to switch each one on individually. But there are cases where the user wants a specific application to be excluded from the "Enable All" functionality. This can be done by using a blocklist. Just add the application name exactly as it is shown in the "Applications" entry.

easyeffects-4.8.7/help/C/calibrationmic.page000066400000000000000000000023451424023573300207720ustar00rootroot00000000000000 Microphone

If you have a microphone with reasonably flat response you can use it together with a pink noise test signal to estimate how flat is your audio setup frequency response.

<em style="strong" its:withinText="nested">Window</em>

The amount of time the microphone signal will be measured. Higher values will reduce noises.

<em style="strong" its:withinText="nested">Measure Noise</em>

Saves the last measurement to be used as background noise. Usually you would use this before turning on the pink noise.

<em style="strong" its:withinText="nested">Subtract Noise</em>

Subtract the stored background noise from the measurement.

easyeffects-4.8.7/help/C/compressor.page000066400000000000000000000260341424023573300202070ustar00rootroot00000000000000 Compressor

A compressor is used to reduce the audio signal dynamic range.

PulseEffects uses the compressor from Linux Studio Plugins.

<em style="strong" its:withinText="nested">Attack</em>

Attack determines how many milliseconds (ms) it takes your compressor to apply a full dose of compression to your audio signal once it passes the threshold. If the signal peaks above the threshold and quickly returns to below the threshold, it may never receive a full dose of compression.

<em style="strong" its:withinText="nested">Release</em>

Release determines how many milliseconds (ms) it takes your compressor to stop attenuating gain once your audio signal drops below the threshold. A fast release will cause your compressor to stop attenuating gain quickly once the signal returns below the threshold. A slow release will cause your compressor to stop attenuating gain slowly once the signal returns below the threshold.

<em style="strong" its:withinText="nested">Threshold</em>

If a signal surpass this level it will trigger the compression stage.

<em style="strong" its:withinText="nested">Ratio</em>

Set the ratio by which the signal will be reduced.

<em style="strong" its:withinText="nested">Knee</em>

Controls how smooth is the entrance in the gain reduction phase.

<em style="strong" its:withinText="nested">Makeup</em>

It amplifies your signal after processing.

<em style="strong" its:withinText="nested">Compression Mode</em>

Downward - Decreases the amplitude of the signal sections that are above the threshold.

Upwards - Increases the amplitude of the signal sections that are below the threshold.

Sidechain <em style="strong" its:withinText="nested">Listen</em>

Allows to listen the processed sidechain signal.

<em style="strong" its:withinText="nested">Type</em>

Feed-forward - The sidechain input is connected to compressor's input. More aggressive compression.

Feed-back - The sidechain input is connected to compressor's output. Vintage-style more accurate compression.

<em style="strong" its:withinText="nested">Mode</em>

Peak - Measure signal's peak.

RMS - Root mean square of the input signal.

Low-Pass - Input signal is processed by a low-pass filter.

Uniform - Input signal is processed by a uniform filter.

<em style="strong" its:withinText="nested">Source</em>

Middle - Middle part of signal is used for sidechain processing.

Side - Side part of signal is used for sidechain processing.

Left - Only left channel is used for sidechain processing.

Right - Only right channel is used for sidechain processing.

<em style="strong" its:withinText="nested">Pre-amplification</em>

Pre-amplification of the sidechain signal.

<em style="strong" its:withinText="nested">Reactivity</em>

Reactivity of the sidechain signal.

<em style="strong" its:withinText="nested">Lookahead</em>

Look-ahead time of the sidechain relative to the input signal.

Advanced <em style="strong" its:withinText="nested">Relative Release Threshold</em>

Relative to the Attack Threshold that sets up the threshold of Release Time.

<em style="strong" its:withinText="nested">Boost Threshold</em>

Related to upward compression mode only. It defines the threshold below which the constant amplification will be applied to the input signal. This prevents the compressor from applying infinite amplification to very quiet signals.

<em style="strong" its:withinText="nested">High-pass Filter Mode</em>

Sets the type of the high-pass filter applied to sidechain signal.

<em style="strong" its:withinText="nested">High-pass Frequency</em>

Sets the cut-off frequency of the high-pass filter.

<em style="strong" its:withinText="nested">Low-pass Filter Mode</em>

Sets the type of the low-pass filter applied to sidechain signal.

<em style="strong" its:withinText="nested">Low-pass Frequency</em>

Sets the cut-off frequency of the low-pass filter.

References

https://www.blackghostaudio.com/blog/the-ultimate-guide-to-compression

https://lsp-plug.in/?page=manuals&section=sc_compressor_stereo

https://en.wikipedia.org/wiki/Dynamic_range_compression

easyeffects-4.8.7/help/C/convolver.page000066400000000000000000000032511424023573300200240ustar00rootroot00000000000000 Convolver

A convolver creates a simulation of an audio environment. It is based on the mathematical convolution operation, and uses a pre-recorded audio sample of the impulse response of the space being modeled.

<em style="strong" its:withinText="nested">Import Impulse</em>

Import an impulse response file to PulseEffects configuration directory.

<em style="strong" its:withinText="nested">Stereo Width</em>

Modify the impulse response stereo image width.

<em style="strong" its:withinText="nested">Spectrum</em>

Visualize the frequency spectrum of the selected channel.

References

https://en.wikipedia.org/wiki/Convolution_reverb

easyeffects-4.8.7/help/C/crossfeed.page000066400000000000000000000041231424023573300177630ustar00rootroot00000000000000 Crossfeed

PulseEffects uses the crossfeed from GStreamer. This plugin is based on the bs2b library and can be used to improve headphone listening of stereo audio records. It does so by mixing the left and right channel in a way that simulates a stereo speaker setup while using headphones.

<em style="strong" its:withinText="nested">Cutoff</em>

Low-pass filter cutoff frequency.

<em style="strong" its:withinText="nested">Feed</em>

Amount of signal from a channel that is sent to the other.

References

https://en.wikipedia.org/wiki/Crossfeed

http://bs2b.sourceforge.net/

https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad/html/gst-plugins-bad-plugins-bs2b.html

easyeffects-4.8.7/help/C/crystalizer.page000066400000000000000000000037651424023573300203740ustar00rootroot00000000000000 Crystalizer

This plugin can be used to add a little of dynamic range to songs that were overly compressed

<em style="strong" its:withinText="nested">Aggressive Mode</em>

When this option is enabled sample amplitude dependent amplification will be applied to the signal. Take care to not saturate the next plugin in the processing chain.

<em style="strong" its:withinText="nested">Intensities</em>

The higher the value the higher is the difference in magnitude between the loudest and the quietest sounds. You can set different intensities for each frequency band.

<em style="strong" its:withinText="nested">Bypass</em>

When active the audio signal passing through this band will not be modified.

<em style="strong" its:withinText="nested">Mute</em>

Silence the band.

References

https://en.wikipedia.org/wiki/Dynamic_range

easyeffects-4.8.7/help/C/deesser.page000066400000000000000000000103321424023573300174370ustar00rootroot00000000000000 Deesser

PulseEffects uses the deesser developed by Calf Studio. A deesser is used to dynamically reduce high frequencies. The standard field of use is the reduction of "sssss" and "shhhh" in vocal tracks.

<em style="strong" its:withinText="nested">Laxity</em>

The reaction of the deesser. Higher values won't affect really short peaks.

<em style="strong" its:withinText="nested">Threshold</em>

If a signal rises above this level it will affect the gain reduction.

<em style="strong" its:withinText="nested">Ratio</em>

Set the ratio by which the signal will be reduced.

<em style="strong" its:withinText="nested">Makeup</em>

It amplifies your signal after processing.

<em style="strong" its:withinText="nested">F1 Split</em>

The split frequency. All signals above this frequency will affect the gain reduction (and in split mode they are affected by the reduction too).

<em style="strong" its:withinText="nested">F1 Gain</em>

It shifts the volume of the higher band. In wideband mode it affects the sidechain. In split mode it also affects the processed high frequencies.

<em style="strong" its:withinText="nested">F2 Peak</em>

Center frequency of the bell filter. It allows a more precise selection of the sidechain signal.

<em style="strong" its:withinText="nested">F2 Level</em>

Increase or decrease the frequencies around the center bell frequency.

<em style="strong" its:withinText="nested">F2 Peak Q</em>

Set the quality of the bell. Higher values will affect a narrower frequency range. Lower values will affect a wider band.

<em style="strong" its:withinText="nested">Detection</em>

Choose if the deesser should take the signal peak for detection or the RMS value (it is smoother).

<em style="strong" its:withinText="nested">Mode</em>

Select your operation mode between wideband or split

References

https://en.wikipedia.org/wiki/De-essing

https://calf-studio-gear.org/doc/Deesser.html

easyeffects-4.8.7/help/C/delay.page000066400000000000000000000030721424023573300171060ustar00rootroot00000000000000 Delay

This plugin allows to add short delay to each individual channel of the stereo channel

<em style="strong" its:withinText="nested">Left</em>

Left channel delay.

<em style="strong" its:withinText="nested">Right</em>

Right channel delay.

References

http://lsp-plug.in/?page=manuals&section=comp_delay_x2_stereo

https://en.wikipedia.org/wiki/Delay_(audio_effect)

easyeffects-4.8.7/help/C/effectsorder.page000066400000000000000000000011101424023573300204520ustar00rootroot00000000000000 Changing Effects Order

You can change the plugins order in the effects chain. Just click on the up and down arrows next to the plugin name. The first plugin from top to bottom is the first to receive the audio signal.

easyeffects-4.8.7/help/C/enableapp.page000066400000000000000000000012241424023573300177340ustar00rootroot00000000000000 Enable or Disable an Application

You can choose which applications have effects applied through the switch next to its name. If you always want to apply effects to all applications take a look at Enable All Applications.

easyeffects-4.8.7/help/C/equalizer.page000066400000000000000000000262311424023573300200130ustar00rootroot00000000000000 Equalizer

PulseEffects uses the parametric equalizer from Linux Studio Plugins. You can choose between 1 and 30 bands. You also can change the center frequency and the width of each band as needed. There are a few presets but at this moment all of them have only 10 bands. Presets with other number of bands may be added in the future.

Main Menu <em style="strong" its:withinText="nested">Mode</em>

IIR - Infinite Impulse Response filters, nonlinear minimal phase. In most cases does not add noticeable latency to output signal.

FIR - Finite Impulse Response filters with linear phase, finite approximation of equalizer's impulse response. Adds noticeable latency to output signal.

FFT - Fast Fourier Transform approximation of the frequency chart, linear phase. Adds noticeable latency to output signal.

<em style="strong" its:withinText="nested">Bands</em>

The number of equalizer bands.

<em style="strong" its:withinText="nested">Split Channels</em>

When this option is enabled it is possible to apply different equalizations to the left and the right channel.

<em style="strong" its:withinText="nested">Flat Response</em>

This function sets each band gain to 0.

<em style="strong" its:withinText="nested">Calculate Frequencies</em>

This function can be used to calculate the center frequencies and bandwidth of a graphic equalizer with the current number of selected bands. Useful when the user does not want the default number of 30 bands but has no idea about which frequencies and bandwidth he/she should choose.

<em style="strong" its:withinText="nested">Reset Equalizer</em>

Reset the equalizer to its default settings.

Band Menu <em style="strong" its:withinText="nested">Type</em>

Off - Filter is not working (turned off).

Bell - Bell filter with smooth peak/recess.

High-pass - High-pass filter with rejection of low frequencies.

High-shelf - Shelving filter with adjustment of high frequency range.

Low-pass - Low-pass filter with rejection of high frequencies.

Low-shelf - Shelving filter with adjustment of low frequencies.

Notch - Notch filter with full rejection of selected frequency.

Resonance - Resonance filter wih sharp peak/recess.

<em style="strong" its:withinText="nested">Mode</em>

RLC - Very smooth filters based on similar cascades of RLC contours.

BWC - Butterworth-Chebyshev-type-1 based filters. Does not affect Resonance and Notch filters.

LRX - Linkwitz-Riley based filters. Does not affect Resonance and Notch filters.

APO - Digital biquad filters derived from canonic analog biquad prototypes digitalized through Bilinear transform. These are textbook filters which are implemented as in the Equalizer APO software.

(BT) - Bilinear Z-transform is used for pole/zero mapping.

(MT) - Matched Z-transform is used for pole/zero mapping.

(DR) - Direct design is used to serve the digital filter coefficients directly in the digital domain without performing transforms.

<em style="strong" its:withinText="nested">Slope</em>

The slope of the filter characteristics.

<em style="strong" its:withinText="nested">Solo</em>

Makes this band the only one active.

<em style="strong" its:withinText="nested">Mute</em>

Mutes the band.

<em style="strong" its:withinText="nested">Frequency</em>

Band center frequency.

<em style="strong" its:withinText="nested">Width</em>

Bandwidth. Calculated as width = frequency / quality.

<em style="strong" its:withinText="nested">Quality</em>

Quality factor.

References

http://lsp-plug.in/?page=manuals&section=para_equalizer_x32_lr

https://en.wikipedia.org/wiki/Equalization_(audio)

https://en.wikipedia.org/wiki/Q_factor

https://howtoeq.wordpress.com/2010/10/07/q-factor-and-bandwidth-in-eq-what-it-all-means/

easyeffects-4.8.7/help/C/exciter.page000066400000000000000000000055501424023573300174560ustar00rootroot00000000000000 Exciter

An exciter is used to enhance a signal by dynamic equalization, phase manipulation, harmonic synthesis of high frequency signals, and through the addition of subtle harmonic distortion.

PulseEffects uses the exciter developed by Calf Studio.

<em style="strong" its:withinText="nested">Amount</em>

Amount of harmonics added to the original signal.

<em style="strong" its:withinText="nested">Harmonics</em>

Amount of newly created harmonics.

<em style="strong" its:withinText="nested">Scope</em>

The frequency harmonics are produced above.

<em style="strong" its:withinText="nested">Ceiling(button)</em>

Constrain the excitement on the upper end.

<em style="strong" its:withinText="nested">Ceiling(value)</em>

The frequency no harmonics are produced above.

<em style="strong" its:withinText="nested">Blend Harmonics</em>

The "colour" (or octave) of the harmonics.

<em style="strong" its:withinText="nested">Listen</em>

Mute the original signal and listen to the harmonics exclusively.

References

https://calf-studio-gear.org/doc/Exciter.html

https://en.wikipedia.org/wiki/Exciter_(effect)

easyeffects-4.8.7/help/C/figures/000077500000000000000000000000001424023573300166145ustar00rootroot00000000000000easyeffects-4.8.7/help/C/figures/advancedinfo.png000066400000000000000000000121531424023573300217450ustar00rootroot00000000000000PNG  IHDR+*sBIT|dtEXtSoftwaregnome-screenshot>IDATxwXTg{G,("$&>)͖{gdwݒM5ٍ11X--h3iA'1<>yw{Ι#tfAAp靮  mDrAUAL$WAAp0\ADrA r9}"NYxp/]w|k=_mKB됺y92r)SFSz9py!T ٥tmzXH oU,8 BCy"Y/54}/0FI->):u+"1 ^uuC#%[+=4gCjg3USW7ɫA3%v>fv;8-TJUm#E: ÿJ,˜,maF$WAeFvD$^TV^xeJ{UԠQcU5VV hDgU|V]UK*jL;X^ΟkV#lH|(b;p 衩 z m'0$ DȄ*_>PkhXb%_+~|z~}tq$s@~$?͚'b8eT#goLڍS\o~{/aCmϠ]ʴ|^*=+?Z8t_S㱄Mȑ(Kz<}:{~Jn CbyHe4wjt盖g/H)a00.3׎:΃Y?><㹅dD*+AFjjA3Tj' q|q=X7lĕ|}ll]yj4BAi9c颇V5ņz0 %'{.F]2?^k3-\մkh\Ȥ1Uՙjڵx5y>e[ lo o"OGlMr1$xMcL"G~uw$V';mӖ-\iiÃs\j3oK-Lx[>ZDfM,y̒xoMt&k ACK2ҢI2j9_]B,Ï ض}3yyK-cFXMf'){xSw2;vo ߐ]jFfhej&g>/_6k}V^gnbS~cZ6mBYLoljۛysqvrw&ь`פ%\dFOo^QC}HJMCRVi?$eғ|˩o#)>3ޞHHBakCʡ 2S I`i44X~n5~I$$R &"߀(Z[EĩTȘ2!V-ݝAJ"7}8َyg}xx{Zڴ~|q_x aU;ʼ9ګ%>~ʊRL4jrOxx 'k, eM{uؽoqRI 4g7A{=QXMsxyPVQIo0R3էeJ0{Œ` ce˳T #`8fePYEߝ]ݤfv?g? N=GGK-Y]`4"Ju(Dl-ywY-'[AЃ꾠")*/kNb6t_H<ťE4F=3Q1оmݑ5=%i'̵A4PT.ZmZ.Nw^:;[Q|rcƔ)y[ ;1.ڗpᒖ[cղ-4d|^e37eblٹ[ٍ`F[n-ήejе[C{X~"{#(%^2:wI˶3z ?[ we%g,Jq3P8Z܎:rvt|,'b۟wwN`1`&)*/[[ldJ6CiIs #rbZpP ,&P߬Ky[,0\6(+l6c6Ihjn" 7Ẁeu`qafOɍ=Ktǧ1 }]s[7-g9'玛w//4bGH ӗnm+/.ѥk&%98QM``>_f4^M+fCS 8pᲖ%,7Q GYi%i{3&7P=o 2.#8]{]E=$[,ߪ3PY^ܙv#Zn "y30' DFKص g4HxhR79iDD}Νll+twGEr=[[˖zndVxpB/#coQ)퍵$'7CE\*GgHKKGPY) *$2 iи{0#s2/fT˷hu`v'GbΞ*%X=رSV̛cǍX ?IPjh׵ۡ$ws'p*|4*\}NrB=d&KLd%Jp8D(QC]=f>ٺvEͻ9~Cg|txFgpkՒZlqo{;vD²ŋZ"0)#đ#9~vK*/O!7]c-K,De{3 1a$Ąq{./P=ޡ\?GգR\D*C&?⌉^ V_Wq _ =]^{Ƈԁ_o32 ѡkE99[wk`PCퟑ9-_sn2v9YcK[]y{zm4ޅg2Iٴc; AD'-"։yd2ƶzۯh}KK Ir)(,D&5ߑF`T@SqsquƤO 7#Dxָc\>xE`&eLNsK3` I̘ S{Ң5o# d*/(2^\njbM,\g3Jt:]o[^D9:0T?",;GMOp4NdžMYrz{lbY熅7wU*ɛ;7q6hk w7?4Mobpvrb<|d6׳8sA}gPADrA|s  GM.VIENDB`easyeffects-4.8.7/help/C/figures/blocklist.png000066400000000000000000000305571424023573300213220ustar00rootroot00000000000000PNG  IHDRsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxTe'.+( "(رZW- 6lX]Y^D@{ ^HHv?H 5\33.BX8.77cVl'sR~M q }uޥgG S'vJFm{(\kGT3H9ƬW#B>s{p;_pkO~Lzѐ}0f~b> _ۛVx&fCJxi'ʽG~(瞔L;3Ne1-c҄o5#mS0c;X.%Ӑ:'uhWW-y;1^f2cٺ!:~CEP3UYy'F^A߾~#f[Hf:`)`7LE6mw,9~U꽡DV$~~>Lte䫭]|~0a.Js+?3ĔK恗 eg;5{e^&\s 9%|l?X֚,$Ɨ׳'>zmUMWsc3NfKHCɽ[PsAΟ3O΅sv;РFz:veф]rϐgF²IsZC_~A Νږܻxw, 6m>O$Gj\ԕӟY@,i])zs_ρHPwS5MO匧y${.$oO j⊛ߗr.nVy˻.GL0qh{L3Qώ"?Ak ]o~°ƯӾ⥾b7;  s@F쳗Xtu%\݇̓mrs71g:Qwˣq_ɗ>^n}6~yc8q;ٖFwoa\P JiBٸ;^j6!.]dGzZ!bo=̈n Px1g "370\Ms.₽0B gyNw׶bw&B+kx掵0yAJV@FR2I. o˔~|1e1=iڵm"=2S QF|Soyݼۖ̚'ǯ!b1 %>ͺ[KyϬ1 C{.o@wt8B>dƅF}g6-y[pۇmd==&D>E_K\!W]&&? p+(1yW:y}yxֲ՝cUvA>i{/ʸ,#>Aǖ^g|0 =BlbZzWx5{2 OGpp(>ncmM"DD6ZHKV=xФY]WDgzMK\}'װc5_h\I*9t/&OXl{hs}}\[+ߢ 6VK'rN5 O:#xR@'^㑮 d/Ӳxޚ,V b?'ކՆ y_c;xն=4e}w8PBq|_2WD0“0ss57'o>ҵ'Acz6s?Uc_εSL7E/:fO|Ds )oF4oP8H[bbIY~m.v Yu(+6!* (2)MiWVFDs ,2v8'xntkFzehzD{emGBX09:{~xSddd`?c9xyW*vrHHH 19Ԍ,,ró Slշ/˫=mɦ \pY,CMhƟb;_ؐ&)pxOl~DT]HFdz *ɒ6*6knL-iZ/?OEIO-^lb-?\&#Zy 29s <0Ǒp NӦ7;$kTf˲hErY_v6+E\]ӣ /<t/$"cX1֔Y]N≮3$&&;TfٓCMײp"Vl%L{[0 +ՅK3|G |hҦ| 7f5=14yoCEpoBl_2Y A롽p3CP{kwgOՊaNppH5Lו@/n`Yp w%/*}azPx/yle-S94o%Z6ԡ?ۼLջ!5e.iә&N=iR65E-̙ o[k.` Cڇ\tuSO/u0sXg"73}^7w9?3Z6:Pwϝ3t1|{ZRʅs1;3tCcvᚓ횺e0KdkZ_x"+celIr=o+5۪؁oNȌ?6_WvA22[|jӉ .Z:K z{R-Zɦ#Vkis6M Bp47bYx>g.f$lAh2氎 NCǟXcmÕmBw洮t`Dʎ Yp!,dct##;xr#kFDemgѬ#N=i[\RDEսK`JJJ,dӦh֬9иQJ)B\w7W[Zfs"ZlS?>xbرZ9IB:zT'z6R2OxUqyPW[ ͱNn|yßSOyG xV'+o{H.RCL3܉lfLdrאc8}xV|CX rP] \LڽwWkڿ!#37ߞȱխˋxZD(EjrU)--Wiiņ9G xg zDb"U<=>L*u<=$?J+f}|H6wKHL<㩩T8 E@yS#aW8|hZ6絗_wL=wswwb^l6cS00yyFDC=w*Pvz8|(ڵcƍwlߎ#qG鐞 zڧ+"]~{)w킏7ݻu٧38`KKz"U<=` 4mҌ0004pUR穽y񤜵QiԠ/=CD.%깋T0|32ֹ3=(}>>.YRRR ut)")))QE*nc˖b%IDAT>|bbZ8dP"((h R)EDD.#""d"""NF.""d"""NF.""dtTjyY1kN;W!mp+;599DI$UѥH-CB>E;ԧ~: ;)))ͅm{^ZHIرc;^^ބ;s mK;wesBZBn혷zmpOKKG v1}h׮=WTK6wR\(V |#vr((ۻUj6OO/,zRayZE[DDΦp 3P$ w0C."R(ܥ”""5]*L=wE.lYRa""5s 3*p;0o"M8.ޙ|<K]1LCDRaq˿+4 1Aʚy"<RqvHlM, JDPKW84?fKY=CTXyV.X|?_lE*;V\o3+bnyכ𺕬~ln~7@Wد{g5im*n2+8 i҅nMӧ/$iR~[L3^hl_"rQRa;ǭL{_S.q?.X4r-DZߙ6ǏFuq[7S -u 7Jìi Bxx? A&\ɼi?` WG)E!V;UuuP|6ge}hzulEzi֮'7ip,x[ߩuÉnӟ~` WQdMrM?xbY"ҥq8AAa4r}}gRe9es +O^v[8L=k< tmƞCq'D&vkc,`*y~~~pԌN NR`!aSnWXODjTXeĦfDžރ{毿=)SГKPA+d*!M xy; !͵"MD*M*u~6hjG ؚ}=я\e1Kis"*{z""@.fE*sţɵ Idݖ 5-@b*I[]a=t'Ye׆-թD"iTatֲJx4; Nd%?}: i׽ T|j-sYb6"Ňz7BĚS.Q=OhLW֐LMbAHd ΣS..Cjܥ ~$ w0{]DDNQKՌDDT]DfQKUdoy| w0P'"R(ܥ´Z^DfQKl5cr="Y,6Ã<=K0C}&=/DJJ R}X*t ً sONɎq\).??-[6RBo9sW$'z/Qxky,%%Tuvq<"pt)RK(EDDVˋ8Q8q"셅xgIt "? .:]]Dڡ>k߻JŎpXGFyݢ W}V'a=lE7UZ0{f wqbTK|ζJ?aYIvc1*vduoƭX˙?)x#or=/pڗ42Z-/&_w1Y hJ:A= nb37Wxշ>S. Xesٟ;G?S>bi1!]h 錱{'쎮2 w46a㽇ngw-$!k/_=ZӴEg7u_7|0hCLt\eݭor?=g|/n+-ۀ1L\f~Q{ТI :O?oO rRXŋ1cӴmnxCV' =(q=t{bgBxsk8i-_k:4M=8L9tSKMpJdgOO1y\~כߏgYt3~9_tBgÌ]ېa/{޽|ڝ&~W8T92RiT*fWi 9;'@ {WZH<?t]ѝ6(]̏\Ϙy <2{  $Ν.E U |NpUV{8'Fy&?y i&ը%)E}~vB~p5o*uy氛%;K>yl^t2xlR n/ }\h9 -;kx]SUE*SK2ȅQu"aD7G y,+2?g nH㲼\/`rȲ|Dj6Tdq&\Lx{ub$C0\nBAނM$<ڭ1 7_?ǿcCCOOpo_s}c1wg?0|`>sf8`b]_ЛHu3%%%'hl#s|rK,,|51;>GS 5ck((AjsFDJY0"OIQ"Yd@MюVKp5ҙ iQ]jmsY <b٬mRs6 wqz.]DzR(EĩQ.SE,Gh*:C8aiicjel6" 7+rz"?qg99~A% 4{jq2Z-/""d"""NF.""d"""NF.""d"""NF.""d"""NF.""d"""NF.""d"""NF.""dW !IENDB`easyeffects-4.8.7/help/C/figures/effectsorder.png000066400000000000000000000061631424023573300220030ustar00rootroot00000000000000PNG  IHDR-RsBIT|dtEXtSoftwaregnome-screenshot> IDATx}TTe0 &/jb bi{|9e%&X笝6Kl #q-/S*nZJjK̽wAA`ƻ9gq w3^MY5AvAP/ A}7+ATHT tȾ](TTc0T#˲Mj8;1Fژ4S 7)//GQdG訳i ?wwww$*ת٦}ω$$kH,K6[$EA"ЫݏV1)&QABb5$˩`E=1!j*:Y)& ^MM弉b tHTBb괂8ˢE`ܸ 1c+9-Ⳋw>yr5j26AZAl$$h/sr>cǎGz<@YSǎZNgO[MA]EisCGX`mGMD 3$(<$WFѿ_?Ν16 0??syyxx j7'4iUAQV\s_"##޾x$I"1>Y5peVdYo_g26ny衇:m))[.]"L0I0Y>̛7Mo0v8' lAF?S:ya ]CAaz qqqzS+uuu|Gɍ78|+@Yyy1ַ_.-dgK˿w_ҿyuMMMMTWW=K 2} ב.sF舢(deep n;g hyoe8kYla `ٷs_j2#IKK8t(}>CP[[ñcSMNN6wDwV?.^#IF_9L0zm!4"##eEQX*;v#11õVѱ)*.a7RkW5I}{%cQLAI7~~ټic⩧bϞؿ9ua|8Z07"FvOdY`0puqPSCYyE۸݊oQ^QA`` "p%*sDEEP__t<JMM#-- <έ$&&bgwjj]MaQCI_EH_̒e&xbWhMBno;]ZrX#ӧ]j(`Do緬??5Y0g\]1lׯ_g{f&3 }.MHp0~~=qƍ|%x?Yt:RRoIU}bl߾3g-UWk퍇`=pZ;-J]=Ƭ~qM*[m^=V+Ah3f i6vy;0q"^^F6fdPzٳC5YYl`3 D$֦t/sygݺ4mۆK\zvC}|\n#ڵ6]viGѐĂ fVXr0i~2(m 2OwV3KLSkwu8ox7ZXHmm/^`֭tڸFa޼jaO 砖,]+Sh4MΦͷ.Z@MM ȲL]]F fp_-| (:m* lhS19sRh4^&I#))ɡgկɖ (l~gsEٶ)i uߒdd]J2>zy}DXy Yq0{~={ػgOcxJjZ:?ޜϽ9ȿOXB\\\WW7F~  L0{{{&| yO#GpttӸnqtES?3bbb2e2Q4lƍ ݝJ 1==ݯpoLIƍn%T$ITTXebؔRPd];s4x"];wRp 8Axv`4ȓɓ&W_91ۼ2y2gΞ…1mt"""WM|I^{5>***G`֦$} ijjL䊷=%*6[ ƍ8}4aCݧ`8nO+l记4&Yj4h&O ѣ &}]Z!u|ÆYv}\#Si*>9rł\Pozbͼxg?~\Ou'Qhz,AtN(gJ,([PSL= *t6QSLRBDM1!jDM1!jj)& ^K"IFY75& ^յEEE<@˶rz#e"Ym1!Z>Hee'O~cV~&Z I<@b .DC"AСچ_0IENDB`easyeffects-4.8.7/help/C/figures/enableapp.png000066400000000000000000000442321424023573300212560ustar00rootroot00000000000000PNG  IHDR> sBIT|dtEXtSoftwaregnome-screenshot> IDATxw|Eϕ\z K(I R)JQAXPAQA*`ԟ(TEQUZ=$$q H%~P23;79UllB!%Ҷ ڸNB!x@hϯ"B!sNB!xpHp)B!lBQIp)B!lHK!Ba3\ !BR!B،B!f$B!6-!wJ61?9zF@QTxzxax;9$B 85agT)Tɽ4OR۽sOcy㋕<:}Xy'G<$BQ:~Z%@B9>nvwr#3& wRJ\ !p3Ұwr-dX͐Fe/E)JQ<]>H?Ip)BX溟*?\ !B1̥m z\:/! UVXgEE|I !$(SIq8OAFOS$ 4j%JT0) &)'JԨ@QV0s>S@&J.GBXHp)T|yTi2s#<)dƲ< {ʗjbt5q?ȵ#-;C|w_j4jM^=PݹٵK2fy$E#CL?Sxh$y{M|9u2=\Gm0=h;[q 5y(4=a9C^O'¨}we9R˙4Ԟhk8y!Vg8Q֒]o/]؍F>vi23La4.d1t zLF}%/5FlMh2a}^BKQf F#EҢR6 tևC5C*b~~4r?cH<ڴ [?4dFu[6玱cg"-B+N%E݋oMD MK`Y?3ڭ]*Un?ʸYMGP>c[?Go_>3g K`$f!+&3~yά\ɮo!:#mtoZĹéUKhhƣ㺺Ũ'!C&>2d8ؙPss_S' ä#0dӪ2P+$%$e(Q"w`iN/'[[[Oqس2#kY#<+m6Ѱk8ev|2- .ѨM_X ٗS2|8֦ݠь}cG^ɢ9r)L; B8iV˹rcپl=5 ;~>Ǵ1ٰ~3^$:.,{j43OѻNACseOW^+5ZRvnja+/䂂*x$˧gciӿ{Ma哛֪ sZEe֏`Թ-eQ, nt\<ͥwQj τ$e=\>O2θYIcxځ]<'~LM4bTu;9`-?\'S+تB(ZNNGfnk )G/ C=wFtЪtxVwl$SY΋ZFmFʹ[R\ a!S2|`Ry`LcgmRvGi<^k+7X<Kۮ:1)ıidtkY&\9O&Srj:&}& QGYtVGSJ>c`jeqa!9]>^wT=D lUtٰaǣRVp 61/#35&L#xNo_?ʽ6-t5 gWܛ@Ni|rE{G_]1S ]4hXv#Rv凈ͷ*R=Ŭ'5$!]}7 (P, +@#xA4j$qբg&ߠՀ>* {rsTIBɩdOcVӥ3:5ڜRe#DiR lx4ڜAdۂd,l m}I`(KPBfop=WʕeHNiKb&wx#Mlj,[?oWj$FV,O*j /?a淳x1D,[fs%OMG2oj/~VKU'â׳npꪀu$yl;}o=Ĕ>hܓ?vʚIܑzWzOvҝ |K _w~X|Yh n/RO~9G>#'2=yY;ϑayro'sx*j֨ŋJ YR"Zq%Ko&=LF|%OZg%\4+֎K48h(}G"()idTmѽ&;W !1%HR fϾd&ж!X{FQvXX+j;sUK6hU8kESKIB%"(0]9sf+9H"qVBJy[-IHTu0D?. 7 ߼q9Rҧ35s.m P8k/)(D% ]kZY>y4'?MiV))Vxέ[Fjw2(TꅷZ诲|}vjԹW{5xn3aJI!9*974w hsəqj?&bɟЬCQ:d̥(}Lb"ϑ:(/'t,TjqID^8G`4AUvmmea5YF SOc*g7|Λ s'XkMN+dd%dD~ޚ5jFE{nq7$,on21TrBSI4*%`0:ŶOy9ӡf[Jos)J92Cޱ;GgL*uh9"_jBVUEָl8A&p(͊t[8f*Z<;:NtJ6f@P/ _ԂVq]+Ҭ&;在տJ_,2غL]Ud$s#UCVܤk$È'5pp F 0]eR]͕ǹSY Z.|3,et/,x0/_ɤ$@Csz,ڹJho .zj gC,4:2dna_9oFB<69t~s_Kx9A4/JSv|9gjxFڛZލwCsvי9qR'oދW 19x:jOǜM oic%^`9c/mpJ4Nׂ?-|6;7ر㔍ki)i菋; 0c#y > 2u|M&p'se[ f0f6؊Vh4S?(cqQz"8h${=킧wUZEA}Zn` P'Gi\]iʁy^C,8,~scR,rܬ]5m;o.ގ' yT>! Znl<`M[`W?9yl= 1;v3Eﹱͽ}`~=lr7;!qv~ۗHLk+xG>]xd< aܨnw&1vLE3 ejg+SעaOfLQlk*Dq ڌv*O0dou&2qk< *{CkI=|j٢\ܔ#=Wvds ܨR5}>E.9>ʰ?U\f9Mf.zaNM_X ٗS2|8֦ݠь}޳cafvHt\"YhNgwW/@^}tw:< *;\S]Yo\r$sMY޽EsRY|4`NsyC^Y>G2-H\f]ݳ[CrƻruG5䂂*x$˧͉L9I#LEBRBjwwiJaz\K9Ti 9L:ZƐŃ2|y3ycpgql24vjd'G@BQ9hR~ q·Jet7p&fwW FsqJ7@ef,h[?2v~pv]Ծ LH֬)\y-<Kۮ::[OK;-&C"e**3::֔-qlmRʑC5sŴw? rOjvc#^z]h~ [Y1+lyɘ`7ӅvCayW[[1)tI׫V=sY{ p¯T&b~qh)[* G3 nnJK_/νiTԙXxW;Nֳ͐N5pfV56e|[~6+:ag ,[<{RxeMSѬ>3sCsGN Fv凨0i 6 Hx#M,{5kb$zՇnٜ*̱kxuNî#tlOz,cGGGޜ=6) F1~.jyڂn}\2Gb~PQk4f B`s$eO{Lpg7ۯre)g{ïx k7r sYSy%Ù<ԕ5? #D IDAT_;Ө6E[תsTE_|6&~0Gs,ƁFp߫^[笘UtF}5' _\}# [ %f5/<ֿ5ބ;qGjZAo#gMg>z˴esfwҹ0M@-t_TS-EO{%b)~tR/٘#^?S 6>ǯ?2x(h Ekt\^h* m$AaP&,;! Q< C Y ˯cc7P.굢Z$ABR"X{ұ(2Rɲ'N*܈OY }4Z?yuǼ%,ȣNṯ,NMzn\$^Q}m@2۝M=U۵NO|e`=ֳ3#'Ů2GxV9u(^[ߧ[QYq۫WLqK=gˢ׻ JLz f0%qntmNR~i: m"8 DPY R5q m[m讽z{ID J{˗Z̟O'E'O+mz1[UEFn /[EfIII@RWf_Lm%ښbbW\]n=e^zBܟQ3;1s]Ƭ haw\ hXc?ezOe(Jٟ^=?Ѻ{d&1|4*+ gQֵ?sMo?ǹd|˛/`T|7)}kkQsV*}B"i`AHL$1g{g qҞ3ضÄ1*@]@k+ ױ_$|̮ʭ6G $Pr6Fo;ƞU;tP%S.kTi5) ;)WJ}t.oB`3Hg׺MDf)β#(.J,L,}:e̻W'H!2J%`Ckj!9o".feBSODL[ # gsz)gi׽/c1)d'{)W]KEqS9uljٟ73'Oݣ^[V>ј́0TNn^ńQGJrdY剷%L;sH@*{KZp\1yM]@;V̙T!#9gYUa'*iԉik2h!kOs5%=tr;'*\+)@XQelt 1hFP>]X8aکq+sUۻ}kĝ$gC5PkBM⥭=OV 46)<5*ݟ&qF>Ud$s#UCV\Vpkcwe׈>׷/Ц()K(z+S'oFe/ԉ-S]6eOv BUL%Ox*]n^P]+yb2/Syx'|q=Bŕ2z/~kD^3ӀTc?e kYVxCBƱK2*[#z-,op<{}EX:=1O;s^os$|{R3ƄXRiܼh1kʦɝc]iJ񇙣^'θdEW2u_}k^qeOu'(W߼K GP'wYM[ƽS8~7oGL2Lg5Q)&GB5,4xwiTX=Y`g…>`O&Fʘd]V6<߳LC_X8]RbR;K:†z,D^kuI0߱/L!jAuIVQ}ͻiMd(mSɳ2Mn _=?=w#z). pJubǦ`Zm,4jÕx/|?Oפ:Oд>\z[֥'.e[I?7P\PoE:^MQԮCkag6)j3^`Ψ04^ ϴJ6c!*]I65X9gb7GkX푴aI5WfktK|V6U@*j x/9E.3jq0ll?ˤ5Ll&Ă[9x1ZtgسKukSlX-#2.{ ~Tz,J?`p,;OK5m2f7>gKr*>l ϶EM?<{ʏvQ%:|uZg7DW&DqauڝQqrg嫕;9Ԝ_x^̟n`vBHr1g_/=w44;U\~zҸ=(No(¿gLd][auvKyObj݃qqz}kQ^='fo zU8oq lJ^aV=z04=Oک0ÿqNI L{ꀽݭ)fL&=i Tw1v!S3p]b# ?q>b'.zIz!TlWgƾjuWGS: Ί2i75$s|>ۤ~h ޶J$2 PlNt\=?^aVI;d4k=Kߤz,J&u^`;vck0|'~9AmK{}"~eal{,/NL9{ZTֵkys=g5[  hH<'/h'MTreք7iIƂ+Ro(¾V#&*n[Q L/$$&Zm [ɯ]&4,FX: 2pw;W^ᛷ:ᣁ}{痓l*{P\ gd=N:QSQCB\u";9w/~>gH ,XLZGoiY\] #WIGnq[0IA@Njt[Cct{+N{T6]T.8߾P(UU,3?KѨ@<ۋ`"M,{cbwLKF%pI0Ӧ1YKp5X=Cm\أi4`_67#,g^jcÛ9m[oԁ໮=77>u7͉X_օ UO;::|k0ݛ.g7P%k-rwKq-=8>,3Õ8 6h=rSBI;57o1qG|\bcQ2ځǛSԮ$"g4R[rfՇPnO-LNl?60Q,I'_GAa]f\GT׍Y%|}:7Gw2hUjV ?7 'Y\ U(KʸmMVDPmE}lʩ&MI6 \}p؋K71dhѬ?DEx~:#gbUcżt־gBY,Y; ?:Lߌv>kؾj0hRvt^+ jBa?KG tw ̏XwoϤ(xT q!FT5q X ~J@Q:=su⓷U|tcc)ؕSx<xa3"YExʗr > Νu XyC S'Tvr#y?|t#>}6^O厲R!*Rpi01}$`2PXB!){FX:܎-B! W䩈ԦB!bs)B!_1z.K#B!&˗/qeHKKE䄻ժU'(Mg0䱸B!DfݸѸq*UǧF.\8ŋ8z0͚ 00\$B!bIDATeDGGѭ#T^шl&;;J+M6E\eÆ$''ҨQNՊ(6ӫIFB!8ׯRj YYY7KXfwgQggƳmgCXBZlCDU)@ a(閨zJmUEzRsכfiC'llc= 1'4:={/}|'''}ܹ3ܽyyby?Hx.'' /qݿ y뢶[qShb18w{ևnp?rc ]#+ۇ'tR:sw_sn:ps:f.EDDdA:}7?q{vlUuvQ{O¾z x-lZnQ'UcFf.oܸ/^5}}7m6*N Ư+W.tiEEI"\.wz6'J\mLfyf񈅶4]cά\쪥fW-MfW-'Ofb1v۶n\Sf.EDDdɲeD&/PZZN{{]w~55sipLAXRp=~EHAG4zı6>w dIs>sYQ%P@nNNf.?F`d8%ʗ7ePT䜾22L><aB/FbƤ9S{TWVr%WTlvVΪ_DDDd*Ǐ M^^^Yb 244wn|xa|1aƤY_-^_wz-œ;+9؄bfǓ;qZ\DDD./@`ƻ::(.$߀QD;N|2J׵.™Ÿ]&kLpuucq^Kx>[sD?~9Z"K,f """ mLᲭ`0=pukp>.q+gqr䚮1'4SgZ^'?٤344S{{F """8N}1Οo"++V 0twwHee5N۴Uc38v)L+MڊjH邞H$j^^A֭cۖ͌&ۊ0 JJJիRTTLzz'x0  hj:]S2HVVn{ Y,ɲ{\ofz)_-D~ݗ܇' M dŊU44|ĪU/$#Ez4xp8B(4~F֮} 1(9Q"ەGDDDAʕkʦKaalvb8H==>F"?nߴKs\ar(--';{ zV+Ng:99x<n֓23""""oyyydggS\& N&hZIKpgxg)\10p8{ɘ.EDDD$1s)""""&pF4b{Ţly[DDDDT\4Knn-JUO .qEDDDļeqq}}=46!veex<3SSDDDDBRbRUGDDDDbn@DDDDK5 """"2k.EDDDd(\ȬQYp)""""FRDDDDf+W_IENDB`easyeffects-4.8.7/help/C/figures/saturated.png000066400000000000000000000050611424023573300213200ustar00rootroot00000000000000PNG  IHDR*@sBIT|dtEXtSoftwaregnome-screenshot> IDATx{Tep rwPXYJhbfyɼen1ݳ&^2-MSj5{v-5W̸) #w$rUF~_|g3aP9N'Bԭ]$"PB.BEH!!"PB.BEH!!"PB..CEI ILLB1.-,%%0L&ɭ]piAfJF#X,fsk%"npcADGb,`W³_69tڕ(0Lp8n&!n#=xgMI7.vMC [K|)Mwƾn~o $%%DUUZ[I0'?e@CL\y2ŦFKw\CXEo!VoAZ7#FWu{}UVVEDDzq@dd$\|-^^~|19#?!x1ۜh:Ptq1\g[?b0N{f1DŵˉVH^ݛ7Nj-qoO[wǬ#k!c"ؿN432mPbu %44P#k&`o>ŨӢ; պ=}xLA녮@}zk#56%55HvOOOh۶-F4 q[Η<3r8|lE*Omf`:uFIeeķךZ8,~Oaqܣ_pYΞ=˙o^g{9<{1cبrsk! Ď\qk9?Vdħ)pd/ {W`2 ߛL&JJJ())EqZ-X=yu2ᑕN70^U"Kc&qrN{|%}n{ksw4ogyI|Z.SYsr(Gx﮷s j~?ye8]jodm||'3ң;^w3<1*0>?[Qӗ$py:۾ni$3^ UZۢR#,f42Hϳ*Irr2h4LJΰaî~h'99C_/__qQA;z%Ƴ~L[0θc馩};d;\b;dkܚ>5k9^hfɗIU(sƳ-1&V;:OͪJHpCT{C| < 1@ENnzt7MR>KyosZ| =zTұ܂p__S8\rrrP9>o޼r9rrrܹ냈VǪX0ΔkO(sP&ε?rC۱f;R^=8y'NDaEe̵* jc\T;UT{#}YȭB~%8=sIE5AYΓSTkyyK} ~nbfDFF6hׯ GFFjm&n7j_֣g:Mor$AaT ;Zg@g1_k(+TQxa&׬P;p[u91o৘4Hpp𕯐(zAή_ѫ4|=UKtVVjo-b1?_sld%gR\X@;}#t쿛qY&׊= d]v5}o.q}]ۚv)i6k,f͚V% fA(I9|w+te;㹅?#]}K&;Vl"+,g K.벧1=':K/Gg߻ʗ?"2mTͅƸG1^ Ue`>K^=& 3Άbt+x^ӯĔM۩3Ɖa4?_Ho] 8*tEXtCreation Timesb 09 Feb 2019 13:23:49 -02  IDATxw|UlM z/"!׎A7,>$@@HO6f?RHRcfgwf̝;JB4MC4,D5"8$EЪ N?7zEQP|]ƙ/)R(}iVkٙ^#uwx'Mߟ+9O4){d/B@ΌN6!v_hf0w<2 L!% vJv4QۡU)EQuzڊhd6IHB]g>k3=k.Y*b! 8OZA>VLExEPZ\ZL6_vgC]+' ߦo@f2sL fN$@p4-QMbGo<ÅuBKO.]\],k@@{4t m=$NBHnwclҥ;qd>u,(lח0ˢ rLha\R:Gi3ZXw#SDuFs2,o^?N4(&}qva{>q=NkAp=B4*^W! \{]Wq!FQ]  7MKCoj?rcJX^~51 doxIJ廸Cm#(" ցf{~&_7G79EVy~_r0{Ima4N ~:mIL,oL˙.]NՅL0Т'gar^~l #{G!-6 xEߝFaq>+~>*ZnCQAi#Mחӭ[ !BŠy2|zVov'lޗ͇F 䱛Rd_ޔ<)VwiYrR^˪`]Cʉ]Q?8玏(Oy\6[8Ta!c'kq)a8}&oS Q{ -لvxnI4#Vܢ8M?vukOC] Gդ׸ݹM_YtL!ADX^_S ;ڭ)iOIýiҼ;9`&/mB~ro寫 T=́3X4*)AM#>@=p ֬[ גM_ǽ&V2ʻG]o·oUԎs*2tt҈ lto_ 7'w7Oͨ_t7fCHdSYoAa*~B[Bh\x#{]0GмL lm<~+^s'aTBQүVXsuyP~N' 5t ؟Ηtb߸[q-TUo/w_SCєoҦuK ~y'陙L=vRʑ{~)բiN2SiѶCmTcى_zϧ.ogq&l󆅄ģлgw F#vk,S Gvf""2èSTU媛rҾyu#izqt/=(Il|&<$;Goۃȉ]ǟI#smq<k{ӛ79_uzxsֻ.%L1]~k&t:W,+2ej'2|5zqWE!. ""+9+,C&!žu/Ýw]!,`/0h\; >[wy(~ _<[h9:(z}4uOžݝ4{,OWrü)Knv;fh e>sAALtȾx9z,ӧ;x87]-꘦ScDYNe{3g`^λoI,yOY2:q\!Vw S ~ϓ7éBXq#Az҅xb}h٫/]Q %t0^E~`ʨN "õ/-|?p?ڷc5tv)/< ﹯|܃ZӅUSC5UӞѧwFFwޟq= \_Dpq+q'ng2w4^ڹ<c=f0ϛ Ҥ1KHqL q<;U^z ܒ4 fl6KV`!)d:-ojWE?;oEKYp&fv3@g/:wN}zqX3 w.|vp?E<vK$!n/BGHVOdX3h0{LWdggײgd-]0rxzzPgNjՅ<\+:KeLhr݋2ߞ`ZvɨM<,k\N$[5àqKP [F;fǻ|:<ͦa Zň(;nfCA]l/M[Y@)٪XȴI]o{t Dc  #"|}j"EW2a guZBy^㲮8m$wPAYtj(8J^ҶU낿D}oYx(܏FzaztׇbױS;>eģcǞlP.ѓoɥ&W~%w^C=׏^^BovسJ9d!n!Ȍ*vKVZ}j)0K:E8rq2*ɥxj6"SjZW\=ļ<5Ju4qBՇE1:ޗ_˪[˜ۈw$.s8~d 2.u1Zjgƴݵ5qdЁJ0Rؾ?v:lx{0OO̾羍8t4#}JtWd4]{k7m&5 &v!("̸S26ϽNiPf&ҰS<ٳ4k ~mLKǢ9n&?2 ΤصcGGzVfOς/۸cG`PϮ:C;J8tR0\4zq2)ū+ƢͥDgզՔ6^ 7l;P۝,^/o/ڵlBVQՑ{ALN<ʶvF0o4KKcԀ>(F/\[ܭ_J/e/K; U\hp0C^ăKlY_Ay]M.ԅaǑY_+]M06F-)_'2ٲ}3c @U2xZd>CǚM+RkʟGk$;ܱ{}ESqi)yzUdhSKOaٖ pڈnޮHiYNURgҲNKY~8h⃗CR oT"}q' 1Y)m*z:(~޷+&8~*UViPhԬ-;j)BI8i E[!"" Pi޴CVR[ʲX(pw5yQ.*7kCj\ՇEu1\`X=c7kmMO#(lppՈ!dg7rPMRꢴ8 oF ӁPbVNf\JpPFIxɟN?ͧs(Zw[ofE\OPxrKC33Yy'Dӽg \2c1dfټ}i)u:ӢeR-*)9ܷ ko/-4mNhML'>·?/(61jߕm:M҆f ׇ[ob6 p(FbUx+rWv6g2oRv+~>^ؒf'-`fɺmv ѳo/+K*VRUGъdM1x-b涣?ɩit,wӝ׆zx{t7X}*Igr,-~T8xyAo 62"ܻS6Zi|L3Oo /[΄qcɱA)i@TR o_@|[]t:HOM%1Cr{t:HOSmׅ+qf`2l>Nac2 NjKZ V/`>I8N99VZԴ4B|Zn4p`XZZ./El`@QuJX,XTw(M&<|D4 vrr|%2vԈOTU?|!qK6t:NN+5պ88k$iB\4>oM>t( &"])D]>̊ϭgىH] W.1㙖BT-np󾚪)Dm&!EMz9Α|?-BQ Gck;!B:OAo*-dffs-v(sB!ւ_G&MԾ $MB!R~ԸYKI\0IB N`4J$.$MB!J)$NBI$m0I\IB|8ʒI!Dj”O'Q4 !7a'8_4 !*0IIBK0IԯQ4vn|}sgVB>8 N s=r%+JNC,Y$M ` M@P0>LftH !=n#3=X,9<8q6n\d>=uN`OӠa#"`DQZ_!f(`ۇL&3!=3]v̧^}{I!@|4vtÇ %0$B![@F  !",/ZK#p?o:6v?˝oIh &CbA֍n_w>_̤Wvu5VǠi=)#-dgeɇ?l[H?ic/0@}'Nj9*w,0YF<ʂFSxoBpt/|rvşՃ(v& yoCQ|KFtNt]Y8i?Ӻzsbei|1E@mWJl^F8sVm;/` IDAT}q(3prR^-,iHjb_^50夑x0&a;C8%z?wNKS8s[0i520z {h"lj*tx鎃ă'|Üz3zׁXӁC4 Gs MtNgV=NA4oŘ{dlSOb~V&$c1ѼHoO ~ FϙlW|/?z]be9s<5\]ri۫mQqBT-I\" '5"ڄ 39B a~f@.[nzTN幧TYGqxpT-|;g.3=0ʀ|0mNo:XOb_@};>5XkN/qW;&5}S=:MϣwM b7?˛q=CKbxɱ_ϣ|>4ёM&8ΐNXw%=?g~n]ןy_CMA_.%n֧o&Zzt:H=ttz'ww`;o?p<$oqJOoe΃ TEbVwY(݉Hc ;~WiAAhDNv7' /x2w}[WO{0)ʓ[~䭏cr|vc}&M]zP8lL34]Q[QSx}5/sY\VW9X>N%IS"3,|k<7 ,#=ֹpGY$"#rnwFn;'w1X Lsk]G9G7q]RpwOVX\\=7^083`՗.ͨHAs:PS.i"JVt17vpAtu)|7w+GP5x.q3n(={v?C&0q M2QO 9~Me^y),ІՖ7ة+O?M쓣X\iAKcOBjs!↑Nˌc-2D^+vJ_91۱-/08gf}'(]fZghz߲Ԑƭ{1Į\|AP?>iOӻ?#t#[H=Țz~'gt-'VM+9SV<8IX ]UWN!'EӧW8ٛ&, ^Q^멮<)Ȍg^o>}WʂepJ3Zmq} E ;ioT GUhYګm Q$ir4#k^ӆ.7 xp&ڞ ³V (?>ù沑 !,a~ iDc_y1լwh xxŘ7t=dtTCT䶣Mu-!EV[C-Σ[{RV,ɭꅙ<غO$z7Hb?eE͆6ymw`^=΀ 3z= v \=\?Z6viLvkTAQĜy8[QM nMNeX2cP\3>[дA >IhOsbH! /-%BY^|Ӻa&+.')3t(غTnVrj)ᅏ$=[ʼ\eW{ybL'33L-9UaњQd`y~8U<2.=\u~ӺܿufC#hzf|x]]C+Cf<=p`Ͷ3uyPqڭجA嵿lDaW{B<(Mt hN;6٠צz?< {{t&Q8l9U?/|< وo۱٬8 ~vFWVeb˄fbsXf.^mDm9Z`0(l\2iO͝8lV6W%tb,Cnb/kGNY*vKVˣ2.6HwiuZ3(Bf \N{6.OuJv N{b#,̅xpX-8-"t2i]֥&׷JZq[/;͑CVzJlSKs`-w+8!iB!p4z.p,q4֡ԥ6$MB\/adcBIDSO.=;U\hQ=;p1M}tBQi~UO7ޝeR9 qo^/L< 'wJܪ)(8&;BQ 4U%9 AJp/oo9982(W! NI߳Oo_<|rFLf =-ԳgdgHTQeTUEUU&;PjwPic7FOdt3n0&M~v 'MNUU܅#?EQJgiDU=56v.tw2i'gtrB:&8,[4z"O{O`+rI7wc0IDQEzO񃬴6v_$'I.b&mE}#:B!\ IB! $iB!p$MB!.I!4 !B@&!BH$BIB!\ IB! $iB!p$MB!.I!4 !B@&!BH$BIB!\ IB! $iB!p$MB!.I!4 !B@&!BH$BIB!\ IB! $iB!p$MB!.I!4 !B@&!BH$BIB!\ IB! $iB!yU4 !BTD+IB!+$iiZm!j;!QD)oEQ !K&Q/ڟ7kNp 96r6 / Ё( 暞LQnI}4I/OIN僧wf F%-h4𲑓Hz>m> } !$1Bb9%q8>$NBcZ穯dPxxt3^qʠzH]"_\7=q:UpY@_־>Yʙ-~kChB&w玛y(|l&b~s^RbM<ڵ TVkU+gr -l񤩪U]}?i!-JæU|erm$Ze`b՟3{Y"w}$OϹn8:}u|=w`r*UyL(YVU]n?IgF5 ߼i&Ť)߾Dč_„B2;k?O={WO'd!͵\z1| ŔU]}|w">~UPRIaJKëɠ0GĤA0G7aэnLK[a{"[߽2XDŽeU>EL $㧇(bgx#gh4Vo4RcnY|tWÒ.}eLP:Xbk]ij%,MfL溞)nfn68ĸA8>9æa޲9x,`w}_O%Ssw7||7O?hlhY)}'ro܅ѓ֮Jv+of /Ǿc_O<Ć7Hd680o'᝹+/,6tp=Op >PTVv}W_η)9GCWů$Ë?׳7!]Keކ6|BD},:_97o=B&˹ʑc#:NP_J{aw8 KoS &#gyk% [U>Yo\ z6E3/](wԡb*=ȂM9k}yADWysW{/!m7t(.B-2[yI2 DŽO޻snm%~''f+C5{*ar{ewJ)W#&O~œ0ןzӏz$#+X~z }z<o9Z.PXyV^}Wٿ_w2Gƒ[`|yKt?2TF8!uR>'R)d'[.[xԣyo يR 96CJo^&beC[ Yŏ@lwoRVe@^Ɋ \;cJV)1ge!=\*ys665n% dy=qO<ѷ\m -_e_y=|Ѓ??? e7Mq/_`k^!xewuG⋗i{/LSνYZtϜ@INY>>x.0Ʊ"1Skil|1(-=)._ ?I{H;!ΝJvҵpުD%5W_Oݧ7?^ΡҵsueP y<&v+Fy ȱ37򏝱%L6z<ҤUOFl7: IDATV7+V#*ҚˇE$]s5!,Y7:])A%֕lbA8 Qg^wK=ЧE8g>_+nf|4<9^rVv[G?f+ Ax~ek9^͢9# үg 5Yo668ŦL0a6N'N8`$~՘4) &̤YW5I ~P<̕} 6߬bEՌ=U~C݅V\<̜qO:7MX3ɰCDDiv;Y_r3g'ZGg֗9U&6ߖn%8s|+jfڏRhdLdJv1Zoš8kpu+h4I֭&.8ulՒUm͞l=Ju=4 E=ʾuJ磇2nNd FDžr)S-۶ף9-cuY?4ٷ0'xncyg,ù##1ƮHJE=qoۺai ט܉oU CVKUKxJW bp`~IQU尒F5;'TVAN3qp[K_ A>:n/SW}.\7K^eO<}rM=1 ^ߊ/1mK~+7_~1J.B;y(!?;סmؗì o犦QQdCI)lx Z=+]׌CZVEkp㭻/XreZXCY佈 swиٿp.ԺА%`ڵ ]D!=75 IH3b֛?HPRD`p4[Һ1|;S+ MBeӵYOaӲM[K~:+ OBVY+IFǙ\Nx;23-:9z^% rOHfCj6h*W&ʳI9% Ng܃3]yݹŋļM"4 J̱<_{<|P55u/<ഒmaxu $Ȭ#Ȼpl ؼ?dzq5&nꇷٌZIIh罭ͤjj`~I2D ҙ:3zAHh^lF+ m"0 4>šӨB]&t%Yq8X,Vl6+. pZZF7`0KRq%A/+>* NvUZʮW:($и$EJV.qʯuAM&A(rI$AK&AjR-v_(&B nWDX4 MM UUy9dRP/“РU* }1"85U"4 6Ł)-<9Y4kJ` <*$3=gm"85E"4 B%+ia&/'(2V&5"If?|9zp/z^%˄C2t)%NR̴TFr:p9u]%A1EQp98vBZD*&J4 Ṟ螄+69ewwk[0nutl u%YεѼU2v,L[/bk2ӯk-T5TÓZy),Ŭ-Z7TKI]~zf8?f9 3?ӱNŢ("4 BR{I2J8@XW]),[#޺ Z{:pl R{Ž8&'ta1,~gL㗲x|+ Ew>[սtUU#߸v RU٘dxjPK~7_\+t[{5㧿Ә64< kۉf9fۖkuB⥁,B? ތxج1X+wGjɰmO{^8%̾ޟQ牎9Q2[xh?!6ۖSv_^X:^T {61gsl ɲ Yvᒝ8DtR媗x)w*y}Y.ZWK=&# cڋMt]ю&tڒfUܞ1o";>d;. ׎Cw\Gֲx6KG߲{bR8r~xGtg#`=c3dGDZr)ٸ5FAڰtvNNoKjo|>t,/$9:cqpsW3wosü, yfw q"pQQ,!:㻶uz%]ՃCiyUݮV;>޵T@A`l*N6UB|iDwJG[ɲ~X k}L&i'|X~/y7]|9[ߴCw<tn"G8AD[Н\]ܢu#>g.ΔI2q]dc߁hҺԣW6|4o0/ptFΚ˴R~[g3`9LDļ̤~/38`D&yP~8{ /{i2 ?[Ρyj4dE@K/y^'bfOMMn3>{7*rOȆޕ*ĥ0mwּy0,u'kz/^F= _jhki',г}o*)[d[f4RŖ˙߳d]6?y3 (mgo23V⿟Ezg #%}~X'+xx~(שbYW*e*7n<#ox0#/”d1T~Dl'y{.oTLn5 MJiHD]vt S ëjsxx5F>e #?k=0|){ꓬ]ͅuنnnV9˰osKKnZ8w̧;'3;^Q@().2%XΦOV՝Á* 5n6xePڀll~ѽNּNdsU\v򳪺]k[7({^^ w12٩;} /Wp)8I/H`bd+Ȳ:# |e?JZyDfKVŃ_t'OK[7.>SǍS5Q(8$TG&y7޳PߜȨzo#"/vXk2qA{BqҧۅSeKIJhNG9B.AnR=s J5d þbpK/nT]~Yy\i[̲1$LzC2 ΝZJf"g-t LPz*eqN5(ە0trF˙T mUJ:jiҧy#r۔ﱫ6ȁ|V}ǎHL9Om>EhKԗ[V=liW(uo/ǷŐQMډCͲ`~9n}YS]w;pl2f]a~ѣg$?.cَ$> nmvztrK%?xgJ 1԰l"]VeH`0b9Z7 hMա }CX9Қq Վ107`D?25Y*K"OCh~L7r~(@݂Im!K/+k4;mywywT\ӻ'b>75 =S\ I"X[/3yb^=eOl9gsUQ #:yϗxg 6x]ì/rK(/NAoEΘ%ɺ./a`_#y٩/^HhxX4M70U4nIL4 |&b kkxby4>˔C!x8O>ٍJ)tzv5SgwbDC)y/e_{1OmzKCu]m?Eދ0|6aʃwsEӨ(L!Ĥ6< oLnFu}5c␖&T<$AZGOL`-H*=F=Xu4z:-* aA1kQ@qp:drz<%RE2ǜ㦅B{ӵ?j$4 $4^j@̱<_{sq4zcA֠Y\P@yCL%a] 2.3%F6Oc,t ]6E`*"F1IhPFؽd&kc٩Js$ىl/TVGEA*:W4*~:Ũ~ft&Sa1Ywţ 'L&A&V^>J,p8XlV\..WjZ^o`ЗKM`*IJїH~^.&/s]WKRX7}I$IT*t:R8h馲JYǏ&$$4",J@pPGDh"CO_oNy6uag~'YK>rdetfxxĩ&J˅'qO`uZn,4 B}AiuzZD"+3"$48Q٠TvM IDATݢPv;Z!Vtu5:"B`Y:3#(t!+2J*ZZARml²h^Ϸ8guƮ^&Tx|J{n=fCXV5ظ5.ۑ-KGÖ|`MnN6f-Z?a[ke$qv\dyIm_'8~*+RFNe7b.G6~϶Z_{7hW_H8}ӧBVBd$(,qʌv[#u]7w;MtH!!>q,R($% Zʶ6jZk` /;e7$>C 3]̈hq֠# W8N{׎D]Ő =_Ds S MeI-6-X[ڃ[;>uu]zAQsn(r ZP@mVo /ϚI׃8o0_ͭw^G`C9lObmގ(R[ӡęq$ 4R|CbnO]ˇчH7F@҆kG;\rᣙx o|{3r\5kZ>Y`b$* 'e&u}9#2q<΃?ï0/kxyH˗qozu SS&,%]z%%*<OĊDFVކ.L ȧY QHEB˿G#o罷ruOuh;q)+9Lݟ5oA0:LP#<<ԤpjÇJF]rlnΫnFWT{?TQ+x|+X  5q}JEh_hR HKQ8amAB -NqYV.?lw6}@~H8Vx{{dLG#~QNּNds]k ^xԠ6`6)yJVն?(RAT*dKj&kh}t,5#3'`?,qϻ MFA/Isտ${vj<՛YMbDZT*09Jn֯/ˢ9y{Pbݺ]Iq-l*uq|#,7;}§P^0ï%ܨbӶ 3pKecHPP` 6_gRVwTT* ł/|i6>. u-Ш[۷ K95O/׫䖕l+ 7NTN[,Pخ[jѷ̣>ڔKq S}аԿz(n7<;NeϸtСQtД?c6cȅD L͛b-΅#2˼.*Vxj4>֞9bzzkyT Rz-3U>j)-`┃<90:&| SP[E3mInssx_GA2 ̟/΂lY_e]9$I/4isIgOc{jԟP;6F̾X\i%]}m\ ll nムju3FGoBw?"5*b}5Fй{]Cce"6̭B8M.IΐD}Шݓ.'م'ɈJ*ir≆[FDb43|ٿNݯjTKNvfoPr`frd^(J&L'V-y-wdII$IB wd=zÎ NL9Y(BhD# ztk/>8*Ot:8z/ P<1ʤ( 9Y(BvܰAujr}]WФh,ȟ?EX$A!+,CeҒ8w6O E`2RJ2Ո`Zi4&AFN&*t Rϑx:|t8vdNo@酌 &EQ].\.vݎV%4WzeAJIJ'oo<=<"';LҒeEAR(wI ;RN&/ZLF$JFa2ܢK MMBW$I`0bbYqjj5z5m $4at'qNNUR<'^J%hp8h\@˦J&(zR Ν#E(zG]WGلSV($48 O" M@Pi);y 3F WFϏPGDhJR iN`%~[  TM   B  B%$ P "4  TzN)LZy2SF&^˛H*$PRp8tm Evf޾~u] ~nrISSXMMB(%GNhD[#3="$48Q٠TbK.m6tzC]WCpNjuD&(DJsrIIU8ZAѠR6aoaj4j &>xjAA&A(>FJb"v _@B#Zi,llVϝ!#-^o`*0<$8)r!.dfViQ'AFO&S޺Z]JBi4,˜O<͙X&3F/3*I$ j4huzP,V q<< kզoUADGp^SJ(B LQT4g!\N2Re:K`[9u\IEAeNhS^h4*RԽ>~de!˲{$}P5s_ B"BP/GԭFT*[CR[+h4( gcW Po$;ŝ3R$n)WRѱkOr2Qdc;Ifo_,yd\A^hp.-KX~xW4gͯ+o}o/22"V1ntvO<(an M<2k\_-at@ʭE!|"P5n 7$֪-ϝ?c8IDLfo\OIhoӍSqwg ~ػydŷF5qgY~:ryD]FhNzDƞLCl]0}"&_}e>=>8L^"%{h:7@%daYh2ߪS_x$d* jkIxU(BJY($P+Mz*Rz k7e+d[q̌4\\x`ǐr[k_ON㻁SO piOSM7.`uk((B^~Vn~X t:y9Tz#&dж'ci bbWΛ֛S j-MSX:>C6~D>m%P8r~xGtg#IRզag\" iӵ|ONM@O71t+: n?:,Ե|}i}cT~5>=ۗJ_%](=|UAp}0\MsM qYKL'ϡ<+ rqv^4eYԂDZ!V7nIXxlQ ^Oq8b>ᣙx  Ef(`80Oԉ0.t4K^|6= R_6qd^x}3]8Ld0fɊEKy|I(G5,<<ԤpR6JF]V}NJRĕyfwq:#geZ[){峙U&Fj;q)+9Lݟ5oA0:LhF v%͘u{# dAo7&>& tCyuPEDKե㢏PY74ed}+%(,a [6t+Ǚf>VU~9 &?h8~? ;t(_\ϵErV!} V3YcxDy oG2u0JR0k}hza3S~Օ+KmˠL5]3<Ƥ0 ɞ; ykko16yj^ &I墼JU\p簯X=ҋ0rU)k>q¦Rge\v߈])IMޥO f&bLz9Pzd*:9?$`Q{!7\6Q,X(4`  *bXxI6>. u-hȻy݀DFf{yWJdhZ(}_pXD,9Zɲ.Ejύ[uνli`+]j9MYJ1ХUQ ᬶէVuW 5AyEeڢ57+[˝ 3'ʌ##~=jޗE]Iu[>б̸yw6oFS+ʝQc~1(k)7]Џ\mRn_ Ij[81StbGպʹ"DmpuM=W5-nǎg3::t4n@i6miwpmĘݎ5o X7+ptk11M$u]=ۡsv.O4-;_]2e^arGysՇ<9/W;7c=T]|s2{ QEϱ͹큱 ݅aAj*kń~sN]&n(W7Em]=N~(l=pWLP$gٹWDfKos^a!H]N׺y8F/}xiE&A\h"j Pg] =7'0_\jw8pĔSNZDM[7Wyl'g7r 2]"1OyYYp_rz `B4'vŷv~RhJ_H轛ӪM+:ܸO{?uVYٍFUz[xD?[;&P$IFRb!-.^ΞƠ@7T ,1#1e71s߰huڒrܬL6#7'#t:\aTtp_yb6{IQr2PV:a }oͥuF B; MAqhh4vNg",{ʲLZr&i4H^&T*UI_Q,V |G8Bӣ^Wh۱䓙JNv:2*}jEAvp\mVv;ZVxz*.@AhDhOrr$33dEQ ]RÎ˄V!n)9I%RѨ5xLh)’ B"BP'I0 t:XlV\E?jZ^o`(l*=@mM" 4~"4 Bq)I\ӡ(qE)wAI&.h4Zv;Z]mM+\)V-*t)Tu.r:-"kmjʰ۬$7: MBs$Pɣlu]4->~T$4 ", RB@PH]WE[  TM   B  B%>MBq+gKjx*BPob/*Acx*BP/)(dJAA~>U* }1"8 p1qXM"4 NNrL ]@0vsdt vuA(&ST&A*M^N&;uCQdVK]WNIwQ_3l: -rE=E?Ta QgDO *! f~` zk6~)[1٧[B:oh$'2xh 9~v 8<27瑒v&&T)%O6{[1nF>tlL;s/0 ۖL?+7l4kz÷lސCrZ1q2E /{渫81qiHD|Q؅,ptN` 4kRq٢^Ogyvn g4n/} cPah^雁eio`X8"TES3v林2kl>9oIW=s צnרsje` ƍK/f-0)  ,$_'Hr/j_K&ܽ~.c-iON-[iKR~^Fo orh޹gݔc^“,9M.oy}.x%.>9HЁgƢL'e97>#52p6iJˍ" GO8?Ru(i؅'34ɨtsn^mMk=_cW3m2 ~!&IΕf5•̆i=OU4E:#/0pvOyQobl̦"6&m>䌒c6ԺuX]Vvgƕ?AngI׈`, %.>3ǿ!2\ZI!}8q1kmGtvqq侎o z̮k5r .fu `I<+شIt99eٙ&`NN N0g镵9aSM f\Cz~ιVeBD߹A ` zpCSs>_\tH8d\-W/%H">恎?G{myM޸fe~R-.9huU~0""{Ѯ,w,֗~1-*=??>ob6]DS_?o!~W/ ZB*~|i&4Mŗ_f0IBӹ{yaʿpU5wespmhz2񋼲iU]X@с_(pcmc7n'3gG}=Dr t:iIM)sZ%*Sq /guL Z4ppR3h_m.LٔܒV)CvNN%iwHKTES/c_ٗ߳r_!c拤 {V"Мn= ')X;33V&Aܛ0mdΡlz}5k2r("?Yb;~fY)@F o`7[{Z,zfߧ/kKXO{.?,Xϖ^:%4HO:R_ AC6-`ʡP5D2߷].1mP` :ϺKYKgxe䧅1v GW7@{]ߚ onk&+Ma?WaеulF֬Wd=[mYSx流C w\jLOaϘ.vMO2>Vggc^3vQEV]ynfwO1~-|pwy>^}y 8^ lvR:%/̲k3Gb\I h}8O_߼U<ۂ.x--OaǗ0O*q]gS̟)tբa 8'm3驩-J)=Gl&`Qnad'|p*}iVDev.]o{utW.?qQ/aΫ,'q+xNhN&0O}l_0)zg~ak"A 84Q/0fZtnr)yj|Bu+3N<=Lg~@kVҬIG?W,1PZPL|ML\4RpMt41p~Rh,w9M8}m'(k6]EV'r0 yf"r\tb_XbL|Emp$v8fi8AR|`_fh ;'SJ7ej0OTq9u4$.~\Gs9!_L_RVpoIPKl""5_LaUu_2!-E*J!ކ7OU4֜]Yy#I{sYb/fDeguT98a`YuRcYnrsؾuqdqI4h܌ZXID*Pv< &( 4,Tjx*KiSDd?eghR$geYmsKXR$");CwhJED{*s"Reg~KhuǤP);v4yI0T8T""""!P$"""M""""!P$"""M""""!P$"""M""""!P$"""M""""!P$"""M""""!P$"""M""""!P$"""M""""!P$"""M""""!P$"""M""""!P$"""M""""!0 pCDDD$8avGy=&pʊ&OlŅH)*tEXtCreation Timesb 09 Feb 2019 13:22:18 -022ۘ IDATxw|nI6$@z{WT(zQ׫b/WQE˵">^ 5! *H2ٔm/ٳ3v9HNPAp3ED nH)v!HT׻JB R" - D Er3IOKk/-TjTi[EQPH>h* BD OW4WәHv|| އ"o %LF#BWNQ,f3= "S/>Je:-3$]ZA)zWIgO;j7IOIFE]  ۧ=|L|Z낢Xf&I*JͱC{xhj$(X\NW dgfI]>'9YYhJȲB^O&ͰMٗf1% pi4TR6Q+|u>7oXUj2ӋzT&:dYv@u7j0Eu9y>; 'FS%d'uq: n)#N*k*iuJO㪩-5Y9 r:QI9Ws:]'[ҸXX BlךSGErӶa!<LjճZuVLW`OW`yka]uoت[,qEBU 0t9Zge;nx9EMfeee6n44NfLBwϐVJ^ %T}Kvt bAsӶC KNx`?0LvR8+JK疭λ$޴mXHOQbcz`2VaJV˻wVYe^OɿX-%x 9!1:Ǖ<-mrA4\^]ȁyahRf,}hvM=L6~D4j SP7VD@믗I;oW,<¢hu0o=.ϻY|RRx񻯪|ZVHxo1~.lo?[6tw=8߷xUoZf{_w0}LSB5$]&0r} _]mX3?]wmE+z0גK^/8/>ON9v/*/\*zk2S&3~kլaU-VףjYt2w_g=ڏt}C2wqӎ4' YDL߰Ɨ}4,ޓhH*{9ө};6mBxg>kvvnϜY0[9hjZ8k]=?$r>PJ)ОW9բ ]:u_64.{SnQU,&;o7_On]ʴ5b8ϝɘ_eVνqlmh4afFjr7L˝Xٗ5ص~dz?1t#զl\g iӛ?k=?I{|PWBUO|n|hhd]&R pRoo+i'ޚAZ3hX>x/gr% %\αiY*Qã eSٖOjRG{eUWWi׋=^+먓=<'lfL&o&%- ?_F ܐm4`Eܯ6bCʩğFOmh1(/[ E]zv ̫ Ÿg9ah6ujZ}_XC^**}VGbՏDF#go$g+sr*qbל``톍ddep]ex{ʉu]ssѨY,fgݪM1q}\vĴ^:{+\xʺ}QN?Z]bitLᛟWV܇b#-VT,c-E`ʄPըjT>_OL1LyWW.U\1Wi߀o~Q-s># iʾC΢~=?ƢıCf#:/AW;!>z+G6h8JoxGo ΧGNV+We zvps׏Z֑Lf / ƌ$ #:31 yzS"K~$g9t`FAOVn.ZoZ3Эu3z ZQV,Fz:Hp[u&9v3\W4(#"4DRI7&B;iߥ*c{( sz\_KE4U(zr(h(b~d$,PKض;i݄N;CVcCy maHD˖&Vt 8ɕq:dVz՘B&jAFm;?@]ZTpA˳y;t(ӣZu/Rm8HW *,b_MYlR2MP>X:6ux+뽻\6$lBo/߮$80CZ5zbh9% Zϒ%I*EIjܜl|ǺrPk4AS]NWCt;fr+s@GN]_Y?+ТerVǿ6xzx!@ZF&k7Z]uht]6UhG[P=HKEwƫ"ˤ$x|N=X>YY٬Ȥ`0nc2|,Gfz&c>OO4jMVl1c6X4,EQeŌdQA#QWrimXdedp5A!=<J*s:]A ?łZ]pP`gm|c!9z \LFu(IxV*EQ0瑟kI OZ芉 u:~ ߸ YuHG#8Pe!!RIT*T*U*u:; ?Aƍ(lI BD$QiJά*(K(cN#QCŁ*u:38QRW;.u: MJUt>=\14Οqt v'QN\/?$''ѥnJl vO+nڔN͗_8M0Dq"'MSh<v-Ly8hhڤqi%OBӮE ێX.=gԢ*O]"ELSk0* >>kj /ot* YKLucΜ"7'| ہ,(1@ט~Yud.^h'$,DLrs1Z,j}}~>[6ܹ U")IIW+d2ѴiZmQ/Sk-Ir^ZoG$nMǮ,GO`29z$M|z=ZT*ϛ$Ip%"DRDqG[E|n*/7JMpp]@;CGJL+g,xt6"M)X,.WD$(\pIZJ]סmazDϽss"uy7{Q^7g4қ%8Ņo·nXfWDfo^^>O"/OqrR?8Faο'ʕjܗ?7Wգi}N=Ky_soz\m}?o,ϢSp?"\kVMKOg[prSg^|Σ6,5$Wp["\ \kiΞ#<,矰.vLJkB8& c=k}{}NAi3VOponٛGnn^||;R.^TW\#z~n KkѬ}?H׎oLn+7y^J'T[nn^Sl<F#%yzzbX@BssIW^V}N5:u(q~]Uεk԰!NkصhzΝ8s s?n&:OU%7f4-=$1={ML<ԓ|嗌3܏ *]KIe]ܝ?DTd#?]rرs' ~Y Y3N>Ypc4?\ӨH^|5܅{dX7}N]zv}̤ߐaLzt _-H:Bfo+9^xQ7܅ ֻdte6{xEl61y%f1yfC~B4_ -#.ѧ8h}i._[D\[ȳ؉~ģDE6"''G[KoV{_EO8jroUm˜\{޴MNVf-~Yʰan:5QPDzv]^飽oY G\jā#O u禼u:&3IWF2ssRjH+Gy9xP{禂34lZȱiݲ9/^&'/MIJZDFFVvz&#d{QddBł 7[=תEt-|s`b1դ 5J%z}nHkܬYd&Ce,WedYSɁ=Bj GZD9 X,Ȳl`}{*!I@7$OPTv .\~asO"+ Gx~Cqٳ'N($Op8H#+<ApK"ApK"ApK"ApK"ApK"ApK"ApK"ApK"ApK"ApKu㨂7i,7Ag %?%3 ՚.L5R 0ozQa{Y;)UyTQws2HM&//nV?W,u?>ujUbruNY&R-'uV_aHUJW()׮NF _Vb&=50 Ka?Žsh@!v)YRJ~HMd]xxzڧ@A#Οkk_v&9YE1U.$I?0PڋV_@@sL8StkNN^3!iW%7[yAOQ-9z`oïJ]6EQHOI&"  \Ք(XfL&# \&(|Ndx e22(9nQ@5]|<^ yxzb6*dYFn9o|}K.2l:- j^֗SǪ:EQxBT&sw$z~eNq+]SŸ+b)Ze7?Apf N9=?A*bݾ]cbQw|PX컼%"FTRjL9:FĐYJC&IqJ_ P\Kϊ.Ռr1ƭ+ͩ`Vq*)wz/ګ2$]Fks:;BIS\IGf2Qzhg& 8vHޓ=9:FE9k l}&|Bep6/RY5ՠ5VU;l)lz/VZ} /.Iy#u,>49:)9m#?'w d;@0=u uFL64 a9%($oLj1Sv2߾x~a"a+< 7knZb7k#3/~cUAܚԇZb+/ZrՎsұm=uѭۣhJ co6i)|vC[Iע,o聽tgU{ֻ<{6;ʷT;͑ A͎Zfrsm5{AfFJAWQfAAS卤ѠIz d^j3I\JAe ˫I- =Ԓsl*kXOzֵUJ("I{scǼtj]NA=`2RQSddUTYd6h<0v,JшG/:$IBR뇏·GReIN IDATOMxERM9",ߎ); Ŏu*3$mwk]BA!?s>n B]a7pcUU:E$j5"P=HK Th8 juRX6םVyNdO:nq VaBHMa BUh4ף^ ï˫RPRtG3STEҗ^,jRNHs\'=?ZJBeR*aRQq|G񞍣9u:A[&LF}}j]V%Pq:Ao~kg`WJ ؆y?o{x>ּૉQ"ApnST!P\Y .YApS۩l}ﴚ"'P--i\B~L" AÒ7z `0zZ}#AW*xD |{mQ BصJusט~y Mg_#6{ApK"ApK"ApK"ApK"ApKbH+AR~(OrBrm}k~NĠ#';18g$IZtxz#aa>:>:_^u*(\c gN&]СSmP /7@C=EHl2Xi{G:33._gaNlAΗȐ0$}-2野rdc}?j?E9|#TT!IG狷׮\SE]n[GúTga];iz=ֈJE'Aaa۾W>fT{4'E@P H*AdgeUa]SQN1 u>((@Q L"|t 6'`2WS h^>,TYI߽`SYTJ?βJ77d`ykZلb1"sXf6Y ί-NqƁ,%k?F;12}Tى^A>'BD ԣwpp%eb$l dL8Z_f]?lSԣ#=då^Z|؆u$}'N``0pI-['N$>a\l[OXyy'l"qZ[$ي:$ឧG.) G]P8UdYY3Y;уٓ"2/%~uЁH;M2M;$թG/&})ERRSt=EU?MlzfθYeu+;J=lņˡ>MG^wI~K\dbT4/9}k7D?9/LMP2߸s=~Mu[$[3ҩ1~!45_b7<^ahi-9ljR΋e |Ln1>c⡷qX672}CRya IY5պU+8Y͘5'NкU+V];XyN=z-v|g$[p6 f6ZYNܶ|4+_o=°9obA-3FטFŠz_.7SE?nf`듌Wr9gʻkػo#Nqqǟor2< &F6]/?lye2q L[ةִ)!v0BwT86J斾f8slѴ3g$*%,r\aVPV+sz8KFl߼?q݉8k 4gxIXhwfA<ÂiC ~i. a9,7|4xmGjz;ʌAo#i6o)Z^t C!Gh8b./LQK,\d3_X&ZߦhF5XW:>`&q}a7]#A,_!3ͩӧhⰺ:)};Oq kw9!\暼#߯%n''RIt 9o yXEÆ P9p= Q#d=ġ,ĊbZA!mvm;eTr3sm9`4M+yoL/:r,йm՘7pup p1@A+#`|#+;~q6gͬHUm~i|;m)7f/Sj$jxntk7߮歡 uk0>Qh?x8bC9v#i@:VV, iSBHƵ W8џ۹k7;w捷wߞl<8r,] B?&Qkˮg?Ƀ~6Y{fϯb'7^?u{wr 5?&ؕ'NtƿO&&V.=Y`%@@X?mby o_IYJ_ 0 3DN«=94W' T֟/"|o[G3U|!b3 \c7y{y$|ʰe3O9Ϫ'x6\17f$~s3; &/ZPTF3xce_?L:|4ݏlc{ьnh\F ];ؿk# { 8X[5 ΀Ù\%n'ߟEojuWxH_9mztZ KטM4`D)w; 爈lg\[;.aӼ5jS}t7QfSz:$Q:شOΝ?$I4dЀ9qAAUؠt-7/2ͬlNSs{rbfąh4HT~*'00///{rmے<:N>u׺3kH-i"A<,r,瑝wmR$R9mlٶhU4v6+ We3'MF DAPT>$$7'tEvtI'IZ-* BZuNIP A?̡=X5tJ: {0i42ZmD9o>:G\e:k!RPմvZ6h`X {.k ~ P2jJ,6j(z']sj~ tثg'Uq> nI nI nI nI nI nI nI nI nI\!Um { cUrnĠ#';18g$IZtV}uXXNκS;{( WXÙ埓{/>j|} ЎȩShxx6(IdgfS0yhX: ]Hl2Xi{G[f0~'W \KdH>uCG921Ҿ^AV"@AO^naH*>:_}v2Zmï;r֥: چxnI0뱤FT*== 1 Cm޽$T[vVA"* TUagXuNEQ84df >YF13q/lk@|ۜɘoՍoܙVɘ_β]NEQe{ 6v^Yb!! /6{(bMH*U~gYu΂I`ɼE =)8 nYhApCӧphz^G#p~MфݣP8Atz؊fD \E6\ 8N=zWRVjZ+V@͜pH ϔ e!C4r w.ZjI ec#ѥ8ɏЩG/F{ȆKaý !'$pI,3N`ɓ,[)NH|&fy=c\kмBF#َ|/J9O6roVL.G% O=,=wEV8z_}[m Iܱ֎*u粒܉) -dddzԂzܵw9 G:5}x&}φsiE U΋_Ee5^=ٓʇ/:Rפdts KѵuJߦ& ]ԣԢi)L}&wL+n߯/\VW>a( t ~s^ԛEueӿq9}?玡{t=뮷HL+|N4{"/x;i ;\,ߘ? _@ot p.r30,- <%8Qy#٪P-sV Q-/4V$lrDJ|},q3}[dc{UWL41붮gl}^;'EĕxƒWUN2GLyw {mé27YLJ?ȖGd^O{c_Tu؂ud@]ȆK姜ms7,Yƒ1}i RBb #PqWnL5c4}q-&Y3Μ=[4ٳ4b;WE!qNͿYV=gۂnyӆ]$|ȳsX:o"艟i:1>lgt_xEsǯhi ٛ /邭&QQ,_!!sϘr//۷s{WaT4lrr)65Q#d\ÞK4(+[z mrp4 ue?:rUo1Pn_G)Go}Y1)˼~xlu`cݬK%w99s|gFj˸Q4#.%x1jtWLzoQF7kV"oz9uΠ{׮vAQ8mգ~&e0`>%-^x]rjiC+Xa`ϴ_.zM  .1>:4ck=ۓi:⌃xiJ~YUh7Mf IHsuڴ=Kӎ b\g>`;~Y7f/X];y_өG/}Y-:l~Æi~=VM_HXwGʴArA~YM%yu[ ~vugI*[d(7e/&M;MhUw8bC|3X'={9ՊQUkSBHƵ=+$nDQ8Avo/C.xEܵۡ5-q;˖Za>a[g҄;jmَ= ?i8O>ӝo%k{0[Olag_E ic},Jȴ;+iW\8 Ou>XK|oN]8ˡM+Y{HV-m~k1 z荶sRq,ncy o_I1hdzҍ1#p9I@7y <Ъć6NAss]/)KG676{˵jİaߵv0r0G@n]

G"ԈhuS#`D-)ó/ofU`?"A(W]' H"H*"7eúR٢Fa ŷ xxzb0'EoӳerLޕ\d+2Aݻs~def ˖7vC,W/8:Ku6v/يm_YLEɬl2~No$"2Lersv2>:_^u:KuJJ"tp=Ř% -W)Ŭ(\؜O4JU#ڈ}~N? OrsrLOGQDJVK`pJa]S$j5?|CO?s8g.uzt4t`jMD}tx]KsuuJBVi}U`/>*&D PBaȨjT*,<ʫx艞 vQfѣ+D PcޟV VqTVĩ. %~ %~ %~ %~ %~ %~ %~ %~ %q V 5UE>lL|$IxxjZ=#aa>:>:_^u*(\c gN& f%C;"N?'A^n~xչȫCe<21LVQ배 ,fY|oTIDAT+w%2$ Ie:eLi_O+@~N ߠ'/7ЙH*>:_}v2Zmï;r֥: چxnI0뱤FT*== 1 ރ{[ݒE@P H*AdgeUa]SQN1 u>((@Q L"|t 6'`2[uwza2WCWSQdY&}^|MeݷWX8p&C^'(wJUYa]F,c1l2o~ eOmq3׸xM.'BgS"A(?Apz`Դ4V͛9"Q П)'TˬW~RﷹT6Sԣ#=då^Z|؆u$}'N``0pI-['N$>a~%+?w;r'[|=i6cm]t?v뒾H9[h1C 9bi}Xӗ^44f6--$~)g+Kdnk_`mԦ19GܕSͻ( fl/ۚ[b5ٳEΜ=K(qYAQZWfU|Ͳ,=?t3,6v Fy (GOLֱq:ۖiܸ{; 筦3,G;~EK ھ?}X.zq]^g4.xYD[G󱦍+ٵ6}'製>@D-cC)f7.:p\^ܣ-XȈgLM!Uьj2uJ}Li=O߇P8ӞOe =#;=CT- d^}nXRz:뻋iҼ8</fU|X$N7Vn5((䓗CPpvG),eӋ/bpu-&qffɳAף$3# ?e'[c{/A~>kUW#H@Pw :pl47_@* 2~ ʪ;auz|K[hnSUSK셚j.( łI/3g>)M Z>0Qh-paUqdgu.|:ܜWUEQHߟRtI6En'#Snxhb,W.uX8]W.(-[$?AEhY19Ƛ]AOryS'BDzK$ۣq$7fsl&rJ {;1>?f]O~u/wfH:l] x8¾2y[.`ZZ$;Ϻ?0yKHE1n #ؙ_>Β 4:tڎS':jpK|,GQvhբ>:e̞1#v7T~u, GEҡ=!?׳/5vc@hsV-[EFV5UUI:rya5OPw<'pj_#5q`/NTJ"<9+zO^FsaNSq]MxЖ;WT }e -j$ӽm!S1lmܱ݋~n>ҟgk_0FWL1k$Ce˶+Lw`#~K(zoKXLlղ%+.Q5nrZ ǫ?[ 4mrr(=Dpf22ȨnG0s7'T/=o{-aƘTr7=ҽ]?d-&UܻgBӜ:se ҂mE]l31$[6.=w,Iwyg7I=WOZNޠ5{krW5ݯoNnMI.&}ŬF=MHޒ~stQFy{gޚ5omǢQ49U@0a 2m##iKL JcQQ@ຯWkJF f~T!ХSV/ϮXcLgv\ot8uu.]Ώ`;<3?毃Ɩ-1&}ZBvm0U"[ģ<Lزikj9@8jjˈEU 밌-qirt;A}Y}f/e*HH<ًAרS{]W`p/px'`[nW;k|ʝm9ZkXj//5,h`lЫo@ OcQ"./f.ZOS۵9 Dnfk'8ODFKބaCZ;};ȸ1K~;j5mȲ̚'$9NvN.9$9FԇG$Oz -$ݙt~ue:#]ĄQKq,+iorr66%߾ٵ ay6>6S0_hZor߻'czinZwBά䍩QMϱY>mod:O䵕phI袿ln bK |vAwӽ̞1O>7x桄f/M|-#A~^nrE6ZF6^$I;Hcroc2OC[ʴK|Tׇ1Ç1f0n]Pٻa#ʗM'85d޿NGZwqg]]W;M}x/v-F%# m~"IPIjBwc ;+30\|܀hb: f-`0+.uXUf_ wEc)*[z„nhޗ*v+}|@QR#UQHKׯ2PՉ3()V [V4p{O(6) <"%rsPL UP^geÚ o__ ,6b,fٰ뇯K,4ǣ{(;y\bsa*(ūO/Ee76?7`$7'tTU$@I0zx ҄RL:iw!=5kW.`YǗM+'$ NG7+ X-Ző[ ]liD<3V*2'Rt,t::|v#\;rt۞,%A(8t:dYFQQ''Apg`ZuqD\7&W*ي'BMm]]AD^Ozv8A\$ҮjfAp7mG.݉`0bh Y  2eޛe&/'G8A*7+  rqHk)X驨^_e(l0)*NGڵZ*i)Wt(`@FIL&t#W/i +7'+E ~7\L&$YǏ+Γ~-EAjNURrox te$IHy9(Baa!dggcۑUB+ ށ7$k EQ(Izj*:UgDョgeoIv;X,rssÈ*X, _{@<:YFo၂L~fɄ`(3+tN:FBՆMKTTAp+$aGnUCO?&  \ پ`IENDB`easyeffects-4.8.7/help/C/filter.page000066400000000000000000000040131424023573300172710ustar00rootroot00000000000000 Filter

Audio filters can amplify (boost), pass or attenuate (cut) some frequency ranges.

PulseEffects uses the filter from Calf Studio. It can be used to remove defined parts of a frequency spectrum.

<em style="strong" its:withinText="nested">Frequency</em>

The center or cut-off frequency of the filter.

<em style="strong" its:withinText="nested">Resonance</em>

Add an accentuation to the center frequency. When used on a bandpass the surrounding frequencies are decreased in level and the band gets more narrow, a bandreject is narrowed down to a thin needle.

<em style="strong" its:withinText="nested">Inertia</em>

Smooths the jumps between frequencies.

References

https://en.wikipedia.org/wiki/Audio_filter

https://calf-studio-gear.org/doc/Filter.html

easyeffects-4.8.7/help/C/gate.page000066400000000000000000000071011424023573300167250ustar00rootroot00000000000000 Gate

Gates attenuate signals that register below the threshold. This kind of signal processing reduces disturbing noise between useful signals.

PulseEffects uses the gate developed by Calf Studio.

<em style="strong" its:withinText="nested">Attack</em>

Amount of milliseconds the signal has to rise above the threshold before gain reduction stops.

<em style="strong" its:withinText="nested">Release</em>

Amount of milliseconds the signal has to fall below the threshold before the reduction is increased again.

<em style="strong" its:withinText="nested">Threshold</em>

If a signal rises above this level the gain reduction is released.

<em style="strong" its:withinText="nested">Ratio</em>

Set the ratio by which the signal will be reduced.

<em style="strong" its:withinText="nested">Knee</em>

Controls how smooth is the entrance in the gain reduction phase.

<em style="strong" its:withinText="nested">Makeup</em>

It amplifies your signal after processing.

<em style="strong" its:withinText="nested">Stereo Link</em>

Choose if the gain reduction is affected by the louder channel or by the average level between the channels.

<em style="strong" its:withinText="nested">Detection</em>

Choose if the gate should take the signal peak for detection or the RMS value (it is smoother).

<em style="strong" its:withinText="nested">Gain Reduction</em>

The level of gain reduction when the signal is below the threshold.

References

https://calf-studio-gear.org/doc/Gate.html

https://en.wikipedia.org/wiki/Noise_gate

easyeffects-4.8.7/help/C/general.page000066400000000000000000000052741424023573300174330ustar00rootroot00000000000000 General <em style="strong" its:withinText="nested">Start Service at Login</em>

Start PulseEffects as a service in the next login. This is done by creating an autostart file at ~/.config/autostart

<em style="strong" its:withinText="nested">Process All Outputs</em>

Apply effects to the output of all audio applications. This will automatically switch on the per application switch that can be seen in the Applications entry.

<em style="strong" its:withinText="nested">Process All Inputs</em>

Apply effects to the input(microphone) of all audio applications. This will automatically switch on the per application switch that can be seen in the Applications entry.

<em style="strong" its:withinText="nested">Use Dark Theme</em>

Use the dark version of the GTK theme.

<em style="strong" its:withinText="nested">Reset</em>

Reset all parameters to their default values. This will reset the plugins too.

<em style="strong" its:withinText="nested">Priority type</em>

Choose between real time mode, niceness or none. This parameter allows to choose a higher priority for the threads that process audio.

<em style="strong" its:withinText="nested">Niceness</em>

Niceness value.

<em style="strong" its:withinText="nested">Priority</em>

Real time priority.

easyeffects-4.8.7/help/C/guide_1.page000066400000000000000000000620571424023573300173350ustar00rootroot00000000000000 Enhancing your internal notebook speakers without using an equalizer

This tutorial was written by Markus Schmidt schmidt@boomshop.net on November 2019

Introduction

If you're a notebook user relying on your internal speakers and you - like me - own a model suffering from a tinny, clanging sound, PulseEffects is your salvation!

Commercial operating systems on laptops these days often come with software like Dolby Theatre and the like to enhance the sound of lousy notebook speakers to something more substantial and acoustically rich. Under Linux, PulseEffects will do the job for you, although, compared to the commercial pendants, there's some manual tweaking required until the community sets up a database with presets for common machines.

This DSP software comes with everything needed to fatten the sound of your laptop speakers with a flexibility never found in other operating systems. Unfortunately the drawback of this flexibility is that average users will get lost in the sheer amount of possibilities. That's why this tutorial was created.

Why no equalizer?

We will attack the problems one by one utilizing specific signal processors, deliberately renouncing equalizers. Equalizers are not of any help here but tend to make these kinds of problems even worse. This is because of the nature of this processor, but also because users tend to add to the signal (additive equalization) instead of trying to eliminate problems by removing from the signal (subtractive equalization) like it is usually done in the professional world.

But even subtractive equalization wouldn't be of any help since the amplifiers and speakers in a notebook are not loud enough by default, so trying to eliminate problems this way leads to a quiet and still castrated sound. And raising the volume afterwards generally leads to distorted sounds and other problems because the system was at its limits beforehand and just fiddling with the frequency response doesn't help at all.

Frequency Range

We'll have to talk about the frequency range. For a better understanding and because of the way we will solve our problems I'll break it down to five ranges which are:

Sub More or less vibrations up to something an ear can barely hear. Everything from 10Hz to ~40Hz.

Low or Bass Where the whole fundament of a signal is located. Low end of bass drums, bass synthesizers and bass guitars are found here. Movies occupy this range with explosions, rumbling waters, thunder, heavy gun fire and the like. Absolutely missing on notebooks and tablets. Technically speaking its ~60Hz - ~200Hz.

Low-Mid Hit a 0.5m³ cardboard box and you know what low-mids are. The "punch" of a sound is often located here, also the juice of snare drums and electric guitars. In Movies, roaring engines and shotguns are found in this range. We're talking about ~250Hz - ~750Hz.

High-Mid This is the ears most important and sensitive range. The main information of any kind of signal is located here. Human voice, picking of guitars, attack of drums, the colour of a synthesizer - everything carrying the main information of sound. Something around ~1kHz - ~4kHz.

Highs The air, the breathe, the sizzling, the splashing - this is the range of brightness. Everything around and above ~5kHz.

Test Signal

You definitely need a good signal for this job. I decided to use Seeed: https://www.youtube.com/watch?v=OxAP6ieuDgI

It is quite snappy, has lots of well defined substance, clear and bright highs, present vocals, comes with a very balanced frequency response and is a great mix in combination with great mastering. Afterwards I tested against various movies and other stuff like talks, classical music and the like and was convinced of the result. Well produced, modern pop music (avoid the 80's and 90's stuff) is always a good test signal for this kind of job. Movies are way too dynamic, so is classical music, and they normally don't cover a steady, broad frequency range like this kind of signal.

We will not be able to make the notebook bounce. What is the goal here is that everything contained in the mix gets audible in a well balanced manner and to gain a present, upfront, broad and hopefully rich sound.

I assume you don't utilize a player or source which is able to produce levels above 0dB. I also assume you don't use e.g. video players volume bar to lower the volume of your source. This approach works well for defined, mixed and mastered sound sources like music, movies, tv and the like, played back at 100% volume in the player. Set the volume desired on your hardware via PulseAudio after the processing happened.

Problems

Let's investigate the biggest problems first:

<em style="strong">Bass</em>

The most obvious problem of notebook speakers is the tinny, pressure-free sound not reproducing any kind of low-end. This is because of the size of the membranes and the inadequate housing. Fortunately software can work around this issue at least a bit.

<em style="strong">Highs</em>

Often the highs are quite bitchy, not representing the "air" but torturing the listener with searing sibliants. In order to fix that we need to equal this frequency range out.

<em style="strong">Overall Fequency Response</em>

Normally the relation between the different frequency ranges low, low-mid, high-mid and height is quite out-of-bounds. This needs correction, although I promised a tutorial without EQ.

<em style="strong">Distortion</em>

Because of the thin and neutered sound users tend to raise the volume or even add an equalizer to raise missing frequency ranges. This normally leads to digital distortions because every signal above 0 dB at the sound card DAC will go from occasional crackling up to a totally distorted sound.

<em style="strong">Dynamic range</em>

With movies, but music aswell, those tiny transducers tend to wiping away low-level sounds but going ballistic on loud and bassy sounds. For this reason it's recommended to reduce the overall dynamic range so you don't need to press your ear onto the palm rest when the lady in the movie starts whispering.

<em style="strong">Stereo Image</em>

The stereo base is quite narrow because of the positioning of the speakers inside the laptop which gives an impression of almost mono signals.

Solutions

Let's start fixing the sound. The result will not come even close to something more substantial but at least we'll be able to get the best out of the physical boundaries of these transducers.

Every parameter we are gonna set absolutely depends on your situation and the hardware you've got. Every notebook has its own frequency response and dynamic range so there's no panacea. But the audio signal processors, their order and their missions are well defined and reproducable.

Don't care about clipping in the plugins level meters. The signal will be processed as 32bit numbers internally (check title bar) which gives a non-clipping overhead of hundrets of decibels. The only thing that shouldn't happen is that there's clipping when the signal hits the sound card DAC(Digital-to-Analog Converter), which would result in digital distortion.

Let's head over to the signal chain:

<em style="strong">Limiter</em>

We will start with the last signal processor being used. As I explained earlier, as soon as the signal hits the sound card DAC it has to be below 0dB, otherwise it will result in a distorted, messy sound.

Drag the Limiter to the top of the list of processors and enable it. You will not hear any difference, which is what we expect. It will hit in as soon as we start messig up the signal with all the other processors. Set lookahead to 2ms, release to 8ms and oversampling to x4.

A limiter monitors the signal in (nearly) realtime and detects peaks over a certain threshold, in our case 0 dB. As soon as a peak is detected, it starts lowering the volume constantly (within the lookahead) until the peak will be below threshold. Afterwards it raises the volume again (within release time frame) until it is back to normal. This way we avoid signals above threshold hitting the DAC without being noticed too much. If one tries to overdo limiting, it will definitely result in distortion and other side effects, but in our case it's just a fire-and-forget troubleshooter so we can concentrate on the results without trying to mess with levelling over and over again.

Don't overdo things! This might render your overall sound eperience worse than before.

Let's look at the real processing now.

<em style="strong">Filter</em>

First of all we should remove frequencies that cannot be heard because even if the speakers are unable to reproduce them a lot of energy will be wasted in the process. This will lead to problems like not being able to use the full dynamic range and the introduction of digital and physical distortions.

Drag the Filter to the top of the list (above the Limiter) and enable it. Set the type to 36 dB High Pass (this will cutt off everything below a frequency and will let everything above it pass) and the frequency to 50 Hz (which is definitely below your laptop's speakers abilities). Continuously raise the frequency by 10 Hz until you start hearing a change in the lower end of the audible signal, which should be around 130-160Hz. Subtract 10% (or 15 Hz) and set it as the Filters frequency. On my machine it is 145 Hz, since the signal started being affected at 160Hz.

What happened is that we removed everything the speakers can't reproduce at all, leaving a little bit of signal just below this frequency, which is quite important for the next step.

<em style="strong">Bass Enhancer</em>

Let's grow some testicles to the signal.

Drag the Bass Enhancer to the second position after the Filter plugin and enable it. Set the floor to 10Hz and forget about it (we already removed everything below the Filter plugin cuttoff frequency). Raise Harmony to 10 and start with a range of 200Hz. Now start raising the amount continuously until the bass takes over the whole energy, which is definitely too much. For me it works best at +24dB. Which is huge but my ThinkPad P1 has the worst speakers I've ever heard in a 2.8k € notebook.

What happens is that the Bass Enhancer adds frequencies to the signal which weren't there before. While an equalizer only raises stuff which is already in the signal, a bass enhancer improves the lower end by adding distortion to a specific frequency range. This kind of distortion adds so called harmonics to the signal which is a multiple of existing frequencies. You can choose seamlessly between 2nd and 3rd harmonics, which means that a frequency of 100Hz produces a new signal of 200Hz/300Hz/400Hz/600Hz/800Hz/900Hz/... at varying (due to the harmonics setting) and constantly decreasing levels. This means we're effectively raising the lower range into something better reproducable. It doesn't add or raise the real fundament (so your trousers won't start to flutter), but makes more audible signals that have been swallowed by the hardware before.

Your output meters will definitely start to flash red but you shouldn't care about it since it doesn't result in digital distortion of the overall signal as explained earlier.

Later on, in order to refine the result, you should play with the amount parameter to define the level of bass and maybe with the range to define the upper end of our additional harmonics.

<em style="strong">Multiband Compressor</em>

This is the most demanding step in the chain. Even professionals have great respect for this signal processor since it's absolutely able to destroy your signals big time. But let's be honest, we're consumers and no one will hear the difference between 100 ms and 200 ms attack time - even on notebook and tablet speakers. This means we can work with some reliable, well established defaults for the timing and frequency splits.

The Multiband Compressor will solve several things for us. It will cut outstanding and annoying frequencies, lower the overall dynamic range and figure our overall frequency reponse. The latter is what most people try to achieve with an equalizer. Thing is equalizers aren't dynamic which will add to the problems instead of solving anything.

Drag the Multiband Compressor to the third position, after the Bass Enhancer and before the Limiter.

Since the Bass Enhancer really raised the energy and level of the signal, lower the Multiband Compressor input gain to -6 dB as a starting point. Let's set the split frequencies for the different bands to:

250 Hz

1250 Hz

5000 Hz

Afterwards let's set some defaults:

Low Band

Attack: 150 ms

Release: 300 ms

Threshold: -16 dB

Ratio: 5:1

Knee: 12 dB

Makeup: 4 dB

Low Mid Band

Attack: 150 ms

Release: 200 ms

Threshold: -24 dB

Ratio: 3:1

Knee: 9 dB

Makeup: 4 dB

High Mid Band

Attack: 100 ms

Release: 150 ms

Threshold: -24 dB

Ratio: 3:1

Knee: 9 dB

Makeup: 4 dB

High Band

Attack: 80 ms

Release: 120 ms

Threshold: -24 dB

Ratio: 4:1

Knee: 9 dB

Makeup: 4 dB

These values should be a good starting point.

A compressor lowers signal levels which appear above a certain threshold. It adds a simple multiplication to the signal defined by the ratio. If the threshold is set to -24 dB and ratio to 2:1, a signal of -12 dB would in fact become -18 dB. In this example one can then raise the makeup parameter to 6dB, since this is what went "lost". So first of all we're rendering loud signals quieter to then raise the overall volume, which leads to less dynamic range with quiet parts becoming more audible.

The timing settings affect the "speed" of the compression. Attack means that a signal needs to go over threshold for this amount of time until the compressor reaches the full (negative) amplification. Release defines the amount of time the signal has to stay below threshold until the amplification is back to 1 again.

A multi-band compressor splits the signal in various frequency ranges to work on them exclusively with dedicated compression stages. This means that a very loud bass drum would not affect a crash cymbal, since they are clearly located in different bands.

Start playing around with these parameters:

Makeup This is probably most important setting in this concept. Makeup raises the signal after compression stage which means that it directly influences the perceived volume of every single band. Or in other words: this is your equalizer :) Raise makeup of single bands to make them louder or quieter. I ended up with Low/Low-Mid/High-Mid/High: 4 dB / 3 dB / 6 dB / 6 dB on my ThinkPad P1.

Input Level Set it to -6 dB by default, I ended up at -3dB. What happens is that a higher input level pushes all bands of the compressor equally, leading to a allegedly louder sound (well, the loudness was raised in fact) without tweaking every single band manually. This reduces the overall dynamic range, raising quiet parts and squeezing loud parts even more.

<em style="strong">Stereo Tools</em>

After figuring our overall sound let's look for some icing on the cake.

Drag the Stereo Tools to the fourth position, after Multiband Compressor and before Limiter. This tool has a lot of functionality but we only need just a single parameter. Switch to the last tab "Output" and set the parameter stereo base to 0.25. That's it.

Stereo base acts on the two channels. It adds inverted signals crossover-wise. This way one can bring a full stereo signal down to mono seamlessly (by going negative values, -1 is fully mono) but also raise the stereo base by choosing positive numbers. This setting has lots of side effects, so avoid overdoing it! One of the bigger problems is that it reduces the bass range due to different effects, which is something we definitely don't want here.

Play with stereo base to spread the appearance of your sound to a nice, broad stage without loosing the center (vocals, snare drums, conversations in movies) or substance in the lower end. Most likely values between 0 and 0.5 will give some good results.

Aftermath

Hopefully you ended up with a better sound than before. This signal processor chain is able to completely trash your sound if not done right but also can improve it to compete with some high class notebook speaker systems. All manufacturers put on the pants the same way and Dolby Theatre is no rocket science but just some presets on a presumably comparable set of signal processors set up in the presumably same way as this tutorial explained.

When my notebook was new, I first ran the pre-installed Windows system in order to test if all hardware is working. Sound-wise I remembered the bad reputation of this machine in every test, so I tried some tunes on Youtube - and was quite convinced. After installing my Linux system the enthusiasm was totally gone - the sound turned into a squawking, pressureless something. It became clear that all problems of the internal speakers where due to the missing sound chips DSP driver. But fortunately Wellington Wallace spent his spare-time casting the most important Calf plug-ins for this job into something usable on consumers systems. Thanks a bunch for that, mate!

tl;dr

Sorry dude, this isn't done by simply loading a preset, since the community is not Apple, Lenovo or Dell offering high quality Dolby Theatre drivers for your particular machine.

easyeffects-4.8.7/help/C/index.page000066400000000000000000000016261424023573300171220ustar00rootroot00000000000000 Wellington Wallace wellingtonwallace@gmail.com PulseEffects

PulseEffects applies audio effects to Pulseaudio applications. You can apply effects to applications output or to your microphone before sending its audio to a recording application.

Guides
User Interface
Plugins
Calibration
easyeffects-4.8.7/help/C/limiter.page000066400000000000000000000077011424023573300174600ustar00rootroot00000000000000 Limiter

A limiter allows signals below a specified input power or level to pass unaffected while attenuating (lowering) the peaks of stronger signals that exceed this threshold.

PulseEffects uses the limiter developed by Calf Studio.

Limiter <em style="strong" its:withinText="nested">Limit</em>

No signal above this level will pass through the limiter.

<em style="strong" its:withinText="nested">Lookahead</em>

The Limiter will reach its attenuation level in this amount of time (output will be delayed two times this time).

<em style="strong" its:withinText="nested">Release</em>

Stop the attenuation after this amount of milliseconds.

<em style="strong" its:withinText="nested">Oversampling</em>

Increase the signal sampling to better detect the peaks. The signal is downsampled after processing.

<em style="strong" its:withinText="nested">Automatic Smoothing Control</em>

When gain reduction is always needed ASC takes care of releasing to an average reduction level rather than reaching a reduction of 0 in the release time.

<em style="strong" its:withinText="nested">ASC Level</em>

Select how much the release time is affected by ASC, 0 means nearly no changes in release time while 1 produces higher release times.

<em style="strong" its:withinText="nested">Automatic Leveling</em>

Raises the signal level adding the absolute value of the limit amount after the compression stage is performed. Enabling this feature the volume is automatically leveled at 0 db.

<em style="strong" its:withinText="nested">Input Gain</em>

Raises or decrease the signal level before it is sent to the compression stage.

<em style="strong" its:withinText="nested">Output Gain</em>

Raises or decrease the signal level after the compression stage.

References

https://en.wikipedia.org/wiki/Limiter

https://calf-studio-gear.org/doc/Limiter.html

easyeffects-4.8.7/help/C/loudness.page000066400000000000000000000052271424023573300176500ustar00rootroot00000000000000 Loudness Compensator

PulseEffects uses the loudness compensator from Linux Studio Plugins which applies equal loudness contour corrections to the input signal. This is a measure of sound pressure level (SPL), over the frequency spectrum, for which a listener perceives a constant loudness when presented with pure steady tones.

<em style="strong" its:withinText="nested">Input</em>

The input gain settings, allows to adjust the level of the input signal to the desired level.

<em style="strong" its:withinText="nested">Output</em>

The output volume of the signal with applied equal loudness contour, controls the loudness of the 1 kHz pure sine wave.

<em style="strong" its:withinText="nested">Standard</em>

Allows to select different equal loudness contour standards.

<em style="strong" its:withinText="nested">FFT Size</em>

Allows to select size of the fast Fourier transform frame used for the processing. The larger FFT frame is, the more precize the curve is approximated and the more latency the plugin introduces

References

https://en.wikipedia.org/wiki/Loudness_compensation

https://lsp-plug.in/?page=manuals&section=loud_comp_stereo

easyeffects-4.8.7/help/C/maximizer.page000066400000000000000000000037741424023573300200260ustar00rootroot00000000000000 Maximizer

Maximizer is a versatile plugin that can be tweaked to be a compressor, an amplifier and a limiter. It is basically controlled by only two parameters: ceiling and threshold. Threshold is a relative value representing the amplification of the signal while ceiling is the maximum allowed output peak level. Setting both values different from zero, the plugin will act as an upward compressor with a limiter on the ceiling level (overly amplified signal with ceiling set too low can result in distorted sound even without the presence of clipping). When only threshold is set equal to zero, it reduces the amplitude of the signal.

PulseEffects uses the maximizer from ZamAudio.

<em style="strong" its:withinText="nested">Threshold</em>

Relative value representing the amplification of the signal. Zero is no amplification. Lower values, higher amplification.

<em style="strong" its:withinText="nested">Ceiling</em>

Maximum allowed peak level of the output signal.

<em style="strong" its:withinText="nested">Release</em>

Set the release in milliseconds.

easyeffects-4.8.7/help/C/multibandcompressor.page000066400000000000000000000113701424023573300221040ustar00rootroot00000000000000 Multiband Compressor

This kind of compressor splits the signal in four different frequency ranges. These ranges are compressed separately and mixed together afterwards again.

PulseEffects uses the multiband compressor developed by Calf Studio.

<em style="strong" its:withinText="nested">Attack</em>

Amount of milliseconds the signal has to rise above the threshold before gain reduction starts.

<em style="strong" its:withinText="nested">Release</em>

Amount of milliseconds the signal has to fall below the threshold before the reduction is decreased again.

<em style="strong" its:withinText="nested">Threshold</em>

If a signal rises above this level it will affect the gain reduction.

<em style="strong" its:withinText="nested">Ratio</em>

Set the ratio by which the signal will be reduced.

<em style="strong" its:withinText="nested">Knee</em>

Controls how smooth is the entrance in the gain reduction phase.

<em style="strong" its:withinText="nested">Makeup</em>

It amplifies your signal after processing.

<em style="strong" its:withinText="nested">Bypass</em>

Don't process anything, just bypass the signal of this strip.

<em style="strong" its:withinText="nested">Detection</em>

Choose if the multibandcompressor should take the signal peak for detection or the RMS value (it is smoother).

<em style="strong" its:withinText="nested">Solo</em>

Mute all strips not set to solo.

<em style="strong" its:withinText="nested">Mode</em>

The crossover mode. You can choose between the fourth order Linkwitz-Riley(LR4) and the eighth order Linkwitz-Riley(LR8).

<em style="strong" its:withinText="nested">Split 1/2</em>

Frequency that separates the sub band and the low band.

<em style="strong" its:withinText="nested">Split 2/3</em>

Frequency that separates the low band and the mid band.

<em style="strong" its:withinText="nested">Split 3/4</em>

Frequency that separates the mid band and the high band.

References

https://calf-studio-gear.org/doc/Multiband Compressor.html

https://en.wikipedia.org/wiki/Dynamic_range_compression

easyeffects-4.8.7/help/C/multibandgate.page000066400000000000000000000115501424023573300206300ustar00rootroot00000000000000 Multiband Gate

This kind of gate splits the signal in four different frequency ranges. These ranges are processed separately and mixed together afterwards again.

PulseEffects uses the multiband gate developed by Calf Studio.

<em style="strong" its:withinText="nested">Attack</em>

Amount of milliseconds the signal has to rise above the threshold before gain reduction starts.

<em style="strong" its:withinText="nested">Release</em>

Amount of milliseconds the signal has to fall below the threshold before the reduction is decreased again.

<em style="strong" its:withinText="nested">Reduction</em>

The level of reduction in this strip.

<em style="strong" its:withinText="nested">Threshold</em>

If a signal rises above this level it will affect the gain reduction.

<em style="strong" its:withinText="nested">Ratio</em>

Set the ratio by which the signal will be reduced.

<em style="strong" its:withinText="nested">Knee</em>

Controls how smooth is the entrance in the gain reduction phase.

<em style="strong" its:withinText="nested">Makeup</em>

It amplifies your signal after processing.

<em style="strong" its:withinText="nested">Bypass</em>

Don't process anything, just bypass the signal of this strip.

<em style="strong" its:withinText="nested">Detection</em>

Choose if the multibandgate should take the signal peak for detection or the RMS value (it is smoother).

<em style="strong" its:withinText="nested">Solo</em>

Mute all strips not set to solo.

<em style="strong" its:withinText="nested">Mode</em>

The crossover mode. You can choose between the fourth order Linkwitz-Riley(LR4) and the eighth order Linkwitz-Riley(LR8).

<em style="strong" its:withinText="nested">Split 1/2</em>

Frequency that separates the sub band and the low band.

<em style="strong" its:withinText="nested">Split 2/3</em>

Frequency that separates the low band and the mid band.

<em style="strong" its:withinText="nested">Split 3/4</em>

Frequency that separates the mid band and the high band.

References

https://calf-studio-gear.org/doc/Multiband Gate.html

https://en.wikipedia.org/wiki/Noise_gate

easyeffects-4.8.7/help/C/pitch.page000066400000000000000000000070011424023573300171130ustar00rootroot00000000000000 Pitch

Pitch shifting is a sound recording technique in which the original pitch of a sound is raised or lowered.

PulseEffects uses the pitch shifter from RubberBand.

<em style="strong" its:withinText="nested">Faster</em>

<em style="strong" its:withinText="nested">Preserve Formant</em>

Enable formant preservation when pitch shifting.

<em style="strong" its:withinText="nested">Cents</em>

Number of cents the pitch will increased or decreased.

<em style="strong" its:withinText="nested">Semitones</em>

Number of semitones the pitch will increased or decreased.

<em style="strong" its:withinText="nested">Octaves</em>

Number of octaves the pitch will increased or decreased.

<em style="strong" its:withinText="nested">Crispness</em>

0 - Disable phase resynchronisation at transients, phase lamination and use longer processing window.

1 - Use soft transient detector, disable phase lamination and use longer processing window.

2 - Disable phase resynchronisation at transients and phase lamination.

3 - Disable phase resynchronisation at transients.

References

https://en.wikipedia.org/wiki/Pitch_shift

https://breakfastquay.com/rubberband/

https://breakfastquay.com/rubberband/usage.txt

easyeffects-4.8.7/help/C/pulseaudio.page000066400000000000000000000030051424023573300201560ustar00rootroot00000000000000 Pulseaudio

PulseEffects has two GStreamer pipelines. One that applies effects for applications output and other that applies effects for microphone. Here the user can tweak a few advanced parameters for both pipelines.

<em style="strong" its:withinText="nested">Use Default</em>

Use default input or output device.

<em style="strong" its:withinText="nested">Buffer</em>

Pulsesrc plugin buffer size. It affects latency

<em style="strong" its:withinText="nested">Latency</em>

Pulsesrc plugin latency value.

<em style="strong" its:withinText="nested">Block Size</em>

This controls the size of the audio buffer. Higher values increase latency but decrease cpu usage of a few plugins.

easyeffects-4.8.7/help/C/reverb.page000066400000000000000000000073131424023573300172770ustar00rootroot00000000000000 Reverberation

Reverberation, in psychoacoustics and acoustics, is a persistence of sound after the sound is produced. A reverberation, or reverb, is created when a sound or signal is reflected causing a large number of reflections to build up and then decay as the sound is absorbed by the surfaces of objects in the space. Reverberation plugins can be used to artificially produce this effect.

PulseEffects uses the reverberation developed by Calf Studio.

<em style="strong" its:withinText="nested">Pre Delay</em>

Additional delay - corresponds to a distance between sound source and the nearest wall.

<em style="strong" its:withinText="nested">Decay Time</em>

Time it takes for reverberation to fade out.

<em style="strong" its:withinText="nested">Amount</em>

Amount of processed signal (reverberation) in the output.

<em style="strong" its:withinText="nested">Dry</em>

Amount of unprocessed signal in the output.

<em style="strong" its:withinText="nested">Bass Cut</em>

Removes low frequencies from the reverberation.

<em style="strong" its:withinText="nested">Treble Cut</em>

Removes high frequencies from the reverberation.

<em style="strong" its:withinText="nested">Diffusion</em>

Increase its value for less uniform reverberation.

<em style="strong" its:withinText="nested">Room Size</em>

Size of the space that simulated reverberation occurs in - determines times between reflections.

<em style="strong" its:withinText="nested">High Frequency Damping</em>

Cutoff reflections high frequencies - causes higher frequencies to decay faster.

References

https://en.wikipedia.org/wiki/Reverberation

https://calf-studio-gear.org/doc/Reverb.html

easyeffects-4.8.7/help/C/rnnoise.page000066400000000000000000000034361424023573300174710ustar00rootroot00000000000000 Noise Reduction

Noise reduction is the process of removing noise from a signal.

PulseEffects Noise Reduction is made on the library RNNoise which is based based on recurrent neural network, a class of artificial neural networks where connections between nodes form a directed graph along a temporal sequence. This allows it to exhibit temporal dynamic behavior.

Standard RNNoise Model is used and custom models can be imported to perform different types of noise reduction.

References

https://en.wikipedia.org/wiki/Noise_reduction

https://en.wikipedia.org/wiki/Recurrent_neural_network

https://github.com/xiph/rnnoise

easyeffects-4.8.7/help/C/saturated.page000066400000000000000000000011671424023573300200070ustar00rootroot00000000000000 Saturation Warning

If the audio signal coming out from the pipeline is too high very unpleasent noises will be produced. In case this happens the warning in the image above is shown so that the user can reduce the audio level using the limiter or the maximizer.

easyeffects-4.8.7/help/C/settingsmenu.page000066400000000000000000000005231424023573300205330ustar00rootroot00000000000000 Settings Menu easyeffects-4.8.7/help/C/spectrum.page000066400000000000000000000051531424023573300176540ustar00rootroot00000000000000 Spectrum <em style="strong" its:withinText="nested">Show</em>

Hide or show the spectrum.

<em style="strong" its:withinText="nested">Points</em>

Number of points displayed.

<em style="strong" its:withinText="nested">Height</em>

Spectrum height.

<em style="strong" its:withinText="nested">Scale</em>

Bar height scaling factor.

<em style="strong" its:withinText="nested">Exponent</em>

Scaling factor exponent.

<em style="strong" its:withinText="nested">Sampling</em>

Spectrum update frequency.

<em style="strong" its:withinText="nested">Line Width</em>

Bar line width.

<em style="strong" its:withinText="nested">Fill</em>

Draw filled bars.

<em style="strong" its:withinText="nested">Border</em>

Show bar border.

<em style="strong" its:withinText="nested">Use Custom Color</em>

Use a user defined color or the GTK theme color.

<em style="strong" its:withinText="nested">Spectrum Color</em>

User defined color.

easyeffects-4.8.7/help/C/stereotools.page000066400000000000000000000063241424023573300203750ustar00rootroot00000000000000 Stereo Tools

PulseEffects uses the stereo tools developed by Calf Studio.

<em style="strong" its:withinText="nested">Softclip</em>

Do kind of analog distortion instead of harsh digital 0db clipping.

<em style="strong" its:withinText="nested">Balance</em>

Set the balance between both channels.

<em style="strong" its:withinText="nested">S/C Level</em>

<em style="strong" its:withinText="nested">Mode</em>

Choose normal stereo behavior (LR - LR) or convert between MS and LR.

<em style="strong" its:withinText="nested">Side Level</em>

The level of the side signal.

<em style="strong" its:withinText="nested">Side Balance</em>

The balance of the side signal.

<em style="strong" its:withinText="nested">Middle Level</em>

Middle signal position in the stereo panorama.

<em style="strong" its:withinText="nested">Delay L/R</em>

Delay the left or the right channel (milliseconds). Negative values delay the left channel and positive values the right channel.

<em style="strong" its:withinText="nested">Stereo Base</em>

Set the stereo base of your material seamless between Mono and inverted Channels.

<em style="strong" its:withinText="nested">Stereo Phase</em>

Set the stereo phase of your material.

References

https://calf-studio-gear.org/doc/Stereo%20Tools.html

easyeffects-4.8.7/help/C/testsignals.page000066400000000000000000000005361424023573300203520ustar00rootroot00000000000000 Test Signals

These signals can be used to test the frequency response of your speakers.

easyeffects-4.8.7/help/C/userpresets.page000066400000000000000000000017271424023573300204010ustar00rootroot00000000000000 Creating and Importing User Presets

You can save your own presets. Just add write a name and click on the add button. Presets can be imported clicking on the button to the left.

When you save a preset the current configuration of all plugins is saved to its file. This means you can have presets that combine the effects of different plugins.

You can also make a preset autoload when an input or output device is added to the system. Just click on the button with curved arrows while the desired device is selected as the system default device.

easyeffects-4.8.7/help/C/webrtc.page000066400000000000000000000125021424023573300172740ustar00rootroot00000000000000 Webrtc

PulseEffects uses the webrtc from GStreamer. This plugin offers a voice enhancement filter based on WebRTC Audio Processing library. This library provides a broad variety of enhancement algorithms. This plugin tries to enable as many of those as possible. The currently enabled enhancements are High Pass Filter, Echo Canceller, Noise Suppression, Automatic Gain Control, and some extended filters.

Echo Canceller <em style="strong" its:withinText="nested">Extended Filter</em>

Enabled or disables the extended filter.

<em style="strong" its:withinText="nested">High Pass Filter</em>

Enables or disables the high pass filter.

<em style="strong" its:withinText="nested">Delay Agnostic</em>

Enables or disables the delay agnostic mode.

<em style="strong" its:withinText="nested">Suppression Level</em>

Controls the aggressiveness of the suppressor. A higher level trades off double-talk performance for increased echo suppression.

Noise Suppressor <em style="strong" its:withinText="nested">Suppression Level</em>

Controls the aggressiveness of the suppression. Increasing the level will reduce the noise level at the expense of a higher speech distortion.

Gain Controller <em style="strong" its:withinText="nested">Mode</em>

Controls the mode of the compression stage.

Compressor <em style="strong" its:withinText="nested">Limiter</em>

When enabled, the compression stage will hard limit the signal to the target level. Otherwise, the signal will be compressed but not limited above the target level.

<em style="strong" its:withinText="nested">Target Level</em>

Sets the target peak level of the gain control in dBFS (decibels from digital full-scale).

<em style="strong" its:withinText="nested">Maximum Gain</em>

Sets the maximum gain the digital compression stage may apply.

Voice Detector <em style="strong" its:withinText="nested">Detection Likelihood</em>

Specifies the likelihood that a frame will be declared to contain voice.

<em style="strong" its:withinText="nested">Frame Size</em>

Sets the size of the frames in ms on which the VAD will operate. Larger frames will improve detection accuracy, but reduce the frequency of updates.

References

https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad/html/gst-plugins-bad-plugins-webrtcdsp.html

easyeffects-4.8.7/help/LINGUAS000066400000000000000000000000221424023573300160050ustar00rootroot00000000000000it_IT pt_BR ru de easyeffects-4.8.7/help/de/000077500000000000000000000000001424023573300153565ustar00rootroot00000000000000easyeffects-4.8.7/help/de/de.po000066400000000000000000004110511424023573300163100ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2020-11-22 18:51+0100\n" "PO-Revision-Date: 2020-01-12 17:48+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Put one translator per line, in the form NAME , YEAR1, YEAR2 msgctxt "_" msgid "translator-credits" msgstr "David Keller , 2020" #. (itstool) path: page/title #: C/bassenhancer.page:9 msgid "Bass Enhancer" msgstr "Bassverstärker" #. (itstool) path: page/p #: C/bassenhancer.page:10 msgid "" "The brain perceives the pitch of a tone not only by its fundamental " "frequency but also by the periodicity implied by the relationship between " "the higher harmonics. We may perceive the same pitch even if the fundamental " "frequency is missing from a tone." msgstr "" "Das Gehirn nimmt die Tonhöhe eines Tones nicht nur durch seine Grundfrequenz " "wahr, sondern auch durch die Periodizität, die durch die Beziehung zwischen " "den höheren Harmonischen impliziert wird. Wir können die gleiche Tonhöhe " "auch dann wahrnehmen, wenn die Grundfrequenz in einem Ton fehlt." #. (itstool) path: page/p #: C/bassenhancer.page:16 msgid "PulseEffects uses the bass enhancer developed by Calf Studio." msgstr "PulseEffects verwendet den Bassverstärker von Calf Studio." #. (itstool) path: title/em #: C/bassenhancer.page:22 C/exciter.page:21 C/reverb.page:40 msgid "Amount" msgstr "Betrag" #. (itstool) path: item/p #: C/bassenhancer.page:24 C/exciter.page:23 msgid "Amount of harmonics added to the original signal." msgstr "Betrag der Obertöne, die dem Originalsignal hinzugefügt wird." #. (itstool) path: title/em #: C/bassenhancer.page:30 C/exciter.page:29 msgid "Harmonics" msgstr "Obertöne" #. (itstool) path: item/p #: C/bassenhancer.page:32 C/exciter.page:31 msgid "Amount of newly created harmonics." msgstr "Betrag der neu erstellten Obertöne." #. (itstool) path: title/em #: C/bassenhancer.page:38 C/exciter.page:37 msgid "Scope" msgstr "Bereich" #. (itstool) path: item/p #: C/bassenhancer.page:40 C/exciter.page:39 msgid "The frequency harmonics are produced above." msgstr "Die Frequenzobertöne werden darüber erzeugt." #. (itstool) path: title/em #: C/bassenhancer.page:46 msgid "Floor(button)" msgstr "Boden(Knopf)" #. (itstool) path: item/p #: C/bassenhancer.page:48 msgid "Constrain the enhancement on the lower end." msgstr "Beschränke die Verstärkung auf das untere Ende." #. (itstool) path: title/em #: C/bassenhancer.page:54 msgid "Floor(value)" msgstr "Boden(Wert)" #. (itstool) path: item/p #: C/bassenhancer.page:56 msgid "The frequency no harmonics are produced below." msgstr "Die Frequenz, unter der keine Obertöne erzeugt werden." #. (itstool) path: title/em #: C/bassenhancer.page:62 C/exciter.page:61 msgid "Blend Harmonics" msgstr "Oberwellen mischen" #. (itstool) path: item/p #: C/bassenhancer.page:64 C/exciter.page:63 msgid "The \"colour\" (or octave) of the harmonics." msgstr "Die \"Farbe\" (oder Oktave) der Obertöne." #. (itstool) path: title/em #: C/bassenhancer.page:70 C/compressor.page:97 C/exciter.page:69 msgid "Listen" msgstr "Zuhören" #. (itstool) path: item/p #: C/bassenhancer.page:72 C/exciter.page:71 msgid "Mute the original signal and listen to the harmonics exclusively." msgstr "" "Schaltet das Originalsignal stumm und spielt ausschließlich die Obertöne ab." #. (itstool) path: section/title #: C/bassenhancer.page:78 C/compressor.page:266 C/deesser.page:111 #: C/exciter.page:77 C/filter.page:47 C/gate.page:96 C/delay.page:33 #: C/limiter.page:100 C/loudness.page:56 C/multibandcompressor.page:128 #: C/multibandgate.page:136 C/reverb.page:97 C/stereotools.page:96 #: C/crossfeed.page:35 C/equalizer.page:251 C/pitch.page:87 C/webrtc.page:140 #: C/crystalizer.page:53 C/convolver.page:42 C/autogain.page:76 #: C/rnnoise.page:24 msgid "References" msgstr "Referenzen" #. (itstool) path: page/title #. (itstool) path: section/title #: C/compressor.page:9 C/webrtc.page:84 msgid "Compressor" msgstr "Kompressor" #. (itstool) path: page/p #: C/compressor.page:10 msgid "A compressor is used to reduce the audio signal dynamic range." msgstr "" "Ein Kompressor wird verwendet, um den Dynamikbereich des Audiosignals zu " "reduzieren." #. (itstool) path: page/p #: C/compressor.page:13 msgid "PulseEffects uses the compressor from Linux Studio Plugins." msgstr "PulseEffects verwendet den Kompressor von Linux Studio Plugins." #. (itstool) path: title/em #: C/compressor.page:20 C/gate.page:20 C/multibandcompressor.page:20 #: C/multibandgate.page:20 msgid "Attack" msgstr "Anstiegszeit" #. (itstool) path: item/p #: C/compressor.page:22 msgid "" "Attack determines how many milliseconds (ms) it takes your compressor to " "apply a full dose of compression to your audio signal once it passes the " "threshold. If the signal peaks above the threshold and quickly returns to " "below the threshold, it may never receive a full dose of compression." msgstr "" "Die Anstiegszeit bestimmt, wie viele Millisekunden (ms) der Kompressor " "benötigt, um eine volle Dosis an Kompression auf das Audiosignal anzuwenden, " "sobald es die Schwelle passiert hat. Wenn das Signal über der Schwelle einen " "Spitzenwert erreicht und schnell wieder unter die Schwelle zurückkehrt, " "erhält es möglicherweise nie die volle Dosis an Kompression." #. (itstool) path: title/em #: C/compressor.page:31 C/gate.page:29 C/limiter.page:39 #: C/multibandcompressor.page:29 C/multibandgate.page:29 C/maximizer.page:44 msgid "Release" msgstr "Ausklingzeit" #. (itstool) path: item/p #: C/compressor.page:33 msgid "" "Release determines how many milliseconds (ms) it takes your compressor to " "stop attenuating gain once your audio signal drops below the threshold. A " "fast release will cause your compressor to stop attenuating gain quickly " "once the signal returns below the threshold. A slow release will cause your " "compressor to stop attenuating gain slowly once the signal returns below the " "threshold." msgstr "" "Die Ausklingzeit bestimmt, wie viele Millisekunden (ms) der Kompressor " "benötigt, um die Abschwächung der Verstärkung zu beenden, sobald das " "Audiosignal unter die Schwelle fällt. Eine schnelle Ausklingzeit bewirkt, " "dass der Kompressor die Abschwächung der Verstärkung schnell beendet, sobald " "das Signal wieder unter die Schwelle fällt. Eine langsame Ausklingzeit " "bewirkt, dass der Kompressor die Abschwächung der Verstärkung langsam " "beendet, sobald das Signal wieder unter die Schwelle fällt." #. (itstool) path: title/em #: C/compressor.page:43 C/deesser.page:26 C/gate.page:38 #: C/multibandcompressor.page:38 C/multibandgate.page:46 C/maximizer.page:27 msgid "Threshold" msgstr "Schwelle" #. (itstool) path: item/p #: C/compressor.page:45 msgid "If a signal surpass this level it will trigger the compression stage." msgstr "" "Wenn ein Signal diesen Pegel überschreitet, löst es die Kompressionsstufe " "aus." #. (itstool) path: title/em #: C/compressor.page:51 C/deesser.page:34 C/gate.page:46 #: C/multibandcompressor.page:46 C/multibandgate.page:54 msgid "Ratio" msgstr "Verhältnis" #. (itstool) path: item/p #: C/compressor.page:53 C/deesser.page:36 C/gate.page:48 #: C/multibandcompressor.page:48 C/multibandgate.page:56 msgid "Set the ratio by which the signal will be reduced." msgstr "Setze das Verhältnis, bei welchem das Signal reduziert wird." #. (itstool) path: title/em #: C/compressor.page:59 C/gate.page:54 C/multibandcompressor.page:54 #: C/multibandgate.page:62 msgid "Knee" msgstr "Übergang" #. (itstool) path: item/p #: C/compressor.page:61 C/gate.page:56 C/multibandcompressor.page:56 #: C/multibandgate.page:64 msgid "Controls how smooth is the entrance in the gain reduction phase." msgstr "" "Regelt, wie sanft der Eintritt in die Phase der Amplitudenreduktion erfolgt." #. (itstool) path: title/em #: C/compressor.page:67 C/deesser.page:42 C/gate.page:62 #: C/multibandcompressor.page:62 C/multibandgate.page:70 msgid "Makeup" msgstr "Hebung" #. (itstool) path: item/p #: C/compressor.page:69 C/deesser.page:44 C/gate.page:64 #: C/multibandcompressor.page:64 C/multibandgate.page:72 msgid "It amplifies your signal after processing." msgstr "Es verstärkt das Signal nach der Verarbeitung." #. (itstool) path: title/em #: C/compressor.page:75 msgid "Compression Mode" msgstr "Kompressionsmodus" #. (itstool) path: item/p #: C/compressor.page:79 msgid "" "Downward - Decreases the amplitude of the signal " "sections that are above the threshold." msgstr "" "Abwärts - Verringert die Amplitude der " "Signalabschnitte, die über dem Schwellwert liegen." #. (itstool) path: item/p #: C/compressor.page:84 msgid "" "Upwards - Increases the amplitude of the signal " "sections that are below the threshold." msgstr "" "Aufwärts - Erhöht die Amplitude der " "Signalabschnitte, die unter dem Schwellwert liegen." #. (itstool) path: section/title #: C/compressor.page:93 msgid "Sidechain" msgstr "Sidechain" #. (itstool) path: item/p #: C/compressor.page:99 msgid "Allows to listen the processed sidechain signal." msgstr "Ermöglicht das Abhören des bearbeiteten Sidechain-Signals." #. (itstool) path: title/em #: C/compressor.page:105 C/equalizer.page:99 msgid "Type" msgstr "Typ" #. (itstool) path: item/p #: C/compressor.page:109 msgid "" "Feed-forward - The sidechain input is connected to " "compressor's input. More aggressive compression." msgstr "" "Feed-forward - Der Sidechain-Eingang wird mit dem " "Eingang des Kompressors verbunden. Aggressivere Kompression." #. (itstool) path: item/p #: C/compressor.page:115 msgid "" "Feed-back - The sidechain input is connected to " "compressor's output. Vintage-style more accurate compression." msgstr "" "Feed-back - Der Sidechain-Eingang wird mit dem " "Ausgang des Kompressors verbunden. Eine genauere Kompression im Vintage-Stil." #. (itstool) path: title/em #: C/compressor.page:124 C/deesser.page:103 C/multibandcompressor.page:95 #: C/multibandgate.page:103 C/stereotools.page:38 C/equalizer.page:23 #: C/equalizer.page:146 C/webrtc.page:75 msgid "Mode" msgstr "Modus" #. (itstool) path: item/p #: C/compressor.page:128 msgid "Peak - Measure signal's peak." msgstr "Hochpunkt - Misst die Signalspitzen." #. (itstool) path: item/p #: C/compressor.page:134 msgid "RMS - Root mean square of the input signal." msgstr "" "RMS - Quadratischer Mittelwert des Eingangssignals." #. (itstool) path: item/p #: C/compressor.page:140 msgid "" "Low-Pass - Input signal is processed by a low-pass " "filter." msgstr "" "Tiefenpass - Das Eingangssignal wird mit einem " "Tiefpassfilter bearbeitet." #. (itstool) path: item/p #: C/compressor.page:146 msgid "" "Uniform - Input signal is processed by a uniform " "filter." msgstr "" "Einheitlich - Das Eingangssignal wird durch einen " "Einheitsfilter bearbeitet." #. (itstool) path: title/em #: C/compressor.page:155 msgid "Source" msgstr "Quelle" #. (itstool) path: item/p #: C/compressor.page:159 msgid "" "Middle - Middle part of signal is used for " "sidechain processing." msgstr "" "Mitte - Der mittlere Teil des Signals wird für die " "Sidechain-Verarbeitung verwendet." #. (itstool) path: item/p #: C/compressor.page:165 msgid "" "Side - Side part of signal is used for sidechain " "processing." msgstr "" "Seite - Der seitliche Teil des Signals wird für " "die Sidechain-Verarbeitung verwendet." #. (itstool) path: item/p #: C/compressor.page:171 msgid "" "Left - Only left channel is used for sidechain " "processing." msgstr "" "Links - Der linke Teil des Signals wird für die " "Sidechain-Verarbeitung verwendet." #. (itstool) path: item/p #: C/compressor.page:177 msgid "" "Right - Only right channel is used for sidechain " "processing." msgstr "" "Rechts - Der rechte Teil des Signals wird für die " "Sidechain-Verarbeitung verwendet." #. (itstool) path: title/em #: C/compressor.page:186 msgid "Pre-amplification" msgstr "Vorverstärkung" #. (itstool) path: item/p #: C/compressor.page:188 msgid "Pre-amplification of the sidechain signal." msgstr "Vorverstärkung des Sidechain-Signals." #. (itstool) path: title/em #: C/compressor.page:194 msgid "Reactivity" msgstr "Reaktivität" #. (itstool) path: item/p #: C/compressor.page:196 msgid "Reactivity of the sidechain signal." msgstr "Reaktivität des Sidechain-Signals." #. (itstool) path: title/em #: C/compressor.page:202 C/limiter.page:30 msgid "Lookahead" msgstr "Ausblick" #. (itstool) path: item/p #: C/compressor.page:204 msgid "Look-ahead time of the sidechain relative to the input signal." msgstr "Vorlaufzeit der Sidechain relativ zum Eingangssignal." #. (itstool) path: section/title #: C/compressor.page:211 msgid "Advanced" msgstr "" #. (itstool) path: title/em #: C/compressor.page:215 msgid "Relative Release Threshold" msgstr "" #. (itstool) path: item/p #: C/compressor.page:217 msgid "" "Relative to the Attack Threshold that sets up the threshold of Release Time." msgstr "" #. (itstool) path: title/em #: C/compressor.page:223 #, fuzzy msgid "Boost Threshold" msgstr "Schwelle" #. (itstool) path: item/p #: C/compressor.page:225 msgid "" "Related to upward compression mode only. It defines the threshold below " "which the constant amplification will be applied to the input signal. This " "prevents the compressor from applying infinite amplification to very quiet " "signals." msgstr "" #. (itstool) path: title/em #: C/compressor.page:233 #, fuzzy msgid "High-pass Filter Mode" msgstr "Hochpassfilter" #. (itstool) path: item/p #: C/compressor.page:235 msgid "Sets the type of the high-pass filter applied to sidechain signal." msgstr "" #. (itstool) path: title/em #: C/compressor.page:241 #, fuzzy msgid "High-pass Frequency" msgstr "Hochfrequenz-Dämpfung" #. (itstool) path: item/p #: C/compressor.page:243 #, fuzzy msgid "Sets the cut-off frequency of the high-pass filter." msgstr "Die Mitten- oder Grenzfrequenz des Filters." #. (itstool) path: title/em #: C/compressor.page:249 #, fuzzy msgid "Low-pass Filter Mode" msgstr "Grenzfrequenz des Tiefpassfilters." #. (itstool) path: item/p #: C/compressor.page:251 #, fuzzy msgid "Sets the type of the low-pass filter applied to sidechain signal." msgstr "Ermöglicht das Abhören des bearbeiteten Sidechain-Signals." #. (itstool) path: title/em #: C/compressor.page:257 #, fuzzy msgid "Low-pass Frequency" msgstr "Grenzfrequenz des Tiefpassfilters." #. (itstool) path: item/p #: C/compressor.page:259 #, fuzzy msgid "Sets the cut-off frequency of the low-pass filter." msgstr "Die Mitten- oder Grenzfrequenz des Filters." #. (itstool) path: page/title #: C/deesser.page:9 msgid "Deesser" msgstr "Deesser" #. (itstool) path: page/p #: C/deesser.page:10 msgid "" "PulseEffects uses the deesser developed by Calf Studio. A deesser is used to " "dynamically reduce high frequencies. The standard field of use is the " "reduction of \"sssss\" and \"shhhh\" in vocal tracks." msgstr "" "PulseEffects verwendet den Deesser von Calf Studio. Ein Deesser wird " "verwendet, um hohe Frequenzen dynamisch zu reduzieren. Das " "Standardeinsatzgebiet ist die Reduktion von \"sssss\" und \"shhhh\" in " "Gesangsspuren." #. (itstool) path: title/em #: C/deesser.page:18 msgid "Laxity" msgstr "Nachgiebigkeit" #. (itstool) path: item/p #: C/deesser.page:20 msgid "" "The reaction of the deesser. Higher values won't affect really short peaks." msgstr "" "Die Reaktion des Deessers. Hohe Werte haben keinen Einfluss auf kurze " "Ausschläge." #. (itstool) path: item/p #: C/deesser.page:28 C/multibandcompressor.page:40 C/multibandgate.page:48 msgid "If a signal rises above this level it will affect the gain reduction." msgstr "" "Übersteigt ein Signal diesen Wert, wird die Amplitudenreduktion beeinflusst." #. (itstool) path: title/em #: C/deesser.page:50 #, fuzzy msgid "F1 Split" msgstr "Teilen" #. (itstool) path: item/p #: C/deesser.page:52 msgid "" "The split frequency. All signals above this frequency will affect the gain " "reduction (and in split mode they are affected by the reduction too)." msgstr "" "Die Teilungsfrequenz. Alle Signale oberhalb dieser Frequenz wirken sich auf " "die Amplitudenreduktion aus (und im Teilen-Modus werden sie ebenfalls von " "der Reduktion betroffen)." #. (itstool) path: title/em #: C/deesser.page:59 #, fuzzy msgid "F1 Gain" msgstr "Verstärkung" #. (itstool) path: item/p #: C/deesser.page:61 msgid "" "It shifts the volume of the higher band. In wideband mode it affects the " "sidechain. In split mode it also affects the processed high frequencies." msgstr "" "Verschiebt die Lautstärke des hohen Bandes. Im Breitbandmodus wirkt es sich " "auf die Sidechain aus. Im Teilen-Modus wirkt es auch auf die verarbeiteten " "hohen Frequenzen." #. (itstool) path: title/em #: C/deesser.page:68 #, fuzzy msgid "F2 Peak" msgstr "Hochpunkt" #. (itstool) path: item/p #: C/deesser.page:70 msgid "" "Center frequency of the bell filter. It allows a more precise selection of " "the sidechain signal." msgstr "" "Mittenfrequenz des Glockenfilters. Ermöglicht eine genauere Auswahl des " "Sidechain-Signals." #. (itstool) path: title/em #: C/deesser.page:77 #, fuzzy msgid "F2 Level" msgstr "Ebene" #. (itstool) path: item/p #: C/deesser.page:79 msgid "Increase or decrease the frequencies around the center bell frequency." msgstr "Erhöht oder verringert die Frequenzen um die mittlere Glockenfrequenz." #. (itstool) path: title/em #: C/deesser.page:85 #, fuzzy msgid "F2 Peak Q" msgstr "Höchstwert Q" #. (itstool) path: item/p #: C/deesser.page:87 msgid "" "Set the quality of the bell. Higher values will affect a narrower frequency " "range. Lower values will affect a wider band." msgstr "" "Legt die Qualität der Glocke fest. Höhere Werte beeinflussen einen engeren " "Frequenzbereich. Niedrigere Werte beeinflussen ein breiteres Band." #. (itstool) path: title/em #: C/deesser.page:94 C/gate.page:79 C/multibandcompressor.page:78 #: C/multibandgate.page:86 msgid "Detection" msgstr "Erkennung" #. (itstool) path: item/p #: C/deesser.page:96 msgid "" "Choose if the deesser should take the signal peak for detection or the RMS " "value (it is smoother)." msgstr "" "Wähle, ob der Deesser die Signalspitze oder den RMS-Wert (glatter) für die " "Erkennung nehmen soll." #. (itstool) path: item/p #: C/deesser.page:105 msgid "Select your operation mode between wideband or split" msgstr "Wähle die Betriebsart zwischen Breitband und Teilen" #. (itstool) path: page/title #: C/exciter.page:9 msgid "Exciter" msgstr "Exciter" #. (itstool) path: page/p #: C/exciter.page:10 msgid "" "An exciter is used to enhance a signal by dynamic equalization, phase " "manipulation, harmonic synthesis of high frequency signals, and through the " "addition of subtle harmonic distortion." msgstr "" "Ein Exciter wird verwendet, um ein Signal durch dynamisches Equalizen, " "Phasenmanipulieren, harmonisches Synthetisieren von Hochfrequenzsignalen und " "durch das Hinzufügen subtiler harmonischer Verzerrungen zu verbessern." #. (itstool) path: page/p #: C/exciter.page:15 msgid "PulseEffects uses the exciter developed by Calf Studio." msgstr "PulseEffects verwendet den Exciter von Calf Studio." #. (itstool) path: title/em #: C/exciter.page:45 msgid "Ceiling(button)" msgstr "Grenze(Knopf)" #. (itstool) path: item/p #: C/exciter.page:47 msgid "Constrain the excitement on the upper end." msgstr "Begrenzt die Aufregung auf das obere Ende." #. (itstool) path: title/em #: C/exciter.page:53 msgid "Ceiling(value)" msgstr "Grenze(Betrag)" #. (itstool) path: item/p #: C/exciter.page:55 msgid "The frequency no harmonics are produced above." msgstr "Die Frequenz, über der keine Obertöne erzeugt werden." #. (itstool) path: page/title #: C/filter.page:9 msgid "Filter" msgstr "Filter" #. (itstool) path: page/p #: C/filter.page:10 msgid "" "Audio filters can amplify (boost), pass or attenuate (cut) some frequency " "ranges." msgstr "" "Audiofilter können einige Frequenzbereiche verstärken, durchlassen oder " "abschwächen (abschneiden)." #. (itstool) path: page/p #: C/filter.page:14 msgid "" "PulseEffects uses the filter from Calf Studio. It can be used to remove " "defined parts of a frequency spectrum." msgstr "" "PulseEffects verwendet den Filter von Calf Studio. Mit ihm können definierte " "Teile eines Frequenzspektrums entfernt werden." #. (itstool) path: title/em #: C/filter.page:21 C/equalizer.page:224 msgid "Frequency" msgstr "Frequenz" #. (itstool) path: item/p #: C/filter.page:23 msgid "The center or cut-off frequency of the filter." msgstr "Die Mitten- oder Grenzfrequenz des Filters." #. (itstool) path: title/em #: C/filter.page:29 msgid "Resonance" msgstr "Resonanz" #. (itstool) path: item/p #: C/filter.page:31 msgid "" "Add an accentuation to the center frequency. When used on a bandpass the " "surrounding frequencies are decreased in level and the band gets more " "narrow, a bandreject is narrowed down to a thin needle." msgstr "" "Fügt der Mittenfrequenz eine Betonung hinzu. Beim Einsatz auf einem Bandpass " "werden die umgebenden Frequenzen im Pegel abgesenkt und das Band wird " "schmaler, ein Bandreject wird auf eine dünne Nadel eingegrenzt." #. (itstool) path: title/em #: C/filter.page:39 msgid "Inertia" msgstr "Trägheit" #. (itstool) path: item/p #: C/filter.page:41 msgid "Smooths the jumps between frequencies." msgstr "Glättet die Sprünge zwischen den Frequenzen." #. (itstool) path: page/title #: C/gate.page:9 msgid "Gate" msgstr "Gate" #. (itstool) path: page/p #: C/gate.page:10 msgid "" "Gates attenuate signals that register below the threshold. This kind of " "signal processing reduces disturbing noise between useful signals." msgstr "" "Gates dämpfen Signale, die unterhalb des Schwellwerts liegen. Diese Art der " "Signalverarbeitung reduziert störendes Rauschen zwischen den Nutzsignalen." #. (itstool) path: page/p #: C/gate.page:14 msgid "PulseEffects uses the gate developed by Calf Studio." msgstr "PulseEffects verwendet das von Calf Studio entwickelte Gate." #. (itstool) path: item/p #: C/gate.page:22 #, fuzzy msgid "" "Amount of milliseconds the signal has to rise above the threshold before " "gain reduction stops." msgstr "" "Anzahl der Millisekunden, die das Signal über die Schwelle steigen muss, " "bevor die Amplitudenreduktion beginnt." #. (itstool) path: item/p #: C/gate.page:31 #, fuzzy msgid "" "Amount of milliseconds the signal has to fall below the threshold before the " "reduction is increased again." msgstr "" "Anzahl der Millisekunden, die das Signal unter die Schwelle fallen muss, " "bevor die Reduktion wieder verringert wird." #. (itstool) path: item/p #: C/gate.page:40 #, fuzzy msgid "If a signal rises above this level the gain reduction is released." msgstr "" "Übersteigt ein Signal diesen Wert, wird die Amplitudenreduktion beeinflusst." #. (itstool) path: title/em #: C/gate.page:70 msgid "Stereo Link" msgstr "Stereoverbindung" #. (itstool) path: item/p #: C/gate.page:72 msgid "" "Choose if the gain reduction is affected by the louder channel or by the " "average level between the channels." msgstr "" "Wähle, ob die Amplitudenreduktion durch den lauteren Kanal oder durch den " "Durchschnittspegel zwischen den Kanälen beeinflusst wird." #. (itstool) path: item/p #: C/gate.page:81 msgid "" "Choose if the gate should take the signal peak for detection or the RMS " "value (it is smoother)." msgstr "" "Wähle, ob das Gate die Signalspitze oder den RMS-Wert (glatter) für die " "Erkennung nehmen soll." #. (itstool) path: title/em #: C/gate.page:88 msgid "Gain Reduction" msgstr "Verstärkungsreduzierung" #. (itstool) path: item/p #: C/gate.page:90 msgid "The level of gain reduction when the signal is below the threshold." msgstr "" "Der Pegel der Verstärkungsreduzierung, wenn das Signal unter dem " "Schwellenwert liegt." #. (itstool) path: page/title #: C/delay.page:9 msgid "Delay" msgstr "Verzögerung" #. (itstool) path: page/p #: C/delay.page:10 msgid "" "This plugin allows to add short delay to each individual channel of the " "stereo channel" msgstr "" "Dieses Plugin erlaubt es, jedem einzelnen Kanal des Stereokanals ein kurzes " "Delay hinzuzufügen" #. (itstool) path: title/em #: C/delay.page:17 msgid "Left" msgstr "Links" #. (itstool) path: item/p #: C/delay.page:19 msgid "Left channel delay." msgstr "Verzögerung des linken Kanals." #. (itstool) path: title/em #: C/delay.page:25 msgid "Right" msgstr "Rechts" #. (itstool) path: item/p #: C/delay.page:27 msgid "Right channel delay." msgstr "Verzögerung des rechten Kanals." #. (itstool) path: page/title #: C/index.page:8 msgid "PulseEffects" msgstr "PulseEffects" #. (itstool) path: page/p #: C/index.page:9 msgid "" "PulseEffects applies audio effects to Pulseaudio applications. You can apply " "effects to applications output or to your microphone before sending its " "audio to a recording application." msgstr "" "PulseEffects wendet Audioeffekte auf Pulseaudio-Anwendungen an. Du kannst " "Effekte auf die Ausgabe von Anwendungen oder auf dein Mikrofon anwenden, " "bevor die Audiodaten an eine Aufnehmende Anwendung gesendet werden." #. (itstool) path: section/title #: C/index.page:11 msgid "Guides" msgstr "Anleitungen" #. (itstool) path: section/title #: C/index.page:14 msgid "User Interface" msgstr "Benutzeroberfläche" #. (itstool) path: section/title #: C/index.page:17 msgid "Plugins" msgstr "Plugins" #. (itstool) path: section/title #: C/index.page:20 msgid "Calibration" msgstr "Kalibrierung" #. (itstool) path: page/title #. (itstool) path: title/em #: C/limiter.page:9 C/limiter.page:18 C/webrtc.page:88 msgid "Limiter" msgstr "Limiter" #. (itstool) path: page/p #: C/limiter.page:10 msgid "" "A limiter allows signals below a specified input power or level to pass " "unaffected while attenuating (lowering) the peaks of stronger signals that " "exceed this threshold." msgstr "" "Ein Limiter lässt Signale unter einer bestimmten Eingangsleistung oder einem " "bestimmten Pegel unbeeinflusst passieren, während die Spitzen stärkerer " "Signale, die diesen Schwellenwert überschreiten, gedämpft (abgesenkt) werden." #. (itstool) path: page/p #: C/limiter.page:15 msgid "PulseEffects uses the limiter developed by Calf Studio." msgstr "PulseEffects verwendet den Limiter von Calf Studio." #. (itstool) path: title/em #: C/limiter.page:22 msgid "Limit" msgstr "Grenze" #. (itstool) path: item/p #: C/limiter.page:24 msgid "No signal above this level will pass through the limiter." msgstr "Kein Signal oberhalb dieses Pegels wird den Limiter passieren." #. (itstool) path: item/p #: C/limiter.page:32 msgid "" "The Limiter will reach its attenuation level in this amount of time (output " "will be delayed two times this time)." msgstr "" "Der Limiter erreicht in dieser Zeit seinen Dämpfungspegel (die Ausgabe wird " "in dieser Zeit zweimal verzögert)." #. (itstool) path: item/p #: C/limiter.page:41 msgid "Stop the attenuation after this amount of milliseconds." msgstr "Stoppt die Dämpfung nach dieser Anzahl an Millisekunden." #. (itstool) path: title/em #: C/limiter.page:47 msgid "Oversampling" msgstr "Überabtastung" #. (itstool) path: item/p #: C/limiter.page:49 msgid "" "Increase the signal sampling to better detect the peaks. The signal is " "downsampled after processing." msgstr "" "Erhöht die Signalabtastung zur besseren Erkennung der Signalspitzen. Das " "Signal wird nach der Verarbeitung heruntergesampelt." #. (itstool) path: title/em #: C/limiter.page:56 msgid "Automatic Smoothing Control" msgstr "" #. (itstool) path: item/p #: C/limiter.page:58 msgid "" "When gain reduction is always needed ASC takes care of releasing to an " "average reduction level rather than reaching a reduction of 0 in the release " "time." msgstr "" "Wenn die Amplitudenreduktion immer benötigt wird, kümmert sich ASC darum, " "dass die Freigabe auf einen mittleren Reduzierungspegel erfolgt, anstatt " "eine Reduzierung von 0 in der Freigabezeit zu erreichen." #. (itstool) path: title/em #: C/limiter.page:65 msgid "ASC Level" msgstr "ASC-Pegel" #. (itstool) path: item/p #: C/limiter.page:67 msgid "" "Select how much the release time is affected by ASC, 0 means nearly no " "changes in release time while 1 produces higher release times." msgstr "" "Wähle aus, wie stark die Ausklangszeit durch ASC beeinflusst wird, 0 " "bedeutet nahezu keine Veränderung der Ausklangszeit, während 1 höhere " "Ausklangszeiten erzeugt." #. (itstool) path: title/em #: C/limiter.page:74 msgid "Automatic Leveling" msgstr "" #. (itstool) path: item/p #: C/limiter.page:76 msgid "" "Raises the signal level adding the absolute value of the limit amount after " "the compression stage is performed. Enabling this feature the volume is " "automatically leveled at 0 db." msgstr "" #. (itstool) path: title/em #: C/limiter.page:84 msgid "Input Gain" msgstr "Eingabeverstärkung" #. (itstool) path: item/p #: C/limiter.page:86 #, fuzzy msgid "" "Raises or decrease the signal level before it is sent to the compression " "stage." msgstr "" "Erhöht die Tonlautstärke, bevor der Ton in die Kompressionsstufe geschickt " "wird." #. (itstool) path: title/em #: C/limiter.page:92 #, fuzzy msgid "Output Gain" msgstr "Eingabeverstärkung" #. (itstool) path: item/p #: C/limiter.page:94 #, fuzzy msgid "Raises or decrease the signal level after the compression stage." msgstr "" "Erhöht die Tonlautstärke, bevor der Ton in die Kompressionsstufe geschickt " "wird." #. (itstool) path: page/title #: C/loudness.page:9 msgid "Loudness Compensator" msgstr "" #. (itstool) path: page/p #: C/loudness.page:10 msgid "" "PulseEffects uses the loudness compensator from Linux Studio Plugins which " "applies equal loudness contour corrections to the input signal. This is a " "measure of sound pressure level (SPL), over the frequency spectrum, for " "which a listener perceives a constant loudness when presented with pure " "steady tones." msgstr "" #. (itstool) path: title/em #: C/loudness.page:20 #, fuzzy msgid "Input" msgstr "Eingabeverstärkung" #. (itstool) path: item/p #: C/loudness.page:22 msgid "" "The input gain settings, allows to adjust the level of the input signal to " "the desired level." msgstr "" #. (itstool) path: title/em #: C/loudness.page:29 msgid "Output" msgstr "Ausgang" #. (itstool) path: item/p #: C/loudness.page:31 msgid "" "The output volume of the signal with applied equal loudness contour, " "controls the loudness of the 1 kHz pure sine wave." msgstr "" #. (itstool) path: title/em #: C/loudness.page:38 msgid "Standard" msgstr "" #. (itstool) path: item/p #: C/loudness.page:40 msgid "Allows to select different equal loudness contour standards." msgstr "" #. (itstool) path: title/em #: C/loudness.page:46 #, fuzzy msgid "FFT Size" msgstr "Rahmengröße" #. (itstool) path: item/p #: C/loudness.page:48 msgid "" "Allows to select size of the fast Fourier transform frame used for the " "processing. The larger FFT frame is, the more precize the curve is " "approximated and the more latency the plugin introduces" msgstr "" #. (itstool) path: page/title #: C/multibandcompressor.page:9 msgid "Multiband Compressor" msgstr "Multiband-Kompressor" #. (itstool) path: page/p #: C/multibandcompressor.page:10 msgid "" "This kind of compressor splits the signal in four different frequency " "ranges. These ranges are compressed separately and mixed together afterwards " "again." msgstr "" "Diese Art von Kompressor teilt das Signal in vier verschiedene " "Frequenzbereiche auf. Diese Bereiche werden separat komprimiert und " "anschließend wieder zusammengemischt." #. (itstool) path: page/p #: C/multibandcompressor.page:14 msgid "PulseEffects uses the multiband compressor developed by Calf Studio." msgstr "PulseEffects verwendet den Multibandkompressor von Calf Studio." #. (itstool) path: item/p #: C/multibandcompressor.page:22 C/multibandgate.page:22 msgid "" "Amount of milliseconds the signal has to rise above the threshold before " "gain reduction starts." msgstr "" "Anzahl der Millisekunden, die das Signal über die Schwelle steigen muss, " "bevor die Amplitudenreduktion beginnt." #. (itstool) path: item/p #: C/multibandcompressor.page:31 C/multibandgate.page:31 msgid "" "Amount of milliseconds the signal has to fall below the threshold before the " "reduction is decreased again." msgstr "" "Anzahl der Millisekunden, die das Signal unter die Schwelle fallen muss, " "bevor die Reduktion wieder verringert wird." #. (itstool) path: title/em #: C/multibandcompressor.page:70 C/multibandgate.page:78 C/crystalizer.page:37 msgid "Bypass" msgstr "Umleitung" #. (itstool) path: item/p #: C/multibandcompressor.page:72 C/multibandgate.page:80 msgid "Don't process anything, just bypass the signal of this strip." msgstr "Verarbeite nichts, überbrücke einfach das Signal dieses Streifens." #. (itstool) path: item/p #: C/multibandcompressor.page:80 msgid "" "Choose if the multibandcompressor should take the signal peak for detection " "or the RMS value (it is smoother)." msgstr "" "Wähle, ob der Multiband-Kompressor die Signalspitze oder den RMS-Wert " "(glatter) für die Erkennung nehmen soll." #. (itstool) path: title/em #: C/multibandcompressor.page:87 C/multibandgate.page:95 C/equalizer.page:208 msgid "Solo" msgstr "Solo" #. (itstool) path: item/p #: C/multibandcompressor.page:89 C/multibandgate.page:97 msgid "Mute all strips not set to solo." msgstr "" "Alle Streifen, die nicht auf Solo eingestellt sind, werden stumm geschaltet." #. (itstool) path: item/p #: C/multibandcompressor.page:97 C/multibandgate.page:105 msgid "" "The crossover mode. You can choose between the fourth order Linkwitz-" "Riley(LR4) and the eighth order Linkwitz-Riley(LR8)." msgstr "" "Der Crossover-Modus. Du kannst zwischen der vierten Ordnung Linkwitz-" "Riley(LR4) und der achten Ordnung Linkwitz-Riley(LR8) wählen." #. (itstool) path: title/em #: C/multibandcompressor.page:104 C/multibandgate.page:112 msgid "Split 1/2" msgstr "1/2 Teilen" #. (itstool) path: item/p #: C/multibandcompressor.page:106 C/multibandgate.page:114 msgid "Frequency that separates the sub band and the low band." msgstr "Frequenz, die das Sub- und das Tiefband trennt." #. (itstool) path: title/em #: C/multibandcompressor.page:112 C/multibandgate.page:120 msgid "Split 2/3" msgstr "2/3 Teilen" #. (itstool) path: item/p #: C/multibandcompressor.page:114 C/multibandgate.page:122 msgid "Frequency that separates the low band and the mid band." msgstr "Frequenz, die das Tief- und Mittelband trennt." #. (itstool) path: title/em #: C/multibandcompressor.page:120 C/multibandgate.page:128 msgid "Split 3/4" msgstr "3/4 Teilen" #. (itstool) path: item/p #: C/multibandcompressor.page:122 C/multibandgate.page:130 msgid "Frequency that separates the mid band and the high band." msgstr "Frequenz, die das Mittelband und das Hochband trennt." #. (itstool) path: page/title #: C/multibandgate.page:9 msgid "Multiband Gate" msgstr "Multiband Gate" #. (itstool) path: page/p #: C/multibandgate.page:10 msgid "" "This kind of gate splits the signal in four different frequency ranges. " "These ranges are processed separately and mixed together afterwards again." msgstr "" "Bei dieser Art von Gate wird das Signal in vier verschiedene " "Frequenzbereiche aufgeteilt. Diese Bereiche werden separat bearbeitet und " "anschließend wieder zusammengemischt." #. (itstool) path: page/p #: C/multibandgate.page:14 msgid "PulseEffects uses the multiband gate developed by Calf Studio." msgstr "PulseEffects verwendet das Multiband-Gate von Calf Studio." #. (itstool) path: title/em #: C/multibandgate.page:38 msgid "Reduction" msgstr "Senkung" #. (itstool) path: item/p #: C/multibandgate.page:40 msgid "The level of reduction in this strip." msgstr "Die Stärke der Reduktion in diesem Streifen." #. (itstool) path: item/p #: C/multibandgate.page:88 msgid "" "Choose if the multibandgate should take the signal peak for detection or the " "RMS value (it is smoother)." msgstr "" "Wähle, ob das Multiband-Gate die Signalspitze oder den RMS-Wert (glatter) " "für die Erkennung nehmen soll." #. (itstool) path: page/title #: C/reverb.page:9 msgid "Reverberation" msgstr "Nachhall" #. (itstool) path: page/p #: C/reverb.page:10 msgid "" "Reverberation, in psychoacoustics and acoustics, is a persistence of sound " "after the sound is produced. A reverberation, or reverb, is created when a " "sound or signal is reflected causing a large number of reflections to build " "up and then decay as the sound is absorbed by the surfaces of objects in the " "space. Reverberation plugins can be used to artificially produce this effect." msgstr "" "Der Nachhall ist in der Psychoakustik und Akustik ein Fortbestehen des " "Schalls nach der Schallerzeugung. Ein Nachhall, oder Reverb, entsteht, wenn " "ein Schall oder ein Signal reflektiert wird, wobei sich eine große Anzahl " "von Reflexionen aufbaut und dann abklingt, wenn der Schall von den " "Oberflächen der Objekte im Raum absorbiert wird. Mit Hall-Plugins kann " "dieser Effekt künstlich erzeugt werden." #. (itstool) path: page/p #: C/reverb.page:17 msgid "PulseEffects uses the reverberation developed by Calf Studio." msgstr "PulseEffects verwendet den Nachhall von Calf Studio." #. (itstool) path: title/em #: C/reverb.page:23 msgid "Pre Delay" msgstr "Vorverzögerung" #. (itstool) path: item/p #: C/reverb.page:25 msgid "" "Additional delay - corresponds to a distance between sound source and the " "nearest wall." msgstr "" "Zusätzliche Verzögerung - entspricht dem Abstand zwischen der Schallquelle " "und der nächsten Wand." #. (itstool) path: title/em #: C/reverb.page:32 msgid "Decay Time" msgstr "Abklingzeit" #. (itstool) path: item/p #: C/reverb.page:34 msgid "Time it takes for reverberation to fade out." msgstr "Die Zeit bis zum Ausklingen des Nachhalls." #. (itstool) path: item/p #: C/reverb.page:42 msgid "Amount of processed signal (reverberation) in the output." msgstr "Menge des bearbeiteten Signals (Nachhall) im Ausgang." #. (itstool) path: title/em #: C/reverb.page:48 msgid "Dry" msgstr "Trocken" #. (itstool) path: item/p #: C/reverb.page:50 msgid "Amount of unprocessed signal in the output." msgstr "Menge des unverarbeiteten Signals im Ausgang." #. (itstool) path: title/em #: C/reverb.page:56 msgid "Bass Cut" msgstr "Bassschnitt" #. (itstool) path: item/p #: C/reverb.page:58 msgid "Removes low frequencies from the reverberation." msgstr "Entfernt tiefe Frequenzen aus dem Nachhall." #. (itstool) path: title/em #: C/reverb.page:64 msgid "Treble Cut" msgstr "Höhenschnitt" #. (itstool) path: item/p #: C/reverb.page:66 msgid "Removes high frequencies from the reverberation." msgstr "Entfernt hohe Frequenzen aus dem Nachhall." #. (itstool) path: title/em #: C/reverb.page:72 msgid "Diffusion" msgstr "Verbreitung" #. (itstool) path: item/p #: C/reverb.page:74 msgid "Increase its value for less uniform reverberation." msgstr "Erhöhe den Wert für weniger gleichmäßigen Nachhall." #. (itstool) path: title/em #: C/reverb.page:80 msgid "Room Size" msgstr "Raumgröße" #. (itstool) path: item/p #: C/reverb.page:82 msgid "" "Size of the space that simulated reverberation occurs in - determines times " "between reflections." msgstr "" "Die Größe des Raumes, in dem der simulierte Nachhall auftritt - bestimmt die " "Zeiten zwischen den Reflexionen." #. (itstool) path: title/em #: C/reverb.page:89 msgid "High Frequency Damping" msgstr "Hochfrequenz-Dämpfung" #. (itstool) path: item/p #: C/reverb.page:91 msgid "" "Cutoff reflections high frequencies - causes higher frequencies to decay " "faster." msgstr "" "Abgrenzung von Reflexionen hoher Frequenzen - bewirkt, dass höhere " "Frequenzen schneller abklingen." #. (itstool) path: page/title #: C/stereotools.page:9 msgid "Stereo Tools" msgstr "Stereowerkzeuge" #. (itstool) path: page/p #: C/stereotools.page:10 msgid "PulseEffects uses the stereo tools developed by Calf Studio." msgstr "PulseEffects verwendet die Stereotools von Calf Studio." #. (itstool) path: title/em #: C/stereotools.page:16 msgid "Softclip" msgstr "Softclip" #. (itstool) path: item/p #: C/stereotools.page:18 msgid "Do kind of analog distortion instead of harsh digital 0db clipping." msgstr "Mache eine Art analoge Verzerrung statt hartem digitalen 0db-Clipping." #. (itstool) path: title/em #: C/stereotools.page:24 msgid "Balance" msgstr "Balance" #. (itstool) path: item/p #: C/stereotools.page:26 msgid "Set the balance between both channels." msgstr "Stelle die Balance zwischen beiden Kanälen ein." #. (itstool) path: title/em #: C/stereotools.page:32 msgid "S/C Level" msgstr "S/C-Level" #. (itstool) path: item/p #: C/stereotools.page:40 msgid "Choose normal stereo behavior (LR - LR) or convert between MS and LR." msgstr "" "Wähle normales Stereoverhalten (LR - LR) oder konvertiere zwischen MS und LR." #. (itstool) path: title/em #: C/stereotools.page:46 msgid "Side Level" msgstr "Seitenebene" #. (itstool) path: item/p #: C/stereotools.page:48 msgid "The level of the side signal." msgstr "Der Pegel des Seitensignals." #. (itstool) path: title/em #: C/stereotools.page:54 msgid "Side Balance" msgstr "Seitenausgleich" #. (itstool) path: item/p #: C/stereotools.page:56 msgid "The balance of the side signal." msgstr "Die Balance des Seitensignals." #. (itstool) path: title/em #: C/stereotools.page:62 msgid "Middle Level" msgstr "Mittlere Ebene" #. (itstool) path: item/p #: C/stereotools.page:64 msgid "Middle signal position in the stereo panorama." msgstr "Mittlere Signalposition im Stereopanorama." #. (itstool) path: title/em #: C/stereotools.page:70 msgid "Delay L/R" msgstr "Verzögerung L/R" #. (itstool) path: item/p #: C/stereotools.page:72 msgid "" "Delay the left or the right channel (milliseconds). Negative values delay " "the left channel and positive values the right channel." msgstr "" "Verzögere den linken oder den rechten Kanal (Millisekunden). Negative Werte " "verzögern den linken Kanal und positive Werte den rechten Kanal." #. (itstool) path: title/em #: C/stereotools.page:79 msgid "Stereo Base" msgstr "Stereo Basis" #. (itstool) path: item/p #: C/stereotools.page:81 msgid "" "Set the stereo base of your material seamless between Mono and inverted " "Channels." msgstr "" "Stelle die Stereobasis deines Materials nahtlos zwischen Mono und " "invertierten Kanälen ein." #. (itstool) path: title/em #: C/stereotools.page:88 msgid "Stereo Phase" msgstr "Stereo Phase" #. (itstool) path: item/p #: C/stereotools.page:90 msgid "Set the stereo phase of your material." msgstr "Stelle die Stereophase deines Materials ein." #. (itstool) path: page/title #: C/maximizer.page:9 msgid "Maximizer" msgstr "Maximierer" #. (itstool) path: page/p #: C/maximizer.page:10 msgid "" "Maximizer is a versatile plugin that can be tweaked to be a compressor, an " "amplifier and a limiter. It is basically controlled by only two parameters: " "ceiling and threshold. Threshold is a relative value representing the " "amplification of the signal while ceiling is the maximum allowed output peak " "level. Setting both values different from zero, the plugin will act as an " "upward compressor with a limiter on the ceiling level (overly amplified " "signal with ceiling set too low can result in distorted sound even without " "the presence of clipping). When only threshold is set equal to zero, it " "reduces the amplitude of the signal." msgstr "" "Der Maximierer ist ein vielseitiges Plugin, das sich zu einem Kompressor, " "einem Verstärker und einem Limiter zusammenstellen lässt. Es wird im Grunde " "nur durch zwei Parameter gesteuert: Obergrenze und Schwellwert. Die Schwelle " "ist ein relativer Wert, der die Verstärkung des Signals repräsentiert, " "während die Obergrenze die maximal zulässige Ausgangsspitze ist. Wenn beide " "Werte von Null verschieden sind, wirkt das Plugin wie ein Aufwärtskompressor " "mit einem Limiter an der Obergrenze (ein zu stark verstärktes Signal mit zu " "niedrig eingestellter Obergrenze kann zu verzerrtem Klang führen, auch ohne " "das Vorhandensein von Clipping). Wenn nur der Schwellwert auf Null gesetzt " "wird, reduziert dies die Amplitude des Signals." #. (itstool) path: page/p #: C/maximizer.page:21 msgid "PulseEffects uses the maximizer from ZamAudio." msgstr "PulseEffects verwendet den Maximierer von ZamAudio." #. (itstool) path: item/p #: C/maximizer.page:29 msgid "" "Relative value representing the amplification of the signal. Zero is no " "amplification. Lower values, higher amplification." msgstr "" "Relativer Wert, der die Verstärkung des Signals darstellt. Null ist keine " "Verstärkung. Kleinere Werte, höhere Verstärkung." #. (itstool) path: title/em #: C/maximizer.page:36 msgid "Ceiling" msgstr "Grenze" #. (itstool) path: item/p #: C/maximizer.page:38 msgid "Maximum allowed peak level of the output signal." msgstr "Maximal zulässiger Spitzenpegel des Ausgangssignals." #. (itstool) path: item/p #: C/maximizer.page:46 msgid "Set the release in milliseconds." msgstr "Stelle die Ausklingzeit in Millisekunden ein." #. (itstool) path: page/title #: C/crossfeed.page:9 msgid "Crossfeed" msgstr "Crossfeed" #. (itstool) path: page/p #: C/crossfeed.page:10 msgid "" "PulseEffects uses the crossfeed from GStreamer. This plugin is based on the " "bs2b library and can be used to improve headphone listening of stereo audio " "records. It does so by mixing the left and right channel in a way that " "simulates a stereo speaker setup while using headphones." msgstr "" "PulseEffects verwendet den Crossfeed von GStreamer. Dieses Plugin basiert " "auf der bs2b-Bibliothek und kann zur Verbesserung des Kopfhörerhörens von " "Stereo-Audioaufnahmen verwendet werden. Dabei werden der linke und rechte " "Kanal so gemischt, dass ein Stereo-Lautsprecher-Setup bei Verwendung von " "Kopfhörern simuliert wird." #. (itstool) path: title/em #: C/crossfeed.page:19 msgid "Cutoff" msgstr "Abgrenzung" #. (itstool) path: item/p #: C/crossfeed.page:21 msgid "Low-pass filter cutoff frequency." msgstr "Grenzfrequenz des Tiefpassfilters." #. (itstool) path: title/em #: C/crossfeed.page:27 msgid "Feed" msgstr "Speisung" #. (itstool) path: item/p #: C/crossfeed.page:29 msgid "Amount of signal from a channel that is sent to the other." msgstr "" "Die Menge des von einem Kanal ausgehenden Signals, die an den anderen Kanal " "gesendet wird." #. (itstool) path: page/title #: C/equalizer.page:9 msgid "Equalizer" msgstr "Equalizer" #. (itstool) path: page/p #: C/equalizer.page:10 msgid "" "PulseEffects uses the parametric equalizer from Linux Studio Plugins. You " "can choose between 1 and 30 bands. You also can change the center frequency " "and the width of each band as needed. There are a few presets but at this " "moment all of them have only 10 bands. Presets with other number of bands " "may be added in the future." msgstr "" "PulseEffects verwendet den parametrischen Equalizer der Linux Studio " "Plugins. Man kann zwischen 1 und 30 Bändern wählen. Man kann auch die " "Mittenfrequenz und die Breite jedes Bandes nach Bedarf ändern. Es gibt ein " "paar Voreinstellungen, aber im Moment haben alle nur 10 Bänder. Presets mit " "einer anderen Anzahl von Bändern können in der Zukunft hinzugefügt werden." #. (itstool) path: section/title #: C/equalizer.page:18 msgid "Main Menu" msgstr "Hauptmenü" #. (itstool) path: item/p #: C/equalizer.page:27 msgid "" "IIR - Infinite Impulse Response filters, nonlinear " "minimal phase. In most cases does not add noticeable latency to output " "signal." msgstr "" "IIR - Unendliche Impulsantwortfilter, nichtlineare " "Minimalphase. Fügt dem Ausgangssignal in den meisten Fällen keine merkliche " "Latenz hinzu." #. (itstool) path: item/p #: C/equalizer.page:33 msgid "" "FIR - Finite Impulse Response filters with linear " "phase, finite approximation of equalizer's impulse response. Adds noticeable " "latency to output signal." msgstr "" "FIR - Endliche Impulsantwortfilter mit linearer " "Phase, endliche Annäherung an die Impulsantwort des Equalizers. Fügt dem " "Ausgangssignal eine spürbare Latenzzeit hinzu." #. (itstool) path: item/p #: C/equalizer.page:39 msgid "" "FFT - Fast Fourier Transform approximation of the " "frequency chart, linear phase. Adds noticeable latency to output signal." msgstr "" "FFT - Schnelle Fouriertransformations-Annäherung " "des Frequenzdiagramms, lineare Phase. Fügt dem Ausgangssignal eine spürbare " "Latenzzeit hinzu." #. (itstool) path: title/em #: C/equalizer.page:48 msgid "Bands" msgstr "Bereiche" #. (itstool) path: item/p #: C/equalizer.page:50 msgid "The number of equalizer bands." msgstr "Die Anzahl der Equalizer-Bänder." #. (itstool) path: title/em #: C/equalizer.page:56 msgid "Split Channels" msgstr "Kanäle trennen" #. (itstool) path: item/p #: C/equalizer.page:58 msgid "" "When this option is enabled it is possible to apply different equalizations " "to the left and the right channel." msgstr "" "Wenn diese Option aktiviert ist, ist es möglich, unterschiedliche Equalizer " "auf den linken und rechten Kanal anzuwenden." #. (itstool) path: title/em #: C/equalizer.page:65 msgid "Flat Response" msgstr "Glätten" #. (itstool) path: item/p #: C/equalizer.page:67 msgid "This function sets each band gain to 0." msgstr "Diese Funktion setzt jede Bandverstärkung auf 0." #. (itstool) path: title/em #: C/equalizer.page:73 msgid "Calculate Frequencies" msgstr "Frequenzen berechnen" #. (itstool) path: item/p #: C/equalizer.page:75 msgid "" "This function can be used to calculate the center frequencies and bandwidth " "of a graphic equalizer with the current number of selected bands. Useful " "when the user does not want the default number of 30 bands but has no idea " "about which frequencies and bandwidth he/she should choose." msgstr "" "Mit dieser Funktion können die Mittenfrequenzen und die Bandbreite eines " "Graphik-Equalizers mit der aktuellen Anzahl der ausgewählten Bänder " "berechnet werden. Nützlich, wenn man nicht die voreingestellte Anzahl von 30 " "Bändern wünscht, aber keine Ahnung hat, welche Frequenzen und Bandbreite man " "wählen soll." #. (itstool) path: title/em #: C/equalizer.page:84 msgid "Reset Equalizer" msgstr "Equalizer zurücksetzen" #. (itstool) path: item/p #: C/equalizer.page:86 msgid "Reset the equalizer to its default settings." msgstr "Setzt den Equalizer auf seine Standardeinstellungen zurück." #. (itstool) path: section/title #: C/equalizer.page:95 msgid "Band Menu" msgstr "Band-Menü" #. (itstool) path: item/p #: C/equalizer.page:103 msgid "Off - Filter is not working (turned off)." msgstr "Aus - Filter arbeitet nicht (ausgeschaltet)." #. (itstool) path: item/p #: C/equalizer.page:108 msgid "Bell - Bell filter with smooth peak/recess." msgstr "" "Klingel - Klingelfilter mit glatter Spitze/" "Aussparung." #. (itstool) path: item/p #: C/equalizer.page:113 msgid "" "High-pass - High-pass filter with rejection of low " "frequencies." msgstr "" "Hochpass - Hochpassfilter mit Unterdrückung der " "tiefen Frequenzen." #. (itstool) path: item/p #: C/equalizer.page:118 msgid "" "High-shelf - Shelving filter with adjustment of " "high frequency range." msgstr "" "Höhen-Kuhschwanzfilter - Kuhschwanzfilter mit " "Einstellung des hohen Frequenzbereichs." #. (itstool) path: item/p #: C/equalizer.page:123 msgid "" "Low-pass - Low-pass filter with rejection of high " "frequencies." msgstr "" "Tiefpass - Tiefpassfilter mit Unterdrückung der " "hohen Frequenzen." #. (itstool) path: item/p #: C/equalizer.page:128 msgid "" "Low-shelf - Shelving filter with adjustment of low " "frequencies." msgstr "" "Tiefen-Kuhschwanzfilter - Kuhschwanzfilter mit " "Anpassung der tiefen Frequenzen." #. (itstool) path: item/p #: C/equalizer.page:133 msgid "" "Notch - Notch filter with full rejection of " "selected frequency." msgstr "" "Badewannenfilter - Badewannenfilter mit voller " "Unterdrückung der gewählten Frequenz." #. (itstool) path: item/p #: C/equalizer.page:138 msgid "" "Resonance - Resonance filter wih sharp peak/recess." msgstr "" "Resonanz - Resonanzfilter mit scharfer Spitze/" "Aussparung." #. (itstool) path: item/p #: C/equalizer.page:150 msgid "" "RLC - Very smooth filters based on similar " "cascades of RLC contours." msgstr "" "RLC - Sehr glatte Filter, die auf ähnlichen " "Kaskaden von RLC-Konturen basieren." #. (itstool) path: item/p #: C/equalizer.page:155 msgid "" "BWC - Butterworth-Chebyshev-type-1 based filters. " "Does not affect Resonance and Notch filters." msgstr "" "BWC - Butterworth-Tschebyscheff-Typ-1 basierte " "Filter. Hat keinen Einfluss auf Resonanz- und Badewannenfilter." #. (itstool) path: item/p #: C/equalizer.page:161 msgid "" "LRX - Linkwitz-Riley based filters. Does not " "affect Resonance and Notch filters." msgstr "" "LRX - Linkwitz-Riley basierte Filter. Hat keinen " "Einfluss auf Resonanz- und Badewannenfilter." #. (itstool) path: item/p #: C/equalizer.page:166 msgid "" "APO - Digital biquad filters derived from canonic " "analog biquad prototypes digitalized through Bilinear transform. These are " "textbook filters <_:link-1/> which are implemented as in the <_:link-2/> " "software." msgstr "" "APO - Digitale Biquad-Filter, die von kanonischen " "analogen Biquad-Prototypen abgeleitet und durch Bilineare Transformation " "digitalisiert wurden. Es handelt sich um Lehrbuchfilter <_:link-1/>, die wie " "in der <_:link-2/> Software implementiert sind." #. (itstool) path: item/p #: C/equalizer.page:181 msgid "" "(BT) - Bilinear Z-transform is used for pole/zero " "mapping." msgstr "" "(BT) - Die bilineare Z-Transformation wird für die " "Pol/Nullabbildung verwendet." #. (itstool) path: item/p #: C/equalizer.page:186 msgid "" "(MT) - Matched Z-transform is used for pole/zero " "mapping." msgstr "" "(MT) - Die angepasste Z-Transformation wird für " "die Pol/Nullabbildung verwendet." #. (itstool) path: item/p #: C/equalizer.page:191 msgid "" "(DR) - Direct design is used to serve the digital " "filter coefficients directly in the digital domain without performing " "transforms." msgstr "" "(DR) - Das direkte Design wird verwendet, um die " "digitalen Filterkoeffizienten direkt im digitalen Bereich zu bedienen, ohne " "Transformationen durchzuführen." #. (itstool) path: title/em #: C/equalizer.page:200 msgid "Slope" msgstr "Steigung" #. (itstool) path: item/p #: C/equalizer.page:202 msgid "The slope of the filter characteristics." msgstr "Die Steilheit der Filtercharakteristik." #. (itstool) path: item/p #: C/equalizer.page:210 msgid "Makes this band the only one active." msgstr "Macht dieses Band zum einzigen aktiven." #. (itstool) path: title/em #: C/equalizer.page:216 C/crystalizer.page:45 msgid "Mute" msgstr "Stummschalten" #. (itstool) path: item/p #: C/equalizer.page:218 msgid "Mutes the band." msgstr "Schaltet das Band stumm." #. (itstool) path: item/p #: C/equalizer.page:226 msgid "Band center frequency." msgstr "Bandmittenfrequenz." #. (itstool) path: title/em #: C/equalizer.page:232 msgid "Width" msgstr "Breite" #. (itstool) path: p/code #: C/equalizer.page:236 #, no-wrap msgid "width = frequency / quality" msgstr "Breite = Frequenz / Qualität" #. (itstool) path: item/p #: C/equalizer.page:234 msgid "Bandwidth. Calculated as <_:code-1/>." msgstr "Bandbreite. Berechnet als <_:code-1/>." #. (itstool) path: title/em #: C/equalizer.page:241 msgid "Quality" msgstr "Qualität" #. (itstool) path: item/p #: C/equalizer.page:243 msgid "Quality factor." msgstr "Qualitätsfaktor." #. (itstool) path: page/title #: C/pitch.page:9 msgid "Pitch" msgstr "Tonhöhe" #. (itstool) path: page/p #: C/pitch.page:10 msgid "" "Pitch shifting is a sound recording technique in which the original pitch of " "a sound is raised or lowered." msgstr "" "Die Tonhöhenverschiebung ist eine Tonaufnahmetechnik, bei der die " "ursprüngliche Tonhöhe eines Tons angehoben oder abgesenkt wird." #. (itstool) path: page/p #: C/pitch.page:14 msgid "PulseEffects uses the pitch shifter from RubberBand." msgstr "PulseEffects verwendet den Tonhöhenschieber von RubberBand." #. (itstool) path: title/em #: C/pitch.page:20 msgid "Faster" msgstr "Schneller" #. (itstool) path: title/em #: C/pitch.page:26 msgid "Preserve Formant" msgstr "Formant erhalten" #. (itstool) path: item/p #: C/pitch.page:28 msgid "Enable formant preservation when pitch shifting." msgstr "Aktiviere die Formanterhaltung beim Verschieben der Tonhöhe." #. (itstool) path: title/em #: C/pitch.page:34 msgid "Cents" msgstr "Cent" #. (itstool) path: item/p #: C/pitch.page:36 msgid "Number of cents the pitch will increased or decreased." msgstr "Anzahl der Cents, um die die Tonhöhe erhöht oder verringert wird." #. (itstool) path: title/em #: C/pitch.page:42 msgid "Semitones" msgstr "Halbtöne" #. (itstool) path: item/p #: C/pitch.page:44 msgid "Number of semitones the pitch will increased or decreased." msgstr "Anzahl der Halbtöne, um die die Tonhöhe erhöht oder verringert wird." #. (itstool) path: title/em #: C/pitch.page:50 msgid "Octaves" msgstr "Oktaven" #. (itstool) path: item/p #: C/pitch.page:52 msgid "Number of octaves the pitch will increased or decreased." msgstr "Anzahl der Oktaven, um die die Tonhöhe erhöht oder verringert wird." #. (itstool) path: title/em #: C/pitch.page:58 msgid "Crispness" msgstr "Klarheit" #. (itstool) path: item/p #: C/pitch.page:62 msgid "" "0 - Disable phase resynchronisation at transients, phase lamination and use " "longer processing window." msgstr "" "0 - Deaktivieren der Phasenresynchronisation bei Transienten, " "Phasenlaminierung und Verwendung eines längeren Verarbeitungsfensters." #. (itstool) path: item/p #: C/pitch.page:68 msgid "" "1 - Use soft transient detector, disable phase lamination and use longer " "processing window." msgstr "" "1 - Verwenden eines weichen Transientendetektors, deaktivieren der " "Phasenlaminierung und verwenden eines längeren Verarbeitungsfensters." #. (itstool) path: item/p #: C/pitch.page:74 msgid "2 - Disable phase resynchronisation at transients and phase lamination." msgstr "" "2 - Deaktivieren der Phasenresynchronisation bei Transienten und " "Phasenlaminierung." #. (itstool) path: item/p #: C/pitch.page:79 msgid "3 - Disable phase resynchronisation at transients." msgstr "3 - Deaktivieren der Phasenresynchronisation bei Transienten." #. (itstool) path: page/title #: C/webrtc.page:9 msgid "Webrtc" msgstr "WebRTC" #. (itstool) path: page/p #: C/webrtc.page:10 msgid "" "PulseEffects uses the webrtc from GStreamer. This plugin offers a voice " "enhancement filter based on WebRTC Audio Processing library. This library " "provides a broad variety of enhancement algorithms. This plugin tries to " "enable as many of those as possible. The currently enabled enhancements are " "High Pass Filter, Echo Canceller, Noise Suppression, Automatic Gain Control, " "and some extended filters." msgstr "" "PulseEffects verwendet WebRTC von GStreamer. Dieses Plugin bietet einen " "Sprachverbesserungsfilter, der auf der WebRTC Audioverarbeitungs-Bibliothek " "basiert. Diese Bibliothek bietet eine breite Palette von " "Anreicherungsalgorithmen. Dieses Plugin versucht so viele davon zu " "aktivieren wie möglich. Die derzeit aktivierten Verbesserungen sind " "Hochpassfilter, Echounterdrückung, Rauschunterdrückung, automatische " "Verstärkungsregelung und einige erweiterte Filter." #. (itstool) path: section/title #: C/webrtc.page:19 msgid "Echo Canceller" msgstr "Echounterdrückung" #. (itstool) path: title/em #: C/webrtc.page:23 msgid "Extended Filter" msgstr "Erweiterter Filter" #. (itstool) path: item/p #: C/webrtc.page:25 msgid "Enabled or disables the extended filter." msgstr "Aktiviert oder deaktiviert den erweiterten Filter." #. (itstool) path: title/em #: C/webrtc.page:31 msgid "High Pass Filter" msgstr "Hochpassfilter" #. (itstool) path: item/p #: C/webrtc.page:33 msgid "Enables or disables the high pass filter." msgstr "Aktiviert oder deaktiviert den Hochpassfilter." #. (itstool) path: title/em #: C/webrtc.page:39 msgid "Delay Agnostic" msgstr "Verzögerungsagnostisch" #. (itstool) path: item/p #: C/webrtc.page:41 msgid "Enables or disables the delay agnostic mode." msgstr "Aktiviert oder deaktiviert den Verzögerungsagnostischen Modus." #. (itstool) path: title/em #: C/webrtc.page:47 C/webrtc.page:61 msgid "Suppression Level" msgstr "Unterdrückungsgrad" #. (itstool) path: item/p #: C/webrtc.page:49 msgid "" "Controls the aggressiveness of the suppressor. A higher level trades off " "double-talk performance for increased echo suppression." msgstr "" "Kontrolliert die Aggressivität des Unterdrückers. Ein höherer Pegel tauscht " "die Doppelsprechleistung gegen eine erhöhte Echounterdrückung aus." #. (itstool) path: section/title #: C/webrtc.page:57 msgid "Noise Suppressor" msgstr "Rauschunterdrücker" #. (itstool) path: item/p #: C/webrtc.page:63 msgid "" "Controls the aggressiveness of the suppression. Increasing the level will " "reduce the noise level at the expense of a higher speech distortion." msgstr "" "Kontrolliert die Aggressivität der Unterdrückung. Eine Erhöhung des Pegels " "reduziert den Geräuschpegel auf Kosten einer höheren Sprachverzerrung." #. (itstool) path: section/title #: C/webrtc.page:71 msgid "Gain Controller" msgstr "Verstärkungsregler" #. (itstool) path: item/p #: C/webrtc.page:77 msgid "Controls the mode of the compression stage." msgstr "Steuert den Modus der Kompressionsstufe." #. (itstool) path: item/p #: C/webrtc.page:90 msgid "" "When enabled, the compression stage will hard limit the signal to the target " "level. Otherwise, the signal will be compressed but not limited above the " "target level." msgstr "" "Wenn aktiviert, wird die Kompressionsstufe das Signal hart auf den Zielpegel " "begrenzen. Andernfalls wird das Signal zwar komprimiert, aber nicht über den " "Zielpegel hinaus begrenzt." #. (itstool) path: title/em #: C/webrtc.page:98 msgid "Target Level" msgstr "Zielwert" #. (itstool) path: item/p #: C/webrtc.page:100 msgid "" "Sets the target peak level of the gain control in dBFS (decibels from " "digital full-scale)." msgstr "" "Stellt den Zielspitzenpegel des Gain-Reglers in dBFS ein (Dezibel zur " "digitalen Vollaussteuerung)." #. (itstool) path: title/em #: C/webrtc.page:107 msgid "Maximum Gain" msgstr "Maximale Verstärkung" #. (itstool) path: item/p #: C/webrtc.page:109 msgid "Sets the maximum gain the digital compression stage may apply." msgstr "" "Stellt die maximale Verstärkung ein, die die digitale Kompressionsstufe " "anwenden darf." #. (itstool) path: section/title #: C/webrtc.page:116 msgid "Voice Detector" msgstr "Spracherkennung" #. (itstool) path: title/em #: C/webrtc.page:120 msgid "Detection Likelihood" msgstr "Erkennungswahrscheinlichkeit" #. (itstool) path: item/p #: C/webrtc.page:122 msgid "" "Specifies the likelihood that a frame will be declared to contain voice." msgstr "" "Gibt die Wahrscheinlichkeit an, dass ein Frame als mit Stimme versehen " "deklariert wird." #. (itstool) path: title/em #: C/webrtc.page:130 msgid "Frame Size" msgstr "Rahmengröße" #. (itstool) path: item/p #: C/webrtc.page:132 msgid "" "Sets the size of the frames in ms on which the VAD will operate. Larger " "frames will improve detection accuracy, but reduce the frequency of updates." msgstr "" "Legt die Größe der Frames in ms fest, auf denen der VAD arbeitet. Größere " "Frames verbessern die Erkennungsgenauigkeit, reduzieren aber die Häufigkeit " "der Aktualisierungen." #. (itstool) path: page/title #: C/crystalizer.page:9 msgid "Crystalizer" msgstr "Crystalizer" #. (itstool) path: page/p #: C/crystalizer.page:10 msgid "" "This plugin can be used to add a little of dynamic range to songs that were " "overly compressed" msgstr "" "Dieses Plugin kann verwendet werden, um Liedern, die übermäßig komprimiert " "wurden, ein wenig Dynamikumfang hinzuzufügen" #. (itstool) path: title/em #: C/crystalizer.page:17 msgid "Aggressive Mode" msgstr "Aggressiver Modus" #. (itstool) path: item/p #: C/crystalizer.page:19 msgid "" "When this option is enabled sample amplitude dependent amplification will be " "applied to the signal. Take care to not saturate the next plugin in the " "processing chain." msgstr "" "Wenn diese Option aktiviert ist, wird das Signal amplitudenabhängig " "verstärkt. Achte darauf, dass das nächste Plugin in der Verarbeitungskette " "nicht übersteuert wird." #. (itstool) path: title/em #: C/crystalizer.page:27 msgid "Intensities" msgstr "Intensitäten" #. (itstool) path: item/p #: C/crystalizer.page:29 msgid "" "The higher the value the higher is the difference in magnitude between the " "loudest and the quietest sounds. You can set different intensities for each " "frequency band." msgstr "" "Je höher der Wert, desto größer ist der Größenunterschied zwischen den " "lautesten und leisesten Tönen. Du kannst für jedes Frequenzband " "unterschiedliche Intensitäten einstellen." #. (itstool) path: item/p #: C/crystalizer.page:39 msgid "" "When active the audio signal passing through this band will not be modified." msgstr "" "Wenn aktiv, wird das dieses Band durchlaufende Audiosignal nicht verändert." #. (itstool) path: item/p #: C/crystalizer.page:47 msgid "Silence the band." msgstr "Schaltet das Band stumm." #. (itstool) path: page/title #: C/convolver.page:9 msgid "Convolver" msgstr "Convolver" #. (itstool) path: page/p #: C/convolver.page:10 msgid "" "A convolver creates a simulation of an audio environment. It is based on the " "mathematical convolution operation, and uses a pre-recorded audio sample of " "the impulse response of the space being modeled." msgstr "" "Ein Convolver erzeugt eine Simulation einer Audioumgebung. Er basiert auf " "der mathematischen Faltungsoperation und verwendet ein voraufgezeichnetes " "Audio-Sample der Impulsantwort des zu modellierenden Raumes." #. (itstool) path: title/em #: C/convolver.page:18 msgid "Import Impulse" msgstr "Impuls importieren" #. (itstool) path: item/p #: C/convolver.page:20 msgid "" "Import an impulse response file to PulseEffects configuration directory." msgstr "" "Importiert eine Impulsantwortdatei in das Konfigurationsverzeichnis von " "PulseEffects." #. (itstool) path: title/em #: C/convolver.page:26 msgid "Stereo Width" msgstr "Stereo-Breite" #. (itstool) path: item/p #: C/convolver.page:28 msgid "Modify the impulse response stereo image width." msgstr "Ändert die Breite des Stereobildes der Impulsantwort." #. (itstool) path: title/em #. (itstool) path: page/title #: C/convolver.page:34 C/spectrum.page:9 msgid "Spectrum" msgstr "Spektrum" #. (itstool) path: item/p #: C/convolver.page:36 msgid "Visualize the frequency spectrum of the selected channel." msgstr "Visualisiere das Frequenzspektrum des ausgewählten Kanals." #. (itstool) path: page/title #: C/settingsmenu.page:10 msgid "Settings Menu" msgstr "Einstellungsmenü" #. (itstool) path: page/title #: C/general.page:9 msgid "General" msgstr "Allgemein" #. (itstool) path: title/em #: C/general.page:13 msgid "Start Service at Login" msgstr "Dienst beim Login starten" #. (itstool) path: item/p #: C/general.page:15 msgid "" "Start PulseEffects as a service in the next login. This is done by creating " "an autostart file at ~/.config/autostart" msgstr "" "Startet PulseEffects als Dienst bei der nächsten Anmeldung. Dazu wird eine " "Autostart-Datei unter ~/.config/autostart " "erstellt" #. (itstool) path: title/em #: C/general.page:23 msgid "Process All Outputs" msgstr "Alle Ausgänge verarbeiten" #. (itstool) path: item/p #: C/general.page:25 msgid "" "Apply effects to the output of all audio applications. This will " "automatically switch on the per application switch that can be seen in the " "Applications entry." msgstr "" "Wendet die Effekte auf die Ausgabe aller Audioanwendungen an. Dadurch wird " "automatisch der Schalter pro Anwendung eingeschaltet, der im Eintrag " "Anwendungen zu sehen ist." #. (itstool) path: title/em #: C/general.page:32 msgid "Process All Inputs" msgstr "Alle Eingänge verarbeiten" #. (itstool) path: item/p #: C/general.page:34 msgid "" "Apply effects to the input(microphone) of all audio applications. This will " "automatically switch on the per application switch that can be seen in the " "Applications entry." msgstr "" "Wendet Effekte auf die Eingänge (Mikrofon) aller Audioanwendungen an. " "Dadurch wird automatisch der Schalter pro Anwendung eingeschaltet, der im " "Eintrag Anwendungen zu sehen ist." #. (itstool) path: title/em #: C/general.page:42 msgid "Use Dark Theme" msgstr "Benutze dunkles Thema" #. (itstool) path: item/p #: C/general.page:44 msgid "Use the dark version of the GTK theme." msgstr "Benutze die dunkle Version des GTK-Themas." #. (itstool) path: title/em #: C/general.page:50 C/autogain.page:16 msgid "Reset" msgstr "Zurücksetzen" #. (itstool) path: item/p #: C/general.page:52 msgid "" "Reset all parameters to their default values. This will reset the plugins " "too." msgstr "" "Setzt alle Parameter auf ihre Standardwerte zurück. Dadurch werden auch die " "Plugins zurückgesetzt." #. (itstool) path: title/em #: C/general.page:58 msgid "Priority type" msgstr "Prioritätstyp" #. (itstool) path: item/p #: C/general.page:60 msgid "" "Choose between real time mode, niceness or none. This parameter allows to " "choose a higher priority for the threads that process audio." msgstr "" "Wähle zwischen Echtzeit-Modus, Qualität oder keinem. Dieser Parameter " "erlaubt es, eine höhere Priorität für die Threads zu wählen, die Audio " "verarbeiten." #. (itstool) path: title/em #: C/general.page:67 msgid "Niceness" msgstr "Qualität" #. (itstool) path: item/p #: C/general.page:69 msgid "Niceness value." msgstr "Qualitätswert." #. (itstool) path: title/em #: C/general.page:75 msgid "Priority" msgstr "Priorität" #. (itstool) path: item/p #: C/general.page:77 msgid "Real time priority." msgstr "Echtzeitpriorität." #. (itstool) path: title/em #: C/spectrum.page:13 msgid "Show" msgstr "Anzeigen" #. (itstool) path: item/p #: C/spectrum.page:15 msgid "Hide or show the spectrum." msgstr "Das Spektrum verbergen oder anzeigen." #. (itstool) path: title/em #: C/spectrum.page:21 msgid "Points" msgstr "Punkte" #. (itstool) path: item/p #: C/spectrum.page:23 msgid "Number of points displayed." msgstr "Anzahl der angezeigten Punkte." #. (itstool) path: title/em #: C/spectrum.page:29 msgid "Height" msgstr "Höhe" #. (itstool) path: item/p #: C/spectrum.page:31 msgid "Spectrum height." msgstr "Spektrumhöhe." #. (itstool) path: title/em #: C/spectrum.page:37 msgid "Scale" msgstr "Skala" #. (itstool) path: item/p #: C/spectrum.page:39 msgid "Bar height scaling factor." msgstr "Skalierungsfaktor der Balkenhöhe." #. (itstool) path: title/em #: C/spectrum.page:45 msgid "Exponent" msgstr "Exponent" #. (itstool) path: item/p #: C/spectrum.page:47 msgid "Scaling factor exponent." msgstr "Skalierungsfaktor Exponent." #. (itstool) path: title/em #: C/spectrum.page:53 msgid "Sampling" msgstr "Abtastrate" #. (itstool) path: item/p #: C/spectrum.page:55 msgid "Spectrum update frequency." msgstr "Aktualisierungsfrequenz des Spektrums." #. (itstool) path: title/em #: C/spectrum.page:61 msgid "Line Width" msgstr "Linienbreite" #. (itstool) path: item/p #: C/spectrum.page:63 msgid "Bar line width." msgstr "Balkenlinienbreite." #. (itstool) path: title/em #: C/spectrum.page:69 msgid "Fill" msgstr "Ausfüllen" #. (itstool) path: item/p #: C/spectrum.page:71 msgid "Draw filled bars." msgstr "Ausgefüllte Balken zeichnen." #. (itstool) path: title/em #: C/spectrum.page:77 msgid "Border" msgstr "Grenze" #. (itstool) path: item/p #: C/spectrum.page:79 msgid "Show bar border." msgstr "Balkengrenze anzeigen." #. (itstool) path: title/em #: C/spectrum.page:85 msgid "Use Custom Color" msgstr "Benutzerdefinierte Farbe benutzen" #. (itstool) path: item/p #: C/spectrum.page:87 msgid "Use a user defined color or the GTK theme color." msgstr "Eine Benutzerdefinierte Farbe oder die GTK Themenfarbe nutzen." #. (itstool) path: title/em #: C/spectrum.page:93 msgid "Spectrum Color" msgstr "Spektrumfarbe" #. (itstool) path: item/p #: C/spectrum.page:95 msgid "User defined color." msgstr "Benutzerdefinierte Farbe." #. (itstool) path: page/title #: C/pulseaudio.page:9 msgid "Pulseaudio" msgstr "PulseAudio" #. (itstool) path: page/p #: C/pulseaudio.page:10 msgid "" "PulseEffects has two GStreamer pipelines. One that applies effects for " "applications output and other that applies effects for microphone. Here the " "user can tweak a few advanced parameters for both pipelines." msgstr "" "PulseEffects verfügt über zwei GStreamer-Pipelines. Eine, die Effekte für " "die Ausgabe von Anwendungen anwendet und eine andere, die Effekte für das " "Mikrofon anwendet. Hier kann der Benutzer einige erweiterte Parameter für " "beide Pipelines einstellen." #. (itstool) path: title/em #: C/pulseaudio.page:18 msgid "Use Default" msgstr "Vorgabe verwenden" #. (itstool) path: item/p #: C/pulseaudio.page:20 msgid "Use default input or output device." msgstr "Verwenden des standardmäßigen Ein- oder Ausgabegerätes." #. (itstool) path: title/em #: C/pulseaudio.page:26 msgid "Buffer" msgstr "Puffer" #. (itstool) path: item/p #: C/pulseaudio.page:28 msgid "Pulsesrc plugin buffer size. It affects latency" msgstr "Puffergröße des Pulsesrc-Plugins. Beeinflusst die Latenz" #. (itstool) path: title/em #: C/pulseaudio.page:34 msgid "Latency" msgstr "Latenz" #. (itstool) path: item/p #: C/pulseaudio.page:36 msgid "Pulsesrc plugin latency value." msgstr "Pulsesrc-Plugin-Latenzwert." #. (itstool) path: title/em #: C/pulseaudio.page:42 msgid "Block Size" msgstr "Blockgröße" #. (itstool) path: item/p #: C/pulseaudio.page:44 msgid "" "This controls the size of the audio buffer. Higher values increase latency " "but decrease cpu usage of a few plugins." msgstr "" "Hiermit wird die Größe des Audiopuffers gesteuert. Höhere Werte erhöhen die " "Latenzzeit, verringern aber die CPU-Nutzung einiger weniger Plugins." #. (itstool) path: page/title #: C/testsignals.page:9 msgid "Test Signals" msgstr "Testsignale" #. (itstool) path: page/p #: C/testsignals.page:10 msgid "" "These signals can be used to test the frequency response of your speakers." msgstr "" "Diese Signale können verwendet werden, um den Frequenzgang deiner " "Lautsprecher zu testen." #. (itstool) path: page/title #: C/calibrationmic.page:9 msgid "Microphone" msgstr "Mikrofon" #. (itstool) path: page/p #: C/calibrationmic.page:10 msgid "" "If you have a microphone with reasonably flat response you can use it " "together with a pink noise test signal to estimate how flat is your audio " "setup frequency response." msgstr "" "Wenn du ein Mikrofon mit relativ flachem Frequenzgang hast, kannst du es " "zusammen mit einem rosa Rauschen-Testsignal verwenden, um abzuschätzen, wie " "flach dein Audio-Setup-Frequenzgang ist." #. (itstool) path: title/em #: C/calibrationmic.page:17 msgid "Window" msgstr "Fenster" #. (itstool) path: item/p #: C/calibrationmic.page:19 msgid "" "The amount of time the microphone signal will be measured. Higher values " "will reduce noises." msgstr "" "Die Zeitdauer, in der das Mikrofonsignal gemessen wird. Höhere Werte " "reduzieren die Störgeräusche." #. (itstool) path: title/em #: C/calibrationmic.page:26 msgid "Measure Noise" msgstr "Rauschen messen" #. (itstool) path: item/p #: C/calibrationmic.page:28 msgid "" "Saves the last measurement to be used as background noise. Usually you would " "use this before turning on the pink noise." msgstr "" "Speichert die letzte Messung, die als Hintergrundgeräusch verwendet werden " "soll. Normalerweise würde man diese verwenden, bevor das rosa Rauschen " "einschaltet wird." #. (itstool) path: title/em #: C/calibrationmic.page:35 msgid "Subtract Noise" msgstr "Rauschen reduzieren" #. (itstool) path: item/p #: C/calibrationmic.page:37 msgid "Subtract the stored background noise from the measurement." msgstr "Ziehe das gespeicherte Hintergrundrauschen von der Messung ab." #. (itstool) path: page/title #: C/enableapp.page:10 msgid "Enable or Disable an Application" msgstr "Eine Anwendung aktivieren oder deaktivieren" #. (itstool) path: page/p #: C/enableapp.page:12 msgid "" "You can choose which applications have effects applied through the switch " "next to its name. If you always want to apply effects to all applications " "take a look at Enable All Applications." msgstr "" "Man kann wählen, bei welchen Programmen die Effekte angewendet werden, indem " "man den Schalter neben dem Namen des Programms betätigt. Wenn die Effekte " "immer auf alle Anwendungen angewendet werden sollen, schaue dir Alle Anwendungen " "aktivieren an." #. (itstool) path: page/title #: C/effectsorder.page:10 msgid "Changing Effects Order" msgstr "Reihenfolge der Effekte ändern" #. (itstool) path: page/p #: C/effectsorder.page:12 msgid "" "You can change the plugins order in the effects chain. Just click on the up " "and down arrows next to the plugin name. The first plugin from top to bottom " "is the first to receive the audio signal." msgstr "" "Du kannst die Reihenfolge der Plugins in der Effektkette ändern. Klicke " "einfach auf die Auf- und Abwärts-Pfeile neben dem Plugin-Namen. Das erste " "Plugin von oben nach unten ist das erste, das das Audiosignal empfängt." #. (itstool) path: page/title #: C/userpresets.page:10 msgid "Creating and Importing User Presets" msgstr "Erstellen und Importieren von Benutzer-Presets" #. (itstool) path: page/p #: C/userpresets.page:12 msgid "" "You can save your own presets. Just add write a name and click on the add " "button. Presets can be imported clicking on the button to the left." msgstr "" "Du kannst deine eigenen Voreinstellungen speichern. Gebe einfach einen Namen " "ein und klicke auf den Hinzufügen Knopf. Presets können mit einem Klick auf " "den Button links importiert werden." #. (itstool) path: page/p #: C/userpresets.page:16 msgid "" "When you save a preset the current configuration of all plugins is saved to " "its file. This means you can have presets that combine the effects of " "different plugins." msgstr "" "Wird ein Preset gespeichert, wird die aktuelle Konfiguration aller Plugins " "in dessen Datei gespeichert. Das bedeutet, dass du Voreinstellungen haben " "kannst, die die Effekte verschiedener Plugins kombinieren." #. (itstool) path: page/p #: C/userpresets.page:21 msgid "" "You can also make a preset autoload when an input or output device is added " "to the system. Just click on the button with curved arrows while the desired " "device is selected as the system default device." msgstr "" "Du kannst auch ein Preset erstellen, das automatisch geladen wird, wenn ein " "Ein- oder Ausgabegerät zum System hinzugefügt wird. Klicke einfach auf die " "Schaltfläche mit den geschwungenen Pfeilen, während das gewünschte Gerät als " "Standardgerät des Systems ausgewählt ist." #. (itstool) path: page/title #: C/advancedinfo.page:10 msgid "Advanced Information" msgstr "Erweiterte Informationen" #. (itstool) path: page/p #: C/advancedinfo.page:12 msgid "" "PulseEffects audio processing is composed by 3 main stages. Each of them " "needs a specific audio format and sampling rate. This information is show in " "the headerbar subtitle." msgstr "" "Die Audioverarbeitung von PulseEffects besteht aus 3 Hauptstufen. Jede " "dieser Stufen benötigt ein bestimmtes Audioformat und eine bestimmte " "Abtastrate. Diese Informationen werden im Untertitel in der Kopfleiste " "angezeigt." #. (itstool) path: page/p #: C/advancedinfo.page:17 msgid "" "Another important information is the latency introduced by the audio " "processing. This the the last information shown. The displayed value is in " "milliseconds." msgstr "" "Eine weitere wichtige Information ist die durch die Audioverarbeitung " "eingeführte Latenzzeit. Dies ist die zuletzt angezeigte Information. Der " "angezeigte Wert wird in Millisekunden angegeben." #. (itstool) path: page/title #: C/saturated.page:10 msgid "Saturation Warning" msgstr "Übersteuerungswarnung" #. (itstool) path: page/p #: C/saturated.page:12 #, fuzzy msgid "" "If the audio signal coming out from the pipeline is too high very unpleasent " "noises will be produced. In case this happens the warning in the image above " "is shown so that the user can reduce the audio level using the limiter or " "the maximizer." msgstr "" "Wenn das am Eingang des Plugins ankommende Audiosignal zu hoch ist, werden " "sehr unangenehme Geräusche erzeugt. In diesem Fall wird die Warnung im " "obigen Bild angezeigt, so dass der Anwender den Audiopegel reduzieren kann." #. (itstool) path: page/title #: C/autogain.page:5 msgid "Auto Gain" msgstr "Automatische Verstärkungsregelung" #. (itstool) path: page/p #: C/autogain.page:6 msgid "" "PulseEffects auto gain is based on the library libebur128. It changes the " "audio volume to a perceived loudness level that can be tweaked by the user." msgstr "" "Die automatische Verstärkung von PulseEffects basiert auf der Bibliothek " "libebur128. Sie verändert die Audiolautstärke auf einen empfundenen " "Lautheitspegel, der vom Benutzer eingestellt werden kann." #. (itstool) path: title/em #: C/autogain.page:10 msgid "Target" msgstr "Ziel" #. (itstool) path: item/p #: C/autogain.page:12 msgid "Loudness level." msgstr "Lautheitsgrad." #. (itstool) path: item/p #: C/autogain.page:18 msgid "Resets the auto gain history." msgstr "Setzt den Verlauf der automatischen Verstärkung zurück." #. (itstool) path: title/em #: C/autogain.page:22 msgid "Detect Silence" msgstr "Stille erkennen" #. (itstool) path: item/p #: C/autogain.page:24 msgid "" "When the momentary loudness is below the relative we assume the audio " "material is passing through a brief moment of silence and no changes to the " "output gain are applied. If you do not want this behavior disable the " "silence detection." msgstr "" "Wenn die momentane Lautstärke unter der relativen Lautstärke liegt, nehmen " "wir an, dass das Audiomaterial einen kurzen Moment der Stille durchläuft und " "keine Änderungen an der Ausgangsverstärkung vorgenommen werden. Wird dieses " "Verhalten nicht gewünscht, kann die Stille-Erkennung deaktiviert werden." #. (itstool) path: title/em #: C/autogain.page:28 msgid "Use Geometric Mean" msgstr "Geometrisches Mittel nutzen" #. (itstool) path: item/p #: C/autogain.page:30 msgid "" "The estimated loudness is obtained from the geometric mean of the momentary, " "short-term and integrated loudness. When this option is disabled a weighted " "average is used." msgstr "" "Die geschätzte Lautheit ergibt sich aus dem geometrischen Mittel der " "momentanen, kurzfristigen und integrierten Lautheit. Wenn diese Option " "deaktiviert ist, wird ein gewichteter Mittelwert verwendet." #. (itstool) path: title/em #: C/autogain.page:34 msgid "Momentary" msgstr "Momentan" #. (itstool) path: item/p #: C/autogain.page:36 msgid "" "Controls how much the momentary term will influence the loudness level " "estimation." msgstr "" "Steuert, wie stark der momentane Wert die Schätzung des Lautheitspegels " "beeinflusst." #. (itstool) path: title/em #: C/autogain.page:40 msgid "Short Term" msgstr "Kurzfristig" #. (itstool) path: item/p #: C/autogain.page:42 msgid "" "Controls how much the short term measure will influence the loudness level " "estimation." msgstr "" "Steuert, wie stark der kurzfristige Wert die Abschätzung des Lautheitspegels " "beeinflusst." #. (itstool) path: title/em #: C/autogain.page:46 msgid "Integrated" msgstr "Integriert" #. (itstool) path: item/p #: C/autogain.page:48 msgid "" "Controls how much the integrated term will influence the loudness level " "estimation." msgstr "" "Steuert, wie stark der integrierte Wert die Abschätzung des Lautheitspegels " "beeinflusst." #. (itstool) path: title/em #: C/autogain.page:52 msgid "Relative" msgstr "Relativ" #. (itstool) path: item/p #: C/autogain.page:54 msgid "" "Relative threshold. It is used to detect silence. Whenever the momentary " "term is below this threshold modifications to the output gain will be " "disabled." msgstr "" "Relativer Schwellenwert. Er wird verwendet, um Stille zu erkennen. Immer " "wenn der momentane Wert unter diesem Schwellwert liegt, werden Änderungen " "der Ausgangsverstärkung deaktiviert." #. (itstool) path: title/em #: C/autogain.page:58 msgid "Loudness" msgstr "Lautstärke" #. (itstool) path: item/p #: C/autogain.page:60 msgid "" "Estimated input loudness. The difference between its value and the target " "loudness determines the output gain." msgstr "" "Geschätzte Eingangslautstärke. Die Differenz zwischen seinem Wert und der " "Soll-Lautheit bestimmt die Ausgangsverstärkung." #. (itstool) path: title/em #: C/autogain.page:64 msgid "Range" msgstr "Umfang" #. (itstool) path: item/p #: C/autogain.page:66 msgid "Loudness range. Indicates how large is the material dynamic range." msgstr "" "Lautstärkebereich. Zeigt an, wie groß der Dynamikbereich des Materials ist." #. (itstool) path: title/em #: C/autogain.page:70 msgid "Gain" msgstr "Verstärkung" #. (itstool) path: item/p #: C/autogain.page:72 msgid "" "Output gain value. The input signal will be multiplied by this correction " "gain to bring its loudness to the target value." msgstr "" "Wert der Ausgangsverstärkung. Das Eingangssignal wird mit dieser " "Korrekturverstärkung multipliziert, um seine Lautstärke auf den Sollwert zu " "bringen." #. (itstool) path: page/title #: C/blocklist.page:9 msgid "Applications Blocklist" msgstr "Anwendungssperrliste" #. (itstool) path: page/p #: C/blocklist.page:11 msgid "" "In the settings menu there is an option that allows the user to apply " "effects to all applications without the need to switch each one on " "individually. But there are cases where the user wants a specific " "application to be excluded from the \"Enable All\" functionality. This can " "be done by using a blocklist. Just add the application name exactly as it is " "shown in the \"Applications\" entry." msgstr "" "Im Einstellungsmenü gibt es eine Option, die es dem Benutzer erlaubt, " "Effekte auf alle Programme anzuwenden, ohne dass man jedes Programm einzeln " "einschalten muss. Es gibt jedoch Fälle, in denen der Benutzer möchte, dass " "eine bestimmte Anwendung von der \"Alle aktivieren\"-Funktionalität " "ausgeschlossen wird. Dies kann über eine Blocklist erfolgen. Füge einfach " "den Namen der Anwendung genau so hinzu, wie er im Eintrag \"Anwendungen\" " "angezeigt wird." #. (itstool) path: page/title #: C/guide_1.page:5 msgid "Enhancing your internal notebook speakers without using an equalizer" msgstr "Deine internen Notebook-Lautsprecher ohne Equalizer verbessern" #. (itstool) path: page/p #: C/guide_1.page:6 msgid "" "This tutorial was written by Markus Schmidt schmidt@boomshop.net on November " "2019" msgstr "" "Dieses Tutorial wurde von Markus Schmidt schmidt@boomshop.net am November " "2019 geschrieben" #. (itstool) path: section/title #: C/guide_1.page:8 msgid "Introduction" msgstr "Einleitung" #. (itstool) path: section/p #: C/guide_1.page:9 msgid "" "If you're a notebook user relying on your internal speakers and you - like " "me - own a model suffering from a tinny, clanging sound, PulseEffects is " "your salvation!" msgstr "" "Wenn du ein Notebook-Benutzer bist, der sich auf seine internen Lautsprecher " "verlässt, und du - wie ich - ein Modell besitzt, das unter einem blechernen, " "klirrenden Klang leidet, dann ist PulseEffects deine Rettung!" #. (itstool) path: section/p #: C/guide_1.page:10 msgid "" "Commercial operating systems on laptops these days often come with software " "like Dolby Theatre and the like to enhance the sound of lousy notebook " "speakers to something more substantial and acoustically rich. Under Linux, " "PulseEffects will do the job for you, although, compared to the commercial " "pendants, there's some manual tweaking required until the community sets up " "a database with presets for common machines." msgstr "" "Kommerzielle Betriebssysteme auf Laptops kommen heutzutage oft mit Software " "wie Dolby Theatre und ähnlichem, um den Klang von lausigen Notebook-" "Lautsprechern zu etwas substanziellerem und akustisch reichhaltigerem zu " "machen. Unter Linux erledigt PulseEffects die Arbeit für dich, obwohl im " "Vergleich zu den kommerziellen Pendants einige manuelle Anpassungen " "erforderlich sind, bis die Community eine Datenbank mit Voreinstellungen für " "gängige Geräte eingerichtet hat." #. (itstool) path: section/p #: C/guide_1.page:11 msgid "" "This DSP software comes with everything needed to fatten the sound of your " "laptop speakers with a flexibility never found in other operating systems. " "Unfortunately the drawback of this flexibility is that average users will " "get lost in the sheer amount of possibilities. That's why this tutorial was " "created." msgstr "" "Diese DSP-Software wird mit allem geliefert, was man braucht, um den Klang " "deiner Laptop-Lautsprecher fetter zu machen, mit einer Flexibilität, die man " "bei anderen Betriebssystemen nicht findet. Leider ist der Nachteil dieser " "Flexibilität, dass der durchschnittliche Benutzer sich in der schieren Menge " "der Möglichkeiten verliert. Aus diesem Grund wurde dieses Tutorial erstellt." #. (itstool) path: section/title #: C/guide_1.page:14 msgid "Why no equalizer?" msgstr "Warum kein Equalizer?" #. (itstool) path: section/p #: C/guide_1.page:15 msgid "" "We will attack the problems one by one utilizing specific signal processors, " "deliberately renouncing equalizers. Equalizers are not of any help here but " "tend to make these kinds of problems even worse. This is because of the " "nature of this processor, but also because users tend to add to the signal " "(additive equalization) instead of trying to eliminate problems by removing " "from the signal (subtractive equalization) like it is usually done in the " "professional world." msgstr "" "Wir werden die Probleme Stück für Stück mit speziellen Signalprozessoren " "angehen und dabei bewusst auf Equalizer verzichten. Equalizer helfen hier " "nicht weiter, sondern neigen dazu, solche Probleme noch zu verschlimmern. " "Das liegt an der Natur dieses Prozessors, aber auch daran, dass der Anwender " "dazu neigt, dem Signal etwas hinzuzufügen (additive Equalizer), anstatt zu " "versuchen, Probleme durch Entfernen aus dem Signal zu beseitigen " "(subtraktive Equalizer), wie es in der professionellen Welt üblich ist." #. (itstool) path: section/p #: C/guide_1.page:16 msgid "" "But even subtractive equalization wouldn't be of any help since the " "amplifiers and speakers in a notebook are not loud enough by default, so " "trying to eliminate problems this way leads to a quiet and still castrated " "sound. And raising the volume afterwards generally leads to distorted sounds " "and other problems because the system was at its limits beforehand and just " "fiddling with the frequency response doesn't help at all." msgstr "" "Aber selbst eine subtraktive Entzerrung würde nicht helfen, da die " "Verstärker und Lautsprecher in einem Notebook standardmäßig nicht laut genug " "sind, so dass der Versuch, Probleme auf diese Weise zu beseitigen, zu einem " "leisen und dennoch kastrierten Klang führt. Und eine nachträgliche Erhöhung " "der Lautstärke führt in der Regel zu verzerrten Klängen und anderen " "Problemen, da das System vorher an seinen Grenzen war und ein bloßes " "Herumfummeln am Frequenzgang gar nicht hilft." #. (itstool) path: section/title #: C/guide_1.page:19 msgid "Frequency Range" msgstr "Frequenzbereich" #. (itstool) path: section/p #: C/guide_1.page:20 msgid "" "We'll have to talk about the frequency range. For a better understanding and " "because of the way we will solve our problems I'll break it down to five " "ranges which are:" msgstr "" "Wir müssen über den Frequenzbereich sprechen. Für ein besseres Verständnis " "und wegen der Art und Weise, wie wir unsere Probleme lösen werden, werde ich " "es auf fünf Bereiche herunterbrechen, nämlich:" #. (itstool) path: item/p #: C/guide_1.page:23 msgid "" "Sub More or less vibrations up to something an ear " "can barely hear. Everything from 10Hz to ~40Hz." msgstr "" "Sub Mehr oder weniger Vibrationen bis hin zu " "etwas, das ein Ohr kaum hören kann. Alles von 10Hz bis ~40Hz." #. (itstool) path: item/p #: C/guide_1.page:29 msgid "" "Low or Bass Where the whole fundament of a signal " "is located. Low end of bass drums, bass synthesizers and bass guitars are " "found here. Movies occupy this range with explosions, rumbling waters, " "thunder, heavy gun fire and the like. Absolutely missing on notebooks and " "tablets. Technically speaking its ~60Hz - ~200Hz." msgstr "" "Tief oder Bass Wo das gesamte Fundament eines " "Signals liegt. Hier finden sich die Tiefen von Bassdrums, Bass-Synthesizern " "und Bassgitarren. Filme besetzen diesen Bereich mit Explosionen, polterndem " "Wasser, Donner, schwerem Geschützfeuer und ähnlichem. Auf Notebooks und " "Tablets fehlen sie völlig. Technisch gesehen sind es ~60Hz - ~200Hz." #. (itstool) path: item/p #: C/guide_1.page:35 msgid "" "Low-Mid Hit a 0.5m³ cardboard box and you know " "what low-mids are. The \"punch\" of a sound is often located here, also the " "juice of snare drums and electric guitars. In Movies, roaring engines and " "shotguns are found in this range. We're talking about ~250Hz - ~750Hz." msgstr "" "Tief-Mitten Schlage auf einen 0,5m³ Karton und du " "weißt, was Tief-Mitten sind. Der \"Punch\" eines Sounds ist hier oft zu " "finden, auch der Saft von Snare Drums und E-Gitarren. In Filmen sind " "brüllende Motoren und Schrotflinten in diesem Bereich zu finden. Wir " "sprechen hier von ~250Hz - ~750Hz." #. (itstool) path: item/p #: C/guide_1.page:41 msgid "" "High-Mid This is the ears most important and " "sensitive range. The main information of any kind of signal is located here. " "Human voice, picking of guitars, attack of drums, the colour of a " "synthesizer - everything carrying the main information of sound. Something " "around ~1kHz - ~4kHz." msgstr "" "Hoch-Mitten Dies ist der wichtigste und " "empfindlichste Bereich der Ohren. Die Hauptinformation jeder Art von Signal " "befindet sich hier. Die menschliche Stimme, das Picking der Gitarren, der " "Anschlag des Schlagzeugs, die Farbe eines Synthesizers - alles, was die " "Hauptinformationen des Klangs trägt. Etwas um ~1kHz - ~4kHz." #. (itstool) path: item/p #: C/guide_1.page:47 msgid "" "Highs The air, the breathe, the sizzling, the " "splashing - this is the range of brightness. Everything around and above " "~5kHz." msgstr "" "Höhen Die Luft, das Atmen, das Brutzeln, das " "Plätschern - das ist der Bereich der Höhen. Alles um und über ~5kHz." #. (itstool) path: section/title #: C/guide_1.page:55 msgid "Test Signal" msgstr "Testsignal" #. (itstool) path: section/p #: C/guide_1.page:56 msgid "" "You definitely need a good signal for this job. I decided to use Seeed: <_:" "link-1/>" msgstr "" "Dafür braucht man definitiv ein gutes Signal. Ich habe mich für Seeed " "entschieden: <_:link-1/>" #. (itstool) path: section/p #: C/guide_1.page:60 msgid "" "It is quite snappy, has lots of well defined substance, clear and bright " "highs, present vocals, comes with a very balanced frequency response and is " "a great mix in combination with great mastering. Afterwards I tested against " "various movies and other stuff like talks, classical music and the like and " "was convinced of the result. Well produced, modern pop music (avoid the 80's " "and 90's stuff) is always a good test signal for this kind of job. Movies " "are way too dynamic, so is classical music, and they normally don't cover a " "steady, broad frequency range like this kind of signal." msgstr "" "Es ist ziemlich zackig, hat viel gut definierte Substanz, klare und helle " "Höhen, präsenten Gesang, kommt mit einem sehr ausgewogenen Frequenzgang und " "ist ein toller Mix in Kombination mit großartigem Mastering. Danach habe ich " "gegen verschiedene Filme und andere Sachen wie Vorträge, klassische Musik " "und ähnliches getestet und war vom Ergebnis überzeugt. Gut produzierte, " "moderne Popmusik (meide den 80er und 90er Jahre Kram) ist immer ein gutes " "Testsignal für diese Art von Arbeit. Filme sind viel zu dynamisch, " "klassische Musik auch, und sie decken normalerweise nicht einen " "gleichmäßigen, breiten Frequenzbereich wie diese Art von Signal ab." #. (itstool) path: section/p #: C/guide_1.page:61 msgid "" "We will not be able to make the notebook bounce. What is the goal here is " "that everything contained in the mix gets audible in a well balanced manner " "and to gain a present, upfront, broad and hopefully rich sound." msgstr "" "Wir werden das Notebook nicht zum Hüpfen bringen können. Ziel ist es hier, " "dass alles, was in der Mischung enthalten ist, ausgewogen hörbar wird und " "einen präsenten, offenen, breiten und hoffentlich satten Sound erhält." #. (itstool) path: section/p #: C/guide_1.page:62 msgid "" "I assume you don't utilize a player or source which is able to produce " "levels above 0dB. I also assume you don't use e.g. video players volume bar " "to lower the volume of your source. This approach works well for defined, " "mixed and mastered sound sources like music, movies, tv and the like, played " "back at 100% volume in the player. Set the volume desired on your hardware " "via PulseAudio after the processing happened." msgstr "" "Ich nehme an, dass du keinen Player oder eine Quelle verwendest, die in der " "Lage ist, Pegel über 0dB zu erzeugen. Ich nehme auch an, dass du nicht z.B. " "die Lautstärkeleiste von Videoplayern verwendest, um die Lautstärke deiner " "Quelle zu senken. Dieser Ansatz funktioniert gut für definierte, gemischte " "und gemasterte Klangquellen wie Musik, Filme, Fernsehen und ähnliches, die " "mit 100% Lautstärke im Player abgespielt werden. Stelle die gewünschte " "Lautstärke auf deiner Hardware über PulseAudio nach der Bearbeitung ein." #. (itstool) path: section/title #: C/guide_1.page:69 msgid "Problems" msgstr "Probleme" #. (itstool) path: section/p #: C/guide_1.page:70 msgid "Let's investigate the biggest problems first:" msgstr "Lasst uns zuerst die größten Probleme untersuchen:" #. (itstool) path: item/title #: C/guide_1.page:73 msgid "Bass" msgstr "Bass" #. (itstool) path: item/p #: C/guide_1.page:76 msgid "" "The most obvious problem of notebook speakers is the tinny, pressure-free " "sound not reproducing any kind of low-end. This is because of the size of " "the membranes and the inadequate housing. Fortunately software can work " "around this issue at least a bit." msgstr "" "Das offensichtlichste Problem von Notebook-Lautsprechern ist der blecherne, " "druckfreie Klang, der keinerlei Bässe wiedergibt. Das liegt an der Größe der " "Membranen und dem unzureichenden Gehäuse. Glücklicherweise kann Software " "dieses Problem zumindest ein wenig umgehen." #. (itstool) path: item/title #: C/guide_1.page:79 msgid "Highs" msgstr "Höhen" #. (itstool) path: item/p #: C/guide_1.page:82 msgid "" "Often the highs are quite bitchy, not representing the \"air\" but torturing " "the listener with searing sibliants. In order to fix that we need to equal " "this frequency range out." msgstr "" "Oft sind die Höhen recht zickig, repräsentieren nicht die \"Luft\", sondern " "quälen den Hörer mit ätzenden Zischlauten. Um das zu beheben, müssen wir " "diesen Frequenzbereich ausgleichen." #. (itstool) path: item/title #: C/guide_1.page:85 msgid "Overall Fequency Response" msgstr "Gesamtfrequenzgang" #. (itstool) path: item/p #: C/guide_1.page:88 msgid "" "Normally the relation between the different frequency ranges low, low-mid, " "high-mid and height is quite out-of-bounds. This needs correction, although " "I promised a tutorial without EQ." msgstr "" "Normalerweise ist das Verhältnis zwischen den verschiedenen " "Frequenzbereichen Tief, Tief-Mitte, Hoch-Mitte und Höhe ziemlich ungünstig. " "Dies muss korrigiert werden, obwohl ich ein Tutorial ohne EQ versprochen " "habe." #. (itstool) path: item/title #: C/guide_1.page:91 msgid "Distortion" msgstr "Verzerrung" #. (itstool) path: item/p #: C/guide_1.page:94 msgid "" "Because of the thin and neutered sound users tend to raise the volume or " "even add an equalizer to raise missing frequency ranges. This normally leads " "to digital distortions because every signal above 0 dB at the sound card DAC " "will go from occasional crackling up to a totally distorted sound." msgstr "" "Wegen des dünnen und kastrierten Sounds neigen Anwender dazu, die Lautstärke " "zu erhöhen oder sogar einen Equalizer hinzuzufügen, um fehlende " "Frequenzbereiche zu erhöhen. Dies führt in der Regel zu digitalen " "Verzerrungen, da jedes Signal oberhalb von 0 dB am Soundkarten-DAC von " "gelegentlichem Knacken bis hin zu einem völlig verzerrten Klang führt." #. (itstool) path: item/title #: C/guide_1.page:97 msgid "Dynamic range" msgstr "Dynamische Reichweite" #. (itstool) path: item/p #: C/guide_1.page:100 msgid "" "With movies, but music aswell, those tiny transducers tend to wiping away " "low-level sounds but going ballistic on loud and bassy sounds. For this " "reason it's recommended to reduce the overall dynamic range so you don't " "need to press your ear onto the palm rest when the lady in the movie starts " "whispering." msgstr "" "Bei Filmen, aber auch bei Musik, neigen diese winzigen Wandler dazu, leise " "Geräusche wegzuwischen, aber bei lauten und bassigen Geräuschen " "durchzudrehen. Aus diesem Grund ist es empfehlenswert, den gesamten " "Dynamikbereich zu reduzieren, damit man nicht das Ohr auf die Handauflage " "drücken muss, wenn die Dame im Film zu flüstern beginnt." #. (itstool) path: item/title #: C/guide_1.page:103 msgid "Stereo Image" msgstr "Stereo-Bild" #. (itstool) path: item/p #: C/guide_1.page:106 msgid "" "The stereo base is quite narrow because of the positioning of the speakers " "inside the laptop which gives an impression of almost mono signals." msgstr "" "Die Stereobasis ist aufgrund der Positionierung der Lautsprecher im Inneren " "des Laptops recht schmal, was einen Eindruck von fast Monosignalen " "vermittelt." #. (itstool) path: section/title #: C/guide_1.page:111 msgid "Solutions" msgstr "Lösungen" #. (itstool) path: section/p #: C/guide_1.page:112 msgid "" "Let's start fixing the sound. The result will not come even close to " "something more substantial but at least we'll be able to get the best out of " "the physical boundaries of these transducers." msgstr "" "Fangen wir an, den Ton zu reparieren. Das Ergebnis wird nicht einmal " "annähernd an etwas Substantielleres heranreichen, aber immerhin werden wir " "in der Lage sein, das Beste aus den physikalischen Grenzen dieser Wandler " "herauszuholen." #. (itstool) path: section/p #: C/guide_1.page:113 msgid "" "Every parameter we are gonna set absolutely depends on your situation and " "the hardware you've got. Every notebook has its own frequency response and " "dynamic range so there's no panacea. But the audio signal processors, their " "order and their missions are well defined and reproducable." msgstr "" "Jeder Parameter, den wir einstellen werden, hängt absolut von deiner " "Situation und der Hardware ab, die du hast. Jedes Notebook hat seinen " "eigenen Frequenzgang und Dynamikbereich, so dass es kein Allheilmittel gibt. " "Aber die Audio-Signalprozessoren, ihre Reihenfolge und ihre Aufgaben sind " "gut definiert und reproduzierbar." #. (itstool) path: section/p #: C/guide_1.page:114 msgid "" "Don't care about clipping in the plugins level meters. The signal will be " "processed as 32bit numbers internally (check title bar) which gives a non-" "clipping overhead of hundrets of decibels. The only thing that shouldn't " "happen is that there's clipping when the signal hits the sound card " "DAC(Digital-to-Analog Converter), which would result in digital distortion." msgstr "" "Kümmere dich nicht um das Clipping in den Pegelanzeigen der Plugins. Das " "Signal wird intern als 32bit-Zahlen verarbeitet (siehe Titelzeile), was " "einen nicht-clipping Overhead von hunderten von Dezibel ergibt. Das Einzige, " "was nicht passieren sollte, ist, dass es ein Clipping gibt, wenn das Signal " "auf den DAC (Digital-Analog-Wandler) der Soundkarte trifft, was zu digitalen " "Verzerrungen führen würde." #. (itstool) path: section/p #: C/guide_1.page:115 msgid "Let's head over to the signal chain:" msgstr "Kommen wir zur Signalkette:" #. (itstool) path: item/title #: C/guide_1.page:118 msgid "Limiter" msgstr "Limiter" #. (itstool) path: item/p #: C/guide_1.page:121 msgid "" "We will start with the last signal processor being " "used. As I explained earlier, as soon as the signal hits the sound card DAC " "it has to be below 0dB, otherwise it will result in a distorted, messy sound." msgstr "" "Wir beginnen mit der Verwendung des letzten " "Signalprozessors. Wie ich bereits erklärt habe, muss das Signal, sobald es " "auf den DAC der Soundkarte trifft, unter 0dB liegen, da es sonst zu einem " "verzerrten, unsauberen Klang führt." #. (itstool) path: item/p #: C/guide_1.page:126 msgid "" "Drag the Limiter to the top of the list of processors and enable it. You " "will not hear any difference, which is what we expect. It will hit in as " "soon as we start messig up the signal with all the other processors. Set " "lookahead to 2ms, release to 8ms and oversampling to x4." msgstr "" "Ziehe den Limiter an den Anfang der Liste der Prozessoren und aktiviere ihn. " "Du wirst keinen Unterschied hören, was wir auch erwarten. Er wird sich " "einschalten, sobald wir das Signal mit allen anderen Prozessoren " "durcheinander bringen. Stelle den Ausblick auf 2ms, die Ausklingzeit auf 8ms " "und die Überabtastung auf x4." #. (itstool) path: item/p #: C/guide_1.page:127 msgid "" "A limiter monitors the signal in (nearly) realtime and detects peaks over a " "certain threshold, in our case 0 dB. As soon as a peak is detected, it " "starts lowering the volume constantly (within the lookahead) until the peak " "will be below threshold. Afterwards it raises the volume again (within " "release time frame) until it is back to normal. This way we avoid signals " "above threshold hitting the DAC without being noticed too much. If one tries " "to overdo limiting, it will definitely result in distortion and other side " "effects, but in our case it's just a fire-and-forget troubleshooter so we " "can concentrate on the results without trying to mess with levelling over " "and over again." msgstr "" "Ein Limiter überwacht das Signal in (fast) Echtzeit und erkennt Spitzen über " "einem bestimmten Schwellenwert, in unserem Fall 0 dB. Sobald ein Peak " "erkannt wird, beginnt er die Lautstärke konstant (innerhalb der Vorausschau) " "zu senken, bis der Peak unter dem Schwellwert liegt. Danach erhöht er die " "Lautstärke wieder (innerhalb der Release-Zeit), bis sie wieder normal ist. " "Auf diese Weise vermeiden wir, dass Signale oberhalb des Thresholds " "unbemerkt auf den DAC treffen. Wenn man versucht, das Limitieren zu " "übertreiben, wird es definitiv zu Verzerrungen und anderen Nebenwirkungen " "führen, aber in unserem Fall ist es nur ein Fire-and-Forget Problemlöser, so " "dass wir uns auf die Ergebnisse konzentrieren können, ohne zu versuchen, " "immer wieder mit dem Einpegeln zu spielen." #. (itstool) path: item/p #: C/guide_1.page:128 msgid "" "Don't overdo things! This might render your overall sound eperience worse " "than before." msgstr "" "Übertreib's nicht! Das könnte dein gesamtes Klangerlebnis schlechter machen " "als vorher." #. (itstool) path: item/p #: C/guide_1.page:129 msgid "Let's look at the real processing now." msgstr "" "Schauen wir uns jetzt die echte Verarbeitung an." #. (itstool) path: item/title #: C/guide_1.page:136 msgid "Filter" msgstr "Filter" #. (itstool) path: item/p #: C/guide_1.page:139 msgid "" "First of all we should remove frequencies that cannot be heard because even " "if the speakers are unable to reproduce them a lot of energy will be wasted " "in the process. This will lead to problems like not being able to use the " "full dynamic range and the introduction of digital and physical distortions." msgstr "" "Zuerst sollten wir die nicht hörbaren Frequenzen entfernen, denn selbst wenn " "die Lautsprecher sie nicht wiedergeben können, wird viel Energie " "verschwendet. Dies führt zu Problemen wie der nicht vollständigen Ausnutzung " "des Dynamikbereichs und der Einführung von digitalen und physikalischen " "Verzerrungen." #. (itstool) path: item/p #: C/guide_1.page:140 msgid "" "Drag the Filter to the top of the list (above the Limiter) and enable it. " "Set the type to 36 dB High Pass (this will cutt off everything below a " "frequency and will let everything above it pass) and the frequency to 50 Hz " "(which is definitely below your laptop's speakers abilities). Continuously " "raise the frequency by 10 Hz until you start hearing a change in the lower " "end of the audible signal, which should be around 130-160Hz. Subtract 10% " "(or 15 Hz) and set it as the Filters frequency. On my machine it is 145 Hz, " "since the signal started being affected at 160Hz." msgstr "" "Ziehe den Filter an den Anfang der Liste (oberhalb des Limiters) und " "aktiviere ihn. Setze den Typ auf 36 dB Hochpass (dies schneidet alles " "unterhalb einer Frequenz ab und lässt alles oberhalb passieren) und die " "Frequenz auf 50 Hz (was definitiv unterhalb der Fähigkeiten deines Laptops " "liegt). Erhöhe die Frequenz kontinuierlich um 10 Hz, bis du eine Veränderung " "am unteren Ende des akustischen Signals hörst, die etwa 130-160 Hz betragen " "sollte. Ziehe 10% (oder 15 Hz) ab und stelle diese als Filterfrequenz ein. " "Bei meiner Maschine beträgt sie 145 Hz, da das Signal schon bei 160Hz " "beeinflusst wird." #. (itstool) path: item/p #: C/guide_1.page:141 msgid "" "What happened is that we removed everything the speakers can't reproduce at " "all, leaving a little bit of signal just below this frequency, which is " "quite important for the next step." msgstr "" "Was passiert ist, ist, dass wir alles entfernt haben, was die Lautsprecher " "überhaupt nicht wiedergeben können, so dass ein kleines bisschen Signal " "knapp unterhalb dieser Frequenz bleibt, was für den nächsten Schritt " "ziemlich wichtig ist." #. (itstool) path: item/title #: C/guide_1.page:144 msgid "Bass Enhancer" msgstr "Bass-Verstärker" #. (itstool) path: item/p #: C/guide_1.page:147 msgid "Let's grow some testicles to the signal." msgstr "Lassen wir dem Signal ein paar Hoden wachsen." #. (itstool) path: item/p #: C/guide_1.page:148 msgid "" "Drag the Bass Enhancer to the second position after the Filter plugin and " "enable it. Set the floor to 10Hz and forget about it (we already removed " "everything below the Filter plugin cuttoff frequency). Raise Harmony to 10 " "and start with a range of 200Hz. Now start raising the amount continuously " "until the bass takes over the whole energy, which is definitely too much. " "For me it works best at +24dB. Which is huge but my ThinkPad P1 has the " "worst speakers I've ever heard in a 2.8k € notebook." msgstr "" "Ziehe den Bass-Verstärker an die zweite Position nach dem Filter-Plugin und " "aktiviere ihn. Setze den Boden auf 10Hz und vergiss es (wir haben bereits " "alles unterhalb der Cutoff-Frequenz des Filter-Plugins entfernt). Erhöhe die " "Obertöne auf 10 und beginne mit einem Bereich von 200Hz. Nun fange an, den " "Wert kontinuierlich zu erhöhen, bis der Bass die gesamte Energie übernimmt, " "was definitiv zu viel ist. Für mich funktioniert es am besten bei +24dB. Das " "ist riesig, aber mein ThinkPad P1 hat die schlechtesten Lautsprecher, die " "ich je in einem 2.8k € Notebook gehört habe." #. (itstool) path: item/p #: C/guide_1.page:149 msgid "" "What happens is that the Bass Enhancer adds frequencies to the signal which " "weren't there before. While an equalizer only raises stuff which is already " "in the signal, a bass enhancer improves the lower end by adding distortion " "to a specific frequency range. This kind of distortion adds so called " "harmonics to the signal which is a multiple of existing frequencies. You can " "choose seamlessly between 2nd and 3rd harmonics, which means that a " "frequency of 100Hz produces a new signal of " "200Hz/300Hz/400Hz/600Hz/800Hz/900Hz/... at varying (due to the harmonics " "setting) and constantly decreasing levels. This means we're effectively " "raising the lower range into something better reproducable. It doesn't add " "or raise the real fundament (so your trousers " "won't start to flutter), but makes more audible signals that have been " "swallowed by the hardware before." msgstr "" "Was passiert, ist, dass der Bass-Verstärker dem Signal Frequenzen hinzufügt, " "die vorher nicht vorhanden waren. Während ein Equalizer nur das anhebt, was " "bereits im Signal vorhanden ist, verbessert ein Bass-Verstärker das untere " "Ende, indem er Verzerrungen in einem bestimmten Frequenzbereich hinzufügt. " "Diese Art der Verzerrung fügt dem Signal so genannte Obertöne hinzu, die ein " "Vielfaches der vorhandenen Frequenzen sind. Du kannst nahtlos zwischen der " "2. und 3. Oberwelle wählen, d.h. eine Frequenz von 100Hz erzeugt ein neues " "Signal von 200Hz/300Hz/400Hz/600Hz/800Hz/900Hz/... bei variierenden (durch " "die Oberwelleneinstellung bedingten) und ständig abnehmenden Pegeln. Das " "bedeutet, dass wir den unteren Bereich effektiv in etwas besser " "reproduzierbares anheben. Es addiert oder erhöht nicht das echte Fundament (damit Deine Hose nicht anfängt zu flattern), " "sondern macht mehr akustische Signale hörbar, die vorher von der Hardware " "verschluckt wurden." #. (itstool) path: item/p #: C/guide_1.page:154 msgid "" "Your output meters will definitely start to flash red but you shouldn't care " "about it since it doesn't result in digital distortion of the overall signal " "as explained earlier." msgstr "" "Deine Ausgangsanzeigen werden definitiv anfangen, rot zu blinken, aber das " "sollte dich nicht kümmern, da es nicht zu einer digitalen Verzerrung des " "Gesamtsignals führt, wie bereits erklärt wurde." #. (itstool) path: item/p #: C/guide_1.page:155 msgid "" "Later on, in order to refine the result, you should play with the amount " "parameter to define the level of bass and maybe with the range to define the " "upper end of our additional harmonics." msgstr "" "Später, um das Ergebnis zu verfeinern, solltest du mit dem Parameter Betrag " "spielen, um den Basspegel zu definieren und vielleicht mit dem Bereich, um " "das obere Ende unserer zusätzlichen Obertöne zu definieren." #. (itstool) path: item/title #: C/guide_1.page:158 msgid "Multiband Compressor" msgstr "Multiband-Kompressor" #. (itstool) path: item/p #: C/guide_1.page:161 msgid "" "This is the most demanding step in the chain. Even professionals have great " "respect for this signal processor since it's absolutely able to destroy your " "signals big time. But let's be honest, we're consumers and no one will hear " "the difference between 100 ms and 200 ms attack time - even on notebook and " "tablet speakers. This means we can work with some reliable, well established " "defaults for the timing and frequency splits." msgstr "" "Dies ist der anspruchsvollste Schritt in der Kette. Selbst Profis haben " "großen Respekt vor diesem Signalprozessor, da er absolut in der Lage ist, " "deine Signale im großen Stil zu zerstören. Aber seien wir ehrlich, wir sind " "Verbraucher und niemand wird den Unterschied zwischen 100 ms und 200 ms " "Angriffszeit hören - auch nicht bei Notebook- und Tablet-Lautsprechern. Das " "bedeutet, dass wir mit einigen zuverlässigen, gut etablierten " "Standardeinstellungen für das Timing und die Frequenzaufteilung arbeiten " "können." #. (itstool) path: item/p #: C/guide_1.page:162 msgid "" "The Multiband Compressor will solve several things for us. It will cut " "outstanding and annoying frequencies, lower the overall dynamic range and " "figure our overall frequency reponse. The latter is what most people try to " "achieve with an equalizer. Thing is equalizers aren't dynamic which will add " "to the problems instead of solving anything." msgstr "" "Der Multiband-Kompressor wird für uns mehrere Dinge lösen. Er wird " "herausragende und störende Frequenzen absenken, die Gesamtdynamik senken und " "unser Gesamtfrequenzverhalten darstellen. Letzteres ist das, was die meisten " "Leute mit einem Equalizer zu erreichen versuchen. Die Sache ist die, dass " "Equalizer nicht dynamisch sind, was die Probleme noch verstärkt, anstatt sie " "zu lösen." #. (itstool) path: item/p #: C/guide_1.page:163 msgid "" "Drag the Multiband Compressor to the third position, after the Bass Enhancer " "and before the Limiter." msgstr "" "Ziehe den Multiband-Kompressor auf die dritte Position, nach dem Bass-" "Verstärker und vor dem Limiter." #. (itstool) path: item/p #: C/guide_1.page:164 msgid "" "Since the Bass Enhancer really raised the energy and level of the signal, " "lower the Multiband Compressor input gain to -6 dB as a starting point. " "Let's set the split frequencies for the different bands to:" msgstr "" "Da der Bass-Verstärker die Energie und den Pegel des Signals wirklich erhöht " "hat, sollte die Eingangsverstärkung des Multiband-Kompressors als " "Ausgangspunkt auf -6 dB gesenkt werden. Stellen wir die Teilfrequenzen für " "die verschiedenen Bänder auf:" #. (itstool) path: item/p #: C/guide_1.page:167 msgid "250 Hz" msgstr "250 Hz" #. (itstool) path: item/p #: C/guide_1.page:170 msgid "1250 Hz" msgstr "1250 Hz" #. (itstool) path: item/p #: C/guide_1.page:173 msgid "5000 Hz" msgstr "5000 Hz" #. (itstool) path: item/p #: C/guide_1.page:176 msgid "Afterwards let's set some defaults:" msgstr "Anschließend setzen wir einige Standardeinstellungen:" #. (itstool) path: item/p #: C/guide_1.page:179 msgid "Low Band" msgstr "Niedriger Bereich" #. (itstool) path: item/p #: C/guide_1.page:182 C/guide_1.page:205 msgid "Attack: 150 ms" msgstr "Anstiegszeit: 150 ms" #. (itstool) path: item/p #: C/guide_1.page:185 msgid "Release: 300 ms" msgstr "Ausklingzeit: 300 ms" #. (itstool) path: item/p #: C/guide_1.page:188 msgid "Threshold: -16 dB" msgstr "Schwelle: -16 dB" #. (itstool) path: item/p #: C/guide_1.page:191 msgid "Ratio: 5:1" msgstr "Verhältnis: 5:1" #. (itstool) path: item/p #: C/guide_1.page:194 msgid "Knee: 12 dB" msgstr "Übergang: 12 dB" #. (itstool) path: item/p #: C/guide_1.page:197 C/guide_1.page:220 C/guide_1.page:243 C/guide_1.page:266 msgid "Makeup: 4 dB" msgstr "Hebung: 4 dB" #. (itstool) path: item/p #: C/guide_1.page:202 msgid "Low Mid Band" msgstr "Mittelniedriger Bereich" #. (itstool) path: item/p #: C/guide_1.page:208 msgid "Release: 200 ms" msgstr "Ausklingzeit: 200 ms" #. (itstool) path: item/p #: C/guide_1.page:211 C/guide_1.page:234 C/guide_1.page:257 msgid "Threshold: -24 dB" msgstr "Schwelle: -24 dB" #. (itstool) path: item/p #: C/guide_1.page:214 C/guide_1.page:237 msgid "Ratio: 3:1" msgstr "Verhältnis: 3:1" #. (itstool) path: item/p #: C/guide_1.page:217 C/guide_1.page:240 C/guide_1.page:263 msgid "Knee: 9 dB" msgstr "Übergang: 9 dB" #. (itstool) path: item/p #: C/guide_1.page:225 msgid "High Mid Band" msgstr "Mittelhoher Bereich" #. (itstool) path: item/p #: C/guide_1.page:228 msgid "Attack: 100 ms" msgstr "Anstiegszeit: 100 ms" #. (itstool) path: item/p #: C/guide_1.page:231 msgid "Release: 150 ms" msgstr "Ausklingzeit: 150 ms" #. (itstool) path: item/p #: C/guide_1.page:248 msgid "High Band" msgstr "Hoher Bereich" #. (itstool) path: item/p #: C/guide_1.page:251 msgid "Attack: 80 ms" msgstr "Anstiegszeit: 80 ms" #. (itstool) path: item/p #: C/guide_1.page:254 msgid "Release: 120 ms" msgstr "Ausklingzeit: 120 ms" #. (itstool) path: item/p #: C/guide_1.page:260 msgid "Ratio: 4:1" msgstr "Verhältnis: 4:1" #. (itstool) path: item/p #: C/guide_1.page:271 msgid "These values should be a good starting point." msgstr "Diese Werte sollten ein guter Ausgangspunkt sein." #. (itstool) path: item/p #: C/guide_1.page:272 msgid "" "A compressor lowers signal levels which appear above a certain threshold. It " "adds a simple multiplication to the signal defined by the ratio. If the " "threshold is set to -24 dB and ratio to 2:1, a signal of -12 dB would in " "fact become -18 dB. In this example one can then raise the makeup parameter " "to 6dB, since this is what went \"lost\". So first of all we're rendering " "loud signals quieter to then raise the overall volume, which leads to less " "dynamic range with quiet parts becoming more audible." msgstr "" "Ein Kompressor senkt Signalpegel, die oberhalb eines bestimmten " "Schwellwertes auftreten. Er addiert eine einfache Multiplikation zu dem " "durch das Verhältnis definierte Signal. Wenn die Schwelle auf -24 dB und das " "Verhältnis auf 2:1 gestellt ist, wird ein Signal von -12 dB tatsächlich zu " "-18 dB. In diesem Beispiel kann man dann den Makeup-Parameter auf 6dB " "anheben, da dies \"verloren\" ging. Wir geben also zunächst laute Signale " "leiser wieder, um dann die Gesamtlautstärke zu erhöhen, was zu einem " "geringeren Dynamikumfang führt, wobei leise Teile besser hörbar werden." #. (itstool) path: item/p #: C/guide_1.page:273 msgid "" "The timing settings affect the \"speed\" of the compression. Attack means " "that a signal needs to go over threshold for this amount of time until the " "compressor reaches the full (negative) amplification. Release defines the " "amount of time the signal has to stay below threshold until the " "amplification is back to 1 again." msgstr "" "Die Timing-Einstellungen beeinflussen die \"Geschwindigkeit\" der " "Kompression. Anstiegszeit bedeutet, dass ein Signal die Schwelle für diese " "Zeitspanne überschreiten muss, bis der Kompressor die volle (negative) " "Verstärkung erreicht. Ausklingzeit legt fest, wie lange das Signal unter der " "Schwelle bleiben muss, bis die Verstärkung wieder auf 1 zurückgeht." #. (itstool) path: item/p #: C/guide_1.page:274 msgid "" "A multi-band compressor splits the signal in various frequency ranges to " "work on them exclusively with dedicated compression stages. This means that " "a very loud bass drum would not affect a crash cymbal, since they are " "clearly located in different bands." msgstr "" "Ein Multiband-Kompressor teilt das Signal in verschiedene Frequenzbereiche " "auf, um diese ausschließlich mit dedizierten Kompressionsstufen zu " "bearbeiten. Das bedeutet, dass eine sehr laute Bassdrum kein Crash-Becken " "beeinträchtigen würde, da sie sich eindeutig in verschiedenen Bändern " "befinden." #. (itstool) path: item/p #: C/guide_1.page:275 msgid "Start playing around with these parameters:" msgstr "Fange an, mit diesen Parametern herumzuspielen:" #. (itstool) path: item/p #: C/guide_1.page:278 msgid "" "Makeup This is probably most important setting in " "this concept. Makeup raises the signal after compression stage which means " "that it directly influences the perceived volume of every single band. Or in " "other words: this is your equalizer :) Raise " "makeup of single bands to make them louder or quieter. I ended up with Low/" "Low-Mid/High-Mid/High: 4 dB / 3 dB / 6 dB / 6 dB on my ThinkPad P1." msgstr "" "Hebung Dies ist wahrscheinlich die wichtigste " "Einstellung in diesem Konzept. Hebung hebt das Signal nach der " "Kompressionsstufe an, was bedeutet, dass es die wahrgenommene Lautstärke " "jedes einzelnen Bandes direkt beeinflusst. Oder anders ausgedrückt: das ist Dein Equalizer :) Erhöhe die Hebung einzelner " "Bänder, um sie lauter oder leiser zu machen. Am Ende hatte ich Low/Low-Mid/" "High-Mid/High: 4 dB / 3 dB / 6 dB / 6 dB auf meinem ThinkPad P1." #. (itstool) path: item/p #: C/guide_1.page:286 msgid "" "Input Level Set it to -6 dB by default, I ended up " "at -3dB. What happens is that a higher input level pushes all bands of the " "compressor equally, leading to a allegedly louder sound (well, the loudness " "was raised in fact) without tweaking every single band manually. This " "reduces the overall dynamic range, raising quiet parts and squeezing loud " "parts even more." msgstr "" "Eingangspegel Stelle ihn standardmäßig auf -6 dB " "ein, ich landete bei -3dB. Was passiert, ist, dass ein höherer Eingangspegel " "alle Bänder des Kompressors gleich stark belastet, was zu einem vermeintlich " "lauteren Klang führt (nun, die Lautstärke wurde tatsächlich erhöht), ohne " "dass jedes einzelne Band manuell angepasst werden muss. Dadurch wird der " "gesamte Dynamikbereich reduziert, leise Teile werden angehoben und laute " "Teile noch mehr gequetscht." #. (itstool) path: item/title #: C/guide_1.page:294 msgid "Stereo Tools" msgstr "Stereowerkzeuge" #. (itstool) path: item/p #: C/guide_1.page:297 msgid "After figuring our overall sound let's look for some icing on the cake." msgstr "" "Nachdem wir unseren Gesamtsound ausgearbeitet haben, schauen wir nach dem " "Sahnehäubchen auf dem Kuchen." #. (itstool) path: item/p #: C/guide_1.page:298 msgid "" "Drag the Stereo Tools to the fourth position, after Multiband Compressor and " "before Limiter. This tool has a lot of functionality but we only need just a " "single parameter. Switch to the last tab \"Output\" and set the parameter " "stereo base to 0.25. That's it." msgstr "" "Ziehe die Stereowerkzeuge an die vierte Position, nach Multiband-Kompressor " "und vor Limiter. Dieses Werkzeug hat eine Menge Funktionalität, aber wir " "brauchen nur einen einzigen Parameter. Wechsel auf den letzten Reiter " "\"Output\" und stelle den Parameter Stereobasis auf 0,25 ein. Das war's " "schon." #. (itstool) path: item/p #: C/guide_1.page:299 msgid "" "Stereo base acts on the two channels. It adds inverted signals crossover-" "wise. This way one can bring a full stereo signal down to mono seamlessly " "(by going negative values, -1 is fully mono) but also raise the stereo base " "by choosing positive numbers. This setting has lots of side effects, so " "avoid overdoing it! One of the bigger problems is that it reduces the bass " "range due to different effects, which is something we definitely don't want here." msgstr "" "Die Stereobasis wirkt auf die beiden Kanäle. Sie fügt invertierte Signale " "kreuzweise hinzu. Auf diese Weise kann man ein volles Stereosignal nahtlos " "auf Mono herunterbringen (durch negative Werte, -1 ist voll mono), aber auch " "die Stereobasis durch positive Werte anheben. Diese Einstellung hat viele " "Nebenwirkungen, also nicht übertreiben! Eines der größeren Probleme ist, " "dass sie den Bassbereich durch verschiedene Effekte reduziert, was wir definitiv hier nicht wollen." #. (itstool) path: item/p #: C/guide_1.page:304 msgid "" "Play with stereo base to spread the appearance of your sound to a nice, " "broad stage without loosing the center (vocals, snare drums, conversations " "in movies) or substance in the lower end. Most likely values between 0 and " "0.5 will give some good results." msgstr "" "Spiele mit der Stereobasis, um das Erscheinungsbild deines Sounds auf eine " "schöne, breite Bühne zu verbreiten, ohne die Mitte (Gesang, Snare Drums, " "Gespräche in Filmen) oder Substanz im unteren Bereich zu verlieren. " "Höchstwahrscheinlich werden Werte zwischen 0 und 0,5 gute Ergebnisse liefern." #. (itstool) path: section/title #: C/guide_1.page:309 msgid "Aftermath" msgstr "Nachwirkungen" #. (itstool) path: section/p #: C/guide_1.page:310 msgid "" "Hopefully you ended up with a better sound than " "before. This signal processor chain is able to completely trash your sound " "if not done right but also can improve it to compete with some high class " "notebook speaker systems. All manufacturers put on the pants the same way " "and Dolby Theatre is no rocket science but just some presets on a presumably " "comparable set of signal processors set up in the presumably same way as " "this tutorial explained." msgstr "" "Hoffentlich hast du am Ende einen besseren Sound " "als vorher. Diese Signalprozessorkette ist in der Lage, deinen Sound " "komplett zu zerstören, wenn er nicht richtig gemacht wird, kann ihn aber " "auch verbessern, um mit einigen hochklassigen Notebook-Lautsprechersystemen " "zu konkurrieren. Alle Hersteller ziehen sich die Hosen gleich an und Dolby " "Theatre ist keine Raketenwissenschaft, sondern nur einige Presets auf einem " "vermutlich vergleichbaren Set von Signalprozessoren, die in der vermutlich " "gleichen Weise wie in diesem Tutorial erklärt, aufgebaut sind." #. (itstool) path: section/p #: C/guide_1.page:315 msgid "" "When my notebook was new, I first ran the pre-installed Windows system in " "order to test if all hardware is working. Sound-wise I remembered the bad " "reputation of this machine in every test, so I tried some tunes on Youtube - " "and was quite convinced. After installing my Linux system the enthusiasm was " "totally gone - the sound turned into a squawking, pressureless something. It " "became clear that all problems of the internal speakers where due to the " "missing sound chips DSP driver. But fortunately Wellington Wallace spent his " "spare-time casting the most important Calf plug-ins for this job into " "something usable on consumers systems. Thanks a bunch for that, mate!" msgstr "" "Als mein Notebook neu war, habe ich zuerst das vorinstallierte Windows-" "System ausgeführt, um zu testen, ob die gesamte Hardware funktioniert. " "Klanglich erinnerte ich mich bei jedem Test an den schlechten Ruf dieser " "Maschine, also probierte ich einige Stücke auf Youtube aus - und war " "ziemlich überzeugt. Nach der Installation meines Linux-Systems war die " "Begeisterung völlig verflogen - der Sound wurde zu einem quäkenden, " "drucklosen Etwas. Es stellte sich heraus, dass alle Probleme der internen " "Lautsprecher auf den fehlenden DSP-Treiber des Soundchips zurückzuführen " "waren. Aber zum Glück verbrachte Wellington Wallace seine Freizeit damit, " "die wichtigsten Calf-Plugins für diesen Job in etwas zu gießen, das auf den " "Systemen der Verbraucher nutzbar ist. Vielen Dank dafür, Kumpel!" #. (itstool) path: section/title #: C/guide_1.page:318 msgid "tl;dr" msgstr "tl;dr" #. (itstool) path: section/p #: C/guide_1.page:319 msgid "" "Sorry dude, this isn't done by simply loading a preset, since the community " "is not Apple, Lenovo or Dell offering high quality Dolby Theatre drivers for " "your particular machine." msgstr "" "Sorry Kumpel, das geschieht nicht einfach durch das Laden eines Presets, da " "die Community nicht Apple, Lenovo oder Dell ist, die qualitativ hochwertige " "Dolby Theatre Treiber für dein spezielles Gerät anbieten." #. (itstool) path: page/title #: C/rnnoise.page:9 #, fuzzy msgid "Noise Reduction" msgstr "Verstärkungsreduzierung" #. (itstool) path: page/p #: C/rnnoise.page:10 msgid "Noise reduction is the process of removing noise from a signal." msgstr "" #. (itstool) path: page/p #: C/rnnoise.page:13 msgid "" "PulseEffects Noise Reduction is made on the library RNNoise which is based " "based on recurrent neural network, a class of artificial neural networks " "where connections between nodes form a directed graph along a temporal " "sequence. This allows it to exhibit temporal dynamic behavior." msgstr "" #. (itstool) path: page/p #: C/rnnoise.page:19 msgid "" "Standard RNNoise Model is used and custom models can be imported to perform " "different types of noise reduction." msgstr "" #~ msgid "ASC" #~ msgstr "ASC" #, fuzzy #~ msgid "Reference Signal" #~ msgstr "Referenzen" easyeffects-4.8.7/help/it_IT/000077500000000000000000000000001424023573300157765ustar00rootroot00000000000000easyeffects-4.8.7/help/it_IT/it_IT.po000066400000000000000000004132201424023573300173500ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: pulseeffects\n" "POT-Creation-Date: 2020-11-22 18:51+0100\n" "PO-Revision-Date: \n" "Last-Translator: Gianluca Boiano \n" "Language-Team: \n" "Language: it_IT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.1\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. Put one translator per line, in the form NAME , YEAR1, YEAR2 msgctxt "_" msgid "translator-credits" msgstr "" "gianluca boiano ,2019\n" "Digitalone , 2019" #. (itstool) path: page/title #: C/bassenhancer.page:9 msgid "Bass Enhancer" msgstr "Enfasi Bassi" #. (itstool) path: page/p #: C/bassenhancer.page:10 msgid "" "The brain perceives the pitch of a tone not only by its fundamental " "frequency but also by the periodicity implied by the relationship between " "the higher harmonics. We may perceive the same pitch even if the fundamental " "frequency is missing from a tone." msgstr "" "Il cervello percepisce la tonalità di un suono non solo dalla sua frequenza " "fondamentale, ma anche dalla periodicità intesa come la relazione tra le " "armoniche più alte. Possiamo percepire la stessa tonalità anche se la " "frequenza fondamentale è assente da un suono." #. (itstool) path: page/p #: C/bassenhancer.page:16 msgid "PulseEffects uses the bass enhancer developed by Calf Studio." msgstr "PulseEffects usa il plugin di Enfasi Bassi sviluppato da Calf Studio." #. (itstool) path: title/em #: C/bassenhancer.page:22 C/exciter.page:21 C/reverb.page:40 msgid "Amount" msgstr "Quantità" #. (itstool) path: item/p #: C/bassenhancer.page:24 C/exciter.page:23 msgid "Amount of harmonics added to the original signal." msgstr "Quantità di armoniche aggiunte al segnale originale." #. (itstool) path: title/em #: C/bassenhancer.page:30 C/exciter.page:29 msgid "Harmonics" msgstr "Armoniche" #. (itstool) path: item/p #: C/bassenhancer.page:32 C/exciter.page:31 msgid "Amount of newly created harmonics." msgstr "Quantità di nuove armoniche create." #. (itstool) path: title/em #: C/bassenhancer.page:38 C/exciter.page:37 msgid "Scope" msgstr "Soglia" #. (itstool) path: item/p #: C/bassenhancer.page:40 C/exciter.page:39 msgid "The frequency harmonics are produced above." msgstr "La frequenza oltre la quale vengono prodotte le armoniche." #. (itstool) path: title/em #: C/bassenhancer.page:46 msgid "Floor(button)" msgstr "Limite Inferiore(pulsante)" #. (itstool) path: item/p #: C/bassenhancer.page:48 msgid "Constrain the enhancement on the lower end." msgstr "Impedisce l'enfasi nella parte inferiore." #. (itstool) path: title/em #: C/bassenhancer.page:54 msgid "Floor(value)" msgstr "Limite Inferiore(valore)" #. (itstool) path: item/p #: C/bassenhancer.page:56 msgid "The frequency no harmonics are produced below." msgstr "Frequenza al di sotto della quale non verrà prodotta alcuna armonica." #. (itstool) path: title/em #: C/bassenhancer.page:62 C/exciter.page:61 msgid "Blend Harmonics" msgstr "Mix Armoniche" #. (itstool) path: item/p #: C/bassenhancer.page:64 C/exciter.page:63 msgid "The \"colour\" (or octave) of the harmonics." msgstr "Il \"colore\" (o ottava) delle armoniche." #. (itstool) path: title/em #: C/bassenhancer.page:70 C/compressor.page:97 C/exciter.page:69 msgid "Listen" msgstr "Ascolta" #. (itstool) path: item/p #: C/bassenhancer.page:72 C/exciter.page:71 msgid "Mute the original signal and listen to the harmonics exclusively." msgstr "Disattiva il segnale originale e ascolta esclusivamente le armoniche." #. (itstool) path: section/title #: C/bassenhancer.page:78 C/compressor.page:266 C/deesser.page:111 #: C/exciter.page:77 C/filter.page:47 C/gate.page:96 C/delay.page:33 #: C/limiter.page:100 C/loudness.page:56 C/multibandcompressor.page:128 #: C/multibandgate.page:136 C/reverb.page:97 C/stereotools.page:96 #: C/crossfeed.page:35 C/equalizer.page:251 C/pitch.page:87 C/webrtc.page:140 #: C/crystalizer.page:53 C/convolver.page:42 C/autogain.page:76 #: C/rnnoise.page:24 msgid "References" msgstr "Note" #. (itstool) path: page/title #. (itstool) path: section/title #: C/compressor.page:9 C/webrtc.page:84 msgid "Compressor" msgstr "Compressore" #. (itstool) path: page/p #: C/compressor.page:10 msgid "A compressor is used to reduce the audio signal dynamic range." msgstr "" "Il Compressore viene utilizzato per ridurre la gamma dinamica del segnale " "audio." #. (itstool) path: page/p #: C/compressor.page:13 msgid "PulseEffects uses the compressor from Linux Studio Plugins." msgstr "PulseEffects usa il Compressore sviluppato da Linux Studio Plugins." #. (itstool) path: title/em #: C/compressor.page:20 C/gate.page:20 C/multibandcompressor.page:20 #: C/multibandgate.page:20 msgid "Attack" msgstr "Attacco" #. (itstool) path: item/p #: C/compressor.page:22 msgid "" "Attack determines how many milliseconds (ms) it takes your compressor to " "apply a full dose of compression to your audio signal once it passes the " "threshold. If the signal peaks above the threshold and quickly returns to " "below the threshold, it may never receive a full dose of compression." msgstr "" "L'attacco indica il tempo in millisecondi (ms) nel quale il plugin applica " "interamente la compressione del segnale una volta superato il valore della " "soglia. Se il segnale supera la soglia e ritorna velocemente al di sotto di " "essa, allora non riceverà una compressione completa." #. (itstool) path: title/em #: C/compressor.page:31 C/gate.page:29 C/limiter.page:39 #: C/multibandcompressor.page:29 C/multibandgate.page:29 C/maximizer.page:44 msgid "Release" msgstr "Rilascio" #. (itstool) path: item/p #: C/compressor.page:33 msgid "" "Release determines how many milliseconds (ms) it takes your compressor to " "stop attenuating gain once your audio signal drops below the threshold. A " "fast release will cause your compressor to stop attenuating gain quickly " "once the signal returns below the threshold. A slow release will cause your " "compressor to stop attenuating gain slowly once the signal returns below the " "threshold." msgstr "" "Il rilascio indica il tempo in millisecondi (ms) nel quale il plugin termina " "di applicare la fase di compressione quando il segnale scende al di sotto " "del valore della soglia. Un rilascio breve fa sì che il compressore smetta " "velocemente di comprimere il segnale. Un rilascio più lungo invece terminerà " "la fase di compressione più lentamente quando il segnale ritorna sotto il " "valore di soglia." #. (itstool) path: title/em #: C/compressor.page:43 C/deesser.page:26 C/gate.page:38 #: C/multibandcompressor.page:38 C/multibandgate.page:46 C/maximizer.page:27 msgid "Threshold" msgstr "Soglia" #. (itstool) path: item/p #: C/compressor.page:45 msgid "If a signal surpass this level it will trigger the compression stage." msgstr "" "Se il segnale supera il valore specificato, verrà applicata la compressione. " "In modalità riduttiva, il segnale verrà ridotto in ampiezza se salirà oltre " "la soglia, mentre in modalità espansiva il segnale verrà amplificato se " "scenderà sotto la soglia." #. (itstool) path: title/em #: C/compressor.page:51 C/deesser.page:34 C/gate.page:46 #: C/multibandcompressor.page:46 C/multibandgate.page:54 msgid "Ratio" msgstr "Rapporto" #. (itstool) path: item/p #: C/compressor.page:53 C/deesser.page:36 C/gate.page:48 #: C/multibandcompressor.page:48 C/multibandgate.page:56 msgid "Set the ratio by which the signal will be reduced." msgstr "" "Imposta il rapporto di compressione. 1 non applica alcuna compressione, " "mentre valori maggiori applicano una compressione più marcata." #. (itstool) path: title/em #: C/compressor.page:59 C/gate.page:54 C/multibandcompressor.page:54 #: C/multibandgate.page:62 msgid "Knee" msgstr "Curvatura" #. (itstool) path: item/p #: C/compressor.page:61 C/gate.page:56 C/multibandcompressor.page:56 #: C/multibandgate.page:64 msgid "Controls how smooth is the entrance in the gain reduction phase." msgstr "" "Valore che determina la fluidità con cui si entra nella fase di " "compressione. 0 indica un'applicazione immediata, mentre valori più alti " "applicano la compressione in modo più soffice." #. (itstool) path: title/em #: C/compressor.page:67 C/deesser.page:42 C/gate.page:62 #: C/multibandcompressor.page:62 C/multibandgate.page:70 msgid "Makeup" msgstr "Guadagno" #. (itstool) path: item/p #: C/compressor.page:69 C/deesser.page:44 C/gate.page:64 #: C/multibandcompressor.page:64 C/multibandgate.page:72 msgid "It amplifies your signal after processing." msgstr "" "Valore di amplificazione del segnale dopo l'applicazione della compressione." #. (itstool) path: title/em #: C/compressor.page:75 msgid "Compression Mode" msgstr "Modalità di Compressione" #. (itstool) path: item/p #: C/compressor.page:79 msgid "" "Downward - Decreases the amplitude of the signal " "sections that are above the threshold." msgstr "" "Riduttiva - Riduce l'ampiezza delle parti di " "segnale che superano il valore della soglia." #. (itstool) path: item/p #: C/compressor.page:84 msgid "" "Upwards - Increases the amplitude of the signal " "sections that are below the threshold." msgstr "" "Espansiva - Amplifica l'ampiezza delle parti di " "segnale che si trovano al di sotto della soglia." #. (itstool) path: section/title #: C/compressor.page:93 msgid "Sidechain" msgstr "Sidechain" #. (itstool) path: item/p #: C/compressor.page:99 msgid "Allows to listen the processed sidechain signal." msgstr "Consente di ascoltare il segnale elaborato in sidechain." #. (itstool) path: title/em #: C/compressor.page:105 C/equalizer.page:99 msgid "Type" msgstr "Tipologia" #. (itstool) path: item/p #: C/compressor.page:109 msgid "" "Feed-forward - The sidechain input is connected to " "compressor's input. More aggressive compression." msgstr "" "Prelievo in ingresso - Il modulo di sidechain " "preleva il segnale all'ingresso del compressore. Compressione più aggressiva." #. (itstool) path: item/p #: C/compressor.page:115 msgid "" "Feed-back - The sidechain input is connected to " "compressor's output. Vintage-style more accurate compression." msgstr "" "Prelievo in uscita - Il modulo di sidechain " "preleva il segnale all'uscita del compressore. Compressione più accurata in " "stile vintage." #. (itstool) path: title/em #: C/compressor.page:124 C/deesser.page:103 C/multibandcompressor.page:95 #: C/multibandgate.page:103 C/stereotools.page:38 C/equalizer.page:23 #: C/equalizer.page:146 C/webrtc.page:75 msgid "Mode" msgstr "Modalità" #. (itstool) path: item/p #: C/compressor.page:128 msgid "Peak - Measure signal's peak." msgstr "Picco - Misura il picco del segnale." #. (itstool) path: item/p #: C/compressor.page:134 msgid "RMS - Root mean square of the input signal." msgstr "" "RMS - Valore medio quadratico del segnale di " "ingresso." #. (itstool) path: item/p #: C/compressor.page:140 msgid "" "Low-Pass - Input signal is processed by a low-pass " "filter." msgstr "" "Passa Basso - Il segnale di ingresso è elaborato " "da un filtro passa basso." #. (itstool) path: item/p #: C/compressor.page:146 msgid "" "Uniform - Input signal is processed by a uniform " "filter." msgstr "" "Uniforme - Il segnale di ingresso è elaborato da " "un filtro uniforme." #. (itstool) path: title/em #: C/compressor.page:155 msgid "Source" msgstr "Sorgente" #. (itstool) path: item/p #: C/compressor.page:159 msgid "" "Middle - Middle part of signal is used for " "sidechain processing." msgstr "" "Intermedia - La parte intermedia del segnale è " "usata per l'elaborazione in sidechain." #. (itstool) path: item/p #: C/compressor.page:165 msgid "" "Side - Side part of signal is used for sidechain " "processing." msgstr "" "Laterale - La parte laterale del segnale é usata " "per l'elaborazione in sidechain." #. (itstool) path: item/p #: C/compressor.page:171 msgid "" "Left - Only left channel is used for sidechain " "processing." msgstr "" "Canale Sinistro - Solo il canale sinistro è usato " "per l'elaborazione in sidechain." #. (itstool) path: item/p #: C/compressor.page:177 msgid "" "Right - Only right channel is used for sidechain " "processing." msgstr "" "Canale Destro - Solo il canale destro è usato per " "l'elaborazione in sidechain." #. (itstool) path: title/em #: C/compressor.page:186 msgid "Pre-amplification" msgstr "Pre-amplificazione" #. (itstool) path: item/p #: C/compressor.page:188 msgid "Pre-amplification of the sidechain signal." msgstr "Pre-amplificazione del segnale di sidechain." #. (itstool) path: title/em #: C/compressor.page:194 msgid "Reactivity" msgstr "Reattività" #. (itstool) path: item/p #: C/compressor.page:196 msgid "Reactivity of the sidechain signal." msgstr "Reattività del segnale di sidechain." #. (itstool) path: title/em #: C/compressor.page:202 C/limiter.page:30 msgid "Lookahead" msgstr "Lookahead" #. (itstool) path: item/p #: C/compressor.page:204 msgid "Look-ahead time of the sidechain relative to the input signal." msgstr "Tempo di look-ahead in sidechain, relativo al segnale di ingresso." #. (itstool) path: section/title #: C/compressor.page:211 msgid "Advanced" msgstr "Avanzate" #. (itstool) path: title/em #: C/compressor.page:215 msgid "Relative Release Threshold" msgstr "Soglia di Rilascio Relativa" #. (itstool) path: item/p #: C/compressor.page:217 msgid "" "Relative to the Attack Threshold that sets up the threshold of Release Time." msgstr "" "Relativa alla Soglia di Attacco che imposta la soglia del Tempo di Rilascio." #. (itstool) path: title/em #: C/compressor.page:223 msgid "Boost Threshold" msgstr "Soglia di Incremento" #. (itstool) path: item/p #: C/compressor.page:225 msgid "" "Related to upward compression mode only. It defines the threshold below " "which the constant amplification will be applied to the input signal. This " "prevents the compressor from applying infinite amplification to very quiet " "signals." msgstr "" "Relativa esclusivamente alla modalità espansiva. Definisce la soglia sotto " "la quale verrà applicata un'amplificazione costante al segnale di input. Ciò " "impedisce al compressore di applicare un'amplificazione infinita a segnali " "molto silenziosi." #. (itstool) path: title/em #: C/compressor.page:233 msgid "High-pass Filter Mode" msgstr "Modalità Filtro Passa-Alto" #. (itstool) path: item/p #: C/compressor.page:235 msgid "Sets the type of the high-pass filter applied to sidechain signal." msgstr "" "Imposta la tipologia del filtro passa-alto applicato al segnale di sidechain" #. (itstool) path: title/em #: C/compressor.page:241 msgid "High-pass Frequency" msgstr "Frequenza Passa-Alto" #. (itstool) path: item/p #: C/compressor.page:243 msgid "Sets the cut-off frequency of the high-pass filter." msgstr "Imposta la frequenza di taglio del filtro passa-alto." #. (itstool) path: title/em #: C/compressor.page:249 msgid "Low-pass Filter Mode" msgstr "Modalità Filtro Passa-Basso" #. (itstool) path: item/p #: C/compressor.page:251 msgid "Sets the type of the low-pass filter applied to sidechain signal." msgstr "" "Imposta la tipologia del filtro passa-basso applicato al segnale di sidechain" #. (itstool) path: title/em #: C/compressor.page:257 msgid "Low-pass Frequency" msgstr "Frequenza Passa-Basso" #. (itstool) path: item/p #: C/compressor.page:259 msgid "Sets the cut-off frequency of the low-pass filter." msgstr "Imposta la frequenza di taglio del filtro passa-basso." #. (itstool) path: page/title #: C/deesser.page:9 msgid "Deesser" msgstr "Deesser" #. (itstool) path: page/p #: C/deesser.page:10 msgid "" "PulseEffects uses the deesser developed by Calf Studio. A deesser is used to " "dynamically reduce high frequencies. The standard field of use is the " "reduction of \"sssss\" and \"shhhh\" in vocal tracks." msgstr "" "PulseEffects utilizza il Deesser sviluppato da Calf Studio. Questo plugin è " "usato per ridurre dinamicamente le frequenze più alte. Il campo di utilizzo " "predefinito è la riduzione dei \"sssss\" e \"shhhh\" nelle tracce vocali." #. (itstool) path: title/em #: C/deesser.page:18 msgid "Laxity" msgstr "Trascuranza" #. (itstool) path: item/p #: C/deesser.page:20 msgid "" "The reaction of the deesser. Higher values won't affect really short peaks." msgstr "" "Tempo di reazione del deesser. Valori più alti non influenzeranno picchi " "molto brevi." #. (itstool) path: item/p #: C/deesser.page:28 C/multibandcompressor.page:40 C/multibandgate.page:48 msgid "If a signal rises above this level it will affect the gain reduction." msgstr "" "Se il segnale supera il valore specificato, verrà applicata la compressione." #. (itstool) path: title/em #: C/deesser.page:50 msgid "F1 Split" msgstr "F1 Split" #. (itstool) path: item/p #: C/deesser.page:52 msgid "" "The split frequency. All signals above this frequency will affect the gain " "reduction (and in split mode they are affected by the reduction too)." msgstr "" "Indica la frequenza di split. Tutti i segnali al di sopra di questa " "frequenza saranno interessati dalla riduzione in ampiezza." #. (itstool) path: title/em #: C/deesser.page:59 msgid "F1 Gain" msgstr "F1 Guadagno" #. (itstool) path: item/p #: C/deesser.page:61 msgid "" "It shifts the volume of the higher band. In wideband mode it affects the " "sidechain. In split mode it also affects the processed high frequencies." msgstr "" "Modifica il volume della banda più alta. In modalità Banda Larga influisce " "sull'elaborazione in sidechain. In modalità Split influisce anche sulle alte " "frequenze elaborate." #. (itstool) path: title/em #: C/deesser.page:68 msgid "F2 Peak" msgstr "F2 Picco" #. (itstool) path: item/p #: C/deesser.page:70 msgid "" "Center frequency of the bell filter. It allows a more precise selection of " "the sidechain signal." msgstr "" "Frequenza centrale del filtro a campana. Consente una selezione più precisa " "del segnale in sidechain." #. (itstool) path: title/em #: C/deesser.page:77 msgid "F2 Level" msgstr "F2 Livello" #. (itstool) path: item/p #: C/deesser.page:79 msgid "Increase or decrease the frequencies around the center bell frequency." msgstr "" "Aumenta o diminuisce l'ampiezza delle frequenze intorno alla frequenza " "centrale del filtro a campana." #. (itstool) path: title/em #: C/deesser.page:85 msgid "F2 Peak Q" msgstr "F2 Picco Q" #. (itstool) path: item/p #: C/deesser.page:87 msgid "" "Set the quality of the bell. Higher values will affect a narrower frequency " "range. Lower values will affect a wider band." msgstr "" "Imposta la qualità del filtro a campana. Valori più grandi influenzeranno un " "intervallo di frequenze più ristretto. Valori più bassi influenzeranno un " "intervallo più ampio." #. (itstool) path: title/em #: C/deesser.page:94 C/gate.page:79 C/multibandcompressor.page:78 #: C/multibandgate.page:86 msgid "Detection" msgstr "Rilevamento" #. (itstool) path: item/p #: C/deesser.page:96 msgid "" "Choose if the deesser should take the signal peak for detection or the RMS " "value (it is smoother)." msgstr "" "Imposta il metodo di rilevamento del plugin di deesser. Valore di picco (più " "aggressivo) o valore RMS (più morbido)." #. (itstool) path: item/p #: C/deesser.page:105 msgid "Select your operation mode between wideband or split" msgstr "" "Seleziona il metodo di funzionamento tra modalità a Banda Larga o Split." #. (itstool) path: page/title #: C/exciter.page:9 msgid "Exciter" msgstr "Exciter" #. (itstool) path: page/p #: C/exciter.page:10 msgid "" "An exciter is used to enhance a signal by dynamic equalization, phase " "manipulation, harmonic synthesis of high frequency signals, and through the " "addition of subtle harmonic distortion." msgstr "" "L'Exciter è un plugin che serve per migliorare un segnale mediante " "l'equalizzazione dinamica, la manipolazione di fase, la sintesi armonica (di " "segnali ad alta frequenza) e l'aggiunta di distorsione armonica sottile." #. (itstool) path: page/p #: C/exciter.page:15 msgid "PulseEffects uses the exciter developed by Calf Studio." msgstr "PulseEffects usa l'Exciter sviluppato da Calf Studio." #. (itstool) path: title/em #: C/exciter.page:45 msgid "Ceiling(button)" msgstr "Limite Superiore(pulsante)" #. (itstool) path: item/p #: C/exciter.page:47 msgid "Constrain the excitement on the upper end." msgstr "Impedisce al plugin di operare oltre una determinata frequenza." #. (itstool) path: title/em #: C/exciter.page:53 msgid "Ceiling(value)" msgstr "Limite Superiore(valore)" #. (itstool) path: item/p #: C/exciter.page:55 msgid "The frequency no harmonics are produced above." msgstr "La frequenza oltre la quale le armoniche non verranno prodotte." #. (itstool) path: page/title #: C/filter.page:9 msgid "Filter" msgstr "Filtro" #. (itstool) path: page/p #: C/filter.page:10 msgid "" "Audio filters can amplify (boost), pass or attenuate (cut) some frequency " "ranges." msgstr "" "Il plugin Filtro può essere usato per amplificare, far passare o attenuare " "(tagliare) alcune bande di frequenza del segnale audio." #. (itstool) path: page/p #: C/filter.page:14 msgid "" "PulseEffects uses the filter from Calf Studio. It can be used to remove " "defined parts of a frequency spectrum." msgstr "" "PulseEffects utilizza il Filtro sviluppato da Calf Studio. Può essere usato " "per rimuovere determinate parti dello spettro delle frequenze." #. (itstool) path: title/em #: C/filter.page:21 C/equalizer.page:224 msgid "Frequency" msgstr "Frequenza" #. (itstool) path: item/p #: C/filter.page:23 msgid "The center or cut-off frequency of the filter." msgstr "La frequenza centrale (o di taglio) del filtro." #. (itstool) path: title/em #: C/filter.page:29 msgid "Resonance" msgstr "Risonanza" #. (itstool) path: item/p #: C/filter.page:31 msgid "" "Add an accentuation to the center frequency. When used on a bandpass the " "surrounding frequencies are decreased in level and the band gets more " "narrow, a bandreject is narrowed down to a thin needle." msgstr "" "Aggiunge un'enfasi alla frequenza centrale. Quando è utilizzato in un filtro " "passa banda, le frequenze circostanti diminuiscono di livello e la banda " "diventa più stretta. La banda esclusa viene ridotta a un ago sottile." #. (itstool) path: title/em #: C/filter.page:39 msgid "Inertia" msgstr "Inerzia" #. (itstool) path: item/p #: C/filter.page:41 msgid "Smooths the jumps between frequencies." msgstr "Rende più fluidi i salti tra le frequenze." #. (itstool) path: page/title #: C/gate.page:9 msgid "Gate" msgstr "Gate" #. (itstool) path: page/p #: C/gate.page:10 msgid "" "Gates attenuate signals that register below the threshold. This kind of " "signal processing reduces disturbing noise between useful signals." msgstr "" "Il plugin Gate attenua i segnali che si attestano al di sotto di una " "determinata soglia. Questo tipo di elaborazione riduce il livello del rumore " "(disturbo) tra segnali utili." #. (itstool) path: page/p #: C/gate.page:14 msgid "PulseEffects uses the gate developed by Calf Studio." msgstr "PulseEffects usa il Gate sviluppato da Calf Studio." #. (itstool) path: item/p #: C/gate.page:22 msgid "" "Amount of milliseconds the signal has to rise above the threshold before " "gain reduction stops." msgstr "" "Valore in millisecondi per cui il segnale deve salire oltre la soglia " "affinché la riduzione del guadagno venga terminata." #. (itstool) path: item/p #: C/gate.page:31 msgid "" "Amount of milliseconds the signal has to fall below the threshold before the " "reduction is increased again." msgstr "" "Valore in millisecondi per cui il segnale deve scendere sotto la soglia " "affinché la riduzione venga incrementata ulteriormente." #. (itstool) path: item/p #: C/gate.page:40 msgid "If a signal rises above this level the gain reduction is released." msgstr "" "Se il segnale supera il valore specificato, la riduzione del guadagno viene " "rilasciata." #. (itstool) path: title/em #: C/gate.page:70 msgid "Stereo Link" msgstr "Relazione Canali" #. (itstool) path: item/p #: C/gate.page:72 msgid "" "Choose if the gain reduction is affected by the louder channel or by the " "average level between the channels." msgstr "" "Imposta se la compressione è influenzata dal canale col volume più alto o da " "un livello di volume medio tra i canali." #. (itstool) path: item/p #: C/gate.page:81 msgid "" "Choose if the gate should take the signal peak for detection or the RMS " "value (it is smoother)." msgstr "" "Imposta se il gate deve assumere come metodo di rilevamento il picco del " "segnale o il valore RMS (più morbido)." #. (itstool) path: title/em #: C/gate.page:88 msgid "Gain Reduction" msgstr "Riduzione Guadagno" #. (itstool) path: item/p #: C/gate.page:90 msgid "The level of gain reduction when the signal is below the threshold." msgstr "" "Il livello di riduzione del guadagno quando il segnale è al di sotto della " "soglia." #. (itstool) path: page/title #: C/delay.page:9 msgid "Delay" msgstr "Delay" #. (itstool) path: page/p #: C/delay.page:10 msgid "" "This plugin allows to add short delay to each individual channel of the " "stereo channel" msgstr "" "Questo plugin consente di aggiungere un tempo di ritardo a ciascun canale " "stereo." #. (itstool) path: title/em #: C/delay.page:17 msgid "Left" msgstr "Sinistro" #. (itstool) path: item/p #: C/delay.page:19 msgid "Left channel delay." msgstr "Ritardo del canale sinistro." #. (itstool) path: title/em #: C/delay.page:25 msgid "Right" msgstr "Destro" #. (itstool) path: item/p #: C/delay.page:27 msgid "Right channel delay." msgstr "Ritardo del canale destro." #. (itstool) path: page/title #: C/index.page:8 msgid "PulseEffects" msgstr "PulseEffects" #. (itstool) path: page/p #: C/index.page:9 msgid "" "PulseEffects applies audio effects to Pulseaudio applications. You can apply " "effects to applications output or to your microphone before sending its " "audio to a recording application." msgstr "" "PulseEffects applica effetti audio ai programmi che utilizzano Pulseaudio. È " "possibile aggiungere effetti all'audio proveniente in uscita da specifiche " "applicazioni oppure in ingresso da un microfono (prima di inviarlo a " "un'applicazione di registrazione)." #. (itstool) path: section/title #: C/index.page:11 msgid "Guides" msgstr "Guide" #. (itstool) path: section/title #: C/index.page:14 msgid "User Interface" msgstr "Interfaccia Utente" #. (itstool) path: section/title #: C/index.page:17 msgid "Plugins" msgstr "Plugin" #. (itstool) path: section/title #: C/index.page:20 msgid "Calibration" msgstr "Calibrazione" #. (itstool) path: page/title #. (itstool) path: title/em #: C/limiter.page:9 C/limiter.page:18 C/webrtc.page:88 msgid "Limiter" msgstr "Limitatore" #. (itstool) path: page/p #: C/limiter.page:10 msgid "" "A limiter allows signals below a specified input power or level to pass " "unaffected while attenuating (lowering) the peaks of stronger signals that " "exceed this threshold." msgstr "" "Il Limitatore consente ai segnali al di sotto di una determinata soglia di " "passare inalterati, mentre attenua i picchi di segnale che superano tale " "soglia." #. (itstool) path: page/p #: C/limiter.page:15 msgid "PulseEffects uses the limiter developed by Calf Studio." msgstr "PulseEffects usa il Limitatore sviluppato da Calf Studio." #. (itstool) path: title/em #: C/limiter.page:22 msgid "Limit" msgstr "Limite" #. (itstool) path: item/p #: C/limiter.page:24 msgid "No signal above this level will pass through the limiter." msgstr "Il segnale in uscita non avrà picchi oltre questa soglia." #. (itstool) path: item/p #: C/limiter.page:32 msgid "" "The Limiter will reach its attenuation level in this amount of time (output " "will be delayed two times this time)." msgstr "" "Il limitatore applicherà l'attenuazione nel tempo in millisecondi " "specificato (l'uscita sarà ritardata due volte questo tempo)." #. (itstool) path: item/p #: C/limiter.page:41 msgid "Stop the attenuation after this amount of milliseconds." msgstr "Arresta l'attenuazione dopo questo tempo in millisecondi." #. (itstool) path: title/em #: C/limiter.page:47 msgid "Oversampling" msgstr "Sovracampionamento" #. (itstool) path: item/p #: C/limiter.page:49 msgid "" "Increase the signal sampling to better detect the peaks. The signal is " "downsampled after processing." msgstr "" "Aumenta il campionamento del segnale per una migliore rilevazione dei " "picchi. La frequenza di campionamento originale sarà reimpostata al termine " "dell'elaborazione." #. (itstool) path: title/em #: C/limiter.page:56 msgid "Automatic Smoothing Control" msgstr "Auto-Controllo Smussamento" #. (itstool) path: item/p #: C/limiter.page:58 msgid "" "When gain reduction is always needed ASC takes care of releasing to an " "average reduction level rather than reaching a reduction of 0 in the release " "time." msgstr "" "Quando la riduzione del guadagno è sempre necessaria, l'ASC impone un " "livello medio di riduzione, invece di ottenere una riduzione di 0 nel tempo " "di rilascio." #. (itstool) path: title/em #: C/limiter.page:65 msgid "ASC Level" msgstr "Livello di ASC" #. (itstool) path: item/p #: C/limiter.page:67 msgid "" "Select how much the release time is affected by ASC, 0 means nearly no " "changes in release time while 1 produces higher release times." msgstr "" "Seleziona quanto il tempo di rilascio è influenzato dall'ASC. 0 indica quasi " "nessun cambiamento nel tempo di rilascio, mentre 1 produce tempi di rilascio " "più elevati." #. (itstool) path: title/em #: C/limiter.page:74 msgid "Automatic Leveling" msgstr "Livellamento Automatico" #. (itstool) path: item/p #: C/limiter.page:76 msgid "" "Raises the signal level adding the absolute value of the limit amount after " "the compression stage is performed. Enabling this feature the volume is " "automatically leveled at 0 db." msgstr "" "Incrementa il segnale aggiungendo il valore assoluto della quantità limite " "in seguito alla fase di compressione. Abilitando questa funzionalità il " "volume è automaticamente livellato a 0 db." #. (itstool) path: title/em #: C/limiter.page:84 msgid "Input Gain" msgstr "Guadagno in Ingresso" #. (itstool) path: item/p #: C/limiter.page:86 msgid "" "Raises or decrease the signal level before it is sent to the compression " "stage." msgstr "" "Incrementa o decrementa il livello del segnale prima di essere processato." #. (itstool) path: title/em #: C/limiter.page:92 msgid "Output Gain" msgstr "Guadagno in Uscita" #. (itstool) path: item/p #: C/limiter.page:94 msgid "Raises or decrease the signal level after the compression stage." msgstr "" "Incrementa o decrementa il livello del segnale dopo essere stato processato." #. (itstool) path: page/title #: C/loudness.page:9 msgid "Loudness Compensator" msgstr "Bilanciamento Loudness" #. (itstool) path: page/p #: C/loudness.page:10 msgid "" "PulseEffects uses the loudness compensator from Linux Studio Plugins which " "applies equal loudness contour corrections to the input signal. This is a " "measure of sound pressure level (SPL), over the frequency spectrum, for " "which a listener perceives a constant loudness when presented with pure " "steady tones." msgstr "" "PulseEffects usa il plugin di bilanciamento della Loudness sviluppato da " "Linux Studio Plugins che applica la correzione \"equal loudness contour\" al " "segnale in ingresso. Si tratta della misura del livello di pressione del " "suono effettuata sull'intero spetto di frequenze affinché l'ascoltatore " "percepisca un livello costante di volume." #. (itstool) path: title/em #: C/loudness.page:20 msgid "Input" msgstr "Ingresso" #. (itstool) path: item/p #: C/loudness.page:22 msgid "" "The input gain settings, allows to adjust the level of the input signal to " "the desired level." msgstr "" "Il guadagno in ingresso, permette di regolare il livello del segnale in " "input al valore desiderato." #. (itstool) path: title/em #: C/loudness.page:29 msgid "Output" msgstr "Uscita" #. (itstool) path: item/p #: C/loudness.page:31 msgid "" "The output volume of the signal with applied equal loudness contour, " "controls the loudness of the 1 kHz pure sine wave." msgstr "" "Il volume in uscita del segnale con la equal loudness contour applicata, " "regola la Loudness di una onda sinusoidale pura a 1 kHz." #. (itstool) path: title/em #: C/loudness.page:38 msgid "Standard" msgstr "Standard" #. (itstool) path: item/p #: C/loudness.page:40 msgid "Allows to select different equal loudness contour standards." msgstr "Permette di selezionare differenti standard di equal loudness contour." #. (itstool) path: title/em #: C/loudness.page:46 msgid "FFT Size" msgstr "Dimensione FFT" #. (itstool) path: item/p #: C/loudness.page:48 msgid "" "Allows to select size of the fast Fourier transform frame used for the " "processing. The larger FFT frame is, the more precize the curve is " "approximated and the more latency the plugin introduces" msgstr "" "Permette di selezionare la dimensione del frame della trasformata veloce di " "Fourier. Più grande è il frame, più precisa sarà la curva approssimata, ma " "il processo sarà più lento introducendo una latenza maggiore del plugin" #. (itstool) path: page/title #: C/multibandcompressor.page:9 msgid "Multiband Compressor" msgstr "Compressore Multibanda" #. (itstool) path: page/p #: C/multibandcompressor.page:10 msgid "" "This kind of compressor splits the signal in four different frequency " "ranges. These ranges are compressed separately and mixed together afterwards " "again." msgstr "" "Questo tipo di compressore divide il segnale in quattro diverse bande di " "frequenza. Questi intervalli vengono compressi separatamente e poi " "rimescolati successivamente." #. (itstool) path: page/p #: C/multibandcompressor.page:14 msgid "PulseEffects uses the multiband compressor developed by Calf Studio." msgstr "PulseEffects usa il Compressore Multibanda sviluppato da Calf Studio." #. (itstool) path: item/p #: C/multibandcompressor.page:22 C/multibandgate.page:22 msgid "" "Amount of milliseconds the signal has to rise above the threshold before " "gain reduction starts." msgstr "" "Valore in millisecondi per cui il segnale deve rimanere oltre la soglia " "affinché la compressione venga applicata interamente." #. (itstool) path: item/p #: C/multibandcompressor.page:31 C/multibandgate.page:31 msgid "" "Amount of milliseconds the signal has to fall below the threshold before the " "reduction is decreased again." msgstr "" "Valore in millisecondi per cui il segnale deve rimanere sotto la soglia " "affinché la compressione venga terminata." #. (itstool) path: title/em #: C/multibandcompressor.page:70 C/multibandgate.page:78 C/crystalizer.page:37 msgid "Bypass" msgstr "Bypass" #. (itstool) path: item/p #: C/multibandcompressor.page:72 C/multibandgate.page:80 msgid "Don't process anything, just bypass the signal of this strip." msgstr "" "Non elabora nulla, fa passare inalterato il segnale della banda selezionata." #. (itstool) path: item/p #: C/multibandcompressor.page:80 msgid "" "Choose if the multibandcompressor should take the signal peak for detection " "or the RMS value (it is smoother)." msgstr "" "Imposta se il compressore multibanda deve assumere il picco del segnale o il " "valore RMS (più morbido) per il rilevamento." #. (itstool) path: title/em #: C/multibandcompressor.page:87 C/multibandgate.page:95 C/equalizer.page:208 msgid "Solo" msgstr "Isola" #. (itstool) path: item/p #: C/multibandcompressor.page:89 C/multibandgate.page:97 msgid "Mute all strips not set to solo." msgstr "Silenzia tutte le tracce non selezionate." #. (itstool) path: item/p #: C/multibandcompressor.page:97 C/multibandgate.page:105 msgid "" "The crossover mode. You can choose between the fourth order Linkwitz-" "Riley(LR4) and the eighth order Linkwitz-Riley(LR8)." msgstr "" "La modalità crossover. Si può scegliere tra il quarto ordine Linkwitz-Riley " "(LR4) e l'ottavo ordine Linkwitz-Riley (LR8)." #. (itstool) path: title/em #: C/multibandcompressor.page:104 C/multibandgate.page:112 msgid "Split 1/2" msgstr "Frequenza Split 1/2" #. (itstool) path: item/p #: C/multibandcompressor.page:106 C/multibandgate.page:114 msgid "Frequency that separates the sub band and the low band." msgstr "Frequenza che separa la sottobanda e la banda bassa." #. (itstool) path: title/em #: C/multibandcompressor.page:112 C/multibandgate.page:120 msgid "Split 2/3" msgstr "Frequenza Split 2/3" #. (itstool) path: item/p #: C/multibandcompressor.page:114 C/multibandgate.page:122 msgid "Frequency that separates the low band and the mid band." msgstr "Frequenza che separa la banda bassa e la banda media." #. (itstool) path: title/em #: C/multibandcompressor.page:120 C/multibandgate.page:128 msgid "Split 3/4" msgstr "Frequenza Split 3/4" #. (itstool) path: item/p #: C/multibandcompressor.page:122 C/multibandgate.page:130 msgid "Frequency that separates the mid band and the high band." msgstr "Frequenza che separa la banda media e la banda alta." #. (itstool) path: page/title #: C/multibandgate.page:9 msgid "Multiband Gate" msgstr "Gate Multibanda" #. (itstool) path: page/p #: C/multibandgate.page:10 msgid "" "This kind of gate splits the signal in four different frequency ranges. " "These ranges are processed separately and mixed together afterwards again." msgstr "" "Questo tipo di Gate divide il segnale in quattro diverse bande di frequenza. " "Queste bande vengono processate separatamente e i loro segnali verranno " "rimescolati al termine dell'elaborazione." #. (itstool) path: page/p #: C/multibandgate.page:14 msgid "PulseEffects uses the multiband gate developed by Calf Studio." msgstr "PulseEffects usa il Gate Multibanda sviluppato da Calf Studio." #. (itstool) path: title/em #: C/multibandgate.page:38 msgid "Reduction" msgstr "Riduzione" #. (itstool) path: item/p #: C/multibandgate.page:40 msgid "The level of reduction in this strip." msgstr "Il livello di riduzione per la banda selezionata." #. (itstool) path: item/p #: C/multibandgate.page:88 msgid "" "Choose if the multibandgate should take the signal peak for detection or the " "RMS value (it is smoother)." msgstr "" "Imposta se il compressore multibanda deve assumere il picco del segnale o il " "valore RMS (più morbido) per il rilevamento." #. (itstool) path: page/title #: C/reverb.page:9 msgid "Reverberation" msgstr "Riverbero" #. (itstool) path: page/p #: C/reverb.page:10 msgid "" "Reverberation, in psychoacoustics and acoustics, is a persistence of sound " "after the sound is produced. A reverberation, or reverb, is created when a " "sound or signal is reflected causing a large number of reflections to build " "up and then decay as the sound is absorbed by the surfaces of objects in the " "space. Reverberation plugins can be used to artificially produce this effect." msgstr "" "Il riverbero, in acustica e psicoacustica, indica una persistenza del suono " "che si manifesta successivamente alla sua produzione. Un riverbero è " "generato quando un suono o un segnale viene riflesso e ripetuto nel tempo. " "Le riflessioni decadono quando il suono viene assorbito dalle superfici " "degli oggetti nello spazio. Questo plugin può essere usato per riprodurre " "artificialmente tale effetto." #. (itstool) path: page/p #: C/reverb.page:17 msgid "PulseEffects uses the reverberation developed by Calf Studio." msgstr "PulseEffects usa il plugin di Riverbero sviluppato da Calf Studio." #. (itstool) path: title/em #: C/reverb.page:23 msgid "Pre Delay" msgstr "Pre Ritardo" #. (itstool) path: item/p #: C/reverb.page:25 msgid "" "Additional delay - corresponds to a distance between sound source and the " "nearest wall." msgstr "" "Ritardo aggiuntivo: corrisponde a una distanza tra la sorgente sonora e " "l'ostacolo più vicino." #. (itstool) path: title/em #: C/reverb.page:32 msgid "Decay Time" msgstr "Tempo di Decadimento" #. (itstool) path: item/p #: C/reverb.page:34 msgid "Time it takes for reverberation to fade out." msgstr "Tempo necessario affinché l'effetto di riverbero scompaia." #. (itstool) path: item/p #: C/reverb.page:42 msgid "Amount of processed signal (reverberation) in the output." msgstr "Quantità di segnale elaborato (riverbero) in uscita." #. (itstool) path: title/em #: C/reverb.page:48 msgid "Dry" msgstr "Trascuranza" #. (itstool) path: item/p #: C/reverb.page:50 msgid "Amount of unprocessed signal in the output." msgstr "Quantità di segnale non elaborato in uscita." #. (itstool) path: title/em #: C/reverb.page:56 msgid "Bass Cut" msgstr "Taglio Bassi" #. (itstool) path: item/p #: C/reverb.page:58 msgid "Removes low frequencies from the reverberation." msgstr "Rimuove le basse frequenze dal riverbero." #. (itstool) path: title/em #: C/reverb.page:64 msgid "Treble Cut" msgstr "Taglio Alti" #. (itstool) path: item/p #: C/reverb.page:66 msgid "Removes high frequencies from the reverberation." msgstr "Rimuove le alte frequenze dal riverbero." #. (itstool) path: title/em #: C/reverb.page:72 msgid "Diffusion" msgstr "Diffusione" #. (itstool) path: item/p #: C/reverb.page:74 msgid "Increase its value for less uniform reverberation." msgstr "Aumenta il valore per un riverbero meno uniforme." #. (itstool) path: title/em #: C/reverb.page:80 msgid "Room Size" msgstr "Dimensione Ambiente" #. (itstool) path: item/p #: C/reverb.page:82 msgid "" "Size of the space that simulated reverberation occurs in - determines times " "between reflections." msgstr "" "Dimensione dello spazio in cui si verifica la simulazione del riverbero - " "determina i tempi tra le riflessioni." #. (itstool) path: title/em #: C/reverb.page:89 msgid "High Frequency Damping" msgstr "Smorzamento Alte frequenze" #. (itstool) path: item/p #: C/reverb.page:91 msgid "" "Cutoff reflections high frequencies - causes higher frequencies to decay " "faster." msgstr "" "Taglia le alte frequenze delle riflessioni - fa sì che le frequenze più alte " "diminuiscano più velocemente." #. (itstool) path: page/title #: C/stereotools.page:9 msgid "Stereo Tools" msgstr "Strumenti Stereo" #. (itstool) path: page/p #: C/stereotools.page:10 msgid "PulseEffects uses the stereo tools developed by Calf Studio." msgstr "PulseEffects usa il plugin Strumenti Stereo sviluppato da Calf Studio." #. (itstool) path: title/em #: C/stereotools.page:16 msgid "Softclip" msgstr "Softclip" #. (itstool) path: item/p #: C/stereotools.page:18 msgid "Do kind of analog distortion instead of harsh digital 0db clipping." msgstr "" "Crea una sorta di distorsione analogica invece di un hard clipping digitale " "di 0 db." #. (itstool) path: title/em #: C/stereotools.page:24 msgid "Balance" msgstr "Bilanciamento" #. (itstool) path: item/p #: C/stereotools.page:26 msgid "Set the balance between both channels." msgstr "Configura il bilanciamento tra i due canali." #. (itstool) path: title/em #: C/stereotools.page:32 msgid "S/C Level" msgstr "Livello S/C" #. (itstool) path: item/p #: C/stereotools.page:40 msgid "Choose normal stereo behavior (LR - LR) or convert between MS and LR." msgstr "" "Imposta il normale comportamento stereo (LR-LR) o la conversione tra MS e LR." #. (itstool) path: title/em #: C/stereotools.page:46 msgid "Side Level" msgstr "Livello Laterale" #. (itstool) path: item/p #: C/stereotools.page:48 msgid "The level of the side signal." msgstr "Il livello del segnale laterale." #. (itstool) path: title/em #: C/stereotools.page:54 msgid "Side Balance" msgstr "Bilanciamento Laterale" #. (itstool) path: item/p #: C/stereotools.page:56 msgid "The balance of the side signal." msgstr "Bilanciamento del segnale laterale." #. (itstool) path: title/em #: C/stereotools.page:62 msgid "Middle Level" msgstr "Livello Medio" #. (itstool) path: item/p #: C/stereotools.page:64 msgid "Middle signal position in the stereo panorama." msgstr "Posizione del segnale medio nell'audio stereo." #. (itstool) path: title/em #: C/stereotools.page:70 msgid "Delay L/R" msgstr "Delay Canali" #. (itstool) path: item/p #: C/stereotools.page:72 msgid "" "Delay the left or the right channel (milliseconds). Negative values delay " "the left channel and positive values the right channel." msgstr "" "Ritarda un canale rispetto all'altro (millisecondi). I valori negativi " "ritardano il canale sinistro e i valori positivi quello destro." #. (itstool) path: title/em #: C/stereotools.page:79 msgid "Stereo Base" msgstr "Base Stereo" #. (itstool) path: item/p #: C/stereotools.page:81 msgid "" "Set the stereo base of your material seamless between Mono and inverted " "Channels." msgstr "" "Imposta la base stereo del tuo materiale senza interruzioni tra mono e " "canali invertiti." #. (itstool) path: title/em #: C/stereotools.page:88 msgid "Stereo Phase" msgstr "Fase Stereo" #. (itstool) path: item/p #: C/stereotools.page:90 msgid "Set the stereo phase of your material." msgstr "Configura la fase stereo del tuo materiale." #. (itstool) path: page/title #: C/maximizer.page:9 msgid "Maximizer" msgstr "Maximizer" #. (itstool) path: page/p #: C/maximizer.page:10 msgid "" "Maximizer is a versatile plugin that can be tweaked to be a compressor, an " "amplifier and a limiter. It is basically controlled by only two parameters: " "ceiling and threshold. Threshold is a relative value representing the " "amplification of the signal while ceiling is the maximum allowed output peak " "level. Setting both values different from zero, the plugin will act as an " "upward compressor with a limiter on the ceiling level (overly amplified " "signal with ceiling set too low can result in distorted sound even without " "the presence of clipping). When only threshold is set equal to zero, it " "reduces the amplitude of the signal." msgstr "" "Il Maximizer è un plugin versatile che può essere utilizzato come un " "compressore, un amplificatore e un limitatore. È controllato principalmente " "da soli due parametri: limite e soglia. La soglia è un valore relativo che " "rappresenta l'amplificazione del segnale mentre il limite è il livello " "massimo di uscita del segnale. Impostando entrambi i valori diversi da zero, " "il plugin funzionerà come un compressore riduttivo con un limitatore " "impostato sul valore di limite (segnali molto amplificati quando il limite è " "impostato troppo in basso potrebbero produrre un suono distorto anche senza " "la presenza del clipping). Quando solo la soglia è impostata a zero, il " "plugin riduce l'ampiezza del segnale." #. (itstool) path: page/p #: C/maximizer.page:21 msgid "PulseEffects uses the maximizer from ZamAudio." msgstr "PulseEffects usa il Maximizer sviluppato da ZamAudio." #. (itstool) path: item/p #: C/maximizer.page:29 msgid "" "Relative value representing the amplification of the signal. Zero is no " "amplification. Lower values, higher amplification." msgstr "" "Valore relativo che rappresenta l'amplificazione del segnale. Zero indica " "nessuna amplificazione. Valori più bassi produrranno un'amplificazione " "maggiore." #. (itstool) path: title/em #: C/maximizer.page:36 msgid "Ceiling" msgstr "Limite Superiore" #. (itstool) path: item/p #: C/maximizer.page:38 msgid "Maximum allowed peak level of the output signal." msgstr "Massimo valore di picco ammesso in uscita." #. (itstool) path: item/p #: C/maximizer.page:46 msgid "Set the release in milliseconds." msgstr "Impostazione del tempo di rilascio in millisecondi." #. (itstool) path: page/title #: C/crossfeed.page:9 msgid "Crossfeed" msgstr "Crossfeed" #. (itstool) path: page/p #: C/crossfeed.page:10 msgid "" "PulseEffects uses the crossfeed from GStreamer. This plugin is based on the " "bs2b library and can be used to improve headphone listening of stereo audio " "records. It does so by mixing the left and right channel in a way that " "simulates a stereo speaker setup while using headphones." msgstr "" "PulseEffects usa il plugin Crossfeed di GStreamer. Questo plugin si basa " "sulla libreria bs2b e può essere utilizzato per migliorare l'ascolto " "dell'audio stereo tramite le cuffie. Il suo funzionamento consiste nel " "mescolare i due canali in modo che venga simulato l'ascolto dell'audio " "tramite un altoparlante mentre si utilizzano le cuffie." #. (itstool) path: title/em #: C/crossfeed.page:19 msgid "Cutoff" msgstr "Taglio" #. (itstool) path: item/p #: C/crossfeed.page:21 msgid "Low-pass filter cutoff frequency." msgstr "Frequenza di taglio del filtro passa basso." #. (itstool) path: title/em #: C/crossfeed.page:27 msgid "Feed" msgstr "Alimentazione" #. (itstool) path: item/p #: C/crossfeed.page:29 msgid "Amount of signal from a channel that is sent to the other." msgstr "Quantità del segnale di uno specifico canale da inviare all'altro." #. (itstool) path: page/title #: C/equalizer.page:9 msgid "Equalizer" msgstr "Equalizzatore" #. (itstool) path: page/p #: C/equalizer.page:10 msgid "" "PulseEffects uses the parametric equalizer from Linux Studio Plugins. You " "can choose between 1 and 30 bands. You also can change the center frequency " "and the width of each band as needed. There are a few presets but at this " "moment all of them have only 10 bands. Presets with other number of bands " "may be added in the future." msgstr "" "PulseEffects utilizza l'Equalizzatore parametrico ideato da Linux Studio " "Plugins. È possibile scegliere tra 1 e 30 bande. Si può anche modificare la " "frequenza centrale e la larghezza di ogni banda in base alle proprie " "necessità." #. (itstool) path: section/title #: C/equalizer.page:18 msgid "Main Menu" msgstr "Menu Principale" #. (itstool) path: item/p #: C/equalizer.page:27 msgid "" "IIR - Infinite Impulse Response filters, nonlinear " "minimal phase. In most cases does not add noticeable latency to output " "signal." msgstr "" "IIR - Infinite Impulse Response (Filtri con " "Risposta Impulsiva Infinita), fase minima non lineare. Nella maggior parte " "dei casi non aggiunge una latenza significativa al segnale di uscita." #. (itstool) path: item/p #: C/equalizer.page:33 msgid "" "FIR - Finite Impulse Response filters with linear " "phase, finite approximation of equalizer's impulse response. Adds noticeable " "latency to output signal." msgstr "" "FIR - Finite Impulse Response (Filtri a Risposta " "Impulsiva Finita) con fase lineare, approssimazione finita della risposta " "all'impulso dell'equalizzatore. Aggiunge una latenza significativa al " "segnale di uscita." #. (itstool) path: item/p #: C/equalizer.page:39 msgid "" "FFT - Fast Fourier Transform approximation of the " "frequency chart, linear phase. Adds noticeable latency to output signal." msgstr "" "FFT - Fast Fourier Transform (Approssimazione " "della Trasformata Rapida di Fourier) del grafico di frequenza, fase lineare. " "Aggiunge una latenza significativa al segnale di uscita." #. (itstool) path: title/em #: C/equalizer.page:48 msgid "Bands" msgstr "Bande" #. (itstool) path: item/p #: C/equalizer.page:50 msgid "The number of equalizer bands." msgstr "Il numero di bande dell'equalizzatore." #. (itstool) path: title/em #: C/equalizer.page:56 msgid "Split Channels" msgstr "Dividi Canali" #. (itstool) path: item/p #: C/equalizer.page:58 msgid "" "When this option is enabled it is possible to apply different equalizations " "to the left and the right channel." msgstr "" "Quando questa opzione è attivata, è possibile applicare diverse " "equalizzazioni ai canali sinistro e destro." #. (itstool) path: title/em #: C/equalizer.page:65 msgid "Flat Response" msgstr "Risposta Piatta" #. (itstool) path: item/p #: C/equalizer.page:67 msgid "This function sets each band gain to 0." msgstr "Questa funzione imposta il guadagno di ogni banda a 0." #. (itstool) path: title/em #: C/equalizer.page:73 msgid "Calculate Frequencies" msgstr "Calcola Frequenze" #. (itstool) path: item/p #: C/equalizer.page:75 msgid "" "This function can be used to calculate the center frequencies and bandwidth " "of a graphic equalizer with the current number of selected bands. Useful " "when the user does not want the default number of 30 bands but has no idea " "about which frequencies and bandwidth he/she should choose." msgstr "" "Questa funzione può essere utilizzata per calcolare le frequenze centrali e " "la larghezza di banda di un equalizzatore grafico con il numero corrente di " "bande selezionate. Utile quando l'utente non preferisce il numero " "predefinito di 30 bande e non ha idea di quali frequenze e larghezza di " "banda dovrebbe scegliere." #. (itstool) path: title/em #: C/equalizer.page:84 msgid "Reset Equalizer" msgstr "Reset Equalizzatore" #. (itstool) path: item/p #: C/equalizer.page:86 msgid "Reset the equalizer to its default settings." msgstr "Reimposta l'equalizzatore alle opzioni predefinite." #. (itstool) path: section/title #: C/equalizer.page:95 msgid "Band Menu" msgstr "Menu Banda" #. (itstool) path: item/p #: C/equalizer.page:103 msgid "Off - Filter is not working (turned off)." msgstr "Inattivo - Il filtro è disabilitato." #. (itstool) path: item/p #: C/equalizer.page:108 msgid "Bell - Bell filter with smooth peak/recess." msgstr "" "A Campana - Filtro a campana con picchi/rientranze " "fluidi." #. (itstool) path: item/p #: C/equalizer.page:113 msgid "" "High-pass - High-pass filter with rejection of low " "frequencies." msgstr "" "Passa Alto - Filtro passa alto con scarto delle " "basse frequenze." #. (itstool) path: item/p #: C/equalizer.page:118 msgid "" "High-shelf - Shelving filter with adjustment of " "high frequency range." msgstr "" "Sopra Soglia - Filtro a scaffale con regolazione " "dell'intervallo delle alte frequenze." #. (itstool) path: item/p #: C/equalizer.page:123 msgid "" "Low-pass - Low-pass filter with rejection of high " "frequencies." msgstr "" "Passa Basso - Filtro passa basso con scarto delle " "alte frequenze." #. (itstool) path: item/p #: C/equalizer.page:128 msgid "" "Low-shelf - Shelving filter with adjustment of low " "frequencies." msgstr "" "Sotto Soglia - Filtro a scaffale con regolazione " "dell'intervallo delle basse frequenze." #. (itstool) path: item/p #: C/equalizer.page:133 msgid "" "Notch - Notch filter with full rejection of " "selected frequency." msgstr "" "Elimina Banda - Filtro elimina banda con " "esclusione totale della frequenza selezionata." #. (itstool) path: item/p #: C/equalizer.page:138 msgid "" "Resonance - Resonance filter wih sharp peak/recess." msgstr "" "Risonanza - Filtro di risonanza con picchi/" "rientranze accentuati." #. (itstool) path: item/p #: C/equalizer.page:150 msgid "" "RLC - Very smooth filters based on similar " "cascades of RLC contours." msgstr "" "RLC - Filtri molto fluidi basati su cascate simili " "di contorni RLC." #. (itstool) path: item/p #: C/equalizer.page:155 msgid "" "BWC - Butterworth-Chebyshev-type-1 based filters. " "Does not affect Resonance and Notch filters." msgstr "" "BWC - Filtri basati su Butterworth-Chebyshev tipo " "1. Non influenzano i filtri di Risonanza ed Elimina Banda." #. (itstool) path: item/p #: C/equalizer.page:161 msgid "" "LRX - Linkwitz-Riley based filters. Does not " "affect Resonance and Notch filters." msgstr "" "LRX - Filtri basati su Linkwitz-Riley. Non " "influenzano i filtri di Risonanza ed Elimina Banda." #. (itstool) path: item/p #: C/equalizer.page:166 msgid "" "APO - Digital biquad filters derived from canonic " "analog biquad prototypes digitalized through Bilinear transform. These are " "textbook filters <_:link-1/> which are implemented as in the <_:link-2/> " "software." msgstr "" "APO - Filtri biquadratici digitali, derivati dai " "prototipi canonici, digitalizzati tramite trasformata Bilineare. Questi sono " "filtri da manuale <_:link-1/> implementati come nel software <_:link-2/>." #. (itstool) path: item/p #: C/equalizer.page:181 msgid "" "(BT) - Bilinear Z-transform is used for pole/zero " "mapping." msgstr "" "(BT) - La trasformata Z Bilineare è utilizzata per " "la mappatura polo/zero." #. (itstool) path: item/p #: C/equalizer.page:186 msgid "" "(MT) - Matched Z-transform is used for pole/zero " "mapping." msgstr "" "(MT) - La trasformata Z combinata viene utilizzata " "per la mappatura polo/zero." #. (itstool) path: item/p #: C/equalizer.page:191 msgid "" "(DR) - Direct design is used to serve the digital " "filter coefficients directly in the digital domain without performing " "transforms." msgstr "" "(DR) - Un'implementazione diretta viene utilizzata " "per ottenere i coefficienti del filtro digitale direttamente nel dominio " "digitale, senza eseguire trasformazioni." #. (itstool) path: title/em #: C/equalizer.page:200 msgid "Slope" msgstr "Pendenza" #. (itstool) path: item/p #: C/equalizer.page:202 msgid "The slope of the filter characteristics." msgstr "La pendenza della curva caratteristica del filtro." #. (itstool) path: item/p #: C/equalizer.page:210 msgid "Makes this band the only one active." msgstr "Rende questa banda l'unica attiva." #. (itstool) path: title/em #: C/equalizer.page:216 C/crystalizer.page:45 msgid "Mute" msgstr "Muto" #. (itstool) path: item/p #: C/equalizer.page:218 msgid "Mutes the band." msgstr "Silenzia la banda." #. (itstool) path: item/p #: C/equalizer.page:226 msgid "Band center frequency." msgstr "Frequenza centrale della banda." #. (itstool) path: title/em #: C/equalizer.page:232 msgid "Width" msgstr "Larghezza" #. (itstool) path: p/code #: C/equalizer.page:236 #, no-wrap msgid "width = frequency / quality" msgstr "larghezza = frequenza / qualità" #. (itstool) path: item/p #: C/equalizer.page:234 msgid "Bandwidth. Calculated as <_:code-1/>." msgstr "Larghezza di banda. Calcolata a partire da <_:code-1/>." #. (itstool) path: title/em #: C/equalizer.page:241 msgid "Quality" msgstr "Qualità" #. (itstool) path: item/p #: C/equalizer.page:243 msgid "Quality factor." msgstr "Fattore di qualità." #. (itstool) path: page/title #: C/pitch.page:9 msgid "Pitch" msgstr "Intonazione" #. (itstool) path: page/p #: C/pitch.page:10 msgid "" "Pitch shifting is a sound recording technique in which the original pitch of " "a sound is raised or lowered." msgstr "" "Il cambio di intonazione è una tecnica di registrazione del suono in cui il " "tono originale viene aumentato o diminuito." #. (itstool) path: page/p #: C/pitch.page:14 msgid "PulseEffects uses the pitch shifter from RubberBand." msgstr "" "PulseEffects usa il plugin di modifica dell'intonazione ideato da RubberBand." #. (itstool) path: title/em #: C/pitch.page:20 msgid "Faster" msgstr "Più Veloce" #. (itstool) path: title/em #: C/pitch.page:26 msgid "Preserve Formant" msgstr "Preserva Formante" #. (itstool) path: item/p #: C/pitch.page:28 msgid "Enable formant preservation when pitch shifting." msgstr "" "Abilita la preservazione della formante durante il cambio di intonazione." #. (itstool) path: title/em #: C/pitch.page:34 msgid "Cents" msgstr "Centesimi" #. (itstool) path: item/p #: C/pitch.page:36 msgid "Number of cents the pitch will increased or decreased." msgstr "" "Numero di centesimi in base al quale l'intonazione verrà aumentata o " "diminuita." #. (itstool) path: title/em #: C/pitch.page:42 msgid "Semitones" msgstr "Semitoni" #. (itstool) path: item/p #: C/pitch.page:44 msgid "Number of semitones the pitch will increased or decreased." msgstr "" "Numero di semitoni in base al quale l'intonazione verrà aumentata o " "diminuita." #. (itstool) path: title/em #: C/pitch.page:50 msgid "Octaves" msgstr "Ottave" #. (itstool) path: item/p #: C/pitch.page:52 msgid "Number of octaves the pitch will increased or decreased." msgstr "" "Numero di ottave in base al quale l'intonazione verrà aumentata o diminuita." #. (itstool) path: title/em #: C/pitch.page:58 msgid "Crispness" msgstr "Chiarezza" #. (itstool) path: item/p #: C/pitch.page:62 msgid "" "0 - Disable phase resynchronisation at transients, phase lamination and use " "longer processing window." msgstr "" "0 - Disabilita la risincronizzazione di fase nei transitori, la laminazione " "di fase e utilizza una finestra di elaborazione più lunga." #. (itstool) path: item/p #: C/pitch.page:68 msgid "" "1 - Use soft transient detector, disable phase lamination and use longer " "processing window." msgstr "" "1 - Utilizza un rilevatore di transitori morbido, disabilita la laminazione " "di fase e utilizza una finestra di elaborazione più lunga." #. (itstool) path: item/p #: C/pitch.page:74 msgid "2 - Disable phase resynchronisation at transients and phase lamination." msgstr "" "2 - Disabilita la risincronizzazione di fase nei transitori e la laminazione " "di fase." #. (itstool) path: item/p #: C/pitch.page:79 msgid "3 - Disable phase resynchronisation at transients." msgstr "3 - Disabilita la risincronizzazione di fase nei transitori." #. (itstool) path: page/title #: C/webrtc.page:9 msgid "Webrtc" msgstr "WebRTC" #. (itstool) path: page/p #: C/webrtc.page:10 msgid "" "PulseEffects uses the webrtc from GStreamer. This plugin offers a voice " "enhancement filter based on WebRTC Audio Processing library. This library " "provides a broad variety of enhancement algorithms. This plugin tries to " "enable as many of those as possible. The currently enabled enhancements are " "High Pass Filter, Echo Canceller, Noise Suppression, Automatic Gain Control, " "and some extended filters." msgstr "" "PulseEffects utilizza il plugin WebRTC di GStreamer. Questo plugin fornisce " "un filtro di miglioramento vocale basato sulla libreria di elaborazione " "audio denominata WebRTC. Tale libreria offre un'ampia varietà di algoritmi " "di miglioramento e questo plugin tenta di utilizzarne il maggior numero " "possibile. Le funzioni attualmente abilitate sono Filtro Passa Alto, " "Rimozione Eco, Soppressore del rumore, Normalizzazione e alcuni altri filtri " "estesi." #. (itstool) path: section/title #: C/webrtc.page:19 msgid "Echo Canceller" msgstr "Rimozione Eco" #. (itstool) path: title/em #: C/webrtc.page:23 msgid "Extended Filter" msgstr "Filtro Esteso" #. (itstool) path: item/p #: C/webrtc.page:25 msgid "Enabled or disables the extended filter." msgstr "Abilita o disabilita il filtro esteso." #. (itstool) path: title/em #: C/webrtc.page:31 msgid "High Pass Filter" msgstr "Filtro Passa Alto" #. (itstool) path: item/p #: C/webrtc.page:33 msgid "Enables or disables the high pass filter." msgstr "Abilita o disabilita il filtro passa alto." #. (itstool) path: title/em #: C/webrtc.page:39 msgid "Delay Agnostic" msgstr "Delay Agnostic" #. (itstool) path: item/p #: C/webrtc.page:41 msgid "Enables or disables the delay agnostic mode." msgstr "Abilita o disabilita la modalità Delay Agnostic." #. (itstool) path: title/em #: C/webrtc.page:47 C/webrtc.page:61 msgid "Suppression Level" msgstr "Livello di Soppressione" #. (itstool) path: item/p #: C/webrtc.page:49 msgid "" "Controls the aggressiveness of the suppressor. A higher level trades off " "double-talk performance for increased echo suppression." msgstr "" "Controlla l'aggressività del filtro di soppressione. Un livello più alto " "sfrutta la doppia conversazione per migliorare la soppressione dell'eco." #. (itstool) path: section/title #: C/webrtc.page:57 msgid "Noise Suppressor" msgstr "Soppressore Rumore" #. (itstool) path: item/p #: C/webrtc.page:63 msgid "" "Controls the aggressiveness of the suppression. Increasing the level will " "reduce the noise level at the expense of a higher speech distortion." msgstr "" "Controlla l'aggressività del soppressore. Incrementando il valore si riduce " "il livello del rumore a discapito di una maggiore distorsione del parlato." #. (itstool) path: section/title #: C/webrtc.page:71 msgid "Gain Controller" msgstr "Controllo Guadagno" #. (itstool) path: item/p #: C/webrtc.page:77 msgid "Controls the mode of the compression stage." msgstr "Controlla la modalità della fase di compressione." #. (itstool) path: item/p #: C/webrtc.page:90 msgid "" "When enabled, the compression stage will hard limit the signal to the target " "level. Otherwise, the signal will be compressed but not limited above the " "target level." msgstr "" "Se abilitato, la fase di compressione limiterà aggressivamente il segnale " "tenendolo al di sotto del livello della soglia. In caso contrario, il " "segnale verrà compresso ma non forzato a stare sotto la soglia." #. (itstool) path: title/em #: C/webrtc.page:98 msgid "Target Level" msgstr "Livello Soglia" #. (itstool) path: item/p #: C/webrtc.page:100 msgid "" "Sets the target peak level of the gain control in dBFS (decibels from " "digital full-scale)." msgstr "" "Imposta il livello massimo dei picchi del segnale, espressi in dBFS (decibel " "in digital full-scale)." #. (itstool) path: title/em #: C/webrtc.page:107 msgid "Maximum Gain" msgstr "Guadagno Massimo" #. (itstool) path: item/p #: C/webrtc.page:109 msgid "Sets the maximum gain the digital compression stage may apply." msgstr "" "Imposta il guadagno massimo che può essere applicato in fase di compressione." #. (itstool) path: section/title #: C/webrtc.page:116 msgid "Voice Detector" msgstr "Rilevatore Voce" #. (itstool) path: title/em #: C/webrtc.page:120 msgid "Detection Likelihood" msgstr "Accuratezza Rilevamento" #. (itstool) path: item/p #: C/webrtc.page:122 msgid "" "Specifies the likelihood that a frame will be declared to contain voice." msgstr "" "Specifica la probabilità che un frame sia dichiarato come contenente voce." #. (itstool) path: title/em #: C/webrtc.page:130 msgid "Frame Size" msgstr "Dimensione Frame" #. (itstool) path: item/p #: C/webrtc.page:132 msgid "" "Sets the size of the frames in ms on which the VAD will operate. Larger " "frames will improve detection accuracy, but reduce the frequency of updates." msgstr "" "Imposta la dimensione dei frame in ms su cui opererà il VAD. Frame più ampi " "migliorano l'accuratezza del rilevamento, ma riducono la frequenza degli " "aggiornamenti." #. (itstool) path: page/title #: C/crystalizer.page:9 msgid "Crystalizer" msgstr "Crystalizer" #. (itstool) path: page/p #: C/crystalizer.page:10 msgid "" "This plugin can be used to add a little of dynamic range to songs that were " "overly compressed" msgstr "" "Il plugin Crystalizer può essere usato per incrementare un po' la gamma " "dinamica alle tracce che sono state eccessivamente compresse." #. (itstool) path: title/em #: C/crystalizer.page:17 msgid "Aggressive Mode" msgstr "Modalità Aggressiva" #. (itstool) path: item/p #: C/crystalizer.page:19 msgid "" "When this option is enabled sample amplitude dependent amplification will be " "applied to the signal. Take care to not saturate the next plugin in the " "processing chain." msgstr "" "Quando questa opzione è attiva, verrà applicata al segnale l'amplificazione " "basata sulla larghezza del campione. Bisogna tuttavia fare attenzione a non " "saturare il plugin successivo nella catena di elaborazione." #. (itstool) path: title/em #: C/crystalizer.page:27 msgid "Intensities" msgstr "Intensità" #. (itstool) path: item/p #: C/crystalizer.page:29 msgid "" "The higher the value the higher is the difference in magnitude between the " "loudest and the quietest sounds. You can set different intensities for each " "frequency band." msgstr "" "Più è alto il valore, maggiore sarà la differenza in ampiezza tra i suoni " "più alti e bassi. Si possono impostare intensità diverse per ogni banda di " "frequenza." #. (itstool) path: item/p #: C/crystalizer.page:39 msgid "" "When active the audio signal passing through this band will not be modified." msgstr "" "Se attivato, il segnale audio della banda selezionata non verrà alterato." #. (itstool) path: item/p #: C/crystalizer.page:47 msgid "Silence the band." msgstr "Silenzia la banda." #. (itstool) path: page/title #: C/convolver.page:9 msgid "Convolver" msgstr "Convolutore" #. (itstool) path: page/p #: C/convolver.page:10 msgid "" "A convolver creates a simulation of an audio environment. It is based on the " "mathematical convolution operation, and uses a pre-recorded audio sample of " "the impulse response of the space being modeled." msgstr "" "Un Convolutore crea una simulazione di un ambiente audio. Si basa " "sull'operazione matematica di convoluzione e utilizza un campione audio pre-" "registrato della risposta all'impulso dello spazio da modellare." #. (itstool) path: title/em #: C/convolver.page:18 msgid "Import Impulse" msgstr "Importa Impulso" #. (itstool) path: item/p #: C/convolver.page:20 msgid "" "Import an impulse response file to PulseEffects configuration directory." msgstr "" "Importa un file di risposta all'impulso nella cartella di configurazione di " "PulseEffects." #. (itstool) path: title/em #: C/convolver.page:26 msgid "Stereo Width" msgstr "Ampiezza Stereo" #. (itstool) path: item/p #: C/convolver.page:28 msgid "Modify the impulse response stereo image width." msgstr "Modifica l'ampiezza dell'immagine stereo della risposta all'impulso." #. (itstool) path: title/em #. (itstool) path: page/title #: C/convolver.page:34 C/spectrum.page:9 msgid "Spectrum" msgstr "Spettro" #. (itstool) path: item/p #: C/convolver.page:36 msgid "Visualize the frequency spectrum of the selected channel." msgstr "Visualizza lo spettro di frequenza del canale selezionato." #. (itstool) path: page/title #: C/settingsmenu.page:10 msgid "Settings Menu" msgstr "Menu Impostazioni" #. (itstool) path: page/title #: C/general.page:9 msgid "General" msgstr "Generale" #. (itstool) path: title/em #: C/general.page:13 msgid "Start Service at Login" msgstr "Esegui Servizio all'Avvio" #. (itstool) path: item/p #: C/general.page:15 msgid "" "Start PulseEffects as a service in the next login. This is done by creating " "an autostart file at ~/.config/autostart" msgstr "" "Avvia PulseEffects come servizio al prossimo accesso. Viene creato uno " "script di avvio in ~/.config/autostart" #. (itstool) path: title/em #: C/general.page:23 msgid "Process All Outputs" msgstr "Processa Tutto in Uscita" #. (itstool) path: item/p #: C/general.page:25 msgid "" "Apply effects to the output of all audio applications. This will " "automatically switch on the per application switch that can be seen in the " "Applications entry." msgstr "" "Applica effetti all'uscita di tutte le applicazioni audio. Questa opzione " "attiverà automaticamente il selettore di tutti i programmi in riproduzione " "elencati nella voce Applicazioni." #. (itstool) path: title/em #: C/general.page:32 msgid "Process All Inputs" msgstr "Processa Tutto in Ingresso" #. (itstool) path: item/p #: C/general.page:34 msgid "" "Apply effects to the input(microphone) of all audio applications. This will " "automatically switch on the per application switch that can be seen in the " "Applications entry." msgstr "" "Applica effetti all'ingresso (microfono) di tutte le applicazioni audio. " "Questa opzione attiverà automaticamente il selettore di tutti i programmi in " "registrazione elencati nella voce Applicazioni." #. (itstool) path: title/em #: C/general.page:42 msgid "Use Dark Theme" msgstr "Usa Tema Scuro" #. (itstool) path: item/p #: C/general.page:44 msgid "Use the dark version of the GTK theme." msgstr "Usa variante scura del tema GTK." #. (itstool) path: title/em #: C/general.page:50 C/autogain.page:16 msgid "Reset" msgstr "Reset" #. (itstool) path: item/p #: C/general.page:52 msgid "" "Reset all parameters to their default values. This will reset the plugins " "too." msgstr "" "Reimposta tutti i parametri ai valori predefiniti. Verrà reimpostato anche " "l'ordine di tutti i plugin." #. (itstool) path: title/em #: C/general.page:58 msgid "Priority type" msgstr "Tipo Priorità" #. (itstool) path: item/p #: C/general.page:60 msgid "" "Choose between real time mode, niceness or none. This parameter allows to " "choose a higher priority for the threads that process audio." msgstr "" "Scegli tra modalità in tempo reale, livello nice o nessuno. Questo parametro " "consente di scegliere una priorità più alta per i thread dei plugin che " "elaborano l'audio." #. (itstool) path: title/em #: C/general.page:67 msgid "Niceness" msgstr "Livello Nice" #. (itstool) path: item/p #: C/general.page:69 msgid "Niceness value." msgstr "Valore Nice." #. (itstool) path: title/em #: C/general.page:75 msgid "Priority" msgstr "Valore Priorità" #. (itstool) path: item/p #: C/general.page:77 msgid "Real time priority." msgstr "Priorità in tempo reale." #. (itstool) path: title/em #: C/spectrum.page:13 msgid "Show" msgstr "Mostra" #. (itstool) path: item/p #: C/spectrum.page:15 msgid "Hide or show the spectrum." msgstr "Nasconde o mostra lo spettro." #. (itstool) path: title/em #: C/spectrum.page:21 msgid "Points" msgstr "Punti" #. (itstool) path: item/p #: C/spectrum.page:23 msgid "Number of points displayed." msgstr "Numero di punti mostrati." #. (itstool) path: title/em #: C/spectrum.page:29 msgid "Height" msgstr "Altezza" #. (itstool) path: item/p #: C/spectrum.page:31 msgid "Spectrum height." msgstr "Altezza spettro." #. (itstool) path: title/em #: C/spectrum.page:37 msgid "Scale" msgstr "Scala" #. (itstool) path: item/p #: C/spectrum.page:39 msgid "Bar height scaling factor." msgstr "Fattore di scala dell'altezza della barra." #. (itstool) path: title/em #: C/spectrum.page:45 msgid "Exponent" msgstr "Esponente" #. (itstool) path: item/p #: C/spectrum.page:47 msgid "Scaling factor exponent." msgstr "Esponente del fattore di scala." #. (itstool) path: title/em #: C/spectrum.page:53 msgid "Sampling" msgstr "Campionamento" #. (itstool) path: item/p #: C/spectrum.page:55 msgid "Spectrum update frequency." msgstr "Frequenza di aggiornamento dello spettro." #. (itstool) path: title/em #: C/spectrum.page:61 msgid "Line Width" msgstr "Spessore Linea" #. (itstool) path: item/p #: C/spectrum.page:63 msgid "Bar line width." msgstr "Spessore dei contorni della barra." #. (itstool) path: title/em #: C/spectrum.page:69 msgid "Fill" msgstr "Riempimento" #. (itstool) path: item/p #: C/spectrum.page:71 msgid "Draw filled bars." msgstr "Disegna barre piene." #. (itstool) path: title/em #: C/spectrum.page:77 msgid "Border" msgstr "Bordo" #. (itstool) path: item/p #: C/spectrum.page:79 msgid "Show bar border." msgstr "Mostra bordo della barra." #. (itstool) path: title/em #: C/spectrum.page:85 msgid "Use Custom Color" msgstr "Personalizza Colore" #. (itstool) path: item/p #: C/spectrum.page:87 msgid "Use a user defined color or the GTK theme color." msgstr "Usa un colore definito dall'utente o il predefinito del tema GTK." #. (itstool) path: title/em #: C/spectrum.page:93 msgid "Spectrum Color" msgstr "Colore Spettro" #. (itstool) path: item/p #: C/spectrum.page:95 msgid "User defined color." msgstr "Usa colore definito dall'utente." #. (itstool) path: page/title #: C/pulseaudio.page:9 msgid "Pulseaudio" msgstr "Pulseaudio" #. (itstool) path: page/p #: C/pulseaudio.page:10 msgid "" "PulseEffects has two GStreamer pipelines. One that applies effects for " "applications output and other that applies effects for microphone. Here the " "user can tweak a few advanced parameters for both pipelines." msgstr "" "PulseEffects utilizza due pipeline GStreamer. Una che applica effetti " "all'uscita delle applicazioni e l'altra che applica effetti al microfono. " "Qui l'utente può impostare alcuni parametri avanzati per entrambe le " "pipeline." #. (itstool) path: title/em #: C/pulseaudio.page:18 msgid "Use Default" msgstr "Usa Predefinito" #. (itstool) path: item/p #: C/pulseaudio.page:20 msgid "Use default input or output device." msgstr "Usa dispositivo/sink di ingresso o uscita predefinito." #. (itstool) path: title/em #: C/pulseaudio.page:26 msgid "Buffer" msgstr "Buffer" #. (itstool) path: item/p #: C/pulseaudio.page:28 msgid "Pulsesrc plugin buffer size. It affects latency" msgstr "" "Dimensione del buffer della Pipeline di PulseEffects. Influenza la latenza." #. (itstool) path: title/em #: C/pulseaudio.page:34 msgid "Latency" msgstr "Latenza" #. (itstool) path: item/p #: C/pulseaudio.page:36 msgid "Pulsesrc plugin latency value." msgstr "Valore in microsecondi della latenza della Pipeline di PulseEffects." #. (itstool) path: title/em #: C/pulseaudio.page:42 msgid "Block Size" msgstr "Larghezza Blocco" #. (itstool) path: item/p #: C/pulseaudio.page:44 msgid "" "This controls the size of the audio buffer. Higher values increase latency " "but decrease cpu usage of a few plugins." msgstr "" "Imposta la dimensione del buffer dell'audio. Valori più alti aumentano la " "latenza ma riducono l'utilizzo della CPU di alcuni plugin." #. (itstool) path: page/title #: C/testsignals.page:9 msgid "Test Signals" msgstr "Segnali di Test" #. (itstool) path: page/p #: C/testsignals.page:10 msgid "" "These signals can be used to test the frequency response of your speakers." msgstr "" "Questi segnali possono essere utilizzati per testare la risposta in " "frequenza degli altoparlanti." #. (itstool) path: page/title #: C/calibrationmic.page:9 msgid "Microphone" msgstr "Microfono" #. (itstool) path: page/p #: C/calibrationmic.page:10 msgid "" "If you have a microphone with reasonably flat response you can use it " "together with a pink noise test signal to estimate how flat is your audio " "setup frequency response." msgstr "" "Se si dispone di un microfono con una risposta abbastanza piatta, è " "possibile utilizzarlo con un segnale test di rumore rosa per stimare quanto " "sia piatta la risposta in frequenza della configurazione audio." #. (itstool) path: title/em #: C/calibrationmic.page:17 msgid "Window" msgstr "Finestra" #. (itstool) path: item/p #: C/calibrationmic.page:19 msgid "" "The amount of time the microphone signal will be measured. Higher values " "will reduce noises." msgstr "" "La quantità di tempo in cui il segnale del microfono verrà misurato. Valori " "più alti riducono il rumore." #. (itstool) path: title/em #: C/calibrationmic.page:26 msgid "Measure Noise" msgstr "Misura Rumore" #. (itstool) path: item/p #: C/calibrationmic.page:28 msgid "" "Saves the last measurement to be used as background noise. Usually you would " "use this before turning on the pink noise." msgstr "" "Salva l'ultima misura per utilizzarla come rumore di fondo. Solitamente " "questa opzione è usata prima di attivare il rumore rosa." #. (itstool) path: title/em #: C/calibrationmic.page:35 msgid "Subtract Noise" msgstr "Sottrai Rumore" #. (itstool) path: item/p #: C/calibrationmic.page:37 msgid "Subtract the stored background noise from the measurement." msgstr "" "Sottrae il rumore di fondo memorizzato dal risultato della misurazione." #. (itstool) path: page/title #: C/enableapp.page:10 msgid "Enable or Disable an Application" msgstr "Attiva o disattiva un'applicazione" #. (itstool) path: page/p #: C/enableapp.page:12 msgid "" "You can choose which applications have effects applied through the switch " "next to its name. If you always want to apply effects to all applications " "take a look at Enable All Applications." msgstr "" "Si può scegliere a quali programmi abilitare gli effetti tramite il " "selettore accanto al loro nome nella voce Applicazioni. Per applicare sempre " "gli effetti a tutti i programmi, si può selezionare l'opzione Processa Tutto in " "Uscita/Ingresso nelle impostazioni generali." #. (itstool) path: page/title #: C/effectsorder.page:10 msgid "Changing Effects Order" msgstr "Modifica dell'Ordine degli Effetti" #. (itstool) path: page/p #: C/effectsorder.page:12 msgid "" "You can change the plugins order in the effects chain. Just click on the up " "and down arrows next to the plugin name. The first plugin from top to bottom " "is the first to receive the audio signal." msgstr "" "L'ordine dei plugin nella catena degli effetti può essere modificato " "cliccando sulle frecce accanto al loro nome. Il primo plugin dall'alto verso " "il basso è il primo a ricevere il segnale audio." #. (itstool) path: page/title #: C/userpresets.page:10 msgid "Creating and Importing User Presets" msgstr "Creazione e Importazione dei Profili Utente" #. (itstool) path: page/p #: C/userpresets.page:12 msgid "" "You can save your own presets. Just add write a name and click on the add " "button. Presets can be imported clicking on the button to the left." msgstr "" "Si possono creare e salvare profili personalizzati scegliendo un titolo e " "cliccando sul pulsante di aggiunta. I profili possono essere importati " "facendo clic sul pulsante a sinistra." #. (itstool) path: page/p #: C/userpresets.page:16 msgid "" "When you save a preset the current configuration of all plugins is saved to " "its file. This means you can have presets that combine the effects of " "different plugins." msgstr "" "Quando un profilo viene salvato, la configurazione corrente di tutti i " "plugin viene esportata nel file di profilo. Ciò significa che si possono " "avere più profili che combinano gli effetti di diversi plugin." #. (itstool) path: page/p #: C/userpresets.page:21 msgid "" "You can also make a preset autoload when an input or output device is added " "to the system. Just click on the button with curved arrows while the desired " "device is selected as the system default device." msgstr "" "È inoltre possibile creare un profilo caricabile automaticamente quando un " "dispositivo di ingresso o di uscita viene connesso al sistema. È sufficiente " "cliccare sul pulsante con le frecce ricurve mentre il dispositivo desiderato " "è selezionato come predefinito per il sistema." #. (itstool) path: page/title #: C/advancedinfo.page:10 msgid "Advanced Information" msgstr "Informazioni Avanzate" #. (itstool) path: page/p #: C/advancedinfo.page:12 msgid "" "PulseEffects audio processing is composed by 3 main stages. Each of them " "needs a specific audio format and sampling rate. This information is show in " "the headerbar subtitle." msgstr "" "L'elaborazione audio di PulseEffects è composta da 3 fasi principali. Ogni " "fase ha bisogno di un formato audio e di una frequenza di campionamento " "specifici. Queste informazioni sono mostrate nella barra superiore." #. (itstool) path: page/p #: C/advancedinfo.page:17 msgid "" "Another important information is the latency introduced by the audio " "processing. This the the last information shown. The displayed value is in " "milliseconds." msgstr "" "Un'altra informazione da non sottovalutare è la latenza introdotta " "dall'elaborazione dell'audio. Questo dato è visualizzato per ultimo ed è " "misurato in millisecondi." #. (itstool) path: page/title #: C/saturated.page:10 msgid "Saturation Warning" msgstr "Avviso di Saturazione" #. (itstool) path: page/p #: C/saturated.page:12 msgid "" "If the audio signal coming out from the pipeline is too high very unpleasent " "noises will be produced. In case this happens the warning in the image above " "is shown so that the user can reduce the audio level using the limiter or " "the maximizer." msgstr "" "Se il livello del segnale in uscita dalla pipeline è troppo alto, verrà " "prodotta una distorsione del suono molto spiacevole. Quando ciò accade, " "viene mostrato l'avviso nell'immagine sopra in modo che l'utente possa " "ridurre il livello dell'audio usando il limitatore o il maximizer." #. (itstool) path: page/title #: C/autogain.page:5 msgid "Auto Gain" msgstr "Auto Guadagno" #. (itstool) path: page/p #: C/autogain.page:6 msgid "" "PulseEffects auto gain is based on the library libebur128. It changes the " "audio volume to a perceived loudness level that can be tweaked by the user." msgstr "" "Il plugin di Auto Guadagno di PulseEffects è ricavato dalla libreria " "libebur128. Questo processo modifica automaticamente il livello del volume " "sulla base dell'intensità del suono (Loudness) percepito che può essere " "regolato dall'utente." #. (itstool) path: title/em #: C/autogain.page:10 msgid "Target" msgstr "Livello" #. (itstool) path: item/p #: C/autogain.page:12 msgid "Loudness level." msgstr "Intensità della Loudness." #. (itstool) path: item/p #: C/autogain.page:18 msgid "Resets the auto gain history." msgstr "Pulisce la cronologia del plugin" #. (itstool) path: title/em #: C/autogain.page:22 msgid "Detect Silence" msgstr "Rilevazione Silenzio" #. (itstool) path: item/p #: C/autogain.page:24 msgid "" "When the momentary loudness is below the relative we assume the audio " "material is passing through a brief moment of silence and no changes to the " "output gain are applied. If you do not want this behavior disable the " "silence detection." msgstr "" "Quando il valore di intensità acustica momentanea è inferiore alla soglia " "relativa, si presuppone che l'audio stia producendo del silenzio e la " "modifica del guadagno viene disattivata. Questo comportamento può essere " "evitato disabilitando la rilevazione del silenzio." #. (itstool) path: title/em #: C/autogain.page:28 msgid "Use Geometric Mean" msgstr "Usa Media Geometrica" #. (itstool) path: item/p #: C/autogain.page:30 msgid "" "The estimated loudness is obtained from the geometric mean of the momentary, " "short-term and integrated loudness. When this option is disabled a weighted " "average is used." msgstr "" "La stima della Loudness è ottenuta da una media geometrica dell'intensità " "acustica momentanea, a breve termine e integrata. Quando questa opzione è " "disattivata, viene utilizzata la media aritmetica ponderata." #. (itstool) path: title/em #: C/autogain.page:34 msgid "Momentary" msgstr "Momentaneo" #. (itstool) path: item/p #: C/autogain.page:36 msgid "" "Controls how much the momentary term will influence the loudness level " "estimation." msgstr "" "Determina quanto la quota di intensità acustica momentanea influenzerà la " "stima del livello di Loudness." #. (itstool) path: title/em #: C/autogain.page:40 msgid "Short Term" msgstr "Breve Termine" #. (itstool) path: item/p #: C/autogain.page:42 msgid "" "Controls how much the short term measure will influence the loudness level " "estimation." msgstr "" "Determina quanto la quota di intensità acustica a breve termine influenzerà " "la stima del livello di Loudness." #. (itstool) path: title/em #: C/autogain.page:46 msgid "Integrated" msgstr "Integrato" #. (itstool) path: item/p #: C/autogain.page:48 msgid "" "Controls how much the integrated term will influence the loudness level " "estimation." msgstr "" "Determina quanto la quota di intensità acustica integrata influenzerà la " "stima del livello di Loudness." #. (itstool) path: title/em #: C/autogain.page:52 msgid "Relative" msgstr "Relativo" #. (itstool) path: item/p #: C/autogain.page:54 msgid "" "Relative threshold. It is used to detect silence. Whenever the momentary " "term is below this threshold modifications to the output gain will be " "disabled." msgstr "" "Soglia relativa, usata per rilevare il silenzio. Ogni volta che la quota di " "intensità acustica momentanea è inferiore a questo livello, la modifica del " "guadagno in uscita viene disattivata." #. (itstool) path: title/em #: C/autogain.page:58 msgid "Loudness" msgstr "Loudness" #. (itstool) path: item/p #: C/autogain.page:60 msgid "" "Estimated input loudness. The difference between its value and the target " "loudness determines the output gain." msgstr "" "Loudness stimata in ingresso. La differenza tra il suo valore e il livello " "di Loudness determina il guadagno in uscita." #. (itstool) path: title/em #: C/autogain.page:64 msgid "Range" msgstr "Gamma" #. (itstool) path: item/p #: C/autogain.page:66 msgid "Loudness range. Indicates how large is the material dynamic range." msgstr "" "Gamma della Loudness. Indica quanto è varia la gamma dinamica del segnale " "audio." #. (itstool) path: title/em #: C/autogain.page:70 msgid "Gain" msgstr "Guadagno" #. (itstool) path: item/p #: C/autogain.page:72 msgid "" "Output gain value. The input signal will be multiplied by this correction " "gain to bring its loudness to the target value." msgstr "" "Valore del guadagno in uscita. Il segnale di ingresso verrà moltiplicato per " "questo valore di correzione del guadagno affinché la sua Loudness venga " "portata al valore impostato come Livello." #. (itstool) path: page/title #: C/blocklist.page:9 msgid "Applications Blocklist" msgstr "Applicazioni Escluse" #. (itstool) path: page/p #: C/blocklist.page:11 msgid "" "In the settings menu there is an option that allows the user to apply " "effects to all applications without the need to switch each one on " "individually. But there are cases where the user wants a specific " "application to be excluded from the \"Enable All\" functionality. This can " "be done by using a blocklist. Just add the application name exactly as it is " "shown in the \"Applications\" entry." msgstr "" "Nel menu delle impostazioni è presente un'opzione che consente all'utente di " "applicare effetti a tutte le applicazioni, senza la necessità di abilitarle " "individualmente. Tuttavia ci sono casi in cui l'utente vuole che una " "particolare applicazione sia esclusa dalla funzione \"Abilita Tutte le " "Applicazioni\". In questo caso è possibile usare una lista di esclusione. È " "sufficiente aggiungere a tale lista il nome dell'applicazione esattamente " "come viene mostrata nella voce \"Applicazioni\"." #. (itstool) path: page/title #: C/guide_1.page:5 msgid "Enhancing your internal notebook speakers without using an equalizer" msgstr "" "Miglioramento dell'audio sui notebook senza l'utilizzo di un equalizzatore" #. (itstool) path: page/p #: C/guide_1.page:6 msgid "" "This tutorial was written by Markus Schmidt schmidt@boomshop.net on November " "2019" msgstr "" "Questo tutorial è stato scritto da Markus Schmidt schmidt@boomshop.net nel " "novembre del 2019. Tradotto in italiano da Digitalone." #. (itstool) path: section/title #: C/guide_1.page:8 msgid "Introduction" msgstr "Introduzione" #. (itstool) path: section/p #: C/guide_1.page:9 msgid "" "If you're a notebook user relying on your internal speakers and you - like " "me - own a model suffering from a tinny, clanging sound, PulseEffects is " "your salvation!" msgstr "" "Se sei un possessore di un notebook e, come me, soffri di altoparlanti di " "bassa qualità, PulseEffects è la tua salvezza!" #. (itstool) path: section/p #: C/guide_1.page:10 msgid "" "Commercial operating systems on laptops these days often come with software " "like Dolby Theatre and the like to enhance the sound of lousy notebook " "speakers to something more substantial and acoustically rich. Under Linux, " "PulseEffects will do the job for you, although, compared to the commercial " "pendants, there's some manual tweaking required until the community sets up " "a database with presets for common machines." msgstr "" "I sistemi operativi commerciali offrono software specifici per migliorare " "l'audio su questi tipi di notebook. Su Linux si può ottenere un risultato " "simile con PulseEffects, anche se il procedimento non è immediato e richiede " "un lungo intervento manuale, a meno che in futuro la community non realizzi " "un database con le impostazioni per i modelli più comuni." #. (itstool) path: section/p #: C/guide_1.page:11 msgid "" "This DSP software comes with everything needed to fatten the sound of your " "laptop speakers with a flexibility never found in other operating systems. " "Unfortunately the drawback of this flexibility is that average users will " "get lost in the sheer amount of possibilities. That's why this tutorial was " "created." msgstr "" "PulseEffects possiede tutti i plugin necessari per ottimizzare la qualità " "dell'audio a un livello addirittura superiore rispetto ad altri sistemi " "operativi, con lo svantaggio che però l'utente medio di fronte a una marea " "di opzioni non sa come muoversi. L'obiettivo di questa guida è proprio " "quello di spiegare questi passaggi." #. (itstool) path: section/title #: C/guide_1.page:14 msgid "Why no equalizer?" msgstr "Perché non l'equalizzatore?" #. (itstool) path: section/p #: C/guide_1.page:15 msgid "" "We will attack the problems one by one utilizing specific signal processors, " "deliberately renouncing equalizers. Equalizers are not of any help here but " "tend to make these kinds of problems even worse. This is because of the " "nature of this processor, but also because users tend to add to the signal " "(additive equalization) instead of trying to eliminate problems by removing " "from the signal (subtractive equalization) like it is usually done in the " "professional world." msgstr "" "Risolveremo i problemi singolarmente utilizzando specifici plugin, " "rinunciando deliberatamente all'equalizzatore. L'equalizzatore non è di " "alcun aiuto in questi casi, anzi, potrebbe addirittura peggiorare la " "qualità. Ciò è dato dalla natura di tale plugin, oltre al fatto che gli " "utenti tendono ad aggiungere al segnale (equalizzazione additiva) quando " "invece si dovrebbero eliminare i problemi sottraendo al segnale " "(equalizzazione sottrattiva) così come si opera nel mondo professionale." #. (itstool) path: section/p #: C/guide_1.page:16 msgid "" "But even subtractive equalization wouldn't be of any help since the " "amplifiers and speakers in a notebook are not loud enough by default, so " "trying to eliminate problems this way leads to a quiet and still castrated " "sound. And raising the volume afterwards generally leads to distorted sounds " "and other problems because the system was at its limits beforehand and just " "fiddling with the frequency response doesn't help at all." msgstr "" "Tuttavia anche l'equalizzazione sottrattiva non sarebbe d'aiuto siccome gli " "altoparlanti dei notebook non sono abbastanza potenti, dunque con questa " "tecnica si otterrebbe comunque un suono scarso e castrato. Inoltre con " "l'aumentare del volume si produce generalmente un suono distorto perché il " "sistema già era al limite precedentemente. Neanche andando a modificare la " "risposta in frequenza servirà a migliorare il risultato." #. (itstool) path: section/title #: C/guide_1.page:19 msgid "Frequency Range" msgstr "Intervalli di frequenza" #. (itstool) path: section/p #: C/guide_1.page:20 msgid "" "We'll have to talk about the frequency range. For a better understanding and " "because of the way we will solve our problems I'll break it down to five " "ranges which are:" msgstr "" "Dobbiamo innanzitutto parlare degli intervalli di frequenza. Per capire " "meglio come risolvere i nostri problemi, farò una breve descrizione dei " "cinque fondamentali intervalli:" #. (itstool) path: item/p #: C/guide_1.page:23 msgid "" "Sub More or less vibrations up to something an ear " "can barely hear. Everything from 10Hz to ~40Hz." msgstr "" "Fondo: Vibrazioni che un orecchio a malapena può " "ascoltare: Qualsiasi cosa dai 10Hz ai ~40Hz." #. (itstool) path: item/p #: C/guide_1.page:29 msgid "" "Low or Bass Where the whole fundament of a signal " "is located. Low end of bass drums, bass synthesizers and bass guitars are " "found here. Movies occupy this range with explosions, rumbling waters, " "thunder, heavy gun fire and the like. Absolutely missing on notebooks and " "tablets. Technically speaking its ~60Hz - ~200Hz." msgstr "" "Bassi: Le fondamenta di un segnale. I bassi di una " "batteria, di un sintetizzatore e di una chitarra sono in questo intervallo. " "Nei film è caratterizzato dalle esplosioni, il fruscio dell'acqua, i tuoni, " "le armi di grosso calibro e cose simili. Assolutamente non percepibili su " "notebook e tablet. Tecnicamente tra ~60Hz e ~200Hz." #. (itstool) path: item/p #: C/guide_1.page:35 msgid "" "Low-Mid Hit a 0.5m³ cardboard box and you know " "what low-mids are. The \"punch\" of a sound is often located here, also the " "juice of snare drums and electric guitars. In Movies, roaring engines and " "shotguns are found in this range. We're talking about ~250Hz - ~750Hz." msgstr "" "Medio-Bassi: Colpisci una scatola di cartone da " "0.5m3 e capirai cosa sono. L'energia di un suono è localizzata in questo " "intervallo. Anche il rullo di tamburi e le chitarre elettriche. Nei film, il " "rombo dei motori e i colpi d'arma da fuoco. Siamo tra i ~250Hz e ~750Hz." #. (itstool) path: item/p #: C/guide_1.page:41 msgid "" "High-Mid This is the ears most important and " "sensitive range. The main information of any kind of signal is located here. " "Human voice, picking of guitars, attack of drums, the colour of a " "synthesizer - everything carrying the main information of sound. Something " "around ~1kHz - ~4kHz." msgstr "" "Medio-Alti: Questa è la zona più importante e " "sensibile per l'orecchio. Le informazioni più significative di qualsiasi " "tipo di segnale sono localizzate in questo intervallo. La voce umana, i " "pizzichi di una chitarra, gli attacchi di una batteria, il tono di un " "sintetizzatore. Nel mezzo tra ~1kHz - ~4kHz." #. (itstool) path: item/p #: C/guide_1.page:47 msgid "" "Highs The air, the breathe, the sizzling, the " "splashing - this is the range of brightness. Everything around and above " "~5kHz." msgstr "" "Alti: L'aria, la brezza, lo sfrigolio, gli schizzi " "d'acqua. Siamo intorno e oltre i ~5kHz." #. (itstool) path: section/title #: C/guide_1.page:55 msgid "Test Signal" msgstr "Segnale di Test" #. (itstool) path: section/p #: C/guide_1.page:56 msgid "" "You definitely need a good signal for this job. I decided to use Seeed: <_:" "link-1/>" msgstr "" "Per questo lavoro hai bisogno di un buon segnale. Io ho deciso di utilizzare " "il singolo Seeed: <_:link-1/>" #. (itstool) path: section/p #: C/guide_1.page:60 msgid "" "It is quite snappy, has lots of well defined substance, clear and bright " "highs, present vocals, comes with a very balanced frequency response and is " "a great mix in combination with great mastering. Afterwards I tested against " "various movies and other stuff like talks, classical music and the like and " "was convinced of the result. Well produced, modern pop music (avoid the 80's " "and 90's stuff) is always a good test signal for this kind of job. Movies " "are way too dynamic, so is classical music, and they normally don't cover a " "steady, broad frequency range like this kind of signal." msgstr "" "È abbastanza rapido, ha molta sostanza, alti puliti e vivaci, buoni vocali, " "presenta una risposta in frequenza ben bilanciata ed è un gran bel mix. " "Dopodiché ho testato con diversi film e robe come discussioni e musica " "classica e mi sono convinto del risultato. I film sono troppo dinamici, così " "come la musica classica, e normalmente non presentano una stabile risposta " "in frequenza." #. (itstool) path: section/p #: C/guide_1.page:61 msgid "" "We will not be able to make the notebook bounce. What is the goal here is " "that everything contained in the mix gets audible in a well balanced manner " "and to gain a present, upfront, broad and hopefully rich sound." msgstr "" "Non riusciremo a far rimbalzare il notebook. Il nostro scopo è di fare in " "modo che qualsiasi cosa contenuta in un mix sia ascoltabile in maniera " "bilanciata e con un suono ricco." #. (itstool) path: section/p #: C/guide_1.page:62 msgid "" "I assume you don't utilize a player or source which is able to produce " "levels above 0dB. I also assume you don't use e.g. video players volume bar " "to lower the volume of your source. This approach works well for defined, " "mixed and mastered sound sources like music, movies, tv and the like, played " "back at 100% volume in the player. Set the volume desired on your hardware " "via PulseAudio after the processing happened." msgstr "" "Nei prossimi passaggi si presuppone che tu non utilizzi un player in grado " "di riprodurre livelli superiori a 0db e che non usi la barra di volume del " "video player. Da questa guida si otterrà il meglio con sorgenti audio " "riprodotte al 100% del volume del player. Imposta il volume che desideri " "sulla scheda audio tramite PulseAudio così che il livello sia modificato " "solo dopo che tutti gli effetti siano stati " "applicati." #. (itstool) path: section/title #: C/guide_1.page:69 msgid "Problems" msgstr "Problemi" #. (itstool) path: section/p #: C/guide_1.page:70 msgid "Let's investigate the biggest problems first:" msgstr "Investighiamo inizialmente i problemi più rilevanti:" #. (itstool) path: item/title #: C/guide_1.page:73 msgid "Bass" msgstr "Bassi" #. (itstool) path: item/p #: C/guide_1.page:76 msgid "" "The most obvious problem of notebook speakers is the tinny, pressure-free " "sound not reproducing any kind of low-end. This is because of the size of " "the membranes and the inadequate housing. Fortunately software can work " "around this issue at least a bit." msgstr "" "Il problema più ovvio dei notebook è il suono metallico che non riproduce " "niente nella parte bassa del segnale. Questo avviene a causa della ridotta " "grandezza delle membrane degli altoparlanti." #. (itstool) path: item/title #: C/guide_1.page:79 msgid "Highs" msgstr "Alti" #. (itstool) path: item/p #: C/guide_1.page:82 msgid "" "Often the highs are quite bitchy, not representing the \"air\" but torturing " "the listener with searing sibliants. In order to fix that we need to equal " "this frequency range out." msgstr "" "Spesso gli alti si traducono in un suono stridulo che tortura le orecchie." #. (itstool) path: item/title #: C/guide_1.page:85 msgid "Overall Fequency Response" msgstr "Risposta in Frequenza" #. (itstool) path: item/p #: C/guide_1.page:88 msgid "" "Normally the relation between the different frequency ranges low, low-mid, " "high-mid and height is quite out-of-bounds. This needs correction, although " "I promised a tutorial without EQ." msgstr "" "Rappresenta la differenza tra i vari intervalli di frequenza: basso, medio-" "basso, medio-alto e alto. Sui notebook può essere molto marcata e va " "corretta, anche se non ricorreremo a un equalizzatore." #. (itstool) path: item/title #: C/guide_1.page:91 msgid "Distortion" msgstr "Distorsione" #. (itstool) path: item/p #: C/guide_1.page:94 msgid "" "Because of the thin and neutered sound users tend to raise the volume or " "even add an equalizer to raise missing frequency ranges. This normally leads " "to digital distortions because every signal above 0 dB at the sound card DAC " "will go from occasional crackling up to a totally distorted sound." msgstr "" "A causa della scarsa qualità del suono che generalmente viene riprodotto, " "l'utente tende ad alzare il volume o ad usare un equalizzatore per gli " "intervalli di frequenza che latitano. Questo purtroppo causa una distorsione " "digitale che peggiora ancora di più la qualità perché ogni segnale sopra i " "0db risulta in un suono scricchiolante che si dovrebbe evitare." #. (itstool) path: item/title #: C/guide_1.page:97 msgid "Dynamic range" msgstr "Intervallo Dinamico" #. (itstool) path: item/p #: C/guide_1.page:100 msgid "" "With movies, but music aswell, those tiny transducers tend to wiping away " "low-level sounds but going ballistic on loud and bassy sounds. For this " "reason it's recommended to reduce the overall dynamic range so you don't " "need to press your ear onto the palm rest when the lady in the movie starts " "whispering." msgstr "" "Gli altoparlanti di bassa qualità tendono a ridurre i segnali di basso " "livello mentre possono dare la percezione di volume massimo su quelli oltre " "una certa soglia. Per questo motivo è necessario ridurre l'intervallo " "dinamico in modo da rendere i livelli più stabili." #. (itstool) path: item/title #: C/guide_1.page:103 msgid "Stereo Image" msgstr "Stereofonia" #. (itstool) path: item/p #: C/guide_1.page:106 msgid "" "The stereo base is quite narrow because of the positioning of the speakers " "inside the laptop which gives an impression of almost mono signals." msgstr "" "A causa della posizione degli altoparlanti, talvolta può sembrare che si " "stia riproducendo un audio mono nonostante la traccia abbia due canali." #. (itstool) path: section/title #: C/guide_1.page:111 msgid "Solutions" msgstr "Soluzioni" #. (itstool) path: section/p #: C/guide_1.page:112 msgid "" "Let's start fixing the sound. The result will not come even close to " "something more substantial but at least we'll be able to get the best out of " "the physical boundaries of these transducers." msgstr "" "Iniziamo con questa guida tenendo bene in mente che il risultato non sarà " "neanche minimamente considerevole, però almeno avremo ottenuto il meglio da " "ciò che abbiamo in mano." #. (itstool) path: section/p #: C/guide_1.page:113 msgid "" "Every parameter we are gonna set absolutely depends on your situation and " "the hardware you've got. Every notebook has its own frequency response and " "dynamic range so there's no panacea. But the audio signal processors, their " "order and their missions are well defined and reproducable." msgstr "" "Ogni parametro che analizzeremo dipenderà dallo specifico modello di " "notebook utilizzato, nonché dalla tipologia di altoparlanti che l'hardware " "possiede. Per ogni modello si ha una diversa risposta in frequenza e un " "diverso intervallo dinamico, quindi non esiste un unico insieme di " "impostazioni valido per tutti. In ogni caso, lo scopo dei plugin audio e il " "loro ordine è ben definito e può essere applicato più o meno su qualsiasi " "sistema." #. (itstool) path: section/p #: C/guide_1.page:114 msgid "" "Don't care about clipping in the plugins level meters. The signal will be " "processed as 32bit numbers internally (check title bar) which gives a non-" "clipping overhead of hundrets of decibels. The only thing that shouldn't " "happen is that there's clipping when the signal hits the sound card " "DAC(Digital-to-Analog Converter), which would result in digital distortion." msgstr "" "Non c'è da preoccuparsi in caso di clipping tra i vari plugin all'interno di " "PulseEffects siccome il segnale è processato in numeri da 32 bit. Piuttosto " "il problema da tenere in considerazione è quando il clipping avviene sulla " "scheda audio perché questo può causare una distorsione del suono riprodotto " "dalle casse." #. (itstool) path: section/p #: C/guide_1.page:115 msgid "Let's head over to the signal chain:" msgstr "Occupiamoci dunque della catena di plugin:" #. (itstool) path: item/title #: C/guide_1.page:118 msgid "Limiter" msgstr "Limitatore" #. (itstool) path: item/p #: C/guide_1.page:121 msgid "" "We will start with the last signal processor being " "used. As I explained earlier, as soon as the signal hits the sound card DAC " "it has to be below 0dB, otherwise it will result in a distorted, messy sound." msgstr "" "Cominciamo con l'ultimo plugin da utilizzare. Come " "ho spiegato precedentemente, dobbiamo fare in modo che alla scheda audio " "arrivi un segnale al di sotto dei 0 db, altrimenti si avrà un suono distorto." #. (itstool) path: item/p #: C/guide_1.page:126 msgid "" "Drag the Limiter to the top of the list of processors and enable it. You " "will not hear any difference, which is what we expect. It will hit in as " "soon as we start messig up the signal with all the other processors. Set " "lookahead to 2ms, release to 8ms and oversampling to x4." msgstr "" "Trascina il Limitatore in cima alla lista e abilitalo. Non sentirai alcuna " "differenza, che è proprio ciò che vogliamo. La sua influenza avverrà non " "appena modificheremo il segnale attraverso altri plugin. Imposta il " "Lookahead a 2ms, il Rilascio a 8 ms e il Sovracampionamento a 4." #. (itstool) path: item/p #: C/guide_1.page:127 msgid "" "A limiter monitors the signal in (nearly) realtime and detects peaks over a " "certain threshold, in our case 0 dB. As soon as a peak is detected, it " "starts lowering the volume constantly (within the lookahead) until the peak " "will be below threshold. Afterwards it raises the volume again (within " "release time frame) until it is back to normal. This way we avoid signals " "above threshold hitting the DAC without being noticed too much. If one tries " "to overdo limiting, it will definitely result in distortion and other side " "effects, but in our case it's just a fire-and-forget troubleshooter so we " "can concentrate on the results without trying to mess with levelling over " "and over again." msgstr "" "Il Limitatore monitora il segnale (quasi) in tempo reale e rileva i picchi " "oltre una certa soglia, che nel nostro caso è rappresentata dal Limite di " "0db. Non appena un picco viene rilevato, il plugin abbassa il volume " "costantemente (all'interno dell'intervallo di Lookahead) finché il picco non " "ritorna al di sotto del Limite impostato. Dopodiché il volume viene " "aumentato (all'interno del tempo di Rilascio) per ritornare al livello " "originale. In questo modo noteremo di meno la distorsione di un segnale al " "di sopra della soglia che viene riprodotto dalla scheda audio. Se questo " "processo viene estremizzato, possono presentarsi degli svantaggi e altre " "problematiche, oltre alla marcata distorsione." #. (itstool) path: item/p #: C/guide_1.page:128 msgid "" "Don't overdo things! This might render your overall sound eperience worse " "than before." msgstr "" "Perciò non esagerare troppo col Limitatore, piuttosto concentriamoci su " "altri plugin senza stare a smanettare eccessivamente col livello finale del " "segnale, anche perché la qualità finale potrebbe risentirne." #. (itstool) path: item/p #: C/guide_1.page:129 msgid "Let's look at the real processing now." msgstr "Entriamo ora nel vivo dei processi." #. (itstool) path: item/title #: C/guide_1.page:136 msgid "Filter" msgstr "Filtro" #. (itstool) path: item/p #: C/guide_1.page:139 msgid "" "First of all we should remove frequencies that cannot be heard because even " "if the speakers are unable to reproduce them a lot of energy will be wasted " "in the process. This will lead to problems like not being able to use the " "full dynamic range and the introduction of digital and physical distortions." msgstr "" "Innanzitutto dobbiamo eliminare le frequenze che non possono essere " "ascoltate. Lo faremo per due motivi: il primo è che le casse dei notebook " "non sono in grado di riprodurle, il secondo è per non sprecare inutilmente " "risorse nel lavorare queste frequenze nei successivi plugin." #. (itstool) path: item/p #: C/guide_1.page:140 msgid "" "Drag the Filter to the top of the list (above the Limiter) and enable it. " "Set the type to 36 dB High Pass (this will cutt off everything below a " "frequency and will let everything above it pass) and the frequency to 50 Hz " "(which is definitely below your laptop's speakers abilities). Continuously " "raise the frequency by 10 Hz until you start hearing a change in the lower " "end of the audible signal, which should be around 130-160Hz. Subtract 10% " "(or 15 Hz) and set it as the Filters frequency. On my machine it is 145 Hz, " "since the signal started being affected at 160Hz." msgstr "" "Trascina il Filtro in cima alla lista (sopra il Limitatore) e abilitalo. " "Imposta il tipo a \"Passa alto 36 db/ott\" (questo taglierà qualsiasi cosa " "al di sotto di una determinata frequenza, lasciando passare tutto ciò che " "c'è sopra) e la Frequenza a 50 Hz (che non potrà mai essere riprodotta dagli " "altoparlanti del tuo laptop). Ora aumenta la Frequenza di 10 Hz finché non " "cominci ad ascoltare un cambiamento nelle parti basse del segnale, che " "dovrebbe essere intorno ai 130-160 Hz. Sottrai il 10% (o 15 Hz) e impostala " "come Frequenza del Filtro. Sul mio sistema è 145 Hz, dato che ho cominciato " "a percepire delle differenze a 160 Hz." #. (itstool) path: item/p #: C/guide_1.page:141 msgid "" "What happened is that we removed everything the speakers can't reproduce at " "all, leaving a little bit of signal just below this frequency, which is " "quite important for the next step." msgstr "" "Quello che è successo è che abbiamo rimosso tutto cio che le casse non " "possono riprodurre, lasciando solo un po' di segnale al di sotto della " "frequenza prescelta, il che è molto importate per il prossimo step." #. (itstool) path: item/title #: C/guide_1.page:144 msgid "Bass Enhancer" msgstr "Enfasi Bassi" #. (itstool) path: item/p #: C/guide_1.page:147 msgid "Let's grow some testicles to the signal." msgstr "Tiriamo fuori le palle dal segnale." #. (itstool) path: item/p #: C/guide_1.page:148 msgid "" "Drag the Bass Enhancer to the second position after the Filter plugin and " "enable it. Set the floor to 10Hz and forget about it (we already removed " "everything below the Filter plugin cuttoff frequency). Raise Harmony to 10 " "and start with a range of 200Hz. Now start raising the amount continuously " "until the bass takes over the whole energy, which is definitely too much. " "For me it works best at +24dB. Which is huge but my ThinkPad P1 has the " "worst speakers I've ever heard in a 2.8k € notebook." msgstr "" "Trascina il plugin di Enfasi Bassi alla seconda posizione della lista, " "proprio sotto il Filtro, e abilitalo. Imposta il Limite Inferiore a 10 Hz e " "non prenderlo più in considerazione (abbiamo già rimosso tutto sotto la " "Frequenza impostata nel Filtro precedente). Alza le Armoniche a 10 e " "comincia con un valore di 200 Hz per la soglia. Poi inizia ad aumentare la " "Quantità poco alla volta affinché i bassi non acquistino una grossa energia. " "Sul mio sistema il valore migliore è 24 dB, che è definitivamente enorme, ma " "d'altronde il mio ThinkPad P1 ha i peggiori altoparlanti che abbia mai visto " "per un notebook di 2.8k €." #. (itstool) path: item/p #: C/guide_1.page:149 msgid "" "What happens is that the Bass Enhancer adds frequencies to the signal which " "weren't there before. While an equalizer only raises stuff which is already " "in the signal, a bass enhancer improves the lower end by adding distortion " "to a specific frequency range. This kind of distortion adds so called " "harmonics to the signal which is a multiple of existing frequencies. You can " "choose seamlessly between 2nd and 3rd harmonics, which means that a " "frequency of 100Hz produces a new signal of " "200Hz/300Hz/400Hz/600Hz/800Hz/900Hz/... at varying (due to the harmonics " "setting) and constantly decreasing levels. This means we're effectively " "raising the lower range into something better reproducable. It doesn't add " "or raise the real fundament (so your trousers " "won't start to flutter), but makes more audible signals that have been " "swallowed by the hardware before." msgstr "" "Quello che è successo è che l'Enfasi Bassi ha aggiunto delle frequenze al " "segnale che originariamente non c'erano. Mentre un equalizzatore modifica " "qualcosa che già c'è nel segnale, questo plugin invece migliora la parte " "bassa dell'audio andando ad aggiungere delle distorsioni in uno specifico " "intervallo di frequenze. Questo tipo di distorsioni aggiungono delle " "cosiddette Armoniche che sono un multiplo delle frequenze esistenti. Puoi " "scegliere tra 2a e 3a come Mix Armoniche, il che significa che una frequenza " "di 100Hz produrrà un nuovo segnale di " "200Hz/300Hz/400Hz/600Hz/800Hz/900Hz/... al variare e al ridursi dei livelli " "(in base alle Armoniche impostate). Questo comporta un incremento " "nell'intervallo basso affinché si abbia qualcosa che suoni meglio sul nostro " "particolare sistema. Non aggiunge, né aumenta, i reali fondamentali del suono originale (dunque il tuo notebook non comincerà a " "sobbalzare), ma rende più udibili i segnali che l'hardware inizialmente non " "riusciva a riprodurre correttamente." #. (itstool) path: item/p #: C/guide_1.page:154 msgid "" "Your output meters will definitely start to flash red but you shouldn't care " "about it since it doesn't result in digital distortion of the overall signal " "as explained earlier." msgstr "" "L'indicatore del livello di output ora ti inizierà a lampeggiare di rosso, " "ma non farci troppo caso perché non ci sarà una vera e propria distorsione " "digitale, come ho spiegato in precedenza." #. (itstool) path: item/p #: C/guide_1.page:155 msgid "" "Later on, in order to refine the result, you should play with the amount " "parameter to define the level of bass and maybe with the range to define the " "upper end of our additional harmonics." msgstr "" "Più tardi, per dare il tocco finale, dovresti provare a modificare il " "parametro della Quantità per definire il livello dei bassi. E magari anche " "con quello del Mix Armoniche per definire la parte superiore delle armoniche." #. (itstool) path: item/title #: C/guide_1.page:158 msgid "Multiband Compressor" msgstr "Compressore Multibanda" #. (itstool) path: item/p #: C/guide_1.page:161 msgid "" "This is the most demanding step in the chain. Even professionals have great " "respect for this signal processor since it's absolutely able to destroy your " "signals big time. But let's be honest, we're consumers and no one will hear " "the difference between 100 ms and 200 ms attack time - even on notebook and " "tablet speakers. This means we can work with some reliable, well established " "defaults for the timing and frequency splits." msgstr "" "Questo è lo step più arduo della nostra catena di plugin. Persino i " "professionisti hanno un profondo rispetto nei confronti di questo processo " "che, potenzialmente, sarebbe in grado di rovinare ancora di più un segnale " "già scarso. Ma, onestamente, siamo semplici consumatori e nessuno di noi " "sarà in grado di percepire la differenza tra un attacco di 100 e 200 ms, a " "maggior ragione se usiamo le casse di un notebook. Ciò significa che " "possiamo lavorare su parametri predefiniti per quanto riguarda i tempi e le " "frequenze." #. (itstool) path: item/p #: C/guide_1.page:162 msgid "" "The Multiband Compressor will solve several things for us. It will cut " "outstanding and annoying frequencies, lower the overall dynamic range and " "figure our overall frequency reponse. The latter is what most people try to " "achieve with an equalizer. Thing is equalizers aren't dynamic which will add " "to the problems instead of solving anything." msgstr "" "Il Compressore Multibanda ci aiuterà a risolvere diversi aspetti. Taglierà " "delle frequenze troppo forti, ridurrà l'intervallo dinamico e armonizzerà la " "risposta in frequenza. La maggior parte delle persone prova a migliorare la " "risposta in frequenza attraverso gli equalizzatori, ma questi ultimi non " "sono dinamici, per cui tendono ad aumentare i problemi piuttosto che " "risolverli." #. (itstool) path: item/p #: C/guide_1.page:163 msgid "" "Drag the Multiband Compressor to the third position, after the Bass Enhancer " "and before the Limiter." msgstr "" "Trascina il plugin Compressore Multibanda alla terza posizione, dopo " "l'Enfasi Bassi e prima del Limitatore." #. (itstool) path: item/p #: C/guide_1.page:164 msgid "" "Since the Bass Enhancer really raised the energy and level of the signal, " "lower the Multiband Compressor input gain to -6 dB as a starting point. " "Let's set the split frequencies for the different bands to:" msgstr "" "Dato che il processo di Enfasi Bassi ha aumentato l'energia e il livello del " "segnale, iniziamo con l'abbassare l'Ingresso del Compressore a -6db. Poi " "impostiamo le Frequenze Split per determinare le singole bande:" #. (itstool) path: item/p #: C/guide_1.page:167 msgid "250 Hz" msgstr "250 Hz" #. (itstool) path: item/p #: C/guide_1.page:170 msgid "1250 Hz" msgstr "1250 Hz" #. (itstool) path: item/p #: C/guide_1.page:173 msgid "5000 Hz" msgstr "5000 Hz" #. (itstool) path: item/p #: C/guide_1.page:176 msgid "Afterwards let's set some defaults:" msgstr "Dopodiché, impostiamo questi valori predefiniti:" #. (itstool) path: item/p #: C/guide_1.page:179 msgid "Low Band" msgstr "Sottobanda" #. (itstool) path: item/p #: C/guide_1.page:182 C/guide_1.page:205 msgid "Attack: 150 ms" msgstr "Attacco: 150 ms" #. (itstool) path: item/p #: C/guide_1.page:185 msgid "Release: 300 ms" msgstr "Rilascio: 300 ms" #. (itstool) path: item/p #: C/guide_1.page:188 msgid "Threshold: -16 dB" msgstr "Soglia: -16 dB" #. (itstool) path: item/p #: C/guide_1.page:191 msgid "Ratio: 5:1" msgstr "Rapporto: 5" #. (itstool) path: item/p #: C/guide_1.page:194 msgid "Knee: 12 dB" msgstr "Curvatura: 12 dB" #. (itstool) path: item/p #: C/guide_1.page:197 C/guide_1.page:220 C/guide_1.page:243 C/guide_1.page:266 msgid "Makeup: 4 dB" msgstr "Guadagno: 4 dB" #. (itstool) path: item/p #: C/guide_1.page:202 msgid "Low Mid Band" msgstr "Banda Bassa" #. (itstool) path: item/p #: C/guide_1.page:208 msgid "Release: 200 ms" msgstr "Rilascio: 200 ms" #. (itstool) path: item/p #: C/guide_1.page:211 C/guide_1.page:234 C/guide_1.page:257 msgid "Threshold: -24 dB" msgstr "Soglia: -24 dB" #. (itstool) path: item/p #: C/guide_1.page:214 C/guide_1.page:237 msgid "Ratio: 3:1" msgstr "Rapporto: 3" #. (itstool) path: item/p #: C/guide_1.page:217 C/guide_1.page:240 C/guide_1.page:263 msgid "Knee: 9 dB" msgstr "Curvatura: 9 dB" #. (itstool) path: item/p #: C/guide_1.page:225 msgid "High Mid Band" msgstr "Banda Media" #. (itstool) path: item/p #: C/guide_1.page:228 msgid "Attack: 100 ms" msgstr "Attacco: 100 ms" #. (itstool) path: item/p #: C/guide_1.page:231 msgid "Release: 150 ms" msgstr "Rilascio: 150 ms" #. (itstool) path: item/p #: C/guide_1.page:248 msgid "High Band" msgstr "Banda Alta" #. (itstool) path: item/p #: C/guide_1.page:251 msgid "Attack: 80 ms" msgstr "Attacco: 80 ms" #. (itstool) path: item/p #: C/guide_1.page:254 msgid "Release: 120 ms" msgstr "Rilascio: 120 ms" #. (itstool) path: item/p #: C/guide_1.page:260 msgid "Ratio: 4:1" msgstr "Rapporto: 4" #. (itstool) path: item/p #: C/guide_1.page:271 msgid "These values should be a good starting point." msgstr "" "Questi valori sono un buon inizio per poi effettuare delle piccole " "correzioni." #. (itstool) path: item/p #: C/guide_1.page:272 msgid "" "A compressor lowers signal levels which appear above a certain threshold. It " "adds a simple multiplication to the signal defined by the ratio. If the " "threshold is set to -24 dB and ratio to 2:1, a signal of -12 dB would in " "fact become -18 dB. In this example one can then raise the makeup parameter " "to 6dB, since this is what went \"lost\". So first of all we're rendering " "loud signals quieter to then raise the overall volume, which leads to less " "dynamic range with quiet parts becoming more audible." msgstr "" "Un compressore abbassa il livello del segnale quando questo oltrepassa una " "determinata Soglia. A grandi linee, se la Soglia è -24 dB e il Rapporto 2:1, " "un segnale di -12 db sarà ridotto a -18 db. Considerando questo semplice " "esempio, potremmo aumentare il Guadagno a 6 db, in modo da recuperare ciò " "che sarebbe stato \"perso\". Così renderemmo i segnali forti più bassi, in " "modo da incrementare il volume generale. Questo fa sì che l'intervallo " "dinamico sia minore e le parti più silenziose siano maggiormente ascoltabili." #. (itstool) path: item/p #: C/guide_1.page:273 msgid "" "The timing settings affect the \"speed\" of the compression. Attack means " "that a signal needs to go over threshold for this amount of time until the " "compressor reaches the full (negative) amplification. Release defines the " "amount of time the signal has to stay below threshold until the " "amplification is back to 1 again." msgstr "" "I parametri temporali riguardano la \"velocità\" della compressione. " "L'attacco indica che il segnale deve andare oltre la Soglia in " "quell'intervallo di tempo affinché la compressione raggiunga il massimo " "effetto (di riduzione). Il Rilascio invece definisce la quantità di tempo " "per cui il segnale deve stare al di sotto della Soglia affinché " "l'amplificazione ritorni nuovamente a 1." #. (itstool) path: item/p #: C/guide_1.page:274 msgid "" "A multi-band compressor splits the signal in various frequency ranges to " "work on them exclusively with dedicated compression stages. This means that " "a very loud bass drum would not affect a crash cymbal, since they are " "clearly located in different bands." msgstr "" "Il Compressore Multibanda divide il segnale in 4 bande di frequenza " "separate, lavorando su di ognuna di esse in maniera indipendente e con " "valori specifici." #. (itstool) path: item/p #: C/guide_1.page:275 msgid "Start playing around with these parameters:" msgstr "Per ridefinire il risultato, modifica questi parametri:" #. (itstool) path: item/p #: C/guide_1.page:278 msgid "" "Makeup This is probably most important setting in " "this concept. Makeup raises the signal after compression stage which means " "that it directly influences the perceived volume of every single band. Or in " "other words: this is your equalizer :) Raise " "makeup of single bands to make them louder or quieter. I ended up with Low/" "Low-Mid/High-Mid/High: 4 dB / 3 dB / 6 dB / 6 dB on my ThinkPad P1." msgstr "" "Guadagno. Questo è forse il parametro più " "importante per ciò che vogliamo fare. Il guadagno incrementa il livello del " "segnale dopo aver applicato il processo di compressione. Ciò significa che " "tale valore influenzerà il volume percepito della banda selezionata. Oppure " "in altre parole: questo è il tuo equalizzatore. :) " "Varia il Guadagno di ogni singola banda per alzarne o diminuirne il volume. " "Io alla fine sul mio ThinkPad P1 ho impostato Sottobanda/Banda Bassa/Banda " "Media/Banda Alta a: 4 dB / 3 dB / 6 dB / 6 dB." #. (itstool) path: item/p #: C/guide_1.page:286 msgid "" "Input Level Set it to -6 dB by default, I ended up " "at -3dB. What happens is that a higher input level pushes all bands of the " "compressor equally, leading to a allegedly louder sound (well, the loudness " "was raised in fact) without tweaking every single band manually. This " "reduces the overall dynamic range, raising quiet parts and squeezing loud " "parts even more." msgstr "" "Ingresso. In predefinito a -6 dB, ho poi finito " "per alzarlo a -3 dB. Ciò che succede è che un ingresso più alto spinge tutte " "le bande del compressore a un livello più o meno equo, risultando in un " "suono presumibilmente più forte senza il bisogno di variare i valori delle " "singole bande. Alla fine si ottiene un bassissimo intervallo dinamico, " "aumentando le parti silenziose e abbassando quelle più forti ancora di più." #. (itstool) path: item/title #: C/guide_1.page:294 msgid "Stereo Tools" msgstr "Strumenti Stereo" #. (itstool) path: item/p #: C/guide_1.page:297 msgid "After figuring our overall sound let's look for some icing on the cake." msgstr "Adesso veniamo alla ciliegina sulla torta." #. (itstool) path: item/p #: C/guide_1.page:298 msgid "" "Drag the Stereo Tools to the fourth position, after Multiband Compressor and " "before Limiter. This tool has a lot of functionality but we only need just a " "single parameter. Switch to the last tab \"Output\" and set the parameter " "stereo base to 0.25. That's it." msgstr "" "Trascina il plugin Strumenti Stereo alla quarta posizione, dopo il " "Compressore Multibanda e prima del Limitatore. Questo processo ha un sacco " "di funzionalità, ma a noi ne interessa soltanto una. Clicca su Output e " "imposta il parametro Base Stereo su 0.25. Ecco fatto." #. (itstool) path: item/p #: C/guide_1.page:299 msgid "" "Stereo base acts on the two channels. It adds inverted signals crossover-" "wise. This way one can bring a full stereo signal down to mono seamlessly " "(by going negative values, -1 is fully mono) but also raise the stereo base " "by choosing positive numbers. This setting has lots of side effects, so " "avoid overdoing it! One of the bigger problems is that it reduces the bass " "range due to different effects, which is something we definitely don't want here." msgstr "" "Questo valore influenza la percezione della stereofonia. Portato a -1, la " "traccia viene trasformata in un completo mono. Si può aumentare la " "percezione stereofonica con valori positivi, ma non esagerare, perché valori " "troppo alti sono controproducenti. Per esempio, potrebbe ridurre " "l'intervallo dei bassi a causa di diversi effetti, che è una cosa che " "vogliamo definitivamente evitare." #. (itstool) path: item/p #: C/guide_1.page:304 msgid "" "Play with stereo base to spread the appearance of your sound to a nice, " "broad stage without loosing the center (vocals, snare drums, conversations " "in movies) or substance in the lower end. Most likely values between 0 and " "0.5 will give some good results." msgstr "" "Varia il valore in modo da ottenere un buon risultato. Di solito un valore " "compreso tra 0 e 0.5 è apprezzabile, non di più, né di meno. " #. (itstool) path: section/title #: C/guide_1.page:309 msgid "Aftermath" msgstr "Risultato" #. (itstool) path: section/p #: C/guide_1.page:310 msgid "" "Hopefully you ended up with a better sound than " "before. This signal processor chain is able to completely trash your sound " "if not done right but also can improve it to compete with some high class " "notebook speaker systems. All manufacturers put on the pants the same way " "and Dolby Theatre is no rocket science but just some presets on a presumably " "comparable set of signal processors set up in the presumably same way as " "this tutorial explained." msgstr "" "Fortunatamente sono riuscito a ottenere una qualità del suono migliore di quella iniziale. Questa catena di plugin sarebbe " "in grado di rovinare l'esperienza acustica se non impostata nel modo " "corretto, ma coi giusti passi può anche rendere il suono paragonabile a " "quello di notebook con altoparlanti di buona fattura. Tutti i produttori " "forniscono dei driver audio con dei preset per migliorare l'acustica, che " "più o meno funzionano alla stessa maniera di come ho spiegato in questa " "guida." #. (itstool) path: section/p #: C/guide_1.page:315 msgid "" "When my notebook was new, I first ran the pre-installed Windows system in " "order to test if all hardware is working. Sound-wise I remembered the bad " "reputation of this machine in every test, so I tried some tunes on Youtube - " "and was quite convinced. After installing my Linux system the enthusiasm was " "totally gone - the sound turned into a squawking, pressureless something. It " "became clear that all problems of the internal speakers where due to the " "missing sound chips DSP driver. But fortunately Wellington Wallace spent his " "spare-time casting the most important Calf plug-ins for this job into " "something usable on consumers systems. Thanks a bunch for that, mate!" msgstr "" "Quando ho comprato il mio notebook, anche se ricordavo la brutta reputazione " "che aveva il sistema audio, dopo aver effettuato alcuni test su Windows, il " "suono mi aveva comunque ben convinto. Però, dopo aver installato Linux, il " "mio entusiasmo era totalmente crollato. La qualità era orribile. Questo " "perché i driver erano mancanti di tutti quei processi software presenti su " "Windows e che invece su Linux non era possibile avere. Ma fortunatamente, " "grazie a Wellington Wallace, con PulseEffects è possibile utilizzare i " "migliori plugin audio di Calf in un'unica applicazione così da poter " "migliorare la qualità come su altri sistemi operativi. Grazie mille per il " "tuo ottimo lavoro, Wallace!" #. (itstool) path: section/title #: C/guide_1.page:318 msgid "tl;dr" msgstr "tl;dr" #. (itstool) path: section/p #: C/guide_1.page:319 msgid "" "Sorry dude, this isn't done by simply loading a preset, since the community " "is not Apple, Lenovo or Dell offering high quality Dolby Theatre drivers for " "your particular machine." msgstr "" "Scusa amico, ma purtroppo questa guida non consiste di una semplice " "impostazione da caricare nelle opzioni del programma. Questa comunità non è " "come quella di Apple, Lenovo o Dell che ti offrono i driver Dolby Theatre " "per il tuo specifico sistema." #. (itstool) path: page/title #: C/rnnoise.page:9 msgid "Noise Reduction" msgstr "Riduzione Rumore" #. (itstool) path: page/p #: C/rnnoise.page:10 msgid "Noise reduction is the process of removing noise from a signal." msgstr "" "La riduzione del rumore rappresenta quell'insieme di processi utili a " "sopprimere in parte o del tutto il rumore da un segnale audio." #. (itstool) path: page/p #: C/rnnoise.page:13 msgid "" "PulseEffects Noise Reduction is made on the library RNNoise which is based " "based on recurrent neural network, a class of artificial neural networks " "where connections between nodes form a directed graph along a temporal " "sequence. This allows it to exhibit temporal dynamic behavior." msgstr "" "Il plugin di riduzione del rumore di PulseEffects è stato realizzato sulla " "libreria RNNoise che si basa sulla rete neurale ricorrente, ovvero una " "classe di reti neurali artificiali dove le connessioni fra i nodi formano un " "grafico orientato lungo una sequenza temporale. Questo permette di mostrare " "il comportamento dinamico temporale." #. (itstool) path: page/p #: C/rnnoise.page:19 msgid "" "Standard RNNoise Model is used and custom models can be imported to perform " "different types of noise reduction." msgstr "" "Il Modello Standard di RNNoise è utilizzato e ulteriori modelli " "personalizzati possono essere importati per eseguire diverse tipologie di " "riduzione del rumore." easyeffects-4.8.7/help/meson.build000066400000000000000000000021731424023573300171330ustar00rootroot00000000000000itstool = find_program('itstool', required: true) if not itstool.found() error('itstool not found.') endif help_pages = [ 'bassenhancer.page', 'compressor.page', 'deesser.page', 'exciter.page', 'filter.page', 'gate.page', 'delay.page', 'index.page', 'limiter.page', 'loudness.page', 'multibandcompressor.page', 'multibandgate.page', 'reverb.page', 'stereotools.page', 'maximizer.page', 'crossfeed.page', 'equalizer.page', 'pitch.page', 'webrtc.page', 'crystalizer.page', 'convolver.page', 'settingsmenu.page', 'general.page', 'spectrum.page', 'pulseaudio.page', 'testsignals.page', 'calibrationmic.page', 'enableapp.page', 'effectsorder.page', 'userpresets.page', 'advancedinfo.page', 'saturated.page', 'autogain.page', 'blocklist.page', 'guide_1.page', 'rnnoise.page' ] help_media = [ 'figures/effectsorder.png', 'figures/enableapp.png', 'figures/settingsmenu.png', 'figures/userpresets.png', 'figures/advancedinfo.png', 'figures/saturated.png', 'figures/blocklist.png' ] gnome_mod.yelp(meson.project_name(), sources: help_pages, media: help_media ) easyeffects-4.8.7/help/pt_BR/000077500000000000000000000000001424023573300157745ustar00rootroot00000000000000easyeffects-4.8.7/help/pt_BR/pt_BR.po000066400000000000000000003374651424023573300173640ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: pulseeffects\n" "POT-Creation-Date: 2020-11-22 18:51+0100\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.1\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. Put one translator per line, in the form NAME , YEAR1, YEAR2 msgctxt "_" msgid "translator-credits" msgstr "wellington wallace,2018" #. (itstool) path: page/title #: C/bassenhancer.page:9 msgid "Bass Enhancer" msgstr "Reforçador de Graves" #. (itstool) path: page/p #: C/bassenhancer.page:10 msgid "" "The brain perceives the pitch of a tone not only by its fundamental " "frequency but also by the periodicity implied by the relationship between " "the higher harmonics. We may perceive the same pitch even if the fundamental " "frequency is missing from a tone." msgstr "" "O cérebro interpreta a frequência de um som baseado não apenas na frequência " "fundamental mas também na periodicidade vinda da relação desta frequência " "com seus harmônicos superiores. Nós podemos ter a sensação de ouvir uma " "frequência ainda que ela esteja ausente no som ouvido." #. (itstool) path: page/p #: C/bassenhancer.page:16 msgid "PulseEffects uses the bass enhancer developed by Calf Studio." msgstr "PulseEffects usa o reforçador de grave desenvolvido por Calf Studio." #. (itstool) path: title/em #: C/bassenhancer.page:22 C/exciter.page:21 C/reverb.page:40 msgid "Amount" msgstr "Quantidade" #. (itstool) path: item/p #: C/bassenhancer.page:24 C/exciter.page:23 msgid "Amount of harmonics added to the original signal." msgstr "A quantidade de harmônicos adicionada ao som original." #. (itstool) path: title/em #: C/bassenhancer.page:30 C/exciter.page:29 msgid "Harmonics" msgstr "Harmônicos" #. (itstool) path: item/p #: C/bassenhancer.page:32 C/exciter.page:31 msgid "Amount of newly created harmonics." msgstr "A quantidade de novos harmônicos." #. (itstool) path: title/em #: C/bassenhancer.page:38 C/exciter.page:37 msgid "Scope" msgstr "Escopo" #. (itstool) path: item/p #: C/bassenhancer.page:40 C/exciter.page:39 msgid "The frequency harmonics are produced above." msgstr "A frequência acima da qual harmônicos são produzidos." #. (itstool) path: title/em #: C/bassenhancer.page:46 msgid "Floor(button)" msgstr "Piso(botão)" #. (itstool) path: item/p #: C/bassenhancer.page:48 msgid "Constrain the enhancement on the lower end." msgstr "Restringir o reforço à extremidade inferior." #. (itstool) path: title/em #: C/bassenhancer.page:54 msgid "Floor(value)" msgstr "Piso(valor)" #. (itstool) path: item/p #: C/bassenhancer.page:56 msgid "The frequency no harmonics are produced below." msgstr "A frequência abaixo da qual nenhum harmônico é produzido." #. (itstool) path: title/em #: C/bassenhancer.page:62 C/exciter.page:61 msgid "Blend Harmonics" msgstr "Misturar Harmônicos" #. (itstool) path: item/p #: C/bassenhancer.page:64 C/exciter.page:63 msgid "The \"colour\" (or octave) of the harmonics." msgstr "A \"cor\"(ou oitava) dos harmônicos." #. (itstool) path: title/em #: C/bassenhancer.page:70 C/compressor.page:97 C/exciter.page:69 msgid "Listen" msgstr "Escutar" #. (itstool) path: item/p #: C/bassenhancer.page:72 C/exciter.page:71 msgid "Mute the original signal and listen to the harmonics exclusively." msgstr "Silenciar o sinal original e escutar exclusivamente aos harmônicos." #. (itstool) path: section/title #: C/bassenhancer.page:78 C/compressor.page:266 C/deesser.page:111 #: C/exciter.page:77 C/filter.page:47 C/gate.page:96 C/delay.page:33 #: C/limiter.page:100 C/loudness.page:56 C/multibandcompressor.page:128 #: C/multibandgate.page:136 C/reverb.page:97 C/stereotools.page:96 #: C/crossfeed.page:35 C/equalizer.page:251 C/pitch.page:87 C/webrtc.page:140 #: C/crystalizer.page:53 C/convolver.page:42 C/autogain.page:76 #: C/rnnoise.page:24 msgid "References" msgstr "Referências" #. (itstool) path: page/title #. (itstool) path: section/title #: C/compressor.page:9 C/webrtc.page:84 msgid "Compressor" msgstr "Compressor" #. (itstool) path: page/p #: C/compressor.page:10 msgid "A compressor is used to reduce the audio signal dynamic range." msgstr "Um compressor é usado para reduzir a faixa dinâmica de áudio." #. (itstool) path: page/p #: C/compressor.page:13 msgid "PulseEffects uses the compressor from Linux Studio Plugins." msgstr "PulseEffects usa o compressor do Linux Studio Plugins." #. (itstool) path: title/em #: C/compressor.page:20 C/gate.page:20 C/multibandcompressor.page:20 #: C/multibandgate.page:20 msgid "Attack" msgstr "Ataque" #. (itstool) path: item/p #: C/compressor.page:22 msgid "" "Attack determines how many milliseconds (ms) it takes your compressor to " "apply a full dose of compression to your audio signal once it passes the " "threshold. If the signal peaks above the threshold and quickly returns to " "below the threshold, it may never receive a full dose of compression." msgstr "" "Ataque determina quantos milissegundos (ms) o seu compressor leva para " "aplicar uma dose completa de compressão ao seu sinal de áudio quando este " "passa do limiar especificado. Se o sinal atingir o pico acima do limite e " "retornar rapidamente abaixo do limite, talvez ele nunca receba uma dose " "completa de compactação." #. (itstool) path: title/em #: C/compressor.page:31 C/gate.page:29 C/limiter.page:39 #: C/multibandcompressor.page:29 C/multibandgate.page:29 C/maximizer.page:44 msgid "Release" msgstr "Liberação" #. (itstool) path: item/p #: C/compressor.page:33 msgid "" "Release determines how many milliseconds (ms) it takes your compressor to " "stop attenuating gain once your audio signal drops below the threshold. A " "fast release will cause your compressor to stop attenuating gain quickly " "once the signal returns below the threshold. A slow release will cause your " "compressor to stop attenuating gain slowly once the signal returns below the " "threshold." msgstr "" "A liberação determina quantos milissegundos (ms) o compressor demora para " "parar de atenuar o ganho quando o sinal de áudio cai abaixo do limite. Uma " "liberação rápida fará com que seu compressor pare de atenuar o ganho " "rapidamente quando o sinal retornar abaixo do limite. Uma liberação lenta " "fará com que seu compressor pare de atenuar o ganho lentamente quando o " "sinal retornar abaixo do limite." #. (itstool) path: title/em #: C/compressor.page:43 C/deesser.page:26 C/gate.page:38 #: C/multibandcompressor.page:38 C/multibandgate.page:46 C/maximizer.page:27 msgid "Threshold" msgstr "Limiar" #. (itstool) path: item/p #: C/compressor.page:45 msgid "If a signal surpass this level it will trigger the compression stage." msgstr "" "Se um sinal subir acima deste nível ele ativará o estágio de compressão." #. (itstool) path: title/em #: C/compressor.page:51 C/deesser.page:34 C/gate.page:46 #: C/multibandcompressor.page:46 C/multibandgate.page:54 msgid "Ratio" msgstr "Razão" #. (itstool) path: item/p #: C/compressor.page:53 C/deesser.page:36 C/gate.page:48 #: C/multibandcompressor.page:48 C/multibandgate.page:56 msgid "Set the ratio by which the signal will be reduced." msgstr "Configura a razão pela a qual o sinal é reduzido." #. (itstool) path: title/em #: C/compressor.page:59 C/gate.page:54 C/multibandcompressor.page:54 #: C/multibandgate.page:62 msgid "Knee" msgstr "Joelho" #. (itstool) path: item/p #: C/compressor.page:61 C/gate.page:56 C/multibandcompressor.page:56 #: C/multibandgate.page:64 msgid "Controls how smooth is the entrance in the gain reduction phase." msgstr "Controla o quão suave é a entrada na fase de redução de ganho." #. (itstool) path: title/em #: C/compressor.page:67 C/deesser.page:42 C/gate.page:62 #: C/multibandcompressor.page:62 C/multibandgate.page:70 msgid "Makeup" msgstr "Ganho de Saída" #. (itstool) path: item/p #: C/compressor.page:69 C/deesser.page:44 C/gate.page:64 #: C/multibandcompressor.page:64 C/multibandgate.page:72 msgid "It amplifies your signal after processing." msgstr "Amplifique seu sinal após o processamento." #. (itstool) path: title/em #: C/compressor.page:75 msgid "Compression Mode" msgstr "Modo de Compressão" #. (itstool) path: item/p #: C/compressor.page:79 msgid "" "Downward - Decreases the amplitude of the signal " "sections that are above the threshold." msgstr "" "Para Baixo - Reduz a amplitude das partes do sinal " "que estão acima do limiar." #. (itstool) path: item/p #: C/compressor.page:84 msgid "" "Upwards - Increases the amplitude of the signal " "sections that are below the threshold." msgstr "" "Para Cima - Aumenta a amplitude das partes do " "sinal que estão abaixo do limiar." #. (itstool) path: section/title #: C/compressor.page:93 msgid "Sidechain" msgstr "Cadeia Lateral" #. (itstool) path: item/p #: C/compressor.page:99 msgid "Allows to listen the processed sidechain signal." msgstr "Permite ouvir o sinal de sidechain processado." #. (itstool) path: title/em #: C/compressor.page:105 C/equalizer.page:99 msgid "Type" msgstr "Tipo" #. (itstool) path: item/p #: C/compressor.page:109 msgid "" "Feed-forward - The sidechain input is connected to " "compressor's input. More aggressive compression." msgstr "" " Feed-forward - A entrada cadeia lateral está " "conectada à entrada do compressor. Compressão mais agressiva." #. (itstool) path: item/p #: C/compressor.page:115 msgid "" "Feed-back - The sidechain input is connected to " "compressor's output. Vintage-style more accurate compression." msgstr "" " Feed-back - A entrada da cadeia lateral está " "conectada à saída do compressor. Compressão mais precisa no estilo vintage." #. (itstool) path: title/em #: C/compressor.page:124 C/deesser.page:103 C/multibandcompressor.page:95 #: C/multibandgate.page:103 C/stereotools.page:38 C/equalizer.page:23 #: C/equalizer.page:146 C/webrtc.page:75 msgid "Mode" msgstr "Modo" #. (itstool) path: item/p #: C/compressor.page:128 msgid "Peak - Measure signal's peak." msgstr "Peak - Medir o pico do sinal." #. (itstool) path: item/p #: C/compressor.page:134 msgid "RMS - Root mean square of the input signal." msgstr "" "RMS - Valor médio quadrático do sinal de Entrada." #. (itstool) path: item/p #: C/compressor.page:140 msgid "" "Low-Pass - Input signal is processed by a low-pass " "filter." msgstr "" "Passa-Baixa - O sinal de entrada é processado por " "um filtro passa-baixa." #. (itstool) path: item/p #: C/compressor.page:146 msgid "" "Uniform - Input signal is processed by a uniform " "filter." msgstr "" "Uniforme - O sinal de entrada é processado por um " "filtro uniforme." #. (itstool) path: title/em #: C/compressor.page:155 msgid "Source" msgstr "Fonte" #. (itstool) path: item/p #: C/compressor.page:159 msgid "" "Middle - Middle part of signal is used for " "sidechain processing." msgstr "" "Meio - A parte do meio do sinal é usada para o " "processamento da cadeia lateral." #. (itstool) path: item/p #: C/compressor.page:165 msgid "" "Side - Side part of signal is used for sidechain " "processing." msgstr "" "Lado - A parte lateral do sinal é usada para " "processamento da cadeia lateral." #. (itstool) path: item/p #: C/compressor.page:171 msgid "" "Left - Only left channel is used for sidechain " "processing." msgstr "" "Esquerda - Apenas o canal esquerdo é usado para " "processamento da cadeia lateral." #. (itstool) path: item/p #: C/compressor.page:177 msgid "" "Right - Only right channel is used for sidechain " "processing." msgstr "" "Direita - Apenas o canal direito é usado para " "processamento da cadeia lateral." #. (itstool) path: title/em #: C/compressor.page:186 msgid "Pre-amplification" msgstr "Pré-amplificação" #. (itstool) path: item/p #: C/compressor.page:188 msgid "Pre-amplification of the sidechain signal." msgstr "Pré-amplificação do sinal da cadeia lateral." #. (itstool) path: title/em #: C/compressor.page:194 msgid "Reactivity" msgstr "Reatividade" #. (itstool) path: item/p #: C/compressor.page:196 msgid "Reactivity of the sidechain signal." msgstr "Reatividade do sinal da cadeia lateral." #. (itstool) path: title/em #: C/compressor.page:202 C/limiter.page:30 msgid "Lookahead" msgstr "Lookahead" #. (itstool) path: item/p #: C/compressor.page:204 msgid "Look-ahead time of the sidechain relative to the input signal." msgstr "Tempo de antecipação da cadeia lateral em relação ao sinal de entrada." #. (itstool) path: section/title #: C/compressor.page:211 msgid "Advanced" msgstr "" #. (itstool) path: title/em #: C/compressor.page:215 msgid "Relative Release Threshold" msgstr "" #. (itstool) path: item/p #: C/compressor.page:217 msgid "" "Relative to the Attack Threshold that sets up the threshold of Release Time." msgstr "" #. (itstool) path: title/em #: C/compressor.page:223 #, fuzzy msgid "Boost Threshold" msgstr "Limiar" #. (itstool) path: item/p #: C/compressor.page:225 msgid "" "Related to upward compression mode only. It defines the threshold below " "which the constant amplification will be applied to the input signal. This " "prevents the compressor from applying infinite amplification to very quiet " "signals." msgstr "" #. (itstool) path: title/em #: C/compressor.page:233 #, fuzzy msgid "High-pass Filter Mode" msgstr "Filtro Passa-Alta" #. (itstool) path: item/p #: C/compressor.page:235 msgid "Sets the type of the high-pass filter applied to sidechain signal." msgstr "" #. (itstool) path: title/em #: C/compressor.page:241 #, fuzzy msgid "High-pass Frequency" msgstr "Amortecimento de Alta Frequência" #. (itstool) path: item/p #: C/compressor.page:243 #, fuzzy msgid "Sets the cut-off frequency of the high-pass filter." msgstr "A frequência central ou de corte do filtro." #. (itstool) path: title/em #: C/compressor.page:249 #, fuzzy msgid "Low-pass Filter Mode" msgstr "Frequência de corte do filtro passa baixas." #. (itstool) path: item/p #: C/compressor.page:251 #, fuzzy msgid "Sets the type of the low-pass filter applied to sidechain signal." msgstr "Permite ouvir o sinal de sidechain processado." #. (itstool) path: title/em #: C/compressor.page:257 #, fuzzy msgid "Low-pass Frequency" msgstr "Frequência de corte do filtro passa baixas." #. (itstool) path: item/p #: C/compressor.page:259 #, fuzzy msgid "Sets the cut-off frequency of the low-pass filter." msgstr "A frequência central ou de corte do filtro." #. (itstool) path: page/title #: C/deesser.page:9 msgid "Deesser" msgstr "Deesser" #. (itstool) path: page/p #: C/deesser.page:10 msgid "" "PulseEffects uses the deesser developed by Calf Studio. A deesser is used to " "dynamically reduce high frequencies. The standard field of use is the " "reduction of \"sssss\" and \"shhhh\" in vocal tracks." msgstr "" "PulseEffects usa o deesser desenvolvido por Calf Studio. Um deesser é usado " "para reduzir dinamicamente altas frequências. O campo padrão de uso é a " "redução de \"sssss\" e \"shhhh\" em trilhas vocais." #. (itstool) path: title/em #: C/deesser.page:18 msgid "Laxity" msgstr "Frouxidão" #. (itstool) path: item/p #: C/deesser.page:20 msgid "" "The reaction of the deesser. Higher values won't affect really short peaks." msgstr "" "A reação do deesser. Valores maiores não afetarão picos realmente curtos." #. (itstool) path: item/p #: C/deesser.page:28 C/multibandcompressor.page:40 C/multibandgate.page:48 msgid "If a signal rises above this level it will affect the gain reduction." msgstr "Se um sinal subir acima deste nível ele afetará a redução de ganho." #. (itstool) path: title/em #: C/deesser.page:50 #, fuzzy msgid "F1 Split" msgstr "Separado" #. (itstool) path: item/p #: C/deesser.page:52 msgid "" "The split frequency. All signals above this frequency will affect the gain " "reduction (and in split mode they are affected by the reduction too)." msgstr "" "A frequência de separação. Todos os sinais acima desta frequência afetarão a " "redução de ganho(e em modo separado eles também serão afetados pela redução)." #. (itstool) path: title/em #: C/deesser.page:59 #, fuzzy msgid "F1 Gain" msgstr "Ganho" #. (itstool) path: item/p #: C/deesser.page:61 msgid "" "It shifts the volume of the higher band. In wideband mode it affects the " "sidechain. In split mode it also affects the processed high frequencies." msgstr "" "Desloca o volume da banda mais alta. Em modo de banda ampla ele afeta a " "cadeia lateral. Em modo separado ele também afeta as altas frequências " "processadas." #. (itstool) path: title/em #: C/deesser.page:68 #, fuzzy msgid "F2 Peak" msgstr "Pico" #. (itstool) path: item/p #: C/deesser.page:70 msgid "" "Center frequency of the bell filter. It allows a more precise selection of " "the sidechain signal." msgstr "" "Frequência central do filtro de sino. Permite uma seleção mais precisa do " "sinal da cadeia lateral." #. (itstool) path: title/em #: C/deesser.page:77 #, fuzzy msgid "F2 Level" msgstr "Nível" #. (itstool) path: item/p #: C/deesser.page:79 msgid "Increase or decrease the frequencies around the center bell frequency." msgstr "" "Aumenta ou diminui a amplitude das frequências em torno da frequência " "central do sino." #. (itstool) path: title/em #: C/deesser.page:85 #, fuzzy msgid "F2 Peak Q" msgstr "Pico Q" #. (itstool) path: item/p #: C/deesser.page:87 msgid "" "Set the quality of the bell. Higher values will affect a narrower frequency " "range. Lower values will affect a wider band." msgstr "" "Define a qualidade do sino. Valores maiores afetarão um intervalo de " "frequência mais estreito. Valores menores afetarão uma faixa mais ampla." #. (itstool) path: title/em #: C/deesser.page:94 C/gate.page:79 C/multibandcompressor.page:78 #: C/multibandgate.page:86 msgid "Detection" msgstr "Detecção" #. (itstool) path: item/p #: C/deesser.page:96 msgid "" "Choose if the deesser should take the signal peak for detection or the RMS " "value (it is smoother)." msgstr "" "Escolha se o deesser deve tomar o pico do sinal para detecção ou o valor RMS " "(é mais suave)." #. (itstool) path: item/p #: C/deesser.page:105 msgid "Select your operation mode between wideband or split" msgstr "Selecione seu modo de operação entre banda ampla ou separado" #. (itstool) path: page/title #: C/exciter.page:9 msgid "Exciter" msgstr "Excitador" #. (itstool) path: page/p #: C/exciter.page:10 msgid "" "An exciter is used to enhance a signal by dynamic equalization, phase " "manipulation, harmonic synthesis of high frequency signals, and through the " "addition of subtle harmonic distortion." msgstr "" "Um excitador é usado para melhorar um sinal por equalização dinâmica, " "manipulação de fase, síntese harmônica de sinais de alta frequência e " "através da adição de distorção harmônica sutil." #. (itstool) path: page/p #: C/exciter.page:15 msgid "PulseEffects uses the exciter developed by Calf Studio." msgstr "PulseEffects usa o excitador desenvolvido por Calf Studio." #. (itstool) path: title/em #: C/exciter.page:45 msgid "Ceiling(button)" msgstr "Piso(botão)" #. (itstool) path: item/p #: C/exciter.page:47 msgid "Constrain the excitement on the upper end." msgstr "Restringir o reforço à extremidade inferior." #. (itstool) path: title/em #: C/exciter.page:53 msgid "Ceiling(value)" msgstr "Teto(valor)" #. (itstool) path: item/p #: C/exciter.page:55 msgid "The frequency no harmonics are produced above." msgstr "A frequência acima da qual harmônicos não são produzidos." #. (itstool) path: page/title #: C/filter.page:9 msgid "Filter" msgstr "Filtro" #. (itstool) path: page/p #: C/filter.page:10 msgid "" "Audio filters can amplify (boost), pass or attenuate (cut) some frequency " "ranges." msgstr "" "Os filtros de áudio podem amplificar (aumentar), atenuar ou atenuar (cortar) " "algumas faixas de frequência." #. (itstool) path: page/p #: C/filter.page:14 msgid "" "PulseEffects uses the filter from Calf Studio. It can be used to remove " "defined parts of a frequency spectrum." msgstr "" "PulseEffects usa o filtro do Calf Studio. Pode ser usado para remover partes " "definidas de um espectro de frequência." #. (itstool) path: title/em #: C/filter.page:21 C/equalizer.page:224 msgid "Frequency" msgstr "Frequência" #. (itstool) path: item/p #: C/filter.page:23 msgid "The center or cut-off frequency of the filter." msgstr "A frequência central ou de corte do filtro." #. (itstool) path: title/em #: C/filter.page:29 msgid "Resonance" msgstr "Ressonância" #. (itstool) path: item/p #: C/filter.page:31 msgid "" "Add an accentuation to the center frequency. When used on a bandpass the " "surrounding frequencies are decreased in level and the band gets more " "narrow, a bandreject is narrowed down to a thin needle." msgstr "" "Adicione uma acentuação à frequência central. Quando usado em um passa-" "banda, as frequências circundantes diminuem de nível e a faixa fica mais " "estreita, um objeto de banda é reduzido a uma agulha fina." #. (itstool) path: title/em #: C/filter.page:39 msgid "Inertia" msgstr "Inércia" #. (itstool) path: item/p #: C/filter.page:41 msgid "Smooths the jumps between frequencies." msgstr "Saltos suaves entre as frequências." #. (itstool) path: page/title #: C/gate.page:9 msgid "Gate" msgstr "Gate" #. (itstool) path: page/p #: C/gate.page:10 msgid "" "Gates attenuate signals that register below the threshold. This kind of " "signal processing reduces disturbing noise between useful signals." msgstr "" "Gates atenuam os sinais que se registram abaixo do limite. Esse tipo de " "processamento de sinal reduz o ruído perturbador entre sinais úteis." #. (itstool) path: page/p #: C/gate.page:14 msgid "PulseEffects uses the gate developed by Calf Studio." msgstr "PulseEffects usa o gate desenvolvido por Calf Studio." #. (itstool) path: item/p #: C/gate.page:22 #, fuzzy msgid "" "Amount of milliseconds the signal has to rise above the threshold before " "gain reduction stops." msgstr "" "Quantidade de milissegundos que o sinal deve passar acima do limiar para que " "a redução de ganho comece." #. (itstool) path: item/p #: C/gate.page:31 #, fuzzy msgid "" "Amount of milliseconds the signal has to fall below the threshold before the " "reduction is increased again." msgstr "" "Quantidade de milissegundos que o sinal tem que passar abaixo do limar antes " "que a magnitude da redução seja novamente diminuída." #. (itstool) path: item/p #: C/gate.page:40 #, fuzzy msgid "If a signal rises above this level the gain reduction is released." msgstr "Se um sinal subir acima deste nível ele afetará a redução de ganho." #. (itstool) path: title/em #: C/gate.page:70 msgid "Stereo Link" msgstr "Elo Stereo" #. (itstool) path: item/p #: C/gate.page:72 msgid "" "Choose if the gain reduction is affected by the louder channel or by the " "average level between the channels." msgstr "" "Escolha se a redução será afetada pelo nível médio entre os canais ou pelo " "canal mais alto." #. (itstool) path: item/p #: C/gate.page:81 msgid "" "Choose if the gate should take the signal peak for detection or the RMS " "value (it is smoother)." msgstr "" "Escolha se o gate deve tomar o pico do sinal para detecção ou o valor RMS (é " "mais suave)." #. (itstool) path: title/em #: C/gate.page:88 msgid "Gain Reduction" msgstr "Redução de Ganho" #. (itstool) path: item/p #: C/gate.page:90 msgid "The level of gain reduction when the signal is below the threshold." msgstr "O nível da redução de ganho quando o sinal está abaixo do limiar." #. (itstool) path: page/title #: C/delay.page:9 msgid "Delay" msgstr "Atraso" #. (itstool) path: page/p #: C/delay.page:10 msgid "" "This plugin allows to add short delay to each individual channel of the " "stereo channel" msgstr "" "Este plugin permite adicionar um pequeno atraso a cada canal individualmente" #. (itstool) path: title/em #: C/delay.page:17 msgid "Left" msgstr "Esquerdo" #. (itstool) path: item/p #: C/delay.page:19 msgid "Left channel delay." msgstr "Atraso do canal esquerdo." #. (itstool) path: title/em #: C/delay.page:25 msgid "Right" msgstr "Direito" #. (itstool) path: item/p #: C/delay.page:27 msgid "Right channel delay." msgstr "Atraso do canal direito." #. (itstool) path: page/title #: C/index.page:8 msgid "PulseEffects" msgstr "PulseEffects" #. (itstool) path: page/p #: C/index.page:9 msgid "" "PulseEffects applies audio effects to Pulseaudio applications. You can apply " "effects to applications output or to your microphone before sending its " "audio to a recording application." msgstr "" "O PulseEffects aplica efeitos de áudio aos aplicativos que utilizam " "Pulseaudio. Você pode aplicar efeitos à saída de aplicativos ou ao microfone " "antes de enviar o áudio para um aplicativo de gravação." #. (itstool) path: section/title #: C/index.page:11 msgid "Guides" msgstr "" #. (itstool) path: section/title #: C/index.page:14 msgid "User Interface" msgstr "Interface do Usuário" #. (itstool) path: section/title #: C/index.page:17 msgid "Plugins" msgstr "Plugins" #. (itstool) path: section/title #: C/index.page:20 msgid "Calibration" msgstr "Calibração" #. (itstool) path: page/title #. (itstool) path: title/em #: C/limiter.page:9 C/limiter.page:18 C/webrtc.page:88 msgid "Limiter" msgstr "Limitador" #. (itstool) path: page/p #: C/limiter.page:10 msgid "" "A limiter allows signals below a specified input power or level to pass " "unaffected while attenuating (lowering) the peaks of stronger signals that " "exceed this threshold." msgstr "" "Um limitador permite que os sinais abaixo de uma potência de entrada " "especificada ou nível passem sem serem afetados enquanto atenua (abaixa) os " "picos de sinais mais fortes que excedem esse limite." #. (itstool) path: page/p #: C/limiter.page:15 msgid "PulseEffects uses the limiter developed by Calf Studio." msgstr "PulseEffects usa o limitador desenvolvido por Calf Studio." #. (itstool) path: title/em #: C/limiter.page:22 msgid "Limit" msgstr "Limite" #. (itstool) path: item/p #: C/limiter.page:24 msgid "No signal above this level will pass through the limiter." msgstr "Nenhum sinal acima deste nível passará pelo limitador." #. (itstool) path: item/p #: C/limiter.page:32 msgid "" "The Limiter will reach its attenuation level in this amount of time (output " "will be delayed two times this time)." msgstr "" "O Limitador alcançará seu nível de atenuação neste período de tempo (a saída " "será atrasada duas vezes neste momento)." #. (itstool) path: item/p #: C/limiter.page:41 msgid "Stop the attenuation after this amount of milliseconds." msgstr "Pare a atenuação após esta quantidade de milissegundos." #. (itstool) path: title/em #: C/limiter.page:47 msgid "Oversampling" msgstr "Oversampling" #. (itstool) path: item/p #: C/limiter.page:49 msgid "" "Increase the signal sampling to better detect the peaks. The signal is " "downsampled after processing." msgstr "" "Aumenta a amostragem do sinal para detectar melhor os picos. A taxa de " "amostragem é reduzida após o processamento." #. (itstool) path: title/em #: C/limiter.page:56 msgid "Automatic Smoothing Control" msgstr "" #. (itstool) path: item/p #: C/limiter.page:58 msgid "" "When gain reduction is always needed ASC takes care of releasing to an " "average reduction level rather than reaching a reduction of 0 in the release " "time." msgstr "" "Quando a redução de ganho é sempre necessária, o ASC se encarrega de liberar " "para um nível médio de redução em vez de atingir uma redução de 0 no tempo " "de liberação." #. (itstool) path: title/em #: C/limiter.page:65 msgid "ASC Level" msgstr "Nível de ASC" #. (itstool) path: item/p #: C/limiter.page:67 msgid "" "Select how much the release time is affected by ASC, 0 means nearly no " "changes in release time while 1 produces higher release times." msgstr "" "Selecione o quanto o tempo de liberação é afetado pelo ASC, 0 significa " "quase nenhuma mudança no tempo de liberação enquanto 1 produz tempos de " "liberação mais altos." #. (itstool) path: title/em #: C/limiter.page:74 msgid "Automatic Leveling" msgstr "" #. (itstool) path: item/p #: C/limiter.page:76 msgid "" "Raises the signal level adding the absolute value of the limit amount after " "the compression stage is performed. Enabling this feature the volume is " "automatically leveled at 0 db." msgstr "" #. (itstool) path: title/em #: C/limiter.page:84 msgid "Input Gain" msgstr "Ganho de Entrada" #. (itstool) path: item/p #: C/limiter.page:86 #, fuzzy msgid "" "Raises or decrease the signal level before it is sent to the compression " "stage." msgstr "Aumenta o volume antes que ele seja enviado ao estágio de compressão." #. (itstool) path: title/em #: C/limiter.page:92 #, fuzzy msgid "Output Gain" msgstr "Ganho de Entrada" #. (itstool) path: item/p #: C/limiter.page:94 #, fuzzy msgid "Raises or decrease the signal level after the compression stage." msgstr "Aumenta o volume antes que ele seja enviado ao estágio de compressão." #. (itstool) path: page/title #: C/loudness.page:9 msgid "Loudness Compensator" msgstr "" #. (itstool) path: page/p #: C/loudness.page:10 msgid "" "PulseEffects uses the loudness compensator from Linux Studio Plugins which " "applies equal loudness contour corrections to the input signal. This is a " "measure of sound pressure level (SPL), over the frequency spectrum, for " "which a listener perceives a constant loudness when presented with pure " "steady tones." msgstr "" #. (itstool) path: title/em #: C/loudness.page:20 #, fuzzy msgid "Input" msgstr "Ganho de Entrada" #. (itstool) path: item/p #: C/loudness.page:22 msgid "" "The input gain settings, allows to adjust the level of the input signal to " "the desired level." msgstr "" #. (itstool) path: title/em #: C/loudness.page:29 msgid "Output" msgstr "Saída" #. (itstool) path: item/p #: C/loudness.page:31 msgid "" "The output volume of the signal with applied equal loudness contour, " "controls the loudness of the 1 kHz pure sine wave." msgstr "" #. (itstool) path: title/em #: C/loudness.page:38 msgid "Standard" msgstr "" #. (itstool) path: item/p #: C/loudness.page:40 msgid "Allows to select different equal loudness contour standards." msgstr "" #. (itstool) path: title/em #: C/loudness.page:46 #, fuzzy msgid "FFT Size" msgstr "Tamanho do Quadro" #. (itstool) path: item/p #: C/loudness.page:48 msgid "" "Allows to select size of the fast Fourier transform frame used for the " "processing. The larger FFT frame is, the more precize the curve is " "approximated and the more latency the plugin introduces" msgstr "" #. (itstool) path: page/title #: C/multibandcompressor.page:9 msgid "Multiband Compressor" msgstr "Compressor Multibandas" #. (itstool) path: page/p #: C/multibandcompressor.page:10 msgid "" "This kind of compressor splits the signal in four different frequency " "ranges. These ranges are compressed separately and mixed together afterwards " "again." msgstr "" "Esse tipo de compressor divide o sinal em quatro faixas de frequência " "diferentes. Esses intervalos são compactados separadamente e misturados " "novamente depois." #. (itstool) path: page/p #: C/multibandcompressor.page:14 msgid "PulseEffects uses the multiband compressor developed by Calf Studio." msgstr "" "PulseEffects usa o compressor multi bandas desenvolvido por Calf Studio." #. (itstool) path: item/p #: C/multibandcompressor.page:22 C/multibandgate.page:22 msgid "" "Amount of milliseconds the signal has to rise above the threshold before " "gain reduction starts." msgstr "" "Quantidade de milissegundos que o sinal deve passar acima do limiar para que " "a redução de ganho comece." #. (itstool) path: item/p #: C/multibandcompressor.page:31 C/multibandgate.page:31 msgid "" "Amount of milliseconds the signal has to fall below the threshold before the " "reduction is decreased again." msgstr "" "Quantidade de milissegundos que o sinal tem que passar abaixo do limar antes " "que a magnitude da redução seja novamente diminuída." #. (itstool) path: title/em #: C/multibandcompressor.page:70 C/multibandgate.page:78 C/crystalizer.page:37 msgid "Bypass" msgstr "Ignorar" #. (itstool) path: item/p #: C/multibandcompressor.page:72 C/multibandgate.page:80 msgid "Don't process anything, just bypass the signal of this strip." msgstr "Não processe nada, apenas passe adiante o sinal esta faixa." #. (itstool) path: item/p #: C/multibandcompressor.page:80 msgid "" "Choose if the multibandcompressor should take the signal peak for detection " "or the RMS value (it is smoother)." msgstr "" "Escolha se o compressor deve tomar o pico do sinal para detecção ou o valor " "RMS(é mais suave)." #. (itstool) path: title/em #: C/multibandcompressor.page:87 C/multibandgate.page:95 C/equalizer.page:208 msgid "Solo" msgstr "Sozinho" #. (itstool) path: item/p #: C/multibandcompressor.page:89 C/multibandgate.page:97 msgid "Mute all strips not set to solo." msgstr "Silencia todas as faixas não configuradas para solo." #. (itstool) path: item/p #: C/multibandcompressor.page:97 C/multibandgate.page:105 msgid "" "The crossover mode. You can choose between the fourth order Linkwitz-" "Riley(LR4) and the eighth order Linkwitz-Riley(LR8)." msgstr "" "O modo de cruzamento. Você pode escolher entre a quarta ordem Linkwitz-Riley " "(LR4) e a oitava ordem Linkwitz-Riley (LR8)." #. (itstool) path: title/em #: C/multibandcompressor.page:104 C/multibandgate.page:112 msgid "Split 1/2" msgstr "Disivão 1/2" #. (itstool) path: item/p #: C/multibandcompressor.page:106 C/multibandgate.page:114 msgid "Frequency that separates the sub band and the low band." msgstr "Frequência que separa as bandas sub e baixa." #. (itstool) path: title/em #: C/multibandcompressor.page:112 C/multibandgate.page:120 msgid "Split 2/3" msgstr "Disivão 2/3" #. (itstool) path: item/p #: C/multibandcompressor.page:114 C/multibandgate.page:122 msgid "Frequency that separates the low band and the mid band." msgstr "Frequência que separa as bandas baixa e média." #. (itstool) path: title/em #: C/multibandcompressor.page:120 C/multibandgate.page:128 msgid "Split 3/4" msgstr "Disivão 3/4" #. (itstool) path: item/p #: C/multibandcompressor.page:122 C/multibandgate.page:130 msgid "Frequency that separates the mid band and the high band." msgstr "Frequência que separa as bandas média e alta." #. (itstool) path: page/title #: C/multibandgate.page:9 msgid "Multiband Gate" msgstr "Gate Multibandas" #. (itstool) path: page/p #: C/multibandgate.page:10 msgid "" "This kind of gate splits the signal in four different frequency ranges. " "These ranges are processed separately and mixed together afterwards again." msgstr "" "Esse tipo de porta divide o sinal em quatro faixas de frequência diferentes. " "Esses intervalos são processados separadamente e misturados novamente depois." #. (itstool) path: page/p #: C/multibandgate.page:14 msgid "PulseEffects uses the multiband gate developed by Calf Studio." msgstr "PulseEffects usa o gate multi bandas desenvolvido por Calf Studio." #. (itstool) path: title/em #: C/multibandgate.page:38 msgid "Reduction" msgstr "Redução" #. (itstool) path: item/p #: C/multibandgate.page:40 msgid "The level of reduction in this strip." msgstr "O nível de redução nesta faixa." #. (itstool) path: item/p #: C/multibandgate.page:88 msgid "" "Choose if the multibandgate should take the signal peak for detection or the " "RMS value (it is smoother)." msgstr "" "Escolha se o compressor deve tomar o pico do sinal para detecção ou o valor " "RMS (é mais suave)." #. (itstool) path: page/title #: C/reverb.page:9 msgid "Reverberation" msgstr "Reverberação" #. (itstool) path: page/p #: C/reverb.page:10 msgid "" "Reverberation, in psychoacoustics and acoustics, is a persistence of sound " "after the sound is produced. A reverberation, or reverb, is created when a " "sound or signal is reflected causing a large number of reflections to build " "up and then decay as the sound is absorbed by the surfaces of objects in the " "space. Reverberation plugins can be used to artificially produce this effect." msgstr "" "A reverberação, em psicoacústica e acústica, é uma persistência de som " "depois que o som é produzido. Uma reverberação, ou reverberação, é criada " "quando um som ou sinal é refletido causando um grande número de reflexões a " "serem construídas e decaindo quando o som é absorvido pelas superfícies dos " "objetos no espaço. Os plugins de reverberação podem ser usados para produzir " "artificialmente esse efeito." #. (itstool) path: page/p #: C/reverb.page:17 msgid "PulseEffects uses the reverberation developed by Calf Studio." msgstr "PulseEffects usa o reverberador desenvolvido por Calf Studio." #. (itstool) path: title/em #: C/reverb.page:23 msgid "Pre Delay" msgstr "Pré Atraso" #. (itstool) path: item/p #: C/reverb.page:25 msgid "" "Additional delay - corresponds to a distance between sound source and the " "nearest wall." msgstr "" "Atraso adicional - corresponde a uma distância entre a fonte de som e a " "parede mais próxima." #. (itstool) path: title/em #: C/reverb.page:32 msgid "Decay Time" msgstr "Tempo de Decaimento" #. (itstool) path: item/p #: C/reverb.page:34 msgid "Time it takes for reverberation to fade out." msgstr "Tempo que leva para a reverberação desaparecer." #. (itstool) path: item/p #: C/reverb.page:42 msgid "Amount of processed signal (reverberation) in the output." msgstr "A quantidade de sinal processado(reverberação) na saída." #. (itstool) path: title/em #: C/reverb.page:48 msgid "Dry" msgstr "Seco" #. (itstool) path: item/p #: C/reverb.page:50 msgid "Amount of unprocessed signal in the output." msgstr "A quantidade de sinal não processado na saída." #. (itstool) path: title/em #: C/reverb.page:56 msgid "Bass Cut" msgstr "Corte de Grave" #. (itstool) path: item/p #: C/reverb.page:58 msgid "Removes low frequencies from the reverberation." msgstr "Remove baixas frequências da reverberação." #. (itstool) path: title/em #: C/reverb.page:64 msgid "Treble Cut" msgstr "Corte de Agudo" #. (itstool) path: item/p #: C/reverb.page:66 msgid "Removes high frequencies from the reverberation." msgstr "Remove altas frequências da reverberação." #. (itstool) path: title/em #: C/reverb.page:72 msgid "Diffusion" msgstr "Difusão" #. (itstool) path: item/p #: C/reverb.page:74 msgid "Increase its value for less uniform reverberation." msgstr "Aumente seu valor para uma reverberação menos uniforme." #. (itstool) path: title/em #: C/reverb.page:80 msgid "Room Size" msgstr "Tamanho do quarto" #. (itstool) path: item/p #: C/reverb.page:82 msgid "" "Size of the space that simulated reverberation occurs in - determines times " "between reflections." msgstr "" "Tamanho do espaço no qual a reverberação ocorre - determina os tempos entre " "as reflecções." #. (itstool) path: title/em #: C/reverb.page:89 msgid "High Frequency Damping" msgstr "Amortecimento de Alta Frequência" #. (itstool) path: item/p #: C/reverb.page:91 msgid "" "Cutoff reflections high frequencies - causes higher frequencies to decay " "faster." msgstr "" "Corta alta frequência das reflexões - faz com que as frequências mais altas " "diminuam mais rapidamente." #. (itstool) path: page/title #: C/stereotools.page:9 msgid "Stereo Tools" msgstr "Ferramentas Stereo" #. (itstool) path: page/p #: C/stereotools.page:10 msgid "PulseEffects uses the stereo tools developed by Calf Studio." msgstr "PulseEffects usa as ferramentas stereo desenvolvidas por Calf Studio." #. (itstool) path: title/em #: C/stereotools.page:16 msgid "Softclip" msgstr "Clipe Macio" #. (itstool) path: item/p #: C/stereotools.page:18 msgid "Do kind of analog distortion instead of harsh digital 0db clipping." msgstr "" "Faça uma espécie de distorção analógica em vez de um duro recorte digital de " "0 db." #. (itstool) path: title/em #: C/stereotools.page:24 msgid "Balance" msgstr "Balanço" #. (itstool) path: item/p #: C/stereotools.page:26 msgid "Set the balance between both channels." msgstr "Configura o balanço entre ambos os canais." #. (itstool) path: title/em #: C/stereotools.page:32 msgid "S/C Level" msgstr "Nível de S/C" #. (itstool) path: item/p #: C/stereotools.page:40 msgid "Choose normal stereo behavior (LR - LR) or convert between MS and LR." msgstr "" "Escolha o comportamento estéreo normal (ED - ED) ou converta entre ML e ED." #. (itstool) path: title/em #: C/stereotools.page:46 msgid "Side Level" msgstr "Nível Lateral" #. (itstool) path: item/p #: C/stereotools.page:48 msgid "The level of the side signal." msgstr "Nível do sinal lateral." #. (itstool) path: title/em #: C/stereotools.page:54 msgid "Side Balance" msgstr "Balanço Lateral" #. (itstool) path: item/p #: C/stereotools.page:56 msgid "The balance of the side signal." msgstr "Balanço do sinal Lateral." #. (itstool) path: title/em #: C/stereotools.page:62 msgid "Middle Level" msgstr "Nível do Meio" #. (itstool) path: item/p #: C/stereotools.page:64 msgid "Middle signal position in the stereo panorama." msgstr "Posição do sinal do meio no panorama stereo." #. (itstool) path: title/em #: C/stereotools.page:70 msgid "Delay L/R" msgstr "Atraso E/D" #. (itstool) path: item/p #: C/stereotools.page:72 msgid "" "Delay the left or the right channel (milliseconds). Negative values delay " "the left channel and positive values the right channel." msgstr "" "Atrase o canal esquerdo ou direito (milissegundos). Valores negativos " "atrasam o canal esquerdo e valores positivos no canal direito." #. (itstool) path: title/em #: C/stereotools.page:79 msgid "Stereo Base" msgstr "Base Stereo" #. (itstool) path: item/p #: C/stereotools.page:81 msgid "" "Set the stereo base of your material seamless between Mono and inverted " "Channels." msgstr "Defina a base estéreo do seu material entre mono e canais invertidos." #. (itstool) path: title/em #: C/stereotools.page:88 msgid "Stereo Phase" msgstr "Fase Stereo" #. (itstool) path: item/p #: C/stereotools.page:90 msgid "Set the stereo phase of your material." msgstr "Configura a fase stereo do seu material." #. (itstool) path: page/title #: C/maximizer.page:9 msgid "Maximizer" msgstr "Maximizador" #. (itstool) path: page/p #: C/maximizer.page:10 msgid "" "Maximizer is a versatile plugin that can be tweaked to be a compressor, an " "amplifier and a limiter. It is basically controlled by only two parameters: " "ceiling and threshold. Threshold is a relative value representing the " "amplification of the signal while ceiling is the maximum allowed output peak " "level. Setting both values different from zero, the plugin will act as an " "upward compressor with a limiter on the ceiling level (overly amplified " "signal with ceiling set too low can result in distorted sound even without " "the presence of clipping). When only threshold is set equal to zero, it " "reduces the amplitude of the signal." msgstr "" "O Maximizer é um plugin versátil que pode ser ajustado para ser um " "compressor, um amplificador e um limitador. É basicamente controlado por " "apenas dois parâmetros: teto e limite. O limiar é um valor relativo que " "representa a amplificação do sinal, enquanto o teto é o nível de pico de " "saída máximo permitido. Definindo ambos os valores diferentes de zero, o " "plugin funcionará como um compressor ascendente com um limitador no nível do " "teto (sinal excessivamente amplificado com o teto ajustado muito baixo pode " "resultar em som distorcido mesmo sem a presença de cortes). Quando apenas o " "limite é definido como zero, reduz a amplitude do sinal." #. (itstool) path: page/p #: C/maximizer.page:21 msgid "PulseEffects uses the maximizer from ZamAudio." msgstr "PulseEffects usa o maximizador desenvolvido por Zamaudio." #. (itstool) path: item/p #: C/maximizer.page:29 msgid "" "Relative value representing the amplification of the signal. Zero is no " "amplification. Lower values, higher amplification." msgstr "" "Valor relativo representando a amplificação do sinal. Zero não é " "amplificação. Valores mais baixos, maior amplificação." #. (itstool) path: title/em #: C/maximizer.page:36 msgid "Ceiling" msgstr "Teto" #. (itstool) path: item/p #: C/maximizer.page:38 msgid "Maximum allowed peak level of the output signal." msgstr "Máximo valor de pico permitido para o sinal de saída." #. (itstool) path: item/p #: C/maximizer.page:46 msgid "Set the release in milliseconds." msgstr "Definir a liberação em milissegundos." #. (itstool) path: page/title #: C/crossfeed.page:9 msgid "Crossfeed" msgstr "Crossfeed" #. (itstool) path: page/p #: C/crossfeed.page:10 msgid "" "PulseEffects uses the crossfeed from GStreamer. This plugin is based on the " "bs2b library and can be used to improve headphone listening of stereo audio " "records. It does so by mixing the left and right channel in a way that " "simulates a stereo speaker setup while using headphones." msgstr "" "O PulseEffects usa o crossfeed do GStreamer. Este plugin é baseado na " "biblioteca bs2b e pode ser usado para melhorar a audição de áudio estéreo " "via fones de ouvido. Ele faz isso misturando os canais esquerdo e direito de " "uma forma que simula a configuração de um alto-falante estéreo durante o uso " "de fones de ouvido." #. (itstool) path: title/em #: C/crossfeed.page:19 msgid "Cutoff" msgstr "Corte" #. (itstool) path: item/p #: C/crossfeed.page:21 msgid "Low-pass filter cutoff frequency." msgstr "Frequência de corte do filtro passa baixas." #. (itstool) path: title/em #: C/crossfeed.page:27 msgid "Feed" msgstr "Alimentação" #. (itstool) path: item/p #: C/crossfeed.page:29 msgid "Amount of signal from a channel that is sent to the other." msgstr "Quantidade de sinal de um canal que enviada para o outro." #. (itstool) path: page/title #: C/equalizer.page:9 msgid "Equalizer" msgstr "Equalizador" #. (itstool) path: page/p #: C/equalizer.page:10 msgid "" "PulseEffects uses the parametric equalizer from Linux Studio Plugins. You " "can choose between 1 and 30 bands. You also can change the center frequency " "and the width of each band as needed. There are a few presets but at this " "moment all of them have only 10 bands. Presets with other number of bands " "may be added in the future." msgstr "" "O PulseEffects usa o equalizador paramétrico do Linux Studio Plugins. Você " "pode escolher entre 1 e 30 bandas. Você também pode alterar a frequência " "central e a largura de cada banda conforme necessário. Há algumas " "predefinições, mas neste momento todos eles têm apenas 10 bandas. " "Predefinições com outro número de bandas podem ser adicionados no futuro." #. (itstool) path: section/title #: C/equalizer.page:18 msgid "Main Menu" msgstr "Menu de Principal" #. (itstool) path: item/p #: C/equalizer.page:27 msgid "" "IIR - Infinite Impulse Response filters, nonlinear " "minimal phase. In most cases does not add noticeable latency to output " "signal." msgstr "" "IIR - Filtros com resposta de impulso infinita, " "fase mínima não linear. Na maioria dos casos não adiciona uma latência " "siginificativa ao sinal de saída." #. (itstool) path: item/p #: C/equalizer.page:33 msgid "" "FIR - Finite Impulse Response filters with linear " "phase, finite approximation of equalizer's impulse response. Adds noticeable " "latency to output signal." msgstr "" "FIR - Filtros de Resposta de impulso finitos com " "fase linear, aproximação finita da resposta de impulso do equalizador. " "Adiciona latência perceptível ao sinal de saída." #. (itstool) path: item/p #: C/equalizer.page:39 msgid "" "FFT - Fast Fourier Transform approximation of the " "frequency chart, linear phase. Adds noticeable latency to output signal." msgstr "" "FFT - Aproximação rápida da Transformada de " "Fourier do gráfico de freqüência, fase linear. Adiciona latência perceptível " "ao sinal de saída." #. (itstool) path: title/em #: C/equalizer.page:48 msgid "Bands" msgstr "Bandas" #. (itstool) path: item/p #: C/equalizer.page:50 msgid "The number of equalizer bands." msgstr "O número de bandas do equalizador." #. (itstool) path: title/em #: C/equalizer.page:56 msgid "Split Channels" msgstr "Canais Separados" #. (itstool) path: item/p #: C/equalizer.page:58 msgid "" "When this option is enabled it is possible to apply different equalizations " "to the left and the right channel." msgstr "" "Quando esta opção está ativada, é possível aplicar diferentes equalizações " "ao canal esquerdo e direito." #. (itstool) path: title/em #: C/equalizer.page:65 msgid "Flat Response" msgstr "Resposta Plana" #. (itstool) path: item/p #: C/equalizer.page:67 msgid "This function sets each band gain to 0." msgstr "Esta função configura o ganho de cada banda para 0." #. (itstool) path: title/em #: C/equalizer.page:73 msgid "Calculate Frequencies" msgstr "Calcular Frequências" #. (itstool) path: item/p #: C/equalizer.page:75 msgid "" "This function can be used to calculate the center frequencies and bandwidth " "of a graphic equalizer with the current number of selected bands. Useful " "when the user does not want the default number of 30 bands but has no idea " "about which frequencies and bandwidth he/she should choose." msgstr "" "Esta função pode ser usada para calcular as frequências centrais e a largura " "de banda de um equalizador gráfico com o número atual de bandas " "selecionadas. Útil quando o usuário não deseja o número padrão de 30 bandas " "mas não tem ideia sobre quais frequências e largura de banda ele deve " "escolher." #. (itstool) path: title/em #: C/equalizer.page:84 msgid "Reset Equalizer" msgstr "Redefinir Equalizador" #. (itstool) path: item/p #: C/equalizer.page:86 msgid "Reset the equalizer to its default settings." msgstr "Redefine o equalizador para suas configurações padrões." #. (itstool) path: section/title #: C/equalizer.page:95 msgid "Band Menu" msgstr "Menu da Banda" #. (itstool) path: item/p #: C/equalizer.page:103 msgid "Off - Filter is not working (turned off)." msgstr "" "Off - O filtro não está funcionando(desligado)." #. (itstool) path: item/p #: C/equalizer.page:108 msgid "Bell - Bell filter with smooth peak/recess." msgstr "" "Bell - Filtro de Bell com pico / recesso suave." #. (itstool) path: item/p #: C/equalizer.page:113 msgid "" "High-pass - High-pass filter with rejection of low " "frequencies." msgstr "" "High-pass - Filtro passa-altas com rejeição de " "baixas frequências." #. (itstool) path: item/p #: C/equalizer.page:118 msgid "" "High-shelf - Shelving filter with adjustment of " "high frequency range." msgstr "" "High-shelf - Filtro do tipo shelf com ajuste do " "intervalo de alta frequência." #. (itstool) path: item/p #: C/equalizer.page:123 msgid "" "Low-pass - Low-pass filter with rejection of high " "frequencies." msgstr "" "Low-pass - Filtro passa-baixa com rejeição de " "altas frequências." #. (itstool) path: item/p #: C/equalizer.page:128 msgid "" "Low-shelf - Shelving filter with adjustment of low " "frequencies." msgstr "" "Low-shelf - Filtro do tipo shelf com ajuste de " "baixas frequências." #. (itstool) path: item/p #: C/equalizer.page:133 msgid "" "Notch - Notch filter with full rejection of " "selected frequency." msgstr "" "Notch - Filtro refeita-faixa com rejeição total da " "frequência selecionada." #. (itstool) path: item/p #: C/equalizer.page:138 msgid "" "Resonance - Resonance filter wih sharp peak/recess." msgstr "" "Resonance - Filtro de ressonânte com acentuado " "pico / recesso." #. (itstool) path: item/p #: C/equalizer.page:150 msgid "" "RLC - Very smooth filters based on similar " "cascades of RLC contours." msgstr "" "RLC - Filtros muito suaves baseados em cascatas " "semelhantes de contornos RLC." #. (itstool) path: item/p #: C/equalizer.page:155 msgid "" "BWC - Butterworth-Chebyshev-type-1 based filters. " "Does not affect Resonance and Notch filters." msgstr "" "BWC - Filtros baseados em Butterworth-Chebyshev do " "tipo 1. Não afetam os filtros rejeita-faixa e ressonante." #. (itstool) path: item/p #: C/equalizer.page:161 msgid "" "LRX - Linkwitz-Riley based filters. Does not " "affect Resonance and Notch filters." msgstr "" "LRX - Filtros baseados em Linkwitz-Riley. Não " "afeta os filtros rejeita-faixa e ressonante." #. (itstool) path: item/p #: C/equalizer.page:166 msgid "" "APO - Digital biquad filters derived from canonic " "analog biquad prototypes digitalized through Bilinear transform. These are " "textbook filters <_:link-1/> which are implemented as in the <_:link-2/> " "software." msgstr "" "APO - Filtros digitais biquadrados derivados de " "protótipos analógicos biquadrados canônicos digitalizados a partir de " "transformada bilinear. Estes são filtros de livro texto <_:link-1/> " "implementados da mesma forma que no programa <_:link-2/>." #. (itstool) path: item/p #: C/equalizer.page:181 msgid "" "(BT) - Bilinear Z-transform is used for pole/zero " "mapping." msgstr "" "(BT) - A transformada Z bilinear é usada para " "mapeamento de pólo / zero." #. (itstool) path: item/p #: C/equalizer.page:186 msgid "" "(MT) - Matched Z-transform is used for pole/zero " "mapping." msgstr "" "(MT) - Transformação Z combinada é usada para " "mapeamento de pólo / zero." #. (itstool) path: item/p #: C/equalizer.page:191 msgid "" "(DR) - Direct design is used to serve the digital " "filter coefficients directly in the digital domain without performing " "transforms." msgstr "" "(DR) - Uma implementação direta é usada para obter " "coeficientes do filtro digital diretamente no domínio digital sem realizar " "transformações." #. (itstool) path: title/em #: C/equalizer.page:200 msgid "Slope" msgstr "Inclinação" #. (itstool) path: item/p #: C/equalizer.page:202 msgid "The slope of the filter characteristics." msgstr "A inclinação da curva do filtro do filtro." #. (itstool) path: item/p #: C/equalizer.page:210 msgid "Makes this band the only one active." msgstr "Transforma esta banda na única ativa." #. (itstool) path: title/em #: C/equalizer.page:216 C/crystalizer.page:45 msgid "Mute" msgstr "Mudo" #. (itstool) path: item/p #: C/equalizer.page:218 msgid "Mutes the band." msgstr "Silencia a banda." #. (itstool) path: item/p #: C/equalizer.page:226 msgid "Band center frequency." msgstr "Frequência central da banda." #. (itstool) path: title/em #: C/equalizer.page:232 msgid "Width" msgstr "Largura" #. (itstool) path: p/code #: C/equalizer.page:236 #, no-wrap msgid "width = frequency / quality" msgstr "largura = frequência / qualidade" #. (itstool) path: item/p #: C/equalizer.page:234 msgid "Bandwidth. Calculated as <_:code-1/>." msgstr "Largura de banda. Calculado a partir de <_:code-1/>." #. (itstool) path: title/em #: C/equalizer.page:241 msgid "Quality" msgstr "Qualidade" #. (itstool) path: item/p #: C/equalizer.page:243 msgid "Quality factor." msgstr "Fator de qualidade." #. (itstool) path: page/title #: C/pitch.page:9 msgid "Pitch" msgstr "Altura" #. (itstool) path: page/p #: C/pitch.page:10 msgid "" "Pitch shifting is a sound recording technique in which the original pitch of " "a sound is raised or lowered." msgstr "" "Deslocamento de altura é uma técnica de gravação de som em que o tom " "original de um som é aumentado ou diminuído." #. (itstool) path: page/p #: C/pitch.page:14 msgid "PulseEffects uses the pitch shifter from RubberBand." msgstr "PulseEffects usa o deslocador de tom desenvolvido por GStreamer." #. (itstool) path: title/em #: C/pitch.page:20 msgid "Faster" msgstr "Mais Rápido" #. (itstool) path: title/em #: C/pitch.page:26 msgid "Preserve Formant" msgstr "Preservar Formante" #. (itstool) path: item/p #: C/pitch.page:28 msgid "Enable formant preservation when pitch shifting." msgstr "Habilita preservação de formantes quando deslocando altura." #. (itstool) path: title/em #: C/pitch.page:34 msgid "Cents" msgstr "Cents" #. (itstool) path: item/p #: C/pitch.page:36 msgid "Number of cents the pitch will increased or decreased." msgstr "Número de cents pelo qual a altura será aumentada ou diminuída." #. (itstool) path: title/em #: C/pitch.page:42 msgid "Semitones" msgstr "Semitons" #. (itstool) path: item/p #: C/pitch.page:44 msgid "Number of semitones the pitch will increased or decreased." msgstr "Número de semitons pelo qual a altura será aumentada ou diminuída." #. (itstool) path: title/em #: C/pitch.page:50 msgid "Octaves" msgstr "Oitavas" #. (itstool) path: item/p #: C/pitch.page:52 msgid "Number of octaves the pitch will increased or decreased." msgstr "Número de oitavas pelo qual a altura será aumentada ou diminuída." #. (itstool) path: title/em #: C/pitch.page:58 msgid "Crispness" msgstr "Clareza" #. (itstool) path: item/p #: C/pitch.page:62 msgid "" "0 - Disable phase resynchronisation at transients, phase lamination and use " "longer processing window." msgstr "" "0 - Desativa a ressincronização de fase em transientes, a laminação de fase " "e usa uma janela de processamento mais longa." #. (itstool) path: item/p #: C/pitch.page:68 msgid "" "1 - Use soft transient detector, disable phase lamination and use longer " "processing window." msgstr "" "1 - Use um detector de transiente suave, desative a laminação de fase e use " "uma janela de processamento mais longa." #. (itstool) path: item/p #: C/pitch.page:74 msgid "2 - Disable phase resynchronisation at transients and phase lamination." msgstr "" "2 - Desabilita a ressincronização de fase nos transientes e a laminação de " "fase." #. (itstool) path: item/p #: C/pitch.page:79 msgid "3 - Disable phase resynchronisation at transients." msgstr "3 - Desabilita a ressincronização de fase nos transientes." #. (itstool) path: page/title #: C/webrtc.page:9 msgid "Webrtc" msgstr "Webrtc" #. (itstool) path: page/p #: C/webrtc.page:10 msgid "" "PulseEffects uses the webrtc from GStreamer. This plugin offers a voice " "enhancement filter based on WebRTC Audio Processing library. This library " "provides a broad variety of enhancement algorithms. This plugin tries to " "enable as many of those as possible. The currently enabled enhancements are " "High Pass Filter, Echo Canceller, Noise Suppression, Automatic Gain Control, " "and some extended filters." msgstr "" "O PulseEffects usa o webrtc do GStreamer. Este plugin oferece um filtro de " "aprimoramento de voz baseado na biblioteca WebRTC Audio Processing. Esta " "biblioteca fornece uma grande variedade de algoritmos de aprimoramento. Este " "plugin tenta habilitar o máximo possível. Os aprimoramentos atualmente " "ativados são o Filtro Passa Alta, o Cancelamento de Eco, a Supressão de " "Ruído, o Controle de Ganho Automático e alguns filtros estendidos." #. (itstool) path: section/title #: C/webrtc.page:19 msgid "Echo Canceller" msgstr "Cancelador de Eco" #. (itstool) path: title/em #: C/webrtc.page:23 msgid "Extended Filter" msgstr "Filtro Estendido" #. (itstool) path: item/p #: C/webrtc.page:25 msgid "Enabled or disables the extended filter." msgstr "Habilita ou desabilita o filtro extendido." #. (itstool) path: title/em #: C/webrtc.page:31 msgid "High Pass Filter" msgstr "Filtro Passa-Alta" #. (itstool) path: item/p #: C/webrtc.page:33 msgid "Enables or disables the high pass filter." msgstr "Habilita ou desabilita o filtro passa altas." #. (itstool) path: title/em #: C/webrtc.page:39 msgid "Delay Agnostic" msgstr "Atraso Agnóstico" #. (itstool) path: item/p #: C/webrtc.page:41 msgid "Enables or disables the delay agnostic mode." msgstr "Habilita ou desabilita o filtro passa altas." #. (itstool) path: title/em #: C/webrtc.page:47 C/webrtc.page:61 msgid "Suppression Level" msgstr "Nível de Supressão" #. (itstool) path: item/p #: C/webrtc.page:49 msgid "" "Controls the aggressiveness of the suppressor. A higher level trades off " "double-talk performance for increased echo suppression." msgstr "" "Controla a agressividade do supressor. Um nível mais alto reduz o desempenho " "de conversa dupla para aumentar a supressão de eco." #. (itstool) path: section/title #: C/webrtc.page:57 msgid "Noise Suppressor" msgstr "Supressor de Ruído" #. (itstool) path: item/p #: C/webrtc.page:63 msgid "" "Controls the aggressiveness of the suppression. Increasing the level will " "reduce the noise level at the expense of a higher speech distortion." msgstr "" "Controla a agressividade da supressão. Aumentar o nível reduzirá o nível de " "ruído em detrimento de uma distorção de fala mais alta." #. (itstool) path: section/title #: C/webrtc.page:71 msgid "Gain Controller" msgstr "Controlador de Ganho" #. (itstool) path: item/p #: C/webrtc.page:77 msgid "Controls the mode of the compression stage." msgstr "Controla o modo do estágio de compressão." #. (itstool) path: item/p #: C/webrtc.page:90 msgid "" "When enabled, the compression stage will hard limit the signal to the target " "level. Otherwise, the signal will be compressed but not limited above the " "target level." msgstr "" "Quando ativado, o estágio de compactação limitará o sinal ao nível alvo. " "Caso contrário, o sinal será comprimido mas não limitado acima do nível alvo." #. (itstool) path: title/em #: C/webrtc.page:98 msgid "Target Level" msgstr "Nível Alvo" #. (itstool) path: item/p #: C/webrtc.page:100 msgid "" "Sets the target peak level of the gain control in dBFS (decibels from " "digital full-scale)." msgstr "" "Define o nível do pico alvo do controle de ganho em dBFS (decibéis de escala " "digital completa)." #. (itstool) path: title/em #: C/webrtc.page:107 msgid "Maximum Gain" msgstr "Ganho Máximo" #. (itstool) path: item/p #: C/webrtc.page:109 msgid "Sets the maximum gain the digital compression stage may apply." msgstr "" "Define o ganho máximo que o estágio de compressão digital pode aplicar." #. (itstool) path: section/title #: C/webrtc.page:116 msgid "Voice Detector" msgstr "Detector de Voz" #. (itstool) path: title/em #: C/webrtc.page:120 msgid "Detection Likelihood" msgstr "Probabilidade de Detecção" #. (itstool) path: item/p #: C/webrtc.page:122 msgid "" "Specifies the likelihood that a frame will be declared to contain voice." msgstr "" "Especifica a probabilidade de que um quadro seja declarado como contendo voz." #. (itstool) path: title/em #: C/webrtc.page:130 msgid "Frame Size" msgstr "Tamanho do Quadro" #. (itstool) path: item/p #: C/webrtc.page:132 msgid "" "Sets the size of the frames in ms on which the VAD will operate. Larger " "frames will improve detection accuracy, but reduce the frequency of updates." msgstr "" "Define o tamanho dos quadros em ms em que o VAD irá operar. Quadros maiores " "melhoram a precisão da detecção mas reduzem a frequência das atualizações." #. (itstool) path: page/title #: C/crystalizer.page:9 msgid "Crystalizer" msgstr "Cristalizador" #. (itstool) path: page/p #: C/crystalizer.page:10 msgid "" "This plugin can be used to add a little of dynamic range to songs that were " "overly compressed" msgstr "" "Este plugin pode ser usado para adicionar um pouco de faixa dinâmica a " "músicas que foram excessivamente compactadas" #. (itstool) path: title/em #: C/crystalizer.page:17 msgid "Aggressive Mode" msgstr "Modo Agressivo" #. (itstool) path: item/p #: C/crystalizer.page:19 msgid "" "When this option is enabled sample amplitude dependent amplification will be " "applied to the signal. Take care to not saturate the next plugin in the " "processing chain." msgstr "" "Quando esta opção é ativada, amplificação dependente da amplitude da amostra " "será aplicada ao sinal. Tome cuidado para não saturar o próximo plugin na " "cadeia de processamento." #. (itstool) path: title/em #: C/crystalizer.page:27 msgid "Intensities" msgstr "Intensidades" #. (itstool) path: item/p #: C/crystalizer.page:29 msgid "" "The higher the value the higher is the difference in magnitude between the " "loudest and the quietest sounds. You can set different intensities for each " "frequency band." msgstr "" "Quanto maior o valor, maior é a diferença de magnitude entre os sons mais " "altos e os mais quietos. Você pode configurar intensidades diferentes para " "cada banda de frequência." #. (itstool) path: item/p #: C/crystalizer.page:39 msgid "" "When active the audio signal passing through this band will not be modified." msgstr "" "Quando ativo, o sinal de áudio que passa por esta banda não será modificado." #. (itstool) path: item/p #: C/crystalizer.page:47 msgid "Silence the band." msgstr "Silencia a banda." #. (itstool) path: page/title #: C/convolver.page:9 msgid "Convolver" msgstr "Convolver" #. (itstool) path: page/p #: C/convolver.page:10 msgid "" "A convolver creates a simulation of an audio environment. It is based on the " "mathematical convolution operation, and uses a pre-recorded audio sample of " "the impulse response of the space being modeled." msgstr "" "Um convolver cria uma simulação de um ambiente de áudio. Ele é baseado na " "operação de convolução matemática e usa uma amostra de áudio pré-gravada da " "resposta de impulso do espaço que está sendo modelado." #. (itstool) path: title/em #: C/convolver.page:18 msgid "Import Impulse" msgstr "Importar Impulso" #. (itstool) path: item/p #: C/convolver.page:20 msgid "" "Import an impulse response file to PulseEffects configuration directory." msgstr "" "Importe um arquivo de resposta de impulso para o diretório de configuração " "do PulseEffects." #. (itstool) path: title/em #: C/convolver.page:26 msgid "Stereo Width" msgstr "Largura do Stereo" #. (itstool) path: item/p #: C/convolver.page:28 msgid "Modify the impulse response stereo image width." msgstr "Modifica a imagem stereo da resposta de impulso." #. (itstool) path: title/em #. (itstool) path: page/title #: C/convolver.page:34 C/spectrum.page:9 msgid "Spectrum" msgstr "Espectro" #. (itstool) path: item/p #: C/convolver.page:36 msgid "Visualize the frequency spectrum of the selected channel." msgstr "Visualize o espectro de frequência do canal selecionado." #. (itstool) path: page/title #: C/settingsmenu.page:10 msgid "Settings Menu" msgstr "Menu de Configurações" #. (itstool) path: page/title #: C/general.page:9 msgid "General" msgstr "Geral" #. (itstool) path: title/em #: C/general.page:13 msgid "Start Service at Login" msgstr "Inicializar Serviço no Login" #. (itstool) path: item/p #: C/general.page:15 msgid "" "Start PulseEffects as a service in the next login. This is done by creating " "an autostart file at ~/.config/autostart" msgstr "" "Inicie o PulseEffects como um serviço no próximo login. Isso é feito criando " "um arquivo de autoinicialização em ~/.config/" "autostart" #. (itstool) path: title/em #: C/general.page:23 msgid "Process All Outputs" msgstr "Processar Todas as Saídas" #. (itstool) path: item/p #: C/general.page:25 msgid "" "Apply effects to the output of all audio applications. This will " "automatically switch on the per application switch that can be seen in the " "Applications entry." msgstr "" "Aplicar efeitos na saída de todos os aplicativos de áudio. Isso ativará " "automaticamente o interruptor de cada aplicativo que pode ser vista na " "entrada Aplicativos." #. (itstool) path: title/em #: C/general.page:32 msgid "Process All Inputs" msgstr "Processar Todas as Entradas" #. (itstool) path: item/p #: C/general.page:34 msgid "" "Apply effects to the input(microphone) of all audio applications. This will " "automatically switch on the per application switch that can be seen in the " "Applications entry." msgstr "" "Aplicar efeitos na entrada de todos os aplicativos de áudio. Isso ativará " "automaticamente o interruptor de cada aplicativo que pode ser vista na " "entrada Aplicativos." #. (itstool) path: title/em #: C/general.page:42 msgid "Use Dark Theme" msgstr "Usar Tema Escuro" #. (itstool) path: item/p #: C/general.page:44 msgid "Use the dark version of the GTK theme." msgstr "Usar a variante escura do tema GTK." #. (itstool) path: title/em #: C/general.page:50 C/autogain.page:16 msgid "Reset" msgstr "Resetar" #. (itstool) path: item/p #: C/general.page:52 msgid "" "Reset all parameters to their default values. This will reset the plugins " "too." msgstr "" "Redefine todos os parâmetros para seus valores padrões. Isto redefinirá os " "plugins também." #. (itstool) path: title/em #: C/general.page:58 msgid "Priority type" msgstr "Tipo de Prioridade" #. (itstool) path: item/p #: C/general.page:60 msgid "" "Choose between real time mode, niceness or none. This parameter allows to " "choose a higher priority for the threads that process audio." msgstr "" "Escolha entre o modo de tempo real, gentileza ou nenhum. Esse parâmetro " "permite escolher uma prioridade mais alta para os segmentos que processam " "áudio." #. (itstool) path: title/em #: C/general.page:67 msgid "Niceness" msgstr "Gentileza" #. (itstool) path: item/p #: C/general.page:69 msgid "Niceness value." msgstr "Valor da gentileza." #. (itstool) path: title/em #: C/general.page:75 msgid "Priority" msgstr "Prioridade" #. (itstool) path: item/p #: C/general.page:77 msgid "Real time priority." msgstr "Prioridade em tempo real." #. (itstool) path: title/em #: C/spectrum.page:13 msgid "Show" msgstr "Mostrar" #. (itstool) path: item/p #: C/spectrum.page:15 msgid "Hide or show the spectrum." msgstr "Esconder ou mostrar o espectro." #. (itstool) path: title/em #: C/spectrum.page:21 msgid "Points" msgstr "Pontos" #. (itstool) path: item/p #: C/spectrum.page:23 msgid "Number of points displayed." msgstr "Número de pontos exibidos." #. (itstool) path: title/em #: C/spectrum.page:29 msgid "Height" msgstr "Altura" #. (itstool) path: item/p #: C/spectrum.page:31 msgid "Spectrum height." msgstr "Altura do espectro." #. (itstool) path: title/em #: C/spectrum.page:37 msgid "Scale" msgstr "Escala" #. (itstool) path: item/p #: C/spectrum.page:39 msgid "Bar height scaling factor." msgstr "Fator de escala da altura da barra." #. (itstool) path: title/em #: C/spectrum.page:45 msgid "Exponent" msgstr "Expoente" #. (itstool) path: item/p #: C/spectrum.page:47 msgid "Scaling factor exponent." msgstr "Expoente do fator de escala." #. (itstool) path: title/em #: C/spectrum.page:53 msgid "Sampling" msgstr "Amostragem" #. (itstool) path: item/p #: C/spectrum.page:55 msgid "Spectrum update frequency." msgstr "Frequência de atualização do espectro." #. (itstool) path: title/em #: C/spectrum.page:61 msgid "Line Width" msgstr "Largura da Linha" #. (itstool) path: item/p #: C/spectrum.page:63 msgid "Bar line width." msgstr "Largura da linha da barra." #. (itstool) path: title/em #: C/spectrum.page:69 msgid "Fill" msgstr "Preencher" #. (itstool) path: item/p #: C/spectrum.page:71 msgid "Draw filled bars." msgstr "Desenhar barras preenchidas." #. (itstool) path: title/em #: C/spectrum.page:77 msgid "Border" msgstr "Borda" #. (itstool) path: item/p #: C/spectrum.page:79 msgid "Show bar border." msgstr "Mostrar borda da barra." #. (itstool) path: title/em #: C/spectrum.page:85 msgid "Use Custom Color" msgstr "Usar Cor Customizada" #. (itstool) path: item/p #: C/spectrum.page:87 msgid "Use a user defined color or the GTK theme color." msgstr "Utilize uma cor definida pelo usuário ou a cor do tema GTK." #. (itstool) path: title/em #: C/spectrum.page:93 msgid "Spectrum Color" msgstr "Cor do Espectro" #. (itstool) path: item/p #: C/spectrum.page:95 msgid "User defined color." msgstr "Cor definida pelo usuário." #. (itstool) path: page/title #: C/pulseaudio.page:9 msgid "Pulseaudio" msgstr "Pulseaudio" #. (itstool) path: page/p #: C/pulseaudio.page:10 msgid "" "PulseEffects has two GStreamer pipelines. One that applies effects for " "applications output and other that applies effects for microphone. Here the " "user can tweak a few advanced parameters for both pipelines." msgstr "" "O PulseEffects possui duas pipelines do GStreamer. Uma que aplica efeitos " "para a saída de aplicativos e outra que aplica efeitos para o microfone. " "Aqui o usuário pode ajustar alguns parâmetros avançados para ambas as " "pipelines." #. (itstool) path: title/em #: C/pulseaudio.page:18 msgid "Use Default" msgstr "Usar Padrão" #. (itstool) path: item/p #: C/pulseaudio.page:20 msgid "Use default input or output device." msgstr "Usar dispositivo de entrada ou saída padrão." #. (itstool) path: title/em #: C/pulseaudio.page:26 msgid "Buffer" msgstr "Buffer" #. (itstool) path: item/p #: C/pulseaudio.page:28 msgid "Pulsesrc plugin buffer size. It affects latency" msgstr "Tamanho do buffer do plugin pulsesrc. Ele afeta a latência" #. (itstool) path: title/em #: C/pulseaudio.page:34 msgid "Latency" msgstr "Latência" #. (itstool) path: item/p #: C/pulseaudio.page:36 msgid "Pulsesrc plugin latency value." msgstr "Valor de latência do plugin pulsesrc." #. (itstool) path: title/em #: C/pulseaudio.page:42 msgid "Block Size" msgstr "Tamanho do Bloco" #. (itstool) path: item/p #: C/pulseaudio.page:44 msgid "" "This controls the size of the audio buffer. Higher values increase latency " "but decrease cpu usage of a few plugins." msgstr "" "Isto controla o tamanho do buffer de áudio. Valores mais altos aumentam a " "latência mas reduzem o uso de cpu de alguns plugins." #. (itstool) path: page/title #: C/testsignals.page:9 msgid "Test Signals" msgstr "Sinais de Teste" #. (itstool) path: page/p #: C/testsignals.page:10 msgid "" "These signals can be used to test the frequency response of your speakers." msgstr "" "Estes sinais podem ser usados para testar a resposta em frequência dos seus " "auto-falantes." #. (itstool) path: page/title #: C/calibrationmic.page:9 msgid "Microphone" msgstr "Microfone" #. (itstool) path: page/p #: C/calibrationmic.page:10 msgid "" "If you have a microphone with reasonably flat response you can use it " "together with a pink noise test signal to estimate how flat is your audio " "setup frequency response." msgstr "" "Se você tiver um microfone com resposta razoavelmente plana, poderá usá-lo " "junto com um sinal de teste do tipo ruído rosa para estimar o quão plana é a " "resposta em frequência da sua configuração de áudio." #. (itstool) path: title/em #: C/calibrationmic.page:17 msgid "Window" msgstr "Janela" #. (itstool) path: item/p #: C/calibrationmic.page:19 msgid "" "The amount of time the microphone signal will be measured. Higher values " "will reduce noises." msgstr "" "A quantidade de tempo pelo qual o microfone será medido. Valores mais altos " "reduzirão ruído." #. (itstool) path: title/em #: C/calibrationmic.page:26 msgid "Measure Noise" msgstr "Medir Ruído" #. (itstool) path: item/p #: C/calibrationmic.page:28 msgid "" "Saves the last measurement to be used as background noise. Usually you would " "use this before turning on the pink noise." msgstr "" "Salva a última medição para ser usada como ruído de fundo. Normalmente você " "usaria isso antes de ligar o ruído rosa." #. (itstool) path: title/em #: C/calibrationmic.page:35 msgid "Subtract Noise" msgstr "Subtrair Ruído" #. (itstool) path: item/p #: C/calibrationmic.page:37 msgid "Subtract the stored background noise from the measurement." msgstr "Subtrai o ruído de fundo armazenado do resultado da medida." #. (itstool) path: page/title #: C/enableapp.page:10 msgid "Enable or Disable an Application" msgstr "Habilitar ou Desabilitar uma Aplicação" #. (itstool) path: page/p #: C/enableapp.page:12 msgid "" "You can choose which applications have effects applied through the switch " "next to its name. If you always want to apply effects to all applications " "take a look at Enable All Applications." msgstr "" "Você pode escolher quais aplicativos têm efeitos aplicados por meio do " "interruptor ao lado de seu nome. Se você sempre quiser aplicar efeitos a " "todos os aplicativos, dê uma olhada em Enable All " "Applications." #. (itstool) path: page/title #: C/effectsorder.page:10 msgid "Changing Effects Order" msgstr "Mudando a Ordem dos Efeitos" #. (itstool) path: page/p #: C/effectsorder.page:12 msgid "" "You can change the plugins order in the effects chain. Just click on the up " "and down arrows next to the plugin name. The first plugin from top to bottom " "is the first to receive the audio signal." msgstr "" "Você pode alterar a ordem dos plugins na cadeia de efeitos. Basta clicar nas " "setas para cima e para baixo ao lado do nome do plugin. O primeiro plugin de " "cima para baixo é o primeiro a receber o sinal de áudio." #. (itstool) path: page/title #: C/userpresets.page:10 msgid "Creating and Importing User Presets" msgstr "Criando e Importando Predefinições do Usuário" #. (itstool) path: page/p #: C/userpresets.page:12 msgid "" "You can save your own presets. Just add write a name and click on the add " "button. Presets can be imported clicking on the button to the left." msgstr "" "Você pode salvar suas próprias predefinições. Basta escrever um nome e " "clicar no botão adicionar. As predefinições podem ser importadas clicando no " "botão à esquerda." #. (itstool) path: page/p #: C/userpresets.page:16 msgid "" "When you save a preset the current configuration of all plugins is saved to " "its file. This means you can have presets that combine the effects of " "different plugins." msgstr "" "Quando você salva uma predefinição, a configuração atual de todos os plugins " "é salva em seu arquivo. Isso significa que você pode ter predefinições que " "combinam os efeitos de diferentes plugins." #. (itstool) path: page/p #: C/userpresets.page:21 msgid "" "You can also make a preset autoload when an input or output device is added " "to the system. Just click on the button with curved arrows while the desired " "device is selected as the system default device." msgstr "" "Você também pode fazer uma predefinição carregar automaticamente quando um " "dispositivo de entrada ou saída é adicionado ao sistema. Basta clicar no " "botão com setas curvas enquanto o dispositivo desejado estiver selecionado " "como o dispositivo padrão do sistema." #. (itstool) path: page/title #: C/advancedinfo.page:10 msgid "Advanced Information" msgstr "Informações Avançadas" #. (itstool) path: page/p #: C/advancedinfo.page:12 msgid "" "PulseEffects audio processing is composed by 3 main stages. Each of them " "needs a specific audio format and sampling rate. This information is show in " "the headerbar subtitle." msgstr "" "O processamento de áudio do PulseEffects é composto por 3 etapas principais. " "Cada uma delas precisa de um formato de áudio e taxa de amostragem " "específicos. Esta informação é mostrada na legenda da barra de cabeçalho." #. (itstool) path: page/p #: C/advancedinfo.page:17 msgid "" "Another important information is the latency introduced by the audio " "processing. This the the last information shown. The displayed value is in " "milliseconds." msgstr "" "Outra informação importante é a latência introduzida pelo processamento de " "áudio. Esta é a última informação mostrada. O valor exibido está em " "milissegundos." #. (itstool) path: page/title #: C/saturated.page:10 msgid "Saturation Warning" msgstr "Aviso de Saturação" #. (itstool) path: page/p #: C/saturated.page:12 #, fuzzy msgid "" "If the audio signal coming out from the pipeline is too high very unpleasent " "noises will be produced. In case this happens the warning in the image above " "is shown so that the user can reduce the audio level using the limiter or " "the maximizer." msgstr "" "Se o sinal de áudio que chega à entrada do plugin estiver muito alto, ruídos " "muito desagradáveis serão produzidos. Caso isso aconteça, o aviso na imagem " "acima é mostrado para que o usuário possa reduzir o nível de áudio." #. (itstool) path: page/title #: C/autogain.page:5 msgid "Auto Gain" msgstr "Ganho Automático" #. (itstool) path: page/p #: C/autogain.page:6 msgid "" "PulseEffects auto gain is based on the library libebur128. It changes the " "audio volume to a perceived loudness level that can be tweaked by the user." msgstr "" "O ganho automático de PulseEffects é baseado na biblioteca libebur128. Ele " "altera o volume do áudio para um nível de intensidade percebido que pode ser " "ajustado pelo usuário." #. (itstool) path: title/em #: C/autogain.page:10 msgid "Target" msgstr "Alvo" #. (itstool) path: item/p #: C/autogain.page:12 msgid "Loudness level." msgstr "Nível de Sonoridade." #. (itstool) path: item/p #: C/autogain.page:18 msgid "Resets the auto gain history." msgstr "Redefinir histórico do ganho automático." #. (itstool) path: title/em #: C/autogain.page:22 msgid "Detect Silence" msgstr "Detectar Silêncio" #. (itstool) path: item/p #: C/autogain.page:24 msgid "" "When the momentary loudness is below the relative we assume the audio " "material is passing through a brief moment of silence and no changes to the " "output gain are applied. If you do not want this behavior disable the " "silence detection." msgstr "" "Quando o volume momentâneo está abaixo do relativo, assumimos que o material " "de áudio está passando por um breve momento de silêncio e nenhuma alteração " "é aplicada ao ganho de saída. Se você não deseja esse comportamento, " "desative a detecção de silêncio." #. (itstool) path: title/em #: C/autogain.page:28 msgid "Use Geometric Mean" msgstr "" #. (itstool) path: item/p #: C/autogain.page:30 msgid "" "The estimated loudness is obtained from the geometric mean of the momentary, " "short-term and integrated loudness. When this option is disabled a weighted " "average is used." msgstr "" #. (itstool) path: title/em #: C/autogain.page:34 msgid "Momentary" msgstr "Momentâneo" #. (itstool) path: item/p #: C/autogain.page:36 msgid "" "Controls how much the momentary term will influence the loudness level " "estimation." msgstr "" "Controla o quanto a estimativa de sonoridade será influenciada pelo termo " "momentâneo." #. (itstool) path: title/em #: C/autogain.page:40 msgid "Short Term" msgstr "Curto Prazo" #. (itstool) path: item/p #: C/autogain.page:42 msgid "" "Controls how much the short term measure will influence the loudness level " "estimation." msgstr "" "Controla o quanto a estimativa de sonoridade será influenciada pelo termo de " "curto prazo." #. (itstool) path: title/em #: C/autogain.page:46 msgid "Integrated" msgstr "Integrada" #. (itstool) path: item/p #: C/autogain.page:48 msgid "" "Controls how much the integrated term will influence the loudness level " "estimation." msgstr "" "Controla o quanto a estimativa de sonoridade será influenciada pelo termo " "integrado." #. (itstool) path: title/em #: C/autogain.page:52 msgid "Relative" msgstr "Relativo" #. (itstool) path: item/p #: C/autogain.page:54 msgid "" "Relative threshold. It is used to detect silence. Whenever the momentary " "term is below this threshold modifications to the output gain will be " "disabled." msgstr "" "Limiar relativo. É usado para detectar o silêncio. Sempre que o termo " "momentâneo estiver abaixo deste limite as modificações no ganho de saída " "serão desativadas." #. (itstool) path: title/em #: C/autogain.page:58 msgid "Loudness" msgstr "Sonoridade" #. (itstool) path: item/p #: C/autogain.page:60 msgid "" "Estimated input loudness. The difference between its value and the target " "loudness determines the output gain." msgstr "" "Sonoridade de entrada estimada. A diferença entre seu valor e a sonoridade " "alvo determina o ganho de saída." #. (itstool) path: title/em #: C/autogain.page:64 msgid "Range" msgstr "Alcance" #. (itstool) path: item/p #: C/autogain.page:66 msgid "Loudness range. Indicates how large is the material dynamic range." msgstr "" "Intervalo de sonoridade. Indica quão grande é a faixa dinâmica do material." #. (itstool) path: title/em #: C/autogain.page:70 msgid "Gain" msgstr "Ganho" #. (itstool) path: item/p #: C/autogain.page:72 msgid "" "Output gain value. The input signal will be multiplied by this correction " "gain to bring its loudness to the target value." msgstr "" "Valor do ganho de saída. O sinal de entrada será multiplicado por este ganho " "de correção para trazer sua sonoridade para o valor alvo." #. (itstool) path: page/title #: C/blocklist.page:9 msgid "Applications Blocklist" msgstr "Lista Negra de Aplicativos" #. (itstool) path: page/p #: C/blocklist.page:11 msgid "" "In the settings menu there is an option that allows the user to apply " "effects to all applications without the need to switch each one on " "individually. But there are cases where the user wants a specific " "application to be excluded from the \"Enable All\" functionality. This can " "be done by using a blocklist. Just add the application name exactly as it is " "shown in the \"Applications\" entry." msgstr "" "No menu de configurações há uma opção que permite ao usuário aplicar efeitos " "a todos os aplicativos sem a necessidade de habilitar cada um " "individualmente. Mas há casos em que o usuário deseja que um aplicativo " "específico seja excluído da funcionalidade \"Ativar tudo\". Isso pode ser " "feito usando uma lista negra. Basta adicionar o nome do aplicativo " "exatamente como é mostrado na entrada \"Aplicativos\"." #. (itstool) path: page/title #: C/guide_1.page:5 msgid "Enhancing your internal notebook speakers without using an equalizer" msgstr "" #. (itstool) path: page/p #: C/guide_1.page:6 msgid "" "This tutorial was written by Markus Schmidt schmidt@boomshop.net on November " "2019" msgstr "" #. (itstool) path: section/title #: C/guide_1.page:8 #, fuzzy msgid "Introduction" msgstr "Redução" #. (itstool) path: section/p #: C/guide_1.page:9 msgid "" "If you're a notebook user relying on your internal speakers and you - like " "me - own a model suffering from a tinny, clanging sound, PulseEffects is " "your salvation!" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:10 msgid "" "Commercial operating systems on laptops these days often come with software " "like Dolby Theatre and the like to enhance the sound of lousy notebook " "speakers to something more substantial and acoustically rich. Under Linux, " "PulseEffects will do the job for you, although, compared to the commercial " "pendants, there's some manual tweaking required until the community sets up " "a database with presets for common machines." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:11 msgid "" "This DSP software comes with everything needed to fatten the sound of your " "laptop speakers with a flexibility never found in other operating systems. " "Unfortunately the drawback of this flexibility is that average users will " "get lost in the sheer amount of possibilities. That's why this tutorial was " "created." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:14 #, fuzzy msgid "Why no equalizer?" msgstr "Equalizador" #. (itstool) path: section/p #: C/guide_1.page:15 msgid "" "We will attack the problems one by one utilizing specific signal processors, " "deliberately renouncing equalizers. Equalizers are not of any help here but " "tend to make these kinds of problems even worse. This is because of the " "nature of this processor, but also because users tend to add to the signal " "(additive equalization) instead of trying to eliminate problems by removing " "from the signal (subtractive equalization) like it is usually done in the " "professional world." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:16 msgid "" "But even subtractive equalization wouldn't be of any help since the " "amplifiers and speakers in a notebook are not loud enough by default, so " "trying to eliminate problems this way leads to a quiet and still castrated " "sound. And raising the volume afterwards generally leads to distorted sounds " "and other problems because the system was at its limits beforehand and just " "fiddling with the frequency response doesn't help at all." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:19 #, fuzzy msgid "Frequency Range" msgstr "Frequência" #. (itstool) path: section/p #: C/guide_1.page:20 msgid "" "We'll have to talk about the frequency range. For a better understanding and " "because of the way we will solve our problems I'll break it down to five " "ranges which are:" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:23 msgid "" "Sub More or less vibrations up to something an ear " "can barely hear. Everything from 10Hz to ~40Hz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:29 msgid "" "Low or Bass Where the whole fundament of a signal " "is located. Low end of bass drums, bass synthesizers and bass guitars are " "found here. Movies occupy this range with explosions, rumbling waters, " "thunder, heavy gun fire and the like. Absolutely missing on notebooks and " "tablets. Technically speaking its ~60Hz - ~200Hz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:35 msgid "" "Low-Mid Hit a 0.5m³ cardboard box and you know " "what low-mids are. The \"punch\" of a sound is often located here, also the " "juice of snare drums and electric guitars. In Movies, roaring engines and " "shotguns are found in this range. We're talking about ~250Hz - ~750Hz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:41 msgid "" "High-Mid This is the ears most important and " "sensitive range. The main information of any kind of signal is located here. " "Human voice, picking of guitars, attack of drums, the colour of a " "synthesizer - everything carrying the main information of sound. Something " "around ~1kHz - ~4kHz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:47 msgid "" "Highs The air, the breathe, the sizzling, the " "splashing - this is the range of brightness. Everything around and above " "~5kHz." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:55 #, fuzzy msgid "Test Signal" msgstr "Sinais de Teste" #. (itstool) path: section/p #: C/guide_1.page:56 msgid "" "You definitely need a good signal for this job. I decided to use Seeed: <_:" "link-1/>" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:60 msgid "" "It is quite snappy, has lots of well defined substance, clear and bright " "highs, present vocals, comes with a very balanced frequency response and is " "a great mix in combination with great mastering. Afterwards I tested against " "various movies and other stuff like talks, classical music and the like and " "was convinced of the result. Well produced, modern pop music (avoid the 80's " "and 90's stuff) is always a good test signal for this kind of job. Movies " "are way too dynamic, so is classical music, and they normally don't cover a " "steady, broad frequency range like this kind of signal." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:61 msgid "" "We will not be able to make the notebook bounce. What is the goal here is " "that everything contained in the mix gets audible in a well balanced manner " "and to gain a present, upfront, broad and hopefully rich sound." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:62 msgid "" "I assume you don't utilize a player or source which is able to produce " "levels above 0dB. I also assume you don't use e.g. video players volume bar " "to lower the volume of your source. This approach works well for defined, " "mixed and mastered sound sources like music, movies, tv and the like, played " "back at 100% volume in the player. Set the volume desired on your hardware " "via PulseAudio after the processing happened." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:69 msgid "Problems" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:70 msgid "Let's investigate the biggest problems first:" msgstr "" #. (itstool) path: item/title #: C/guide_1.page:73 #, fuzzy msgid "Bass" msgstr "Quantidade" #. (itstool) path: item/p #: C/guide_1.page:76 msgid "" "The most obvious problem of notebook speakers is the tinny, pressure-free " "sound not reproducing any kind of low-end. This is because of the size of " "the membranes and the inadequate housing. Fortunately software can work " "around this issue at least a bit." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:79 #, fuzzy msgid "Highs" msgstr "Quantidade" #. (itstool) path: item/p #: C/guide_1.page:82 msgid "" "Often the highs are quite bitchy, not representing the \"air\" but torturing " "the listener with searing sibliants. In order to fix that we need to equal " "this frequency range out." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:85 #, fuzzy msgid "Overall Fequency Response" msgstr "Harmônicos" #. (itstool) path: item/p #: C/guide_1.page:88 msgid "" "Normally the relation between the different frequency ranges low, low-mid, " "high-mid and height is quite out-of-bounds. This needs correction, although " "I promised a tutorial without EQ." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:91 #, fuzzy msgid "Distortion" msgstr "Escutar" #. (itstool) path: item/p #: C/guide_1.page:94 msgid "" "Because of the thin and neutered sound users tend to raise the volume or " "even add an equalizer to raise missing frequency ranges. This normally leads " "to digital distortions because every signal above 0 dB at the sound card DAC " "will go from occasional crackling up to a totally distorted sound." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:97 #, fuzzy msgid "Dynamic range" msgstr "Harmônicos" #. (itstool) path: item/p #: C/guide_1.page:100 msgid "" "With movies, but music aswell, those tiny transducers tend to wiping away " "low-level sounds but going ballistic on loud and bassy sounds. For this " "reason it's recommended to reduce the overall dynamic range so you don't " "need to press your ear onto the palm rest when the lady in the movie starts " "whispering." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:103 #, fuzzy msgid "Stereo Image" msgstr "Escopo" #. (itstool) path: item/p #: C/guide_1.page:106 msgid "" "The stereo base is quite narrow because of the positioning of the speakers " "inside the laptop which gives an impression of almost mono signals." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:111 msgid "Solutions" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:112 msgid "" "Let's start fixing the sound. The result will not come even close to " "something more substantial but at least we'll be able to get the best out of " "the physical boundaries of these transducers." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:113 msgid "" "Every parameter we are gonna set absolutely depends on your situation and " "the hardware you've got. Every notebook has its own frequency response and " "dynamic range so there's no panacea. But the audio signal processors, their " "order and their missions are well defined and reproducable." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:114 msgid "" "Don't care about clipping in the plugins level meters. The signal will be " "processed as 32bit numbers internally (check title bar) which gives a non-" "clipping overhead of hundrets of decibels. The only thing that shouldn't " "happen is that there's clipping when the signal hits the sound card " "DAC(Digital-to-Analog Converter), which would result in digital distortion." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:115 msgid "Let's head over to the signal chain:" msgstr "" #. (itstool) path: item/title #: C/guide_1.page:118 #, fuzzy msgid "Limiter" msgstr "Escutar" #. (itstool) path: item/p #: C/guide_1.page:121 msgid "" "We will start with the last signal processor being " "used. As I explained earlier, as soon as the signal hits the sound card DAC " "it has to be below 0dB, otherwise it will result in a distorted, messy sound." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:126 msgid "" "Drag the Limiter to the top of the list of processors and enable it. You " "will not hear any difference, which is what we expect. It will hit in as " "soon as we start messig up the signal with all the other processors. Set " "lookahead to 2ms, release to 8ms and oversampling to x4." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:127 msgid "" "A limiter monitors the signal in (nearly) realtime and detects peaks over a " "certain threshold, in our case 0 dB. As soon as a peak is detected, it " "starts lowering the volume constantly (within the lookahead) until the peak " "will be below threshold. Afterwards it raises the volume again (within " "release time frame) until it is back to normal. This way we avoid signals " "above threshold hitting the DAC without being noticed too much. If one tries " "to overdo limiting, it will definitely result in distortion and other side " "effects, but in our case it's just a fire-and-forget troubleshooter so we " "can concentrate on the results without trying to mess with levelling over " "and over again." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:128 msgid "" "Don't overdo things! This might render your overall sound eperience worse " "than before." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:129 msgid "Let's look at the real processing now." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:136 #, fuzzy msgid "Filter" msgstr "Escutar" #. (itstool) path: item/p #: C/guide_1.page:139 msgid "" "First of all we should remove frequencies that cannot be heard because even " "if the speakers are unable to reproduce them a lot of energy will be wasted " "in the process. This will lead to problems like not being able to use the " "full dynamic range and the introduction of digital and physical distortions." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:140 msgid "" "Drag the Filter to the top of the list (above the Limiter) and enable it. " "Set the type to 36 dB High Pass (this will cutt off everything below a " "frequency and will let everything above it pass) and the frequency to 50 Hz " "(which is definitely below your laptop's speakers abilities). Continuously " "raise the frequency by 10 Hz until you start hearing a change in the lower " "end of the audible signal, which should be around 130-160Hz. Subtract 10% " "(or 15 Hz) and set it as the Filters frequency. On my machine it is 145 Hz, " "since the signal started being affected at 160Hz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:141 msgid "" "What happened is that we removed everything the speakers can't reproduce at " "all, leaving a little bit of signal just below this frequency, which is " "quite important for the next step." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:144 #, fuzzy msgid "Bass Enhancer" msgstr "Escopo" #. (itstool) path: item/p #: C/guide_1.page:147 msgid "Let's grow some testicles to the signal." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:148 msgid "" "Drag the Bass Enhancer to the second position after the Filter plugin and " "enable it. Set the floor to 10Hz and forget about it (we already removed " "everything below the Filter plugin cuttoff frequency). Raise Harmony to 10 " "and start with a range of 200Hz. Now start raising the amount continuously " "until the bass takes over the whole energy, which is definitely too much. " "For me it works best at +24dB. Which is huge but my ThinkPad P1 has the " "worst speakers I've ever heard in a 2.8k € notebook." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:149 msgid "" "What happens is that the Bass Enhancer adds frequencies to the signal which " "weren't there before. While an equalizer only raises stuff which is already " "in the signal, a bass enhancer improves the lower end by adding distortion " "to a specific frequency range. This kind of distortion adds so called " "harmonics to the signal which is a multiple of existing frequencies. You can " "choose seamlessly between 2nd and 3rd harmonics, which means that a " "frequency of 100Hz produces a new signal of " "200Hz/300Hz/400Hz/600Hz/800Hz/900Hz/... at varying (due to the harmonics " "setting) and constantly decreasing levels. This means we're effectively " "raising the lower range into something better reproducable. It doesn't add " "or raise the real fundament (so your trousers " "won't start to flutter), but makes more audible signals that have been " "swallowed by the hardware before." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:154 msgid "" "Your output meters will definitely start to flash red but you shouldn't care " "about it since it doesn't result in digital distortion of the overall signal " "as explained earlier." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:155 msgid "" "Later on, in order to refine the result, you should play with the amount " "parameter to define the level of bass and maybe with the range to define the " "upper end of our additional harmonics." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:158 #, fuzzy msgid "Multiband Compressor" msgstr "Quantidade" #. (itstool) path: item/p #: C/guide_1.page:161 msgid "" "This is the most demanding step in the chain. Even professionals have great " "respect for this signal processor since it's absolutely able to destroy your " "signals big time. But let's be honest, we're consumers and no one will hear " "the difference between 100 ms and 200 ms attack time - even on notebook and " "tablet speakers. This means we can work with some reliable, well established " "defaults for the timing and frequency splits." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:162 msgid "" "The Multiband Compressor will solve several things for us. It will cut " "outstanding and annoying frequencies, lower the overall dynamic range and " "figure our overall frequency reponse. The latter is what most people try to " "achieve with an equalizer. Thing is equalizers aren't dynamic which will add " "to the problems instead of solving anything." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:163 msgid "" "Drag the Multiband Compressor to the third position, after the Bass Enhancer " "and before the Limiter." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:164 msgid "" "Since the Bass Enhancer really raised the energy and level of the signal, " "lower the Multiband Compressor input gain to -6 dB as a starting point. " "Let's set the split frequencies for the different bands to:" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:167 msgid "250 Hz" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:170 msgid "1250 Hz" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:173 msgid "5000 Hz" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:176 msgid "Afterwards let's set some defaults:" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:179 msgid "Low Band" msgstr "Banda BAixa" #. (itstool) path: item/p #: C/guide_1.page:182 C/guide_1.page:205 #, fuzzy msgid "Attack: 150 ms" msgstr "Ataque" #. (itstool) path: item/p #: C/guide_1.page:185 #, fuzzy msgid "Release: 300 ms" msgstr "Liberação" #. (itstool) path: item/p #: C/guide_1.page:188 #, fuzzy msgid "Threshold: -16 dB" msgstr "Limiar" #. (itstool) path: item/p #: C/guide_1.page:191 #, fuzzy msgid "Ratio: 5:1" msgstr "Razão" #. (itstool) path: item/p #: C/guide_1.page:194 msgid "Knee: 12 dB" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:197 C/guide_1.page:220 C/guide_1.page:243 C/guide_1.page:266 #, fuzzy msgid "Makeup: 4 dB" msgstr "Ganho de Saída" #. (itstool) path: item/p #: C/guide_1.page:202 #, fuzzy msgid "Low Mid Band" msgstr "Banda Média" #. (itstool) path: item/p #: C/guide_1.page:208 #, fuzzy msgid "Release: 200 ms" msgstr "Liberação" #. (itstool) path: item/p #: C/guide_1.page:211 C/guide_1.page:234 C/guide_1.page:257 #, fuzzy msgid "Threshold: -24 dB" msgstr "Limiar" #. (itstool) path: item/p #: C/guide_1.page:214 C/guide_1.page:237 #, fuzzy msgid "Ratio: 3:1" msgstr "Razão" #. (itstool) path: item/p #: C/guide_1.page:217 C/guide_1.page:240 C/guide_1.page:263 msgid "Knee: 9 dB" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:225 #, fuzzy msgid "High Mid Band" msgstr "Banda Alta" #. (itstool) path: item/p #: C/guide_1.page:228 #, fuzzy msgid "Attack: 100 ms" msgstr "Ataque" #. (itstool) path: item/p #: C/guide_1.page:231 #, fuzzy msgid "Release: 150 ms" msgstr "Liberação" #. (itstool) path: item/p #: C/guide_1.page:248 msgid "High Band" msgstr "Banda Alta" #. (itstool) path: item/p #: C/guide_1.page:251 #, fuzzy msgid "Attack: 80 ms" msgstr "Ataque" #. (itstool) path: item/p #: C/guide_1.page:254 #, fuzzy msgid "Release: 120 ms" msgstr "Liberação" #. (itstool) path: item/p #: C/guide_1.page:260 #, fuzzy msgid "Ratio: 4:1" msgstr "Razão" #. (itstool) path: item/p #: C/guide_1.page:271 msgid "These values should be a good starting point." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:272 msgid "" "A compressor lowers signal levels which appear above a certain threshold. It " "adds a simple multiplication to the signal defined by the ratio. If the " "threshold is set to -24 dB and ratio to 2:1, a signal of -12 dB would in " "fact become -18 dB. In this example one can then raise the makeup parameter " "to 6dB, since this is what went \"lost\". So first of all we're rendering " "loud signals quieter to then raise the overall volume, which leads to less " "dynamic range with quiet parts becoming more audible." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:273 msgid "" "The timing settings affect the \"speed\" of the compression. Attack means " "that a signal needs to go over threshold for this amount of time until the " "compressor reaches the full (negative) amplification. Release defines the " "amount of time the signal has to stay below threshold until the " "amplification is back to 1 again." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:274 msgid "" "A multi-band compressor splits the signal in various frequency ranges to " "work on them exclusively with dedicated compression stages. This means that " "a very loud bass drum would not affect a crash cymbal, since they are " "clearly located in different bands." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:275 msgid "Start playing around with these parameters:" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:278 msgid "" "Makeup This is probably most important setting in " "this concept. Makeup raises the signal after compression stage which means " "that it directly influences the perceived volume of every single band. Or in " "other words: this is your equalizer :) Raise " "makeup of single bands to make them louder or quieter. I ended up with Low/" "Low-Mid/High-Mid/High: 4 dB / 3 dB / 6 dB / 6 dB on my ThinkPad P1." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:286 msgid "" "Input Level Set it to -6 dB by default, I ended up " "at -3dB. What happens is that a higher input level pushes all bands of the " "compressor equally, leading to a allegedly louder sound (well, the loudness " "was raised in fact) without tweaking every single band manually. This " "reduces the overall dynamic range, raising quiet parts and squeezing loud " "parts even more." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:294 #, fuzzy msgid "Stereo Tools" msgstr "Escopo" #. (itstool) path: item/p #: C/guide_1.page:297 msgid "After figuring our overall sound let's look for some icing on the cake." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:298 msgid "" "Drag the Stereo Tools to the fourth position, after Multiband Compressor and " "before Limiter. This tool has a lot of functionality but we only need just a " "single parameter. Switch to the last tab \"Output\" and set the parameter " "stereo base to 0.25. That's it." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:299 msgid "" "Stereo base acts on the two channels. It adds inverted signals crossover-" "wise. This way one can bring a full stereo signal down to mono seamlessly " "(by going negative values, -1 is fully mono) but also raise the stereo base " "by choosing positive numbers. This setting has lots of side effects, so " "avoid overdoing it! One of the bigger problems is that it reduces the bass " "range due to different effects, which is something we definitely don't want here." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:304 msgid "" "Play with stereo base to spread the appearance of your sound to a nice, " "broad stage without loosing the center (vocals, snare drums, conversations " "in movies) or substance in the lower end. Most likely values between 0 and " "0.5 will give some good results." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:309 msgid "Aftermath" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:310 msgid "" "Hopefully you ended up with a better sound than " "before. This signal processor chain is able to completely trash your sound " "if not done right but also can improve it to compete with some high class " "notebook speaker systems. All manufacturers put on the pants the same way " "and Dolby Theatre is no rocket science but just some presets on a presumably " "comparable set of signal processors set up in the presumably same way as " "this tutorial explained." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:315 msgid "" "When my notebook was new, I first ran the pre-installed Windows system in " "order to test if all hardware is working. Sound-wise I remembered the bad " "reputation of this machine in every test, so I tried some tunes on Youtube - " "and was quite convinced. After installing my Linux system the enthusiasm was " "totally gone - the sound turned into a squawking, pressureless something. It " "became clear that all problems of the internal speakers where due to the " "missing sound chips DSP driver. But fortunately Wellington Wallace spent his " "spare-time casting the most important Calf plug-ins for this job into " "something usable on consumers systems. Thanks a bunch for that, mate!" msgstr "" #. (itstool) path: section/title #: C/guide_1.page:318 msgid "tl;dr" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:319 msgid "" "Sorry dude, this isn't done by simply loading a preset, since the community " "is not Apple, Lenovo or Dell offering high quality Dolby Theatre drivers for " "your particular machine." msgstr "" #. (itstool) path: page/title #: C/rnnoise.page:9 #, fuzzy msgid "Noise Reduction" msgstr "Redução de Ganho" #. (itstool) path: page/p #: C/rnnoise.page:10 msgid "Noise reduction is the process of removing noise from a signal." msgstr "" #. (itstool) path: page/p #: C/rnnoise.page:13 msgid "" "PulseEffects Noise Reduction is made on the library RNNoise which is based " "based on recurrent neural network, a class of artificial neural networks " "where connections between nodes form a directed graph along a temporal " "sequence. This allows it to exhibit temporal dynamic behavior." msgstr "" #. (itstool) path: page/p #: C/rnnoise.page:19 msgid "" "Standard RNNoise Model is used and custom models can be imported to perform " "different types of noise reduction." msgstr "" #~ msgid "ASC" #~ msgstr "ASC" #, fuzzy #~ msgid "Reference Signal" #~ msgstr "Referências" easyeffects-4.8.7/help/pulseeffects.pot000066400000000000000000002443251424023573300202140ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2020-11-22 18:51+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Put one translator per line, in the form NAME , YEAR1, YEAR2 msgctxt "_" msgid "translator-credits" msgstr "" #. (itstool) path: page/title #: C/bassenhancer.page:9 msgid "Bass Enhancer" msgstr "" #. (itstool) path: page/p #: C/bassenhancer.page:10 msgid "The brain perceives the pitch of a tone not only by its fundamental frequency but also by the periodicity implied by the relationship between the higher harmonics. We may perceive the same pitch even if the fundamental frequency is missing from a tone." msgstr "" #. (itstool) path: page/p #: C/bassenhancer.page:16 msgid "PulseEffects uses the bass enhancer developed by Calf Studio." msgstr "" #. (itstool) path: title/em #: C/bassenhancer.page:22 #: C/exciter.page:21 #: C/reverb.page:40 msgid "Amount" msgstr "" #. (itstool) path: item/p #: C/bassenhancer.page:24 #: C/exciter.page:23 msgid "Amount of harmonics added to the original signal." msgstr "" #. (itstool) path: title/em #: C/bassenhancer.page:30 #: C/exciter.page:29 msgid "Harmonics" msgstr "" #. (itstool) path: item/p #: C/bassenhancer.page:32 #: C/exciter.page:31 msgid "Amount of newly created harmonics." msgstr "" #. (itstool) path: title/em #: C/bassenhancer.page:38 #: C/exciter.page:37 msgid "Scope" msgstr "" #. (itstool) path: item/p #: C/bassenhancer.page:40 #: C/exciter.page:39 msgid "The frequency harmonics are produced above." msgstr "" #. (itstool) path: title/em #: C/bassenhancer.page:46 msgid "Floor(button)" msgstr "" #. (itstool) path: item/p #: C/bassenhancer.page:48 msgid "Constrain the enhancement on the lower end." msgstr "" #. (itstool) path: title/em #: C/bassenhancer.page:54 msgid "Floor(value)" msgstr "" #. (itstool) path: item/p #: C/bassenhancer.page:56 msgid "The frequency no harmonics are produced below." msgstr "" #. (itstool) path: title/em #: C/bassenhancer.page:62 #: C/exciter.page:61 msgid "Blend Harmonics" msgstr "" #. (itstool) path: item/p #: C/bassenhancer.page:64 #: C/exciter.page:63 msgid "The \"colour\" (or octave) of the harmonics." msgstr "" #. (itstool) path: title/em #: C/bassenhancer.page:70 #: C/compressor.page:97 #: C/exciter.page:69 msgid "Listen" msgstr "" #. (itstool) path: item/p #: C/bassenhancer.page:72 #: C/exciter.page:71 msgid "Mute the original signal and listen to the harmonics exclusively." msgstr "" #. (itstool) path: section/title #: C/bassenhancer.page:78 #: C/compressor.page:266 #: C/deesser.page:111 #: C/exciter.page:77 #: C/filter.page:47 #: C/gate.page:96 #: C/delay.page:33 #: C/limiter.page:100 #: C/loudness.page:56 #: C/multibandcompressor.page:128 #: C/multibandgate.page:136 #: C/reverb.page:97 #: C/stereotools.page:96 #: C/crossfeed.page:35 #: C/equalizer.page:251 #: C/pitch.page:87 #: C/webrtc.page:140 #: C/crystalizer.page:53 #: C/convolver.page:42 #: C/autogain.page:76 #: C/rnnoise.page:24 msgid "References" msgstr "" #. (itstool) path: page/title #. (itstool) path: section/title #: C/compressor.page:9 #: C/webrtc.page:84 msgid "Compressor" msgstr "" #. (itstool) path: page/p #: C/compressor.page:10 msgid "A compressor is used to reduce the audio signal dynamic range." msgstr "" #. (itstool) path: page/p #: C/compressor.page:13 msgid "PulseEffects uses the compressor from Linux Studio Plugins." msgstr "" #. (itstool) path: title/em #: C/compressor.page:20 #: C/gate.page:20 #: C/multibandcompressor.page:20 #: C/multibandgate.page:20 msgid "Attack" msgstr "" #. (itstool) path: item/p #: C/compressor.page:22 msgid "Attack determines how many milliseconds (ms) it takes your compressor to apply a full dose of compression to your audio signal once it passes the threshold. If the signal peaks above the threshold and quickly returns to below the threshold, it may never receive a full dose of compression." msgstr "" #. (itstool) path: title/em #: C/compressor.page:31 #: C/gate.page:29 #: C/limiter.page:39 #: C/multibandcompressor.page:29 #: C/multibandgate.page:29 #: C/maximizer.page:44 msgid "Release" msgstr "" #. (itstool) path: item/p #: C/compressor.page:33 msgid "Release determines how many milliseconds (ms) it takes your compressor to stop attenuating gain once your audio signal drops below the threshold. A fast release will cause your compressor to stop attenuating gain quickly once the signal returns below the threshold. A slow release will cause your compressor to stop attenuating gain slowly once the signal returns below the threshold." msgstr "" #. (itstool) path: title/em #: C/compressor.page:43 #: C/deesser.page:26 #: C/gate.page:38 #: C/multibandcompressor.page:38 #: C/multibandgate.page:46 #: C/maximizer.page:27 msgid "Threshold" msgstr "" #. (itstool) path: item/p #: C/compressor.page:45 msgid "If a signal surpass this level it will trigger the compression stage." msgstr "" #. (itstool) path: title/em #: C/compressor.page:51 #: C/deesser.page:34 #: C/gate.page:46 #: C/multibandcompressor.page:46 #: C/multibandgate.page:54 msgid "Ratio" msgstr "" #. (itstool) path: item/p #: C/compressor.page:53 #: C/deesser.page:36 #: C/gate.page:48 #: C/multibandcompressor.page:48 #: C/multibandgate.page:56 msgid "Set the ratio by which the signal will be reduced." msgstr "" #. (itstool) path: title/em #: C/compressor.page:59 #: C/gate.page:54 #: C/multibandcompressor.page:54 #: C/multibandgate.page:62 msgid "Knee" msgstr "" #. (itstool) path: item/p #: C/compressor.page:61 #: C/gate.page:56 #: C/multibandcompressor.page:56 #: C/multibandgate.page:64 msgid "Controls how smooth is the entrance in the gain reduction phase." msgstr "" #. (itstool) path: title/em #: C/compressor.page:67 #: C/deesser.page:42 #: C/gate.page:62 #: C/multibandcompressor.page:62 #: C/multibandgate.page:70 msgid "Makeup" msgstr "" #. (itstool) path: item/p #: C/compressor.page:69 #: C/deesser.page:44 #: C/gate.page:64 #: C/multibandcompressor.page:64 #: C/multibandgate.page:72 msgid "It amplifies your signal after processing." msgstr "" #. (itstool) path: title/em #: C/compressor.page:75 msgid "Compression Mode" msgstr "" #. (itstool) path: item/p #: C/compressor.page:79 msgid "Downward - Decreases the amplitude of the signal sections that are above the threshold." msgstr "" #. (itstool) path: item/p #: C/compressor.page:84 msgid "Upwards - Increases the amplitude of the signal sections that are below the threshold." msgstr "" #. (itstool) path: section/title #: C/compressor.page:93 msgid "Sidechain" msgstr "" #. (itstool) path: item/p #: C/compressor.page:99 msgid "Allows to listen the processed sidechain signal." msgstr "" #. (itstool) path: title/em #: C/compressor.page:105 #: C/equalizer.page:99 msgid "Type" msgstr "" #. (itstool) path: item/p #: C/compressor.page:109 msgid "Feed-forward - The sidechain input is connected to compressor's input. More aggressive compression." msgstr "" #. (itstool) path: item/p #: C/compressor.page:115 msgid "Feed-back - The sidechain input is connected to compressor's output. Vintage-style more accurate compression." msgstr "" #. (itstool) path: title/em #: C/compressor.page:124 #: C/deesser.page:103 #: C/multibandcompressor.page:95 #: C/multibandgate.page:103 #: C/stereotools.page:38 #: C/equalizer.page:23 #: C/equalizer.page:146 #: C/webrtc.page:75 msgid "Mode" msgstr "" #. (itstool) path: item/p #: C/compressor.page:128 msgid "Peak - Measure signal's peak." msgstr "" #. (itstool) path: item/p #: C/compressor.page:134 msgid "RMS - Root mean square of the input signal." msgstr "" #. (itstool) path: item/p #: C/compressor.page:140 msgid "Low-Pass - Input signal is processed by a low-pass filter." msgstr "" #. (itstool) path: item/p #: C/compressor.page:146 msgid "Uniform - Input signal is processed by a uniform filter." msgstr "" #. (itstool) path: title/em #: C/compressor.page:155 msgid "Source" msgstr "" #. (itstool) path: item/p #: C/compressor.page:159 msgid "Middle - Middle part of signal is used for sidechain processing." msgstr "" #. (itstool) path: item/p #: C/compressor.page:165 msgid "Side - Side part of signal is used for sidechain processing." msgstr "" #. (itstool) path: item/p #: C/compressor.page:171 msgid "Left - Only left channel is used for sidechain processing." msgstr "" #. (itstool) path: item/p #: C/compressor.page:177 msgid "Right - Only right channel is used for sidechain processing." msgstr "" #. (itstool) path: title/em #: C/compressor.page:186 msgid "Pre-amplification" msgstr "" #. (itstool) path: item/p #: C/compressor.page:188 msgid "Pre-amplification of the sidechain signal." msgstr "" #. (itstool) path: title/em #: C/compressor.page:194 msgid "Reactivity" msgstr "" #. (itstool) path: item/p #: C/compressor.page:196 msgid "Reactivity of the sidechain signal." msgstr "" #. (itstool) path: title/em #: C/compressor.page:202 #: C/limiter.page:30 msgid "Lookahead" msgstr "" #. (itstool) path: item/p #: C/compressor.page:204 msgid "Look-ahead time of the sidechain relative to the input signal." msgstr "" #. (itstool) path: section/title #: C/compressor.page:211 msgid "Advanced" msgstr "" #. (itstool) path: title/em #: C/compressor.page:215 msgid "Relative Release Threshold" msgstr "" #. (itstool) path: item/p #: C/compressor.page:217 msgid "Relative to the Attack Threshold that sets up the threshold of Release Time." msgstr "" #. (itstool) path: title/em #: C/compressor.page:223 msgid "Boost Threshold" msgstr "" #. (itstool) path: item/p #: C/compressor.page:225 msgid "Related to upward compression mode only. It defines the threshold below which the constant amplification will be applied to the input signal. This prevents the compressor from applying infinite amplification to very quiet signals." msgstr "" #. (itstool) path: title/em #: C/compressor.page:233 msgid "High-pass Filter Mode" msgstr "" #. (itstool) path: item/p #: C/compressor.page:235 msgid "Sets the type of the high-pass filter applied to sidechain signal." msgstr "" #. (itstool) path: title/em #: C/compressor.page:241 msgid "High-pass Frequency" msgstr "" #. (itstool) path: item/p #: C/compressor.page:243 msgid "Sets the cut-off frequency of the high-pass filter." msgstr "" #. (itstool) path: title/em #: C/compressor.page:249 msgid "Low-pass Filter Mode" msgstr "" #. (itstool) path: item/p #: C/compressor.page:251 msgid "Sets the type of the low-pass filter applied to sidechain signal." msgstr "" #. (itstool) path: title/em #: C/compressor.page:257 msgid "Low-pass Frequency" msgstr "" #. (itstool) path: item/p #: C/compressor.page:259 msgid "Sets the cut-off frequency of the low-pass filter." msgstr "" #. (itstool) path: page/title #: C/deesser.page:9 msgid "Deesser" msgstr "" #. (itstool) path: page/p #: C/deesser.page:10 msgid "PulseEffects uses the deesser developed by Calf Studio. A deesser is used to dynamically reduce high frequencies. The standard field of use is the reduction of \"sssss\" and \"shhhh\" in vocal tracks." msgstr "" #. (itstool) path: title/em #: C/deesser.page:18 msgid "Laxity" msgstr "" #. (itstool) path: item/p #: C/deesser.page:20 msgid "The reaction of the deesser. Higher values won't affect really short peaks." msgstr "" #. (itstool) path: item/p #: C/deesser.page:28 #: C/multibandcompressor.page:40 #: C/multibandgate.page:48 msgid "If a signal rises above this level it will affect the gain reduction." msgstr "" #. (itstool) path: title/em #: C/deesser.page:50 msgid "F1 Split" msgstr "" #. (itstool) path: item/p #: C/deesser.page:52 msgid "The split frequency. All signals above this frequency will affect the gain reduction (and in split mode they are affected by the reduction too)." msgstr "" #. (itstool) path: title/em #: C/deesser.page:59 msgid "F1 Gain" msgstr "" #. (itstool) path: item/p #: C/deesser.page:61 msgid "It shifts the volume of the higher band. In wideband mode it affects the sidechain. In split mode it also affects the processed high frequencies." msgstr "" #. (itstool) path: title/em #: C/deesser.page:68 msgid "F2 Peak" msgstr "" #. (itstool) path: item/p #: C/deesser.page:70 msgid "Center frequency of the bell filter. It allows a more precise selection of the sidechain signal." msgstr "" #. (itstool) path: title/em #: C/deesser.page:77 msgid "F2 Level" msgstr "" #. (itstool) path: item/p #: C/deesser.page:79 msgid "Increase or decrease the frequencies around the center bell frequency." msgstr "" #. (itstool) path: title/em #: C/deesser.page:85 msgid "F2 Peak Q" msgstr "" #. (itstool) path: item/p #: C/deesser.page:87 msgid "Set the quality of the bell. Higher values will affect a narrower frequency range. Lower values will affect a wider band." msgstr "" #. (itstool) path: title/em #: C/deesser.page:94 #: C/gate.page:79 #: C/multibandcompressor.page:78 #: C/multibandgate.page:86 msgid "Detection" msgstr "" #. (itstool) path: item/p #: C/deesser.page:96 msgid "Choose if the deesser should take the signal peak for detection or the RMS value (it is smoother)." msgstr "" #. (itstool) path: item/p #: C/deesser.page:105 msgid "Select your operation mode between wideband or split" msgstr "" #. (itstool) path: page/title #: C/exciter.page:9 msgid "Exciter" msgstr "" #. (itstool) path: page/p #: C/exciter.page:10 msgid "An exciter is used to enhance a signal by dynamic equalization, phase manipulation, harmonic synthesis of high frequency signals, and through the addition of subtle harmonic distortion." msgstr "" #. (itstool) path: page/p #: C/exciter.page:15 msgid "PulseEffects uses the exciter developed by Calf Studio." msgstr "" #. (itstool) path: title/em #: C/exciter.page:45 msgid "Ceiling(button)" msgstr "" #. (itstool) path: item/p #: C/exciter.page:47 msgid "Constrain the excitement on the upper end." msgstr "" #. (itstool) path: title/em #: C/exciter.page:53 msgid "Ceiling(value)" msgstr "" #. (itstool) path: item/p #: C/exciter.page:55 msgid "The frequency no harmonics are produced above." msgstr "" #. (itstool) path: page/title #: C/filter.page:9 msgid "Filter" msgstr "" #. (itstool) path: page/p #: C/filter.page:10 msgid "Audio filters can amplify (boost), pass or attenuate (cut) some frequency ranges." msgstr "" #. (itstool) path: page/p #: C/filter.page:14 msgid "PulseEffects uses the filter from Calf Studio. It can be used to remove defined parts of a frequency spectrum." msgstr "" #. (itstool) path: title/em #: C/filter.page:21 #: C/equalizer.page:224 msgid "Frequency" msgstr "" #. (itstool) path: item/p #: C/filter.page:23 msgid "The center or cut-off frequency of the filter." msgstr "" #. (itstool) path: title/em #: C/filter.page:29 msgid "Resonance" msgstr "" #. (itstool) path: item/p #: C/filter.page:31 msgid "Add an accentuation to the center frequency. When used on a bandpass the surrounding frequencies are decreased in level and the band gets more narrow, a bandreject is narrowed down to a thin needle." msgstr "" #. (itstool) path: title/em #: C/filter.page:39 msgid "Inertia" msgstr "" #. (itstool) path: item/p #: C/filter.page:41 msgid "Smooths the jumps between frequencies." msgstr "" #. (itstool) path: page/title #: C/gate.page:9 msgid "Gate" msgstr "" #. (itstool) path: page/p #: C/gate.page:10 msgid "Gates attenuate signals that register below the threshold. This kind of signal processing reduces disturbing noise between useful signals." msgstr "" #. (itstool) path: page/p #: C/gate.page:14 msgid "PulseEffects uses the gate developed by Calf Studio." msgstr "" #. (itstool) path: item/p #: C/gate.page:22 msgid "Amount of milliseconds the signal has to rise above the threshold before gain reduction stops." msgstr "" #. (itstool) path: item/p #: C/gate.page:31 msgid "Amount of milliseconds the signal has to fall below the threshold before the reduction is increased again." msgstr "" #. (itstool) path: item/p #: C/gate.page:40 msgid "If a signal rises above this level the gain reduction is released." msgstr "" #. (itstool) path: title/em #: C/gate.page:70 msgid "Stereo Link" msgstr "" #. (itstool) path: item/p #: C/gate.page:72 msgid "Choose if the gain reduction is affected by the louder channel or by the average level between the channels." msgstr "" #. (itstool) path: item/p #: C/gate.page:81 msgid "Choose if the gate should take the signal peak for detection or the RMS value (it is smoother)." msgstr "" #. (itstool) path: title/em #: C/gate.page:88 msgid "Gain Reduction" msgstr "" #. (itstool) path: item/p #: C/gate.page:90 msgid "The level of gain reduction when the signal is below the threshold." msgstr "" #. (itstool) path: page/title #: C/delay.page:9 msgid "Delay" msgstr "" #. (itstool) path: page/p #: C/delay.page:10 msgid "This plugin allows to add short delay to each individual channel of the stereo channel" msgstr "" #. (itstool) path: title/em #: C/delay.page:17 msgid "Left" msgstr "" #. (itstool) path: item/p #: C/delay.page:19 msgid "Left channel delay." msgstr "" #. (itstool) path: title/em #: C/delay.page:25 msgid "Right" msgstr "" #. (itstool) path: item/p #: C/delay.page:27 msgid "Right channel delay." msgstr "" #. (itstool) path: page/title #: C/index.page:8 msgid "PulseEffects" msgstr "" #. (itstool) path: page/p #: C/index.page:9 msgid "PulseEffects applies audio effects to Pulseaudio applications. You can apply effects to applications output or to your microphone before sending its audio to a recording application." msgstr "" #. (itstool) path: section/title #: C/index.page:11 msgid "Guides" msgstr "" #. (itstool) path: section/title #: C/index.page:14 msgid "User Interface" msgstr "" #. (itstool) path: section/title #: C/index.page:17 msgid "Plugins" msgstr "" #. (itstool) path: section/title #: C/index.page:20 msgid "Calibration" msgstr "" #. (itstool) path: page/title #. (itstool) path: title/em #: C/limiter.page:9 #: C/limiter.page:18 #: C/webrtc.page:88 msgid "Limiter" msgstr "" #. (itstool) path: page/p #: C/limiter.page:10 msgid "A limiter allows signals below a specified input power or level to pass unaffected while attenuating (lowering) the peaks of stronger signals that exceed this threshold." msgstr "" #. (itstool) path: page/p #: C/limiter.page:15 msgid "PulseEffects uses the limiter developed by Calf Studio." msgstr "" #. (itstool) path: title/em #: C/limiter.page:22 msgid "Limit" msgstr "" #. (itstool) path: item/p #: C/limiter.page:24 msgid "No signal above this level will pass through the limiter." msgstr "" #. (itstool) path: item/p #: C/limiter.page:32 msgid "The Limiter will reach its attenuation level in this amount of time (output will be delayed two times this time)." msgstr "" #. (itstool) path: item/p #: C/limiter.page:41 msgid "Stop the attenuation after this amount of milliseconds." msgstr "" #. (itstool) path: title/em #: C/limiter.page:47 msgid "Oversampling" msgstr "" #. (itstool) path: item/p #: C/limiter.page:49 msgid "Increase the signal sampling to better detect the peaks. The signal is downsampled after processing." msgstr "" #. (itstool) path: title/em #: C/limiter.page:56 msgid "Automatic Smoothing Control" msgstr "" #. (itstool) path: item/p #: C/limiter.page:58 msgid "When gain reduction is always needed ASC takes care of releasing to an average reduction level rather than reaching a reduction of 0 in the release time." msgstr "" #. (itstool) path: title/em #: C/limiter.page:65 msgid "ASC Level" msgstr "" #. (itstool) path: item/p #: C/limiter.page:67 msgid "Select how much the release time is affected by ASC, 0 means nearly no changes in release time while 1 produces higher release times." msgstr "" #. (itstool) path: title/em #: C/limiter.page:74 msgid "Automatic Leveling" msgstr "" #. (itstool) path: item/p #: C/limiter.page:76 msgid "Raises the signal level adding the absolute value of the limit amount after the compression stage is performed. Enabling this feature the volume is automatically leveled at 0 db." msgstr "" #. (itstool) path: title/em #: C/limiter.page:84 msgid "Input Gain" msgstr "" #. (itstool) path: item/p #: C/limiter.page:86 msgid "Raises or decrease the signal level before it is sent to the compression stage." msgstr "" #. (itstool) path: title/em #: C/limiter.page:92 msgid "Output Gain" msgstr "" #. (itstool) path: item/p #: C/limiter.page:94 msgid "Raises or decrease the signal level after the compression stage." msgstr "" #. (itstool) path: page/title #: C/loudness.page:9 msgid "Loudness Compensator" msgstr "" #. (itstool) path: page/p #: C/loudness.page:10 msgid "PulseEffects uses the loudness compensator from Linux Studio Plugins which applies equal loudness contour corrections to the input signal. This is a measure of sound pressure level (SPL), over the frequency spectrum, for which a listener perceives a constant loudness when presented with pure steady tones." msgstr "" #. (itstool) path: title/em #: C/loudness.page:20 msgid "Input" msgstr "" #. (itstool) path: item/p #: C/loudness.page:22 msgid "The input gain settings, allows to adjust the level of the input signal to the desired level." msgstr "" #. (itstool) path: title/em #: C/loudness.page:29 msgid "Output" msgstr "" #. (itstool) path: item/p #: C/loudness.page:31 msgid "The output volume of the signal with applied equal loudness contour, controls the loudness of the 1 kHz pure sine wave." msgstr "" #. (itstool) path: title/em #: C/loudness.page:38 msgid "Standard" msgstr "" #. (itstool) path: item/p #: C/loudness.page:40 msgid "Allows to select different equal loudness contour standards." msgstr "" #. (itstool) path: title/em #: C/loudness.page:46 msgid "FFT Size" msgstr "" #. (itstool) path: item/p #: C/loudness.page:48 msgid "Allows to select size of the fast Fourier transform frame used for the processing. The larger FFT frame is, the more precize the curve is approximated and the more latency the plugin introduces" msgstr "" #. (itstool) path: page/title #: C/multibandcompressor.page:9 msgid "Multiband Compressor" msgstr "" #. (itstool) path: page/p #: C/multibandcompressor.page:10 msgid "This kind of compressor splits the signal in four different frequency ranges. These ranges are compressed separately and mixed together afterwards again." msgstr "" #. (itstool) path: page/p #: C/multibandcompressor.page:14 msgid "PulseEffects uses the multiband compressor developed by Calf Studio." msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:22 #: C/multibandgate.page:22 msgid "Amount of milliseconds the signal has to rise above the threshold before gain reduction starts." msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:31 #: C/multibandgate.page:31 msgid "Amount of milliseconds the signal has to fall below the threshold before the reduction is decreased again." msgstr "" #. (itstool) path: title/em #: C/multibandcompressor.page:70 #: C/multibandgate.page:78 #: C/crystalizer.page:37 msgid "Bypass" msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:72 #: C/multibandgate.page:80 msgid "Don't process anything, just bypass the signal of this strip." msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:80 msgid "Choose if the multibandcompressor should take the signal peak for detection or the RMS value (it is smoother)." msgstr "" #. (itstool) path: title/em #: C/multibandcompressor.page:87 #: C/multibandgate.page:95 #: C/equalizer.page:208 msgid "Solo" msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:89 #: C/multibandgate.page:97 msgid "Mute all strips not set to solo." msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:97 #: C/multibandgate.page:105 msgid "The crossover mode. You can choose between the fourth order Linkwitz-Riley(LR4) and the eighth order Linkwitz-Riley(LR8)." msgstr "" #. (itstool) path: title/em #: C/multibandcompressor.page:104 #: C/multibandgate.page:112 msgid "Split 1/2" msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:106 #: C/multibandgate.page:114 msgid "Frequency that separates the sub band and the low band." msgstr "" #. (itstool) path: title/em #: C/multibandcompressor.page:112 #: C/multibandgate.page:120 msgid "Split 2/3" msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:114 #: C/multibandgate.page:122 msgid "Frequency that separates the low band and the mid band." msgstr "" #. (itstool) path: title/em #: C/multibandcompressor.page:120 #: C/multibandgate.page:128 msgid "Split 3/4" msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:122 #: C/multibandgate.page:130 msgid "Frequency that separates the mid band and the high band." msgstr "" #. (itstool) path: page/title #: C/multibandgate.page:9 msgid "Multiband Gate" msgstr "" #. (itstool) path: page/p #: C/multibandgate.page:10 msgid "This kind of gate splits the signal in four different frequency ranges. These ranges are processed separately and mixed together afterwards again." msgstr "" #. (itstool) path: page/p #: C/multibandgate.page:14 msgid "PulseEffects uses the multiband gate developed by Calf Studio." msgstr "" #. (itstool) path: title/em #: C/multibandgate.page:38 msgid "Reduction" msgstr "" #. (itstool) path: item/p #: C/multibandgate.page:40 msgid "The level of reduction in this strip." msgstr "" #. (itstool) path: item/p #: C/multibandgate.page:88 msgid "Choose if the multibandgate should take the signal peak for detection or the RMS value (it is smoother)." msgstr "" #. (itstool) path: page/title #: C/reverb.page:9 msgid "Reverberation" msgstr "" #. (itstool) path: page/p #: C/reverb.page:10 msgid "Reverberation, in psychoacoustics and acoustics, is a persistence of sound after the sound is produced. A reverberation, or reverb, is created when a sound or signal is reflected causing a large number of reflections to build up and then decay as the sound is absorbed by the surfaces of objects in the space. Reverberation plugins can be used to artificially produce this effect." msgstr "" #. (itstool) path: page/p #: C/reverb.page:17 msgid "PulseEffects uses the reverberation developed by Calf Studio." msgstr "" #. (itstool) path: title/em #: C/reverb.page:23 msgid "Pre Delay" msgstr "" #. (itstool) path: item/p #: C/reverb.page:25 msgid "Additional delay - corresponds to a distance between sound source and the nearest wall." msgstr "" #. (itstool) path: title/em #: C/reverb.page:32 msgid "Decay Time" msgstr "" #. (itstool) path: item/p #: C/reverb.page:34 msgid "Time it takes for reverberation to fade out." msgstr "" #. (itstool) path: item/p #: C/reverb.page:42 msgid "Amount of processed signal (reverberation) in the output." msgstr "" #. (itstool) path: title/em #: C/reverb.page:48 msgid "Dry" msgstr "" #. (itstool) path: item/p #: C/reverb.page:50 msgid "Amount of unprocessed signal in the output." msgstr "" #. (itstool) path: title/em #: C/reverb.page:56 msgid "Bass Cut" msgstr "" #. (itstool) path: item/p #: C/reverb.page:58 msgid "Removes low frequencies from the reverberation." msgstr "" #. (itstool) path: title/em #: C/reverb.page:64 msgid "Treble Cut" msgstr "" #. (itstool) path: item/p #: C/reverb.page:66 msgid "Removes high frequencies from the reverberation." msgstr "" #. (itstool) path: title/em #: C/reverb.page:72 msgid "Diffusion" msgstr "" #. (itstool) path: item/p #: C/reverb.page:74 msgid "Increase its value for less uniform reverberation." msgstr "" #. (itstool) path: title/em #: C/reverb.page:80 msgid "Room Size" msgstr "" #. (itstool) path: item/p #: C/reverb.page:82 msgid "Size of the space that simulated reverberation occurs in - determines times between reflections." msgstr "" #. (itstool) path: title/em #: C/reverb.page:89 msgid "High Frequency Damping" msgstr "" #. (itstool) path: item/p #: C/reverb.page:91 msgid "Cutoff reflections high frequencies - causes higher frequencies to decay faster." msgstr "" #. (itstool) path: page/title #: C/stereotools.page:9 msgid "Stereo Tools" msgstr "" #. (itstool) path: page/p #: C/stereotools.page:10 msgid "PulseEffects uses the stereo tools developed by Calf Studio." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:16 msgid "Softclip" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:18 msgid "Do kind of analog distortion instead of harsh digital 0db clipping." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:24 msgid "Balance" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:26 msgid "Set the balance between both channels." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:32 msgid "S/C Level" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:40 msgid "Choose normal stereo behavior (LR - LR) or convert between MS and LR." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:46 msgid "Side Level" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:48 msgid "The level of the side signal." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:54 msgid "Side Balance" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:56 msgid "The balance of the side signal." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:62 msgid "Middle Level" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:64 msgid "Middle signal position in the stereo panorama." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:70 msgid "Delay L/R" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:72 msgid "Delay the left or the right channel (milliseconds). Negative values delay the left channel and positive values the right channel." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:79 msgid "Stereo Base" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:81 msgid "Set the stereo base of your material seamless between Mono and inverted Channels." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:88 msgid "Stereo Phase" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:90 msgid "Set the stereo phase of your material." msgstr "" #. (itstool) path: page/title #: C/maximizer.page:9 msgid "Maximizer" msgstr "" #. (itstool) path: page/p #: C/maximizer.page:10 msgid "Maximizer is a versatile plugin that can be tweaked to be a compressor, an amplifier and a limiter. It is basically controlled by only two parameters: ceiling and threshold. Threshold is a relative value representing the amplification of the signal while ceiling is the maximum allowed output peak level. Setting both values different from zero, the plugin will act as an upward compressor with a limiter on the ceiling level (overly amplified signal with ceiling set too low can result in distorted sound even without the presence of clipping). When only threshold is set equal to zero, it reduces the amplitude of the signal." msgstr "" #. (itstool) path: page/p #: C/maximizer.page:21 msgid "PulseEffects uses the maximizer from ZamAudio." msgstr "" #. (itstool) path: item/p #: C/maximizer.page:29 msgid "Relative value representing the amplification of the signal. Zero is no amplification. Lower values, higher amplification." msgstr "" #. (itstool) path: title/em #: C/maximizer.page:36 msgid "Ceiling" msgstr "" #. (itstool) path: item/p #: C/maximizer.page:38 msgid "Maximum allowed peak level of the output signal." msgstr "" #. (itstool) path: item/p #: C/maximizer.page:46 msgid "Set the release in milliseconds." msgstr "" #. (itstool) path: page/title #: C/crossfeed.page:9 msgid "Crossfeed" msgstr "" #. (itstool) path: page/p #: C/crossfeed.page:10 msgid "PulseEffects uses the crossfeed from GStreamer. This plugin is based on the bs2b library and can be used to improve headphone listening of stereo audio records. It does so by mixing the left and right channel in a way that simulates a stereo speaker setup while using headphones." msgstr "" #. (itstool) path: title/em #: C/crossfeed.page:19 msgid "Cutoff" msgstr "" #. (itstool) path: item/p #: C/crossfeed.page:21 msgid "Low-pass filter cutoff frequency." msgstr "" #. (itstool) path: title/em #: C/crossfeed.page:27 msgid "Feed" msgstr "" #. (itstool) path: item/p #: C/crossfeed.page:29 msgid "Amount of signal from a channel that is sent to the other." msgstr "" #. (itstool) path: page/title #: C/equalizer.page:9 msgid "Equalizer" msgstr "" #. (itstool) path: page/p #: C/equalizer.page:10 msgid "PulseEffects uses the parametric equalizer from Linux Studio Plugins. You can choose between 1 and 30 bands. You also can change the center frequency and the width of each band as needed. There are a few presets but at this moment all of them have only 10 bands. Presets with other number of bands may be added in the future." msgstr "" #. (itstool) path: section/title #: C/equalizer.page:18 msgid "Main Menu" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:27 msgid "IIR - Infinite Impulse Response filters, nonlinear minimal phase. In most cases does not add noticeable latency to output signal." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:33 msgid "FIR - Finite Impulse Response filters with linear phase, finite approximation of equalizer's impulse response. Adds noticeable latency to output signal." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:39 msgid "FFT - Fast Fourier Transform approximation of the frequency chart, linear phase. Adds noticeable latency to output signal." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:48 msgid "Bands" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:50 msgid "The number of equalizer bands." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:56 msgid "Split Channels" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:58 msgid "When this option is enabled it is possible to apply different equalizations to the left and the right channel." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:65 msgid "Flat Response" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:67 msgid "This function sets each band gain to 0." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:73 msgid "Calculate Frequencies" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:75 msgid "This function can be used to calculate the center frequencies and bandwidth of a graphic equalizer with the current number of selected bands. Useful when the user does not want the default number of 30 bands but has no idea about which frequencies and bandwidth he/she should choose." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:84 msgid "Reset Equalizer" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:86 msgid "Reset the equalizer to its default settings." msgstr "" #. (itstool) path: section/title #: C/equalizer.page:95 msgid "Band Menu" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:103 msgid "Off - Filter is not working (turned off)." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:108 msgid "Bell - Bell filter with smooth peak/recess." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:113 msgid "High-pass - High-pass filter with rejection of low frequencies." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:118 msgid "High-shelf - Shelving filter with adjustment of high frequency range." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:123 msgid "Low-pass - Low-pass filter with rejection of high frequencies." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:128 msgid "Low-shelf - Shelving filter with adjustment of low frequencies." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:133 msgid "Notch - Notch filter with full rejection of selected frequency." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:138 msgid "Resonance - Resonance filter wih sharp peak/recess." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:150 msgid "RLC - Very smooth filters based on similar cascades of RLC contours." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:155 msgid "BWC - Butterworth-Chebyshev-type-1 based filters. Does not affect Resonance and Notch filters." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:161 msgid "LRX - Linkwitz-Riley based filters. Does not affect Resonance and Notch filters." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:166 msgid "APO - Digital biquad filters derived from canonic analog biquad prototypes digitalized through Bilinear transform. These are textbook filters <_:link-1/> which are implemented as in the <_:link-2/> software." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:181 msgid "(BT) - Bilinear Z-transform is used for pole/zero mapping." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:186 msgid "(MT) - Matched Z-transform is used for pole/zero mapping." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:191 msgid "(DR) - Direct design is used to serve the digital filter coefficients directly in the digital domain without performing transforms." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:200 msgid "Slope" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:202 msgid "The slope of the filter characteristics." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:210 msgid "Makes this band the only one active." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:216 #: C/crystalizer.page:45 msgid "Mute" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:218 msgid "Mutes the band." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:226 msgid "Band center frequency." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:232 msgid "Width" msgstr "" #. (itstool) path: p/code #: C/equalizer.page:236 #, no-wrap msgid "" "width = frequency / quality" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:234 msgid "Bandwidth. Calculated as <_:code-1/>." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:241 msgid "Quality" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:243 msgid "Quality factor." msgstr "" #. (itstool) path: page/title #: C/pitch.page:9 msgid "Pitch" msgstr "" #. (itstool) path: page/p #: C/pitch.page:10 msgid "Pitch shifting is a sound recording technique in which the original pitch of a sound is raised or lowered." msgstr "" #. (itstool) path: page/p #: C/pitch.page:14 msgid "PulseEffects uses the pitch shifter from RubberBand." msgstr "" #. (itstool) path: title/em #: C/pitch.page:20 msgid "Faster" msgstr "" #. (itstool) path: title/em #: C/pitch.page:26 msgid "Preserve Formant" msgstr "" #. (itstool) path: item/p #: C/pitch.page:28 msgid "Enable formant preservation when pitch shifting." msgstr "" #. (itstool) path: title/em #: C/pitch.page:34 msgid "Cents" msgstr "" #. (itstool) path: item/p #: C/pitch.page:36 msgid "Number of cents the pitch will increased or decreased." msgstr "" #. (itstool) path: title/em #: C/pitch.page:42 msgid "Semitones" msgstr "" #. (itstool) path: item/p #: C/pitch.page:44 msgid "Number of semitones the pitch will increased or decreased." msgstr "" #. (itstool) path: title/em #: C/pitch.page:50 msgid "Octaves" msgstr "" #. (itstool) path: item/p #: C/pitch.page:52 msgid "Number of octaves the pitch will increased or decreased." msgstr "" #. (itstool) path: title/em #: C/pitch.page:58 msgid "Crispness" msgstr "" #. (itstool) path: item/p #: C/pitch.page:62 msgid "0 - Disable phase resynchronisation at transients, phase lamination and use longer processing window." msgstr "" #. (itstool) path: item/p #: C/pitch.page:68 msgid "1 - Use soft transient detector, disable phase lamination and use longer processing window." msgstr "" #. (itstool) path: item/p #: C/pitch.page:74 msgid "2 - Disable phase resynchronisation at transients and phase lamination." msgstr "" #. (itstool) path: item/p #: C/pitch.page:79 msgid "3 - Disable phase resynchronisation at transients." msgstr "" #. (itstool) path: page/title #: C/webrtc.page:9 msgid "Webrtc" msgstr "" #. (itstool) path: page/p #: C/webrtc.page:10 msgid "PulseEffects uses the webrtc from GStreamer. This plugin offers a voice enhancement filter based on WebRTC Audio Processing library. This library provides a broad variety of enhancement algorithms. This plugin tries to enable as many of those as possible. The currently enabled enhancements are High Pass Filter, Echo Canceller, Noise Suppression, Automatic Gain Control, and some extended filters." msgstr "" #. (itstool) path: section/title #: C/webrtc.page:19 msgid "Echo Canceller" msgstr "" #. (itstool) path: title/em #: C/webrtc.page:23 msgid "Extended Filter" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:25 msgid "Enabled or disables the extended filter." msgstr "" #. (itstool) path: title/em #: C/webrtc.page:31 msgid "High Pass Filter" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:33 msgid "Enables or disables the high pass filter." msgstr "" #. (itstool) path: title/em #: C/webrtc.page:39 msgid "Delay Agnostic" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:41 msgid "Enables or disables the delay agnostic mode." msgstr "" #. (itstool) path: title/em #: C/webrtc.page:47 #: C/webrtc.page:61 msgid "Suppression Level" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:49 msgid "Controls the aggressiveness of the suppressor. A higher level trades off double-talk performance for increased echo suppression." msgstr "" #. (itstool) path: section/title #: C/webrtc.page:57 msgid "Noise Suppressor" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:63 msgid "Controls the aggressiveness of the suppression. Increasing the level will reduce the noise level at the expense of a higher speech distortion." msgstr "" #. (itstool) path: section/title #: C/webrtc.page:71 msgid "Gain Controller" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:77 msgid "Controls the mode of the compression stage." msgstr "" #. (itstool) path: item/p #: C/webrtc.page:90 msgid "When enabled, the compression stage will hard limit the signal to the target level. Otherwise, the signal will be compressed but not limited above the target level." msgstr "" #. (itstool) path: title/em #: C/webrtc.page:98 msgid "Target Level" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:100 msgid "Sets the target peak level of the gain control in dBFS (decibels from digital full-scale)." msgstr "" #. (itstool) path: title/em #: C/webrtc.page:107 msgid "Maximum Gain" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:109 msgid "Sets the maximum gain the digital compression stage may apply." msgstr "" #. (itstool) path: section/title #: C/webrtc.page:116 msgid "Voice Detector" msgstr "" #. (itstool) path: title/em #: C/webrtc.page:120 msgid "Detection Likelihood" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:122 msgid "Specifies the likelihood that a frame will be declared to contain voice." msgstr "" #. (itstool) path: title/em #: C/webrtc.page:130 msgid "Frame Size" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:132 msgid "Sets the size of the frames in ms on which the VAD will operate. Larger frames will improve detection accuracy, but reduce the frequency of updates." msgstr "" #. (itstool) path: page/title #: C/crystalizer.page:9 msgid "Crystalizer" msgstr "" #. (itstool) path: page/p #: C/crystalizer.page:10 msgid "This plugin can be used to add a little of dynamic range to songs that were overly compressed" msgstr "" #. (itstool) path: title/em #: C/crystalizer.page:17 msgid "Aggressive Mode" msgstr "" #. (itstool) path: item/p #: C/crystalizer.page:19 msgid "When this option is enabled sample amplitude dependent amplification will be applied to the signal. Take care to not saturate the next plugin in the processing chain." msgstr "" #. (itstool) path: title/em #: C/crystalizer.page:27 msgid "Intensities" msgstr "" #. (itstool) path: item/p #: C/crystalizer.page:29 msgid "The higher the value the higher is the difference in magnitude between the loudest and the quietest sounds. You can set different intensities for each frequency band." msgstr "" #. (itstool) path: item/p #: C/crystalizer.page:39 msgid "When active the audio signal passing through this band will not be modified." msgstr "" #. (itstool) path: item/p #: C/crystalizer.page:47 msgid "Silence the band." msgstr "" #. (itstool) path: page/title #: C/convolver.page:9 msgid "Convolver" msgstr "" #. (itstool) path: page/p #: C/convolver.page:10 msgid "A convolver creates a simulation of an audio environment. It is based on the mathematical convolution operation, and uses a pre-recorded audio sample of the impulse response of the space being modeled." msgstr "" #. (itstool) path: title/em #: C/convolver.page:18 msgid "Import Impulse" msgstr "" #. (itstool) path: item/p #: C/convolver.page:20 msgid "Import an impulse response file to PulseEffects configuration directory." msgstr "" #. (itstool) path: title/em #: C/convolver.page:26 msgid "Stereo Width" msgstr "" #. (itstool) path: item/p #: C/convolver.page:28 msgid "Modify the impulse response stereo image width." msgstr "" #. (itstool) path: title/em #. (itstool) path: page/title #: C/convolver.page:34 #: C/spectrum.page:9 msgid "Spectrum" msgstr "" #. (itstool) path: item/p #: C/convolver.page:36 msgid "Visualize the frequency spectrum of the selected channel." msgstr "" #. (itstool) path: page/title #: C/settingsmenu.page:10 msgid "Settings Menu" msgstr "" #. (itstool) path: page/title #: C/general.page:9 msgid "General" msgstr "" #. (itstool) path: title/em #: C/general.page:13 msgid "Start Service at Login" msgstr "" #. (itstool) path: item/p #: C/general.page:15 msgid "Start PulseEffects as a service in the next login. This is done by creating an autostart file at ~/.config/autostart" msgstr "" #. (itstool) path: title/em #: C/general.page:23 msgid "Process All Outputs" msgstr "" #. (itstool) path: item/p #: C/general.page:25 msgid "Apply effects to the output of all audio applications. This will automatically switch on the per application switch that can be seen in the Applications entry." msgstr "" #. (itstool) path: title/em #: C/general.page:32 msgid "Process All Inputs" msgstr "" #. (itstool) path: item/p #: C/general.page:34 msgid "Apply effects to the input(microphone) of all audio applications. This will automatically switch on the per application switch that can be seen in the Applications entry." msgstr "" #. (itstool) path: title/em #: C/general.page:42 msgid "Use Dark Theme" msgstr "" #. (itstool) path: item/p #: C/general.page:44 msgid "Use the dark version of the GTK theme." msgstr "" #. (itstool) path: title/em #: C/general.page:50 #: C/autogain.page:16 msgid "Reset" msgstr "" #. (itstool) path: item/p #: C/general.page:52 msgid "Reset all parameters to their default values. This will reset the plugins too." msgstr "" #. (itstool) path: title/em #: C/general.page:58 msgid "Priority type" msgstr "" #. (itstool) path: item/p #: C/general.page:60 msgid "Choose between real time mode, niceness or none. This parameter allows to choose a higher priority for the threads that process audio." msgstr "" #. (itstool) path: title/em #: C/general.page:67 msgid "Niceness" msgstr "" #. (itstool) path: item/p #: C/general.page:69 msgid "Niceness value." msgstr "" #. (itstool) path: title/em #: C/general.page:75 msgid "Priority" msgstr "" #. (itstool) path: item/p #: C/general.page:77 msgid "Real time priority." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:13 msgid "Show" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:15 msgid "Hide or show the spectrum." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:21 msgid "Points" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:23 msgid "Number of points displayed." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:29 msgid "Height" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:31 msgid "Spectrum height." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:37 msgid "Scale" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:39 msgid "Bar height scaling factor." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:45 msgid "Exponent" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:47 msgid "Scaling factor exponent." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:53 msgid "Sampling" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:55 msgid "Spectrum update frequency." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:61 msgid "Line Width" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:63 msgid "Bar line width." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:69 msgid "Fill" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:71 msgid "Draw filled bars." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:77 msgid "Border" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:79 msgid "Show bar border." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:85 msgid "Use Custom Color" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:87 msgid "Use a user defined color or the GTK theme color." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:93 msgid "Spectrum Color" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:95 msgid "User defined color." msgstr "" #. (itstool) path: page/title #: C/pulseaudio.page:9 msgid "Pulseaudio" msgstr "" #. (itstool) path: page/p #: C/pulseaudio.page:10 msgid "PulseEffects has two GStreamer pipelines. One that applies effects for applications output and other that applies effects for microphone. Here the user can tweak a few advanced parameters for both pipelines." msgstr "" #. (itstool) path: title/em #: C/pulseaudio.page:18 msgid "Use Default" msgstr "" #. (itstool) path: item/p #: C/pulseaudio.page:20 msgid "Use default input or output device." msgstr "" #. (itstool) path: title/em #: C/pulseaudio.page:26 msgid "Buffer" msgstr "" #. (itstool) path: item/p #: C/pulseaudio.page:28 msgid "Pulsesrc plugin buffer size. It affects latency" msgstr "" #. (itstool) path: title/em #: C/pulseaudio.page:34 msgid "Latency" msgstr "" #. (itstool) path: item/p #: C/pulseaudio.page:36 msgid "Pulsesrc plugin latency value." msgstr "" #. (itstool) path: title/em #: C/pulseaudio.page:42 msgid "Block Size" msgstr "" #. (itstool) path: item/p #: C/pulseaudio.page:44 msgid "This controls the size of the audio buffer. Higher values increase latency but decrease cpu usage of a few plugins." msgstr "" #. (itstool) path: page/title #: C/testsignals.page:9 msgid "Test Signals" msgstr "" #. (itstool) path: page/p #: C/testsignals.page:10 msgid "These signals can be used to test the frequency response of your speakers." msgstr "" #. (itstool) path: page/title #: C/calibrationmic.page:9 msgid "Microphone" msgstr "" #. (itstool) path: page/p #: C/calibrationmic.page:10 msgid "If you have a microphone with reasonably flat response you can use it together with a pink noise test signal to estimate how flat is your audio setup frequency response." msgstr "" #. (itstool) path: title/em #: C/calibrationmic.page:17 msgid "Window" msgstr "" #. (itstool) path: item/p #: C/calibrationmic.page:19 msgid "The amount of time the microphone signal will be measured. Higher values will reduce noises." msgstr "" #. (itstool) path: title/em #: C/calibrationmic.page:26 msgid "Measure Noise" msgstr "" #. (itstool) path: item/p #: C/calibrationmic.page:28 msgid "Saves the last measurement to be used as background noise. Usually you would use this before turning on the pink noise." msgstr "" #. (itstool) path: title/em #: C/calibrationmic.page:35 msgid "Subtract Noise" msgstr "" #. (itstool) path: item/p #: C/calibrationmic.page:37 msgid "Subtract the stored background noise from the measurement." msgstr "" #. (itstool) path: page/title #: C/enableapp.page:10 msgid "Enable or Disable an Application" msgstr "" #. (itstool) path: page/p #: C/enableapp.page:12 msgid "You can choose which applications have effects applied through the switch next to its name. If you always want to apply effects to all applications take a look at Enable All Applications." msgstr "" #. (itstool) path: page/title #: C/effectsorder.page:10 msgid "Changing Effects Order" msgstr "" #. (itstool) path: page/p #: C/effectsorder.page:12 msgid "You can change the plugins order in the effects chain. Just click on the up and down arrows next to the plugin name. The first plugin from top to bottom is the first to receive the audio signal." msgstr "" #. (itstool) path: page/title #: C/userpresets.page:10 msgid "Creating and Importing User Presets" msgstr "" #. (itstool) path: page/p #: C/userpresets.page:12 msgid "You can save your own presets. Just add write a name and click on the add button. Presets can be imported clicking on the button to the left." msgstr "" #. (itstool) path: page/p #: C/userpresets.page:16 msgid "When you save a preset the current configuration of all plugins is saved to its file. This means you can have presets that combine the effects of different plugins." msgstr "" #. (itstool) path: page/p #: C/userpresets.page:21 msgid "You can also make a preset autoload when an input or output device is added to the system. Just click on the button with curved arrows while the desired device is selected as the system default device." msgstr "" #. (itstool) path: page/title #: C/advancedinfo.page:10 msgid "Advanced Information" msgstr "" #. (itstool) path: page/p #: C/advancedinfo.page:12 msgid "PulseEffects audio processing is composed by 3 main stages. Each of them needs a specific audio format and sampling rate. This information is show in the headerbar subtitle." msgstr "" #. (itstool) path: page/p #: C/advancedinfo.page:17 msgid "Another important information is the latency introduced by the audio processing. This the the last information shown. The displayed value is in milliseconds." msgstr "" #. (itstool) path: page/title #: C/saturated.page:10 msgid "Saturation Warning" msgstr "" #. (itstool) path: page/p #: C/saturated.page:12 msgid "If the audio signal coming out from the pipeline is too high very unpleasent noises will be produced. In case this happens the warning in the image above is shown so that the user can reduce the audio level using the limiter or the maximizer." msgstr "" #. (itstool) path: page/title #: C/autogain.page:5 msgid "Auto Gain" msgstr "" #. (itstool) path: page/p #: C/autogain.page:6 msgid "PulseEffects auto gain is based on the library libebur128. It changes the audio volume to a perceived loudness level that can be tweaked by the user." msgstr "" #. (itstool) path: title/em #: C/autogain.page:10 msgid "Target" msgstr "" #. (itstool) path: item/p #: C/autogain.page:12 msgid "Loudness level." msgstr "" #. (itstool) path: item/p #: C/autogain.page:18 msgid "Resets the auto gain history." msgstr "" #. (itstool) path: title/em #: C/autogain.page:22 msgid "Detect Silence" msgstr "" #. (itstool) path: item/p #: C/autogain.page:24 msgid "When the momentary loudness is below the relative we assume the audio material is passing through a brief moment of silence and no changes to the output gain are applied. If you do not want this behavior disable the silence detection." msgstr "" #. (itstool) path: title/em #: C/autogain.page:28 msgid "Use Geometric Mean" msgstr "" #. (itstool) path: item/p #: C/autogain.page:30 msgid "The estimated loudness is obtained from the geometric mean of the momentary, short-term and integrated loudness. When this option is disabled a weighted average is used." msgstr "" #. (itstool) path: title/em #: C/autogain.page:34 msgid "Momentary" msgstr "" #. (itstool) path: item/p #: C/autogain.page:36 msgid "Controls how much the momentary term will influence the loudness level estimation." msgstr "" #. (itstool) path: title/em #: C/autogain.page:40 msgid "Short Term" msgstr "" #. (itstool) path: item/p #: C/autogain.page:42 msgid "Controls how much the short term measure will influence the loudness level estimation." msgstr "" #. (itstool) path: title/em #: C/autogain.page:46 msgid "Integrated" msgstr "" #. (itstool) path: item/p #: C/autogain.page:48 msgid "Controls how much the integrated term will influence the loudness level estimation." msgstr "" #. (itstool) path: title/em #: C/autogain.page:52 msgid "Relative" msgstr "" #. (itstool) path: item/p #: C/autogain.page:54 msgid "Relative threshold. It is used to detect silence. Whenever the momentary term is below this threshold modifications to the output gain will be disabled." msgstr "" #. (itstool) path: title/em #: C/autogain.page:58 msgid "Loudness" msgstr "" #. (itstool) path: item/p #: C/autogain.page:60 msgid "Estimated input loudness. The difference between its value and the target loudness determines the output gain." msgstr "" #. (itstool) path: title/em #: C/autogain.page:64 msgid "Range" msgstr "" #. (itstool) path: item/p #: C/autogain.page:66 msgid "Loudness range. Indicates how large is the material dynamic range." msgstr "" #. (itstool) path: title/em #: C/autogain.page:70 msgid "Gain" msgstr "" #. (itstool) path: item/p #: C/autogain.page:72 msgid "Output gain value. The input signal will be multiplied by this correction gain to bring its loudness to the target value." msgstr "" #. (itstool) path: page/title #: C/blocklist.page:9 msgid "Applications Blocklist" msgstr "" #. (itstool) path: page/p #: C/blocklist.page:11 msgid "In the settings menu there is an option that allows the user to apply effects to all applications without the need to switch each one on individually. But there are cases where the user wants a specific application to be excluded from the \"Enable All\" functionality. This can be done by using a blocklist. Just add the application name exactly as it is shown in the \"Applications\" entry." msgstr "" #. (itstool) path: page/title #: C/guide_1.page:5 msgid "Enhancing your internal notebook speakers without using an equalizer" msgstr "" #. (itstool) path: page/p #: C/guide_1.page:6 msgid "This tutorial was written by Markus Schmidt schmidt@boomshop.net on November 2019" msgstr "" #. (itstool) path: section/title #: C/guide_1.page:8 msgid "Introduction" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:9 msgid "If you're a notebook user relying on your internal speakers and you - like me - own a model suffering from a tinny, clanging sound, PulseEffects is your salvation!" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:10 msgid "Commercial operating systems on laptops these days often come with software like Dolby Theatre and the like to enhance the sound of lousy notebook speakers to something more substantial and acoustically rich. Under Linux, PulseEffects will do the job for you, although, compared to the commercial pendants, there's some manual tweaking required until the community sets up a database with presets for common machines." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:11 msgid "This DSP software comes with everything needed to fatten the sound of your laptop speakers with a flexibility never found in other operating systems. Unfortunately the drawback of this flexibility is that average users will get lost in the sheer amount of possibilities. That's why this tutorial was created." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:14 msgid "Why no equalizer?" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:15 msgid "We will attack the problems one by one utilizing specific signal processors, deliberately renouncing equalizers. Equalizers are not of any help here but tend to make these kinds of problems even worse. This is because of the nature of this processor, but also because users tend to add to the signal (additive equalization) instead of trying to eliminate problems by removing from the signal (subtractive equalization) like it is usually done in the professional world." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:16 msgid "But even subtractive equalization wouldn't be of any help since the amplifiers and speakers in a notebook are not loud enough by default, so trying to eliminate problems this way leads to a quiet and still castrated sound. And raising the volume afterwards generally leads to distorted sounds and other problems because the system was at its limits beforehand and just fiddling with the frequency response doesn't help at all." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:19 msgid "Frequency Range" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:20 msgid "We'll have to talk about the frequency range. For a better understanding and because of the way we will solve our problems I'll break it down to five ranges which are:" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:23 msgid "Sub More or less vibrations up to something an ear can barely hear. Everything from 10Hz to ~40Hz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:29 msgid "Low or Bass Where the whole fundament of a signal is located. Low end of bass drums, bass synthesizers and bass guitars are found here. Movies occupy this range with explosions, rumbling waters, thunder, heavy gun fire and the like. Absolutely missing on notebooks and tablets. Technically speaking its ~60Hz - ~200Hz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:35 msgid "Low-Mid Hit a 0.5m³ cardboard box and you know what low-mids are. The \"punch\" of a sound is often located here, also the juice of snare drums and electric guitars. In Movies, roaring engines and shotguns are found in this range. We're talking about ~250Hz - ~750Hz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:41 msgid "High-Mid This is the ears most important and sensitive range. The main information of any kind of signal is located here. Human voice, picking of guitars, attack of drums, the colour of a synthesizer - everything carrying the main information of sound. Something around ~1kHz - ~4kHz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:47 msgid "Highs The air, the breathe, the sizzling, the splashing - this is the range of brightness. Everything around and above ~5kHz." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:55 msgid "Test Signal" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:56 msgid "You definitely need a good signal for this job. I decided to use Seeed: <_:link-1/>" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:60 msgid "It is quite snappy, has lots of well defined substance, clear and bright highs, present vocals, comes with a very balanced frequency response and is a great mix in combination with great mastering. Afterwards I tested against various movies and other stuff like talks, classical music and the like and was convinced of the result. Well produced, modern pop music (avoid the 80's and 90's stuff) is always a good test signal for this kind of job. Movies are way too dynamic, so is classical music, and they normally don't cover a steady, broad frequency range like this kind of signal." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:61 msgid "We will not be able to make the notebook bounce. What is the goal here is that everything contained in the mix gets audible in a well balanced manner and to gain a present, upfront, broad and hopefully rich sound." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:62 msgid "I assume you don't utilize a player or source which is able to produce levels above 0dB. I also assume you don't use e.g. video players volume bar to lower the volume of your source. This approach works well for defined, mixed and mastered sound sources like music, movies, tv and the like, played back at 100% volume in the player. Set the volume desired on your hardware via PulseAudio after the processing happened." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:69 msgid "Problems" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:70 msgid "Let's investigate the biggest problems first:" msgstr "" #. (itstool) path: item/title #: C/guide_1.page:73 msgid "Bass" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:76 msgid "The most obvious problem of notebook speakers is the tinny, pressure-free sound not reproducing any kind of low-end. This is because of the size of the membranes and the inadequate housing. Fortunately software can work around this issue at least a bit." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:79 msgid "Highs" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:82 msgid "Often the highs are quite bitchy, not representing the \"air\" but torturing the listener with searing sibliants. In order to fix that we need to equal this frequency range out." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:85 msgid "Overall Fequency Response" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:88 msgid "Normally the relation between the different frequency ranges low, low-mid, high-mid and height is quite out-of-bounds. This needs correction, although I promised a tutorial without EQ." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:91 msgid "Distortion" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:94 msgid "Because of the thin and neutered sound users tend to raise the volume or even add an equalizer to raise missing frequency ranges. This normally leads to digital distortions because every signal above 0 dB at the sound card DAC will go from occasional crackling up to a totally distorted sound." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:97 msgid "Dynamic range" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:100 msgid "With movies, but music aswell, those tiny transducers tend to wiping away low-level sounds but going ballistic on loud and bassy sounds. For this reason it's recommended to reduce the overall dynamic range so you don't need to press your ear onto the palm rest when the lady in the movie starts whispering." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:103 msgid "Stereo Image" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:106 msgid "The stereo base is quite narrow because of the positioning of the speakers inside the laptop which gives an impression of almost mono signals." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:111 msgid "Solutions" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:112 msgid "Let's start fixing the sound. The result will not come even close to something more substantial but at least we'll be able to get the best out of the physical boundaries of these transducers." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:113 msgid "Every parameter we are gonna set absolutely depends on your situation and the hardware you've got. Every notebook has its own frequency response and dynamic range so there's no panacea. But the audio signal processors, their order and their missions are well defined and reproducable." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:114 msgid "Don't care about clipping in the plugins level meters. The signal will be processed as 32bit numbers internally (check title bar) which gives a non-clipping overhead of hundrets of decibels. The only thing that shouldn't happen is that there's clipping when the signal hits the sound card DAC(Digital-to-Analog Converter), which would result in digital distortion." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:115 msgid "Let's head over to the signal chain:" msgstr "" #. (itstool) path: item/title #: C/guide_1.page:118 msgid "Limiter" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:121 msgid "We will start with the last signal processor being used. As I explained earlier, as soon as the signal hits the sound card DAC it has to be below 0dB, otherwise it will result in a distorted, messy sound." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:126 msgid "Drag the Limiter to the top of the list of processors and enable it. You will not hear any difference, which is what we expect. It will hit in as soon as we start messig up the signal with all the other processors. Set lookahead to 2ms, release to 8ms and oversampling to x4." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:127 msgid "A limiter monitors the signal in (nearly) realtime and detects peaks over a certain threshold, in our case 0 dB. As soon as a peak is detected, it starts lowering the volume constantly (within the lookahead) until the peak will be below threshold. Afterwards it raises the volume again (within release time frame) until it is back to normal. This way we avoid signals above threshold hitting the DAC without being noticed too much. If one tries to overdo limiting, it will definitely result in distortion and other side effects, but in our case it's just a fire-and-forget troubleshooter so we can concentrate on the results without trying to mess with levelling over and over again." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:128 msgid "Don't overdo things! This might render your overall sound eperience worse than before." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:129 msgid "Let's look at the real processing now." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:136 msgid "Filter" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:139 msgid "First of all we should remove frequencies that cannot be heard because even if the speakers are unable to reproduce them a lot of energy will be wasted in the process. This will lead to problems like not being able to use the full dynamic range and the introduction of digital and physical distortions." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:140 msgid "Drag the Filter to the top of the list (above the Limiter) and enable it. Set the type to 36 dB High Pass (this will cutt off everything below a frequency and will let everything above it pass) and the frequency to 50 Hz (which is definitely below your laptop's speakers abilities). Continuously raise the frequency by 10 Hz until you start hearing a change in the lower end of the audible signal, which should be around 130-160Hz. Subtract 10% (or 15 Hz) and set it as the Filters frequency. On my machine it is 145 Hz, since the signal started being affected at 160Hz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:141 msgid "What happened is that we removed everything the speakers can't reproduce at all, leaving a little bit of signal just below this frequency, which is quite important for the next step." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:144 msgid "Bass Enhancer" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:147 msgid "Let's grow some testicles to the signal." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:148 msgid "Drag the Bass Enhancer to the second position after the Filter plugin and enable it. Set the floor to 10Hz and forget about it (we already removed everything below the Filter plugin cuttoff frequency). Raise Harmony to 10 and start with a range of 200Hz. Now start raising the amount continuously until the bass takes over the whole energy, which is definitely too much. For me it works best at +24dB. Which is huge but my ThinkPad P1 has the worst speakers I've ever heard in a 2.8k € notebook." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:149 msgid "What happens is that the Bass Enhancer adds frequencies to the signal which weren't there before. While an equalizer only raises stuff which is already in the signal, a bass enhancer improves the lower end by adding distortion to a specific frequency range. This kind of distortion adds so called harmonics to the signal which is a multiple of existing frequencies. You can choose seamlessly between 2nd and 3rd harmonics, which means that a frequency of 100Hz produces a new signal of 200Hz/300Hz/400Hz/600Hz/800Hz/900Hz/... at varying (due to the harmonics setting) and constantly decreasing levels. This means we're effectively raising the lower range into something better reproducable. It doesn't add or raise the real fundament (so your trousers won't start to flutter), but makes more audible signals that have been swallowed by the hardware before." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:154 msgid "Your output meters will definitely start to flash red but you shouldn't care about it since it doesn't result in digital distortion of the overall signal as explained earlier." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:155 msgid "Later on, in order to refine the result, you should play with the amount parameter to define the level of bass and maybe with the range to define the upper end of our additional harmonics." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:158 msgid "Multiband Compressor" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:161 msgid "This is the most demanding step in the chain. Even professionals have great respect for this signal processor since it's absolutely able to destroy your signals big time. But let's be honest, we're consumers and no one will hear the difference between 100 ms and 200 ms attack time - even on notebook and tablet speakers. This means we can work with some reliable, well established defaults for the timing and frequency splits." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:162 msgid "The Multiband Compressor will solve several things for us. It will cut outstanding and annoying frequencies, lower the overall dynamic range and figure our overall frequency reponse. The latter is what most people try to achieve with an equalizer. Thing is equalizers aren't dynamic which will add to the problems instead of solving anything." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:163 msgid "Drag the Multiband Compressor to the third position, after the Bass Enhancer and before the Limiter." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:164 msgid "Since the Bass Enhancer really raised the energy and level of the signal, lower the Multiband Compressor input gain to -6 dB as a starting point. Let's set the split frequencies for the different bands to:" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:167 msgid "250 Hz" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:170 msgid "1250 Hz" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:173 msgid "5000 Hz" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:176 msgid "Afterwards let's set some defaults:" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:179 msgid "Low Band" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:182 #: C/guide_1.page:205 msgid "Attack: 150 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:185 msgid "Release: 300 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:188 msgid "Threshold: -16 dB" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:191 msgid "Ratio: 5:1" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:194 msgid "Knee: 12 dB" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:197 #: C/guide_1.page:220 #: C/guide_1.page:243 #: C/guide_1.page:266 msgid "Makeup: 4 dB" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:202 msgid "Low Mid Band" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:208 msgid "Release: 200 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:211 #: C/guide_1.page:234 #: C/guide_1.page:257 msgid "Threshold: -24 dB" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:214 #: C/guide_1.page:237 msgid "Ratio: 3:1" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:217 #: C/guide_1.page:240 #: C/guide_1.page:263 msgid "Knee: 9 dB" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:225 msgid "High Mid Band" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:228 msgid "Attack: 100 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:231 msgid "Release: 150 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:248 msgid "High Band" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:251 msgid "Attack: 80 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:254 msgid "Release: 120 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:260 msgid "Ratio: 4:1" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:271 msgid "These values should be a good starting point." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:272 msgid "A compressor lowers signal levels which appear above a certain threshold. It adds a simple multiplication to the signal defined by the ratio. If the threshold is set to -24 dB and ratio to 2:1, a signal of -12 dB would in fact become -18 dB. In this example one can then raise the makeup parameter to 6dB, since this is what went \"lost\". So first of all we're rendering loud signals quieter to then raise the overall volume, which leads to less dynamic range with quiet parts becoming more audible." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:273 msgid "The timing settings affect the \"speed\" of the compression. Attack means that a signal needs to go over threshold for this amount of time until the compressor reaches the full (negative) amplification. Release defines the amount of time the signal has to stay below threshold until the amplification is back to 1 again." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:274 msgid "A multi-band compressor splits the signal in various frequency ranges to work on them exclusively with dedicated compression stages. This means that a very loud bass drum would not affect a crash cymbal, since they are clearly located in different bands." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:275 msgid "Start playing around with these parameters:" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:278 msgid "Makeup This is probably most important setting in this concept. Makeup raises the signal after compression stage which means that it directly influences the perceived volume of every single band. Or in other words: this is your equalizer :) Raise makeup of single bands to make them louder or quieter. I ended up with Low/Low-Mid/High-Mid/High: 4 dB / 3 dB / 6 dB / 6 dB on my ThinkPad P1." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:286 msgid "Input Level Set it to -6 dB by default, I ended up at -3dB. What happens is that a higher input level pushes all bands of the compressor equally, leading to a allegedly louder sound (well, the loudness was raised in fact) without tweaking every single band manually. This reduces the overall dynamic range, raising quiet parts and squeezing loud parts even more." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:294 msgid "Stereo Tools" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:297 msgid "After figuring our overall sound let's look for some icing on the cake." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:298 msgid "Drag the Stereo Tools to the fourth position, after Multiband Compressor and before Limiter. This tool has a lot of functionality but we only need just a single parameter. Switch to the last tab \"Output\" and set the parameter stereo base to 0.25. That's it." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:299 msgid "Stereo base acts on the two channels. It adds inverted signals crossover-wise. This way one can bring a full stereo signal down to mono seamlessly (by going negative values, -1 is fully mono) but also raise the stereo base by choosing positive numbers. This setting has lots of side effects, so avoid overdoing it! One of the bigger problems is that it reduces the bass range due to different effects, which is something we definitely don't want here." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:304 msgid "Play with stereo base to spread the appearance of your sound to a nice, broad stage without loosing the center (vocals, snare drums, conversations in movies) or substance in the lower end. Most likely values between 0 and 0.5 will give some good results." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:309 msgid "Aftermath" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:310 msgid "Hopefully you ended up with a better sound than before. This signal processor chain is able to completely trash your sound if not done right but also can improve it to compete with some high class notebook speaker systems. All manufacturers put on the pants the same way and Dolby Theatre is no rocket science but just some presets on a presumably comparable set of signal processors set up in the presumably same way as this tutorial explained." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:315 msgid "When my notebook was new, I first ran the pre-installed Windows system in order to test if all hardware is working. Sound-wise I remembered the bad reputation of this machine in every test, so I tried some tunes on Youtube - and was quite convinced. After installing my Linux system the enthusiasm was totally gone - the sound turned into a squawking, pressureless something. It became clear that all problems of the internal speakers where due to the missing sound chips DSP driver. But fortunately Wellington Wallace spent his spare-time casting the most important Calf plug-ins for this job into something usable on consumers systems. Thanks a bunch for that, mate!" msgstr "" #. (itstool) path: section/title #: C/guide_1.page:318 msgid "tl;dr" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:319 msgid "Sorry dude, this isn't done by simply loading a preset, since the community is not Apple, Lenovo or Dell offering high quality Dolby Theatre drivers for your particular machine." msgstr "" #. (itstool) path: page/title #: C/rnnoise.page:9 msgid "Noise Reduction" msgstr "" #. (itstool) path: page/p #: C/rnnoise.page:10 msgid "Noise reduction is the process of removing noise from a signal." msgstr "" #. (itstool) path: page/p #: C/rnnoise.page:13 msgid "PulseEffects Noise Reduction is made on the library RNNoise which is based based on recurrent neural network, a class of artificial neural networks where connections between nodes form a directed graph along a temporal sequence. This allows it to exhibit temporal dynamic behavior." msgstr "" #. (itstool) path: page/p #: C/rnnoise.page:19 msgid "Standard RNNoise Model is used and custom models can be imported to perform different types of noise reduction." msgstr "" easyeffects-4.8.7/help/ru/000077500000000000000000000000001424023573300154145ustar00rootroot00000000000000easyeffects-4.8.7/help/ru/ru.po000066400000000000000000002720531424023573300164130ustar00rootroot00000000000000# PulseEffects' help Russian translation # This file is distributed under the same license as the PulseEffects package. # ⓒ Mikhail Novosyolov [mikhailnov] , 2018 # ⓒ Denis Goncharov, 2018 msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2020-11-22 18:51+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Mikhail Novosyolov \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Put one translator per line, in the form NAME , YEAR1, YEAR2 msgctxt "_" msgid "translator-credits" msgstr "" # Энхансер (он же Эксайтер) — это прибор, который генерирует высшие гармоники низких частот, благодаря чему повышается локализация низких частот и их «читаемость». # «Бас-Энхансер» или «Глубокий бас» #. (itstool) path: page/title #: C/bassenhancer.page:9 msgid "Bass Enhancer" msgstr "Усиление басов (бас-энхансер)" #. (itstool) path: page/p #: C/bassenhancer.page:10 msgid "" "The brain perceives the pitch of a tone not only by its fundamental " "frequency but also by the periodicity implied by the relationship between " "the higher harmonics. We may perceive the same pitch even if the fundamental " "frequency is missing from a tone." msgstr "" #. (itstool) path: page/p #: C/bassenhancer.page:16 msgid "PulseEffects uses the bass enhancer developed by Calf Studio." msgstr "" "PulseEffects использует плагин бас-энхансера (генерирует высшие гармоники " "низких частот, благодаря чему повышается локализация низких частот и их " "«читаемость»), разработанный Calf Studio." #. (itstool) path: title/em #: C/bassenhancer.page:22 C/exciter.page:21 C/reverb.page:40 msgid "Amount" msgstr "" #. (itstool) path: item/p #: C/bassenhancer.page:24 C/exciter.page:23 msgid "Amount of harmonics added to the original signal." msgstr "Уровень гармоник, добавленных к исходному сигналу" #. (itstool) path: title/em #: C/bassenhancer.page:30 C/exciter.page:29 msgid "Harmonics" msgstr "Гармоники" #. (itstool) path: item/p #: C/bassenhancer.page:32 C/exciter.page:31 msgid "Amount of newly created harmonics." msgstr "Количество вновь созданных гармоник" #. (itstool) path: title/em #: C/bassenhancer.page:38 C/exciter.page:37 msgid "Scope" msgstr "Диапазон частот" #. (itstool) path: item/p #: C/bassenhancer.page:40 C/exciter.page:39 msgid "The frequency harmonics are produced above." msgstr "Диапазон частот, для которых генерируются гармоники." #. (itstool) path: title/em #: C/bassenhancer.page:46 msgid "Floor(button)" msgstr "Нижний предел частоты (кнопка)" #. (itstool) path: item/p #: C/bassenhancer.page:48 msgid "Constrain the enhancement on the lower end." msgstr "" "Включение/выключение ограничения эффекта по нижнему пределу полосы частот." #. (itstool) path: title/em #: C/bassenhancer.page:54 msgid "Floor(value)" msgstr "Нижний предел частоты (значение)" #. (itstool) path: item/p #: C/bassenhancer.page:56 msgid "The frequency no harmonics are produced below." msgstr "" "Для частот ниже выставленной данным регулятором гармоники генерироваться не " "будут" #. (itstool) path: title/em #: C/bassenhancer.page:62 C/exciter.page:61 msgid "Blend Harmonics" msgstr "Смешение гармоник" #. (itstool) path: item/p #: C/bassenhancer.page:64 C/exciter.page:63 msgid "The \"colour\" (or octave) of the harmonics." msgstr "\"Цвет\" (или октава) гармоник" #. (itstool) path: title/em #: C/bassenhancer.page:70 C/compressor.page:97 C/exciter.page:69 msgid "Listen" msgstr "Прослушать" #. (itstool) path: item/p #: C/bassenhancer.page:72 C/exciter.page:71 msgid "Mute the original signal and listen to the harmonics exclusively." msgstr "Выключить исходный сигнал и прослушать только гармоники" #. (itstool) path: section/title #: C/bassenhancer.page:78 C/compressor.page:266 C/deesser.page:111 #: C/exciter.page:77 C/filter.page:47 C/gate.page:96 C/delay.page:33 #: C/limiter.page:100 C/loudness.page:56 C/multibandcompressor.page:128 #: C/multibandgate.page:136 C/reverb.page:97 C/stereotools.page:96 #: C/crossfeed.page:35 C/equalizer.page:251 C/pitch.page:87 C/webrtc.page:140 #: C/crystalizer.page:53 C/convolver.page:42 C/autogain.page:76 #: C/rnnoise.page:24 msgid "References" msgstr "Отклики" #. (itstool) path: page/title #. (itstool) path: section/title #: C/compressor.page:9 C/webrtc.page:84 msgid "Compressor" msgstr "Компрессор" #. (itstool) path: page/p #: C/compressor.page:10 msgid "A compressor is used to reduce the audio signal dynamic range." msgstr "" "Компрессор — это прибор, уменьшающий уровень сигнала на заданный " "пользователем коэффициент («Степень сжатия») при превышении сигналом уровня, " "заданного пользователем («Порог срабатывания»). Компрессор имеет возможность " "работы со среднеквадратичными (RMS) или пиковыми значениями сигнала (в " "зависимости от пользовательских настроек прибора)." #. (itstool) path: page/p #: C/compressor.page:13 #, fuzzy msgid "PulseEffects uses the compressor from Linux Studio Plugins." msgstr "" "PulseEffects использует плагин для усиления басов, разработанный Calf Studio." #. (itstool) path: title/em #: C/compressor.page:20 C/gate.page:20 C/multibandcompressor.page:20 #: C/multibandgate.page:20 msgid "Attack" msgstr "" #. (itstool) path: item/p #: C/compressor.page:22 msgid "" "Attack determines how many milliseconds (ms) it takes your compressor to " "apply a full dose of compression to your audio signal once it passes the " "threshold. If the signal peaks above the threshold and quickly returns to " "below the threshold, it may never receive a full dose of compression." msgstr "" #. (itstool) path: title/em #: C/compressor.page:31 C/gate.page:29 C/limiter.page:39 #: C/multibandcompressor.page:29 C/multibandgate.page:29 C/maximizer.page:44 msgid "Release" msgstr "" #. (itstool) path: item/p #: C/compressor.page:33 msgid "" "Release determines how many milliseconds (ms) it takes your compressor to " "stop attenuating gain once your audio signal drops below the threshold. A " "fast release will cause your compressor to stop attenuating gain quickly " "once the signal returns below the threshold. A slow release will cause your " "compressor to stop attenuating gain slowly once the signal returns below the " "threshold." msgstr "" #. (itstool) path: title/em #: C/compressor.page:43 C/deesser.page:26 C/gate.page:38 #: C/multibandcompressor.page:38 C/multibandgate.page:46 C/maximizer.page:27 msgid "Threshold" msgstr "Порог срабатывания" #. (itstool) path: item/p #: C/compressor.page:45 #, fuzzy msgid "If a signal surpass this level it will trigger the compression stage." msgstr "" "Уровень сигнала, выше которого «Компрессор» уменьшает уровень сигнала на " "заданный пользователем коэффициент («Степень сжатия»)." #. (itstool) path: title/em #: C/compressor.page:51 C/deesser.page:34 C/gate.page:46 #: C/multibandcompressor.page:46 C/multibandgate.page:54 msgid "Ratio" msgstr "Степень сжатия" #. (itstool) path: item/p #: C/compressor.page:53 C/deesser.page:36 C/gate.page:48 #: C/multibandcompressor.page:48 C/multibandgate.page:56 msgid "Set the ratio by which the signal will be reduced." msgstr "" #. (itstool) path: title/em #: C/compressor.page:59 C/gate.page:54 C/multibandcompressor.page:54 #: C/multibandgate.page:62 msgid "Knee" msgstr "Колено (излом)" #. (itstool) path: item/p #: C/compressor.page:61 C/gate.page:56 C/multibandcompressor.page:56 #: C/multibandgate.page:64 msgid "Controls how smooth is the entrance in the gain reduction phase." msgstr "" #. (itstool) path: title/em #: C/compressor.page:67 C/deesser.page:42 C/gate.page:62 #: C/multibandcompressor.page:62 C/multibandgate.page:70 msgid "Makeup" msgstr "Компенсирование" #. (itstool) path: item/p #: C/compressor.page:69 C/deesser.page:44 C/gate.page:64 #: C/multibandcompressor.page:64 C/multibandgate.page:72 msgid "It amplifies your signal after processing." msgstr "" #. (itstool) path: title/em #: C/compressor.page:75 #, fuzzy msgid "Compression Mode" msgstr "Компрессор" #. (itstool) path: item/p #: C/compressor.page:79 #, fuzzy msgid "" "Downward - Decreases the amplitude of the signal " "sections that are above the threshold." msgstr "Гармоники" #. (itstool) path: item/p #: C/compressor.page:84 #, fuzzy msgid "" "Upwards - Increases the amplitude of the signal " "sections that are below the threshold." msgstr "Гармоники" #. (itstool) path: section/title #: C/compressor.page:93 msgid "Sidechain" msgstr "" #. (itstool) path: item/p #: C/compressor.page:99 msgid "Allows to listen the processed sidechain signal." msgstr "" #. (itstool) path: title/em #: C/compressor.page:105 C/equalizer.page:99 msgid "Type" msgstr "" #. (itstool) path: item/p #: C/compressor.page:109 msgid "" "Feed-forward - The sidechain input is connected to " "compressor's input. More aggressive compression." msgstr "" #. (itstool) path: item/p #: C/compressor.page:115 msgid "" "Feed-back - The sidechain input is connected to " "compressor's output. Vintage-style more accurate compression." msgstr "" #. (itstool) path: title/em #: C/compressor.page:124 C/deesser.page:103 C/multibandcompressor.page:95 #: C/multibandgate.page:103 C/stereotools.page:38 C/equalizer.page:23 #: C/equalizer.page:146 C/webrtc.page:75 msgid "Mode" msgstr "Режим" #. (itstool) path: item/p #: C/compressor.page:128 #, fuzzy msgid "Peak - Measure signal's peak." msgstr "Гармоники" #. (itstool) path: item/p #: C/compressor.page:134 #, fuzzy msgid "RMS - Root mean square of the input signal." msgstr "Гармоники" #. (itstool) path: item/p #: C/compressor.page:140 msgid "" "Low-Pass - Input signal is processed by a low-pass " "filter." msgstr "" #. (itstool) path: item/p #: C/compressor.page:146 #, fuzzy msgid "" "Uniform - Input signal is processed by a uniform " "filter." msgstr "Гармоники" #. (itstool) path: title/em #: C/compressor.page:155 msgid "Source" msgstr "" #. (itstool) path: item/p #: C/compressor.page:159 msgid "" "Middle - Middle part of signal is used for " "sidechain processing." msgstr "" #. (itstool) path: item/p #: C/compressor.page:165 msgid "" "Side - Side part of signal is used for sidechain " "processing." msgstr "" #. (itstool) path: item/p #: C/compressor.page:171 msgid "" "Left - Only left channel is used for sidechain " "processing." msgstr "" #. (itstool) path: item/p #: C/compressor.page:177 msgid "" "Right - Only right channel is used for sidechain " "processing." msgstr "" #. (itstool) path: title/em #: C/compressor.page:186 msgid "Pre-amplification" msgstr "" #. (itstool) path: item/p #: C/compressor.page:188 msgid "Pre-amplification of the sidechain signal." msgstr "" #. (itstool) path: title/em #: C/compressor.page:194 msgid "Reactivity" msgstr "" #. (itstool) path: item/p #: C/compressor.page:196 msgid "Reactivity of the sidechain signal." msgstr "" #. (itstool) path: title/em #: C/compressor.page:202 C/limiter.page:30 msgid "Lookahead" msgstr "" #. (itstool) path: item/p #: C/compressor.page:204 msgid "Look-ahead time of the sidechain relative to the input signal." msgstr "" #. (itstool) path: section/title #: C/compressor.page:211 msgid "Advanced" msgstr "" #. (itstool) path: title/em #: C/compressor.page:215 msgid "Relative Release Threshold" msgstr "" #. (itstool) path: item/p #: C/compressor.page:217 msgid "" "Relative to the Attack Threshold that sets up the threshold of Release Time." msgstr "" #. (itstool) path: title/em #: C/compressor.page:223 #, fuzzy msgid "Boost Threshold" msgstr "Порог срабатывания" #. (itstool) path: item/p #: C/compressor.page:225 msgid "" "Related to upward compression mode only. It defines the threshold below " "which the constant amplification will be applied to the input signal. This " "prevents the compressor from applying infinite amplification to very quiet " "signals." msgstr "" #. (itstool) path: title/em #: C/compressor.page:233 msgid "High-pass Filter Mode" msgstr "" #. (itstool) path: item/p #: C/compressor.page:235 msgid "Sets the type of the high-pass filter applied to sidechain signal." msgstr "" #. (itstool) path: title/em #: C/compressor.page:241 msgid "High-pass Frequency" msgstr "" #. (itstool) path: item/p #: C/compressor.page:243 msgid "Sets the cut-off frequency of the high-pass filter." msgstr "" #. (itstool) path: title/em #: C/compressor.page:249 msgid "Low-pass Filter Mode" msgstr "" #. (itstool) path: item/p #: C/compressor.page:251 msgid "Sets the type of the low-pass filter applied to sidechain signal." msgstr "" #. (itstool) path: title/em #: C/compressor.page:257 msgid "Low-pass Frequency" msgstr "" #. (itstool) path: item/p #: C/compressor.page:259 msgid "Sets the cut-off frequency of the low-pass filter." msgstr "" #. (itstool) path: page/title #: C/deesser.page:9 msgid "Deesser" msgstr "Антишипение (деэссер)" #. (itstool) path: page/p #: C/deesser.page:10 msgid "" "PulseEffects uses the deesser developed by Calf Studio. A deesser is used to " "dynamically reduce high frequencies. The standard field of use is the " "reduction of \"sssss\" and \"shhhh\" in vocal tracks." msgstr "" #. (itstool) path: title/em #: C/deesser.page:18 msgid "Laxity" msgstr "Допуск на срабатывание" #. (itstool) path: item/p #: C/deesser.page:20 msgid "" "The reaction of the deesser. Higher values won't affect really short peaks." msgstr "" "Значение данного параметра позволяет пропускать без обработки короткие пики " "сигнала." #. (itstool) path: item/p #: C/deesser.page:28 C/multibandcompressor.page:40 C/multibandgate.page:48 msgid "If a signal rises above this level it will affect the gain reduction." msgstr "" "Уровень сигнала, выше которого «Компрессор» уменьшает уровень сигнала на " "заданный пользователем коэффициент («Степень сжатия»)." #. (itstool) path: title/em #: C/deesser.page:50 #, fuzzy msgid "F1 Split" msgstr "Частота раздела" #. (itstool) path: item/p #: C/deesser.page:52 msgid "" "The split frequency. All signals above this frequency will affect the gain " "reduction (and in split mode they are affected by the reduction too)." msgstr "" "Уровень сигнала в полосе частот выше «Частоты раздела» при работе «Деэссера» " "будет уменьшен" #. (itstool) path: title/em #: C/deesser.page:59 #, fuzzy msgid "F1 Gain" msgstr "Усиление" #. (itstool) path: item/p #: C/deesser.page:61 msgid "" "It shifts the volume of the higher band. In wideband mode it affects the " "sidechain. In split mode it also affects the processed high frequencies." msgstr "" "В широкополосном режиме данный параметр влияет на работу «Боковой цепи/" "(Sidechain)»,в режиме разделения по частоте — на обрабатываемые высокие " "частоты." #. (itstool) path: title/em #: C/deesser.page:68 #, fuzzy msgid "F2 Peak" msgstr "Пик" #. (itstool) path: item/p #: C/deesser.page:70 msgid "" "Center frequency of the bell filter. It allows a more precise selection of " "the sidechain signal." msgstr "" "Центр частоты фильтра типа «колокол». Позволяет произвести более точную " "настройкусигнала «Боковой цепи/(Sidechain)»" #. (itstool) path: title/em #: C/deesser.page:77 #, fuzzy msgid "F2 Level" msgstr "Уровень" #. (itstool) path: item/p #: C/deesser.page:79 msgid "Increase or decrease the frequencies around the center bell frequency." msgstr "" "Увеличение или уменьшение уровня частот вокруг центральной частоты фильтра " "типа «колокол»" #. (itstool) path: title/em #: C/deesser.page:85 #, fuzzy msgid "F2 Peak Q" msgstr "Добротность (Q)" #. (itstool) path: item/p #: C/deesser.page:87 msgid "" "Set the quality of the bell. Higher values will affect a narrower frequency " "range. Lower values will affect a wider band." msgstr "" "Добротность фильтра типа «колокол». Более высокое значение добротности " "означает, что фильтр типа «колокол» влияет на более узкую полосу частот " "вокруг центральной частоты фильтра,более низкое значение добротности — на " "более широкую полосу частот вокруг центральной частоты фильтра." #. (itstool) path: title/em #: C/deesser.page:94 C/gate.page:79 C/multibandcompressor.page:78 #: C/multibandgate.page:86 msgid "Detection" msgstr "" #. (itstool) path: item/p #: C/deesser.page:96 msgid "" "Choose if the deesser should take the signal peak for detection or the RMS " "value (it is smoother)." msgstr "" "Выберите, какой параметр сигнала управляет работой «Деэссера»:" "среднеквадратичный (RMS) или пиковый" #. (itstool) path: item/p #: C/deesser.page:105 msgid "Select your operation mode between wideband or split" msgstr "Выберите режим работы: «Широкополосный» или «С разделение по частоте»" #. (itstool) path: page/title #: C/exciter.page:9 msgid "Exciter" msgstr "" #. (itstool) path: page/p #: C/exciter.page:10 msgid "" "An exciter is used to enhance a signal by dynamic equalization, phase " "manipulation, harmonic synthesis of high frequency signals, and through the " "addition of subtle harmonic distortion." msgstr "" #. (itstool) path: page/p #: C/exciter.page:15 msgid "PulseEffects uses the exciter developed by Calf Studio." msgstr "" "PulseEffects использует плагин для усиления басов, разработанный Calf Studio." #. (itstool) path: title/em #: C/exciter.page:45 msgid "Ceiling(button)" msgstr "" #. (itstool) path: item/p #: C/exciter.page:47 msgid "Constrain the excitement on the upper end." msgstr "" #. (itstool) path: title/em #: C/exciter.page:53 msgid "Ceiling(value)" msgstr "" #. (itstool) path: item/p #: C/exciter.page:55 msgid "The frequency no harmonics are produced above." msgstr "" #. (itstool) path: page/title #: C/filter.page:9 msgid "Filter" msgstr "" #. (itstool) path: page/p #: C/filter.page:10 msgid "" "Audio filters can amplify (boost), pass or attenuate (cut) some frequency " "ranges." msgstr "" #. (itstool) path: page/p #: C/filter.page:14 msgid "" "PulseEffects uses the filter from Calf Studio. It can be used to remove " "defined parts of a frequency spectrum." msgstr "" #. (itstool) path: title/em #: C/filter.page:21 C/equalizer.page:224 msgid "Frequency" msgstr "" #. (itstool) path: item/p #: C/filter.page:23 msgid "The center or cut-off frequency of the filter." msgstr "" #. (itstool) path: title/em #: C/filter.page:29 msgid "Resonance" msgstr "" #. (itstool) path: item/p #: C/filter.page:31 msgid "" "Add an accentuation to the center frequency. When used on a bandpass the " "surrounding frequencies are decreased in level and the band gets more " "narrow, a bandreject is narrowed down to a thin needle." msgstr "" #. (itstool) path: title/em #: C/filter.page:39 msgid "Inertia" msgstr "" #. (itstool) path: item/p #: C/filter.page:41 msgid "Smooths the jumps between frequencies." msgstr "" #. (itstool) path: page/title #: C/gate.page:9 msgid "Gate" msgstr "" #. (itstool) path: page/p #: C/gate.page:10 msgid "" "Gates attenuate signals that register below the threshold. This kind of " "signal processing reduces disturbing noise between useful signals." msgstr "" #. (itstool) path: page/p #: C/gate.page:14 msgid "PulseEffects uses the gate developed by Calf Studio." msgstr "" "PulseEffects использует плагин для усиления басов, разработанный Calf Studio." #. (itstool) path: item/p #: C/gate.page:22 #, fuzzy msgid "" "Amount of milliseconds the signal has to rise above the threshold before " "gain reduction stops." msgstr "" "Время (в миллисекундах), в течение которого «Компрессор» не уменьшает " "уровень сигнала после достижения сигналом уровнявыше «Порога срабатывания»." #. (itstool) path: item/p #: C/gate.page:31 #, fuzzy msgid "" "Amount of milliseconds the signal has to fall below the threshold before the " "reduction is increased again." msgstr "" "Время (в миллисекундах), в течение которого «Компрессор» продолжает " "уменьшать уровень сигнала после достижения сигналом уровняниже «Порога " "срабатывания»." #. (itstool) path: item/p #: C/gate.page:40 #, fuzzy msgid "If a signal rises above this level the gain reduction is released." msgstr "" "Уровень сигнала, выше которого «Компрессор» уменьшает уровень сигнала на " "заданный пользователем коэффициент («Степень сжатия»)." #. (itstool) path: title/em #: C/gate.page:70 msgid "Stereo Link" msgstr "" #. (itstool) path: item/p #: C/gate.page:72 msgid "" "Choose if the gain reduction is affected by the louder channel or by the " "average level between the channels." msgstr "" #. (itstool) path: item/p #: C/gate.page:81 msgid "" "Choose if the gate should take the signal peak for detection or the RMS " "value (it is smoother)." msgstr "" #. (itstool) path: title/em #: C/gate.page:88 msgid "Gain Reduction" msgstr "" #. (itstool) path: item/p #: C/gate.page:90 msgid "The level of gain reduction when the signal is below the threshold." msgstr "" #. (itstool) path: page/title #: C/delay.page:9 msgid "Delay" msgstr "" #. (itstool) path: page/p #: C/delay.page:10 msgid "" "This plugin allows to add short delay to each individual channel of the " "stereo channel" msgstr "" #. (itstool) path: title/em #: C/delay.page:17 msgid "Left" msgstr "" #. (itstool) path: item/p #: C/delay.page:19 msgid "Left channel delay." msgstr "" #. (itstool) path: title/em #: C/delay.page:25 msgid "Right" msgstr "" #. (itstool) path: item/p #: C/delay.page:27 msgid "Right channel delay." msgstr "" #. (itstool) path: page/title #: C/index.page:8 msgid "PulseEffects" msgstr "" #. (itstool) path: page/p #: C/index.page:9 msgid "" "PulseEffects applies audio effects to Pulseaudio applications. You can apply " "effects to applications output or to your microphone before sending its " "audio to a recording application." msgstr "" #. (itstool) path: section/title #: C/index.page:11 msgid "Guides" msgstr "" #. (itstool) path: section/title #: C/index.page:14 msgid "User Interface" msgstr "" #. (itstool) path: section/title #: C/index.page:17 msgid "Plugins" msgstr "" #. (itstool) path: section/title #: C/index.page:20 msgid "Calibration" msgstr "" #. (itstool) path: page/title #. (itstool) path: title/em #: C/limiter.page:9 C/limiter.page:18 C/webrtc.page:88 msgid "Limiter" msgstr "" #. (itstool) path: page/p #: C/limiter.page:10 msgid "" "A limiter allows signals below a specified input power or level to pass " "unaffected while attenuating (lowering) the peaks of stronger signals that " "exceed this threshold." msgstr "" #. (itstool) path: page/p #: C/limiter.page:15 #, fuzzy msgid "PulseEffects uses the limiter developed by Calf Studio." msgstr "" "PulseEffects использует плагин для усиления басов, разработанный Calf Studio." #. (itstool) path: title/em #: C/limiter.page:22 msgid "Limit" msgstr "" #. (itstool) path: item/p #: C/limiter.page:24 msgid "No signal above this level will pass through the limiter." msgstr "" #. (itstool) path: item/p #: C/limiter.page:32 msgid "" "The Limiter will reach its attenuation level in this amount of time (output " "will be delayed two times this time)." msgstr "" #. (itstool) path: item/p #: C/limiter.page:41 msgid "Stop the attenuation after this amount of milliseconds." msgstr "" #. (itstool) path: title/em #: C/limiter.page:47 msgid "Oversampling" msgstr "" #. (itstool) path: item/p #: C/limiter.page:49 msgid "" "Increase the signal sampling to better detect the peaks. The signal is " "downsampled after processing." msgstr "" #. (itstool) path: title/em #: C/limiter.page:56 msgid "Automatic Smoothing Control" msgstr "" #. (itstool) path: item/p #: C/limiter.page:58 msgid "" "When gain reduction is always needed ASC takes care of releasing to an " "average reduction level rather than reaching a reduction of 0 in the release " "time." msgstr "" #. (itstool) path: title/em #: C/limiter.page:65 msgid "ASC Level" msgstr "" #. (itstool) path: item/p #: C/limiter.page:67 msgid "" "Select how much the release time is affected by ASC, 0 means nearly no " "changes in release time while 1 produces higher release times." msgstr "" #. (itstool) path: title/em #: C/limiter.page:74 msgid "Automatic Leveling" msgstr "" #. (itstool) path: item/p #: C/limiter.page:76 msgid "" "Raises the signal level adding the absolute value of the limit amount after " "the compression stage is performed. Enabling this feature the volume is " "automatically leveled at 0 db." msgstr "" #. (itstool) path: title/em #: C/limiter.page:84 msgid "Input Gain" msgstr "" #. (itstool) path: item/p #: C/limiter.page:86 #, fuzzy msgid "" "Raises or decrease the signal level before it is sent to the compression " "stage." msgstr "" "Уровень сигнала, выше которого «Компрессор» уменьшает уровень сигнала на " "заданный пользователем коэффициент («Степень сжатия»)." #. (itstool) path: title/em #: C/limiter.page:92 msgid "Output Gain" msgstr "" #. (itstool) path: item/p #: C/limiter.page:94 #, fuzzy msgid "Raises or decrease the signal level after the compression stage." msgstr "" "Уровень сигнала, выше которого «Компрессор» уменьшает уровень сигнала на " "заданный пользователем коэффициент («Степень сжатия»)." #. (itstool) path: page/title #: C/loudness.page:9 msgid "Loudness Compensator" msgstr "" #. (itstool) path: page/p #: C/loudness.page:10 msgid "" "PulseEffects uses the loudness compensator from Linux Studio Plugins which " "applies equal loudness contour corrections to the input signal. This is a " "measure of sound pressure level (SPL), over the frequency spectrum, for " "which a listener perceives a constant loudness when presented with pure " "steady tones." msgstr "" #. (itstool) path: title/em #: C/loudness.page:20 msgid "Input" msgstr "" #. (itstool) path: item/p #: C/loudness.page:22 msgid "" "The input gain settings, allows to adjust the level of the input signal to " "the desired level." msgstr "" #. (itstool) path: title/em #: C/loudness.page:29 msgid "Output" msgstr "" #. (itstool) path: item/p #: C/loudness.page:31 msgid "" "The output volume of the signal with applied equal loudness contour, " "controls the loudness of the 1 kHz pure sine wave." msgstr "" #. (itstool) path: title/em #: C/loudness.page:38 msgid "Standard" msgstr "" #. (itstool) path: item/p #: C/loudness.page:40 msgid "Allows to select different equal loudness contour standards." msgstr "" #. (itstool) path: title/em #: C/loudness.page:46 msgid "FFT Size" msgstr "" #. (itstool) path: item/p #: C/loudness.page:48 msgid "" "Allows to select size of the fast Fourier transform frame used for the " "processing. The larger FFT frame is, the more precize the curve is " "approximated and the more latency the plugin introduces" msgstr "" #. (itstool) path: page/title #: C/multibandcompressor.page:9 msgid "Multiband Compressor" msgstr "" #. (itstool) path: page/p #: C/multibandcompressor.page:10 msgid "" "This kind of compressor splits the signal in four different frequency " "ranges. These ranges are compressed separately and mixed together afterwards " "again." msgstr "" #. (itstool) path: page/p #: C/multibandcompressor.page:14 msgid "PulseEffects uses the multiband compressor developed by Calf Studio." msgstr "" "PulseEffects использует плагин для усиления басов, разработанный Calf Studio." #. (itstool) path: item/p #: C/multibandcompressor.page:22 C/multibandgate.page:22 msgid "" "Amount of milliseconds the signal has to rise above the threshold before " "gain reduction starts." msgstr "" "Время (в миллисекундах), в течение которого «Компрессор» не уменьшает " "уровень сигнала после достижения сигналом уровнявыше «Порога срабатывания»." #. (itstool) path: item/p #: C/multibandcompressor.page:31 C/multibandgate.page:31 msgid "" "Amount of milliseconds the signal has to fall below the threshold before the " "reduction is decreased again." msgstr "" "Время (в миллисекундах), в течение которого «Компрессор» продолжает " "уменьшать уровень сигнала после достижения сигналом уровняниже «Порога " "срабатывания»." #. (itstool) path: title/em #: C/multibandcompressor.page:70 C/multibandgate.page:78 C/crystalizer.page:37 msgid "Bypass" msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:72 C/multibandgate.page:80 msgid "Don't process anything, just bypass the signal of this strip." msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:80 msgid "" "Choose if the multibandcompressor should take the signal peak for detection " "or the RMS value (it is smoother)." msgstr "" #. (itstool) path: title/em #: C/multibandcompressor.page:87 C/multibandgate.page:95 C/equalizer.page:208 msgid "Solo" msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:89 C/multibandgate.page:97 msgid "Mute all strips not set to solo." msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:97 C/multibandgate.page:105 msgid "" "The crossover mode. You can choose between the fourth order Linkwitz-" "Riley(LR4) and the eighth order Linkwitz-Riley(LR8)." msgstr "" #. (itstool) path: title/em #: C/multibandcompressor.page:104 C/multibandgate.page:112 msgid "Split 1/2" msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:106 C/multibandgate.page:114 msgid "Frequency that separates the sub band and the low band." msgstr "" #. (itstool) path: title/em #: C/multibandcompressor.page:112 C/multibandgate.page:120 msgid "Split 2/3" msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:114 C/multibandgate.page:122 msgid "Frequency that separates the low band and the mid band." msgstr "" #. (itstool) path: title/em #: C/multibandcompressor.page:120 C/multibandgate.page:128 msgid "Split 3/4" msgstr "" #. (itstool) path: item/p #: C/multibandcompressor.page:122 C/multibandgate.page:130 msgid "Frequency that separates the mid band and the high band." msgstr "" #. (itstool) path: page/title #: C/multibandgate.page:9 msgid "Multiband Gate" msgstr "" #. (itstool) path: page/p #: C/multibandgate.page:10 msgid "" "This kind of gate splits the signal in four different frequency ranges. " "These ranges are processed separately and mixed together afterwards again." msgstr "" #. (itstool) path: page/p #: C/multibandgate.page:14 msgid "PulseEffects uses the multiband gate developed by Calf Studio." msgstr "" "PulseEffects использует плагин для усиления басов, разработанный Calf Studio." #. (itstool) path: title/em #: C/multibandgate.page:38 msgid "Reduction" msgstr "" #. (itstool) path: item/p #: C/multibandgate.page:40 msgid "The level of reduction in this strip." msgstr "" #. (itstool) path: item/p #: C/multibandgate.page:88 msgid "" "Choose if the multibandgate should take the signal peak for detection or the " "RMS value (it is smoother)." msgstr "" #. (itstool) path: page/title #: C/reverb.page:9 msgid "Reverberation" msgstr "" #. (itstool) path: page/p #: C/reverb.page:10 msgid "" "Reverberation, in psychoacoustics and acoustics, is a persistence of sound " "after the sound is produced. A reverberation, or reverb, is created when a " "sound or signal is reflected causing a large number of reflections to build " "up and then decay as the sound is absorbed by the surfaces of objects in the " "space. Reverberation plugins can be used to artificially produce this effect." msgstr "" #. (itstool) path: page/p #: C/reverb.page:17 msgid "PulseEffects uses the reverberation developed by Calf Studio." msgstr "" "PulseEffects использует плагин для усиления басов, разработанный Calf Studio." #. (itstool) path: title/em #: C/reverb.page:23 msgid "Pre Delay" msgstr "" #. (itstool) path: item/p #: C/reverb.page:25 msgid "" "Additional delay - corresponds to a distance between sound source and the " "nearest wall." msgstr "" #. (itstool) path: title/em #: C/reverb.page:32 msgid "Decay Time" msgstr "" #. (itstool) path: item/p #: C/reverb.page:34 msgid "Time it takes for reverberation to fade out." msgstr "" #. (itstool) path: item/p #: C/reverb.page:42 msgid "Amount of processed signal (reverberation) in the output." msgstr "" #. (itstool) path: title/em #: C/reverb.page:48 msgid "Dry" msgstr "" #. (itstool) path: item/p #: C/reverb.page:50 msgid "Amount of unprocessed signal in the output." msgstr "" #. (itstool) path: title/em #: C/reverb.page:56 msgid "Bass Cut" msgstr "" #. (itstool) path: item/p #: C/reverb.page:58 msgid "Removes low frequencies from the reverberation." msgstr "" #. (itstool) path: title/em #: C/reverb.page:64 msgid "Treble Cut" msgstr "" #. (itstool) path: item/p #: C/reverb.page:66 msgid "Removes high frequencies from the reverberation." msgstr "" #. (itstool) path: title/em #: C/reverb.page:72 msgid "Diffusion" msgstr "" #. (itstool) path: item/p #: C/reverb.page:74 msgid "Increase its value for less uniform reverberation." msgstr "" #. (itstool) path: title/em #: C/reverb.page:80 msgid "Room Size" msgstr "" #. (itstool) path: item/p #: C/reverb.page:82 msgid "" "Size of the space that simulated reverberation occurs in - determines times " "between reflections." msgstr "" #. (itstool) path: title/em #: C/reverb.page:89 msgid "High Frequency Damping" msgstr "" #. (itstool) path: item/p #: C/reverb.page:91 msgid "" "Cutoff reflections high frequencies - causes higher frequencies to decay " "faster." msgstr "" #. (itstool) path: page/title #: C/stereotools.page:9 msgid "Stereo Tools" msgstr "" #. (itstool) path: page/p #: C/stereotools.page:10 msgid "PulseEffects uses the stereo tools developed by Calf Studio." msgstr "" "PulseEffects использует плагин для усиления басов, разработанный Calf Studio." #. (itstool) path: title/em #: C/stereotools.page:16 msgid "Softclip" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:18 msgid "Do kind of analog distortion instead of harsh digital 0db clipping." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:24 msgid "Balance" msgstr "Баланс" #. (itstool) path: item/p #: C/stereotools.page:26 msgid "Set the balance between both channels." msgstr "Настройка баланса между обоими каналами." #. (itstool) path: title/em #: C/stereotools.page:32 msgid "S/C Level" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:40 msgid "Choose normal stereo behavior (LR - LR) or convert between MS and LR." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:46 msgid "Side Level" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:48 msgid "The level of the side signal." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:54 msgid "Side Balance" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:56 msgid "The balance of the side signal." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:62 msgid "Middle Level" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:64 msgid "Middle signal position in the stereo panorama." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:70 msgid "Delay L/R" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:72 msgid "" "Delay the left or the right channel (milliseconds). Negative values delay " "the left channel and positive values the right channel." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:79 msgid "Stereo Base" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:81 msgid "" "Set the stereo base of your material seamless between Mono and inverted " "Channels." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:88 msgid "Stereo Phase" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:90 msgid "Set the stereo phase of your material." msgstr "" #. (itstool) path: page/title #: C/maximizer.page:9 msgid "Maximizer" msgstr "" #. (itstool) path: page/p #: C/maximizer.page:10 msgid "" "Maximizer is a versatile plugin that can be tweaked to be a compressor, an " "amplifier and a limiter. It is basically controlled by only two parameters: " "ceiling and threshold. Threshold is a relative value representing the " "amplification of the signal while ceiling is the maximum allowed output peak " "level. Setting both values different from zero, the plugin will act as an " "upward compressor with a limiter on the ceiling level (overly amplified " "signal with ceiling set too low can result in distorted sound even without " "the presence of clipping). When only threshold is set equal to zero, it " "reduces the amplitude of the signal." msgstr "" #. (itstool) path: page/p #: C/maximizer.page:21 msgid "PulseEffects uses the maximizer from ZamAudio." msgstr "PulseEffects использует плагин для усиления басов из ZamAudio." #. (itstool) path: item/p #: C/maximizer.page:29 msgid "" "Relative value representing the amplification of the signal. Zero is no " "amplification. Lower values, higher amplification." msgstr "" #. (itstool) path: title/em #: C/maximizer.page:36 msgid "Ceiling" msgstr "" #. (itstool) path: item/p #: C/maximizer.page:38 msgid "Maximum allowed peak level of the output signal." msgstr "" #. (itstool) path: item/p #: C/maximizer.page:46 msgid "Set the release in milliseconds." msgstr "" #. (itstool) path: page/title #: C/crossfeed.page:9 msgid "Crossfeed" msgstr "" #. (itstool) path: page/p #: C/crossfeed.page:10 msgid "" "PulseEffects uses the crossfeed from GStreamer. This plugin is based on the " "bs2b library and can be used to improve headphone listening of stereo audio " "records. It does so by mixing the left and right channel in a way that " "simulates a stereo speaker setup while using headphones." msgstr "" #. (itstool) path: title/em #: C/crossfeed.page:19 msgid "Cutoff" msgstr "" #. (itstool) path: item/p #: C/crossfeed.page:21 msgid "Low-pass filter cutoff frequency." msgstr "" #. (itstool) path: title/em #: C/crossfeed.page:27 msgid "Feed" msgstr "" #. (itstool) path: item/p #: C/crossfeed.page:29 msgid "Amount of signal from a channel that is sent to the other." msgstr "" #. (itstool) path: page/title #: C/equalizer.page:9 msgid "Equalizer" msgstr "" #. (itstool) path: page/p #: C/equalizer.page:10 msgid "" "PulseEffects uses the parametric equalizer from Linux Studio Plugins. You " "can choose between 1 and 30 bands. You also can change the center frequency " "and the width of each band as needed. There are a few presets but at this " "moment all of them have only 10 bands. Presets with other number of bands " "may be added in the future." msgstr "" #. (itstool) path: section/title #: C/equalizer.page:18 msgid "Main Menu" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:27 msgid "" "IIR - Infinite Impulse Response filters, nonlinear " "minimal phase. In most cases does not add noticeable latency to output " "signal." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:33 msgid "" "FIR - Finite Impulse Response filters with linear " "phase, finite approximation of equalizer's impulse response. Adds noticeable " "latency to output signal." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:39 msgid "" "FFT - Fast Fourier Transform approximation of the " "frequency chart, linear phase. Adds noticeable latency to output signal." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:48 msgid "Bands" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:50 msgid "The number of equalizer bands." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:56 msgid "Split Channels" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:58 msgid "" "When this option is enabled it is possible to apply different equalizations " "to the left and the right channel." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:65 msgid "Flat Response" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:67 msgid "This function sets each band gain to 0." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:73 msgid "Calculate Frequencies" msgstr "Подсчитать частоты" #. (itstool) path: item/p #: C/equalizer.page:75 msgid "" "This function can be used to calculate the center frequencies and bandwidth " "of a graphic equalizer with the current number of selected bands. Useful " "when the user does not want the default number of 30 bands but has no idea " "about which frequencies and bandwidth he/she should choose." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:84 msgid "Reset Equalizer" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:86 msgid "Reset the equalizer to its default settings." msgstr "" #. (itstool) path: section/title #: C/equalizer.page:95 msgid "Band Menu" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:103 msgid "Off - Filter is not working (turned off)." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:108 msgid "Bell - Bell filter with smooth peak/recess." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:113 msgid "" "High-pass - High-pass filter with rejection of low " "frequencies." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:118 msgid "" "High-shelf - Shelving filter with adjustment of " "high frequency range." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:123 msgid "" "Low-pass - Low-pass filter with rejection of high " "frequencies." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:128 msgid "" "Low-shelf - Shelving filter with adjustment of low " "frequencies." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:133 msgid "" "Notch - Notch filter with full rejection of " "selected frequency." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:138 msgid "" "Resonance - Resonance filter wih sharp peak/recess." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:150 msgid "" "RLC - Very smooth filters based on similar " "cascades of RLC contours." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:155 msgid "" "BWC - Butterworth-Chebyshev-type-1 based filters. " "Does not affect Resonance and Notch filters." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:161 msgid "" "LRX - Linkwitz-Riley based filters. Does not " "affect Resonance and Notch filters." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:166 msgid "" "APO - Digital biquad filters derived from canonic " "analog biquad prototypes digitalized through Bilinear transform. These are " "textbook filters <_:link-1/> which are implemented as in the <_:link-2/> " "software." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:181 msgid "" "(BT) - Bilinear Z-transform is used for pole/zero " "mapping." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:186 msgid "" "(MT) - Matched Z-transform is used for pole/zero " "mapping." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:191 msgid "" "(DR) - Direct design is used to serve the digital " "filter coefficients directly in the digital domain without performing " "transforms." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:200 msgid "Slope" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:202 msgid "The slope of the filter characteristics." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:210 msgid "Makes this band the only one active." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:216 C/crystalizer.page:45 msgid "Mute" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:218 msgid "Mutes the band." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:226 msgid "Band center frequency." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:232 msgid "Width" msgstr "" #. (itstool) path: p/code #: C/equalizer.page:236 #, no-wrap msgid "width = frequency / quality" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:234 msgid "Bandwidth. Calculated as <_:code-1/>." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:241 msgid "Quality" msgstr "" #. (itstool) path: item/p #: C/equalizer.page:243 msgid "Quality factor." msgstr "" #. (itstool) path: page/title #: C/pitch.page:9 msgid "Pitch" msgstr "" #. (itstool) path: page/p #: C/pitch.page:10 msgid "" "Pitch shifting is a sound recording technique in which the original pitch of " "a sound is raised or lowered." msgstr "" #. (itstool) path: page/p #: C/pitch.page:14 msgid "PulseEffects uses the pitch shifter from RubberBand." msgstr "PulseEffects использует регулятор высоты тона из RubberBand." #. (itstool) path: title/em #: C/pitch.page:20 msgid "Faster" msgstr "" #. (itstool) path: title/em #: C/pitch.page:26 msgid "Preserve Formant" msgstr "" #. (itstool) path: item/p #: C/pitch.page:28 msgid "Enable formant preservation when pitch shifting." msgstr "" #. (itstool) path: title/em #: C/pitch.page:34 msgid "Cents" msgstr "" #. (itstool) path: item/p #: C/pitch.page:36 msgid "Number of cents the pitch will increased or decreased." msgstr "" #. (itstool) path: title/em #: C/pitch.page:42 msgid "Semitones" msgstr "" #. (itstool) path: item/p #: C/pitch.page:44 msgid "Number of semitones the pitch will increased or decreased." msgstr "" #. (itstool) path: title/em #: C/pitch.page:50 msgid "Octaves" msgstr "" #. (itstool) path: item/p #: C/pitch.page:52 msgid "Number of octaves the pitch will increased or decreased." msgstr "" #. (itstool) path: title/em #: C/pitch.page:58 msgid "Crispness" msgstr "" #. (itstool) path: item/p #: C/pitch.page:62 msgid "" "0 - Disable phase resynchronisation at transients, phase lamination and use " "longer processing window." msgstr "" #. (itstool) path: item/p #: C/pitch.page:68 msgid "" "1 - Use soft transient detector, disable phase lamination and use longer " "processing window." msgstr "" #. (itstool) path: item/p #: C/pitch.page:74 msgid "2 - Disable phase resynchronisation at transients and phase lamination." msgstr "" #. (itstool) path: item/p #: C/pitch.page:79 msgid "3 - Disable phase resynchronisation at transients." msgstr "" #. (itstool) path: page/title #: C/webrtc.page:9 msgid "Webrtc" msgstr "" #. (itstool) path: page/p #: C/webrtc.page:10 msgid "" "PulseEffects uses the webrtc from GStreamer. This plugin offers a voice " "enhancement filter based on WebRTC Audio Processing library. This library " "provides a broad variety of enhancement algorithms. This plugin tries to " "enable as many of those as possible. The currently enabled enhancements are " "High Pass Filter, Echo Canceller, Noise Suppression, Automatic Gain Control, " "and some extended filters." msgstr "" #. (itstool) path: section/title #: C/webrtc.page:19 msgid "Echo Canceller" msgstr "" #. (itstool) path: title/em #: C/webrtc.page:23 msgid "Extended Filter" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:25 msgid "Enabled or disables the extended filter." msgstr "" #. (itstool) path: title/em #: C/webrtc.page:31 msgid "High Pass Filter" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:33 msgid "Enables or disables the high pass filter." msgstr "" #. (itstool) path: title/em #: C/webrtc.page:39 msgid "Delay Agnostic" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:41 msgid "Enables or disables the delay agnostic mode." msgstr "" #. (itstool) path: title/em #: C/webrtc.page:47 C/webrtc.page:61 msgid "Suppression Level" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:49 msgid "" "Controls the aggressiveness of the suppressor. A higher level trades off " "double-talk performance for increased echo suppression." msgstr "" #. (itstool) path: section/title #: C/webrtc.page:57 msgid "Noise Suppressor" msgstr "Компрессор шума" #. (itstool) path: item/p #: C/webrtc.page:63 msgid "" "Controls the aggressiveness of the suppression. Increasing the level will " "reduce the noise level at the expense of a higher speech distortion." msgstr "" #. (itstool) path: section/title #: C/webrtc.page:71 msgid "Gain Controller" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:77 msgid "Controls the mode of the compression stage." msgstr "" #. (itstool) path: item/p #: C/webrtc.page:90 msgid "" "When enabled, the compression stage will hard limit the signal to the target " "level. Otherwise, the signal will be compressed but not limited above the " "target level." msgstr "" #. (itstool) path: title/em #: C/webrtc.page:98 msgid "Target Level" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:100 msgid "" "Sets the target peak level of the gain control in dBFS (decibels from " "digital full-scale)." msgstr "" #. (itstool) path: title/em #: C/webrtc.page:107 msgid "Maximum Gain" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:109 msgid "Sets the maximum gain the digital compression stage may apply." msgstr "" #. (itstool) path: section/title #: C/webrtc.page:116 msgid "Voice Detector" msgstr "" #. (itstool) path: title/em #: C/webrtc.page:120 msgid "Detection Likelihood" msgstr "Вероятность обнаружения" #. (itstool) path: item/p #: C/webrtc.page:122 msgid "" "Specifies the likelihood that a frame will be declared to contain voice." msgstr "" #. (itstool) path: title/em #: C/webrtc.page:130 msgid "Frame Size" msgstr "" #. (itstool) path: item/p #: C/webrtc.page:132 msgid "" "Sets the size of the frames in ms on which the VAD will operate. Larger " "frames will improve detection accuracy, but reduce the frequency of updates." msgstr "" #. (itstool) path: page/title #: C/crystalizer.page:9 msgid "Crystalizer" msgstr "" #. (itstool) path: page/p #: C/crystalizer.page:10 msgid "" "This plugin can be used to add a little of dynamic range to songs that were " "overly compressed" msgstr "" #. (itstool) path: title/em #: C/crystalizer.page:17 #, fuzzy msgid "Aggressive Mode" msgstr "Компрессор" #. (itstool) path: item/p #: C/crystalizer.page:19 msgid "" "When this option is enabled sample amplitude dependent amplification will be " "applied to the signal. Take care to not saturate the next plugin in the " "processing chain." msgstr "" #. (itstool) path: title/em #: C/crystalizer.page:27 msgid "Intensities" msgstr "" #. (itstool) path: item/p #: C/crystalizer.page:29 msgid "" "The higher the value the higher is the difference in magnitude between the " "loudest and the quietest sounds. You can set different intensities for each " "frequency band." msgstr "" #. (itstool) path: item/p #: C/crystalizer.page:39 msgid "" "When active the audio signal passing through this band will not be modified." msgstr "" #. (itstool) path: item/p #: C/crystalizer.page:47 msgid "Silence the band." msgstr "" #. (itstool) path: page/title #: C/convolver.page:9 msgid "Convolver" msgstr "" #. (itstool) path: page/p #: C/convolver.page:10 msgid "" "A convolver creates a simulation of an audio environment. It is based on the " "mathematical convolution operation, and uses a pre-recorded audio sample of " "the impulse response of the space being modeled." msgstr "" #. (itstool) path: title/em #: C/convolver.page:18 msgid "Import Impulse" msgstr "" #. (itstool) path: item/p #: C/convolver.page:20 msgid "" "Import an impulse response file to PulseEffects configuration directory." msgstr "" #. (itstool) path: title/em #: C/convolver.page:26 msgid "Stereo Width" msgstr "" #. (itstool) path: item/p #: C/convolver.page:28 msgid "Modify the impulse response stereo image width." msgstr "" #. (itstool) path: title/em #. (itstool) path: page/title #: C/convolver.page:34 C/spectrum.page:9 msgid "Spectrum" msgstr "" #. (itstool) path: item/p #: C/convolver.page:36 msgid "Visualize the frequency spectrum of the selected channel." msgstr "" #. (itstool) path: page/title #: C/settingsmenu.page:10 msgid "Settings Menu" msgstr "" #. (itstool) path: page/title #: C/general.page:9 msgid "General" msgstr "" #. (itstool) path: title/em #: C/general.page:13 msgid "Start Service at Login" msgstr "Автозапуск PulseEffects" #. (itstool) path: item/p #: C/general.page:15 msgid "" "Start PulseEffects as a service in the next login. This is done by creating " "an autostart file at ~/.config/autostart" msgstr "" #. (itstool) path: title/em #: C/general.page:23 msgid "Process All Outputs" msgstr "" #. (itstool) path: item/p #: C/general.page:25 msgid "" "Apply effects to the output of all audio applications. This will " "automatically switch on the per application switch that can be seen in the " "Applications entry." msgstr "" #. (itstool) path: title/em #: C/general.page:32 msgid "Process All Inputs" msgstr "" #. (itstool) path: item/p #: C/general.page:34 msgid "" "Apply effects to the input(microphone) of all audio applications. This will " "automatically switch on the per application switch that can be seen in the " "Applications entry." msgstr "" #. (itstool) path: title/em #: C/general.page:42 msgid "Use Dark Theme" msgstr "" #. (itstool) path: item/p #: C/general.page:44 msgid "Use the dark version of the GTK theme." msgstr "" #. (itstool) path: title/em #: C/general.page:50 C/autogain.page:16 msgid "Reset" msgstr "" #. (itstool) path: item/p #: C/general.page:52 msgid "" "Reset all parameters to their default values. This will reset the plugins " "too." msgstr "" #. (itstool) path: title/em #: C/general.page:58 msgid "Priority type" msgstr "" #. (itstool) path: item/p #: C/general.page:60 msgid "" "Choose between real time mode, niceness or none. This parameter allows to " "choose a higher priority for the threads that process audio." msgstr "" #. (itstool) path: title/em #: C/general.page:67 msgid "Niceness" msgstr "" #. (itstool) path: item/p #: C/general.page:69 msgid "Niceness value." msgstr "" #. (itstool) path: title/em #: C/general.page:75 msgid "Priority" msgstr "" #. (itstool) path: item/p #: C/general.page:77 msgid "Real time priority." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:13 msgid "Show" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:15 msgid "Hide or show the spectrum." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:21 msgid "Points" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:23 msgid "Number of points displayed." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:29 msgid "Height" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:31 msgid "Spectrum height." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:37 msgid "Scale" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:39 msgid "Bar height scaling factor." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:45 msgid "Exponent" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:47 msgid "Scaling factor exponent." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:53 msgid "Sampling" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:55 msgid "Spectrum update frequency." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:61 msgid "Line Width" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:63 msgid "Bar line width." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:69 msgid "Fill" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:71 msgid "Draw filled bars." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:77 msgid "Border" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:79 msgid "Show bar border." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:85 msgid "Use Custom Color" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:87 msgid "Use a user defined color or the GTK theme color." msgstr "" #. (itstool) path: title/em #: C/spectrum.page:93 msgid "Spectrum Color" msgstr "" #. (itstool) path: item/p #: C/spectrum.page:95 msgid "User defined color." msgstr "" #. (itstool) path: page/title #: C/pulseaudio.page:9 msgid "Pulseaudio" msgstr "" #. (itstool) path: page/p #: C/pulseaudio.page:10 msgid "" "PulseEffects has two GStreamer pipelines. One that applies effects for " "applications output and other that applies effects for microphone. Here the " "user can tweak a few advanced parameters for both pipelines." msgstr "" #. (itstool) path: title/em #: C/pulseaudio.page:18 msgid "Use Default" msgstr "" #. (itstool) path: item/p #: C/pulseaudio.page:20 msgid "Use default input or output device." msgstr "" #. (itstool) path: title/em #: C/pulseaudio.page:26 msgid "Buffer" msgstr "" #. (itstool) path: item/p #: C/pulseaudio.page:28 msgid "Pulsesrc plugin buffer size. It affects latency" msgstr "" #. (itstool) path: title/em #: C/pulseaudio.page:34 msgid "Latency" msgstr "" #. (itstool) path: item/p #: C/pulseaudio.page:36 msgid "Pulsesrc plugin latency value." msgstr "" #. (itstool) path: title/em #: C/pulseaudio.page:42 msgid "Block Size" msgstr "" #. (itstool) path: item/p #: C/pulseaudio.page:44 msgid "" "This controls the size of the audio buffer. Higher values increase latency " "but decrease cpu usage of a few plugins." msgstr "" #. (itstool) path: page/title #: C/testsignals.page:9 msgid "Test Signals" msgstr "" #. (itstool) path: page/p #: C/testsignals.page:10 msgid "" "These signals can be used to test the frequency response of your speakers." msgstr "" #. (itstool) path: page/title #: C/calibrationmic.page:9 msgid "Microphone" msgstr "" #. (itstool) path: page/p #: C/calibrationmic.page:10 msgid "" "If you have a microphone with reasonably flat response you can use it " "together with a pink noise test signal to estimate how flat is your audio " "setup frequency response." msgstr "" #. (itstool) path: title/em #: C/calibrationmic.page:17 msgid "Window" msgstr "" #. (itstool) path: item/p #: C/calibrationmic.page:19 msgid "" "The amount of time the microphone signal will be measured. Higher values " "will reduce noises." msgstr "" #. (itstool) path: title/em #: C/calibrationmic.page:26 msgid "Measure Noise" msgstr "" #. (itstool) path: item/p #: C/calibrationmic.page:28 msgid "" "Saves the last measurement to be used as background noise. Usually you would " "use this before turning on the pink noise." msgstr "" #. (itstool) path: title/em #: C/calibrationmic.page:35 msgid "Subtract Noise" msgstr "" #. (itstool) path: item/p #: C/calibrationmic.page:37 msgid "Subtract the stored background noise from the measurement." msgstr "" #. (itstool) path: page/title #: C/enableapp.page:10 msgid "Enable or Disable an Application" msgstr "" #. (itstool) path: page/p #: C/enableapp.page:12 msgid "" "You can choose which applications have effects applied through the switch " "next to its name. If you always want to apply effects to all applications " "take a look at Enable All Applications." msgstr "" #. (itstool) path: page/title #: C/effectsorder.page:10 msgid "Changing Effects Order" msgstr "" #. (itstool) path: page/p #: C/effectsorder.page:12 msgid "" "You can change the plugins order in the effects chain. Just click on the up " "and down arrows next to the plugin name. The first plugin from top to bottom " "is the first to receive the audio signal." msgstr "" #. (itstool) path: page/title #: C/userpresets.page:10 msgid "Creating and Importing User Presets" msgstr "" #. (itstool) path: page/p #: C/userpresets.page:12 msgid "" "You can save your own presets. Just add write a name and click on the add " "button. Presets can be imported clicking on the button to the left." msgstr "" #. (itstool) path: page/p #: C/userpresets.page:16 msgid "" "When you save a preset the current configuration of all plugins is saved to " "its file. This means you can have presets that combine the effects of " "different plugins." msgstr "" #. (itstool) path: page/p #: C/userpresets.page:21 msgid "" "You can also make a preset autoload when an input or output device is added " "to the system. Just click on the button with curved arrows while the desired " "device is selected as the system default device." msgstr "" #. (itstool) path: page/title #: C/advancedinfo.page:10 msgid "Advanced Information" msgstr "" #. (itstool) path: page/p #: C/advancedinfo.page:12 msgid "" "PulseEffects audio processing is composed by 3 main stages. Each of them " "needs a specific audio format and sampling rate. This information is show in " "the headerbar subtitle." msgstr "" #. (itstool) path: page/p #: C/advancedinfo.page:17 msgid "" "Another important information is the latency introduced by the audio " "processing. This the the last information shown. The displayed value is in " "milliseconds." msgstr "" #. (itstool) path: page/title #: C/saturated.page:10 msgid "Saturation Warning" msgstr "" #. (itstool) path: page/p #: C/saturated.page:12 msgid "" "If the audio signal coming out from the pipeline is too high very unpleasent " "noises will be produced. In case this happens the warning in the image above " "is shown so that the user can reduce the audio level using the limiter or " "the maximizer." msgstr "" #. (itstool) path: page/title #: C/autogain.page:5 msgid "Auto Gain" msgstr "" #. (itstool) path: page/p #: C/autogain.page:6 msgid "" "PulseEffects auto gain is based on the library libebur128. It changes the " "audio volume to a perceived loudness level that can be tweaked by the user." msgstr "" #. (itstool) path: title/em #: C/autogain.page:10 msgid "Target" msgstr "" #. (itstool) path: item/p #: C/autogain.page:12 msgid "Loudness level." msgstr "" #. (itstool) path: item/p #: C/autogain.page:18 msgid "Resets the auto gain history." msgstr "" #. (itstool) path: title/em #: C/autogain.page:22 msgid "Detect Silence" msgstr "" #. (itstool) path: item/p #: C/autogain.page:24 msgid "" "When the momentary loudness is below the relative we assume the audio " "material is passing through a brief moment of silence and no changes to the " "output gain are applied. If you do not want this behavior disable the " "silence detection." msgstr "" #. (itstool) path: title/em #: C/autogain.page:28 msgid "Use Geometric Mean" msgstr "" #. (itstool) path: item/p #: C/autogain.page:30 msgid "" "The estimated loudness is obtained from the geometric mean of the momentary, " "short-term and integrated loudness. When this option is disabled a weighted " "average is used." msgstr "" #. (itstool) path: title/em #: C/autogain.page:34 msgid "Momentary" msgstr "" #. (itstool) path: item/p #: C/autogain.page:36 msgid "" "Controls how much the momentary term will influence the loudness level " "estimation." msgstr "" #. (itstool) path: title/em #: C/autogain.page:40 msgid "Short Term" msgstr "" #. (itstool) path: item/p #: C/autogain.page:42 msgid "" "Controls how much the short term measure will influence the loudness level " "estimation." msgstr "" #. (itstool) path: title/em #: C/autogain.page:46 msgid "Integrated" msgstr "" #. (itstool) path: item/p #: C/autogain.page:48 msgid "" "Controls how much the integrated term will influence the loudness level " "estimation." msgstr "" #. (itstool) path: title/em #: C/autogain.page:52 msgid "Relative" msgstr "" #. (itstool) path: item/p #: C/autogain.page:54 msgid "" "Relative threshold. It is used to detect silence. Whenever the momentary " "term is below this threshold modifications to the output gain will be " "disabled." msgstr "" #. (itstool) path: title/em #: C/autogain.page:58 msgid "Loudness" msgstr "" #. (itstool) path: item/p #: C/autogain.page:60 msgid "" "Estimated input loudness. The difference between its value and the target " "loudness determines the output gain." msgstr "" #. (itstool) path: title/em #: C/autogain.page:64 msgid "Range" msgstr "" #. (itstool) path: item/p #: C/autogain.page:66 msgid "Loudness range. Indicates how large is the material dynamic range." msgstr "" #. (itstool) path: title/em #: C/autogain.page:70 msgid "Gain" msgstr "Усиление" #. (itstool) path: item/p #: C/autogain.page:72 msgid "" "Output gain value. The input signal will be multiplied by this correction " "gain to bring its loudness to the target value." msgstr "" #. (itstool) path: page/title #: C/blocklist.page:9 msgid "Applications Blocklist" msgstr "" #. (itstool) path: page/p #: C/blocklist.page:11 msgid "" "In the settings menu there is an option that allows the user to apply " "effects to all applications without the need to switch each one on " "individually. But there are cases where the user wants a specific " "application to be excluded from the \"Enable All\" functionality. This can " "be done by using a blocklist. Just add the application name exactly as it is " "shown in the \"Applications\" entry." msgstr "" #. (itstool) path: page/title #: C/guide_1.page:5 msgid "Enhancing your internal notebook speakers without using an equalizer" msgstr "" #. (itstool) path: page/p #: C/guide_1.page:6 msgid "" "This tutorial was written by Markus Schmidt schmidt@boomshop.net on November " "2019" msgstr "" #. (itstool) path: section/title #: C/guide_1.page:8 msgid "Introduction" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:9 msgid "" "If you're a notebook user relying on your internal speakers and you - like " "me - own a model suffering from a tinny, clanging sound, PulseEffects is " "your salvation!" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:10 msgid "" "Commercial operating systems on laptops these days often come with software " "like Dolby Theatre and the like to enhance the sound of lousy notebook " "speakers to something more substantial and acoustically rich. Under Linux, " "PulseEffects will do the job for you, although, compared to the commercial " "pendants, there's some manual tweaking required until the community sets up " "a database with presets for common machines." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:11 msgid "" "This DSP software comes with everything needed to fatten the sound of your " "laptop speakers with a flexibility never found in other operating systems. " "Unfortunately the drawback of this flexibility is that average users will " "get lost in the sheer amount of possibilities. That's why this tutorial was " "created." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:14 msgid "Why no equalizer?" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:15 msgid "" "We will attack the problems one by one utilizing specific signal processors, " "deliberately renouncing equalizers. Equalizers are not of any help here but " "tend to make these kinds of problems even worse. This is because of the " "nature of this processor, but also because users tend to add to the signal " "(additive equalization) instead of trying to eliminate problems by removing " "from the signal (subtractive equalization) like it is usually done in the " "professional world." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:16 msgid "" "But even subtractive equalization wouldn't be of any help since the " "amplifiers and speakers in a notebook are not loud enough by default, so " "trying to eliminate problems this way leads to a quiet and still castrated " "sound. And raising the volume afterwards generally leads to distorted sounds " "and other problems because the system was at its limits beforehand and just " "fiddling with the frequency response doesn't help at all." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:19 msgid "Frequency Range" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:20 msgid "" "We'll have to talk about the frequency range. For a better understanding and " "because of the way we will solve our problems I'll break it down to five " "ranges which are:" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:23 msgid "" "Sub More or less vibrations up to something an ear " "can barely hear. Everything from 10Hz to ~40Hz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:29 msgid "" "Low or Bass Where the whole fundament of a signal " "is located. Low end of bass drums, bass synthesizers and bass guitars are " "found here. Movies occupy this range with explosions, rumbling waters, " "thunder, heavy gun fire and the like. Absolutely missing on notebooks and " "tablets. Technically speaking its ~60Hz - ~200Hz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:35 msgid "" "Low-Mid Hit a 0.5m³ cardboard box and you know " "what low-mids are. The \"punch\" of a sound is often located here, also the " "juice of snare drums and electric guitars. In Movies, roaring engines and " "shotguns are found in this range. We're talking about ~250Hz - ~750Hz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:41 msgid "" "High-Mid This is the ears most important and " "sensitive range. The main information of any kind of signal is located here. " "Human voice, picking of guitars, attack of drums, the colour of a " "synthesizer - everything carrying the main information of sound. Something " "around ~1kHz - ~4kHz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:47 msgid "" "Highs The air, the breathe, the sizzling, the " "splashing - this is the range of brightness. Everything around and above " "~5kHz." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:55 msgid "Test Signal" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:56 msgid "" "You definitely need a good signal for this job. I decided to use Seeed: <_:" "link-1/>" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:60 msgid "" "It is quite snappy, has lots of well defined substance, clear and bright " "highs, present vocals, comes with a very balanced frequency response and is " "a great mix in combination with great mastering. Afterwards I tested against " "various movies and other stuff like talks, classical music and the like and " "was convinced of the result. Well produced, modern pop music (avoid the 80's " "and 90's stuff) is always a good test signal for this kind of job. Movies " "are way too dynamic, so is classical music, and they normally don't cover a " "steady, broad frequency range like this kind of signal." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:61 msgid "" "We will not be able to make the notebook bounce. What is the goal here is " "that everything contained in the mix gets audible in a well balanced manner " "and to gain a present, upfront, broad and hopefully rich sound." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:62 msgid "" "I assume you don't utilize a player or source which is able to produce " "levels above 0dB. I also assume you don't use e.g. video players volume bar " "to lower the volume of your source. This approach works well for defined, " "mixed and mastered sound sources like music, movies, tv and the like, played " "back at 100% volume in the player. Set the volume desired on your hardware " "via PulseAudio after the processing happened." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:69 msgid "Problems" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:70 msgid "Let's investigate the biggest problems first:" msgstr "" #. (itstool) path: item/title #: C/guide_1.page:73 #, fuzzy msgid "Bass" msgstr "Излом" #. (itstool) path: item/p #: C/guide_1.page:76 msgid "" "The most obvious problem of notebook speakers is the tinny, pressure-free " "sound not reproducing any kind of low-end. This is because of the size of " "the membranes and the inadequate housing. Fortunately software can work " "around this issue at least a bit." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:79 #, fuzzy msgid "Highs" msgstr "Отношение" #. (itstool) path: item/p #: C/guide_1.page:82 msgid "" "Often the highs are quite bitchy, not representing the \"air\" but torturing " "the listener with searing sibliants. In order to fix that we need to equal " "this frequency range out." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:85 #, fuzzy msgid "Overall Fequency Response" msgstr "Восстановление" #. (itstool) path: item/p #: C/guide_1.page:88 msgid "" "Normally the relation between the different frequency ranges low, low-mid, " "high-mid and height is quite out-of-bounds. This needs correction, although " "I promised a tutorial without EQ." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:91 #, fuzzy msgid "Distortion" msgstr "Отношение" #. (itstool) path: item/p #: C/guide_1.page:94 msgid "" "Because of the thin and neutered sound users tend to raise the volume or " "even add an equalizer to raise missing frequency ranges. This normally leads " "to digital distortions because every signal above 0 dB at the sound card DAC " "will go from occasional crackling up to a totally distorted sound." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:97 #, fuzzy msgid "Dynamic range" msgstr "Излом" #. (itstool) path: item/p #: C/guide_1.page:100 msgid "" "With movies, but music aswell, those tiny transducers tend to wiping away " "low-level sounds but going ballistic on loud and bassy sounds. For this " "reason it's recommended to reduce the overall dynamic range so you don't " "need to press your ear onto the palm rest when the lady in the movie starts " "whispering." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:103 #, fuzzy msgid "Stereo Image" msgstr "Излом" #. (itstool) path: item/p #: C/guide_1.page:106 msgid "" "The stereo base is quite narrow because of the positioning of the speakers " "inside the laptop which gives an impression of almost mono signals." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:111 msgid "Solutions" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:112 msgid "" "Let's start fixing the sound. The result will not come even close to " "something more substantial but at least we'll be able to get the best out of " "the physical boundaries of these transducers." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:113 msgid "" "Every parameter we are gonna set absolutely depends on your situation and " "the hardware you've got. Every notebook has its own frequency response and " "dynamic range so there's no panacea. But the audio signal processors, their " "order and their missions are well defined and reproducable." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:114 msgid "" "Don't care about clipping in the plugins level meters. The signal will be " "processed as 32bit numbers internally (check title bar) which gives a non-" "clipping overhead of hundrets of decibels. The only thing that shouldn't " "happen is that there's clipping when the signal hits the sound card " "DAC(Digital-to-Analog Converter), which would result in digital distortion." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:115 msgid "Let's head over to the signal chain:" msgstr "" #. (itstool) path: item/title #: C/guide_1.page:118 #, fuzzy msgid "Limiter" msgstr "Величина" #. (itstool) path: item/p #: C/guide_1.page:121 msgid "" "We will start with the last signal processor being " "used. As I explained earlier, as soon as the signal hits the sound card DAC " "it has to be below 0dB, otherwise it will result in a distorted, messy sound." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:126 msgid "" "Drag the Limiter to the top of the list of processors and enable it. You " "will not hear any difference, which is what we expect. It will hit in as " "soon as we start messig up the signal with all the other processors. Set " "lookahead to 2ms, release to 8ms and oversampling to x4." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:127 msgid "" "A limiter monitors the signal in (nearly) realtime and detects peaks over a " "certain threshold, in our case 0 dB. As soon as a peak is detected, it " "starts lowering the volume constantly (within the lookahead) until the peak " "will be below threshold. Afterwards it raises the volume again (within " "release time frame) until it is back to normal. This way we avoid signals " "above threshold hitting the DAC without being noticed too much. If one tries " "to overdo limiting, it will definitely result in distortion and other side " "effects, but in our case it's just a fire-and-forget troubleshooter so we " "can concentrate on the results without trying to mess with levelling over " "and over again." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:128 msgid "" "Don't overdo things! This might render your overall sound eperience worse " "than before." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:129 msgid "Let's look at the real processing now." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:136 #, fuzzy msgid "Filter" msgstr "Восстановление" #. (itstool) path: item/p #: C/guide_1.page:139 msgid "" "First of all we should remove frequencies that cannot be heard because even " "if the speakers are unable to reproduce them a lot of energy will be wasted " "in the process. This will lead to problems like not being able to use the " "full dynamic range and the introduction of digital and physical distortions." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:140 msgid "" "Drag the Filter to the top of the list (above the Limiter) and enable it. " "Set the type to 36 dB High Pass (this will cutt off everything below a " "frequency and will let everything above it pass) and the frequency to 50 Hz " "(which is definitely below your laptop's speakers abilities). Continuously " "raise the frequency by 10 Hz until you start hearing a change in the lower " "end of the audible signal, which should be around 130-160Hz. Subtract 10% " "(or 15 Hz) and set it as the Filters frequency. On my machine it is 145 Hz, " "since the signal started being affected at 160Hz." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:141 msgid "" "What happened is that we removed everything the speakers can't reproduce at " "all, leaving a little bit of signal just below this frequency, which is " "quite important for the next step." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:144 #, fuzzy msgid "Bass Enhancer" msgstr "Восстановление" #. (itstool) path: item/p #: C/guide_1.page:147 msgid "Let's grow some testicles to the signal." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:148 msgid "" "Drag the Bass Enhancer to the second position after the Filter plugin and " "enable it. Set the floor to 10Hz and forget about it (we already removed " "everything below the Filter plugin cuttoff frequency). Raise Harmony to 10 " "and start with a range of 200Hz. Now start raising the amount continuously " "until the bass takes over the whole energy, which is definitely too much. " "For me it works best at +24dB. Which is huge but my ThinkPad P1 has the " "worst speakers I've ever heard in a 2.8k € notebook." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:149 msgid "" "What happens is that the Bass Enhancer adds frequencies to the signal which " "weren't there before. While an equalizer only raises stuff which is already " "in the signal, a bass enhancer improves the lower end by adding distortion " "to a specific frequency range. This kind of distortion adds so called " "harmonics to the signal which is a multiple of existing frequencies. You can " "choose seamlessly between 2nd and 3rd harmonics, which means that a " "frequency of 100Hz produces a new signal of " "200Hz/300Hz/400Hz/600Hz/800Hz/900Hz/... at varying (due to the harmonics " "setting) and constantly decreasing levels. This means we're effectively " "raising the lower range into something better reproducable. It doesn't add " "or raise the real fundament (so your trousers " "won't start to flutter), but makes more audible signals that have been " "swallowed by the hardware before." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:154 msgid "" "Your output meters will definitely start to flash red but you shouldn't care " "about it since it doesn't result in digital distortion of the overall signal " "as explained earlier." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:155 msgid "" "Later on, in order to refine the result, you should play with the amount " "parameter to define the level of bass and maybe with the range to define the " "upper end of our additional harmonics." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:158 #, fuzzy msgid "Multiband Compressor" msgstr "Излом" #. (itstool) path: item/p #: C/guide_1.page:161 msgid "" "This is the most demanding step in the chain. Even professionals have great " "respect for this signal processor since it's absolutely able to destroy your " "signals big time. But let's be honest, we're consumers and no one will hear " "the difference between 100 ms and 200 ms attack time - even on notebook and " "tablet speakers. This means we can work with some reliable, well established " "defaults for the timing and frequency splits." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:162 msgid "" "The Multiband Compressor will solve several things for us. It will cut " "outstanding and annoying frequencies, lower the overall dynamic range and " "figure our overall frequency reponse. The latter is what most people try to " "achieve with an equalizer. Thing is equalizers aren't dynamic which will add " "to the problems instead of solving anything." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:163 msgid "" "Drag the Multiband Compressor to the third position, after the Bass Enhancer " "and before the Limiter." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:164 msgid "" "Since the Bass Enhancer really raised the energy and level of the signal, " "lower the Multiband Compressor input gain to -6 dB as a starting point. " "Let's set the split frequencies for the different bands to:" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:167 msgid "250 Hz" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:170 msgid "1250 Hz" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:173 msgid "5000 Hz" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:176 msgid "Afterwards let's set some defaults:" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:179 msgid "Low Band" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:182 C/guide_1.page:205 msgid "Attack: 150 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:185 msgid "Release: 300 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:188 #, fuzzy msgid "Threshold: -16 dB" msgstr "Порог срабатывания" #. (itstool) path: item/p #: C/guide_1.page:191 #, fuzzy msgid "Ratio: 5:1" msgstr "Степень сжатия" #. (itstool) path: item/p #: C/guide_1.page:194 msgid "Knee: 12 dB" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:197 C/guide_1.page:220 C/guide_1.page:243 C/guide_1.page:266 #, fuzzy msgid "Makeup: 4 dB" msgstr "Компенсирование" #. (itstool) path: item/p #: C/guide_1.page:202 msgid "Low Mid Band" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:208 msgid "Release: 200 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:211 C/guide_1.page:234 C/guide_1.page:257 #, fuzzy msgid "Threshold: -24 dB" msgstr "Порог срабатывания" #. (itstool) path: item/p #: C/guide_1.page:214 C/guide_1.page:237 #, fuzzy msgid "Ratio: 3:1" msgstr "Степень сжатия" #. (itstool) path: item/p #: C/guide_1.page:217 C/guide_1.page:240 C/guide_1.page:263 msgid "Knee: 9 dB" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:225 msgid "High Mid Band" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:228 msgid "Attack: 100 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:231 msgid "Release: 150 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:248 msgid "High Band" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:251 msgid "Attack: 80 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:254 msgid "Release: 120 ms" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:260 #, fuzzy msgid "Ratio: 4:1" msgstr "Степень сжатия" #. (itstool) path: item/p #: C/guide_1.page:271 msgid "These values should be a good starting point." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:272 msgid "" "A compressor lowers signal levels which appear above a certain threshold. It " "adds a simple multiplication to the signal defined by the ratio. If the " "threshold is set to -24 dB and ratio to 2:1, a signal of -12 dB would in " "fact become -18 dB. In this example one can then raise the makeup parameter " "to 6dB, since this is what went \"lost\". So first of all we're rendering " "loud signals quieter to then raise the overall volume, which leads to less " "dynamic range with quiet parts becoming more audible." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:273 msgid "" "The timing settings affect the \"speed\" of the compression. Attack means " "that a signal needs to go over threshold for this amount of time until the " "compressor reaches the full (negative) amplification. Release defines the " "amount of time the signal has to stay below threshold until the " "amplification is back to 1 again." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:274 msgid "" "A multi-band compressor splits the signal in various frequency ranges to " "work on them exclusively with dedicated compression stages. This means that " "a very loud bass drum would not affect a crash cymbal, since they are " "clearly located in different bands." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:275 msgid "Start playing around with these parameters:" msgstr "" #. (itstool) path: item/p #: C/guide_1.page:278 msgid "" "Makeup This is probably most important setting in " "this concept. Makeup raises the signal after compression stage which means " "that it directly influences the perceived volume of every single band. Or in " "other words: this is your equalizer :) Raise " "makeup of single bands to make them louder or quieter. I ended up with Low/" "Low-Mid/High-Mid/High: 4 dB / 3 dB / 6 dB / 6 dB on my ThinkPad P1." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:286 msgid "" "Input Level Set it to -6 dB by default, I ended up " "at -3dB. What happens is that a higher input level pushes all bands of the " "compressor equally, leading to a allegedly louder sound (well, the loudness " "was raised in fact) without tweaking every single band manually. This " "reduces the overall dynamic range, raising quiet parts and squeezing loud " "parts even more." msgstr "" #. (itstool) path: item/title #: C/guide_1.page:294 #, fuzzy msgid "Stereo Tools" msgstr "Излом" #. (itstool) path: item/p #: C/guide_1.page:297 msgid "After figuring our overall sound let's look for some icing on the cake." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:298 msgid "" "Drag the Stereo Tools to the fourth position, after Multiband Compressor and " "before Limiter. This tool has a lot of functionality but we only need just a " "single parameter. Switch to the last tab \"Output\" and set the parameter " "stereo base to 0.25. That's it." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:299 msgid "" "Stereo base acts on the two channels. It adds inverted signals crossover-" "wise. This way one can bring a full stereo signal down to mono seamlessly " "(by going negative values, -1 is fully mono) but also raise the stereo base " "by choosing positive numbers. This setting has lots of side effects, so " "avoid overdoing it! One of the bigger problems is that it reduces the bass " "range due to different effects, which is something we definitely don't want here." msgstr "" #. (itstool) path: item/p #: C/guide_1.page:304 msgid "" "Play with stereo base to spread the appearance of your sound to a nice, " "broad stage without loosing the center (vocals, snare drums, conversations " "in movies) or substance in the lower end. Most likely values between 0 and " "0.5 will give some good results." msgstr "" #. (itstool) path: section/title #: C/guide_1.page:309 msgid "Aftermath" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:310 msgid "" "Hopefully you ended up with a better sound than " "before. This signal processor chain is able to completely trash your sound " "if not done right but also can improve it to compete with some high class " "notebook speaker systems. All manufacturers put on the pants the same way " "and Dolby Theatre is no rocket science but just some presets on a presumably " "comparable set of signal processors set up in the presumably same way as " "this tutorial explained." msgstr "" #. (itstool) path: section/p #: C/guide_1.page:315 msgid "" "When my notebook was new, I first ran the pre-installed Windows system in " "order to test if all hardware is working. Sound-wise I remembered the bad " "reputation of this machine in every test, so I tried some tunes on Youtube - " "and was quite convinced. After installing my Linux system the enthusiasm was " "totally gone - the sound turned into a squawking, pressureless something. It " "became clear that all problems of the internal speakers where due to the " "missing sound chips DSP driver. But fortunately Wellington Wallace spent his " "spare-time casting the most important Calf plug-ins for this job into " "something usable on consumers systems. Thanks a bunch for that, mate!" msgstr "" #. (itstool) path: section/title #: C/guide_1.page:318 msgid "tl;dr" msgstr "" #. (itstool) path: section/p #: C/guide_1.page:319 msgid "" "Sorry dude, this isn't done by simply loading a preset, since the community " "is not Apple, Lenovo or Dell offering high quality Dolby Theatre drivers for " "your particular machine." msgstr "" #. (itstool) path: page/title #: C/rnnoise.page:9 msgid "Noise Reduction" msgstr "" #. (itstool) path: page/p #: C/rnnoise.page:10 msgid "Noise reduction is the process of removing noise from a signal." msgstr "" #. (itstool) path: page/p #: C/rnnoise.page:13 msgid "" "PulseEffects Noise Reduction is made on the library RNNoise which is based " "based on recurrent neural network, a class of artificial neural networks " "where connections between nodes form a directed graph along a temporal " "sequence. This allows it to exhibit temporal dynamic behavior." msgstr "" #. (itstool) path: page/p #: C/rnnoise.page:19 msgid "" "Standard RNNoise Model is used and custom models can be imported to perform " "different types of noise reduction." msgstr "" #, fuzzy #~ msgid "Reference Signal" #~ msgstr "Отклики" easyeffects-4.8.7/help/tr/000077500000000000000000000000001424023573300154135ustar00rootroot00000000000000easyeffects-4.8.7/help/tr/tr.po000066400000000000000000002106431424023573300164060ustar00rootroot00000000000000# PulseEffects Yardım Dosyası Türkçe Çevirisi # Serdar Sağlam , 2019. # msgid "" msgstr "" "Project-Id-Version: pulseeffects-help\n" "POT-Creation-Date: 2019-02-22 21:08-0300\n" "PO-Revision-Date: 2019-03-11 18:39+0300\n" "Language-Team: Serdar Sağlam \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.1\n" "Last-Translator: Serdar Sağlam \n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: tr\n" #. Put one translator per line, in the form NAME , YEAR1, YEAR2 msgctxt "_" msgid "translator-credits" msgstr "Serdar Sağlam , 2019" #. (itstool) path: page/title #: C/bassenhancer.page:9 msgid "Bass Enhancer" msgstr "Bas Yükseltici" #. (itstool) path: page/p #: C/bassenhancer.page:10 msgid "" "The brain perceives the pitch of a tone not only by its fundamental " "frequency but also by the periodicity implied by the relationship between " "the higher harmonics. We may perceive the same pitch even if the fundamental " "frequency is missing from a tone." msgstr "" "Beyin bir tonun perdesini sadece temel frekansı ile değil aynı zamanda " "yüksek harmonikler arasındaki ilişkinin ima ettiği periyodiklik ile algılar. " "Temel frekans bir tondan eksik olsa bile aynı perdeyi algılayabiliriz." #. (itstool) path: page/p #: C/bassenhancer.page:16 msgid "PulseEffects uses the bass enhancer developed by Calf Studio." msgstr "" "PulseEffects, Calf Studio tarafından geliştirilen bas geliştiriciyi kullanır." #. (itstool) path: title/em #: C/bassenhancer.page:22 C/exciter.page:21 C/reverb.page:40 msgid "Amount" msgstr "Miktar" #. (itstool) path: item/p #: C/bassenhancer.page:24 C/exciter.page:23 msgid "Amount of harmonics added to the original signal." msgstr "Orijinal sinyale eklenen harmonik miktarı." #. (itstool) path: title/em #: C/bassenhancer.page:30 C/exciter.page:29 msgid "Harmonics" msgstr "Harmonikler" #. (itstool) path: item/p #: C/bassenhancer.page:32 C/exciter.page:31 msgid "Amount of newly created harmonics." msgstr "Yeni oluşturulan harmoniklerin miktarı." #. (itstool) path: title/em #: C/bassenhancer.page:38 C/exciter.page:37 msgid "Scope" msgstr "Kapsam" #. (itstool) path: item/p #: C/bassenhancer.page:40 C/exciter.page:39 msgid "The frequency harmonics are produced above." msgstr "Frekans harmonikleri yukarıda üretilmiştir." #. (itstool) path: title/em #: C/bassenhancer.page:46 msgid "Floor(button)" msgstr "Zemin(düğme)" #. (itstool) path: item/p #: C/bassenhancer.page:48 msgid "Constrain the enhancement on the lower end." msgstr "Geliştirmeyi alt uçta sınırlayın." #. (itstool) path: title/em #: C/bassenhancer.page:54 msgid "Floor(value)" msgstr "Zemin(değer)" #. (itstool) path: item/p #: C/bassenhancer.page:56 msgid "The frequency no harmonics are produced below." msgstr "Hiçbir harmonik frekansı aşağıda üretilmez." #. (itstool) path: title/em #: C/bassenhancer.page:62 C/exciter.page:61 msgid "Blend Harmonics" msgstr "Harmonik Karışımları" #. (itstool) path: item/p #: C/bassenhancer.page:64 C/exciter.page:63 msgid "The \"colour\" (or octave) of the harmonics." msgstr "Harmoniklerin (\"colour\" rengi) (veya oktavı)." #. (itstool) path: title/em #: C/bassenhancer.page:70 C/compressor.page:92 C/exciter.page:69 msgid "Listen" msgstr "Liste" #. (itstool) path: item/p #: C/bassenhancer.page:72 C/exciter.page:71 msgid "Mute the original signal and listen to the harmonics exclusively." msgstr "Orijinal sinyali susturun ve sadece harmonikleri dinleyin." #. (itstool) path: section/title #: C/bassenhancer.page:78 C/compressor.page:206 C/deesser.page:111 #: C/exciter.page:77 C/filter.page:47 C/gate.page:96 C/delay.page:33 #: C/limiter.page:82 C/loudness.page:44 C/multibandcompressor.page:128 #: C/multibandgate.page:136 C/reverb.page:97 C/stereotools.page:96 #: C/crossfeed.page:35 C/equalizer.page:230 C/pitch.page:87 C/webrtc.page:140 #: C/crystalizer.page:45 C/convolver.page:42 C/autogain.page:87 msgid "References" msgstr "Atıflar" #. (itstool) path: page/title #. (itstool) path: section/title #: C/compressor.page:9 C/webrtc.page:84 msgid "Compressor" msgstr "Sıkıştırıcı" #. (itstool) path: page/p #: C/compressor.page:10 msgid "A compressor is used to reduce the audio signal dynamic range." msgstr "" "Ses sinyali dinamik aralığını azaltmak için bir sıkıştırıcı kullanılır." #. (itstool) path: page/p #: C/compressor.page:13 msgid "PulseEffects uses the compressor from Linux Studio Plugins." msgstr "" "PulseEffects, Linux Studio Eklentilerinden gelen sıkıştırıcıyı kullanır." #. (itstool) path: title/em #: C/compressor.page:20 C/gate.page:20 C/multibandcompressor.page:20 #: C/multibandgate.page:20 msgid "Attack" msgstr "Atak" #. (itstool) path: item/p #: C/compressor.page:22 C/gate.page:22 C/multibandcompressor.page:22 #: C/multibandgate.page:22 msgid "" "Amount of milliseconds the signal has to rise above the threshold before " "gain reduction starts." msgstr "" "Milisaniye miktarı, kazanım azaltma başlamadan önce sinyalin eşiğin üstüne " "çıkması gerekiyor." #. (itstool) path: title/em #: C/compressor.page:29 C/gate.page:29 C/limiter.page:47 #: C/multibandcompressor.page:29 C/multibandgate.page:29 C/maximizer.page:37 msgid "Release" msgstr "Bırak" #. (itstool) path: item/p #: C/compressor.page:31 C/gate.page:31 C/multibandcompressor.page:31 #: C/multibandgate.page:31 msgid "" "Amount of milliseconds the signal has to fall below the threshold before the " "reduction is decreased again." msgstr "" "Milisaniye miktarı, azaltma tekrar azaltılmadan önce sinyalin eşiğin altına " "düşmesi gerekir." #. (itstool) path: title/em #: C/compressor.page:38 C/deesser.page:26 C/gate.page:38 #: C/multibandcompressor.page:38 C/multibandgate.page:46 C/maximizer.page:21 msgid "Threshold" msgstr "Eşik" #. (itstool) path: item/p #: C/compressor.page:40 C/deesser.page:28 C/gate.page:40 #: C/multibandcompressor.page:40 C/multibandgate.page:48 C/maximizer.page:23 msgid "If a signal rises above this level it will affect the gain reduction." msgstr "Bir sinyal bu seviyenin üzerine çıkarsa, kazanç azalmasını etkiler." #. (itstool) path: title/em #: C/compressor.page:46 C/deesser.page:34 C/gate.page:46 #: C/multibandcompressor.page:46 C/multibandgate.page:54 msgid "Ratio" msgstr "Oran" #. (itstool) path: item/p #: C/compressor.page:48 C/deesser.page:36 C/gate.page:48 #: C/multibandcompressor.page:48 C/multibandgate.page:56 msgid "Set the ratio by which the signal will be reduced." msgstr "Sinyalin azaltılacağı oranı ayarlayın." #. (itstool) path: title/em #: C/compressor.page:54 C/gate.page:54 C/multibandcompressor.page:54 #: C/multibandgate.page:62 msgid "Knee" msgstr "Oynak" #. (itstool) path: item/p #: C/compressor.page:56 C/gate.page:56 C/multibandcompressor.page:56 #: C/multibandgate.page:64 msgid "Controls how smooth is the entrance in the gain reduction phase." msgstr "" "Kazanç azaltma aşamasındaki girişin ne kadar yumuşak olduğunu kontrol eder." #. (itstool) path: title/em #: C/compressor.page:62 C/deesser.page:42 C/gate.page:62 #: C/multibandcompressor.page:62 C/multibandgate.page:70 msgid "Makeup" msgstr "Süs" #. (itstool) path: item/p #: C/compressor.page:64 C/deesser.page:44 C/gate.page:64 #: C/multibandcompressor.page:64 C/multibandgate.page:72 msgid "It amplifies your signal after processing." msgstr "İşlemden sonra sinyalinizi yükseltir." #. (itstool) path: title/em #: C/compressor.page:70 msgid "Compression Mode" msgstr "Sıkıştırma Kipi" #. (itstool) path: item/p #: C/compressor.page:74 msgid "" "Downward - Decreases the amplitude of the signal " "sections that are above the threshold." msgstr "" "Aşağı Doğru - Eşiğin üzerindeki sinyal " "bölümlerinin genliğini azaltır." #. (itstool) path: item/p #: C/compressor.page:79 msgid "" "Upwards - Increases the amplitude of the signal " "sections that are below the threshold." msgstr "" "Yukarı Doğru - Eşiğin altındaki sinyal " "bölümlerinin genliğini arttırır." #. (itstool) path: section/title #: C/compressor.page:88 msgid "Sidechain" msgstr "Yanzincir" #. (itstool) path: item/p #: C/compressor.page:94 msgid "Allows to listen the processed sidechain signal." msgstr "İşlenmiş yan zincir sinyalini dinlemenizi sağlar." #. (itstool) path: title/em #: C/compressor.page:100 C/equalizer.page:99 msgid "Type" msgstr "Tür" #. (itstool) path: item/p #: C/compressor.page:104 msgid "" "Feed-forward - The sidechain input is connected to " "compressor's input. More aggressive compression." msgstr "" #. (itstool) path: item/p #: C/compressor.page:110 msgid "" "Feed-back - The sidechain input is connected to " "compressor's output. Vintage-style more accurate compression." msgstr "" #. (itstool) path: title/em #: C/compressor.page:119 C/deesser.page:103 C/multibandcompressor.page:95 #: C/multibandgate.page:103 C/stereotools.page:38 C/equalizer.page:23 #: C/equalizer.page:146 C/webrtc.page:75 msgid "Mode" msgstr "Kip" #. (itstool) path: item/p #: C/compressor.page:123 msgid "Peak - Measure signal's peak." msgstr "" #. (itstool) path: item/p #: C/compressor.page:129 msgid "RMS - Root mean square of the input signal." msgstr "" #. (itstool) path: item/p #: C/compressor.page:135 msgid "" "Low-Pass - Input signal is processed by a low-pass " "filter." msgstr "" #. (itstool) path: item/p #: C/compressor.page:141 msgid "" "Uniform - Input signal is processed by a uniform " "filter." msgstr "" #. (itstool) path: title/em #: C/compressor.page:150 msgid "Source" msgstr "Kaynak" #. (itstool) path: item/p #: C/compressor.page:154 msgid "" "Middle - Middle part of signal is used for " "sidechain processing." msgstr "" #. (itstool) path: item/p #: C/compressor.page:160 msgid "" "Side - Side part of signal is used for sidechain " "processing." msgstr "" #. (itstool) path: item/p #: C/compressor.page:166 msgid "" "Left - Only left channel is used for sidechain " "processing." msgstr "" #. (itstool) path: item/p #: C/compressor.page:172 msgid "" "Right - Only right channel is used for sidechain " "processing." msgstr "" #. (itstool) path: title/em #: C/compressor.page:181 msgid "Pre-amplification" msgstr "Öntanımlı-yükselticiler" #. (itstool) path: item/p #: C/compressor.page:183 msgid "Pre-amplification of the sidechain signal." msgstr "Yan zincir sinyalinin öntanımlı yükselticileri." #. (itstool) path: title/em #: C/compressor.page:189 msgid "Reactivity" msgstr "Tepkinirlik" #. (itstool) path: item/p #: C/compressor.page:191 msgid "Reactivity of the sidechain signal." msgstr "Yan zincir sinyalinin tepkinirliği." #. (itstool) path: title/em #: C/compressor.page:197 C/limiter.page:38 msgid "Lookahead" msgstr "İlerleme" #. (itstool) path: item/p #: C/compressor.page:199 msgid "Look-ahead time of the sidechain relative to the input signal." msgstr "Giriş sinyaline göre yan zincirin önden bakma süresi." #. (itstool) path: page/title #: C/deesser.page:9 msgid "Deesser" msgstr "" #. (itstool) path: page/p #: C/deesser.page:10 msgid "" "PulseEffects uses the deesser developed by Calf Studio. A deesser is used to " "dynamically reduce high frequencies. The standard field of use is the " "reduction of \"sssss\" and \"shhhh\" in vocal tracks." msgstr "" "PulseEffects, Calf Studio tarafından geliştirilen deesseri kullanır. Yüksek " "frekansları dinamik olarak azaltmak için bir deesser kullanılır. Standart " "kullanım alanı, ses parçalarında \"sssss\" ve \"shhhh\" değerlerinin " "azaltılmasıdır." #. (itstool) path: title/em #: C/deesser.page:18 msgid "Laxity" msgstr "Gevşeklik" #. (itstool) path: item/p #: C/deesser.page:20 msgid "" "The reaction of the deesser. Higher values won't affect really short peaks." msgstr "" "Deesser'in tepkisi. Daha yüksek değerler gerçekten kısa tepe noktalarını " "etkilemeyecektir." #. (itstool) path: title/em #: C/deesser.page:50 msgid "Split" msgstr "Ayır" #. (itstool) path: item/p #: C/deesser.page:52 msgid "" "The split frequency. All signals above this frequency will affect the gain " "reduction (and in split mode they are affected by the reduction too)." msgstr "" "Bölünme frekansı. Bu frekansın üzerindeki tüm sinyaller kazanç azalmasını " "etkiler (ve bölünmüş kipte de azaltmadan etkilenir)." #. (itstool) path: title/em #: C/deesser.page:59 C/autogain.page:78 msgid "Gain" msgstr "Kazanç" #. (itstool) path: item/p #: C/deesser.page:61 msgid "" "It shifts the volume of the higher band. In wideband mode it affects the " "sidechain. In split mode it also affects the processed high frequencies." msgstr "" #. (itstool) path: title/em #: C/deesser.page:68 msgid "Peak" msgstr "Tepe" #. (itstool) path: item/p #: C/deesser.page:70 msgid "" "Center frequency of the bell filter. It allows a more precise selection of " "the sidechain signal." msgstr "" #. (itstool) path: title/em #: C/deesser.page:77 msgid "Level" msgstr "Seviye" #. (itstool) path: item/p #: C/deesser.page:79 msgid "Increase or decrease the frequencies around the center bell frequency." msgstr "" #. (itstool) path: title/em #: C/deesser.page:85 msgid "Peak Q" msgstr "Q Tepe" #. (itstool) path: item/p #: C/deesser.page:87 msgid "" "Set the quality of the bell. Higher values will affect a narrower frequency " "range. Lower values will affect a wider band." msgstr "" #. (itstool) path: title/em #: C/deesser.page:94 C/gate.page:79 C/multibandcompressor.page:78 #: C/multibandgate.page:86 msgid "Detection" msgstr "Keşif" #. (itstool) path: item/p #: C/deesser.page:96 msgid "" "Choose if the deesser should take the signal peak for detection or the RMS " "value (it is smoother)." msgstr "" "Deesser'ın algılama için sinyal tepe noktasını veya RMS değerini alması " "gerekip gerekmediğini seçin (daha pürüzsüz)." #. (itstool) path: item/p #: C/deesser.page:105 msgid "Select your operation mode between wideband or split" msgstr "Çalışma kipini geniş bant veya bölme arasında seçin" #. (itstool) path: page/title #: C/exciter.page:9 msgid "Exciter" msgstr "Uyarıcı" #. (itstool) path: page/p #: C/exciter.page:10 msgid "" "An exciter is used to enhance a signal by dynamic equalization, phase " "manipulation, harmonic synthesis of high frequency signals, and through the " "addition of subtle harmonic distortion." msgstr "" "Bir uyarıcıyı, dinamik eşitleme, faz manipülasyonu, yüksek frekanslı " "sinyallerin harmonik sentezi ve ince harmonik bozulmaların eklenmesi yoluyla " "bir sinyal geliştirmek için kullanılır." #. (itstool) path: page/p #: C/exciter.page:15 msgid "PulseEffects uses the exciter developed by Calf Studio." msgstr "PulseEffects, Calf Studio tarafından geliştirilen uyarıcıyı kullanır." #. (itstool) path: title/em #: C/exciter.page:45 msgid "Ceiling(button)" msgstr "Tavan(düğme)" #. (itstool) path: item/p #: C/exciter.page:47 msgid "Constrain the excitement on the upper end." msgstr "" #. (itstool) path: title/em #: C/exciter.page:53 msgid "Ceiling(value)" msgstr "Tavan(değer)" #. (itstool) path: item/p #: C/exciter.page:55 msgid "The frequency no harmonics are produced above." msgstr "" #. (itstool) path: page/title #: C/filter.page:9 msgid "Filter" msgstr "Süzgeç" #. (itstool) path: page/p #: C/filter.page:10 msgid "" "Audio filters can amplify (boost), pass or attenuate (cut) some frequency " "ranges." msgstr "" #. (itstool) path: page/p #: C/filter.page:14 msgid "" "PulseEffects uses the filter from Calf Studio. It can be used to remove " "defined parts of a frequency spectrum." msgstr "" #. (itstool) path: title/em #: C/filter.page:21 C/equalizer.page:203 msgid "Frequency" msgstr "Sıklık" #. (itstool) path: item/p #: C/filter.page:23 msgid "The center or cut-off frequency of the filter." msgstr "" #. (itstool) path: title/em #: C/filter.page:29 msgid "Resonance" msgstr "Çınlama" #. (itstool) path: item/p #: C/filter.page:31 msgid "" "Add an accentuation to the center frequency. When used on a bandpass the " "surrounding frequencies are decreased in level and the band gets more " "narrow, a bandreject is narrowed down to a thin needle." msgstr "" #. (itstool) path: title/em #: C/filter.page:39 msgid "Inertia" msgstr "Durağan" #. (itstool) path: item/p #: C/filter.page:41 msgid "Smooths the jumps between frequencies." msgstr "" #. (itstool) path: page/title #: C/gate.page:9 msgid "Gate" msgstr "Aralık" #. (itstool) path: page/p #: C/gate.page:10 msgid "" "Gates attenuate signals that register below the threshold. This kind of " "signal processing reduces disturbing noise between useful signals." msgstr "" #. (itstool) path: page/p #: C/gate.page:14 msgid "PulseEffects uses the gate developed by Calf Studio." msgstr "" #. (itstool) path: title/em #: C/gate.page:70 msgid "Stereo Link" msgstr "Stereo Bağ" #. (itstool) path: item/p #: C/gate.page:72 msgid "" "Choose if the gain reduction is affected by the louder channel or by the " "average level between the channels." msgstr "" #. (itstool) path: item/p #: C/gate.page:81 msgid "" "Choose if the gate should take the signal peak for detection or the RMS " "value (it is smoother)." msgstr "" #. (itstool) path: title/em #: C/gate.page:88 msgid "Gain Reduction" msgstr "Kazanç Azaltma" #. (itstool) path: item/p #: C/gate.page:90 msgid "The level of gain reduction when the signal is below the threshold." msgstr "" #. (itstool) path: page/title #: C/delay.page:9 msgid "Delay" msgstr "Gecikme" #. (itstool) path: page/p #: C/delay.page:10 msgid "" "This plugin allows to add short delay to each individual channel of the " "stereo channel" msgstr "" #. (itstool) path: title/em #: C/delay.page:17 msgid "Left" msgstr "Sol" #. (itstool) path: item/p #: C/delay.page:19 msgid "Left channel delay." msgstr "Sol kanal gecikmesi." #. (itstool) path: title/em #: C/delay.page:25 msgid "Right" msgstr "Sağ" #. (itstool) path: item/p #: C/delay.page:27 msgid "Right channel delay." msgstr "Sağ kanal gecikmesi." #. (itstool) path: page/title #: C/index.page:12 msgid "PulseEffects" msgstr "" #. (itstool) path: page/p #: C/index.page:15 msgid "" "PulseEffects applies audio effects to Pulseaudio applications. You can apply " "effects to applications output or to your microphone before sending its " "audio to a recording application." msgstr "" #. (itstool) path: section/title #: C/index.page:21 msgid "User Interface" msgstr "Kullanıcı Arayüzü" #. (itstool) path: section/title #: C/index.page:24 msgid "Plugins" msgstr "Eklentiler" #. (itstool) path: section/title #: C/index.page:27 msgid "Calibration" msgstr "Kalibrasyon" #. (itstool) path: page/title #. (itstool) path: title/em #: C/limiter.page:9 C/limiter.page:18 C/webrtc.page:88 msgid "Limiter" msgstr "Sınırlayıcı" #. (itstool) path: page/p #: C/limiter.page:10 msgid "" "A limiter allows signals below a specified input power or level to pass " "unaffected while attenuating (lowering) the peaks of stronger signals that " "exceed this threshold." msgstr "" #. (itstool) path: page/p #: C/limiter.page:15 msgid "PulseEffects uses the limiter developed by Calf Studio." msgstr "" #. (itstool) path: title/em #: C/limiter.page:22 msgid "Input Gain" msgstr "Giriş Kazancı" #. (itstool) path: item/p #: C/limiter.page:24 msgid "Raises audio volume before it is sent ot the compression stage." msgstr "" #. (itstool) path: title/em #: C/limiter.page:30 msgid "Limit" msgstr "Limit" #. (itstool) path: item/p #: C/limiter.page:32 msgid "No signal above this level will pass through the limiter." msgstr "" #. (itstool) path: item/p #: C/limiter.page:40 msgid "" "The Limiter will reach its attenuation level in this amount of time (output " "will be delayed two times this time)." msgstr "" #. (itstool) path: item/p #: C/limiter.page:49 msgid "Stop the attenuation after this amount of milliseconds." msgstr "" #. (itstool) path: title/em #: C/limiter.page:55 msgid "Oversampling" msgstr "Aşırı Örnekleme" #. (itstool) path: item/p #: C/limiter.page:57 msgid "" "Increase the signal sampling to better detect the peaks. The signal is " "downsampled after processing." msgstr "" #. (itstool) path: title/em #: C/limiter.page:64 msgid "ASC" msgstr "ASC" #. (itstool) path: item/p #: C/limiter.page:66 msgid "" "When gain reduction is always needed ASC takes care of releasing to an " "average reduction level rather than reaching a reduction of 0 in the release " "time." msgstr "" #. (itstool) path: title/em #: C/limiter.page:73 msgid "ASC Level" msgstr "" #. (itstool) path: item/p #: C/limiter.page:75 msgid "" "Select how much the release time is affected by ASC, 0 means nearly no " "changes in release time while 1 produces higher release times." msgstr "" #. (itstool) path: page/title #. (itstool) path: title/em #: C/loudness.page:9 C/loudness.page:19 C/autogain.page:61 msgid "Loudness" msgstr "Yüksek Ses" #. (itstool) path: page/p #: C/loudness.page:10 msgid "" "PulseEffects uses the loudness from MDA.LV2. The ear is less sensitive to " "low frequencies when listening at low volume. This plug-in is based on the " "Stevens-Davis equal loudness contours and allows the bass level to be " "adjusted to simulate or correct for this effect." msgstr "" "PulseEffects, MDA.LV2'den gelen ses seviyesini kullanır. Kulak, düşük ses " "seviyesinde dinlerken düşük frekanslara karşı daha az hassastır. Bu eklenti " "Stevens-Davis'in eşit yüksek ses kontürlerine dayanır ve bas seviyesinin bu " "etki için simülasyonu yapmak veya düzeltmek üzere ayarlanmasına izin verir." #. (itstool) path: item/p #: C/loudness.page:21 msgid "" "Source level relative to listening level (based on a 100 dB SPL maximum " "level)." msgstr "" "Dinleme seviyesine göre kaynak seviyesi (azami 100 dB SPL seviyesine " "dayanarak)." #. (itstool) path: title/em #: C/loudness.page:27 msgid "Output" msgstr "Çıkış" #. (itstool) path: item/p #: C/loudness.page:29 msgid "Change output level." msgstr "Çıkış seviyesini değiştir." #. (itstool) path: title/em #: C/loudness.page:35 msgid "Link" msgstr "Bağ" #. (itstool) path: item/p #: C/loudness.page:37 msgid "" "Automatically adjusts Output to maintain a consistent tonal balance at all " "levels." msgstr "" "Tüm seviyelerde tutarlı bir ton dengesi sağlamak için Çıkışı otomatik olarak " "ayarlar." #. (itstool) path: page/title #: C/multibandcompressor.page:9 msgid "Multiband Compressor" msgstr "Çoklu Bant Şıkıştırıcı" #. (itstool) path: page/p #: C/multibandcompressor.page:10 msgid "" "This kind of compressor splits the signal in four different frequency " "ranges. These ranges are compressed separately and mixed together afterwards " "again." msgstr "" "Bu tür bir sıkıştırıcı, sinyali dört farklı frekans aralığında böler. Bu " "aralıklar ayrı ayrı sıkıştırılır ve daha sonra tekrar karıştırılır." #. (itstool) path: page/p #: C/multibandcompressor.page:14 msgid "PulseEffects uses the multiband compressor developed by Calf Studio." msgstr "" "PulseEffects, Calf Studio tarafından geliştirilen çoklu bant sıkıştırıcıyı " "kullanır." #. (itstool) path: title/em #: C/multibandcompressor.page:70 C/multibandgate.page:78 C/crystalizer.page:29 msgid "Bypass" msgstr "Atla" #. (itstool) path: item/p #: C/multibandcompressor.page:72 C/multibandgate.page:80 msgid "Don't process anything, just bypass the signal of this strip." msgstr "Hiçbir şey işlemeyin, sadece bu şeridin sinyalini atlayın." #. (itstool) path: item/p #: C/multibandcompressor.page:80 msgid "" "Choose if the multibandcompressor should take the signal peak for detection " "or the RMS value (it is smoother)." msgstr "" #. (itstool) path: title/em #: C/multibandcompressor.page:87 C/multibandgate.page:95 C/equalizer.page:187 msgid "Solo" msgstr "Tekli" #. (itstool) path: item/p #: C/multibandcompressor.page:89 C/multibandgate.page:97 msgid "Mute all strips not set to solo." msgstr "Yalnız ayarlanmayan tüm şeritleri sessize al." #. (itstool) path: item/p #: C/multibandcompressor.page:97 C/multibandgate.page:105 msgid "" "The crossover mode. You can choose between the fourth order Linkwitz-" "Riley(LR4) and the eighth order Linkwitz-Riley(LR8)." msgstr "" #. (itstool) path: title/em #: C/multibandcompressor.page:104 C/multibandgate.page:112 msgid "Split 1/2" msgstr "1/2 Böl" #. (itstool) path: item/p #: C/multibandcompressor.page:106 C/multibandgate.page:114 msgid "Frequency that separates the sub band and the low band." msgstr "Alt bandı ve düşük bandı ayıran frekans." #. (itstool) path: title/em #: C/multibandcompressor.page:112 C/multibandgate.page:120 msgid "Split 2/3" msgstr "2/3 Böl" #. (itstool) path: item/p #: C/multibandcompressor.page:114 C/multibandgate.page:122 msgid "Frequency that separates the low band and the mid band." msgstr "Düşük bant ve orta bant ayıran frekans." #. (itstool) path: title/em #: C/multibandcompressor.page:120 C/multibandgate.page:128 msgid "Split 3/4" msgstr "3/4 Böl" #. (itstool) path: item/p #: C/multibandcompressor.page:122 C/multibandgate.page:130 msgid "Frequency that separates the mid band and the high band." msgstr "Orta bant ve yüksek bant ayıran frekans." #. (itstool) path: page/title #: C/multibandgate.page:9 msgid "Multiband Gate" msgstr "Çoklu Bant Geçitleme" #. (itstool) path: page/p #: C/multibandgate.page:10 msgid "" "This kind of gate splits the signal in four different frequency ranges. " "These ranges are processed separately and mixed together afterwards again." msgstr "" "Bu tür bir kapı, sinyali dört farklı frekans aralığında böler. Bu aralıklar " "ayrı olarak işlenir ve daha sonra tekrar karıştırılır." #. (itstool) path: page/p #: C/multibandgate.page:14 msgid "PulseEffects uses the multiband gate developed by Calf Studio." msgstr "" "PulseEffects, Calf Studio tarafından geliştirilen çoklu bant geçidi kullanır." #. (itstool) path: title/em #: C/multibandgate.page:38 msgid "Reduction" msgstr "Azalım" #. (itstool) path: item/p #: C/multibandgate.page:40 msgid "The level of reduction in this strip." msgstr "Bu şeritteki azalma seviyesi." #. (itstool) path: item/p #: C/multibandgate.page:88 msgid "" "Choose if the multibandgate should take the signal peak for detection or the " "RMS value (it is smoother)." msgstr "" #. (itstool) path: page/title #: C/reverb.page:9 msgid "Reverberation" msgstr "Yankılanma" #. (itstool) path: page/p #: C/reverb.page:10 msgid "" "Reverberation, in psychoacoustics and acoustics, is a persistence of sound " "after the sound is produced. A reverberation, or reverb, is created when a " "sound or signal is reflected causing a large number of reflections to build " "up and then decay as the sound is absorbed by the surfaces of objects in the " "space. Reverberation plugins can be used to artificially produce this effect." msgstr "" #. (itstool) path: page/p #: C/reverb.page:17 msgid "PulseEffects uses the reverberation developed by Calf Studio." msgstr "" #. (itstool) path: title/em #: C/reverb.page:23 msgid "Pre Delay" msgstr "Ön Gecikme" #. (itstool) path: item/p #: C/reverb.page:25 msgid "" "Additional delay - corresponds to a distance between sound source and the " "nearest wall." msgstr "" #. (itstool) path: title/em #: C/reverb.page:32 msgid "Decay Time" msgstr "Bozunma Süresi" #. (itstool) path: item/p #: C/reverb.page:34 msgid "Time it takes for reverberation to fade out." msgstr "" #. (itstool) path: item/p #: C/reverb.page:42 msgid "Amount of processed signal (reverberation) in the output." msgstr "" #. (itstool) path: title/em #: C/reverb.page:48 msgid "Dry" msgstr "Sertlik" #. (itstool) path: item/p #: C/reverb.page:50 msgid "Amount of unprocessed signal in the output." msgstr "Çıkıştaki işlenmemiş sinyal miktarı." #. (itstool) path: title/em #: C/reverb.page:56 msgid "Bass Cut" msgstr "Bas Kesim" #. (itstool) path: item/p #: C/reverb.page:58 msgid "Removes low frequencies from the reverberation." msgstr "Yankılanmadan düşük frekansları kaldırır." #. (itstool) path: title/em #: C/reverb.page:64 msgid "Treble Cut" msgstr "Tiz Kesim" #. (itstool) path: item/p #: C/reverb.page:66 msgid "Removes high frequencies from the reverberation." msgstr "Yankılanmadan yüksek frekansları kaldırır." #. (itstool) path: title/em #: C/reverb.page:72 msgid "Diffusion" msgstr "Yayılma" #. (itstool) path: item/p #: C/reverb.page:74 msgid "Increase its value for less uniform reverberation." msgstr "Daha az tek biçimli yankılanma için değerini artırın." #. (itstool) path: title/em #: C/reverb.page:80 msgid "Room Size" msgstr "Oda Boyutu" #. (itstool) path: item/p #: C/reverb.page:82 msgid "" "Size of the space that simulated reverberation occurs in - determines times " "between reflections." msgstr "" "Yankılanmayı simüle eden alanın boyutu - yansımaların arasındaki süreleri " "belirler." #. (itstool) path: title/em #: C/reverb.page:89 msgid "High Frequency Damping" msgstr "Yüksek Frekans Sönümleme" #. (itstool) path: item/p #: C/reverb.page:91 msgid "" "Cutoff reflections high frequencies - causes higher frequencies to decay " "faster." msgstr "" "Kesim, yüksek frekansları yansıtır - daha yüksek frekansların daha hızlı " "çürümesine neden olur." #. (itstool) path: page/title #: C/stereotools.page:9 msgid "Stereo Tools" msgstr "Stereo Araçları" #. (itstool) path: page/p #: C/stereotools.page:10 msgid "PulseEffects uses the stereo tools developed by Calf Studio." msgstr "" "PulseEffects, Calf Studio tarafından geliştirilen stereo araçları kullanır." #. (itstool) path: title/em #: C/stereotools.page:16 msgid "Softclip" msgstr "" #. (itstool) path: item/p #: C/stereotools.page:18 msgid "Do kind of analog distortion instead of harsh digital 0db clipping." msgstr "Sert dijital 0db kırpma yerine bir tür analog bozulma yapın." #. (itstool) path: title/em #: C/stereotools.page:24 msgid "Balance" msgstr "Denge" #. (itstool) path: item/p #: C/stereotools.page:26 msgid "Set the balance between both channels." msgstr "Her iki kanal arasındaki dengeyi ayarlayın." #. (itstool) path: title/em #: C/stereotools.page:32 msgid "S/C Level" msgstr "S/C Seviye" #. (itstool) path: item/p #: C/stereotools.page:40 msgid "Choose normal stereo behavior (LR - LR) or convert between MS and LR." msgstr "" "Normal stereo davranışını (LR - LR) seçin veya MS ile LR arasında dönüştürün." #. (itstool) path: title/em #: C/stereotools.page:46 msgid "Side Level" msgstr "Yan Sinyal Seviyesi" #. (itstool) path: item/p #: C/stereotools.page:48 msgid "The level of the side signal." msgstr "Yan sinyalin seviyesi." #. (itstool) path: title/em #: C/stereotools.page:54 msgid "Side Balance" msgstr "Denge Tarafı" #. (itstool) path: item/p #: C/stereotools.page:56 msgid "The balance of the side signal." msgstr "Yan sinyalin dengesi." #. (itstool) path: title/em #: C/stereotools.page:62 msgid "Middle Level" msgstr "Orta Seviye" #. (itstool) path: item/p #: C/stereotools.page:64 msgid "Middle signal position in the stereo panorama." msgstr "Stereo panorama orta sinyal konumu." #. (itstool) path: title/em #: C/stereotools.page:70 msgid "Delay L/R" msgstr "Gecikme L/R" #. (itstool) path: item/p #: C/stereotools.page:72 msgid "" "Delay the left or the right channel (milliseconds). Negative values delay " "the left channel and positive values the right channel." msgstr "" "Sol veya sağ kanalı geciktirin (milisaniye). Negatif değerler sol kanalı " "geciktirir ve pozitif değerler sağ kanalı seçer." #. (itstool) path: title/em #: C/stereotools.page:79 msgid "Stereo Base" msgstr "Stereo Taban" #. (itstool) path: item/p #: C/stereotools.page:81 msgid "" "Set the stereo base of your material seamless between Mono and inverted " "Channels." msgstr "" #. (itstool) path: title/em #: C/stereotools.page:88 msgid "Stereo Phase" msgstr "Stereo Faz" #. (itstool) path: item/p #: C/stereotools.page:90 msgid "Set the stereo phase of your material." msgstr "Malzemenizin stereo fazını ayarlayın." #. (itstool) path: page/title #: C/maximizer.page:9 msgid "Maximizer" msgstr "Yükseltici" #. (itstool) path: page/p #: C/maximizer.page:10 msgid "" "A maximizer is similar to a limiter. It attenuates peaks above the " "limit(ceiling in our case) but it also boosts peaks that are between the " "limit and the threshold." msgstr "" "Bir yükseltici, sınırlayıcıya benzer. Sınırın üstündeki seviyeleri " "zayıflatır (bizim durumumuzda tavan) ancak aynı zamanda sınır ile eşik " "arasındaki seviyeyi de yükseltir." #. (itstool) path: page/p #: C/maximizer.page:15 msgid "PulseEffects uses the maximizer from ZamAudio." msgstr "PulseEffects, ZamAudio'daki yükselticiyi kullanır." #. (itstool) path: title/em #: C/maximizer.page:29 msgid "Ceiling" msgstr "Tavan" #. (itstool) path: item/p #: C/maximizer.page:31 msgid "Maximum allowed peak value." msgstr "İzin verilen azami tepe değeri." #. (itstool) path: item/p #: C/maximizer.page:39 msgid "Stop the attenuation after this amount of seconds." msgstr "Bu saniyeden sonra zayıflamayı durdurun." #. (itstool) path: page/title #: C/crossfeed.page:9 msgid "Crossfeed" msgstr "Çapraz Besleme" #. (itstool) path: page/p #: C/crossfeed.page:10 msgid "" "PulseEffects uses the crossfeed from GStreamer. This plugin is based on the " "bs2b library and can be used to improve headphone listening of stereo audio " "records. It does so by mixing the left and right channel in a way that " "simulates a stereo speaker setup while using headphones." msgstr "" "PulseEffects, GStreamer'den gelen çapraz beslemeyi kullanır. Bu eklenti bs2b " "kütüphanesini temel alır ve stereo ses kayıtlarının kulaklık dinlemesini " "geliştirmek için kullanılabilir. Bunu, kulaklık kullanırken stereo hoparlör " "kurulumunu taklit edecek şekilde sol ve sağ kanalı karıştırarak yapar." #. (itstool) path: title/em #: C/crossfeed.page:19 msgid "Cutoff" msgstr "Kesici" #. (itstool) path: item/p #: C/crossfeed.page:21 msgid "Low-pass filter cutoff frequency." msgstr "Düşük geçişli filtre kesme frekansı." #. (itstool) path: title/em #: C/crossfeed.page:27 msgid "Feed" msgstr "Akış" #. (itstool) path: item/p #: C/crossfeed.page:29 msgid "Amount of signal from a channel that is sent to the other." msgstr "Diğerine gönderilen bir kanaldan sinyal miktarı." #. (itstool) path: page/title #: C/equalizer.page:9 msgid "Equalizer" msgstr "Ekolayzır" #. (itstool) path: page/p #: C/equalizer.page:10 msgid "" "PulseEffects uses the parametric equalizer from Linux Studio Plugins. You " "can choose between 1 and 30 bands. You also can change the center frequency " "and the width of each band as needed. There are a few presets but at this " "moment all of them have only 10 bands. Presets with other number of bands " "may be added in the future." msgstr "" "PulseEffects, Linux Studio Eklentileri'nden gelen parametrik ekolayzır " "kullanır. 1 ile 30 bant arasında seçim yapabilirsiniz. Ayrıca, her bir " "bandın merkez frekansını ve genişliğini gerektiği gibi değiştirebilirsiniz. " "Birkaç ön ayar var ama şu anda hepsinde sadece 10 grup var. Diğer gruplara " "sahip ön ayarlar ileride eklenebilir." #. (itstool) path: section/title #: C/equalizer.page:18 msgid "Main Menu" msgstr "Ana Menü" #. (itstool) path: item/p #: C/equalizer.page:27 msgid "" "IIR - Infinite Impulse Response filters, nonlinear " "minimal phase. In most cases does not add noticeable latency to output " "signal." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:33 msgid "" "FIR - Finite Impulse Response filters with linear " "phase, finite approximation of equalizer's impulse response. Adds noticeable " "latency to output signal." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:39 msgid "" "FFT - Fast Fourier Transform approximation of the " "frequency chart, linear phase. Adds noticeable latency to output signal." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:48 msgid "Bands" msgstr "Bantlar" #. (itstool) path: item/p #: C/equalizer.page:50 msgid "The number of equalizer bands." msgstr "Ekolayzır bantlarının sayısı." #. (itstool) path: title/em #: C/equalizer.page:56 msgid "Split Channels" msgstr "Kanalları Böl" #. (itstool) path: item/p #: C/equalizer.page:58 msgid "" "When this option is enabled it is possible to apply different equalizations " "to the left and the right channel." msgstr "" "Bu seçenek etkinleştirildiğinde, sol ve sağ kanala farklı eşitlemeler " "uygulamak mümkündür." #. (itstool) path: title/em #: C/equalizer.page:65 msgid "Flat Response" msgstr "Düz Yanıt" #. (itstool) path: item/p #: C/equalizer.page:67 msgid "This function sets each band gain to 0." msgstr "Bu fonksiyon her bir bant kazancını 0'a ayarlar." #. (itstool) path: title/em #: C/equalizer.page:73 msgid "Calculate Frequencies" msgstr "Frekansları Hesapla" #. (itstool) path: item/p #: C/equalizer.page:75 msgid "" "This function can be used to calculate the center frequencies and bandwidth " "of a graphic equalizer with the current number of selected bands. Useful " "when the user does not want the default number of 30 bands but has no idea " "about which frequencies and bandwidth he/she should choose." msgstr "" "Bu fonksiyon, seçilen bantların mevcut sayısı ile bir grafik ekolayzırın " "merkez frekanslarını ve bant genişliğini hesaplamak için kullanılabilir. " "Kullanıcı öntanımlı 30 bant sayısını istemediğinde, ancak hangi frekansları " "ve bant genişliğini seçmesi gerektiğine dair hiçbir fikri olmadığı zaman " "kullanışlıdır." #. (itstool) path: title/em #: C/equalizer.page:84 msgid "Reset Equalizer" msgstr "Ekolayzır Sıfırla" #. (itstool) path: item/p #: C/equalizer.page:86 msgid "Reset the equalizer to its default settings." msgstr "Ekolayzırı öntanımlı ayarlarına sıfırlayın." #. (itstool) path: section/title #: C/equalizer.page:95 msgid "Band Menu" msgstr "Bant Menüsü" #. (itstool) path: item/p #: C/equalizer.page:103 msgid "Off - Filter is not working (turned off)." msgstr "Kapalı - Filtre çalışmıyor (kapalı)." #. (itstool) path: item/p #: C/equalizer.page:108 msgid "Bell - Bell filter with smooth peak/recess." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:113 msgid "" "High-pass - High-pass filter with rejection of low " "frequencies." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:118 msgid "" "High-shelf - Shelving filter with adjustment of " "high frequency range." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:123 msgid "" "Low-pass - Low-pass filter with rejection of high " "frequencies." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:128 msgid "" "Low-shelf - Shelving filter with adjustment of low " "frequencies." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:133 msgid "" "Notch - Notch filter with full rejection of " "selected frequency." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:138 msgid "" "Resonance - Resonance filter wih sharp peak/recess." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:150 msgid "" "RLC - Very smooth filters based on similar " "cascades of RLC contours." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:155 msgid "" "BWC - Butterworth-Chebyshev-type-1 based filters. " "Does not affect Resonance and Notch filters." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:161 msgid "" "LRX - Linkwitz-Riley based filters. Does not " "affect Resonance and Notch filters." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:166 msgid "" "(BT) - Bilinear Z-transform is used for pole/zero " "mapping." msgstr "" #. (itstool) path: item/p #: C/equalizer.page:171 msgid "" "(MT) - Matched Z-transform is used for pole/zero " "mapping." msgstr "" #. (itstool) path: title/em #: C/equalizer.page:179 msgid "Slope" msgstr "Eğim" #. (itstool) path: item/p #: C/equalizer.page:181 msgid "The slope of the filter characteristics." msgstr "Filtre özelliklerinin karakteristik eğimi." #. (itstool) path: item/p #: C/equalizer.page:189 msgid "Makes this band the only one active." msgstr "Bu grup sadece tekini aktif yapar." #. (itstool) path: title/em #: C/equalizer.page:195 C/crystalizer.page:37 msgid "Mute" msgstr "Sessiz" #. (itstool) path: item/p #: C/equalizer.page:197 msgid "Mutes the band." msgstr "Frekansı susturur." #. (itstool) path: item/p #: C/equalizer.page:205 msgid "Band center frequency." msgstr "Bant merkez frekansı." #. (itstool) path: title/em #: C/equalizer.page:211 msgid "Width" msgstr "Genişlik" #. (itstool) path: p/code #: C/equalizer.page:215 #, no-wrap msgid "width = frequency / quality" msgstr "genişlik = frekans/kalite" #. (itstool) path: item/p #: C/equalizer.page:213 msgid "Bandwidth. Calculated as <_:code-1/>." msgstr "Bant genişliği. <_:code-1/>. olarak hesaplandı." #. (itstool) path: title/em #: C/equalizer.page:220 msgid "Quality" msgstr "Kalite" #. (itstool) path: item/p #: C/equalizer.page:222 msgid "Quality factor." msgstr "Kalite etkeni." #. (itstool) path: page/title #: C/pitch.page:9 msgid "Pitch" msgstr "Perde" #. (itstool) path: page/p #: C/pitch.page:10 msgid "" "Pitch shifting is a sound recording technique in which the original pitch of " "a sound is raised or lowered." msgstr "" "Perde kaydırma, bir sesin orijinal perdesinin yükseltildiği veya indirildiği " "ses kayıt tekniğidir." #. (itstool) path: page/p #: C/pitch.page:14 msgid "PulseEffects uses the pitch shifter from RubberBand." msgstr "PulseEffects, RubberBand'deki perde değiştiriciyi kullanır." #. (itstool) path: title/em #: C/pitch.page:20 msgid "Faster" msgstr "Daha Hızlı" #. (itstool) path: title/em #: C/pitch.page:26 msgid "Preserve Formant" msgstr "Biçimlendiriciyi Koru" #. (itstool) path: item/p #: C/pitch.page:28 msgid "Enable formant preservation when pitch shifting." msgstr "Perde kaydırma sırasında biçimlendirici korumayı etkinleştir." #. (itstool) path: title/em #: C/pitch.page:34 msgid "Cents" msgstr "Küsür" #. (itstool) path: item/p #: C/pitch.page:36 msgid "Number of cents the pitch will increased or decreased." msgstr "" #. (itstool) path: title/em #: C/pitch.page:42 msgid "Semitones" msgstr "Yarım Ses" #. (itstool) path: item/p #: C/pitch.page:44 msgid "Number of semitones the pitch will increased or decreased." msgstr "" #. (itstool) path: title/em #: C/pitch.page:50 msgid "Octaves" msgstr "Oktav" #. (itstool) path: item/p #: C/pitch.page:52 msgid "Number of octaves the pitch will increased or decreased." msgstr "Oktav sayısı, perdeyi artırır veya azaltır." #. (itstool) path: title/em #: C/pitch.page:58 msgid "Crispness" msgstr "Canlılık" #. (itstool) path: item/p #: C/pitch.page:62 msgid "" "0 - Disable phase resynchronisation at transients, phase lamination and use " "longer processing window." msgstr "" #. (itstool) path: item/p #: C/pitch.page:68 msgid "" "1 - Use soft transient detector, disable phase lamination and use longer " "processing window." msgstr "" #. (itstool) path: item/p #: C/pitch.page:74 msgid "2 - Disable phase resynchronisation at transients and phase lamination." msgstr "" #. (itstool) path: item/p #: C/pitch.page:79 msgid "3 - Disable phase resynchronisation at transients." msgstr "" #. (itstool) path: page/title #: C/webrtc.page:9 msgid "Webrtc" msgstr "Webrtc" #. (itstool) path: page/p #: C/webrtc.page:10 msgid "" "PulseEffects uses the webrtc from GStreamer. This plugin offers a voice " "enhancement filter based on WebRTC Audio Processing library. This library " "provides a broad variety of enhancement algorithms. This plugin tries to " "enable as many of those as possible. The currently enabled enhancements are " "High Pass Filter, Echo Canceller, Noise Suppression, Automatic Gain Control, " "and some extended filters." msgstr "" "PulseEffects, GStreamer'ın webrtc'ini kullanır. Bu eklenti, WebRTC Ses " "İşleme kütüphanesini temel alan bir ses geliştirme filtresi sunar. Bu " "kütüphane çok çeşitli geliştirme algoritmaları sağlar. Bu eklenti mümkün " "olduğunca çoğunu etkinleştirmeye çalışır. Şu anda etkin olan geliştirmeler, " "Yüksek Geçişli Filtre, Yankı Önleyici, Gürültü Bastırma, Otomatik Kazanç " "Kontrolü ve bazı uzatılmış filtrelerdir." #. (itstool) path: section/title #: C/webrtc.page:19 msgid "Echo Canceller" msgstr "Yankı Önleyici" #. (itstool) path: title/em #: C/webrtc.page:23 msgid "Extended Filter" msgstr "Genişletilmiş Süzgeç" #. (itstool) path: item/p #: C/webrtc.page:25 msgid "Enabled or disables the extended filter." msgstr "Genişletilmiş süzgeci etkinleştirir yada devre dışı bırakır." #. (itstool) path: title/em #: C/webrtc.page:31 msgid "High Pass Filter" msgstr "Yüksek Geçiş Süzgeci" #. (itstool) path: item/p #: C/webrtc.page:33 msgid "Enables or disables the high pass filter." msgstr "Yüksek geçiş süzgecini etkinleştirir yada devre dışı bırakır." #. (itstool) path: title/em #: C/webrtc.page:39 msgid "Delay Agnostic" msgstr "Agnostik Gecikme" #. (itstool) path: item/p #: C/webrtc.page:41 msgid "Enables or disables the delay agnostic mode." msgstr "Agnotik gecikme kipini etkinleştirir yada devre dışı bırakır." #. (itstool) path: title/em #: C/webrtc.page:47 C/webrtc.page:61 msgid "Suppression Level" msgstr "Bastırma Seviyesi" #. (itstool) path: item/p #: C/webrtc.page:49 msgid "" "Controls the aggressiveness of the suppressor. A higher level trades off " "double-talk performance for increased echo suppression." msgstr "" "Bastırıcının agrasifliğini kontrol eder. Daha yüksek bir seviye, yankı " "baskılamasının arttırılması için ikili konuşma performansını değiştirir." #. (itstool) path: section/title #: C/webrtc.page:57 msgid "Noise Suppressor" msgstr "Gürültü Baskılayıcı" #. (itstool) path: item/p #: C/webrtc.page:63 msgid "" "Controls the aggressiveness of the suppression. Increasing the level will " "reduce the noise level at the expense of a higher speech distortion." msgstr "" "Baskılayıcının agrasifliğini kontrol eder. Seviyeyi arttırmak, daha yüksek " "konuşma bozulmaları pahasına gürültü seviyesini azaltır." #. (itstool) path: section/title #: C/webrtc.page:71 msgid "Gain Controller" msgstr "Kazanç Denetleyicisi" #. (itstool) path: item/p #: C/webrtc.page:77 msgid "Controls the mode of the compression stage." msgstr "Sıkıştırma aşamasının kipini kontrol eder." #. (itstool) path: item/p #: C/webrtc.page:90 msgid "" "When enabled, the compression stage will hard limit the signal to the target " "level. Otherwise, the signal will be compressed but not limited above the " "target level." msgstr "" "Etkinleştirildiğinde, sıkıştırma aşaması, sinyali hedef seviyeye " "zorlaştırır. Aksi takdirde, sinyal sıkıştırılacak ancak hedef seviyenin " "üzerinde sınırlı olmayacaktır." #. (itstool) path: title/em #: C/webrtc.page:98 msgid "Target Level" msgstr "Hedef Seviye" #. (itstool) path: item/p #: C/webrtc.page:100 msgid "" "Sets the target peak level of the gain control in dBFS (decibels from " "digital full-scale)." msgstr "" "DBFS'deki kazanç kontrolünün hedef tepe seviyesini ayarlar (dijital tam " "ölçekli desibel)." #. (itstool) path: title/em #: C/webrtc.page:107 msgid "Maximum Gain" msgstr "Azami Kazanç" #. (itstool) path: item/p #: C/webrtc.page:109 msgid "Sets the maximum gain the digital compression stage may apply." msgstr "Dijital sıkıştırma aşamasının uygulayabileceği azami kazancı ayarlar." #. (itstool) path: section/title #: C/webrtc.page:116 msgid "Voice Detector" msgstr "Ses Dedektörü" #. (itstool) path: title/em #: C/webrtc.page:120 msgid "Detection Likelihood" msgstr "Algılama Olasılığı" #. (itstool) path: item/p #: C/webrtc.page:122 msgid "" "Specifies the likelihood that a frame will be declared to contain voice." msgstr "Bir karenin ses içerdiğini bildirme olasılığını belirtir." #. (itstool) path: title/em #: C/webrtc.page:130 msgid "Frame Size" msgstr "Çerçeve Boyutu" #. (itstool) path: item/p #: C/webrtc.page:132 msgid "" "Sets the size of the frames in ms on which the VAD will operate. Larger " "frames will improve detection accuracy, but reduce the frequency of updates." msgstr "" "VAD'ın çalışacağı karelerin ms cinsinden boyutunu ayarlar. Daha büyük " "çerçeveler algılama doğruluğunu iyileştirir, ancak güncelleme sıklığını " "azaltır." #. (itstool) path: page/title #: C/crystalizer.page:9 msgid "Crystalizer" msgstr "Kristalleştirici" #. (itstool) path: page/p #: C/crystalizer.page:10 msgid "" "PulseEffects crystalizer is a port of the FFMPEG crystalizer code to the " "GStreamer framework. We only added on top of it the possibility of applying " "different intensities for different frequency ranges. This plugin can be " "used to add dynamic range to songs that were overly compressed" msgstr "" "PulseEffects crystalizer, FFMPEG crystalizer kodunun GStreamer çerçevesine " "bir portudur. Bunun üzerine sadece farklı frekans aralıkları için farklı " "yoğunluklar uygulama imkanı ekledik. Bu eklenti aşırı sıkıştırılmış " "şarkılara dinamik aralık eklemek için kullanılabilir" #. (itstool) path: title/em #: C/crystalizer.page:19 msgid "Intensities" msgstr "Yoğunluk" #. (itstool) path: item/p #: C/crystalizer.page:21 msgid "" "The higher the value the higher is the difference in magnitude between the " "loudest and the quietest sounds. You can set different intensities for each " "frequency band." msgstr "" "Değer ne kadar yüksek olursa, en gürültülü ve en sessiz sesler arasındaki " "büyüklük farkı o kadar yüksektir. Her frekans bandı için farklı yoğunluklar " "ayarlayabilirsiniz." #. (itstool) path: item/p #: C/crystalizer.page:31 msgid "" "When active the audio signal passing through this band will not be modified." msgstr "Aktif olduğunda bu banttan geçen ses sinyali değiştirilmez." #. (itstool) path: item/p #: C/crystalizer.page:39 msgid "Silence the band." msgstr "" #. (itstool) path: page/title #: C/convolver.page:9 msgid "Convolver" msgstr "Sarsıcı" #. (itstool) path: page/p #: C/convolver.page:10 msgid "" "A convolver creates a simulation of an audio environment. It is based on the " "mathematical convolution operation, and uses a pre-recorded audio sample of " "the impulse response of the space being modeled." msgstr "" "Bir sarsıcı, bir ses ortamının simülasyonunu oluşturur. Matematiksel evrişim " "işlemine dayanır ve modellenen alanın dürtü yanıtının önceden kaydedilmiş " "bir ses örneğini kullanır." #. (itstool) path: title/em #: C/convolver.page:18 msgid "Import Impulse" msgstr "" #. (itstool) path: item/p #: C/convolver.page:20 msgid "" "Import an impulse response file to PulseEffects configuration directory." msgstr "" #. (itstool) path: title/em #: C/convolver.page:26 msgid "Stereo Width" msgstr "Stereo Genişliği" #. (itstool) path: item/p #: C/convolver.page:28 msgid "Modify the impulse response stereo image width." msgstr "" #. (itstool) path: title/em #. (itstool) path: page/title #: C/convolver.page:34 C/spectrum.page:9 msgid "Spectrum" msgstr "Spektrum" #. (itstool) path: item/p #: C/convolver.page:36 msgid "Visualize the frequency spectrum of the selected channel." msgstr "Seçilen kanalın frekans spektrumunu görselleştirin." #. (itstool) path: page/title #: C/settingsmenu.page:10 msgid "Settings Menu" msgstr "Ayarlar Menüsü" #. (itstool) path: page/title #: C/general.page:9 msgid "General" msgstr "Genel" #. (itstool) path: title/em #: C/general.page:13 msgid "Start Service at Login" msgstr "Oturum Açarken Hizmeti Başlat" #. (itstool) path: item/p #: C/general.page:15 msgid "" "Start PulseEffects as a service in the next login. This is done by creating " "an autostart file at ~/.config/autostart" msgstr "" "Bir sonraki girişte PulseEffects bir servis olarak başlar. Şurada, ~/.config/autostart otomatik başlatma dosyası " "oluşturulur" #. (itstool) path: title/em #: C/general.page:23 msgid "Process All Outputs" msgstr "Tüm Çıkışları İşle" #. (itstool) path: item/p #: C/general.page:25 msgid "" "Apply effects to the output of all audio applications. This will " "automatically switch on the per application switch that can be seen in the " "Applications entry." msgstr "" "Tüm ses uygulamalarının çıkışına efekt uygulayın. Tüm uygulama girişlerinde " "otomatik olarak Pulseeffects kullanılmış olacak." #. (itstool) path: title/em #: C/general.page:32 msgid "Process All Inputs" msgstr "Tüm Girişleri İşle" #. (itstool) path: item/p #: C/general.page:34 msgid "" "Apply effects to the input(microphone) of all audio applications. This will " "automatically switch on the per application switch that can be seen in the " "Applications entry." msgstr "" "Tüm ses uygulamalarının girişine (mikrofon) efekt uygulayın. Tüm uygulama " "girişlerinde otomatik olarak Pulseeffects kullanılmış olacak." #. (itstool) path: title/em #: C/general.page:42 msgid "Use Dark Theme" msgstr "Koyu Tema Kullan" #. (itstool) path: item/p #: C/general.page:44 msgid "Use the dark version of the GTK theme." msgstr "GTK temasının koyu sürümünü kullanın." #. (itstool) path: title/em #: C/general.page:50 msgid "Reset" msgstr "Sıfırla" #. (itstool) path: item/p #: C/general.page:52 msgid "" "Reset all parameters to their default values. This will reset the plugins " "too." msgstr "" "Tüm parametreleri öntanımlı değerlerine sıfırlayın. Bu eklentileri de " "sıfırlar." #. (itstool) path: title/em #: C/general.page:58 msgid "Priority type" msgstr "Öncelik türü" #. (itstool) path: item/p #: C/general.page:60 msgid "" "Choose between real time mode, niceness or none. This parameter allows to " "choose a higher priority for the threads that process audio." msgstr "" #. (itstool) path: title/em #: C/general.page:67 msgid "Niceness" msgstr "Hassaslık" #. (itstool) path: item/p #: C/general.page:69 msgid "Niceness value." msgstr "Hassaslık değeri." #. (itstool) path: title/em #: C/general.page:75 msgid "Priority" msgstr "Öncelik" #. (itstool) path: item/p #: C/general.page:77 msgid "Real time priority." msgstr "Gerçek zamanlı öncelik." #. (itstool) path: title/em #: C/spectrum.page:13 msgid "Show" msgstr "Göster" #. (itstool) path: item/p #: C/spectrum.page:15 msgid "Hide or show the spectrum." msgstr "Spektrumu gizleyin veya gösterin." #. (itstool) path: title/em #: C/spectrum.page:21 msgid "Points" msgstr "Noktalar" #. (itstool) path: item/p #: C/spectrum.page:23 msgid "Number of points displayed." msgstr "Görüntülenen noktaların sayısı." #. (itstool) path: title/em #: C/spectrum.page:29 msgid "Height" msgstr "Yükseklik" #. (itstool) path: item/p #: C/spectrum.page:31 msgid "Spectrum height." msgstr "Spektrum yüksekliği." #. (itstool) path: title/em #: C/spectrum.page:37 msgid "Scale" msgstr "Ölçek" #. (itstool) path: item/p #: C/spectrum.page:39 msgid "Bar height scaling factor." msgstr "Çubuk yüksekliği ölçeklendirmesi." #. (itstool) path: title/em #: C/spectrum.page:45 msgid "Exponent" msgstr "Katsayı" #. (itstool) path: item/p #: C/spectrum.page:47 msgid "Scaling factor exponent." msgstr "Ölçekleme katsayısı." #. (itstool) path: title/em #: C/spectrum.page:53 msgid "Sampling" msgstr "Örnekleme" #. (itstool) path: item/p #: C/spectrum.page:55 msgid "Spectrum update frequency." msgstr "Spektrum güncelleme sıklığı." #. (itstool) path: title/em #: C/spectrum.page:61 msgid "Line Width" msgstr "Hat Genişliği" #. (itstool) path: item/p #: C/spectrum.page:63 msgid "Bar line width." msgstr "Çubuk çizgi genişliği." #. (itstool) path: title/em #: C/spectrum.page:69 msgid "Fill" msgstr "Dolgu" #. (itstool) path: item/p #: C/spectrum.page:71 msgid "Draw filled bars." msgstr "Çubukların içine dolgu." #. (itstool) path: title/em #: C/spectrum.page:77 msgid "Border" msgstr "Kenar" #. (itstool) path: item/p #: C/spectrum.page:79 msgid "Show bar border." msgstr "Kenarlık çubuğunu göster." #. (itstool) path: title/em #: C/spectrum.page:85 msgid "Use Custom Color" msgstr "Özel Renk Kullan" #. (itstool) path: item/p #: C/spectrum.page:87 msgid "Use a user defined color or the GTK theme color." msgstr "Kullanıcı tanımlı bir renk veya GTK tema rengini kullanın." #. (itstool) path: title/em #: C/spectrum.page:93 msgid "Spectrum Color" msgstr "Spektrum Rengi" #. (itstool) path: item/p #: C/spectrum.page:95 msgid "User defined color." msgstr "Kullanıcı tanımlı renk." #. (itstool) path: page/title #: C/pulseaudio.page:9 msgid "Pulseaudio" msgstr "Pulseaudio" #. (itstool) path: page/p #: C/pulseaudio.page:10 msgid "" "PulseEffects has two GStreamer pipelines. One that applies effects for " "applications output and other that applies effects for microphone. Here the " "user can tweak a few advanced parameters for both pipelines." msgstr "" #. (itstool) path: title/em #: C/pulseaudio.page:18 msgid "Use Default" msgstr "Öntanımlıyı Kullan" #. (itstool) path: item/p #: C/pulseaudio.page:20 msgid "Use default input or output device." msgstr "Öntanımlı giriş veya çıkış cihazı kullanın." #. (itstool) path: title/em #: C/pulseaudio.page:26 msgid "Buffer" msgstr "Arabellek" #. (itstool) path: item/p #: C/pulseaudio.page:28 msgid "Pulsesrc plugin buffer size. It affects latency" msgstr "Pulsesrc eklenti arabellek boyutu. Gecikmeyi etkiler" #. (itstool) path: title/em #: C/pulseaudio.page:34 msgid "Latency" msgstr "Gecikme" #. (itstool) path: item/p #: C/pulseaudio.page:36 msgid "Pulsesrc plugin latency value." msgstr "Pulsesrc eklentisi gecikme değeri." #. (itstool) path: title/em #: C/pulseaudio.page:42 msgid "Block Size" msgstr "Blok Boyutu" #. (itstool) path: item/p #: C/pulseaudio.page:44 msgid "" "This controls the size of the audio buffer. Higher values increase latency " "but decrease cpu usage of a few plugins." msgstr "" "Bu ses arabelleğinin boyutunu kontrol eder. Daha yüksek değerler gecikmeyi " "arttırır, ancak birkaç eklentinin cpu kullanımını azaltır." #. (itstool) path: page/title #: C/testsignals.page:9 msgid "Test Signals" msgstr "Test Sinyalleri" #. (itstool) path: page/p #: C/testsignals.page:10 msgid "" "These signals can be used to test the frequency response of your speakers." msgstr "" "Bu sinyaller, hoparlörlerinizin frekans tepkisini test etmek için " "kullanılabilir." #. (itstool) path: page/title #: C/calibrationmic.page:9 msgid "Microphone" msgstr "Mikrofon" #. (itstool) path: page/p #: C/calibrationmic.page:10 msgid "" "If you have a microphone with reasonably flat response you can use it " "together with a pink noise test signal to estimate how flat is your audio " "setup frequency response." msgstr "" "Makul şekilde düz tepkili bir mikrofona sahipseniz, ses kurulum frekans " "tepkinizin ne kadar düz olduğunu tahmin etmek için 'pembe gürültü' test " "sinyali ile birlikte kullanabilirsiniz." #. (itstool) path: title/em #: C/calibrationmic.page:17 msgid "Window" msgstr "Pencere" #. (itstool) path: item/p #: C/calibrationmic.page:19 msgid "" "The amount of time the microphone signal will be measured. Higher values " "will reduce noises." msgstr "" "Mikrofon sinyalinin ölçüleceği süre. Daha yüksek değerler sesleri azaltır." #. (itstool) path: title/em #: C/calibrationmic.page:26 msgid "Measure Noise" msgstr "Gürültü Ölçümü" #. (itstool) path: item/p #: C/calibrationmic.page:28 msgid "" "Saves the last measurement to be used as background noise. Usually you would " "use this before turning on the pink noise." msgstr "" "Arka plan gürültüsü olarak kullanılacak son ölçümü kaydeder. Genellikle bunu " "'pembe gürültü' sesi açmadan önce kullanırsınız." #. (itstool) path: title/em #: C/calibrationmic.page:35 msgid "Subtract Noise" msgstr "Gürültü Çıkar" #. (itstool) path: item/p #: C/calibrationmic.page:37 msgid "Subtract the stored background noise from the measurement." msgstr "Depolanan arka plan gürültüsünü ölçümden çıkarın." #. (itstool) path: page/title #: C/enableapp.page:10 msgid "Enable or Disable an Application" msgstr "Bir Uygulamayı Etkinleştirme veya Devre Dışı Bırakma" #. (itstool) path: page/p #: C/enableapp.page:12 msgid "" "You can choose which applications have effects applied through the switch " "next to its name. If you always want to apply effects to all applications " "take a look at Enable All Applications." msgstr "" "Hangi uygulamaların, adının yanındaki anahtardan uygulanan efektlere sahip " "olduğunu seçebilirsiniz. Her zaman tüm uygulamalara efektler uygulamak " "istiyorsanız bir göz atın Tüm Uygulamaları Etkinleştir." #. (itstool) path: page/title #: C/effectsorder.page:10 msgid "Changing Effects Order" msgstr "Efekt Sıralamasını Değiştirme" #. (itstool) path: page/p #: C/effectsorder.page:12 msgid "" "You can change the plugins order in the effects chain. Just click on the up " "and down arrows next to the plugin name. The first plugin from top to bottom " "is the first to receive the audio signal." msgstr "" "Eklentiler sırasını efektler zincirinde değiştirebilirsiniz. Eklenti adının " "yanındaki yukarı ve aşağı okları tıklamanız yeterlidir. Yukarıdan aşağıya " "doğru ilk eklenti, ses sinyalini ilk alandır." #. (itstool) path: page/title #: C/userpresets.page:10 msgid "Creating and Importing User Presets" msgstr "Hazır Ayarları Oluşturma ve İçeri Aktarım" #. (itstool) path: page/p #: C/userpresets.page:12 msgid "" "You can save your own presets. Just add write a name and click on the add " "button. Presets can be imported clicking on the button to the left." msgstr "" "Kendi ön ayarlarınızı kaydedebilirsiniz. Sadece bir isim yazın ve ekle " "düğmesine tıklayın. Soldaki düğmeye tıklayarak ön ayarlar alınabilir." #. (itstool) path: page/p #: C/userpresets.page:16 msgid "" "When you save a preset the current configuration of all plugins is saved to " "its file. This means you can have presets that combine the effects of " "different plugins." msgstr "" "Bir ön ayarı kaydettiğinizde, tüm eklentilerin mevcut yapılandırması kendi " "dosyasına kaydedilir. Farklı eklentilerin etkilerini birleştiren hazır " "ayarlara sahip olursunuz." #. (itstool) path: page/p #: C/userpresets.page:21 msgid "" "You can also make a preset autoload when an input or output device is added " "to the system. Just click on the button with curved arrows while the desired " "device is selected as the system default device." msgstr "" "Sisteme bir giriş veya çıkış cihazı eklendiğinde önceden belirlenmiş bir " "otomatik yükleme de yapabilirsiniz. Sistem öntanımlı cihazı olarak " "istediğiniz cihaz seçiliyken, sadece eğri oklu butona tıklayın." #. (itstool) path: page/title #: C/advancedinfo.page:10 msgid "Advanced Information" msgstr "Gelişmiş Bilgi" #. (itstool) path: page/p #: C/advancedinfo.page:12 msgid "" "PulseEffects audio processing is composed by 3 main stages. Each of them " "needs a specific audio format and sampling rate. This information is show in " "the headerbar subtitle." msgstr "" "PulseEffects ses işleme 3 ana aşamadan oluşur. Her birinin belirli bir ses " "biçimine ve örnekleme oranına ihtiyacı var. Bu bilgi başlık çubuğu alt " "başlığında gösterilir." #. (itstool) path: page/p #: C/advancedinfo.page:17 msgid "" "Another important information is the latency introduced by the audio " "processing. This the the last information shown. The displayed value is in " "milliseconds." msgstr "" "Bir diğer önemli bilgi, ses işlemenin getirdiği gecikmedir. Bu gösterilen " "son bilgi. Görüntülenen değer milisaniye cinsindendir." #. (itstool) path: page/title #: C/saturated.page:10 msgid "Saturation Warning" msgstr "Doygunluk Uyarısı" #. (itstool) path: page/p #: C/saturated.page:12 msgid "" "If the audio signal arriving at the plugin input is too high very unpleasent " "noises will be produced. In case this happens the warning in the image above " "is shown so that the user can reduce the audio level." msgstr "" "Eklenti girişine gelen ses sinyali çok yüksek ise, çok hoş olmayan sesler " "çıkar. Bu durumda, yukarıdaki görüntüdeki uyarı, kullanıcının ses seviyesini " "azaltabilmesi için gösterilir." #. (itstool) path: page/title #: C/autogain.page:9 msgid "Auto Gain" msgstr "Otomatik Kazanç" #. (itstool) path: page/p #: C/autogain.page:10 msgid "" "PulseEffects auto gain is based on the library libebur128. It changes the " "audio volume to a perceived loudness level that can be tweaked by the user." msgstr "" "PulseEffects otomatik kazanç libebur128 kütüphanesini kullanır. Bu, " "Kullanıcı tarafından ince ayarlanabilir algılanan ses yüksekliği düzeyine " "sesi değiştirir." #. (itstool) path: title/em #: C/autogain.page:17 msgid "Target" msgstr "Hedef" #. (itstool) path: item/p #: C/autogain.page:19 msgid "Loudness level." msgstr "Yüksek ses seviyesi." #. (itstool) path: title/em #: C/autogain.page:25 msgid "Momentary" msgstr "Anlık" #. (itstool) path: item/p #: C/autogain.page:27 msgid "" "Controls how much the momentary term will influence the loudness level " "estimation." msgstr "" "Anlık terimin ses düzeyi tahminini ne kadar etkileyeceğini kontrol eder." #. (itstool) path: title/em #: C/autogain.page:34 msgid "Short Term" msgstr "Kısa Süreli" #. (itstool) path: item/p #: C/autogain.page:36 msgid "" "Controls how much the short term measure will influence the loudness level " "estimation." msgstr "" "Kısa süreli önlemin yüksek ses seviyesini tahminini ne kadar etkileyeceğini " "kontrol eder." #. (itstool) path: title/em #: C/autogain.page:43 msgid "Integrated" msgstr "Tümleşik" #. (itstool) path: item/p #: C/autogain.page:45 msgid "" "Controls how much the integrated term will influence the loudness level " "estimation." msgstr "" "Entegre terimin yüksek ses düzeyi tahminini ne kadar etkileyeceğini kontrol " "eder." #. (itstool) path: title/em #: C/autogain.page:52 msgid "Relative" msgstr "Göreceli" #. (itstool) path: item/p #: C/autogain.page:54 msgid "" "Relative threshold. It is used to detect silence. Whenever the momentary " "term is below this threshold modifications to the output gain will be " "disabled." msgstr "" "Göreceli eşik, sessizliği tespit etmek için kullanılır. Anlık terim bu " "eşiğin altında olduğunda çıkış kazancında değişiklikler devre dışı bırakılır." #. (itstool) path: item/p #: C/autogain.page:63 msgid "" "Estimated input loudness. The difference between its value and the target " "loudness determines the output gain." msgstr "" "Tahmini giriş ses yüksekliği. Değeri ve hedef ses yüksekliği arasındaki fark " "çıkış kazancını belirler." #. (itstool) path: title/em #: C/autogain.page:70 msgid "Range" msgstr "Sınır" #. (itstool) path: item/p #: C/autogain.page:72 msgid "Loudness range. Indicates how large is the material dynamic range." msgstr "" "Ses yüksekliği aralığı. Malzeme dinamik aralığının ne kadar büyük olduğunu " "gösterir." #. (itstool) path: item/p #: C/autogain.page:80 msgid "" "Output gain value. The input signal will be multiplied by this correction " "gain to bring its loudness to the target value." msgstr "" "Çıkış kazanç değeri. Giriş sinyali, ses seviyesini hedef değere getirmek " "için bu düzeltme kazancıyla çarpılır." #. (itstool) path: page/title #: C/blocklist.page:9 msgid "Applications Blocklist" msgstr "Uygulama Karalistesi" #. (itstool) path: page/p #: C/blocklist.page:11 msgid "" "In the settings menu there is an option that allows the user to apply " "effects to all applications without the need to switch each one on " "individually. But there are cases where the user wants a specific " "application to be excluded from the \"Enable All\" functionality. This can " "be done by using a blocklist. Just add the application name exactly as it is " "shown in the \"Applications\" entry." msgstr "" "Ayarlar menüsünde, kullanıcının her birini ayrı ayrı açmaya gerek kalmadan " "tüm uygulamalara efekt uygulamasına izin veren bir seçenek vardır. Ancak, " "kullanıcının belirli bir uygulamanın \"Tümünü Etkinleştir\" işlevinden " "dışlanmasını istediği durumlar vardır. Bu bir kara liste kullanarak " "yapılabilir. Uygulama adını tam olarak \"Uygulamalar\" girişinde " "gösterildiği şekilde ekleyin." easyeffects-4.8.7/images/000077500000000000000000000000001424023573300153035ustar00rootroot00000000000000easyeffects-4.8.7/images/appdata-screenshot-01.png000066400000000000000000001412231424023573300220170ustar00rootroot00000000000000PNG  IHDRT)sBIT|dtEXtSoftwaregnome-screenshot> IDATxytTW&d@$MPAdGEQP[QWqWVKmZk*RE*l  !/ d&7qܹ3| II:\?h"fv|7^J#,HR{}]vCN\.\.@ l6h݋RSSsa{KBBв2n &.44T{]Xߌ7 桼\){] ((-=Pr\'((,vS.K;wСCT^^^mnWllRSĂƠEMr+ߚj۶mBMܹCGf+..NtڱcF>גc6+*ʡΝS-iعs գGOhnusV5i_#5y:m, Nɶ6MݻwڵPݻUXXhusVM9pb=\n[eee_rbxjX6ɕrn>!VM9hYՃ ƈ PI97|@E0 @qX*~с > өߝ*H&*$I\F^+ViWF~s?6{>yH&j@cB Tsޟ+/oW^UIINKKӀ3Е.Yj-X*˥;wj݆E\jŪUࠜN&$1eos5<6|V\)):wh;YugGsrmx쭙h꜒\h^{s^{sFQJHHycheeOR ;N={<_6 5FGGyXiG)cEEFjo>^u8+K99GձcEz?l%zTl Qbb~sՕؿ-CS׀j*2~s$;5rWd2''P;zhZhb#uU:K6dgf]k׭WvjU^=z(::ZT=zvKHO$}bSJJLUW^b%OZ9ッwfѳO?3?@R{_=DIzvUXT/'^x_JSKknܷ_S﹫ޏ]/j6f׶9MTUPXXjB vMMdd.If˖-}VN ÊU%BNks"I:IV_|eUۄ=im{Iҝݪg o\: -ئRIR=D_>T?mfI@e QPPP<|zꩿQnZt<7W>'߰Q.^c)9r _&OV>v}6T3f(g@ڶ}֮[T{_)""BiR6UPX8]Wܩg;o:w\ZtJڵmN;ߟ)WZZyW -ցy瞫m۶Whz{'iw: I.Kn[W_w7sf2]zZaBBBtC۫')88X\:|XmZե]$I*((GR6l$xN[<8/%5q6':M5{TPPn>m۾]ɝ:Xu /XdNIҼ?79睫7h$Uj슊4"v:DE5~~^~vܥUרPV43^Pt*--_|-Zx ۭe,WgE>?/E/#G8t:+:!..Vw?`\.4%:|VV{UNTUm*!>^j-rrHÃqVMp ǟ(??_O}:|X<sҋt:ݺu|JIኊ4x>.^>{i1WkXNUII-_/peeN;IrM{ rg(P=(]v:v~y{4r0_C>7ghz򱿪T3_CPzumSc.Mij߮iNUAai}9qϵ姟tMC+I6e!*))$kN UTTTt:t:~}OWˈW.3|Ù={wMVhhZ{nڹkW-?(ۭ̑P^_~6mhЀnVڷv٣IWLw3 j]2$I#G xl5(IسG߮\ܼ<9~;_PP =nكkݺu6ly:ޡÇpG?ah>?Sb95\$IW~~ *)))s8n.tu.K!)Q}n9B_pfvKݮ PdW\vf̬Hһuӎ_l_V؋E//[Ӵq&;Fo;sǎцԽ[WAAҸc{6mA̞C[׮5z~/̵PaaaPl6x nY%%%+kkoЙUﮛ1iZtztVpiM>z]Iҫw6vm4sz7hMU}WzpTP.x^IuxNu;wJze ryy&XQQ Ѣ/?'9(Hr:uHN}!ZV{Oy~wd15{m/|yk:a MvNu2vVJr$iWFnn=ӊ۱P5B>t/X{33u z㭙~}O6KR:%Ц?X _~%I:ܱ0R39MIɝ:-[rT)ڛ.cGAUwDU:rDqq>O^3YsnjܦaJEժ5k4j_P֮ix@tˎ/OL̚7 zh;ŋq #5B_:ii|_Hwk+(({{}|XosNI֊+%6GU4oڛ34jİ==5$ 5x{>PNMYIͷݮ]?hƫ/Xu &]q&]q$郏?Ys*lRz2vцƌҟ$i5:/1gMk&M[n}fUX\qcSq\ڽg۷ֱբEͿޭCP$mg՘Q$Ut:rD+,,T]OKehrDE);'GrkVRE٢E k/dndRu霪Z' U*Vm73SztoVPD맭[%ImZR 2XK-I={:}MޫG]qe>TY/N 2DrDEiҕW]v鯼;vv+h꾊qWn",L;W/nMH={TRRrݳcNjJnϕ*-YLy*))Q֭/|9evsgͬmsmtZZ?+:r=y6osP]zRIRrWddK}jff]x;8א>\.=Sz'܊.Cg&YiZtʝNEhİ_گ,T I]?slAJJLy玕йcFk`bEGх矧_ pZju֠:{`\Z~KJ2"B}z B|~y}'+/wj߾ N޽zi5nDZcǴc.l6UY6hp=zk ٿ^{zi֜9ir\j6AuҺTLJkoWhw)}{vNfo6I$srz^}M94jdEsG҆j#HN}}UvP~3O*?@1mtE{:zz^|5sJ^S>W8PnrzwMucGkcovUZZZFGT Rqqߎo.,]H_y|[G;~&cvl r8Z),,LCG$-[JJJ{\>o۶:߇YaŪUr::|@Ӷt"PTT:u}ru{I Jl*//W~~ 6m+& RYY?V9zuϕ*ccdTZZcǎU.m߾f#W}V׾mFUgNIn:̬Q8u)TN ~iRnnFnuSkoUۗizcǎرǜN{_u=xԪ_ O0:Æ޳6&:M tz}56ͯ:\ z j6o7gfkshP70A@{{@Khr=F#H&)70A@eu h<P70A@/r$hc;)70Tv]N[aYك\_قnJrUX})!c鋷**..jUBB;޽K 9Jqq:.^I3Urr$)+밊A'+++Ւ% -9vXX vQTơSd>|P6SYYiTjX6"(??ٽ` @F@KXJt:nlf,O> hƂ$1 ,*~,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,E@KPRT,bud)#nء2fg9z$mu#4/6{z]v}Ӂ,x,rm_cO'jٓylw"jj_z9=0LH%#PcXcujlsxX1Ij0GN~1WyVp}@ (3qU @-(fӨGE5/0ԝ%jj:PkMԺS4zxtMVL s\ݵNȄT<o;rw{nn\aƞW>*=̢V**WV9Oa gwvgGuޯ=¡qSop\奆Ƒ.coQ=6{ Cp:qJ5ZQ頎'O=IGP@m_E4eTP+Aj{#UΒBm9գHJWL@/h/6l/Ym_;SkH׋UnC}};Au9Ki"K@ewT.ȄTLH5[%+gpǸZ_}p9˴6)}s_sb ]Tpxg[>cC2%ݯUs}o/4[>nZ>rbk#%IջPp!88*ڼ$s+ajǂ=O=LnҶ/51ΰ3\@%U|iWuLGRڟqE-BCac6/Wo>EMY&RCc!X s*sAkTa^]^;wUa^G6(zb:{srv1gcUwDy,{q*\ݑM2YI:30.ZhRF`uWy!|//+Qhd>^UoJc걅Iˊr 7:IJ~!XKOVIRLYT/~ rv,x#*=zk_Ű'ADL{,Ʒ߳IgQK8AQzyFݥA/jؾ5j,x&$l_Qt9KwegX]e *8J!?vQNT]*6|`g:fhKK*gw|>9gqVO [%2nBbuM2oUxtS4ߏz\Iv}7},wfwNU2XUP\i$%FQ^Vb@RV$aٙ6l]s%3k$Vi㦘>俆kl_mxBuQ,*+Uy@kД*:vuNS?uXBԧ-\ru0=L& FMO7ARiQm{铟6L:opHnע#A48_6GWYu "ۦ*hezߣHJWxLRl0V+wzInC [y;A{[VuoLQϞ#,ZԖy<} "RgLOJNԏQI[@eodD&Wbz}ėv.xP4eˊUVtܣ4r%3&gw*1!T`&l&7_mSM!a^,)4gmY"8DtM' m.+4.mj3T|Gfo!WYqKpUuyGR;pUZMP9Yw4A*bQ~&.Ng_S)}4r×4QImڣeHTkЈ,'c ~e)M{}ȶ8xE9&ĥSRŷc7Z۽0UʈڿP5P7/4W1igi1 ʊ0{G㐫k*'Udhur41FdBMV{['5h4( Б PtڹUc4}lWo1F1m6yt\J6o6YV{ipU?ll!-Lsh73 uc5K{ s 缶}-U>بoQm2`0@4mm`}ՆUqO+74CRd|gǼ[WVrv1|mhd=Oz Í8ϰ`ALѠTmRͯ,)8Kyy}c9; J0i *X%4/TMYնϹX2P:㊋]{}yR&Xwby.a=Uףț҂?ʡQ1*8}jzO63o|Ag%s1eC=!p>AaKn}og)#nКn4}ZuF\Mkb 4Խlz.6_ ^xz_dOqϩX9cG=hh0GgR`djL~o~E?{KG[HzLxD!a|,*PS0J Ƥ m +C>}G9.}:䏦ze6ZI{=OÒvՔ#)?8VQ|;ۘ Զ/7ԇ_#- mi=sɴG+ j _oTcw3^]X5QnzLxgLjܘT=ؘͥ+ZuSrW7дqؕm~7ɲ7IP-auicԗKTWU}fiYRV:^Q=8M'C/wfoa֝_4ԏޠ_d\L Nc8|nk>qa㉕ FU7V{ {ծrT RHXZZI4!zY,:4* g٨o˝Rky@e~ASBBrnߨe,5=E- @} ]nӞRނ$ً߰:m,ۙXuU^OΎL'C6ٺ8O7{*:Zw:ݧuOW+Ԭ IRDt2ףm__9T1ǎ no^c~gHXK0_ ϞNϘn:^v,сer]M[~YAq R+5 7ytNH904OO54oĴ%2KMО;$25%jj?#)Z[hdҼl-'5pq?>Ӽi .N /\81C$Jss=jmRlڬW{ĴGh;l}a>qCGiϡ'I'xnݩa#r~4]!-g;U{^fvy)غr9Kuls~&CM2t{`9mZn#x ʭ[U\%(z[uh$Woa:Yr$75Ӏ_J */1жz,ӷ۩ur_uZTw0h?ycN+6T@kxp*.g݇yoϚp)JwGyʊr QĤ Pyc6q7J,_㐫Ծ߅zY-NI^v82CsMQ9ƞ![=nmrCRK/ \aꤎ06<:QeQچձ*gIm[6nE-0EUQsUHTDL?0M4-o{/]q0hG͑.pG8, Z8רElR>զMikUHC1,{bCpe6J1i 3-,b kk*Yf3jFuڤU2?$ٰCO8\z 6{el0m&R.*@" N*8KgNAѩ-ecmU;b(Y民C; ={I o^yGwL5}ʓM$C~Wc3Y eoq?_R˸d%u4qH(}x^ud_Z#fwh3ܥ,d ųG8ˊi86}5yw` 24/mz4MQ>Czv7uf D$0;Ӵ9UP5e޾mŷp͋wER3'dߺSZc'*uUVwUI֝<0HGw`"о>ԮE{ϸE[=ϰ dk-Iω*=jkB/zǽz*1TJz&f/u3 Ri,Ajd:L)X'¯, 5a|F9ٳD݄46%.k31DeE=j]YRխXl~ZVй9Gb7J"(4ڠuO>8v3>L6{قύf⿌bFf8FtP>cP sk;=ꎤtbC(]PƠmﱿ|9SH(0gɚ Ǫw4G=Em_'*Ԟ=N@`۽M!LHUʈ -:pbu.7'cS*%yG[eXQtF*4MroacYaO~Fv&᷅-jQeiC_j0`rZU^j6H1i{\gqU 3[e/Pe|Tu<ôl>4y? @ҢM{Ch5*P#Vܢj}MUtjJ!-~i㦨гǞ-خMs1d]pHZng*}OG1Np` X}r<PC:TGoU5+Z1Ij{h0 @re [Y"n(C:UU5aގ/}NƞfyoT٪|6O1IJ9Rf=d;zH8zgoVI~}LMG36jwx?E9 =: щ^mMoe%t.P~=%Gb7٫,H^7~%*R^(ڳ]#gjӹ^sr/UUϣ>5\㴌O=Jk 4 mSaZ|Q>Ty:i{VG'$ʟU'GWu>sn+hihZ&t62@n//JrqG?M.gi *(DfX1*<3d>jV8 U=jdUhDL:hQkZ| ?i;=j 6LkXI74*F%"ӛ귈mn78`CfgQÚʟrdfIqa>쫔4h`;SK g^خC+&,Z*IdwjEtEaQ1ʊkꮭ5TC6kVҀ[^WIZ^[5k(oulv/8 ʊkꮭ5TCjGa8 PD`RT,|N;܋ojOޭ"##+YkWFN[{ ]=ǫSuUh7uTeޣaC֑#9k4sl;n˰>OWyy-]'zZϽ0]={]۶5~&經YPS99z˯9i?jlڳw^xe͙;WwU^==o59ywfϩ&u%nɄ4k8O5=z7ԿgO[V銈8sT;n=TۃjŪL=?+/UVzUyy$黵K/p^TVVi=Q;wh}\fBBBtz QѣUW),,Oun8~:v|y&\vBBB$Ik[^=³K?W^|>UT瞪5fH_=Ւ\<)gvi*MoqcǨMrDE?Tƞ=Y{Ozz衘uڶm~޾^7԰kZj[l۴Q=eh,bcCΒ-(Oun/9EW]yZjȖ _/8_mڨMֺ nÆǹ:TUTT i݆ ԻWO ?n9jzi*M/fXÈJ IDAT;+WZrNR޶;t=UvrQI/Öjwznpb>LA&/5y[do8Z9ZIU3%rD9jݻuSuͿטQ#jOuFC*өfW.D:ZF^3홚̚V6~s0}r\OKzʓ'Us7|TTUWNPtt}r}IMuP1YYƛr%"$*c[׮ո1B;W>g )+sjcSuzsP=fC.$Ղڼec_{]{f+ʵ>穦_Gv{^{?ڕ[Ͻ8]s㊨e'ye7Vj)zB-]\N+˥YY?p@qqf?$KzBGt z|JxǶ;vR}~9~m'Tevn>k@6!^EGQNNG-((HI6nzٹ&ٲns1MnS穆DWPppv?r rx2>OƊ)ȶmߡ^|Iwb+C=ӵzZqq6oAXv{8֔[n\/W|OW^!g ҼxlhRѯZ>y<*o綺4_g dۛcCCCep]^8ıcǕu䈒;u|F !g 3[6qjl6nV*&:ZA&_rx2>OƊCǞЕ_fڝsҕ;jO?رz#RSRjM55hU}pZdƌyNun >k@uZfXҲ2}ڹkF &IzwUZZ¢"͜5G99{zy*Pݹvg*ŗzw*..֑l_hЀs陉nZ7߮۶NS _ݮ!g ҋ/}tO?{4@d7Vޞ5G95[oI;V[nQ/LEYG3FW73SKY}]ߦQ#yh6o٢B5yoWHJП-(Hգk@6!A<8U3zwQTmǿ6$$PIoA@G_{A}{džXPHQDz U:wc!H$>׵Ιs枓aݹs^yc2 4IaԪ{~H|M4/JD*\I=9lDtTC:k @&|,'`EݸaR/4$afҋSS}ǟ&ATT_ŠΆҫ͹9"KDDDDDDDDD΁[XDDDDDDDDRJDDDDDDDDJ *q+kbbc5,,1yLSDDDDDDDDĭRJDDDDDDDDJ *q+%DDDDDDDDĭ@ADDDDDDQJDDDDDDDDJ *q+%DDDDDDDDĭRJDDDDDDDDJ *q+%DDDDDDDDĭRJDDDDDDDDJ *q+%DDDDDDDDĭg*EʹCZ1!={Ol߹5mB`` ){(EDDDuT?g`,_2b07H!֬]ǟ*v1#asHh *iƘE3\wf9JDDDdA%"""RC8:;vkqt4aaԋK4rJDDD,%DDDDjڲ}yIZhpDDDDJLS:4ӽMFLb{ڵxLw}mZi\ oO"*ڷm͛H)AիVZGTJ@'yZMۨqm jěE,̫R*Zhb6;R+?nѾlϢY/z5#@F`dղ}wZnقMf;$:A1ʎ6l {c_[t<+c&Dd-k{`f/?,&ޘ30@kѳ6N#¦[-_+ѵqd>_V jDD'IpŏHDDDlڷm˪5k?\تY;m`ZԡcbӻcG!ۻex{qeZ233,V\ErJ p1nْǓg:*v5k̤s:M['3 <9z_~9 VMg4,oPx-u1I8 %~J]^/gt`R3|( i@Z_6&1e!3JFv~Ib}kxo!~ޘTd]Yp6߯?N ^Vڞlpo2݂iE:7 3_<Ư1 L%DDDj߮-7ĜU;G&̻-[[WBCBXǟ_(~ s%pq/^yRSYoaYf>6޽zj223ٲmZPrJDDJ5L(_bb3Hvtg*7W3VI/pkJ$*ēMc_rļW^^u}aZEжw'l7 C;kFWl؟sm`^5+L7 y7YyNHQ%""" DRV-0vr~C ލ'{;Ȅ wA&$x lۆlf՚t>~|}_ДNxCj&>""XaLx;wi6n̠2~8kHMK#))~@|_we>IMG¤ٽw >̻S?d51bˣWsUTa5Qnutmdj";uv&iPۯÔT~FQLKwJNki≗͕|, ]_ZNMm$+IR4?o36dh 6ed[{ָs1~[8z8nٜڡlgYx{{P6Y4@Ν/l ///WdzuYf IIԋnx]??Xnb! l:hP~,*J(V+@ٰ֭q#ii^LnA"""RR%.>!4 wbK#_ܞZdfn]ml8-À3wr Rs㳽Bƾ(K.sHy9f_};ew-[ԡ}a~g6~Uabu7Ʉl)}{׆mt@zv/[ۏj777*j3^`݆ ]UҪE jo~^Ejo:W=5]8 ȥ3iL챜OG!> @&~䴭Z GX5Mqʝ')fDN., o3{dީ1y~}%;R_˃uKUWDDDrrsyI|:Bɩӝ:T\6m\Q jmNFff~YY5ѣ\تUwڳw4t=|EݰX,|<bM)GPhli'g:AvQBC=0ryKsϯwr 1%@w ˕ oϑlmK4>+vahzc84NQu]1wQQ!/WlGbkӥk4־c 0(oQ:EZz_O w ۭ![S `X sIv[O*I%׳:?Æ$bXZ%WAm3sa=oFw N3xwab/~CL'!17 '+VEyGzl޺KD D5lP{={/Xv6ةyg[v;}1Zl_lޜZ*%Δ_QSNg&lK/\:1ҿ퉉hDD| /dR_^=O}Ž璿xWe :ڭrssrp_Ќ7_}ለh_RDDDDn-eڿKzu6%"""RJ?3JjeUc7=wޡ䔈T'"""RXV&>/`ϾLf S\9rj;L29?);M);RJDDDDDDDDJ *q+%DDDDDDDDĭRJDDDDDDDDJ *q+%DDDDDDDDĭ;qyMٌiԮꆈj8(0N;p7kwcdU~E}<==i԰!-3hL|qڵi0 ʱT""RzJPcGWk76q<嬜cɡ#ywL6֔>(+oLfC&n7y;ZjEDD*T"""'~~Hy'G8kq``#G )UݚYǟ]oM& {Fn9PDD(A%"""%O?㯿͚rmR/.CGbғO2ut2糏9>.kӚǎasYf &1d)IIIr\ܳOLĪ5k0h(ڵىO/*ad_>HKKgz: }zƱcVϯx}%#G /*/i3;Oz<(!p>l?(L///rsxۈ[///8|O>6~n[oн[Wޭ+C]MP` _oIxvSLSwST,xk.e^yδ%3#''=K@? :++zB^{ם듙:m:/? p>&//#GwIXL~g oOy_$^z nztFzzIIcgLaqYyeL0 TBCɧLL:@B4qE~NHաU :L>bqw8%:m%-y[RwѓǸ;JgYt3}~}o"p筷l .[nu˖ӻQ оmbfr .Z6o_oywIH<_&`L>1///_5qcF痗z:|v2Z&0 BCKܷ=h~AOE]iڤ }z]+oY30 [nc۫K:ϒΫ/g%/ooDzi˖B59%""UT5ĺij8vp7&܎o뫢o&?8Nc^rw(""72Gqqf5mbf+8js@l{ݎyl_};ml'#3phIN.N䯿ϸvP,fs~yY >!09f\6I:u*$*cǩ]zA,}\Vةez\Ե w{?.&8۹PuXyt^e>Nk'vmJ2S甈T5DvF>Usaۢf^0J TԘ0\9xx“qtXj1h i*98/_~ase@ʼoTΦ͛6+ʼ&O<+nONSܥ밤,ſcYAD|Ooqꐜ::*"R"tsmAddcæԯ#n] q:kgl涛3wޏaa]YܕmԵ#/IK+ayOеsg^|in?}ZaTҞgQU̡Ç Ly=5߃F *)V``7ߙBx326c&&^=W1ٻo?;v"))9}ٳwii9zBnm\Hv6ue__;Laؾs'7ovT~傦MXo:̾\v IDAT۹:lعk7N_/#==TWF~tŝWe5H 99LY&k5߃FS3 0V UsX9X-`G"QGDDDDDDD1*'':u] :&MҮ];^>X~y]xW1 Ç^1cK/^E3j(Ly#)oYl֬F.5\KӦҥ+ӧO}4mڌ;"(.Tz!ڵkGVλ8z)C'=y\wu4iҔT&ZLxп?[?n[RtI,P?4΃ItoKt'>f+'8@tn,PuQV8s8܏Oqb^T'n~rYIɓV6:/(>*q9'Oۺu+)))t~?'*f))"2)*f͚On 97Ӏ\ABaHhmlLh_bpqv%rd82ah ]rӤ@%&bbbxGS.f]۱liӆ 6p7p8X`a 4^`-C=TqS|>𡃰Zkǎ19\غUO*/b-[.: ɧp;4FP$ZDD_!!3 T_Gt(fڹUf̏գ;͚4.WI%T1Fҿe]Bݿݡה!l^fg;Rڼع f Z_;aMg.︋C3f-|ucEYѽopc5F>Qth󖭬XƔݷ#F22۱s zbJX,f2J6xH|-w{W ;wp<)~q/XMpED 9s.l֘?h/ wSZx匹,:N'gwkW'ݡ3Ǔx7޻ѭ$%'~B!\ѣDԭ cFѵs"WL{]232yrҳsͰuJtw(\^Qygr@.'{vN7Nޤq4|m_~AdzoUvz<==iݡTkyyy9zNjf;Sx{+MDD %jnSndg;<Y,ݡJpn9g0 [nc۩]trrr];NZA|%oO&~'&bu|,|}ѿe,{YLP8N^yE+Bnn{ "醱>l6m򕫘>݊cǟ0| /̪ui&u1#D ia}T 33*=\CED䜩E]p׽3:jKU.ޝFQ\ٿ/[K2fT|Ba0r̸muT UT>dsJ*(L\w̧72|BuF_h[^^L}믻АJt|vCqkժDDjQJd2ハC"L&&>8Wy?1;[KKU?<6 \ЬiZ8vh}}}}ZfNdKU3SxېkGqk- $y~&._ҷ`蠫+$dt)5R"""R:JPuܙ;?3OKֵ+׬=[O>!5<, 0عkWjؐA 2g$!O>H>ŕW;o{jf| IO=z~}%ܱso>O?8j;fpb d=EYD_H!^Fzz:)ϯߏVt rrs_ٽg}zˋvt:sYK //;wq:=1 z5֟U;醱rQ6~8n]gKuϽ5ÆҮMws^EYly}NL(꽈|ׯDDDTL~g 4jCݓ_+e2ΐ0Lo׎IOM <,?+oLa0i"C]'ƍʹ-o;nc̏y̰!iݲ;NqQ Ю-Pr_'4$afҋ#k)V{oe>/pa>3/|oeY}ֻSp!ԡ=OL8|x ; jESDDDDDDDDĭRJDDDDDDDDJ *q+%DDDDDDDDĭRJDDDDDDDDJ *q+%DDDDDDDDĭ;%KȑC8NwS,͊ژL&wS"ՊM*%^08pǎpTxűZR~jɔo;9{O퇯)Vrr dhwS"#}hԨQ&&&V8@nn-[lB-t6oބ;9I#j#Gp0ͤ;blۏٳ? *J``?F۶"##Rq&f͛z*%DDDDDDm!r080l;R3-6u277<550 EDDDDD!=qw8c2Zj/b2 'ףLuACrԿǮkT.fd)m+iͫ '<8k_Q|kFO_SJPTJ؉6oq׫Er Lp;޶*Oh7A1/T"UT""""""BvF>~r[-6AUM?:.#6v?Ǐ#--ق74hE X,ƨN卵իƫ> z1|pn&l6[,\RPuW\\+W.ߟ֭JppTv޽{ظqu 22!K5QT;vvPbcc~ibccy*3>)Xj5.8i٢Ç\ [oa˖,Z4oU5=z8zvg૱l8Zlɔoӡ+#ft1 g,fQh{rr o;l.h֔;!:)9xF\kPtb26fDD+r{~F?ƕQ>vaMR/"]) T~\j6a𴚱YLX̮LyN\~l2a52W9'p%&Wr*'I&bF^R3Oe.ڵ3gk.Zhfbرcx aҤgΛqtˬ[[niӦѺu+nfvСظqc~_|L׮](1~v".. `ժU 0u2w\ TUuQ^q%___ڷkClٺ-_ՂWl6N_9_ ?}mSrssKlODDDDDL{)\ri޷ܷoXzUL`N*ҹC0mRW# "'KUV|>+>u?ˋ>Jt(vê5k֥"nԪU9u:0/#*Qr__;W]1?,-TڷkGpzg#G )lpYLxL UmY(+#,Nϖuh^NjvA|yN3#yPެ*"鑑ӲeK O)?s'ef3HNN.Mpqms~˻u놏[nQ8ZcFGGpB9Btt4 6<JګjG?tN:LHp3k/oqeVRrٟ3p:ꥦ䷸[k{|?YbH9rFp䕻 #ݻP8YYY$$&ЧWm6:ao0j1AVz/_6/Lc'Gtl;΃Ito2e1^eAU3OUEOpBN:v3mXD'Nf,3Wcn %Nfxssr0[,幆h1EDDDDr8X,gwW5<-<0'7+aQ]I /2a0H^zr$%lj/y2͛s↻YCMΨ>\bul6၏Z@ϯPʪ~vE6fHޝ^][GrN3 L;?"""""5IA;vw.Frqvߒw<`^`BBBK,8 p8 'dpү&J6Ez(̏V' pkU 5jI%&||b୷*m7_Ov9">~y9i$&M^z)ꠦ_xzzYfX ,_ڲbUt֡JKKcOHqx]S/uJF4զMX3=SDDDDD* 9x0r'ILle^^^?6/\#ѩC+Ӏ\ABaHhmlLh_bpqv%rd82apݗ9Xeʚ~PV%'|`^G^_  [ 3L$9\ѯ -EؾHQ׏X222J8+##{PnD߮m֬]ǡC%K Mpppϖ8 u8)))\}dMrx2};oLDDDDD*'-ZfӦ l*drݣ &&ma ׷O/WmE7"QTϖq?Ng-g :2s LeP!}'6;LĿɮEP)AU>̜nMSN))p8ҩ=.ZDDDDDDӓ&Mz5K'46v/^l6 tFzzGfƍDDԣUxxx,Ξq_g+jqR<BU a6[HHHnݺwS<٪b~ mODDDDDo~~~\pAs@l~ñ\222HH'33vV諿 ?UM[H/r^oU޽ PJ#))J;ɡ""""""UdnӠAC8z%{.1-x{{LzԩS__1rj*%j:zJ6lXKnn)lOO;fhР;"""""RyxxyxT{dd',,@PYe)*`*(j-nJUՠ}(cĂJ *DHb2ÌuM!9=s_͕x<|2MSv]:jX9lCA&┛KX' .4*l6"##Cvv#)CrDS[vYCbK;wf5~PP &%+4AFgk×j٩IViTk+5npқE['Z=`Z4Z *4Tpj<~c2=>TeuF^۵VG JrM XDD<I}K` ^XN(uVG i -}(5k\v+99/ѬQiiZl}J eK *b*//122JgVZ:l% eeeJMM:!Ű:~(`) *X (`) *X "jgϷ|V PttRRZfYQr\j߾CH PP>*WORllq8%KZef:N^***}vk8 0g7W0 UWW[' #RܹC#r؃*Lx?D'5$ -Լokl 4PӲBgz{y%IQV׵LO8hAURRKΚ2Ol( suuyd-Z};鮻RnnԦQ*/ߣ?\IIITTAK.UUU'|BN̈́ i&[NIIIѺvզ2eVZ> g}Vԃ>ŋo߾:A%''K̙^xQ۶mS\\/yǂ?T=ۯ7~W__:\C^W]5Yz?zt;Gԩcz622R%k-~6}%I8p`r\wuS.uueVu֭[?7RLK^:Bv=ܫիW /TFFϟW_}}̙Hj{\sO6M6\'Hƍ^ѣ/%\zKݭիWumiر2 CIIIǂ?T0Mx4Wttbccս9:Mkm?7".N3v-IJII x_|˓$G#GO?3gJz讗_~Y7TPP_~I۷5z/$߻k׮׿%I6b z{]G$[sj*\R'Nw%Iڼy,YhӦM#4w~S%\gP}[^.IJKMmpp(yv{zْV-35hAզMIҮ]qc,K.K6lkڷoٳG۷W۶m%I|NvvH5kf͚`XSll{y-\ p 8w~S'< xIҞ{`l 5OnL487Nk:t ͦ ?>yGg|a;zkpm@CJL_V7qD͟FOffZjuW\? ڀcO%4Cڟ)ݮ7ywk_cYc:fi~8z<u-Zh7ڶmLKy<Z$SN5k֨?v"lذA:<'++KTZZ^z5J222SOh͛7kժUNw<^V)uJKKUѧ7ǞPZj?L} 4Դ{[5g-\P]vQ][EEE:p֮]s9GW~~&OIYYY?_~?)==Cst7;W}=]{޽T\\^/^|efSMM>sIRrrc;gxb?04r0%7K'Tf=/GÆQll**,ނ*RRRhQ|)jժOT~Q<=ג%KYԩS'wȄm޼Eo1_mڴK/={sԴiӔH˖}LuQiJ}{]>O[չsl|̱Op$]bb\_y^ Pdd\. d~pm1`=[iiijթM3ԣG;V9\]yxc4?9[}:FJJv{甕){oY7NӶk8& 0K@ #S UddJKKBh@9 *4i$*L]eȐaحQYYHn?* 0MtPqrJIiaux8PDl% OUQ_n8].K IvZQa(..A۷oܲ2TfP8Rxqr8"lViTDD\.ڷy5Ta⣏ t:uՓku**hɒE:|V(ףJm߾]ڵ:a*LٳGU2 CV C4w(%&&(% [NgLӴ:JLӔ:J ~/ TQPP( 䢠(`)6I#,(TZVZZպu董'/8Nii1b)vIIKUUU:tHД)w.\n餄 %Zvbb\߆j7յs }iYa~z^uVZ;MһuyR^^.I:x?[nܹnfݻWt#9r22Zڻo|]sf.2HWL_3Aes;uA42MS{њ5kKv*I7n^{mF\\rz-wJ.~%KHg)77W)))=jڴi *>>|Ϟ=r:4a9=ēz?{v%%%jq>}7o|M0k#<뮻Nyyyҥnl٪Q.Ӻu۲1c֮]۔? OڴYnG/xEGG+66Vݻ3ڴVцs#"r:aAoƍJOhplРAKj*\R'Nwoyf-YDаat=jɒwӊ+v5|x׺\Kzs]WW'I޽IF%gm۶9rV\?>\R˗/ׅUG_`.`$I}ȑOgduM$yzgg5E#RSw8JiŻ^xi^xi$U =}A4ym۶H&M_:UqWYfi֬Y +..V.]_R***tR.H￿0YYYHG;uHT@?f~EEEU]}HTQQh6n3x`^zriÆ ?zYg%Iڿi(< xIҞ{`l 5OnL487N7I߽{zys݊Vbb'jذ\)~vUX gϞjѢEPe""(I:{h䛔SJw}Od7 Cvڏ{3uYϔnכO']?bmk]z0NI@c:ATGeddhĉ9sf|NLG4e/X74YKٴi߯tBIҝwQ}m$]TYyY:u$I*(X &H֬Y*؉RuAZTTkΪ*-5MUEe3c4[o̙g}VcǎQǎ_JZh}*.. /]}$um k֬՝wީ;w$oINKK$֭͘[E7?3$I<6l(iֆs905yM?EDDox a9|%OWoYD垗aC(66_Ps\UBBnwz>}xq=LM6MlهTNeڥ^: ]ۘaÆwhjݺt{_{5**Z_m۶iȐ!***_v(}'Ztg{?z<=ג%KYԩS& V.񓤘.Wz++0>-5U?2Uqqq?6$|[W_+ou&?gOVZInu𜲲+hq͠銮 0K@ #S QP*z(ˆi$*L]eȐaحQYYHn?* 0MtPqrJIiaux8PDl% OUQ_n8].K IvZQa(..A۷oܲ2TfP8Rx-,֗6㩳:Npll6IY$ ͦĄX%FZc+--1ƧhνjӵQ.4jO|Xk%'X'%{uǓ󴭬Rܲ2dfP7!QNIҾ=7*>ڡjsM: a=CUrY#h*5iLTRS!| IDATPDA˄B9uT(e PPRA}Mog s14bnd?~J>M^ӔLf M$ϔH e;Rj|fXSlHA.kժ˗/WZZzaIҡCԿMrWPSZZ.xXP?JKK:jAzvϖMQ6D+!ڮx]NCHC(?e(aSdMNHCNC2 [IU3CN:F;wTOm ''G-Zm޼Y_T\\~>7100ԻCtS$*jXRkPO-#u%ꁷvi_G^Թeta[kwk T@:Urr֮]׉7kСR[ͣ MKvFH%$jhRb';]ҝzjQ\^IR|]#%Vg*wXdxa mR*pWWW,]u;wj̘رt[oz/ oF&M9BE7M6-g)==]555rz3ft6mPnn/͜99sԯ_nFg#GiϞ=&EmJKZ;AQ^Y^'X8./g]e!VS4?n7 /[oBpr=jݺ }z=rرCCU۶gk׮۷O{ӥozZ PϞ=yÇovCmݺU]v$%%%jqjժ̙3Em^UjdhsI}zpS{O5X]PUVVjM+c v$Iї78k׮? IRff;M2EcT&\縸8=_??3mV#GʕԾ};I҈?6m:X8l2lR3gϵ8y=EGNgR<ogGU9r/5qszJR ;jٲ -_ewY,IݻOЁڵ˔$8pM6Wvv.phϟٳ_QQzUW$UTT_~s= ?ЕW^nAQQQ‘iQ%SjSid)bF#{=9O7j{P5}Iq u'ts8/1#kͮoo̙jڴG4nTAA&OIn[SNՃ?֪U+~+BzG4h` ;3%Ԧy> 'W(\2S.5NwTݑKԷcY'wR :H>t|L;.,SO=>|6oެUV5:n|*=dգmnBtY$MBUP_POf^]i˼XMpL3>zѣ=\͛""j.So1d>Rii钤3պuhbŋv.IJNnp,ܘ|)WrkUvօfjhvU֒;++y[Uz%IG *f9JKa+ ;$͞뮻h"+==>kQQzBm۶MC QQQ$J}{]>O[չsl|̱dJ)}thZU){d"[]S4 ŦÕ(M0u뮓y[11 HҒS[?ߧnT>:b>&]c;?v&?'I>)S ;_a ~{ti68?kӗslR^u3Ckg!9eeeJMM=E'}-_\u1%L5Iwn~Cu&gvq՜̠ɊRVV6nܠW_}M]tрN;kݏ6=Yt *׫H ?ot;F{ 㤾@!~ H'v2FC,؃ 84} QTFA&QN#euD8ڲcl-ð[' ۣ;wf5~2h2 0ѣeZv)glqլe;=J\fV V,XV)VG ,JKKX_{u˴v&>TeuF^ ]2B#Mn7B111+++Sjj)J@x%LTMMjkkxnl(81}afr =cX?oT,EAKQPRT,EAKQPRT,EAKQPRTTpbx^-_V>89QJJ l64*""B.Kw 0Gr:I:N@d">\ViQEEo߮vYCA&٣*jpDj!;wvHTv{T^^nu{P -3ZiZQipq[%ha?N(H(SGRVprQPRTP VZ';ˏzǕdeusMO 3>!4*''G-Zm޼Y_T\\~hp@jgZTT|K>lzpE;*)-Ӕ5L^-329ӽ 귿YC$wޚ7oUPB͛v֐Ao>-+,֯_W>Wn]cz'dj{}3W:#Fhʕ#F(--]%%m۶)--]ڻw$?Yt] A=/==M骩՘1cեKWisrs{i̙̙~u6:l9J{it,ԘR`ݷ_o9_]3^+F_믙Ҳo~b:fi~OjjuNHAuu)//O]tuMҖ-[5jeZn.bI'|,IZ#Ie`/ Çkmz嗵uV}r8JJJ4}45o\>8UZzn}hQzu'|QFiŊ֊+t%O>QddxLpMC3޶m[9J+WR$I#F p[{lڴc(\my$)-5qáY셗f녗fKZCO.6n2x`^zriÆ jݺt颏?Xi꣏>RU]]+>i䓕߿bcciFօUٯhI***ԯ_?…+ 7ܠc)< xIҞ{`l 5OnL487O^tt֎fkxcÐ^]|ںu-P{ՠA5pںu.]kذ>緿Y3g>iѸqcS<&nM:U>XVTX ѠAU[[p,YڃgnwopuwUN$IK֬Y*ѽ}Ql6 0@ А!C;Caa$;/\={l0zREE5|pm޼YVjt,Xڃ*--UOV}G>X\XG{Biiؿ3>u^{nxznZӧOWڲe1BQn.I11.]пz @ ڴHUpX' ۭުVG сJLL: aVZZz0PYY>TvarhqeԾ}F-++Sjj)H@`USn/U[[+cuvNbbbNTafrrYI 獂 (`) *X (`) *X (`) *X :N^b}n<:ff$IlJLHURlq;n|z6ܫ6]:NvoTɇmVZrqQWw<9O*ތq-++Sjj)J@x`UX~$۽Ms:N@) z:wt؃*L>T(W1殭RZX?4M%:%YETL(SGRVB ,TT:~1 @SQP-M#5Mɔl6ɰdJLP#)g֏5dAժUky<KϝPGթM3ԣG;:t.bjڴGNsgKIM" 96 4%ϔ[_ 6"k4 -V_Ny|&/̫MA~58ֽ{(ܹS͛7? KGfLE9 E; 2ɡ6j:TSHwI*kz]W'un?]iڝ5&E`PPlRyy/,JNNڵk4G~VnaӨIDݶWSjRdSSO-*++Ikd$}LEK o"ᑼMJBCN[vܩ1cƪcNr-=*//WZZƍ?JKKҥz5fXuUmڜ^9s>NYYY1wyWii?̝;WtATnԹstڻw^iizꩧuWCt7_GH0lRݦH }QUz5JsNrF%I[vb>%JHCQv=L 89A{nx~!%$$h˵c :Tm۞ ?з~}v5~8jJsՃNՙg6+,qKW_}U.ݸq+Bs?=M .@OlG *æZDa7lC"ZSݦU^ZI67O}@Q잨 H?%hz9% Ԃ {n:رCÆ]߃v\T@jBAu,G- Ƿ:z7h䛔SJw}Oz?KM{DG}ᔘX\oĉ6dff}dJ>SLm*ӐNqzb"eSfJڥiy}rۢ`u~>E};&Iq-A䂪CO?]`<>>^W_}(,,$yշo__?v:x1+O6lȑ#u!UZZ^z຺ƿ\kWn+.ڡ %w>VUP_-(ǧCu>՚z{v.=7II&sռy+"¡̶zs9}4i^,)KfxT֭ӢE."B[ֶm4c oJ͘1C{\Գyӧ~_wӵ^ݻOzᅿÒ)gx%пVkj]xnfk_a-YSbUuWT{2l6]vٻ긒I$M4Ign-ZHqqqj"9?n6-YRtM4Q3g>'IkTT^￿P۶mӐ!CTTTvi뮻}/_}IIu-ܢ>}fjڴi_e>Tff:u2I2%ϔ>ERt~-*je=2Fa bSJ&E uռ|Aſl%'%Xp&LFwq-{8~1QuvCaȟG$ϔoŰIQ=49w6)պ𜲲2DB)fJ^)M2Fwtv#6I>Sd3ﱖaCA?%~@TNRA5tP[#PfPBd 7 0r}Q.%ԖuVfk8mݹK6@QP]ֆ/ ղSO9cӨf-Vj*7:N@zfJO: aVZZ0P}ث۟_7*4zdir x^YYRSSOQ*,ajjjT[[+cuvNgDA+;6M.K.WhNy(`) *X (`) *X (`) *X (`) *X (`) *X (`) *X (`) *X w#IDAT(`) *X (`) *X ;vL 0e1 "M6>}@J %PH T*R) @@J %PH T*R) @@J %PH T*R) @@J %PH T*R) @@J %PH T*R) @@J %PH T*R) @@J %PH Tζz|ŧX;@uAIENDB`easyeffects-4.8.7/images/appdata-screenshot-02.png000066400000000000000000002066421424023573300220270ustar00rootroot00000000000000PNG  IHDRT)sBIT|dtEXtSoftwaregnome-screenshot> IDATxwxn6)$Pґ`(""6Dx՟Zb* ( X-EZ  mwG I6 yå^B @`o>b29d2drssv1LE0Sv]UJlM Z, W xGΝ]Pppbc[x"!aԦM;ys39'3MRS***cI=r^٬֭Ӗ- To^t9grOڜSQ~@UP/Ż:qSl6!# er&9+Un{ϲgΙ{[5}@9uPIp݋LGTZ$s݋5>:VM.^+Wd2=j,^^. րj՚uڟc$t-?kt5F=\P-\DcF,ӞޞBS]]}+V.UPvݷO[رcӸQ}rssf:>,ժH bf{6thc\aoiuj\\^ߩ*%KEte}0#G-b;}}|H r5RޕQXX \i7κ/f+~EIk-YT *8(H{D]:u*LMMձci& ?~8կ+Wi֜wKX,j#G{ Kş uucWbgLux3=RnݴlגϗMԧwoyJKO޵sss)~EGSp+44T)J8pP5S5' @^}vk^TLƺn+QrO /{Wr}OR0]a(//_?X|K/<"]T>Yu]wTOW{ N{sδZept j;W4]\IIڴyK_j ]yee;w*<<\ݺt)i,r5֩UQfVVT*_7V$i7X@gpۖ~$MtUf/YVI>L}v둀l6K&SsE:cT~}IRFf~ m޲U^sU@5o'Zײee7ԭ7߬.צ[t;c]ʕ1j=YYY P45Uݜ>WaaVZĤ$fŵj z҈8pP^[Vy;Z9}\jjya0 sPEDaÆ:tGV޽J*V>+.N[WZ"%:h\L{B WNnf5S֬fUn4e%U^.6T6oѦ͚tDI#uyyyqO4pZƪ@yNk UHzٽ[?-ƎFahUѣUwߩ})ժBu'Z˖nN@PPXGjM:6[;ء"6?n^ھsBH}.]{h/Tvv^%}=ǟzTSQ#jx9B͛5S;s{^EK\l qxJ*(,Ժt4Zh!?MP&M$˯($$Dfܼ<=s Ç)33S3ߞ{SQVVRcƬ;G4o%:GzPEEE:tP55xr;&ݣNdҞ(:ZoKuVUNnyajWhΉŁBrJFLO?Y\9ɵC $I񑏏:jj*((H]tV`@'$Q gfV&&,m6ڷ0U 6U~4h^={ڶ~&߸>j5WL@ У> @S&O:O$]4BR۶M[~MW;n+^3"A^NYY 9|NN~\^z~]'_>ڲ7mJ 娽=?.:W_鴩 \W^8ϾI[^?)(0PnƍJ^rۭۼvjݷeY!5kuK+0ת ͚j*-=c2eZeuX$U؟9o6ݷϴjPfzIH%k uZ.$v*ğM&sAp$ UXXXrrsu4筳$իW_͛k%jۦQNkXdXԲE$Iڶڳozt+=/ZPs?n7ܿh݆t%e~ufYN?]9O^vXJݺvQPP ۷WttԪUK ]xBr>\^s|}|o/^.^O/)uܑ#%UX};gwQR;}N\E%brʬ!kQ"IRjZ wl튎Tr zGtKJfTv#1 C2se/;*(($895Fh%IڴRٰ$8 uʪ\p\˖ھw]8}ym;v*U+DIt%J8p@۶G >jsyN|E6lXܼ2l6kg 7ߔl;U]+~?n9 /Pm8\:9Sǎ. PH'^4 .**R澧9ッ~E3ߞo^͞Q#5hR5isWXeۻo>Tx@uy yyyx B8_E[UE gZ[;{ۼ$iB&O uٹ*2x,:TG\Ĥ$j=͛5SfʹcN]*ys%&%U˖%mǎuT~HpHԴ45rNs֜>0Kh+GqZD۰A r99ڸ)^/ZؗPv/'fȆ ȃ_MS[Y[m/+55)g+^ǟ~#wrrJh(zV,T%a߼Y-b;'++KڶQ.тЯSJa/]Oy$55xr$k;&M4wl׌kFK>+͛w2GԖa ֓GN*A\tlt]7 vڭgܼ|]t:p7j$axFɶmӢ>5Ѯ?Աc%KMKSFZ+5A VcYmTb):*%w*Ð~YZhg܏^={hOtCjk(ys5nEm;OڥBahͺu%۽Ĥ$j߶VY&+??_%IjPZƪ>e cOCv#zf%}:Z$cf*^Zl\~Qw;EUNNB5v5$|ٻOa]P7gޓW֏aPs?WÆ B:N6]nQmet a+IBiuQAA )?w9npS͝3Lq?wV8K%K|5sT{K5F\q$ $y u訆ڹZCTo6~W^Q2088X:vM7Lyyyڶ}~ulVB4h?,[ $զFfI1c4lh%kZ mˇS ٽ֮[|u飵뫯Q~A%ժk#GNeYuaT]_Et~ǎZfF^yu?~\{l%PVU0@п7(<,LW;ݫ/\nզKַ}Sתi>KhƍjܨZa%-.3{Ԣys}Ï G xlݪu7hKվ][5o֬~\?O3 CoQ/K6C:223Ͽ>TaA6m{d`EJRn]4զuktun8Gu}&׮a*,,,1$8X}LRk-Svvû?e˪"p=L{ffw ?Un]]צJ7 bѨk$-^VrssNG_XYNVU~#[*>t촗*""BǏWQQQIdR``|}}e6eٔ2 KhGl6z̊i#_l6^z.Mpp檏%71 i}// E@"GPQT(*xP}e?|w""tхV{X]:ur[=x>Rwgƍv~2TM׏ӕ/|}Kŵl2pчpY-o]/巭zGK\  |}\=_6l6Kk ;󕗗amPPͮZMi9uG= %Iîn]:i+;;GoΞeҠ5d5vz1͜&&jst=ӞyNaaKھ{/zg5⚱lإj:Ns$ʰH:nPPXJyfshS|XL{\ /ji[3kæx-|iqztzU $i`~Zfv{Iۊ4_?Ia+A=ē2 éPs?׎+zvgOJQm߬wݩ`EF6ԥC.ѺKwmc mРճsr3mvۻd.m۪aMv%;cpգFu?GexsInWRyyy9իgb:oUרCjPٰ:,T}@EdXtB5͘5[w~VZUndPa'r:nH={ ztS^n֮_߶P>7##CGSSۼYՇڍ ӞJ(oP'PvvK_WxSdZ=ڶcKQ^7gcv )}UFF^{s΋S븸jtkOs%Izn66c$iҝCzi5zu0kp@?TwOnS?RCedTʾ ueNKMKMNԂ*$8մVNtA5WT(*x< E@"GY<]f>ce<]NeQT&Muޑ#UTT=.)rssk:|7nr&T:ﯿRǎu45M>*(,TN[nS]js=vIrwe6{kϹyj*"H튈'A*RfL@aHEEV3Q||| IDAT@d(9%E+USL~TЬiKi"zT 0 `>YR<ŏIm*NH9p.ՀTxU&1֩a"6gRPpBAAarfy{ŢFQ=rw|5zݺoЮYUxT*TLԷO]3zB?j;S+73+K/u tPP7oO+gԈ4+*`b"#]Uj(*$I6i,:I[&| WFQJ9zT۶-*?_ xVYˇ_*IjLv]իg͘9KiiiXdof͚1W+??-W.G\)?n7vF^yS0BLpn#g'IQŋK"??*??_ii2 C'YnWtߣ[ݟܼ}N:t9 $@Ç2!UU)T-~)O2奢0Py9%[dXhG2Mf2I6]Ǐtt5kP]wCI g}z+,/5l4khy_]@@ S3Y;"<\a(~fm^f?T&1p@9 k&NU=uQ^ş 㝮&)(CTTX捸*#̞.0 0JїPs?Cjվ cן2 C7Ё_ Ow|;F7m} NU3t+.S^^^.7 D*T+y,ٿ~t_^}MY9 mCu\+uAÇ տ_|E䢋0x!}6!?__ }p~~^mʔLLbU`K[|ڵˀlW\\+<,}cǎdR``|}}e6eٔWOa(//OȐjUxx233UxbZ\``uq]9`b6s箞.Nߨï1@d(33KaG,egg9~SYOKK-oNNvejblMG@Nӥ&ڌ T͛5aAaD8?: TY xU@@NN;͘W:|DQ.nF@$x r,#Ϥ#@^ETXhKqڂ=TMrmtEe}>d4kλ.s:zT7N-bZRMMiyl闊kRa<%&ң=%TPK*$8eH~.7$__o~TҡCz՗J~յsg=S|q3_{.s5TP;NO=fyGùZmzslm, 7 c^^^{-mشY CqϚ;g$n.5e5Ezg IRvvNfƍ]ĤCjS&uV¢"7Zfrt^\sf̜0s%շ_~ы?{^M Ðnלfi Y"p$///8:#UPPP3:U:~"""45?k5٧Kvju,RmdmA@TAarrrJ򒟟$P&y7j$???=ē Ԝf(/7O= јѣ$I/?>-oo^ժc2.E6lWxS9K$oIzfc ׎;i֜wul.~؊4`u!qZ|^f#򐼼<INVnoӺ$)))Iַw/J5__Lyѽ=i띹())QO<$_~u3Y?~8O#WKm[ձ}{6hYS!lK\u7JЪ5kuwEls5Ѱ!COקZũ^z4p@bZϺմIGn2ճsrE3mvdQɯc߲7]AwvkIMKr*7 mk߶PaaSV.W=u #xxo;˫GexsInWhIҡÇ%I-bQ-HXhu}lVlfeW=ˊUؾV^ګAU5[ʴYV1snZEWY uM{K,^?vܼ^{dwx5Fh'TXXXV^=?.Jѭ۷ILc :D5raU3YPK_WO,DnZ=ڶc$ 5fz[GPk7l(u|xX233eVYt m@֌YmڼE$u^s:vhޝfz@sy O7nRZz T999:~*}F׫{^?W<~~~ڳwFb5__(;;Gi钪 zQ^?)i}C"d:YD_ Un4w,kdgw5>=wӕ < 2D Oy7^9ᆵ vR5K_|n6ul^O=y&k | 1Q1FG;l#(7T[t[#NMKMNԂ*$8&=YB-u[*,(MvKBfLtm7j+t #jͻȷ^D߮'{7@iV);oW;>}JRj7+K`~}o8l?zA{λ|SG\>?O\3SPwXF];wSA*sL:԰E6%Ij9JZ:(r:j~)u/d*7)y{F%i{mcT?/QеuuK6M꼪< M^pSD 5?DKr`>ASّO<ۗ zSoJo&ØNfdeJ b F/?t͚9oPP[j pK87U)oͧ}SfNi)^,:wcLfo_e^s8Vkˌj7r|qd j*I!r0&(7n[duO )ib%[\㘧thÒ2ATHL-*?*oJ`X\/Ɣ?}ZթQTY2mҎlVi(XI>-y;vdi]ObzTQn ~NZ1 :Ȏ+bRdKK[uqvFVLg P)uIVpa@;%;e_G5Oէ: L쪂P?e뫢Bpw?f@C_p #pL8{Sjs gY_2Tǭϕn"Ƥ /3ћ3VȪ씽֠2NLcdUUz߮j*ZlU!_ՙ*{Qf {hUUp*@et@SȪ/S+%IܬK'QVUu&___OeINNղeK5jHFRQQ$ 7ܠM*&&Fv?^?S_111[ Fe3F-[TddF3ߙ u PcXšET@XL/o5 ꐜ_>lOMMՠAԦM]V;wԔ)S-Iշo_mذA6mu;?)Sӆ TXXk}\K;NǎtU_jذaZzvܩ9RVy{)~9`ظ4/T)EynN4a„2̙Ν;,i0`@ɟRO4ISLqӧGU%Iobcci&u, G}/´sNU޿ uU]U`ão%8{3S˴] szDED8~IҴrJ%m۷K:bKnu%UOHV=%L{f0VjD{PXy˿~thm9lc˴[|͊0F|rDx]RqޣܲR/R{P+IG6#[*[?˝uV(Oך%_YJyS=\ǝu֤Zjb=5Iizέz$I!*[a{shɒ%z'tajJӦMe]Vj"z饗4k,NLL6mZE:tˮe˖) )Ws_ܥ_fE2U4˧S{JYװ5M편=iQگYck~ʻr?f@:rz›<)&&F<_hرZ~ڶm+I:xڴi#ͦΝ;AN1i ]z-Z;T5\H>L8k-|~ի'___yyyU?9_=z:uHM0A ҢEJkڴrrr}v 0@_|qob;)44Ԭ,RpU~R띹rMA@f͔= #Gd2)..N/>s}8qb}7iD6MjҤII}Խ{w^ ՄQIprJML|Zh6nԨ_Ԅ1 j+B?C]vy' W߾}7ߔhʕ+ϸf[u>PTTGVa@g>=jqzgRj_WҘn^~E999ҧ?smͷhŪ5gp 8}3 *=tIRZ1 jT!_s<]6M~EO!_[Vi3o;g;/qwYYVID=;EsMzה]&~p6&LJK.U~~fϞ~Mcǎ$=Zj򔕕^G孹[ڃ>~Zk׮ѣGu]ww,z]Gj̘1:u Tja;l20Zn.]o{իǞ|F6Mqf1knz뿯Ȧi>_-ܕ~>ZPwPo>_\kb34Kn:Vy{eo3>Mgϧ~ IDATգR†ء|z5%護U*sM7^zWwQyǿH#B(MŶbDE!v]W`G+{UA 6 $!dyH2\(Sger琛E]DTT#Gcǎ,Y'xvڱh">ڵka$$$pmѱcGv7|[ Ɯ9s[0`6ŋ,_3gd޽<#:_;w>T]oT:qzW3|g]:ubw)}z`MSwD~ݽ]]Q{W9!r[bcbӻW=N8}AfϝWU}>.;1vhs}{ǘQ#Y_3ϿZU"R_uZ,&ɓ'3y̘13b q̝;sV|ZߟzאZ[,f3dgge6PzkсԮݿq}_瞡}G_ mlgxu|xuW}g~&Fm*?jB&Ҵk7* :']jN_G6mANIܟlE2$$$V>rS00|ֵ 뙏 x<=y&\>JMI9/w2+]O$g[ETk"R{^yc!iiݚ+ǏcPin6moͭ7VJDDD// ** #sVy^'44lBCCX/<,*l7ڛ m?4L} ^ /8uWYC.]_Uisrx޻+/Wr=ՓmQHev;vCХs\v;_|Ex>~m'3yi:vy:k/Woyyqx^"'%ѣ[too#_\+Urscڈ㝥O/1Ӈ>p}՚HԪe SR8Gws1ddYd2ѶMk|n-6nf)'JDDD{~wQodvS=ݷOylHz7+,,dm?OEٺm;N.YFzF+q7-ᤓNo~_֛Kq 5˖drS\y <;ii0?uG^w>[V+;n8k/5kq S{.gfόryUmGK&Ҵjْ﹓XcsѱCfxAlls[dw[JDDDʺqp1L&SrrQ6CQQYYY$%%ҿ mV 9QO=lRSߢI۫V_oӦ $$!** Ábrߵ7+T[˖-ٶm yy4pfZV2au_uQiL'-- SXXHfiѢqO՟.4 PX\\U⯺4@%"""""@Ӈ"'4`f{yZ PJH-JIIAwpxJ*x0 ]kTJ$""""""zi$VT⯺A%"""""`HS@T"""""" $՟.T""""""f+ ՟4&0 O$##Gw+ V(ڶmd*wBO-Hà*i2r99ā8!ԑZlI^ϋlUS20O9e`jeDDDpx+y< qWji8bpKx^KzZe喿dn~_},r,Cz^>4\6v ];wa}|}YuDJ, aPPP_sDEF`HzϪ AB5R/mfc>~HkoGJJ*=w<nbYޯP^}yw?Π&EiHj 4z RTd2 e6,V+'#X,|viiDEFrYgrTyOӖ 7ѧW/rS}<ҵ7odᒥ$Oyx*saa!n!*2ݺkyYLV=͛7o?љW&\_xkXOrr2-ZIWҩcGeoM),*sNL0."6& _{}^q\'1}¿F_}ťcFs`\*klea#Y4咑#x e(~\2rVV4[̍DDDѨP-Hlj{3=/{Yd);q\7IAAkٌvڛrdڷk< Xʫdff2s ,32wn,oux^rrsi$$gϽolٺ汱qP^z5Ə[|& ~FN;ԣzOUCBRKN^ضMkSRk T^cCN>ѣFѼy,~/MHH7X,o %~""""""gX&3a5{ƃ;/= 0HKOcmL< MΰŖ| à[pء_dvzdd]a,_5So=y2˯j":vd2HMKl6lu\Ch"9Ӫz]%xZx8e`ko#&:z0ۻ7k`ÎrB~^׮ڨՌL"ECLl idXΝ:`[:ȠNtV%gT 믘Π&EJ ՂO<ͷ |ߝ*S0 \[Ъ%4$~Nz ;h&^ve`q.=pLlS|nofb!y}8Gw6nLc%44͍V\%gEe~O |}`) PXm f\.'ǟ~e˹t%DG`Zyk"A&x<^pil'Vwo.{)CO9m 8N*\nïv [wF}*ۧd:u>OJxxyy@5_i׮-=Uf+G3kJsPTӌʫxpՔl:kK/_kmHoFne:̙{hNʕ-0O8WOaΝuۓUrNMKwKa8v:t^{s!r?ٱW ~Fr;w$*2Ʉ_<=]#`<%K3Irr󈍍sѽ[WX^}ME.ڷoύ_mNp<}%ﺇcw2W֮ᚫ&WCXVz<ַSyz|[:k '99uxJ_xy7x8].Z'$pqDDc5c R@|6Zu]|CcK$&:2ϸ*s 3ϤE|<%5uKy<ťGɦ~6:$+nbٲ Rk9|*==OƉ',|Ɂni7qLU뭕?)֯!l O?;gxf/&m۶~j_KWԼ9جV<& ՆM ]ҵe2"//ŤkۧӭkZyx{IeP<EEEdeeH'T?n[cjntt4NٕXp:L&q8f<`6jb2pʶ-i+**B.9ۮ>XUL&"""p8[xrcDDD`i֬fMQQ!!!ddddو&55Lvӡrrr|1;yyX3ή];jk1j0׋餠ÁYTTeEDDr &44p %..,\.WoӦ $$!**ʗ_U~%EEE|'p lܸwyV׼ys6oLxxXܿ4LGb[x2~ذQG`'0gޓe 6nO^L*3x e6,V+'#|߭]ǻ@jZQ}֙9\s ye+iiitؑ&N8^p,6lD^^;wb$j /`INNE\=J:uXeU.w19}ϻ\n߿+%en.;xIOOSN\3Jnb7pR'̼y{ժմ.p5/ғzxܤ9Gz݇?ۖ^>Vk99ٔdУ3,"=}rGd]kZnn5;bcyeDAAəKU}) TBZZjl5U}~__äIׯ|aQmIV u݌9nݺsI={6aTpN=z0nee={CFxzh&.>}Ҿ} ̳> qx=z Z%0~?//7[ >kזy}SN_p!v:ڵg^17ס<*OY3yk"F'/<{d  &b)'0 6mLFF:餧ɡ0xxNd䒚Fvhٲ%-zm۶Oa\2r+;S/^MzFە>դ6k.pQm~=z4Gݨr*335kpYg{l۶;שּׁp۷Mݪ\^WNݻ7Y;1c0p/\-R={r%X-F9Cvv61j>Ɩ-[/lۡCf͚`7|su;88t>3zzj[ʮ[/>N:SPP?x(*S[]^+N,l,wϞKXX(gy&-)p:q|ŗLޝo}ntre;ض}=+ƳpR{6 <OBd54.?iLI9r֭c˖-W_宻f5jw ..ݻeڷo9p:.K8:t(˖-?>+V_ELL4Ç{n?f1l0>#."̙M~~>v;Wjҿ,x;^^=4>lz}ˀ|8$}]Vc2m-у{d^/ڵc1PSJJ -+TDD7ѭ15Otto򄆆Naa!DDDa;pX,1*wڳX,ƒd2l6x(((Ldd$VɄ&777pqӸ[߯& ENN%gwy9xo6hRSSl~Ԯ];ׯjVhh(zL37\Jڊ#++ E||?՟Ti𫾪W΀\$hJDa+n48|+8]+j׮U Pj.Tw*116'44z)QQQ!ɴj@6mje?WuhHEitIPHݱZ ٽ{wJñ섅WfM!V+6 ݎjhJDDDDDN Rpz1tԹ(22ҏzdp*::*/{:S*:S28e6}S\Aci<ޯmJL&SJhJDDDDD6պuL&{p9-ZʺHJHhCLL4w,shJDDDDDDD$U5H)HЫh! NDDDDDDDDht&#! wd27)U+p_@wj&9±n&a,(bH RY,18`JNN2 )O|=;#,ݩҁ߷;)2YS=)twJMIIeˆ-""""""X yۯttqJ}Y@wRq3p{ "'V P4S] @2e(P @2e+jP9NڷQ#IJJf˖-DD3~z4+_-[Ø1>}:iiiӗ>7xGysxb,xU/=z @u=z0tP-[Zߩip5W/Yz5uY̝8!!!Gcܸq-''3f_r:t(>8͛ھ뮻Xn-6ldذyg1j1*ι#dß,.l!ߙp汑؟ - 7ӉV|ʔ\端SN{1 26^\^a-/,dcclKVNm"c d9kZ$,#^[ΠuGʝnM4m{t}w?۰(e(P @2e( ڷov28ts%uЁ~݋?saaa<3WyJ~Ϙ13fn۶mTԷ#W~8bEaqDc=4 .6]\.a܆c:'Uuqۚk' (P @2e(P qeP/sPId&< ̥d@zc&:HE:#C?ƺœ xq[ۺnrsskuH(P @2e(P @@pe&(OE]Fŋn[H+.GRJvWIx LLao` (P @2e(P qe* OU:x"أ&[-%_^d[xݵ: (P @2e(P 28ߒ4T^^?(Uy#ko~oML\Aӽ[7czW2e(P @2eW:J1]z7jڎzV7@2e(P @2e+ P #WQ>6GXNLڵOn?+ooaU-<9e&[pdN72P @2e(P @2`@TAb@ߞly mHHDLS홳|=уvN2xݭv:,;;}\6_I.k{B(P @2e(P @@pe 1gLp+L|u/&9ݩax vk~Vpd9xh2P @2e(P @2`@T" Tci]S(P @2e(P\hJ2 op@2e(P @2e+ P4@ۃb HK(e(P @2e( ,v7&.//vs@2V~? ٿ?DFFkۥ)e(P @2e( tH@FF[׶v;mڴM6ᔁ2e(P @2e_QK$RRRhٲe!""""""Ҩi4@%""""""""* (O]v;O=7/%Ke=GgdԳ /x nΩCNl6swKc9b&LEth߮VZiɟSOokz7<2qzv>{$U+6Ae[˴;be,\K3r@̠`7cΓOoǟүo_v;{ xX^[2'"23w:")^_' scȠ ʿWKziep/^>jGAe53pAi}iyUl :>jp =A%@}xOϛë '**x<dee1{h߮>80KFj sgdh2]L> .;խB>L>~m͗_ pku< \=J{b..f{ IDAT[~&ɳO$9%4Lʠ |f>6nd֌x1grjh?^i YWQFs.U7`<>pALj}_5㣚g*jK9wDG٬S=|t܉cFEDD8}{WúzW9!ֵqq<Ѓ:d0f)@[Uuw)}zyLi*vݻ5b8_p>11DGϋ/dӏ?˨2.!>+|>_[nvm,"믽U_!;'>_F8W֕Q0Au{~fGU}.3(Qk0#Ϲx|Tc5 0HaX0믹bw߸i sо]₩u?lY:i!gP\XTHdӐ3(-;;-۶qǭ w|w=@jQQn!gR`j?550ء6hO?o!n7g|T$SeLuv'S\gw; =|>6 <<\fPWDŽ%1bcɠ9WQcɤ6 4@$<-7ݩj%::S#j%,,.]6s$`ͷ IKOM\9~N:ɷMI^^20|ֵ 뙏4L;>85d1;,B P* RD@jUj[[Ztz7Pk׺@Z%(D d@BB)aI&!0~2wSkxowWw]'@**a4ILLh1nSo_yN6΂{ZzN|Cpk`k~ݎhdoq zn[DTy_w5JWA[zk9 W>VWW+// _c tw wD=׼c+'=/9P*H]0ƍtfժOqe\Nk(,,gϞ~t2/opī &~Ś/5I^gHOk/_6l:5_cދ]c|}nW^mr|yffe%; W_b;Ǫ!,,0***+**vnՓȈrN|SV ^gK|\,; ٿÇ{sp*@_?+]9(X_;Nyl6:}Ze=^9'-Xs H9}=/)wRN:r^@΁ TA*&L`yAL'x9vǭ?f\60hycE ni8\/ |h%|?A8n݀Ή`@s{慗^សޏhN6]9z ҕsֹ~UW@?yh/Or=^9'-sY H9}=/)wRN:r^@΁INP<O d2t:όFnn\<CyI)+/olll UU;x=oKrO,kN>Zd""sr>g{_]5G"_?\w^CC7oÇt=Պc9?s5Xm7t:8GNlh^x/0OzykjukG֭l6_x{;ftgi_h00x f>o+砭w^n1Ù~ӏڽ]wƜ_r>7_|h BiY}zF[9hu lOLW汷8~p%p1[Zӕ>:J{3.σ_=6ӫGw=v \3q/Νǟ|t.ڛ3֮c/sV5;b䠵8.Usp*?=/T{^B ee*,^F.8ag% Y[  ]/noMDDDDDDDCIvvލh42mS]]Mrr2ӦČ3hjj"==kLii6m"""n~Sx'Xt)UUUŃ>ȰaüϜ9kא]ʳ>>++qFbbb)(+VP[[رcy?:E_uEE#/ډX,\.gg3y|d j~@VLqVw9ٱc';v_~X,L&11LvO>̚(K,xL&nfnO=6logܹƷ`kشiw'xȰaÈ:ǧ}.Zp'^Mqq1?+֭[_Nrr2 .?m;K/MTTaaaDDD0x@2(fwYDhhw2>܃jxc{L45k2zh; @||<<yyyFrsWpc;w.#GdҤfΜ917ߜ"yyyػ\^{UzŪU2e*_7q&iJѪGX,$DZ;WW 5%Om"""""""?$===(ˈ/\7+[; @uu էO8֭ͽ_.Roñl|7yVgz"77}ѫW/w5^(ߏ=)Eہz_=TDDxe[k 宻f0d}Qjkky衇O-49ȼ#F#&k>v#늂U^b2X۵]xxCǙ:DDDDDDD:4HV\ QFe 7wӧO`z:{gb{)qEXCCMM V|JR$ƎEuMsO#LHkm"""""""?RJJSgӦM,]uȘ1Yd w5L^uf3?}egb{*Ȥ ㉋axo"bcv_6oJDDDDDDDOnl?bΝ7ן;w.=6%K|r7o.YYY455}CqQ z>. шjfGs]L&crr(r(r(5sTA":: w8p'qq'.w(>q:XVn9sn7EE{())-ՑFZZ:Fc啃єP@9P@9fT !/o_pZe4 lPZZpd4<EN 򈊊o~ ~!118Nc׮Bvurr;r """""L a:t]~|'BCCZSFMzzwN'nF aa6rr0p XcjjjwF9@U !$$a1ϤIS1444hxX&'"<ʁc  :epWr\vx -QDDDDD$X@%")/o#F:SȲ#G&?c# *PH),Att4 *]IHHfwN("""""LTs@\NӡrJQQ?)"""""LTSQQNbSӻsPC &z:l6=:jԻ@H0QJDj6n7NgO몔 ODNDv ~tP5>QDDDDD$@%"'**Qhqy8N("""""LTJII tPXXHR߇!ʁD$$%illA7yaAXW^^y$'n!@DDDDDtlwx<[[G}-pV+`h0lٲNvv*""""",Ip\^9TNf!!aDG`0Nf36^zDgPGdd).KBB"Xazjk먬099HJ;r """""@ vj7#NjjYS\.'iiM. ٳÑcXV3}*Xzm! j^V/ۓ d2;NHS*HTk4w{Mv~\;ia3׏u)'m2x\DDDDDDDZS7yo_桫Մ W[z_E f%cⓕ+ټe ͯp] `iRVDDDDDDD,PpBa_b0m!!!3KRUUE~Y< 6&3TVcƍpSP +Vc"44Իٶm6m"&&Spp8HO`̙]7Ry:ĬYXlQF裳`+ܹH233y啗o͗co۶0vũۙ;w.p;<6m]fѢńۘ8jy_n:.rYp!oNΟ?7ߌh#o'`02l0ছ;2eT*/^̽us!~ӟr7b4icYJOOnmr饗z >7|suzEnn.W^tꚓ';;޽{V147okVTTE]DDD/"}1__EHHHm9Y`ؓZ8XM|\LEDX66qݻ7>q96@шt:ؑEnwu[ dX kunV.\bѣ\)]w̞8\r) u$P:Ģ~bEE>yY}3;"ƎC/h|km"""""""?mΝ;9AmNk ++ S[[m | 555dffPVV[L$''3OSP &}v֮]jۙ:ƎxkURR7.h~y΂DR$Ǝ]q-b&"""""""S~G1`@pA6lX3f4K,ᮻf믿l'?痿%v{27twt}>r C a*xXlK,G׳qF[m>m9?Ȥ ㉋axo"bcv_6kN~[tm>Xt O? +Wd/ wsј͛;w.=6%K|r7o.YYY455u8s9ۿeꫯ2tV sx'Xd)|)=z +/Z>s}=n7iiiʃgtpf~ٳ;jRVVbެY5kujjqddd`{>mv8q"'NhPsϓJ:/~  DNNf̸0q$lٲŻIINNu3믧w>}Sĉ8ޜ mk527b|swMMM ů^zIݺoXHcOQw˯˯@jJ2=kDDDDDDD=HΝ;)((nw{[ y7o^߿?/aŊF >VjcVV_V+EE{}m/\7+[; @uuu1uksK/;ol6ӧO8~Z UttǞԢjbg*""Ų{>?y #:[ol^=MVbO]СCILLi]l&<<o;77!CxG塇nW,Gz3 F#&Ӊ~dَ T}zdb??~읿kwv1yY}3znkMDDDDDDDz̙39s^TVVOޕW^̙3y饗)**bƌ\[Zm68!CNi+W~QZ `49tX]X~=޶)qEXCCMM V|JR$ƎEuM qN6v^ϟ?ύ7}>r C a*xaԨ>u[~xSx7:m'%x߳i&.]֢=##o)p}-^8p cƌfɒ%u 233y1'-SzAVV_<ֵ' .nG xںm?~vΝcfɒ%,_l͛KVVVz*X{P۸x(=˅hjzO֍?>(ǭZH+--eÆ<۷Ç_HLL,NÇصlݺ}*P[tܼ3f0c kƬY5kI3uTNzֵZ<϶3O9ޱ gǘ=1=fhl_X&v0jhӻt:q466b0 3Q^^ƲeSSSCVVS#EOM"""""""roj?&MnO[懭n 2eTTy3 TA$"""""""GEEee%\y\6qx<bE0T "O`M"""""""rzcĈ^Rv&9ȑmu@T='""""""O;&!!]ũT l6sFbSk (Tr@\orJQQ;/P*HFGd`߾Jfd2; 6UTӿNsHzzwm9AA KAA鄅;VSXxDGG;6a8,V *Pހ.|gh$$$rFQFsPDDDDDDvSTbKٹsFH}}=ic40gcVvq:~_gP*Hl6Fccc`SHJKKٰ!(:v*h7[n!'g))iӝ9QSS}w.:TMxxx'E:HHH!!!CDDDDDD0jhӻt:q466b0 3Q^^ƲeSSSCVVC4gkb(++!66g ͅL4=oqvq8444˔)SQQ͛}8sJII.LNBg$fDDDDDDDHEEee%\y\m!vx<\qb֜9HJ@II=7yp \.gr9III( 3A3L}x޽Э[XV;Ty#G`˖vc6 T""""""Th4Тm_G>28,rOrӻm S#44}EAfHddVkࡱ:*++?LN섄XUqdpIm0 ,X6qqqɧ;ӢFsϘZrВj%==x*+ٷU_'`e"))=pL&S* gzJp8PZ2LDEENrr*w< ݌`_guSX,~)L6c=8|nwQDvӡCՄp:D989DXXKXH &+~-N T""""""$Zt؁(**<N8wСjNRRRBccctPXXHR߇!A`RJDDDDDDB;>IIv())#ٽ{MM)~9S& .""""""Aljُ͛"HLLl`c|b9>A`RJDDDDD$HnPRRLyy);wh4`4'55}Zݱ J i:TͦM!>>Ʉ '\vSY$'n! 0@$]sߴpL /]obO/1"""""gJii)6E߾>Bbbbq:>\Ǯ]f- %%!#c|VG~plL}x޽Э[XV;y#G`˖vc6v@9l~JRRR),A^jON o~DFFQP$$$xhl 3$;!!!S(E a66! SՕE7j*>2s%#PDDDDDڔL4x`ǃp˔)pS.)֭[()){^V ⩬,g߾ V}h[nՋdd1LS)C x[t4gaE5Px<αYVD9UTQVV¤ISpvc0 ,X6qqqɧ;Bcd2Exx8ɩ' w3?~MbuQF9 1@(NH+/o#F:[Ȳ#G&?#n߇!GNMMcӦ<t_cL&0X¢0Fb0Y =k 3AצH(,Att4 *N]JHHfwN;66uرꃸ\.L&#F'p\:Tî];/"~O4?`#ymC5@@xP焙 5jf5b 1zۢBMBX XB-F¬FB-FF0 oqOM"""""]Wmm6SkZ{_:28v=0`0s>.ua݅s{┈ujzC|||gn8C !11l߾1{cuAS!#a##zG2o$)1]l-mpMJ__LMGSU农0~y'U†=<HQDDDtqRvݘ3FIMM#--1xdU8V)mvt@r؀wpl:@dž ufs=wsePZZƈ#xwU[,&ϋ᪁lع/ l;YPYZ)*ĤA1}]N Nhߏ1UDDD󕖖aCQQQۏ/$&&uUHQnnBNRRrSDDب&.: :TMxxx'E%"N-P555ɨQxg|!+, _|1}'O9{ncݺ< ]CfΜ>$v;wp`46f󩮮&99inbƌ̟?_~;wIff&2&IX,'v/]ź8+%|[r {Cޮ:4bidl.xwzPHo~QIOv؈` ,FNDyy˖}LMM YY(gob(++!661@EE9qqqH|.PpwWQQ:.)S{n.2w㏗P\\b*bīy3f̘1 :nlldbV;v0`, 11Lv̟&f=ʹKLL sOJCC_}111[mA]hO'Tc>'&@ame5t1qAB,f& 敕|w┈HgHU~&Mhc݌%s`رL2r `ѓ3gWOZ>-^GFFc~޽;&Mf͚~ضmIۂ`hnn0Erzpfcm ?V ٜ=CmvLORQQFYY &5txvc0 ,X6qqqɧ;F9Plݺ"w=w=4D("rr>طo_J[LvS#}g|Wݻ),Att4 *J]HHHfwN(4x$6 IDAT.Fjj65us@5ۓINV)9Nkw|ӹV\ Sw`rr2<4[0a۷ogڵm.eG2cL"f5pD*[pGX&7՞(_[HRt\r{?XH (--壏>h7{ak۸AqqK~HqqT夣=].'))fNL}#/o;vl . Ɉhh4`4p\:Tî];/!;?fs>KKD'syqa6[ٳ ,<$)SOM6t2o۲eXd =z7j[n F oeQT6|Y!!ݩkhKw*2"pߍ]աHDDDO.(ӻm Sҷo?"#((Lq^j <46S[[Gee@R/"g^㍿tRuc sNƍGAA|{nx'o-(yÍՖXy- f+&k8֨4 n5rD$cEc0 [|wܖq6?Ʃjʁrp,JzzqqTVo_\O-@M]ERR2v{2L&-"g1 T{ȑ#)++Z-^/x_/^/.6~ZV}yi'Nx&NxҶ`?Ӎrhߍ'rCÃ,D?{w_e}u-9dON6@ ( RQbVmTkw:˴vTv.c;2m[ ;D d; YOs}#,wN~>GsqsΝ,]/ \p1$71 S}DDD,0W.F!0 bs7V)9 @||67[n˥” >xݺu̘1c-b6q gdBE?Ů@DDDd+VibXlֽBvvΠ+477 yj&0E5/χ `szG&"r҈x<f̘}{y?2w\V\9҇0.hOy[cDDD+ Իk¢rT_kIOOFr$Eq]ګ<l޼[n0# ywNիi?rSUUEggYbQ{I4ʁr "F8e>( zeݫ8۷ z{49t ]]By#SD7sPHC(T`rYw3f̦?A]g=ZOYY)sr`#G9PDD T%َ:q8T)0c?N1 TUUR[[́mv"j87σrf#?&vɜ9dddp80ضlA]]= rM^3ʁr "T'Ο77kޤTפBm|d&YNefX;J̜9%K.&55X,F{{SQq}vS\<C0\t2mLLs%%ۘ6m:9n&`'"i.eB!̙әؗʁr ";N||'ctZNL3N`cY6ؾmoաWPXXD,0 :;;l|~1jkkxginnf֬9V.hZ$̙INgOG"99 tvFhmm.L$Nq_8Aq\"4σ|s93*^lsN&==ZìۺffCNN.P.@auJ9PDD TbǣT"2$p 55U]{#xf+G!==P(wC4\v*A0$ϝ¼fƳ`M7ruAB9PDD[%""҇m,]g̉^2=Nvٲ0 ߊ D?޹rY8pLYx\p8|n\ No26;aʁr "(TT^23Uxgq"33 ϑ#~;rt\,?]:ы4OEV[f\&"""SJDDRcc'O&=1x|***x 2 tt;rYZZ:%%ؿ-q8vvvxUUUtvv/N E)//'''dۑ@DDDd|PJDDRNN* {p48t ]]By:"""" T""n73f̦p8 nѣR\<e񻑳@DDDd|PJDDf#?vIMMx*liݫֆپP(\Id:DDDD'"" t2mLLs%%ۘ6m:9n7ݵvSWf2BsWay """t5&"" 2slSFe23HNN&Z[ۨ S\<e<Il*PxM6؀iV'Ӂ#%%fu8r:~9gZB+2n 'A]]-amN߃ay!''P(@ :lf:DDDD TĖ-|^}3@u^%QP0phjjSZ  _a`x_q\*Hs:DDDD Tıc \slvڬONW裏$Dp2:Cp8|>l7._Í82M:DDDDV'bgu4M'XPnw`c{褈HRjI ,DDDDDDDDR*P4I8as""bc۰D" (((n=*;T/sW^xN~~=?O4|>.kcTȪٱ`0̙YbRSӈbq`9طo7+:d zP]pdeeRQqz [V6fT[K/sH%)))̙=KuM-_O33]p."2 JKwRSS+(,,"al6|>??5³4773kCIէ?) kXt)ӟTeV|o/3x/[ECCewoރaXrl &"2(kވnWiaDQRSӸ׿>N$.ZӁysDDUI6.]CDo'^l JKwboEDDDD&!{7x饗ҕ<,[k>{/{/6mgA(ׯ}{6mvjժ3XַG=.**bټy 3kǛoyƶD4^W yEfF:+*{ߟٯ[_ڀDDQy~RRRPϩw3M,~?Gh!r <Omi|RR=J('W[&2z~~Oo[oUz饗'h47MzyW馛.϶D4ac1P9O=*(?x31V\s='?̘1_8NӦMsewydffIQQ;vK.!%%DNNk.n/=SL%sN3lKLsng5Wʦ_'--^W&))fD4r0 ba%""""2\\jnn뽱>1~ayx3g?=={}.D+W?9W^}gnyo8pիWgZ[[ٰaӟ1 oS\<~mhΑ@ Y=qv;nxρ Կ7INN>e۾DDYR!Xiii"|""""b=pu˿|/zswy}vs>_=Nu]w6{<'w8%hH" S"--Ek#%==}8C!A%c  E^^>UUUtvv|X"""""VPjzUZODDN/''DggUU͍48t ]]ByT2#"2nf̘MYY)~YYYph=ee̝;5M=ihl_];"^43^5 0۷ 咛S""""b-Gi\*"29NMidӦM';;@ >ykv."v]F(bΜ8kt45#55;F}}Ng '180DDN2slSFe23HNN&Z[ۨ S\<WGM*P))iٳB|>)P^~ Cx<ƱcMXn 'A]]-amN߃ay!''P(@ »*P ^@I6xcXpdx8._vIL??5³4773kC>" t' GYFB<:::z TibhRSӸRVEDDDDDDNRJ$5TqU0 L+"!&A*TRKW2Ms@]l;{z[XI*S^23Uzg*33 ϑ#~;"""""""*P$&OL<̳z1򩨨-H k a QXXDKKoGDDDDDDശ un7ximY5P@9P@9P`lqw DƋ6F{fY8!'QVٳ)paFUͧodYҨSP@9P@9P@9[MMкaHZGۓ\tr3z֯_ǚ5WSd"""""""gGsP$`0sI nӭ~;"""""""*P$|< c(䄬~;"""""""g$7f" g7-;vNN}vSUUAQAoo&P(o"I0n3fSVVJ87zJ).݈уJSo3G+$: pylVG'9t[6ZZصk's4 |l6 àB *PUo[NvQw]IvZpm#_32S^t2mLLs%%ۘ6m:9n7 `v."v]F(bΜ8/""""""c~C'*fE$Dq {p3^mmmVӧdU,!C2slSFe23HNN&Z[ۨ S\<EDDDDDDz@5ND;ZvOwu3$kLEtN&==Z:TN[[;KZZ99BaX&S'X`@ @nn>xxfݎr0%""""""c T"YȠ@%kٺbiЉ۩ύ~F"""""""2V@5(L96b%ð7M0*faabBَL0c,3~ѯ·Np9l[3)6p:lLrsEq+f4|tV}U]uM`]x\Q}RU_;?J4E(',&9)׾k[ncJQԂha(/ghhl+ /*+<.".E?堷QZVƖxJ?xю|sBA9h~sfQqʂHGN9wg"SеbB$%3{655Ve~rCF٘9KDAuh'C ntttPS[KN p\r9ťQrph4:Q&yПv|>aXtߝr0r0QRSiin`rˆvTðDX&T =LN<}!`!Uw?ܵ"kǷˍx?gy0 C@kk+ȟ0Mt<O1C Lʁrgn}J]}O%3Nv&ov0-Wn5uѶ.V3d[0m%akCAt@d-QƚL9AZ;yqaOFm'rf㙲c,FNjhUb^jhlGo[Y0>e\q3@x=^)wE&L/񚃁[8ٳz oQSS{ʊFc~sBr&O=oxB^6+D9Ps0ޭn= Xi#=$\ue'2⭷3k m(}`,] @ubw{b1{\ŅSwhlkr((OqvycL$rSRR֫C/,[seͽ{^wE*KYۖs$nrgLWoE L^ȋe[0:98M-\GI,Of=ȝ?|x F+T #=;>_[osbzNs=bi_vHm$?`FRwKK36koav;^ah9σtN<L4%q!**$To$@9x^x3$Q~ _w v4^sQ[ϙmA#c ѣG99S_2P`pV^ @u곽#η9+i$f瞜d@]'tɕ^m>%_|[{nQ}=ͪѸy?QĈ8\pxRp DMLLlHΟ @W+cn f&aOeMU'WœW\̼^ݲu--\sx^r9\QV,&{?FrпH$Bk[kL:'Nop:p88ӿD99 'V2ytOxr s'BIV^M+D*7銛tL:ݏΘA0MG#jt3ft;{mHgjxH[p|^߾p8L$u"==Frۆ9\qX,F[[‚|RSR8Aysbby}NjjkbDQI{[;yyV6jݩr{p0h26o0ؽw/(,,:QL;waXj"`,] ytIl;?Ә=mia}g)mmYʎ=/h13gϱ/*`q~9l6y\rhb6lLkky\vJkfAo##3׷܄aJQḻCD8'tM[hnB!3#5WD_&wrNgҥl{u3DQRSXjP]SC0wDX&TJpO,ޗo7w[~d??,V1`{_qş|Y?n 5dggfX""""""" oDzPm>P" Д"""""""ei_*""""""pT'n/v\XutSn '?a~"""""""Iq"`&K_#o"IcIY|e3(V7O? TD z6?Mpeqž*V'4p{L92CT'ly7kա Ĉwl6vmu(""""""" Tb˃:  T?I툈ۓȸXJ* T""""""""b)DDDDDDDDR*PTK@%""""""""RJDDDDDDDd:S@%""""""""RJDDDDDDDD,XJ* T""""""""b)DDDDDDDDRNk à0UU455چa< uODDDd8@%"""QB0ddddF,˩8ľ}).G^^!KX,fu(""2|>))BVT9t'55U,_"baىfS\<P[[ /e x߷}fJ8o|{L-*b|K_ ?l@D씔lcŊUi4Ml6˖`ݺW ]}U d ۰+.|DD=kֈCDDg_4[e+/~&6oK}$TL*PHX VK09yPz<=,=,"c=w=7]."2III!33k@=4M239r¢RF̑*fϚAn(ٳyWF^w~y yhY <\pB6[{1fL*P$noW^[GőJrC9|>sijlNmmӧ|PNǎ[>o~0YYHIIy.99GMMI>'!яI*Ũ??}=~7O} ~_{?y}9R_ʠDm8o\N^zS^E[[hwdgi)|_?N!"r1}UXXDiNo/d'ygzys3˯RpuACc#O<4_='MZj`OFD&h4{4A<>nXrl6Ym 8Nn|44c<\sՕ\a""2>9>x^}vYtl+y}FvVF<lY T"܉eGr0~vtnȭlشorKF,ۮ=;$EDzzƐ҄餺j"r8zX,F\5Oi\ ͷ(3{X D],_gh8SVp8LVV_ʭ7~ҋz?@7eEL*PcMMMR4.pIO0w?/749pi3m àsP g.3k1D$mܸ*28a~6ZrssY OFЉ8rt:#rsŋ8%"2A|~͛Yp0>&I*qL6X4 3M뙳*#=^~<>p 665%W_[Gkkd{T,|LdǎS^wbt4il<}p]s獋|s93z_<g st2S&iVV]$46`؏P~Ǽ[=}cW28v2{ ǀGHŤ8SU]'>Y#̟;oW{g_zSRq}<ק`9?[RSSYd1>o$R4\M&," on*(*:MСtuu |2r/]ʶ_ɿ>C4%-55|^e/0&""2ٻwXSv[Z};u*sg}$TLj)2LjkkG+]}1gqOiD"|g?(wC QDdPN- /"++ ѣlܸsSX8y#D}{ k\ r:::,HDDFcJQ<Ԙ]OG=Dd 8%"bF~~--Mڵ9sp`p\D6 0t;P.=%}stvvtscu nu"x?b~X{c dڴSRߢxÎnna;㴴4snHjj*s}?[VVeehmm:H;;w ''PDdP`a/}x<KE^/3g&99Ȟ=eTV!33$n`0H; Ψ HVVp- ]Ddpdff~U$A%28^xxxfݎr0%"""2T9 áDDDDF&IK@%""""""""RJDDDDDDDD,XJ* T""""""""Hvv!B* T""""""""b)DDDDDDDDR*PTK@%"""""""2Z)TK@%""""""""RJDDDDDDDD,XJ* T""""""""b) à0UU455چa< u_KDDDDF T"""Xuu5;v 9s6hoor**on瑗W`u" jbա| ZJBPJDDd*-IMM˗X,atvvbc ̬Ys]$!a./_:aH;eedeeYΘ"""PiNv퍄BytttL0 (q "lы$:fϞ┈7o>pա$eicOa&"/7 p\Vׯ;?Y:7[oׄuro~IjJ /S{oO{J$|j>z-|vVZݟ(+lt IDATko al6}]]ƍUVFKk yy\|E#P~ Hd؏!""ce)x<^z?x])?t.rsh8I*Q7 ׅ1uJUU'ȷM_T/q>\v π}ۇo暫$owԢ"/[W8φDd JJb*L4og&6eVn+dghtIxG*+ٸy]z)`M/rWq#gcu`˶l%x^o۸xI*Q/p==; ;{sоbqx|x'X>>/Al(ۻ˖q|"2`III!33k@=4M239r¢RdY pɲz232F^w~y yhY <\pB6[{1fL*P?z 2'8nCr-~_3?s׿3$n͵s+pW۩ 3}4>Oɡر@D"~ЏV˂ݦNDGcc'OR;OEE T:::a%zs\r9wQwǟ׻^]{] ڂZ cbXPfeuFa~$cY\PF4!ꖠ2jeZZ鯻^㾷?*;Mڻ{oz@e#9ypهL'^Ӈp8hirь1gLפJ$N--/7R^O>(/6nX?t<ú{!˝ Ϗ[9OYZ^~ԓ$%Y# b_M 5ݑg*Cks{ʾQS[[)Ld ,+c~L>-m>/xr;Ȝ9xL?@/,Hb2Et ?wXeM D⤭5lʠ;n@5k{ZûέQw*̞U yy+{y񥗇~SZ:fҎ=/&?K|n~`j f#6(] 444DP4-) 'Z xttt ;vMl,^㝿c2x0B!mSOV"jR@%'NLQ#G9 QXP@T޸>V &>l6vs{kZmWN=C|ptaZinnRe"gX),,ل>Tn23'?l^/W]u5ɱ DDRWw׋9y.WknIƲÎ8 OV"jR@%G^}^}eK+^0 -[-'5Չ1c.mm*I5)*ݔWPT43L?WbJחDD$Vx\[DvfPHL%0L5'3Ӄb!6*L& à摗S"l IDATxw|uw6i$KHH ! ]&bCP{9OyNO=APҤXhBB!u#c3Mv3Ix=d2| )QM)_}^z鞐Db.K.YZZ~;X$iIɒ:edd<0pttj4 bjծ]<#IC2227L. RFF└']5zJKKnN劊JXPPP/ 'Аt:9N ' r7t$UhfZmQ MΝەߴ{696ۿ]` (((طoǎ:t(G111 4;kl~'EDؕbJΝUPPnݺ+884)ܿi_Tm}@qS:kv-:uuPlS*,,49MJmr3os)\.WUIIV[C#o///QfVIINNMirj{NJ5p/[wwfmo3 *">P{G}@E0 @q__ >ڿؿp89k/Y r&^~fqMl[J;u{{fi'U~'Jr+'z./?<\]6nRzӕ/]n-Z*ө;vh݆c(my b*ݷ_Cqq:gٲX,zu9 6iUꐜsF~y~:$%)gOôwfAgI|3_G+..N񗌕f;:JKK5thuU"Ijg)}nEGVﴴjuu ;[Ԯ) z8ޢ%KV~mZնmM2ֿ-CsӀjsO բ%BW]1AoNyճV]C CU_տo_-Z0Xs?L;w@EsrdXޮ֫MBB?_M_ѭ?kwӴw~;MiOXX[׮WS>ĶmueXmV[}fK?~}?@R{_զĶm˓rIEEp}E󊍍QKkow^wן|Uy/Zڜfgձp]o+88XYHZ~CO^uc$I =7[lQ֭շwډB!_Xj:tP-HGx=}>|+&3IjoP鉿=qچM$IvqsxY,9e ]|>K7S@4vOvg =?HI|=_~F}d϶Uj4L+8zT/NyE7^{z4oB 2X3f*SOxjmZnQXhu^y^v[mjw+#3SEStZ^=q?+Kv k^OCV= S$㱿UH-,S+(w߾W^ի%I!IRB|ڷkp{zp۷O{9ںu[:^I5}>@W{ߊp8`W]~>w'So:UN^k6l$ժZAUՏ?bcuUWTl]t߃_ѣ/TPP~rY{x.B9nƍXI+,4TO>EK*g5R=n+!.o+?+K;JtuJj$\?9--,?>|X/NyYsu+++r{r>ԓzkkn=UZZݻwոƢO5u}NMhj)/>m+:ZX>:y/@aVbcZKrrrkUII$)!!AAAA RDDDu8r8 W޽",L;͂K ?rD32tu*((H!ҹvYj?rcdx;oԪU+ 0mjkk={jݚpx_7g';$yw=T ]/y-JJ+WP`?6&$EGjjp'\99U^cVN?XW7\wre+jZy-Vegks*'7WGv)9)I3=]wu|zTF Ͼ8ո/TFf&^>^oSZ޽͒IٴG՜O??,zI9#ָ/}=Æ|I+}{eV^S*9)IꘒRY;Te QT i={({EKh㏛+/ֺ }}h{Vո`b{ޱvQzuo/g1= I^^zt?/[3!Cj$9Cխ1iSm+éiS^$zǝڙP3xg۪W@5qp8I'̮ޢ}Jߵ[6P;r?%IO_mxL1B_+k_&˥͛҃yTEE5bϞr:ڵ{ڶi#˥ÇRLvIvDo=#FHxl.AmFAtj-V#="B9*w+!!^REx|\ԱCy=] fݳܾ_BII5> 8yXVuI?zr\ZjU@%+#3S5]ݺtַ+V蔶mU\\_~U*:$'k3tr{:|ۯWo;z\sz[nEqqڕuYNSXݻ*;;[;v+].JRdd~Dծ߼Wj{߶nթ¿*:6%MuO1Jڷ-7^~edf*!>V}zěo|@³OkogS~~#v{[p$آb'-Y\5츴vEJߕ.Ir8yX6Q3Jv]<[(*?\EiU*.*OәgWSqIZ)gʀW(44T^wr٫ʀD&٣[Bc/;eX3}ge}tjjG?Yx{?k::Zǎ{wMr]f7ݨ t:S[zͷ+ԶMtHfitI^TܯIIjt#"4bx=B6nԪk4ԭk%o_4$v7<#EQNt(/O.ԫoҲ2uHJ-ue%yKݺtM_[hvźr Pqq϶PPPq/,[X))_x.7PmG?>vcv֮1PPPs$iTZZ#Gܫm2fYjS񶾣5γw^8]_M[>++˭Vɛoq?3T52'{uŵ7}=%Ixu5ŧ]`GTuQooX߻wO}@F__hU_ky̞=~h _]Q{_h$} fhbGNFPLP{G? l6 472_^^ Ӷ7VnJtۜs Ku҆l.S*3sbcSP_ڳ'CGetSWsjJJJ$egPqqq5xG-[lʶCԡCSL>j.Idiu*++39MJmr3os) \f7'j zDp8nNb/>1 8Hb*TT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0LE@SPTT0Le5@S<:YC=NszgHeElMF$ٍB[1C"㕵yU>cDtmU^VbXُ$?۷  *~Ш=hI޹WY'֯&+?s[=Hm>u:WW :[`~*N8^P_? s2oyCY S]BܳszRGߡ,80悀 'w$I&-X3$gy۴k o3P}ݿPh3T֕nQϬk{<=:um+lPk}Ǝ K1EkwàQ)#M-QHdi,5<):hO8QC׿^դ[ThrSf7Mn ІwU^zI6`]$нkl?.Gutr:J _>N%U"B+<6PLЪ5tm_nѓ>F@ӵt# X1}7`e3 OdRk&$@[ie%rz57E >ck-`l]ixR؇|"wNck DTXt޺`G{βMy=W%*t9Jmdwb'_"kP/1LTu[پvbEOӁ rzI\=W+?ri*fz~s[_][oiϚ:mwiW>]T u~rRaN[ݠ:b;֯&׾}qD^k_R 58LK>P7T5hgZxMl@Z{u_t`)oF$uE>vNG u٤ IDATo7HeEGe!@Jg zvL$>؂(uIfTӓOT#{q[lڹ-I3Up`1)l<@I@5NfQ hNsT\OcwVm}rv&k7Mk;N&2:/J0Pi*n7+gjC߯ɪut<`&PB%2auqe(sZױ+/1Ƣ 9ڵ}-Q)7T4*`{{պ le\2ݭgTthan_ : ~Ɵ<oQ3'瞧Kq+SAT7+9enuզ_M֯4UeOAi h+z[=e 7U ϯ=Z&v5۝1A!ڨ ǭ+g3hmz0' ?N.> b Vd4lQQ^zH6{Qj*ANSigtǠqM;6}(Yzd4_P2W}LT\5@ v4;UEh˜'Ii?Mǀ*yuJx)N޲]P9-$2^y=gcCmRɆ7cT]k߸ͤV!wK> *-X#V'kBBj%{ewBh eZPyâ5%^W?WO]t@ua~lE;=.|[&2x:jf f80IT U)mcC O\|j־q[=?6ĭ~,pzCl]uXt$)g :q#8B+-stvz$(u$% 㴭_M6) T-AWmv% 5 a=ThङzUmKj&|+[+ J_pnܾNI؂ۥo[[ڨMS =2&q)9rP{uE&VD.&ȳi:aC=o]%:s/|ͭ\el142!arVhR@廮y6oO|$2V~d7,`C-2)M0{TĮjY[; o[K oR4BA]=,+[B1Z]9QghpҘaщߨ)U ^ [;}aa7T;&ܞ5^Z୸nDVMVPwk.iNGOcm V۾UĒ%0H0ڹdz3qZq޾zFMqp@͋s@+k}۝'CS ukH~\`έ M ɪ]¢}PIws5tNI{5X%Z?.zt@%ؤV-.q<?ՉNo2t j[uӘO%M{}m&i*8Ӱ #,+VAzB1ݾ P~ ?i?\;e Ж9O[%VNr,@[œXkV9Jqyy6.XjuoYr? VnvgLPpDkn(QaN[-MgURoi ]~5ŭil=g޾z:]p\k' <'*YC= (>Ś\Pa|${bWn \нQ_u( *զ_̭bQk_0k +m_0ͭlY{<jWtndE{ׯ<=0>mRr0j z*4:ձ؂h5>b F+يzqY6}Gw]j֐ech5(Uv?U<#::F#:Qusl'vUy⯆zq>\[-:ub r >p:ܧB:ex=N92q[lЪFl!sdr}c} cx'<.ŔED߈Yr$GG ]p3py { Nt@9[W6'<׶oh >*-X]xz$hRg07''PY6 3-XfKs:ʴ3j{>vc WcjڡЭ^'r` l(m:F{_Sh -[-2)MĮ@4dЀ^'{.ek3 MKڕO$ʫ6Q)scUք\ pfG=F}nlN-X-R&(JuCO걝ǥu/z|qAIAVr jxz5ϫ7-gȭs":5dM6aXtZ&(s[6oԞ5s;Vd3U1-^뀪URoE&8-?sK.o8HVTjEOSdx&ce PhdBFQ\ 5Ѻz3.7<+'֐% ֐U)e*nuISGORY_co+{.]kW=YڼyY1{Y[=4:vCڪwu"6]<ӬzdRe%sQi緅V8@Z_㜨^b Pe%*<6Y\[=^ǥ~g}=8J ֐puQ͵qQmzXl M57q:=nFhT"Z{6񖳼Tz.믮n Ǧ֝4^㸤n=k>vEuPUM_7oz)zzfWD©*WeJ߁BthDE{{0Ӕ7͞إa5NJq~O<]CU'2)MՊUuZ~4WղeK=\k i_PYY{:5'\7kz^Yk:J>o;eZիgO[(!}= ߾t':@]>|X<ڝr^4"YVIҚ֩Gzꔗ?+KS_ryÉ=UknU8h.[W2Yr8e ti.M'hj){DnTݒ>HWOݺ)::Zwynݦ߶mkƣizr uJX|KVԣ{WPdӺ5x_z':@]|1ktH]-[*Y,Ƹ͓]GIi=jjtNO94SsUtjʴWuUeK/+뀶48 ǟ۪ñDgвVwf`Nڶi뮞p8n}8gI7\W'OO3=]=E۶PJdtJbÇ둿CcvyyGshtW;7x_d7RjP99?E |kTԌwgvڰqV^7\e8t:uN8e˔r“깭:kjRZZRƶWTT+}rMڝR1Xٺ榛t:1"#$*~UݹǓΝ:):F}8gzozWd<.SVcO4Qup\ZtFrPS_{C{_Ӯ]uZ~x?35FX~0[`oY3Jm7ߤWկontUZwZ+wyF Zڼec8~$LqYԧwo='~s[]q'8={zԾz1r)**ZS_]W钸s':iӏ{IRSS4ݙڻoZ3NuW_YŴnq_ioy߿q |7*0PT0LE@SYnNbָ8]`** "`**nMLE@SPTT0e:[ IDATLE@SPTT0LE@SPTT0LE@SPTT0LU@hb'Wr:>mHii4fB :L>z{߾}ڴi *k\?ΫOJ߯+VAiڶm[kԨs~zug%%%7+Ok׮ܹs5h 5,::ZׯWaMrZ?A`B9rD7pz/Reeeӏu{?K)5T p{9\NT:uĉW՞{_:!j>IzOx%eeedg`Xr%8:4hV3g4T&.MNAewGqq |<8P#6~xN'uӯ_?.\Y oVo~>BBBADDDDDDDJ˗ҥdr())aժUgZq8lfTNU]U[!n'|wU^2 <^u_GٸSΝ;O?õ^GYYYc4p7nk!;;ڷKf3˖-wt ׯoQŋ;x`}^o7'vcǎ! 3u uvAQQ1 />̙ÇIMM h_+USV 7\_c{N7nk׮={x5ŋ_}=zp1y~8[X̝;o|M||WwݻիطgϞ<33l0MʪUҿx , ?q;uYf VWޔk׮Sl\Z|9f3gjٸn>CH>Ÿ'"""xjT45sҭ[7ٳgk_~N~~?;z-pm9x +$%%[1o&t999; v%EEDDDDDDDDZT""""""""TJPHP5@l6.""""""""W&UPHP)A%""""""""AT""""""""TJPHP)A%""""""""AT""""""""TJPHP)A%""""""""AT""""""""TJPHP)A%""""""""Ae%3v;"H * z+E8̔tu`}~qv6} ".[p{xQLHaLI(;d{VyCpv:MBfs8nqQFP #k{g5 (t++""""""LY r=50iTʊ.8t2giTm T#S۞.w2+g^_I@Srrrቈ{VP+Pr8B紋cRRRp%/~1 gGDDDDDDitE3wY!`0wY11|u)>; ءtH"#TH{hTr!I=DDDDDDD:Fנ .GD||>n0֑댮;BDDDDDDj4Aad:Ĕ0a*?kL&0L&|[2U%|W6'"""""""/,y9 6B.vk(.=.͎1a"b"4LLLLi3pgAՄbn5p Vaivv?&4"y#y3:]Ҭ1B,&"xG]cDlmBUTa57imÁ2@K(ߘ@a' wsj6?PHl.vJ]^>[m']\,674d/gpX3yDzԼ5j6T -;S#hqq-y^!fD1XWkܭ؜6NUI NORPo38R'ML-0l">v6eՎɛG,~6S"8Y|&dۉbN_pb3 /STkR0|`!""""""4R}S& ハc2ocP$noeۉ# =s+v gho~QSE:[.$8rEn皔&9ݘ> |~"5k|,^|QJqyӦõ(SU0ѯ`CznxmјBpB U]'8_ܑQ8Vsvhzr *׵cY*͞w0=@~MLJ*}9W*ۿ8Rċw$2m@NJ<^bws2-GZ|eL:[Sdr悋=<5;}؁cnV7UR#UI͔+QOV ZL& brep<>ܞʧ9Nr\FT<9OAJ biX4qqJJDDDDDDDZG@OkOnepG;_NGFaUF~eܑN3YnB16nŇ1.޶*Q *Lqv,ʧY͕ɫ*rW8Sbclf 'g}%vSDDDDDDDZG<ů:R_]YS]4Ӝ)a-*tTs z؝/hw73V<^˨x .`׫sYz ;xqBXL 4\ *=ODDDDDDu\%ņb˿RN6 oULC] jaoFi}jjK>p{|dr wXI*#n0>9.nT&^J\^|H=έ. vVO~4=En1rqe;/Pq8qv~~C F'طz«c ǖ:fY]klۗY'_^C%["/f'UJL\g?j8۰$y̺3EWTڝx&Q\*AeL|e>ꯎk+CWr/=LNN~ɾꢗkJn72ڿɨNUIBC & Z؞_];1w#d9q٫3:_՚Xn/6gg/S0Ylm"z.RpkyΉXQL`1"ۈڌ ?aΪ3KpϒB eM,/xS-4j5iS̆ s՟Iy}ԜYλaè\u]+_gjR?|tekwD'''HjS&x<><&02G[]tijx}75}UPiHh)~>Sߔ6o ؚ'"""""""ԉvVS7tɕb2 =ɤ)~"""""""DS$Lf?V)~f]^5PbpT&}zv0Z)j\OAZ?a>*]Tz ԞtK=,:4*:7X3xR*js7VgBkË\MPéft )],ߗYJ6|B@vݢlN{6IT'I޹M?s2{ov=pG㣉cϡ :Gb;1p8TK(""""""LYuܳr"W hd2̘v6kwD7''HhH005>"""""""re7AU_HK4H * *%DDDDDDDD$RJDDDDDDDDJ * *%DDDDDDDD$;i>Yݺ30e@C烃qL.`2 "ݫ}$7oJhW|1 2aCS\\̻`|f gϞv&f)Y$69k뜗u}%$0zl6k@cK:y]Z+f 䚪kED6%DDDصg77m&::Lp5^mw6+뜗K :`vmN7&ء}m^SVDDjSJDDD 2ՐQ^^3g`?#"":j喛|8V3!6[XOn $s陘jx<_+뜗K :O1= ԭAezMZM * ؒwɐ9q$ qco'̬løWFYY[y7Hhh(ǎgtn}})/M8OR+}{ɩl߹'OQV^F3Æ31"t5ӈԩ Rb5GȈq% JI㔖ׅÆ/=,L&:x&w/,>L&+Mdfec&zdİF6ֿ{'~pחAUOG]_DDjRJDDDz())eܘ15iۙ|]jNnç̹FǞ>u ;w'٧2b;5|Hޝ>}п?NYq%TK qB~w/?<^~&Q#G~/^ ,B)…F?{AnݸvTFƎ]{G_DDjSiɩj)Vi̬,b[)&N11lVNlNΨn'??MIii{H+W 8|(&L!w2z7pУ{wnNqq1̬Zv\uv\ǨWկut)#kQJ^IlIMKn^gbw> ^/NrQrQx"!!hLC㋈Hm'"""-~M|\ӦIjWKm;~(uJA?=qa.;طa̸v:` !::Y3f-!zzV+}{tg?n nw[ {Z_]\bɴ)ks7.4\Guy Q#⣕dǘѣرk7kmp00e]T&ʎ;)/+g o^PVVCٲ5 OEQ\=n?hLc㋈HM,tK. vMe„#`YY9>999]DDڞ{{)S'Ok|ǽcROrr505mG t5tMG׊ȿѴ9j͵y~ /:22ݻs뭷}k#-PJDDr؜4̰!x6|JFfɽ{}$0:tFM.9} ׿5O駟j :zUj6V[ϙ3DEE1h@n;NVvcسg7pg͘1#oSPu WVα8u:ÿ/7wK'MDDDDDDDI'&&A5k&e˖Q\\@AAAc .p@eu]o?~IQQ?ce2ʊꪟm l?O[+u ~}0ͼ{;q4Og}uK5&"""""""ӬE/qF~d۷/}SRRXn=w}7;v젨ǼCO)Yn=.2t` YSfd ++יKCm"""""""<- {z6lӦMeժU߿?oV9/8:f0 ΙMh6oM#&&qcF3{ * \FFϟ;i"#޽G} uiBD5H{;v3f_hO=4Vbڵ 4W_]DJJ .UCGdɌ{0l8Nr?$mMDJbl!I򈉉ic#GIBBBƠn.Zim쬎ո,]o_0䭷 F29rt}rrri""mї_eaW?<\rv!Zd<];]Zim-RA%mr""]Jgv[l<]훮KK_""M #OK D)i@|>/&)a)"""""""O n|` """""""mTa&>+ajoNRkL'Y9@+z=`!""""""!)AAp~JKKlZW M+//ĉvic4HU1rUlߞƮ];hۏ5 3-`(0g^EDDDDDDCRg񔕕xNf3vPDDyܽvc 9v{EEt5W?˱ٽKaLv ]ڧ\ L&NSIiQ'O{L?aO֬aMs0 3lڲkM%""-[Yv-g vmکӧH#ȑR:̨Y&_Bu!"\W2rp'?]{0rpt2yΟA\.Pn5=\viz^_~""reSJDDDfjvQVVFVV6=ۭV+qq8u*xAHBQJDDDb&S'1 }""))) R"5vDDD}CbP^^RG FQQq"[:.iu^myχ]Iqj]"]""dsVBl6 @HHUܼ<~m |]&k~(A%""":tO`Ms!z)*.&,4߷E:+ZB1ǧsvĽ|'a|mm{j~I[_ׅWi *i\ؼSt:v;]9}[EEY$PEj~(A%"""*++c :]k:;ws,|u!&&:ъH[> 223_~""re?׎](*.f=޽ǿ} ߟݻ1~X6mIݻqAXa݆O9y$ d[f\{m>5t^OJfV111tKHh~ȕM *qq I݋޽.SDCG[Sf)_J^o'^ ? *%DDDDDDDD$RJDDDDDDDDJw?Hn9^oibtҩSgL&SiTu}E"""""""TĦMpY;;aZ\rz;Fy<rqzn񊈈7JPu̟f` -iӮcɒl!**s;IkPunv>/ء4aZp;Oi@CrZ{UD#Z\C*fx7]R.DDZT"""WN:s6?-\j+++Сtܥ~zu!"ڴ(!!LKy*%JLL,qq-6K׃ԥ5 ֦Uis"" $$$; i#t=Wz-7~ʁ1$%%q-X`v5㔀(A%"""""""O@ g2o-9rxFEII)'˷֎S RӶzzΜ **Ar98vsx'jon 9կȑ#<<0ʵٴi3U@u ՊVt{ <^C^^6n}~`ݿ_]lk4AͲe2d0<0&´iS_3ϲzj80G}qrHL-ܹڵh{ٿ?STT5\Ë/vݿw͡Cػw/v|z!n7=yGHM¶mۙ1:?qE~߰f &O̓ON:xbr1߿?_m-XW_zø+*nT"""p81r0z&`_Ōnki*33Ν;7oݬ[ӧh"&Mܹx饗xW5j$:gdn:^5Ϙ?6 {С,Yٳo`Y,]Oϟĉylٲ~pa֮]K~~>ছӟh-xi͔)S oVo~>BBBl 3^1TQQͥk|| vuBkmMDDDDDDD9N}d2r'zUW\: 0 `]^o}Z8V~eޭիݻwgO;8wO? ^{eee 53^N>]/f>'Os ߖ2?L5Ӧ0~ji4AեKnv;#}Xf VWޔk.:ummA[FǜgșSL4eŸ1=saaa?-TDDDDDDDڶT;wfUظq#[ o>L2rESOj*֮]ˠAxErddd$wkرc~g}UVaçՋ|>/Xx^zs=8rpm[BG]$ 4?*<a`p:@IkP);;f5\.=5j~AiӖ.]/vM[`„ɍwl#29rt}rrri"""""""Ұ--EDDDDDDDUґHǥUGm:Ae vd2;8EDDDDDD4LADDDDDDD%:0M||W èޜuLOijZsVz0CDDDr5{ W ɰ`2L@ۮ@7LDEF":pDDQС`AkU\54'ۥU< v("""5=8Y@ʴ۱8N2ncprp"NNfesv8""(AAy۷k**Aap`pe+ء״s!.SGJIIIiP(/V,|>ءH;Uر)++;fv;NgPDDD:"B#`bcB:>谐`!""Tdt*#"""T-WTA%""""SL0>zkLHDD&%DDDDDP2&UV?5&&>BZ>lk M+iw0cM|swzM|n.1<ϙ1&mYw/ob퍎v1&5;Z 3v33v3avb"f!!V6 a3[ ,FQU|%""tJP6n 77_k{rƎ ؂D=لjbިh;)E,(0+B-8-"f授&,Lh[qa17`WDJDDZ֠ i())ax|&>,.s*/,fyOI۾%oii)}1[((,w|;2hP8:d0v!AV9o}2nc:5Sp!μn؉l۾RƌC6 :iۨx9|8]"##[&MGژ98N֦ 1yH;bzJ28τl;Q .B%Sf2 *%}DDSHt#Wf҄\,*b@f1b0̾ o}ﯠOr/ιg2GkʤIlڼſmجVFqq8B:y"gϝOWOO7zz_^kOg |ŗ}ZLU *D.f X"Ec "'dz I60Wev'|1sGFX͕ )=MA * *)-%5mÇ!44_~g1n$`̹z\5CG}W>Go]XlͩpFhָHЏ_=s9|8OQ~t߽ ܷ13glwɓ9z[cz_smH۾wFB|Wb8{+>7',aa-sOGSr΅g¨J^EpOղ] gJll=͌|r >+Q'i۔ ?qFr`֭L4 j^sTW\:00 sM8;vŦ-<}̸c=ns[?FCL0ƾ ]>N|Pv/3R{lUzuw\8SOTVJ<^ܦe1<3DLMCUI""rPJDDD$H /^dǮ݌=>KnnS&M"42s)KՉ^IImɍ_()-eyM8{Æ QظaԈ%gb" @eیu+T""""A盨1} 22ҿRQQ1aaӇCG3zٺm{}xo|>=r[n#f3ߺ}~q1b0ҶWcq5f.]& |*gOƏ6맞a` 9/ϯ5v5۰$y̺3EWTڝx&Q\*AeL|e>JrUG"""ұit Yq#ap&O ؼIm;8q478FkNf)G+9z8?0sftywݺ&_=C 6uDrjjolҹ3. 9χwӍ?qm;vb[vJ*>^pvfQz*??|3^4y9Sʵڽ)uU&J6rxnT_\Hk3eggo=]NINIeg IDAT&'m4ޜ.Sd"""Tk> ?$xU?a&0=>_صuv&l=;x0aH;)~ĦMpY;SkZKAA>6*')wiSAAA!Ǐw,`c+ VW ]1^Mհ~,""TDnn.߁lf aڴX"Ae6[ܹsEDDD7յWSִ9}GUL2!!=#t)4WeUTl+EϵaAA] "uERCRHB 63?#IH2|߯Wv=d;Γs Tnooz0vOOOJJ]ӌF?uRDDDS=;sũS""""dź@SDD.<*P\ {vFHͨ@%"""" O/o OPi4xV{M,U`(&H}˚tܞmio`WS`-7 HtCju߅M̶WDI""ޜ*P5jԘ<== K6mqqqu`EhҤ)={૯:}:tÇӢE 8y$#F\A^5ky*PT;r$“yJvk YyCq|9W"""#0`yy'صk7~??ҢE9s>_~X,OhbmHdɲ大 ((ױPF&=Y5b+lڥ w:v, XVWS)Ʉ7c\X.P0o? ^u~&O\''!!!$''7dP},X;v`ؐ;v lʌb[4nq\LTTm""""2>""^iI]<9|0'N]tcNL6qm߾2ۆ •W^ɺuXv-z+?OvҥK9~8#GGeeL6UVQ\\̨QU{z8s߾}ڵ | GfС|n^sYf;k㏱vZV\wNsگʲe˹A̛7~1v8fϞյk>SBCCy'HLLtPw}_֩Qze{zzmoobyǜjש"{!55n3`xyFNKYz599,_Ȉ#*=666ٳ۵kl&--ݩ*;… IMJ~IrrrKG :Աwm۶riӦ NS{8r(QeڲLٷ6qj/~AzoGyJz뭌yE7onZr% ?lrzIxxS:xx燗@Ͻl2&ML||>G[o @pp0cٲ?N[d|Acοӹ##xزe KTiӦ̜9mR}wم4h /fҤ{=ݷgh42vHBf>_ ѫG<#QF pxꩧyyy9̚5ŋb4oޜvbSƌòeѣg,x]ٱU9r$ q̛7>}ӹoe"[سgÆ #55~UXf ˗/?k׮g޼y<̳,^KҡC~{ڵ0g???_.؟=cZ1fB8i:6q=CF!j\D,kaT}wuN;t ]WOfff⫈TF#BZ?*Pw'"""""""K*7G*PXBW_[1ԛi~v!B*7a4 22 xV{M,U`(}"gtPl6+&aH=' -[߇OHX/o ajun}>AAsT)}>&\7&\7}$6&0l`wZv!;9xP9F111"8swClh j Ov|k;c%.;.Ɯq&}ySU_Ř"R;Tr 6dǎT,fWM+,,^'}6s|"ztO>-fXm6vM֭mSRء=vEкeη;o! ˫`Zys;' k/_}ͦͿc:{L4<Ѓu>Ӎ_Ǩ#Zر/Hf߯Åxm]b@.<ڡڵ;7n`Ӧ$JJ]NF>>>^:tTh4ЀM:zvo}4k={חn]XacՖ {UaW7U  é׮.XmX%Uu>㘞=ӷϥlN~}..kj[(w偈D@@={p*e2;qF$m(P%mDKڍO|px֥ P:gml\=_Ê :*FVX,: 6$&}Tb#V^ˉ'hۆF1<2)ڴnM7\wpxjᆉѻ ^g>ߧddd̨Wp1^z]V c߯/_S=yo?-O?z+/o6mLdDmZdr>~g[oĠx xxxO9\>zݺ\Œ'w*ΪoSսw_֬BlsdBCʙR?.YʛC4nM̀+{V_us&װ6y "SM |}}UOҦM}%I~eİtdz/@NN 4`sJ AA TRR‘Ǹgd"y9{Λxqkdfe3`ي7d]<=Qxգ;/^(Pm޲bIlܩTckneg~kwf>@Sٽd{4nݻuh4J)g0_ڵ%8(:ig^Ӫ^{gWݜtVFy "*ZֱC{ IQqbiРݻue}F_}S iؐ5W+0Ķd]X0|PZ4oFbR2yٚ_87_piL>.PƍEHHSJm/X($ك30 4oִsn3~MmV訨s;[&qclf7; *~k' W?gh4KGʙu}μUս_uskX偈8K*ZA.Wzkmt֍O|lrIJUsXO5=2ˀX:xWlHLSвEszwccR2Ѫe 1 <ì]/}-;o/CTgeff#1۸i諫.vL匾ÃE޵ʼHhH4_֬eӯlZ^pwL5v5 \y^sV3'{ ˣ<giH=_7KX Ef|4oִFng m6vqllc'M4wlLĚ@n$&%>qԫGfxnw_~MBF10btƍJ2GFD`ٵ{w٪/^L]KL͟3EGGRRb%OUI,g_sr Sy "PJDDwv}tоl[׮,;ap0{7CVaHLNv5ಁ(EEtlߎ'P:Wx/]F@n]HܘL\g??~E~+͛͡{gƨ+.Gϗˇ #<,c:Ŕ{dSeڧN;}' ᪱c݋ NxG҅h>PAY&@QQ!5*];0ڱG9S3zϭnN:s <g22˔b9Cff&CD."ZSzjS1n 6c^E׼S>'{s*D4ODD;)0?ҟNK9S5THeTj{6r4~I=2I7p"8ۿ%Ks"/¯%]}۹p:;K3ME'"|ldž{{ya6+7IV+y-ٳwyKAA!:vI mXk}T:;Kޔ39Dj T"""""""է)~""""""""R*PK@%"""""""".vZ뵟ؼe;%%E)'6@P@̸`s_QDDDDDDD"nKٶ(M:Tot )p*1| dsWI>r[wЪרzQ>'; |=9yéTx/WzCqK*P“yx: g ru"RG233CPCv;:`8{H}RP`ǧ~'򦨨`)Uy " TӅ)рOa`vfc;U2*j:4mNDDDDDDD)~5fAgm_r%Q<̳UT5S)~"""""""RUnn._~eNj*ȑW0o<W_SfΝ;p4oނz*,P|233߿k7k֌cDZv:Zlѣ{˜cǎ# K/0`-Sl-}J/GN IDAThxv_Q̏S碚Ҩ$jLk۶-|}٧}s:-p gܸq|ͼ YxG… ;vbXNN ߟ7ޘKޗꫯRXXRemn/-D)-2E{a*}:xő\ SkI?if ϫ4}3g_"r*))aa4Yti|ݛHn&rrr.WUUW]EӦMiذ!cƌa޽.VUMrx饗0LfWR՟yz2pjXekNœ93kL&LS-[ƤI)..駟橧t5jԈ?~<gg2dP *ms;vj#Bưv{5iE8Aѩ UF/7d5ZJDC[@~GMs=GRREEE7W+G:ZSU,Z#F~zvIXXF^8kT yPwqNZn 겛2xp5ל5M0::W^yԭ5;wnݺ*܍V;'|v/ݚ0yP8C;4nLN,Kͦ@U\bd{ _KdPZ٫^Dոqc~'*2k,qOtt4o$&&:.[U2}tnV""" al۶[ Z9Wս?%// ~ "נnݺѽ{w,OZh_,._`˖-,Y~b4o¦M N|0sy ȱB&ڌ+ TFSӷC>~ZF#G{@~Xh͚5)rqd2PDRn[Uz?M>}χYd DEEi2ԭ|ٳaÆ _~aϱl4nܘ{;k ܒJlv(a clVTÌ916rN2/kox X mӯ#T~L&M6-e˖8pv,Y___\ԲV\ @llZ`ڱx=dL&S-E vjjb6{33gdup|٧zʉ|zԅPw}ؖOBBcƌ].7ndԩ̟? GVViiitA""R#L&YAf0 Ux/qg۹;k:t(='N$..-[r}ѧO"U{;|0W]u?:~ "H O/o OPi45TW {zb0Jwyֶ3~ bnkT/gf)AU[AE&Nĉ+Ggs<@&un϶ Ĵ뉷éRpt ^Yu$EZX)|^*H=MEDDDDDD.@&^s ]A(E<PH9?TVxx$))[su(RCI6mJ&22Ω)Uy "!#AL"""\TCVVGb:LXXD{@@y *D@%RT>MRJDDDDDDDD\J*q)DDDDDDDDĥTRJDDDDDDDD\HZZѣlR`pu8U:o˖E""""""" Tnbxs wu89ΊK)**YJVk 99ݻ-.xEDDDDDDѣGL&NzQ2< jÇ][TnoovCnӓbW4tOTr#8uZ}UDDDDDDD T""""""""BffT"RodffyW""""""r^LTTCS*PMwEqqለIRRExxé3NMkԨ1XHdd+6-7R\\>?KyG}*NEǗΝpu(uތ'<IZZ>C`uYl9 Cu(|9C=q1wM v!.ًP(( @{}+4:M򦨨srrٜBfVv;DGߵ+f'V[w>^=0LNTUgںm;IɛhҸ1@5uCۗ @UV,;0l`;ƊRneG٬OFDEU&GIK?=19'h׭_6}vˤnVNX,lM%iRgY,YcǎѾ};ҫW/FͺuINN&**={p}0 l!$$ 2QF[oV_TT$QQQ۷bF#7x7o&''hnq'O`سgEhhhmAuX6_}-cFjS|'u]Xzvwk69Qa^ՆZEٶqeվ\h|||veoۆ (..f\н[W;uȕqMhڤfO3'BzAƌTs_eٲ\v ͛@~;vgfL>5k֜*P"00bVZu@+'> g^sYf;kѲe F}[;v쨰>rTYQf'a!O;;;(&gx̩6XII G㞩9o^J. MDXH(|!LΩ3x4?pGv&"""""rXNyDFF:}fPF۶ѻWt^@n QRJ?#nHL$.Sj\ھ};Culݻ7l۶ƍөS'V^n_~aj/v֬Y+O&M C\~2.\|HjVGU0''o~ow*mܳ@T:jѣD2x! ߟΔ_}+kmZ`Ѐ2 OSk>M\sÍ(&b'++uX,տyGfBBJgv|.NÆA6D1lؘH=!;; Ee`i;wfS!uӣv CFW\qfbŊ9z(C &//~WȑWTϙٲe˘4i2<ӎs4jԈyoxٙ|,Y\i[} #ڴldoI4;cv:SFy*k4lHIIkF΁k@$EDDDDDܙdr< ;8c}8GϏ_ˉ'رk?.Y#glHw?.`0j\R>h2a4?(3+ Fğ|i[:)Iɛ8π~}*=\˲{8q"ge,]:#tٳ2䏅 Ļˈ?*2ԭ|ٳaÆ @^^ |fqGAe䞨vwjj'""""" ޴h//o"#" fX,zοnI!*2А?i6阪꣦*PUdz>ó>S>C6s̜l~y+l6ꫯ+/;=f̘r3fLmקp{Tf|gۤvjנ WxYef2whߎ̶Q#G%.u2ۮaՊ10mWV@jEDDDDD\ǧN1unղ}ZhA-j3}Y.8 Tnĝf f׺:P3EdIdׯ/$%ecb9ɦMDO:r#v 0R_ Gxx8YYY$&b:l6AHHOFw*PCg\Ԓ^ǪȅM*7a4 22 왛5TW.:gtPl6+jbڥ 9OS*Lv>_ oooZ4o7EEEU2!&:]1K?YV6o}(**"&:K{d29SU}i$%oI ק@%6O<,YphѼ/q3OԹh>ixk-3'}ƕo׮6qm۪#k  Vac}z`݆D2hެZ7ЧwZ4BT"qO8ko(^r > w~S*ڰZkw30mWV_ȅǧZo[mؐbvJ`` ݻuo#[WsLI6ѴI#̞fNWy^D>뮽Q:d21ếCp SXXȵ7G#<< %Kgyذ1 G[K㌹zĤ$23hӦ55H9c6),,˛M_[W/W?AAA|||ȢiF5>N:|5 PJčY,edбCr۶i@zz:aaakGvl8) >O9UW9IJbcDb9Ϳ16CnF^=ҵz 'hGϏK*(!1N*@%9@HÆF6 Ue.؟|z߹IIMQLLgdee7Ol6AHHg6NqqYE`i0f2h8 ݣ'>dggsb5`]ۺu~NDTDSm>NXhhGDx8qg& >;8c}8GϏ_ˉ'رk?.Y#glHw?.`0j\v^M4Iu `0TTJ:čIDATʶ[ڽg/%V+5 ?67deeQ\\D7`$%e YYYӰa0_1ߵ iiJJt ~6-k:@%7O>.3feaw q,h^7u0͛5óV paz┈\T|||9UF Xn[fV6st[:)Iɛ8π~}*= Tn"]-))) hjwMm3 5dw#.gD{xu4o֔8wMJ慆lycbصgY[\AA|   qc2mZW%ukڜo\sYA'v)9'Zߩ}+x{{Ӣys)*-)DFDfco;X,5nI!*2А?i6阪꣦Tr]9t-^JKwQV?&,$d! D6 ?"mX`ZVPA[j VEhE"T RLY5d,3I`>Ͻp|}.Ӥ_ߤ995ypfSgv]{7osvޭxu,Mc;ک T>MK-S$M{U]蕮~!ST7V?'G|T%u\~&cJBtSbW+ձr3wm޲%{ C їRQQ$)::Z?B] ,ԥ_ӱB\!jۺ:wQ_ܜ?[ #m r]J@]>W^_MCeEGtݓ_޼3^pmz1ꚖvNYn:Ie#ձ¢:9#YAa QRVE>Vn=|f~eU#QVR`)I(-n?9.*,7r:*++UPP6~y,Ը?־Kp4p긆TkcM6V-#] + xб @|]%mv9p^8N6StOFo ?CbgNfK6]|mz P]ĎS6E?+)|y C2$EZ,2$||)22$ 9.fP@բEKy<7xMz֋:\\rwﮅ ?VIIZk„ټj)na(nf?63THVEv?*T5d@jS<;ʫ@VP_~ںuv :ۭ={(&&(U rX*#9\WvW( ^m)ՂGTRSHyz}:\'uj^ =ny _J`P5o\3f\rZZ~BC]Y_YQyZ<5YT&(%!XeJ"Bl5J~yX!Ldn[JHd=ٳGwy:tHQ.izGԥK^|%8p@ 2dh'NT||>l^.uE\r{iʔ)S^^;$}B'3g$PO>vN:롇FСCUc'h_R4rȳv4VdYĩA"x.V{1Z?[pD(i$T&6H.UA,SXa ڿxjmԤIr˭ڽ{ V.V~~~@l6EEEj!jѢfϞS۶mտSm߾F%͝;W.ߐ!Ca1B5k 4{;UcL0A Pzz""v4lʀjQ86o)Is{|,T?S( *an늃̧d=xP;vL ,cqF޽[]wf̘!IJOOׯ~uOEkU[joRffid${=o,effjذa3)I۵tR=zT.1 ͙3;Z ſy`py=}ҡr] -b>U[]9V剀uĪ$ !С/Fg-$edwoߪDTPPp?\-VrrF!Iںu$i̙9sfվ}{Iw aYTJiXd ‚t[ʽ+<8fkv'{PYOIA:T'pZkxW o˖-Ӄ>=zSQQƌ^W<3N4a r8SdqaÆ뮭')))%CgRy> L ׬#raSRlZ7 ׂ=*^*,AZe.k$^I~gP%''K֬СCj\$m۶`bŊѣT߾}V];ntYі-[4x`ݻ իFpϐ*rK( F!m)UDUڄ)@m>8UܧR#Be3J]>{JO 7Iѣ={?PRR+͛7á4}>|^.]Vu=>>A4iҟqF-YղeKܹS&Mc=Vmc4i$),,T/$+.W>}tUWiOtG:t谲5}؍!gx C:uu$ J2-]G~bZ+I* m:bGrzUrq:}&a]3 C_)iSg-TT\ĄxMN3gI$ >\ozj,YpV祗^?K)!!AÇӔ)S%I{6oV-Ν;5p@m޼ĉScuwTwʕ:|$JyGSNф K|nʒTS6g-UQSAa~y DW,nЈWW[Q.WL+XAuVef**2RVgzgӿ}63o=R-c%iC@9ZveVXXZ^]J?ɕP@wo)GEEiڴU/^Xkx_NZj}ƍWW^vmT0`2ͩz}uV\.?^ǏqtocgTgh"[PIy}!C9ޢ$*,#&YNIÐk3&bͧv|SG}ѻッ儍<^^O>qh3OXmv:V-XJ>X>"3ރ !bH^!ExzdHlZ$ YcU .>33֥2^6]wPʽܞ~vj$nRIRbM>]k׭fӕ鞡wnuj޻O zGծm[9zTuی@,]fN{]4o׊tQ!woZk|q4ϩCvЛ3UXXGEv*yyyˑsu؅(22J 5)/?_{]Qp8{P!0 /'[T[qK}.Zk]Mզu>_YP=8|kǎS[ zQ1uKzfj$B&ICY\&6ENyCOٻWnzEEFj񒥚ճGxWsZzogLWpppjWEE~sKiF+..ڵYVVk Wq;9gR a} 9.MtyZEizՔчTDx5Ӡ?S֚tKNV&Mteڵ{ws(&:Z6M?W?mcǎ,կG>KZTDxq6XY<S < qK4ָVVZ&Vᰫ,9 A];!0᫶҅lչ,%&$("<\J혢}O{e+0tڼ>N'i:=e67onN%nH}dZվ]rUfSJ޻޵$kx@uRU^^^zPp<o GΠ?`3 o L۪HLv&ݮ?+/5WC4*J7r{`+5C=YvcJY prl9PK>O%% u )T#(Xe%rN{k -`\e]}ztG yV$th_>Y*sb[|f2 C;jpVm~7mTuUO:Fm5JRD|>~۶_ݵu# 8s!!!X۷__y<8iޥ|BSPpXVTbkM~?SwĦjjթ;kZ1g4G5jUkӻ}DVLLSEEF+VXeg?ɯMF=ĄxܵKeeeꜚzZBeP͵cj{aE6Ԯ{}yM4_=5z"#9bQ>9N*(ȿp?^ԎZHi QTTU#ĴZ]i^f٥PtT-x3eYݻFvYZgjuVeJG ?ѐasjƏޯKc=c/P@%IT>MK-S$ޭj{t^cQhKWWZVω{xMթc<9zqqڴiڷOQXXXԍ]oZ^oݻ˵T\RĄͨKnnNar*--[s3 fSpp\ӯSfCU|:t qqqq3 Yvꀀ "`** "`** "`** "`** "`** "`** "`** "`** "`** "`** "`** "`** "`** "`** "`** "`** "`** "`** "`** "`** "`** "`**ʞgv @)0IENDB`easyeffects-4.8.7/images/appdata-screenshot-04.png000066400000000000000000001601501424023573300220220ustar00rootroot00000000000000PNG  IHDRT)sBIT|dtEXtSoftwaregnome-screenshot> IDATxy|uwҤiKJBR"""rޮV\o\]]uwuu]uoQQa[9D*PΖLJ:I۔|<3oa:4IvI\uU>ӷGDDYV x9oK)<T61YWVV0eTGn4;|[zNJ4^ٙmzY=h->h/>:|CTѡ 7@}qZ|p*54o%IÇ ƏfrPST -]v~MCəァQX_p~9OhFꅅzŗTVVYY4w]mڼo=rڸi\uJkb-ZD;vRJrN=JVU/N;Tka?h%꜑SG xy}ߑj{??Pկo_ò7'~צצUd6f&7Nvm1cջWO̔nӰUYYi:e>I?frlULt^eP{TPO;o#}3[=‹?l6uh ǟDž^[Pfof貋/˯7zG+7$ܷoOdV\\~W_mX^RZ|ݻWժ{eZCޮP-?rҧW/i]ٲUv?lJ{4xZ=%I -#|\i: .PiYw[?3}Oo͘x\srUT{My y<諯ѓCIihfvܩ[')]QycZ+pA S5l٪_~UC>+ v-Mtt> Iҗ>5k(!!AegW aђ%Yp<z˥_N*IE\~iUJr>I-7A'?Y|hV*%Iv9Lϵ~S**%9`tɧo_Rll$@a/Zr~UuTчOn۰!=5Y]sW߯XOR iPSP߰A/_E^zX|v8*// -7WVUY]25xz\ڽ[[l%]+W W_Z%%%i"9n%U +7c*X?X3}O۷+**JvbuX<7U -ҥ[nCEYmnn-^Ttǟ$Sǎ>V+//o/F;wT3Fz֯P͛oC?5νbIU?M>mm߾C?ܕz7jjl:! z`ٷ kjO^b۶թGJZj$+S>tպЪGk} ژ꜑VݮOKE7~oؠN |pJf_G=?:S~ tzV5w%%%1$uPYYJJKEEڸi,]b9۶ՠ%W Er}gG]("""RRZO>Lz \.Mkk˯v (+/מ={u6uڵ^sPմ$]y٥*+/׏k)I{u:tG***xzkfwr\nrw;uRTdbb}볿~D_}3W1UTTXR|L,=%SR+M7ܠN<=ؿt: SU\\??𐢣ctΙ@aL}^T}4ͷ-w^UTk[nnk*jT_SzB74Q7mnbц>5USz":PqwfÏ?њutU®ݻ Iڻ~`Ύ$I WxxbbbZ%˥h>Vm9'GRwƒu6]s Wáݻk֬]+ǣ޿Α`t>Wv4d eK^KھclݪΟf|QQQAys$'+.ZZp8pݵ[p<(:9_yo׉'~w˗kUkWUv~X,^?ݖ wemkUr\N3:RѪի5iti uСby<u풩Ғb9թ1r\ϯV~~$պP ۯTXM2:zOₚ)~#zVy~okw@=3` :tpzũA_۶HO{fGۧڴkm6l62;g(!>^ԳGm٢ 6jqC:Դ7߬96LK}cF.n7%չG ?k{W5Ila6EF:T\\u+TQQ!I+ǣKmċgCT0dn8i{j^}x<*9n"K;U@]մoKzvﮍ~SUQ\=@p׬.4rɚ,e#G R}4vhl٢?fа'{nz}̯_rRRuMTK 놇jګjPϿLIu*8|iп˯~OKqIF2BsW.Z]5_>Aii;r]<bz?:3I'`MI:5kxzTږ.յjAUu;czJ7 Qa΢_:zT:-aCOPV.ڲu,[#FCuS 2cSNNu %'%Iw[oCC_}V+//CF]U5W㜯q~o{x8 %)1^G˾^}SXx@zt׀/4|؉zd2z%N=J}1G[4lP:tHΘ]tJu_ֆxԳhގzá1F_׍]$mUYYw*ۭT^=7_s6m[<Ovb\m^K$M_֯W׬,M~_SL&z~Y> Tu$yTީ~UnKi[nRSX\CX,zקOzaLL/\K&K/))7R\|F ^/RΖIU?DVEitکct:uQZ;}7k3O?M1~'*-+S(ۧ:Zp"##5~ܹAyGtizV>}`";zcڸiV6lvfu Z]?O-^L 0nޚ5QO{ޙ9S_{_B}1Gn[)ɺ[եW/]HKNڷWf y Iѽe~jGc!/^(ǣ6:cbb4hZ_|o.?P/,,ԍ]?jq}ۦMUrYan#=\g[uTQQCr+?kذzY-Y"˥aC}h&"##զM]'99EfXV*+:tJJeZնmv,**\:xz^+Un.NVU*,!={uŵi/=߀7V59\ F !0,={mshҚ|F-oh4&+oY| Kմz9\V# PzsYa]ث,ofdk AOlRk.*ə)eEh3WSZ:gziaCZA7,a g6E7kT,9Eŧəֳ~Oq!{z= ATSURkJQNӫ =ҩ*ư IDAT4\%>5iI^7)*Z掀r=eo!{c #j1O :^Pyw"=B6/hRBIRq*:ϹVN `^ ļH^HF?-x^cLPR&hZ}Nq|.[D ɗѳ 0`uSe?+hܫmZؤPX.¼꟭v&0Ùvنzl~~_e/nX5U3}.X b£g{i 4bByMUڹ;(3}ց]z^ ;^AkSj](2C 4eTMPNM_d炇TVgx"T9.We;9zt2Z|5a8("bS-ҳ}vX%z@PυUb xmUy޽*)Uaz%7h"6yk*{S#7E@#hbS2cv,ȫ.=[iThACwbzE1Oyʾ)Aiг hc{ u[DnXjB1jel! ~=> u#J~ _z 95~T@٣*޻]?Uo $*߬6G\uGtq$Z>ާ\3 .>炇$\SՎkk&"Om%-δkbUjiJ>P߾}>Ʉ!&0{9k6}.x۫}S*ٷ9Gع8;<:E8Lj9^N6 ljzg O:EnOM ed+:9PO~"۵ȫogZO OX eɸ"m`gZOZvm99;Q^,we_yd Wƥ[OWKUKO͑א|~;]gܮ fWŒÙ% n3|J4@ 2e>[jwӉꎘxu>ZeXb[iPϧڂ@"wNL@ZKVB>땮FoOrSq%:TA'q9-.s2LcоօxճN J[3}%@lCnzC҃X -"Zi_z\Wb ş&OZR3Q=Ι?~U;$I_=0ܫP?,}>ϺϞOQ5D.Gsfd+mxlXUE9UYoJ7Yco=mY]?C=6 ~p sx\A9z%u5c"@CrҚ*w$8hvz9*/U?D5g>C} L[MCR}!q2ԢƗ$%[(aR̳gZϓ@kRO3D8:g5ВhOVk1H2ׄ )ݿL.=[G]oG8y^ v/`C/VtRgv_ @KG@^?R]e|e*?o15DW{UHo` C2A3 >O)FKfO6Eh ۗmzh4߿tWg\o/&[GXmUVǙg QjDXl5V=)Izlz?ۿe6>t<""b &0Kӎ7h-L>-evy# @Q+r7n~CKjV{2P(.P +ʴwb=ʩʙ;ͫ.#[ ݆z4E) ^Wy IrOS|zJj=NREq!ӻ)o\^68RrQ22*͞H|zk|V" QNw@.=[0242.m1DC8XNe h;])*W-<&A;lؾ=mV00A G|2HzcPhlw=ҩ.cnZS8:x^!9i)(ԛڎ=!hB h[I\ E'{?5.ݫhI^5W0p$௃' vnVds^P!?Ta'$Ph̟5/*>M]hp-Wxt!GU\C䭛oxzcƈ9ФL]OE]OP߿Zj8D *䫔tv :xvߡhw O4==ueTM>)(+LjQCo(5jI%{sX,ڹf_sκ0T?|N@@|MgaT&RUIӂдQ9zԨZdsD;ahG@CYмT#LUOSruD!XjR侣jְp\aΓQN(*魁a݆ jؤԚ梥oPMb' ~.LykݪɗCFŦӘGW*-}lXu}ܫgPKͮYdٵ۷MiPf*~'aomI>**>Mq\Rkx2A|YCvNݧYZ1VC{|2S|A2q^a~iZZey!hVCə~`Q7(߫nQYk3PV2!(3\dF&Le}lZlzROB+w=s&=I?>N \MAZ&j۱W-2CZ~&rw8>MhF+Ot[s;zF{;Dd;cJL yo W|×mEtr߿#%[^=){veE +>֪铼jYcou>(3PeFasLTlza]g!oOYa-~PO5Ы(™R h~njiƙԚs"㷲߹pGk9^&'255l҇M'.Y$yO]P%CoVKߡ#57YtrNceC|R3\lc4-$D%t G'wQrQT\ڐ vmrWQ`sE?`Ņ'&sJRl~[;?}PZZ4]EڻaW-™z\l6|1je4=@}lm5ZK~u'}7)M1w!ɾ)vgSjz/y CPzh}+jmOD;thD lyV!ԛLj_}aޯӇ_}.˙aHCwIPy^6IaT(؝$tpϚ^cLPIn4; lZRQZdʍÙhq}JSw02qROSL^ȸCosJ2ה3'D1s UQ5 jQHF?[׼#~o\+^c#qu3^%dcعCΣS3)l_!m^9 hCPڄpf@˳m S"v{iUrS~+X,jeS5X Tǡse6S)}^]A32T7VC# YQN%v?~«^i3Uhc/0]x!ٯP0JWYGtre u3QsV|Uf8gGd!jδ*ٻ=('C Z}ZQ+c^535vOnOd\llZE|]ASbњYlΪNC/Vqv1Q3ԨXa6NT׽VCO0(Um$xsWkׯM@e"th&C qgP]W|DŧU5)RB**?IR޺Z?jU׶3I&>MRwמ 8پ:]>օxjj{7,1LlZXːlrڳX3w[~c*klG=/߻yj1'\~}OӉw3c#*vZNam2tܵl23 q`j-}jZRBz$Sp&<&A2c#Vji4Ū¯d걧+HY½wСݛ _DĦ7?1yMA@"X'&Q++4ȶ>'CPV+I}MޡZp&zn t1d9XcG::gbRt3]54xׇ 53|*ڳI[]mJzʶKNU1}{7,D{MYao`LjW9;tWE'X_4#TU;ցVʬ}EpFqJ2E06ΙdoiN:0MRg>sʵ 1 GݾjL}.=ͺY_dPCmɗI}5Fe;Z t.4uxaݨc\Eť)my]2˫ж@|ÐLVg!kL)e*xoBغmC~~6߲Rz: |H Agkyס^se^ey^\*>kerVnSy s&i \]לUzVHkf?UNT3=]zae<Q7h犏 uN}e*ڽѫp&`oZJ1J~x fw}VV Ɂh~lq] u$80S?I0<.ЬztR1MmȸJ}z걧)&[c;paP_"b> %טͬ5,ŒuśTՅWPի}_v^o^ffdgl1&գ 4ȸڇoMRF;z|̪Ǧ=dq])5Ne Uf5#&Y\[]ekͮV~  GQTMP="5k𘄐_C6ְpf5va;=׉M;W|b؎5̮T~I@ȟS\e5|<0}_}}$w;-2(6__2XOmsWifO\LB;{NH}ܷ;UOmq" ODl_5^$Wi65NJv죓3up:Ù6|^ۏ%r߮Mrg9br p&r ejB{ eٵkg >́u#`; 7lܤMՋКԣ{7EGGW3oӓojsNWᾟqۤu`znXvW+))I:(Vnsrla'*?@/Tߙק%ǣ~}zUVVyOhSջWO{y}mGXP_{ 4 /ǟjdZu6M}͜5K[lS>l9ֻ[3fV_:}΄ ս[Wk8Oo&ͦc5h g_e_,Ԟun8pnt:sz텩p9le-W=O)Okzŗ_uPSSIiFru_ˌwgi;ⳓ媬SSu<-%5%ij+gL-7W9[Jϻ%O^׭7Ao/64J@p<.Gێк}=w.z'/_mm%*s/er8-[t~#Gus )%9rx$ fvӘ+VpsF)ժDuRSSwe:t萡dfUcL-Uۭ)S]"?zwњ?։k] p5uٵ{-XWߘ{ա}{]K4d \.X̚nIR #UB׹Ǘmѝц9CÍ:&sƁt߃<ղ8u}O3gҋ/~ Gx::n=;r\zyp9ԁBEFFk={δ7kڛ[\/]>Sנiߧv3NsݯSVff''68Ԧ\JJJLP\\;-\T=N~J,tϞ<]~rY11uw{nO#f=? IDATWVvk**\zS˽qjYb1Huo]?{8N3~D ϗ$u:Uc8LqIiW_ k_rՆҔ벋/TbBB}&At?)Zg/3Ǝs='68&<<\:iPevΐ$1v.Zw\$IJJJ';'>uw54A\ϿJ?Y~|n_meqyeygd-T|z+Ɨttݘ{Qŗ_iނgVRbnycN%%&Lf}$})/|EEt :sZh]x׺7oV:' k@딒]w{ک`Wb(C{k.N}*!SaaanF]g߾tmu 穦L -%0u>7<ϿcX?{#q<5\03~uޑ߰Q{^vUםNz쩥˾ nHݫoo~<3}f[瞭oy7t\l1PO߹hqCnnup64ؿީu5z2TgZxTt跰2<<\qq7{#q<5L3~TЃD?gw΋.7z[k֭Ԕgիgefd4G:~`稷4]'sXZ3Ǝe˴`WT}M7k%Io~iU\Rނe[u @(vxvrjv =~{%m߱S.KmٲUy<5SBݘ{5zړg;3S] Shqu٩/*/?_?}Wi[n}@6M.XX]4rG}4]?YC:~[|S? I+*t_bQl=tu.Pk@떒io>;u#=Dy<_]UU\UsOyE~X23u\LtعKmt ]Z%&$hgkK/GQvrj>n&M{-{U\\NQJrhp<_(=Xv}GUlK&! )t1C)HAE)(ŋ;"֫(6Y/C#=B )G`% KzE6gyvϜ9*nU`rPJDDDDDDDD^^6FlfY`%<fΜIHH{CFX,BB5j$??0|),Y˜1cڵ+cǎeQE?~xfϞM?Vv!Ci&Wŋb0zhN3f~z֬Yýǹ1̈́\ܚ◑?H.ߟz ѫWBu[h ۷Æ s87o櫯SN?_`2 g!ŭ_J\\+V_dUnnn-+ٳgеkW«զMk>S˜6mk׮ϯ`A瞻yYEDDDDDDD7T}='N ));///{-rXl6,W6o$LNA>-[6@ZZ;Om۶Ju ???nZ>5 %%~ooooooc5oѢElݺ??\XdIl6|}}*WyaT^ղe˘8qyyyHTT4`„ +ZԩSݻw3c Bǻ˸| <>}NppQ̘6m~,ozxغu apwӲeKK,aI4nܘ{]w[%KР%dggaÆSX\JAh", }=kǷ~Νx7̝;Јʟ~:jСCg_G!553^O>!))coaal߾7ޘE!C8z(:{lƎ˚5k5k 4/5*##_^x^{ oooy5-u_)))E!77uѶm[2TDDDx: *ŭEEDDDDDDDD*T""""""""QJPGz?wyyyXr8ixT""""""""QJPG)A%""""""""xT""""""""QJPG)A%""""""""xT""""""""QJPG)A%""""""""xT""""""""QJPG)A%""""""""etR12sٸi-f&OR"` t8"""""""Վ)))tr&RE7l~TI6,4铯!"pJ?KLDDyLDDDDDDzjb\q`HN%Gk%33(ËSy:jIkPU9Yxz: dR3øAT%cBrꔪHUx֠{ 5 gŎ:U`:{HY)Au;MXN{2?ia`f p: 'PI-peeis"""""""nN]=z\Qٱ$&&qF222JWR\YYYq=p( wcلՄ@ A>|y6>xLxYMz񱙱l6T%""""""" r w}޽~rٵkWQ]NУDMxvhmv 'n#Bm7%ndRu]?֐Vu|Y̮W""""""""eQm~z<ƅD=ńĐ!\2z1"BE(^!?Cd1VgfG.V QH4ODDDDDDD1*77(&O̐!CiD֭y饗 ?î;0sL DFF1r(W?^^6FlfY`A3]0vX{YF.{8_~?v0MڵkE| П}_лwݻ7qqqX~Bm6̛7YlͥaÆXaÆqHc[jqqq7G)XP}Ν,]T v҅ W)/Ʉ5| ~?a đo(KG3rxśE㎁OmQ5*IDDDDDDDIoԨ)))Eb8x`E4l#GP~}ζm3gQDFF/pW=//۹\a u8 Rpw> y͑l΂} fyz[/ ߻}FP!N*nDf///悤鬈CSNR(Npptq1`@Be 48(+NNI'w84R:9mA7Dh~r,$͢5jN&!{FPmݺt:wv۷LTo?IQ5nD:ut>'2p0H2UwnH'0lK 5 QyNr0|ju(Ht9˱NS"""""""ڸq#> QQ̟_҄ llْ?[oҥ [^={9n݂aE'!! &֡C{nJxV֧O[ƎKv8zwޮ8΅8 |m|0 2wy9=x''TfLKl&!\\ŮTAAAܹg!ueܹt_|ロKŭc֬7]:~~6m{t-ZThjUq,OΒ%?A4mf@Ӏ<'^~W K\3&/u;$xW=b dm^#/8mAu6"""""""r^+4KKݺh۶-|uE6-%hu p{1lrSI9tCdo1l.Xaϥ X;grv`JLDDyHDDDDDDz8/kPɅL8O<5 40ڤP"""""""RNJP]8rWfr]DDDDDDD.bJPh *JHPyyyXJ hxQT"""""""Uua!/' Cqރ4W dvר@ʢU5ѶelݸZM;pJY?_˨S;<еBLV%dy΅"""""""U)))He8Yy9YTӁL&OS @=5__k&''q0 rrrp:Dfooo|||JHixdǭTofO """"""""7%DDDDDDDDģRJDDDDDDDDBBBid:W pq޽-ZѰa aaa哖޽{غu3QjIDDD*>]EDDD.bM3 ?XG^^.}^M&Gnn.???.4+Enn7n0.{ƭ^v]p|2fx.#v{'Nt:ۃhݺ-74X"샮cT6M&+W±cG.;XV|||Q#JjGÆ1U"^(n_LJ/H^^paw`͚Ul߾&M.;/qW?>}v%N9y۟_Cv<HU5+>>xH<NX|yԭ['--={p%x: {ֶLٳ999O۶8~8:ܭz۷oɉ'JUWei0s UDDDNR8v(d2pJdѣ'}U"AeX ÞEDD%%'ՁF>c///UkrZu0KTdj #xrTޚ=Gs1 n(?.c))nٜ[F1Lq#`c'LHHgؐk:V5n%vFVmN-Zo"Tv:ѨQ ws2Qddd2wXn=V+wQ7^wc_IMM%<<[FD]:} àEfSf8bNS2220e#+WFlӦԬn')nBr!֮[ϔIQ{jZ׾Mbgn撔|Uϴg^3ʭ)""RhE+w= IDAT,>!:p8X,Mi2 M4 SEtz{EQ#~ˋNArrnOKK4_Ȉ `_9=?7Qv-ӻ&M=f}Е:.xr4n܄=7"//|(""""$>!mQQ$$$pDa`&ݛO=/ Wyvv6p;qSV_VFff&ǏP`;ԩǁHHH(\0 99={vSً˟dfekޢqL bbW+yY?p|vŦ͛ fi3wYm `ܘQ2;w\EDD.tnj׮5ksAvO<xg*3>Ukò8x0`b/LJĤd:}96jEG[֮w5/((5#ٴOZjb0 YkLL&'7o&""J355|+"''KSaԩS͛7b6Lg$L'GWHHH`˖?[>aaŶ퓧Ey_x;#Fㄅ2t4} ߏzfx  cyk^z~9"""SRRbf|3g{۷6‰ItŽKR ?cĈu' >cn|ᗴhK8v^CXh(O?ǟSvԩ]۵_V-qbˢ+obbmڴ+Nrr2n)""i&Hz^^7o0 4i_ g6CV lpҲeRBФn`f+;n^^>c6N'w*v֠gGhݲ|"""U^֠$**}lfԨlܸ45j$&M"77u1tشi9{L{n:?ǎ˚ӱcG=Vűv݋^{ͭc>| 6mg˖OdddгgO^~%|||p8ŶWUT5K˯{\w@l6汱zw- 6mҘD"1)2]qwl6g׮ԬY0}1 >#9t(6IN.~v{-[b׮[Ԩj;9j,4Ouh0䔈_M_f޼y_\vel6, !!5矟NXXO>K,qxWX,Fi0c ֯_={6͛7c[ٵ/ ʦM\O>Lǎۃ:_.ߏkD||<>k֬_~DGGpB>3ڻFq;ϧו=@-W[nsյZ-~NCNIe"""bhܸ ͛pc6V^իص`}歈iZ5c2 A&Ѻ۷n֭[Ν;p: ڵ@M t"""Ւ$ƌ<Ӯ_u3xVѣGڴig} 1eڴi]̲e?qW0{lvCxW5k]tab(m۶a޼%gٲe̛7 b ƍ#Klwr!#> @Sl6a?w~@Z<3m[e"""R4LPP0v Y, >:d2a#88T}.LDDbW#$'Lעy3sy{ߣ.WI"""RoV"pg z(/;{: %&&ЦM$''qEDDDDDDdZ)ZDDDDDDDD"""""""R=\ܔRJDDDDDDDDğ~ vmp8j,|R)ژ&Xlܷg1{9=>T汷G|V;}6μvOoƌ},*=taE\٣;5jy?O?={X빺G\7Z׶q)^y ~cu^yy!lۯJu*rl۾}訨ۺSHY(A%"r~#$8_WƝ%s`<=@Η o+{]>8ޞ=BۭjF4praxޚ=_wK/4 ˯ذ߿I<}Եp8رc'Ͻ"ԯO]t)sy9% - ˕s~odK/*kEueg/Ϙ)+f C^;{PTN}Fܥ)~""ݤ2ᬌ0B'G~?_쁁xyyUh~~voo쁁KaPVY*b |q~*O_9uӡtܺ }=?__7V-[;s˜St Tb:e}+3^:<}{"nv_ΝK#DDie\-[?:[s.ش']C B֭y,_+sțֵ yy{~mY4N"<,P,{d v n(?.c))nٜ[F1Lq#`c'LHHgi0iSɬwaX-ޝ[F݌ZGqiK7%Q={. ԩ]K` #xrTޚ=G(Zt<#~YiҸnڵ=;;fɚ)T򴑛Kڵ|>o/]w=?M7*/ʵn` y ':*{BK/%7/&aЀZ\gdS2~ֵPYIJϯ]'";5a2> PuHN>DF1DEF 6y{xnqcXϼ;t_|{.:EjZ깽Ք$!1?>W] 3go'&(Cl99%Qx{sIDFFK9x)rsror۩>D'%5ײͷٱsO=|y!>>>>g⫯|3}ʲWN9dff6aFn:j{)/te=Ecu$"jgYo^j۴iH9ɇqgt^Lu^n>1'uv6i aC[^IO);⹞s0H?~)'>ǟ`[ %K>#Ź8ǟĤ$vmо];~-\m6mJXh(=KR!XԭS?__.oiS̳ԫWqcFWN]mZef\ѽv={t:9OFFaТY3Y3ܕ̝G;p0V-Z0fTbɇXn=S&MHDDMŪkl˝UY({wB& {.bO0~ccRq,x,q)wNH:u2X-~^⬸eJG̗AnnnU_)/ItQL AAA\ѽfNgT_~EbRb.YR{JE|&:x5ӫ'qHN>TXQэئMY3;&NR!ܲŭ}g$A%"R+[EtT@233)g8x:k۶mLHl6Ӡ~b}g\8ȍÇJ\GZ(1) 0ahW}Yhwo׫[*kRqOhH(נX,ǥ@|tWSǰ!Kfff:'2Q& 4-D *r5.D_?qn'9<:ʸ1 a× 'L8\:%%ﻇW{Td21G[Ea퓘4a|'SyӋ|jeH,~IsU8*J;?ZqFEt[ LXh(cGF"ZJz)/UϽ\X ?=[agڷLu^9j3d@m"FOPwt:ݞާ>#%ѧHe6^9%_Oo~mUNoMԩ]Vttu#wp0>X&M=ӹSGAR`tAqWS#$&޵sg[G#,!o 2229sгw~v0>\ )CosߝS-[ix vd`ƍ'1xJYp۪մnI||~UmݚOWx{d޽丆ݴjѢ%Ε;qT4v~ xY<}тd2ѽkgpBywy{ bez>qj!\aoClެLǫN|)9ŝs A]\wVCо]w+=">t{Fi PwDXh(~ZNZص{wk}=bbYo8&3RM)_[EΝܪesY*K|ͷ7汱=S6n M†?6Ҫe x;#Fㄅ2t =&f}4Ə۵-ߔvJMI\_˻;sG#'7f5a>xϝg3rxBBBҩ#nwxQ>>>ԯW'{Ze:Vus{HIy YYl޼״ǔXx`Z mq=G~ոjń{=O0ۼGP%''q>Cqm0d5ݫҎڬ7>%.rșJ+Q|\Z:A]ϴкeKHYhU5c-9Yǹy%@O {cV233/0/NĉTOl"^A| mǟA|ڮ\8w]WG<{ytKYψ4ůX۴pp۟Ky}]L&#fҬ@Si// k;3+ j_êqWeϨt^2]R)~3R'SUSPb)J@W5FnJ*xFe^Z:/?Lg,4ODDDDDDDD>UTMr:9EBNWYAʧU^ݓYxGѶ?`nu}? @FޓkgB?K Z{@6gݦ bc|6nLsL #:r$#e[){33>̜ifEOLA{eDnn.]vTÇ^!;;͛7Uh Uߨ??NAtEQP8C)RT6RJDж?ocӯlK:_'lJ ]s rE+Aǁ,2U?/jujxqy}}, -Hy[}(xf<"`'?OXq,4׏ T<͢qX'xɶN4J*Ñ#GСcr yˊ "~Su?tR 9]e)RTIiyԴJWdbgmD'K; p0O+\qv!iP3}GU}LKOHH'w*b]`k/Xv}}\t-b*AjTSG`$@* 7kv3ɑ9Nt4;6kLpt /Ufg| =LA!Kur*O.2DTFNI)6"b cɫ2>6 2؟/R16AeVz ԆCjNgqqSi<ȉ4Dr:rR}&1~-`Yfɗ)'C;n=nE\n"gL[V7ga8Za'&gE1u7 a^ҏ:,k lO-0C(dg+y-iʗQ. =8-|:n>Z@3DDDDDDDDSw1?sX7`ZHlc/l-o@=E5p($g{,`;z$2xm^*zg'KvIC?k)lƳcmoelʝb `30)Bg{ty/c1gnDǨRQ"""""""R;*A pakB6 - q]H+d< ٛU.=]uFAcurabf.CEڕˀ!<6[S  `w)nL!<\Jؒ9rvek< c:tUw .J #+ߥjN^aTV7f`bqmU^Ydp{>}"$)t$gn_>cK6΋o`z5fWf}s=E8lݧd^Cۅvɳdˁr|TI!toDJ=EX@.>B'o.LcWF#,xrz fll^_0~aMpz9ZĈG $)p,[øv#3J&].r8=S:otjm08wgxuR G>_>+tzNۏxӴ* *8=6prln8 ,8m(N 8 14'J)*$m kϊ+tR#m<HvTT8eMi:aj]DDDDDDDaO}W>ܶ~z.27oNdd$ƍcW_}ݎѲer9s& >>n~r\.>cufcԩhhIeƑ?.z"""?~<4;,1IE'u>?l6|ItNw١H0C|ɜ9s5jVbDGG3vX\.\yv*{SvZ0az9Υ]]avU{?NPP)ӫ,uu?|׌3kX,W9hlҞ}.&C_B"B 5\?(CǍ:8*-;7%+~?>AAAo5sssٴiK.et֍iӦѾ}S۷FfJoժ?+*'" .keʔ)<t'+C?[o5; :E *1ł?d֬Y[Vf=NDD٧5m;}hڴΝ;ݻw]uۣc8 W]T48 /={vՅC~~>gfvwILL6;J /U:d'^wtϏڸظq#W]u١TY]x}m<LPwu^%"R])S0{l˭Nrr2;v<,**sǒ%Kxgk%v{*'"jbF/1j=UU8ى=| #G$&&PD}b9)##/?ϧ,cL4QFѱcG [oe޼y_xꩧXb~ 0P7U44ND|S@@ƍ~-[;ʻ8uDy_b~)]w١9JP9ge߾} {.P|'q 8vGPTT?o /W_[n8>3S^Ԟ'zJnn.F"88csCE㤢rqy1|pbbb1c| -Z0;41Ay(K,YBNNcƌ1;:ǒbHKK#660iׯ墋FFH':)u!~{H_yԅE]AD]]ԅ4JԅE]A㡴; 1h\ CM>͠S)A%""""""""RJDDDDDDDDLJ *1T""""""""b*%DDDDDDDDTJPpQTThvRˊ 4n79ƃHANGBNTAO *)lٲ\CZRPƍ>5n/9ƃHANGBNTAϒb9KNv;4lb1; vhժM񦥥{"ddIaa١H-p8!&f[Ӹ4Dr"9 9Qm%|IJecȐ 1;rxB, M67; .rrD˖-˭H@jFV!ƏJ^^p0tpf^$l6; 0;=|è frҬV[_:)""""""R_)ACCr.%DDDDDDDDTJPIѲ9*5q&O&Mٳ7|37nT\\L\\RHIM㑿=yJ'FBFeѽrU:A>gy7;k%$22dbow?0kWtŋټe >}zѤqcorDDDDDDD|${'=z?tޝN:swq!ƍO\\<[l?~%QnK^{u?ѦM[.o?%3nxZnC}x饗x:}l6""¹xũDEE0w\&M]wM7 s ן[>}:;w[ow2aelڴ[`ٸx ^z%֯___aԯGe}N JXXУ{W5mBm޺vjVLDDDDDDDS%~۶m#>Qc#F`̘1Z+Wr7׿lc,XÇ=z4> ,{aҥ8N.AA%K𞻸=駟0vX.>|7p}x7?7oޜ'r*o\%KpyU9nƍ,\4hO_ѣ;3g~@TTO>$k֬P __Yzq;"ٗ|{>>qB#{o*Ty]v-³>mjLΝ0`˗/''-jr%?۶]v9*CRqٳÏHJB^^>999pܶm%z.֭[Oۦm۶dggWw&Rjj ?mQ.G=y\yoNvv6z:/^ jp2cС .bҤI[\oYMqq?d0.hQtđ#Ggb>t09G3u:啉y{1co&^;sqM7ѫW/"99w?"""v+]fj2D6`/|W4lN>}HBBB *>S>`bbb1l(.^yهIHhDP`iqj}7hЀ{g~_|4Nܹ駟iѢ:0 ҵqƱp"C ^׶"GfϞ̞%M4awygM7HRvȑ#IJJ_vVXEѣi>}:=4ݻv5-_fIMMݬ9d\vfQ%)Wq:"% =z*NZZZ䫈TTO>W @ff71~lZlzJP2J#*!QQQr0 Q/guײyF> /?Urѭo Jns98x 7mcS^yq3OE*:oO\\,Alق=eɜ;ٻ|Ws)UN d_|*.`ƍᨰmhHi,O:%|YT"""R]y&Zo :F _o˖1"jm]f~~~U_DDDV bc1A*== G=qcCDDDNYӦ:t.:NtTw5.eӖJZK+gjꥉ3l۶<b{wev(v8|8pChެa< tО##kX/$7;vޠAma=AmSDDDN *ѳgo֬_݀4;rYVp8II9hv8Z6Yf""b IDAT""e˟_ְvӢyS nbxjSՋhcz)yj>،)@mB>9nl=$18RɯN L 6炈TfUH&"##Y~=A5)L.TȬY$ %K6  zF0k8w◤,b#O^F @X#,\ .pW)]H ůvq5ĉҾ}:w½GϞ-B׮֭;SN9㈏Ӊfkܹ M6_L6[ƌ 2&Mұc"O 332_cf!u 5{71-I_#:Ü&VYwYK^*3 ^=DDDvkUzɥvsWw^."7oƏ?eeeqPƍeΜox6l}-"??sNt ""믿ƍ3c<3nݚ|!5jOaa!k׮%""իWYs,TV mc8lV~ښA.vݹN=B+;RJ2Oag|p8cDDD&W bRsSIHh-[nKNMRDDDSՑ#G/ҥKٻw/Gb >+T.]0{hђGykו4RCCCygx ͛7g \VZ0v<ؾ}{eb`@À煶P..}A-YtǗ6\)&ҳy09G E6G7"""gՐxrl㹹yl۾k(lLDDۓR1sgٷ/U:-[p2Ջ &0i$^~eVXN^gf kΛ aȐ![oӿRTTRye0JQ9%I؈춒9l%ɫ2>e?ߏ_2c(%ç3CDDD]QPP߶:~FiۦIHeT's8J&hY?ZfLrӦԩ/puזk… MHm9/tܙu7:nN%?;|8c~!ns S_yCgT]&ڴi/Ӕxb~\y啧,lԨ*II[KٱcVx p RYCsX $6ಞLCrQ&eS,IP9]=aYp$1>=0CDDD&0п/׬s\+);y'w?vQg#d9I={һwofA˖-ٵyJx饗ٴi͟?sҢEK ذaQ.78>]<.݂-b}wnWXj L#.""籽jbrݙgo2͚6fӖts<%39exoJAA>:c~_W͛GXXzn-|ڵ#G@nn.˖-c֬x<4i҄_|Ne$\Y3W).b_Xr1/n#(0nŸE5 *%DDDfء#7nYƬ߰~}zyf#*28%DDDSɧ=>h RSSJ=>Y|9᧭r'zyˍϏ󟥎ګޟǍwvƍ+`s4~Rn8 ,8mbWE6.6x*͉R~JDDDfrׇ~QfznF?u|r"""rjuYd ڵ;ۧORn"AQNSR)YQIDDDջgOvˣS3"%5l)"""QKc2k׎m۶g3ܹ3Æ SK%'.6.EDDVSBChӪ~)ztrR߁ڽ[x?3 d;iެ)!!5T^Πr9Xg^xV\ŵNdϰZ-c̾+'""R7Q#ŀ8t*ډ>ln{X}!f3CDDDVgPlS.DDDS:W_INN GRTT]cGu\.g#"""SKDfhf@nn.-'??EDDڔE8ROUz1~׾YRDDDjBݿڥ٥#[]LBDN5Yk~QGzdUZvo|+b*""R9c(OkK toT A(_>sف$è=DDD~RGxpC0(**F7F VEDD'i(A%X,(#"""JPT""""b.G *sT""""b*͠%DDDD46ۉn av"""o\ Hh0 9#`v("""T""""bF:ɦMp:fsFhҤ EDDޱhѿH IKK#660DDDDDDDȹM *1T""""""""b*%DDDDDDDDTJPS)A%""""""""RJDDDDDDDDLe7;n˗1;rvi0bv8ѪUzH}XrObv8aⅸ\N6mnv8r]aݴlpDDDDDDD|T>"+_b%//pp8:t83g~R/T6dddOT>rafR!0\.C4VN4έT>>$OKKK#--^%MEDDDDHxxV)A%"tbለRP͛HOO'&&pj9-33:)00.]jv(J3|I]<€|8C) O#GMT!|2aY@-YYlڲCY\Nbbbݣ;!!!:۰Դ n7QQ tVk0UtvR2arTq&nݚ~ZT`k+W^yA4nܘ/[nqc y{J9r=bTճu:v`v"""""r%mZ({aZY~~^¨/jRXTďЪU zb%pvS9U ׷JכTz"&&رzd9Cd5[Nbǎ\>RHIM㑿=yJ'FBFeѽSmzֵKj) UߵsR{ɧ"''v:'&zVq_t95$L.TȬY*wf.9b8YYYx1l'qпO/4nm_ngWsW%$?@8ڶn-uEYtڶmwE|\هsյ7  t<Ӭ^Ngn<㧍ϏBUgŋTA,UngXX,8]%޳]:UvkMc}ѦM[Ǝʕ+;v,qq񤤔lk.≏oġCؼy qqv:_||t:qLx-;wifןiӦyϘ1!CҤIS:vLd dffVXVQu(+|ːAqs\}ev$R~|o1|#66Rer\.2eqߔ;{Q|<;apQk24'yǹЯE)86oDnnn.TPφ 뉋r۔Tv; #c|5[>LG8pF|Ejz,⿳`9r~jdխ…=zm۶>d„QZ +V,g„ ,] (s3+0j%垧xܹ.]xEDsѸqcf~֭[>DF),,dڵDDDz2#_#;p\\pP¼{tJMHںݻ`8+s Џm0l`^~RLⱽq;W^{=hPc1ĐΚ5(((~EDDDDDjѱDF1 yJy<maqݸnؑ%}E4h=@TT$AAjΖXgƎU^Wgڸq# .1}t xy'x'XbűRp:,]Xj~~~ >Ltc硡<ܳo͛3~V\EV-;RxR}l߾̲W◞@\llH%}yhЈ[| rgTHH0118pFTp|EDDDDDݺ ;0c:W]>Қs8ۏfY&NmZb_~WjoݱIޕ]wA|\Ot m۶pxߟ nJ&Mܹ3˗/0 -[СCce+:thW^4mڔ0⋈Ϟ=?-Ð!C ᭷~Oor'LPdq3")هsl}~>S!!W&bh8 <Ͱ ͛7NLL Fp5WfMNf*$8\"#ǂOYMr&8jᠸxvNjbFΝ駟9t#F gٹs'Dvv6G*S)U2rrrHȠEf8%K{3_S8̠cD%DDDDDN KV~VV6VeIL)O#UQ9NVXXH^~> [gPu8?…4i֭#77[6j%L:_~°aüvFY/^ e˖R5^套^dʔYjC )~r[GҩGacpM{P5kӶM\N'6ڴYEivlRm#yrs(,*,  9rv_T  )]CDDDDDjY@@-[?HEEx :v9]-y;ܵ :o@c^KBB<11;\ Jqu:NPv6mкuk֭[Gn݈&::͛~z BxxxeC9E\\</26mb޼?6|ΝK-)((`Æ DFF[V?fj2D6`/|W4lN>}HBBB *-SR{/ȧk<޲6.eكG6?||+K-KΑt9V^KMںv } """""+i*ߴi ylڲILݫ'mZ"$$!cM,[ 6ࠠ;Gdd6nhn.Mнk tȑ#|嗥mxL>{s`yTP_gĈ?6B6lWn-|ڵ#G@nn.˖-c֬x<4i҄_|NeGI:@ppLq%kX:Q\l,BCCOi[^=xqj̞Uyb|]:wzztzԱW_9&&Vb a%Ujc*PHSՃ޽z['6& /(&ugzV-[Ҫe*kIMMݬ9d\vY5)gvr=z['--زJ 7xo-3AUS6ok* Yl D:fM{ƛg11ql޼ɻ/H]RPφ ;7IDD*&&t֬YuʭUEDDDDDGtt,fR!>߳vbbbDDDDDD4%|2T"""""""R=fO14JDDDDDDD%|j%33xzJOOpFy"((}STT1;rYV 0;%}DDswFIDATDDDDDZ\HKKrH)GPjT"rNKOO,fk-l޼tbbbX@DLt온䔈IAtҕTCUA%"f_|5V`$4G\w9fW)}g9jrD )]CDDDDDβZhfӖ-drC )((`݆ evbȠZ+7s$mח/00 cǔۯT"R-n'ytOlќ_sCsz??3HyN9Gҡl]:eI[V~$4o^XV֭0 ZjՂ=z`X>]TerhղRJPH8o>NpP F֍Ǟz|R\nnwnP^>BCغvIQB$"""""_```wܩ޽zg!"";~'""Ή:Uתs8]NXQTg~5W]MNgٸ?#r)**ko?M'&&y y7yɧYv@xwՌ"֬[GZZ:m۶">.ÇQTT޼.j+ſ  ={ڥSnZ*A%"UVPP@Jj*;}۶߿rzyؿ?'a9z{Ltd}>=tbbؼyu(.[DDDDD.((_7W)vF}ٰqѭK''$T;t9LL_^ۏT"ReD6lxrJÆW*Cxl)wΕ^椤3d111f* j_Gtt,%[<<6Jnn7AtJHP`e"4#TsDEEDV-lٺ~fQuTTğ&oUc &6&h N{eq3}L)%@ Utյf]ź*bYeхu~VvY`D5)6DŽјLb_ 5^ueiWlXbb3Rڴ=ڹ{wRCҪ]ӵKgeءܼJLh~$`aaaoPCnG)-Ztdj$)//O۷g Tii6mڨ<ǫYh :ܱC4drH11c!!5V>~l6nG~+7z/׫9K &տ{ly>??_y+M֦$8_gՁp )$$T:uV^^NP:tXkJYc-/z;r42(*2AQ\2X׮ޯCWj3o_YsrtqKbcblJ$'L}jmEGE铕TTT@ MKRfTzZVMml?WVVN]-P~Aa~NCxKa8ΜNZp;I˵b*uh߾timZ,Q֞JJL;tu~c_~D5WEeVYj\Ն @XV=1Bcvڥu9jۊNvM{q,[V\e8߻gG6VuA~@/;[]%%ܱc/i.jߵOS|<֯V鬪N][nm7nVqI6nެM[6wUi[r_^F}jEEE +,4ֆ7H6MgKkɮ Nx?}[')*PS3Ipi_Q?͏] kCԥs4xI9cTAaq)DD4,3S]HHR[$}:nǵ?#e)ba__plO|AgǔkߩyL;{} bZ&fU^^&é /p“)"cvqINIR~.=bUqqéSlS~οuCqM6*=\.jJKK7_+O%T"9BÍF*ˋ*_aV>㕗uZf\11qF"aNpꨓi{_xj3=MAz&Wɿ1 =ayyFNcG)$Kת|J^IOI&d6JLUO?,RKZHQBBbן4B !?[JMrXM sX(2ĢE.YvBE6V6Bf9mfY͒l6 AϠ W~;s|@u)--ݻ{J1尙b3wZ.hhK=6L2«(] J=z:T+?NԔ)cw<>ONBATɚ5s,QFFB $=$ͤ+FwyPkR0鐨N=$WV$)"Ģ+D/-$=Z$[4h$,Mݻu Cծ]{uYǏWN3jJHH԰a?SJHH+xt Cձc'qƙѣf̘Qk?JOO Ik]z8|IRaauEgQcƌm%$$_Gرc8)MbRB]Ύu;5o-*KϽ^q6 h!"I~JsuCv6qxT/p|=j߾}5jN=_FvҠAԲZ? ]Ţ( >L-Zмy5ycjӦ_m5qDIl 7lpmذAFRaa̙|͛77Ɣ)S4`C~'7SU@e6mU6Y+ WVI;ʴ#@-.۟Uz􅄄`QΌsR<šE_Ҹ:k0VFGgVPkN+V,q|޽4z .і-U\\"IO?TXiii5j$oIfϞٳgW>++K$q|>?25vd>UUˡT>tĮhYhU# f7a6^qޖ-[ѣǨ[nzTTTIǣzX4eʓSTވ#4dȥIMM SO$ק9er{>\snMqjEkvVx49l:N}EKRI *ϧ>P^23e\K ޷.ҀӬYi歁QQޭ4r\'Iyy5zskjTKص{lݦb%%&{seۃTiiikha5GDDHm8`bʕ{G}͛玆[Μںu +p lٳ}?)*=>唘Wkش5LNzv)km9xU«2__CWn#ty} )u:Sn[>>]VZjw߫Kʴֺu7\ˆ\"ǫW4slMFה^;OY{4 8eh׻\.'>o/ 6~Qnݺjȑ޽~Y6Ի. \cԹsg}9r<.]8(I:imܸQKYJIIQffN;SZ:u$ 3<+I:ߨO>[nQnt!eeeW^OI>I^OnTi5PwOՠ:TT;m2$*2LxP0WVծjHN/ {_g%)-ZuhHkvp("<\uWAM^]+x 86mޢ;(>>N7΢tС'"4rHkIZd:g]wݥK)11Q#GЌ/InfmٲYX8pl'___UVСC3?~飗^)S]+>Qjjڷow.-'>+{hpXK7L&]{),*\\qg%I#4+婬PhlKymaAuzwn3iU\98<[tUꩿ>vm]+W)k^%%&hm6A?X3^yEgj~tZ.JKK5mKrz9CҹsGڡ7j?g~,YLof|QTQYW_{]}F%JOKӝ3W%I/R]}VVV_sWPjm"9Iy*77[nth%&&8W^^ܼUPP#G6k{+/LQQZduU!!!ծs:p7F瞮׫}z㭷uE?3 Ӭ^TiI"##t$=tifjيO90}vg>Xm޲E1͚GhϞ,=ZK/kwGTTT^;Ow>>9F}yyyP߾p8,p:(--ѦMjKJd6Vq+\%AQ{esTO>U_n*>=>Uz|y^^5ny4KH~$UO;p^U:oؘY,]ؿ***Wkiij]uC.נˮИ;9:C%IyZ>Cp5oA5kI뎱*RZuv|-]Bw3RR]s*((Tw3RR1nbъy8_gՁp !$$T:uV^^NseZ-5lVW/.'x5þcjD暈2L:pHלz999w[ݦ]omWI?qfYLf^wHO?׿յW])KU@#ϧ*)_+nϾ}V-{ٳofR[{l6b}te[=|ee $عS'ps:j*YsCnJ[N#~`mnW\\m+/** \{xHGԈYt.&"/>csnſ$rjw:oL5潦f`Tgo$m`֭u UqIBC n%4hi] :*IezwԯomZzFH%t1fnq&=]2hм|>MY++9)I>O;֦u6BwLG7Ԗ*..d2l2+*2J;wwX-x6s:wR.]4Wrg辉̝;U^^:Ytz?4 Ժ@{.WbcblJ$'L}ŏ4V{ŗ_;nҦ-[ֺ"""OVRQQ7**R g{'***Rs[&Ijg`U^^&?mPڗ,}zri UtttS$as8UY^b0f9sOV, ڵ ~nUO?WG\[Gӣ?}zr7ݺKҸ'(,4Lq5g#5Q#no$IFߦ;tФՕݠ)O?Y?xZ-6V y23w(cwݮ224[7֦M&yb47yAIR=d۞csXk{'=Gަ\=7Iَ1- ڴicehÆ %$$z>9)Qݻvїd2oM$0dfsXNMza> >4JuJ,". IDATx{|SOӜ&MN/i^Bi R((PA,JGPALtNι9s2&y)^PT.zҖ6M/'iӓ'4i{z׫/INKw`u-mVT*B!B mmmk֬YbŊN#dԩ_z||ûjB!BDDD@RAVĉ[,~PpԩM&lQ6%B!©SX,'"XTT%bF!B! Nt:#"")D!B9EDDUF\.{AB!2"""Du[[[ 󡬬55hmmV303f,!B!gu YWVV;F#"#'aTVVs.%%C琙i5B!B/""]F86[-M2Jo߷B!rikk:jf(p5qhmmE[[^qX'k7*u:L&h<\x`"L^zqk=w^RK/G X8qzvyjm67 =}M!r& ݠCe !gI5Qq$^xT>kX֣j1cA&egv}O>,iiXd <Դ.Ļ|]\*d F^zo['y6NAyp:㸐sL=!Q$D!6wV{Zѯ+^285g? Pq$viq̙n|o f_o'櫩ېssBuyB> uo.FԔ=r o[!bܸl)BHXLdbt;ւ.w .V[+;wbXz5`PV^xozn}窫O+ИLc_vS@ɯ_Rpq!}-2x꿟áKߏ;-z>ӟ?z|}Bd:RuLN6͵kzزu^jl3yUp\x.)8sFp4_iY,BT5^}9 <MReN6o|Be:PVQ\ "##Ngr͔GzΙ'!dfd: 9==7.+ i˖G!t#rPn$/=&S4?Nh!P՘8~<=_?;={###SV+4qv~FѣXY3m_VV}UKwX%%0{>B!772&/{ǎG5ak2B39?g2++ǎGjJ ^|akPܜI3cB!B+>. /-CJr2^yy:WX% #E/RSQ~]цs|+H4PgfLL?JA_ !B!oڀ6 * 7a')–s٦/pZ55W>V/ٛ aCl^aq.Wb"B!dw߃e@fFN:@}yb8v<hƴ v"ܸ:$ H4pp͢1}CB!BHè8qxʋ#3#'NĽ*s%zo{do.+ ˅~[Lu5/<)>n\V82BB!@?;qYYxzcÛ\ vI> ﵿ?=]=_@jJ /ju2'nn|Gbb"x`n񆰭-p|B!gPN[[A\a)+ 1q]+RzGuu2Fuu5z}6!tS/0qM7o@ ]A546bºF9a|0'rn KFk0ؼm;]HI6aq霂^ٕ#ߗ޴w-!m|>n߁”\O5cpºV+f3i|B!禰B* . .*O C^ZO t9rjjjè@>|\n7<&ggc p8*JKK >ݴ uuvT*̝3IIF4CB!熰4KL}mnB9Wšuv{Kp?mXzOT*Ցa |ۭBb#o !dhT*\|,|&UVV:%' >>hiMTGߕ#ok+c N׹)qݝ>cNKCUUQֆƦ&$&! ΀Ҹ"?`YڍF )00ql޲o/B EEAEG͛rޮq㲰yV|w.bVżM_FEa DD!p:!_}iii~RmV1ca[!B!$rLl6$$5k 2\i55i !B!@(##` قb o2,sl4ƌP D!BY8B!B9[qB!nB!B9j:+B!rQ{^!B! )u}}@!B!CJ5B!BȐRu<qh؏ʯ ^!B! mZBN ֽܻP^<#B!6Ng sr$M ljkQB!B!avBϼ5>G7)%B!BHxuҙ,~XQ !B!$zX=zm|UnB!BH)鋑9}DB!3J!a]`4}o@ma\"!B!׀@y3v']obp٭B!B*lLg h%LS Qw=J7J!B!dD { $"ø|oG7[Kc*B!BA d)S@cE1m| Ń9%!B!tk!z2v4ז,"B!BȰ@HbX 7,"B!BȐ@H&Ed)>HgB!B̰B2"y|d }ڄ6K@frFx<\v+5ý4B!B9ٰ"9N~XA>l4y.8s6)iTVQIH4VGw0ZB!B dJz8Q6's)pW? !ׯ5a)D`R{aݻMB!2Fd $qR6W% lRcVHn$Q}-N~>QB!rnсP K0BpQssX=6򡱦)h؏K&GŰH;!g^T6N|B!&gL $+& *?xkɠ/gmg]MB7w0d#}u0M)6jK9Bg@k0#&)h"uhqa?kHA!BHoqP !Ay 0v:ZE؏Q+[3Y`"1N .|6dek:S/GE`q%h؇gTj15OBsM)< nУbXĚOGo[K!B9yȅq&*yux\v+1a5rFĦ@0 Ɖ֡fT ZbXh0N Vkl@sMiǑ58fTzG!BgM ԑ0plĥOAt\4ï_ 0+~l~~t2 nF٦'!Btgm "R͂rhD2,DF,:~Ͷ z練B!@bX,} i8χL!B9ExlAF6_+j|S=}H:B!2("4:GLAǢ[t+!B9{Pi`%I0'zu~!B!g.n7' 0NV!B."bXdYoFJb8*Cp!x|CtYMgΜ FyYpȾ7Й⛿AWB!dXP D,>3qs4,gD$ÂAfh8u]Oyxw֔wh-nvRv%lc\vkLI`9#jK h)y˟ Ϣ|0"HŰ7I0c-3OP #;qb^;!BHP D`C=(F{T $yIDsm9l~=( r>]X|>@!$Q}1C}!+~pPbrI/w8Fտ: .3{Է۔? šw !BJȐs٭8oQ dYo{m>}wC%'T u4gA2Ͷlñ/ ZK݂Q}Y8)ې;%lcQ2C9䥐!| .  EMyd̹ZS͐VQ zNDe+z^B!psȰiin@[Pp*OdAO΂:Jf[N68kJf@mV4G?w=ZאSN!~;- gM)2cz5ᐿ(5N"hr Q.I`! f%n\Dha?'}\[(D7qe[6_kM!.mC?Oj৯ymyFõ͐v|3KC?C?C?g Чw|]ŰpXQL%Lc5  :/Z*Db?2,qcvL{}`+!_g42rca745CV>""4Tt \[L%0{BȠ@^<۽3v,>3ވasogbog|dDò32vB).a}8^*߶^Fuz-eh/Itߋ4uGvxV}o G#?kN)WZCezR6˼;P_M-^pr-h%}' 8KZp=uOt9Qya+k<0ZJB! B a7!2 WOe9#2 nƱ/.{;Y>>/;`t)&\&\gw:M@'PspSUG9KVaԅK> ęPz#D7A"&B2Dކ=/} =}*$+3 M؎858֯=_z[D[^8vCw1fk]AŰЧMtX&\ ~1lA`:týB!dPP Dr٭J04!+Ɖ.U I\H%r{lr4wn_Je IDAT*>#Gm6zÀKyD7ԩauԬon ˘BHC!Ceb,A.h c4\$lxK(>QEEdroxG>SȎU5:w};LuA펗>s),sodX& ^vH!T2 ކ {tdGݑnsQCy1۽4Vx=Y gM)T̈ )d.ޒ=t;3vq!B!g-p/sO"9w>_q?VC8m8%l' 9 )S[r_d ? KX3\A _kxaZv)"r@avzg-نXsz[6XʷEG=ҙeBmB*Oz=Vt|2v+|Oc5sP 9g98s6Y`HX5z.>FxBHDq>Q@Cy1Nx'vyAt>Ӂ?}ְuXS1,R[KmP,yPڄQugM3v`4, M, F{f,@ý B!Ä!BȈaݳߑnn~nʲT ˼;0 Py-֜ a8uLh f,NZ@j؅ΐ@jۏ@(g0X WDaX.C>{%^qp/B08BȈ"6pi9g9~bX/Fd^7uiU B0y*xRlɂ2)gFsm9)zGj<k7M86#x4}/3bԅK`ʙP W!5!ab%M{Zc&>Fҫ@H}*/V^&=Z7t& m1f >3_o9<jV;F*@B9sQ D*!]ڒm#oshlz$UsnKnERv۔f):c{\]Rh ׸*y\L9p>FԂrMg,g+BM !E{!#O`ݻf^ ѳo@%"9w> GTPU"uWh8VF#R1C6'!!BȈUs`fwЭbX&!Ƙ8\[=/LFCy16>0{_5=C4 683q d!+nV}LL8~@́Mzu;߽Bs By왿|ً ZQ́>_,gު;!sBF,gM)m0f ^7x|rph }:G3-N;ج(]"V̈yOO`8Y0t& Tj#؀!}2$G񚻡5]oECy16v&|r)1a8>XΨi.>tAX(ttɖNces{qIzoWߛƿG*TieA 7قKZJ(=Bȹ!BȈV#$ީ<.crN: nA>Qn%َefxb?L90uP W>wuc&~9@pC{^ & Y38.^3 7!uʜ3~ɹAk{ݎujVfۉNA fcK Ɂ]Wߛ|=Tg}!?'AyVZc ɜvA!("p.awrMk0#}u8A_mP1J _is:Z\Uwl7UGPwt'5uwZC}J ڻmk;jGC AJ#ԕK }84N(㵊BP96,ZQ)1HE;}7ќV&6{8xqi߯لql_x_5F?4lNyýuj4B!C!BȈwg: ?}2o-E7g3roZuD߬o:Z'5zxOwگ#HQx$fwH'"4j BŎ#ܠA>-)0SkR8 } gu9V_dQx)o`!@ϕ,Cyf!t!BAm˱O CL֢lꠒ1B?y eh4pi)Smm36AWD7U$ w}?0(&BCw%Bg yhU' A`eB0*Z(|-&50k@zMhq6tjN ݩLn5;\ڄFsF֒.s",|^.Pz匘d2_yxko)E`+]ЯFR B@!l(8kJqg QxwCVPS U^B.(pl8@my傚t' `)0b94Fm9Tjl+ފ:uA{hX. I9Oi :j6Qz)S%I~^Og<",$)?'Bu R=5ƍʿFiؖ\SVQ@өt/U6g.U5f F!'T'/6J v_C̥~?e!# B.(#{nTb{: 5 5EqRB- 8'WAK_>CCY}" jup٭pWBeٝ *b9#ZH]\v+D7)^S -.i) F){Z$*ߡԭO0Ox} /e:Fv*ףP Q@Ƀv%(ᭇ4{Gi |MŰxH._y8xzpfD뫔@g'Jw(22h!5g2v/! .-%e* 'D7_Xs6&\tOjΚҠig4z4ay!EF' A^{%*;`4f8s6g#}RR^9#;M^{d{f4zD=QYb~'ĐrJ λYZ뱻70h.z^Sw@se][BH?ЙڻL48݊c4Y}'$`Jpi#j!9>uP&qljDcqr;?7x9;qRp<]twHp)ŪQhMi!yK>QZÁrhqAtK N~t\z-(@p)a oC?u5hU@c0K߇=Mo zsm9t1%[iX^7MB"4p'P ;=Ooáw :ܵx&*Fz&+Y.0. ]Zvel!ڟ,ōEɃ!yKrP"wzq3t Ҧ & M| k[KM0CD3[Rp!?DоJB4s}?J:XmrFhD2hin.۩*5Ӿ'k^wZ^K>]oi>=dX%XtJWg6k9BP@BAt@)hx i`9_ ňI^ J@i^Onډf[2nҲh8XގM)wCoEBM`bP^|ڄQMhzR<.yBɠvrIexq)h(2JPE2pT A#+-%y*&:;KNca̾~GQDsID .QG jHfcuwOGO35Ylz,s@+rRʼ1t1F`tU|zyb$> B>Q@\Z6t& m5F)BnH`<ˮn>#8/tM:->AsPy5J7TYWE;O!63R4OiRn&/k6ZNʥxP{ Tl݀>yPspt,{\E4A#9['_^f[rnqr-F CV>X}"?@fRh-S: omB,Cr`!J 5覽4:r!Z(({NKV!' ?UjVʆ-U.dP)SRW#aTÉY8qp/OBH?I-͈ gMt-Tl j~hן/pGEw8s6DDuGqg`ݳ.赽/ߊ㟾}kn:g*Y]>+9qPkty/0V[ %P%~S%jq6(0w1Ich8D2,Zu.^ 9R"8U65:4ז#3"RYS cO"J&kҞYzO$d"Bh8dDYJKۦ%T+F( }R\x[R6,mUx]g&l5Rܟ3JKB<BH?5qS38)84V0vxFi1oO.ߖAu;a2-:4xf3:jޟig&0`]t;* \ QgqhV (K umm1ڕcZ[3O " ЧkD fĥOthn8qlg,*v?!dd@B^Sy;nԐ[KnB;殯BAUQ`4\f!>QWVL 2~9锡31j / ODwjYS VoCtPZ4זCKۆg-CelöI]uF۠dl;<%sԱ|NB志'9 |]**e{ޗF˵nc9#9N~DwF2(Q.s} } ?:5Q`/ 3. @{HǶ)3BNAr%-RtcKs9A _ʯ0t+|bwO#>޽6*躩&hotR!. D+0Њd).,HPDpJInJٟ!^ŰabR@F)2Ž2"5 s";d< JfphAR1,bh8,x(3eXYm26\;'j3BBW/ܠ*?hFz\YdF);EA'ZE pۥ= ֩]`K7ee*Mə,@|ڛ#Ha*;6<LnHY3Yp};90MdԔuQJV%*0pTtedrH] >fcK^ <Ҧ]ERi\=1Z)(U;r`x?sWĄ+n|S/`F]7Zh }hτ!8~- IDAT5nog,%5r@BȰ>˼g(G]P"TNOrnUH[( 8 }9\>5#5/ pTU7ݼ* JE#Ra,Yo`8 {^%kHu#WThK 0XΈVQފ} MJܣ#e3{ 9[Q D!d Wuq+84v*t詭d5AA&%!yxx|^*u4X^ߦ[QyDTA\% 'u- 8 R9QXfK:ljIA +\Nע;]K.v,@k0Cc0w{QyJ鸴 J?ċ4|? @ R^e' GV^g:v*Z4HvW3*Zi쬢ԷAע㒡I0`0 lG!ClC7t@I]ۤ@+4Kmm&>Silߚ8w(mXA9*Dmc줆 ܢ^>ǰ_&b(=9>9qo+myKBkyEVl~Z{ h80XTaZԩ :_F(V\[f֮藨wAMQ;6Gw)! %43&/Y%Rݜ$wkeMќ)y?3}i>V"q12`YE+zB@7NpH89 ("2bT=t/O.PJHҾIWhC%e=Hʷڀ]F , *B4"*hx=z:x޼,H*zXD2yxMQkAk]mTXΨʊ tAp8^~ Eg!3'T楳G`[kKVTj j.uY.B~lԊJxե5yZΞ~(sYqQyNlCt9[?0juq6Į^q7i'\66oN<[.l+hӱMlݾ@T>`ۆĮRt>]ާPvc>8NoݧP)/8"Wl ƘB BtY/j$R/Z?ʳY;{:9ݹ\7^YVDME1~H?Mjvl2֍SkV7ZIaYU7!*^]nVW(A rbg^F<)+{<"X^@L+FcS[ߖ']mfm8YTQLd&جO38c<BB iJ]=y:{ 4[=v|Wh}>ĮR_^fCR"-: ݸw-]UgO?vRVeEoZc!x2Nmg1~>j]PR7~˲?&'ZM`K@H^mpUP4Q,A $ӏp=mǖU;77vL͢r\>] 6c4ڧT>~󿰺AE. jjӱ;xX:iyX O_ӤA6ت2Ws6n'BB 15L|["fjF4 dΔM*$9Icju͊1.ZQg̖M)+DUA'x e}+ٚ)wAݑP+*԰ :j` QKviLKulZo~g /Z_cŞ&ImJ&CAC:\pB=nR  V/a?5ek}("Bl'Ɂ _-&q|520 -gT|VOlE-Fa:_6ʨB!6,)+t7n|ƨ,a;l߂@9@ y<5|1Y`,rjp16k'15R1kUJ= .Z'G^(qvC?#[&̿(#GŧXMVb1ن@HqK(m>H{s4Y^ٮ] 1y`ﱂ7]#^otok* ݶDN'|Q D!ؐ,;GQ6M_(rF#[~{aޙ δUˡUp5\.F5ylP]MҪe@Bqe'mQ$Ajt`#byѨ}q?o>s kahF'2븴i'B?Ü^iOal@xFsK0t6txfی9wZb7)5LnkbW)\ڴ5B~z,HD!bCYHޱ7H/MCK"7A?.dЦݰOCUѕLU+ ^!qZ`L#@0qj;|Xp}TF(I2QufJ}dJn@vNb^XFf Ӎ;^Z%v2Hn_gI6˹Lyx&ACy pFk&HBBT $}KۖZlKwmGl<5PF/I^#KQ{QUpU)˂-3O~ G ;O?XɊA 0@I^zKrPv2,{q54Y\<@)Gc/#hTvyc0Ȓ Kp`rYG'1Ç30.Wi+0`TL`Л񂘠!S ƛ15[BiϴzB!vļ٢ƛ9%6iXcplnc4*%4j༒xdEoZ G6asɗz{<3cDFGB0cTrHe k*)29U78%Ȅ<4l"zN[aYf5Gm:O{BTI9{ç0H;'=3Ub򼹡@B#ME7cmGH%AUݸvL9eҎM>ڨ}؂VDiF.N^WUn @W]f-ɎK0s=e-˦.7Ybjm*%k'q2v}>Qcoؚl9Û{xc 5ԕi %R3n b1/̹WŒ,ikwlmMUA1Qj 3hꧨ4&B/5E3Ҁ7qظx Yl$!bW`펣Xkx Xk?\7(x>M`zL-\cjF׈D!B!d-Jdڎ-/_ԣQ)184>k\]Y<̜߰`$=1e R*q-fחqGQ75*@P+ ֫.}q?]h {I= ]?8=q/Ӻ:P^ $kˮg ݚR D!"!#``H,+EVp<:L7!5z- 6XR//ɂZQ赸iΦ_c!VI nM|}9I~lT2Ȳo\*ՐXJ;egI-:Fڙ=LzlnK2J{>]#^o0j@ܾCǾ | Qyhε c 3vU٦BBiQl!{ΊBjt$\f$159qL YC(ѪȹP\WO؟oVCj@rvar= qPY7 0~$] HШ2#/læJ#f&Լǔe{¹ik\]G`뻬޾9B!LU/-%5!R?1ϰ[AӂӯQQ{ YqQ4fԈ1ͮ/g5J)Fэ&mYƎu7P+̖C81'l%9{@(zL]ΫJ?yܠCܶx6PXYUs|Ck3ʹk_&5{Ld`%j !@Ym}'%5Bh"(Jes鸊NjLi(~FpUUbgW4yI.6Jɾh Zew..ݵz8ο"̍_sqGs>ضC]*eE;.ǭbiVT;ogm$S5J1iwV_p8%p3t=4b~9݆ӫ 3S#55 ] Ƅ?7j'Zc6b6eF1x("BH'8a5yi6 n|AQ8LfBY]s, 7ؾ)kQn0ya-IGƩP #sٸjT2jnQ ̘.S/Ы%˿z|ƛ^]eq2stڶ;kY BiAlw%94u(҄E^VSGW5Z>I J^f|Z%9ٯ ֠iUJ@.}} Y!R"WL.tm2 .4;T>r.mjg9ƚAww{)oLޡꛨ}W+# f$@-7?Z.sMLǬP_ n' >?AFB!Ojt$NŰH\X;IPx4nM$>8ѣz&'WO5H´,({UЪI136E`R#QS_GWKRl= m:kԶ]2Si} cw 2͠lG'e9F_*\,:"0fӀ[UB!BkC*y$j% П*ӑfY[)pu.!rvYqQ] 6%_@B!ؕwb71z4# j%/O0B/!r$-bW/v&88$ 5*%\\SY6pȻȾ] ^Ul*5tqZZ @W >Db7)o\p2 2lUhY!#9*Dwx@6gji!B)Rp bJ˻AT Qv5,^ !BP֫{q7K?e:7 ~mFƩl廒 ' 'CY7jYf2 !B_~ː}Tw2քjR&/^]rbW)|W~'w59O/PZ7}et 4^ݷRpYsD.ȩRhCDf1}B!P7YV .iP1[YD%/g׳$xyk\X;ĥ8-z@f̎}ʠVT=Ew6i/k}:755IQ+,W~nW!B!;H}kUJLtkj FG$-Y)oȲ>ݹ?Vl)PUs8k$L<B!2wK(#_ eqrw`Ø'x}qEFG4jhgJ(+ZYʼt`^XTg'l08-LbkVT"5:^pnKm)J&NKsiT5(n5yi߇_M#c  >"B!FS&;hN,I49 [^FV\S/֨˸]G%/g4Kcp$eEfjn CQꢻcd[eEqTS D!B y꾕&T n.˭ӪkK^kДnĪтe^2:܍rLEY!BHv7vKZQ(תt3ϙ ~9]#^C/NwcηJ^ W~`0/+> ACBVI֘Q D!BH3VV7x]s5j )Ǚ@TVDܺZ؂Lz%ieܳyiP+*!r`k("B!k%m-r"'%ipav;E7c>`~6 oRs-xlndѣ@B!<0-DiFrSTxE˕f$BǷ 4k8 " P D!B B~$ũADfS[ѿf,/[ImB!LȲR,JX:SfOV[TZScrM*h!B!BAN[59w$rBQ7CC!Bi~5IjR#it~sV(^#YRҀB!4GͽNlIU-\I!B![dr jG!BJd_Ў7y"o yyv)!B!4S4B!P D!Biu("B!:NoXa#lێ]E=삧Ϝ߯ŏ?DFf& ggg=TTTg.|nzg2QOϙ]in֢_>۠kd['O_}7wh׶-ko[goz:F|{"7nM/* wC>y zF̒{?_ヌ{ ǎaɂO1 û[ h4v|w^ܸy }zu4c1l`D۷l>h4@Bb2"7mK/†ナJ՟Y~V`}ۧ7;GDy;D"ۄm=JJK籿1H$盻 iֲҡ oވӧ@$%6>{bbSdž-[EZ;s>Bcvn3t(o9ZK5* o =GrddfS~aC^]?O0ibE'Ӟ> Lyrvًysf]ޚw>x}lS;6@HV?a)puuELWWhw܅;w<(Ka:iMDGCIO]fKרyҿGZ sf΀7]ǟ~k kAA!}q1Z-u'3:!뇈 qvQQxGضi=b:*VC¢gy~2SNq-z 45|x}lS [~fz%B.`܅LSՈܸ ̂Z**]pr89x~d &EL0]I4i GFDXP 8wbb=\>zo?l\O(BG`M{^s \MI~m{/ sf>GwLuÆuȼ6⍷Wnzb {okǎXmAբ\*h'PQYW“fi3!L5lzF1GlZF=h tHs60yi>>())Mspp@pP{ ABb2=G,wwTTT] ~Qg)~R*=sg='''t /? uoyjnǖ1=}JMK . JѻgO_Ld) \z 0k^6U*{zu驓1rpw7oٓNchx'Ik5?݃E׏4w#7xam33b=1G,QVV¢"tbt{e1ƍ#cێTx?98:UA3|}| OkuLacst>Zf>=]Jtyܸr\^={ ,4Aڸ>LpObZ9ctt=tHs7)b.\qQpH4ngd1?ރ׮r9v%%_w3vZ|}$iGn؄ P((*.Ɨ߮C>yB|^X,Ξ[V5Ob1F ";'jŝ;w1l`#籉`/PPX=}3_}e1&>>C Ē/b-(,*A޵eeXD"=NaܣcjJ 1bX ʠkdϾjT*c8:8`x ݃ E׏<b˰5Ա#>xQ[[ _lزyݺvegi#5*ra0h@@׮aؾsrr憇E Y???<=u26n|_ٚv܍w@uu5BC;Um`i>)qlyy&%B!v !B!A!B!ա@B!P D!BiuDzB!BHK' 41`!B!D4B!P D!Biu("ҢPWB!@B!P D!Biu("B!:B!BZ !B!BB!VG f]Lft''W7jE(--CPP{\z{Qe2GRaҴ=}]E!5qth4c}nr뾷[90oL,?FB7|r@ oJ]:6z~ڏW]CXi bB;B\W_~ G6^.!4nnn4?oZ&* G[P Dxo/}9rfa<`>zqrϿ hN/**xyyampuue#.,_ F4V[ Pk4ؿ?t-:_:p99pssCwkp11 lJ!CmF }UO=? pMD" 4gƤi30nh#-6\]0)"̂FŇԴtTVU&>gO)$&8/ce2q8OTVVU+qu|v0oL(kjpMxJ=ԤP5H|h ao`죣1 ֥2iZ,[yyxh0kQPX[.l,ꅧc'NbǮ("k)r<$_p7+ ݻycСr/_LY~zxcێq8|O<4|^|n,?è#Cb ~؆7ޭ&\vm{+pj BNUUN>Û⢅HMm]٧W/Sm[ii!eп/~oۇזbr} 5,P ~ƙ9%Ci2\y!޼ 0n-j?]C0}8Vcnj#388w!WSc[>/п/{}!!2Y%di>'ngf@.W**7!4:vv1)uߕ]y`!촾{w̮ߐ4g9%Ci<=SzFk߾\]eC$v܍mI[8;;[?gƎ-[u .&&bѼD"P^Qt-.&&/FݱQ-cVB3sߕuEjk]Y[[ Udl ygAcq6}6?~h@U*t o޼8~~x{uxq^\K8::Mhvԭn68$Xצ)t\I.?ǍE^=y̗2BHsg]y.; P~WvNqrvdl]ksh3Լ]9%C5BUԱ#F ՟g(/!/~_LxkR[tm۶ډLysy((,ěރ:vX$B !8(1(W٣Aqiv0 IDAT=HKv;wc6C!͂P1uSʠxߕ"ݺt4B">!oJ'=B|<>kt #G䄹1[69p*N"ݱ9{3=owGx7Sb?Vc;oa;q!>ɗо];v Amm-r\ VEKV78ܸ1իHHL¡#`NNN>)\LLFjj4Z-|G1cTARܰ q/j;|}->O>ۙ= :33o "7lFxjDx{[!>JS'?tws7_o IԧįQRlNN< ||~3.#>!aX=vhl@sBE88RF3Zϸ{YY& ڟ ̷9%ᐗ[k~1BrY|xE4! @e:w!> 8D[B}if/!3 !b{%4&_Y쌎Cy'ǎD<"BlDB4!V XK8?__<BSB!D=o#D!E>BB,A!0!B!ա@B!P D!Biu("B!:B!BZ !B!BB!V!B!BHC!B!ա@B!P D!Biu("B!:B!BZ !B!e222n#7728:: s0HR{XSD׽йo[ΙYΙe<琗[kjZ-2nNC߾~~~P(//Cff_mۡppJ@שut7_ lv[ΙYΙe>v;~_'/h4:s~wM~N[939ؼG8:֯냝۶ n53K>GϜo /?//;{y^\zZ-W^z_)Γ^s=O&}2=1 Z555jtbV J""&YċFݺHJ[7c;o B;{}`Nytly#ىļٳЫgwD; +x 2k->P^^o}F̘>E0jl}%%ؽw͛^RZ?s@"HP`ر8z g,jl}}i3^z~6|-T* V1! }zŦ [d\ϓ@H&ΝL= ZFTjGrnnm_ÂѧW/_o4JK<=m &Oz>nS'?Kzid`"YBj ?%R}ǝ;Mwpp eg|xO1 wgfc8u ee}xkEeXYY7#!)"''<:z4{vj$ oo8[7f_۶" p a:m?X-GF= >{.>l޻};w@ִkTu[5 T*L= ̧ 0ǭ [{K/d+MO|~Z\ Dx8v$vAYZNNNpttBs4&㍷agu:t~tή\G\|oوn 3s#R;?L+׮7\]ѻWO~rKe~46spP~~>VYAAy:̙u6,̘66ZZFQq  X~~%/;nXy| WkT5ߣ_bNB #G )ݦ ~!5ݰ-yA+>_kƮCp@+נR^$u} >{d{󯿅\!_ ƢhYZIɗ H9 /cǟwAcт>tm(kjPUUeXԿt?+h49g7a6jϙϑ\.GFf&y?i9%lZ93uڵCaQoZFR%7xv}N9ewXs:O@..Ψ$ &>.aظ,zLΟ6mG?4ݺv<:|w$$%=ئ%#@6)SYY9b_@_&`/,=؟ǍyEC^~B;u ӫB4vF ȍP\R_'$`ǡT*!Hp1!# k7#8OƾGKJK ߯a2`Ͼ_ZE{_cZvSSSaƹ ϱqt ;wa]p!"[3oK8gGj'lQD-Y9__?D ~+?¶M!גϙ92\]] ϾZ]:ð6~'KÚy̌#R)dFZct~xnϑ|2vϽk/:ݶj5 7/`!;_նV:e57kqr`-k6 k-)OcC;!!) ?ŵ|*K1osbsog~~ iM=-?g=pvv39aC"& 9s?g4>Zȍ0,**]pr~r Ւϙ%zA_OjJь{-%B.7lR-Wj)q@srqQrqіOdwXsֲ~[˽hk| ņ^ /?û||QRRl]ፈ:?)m=}>g>Jr;M]aoڬcF9999VVB7Ex]-;A/ HHLƓODXO} 9Mל`"kݻ VZE4 s֢;88C hۜEZz$Mq:ܾ!X^/,.tO@Ppuu5ֆ⺛n# Ab%d'$fq9ְ~2w/3ζ^5NMK 1|8yeeKkbڳ/ynI-l}Ξ6:C{zd1A9:Z,A=gHRi W^C#?Ӝ!746s!aM}PqA 4ddFpa{jW~bp/+ #?nK9;~X\Vq+- W]z[N^^^xQXi QSS s{x'NL&CҥK=ƫ 2EjZ:ʱyۏ&[.] H1t.٣;KJp2 F 3AbsXO\^^^;޽ -6Zmq0M&EL{>5* <:ftg0b0ۧ23s 1 E5>t~hxPϙ9gϻ cMza&`?ރ׮r9v%%пP76y2k 04:tĵkm۶wt#AJUt6 mm-B;5ǔז?+WAVQ?__<=m-QS]oĒ7B쌾mı'94C ĽlZɓ& 'LU9 kuspp!P[$aЀ~HHLFΘ(7FC'ȍބZ`nێrs^5>bϾ}wtT̤2j轇"A)AbA+ *x  r{'t$!L~b-r>Os:D?֗`̜oeEԮUyϵ)dz{>ػoa^WZcs?JwG*кU+ޟN2R=Ǻ ILJÃ.7fT2R=jצ5'HMKmzMȲUHJN~TT'su @dU"Ǐ눊jpI>XjlJ/_DѾ}4F=!8NE۩6nLyrynd~o/.N\GʪrEv"f1u6z=wBRR^GՠP(EDD$E#LBT;YU[|*;I&/"?_*=BPur\Dl'bf;38YfkDVR&ꊻo\'T={V?{˧Y&WNv"f>눺e:N>ŵk4oޒzLnܸ΅  eVH$&Syyz=.]$>QQ U6~hZHHڵҨQ$Iy\eNv"f>눺eن^c]xxxһcd24 :DD"A&!JM׮ d^^7~˞ߟ&1vHBCl'zvF`@=3iբP3O>x}z~2SgΰH۵{XĶ7&pna8_}Q+2yĄY\#Vz=G͝HRZKؽo4 mڴ3zB㯝,Xogg'"#"xvH:u`slw+chO&HbbkV,%"<'̥yӦFǗq !{856~Wb˥Y&L!ʹ\500 kbPT|&sh߶ 2 >-:uȰ!9v<'NkRaك~֬kN~{Z]{yV߸ɧ_޳-?m'9%[1uD<==,b֮sT4nؐ93gT! c1~>=1 @ӡRt@AEtjT*5 řcǎ\ޗKrI^ecVkriŗhc+{}?y0NSh^ZtgҴIc̖ܮ߰?_M6ɤ,YT˨ҥ{еk7C]E.prrܹ3&ʖ6oXb9==G'9%1lyJ_|^60j4i6juVCЮ-}κU+e{jٓ߶o3+l{r;Ƽ͚UhFY;wvf7+ؾYG떭q.7 !R͛7֭'yyyt:zj޽@FFFz: /вEs䁁4iԈ)_@;׭e*yЮ-ܸy0xxxнkg9VdgҶu+|8VSʭ'kOQ]NN6II oߑ|zOhԩ+oT*N#LJ<=l(;1LyjF//ς{{Ld=*a9~}燏7S'M .>nys叝;y)DFDŔIٹk7ʬ,Y֥3 )2\>khF~-9fMȫӦrJ,cc%刘W<5___<ޭ5PqT*#G-[dm],o&eW\e+ڃ7o͛7/2\"F\BٓaOGаAb㲳sXr%GI&Gn^{e)Uj5k;K(^j]Q;O!DFDpijת'iݲm[-[3r nӦ1kHHL"2"_yujs9r8 M|8wNrPC.gaĬ]GLޙRլf{$++ 3eD"ÊanLrr |bݎ(ƍ4hp;ػo?]tfAGmt:7$11#R)MAY׊M^y}S_D^=2"-t嚵޳LjԨscFh.w/[۷iP>/j]VEه̱wdHRr~^7B 鳥zJU_c-fdqPΝGYj9lzJ3W c{f5uє3OJJ -[5F^'<{??_CCՕN!$$_,byjA8wC||309>I~w6mѣNղ\Ϗ62}[|EwFf&~/DƐ IDAThrr,u-== ;iφ$ C ̍׀FfϮ={HNI!}B`{2?ʒNJpl{2h ~~Kڵm;)kf1]VEهqDvI\]] \߸3{婓 ,4TJ|B"1,#88;wL#_"''xYaH=~۾?C|1战iu:/_#mT*-  %5-|=f)ٽkHZz:aa3cZꙣ}0u~+xR0K,ES:&Bٸ[Dww-^PzuXq^ތ=??_MI'FãaEN]:u~T==jx\P߻XBjFFЮM]9"O۴_[R^ϹxxӨaC?A9u,mZ,bGШaWڪ&.Lz~<~]"RTp'O8kc6;;^OMp"H܊Sk؃ϐA ktq}boo//&>?HCABj}LZ5y~ܳ䱢MI?ʗr: ~9٣6`yjԳ\xp,(T!si4Va 4 0PN>puqmۘ9=֬X ;d O<0ׯ~w\ Ya?y4ar qD~t<1qˣP*qw/~gÝ۷o2LRR Sgü,j5##ƴ23GJ,aaXS)}AG*YR*Fkr|Y8SN:ŷ~IYjլivIzFk3"o`@ᱞDR]eW$S&H$\|ZEDxdڴcѝg2bP4ߒkNlVY*2..!TJQa2F Pdڈp:uԗ> 4{iTzjqr5#^ӪE ^~i*VW_C&Ҭij&d/Kh4,^Ulޜ9?lakN兓;nAzH$w.<9"ONNNnՒ'ORi~Wڴam .>V-%=r0e*N?;̽caKK"0wL>O;~a)Lyq]ꉗ' E&a]tfO;Lh.tOwaSYddd2,j O<|EcE;6>4%6o3_qϠOb (\zEڇqdk'cٿdxyz `F<6۶趰ws'Y̜30LsBɧGo.7NTj<.1)QQf^E@Hp))E޳ΝtbZ#}%QJS}hJyQX.w N^V%%% *H 7M۟!b7[+,,FK|Bbq]vyrT:kˉS'9q$-ӽnڸmԩ]RPA9[6ҕN#50NǥWLޱ}{>=^?5뾱[7 .6  2 CL#--u2eʋս;fuHBcE96bzz"#y2NFiE^q8*Wbղk 5-ڵgϢhhѼY -=m__,q'-CstG 6nz:stPm|PE@tǎ=vȰBKӊV*ʹ#ysuєɆPdd-nDcnKJJ"ׯ_#"wssy{λqܾʎ_~e~O^FFkt:<ӫ'uxh˙s L?]:Ed ؉(R/<;OڶiKWq&͚4.:ukvkl7!-=n97zi9z0ϗKIHL"]b֬E"Эk"kZ?@NNʬ,w"Փ2W'{|V{o9fMX2V3Q򉌈`ڔzywjת{۷mӪ%#WĪy*r+±{m0p@|g6۷ȣFH$߹ /N%/?͛Y>Gxw7 ç8%*6l$1)Otfܘ'Yj5 yOoF>QIdz{>t괗գqԹȜy >g@1y} [9ЮMk&O|WF6֛%Z׃*rB3s QV-?>kFEg8YG)[479},ԦM@bYUdq"Ǐ눊jpH>8;j 99( ._N}h/By9}: ˹ ^ދZ,%.nݮXA*m>>,`%IW}"Ƕ1D̬#d:N>ŵk4oޒzLnܸ΅  eVH$&SyyDˏ}eNv"f1efBzݻwIޏ!h4t:$ LDT*5]>j4&Hbbɂ^г{7zа;{&ZaS.{2yxvH|惹gyjnGe;866i?{޲ʘ Gw:LvmYs֭Z/VktzBk3fR32_~6d \\}i3͛55;ݝ ǟ~\]]MfZorӳ'mfgTQ;fc'Xb%Əcٗ Qhö^:NfBJ7oЭ[Otzj {#!!boo\ɜ x{ui٢C7w~J~ƣ]FdDztgx pwwhy^]x.c!Goo|#>CG,_Fe;8>~~thߎ.;qEoσ*[.93rooN@\|<7n2:ϿzuS˓M7ʓ ֥3 1;] }@H%{nC8"f֛\<<=v爘Y71#GЬIyuT\rl7#NUd3ʕl(h9Zyܼy 3h|4lPZ_! *W5ryynܼ+`ꋓӫ;w÷6?p#֪ Gm?2md\\\.c嚵޳LjԨscFh.ddflXCPP k'˗͓qS<|#G<Ů{O ,4^FGLHk>ԱnnnFSլf{$++ 3eD"ÊܶdgtJ?LFnxVzRV^xʜ˿.㸹YWe;]U*FYd;+[.,r,ɐJ?g^>/ZJU_c-fdys/pQ֭ZΦ-[^Jl7yyxE3sJ%gΝyӴIcU&%%-nYCKVVg̗r+.F.sbϛ+ f!Oddf Kt&'.RwJ% ԏ2h ~~Kڵmcq>sy%F!-4 -^WKW ̖m'ٴe+cG2:WVpJ,; ???oou"eނ$fr2ᩡC,N#1)c{[]Ͽ\LCPY}JENNjc'OriF?3uܽ[P(.~kS[0U&Ϗ{Pf^OMӳXj읧LK}Td-mۛ&(_.^Brm|-Tlɡש] .:R?Aףۣ,Xr8;3|<֧wJ% bS&NCڽ~}X))9z[hxl_>@G+׬e嚵1`QVYPw~/pq׿o_6~b*K د߰6nP>*ʦu*vV\8fARPTyaaS;/z~Yri>bh#bN >]bVzӰA W7~ضsc͊8;;]U% ww==ܹ}3FPqǬBf?PJe6-PE1J ZcV^íxyjp:uԗ> 4R2gBH$Z[@rr2/a /öx2wss%dKmY`@UeڹUk2KH@*c&h԰q VogRr2zctZUFp쨑 |qϺ xzd/KeOL0 %%OÆ Fq'#?3gzl|LYr(<-_/O/F<=x\\\xsgխ~} ǘ;/*_9v|aW0=n=cby GJ1+Iy߉?&mJ1LJ\#3{cez3 !oooRRRiSRRMv)h-$&<,##OgWKx~ԐˑH$̝5ӎ_?i S^PўyrqqF 9._64|_7ߙ/g gp1'ksX[c LyUN>St6o|idKe6FcSqR)@Əþ9y4=wi]ʐ Gqdk'cٿ "9% sNyKb 4y?IVv635 aɧGomZ)U)fPz L'YY&j13'NTj:%1)Q_!(A\WcV!Ga\N\-t:-zΪZDCJ!Bh'$fʋս;fEulߞO>|ƏeͺoJUy:x ZmrΞ!2"KxXX; n~\,n<ޯ/KWBHxX:ث ô:._VMc^'T*eq$2vz *~ܡl:|߅/Z챝!_WVYRtǎ=vȰ2w^VZz:Ŀ&hS'-CstG5j JVo 5-ڵL_@WCƍ9|aX^^gϞStg|+1ɆPdd-nDRp6 त$r5""? htfɊϱ'Q*LSq=| Z2+Dͨ{q|}}x78|(iiܸyD7nJU23Jty` ;ލRɓ;p0\͡˸ѣHMMK$$&s.1k"Hֵsm'}zdѽNA4 cc9sUe+eiՊk*s?ڳd*nNERq s0"C+zFkt:=*~.9V(<:#Gz/c'N חG!Tj5?_]N3wm|j;vEf6WYr IDATW bVU-fꍱ-^GGZz: .cv&逪3KF<5o/`4i܈zuꘜszujӦUKٜ3Xͷ,Xڵj1V䃳sAI֐Rt:ڷwa*"=77+V$9BAױV> dȱDl'bf;38YlCHדq+$%%A@?NNzZ [DDDR^T>$S$^~D+6{4Dm'bf;3ۉYG:fBPȬ,233IJJ -->>,   Xl:N>ŵk4oޒ~ Q5(ܸq}vJ˖HM&AAA*6^ݻPT7v:K^^>:_ZjèQϒǞ=uF5B^Z^~$ ?hӜ8uʪi5}[$WbOYfU˱u[AAA(;fBOӋ~PTt ^NCVRo..;v貺v#h"ó9w]:w$7/vL\\66'-N'IYbUmAAL6J%7oޠ[&zGBBŖݡyy=wCNMpwgմl[ h:Zߟ׮s?%^EAA3Е+iٲ5PpZ͛Ef-73 ?p; ɀ>6Zf7ػ YYY4lP)&ft9,]O$ѣ[7{v4NNN̚>G!iՒ1r9##f::u쀛,mٹݴl܂   ؟;B)))GZ?NGxxɉF٥S42V9vvdt؉S|,Ŭ 443"//|F%f#ǎm>; S}FPCD*iVX[L>|!Ç>ɦ iѬUAAL6qssA݃ws.StRҸv'OUŦU*_IzFk ڹUk2J\p:uԗ> 4@[AAL6III%"M LIIѝعk#GDY39x0?0 <ֻ-  i&r9qqV?jIII$88 v&582+vmZ.<, NGkaZKPYaG!zbσt:;~[6ҕ鲶|ؾ=|/˚uTnAAAdC(2qq7ILLD"l'  $r5"""M0(ԫ˲1kdl~~(_.^JBb9wf-n];Fkt:<ӫ'/V\<˱9wΰL??߸IvviViQqqWHղwrrrPfe7UAAL>('2ΝF*HjH=&!11RfmfWڵs'֬cǘr:ޜ9|ywƎE̚u( &&O"fzfΙ2+ y` CL&=u~1OY&?óaW(33ʢKϧnڼ4xKA{dddPdJD"7777ط eAղg?ʻ8f9;;\^R3^(Cy%I&S(29~z僳sAI֐Rt:ڷ6ABpppy".&nnቻ;z* 233#,, __. T;{ŕ=U1+33PN.EZBulq>>hђ+?~qrrF[[DDDR^h BRnG(6ww  4z$ ]\\\ѣR4d2'|IMM5 3H$аacBBHJJҥD.mF  T0 ܽC歐,ۛ-pYt:-aePJA45nn8N3b5TV$fBP???j5ZmAi2 WWWݭ: BE3P+&2r {gҪE񏄗,JՍB2ƍr <=q`)z:gΞ%+;p:wꄋ_Z;5˫ BTVV  "((@D#HAv# eegstXN%+[nR#%:Od2֍"11_BI'$:oǐj_% ') Tk:s ?t(4oڴJV:i{___\\\̰cr8q4["4$OuLjZii% g8AAʼhѬEf"cZͺo6wAhؠ>S&M$";4<=z,TI??le% > ϝs'#V-ܳcؼG;D"ag1sXr%GI&Gn7⊓:zYP֔J%/Y3:13|7A.dgg<-˫79;&>>???4n̰'FRr o͞[lMHxXqm[*QYDCHAiܨn8t|7R) Gd4j؀! 8ߞ֨IJNF3bXxNGXh]mD"AWfB&Hl ZSlJ2z-olq;͛6o^ܹs]ws9>|w:]A5a/<4츒 !AA:Gwb]f G޻.)~A%A*u|C^^^899cfJ~~Zwu۷TPhdgiD.a,#~'n];3l@j4k҄VҦUF С][ü...$%'WR!$ @NѬ\}ʦ]ֆqaat:b^#z@Kݡa g;IiJ#$8^Oիԏ<BYꆐB Zjj9P̭87jח|vm<-˫ .]ZOEMֺU jՌ仗Jt- @PP We+chצU/=?ʗDݻĬYD"[@Pkt:<(J<ɾK\6//OɢKFrl,gΝ39%^g۷K TVZܾ}\ٳhg/ VOoi|Uw;5(aAԐ~~7+| ;a2JA{vĚ0~b^yi*+׬͙Whڸ_̟gxhQĬYB`xi{rعuЮMROIĬ]9sQfe! d蓃i֤}}}INNDP[u*jDCH~"ݑ}Cdd8{@ՒD`@ }s[3yKϯ.PZz:!!Eed*|8[IfAj)%%~qLiѢ{Hj++˗/OXXxRfKH*' #lq;~tlߖ'*+!$BtN:͛N#Dq *`ݹv-ww^'//,ϣfZxy;APj(ڡj yxn>0z'ܸ !A*%*| Z]Ũ|||hԨ ;ǡR#Hqvv__?1p;(x2 \n !AªʿDN*4q++!$  숆   TTvDCHAA* *+!$  ^h9h  B HII!44b_tZpvv.XM" W  B5ŋŦy%ǔ;K*U>7n\F ǬδZ "fiMg](651p| +SqMƌ|1#G0}[tБaC~L8.wȱՋ_f B5v:'OΝ; ߟ"\~gΒMDx8;9v  Xuv;vSWoI2qqq#))cT*ۗZ#쨑 |"ü<=_J /лgwL|$fxۻ;L2G@B rVC w kwmZj+mmjE,-֖v2$ȹ*TMI?"#dI{=>̛)hͺ=6&O477kڔ)ڲukR+))IEo+s=nt%a1DΔU u9X,vA(!>^Isz8IR|M-tCɖ8oiڔ2$K4om|EUUWkPFFtd߇]˵zs:^\6nʵkg~Y,nYqqmC777镫{~jKZVmXFݫnsWH;/ߠo^[PqId/E^(Ijim~]jjnc֊k3_іm?Gj7  n ]1zUV^ Zcǎ+努 @.ZZlX IjUt;54;[ #ߗԺU+Ԭ?x\Ik%IOi֏~8o&񓝎U]sR{2ϟ]gV3?$gWxqt222t!)oY^uf$iʛ3'uJ-\8Z{'A@546l6rq<)1IMMQ]ڰq6l;}{&'I<=k r9+-TB]ݵWAaO4jI-Ҧ_Vq]ʜY3tј1y=%I[jS?99ӦIf\6]?y|]M7NnGo|Gy޻WW[*zswx @V< Qot7뜭Og }/wA;+* t-TZֶĩHzZ~$LfY#G onkeӵmG&?vROR;vn\|{c~_Ϯ^ߋӵ[eO]QGr)..NRӝw\ߋ] T7ecsbZsQSFX\~%I^^q9 jhlO{$l6͜gVфc_<3r5i^M4Q{Wjnn7 i}SS.SߠQ=e/^P+Wke4q3ezzjQ#Gj*.)]˴TKO9ÆiKáysunފ*.)7 7 v?^]1^.-[u1Ie644{ig3lf"546*g0-bAh@d(?%<ĉ*|"ޘ7TUW֯-o6neKYk\Wxz*Zze|`ٷofϞ2zɓ'jkkc^Ν;4u_YY^0Dh@PS'O4X ^W޼ӧբ֯]u׿EjIDATؘ:g>:vL;Y]zBPPc5ߗЈܭ.Npʸ0!02L.0@KVU--X^fu _JOG)֥L&t4hp @@2:|>f"ժ effźDoegg+;;;e~GAAAAAAAN\ P(ZשY-->L&Y6%$$(%%U2L.@c6T) ƺNYq۝/ph1^@b(ź<8SSv]PH-->֪V^WJNNu;fׂ rb]NjekL9rTR W}[vCFuJeffbeP3Beer5jԅJMMkn;d;=TG+*U&I .S6[__/dUUUźd5BeejjjĉS: AɓqgΙ]ihCj罸r1uaD!ŢQƨ@WRZEʽl!?@B3ssꝃ=r8~y/'TnwDArrlx`ezoi)%áUU]sx?ri҄ YK&Nw(ܵK3ggSZ[[_o;x/w.ѰWn^iAW_׋ݬV$]tk[tVS&Mmޢ~޻W&IUIШkjϾX4?/Oz:QiiQߨTvk}B憏YV ԱcQD1[ @sFz3k~ZB}з yf=JIIц~n".ꄖ;Z7]s-ڿ[bZ͞9C))zOtjݪjnj<$]ݵ4('gxu}ZZZ>C۷'#FJ輆&Iv[X'&&nn]l<Ah\=z>#9BzK4ern[~99ܡ¢]ں}\𜊘yFh +S'OyEW\5WIi|>ۯ/lTRb\P; |>#hf+.΢YQn{&Ll+̰jUC'7'vޣW󷨤T)))7v/ȞJG۝s%}ֶKNi{*,ڥQ#GpכʽlT\Z*٬/>b\)(--]%%NS6Z*P( ,Ae#dR08}doimp7p6&EB'Oz m3K3lXCt@3g)Vx*.ƏH1lW\.鏛_ye;U(TAйG"٧RCC\.gVFƠG2@]#TsV//ʛ;[_ Z 0nV94mJ%X/ kT^Qq6b];k>^Er{4}plA9\8ZRی~~XfjÛ%D#+3SPHGEct}$ݮP}}5|;{g$A,8ӦE?hV_ \~{ԦNлP\D;k VM mjT]z=Ar{ѱb}?5JNyLzSxlfSiYY"Q^^S/*++Y,>㷐0)z}zC=zL:t@]#yjy<8~n^۲MYYyw%F"IRff*+CшiǣÇUJJ*O3 f} W)=-Uo?͸R]u"\p1LnPzzP($׫jjyu#~=gKЂiftmGNYu8kYf $IIIIqWmI',*өu>c $}lY,eddD@.Im/MIIa8=d'! C!I8*D@CoBB!D!lQee "oI *//ju) dXb]`ǥUccl6[DLS,GjРsUWW^a(Y8Gn[{V}}Z[[c]NfvSe'ĺ.f%&&kWYY^ 0P PHz .SEr:.8du) XAAAAAAAAAAAAAAAAAAAwýIENDB`easyeffects-4.8.7/images/convolver.png000066400000000000000000002244231424023573300200350ustar00rootroot00000000000000PNG  IHDR|f.ksBIT|dtEXtSoftwaregnome-screenshot>*tEXtCreation Timesex 11 Jan 2019 10:43:54 -02G IDATxwxSL'-()L 2DDED@/   ([) *Kn{f(ޛm<>Ҝ{?7'7sP裏^h4a2L""""""riŬ嗟7n+ ^tiZ͚5;Ffʍl @&AP 111>**=.]4;$$`bxT*.]|̙C{5B dB@@@K. ʞ="""""" f!77`69 bMf3ΝK@R5L&gVJ%RVkdO|DDD\=ׯ#44ԩqQA!dggÂvTuÄO1U53uGՓbNt|(_YɘL&X, ::]>L& f'>"*: K˧⩃؛0LGe[ VKNH7Ad߈T"_/o9?3.ù43gFLDvkgp.W/Nb=W=Q5~,|@.<Krq7| w˄{Ps6Bv//Ǽ^>7`&=O]o+pd;\wz|T=|Ez|Dh(_y^;gL@Myee͔T@a疇T9&#"5UO.~z|D @:L3U1W7^a ::nǂ~ƒo60yVD$-d3,z gtІ7E'3 +z?\? C:=lHŏG]eCjٱ^%qSQhu[h.mVdDZQ)_W#O\WWsM,JZ'/?Dxpu=oUHY6u^|dSZ{ԑ݂oG6e^ȃ_t4j\ݽ 'SUl Zu=د|:~u"!O=CW7ktF\-sDTp $|}z|DTv~ћ0 yO8P .)5vڄ ,ܞ!r(>^ d@NLĤ֝nW - 짰Dxo ULWd7 wN‚/a*L}`>]#+x6Jz|T=97''~!`i2,G-1qX "s N\3&"[F!#h\0 o?05P6@SvCC_ W.+>7- wikҖҰO€y@V^ JDDD\~w.ΝCxXX__JGp4jǢFp !r/9_.۷v /OO{~LKD7W +xĤ?[y_8?~3f#2:0klVE[e:ۼlWNf3Ʊ8 {lǟ.FJjmbcкecKrbI7SRҔi\<$;>-X 8^ǎcO+|e|k7lxj(A[pʕJx[x {d z I!+Q`3@wPF7Dpkс]~օ?_RuRRSCzc]㱹02n=9a= } AOѠI߾i xFc%Rq#=ү^t[,60y>h}mG{⩑AƈC*4]֬Tk%gdwN y9++`oWa6e[P·Cvv6Ŷ;̰P(8k D)3quާX{4 P5O‡ 4[SGb˱ټ6ڶS8~$F? j >%>0ـc2_Ԉh S&;I /XXyGYo |x? B UPKuC,Yֱ{E7~!i鹨w/z8$2o{i X FNNYg"Wb6ѡK7ulhĵ{ 6Żgϯ=#3xCEر#QQmn`ij #;?99PP*e .!,bbb?f,YyD_O?T18q YlǎRWGb̷R'GDJj*ޜ6l+^sT:t.oXgP` >,k ζG^U/)۴j>ⷓVv78w}oz 7Pժ&m็cUǿhRɒh®dJQd2ڳcqmIv7ύs1!&C58t_:^ 0mKvmե>l *2QJwvϯDao'}P34~zbNNOFGQ*0 %T*LfpsƘqp"i1)no_,qE5vg;7DMmF7|<Q>n /?GソͼKi^hpok4mj^&tkPԋGږ~yQ?.6nڌ>uh1Ug)J%>OX<&| ,ۻ't:Gd|F#ii8t/׺9v))F10*Fakt#١g5"Z"r\c*qX Kn-ܖi7 lnO6CgW-G1ޘ6>ޥ~iL:sfo197>^=MqoظiG%sVEخz#!""x}: y1zfn$Oŀ~}+lv,V^" ߝZW`ESx.= ƭWؼ"_["7/DK"\:Ⱦ=V+sL{w[N:o, z6_A9tHg51W[soNYsÅċ{e+I}`ђ;ݠAfff0׻g˯8?_!d2݋{ _o!Ydg 5Gh#Bd"$;t6(-{Q(|ȆsW_QcaRJ]^kЧ]@GQ_-ƨ *5i\"oq5Tk:ߏ L{ ʻm(H׈aWئjرYk[`U~U=2!xzV,\s\ꘋ-Lf3Elf:L_%!Q-{uyȵ@v3AS1Lۏg(؞0F="OpϠp4>f*KrfX &'sdWm߹ͮz/_.c4Ug,T -bb~_P,?W`;ŋxÏ0J$i3ޞ'NxgMc`kj ?+O^ >I,rZo%Ot cD@jrrTl ڍk0QpTkrؽ AwN[p3=k6LANƈ&ePm(_kئeI9v yyXǚ"$H׷“=k_߆vb2t%gN)@1*a!?xԒ:J(`2B\,@ c, SrXˑ#p5 tePkP#8]F>qV,F vf[.]r~I[^TśӦwRY|{kJs%{+c>g?Դ4ܽmύRݘLb\].J6wuqNwPMԭ:.^r bYkvu Öԋe*/8zvIY2\9e}X)k*_V̒lSvRfm*,+{޻K-fM"e>4ryv+=97/Յ>.e{0&.޽qrR=721!#%7S(/2/#2n O ed5x奉;"I_Ff&t!5j^Y* I9Ҝ8vlY2!rrr)@~~n޼rH| < ~Q 8tsfޞ۽+-ز'6k]x j;8GNӆc(Zm |GUm;{Yke#e'GF+~ZT<ҧd*/\F{|Wy!߷#B4DkA6"WT>!!߿w͗o¾߹KX,a2Ёhծk2ق؄A>pr W~60P?e:Y{K!)5iиу0 8Rn^C`%;sBãDg4.]OǮ;D~Px!MD'2<7};uLSޔl;kq8 ݯx6GiUam̨^\?âP;Xխឍ5{q|Q9s _9z|vB",PpziʋӨ:h`h#~ALDllވ[Ѭq4Zn _o==ԈmTyF;( |[mZ'hYY0X3\ @ ,O8 zhts_zGX {ѡ>]amTdەFy۰<ئw(j-ƾsXpgOh{2gJJenb\5pzrlvsڷiئ18z8owyq2lJidLB-:%Mit`DJjpf mXרyj iO=2O=-n="@mQaߣ^X|jX-ܭdbޭCڶ {lEJࡢvW6,<m'Z8ީ#gWݮ9ĸkQ v--`:11P*m=C~t[Ԭa4!GzjBk@/o-f\WΠ^EFv>ُQQzdظsdٸb)(j㇐oxEbh۾ W =# Z?X ~!4"4>ZCzwmy{]V-c}h%Q ߫~[EF~m CN =~l-k`Jh]Un;iq{Q9^,vmŻ?t1Pp|ܭ]sqI2S*0vrT*kl6YbH&o"G_EGҍd;q1Mqq@pPhNJ; rFVԛe&=kµ>I IDATy aZĵ8}od2,^'ZuDmˆ-޾jm{b]XwШ^]{((q|b[8HHLD !")5+WddĒe_(4o3|U!]B[]{:2~>X]tȑj;[TJE8N.k( @l #>٦x>oIofmS+Ju+U|RG/8XG<_WFnnA))X<ܿ4,R\e_s8CUrE3sJ{$$EZ}!:Z~~nW/Jιs p+|ղW.]k֖Hy6˫EËCA[M.9Rzz:~]#G^^>V;nVhO_e^s8;\wz|ׯ_GhhS" }WN7/UB:l߾RVke=DR5a 'Fg_|!<, }{CۺdVyu@-T^0ٮNU۴bۑ#aO<<4Я?~wHIȀge^s8;\wz|T}I}?`2+;"ۘ)OHDDDDDD.A"ܓh4Vv DDDDDDT)UŚ5*;""""""GDDDDD8K'bGDDDDD䦘)&|DDDDDDn bGDDDDD䦘)&|DDDDDDn bGDDDDD䦘)&|DDDDDDn bGDDDDD䦘)&|DDDDDDn RTvDmfQ'DBDDDD:KzꞽazE,(U+nǒצ)N"""""W$TvT}Z.h4׭oH{MKNnDE֑GD"X23xPu銔8=DDDDDU{h4*(7A֫aNN)+@D/h20geInGա#T]QU„*0; sFhsA߲ M{a*U~ڳT"k4Rb,y_0EJ@),R;wtzlDDDDDe{;KFh"%Je-SIQ12˞> ]⓮q'GT8U-L1Cn,(IQY1Խ.yfȂ IaGt7 eCn*jFյ;VœM# 9qYZ餈1f< " gD˕q4\=ɂ<=E06cGDDDD. _5thv {vrDUqd0VcPzrrDDDDDDdUgUmۓT#""""">7=xca^'DCDDDDD xr.-4Ů>7cÒQaTk:Ç8K9#"yqu,z`[cNJB_KaWE(۵]{uZBIyX8ԝB'ʸiLA1nZrYHT:|9!&|DDD֘Uvzq-lي 09D˼&Mfh/l_t, g1; 㱣e*3]$9[CG:u)d͐xlpEHDDDTU!=&ʖ<,˗۸^\ݳ7ct̗/o#>/ Ƅ\QV6m"3}:- 8X["kkzo+@^IqN0DDDDU>Xx9fܥK IʞKP3.W*Z3'GT~hlYrK!Cb"v{_DDDD oGƳ#E< 99"*L0]L-;9ǰHLѠ!׈--yzzu$x8>"""Kr ѐ;6ꞽx :%El3р`|plk8rÇy>?6m?""""gbWZcu aNNrN@T(C޲a8~DsdBB<"aɖ!@RNDDDDɣBٮ=N\ q59~N֮-=7"EGD"-*>'0_,9ӢfP{vrDDD$E3` 6ouOJ`W!Pu7ڵwfHTlIDNե+Qa8rX]{X2ҙQzi:!"rLA oAghLe0+ +#Pw 䩻%*U3X]hPiELُ _9._Oա#~Y䈈J{4jW^ 5/o ZI޳߱Zǰg7t:)""Z'GBDU> V u~Vk*D;3$ #U9?㱣"|~Ak[cGETp{¡j=E˕q- $&|@r8BѸ trdDðk޳vr4Eg7O-4ه lɛ)(].1Mx[69)"!CG.% ""e'h4jV NBtO?(bI >>NƵx u3t["`>9~d!!e JSvW_)h,$ӧS-> g{ÒȈ\#۸^<P\ra#?uu<ǿA~nB6ꞽƓ3}16ÑCdiju!""259DaԔHx𸈪t1Q,O_@U}]0YN`*{i5dOvxo=XyIőҚjuЭ_RY9- E&6v픜}{vzR9jb!*;e{!ܚ'@Q7W^_V} y˿tRD;":t5!P=j_{O2ng_صgd#m@_2El3l%#CrhCGx V!VU0Har! qrTGQЅ,s(4 rYP0dwRɗ9C>""" >'M/JOU:wk i/o.]"wJ[߼Ibf;r.qz u̗/#뵩ַ e\+U\^(Z>G~s tdKKNh# %?_r=B:c309$ZjÑC0]L\ƒ_U^kꞽV~5YY2_>>șdGylpEHDD: *{w#YO ǰٗA3D|vB9oB_֑#wG0< Z]F@qdB0?BBm&=~(۵0&|~,mڵ(}𣒉af|IgIݧ&Mk;-|A|]NI-V>'sl^A,cqN"Z=Xv }Wb]=>s?K/5n)~e~$""*sRzJCAI=4E||`:}J2B_ fH&ڬckX2mC !C^TNrr 66ړ0sX._^! ߵ-??j5<%'q:˱c .{{Z5PIv`@d4ArH `Kf﬿}z̄seA/9kBbvCյ;n}aM ǎJ ~rn@. 9;'CϏa^3EU:9""[ʽqsͫʘ9Hi @[[ IQKN,93#"""r ׻E !0-Z.M[##rQJ 7n zx82_+ZC3d(m:3(2p`rA sHrEl3x1#kwx`~n?涘9X,*E/9d!!Z.]"ZlńDNP/%rndg/ÄIdANx/M*Hn4LDP`|:t?&|DDDDDDNdK."RKVDDDDDDT{w,>""""""7ńM1#7cGDDDDD䦘)&|$$IaGT-TKDDD䚸: ǮWBDbrNT9xUwHx j*|1q {~QCѸ ^}岰0vv/e=="Gss8C/-4HGTչ`V<*Ķr/ҫ9=Q>-ǎ{=هDQ鰇ZcUU}߁5Tw`;Bծ=g#Zj׾BQƵhqD5x<56mEȂ Uu||G5gdցR~ XtłZ}R-jooVyXdyHHKQ4.LS:f CN\˂:Vڪ=={CVx5( 'z.&:͞EI1驨/KĆkSOԙLΑw -7}ue *ϹᏰh ,Exw!io)ek.1zP$d:x 9¯+س{x۬mDBXw;!:*C l-yRZ+<%[G`p@ыMi2䀇ǭ{G%MAABp)˽eG@C+{=Vq & ir%5GHE 5 e}7s&He`Ť=X`|`fS> Vr$~V&yZ>lGr?8u: fDGf^ZOHe#Z%Ͼs߃Dv?EpYx{#Kwsxydw˗Cw*ںeס%@UXc+ gV\m]nNO[ܴR?ߘvbF_/gWK[} $ =N~޽u0kl7&vJ`;Ru73Ɇe21=?ۆ3}n.<:,b ]G%G?!5Ѣ< IDATٻdƵ`7yx^P󜳛G0~ߏ4fFW1oDSXJZ+_=xlv'|_xݧ?Zw"%r@.AZb'#Qbžxo JO*o<bH3 &_t?zF 6;n.KxMcĦ/u]\**c}y p1>9^FfɧN#F$y{qiՇX|)ƿ !˾~c^ģO Š'b`![AOw?Ìz=ztݜylGr'QLMCi4QhP HMK\v(s".\=HT#{_S*R2kCj\3e7j|b<Ƹ ax?:v9'_UWyOe|}vk3@m:wpx}s^s?cqxt pFݐgױajYҠsME/bM|:Z<2`9؎^P݄zpDF}cr2RPj$*X`X{WOAoԳWF''~CJ][1VsNFiPY4ШwڮסUfUtSfeHg6/i ":>5w 7/g}~m.Zi^ƈXrrr )*t:;~lRGzr&tHA 0 )YhX)3u ۑP@1X6c>gz#7W-0ӭ6~+3N`orz$t5߃DVucc8ܧ9 -z56`wWjdڧo 泸>i ^&>~M%=jcoae0EOפx9݋#UJ9)賓-j8c,~, ,[4`,~  -`辨_+y;ƯL\zC*/zM53cna؏V`Dt7;OˁHnIV`âY:wyxM{%>5i:5B#qOxo ߃D:(*U*(dLh"}+%h]'Amjؕlzck1;xRsN#ggãf7!H"J *E> (H&R(Rt$Fh@G lB3рow",2]#w:[Fz8hkY}_ߴ="ϩx͛7Pro+*>vvŲX3cNȴY ŗLZB! le[ vtPٷf-9wlK4i-1Y1t g|ys6yW}"K[c=|q~ĄUUׯmEEE14`$ݻy=!B!C6Xq[aÞլwe 3ΌZ߮c~;feh\ 3Ы ^ƿIdoܹL0OUl݋bh(s 1;w䨮܊@݋4 r->!BQ𩇖7oG mj=YxPlL.{mż ~`{6(;S* p@-G [[ף\L!vNүwa~?T56%|S~>q)(JFG. &⍝ ~3=lH@޽;wnJ٭[$a! 56gApw',<ҍ#9<=< B!B<03v `m۽y'Yz`T-5+eU ל1ͦGo[} ;u:қ4gOq(Ky(b69z}hX3m5'Sf n;M3y8 ۳~[bx9c{KޛT9=ZcL@@AAA,\EQ߿?-JY˗ 9`J,j4|ŗ\|G06`8}al|?0J7'=} >bBzgm8y.)TEޞF !ϸO=ȊA@]ڵ+k۶`'W^koLEEh6x)NbXjYҞE]ϣoϒk%2qOof4NUU|<D'9s';SoҾ7*}7놥erɼ{v1cLɆ˓hZ+KQΘ} `ȑ@?jIzhrwZPb4kT 3LJIz>8ZSq#]5싹;E]04v| 9{NL3NvYfolnA#xuX;\@yFxt' `Ѫ'=<225+&ǎ}CŊTxxWʊdsxݟf_XØhX ^.|-&1iU p𙩪ʍ7RxgN6hȰnsOՀ^OyM4 _n>/8CFBc/Ys Ĩޠ9>4闋5ӿBhxM xq%wJB[r/_>U5y-x,C Aǐ*m+3:e +3(‚ 裏Z܍3[%}1y`0zfL9%1s$ҍsڤ O-%Q4El : %Fh\SU+!ȱ YPAٳ)e5E7}O~JKKK4}v^O@y>s/%7\OA@zO—Sz .F˯rQ#^ #9  ؝R. (̙3'Mς rup.V,[KLc0Xl)-}:fLH_J,̩ݲ'-|B<*0=Y3]ΪPT;U|bavsϜ-No5eӢʜv>%yn=jc/kGuhc߶-;X K{u0j(wW~:6vyMϾI)32X JC =իF˖ř[o?6o%'}qqq9NCCC\GCsvrb7mDEAO=!Ba, ^p];j>Xi@#6BnZ!*᪽O#'ڌ7mҼ}њ ֡޼MϠʻ+zHGz&pJ5Y8} l6δӻg1-ca$TEA,:t#4ưzps^N͘GKQfϞL$v,W^ŧIHCY|B@Q@V(h2O'-S(BJ?QHl޼2eh .]M.3v}51z}%?ZEA!%уġjz^ e5MR`P`P1&p<.12Y:_,0!'_z|Bג=3VLL613Tt* zbM\OQ*fDQoxIF%;IDb 'A$&zE,4sŨdȻq8w7k-;M;3$( ū3_PЫw]c!ċB>QǾ z|Bג[,4y8Us{!t(hWB+ EiYM+ 3oS(;sǢ|SUSc'cEZDGDDǏ۶\/_!uL=>!k*`PuۂћF,! ^E(]$Sۮ'kszP &x7*&)A!'IdQB$|jxfJ%]B5/FgWKԛʮ6SƲYwEl b *:==QԲRIH0W(i)xQH'B|73W,1oaT]< +f<7Qb?y Ӵػ: ^:Mߍ[Ge1Ӫj|O񢐄O!FV>54v٣Q@AUTb Xq ĤNtbhKTЫ􉏾1>ObO!*yWAWQHl*e%N*GӫK*- ]:/IBQ geF'E! B!^@ !^ !ⅣHMkgrWW!)IBL-H{e(fV\ LIw- :L%$$pO!O>!B!BQH' SOL=>!BQH' So@3B!D" (TLˤ'B! E!B! )iz|B!pV +&jh=ӶmG=tR#Sfÿ~ȢB!B-#[rdfw:qy1<<G6_ƺpiqrNEp*ߘ%'4;6_"<:mcʽ ESUEQ~NEEήXȊ !BdTo|fxo޿D>Dr>~|3dؖ4i҄![b"|q~Ą2UUׯmEEE14`$ݻy=!B!-|>`:T+LK,Qw s^~/t"3ܹsSƏo+*>FZP0ߌ؀oqppv]Y16ꌛ+acT} JxD^a !BB"} ԁY[}P*1MA;C8:SLAQ44xө((^A%)j^ogyR~Kz.8D1B_b ja~?T56%|S~>I⧠(yΏ(O{1- 2+{ago71,x,u"d0ݻwd֭[y2*>C=_|}|~#Ʀt,34`Tq$GD(B!Y'|gNsZJgaDYQlE|\}+ӭhPٷaɝ׭Կ= bѮ8kG5(nì'`_R:1T]޽;/ysY/%fгŇq۸`S):tHzSbmT ߻բͷ+9G%ZzqnΧ[S]?߶ ߟE,gFSUWTTF"(8R%K2}fMD_<|wVߏ?0';{F'B! t$dݿQ Vn;nGk}m;7WtoajÙ*ȩѺ#橪l6x)NbXjYҞEtcͽnXZjɼ{v1p=:MNޟYkJȗ"Q* cljTqﲒmeNK [d- #GNzhrg\ JLfM``I|ŗ\|0裧%w햽dcfL`0,KZgIxzx'1d%9Sw3M9m҄B!IF\MfȤ.8?t/Ws!:)ܹrYu% IDATbZ:/4OB5lz[́#>̩[ZZ֎ NWknpqqEˡjMeŷLԲVhڄVZ=~t'ĉ(œ9s$},X Gɞ-]bŲ t[z=˖rpϮ|oKҧc䉔Tɒ̜:9-{'Bb2NoOg'1&M֔UjA[zgQUkztraُKJYtI\hכE\ԯƣ9ؼ25VV>V v9Q=0lYέMQ&*c]9w1k:iÊx,.;xuTٌ@mX][ ԟw͌9"3I@\\\=0!Y뉈QIҕM8EQeO!BŨ\i?^Ψ99rn@mT՘X3^g7]N$-js >s)?Q{ᚴ<~;חo~ͻ[ ÿ|:k+گ3CһŜ8!{bsO%|!syj.,L1ּ2+}s|k*_{Ȓ(̞=qz" σXn_tpw-w\3Src$ׁ|؜_'w'^]6>SD*GlLbY Mdyt+.v02zP}F&|z4ļ2X̬0YԠRJ [ۛN)ֵz3w]MtJN[~S~*{OM|Eqt uhFqAz ]oag%>^J9u"ϋ^. Fyĝ`aM{ޏ5AJ޷ ʑg$k/a83Ohr6[40{*xԇg쥩^|SzkgyjV<:NG:'ќs:}>@>O[ns;VxpZErUo|{g{sHU:'!tklӝ^Θ!Ikrq]ӗم;UnӅ׋ŋ0'| f4;zUVzΏɥ]'?s}ʖ 4z1y:R 8+IO_Xfe)8d6VjAݻZznNB`P4劆mȿ>hO=gOJ.:^z ͌1M)YKY 1KELyo!q{=)|+6ab݉u|ӱT.o2E:)Rnߦ^/W{li>Uq•{S&M6fA,zΔ 6ÅRyӷ2m1[RTV7yF{ޅ0}y3bXXѶ߆ $yO[ܺ rݵ:/Qǫ>dY)۹V-xEeN-e~?~P/P&S4ffhE)n QŜbu6'^u%Z=fZLkެhŞC~WiQq܄655g?JF YYyou}-Ow}H Kgŕ nӁ]&{B_ %,>u:-?!= +ZmLz:}6Wj\ C#W﷨bƮqo?Cblj`XQI7>}˙C˖ynDV[>ۑI?qau?JxѶ+8ft,Gz{)5*a[5HFл))yD,׶ܵ괭hY~Hgq$11NüxijɇV}'xO]ws!)U>zܧĒf\O&#Mt?i=6 &$f|i/j[bᦣ\ w5Zk t.u?zm6}WX4c7e΢Eomf8EE`~0 2r7&~k^Y]<3`huqyy?0*= 혶C*=^f4sWUJfk`0}ʗ̸, -KHH,ū>ѪkEr^# nxD^ȆV)4Srŝq'OV>>j0w ֗kVDz`ޘeyy4}/S:O@O nw>șK*:"6'^LފedG돿weT?;AӦxxMs/Fӵ=ϰ}ͯ|;ۙBb䶝эg}G-4z+}yeBxu2b9נfQ±xvF9u~ݻ2#{Y0{EXس p|>z Wܿ'3m;Lb;?=|,ub# GӘӵd6dwM`5S6OTOawtm>x٠>KwZ|JuZÐ|I˗SP Z5vx>s1zw2m*|:.'ڴDeY:z 51}oaqES&W=a;0xi ocDgV fvu{hdZ.+{4O`i߽Fq)lfG\|2qL^ns6=}nmnP6/ύ|hKдP^q3抻uG #o&]:<pRՑy7Ciّ7د4: ӐckPz|`)u?e>OyZro|Θ޵É eS">E^I¶j4woO䛈v|ܩQ҅7/]eR)*w[>:rep˗yotUT Na,_r-oā] o9s3N(gpˎQ&}0߮}Cǻ/yƞA[ʸV M4wȮ}7ء8ϡo:pߗ n}Lfu)vqϢ mn|4e3 9m9C&]9?+YW]9 :/OFL3va8zU$Nڢ6ew=mi,Mgc2?\]]PODʌGKgV Z-21֌]޳5fLgSMis9=nuӱ}޼7w<∍G11@դ˸M}q WjJسo s_SS(T NL=>akܫ5g7LfI̫3_ճGٿ}'_ GMlA@JKpM3uR_UZxhN{W|ǍU]Ҭc2;&.suó^=J8{zÃ\tzV??s|,NGՍqm3C'f(nqo0v_&^)\jciNg3.5ƥWfGн{@d?*>8yZR~TӘl)YNNhxIs"$g:&IWZ'p Y{i^h6$6ug;~5t'%MDBdJ>Q9SO;?'pPuT~j8;<ߢg.k/tIPIUDAsvg|Ğׇo5r8z  С<Ԭ|򘔎''574nx}'ֈ}ބ|}Ėd2j?{nC7#nޜrawdڜáR0QjRV×IucRkX uO=;+c0,NbBwcEQ &T)EZz4^aƕi>:Y|7bN` ޝޙ2\4V H]b<<9ogIJ:[nC"i/28jCT铎WѺY((ݬ1KsE§PD UpHySX[K(]e]!jf[4\fv6mJw5^~&L){YQhXXX lL^eM=>a⣉N] _v\soѴve<ȭN)x֤]5X?hQsγUM)3s>&.%)U$HS' +CYg $f:>vcy{U1ٻ?m4U+݁T| q_J<ߝמ4;!222Ӳ"͆e:y mFc놤k2W 1/Ia_ъA\oᛙ4${~Nߛ6mUduN3@Bfˍl+QhSu!MXoElcKp/[hjTɖ͛ nnZOLQ:Z~L~*yl«eϱgM9KN$D~>Qhxxxqy](R$'l!""e+d' sa,녫 Sc_ ŵWؼt3>+Qy xmǝUqQ.E?k:\_uGkd%,zAp'{e o]}DŽ"y YLi1Qӹs:ֽP͙+;q>(Uy2-}??տ]ԭUֹnXP;即]zcԊ]9շg2q&.}eEcsx$.͚R/|-Y~3WfD|Ԯ^$Jv,cuD9zXb5xćǰncPVO]i׶%,,zqw0bLÝpB 7{+i:\0ϺÍy5Ύ>++kʕ+O'T(` [U`X- qr÷L5UmWt_cɪl׊sn>۶x %n Z[W7}ϳ#5_K(x9ɚqjp)߈Fs&;[LXĂMr{r47-˭}~{ q xFtg&wxWe`&PN ,`ox':ѠcW*LXG2pNR4a jM'V+I~^)OPzeEG9u,2*3zfoWƭG#ew\gZ{>j=0|hFwL69>gбM?g˰WNP G-~Æ/a9Me j9'}vj|P<ҸϦQ"9Djp)S9uXڗfW AS.`Rï\nL}. fXZX`б-[or7GגTm8Ae1WJ.ECFU39q aFK<~eZјsƳL5x{5(~73;N4ڂ-׋]]yJQe@!D*M"CȆRT1> .2aBT.ԏ`n'ץW& %N!ՅG2O!D (|H_ѹ}qlq7ʄHuݡ^6DRa*4m$ɞ0= !Q^.v;Ocݦh#r{BT\fedDaY6sȼL =ǶnƼtsҥStya{ GJUjD>PE !cc?͍}^G>!D !BҥS!B! )IB!O!B! )IB!O!B! ) [srN۶D W*VF}SO!B>XQh;w{Rr,-uۏ=S8::Q|2dX!BCZDJժUÇmFC  QhƠ׫ |߶^GUU3\B! JA$Sm0bӎO!B.' Sj !BE>QȘzBe !BD>Qz'B! IDb]&M=>!BQȤ-B!BQHI (TLB!0Ur ܹ^_p3 {{{J(JAQ ߺt%6qh*=SXܹVf_L !B! t6| KK'Gr)BBB,pV G%ʸ-,3nivlDxtێks{8a|c*/*UUuYZТ`gW,udEZ򎫫[A BA_Qt<5豣 :!D :4޽C5ÇN *p;=d;/Q仍w4oOLmI_bi$?{m *Ύ鶢0 w#!O'/4+Ӻ3/x>$$ģ׫ ՝@ף*:Cy3rA!LEr7wܔ2cEEgQ\ #7IVg\]ݘ [3hP#"s S!ήCB)(utSG] wvSԉ`wi[nIwȨ HL|}|ų xЀQƑwxDBdbgiB䐪 #$4,W4EJvpEQ46 {|4YMj~ˊͰ%_֧nl:q qypuOsw҉y4By ߻բͷ+9G7 IDAT%ZzqnΧ[S]7fGBEp}$R@@ TU,Z(e?7j,_vQQQ 9`J,5ue|} fܹs'W3ɸΞ\ !^< !rL͕Q s|QQr^S̓8j`ۄK`˓X>%8b͘b8-˳t9t6͘~VNgSj,BKypzRB&;8/WETƎ+:e%?-ʜI6$XQ6gG佀F r!u׫W/ϟFܿa#Gs-(1i5m *S&_rfl|ӧӍC>7 !3ͮ'x~eϿyG@^m4w*6A:iKc园4}cˊeMP=tcz4̌"pv Uc. Y|i׭-g$[xq9Im4d0s$ =~ת2}$>%\a#7{1F|S N7n!x^H "rSN>K&Mr^S˓5I@EIu= דbh}>6#i\\՜.(,X ~4˒qv^o3&'&M 41y}~̍ݹitt ܽ}>x \*W8;c.tӲeii I,U*w0]g0ړuHQ9s$},X Gɞw}م^֭t&^FbRZ-aaَYK̘Α' [K4|ٕq)G5u¦B>^ۘ[>w?;}?m[*GVIg[n\_e/7n3 oӀW`o>o_~#^aKPٳg<SOr_bN3!&ܢ#BQBzvNJ&nB4 Nc4 UޑO*jL=>!/L"ȾܸyA.(@qB yIDb_TSO!bg_!!^Pa*U2͍A 6<$ (TL=2"ȣ9RܽwnSr-QQL օ$|P1L;2"'%-TUD)e%J$HJz{ThyF>Q9SO!RZK"'§*/^[[[nN|_q-|I _d$^MXXeʤ{^I' z@o0dSO!b*#!Dd'[r֬]3S dH8pMTUAt4fd$@.sGѳ?Zy!+&A{> !D~2!r`0 c8:8yH*Sʺœ! 89: ]S$-|#""m[YYS\yʗ:B'hтw|u즑 $X@v@OA=4A7OEQQiH $B6$H!lʖ,73ߙp|EDj W+||ΔI,i\u%{IԪU(A E ٳwN?-i&L|v,'}ΘGc>Vk]4.PJxR""*/[_~={iެ W weݷ}p8q8thߎ5kױevwЬI.|CtuکKxF4KTFyXf}⁑#f~|6&Dg 恑#i:}\0L/_ xDI[4OD*oF`ZHI9Aza֭9<۶`֭DQburrp8HO烹*|"""qHeWaHII&1v4aвE :wpq:U5n4Mv;HK;͖ +Tp%*MyԯAFggg3{4lԋ'33cj%|"""qED*\ BkY9N ,ǏdJDDDԥSD*1|guv=UJDDD#JLڢOD*( Îbv(r:z;((,tHկߐаa#BCCN Y$''ۡF xQ,qE8|8 ֑[]/jM-ip:l߾v^;((&MҹsW,W;DD<DXݗ޽z;E ;wncpW'2ٲe3;wcN52>O31m5ocD Ctޝ,233=zmBN]WfB񉈸[=37#(#8%|""OFvv1i[f_OD݊BP_ d_gA7N- "~_1M!'"9X>3Pz|""gdZ|""nO|=> y8:uZ|""OwDD*Hf8""gM""""efw4Uq7Uįz3'- "~.Ua,iL.I_;!)Ns_#øn XDDD0miaa^DDU׸5\m%#/X_g+uWمKnl=3ibFW͖@xxJ< h 'T(~[|zoI+tR|]n <}_F5ŝL'<<_|ѭײl0 ɔR^=^ODlSȺ1|""TI[,<6auF$do޼yK<.WWZZ~?.V\п=&-vƸjOD4ODs*珷0q+ͧݣiZDxw_3ҮjXt9 \?>/x4~|.֊:hwѽ)mm[p:5Nt4g*z>:Ҭn]w|~|?ytmIx$?1E~<~6xR<q:}̛7hۑ#GܒlE^Lt418IuILJbIQwRr2-"#H+T(idÂQr޴M8[Ѯ#?)n+.zfr拣@GY( \ CzؙH@'/o~}i\DܥqŽH@v66  ! +;n&Ӆus?bm:FNit/~>`1)|<W>)]0w}Ë7]CKoĠvgA4S}>k„ >Ӊi5 >|8wi,_Eq6g&N".>QQ:%f21UW|o68N{ޜHb?m>focpp携}߯w\Ͳχ a[ Z-W|Bb:]W0C}JLe(mҖSZ_3K?աMm5[SXlO{r> .\'`؎ f~v!$`Փ/s'Rt8c@&L`ĉE {doĈ̟?zLOO癉4͞1ɬSc޳&qp8Jj7JD1 >w]t;[o;ժ|5p/^_aF]Ϲ]ҲQ c~r8|o!uؐ}=ZpZ2}g֯__5ڧem123@II4"&&vƐ1al.\'{J;rw1 VRbc9۞5? S2dN^! ZiuFp윢.Ȗ IDPI_s1AǎsϽq1 h)3o.V[ §oWW#~J> 80[^~^>{/~]`5a,X}8WpiSq:8'w-u0sTZDF 5d7n3tZ""p3'd۶biHDDܬ w\ {w—} :g8FypQ3cQ|8 ,TjkՊ,=N{2ÁigjrWJV̜2mciŬWU f@a{9V1|q5<3eP%,!?s仇9gwto`ź;Lԗsz4Dlj_x!\_u/ۧǟGLE>o̟xZ6ᯟ`0ݚJ-.U`H@~6|c ;aOO `Μ9UJ 7_nc璗nw[|"" X Hesp姼hv Co{focs2!>N?NݗònWVc'M9Si(\)'/\s7Vc0KĒ%жm{ư{Nrh|=B]My;9vb%{8znj@dcr"r22$-0[% RqW(CF til-߹+/bʭS5'&C'L6gy,{i ī_MYw&qKp4e 1$>գJ=3bxIEǴU'"6EǞnMh,Y7?7Omiׅ~d elV/MlLB}#'XvGcv'6+{u[|rd4^_$Ǐ;uU8RI[D|i85_OD[6x@,MGD*-];Y~/SHF}㎡B޿`fc;:v%PU1z5B~Ư;5G;Hiu?w98#-i6nC!wk:Piǫٰz8JDzJ}iV'N'f@e } Eﺙ}/#eMp-+^DDDD*.!ccټ?~>ߞ\]Da@mӘS7lu݇ B@0uԡnu|!.~%n5c|?/~Ls.Eǭ-l>y{ZKo1miO0ZĀ>|iY"պ'#2_8_K ܴ"r{]|zuF nu[l߱Z^ =w_Y0iKT֮'ζ.T'~qKABg*F-;{\?G1˩]PF8g aZd3 oUw`Xdϕh$/~- [+؛"K J~_AlH^$W]!X"4v#AcY=NiFJ~MewAÆ # ODD<04#T'#93cٸ .a:!>H;vrc=0@:}v!> ї>VoMYѥY0sƎDY:opؽ6a'88'"""Rr3ȃƍUJ,y@5_c:3)FQ=ğRձMޖ p> t˾c\, ɀ٬֦3d h̪(שK5R'~#2% 33TV h޼EODě =x-Ķ;ٴ{损NJsuhԼq՚RSR0by>X6_zL-8'Җ}obu -e­tfP΀~mRvuIMү_^þ}zݹ馶-K_cׁxKhVR}ԥSFvHNNdXrss=z퐐ZtБ;ga΂E2[rN/S)y6hFLϛx!t/X.;y1a~Ӄ{&~7d?yq_&# v%pqӃ<8W~]ɩK׏lӇ3O7el]-4p\>[?٪梁 bB4m\U" W%wa ;o/^{B﹗r⵹^PDNKxOvv?+L xAP'"""^cKgk ;()J>q ^NN,;(+в ""ODDDlo( IDATDDO))'"JDDDk e@cDD"THH8n赃hҤ);wb)9'"N:ΟE>4MY8&N8L$pRz|f ֭{ "R3-HDUyy^ 4\H o8Nv|glճ?v{)))g """dwwOi|=39v,͛y<q&Ӝm_lyyzVkg7c`Jl?m!j=F _񉈈B45>+޽4gAϢ."5ij,"""""TO|=>.8DBtOSsTZQ8;sa`7Ilyv4k{ x4qWbS0Kg>wPvd6:eM Έ*þeKvOYfK ްua\е%u:Z,fF\/ 0uICs:}%#G?F-򓽘hb9p0q/ ͛ J0dZDFz!B8N^ze&屇Cٻo?/Ϙ?":-p=n@SJnFKF|}{7 ZЫKRL'pnYG:n‘L\HmpCOQ%\}낿ٳ{: u9.>c4r)Cgf7xS,?l+ 0AC kBgqs&L@\\o&a0j(.\X̟?ߥ|I"yfdiū^j0ؽg/OUkxmhqWt89wlڼ={2 \f}Mң[/G("b`f˦?nR_s-%O<TW; ={,o߹<^^{];0v#iݻd[R])_ovNy+||@4ǀ7QX2}ImO>[Ά7n$p)EW pXIi׵E5a&Now}ZeoĈ,X}&M3c_5}*mc9 9vX^8Jݼe>zmգ;[<;xQ0is΂$0)Sm䮏e \?5mkܝ2u||3sh^[g)1e/mYXl{JpԳeեirzG+ѧ!)9hfMQ0i:u*>{g.P9xvKQn]BCCqT!B[6GSӼ$0D5·%EnOLLXLPm8vv;: j, +C.?NNmIZp-`ű zW. /U^=˽|4JtkԍصR `kW؍]3:}9-?irKN' ̜6p0!-10Y{:*S_:-n_dKQ;,Ï?aXjODE>%|">e%r]iZ6CHRVFaDyn8C8Zɑe_2.΄ѷS\~rrҢf[xâgPHp~t,fî5j:q=NBS `ܹEI+ݍէMV,ppHJIb1Y{XVU8W<49e|qv^ӧ+{2 ր5KAQN&VO4Jֽ<~ozp>>bϓWʈ%d|ҫ%'vcG^r%a|sfy:$mbMoOC~wsΐjZy{7{ )c#2e Ok6nl7WG<{ngp9 c'缾WU[*Ti̞:T~pT8R¤o/cGW '`a0uD^`"qcФ-"~$,Pw<~#kO٘1 d?Ȭocٽyw>@3׌ Gx8O羥[u~ ˠXb ^ʎCkƥL_?0GIXggbJjqьլ,Ưk}Zv@="_T03gP}=l|;U:7ԯAzz:' /gf kq{K,,^?mt?RU+~(1?r),\hX#Efhb̔o3.z_ 'J_#[WX1_eB]c-'V}͒{Jوى&9TOhG^8n]:7a#7 q:t%D$jy|vQmcD|z|խ[.DGikM.1|E8ij2%|W|n' ]v=*ED§eDj힦&S'~4}?E#wR"""9g=MM<M;)9if眶i˟ۢI[DjQOz|""R4>Y:E=M͡O?>W n"2Jįzr_OD r$"*JopرX^ `az|""ަeDju9߈lɮ];hذvvvIoߩ6[qٞ=e vJDe]6ثz}qq}IXD)v"RĈzQOD)i fq$PT?M""""""T'"PT2gd"a>ؾG)W8iYjtؑ~}T|T*\TiK;}g tNpODYsK`P a,a)wJ܄n-+9yN:5EP'}P;AwT(eҿM_7N'z5tu.wsע (zaqr,V1lڒڭq%_Կ+DaVWuw0s t%""2w/<3m-d=%w9Ml@~W0ѻ{Op`[t܉nj!8(^wἁѽ[kev2݇sqT>zHضNL}fԯk%W?cp"; ̠ewLNN*u{lZw]iz[꾦My8F{0j!h:ǡ? 'mIIn]˕Wuq6}2G-) _nj< tͼzTwLH౧{׮EG\m\K|S=R =Rv3 8<^\x- s#;̄8z&pUD yZU~Ln3cSv~WE2 EVoK`*Ԯ ѣ'3239q UF _n"/;q8 Lڿo~; ¸ؼe."O `(hY QQE-8TRp04zw Cap'b._:ux"++Zjrw'e.܄/8G>K|;v|I5MX-4L,z;E%vvp*jKV"|ˡD~WOZjUCsNdddZsK_%_UtV;qVvJDLhVMJԝz, DӤB| YxqA5\0lݶG|#G0 ÿy'=t_UKgu@D|Q|+]D|P#ZDe3)tQGy],] elмHUDrACfșۄvනsӇ~}|8N^1j{K]:y4_xsk6N0V5 Hw 35Dwĭײl0 ɔRkOw5do"[.Rְ9\\ȟueȢ;oOƍ5K 0TtԢ[c|qzb6]Ci[?3#{pqj1-p vrSڴkv8T+5Ma/{yzSAN=f oD4]xmfy9ct^#>}qkZk~,k\r{Zr#'Ǎ'55B笮xmNq93]>ovN&Wwa&vR_>/3'mkHg: z+kN&3ǃ1lȃШTWwqǻ)l7FHۑ:X[70ǭ9I垷i}Fbx={hŌ/+|au9'C^FDߥ35E'hԽϟ_ȢǠNxxJGkp06 mIߘ5X2qW~jWZ];ol@D'<:lB$ aݔV*ɞU+p:VNEǪ=^+Y3s˴uT^V^K]:ExY G6#<""R^OڕŒ <3}3I-Z4 6y6ݽuOt(#; Bh 拊u3i[.EQp|Ue$Wc'8P'lB|liǘ1zsb}~++LF*{&_s8$''U.2T&i)Lf2apUWt:JD=錏b$""ťfzamL:83rٰ/)v~.m-bK;[lN{lMg_[NprnAW%ᴍ |[yMZGpGPDץ X6F+K՘k'}U)T6Ɨ߽Ys@utWDj>37hNߵd7A\%01f,t㏲d1wNؖgS2&(:/L͇yvs[ye_R:zzpq]TeRK IDAT;w85V9z;qe vRO?P>tU=Sdr6lDhivY$''ʣ1mcl( fH"rZpKgiro'TΤyf>Ć ˫LTTkZhH03qy8" KD&Ӝm*ХS3oӢQtZ,VzK}5&FHAVl31s SODԥS?mv|U)"N9?|}&\X{qt__OD[m&ο t0)~׉v|U)")kK3C]:ůx{\ytHP8K*|">KjuԯS+O=E`pB|5S9,`ug 1 'wQOD\h5sQ|[yuJڛ=z  :zz$޷"""RWs%*Al z j{GWNVˤ0~_yNxoNwk7ٖUAFZZ8VmڒڭqnQδn߃1eyIܿ'\Iv8Ö= Yy&P+8 >xEa%هc""0Hϯӱ}`R'''y8Ѵi3o "ez(oCKy{p؋AJL"$%%=6v-]vp4r&7o*sdc9 n""~.e= 'c)S0Kg>_1|5*|"""^m-͟!(YJ)w˅  EX[]jg9RODDD|Y0HDDj6UDDD瘪X[r%&>;iMODDD*6NJT%rR'"""neN,%چh_T+|g+%|"""s̢ >_P'~t}6`=z 4iJ]XJ )>#D]:E|v"%|7vAz#OOd˖ܹ;DDDD\ _͡OFb!wNVVbSNƮ+3DD|ӖHD4Jj%|7p8LNǯp80M2z|""b`$q:VcD|C o$S']~_v_ODW6[)LS5>+qij%|g| ΂ EcD|C _DDDD\tꦦP'~ן6z|""P8񊙗A 䆈D4P'"""U8Jf 6s>#(HpرXEȟ00J%|W| 37eD|O 9p 6"44ղHNN"2Um\J׿]sqp,r?|lg\/UɿTD^A5P2͛qp6#"]՚-Z٦Bih²%IH্ )W9Iе"qIU*h6[:u+Ө'"` HDT޽һw_o".P?߱R1ۅ Ն놖$vwgXEcq p8L,vH""~0i3sr\> HTS-F\LKM%^df_iix<'ZsUW|Cv3?4->w(Jڲ"""nSM Fjg`6^(]1 /.؝w'ギ- Ӑ>d?F730ȟߏ~QoІ_f%{1DGs`&=_"7'1)&GaIɴB""e0HT(QՈ]92vEm/9Vnvop峟. s7xӥ<؍I :owJӘ: ]l68xZGE괗TDϓWW]ڜ285ysf'"~K]:EDB _hٳث+]:AOu{z>K$6}'-g7AY{)B8g>DR&uH"%OfϘ8NfMO&$0vd;Gq7JD6eDD&mXl{JLNF?bz@Yh)UGzdb5}*NYtWNGc޽plgtV4ODJܜ吓 d֧,ٰk d\SQ'sjrG49,Ej%1G+i̜2>8vYLөʞMU+x۽,X?9{jv;ؠ^Kn,Ϟۙn}w^9:2{%%TPr8$''qP'm95Ό_fΌW03ƭI[DT 7%|xdÜ*?4:=2NےnVLjqьլC:yukؙ{{t:rW|v=v+& C2ԥ0;Sb[}C_)ӖpS7,s7bvlWWá.]|%ffF,Xݢ Hx} h#6MpN.%<8+NiT)F>+Pz|""е[~;yጞwN>+|=>hYڪz-AAz^>+^ADD\Э{d,SjEED*I _O|=>WtPEW\ `P'"R)Jį8Pz|"" h @O?Rwai[fµk_bNJH>%|W|}'"⪀tUvwxUCI ""+XQFR(M@  n4lGHH e7y'2s̙b3νնU6U( iL 777R=$|b`0Q5&ٿhֶB Mx#?& MM))) N`k+/dL)//CDPPPe$#00'千C;?_VJF1ThQ 1p8Uf:5 !CFF:ZBӑkpj5޽K>ajSؿ?Zݷ=GQ~Be !DeY_E`G`մbBԞB Qs`@Qz}e$CۻsMJ=FFP. E)(giUn!G)(W;å%8m:ug/Ԯ((Y/ofM۪Ҕ, g+,'ɞ0o/P.frv|aH>4ez-PߑS"WKQVjBabbvӲe+S!Jٷo/m\'-|B!B"MFu$|B!B"B!BQ3O!BqSO!Ba$XͷnHB\iܲ5?$|B!BR>9Y:-F 6J SxDz]ĺwg !B!jYWR^˓"=F U]ژL _{޵?SOX ѣGHJJ@mllIfed !BTV[2HՕZ^@A|3T h4K*Q>a1?Fvv;v֮VˡC9~u2>!BӈQl~!x8/m066|Vkm2540Gvƿˉ co{܌bp KS8#7fbF;c^)8[_a"ms&|:/d9a1u Fcm`@Q -c !B#Mxrѷ`+k֬a 07FRIO SW_)9!Ǭ#;J6GǥegO9jAIE1I@=>!Bڥ`(baUvD?6SЦ~5 82p毼JƧR0] qr1/e'b8gTTUT@.V+I1B!XVНK#}. #\ER8jF_ź!sذz=[8@?Ɛ'^P ),MQ9N{Bz:^Rv^W]Zֲ$ (ހf !BTF>},O[C^ִ ݎ3\-E135]pO3l.4 `po}+ן(5q 8uiW@ gf[OwU:o^u.D a:t$ _9 puk*5ݕ QYeB!* `lwbӟ~k*粊#E=E/˝vCh@g@/tԭY+ Z%ʕvߺ3FB?8>d٬?_W0z шcѼ>` Ÿx]xq 5d%Y uovkWrlYuKRAxe`J/*E@Xn5QQ-MCl>P:sVZK!.MXXmD{{lhT(z=EdgP`(NQv4Ůo3pCd^,($عbjňHGvz:CquJ/ 7Wk|2ϝ'WϑMV8yboE)($gSV]k?|rIIxep{O<|M;y8m\'-|¢ sO!2L"?'dqRz]&uKu]*"7=?K&+EkY fpΓWvc+xwַlKdnΠ y_ Q!BaNj%4uLr=C_ d'd8+j4N!** puup#Ba vUcU*w*ÞM=3fi5(9yJxPM)Dթ1= +$BU[/o{6pAW+DHN2w\N*vt/mpy΋^57V~deeڴ霉? +SԚI*,1++_%UוWgBX? ,@h<47]kzۺk-JH\O_6k]?@{_S1`Lvu5 4{hkJ7">OuAm%|9iȩ=Y]lgK" o_gg#3h N\Nȷ ^Gi D9Ej; ϻ/H:{FؔR2v&PɿpOxx6U>,J`,Wg/B[)M!xG3y9DKۮh}eIdeed/4$Аx}[xB`@):uzqĝh;(<?;rSOk0m%d'&AdZzl#ɩKٰ4xQt46Ƣ*|CSS E,vӅWQ3['Ful{=?>rp'?}pxXJK 7Ҡqn y \n= aqs[q4jυ}\9>rq]X_tO'~9ޚa?dմ}صa53ǐ!>n&ޏV}6^-}ӏ2eqm 羇P B-nBOy՜=GT\>aW~'_.=@5uc[{a $ga불Әٯ|cN|G~l1!APy?kZԧHS> q|SWwT§egsyz1np{vp^m 7b_)>xӇr\;8K@:[%s`.NA`<>w~(5ifMZF* ./pU$6Ǯg[}8ȗo@8L{#.?v/ec/+>QJ3IӂCE$ߛMXhII:u\S Cq72µŽm MbtJN 6h YS(QV?ɲ;ktYݬwnL%* A(c?kkWWI[]םb`g#4؆='iݛ vu`FM`^^c_wU9h'"R_wם*8k)KȹE7ĭ ϗp_e}H^ǵ9q^7' rgjGehl4o8P/<6huPH]'TGia^SOhEv|voēJ{r72tcƏ 3 nmL]5NaIzy# XfbSU IDAT|ixi>,S"Fo_t^N$ & L \֡y4_B:Ы^@T xyy L)?_VJ``rTymzf;-\`HIӡ[]8:w3b{kP.+m; wqwG>Ʒ zp `$_-߭ukYC+c'ح ; S)mޜX*i20ol4II&$'}'NР~}>=뺸qoX}iI(5k?v~Y9WfaFTb ^]hoE@~Z/ 9qqBmUwa԰ְ9Ъk_'*8_/W }˘r@/H5=wl }q. _|:C!ӗX\/ݍ |pxcۿe|,M2X*/8hp', E`Y$%LSҴBvn|B|:~NhCh=Ox>ދ3߻IpASt䃿1m'~aud`qIKKe߾=:4@PP&T g!9z:|S($T>lIH\'1>c \H:wC:þ}p\ƲU;mۆʭeۺ-+wb'zk2L%4)Iߵ@pʱʨl ڎm[0 ?̤`0V+|eh4RRk5q(¼9ė (Fi/Eť\h7n,=ng۱.y2b3obҐ;7BBMoȒYimlܰ :64>O"3,sٳslóF@% `Ȼ^t/wvFcb=<ХuI<4w6#Ydf3ؔ+m7n/#䊮C8NxhH9WvaeU37=Q328'ňQ |?_+W>\-/.z^^jRڄɦ%4s.O4('^|t)w3!d.VknCttS"*R<e3qs}{|Ca4g2 D/f& ci@djV$ {[c8xO4s'|Jy1ѩ ["\޿uA (lCld?Ե+vW}m&T Ԫt[¸$wQT EҲ'Mp ӊCT0i.'mgź-<OZfdfew kE$n,X}≬xl/mT~hV*ျ{*ִmT8:]S'#T=6猣Ah/_ƃѩ79ƕj@12}#AkEe{"tw4ViBW5^詛8{6 F i5'~a7lCIm:x@''Ԁ^^+Xmެ\ dgHM!?-/kK k5T0!FSNjw@%>Xsq(gމOA ;(BEhȫ1_Fn~VA~> Rkrˡ]yYc#| avng=&q ޷޷+p;Se ה"o]ldem3 Rk;m-`ݸVeľ8 բ&UU S/Q%m䡖ۘo~_!v*' =z|Kkk+ x20&.$IxaQ< P}c I#t.4sa68Ѹ?pR" J\%= a}ũ'8Kx\G `8CEtnn>=؛u\B~) %s;w*&oȅ&`V]م*KNUAG᧧svg|ٯ5OJ,Y>7pڸ16rbt^9N;gD<1p#/Ǘ۱tNI"r"hQGK~ غ )pn\V(CIt&6h 7p g}HѰ^upXϯ(8Ȇ`߬)ueq:ARB+֌{Ai"ieǶ2QbHL"p 5161{g,&<ƆOrϞ 9GoqgN7$DL=J]OKnx/zn oDԣ9CO>Rup{9.ٿ!ѽFܗBբU5At#% ZMb'l=\Um517=wr<ύ=sysSsQ΁O6y>Z#Jwt߳xm=cP!MYַB\_{|B!²ԑO1B!E>aQFN=>!BaY$EQ{:sO!LOMBX IŰ`УVkLрm9'B!,L ,F``0 t:]gTgB!GZGMa kuvv4nADDde=>!Bay<|B" !BX)B!J>!B!P !B!O!B!,$|B!BadZ!fICƾ6ӗ\t5z6s <ބEfiz#d6/]/FXTWF<>lRfw&ڕ`2jv3g\TZNobO8e6K+&?ǒwp49i?a2F28OZ3yppұ֠[s%F~v V] tA}!呄O!` U1 }x,Ӛ{a/;V,5%SY;c-;fax̶wTZ(9u3Mkq9<8cz*vd{/qF7.N\~CaV}?fL49-W78^='yۢk*daԙVBXIB/]ȿM{.cukn#讶4lHcOUD'3W4YG?ۭV/)_Rk3 sk{]޷}hy۟IZXA>\KDiLSLFK::ZSA׶ &ˮSzm+^!oBxp&kSY P2.pALmeF;7n&EOz^ZFh5NVoԵ?|{^СO >YEpP@ִs[@2R^1MH !;XTn9 ŝM5P_QI FG^}G&P,y[i:9`[Ew>ϝEH~lL}$%"j8e-Z&w4͏nYu_\宅rXpta1?Fvv;v֮VˡC9~u2>!L泹X>\~d N{r<999qS no .\T] ۘ:"- n[N]ӪܵFtU X4Zywf7?|=qN _m&9X#U*!gz޷A>~Cv|*,<|$OXdtj5)720c1g?O,ۍ ^<ʦ{ɭ׍͊صoU~widGz}q h4hT5Q֌]Y\)3147bKWx2} ?)Vk #hB.zzޟ2KU*tkwb5nsMds:Ávinذ*1 !j$|b0FCŅ`@Q -c aRE'Y6o-CޡE/Qw"{Oc'e{k EX//ؙ \l ˕CWP A.FJk! 3Ϊע"~6BacY cپKG޽4!nON.T}="qүړg[#媃?`fLx/\]kQ9*[do'5a7(MNH zWuH ͝U'wL\̷+Nǣfޜ*lSQ$EQ0~*6\:=l7}V_|]cBRb Wvق]Аt 7lAre#{vƱFU *۞@wjhMI\nǫrc*kgy]xu0{%nR_XG&n*sxZMSe>L Sq3K0Ԙ{|B9USdwEMc1#^ЮݽTOVLhxO~ɛ|/[ gׯUn V&PeVO"zvSM*y-vﳣڪ\/(4Xs:Chޛ2M~g$ Ot>}[TpN;Z~[nXV 뗒v;|Cjeu7 !ʧR֭&*IcG~\gjSk)!BQ>!B!PҥSXso6B!eT ߪT+?Gv3޷ e:pycB!BT s4(;'nc{Om񌸍fh!6;IjNphjTl\]]+H B!M7 _~c׮;̙MO t֍uWZ5ӵ ɞ9թӘ222LB!mQ%iplwGlĚ[<33WNLYye4M:{0 dff0OgCdu!BQ*ihRm͂qu"L^ygAJG|O*xۙBn&=mِW],MU^t:ͩ+ouv+-*?{|Chu|? ^*:գPT [ *TH* "O&п]c|hϠI+8qa{D>sxz57?Wnr2eee_NBCB !!1קu)ʫSGIܩZ-A&P!Beq)| E;49ޚ~o(Mۧ)ʉ܃g71rLwP2/m&45N/o:Lgl  u.u`ر zu{ET_Vr DžRٿvz=O 13b+B{?G j*a'?JATd2魱?ɭK} ڮ(q3qYYY6m:gҠ~}ΙłgBٳLz}MUW|~8{y'B!tS ߟGq_ܹ<x8*rc׳->I7hځ~/Řѭ*/ Ȏ3&-#X^oV:ּs=pr\f̭݆cf.Nc۟p$5zUՆ\>e˖T2N<=z|q8=;qzBz8Ao҅x$#tTrl5kOi38_4-=Thd{I_bRNao Cq7 !BrTމnn< eS+YX#4țDiop@VK뽌eέǿh; >MRIMvʶtMnpgل'[/6[ʊoe--|B!,75Bg~䏧|Ya?'7Y6ic `h߾7=Fߏ緟MdV5Uɷoh4`4^Oh4Vü9y|$&%`K5$晉/r2 ٳ[!BkyNf0w*mߣQ#µѡ߳9#]ݕE{޹~G0}]]=ۿ[!w3ZѦKGG c95 ͮ"nNe6&''զް;`@M%99ֻt^^we 7ՍSt !Bw /2!?,z{n`';ok/CW=2|L_U} IDAT?86$~mя WUmor`Z8_T3'_z̷/%>붲vawr ql `܂N:Jq#FѤ?5^G/^_c !BˢR䵿֭&,Ic8y8 (sWBB!,-}'2B!, b 'B!,$|¢(yf !B" (ނf !B" (P{|B!²H',h 'B!,$|¢7rB!VaT$|b`0Q5&ٿhֶB!a#aClmj} IBX$vZ탗7z9u*ӧO6ԫW! }ַ::Ȟm4A9b,$|B!,ʞ=HJJW>4l^h4RPPJəVZӦM;RRןʠy]q.Nٳa9..Nfooo,$|B!,ݻ8>#FRϿj}ܔF"<==z,+V|^oU&\U666ckkǾE:!lMEOQfw&Lrr">8rRWшJbx{T ъjg䮝:FF=^!DwlA@ ??q7ɩfw&ݏ_ lHNQ<6+l{d#?PJu}F>+ X+^X:Qco>}_nū,EQPTه/99q /о]wT۽u ӎiii޽NWs;‚틧wop.M[hsٻ߷ث!w^2K-oW>!;yeGݘ"Uܬ'ቿ+?NNN={ Ck JQS)ٝL!]iT_jNF5GL?E(4(N|I)lD#Be˵\L$)ݞ[ޮ$|bF=BRRzVmccM4C.{zKsO…󄄄b0[zpiI#g UW;8h C>a1?Fvv;v pr9t Ǐ#"졥=ڶ{Y<)}q硌{lYW64V>Dv1] HbSO'Tv[|x3N|8OHN3rW~',{5pL ~a),n]mtg7j]9ʞ=]Mh .]:p&^"H'Oz؝:̖*w}{Ϡ L'|ŧY(U،$|b$N#77VV$&fO W ߰0iĿd<:٨0TY#3q7ƳrSSQ*jl)=7 0(a'&s#^nwbNVYR6G`H=:oVa OX SDDDRnEԩ8  EK5'VgC\?$F1u"VVRSa)qssT>:6T;U>Np'Q2eɏ?YA/, (e3G8gfO:ـV!߄ ~2?ڃRoJmö(&Og?-4-M6F%KIbDl>Zj _iٯ;vsO`4:42QTTH׮j}!,NHKKǧ fotwz:u8=Ξل0Ws|K܉lAp5ej*E@Xn5QQ-MCl>P:sVZKTl;we:+jaPDϡC?f`oo&t) RZdÛؖ@T >|:^Dq 믭4keP*E[7K (.#<<ݻwN;8:8 "r8, KjV٘e9VZ3Y6ǴR-5wf;5i:u-HEeQ[As8~}7=l47ijj RSܛm`:]%'|:Vł8CZq\E kX*K%@1D YON6J,OO>莾f^cxfB\ ^O~qx{o^ 0CjlnDii1u$&`0^}krc\2223YՑ|S5y7Tf> syzBO[LI܌{Ҟ||:hns) t:rqKɦRFϯ!!zT*Q^Gf6GǸly{x膴Z#< Ǿ&ϳ?.N/5#{hѬ^A%1r愰[UU-bgut$~F;:j5܌b@TZ ZDT*P5}Gj9i(e3m0|`K"zHܐ*)) 2:ZԥUYR?BAa!O?;KꫣMu ̘EeeEsLuJ•( j5>>a00 -Ş::ݖT޽`4%>W)fp_“zȮ&^sݘQ*LU?9Orf1nq,zv Z%0ٸ0ǚ{Ziͻ`-I?1lx,|&zԧm}тGvyI/u'rm΢Q2wB{Sw^LpPE̞9N.-+#$8!B`ݘL&G[RT(./#tM=K.`D^Y0F:KbчEI|T6} S'dP]M==6kNORZ@rYvs|C{tP,d%oo~>|ы{2ɕAC:g%)O~mP2'A@PsƲ2[i?K 6Pƽ-Dx]޵l?5-8\lV,ײŋl)>._w<=wܲO!BOS:1,~0-΁FlɺldHm[+Z!X,XfJvo#|3+IxX˗=B!F`s :C10t\C"@R+f}Rx8Nhe<Ĉw3X6Y<5 'aՠ`j2RȪ[,EMqqvFK)NvK-BP`4ȞB!li 𢦰FX7$!=_᫧&sEH3fa ^A[ףLnLy >Ul `_OhGigv7< >w2'z\aG{0}Mz-/ju諳f&1͝O!BMy ~Z ه0ayۜ=)=)Bjpt 5Sٟ_8{>!mWVVFYY fl&ĥjK``$)Kq !hr1m\`2Փr )Kٜ{B6ǎeĈR Z' پG):|¥8•X,SPOEE5)ǧT*Utc &ZOg~AUu9?^Ǫ !F!2"ZCSS$)Kq *ؽ{'$$ @^fjj!//Խ <0GG.!W;:LF\lc'.O >RV.= 9yEE\x""Ne؈B@ӓ8Corttyud&ost 4V.O >R}KJñcLv/ _l6l6Vfzqf*f C\tW*j {߼qZ~Ԏᒤ.CRaqsszr_TΞ-vM&B1"7rϭu-hb ?.ZcZQ(~|  邴Y3G9ѬWP$G$?? Fӯ_,:so&2IM݇hTOJf!j̨|Hbg[]¸Αԯ|e&+ z٥nh0QVVJ߾^ut[yu+{&Yጟf|i οxx4>F£ v7ųfCP0nx6n@``lԐq;j~Xz)Np0g֯mI0v@yy9II1Lw#!\J???۔ &"(]l 㢝!gԕL >ae9;޽/_)ˈ}R|'FK~1\r|v;75u1/N ԃWrݨ<,Y=i/^fh_B//+ ={bil6@t:G&""Rb-I#HS!^)]3o`0d+y!R%ҋ}7ռiF D3*/UYSHQܯ|e(=ѣ::y9{>{3y[{Cobmxa|nvHDq:~QX,Kb1N^^|݊#i zřy4EN2dg醱O8C.1ar,;ޑ\mP~H'S=s bCAؘkKx"V>4,dd}2הy=S𽉥+?[7~w)yp7{5yRXv'M2;;FFFJ&T| SLTU7 ; PR q9rӠ{}O59K r0 §H'S!`zAj((x"|xGF 7c3K-$iXz/V<6Įpc}OLj=:yu >Jj!00c 555QPPp _uu]B}=u@ǯ B8??B=:3{|Ise1sB^&\5pȈ NffhjCn-TkFsnsy-`{ ^g7QSGZ۾vLtFd4۵ ťLYarލzn P(p%:B.$0*5/;6p'W4| "î&5|B; WR \`?b;oWb"l+/:6䞉6avtN(**Nؾ**NAIIq%R*;//8b2qztڨ9޾mGzC;F ѓn L`S{JeYG=38GH'QQ~m= vߑvg?&6:7Ԝ}`&fqYڲ }Sqq!!! <牷ލϙOVDEZagc'+2*=Ez^e9TFsߥorrB-;dʇeP{NN]NԻ'wLyn?7O:>ӿp !!a`2N֗d"?? 9x{Q'UY*Ϛۘ|+NBG<Ԩg/\X*!mc0(//')i7&qT*;:KOg/=B2 |vBt)Kq4g'B!\|¥8Ig'B!\,B!.JFKq4g'B!Zvk( ה?B"v.0O&d>q~B!{iӔΣx`MaɢiPٴ>Ҝþ#vɯ**+Gg눗B!mJy7_?3\"dwl0 >bxV&jߏpiUUU̞ ёB!h7b~fqq1%%%Sa%005+ǭSgwwf}A{M8ŮJ ٟW#Ad|rS]M@@O?~xm!-}x}x:yZf颗ڝuJ$B*6;y}s~keFҫpGh3c搖Wr..VH[ guď yJ2F8|~I~ݏRv 2yV?Iy,}{)6†Ɯ2hs>m/=}?&Llw9˗;)eev%B!pIENDB`easyeffects-4.8.7/images/equalizer1.png000066400000000000000000002617321424023573300201060ustar00rootroot00000000000000PNG  IHDR +H#sBIT|dtEXtSoftwaregnome-screenshot>*tEXtCreation Timesex 11 Jan 2019 10:40:59 -021= IDATxw|uMfPE@)ؐg,'w]&HQ)Pi lI^ǃǃ̾3;g_4II.cz[nwj  * JKKw/O8SI|I$uֻ[n}RYY@xu,,Vvlٲ ==Y$uSSSO| @#t:uxC 4.~_ɝnݺRPPbbD%fX, Y|@4^g6*mܸAYYC][9h#eZ+]'Qm 1 Dz};vPVBZb-qf+%%E6[x^ڰWylPk׮QBB8"u6nܠu].; <_ g YiX, i׮j*5lJrrò]ժ>Z+V,kNS*,,@t!?cMtv.fTKԿjjuA1Z_\NKӦҲb%Ozi4E%ס=F膿^nc^8ϗBc4(t'~A|*zK~HKLJXT2Y%赛z)&i}I|*YoH~ժˑL*XnzlrIJ?JJmJlN17 O:\|y(4HMWxMp@6q̹$ig k\pWwp}۽x~(Z޻Xk! ϿPp˫:$ZVvT'9GS4 4Frg CJY">buWjMZ/Α$m?:*VvWRڥӨ / CJR?q">b+In٤9aT-sݥT2O7ϿG'UTwjk_w(6;ӽ;[lyj啧]71Ϻ4jUkf2B\H:l\1GHR޾t-U륱mjB\u[: u^ۿEJg>&R}Dz}h"Y)қ">~Qzti@TG?Y]ccڽ}l)WgY-ܫԯW?-__=S^}cDvLﶙzb]zR쯵ds b(#H.B?8ա)$Ssڷ3w&Szr6jNF~Lm*%4jcW+H/ CJ̉@;5SE;eKI ݼ^$u8QW^sKOo际yt_\VpB͙L=1-:*-Im\=.\%ScZ_B?ī߄tC>_vfiڻ^|D9%e S`B}T]Fܦe.a_|y?^|_SXXGR4޻eXB٨Qi3oo޺krnuxX;lmZzՠ^)j7)vYr5?R'}.>LhQ޺)I[^ŧ^񾹹*8ǣ=gm֐ji9?պd5DҜXdUh԰?ӛ SaFKK嗵s|Y~E7]wZ3ܷ]/,\(IEյWOjp..nxfO$k-C{WչKoKkhѪ5\%'$*)q&_3P s'5aR@%P5k;M,[RO?srjjѼzeTy#D~UkstwKOՆպU+{m!UiڳkUZZUh3ϙڹsf2OteX4oa DwVk*$ɷ;[\*_(F'Ҥ[ЋONPgI_~FI.G)"iښ|N]7lTjԴf:ws5c;?na_MWyD͡jը$I/\~?;vJ&?6lڤ6[S͚%9>]~?Ki݂ ͝3oԧw/]z8߰A/O.Ԙ"@eZ,[9VߵUNVUXRS%e&?!%7h^%W(_.Ho.URL"Iiuyst{5껁}ζ[lU-^\[O:)uVӤՏm>P2Y)/Ja&JMwR}|j@@7۹#G@E苅_Kn7}>ki,x[ߕ赓ujc?U4ulҵ-ZٓZqxj.Irku|Y/\?jkZ?Z =N(k~:*U}Դݖ?ʋzkڰb\i:(Hj=fM|Ro_J{o5+iHԙQBJpJKڹԇX: :g}4s.{ CP%43]g 8tM>8YII߳GwwCTF ޹ƀKZ󕩴􏯦}Utpԫ ~UFFZ?4iq-;SO֩kWOtٗ_.S}~*ߔ]zsrtwO sQVWfhhО+Vk7\u͟ }(&&FwVZ/+kG3oǎjժvیv7+Y, G wˮM~D'=X,۴_թcGKmU,..u.ߵkW*%KIN9$|:Sjҥ56+z>is٦=V: tZbƨC4quߛnԊӞԑ)|8Wc$I-_g۵GIjױ_vths‰ykkmfm:s3g?;Z5*IlsZ5*.MHժ勿p[~X;iM[dX농jӺ~qCec.K#u7*s\V~FϙY;v(E S-f$Wj"xO@SV_kXˮCR[?SSLt覇;+!g^z^ܲakm8iw[G?T#Gݭ}u8pKՍܮ']+{4WqZ&+6TCήsrfz{ԳGwn&?n]wMsGi¸P]z$FS[$J5KJ<}aIZjyJ͓ _T¢Jd4;l9)? ݭ}>Iޠk~pO?Sn^qu92]o=P U:ūt}b%KUPZP`Pu@;dbsD ]#E*T@e^q;QO=$&h@[綛n4Q ΨvCTIzz˨-wuQg$if|z_/7+s2Uy{,;ul^}_.Ce'U_#: ǟTPA :X^Q]ܬrrs|w:ozs2@tzhlei蕭@]|~0Xc(U-FqqFz /ٿnyVrw{C/Zs:_S҄*VYaN.~;[}v-tcY3ꂋjތw[rLeL[MͺuT.zꉩJ3O麛nѺ VGO:S=pC*77O.6gfj#龻PB||zȃGk]wk&]sa|> 9k|3ߧ}$38l 8@͞~Zw6WPPg?]R} ?9|c6 |~}Z>t*@PRi˦_UXWIq:WO%C+ ꛕk**ܣI:m@yZS/=;|Trǯ+Z,V5?iߧbyy]9jI-KS^+ɗ+ҹG֠2Ke<}&2g|aՏA-%cU\V1;q*۷MMhVXX?3>uQQ(666)}-o$  TQ@@f=?o0Y,J}I .~W;eKhSC)Pۗ,TMw>Ŷhnj` OcQ0ᐥw ˬJ]~E۶m[=1W8j#H5 mh$nJ<1E$꾻?͙zɧ}S^]#Zn<IRc׿Uפ6%ܑ#އ3ֻK  FNKbwhY+66mݮ9 dŷhm;s h!`r͞7K])>5/dT~`M%iw^f}2SNUAESϨ(Xf1VpLcjߪ;6Bp¡X3f:Ш$IYvʓH"BmΗ|إshhwыBm߹W8V-Lڽ-[%Jcwc:FlWRxy^Y}t9dY${_$_P:5W۲$-ѿ'd[,[ܽ^55ǠeJvUᶄx6T?rrs+,KmЁX꒵uVö Tf%Ir:Iwߩ=:4ljh9T]85*s'-)EkujNmN:P!/n혦9Zo?| koT?v+װc+1X]UVݱ sjK/I*UXvfn7]Njspw=3^][hSaN!+?XƔ+٦ 72RqUwnISxBR=[7eKvakVB%$h=DMyzݷ.Oou23ԫԶBsQIIv͋Dm5bعR'-ZaeJAg(~P?m$/[mWz^/Er9*d"/B;+mә*m*/նu+ÛjZ^'v\UvlԦk9RUZWYE%%:WWvݷMe.MM?e^uVGho~ZLҐ3ϒ#&^1s%[+Ȇ@Tw͏A.;Vs{_U)/ k?ږ-Lr/v2b1y)I.]0f*]c*|h=vUݱ9tLJ ҋ^uuyΒ~ɃkiKJmÇQ"Pku9X(|.qY)">h le˕f`E%VUE _~>8l?Tvn%ȓPa٧Ն-i_2:gN^V} R(/Y9*ݪ2Ii)Y;eޮm:JqԪ]zy5-;/uWXvrcԭ } I{*Vs5SduVXf汫΃#am[y`<Ǯ6;6/ clJJmZڦX?E]U dSͿ;RxQ wM#14Ѭ@^D͛hܹ~ڵNv4~hYUM Y[Խ{ÖjOKWd8/AfƸԽ*.[f>ДRRԇsfhpJHiSiy{*PfOeZ[+}l.9gT5-~'$(Ӽy-XL]Z%mǣ0ECaCpLj}jRݱs0Urؘbm~w¹W]~Y; ΗGcif@ 8^Do$دwЪkxZ/?ժG_ʒש`ih*Y#n]:[+Ԝ>W{9nak6x?s `ՇQoI IDATv:kOUi/|0_7JAb+ԋoWG%+uFO;sDuTg_|%?Wgl=WmN]8 s]6<Ǯj㞃5rk8_Aׇ)⛕"}H]n^$[FwKʶ䒚Q#e' KV-SISL\ޣ]:+.!Q%ZrNO?UZ$k7Am.xx'uЗ>WOlv窙'IAY`rΣV:OqAY1q;M^ԻAٴoԵ] =|JC2LoR[RǮ=jnjFr,Z߯j:v5i1liUx>V/]ժ;6=1Jm|={ٳUT\|`=uΈ኉1u ">4MU6+9e!Ϊg/ꯜ3KM@c,vk=V]#IJiRUkVWXn?-*~ݲ٬j׺~rڞ]fHqnezSPҦsZK/lsO}2_N죶jZz7v)%9^C2C7mPF c6l٢nRvRVN>,2Me=]=:pD>G缣iٶV[Zzy܅(IRv-tg'58CI5Zˎ^N*IrُZ򗃶X瞣8Ux]UضG&Mjۙu|u#kXj]ٚ1s9Bn۰PHMn7(77[˳aïjӦv_XYY;ԩSgqDzlܸA7oT)1غm>5YF;[ڷqyS SuKdK w904zq`/ծ>h ڥiСZ|rrsܬ@#RM˛=EJk3.QpCpLFJJJ҄q$I11n1R~vegkμy:oԨ0W(C1 Dz}hY K̙w]FM=d`%泗M='';5hfw `Y]f%!AY @HЬ $hV4+ JBf%!AY @HЬ $hV4+ JBf%!AY @HЬ $hV4+ JBf%!AY @HЬ $hV4+ JBf%!AY @HЬ $hV4+ JBf%!AY @HЬ $hV4+ JBf%!AY @HЬ $hV4+ =X؎"{.,, ʒo2C hV@D [33bZ>T œ$ɜ ZsF)vofxEJ̧Y @TY dޣ%asE kx5!AEӟS V 3S<ól*^exv(xў1<7ek\%0sIx<2k߲e 2$ 6\q7a`VCQ 4e{۔+I Qܭw{65$4+`&3=WOw,óQ=FLjُ>\`,'I'g[\.\r)JhRhV@SnJCQ @PdkA1\jx.ɬ.@@`84)f̒_`J7pAX{yg4<77 hLhVլ *dex& 2wMJ;jYڙC/3-hkTYSSMde)3˴hؙ%KgЄѬ(SUg/+װ]=mK,#OQ%_i*T#Ss60i2ﵽ*i@]Ѭ8y u+wwjpNdyШYSRT߹A9JJ|b,nwr&4+v)XUޅc vt' И|[ M}Xo2򁺈FL,ó}K"H@mx{ 7<-{{mGqnH. JLUIrm$Qu6浪3dK,g8Q3Yy ٻt1%٨^`gJ|ax.+w8ݔiI2e igYyF3E5'Y. fH1cX^}/FF޽zִ}kBpWjgx[4+z4+em*ycLahV2d?33 r3tK&Ȟ~67<ѫRs?Ɇ]{v*1.kSmii*GSC9jtv'iMMUf`Px<J.P"*~ufFȖ=7^g@Z缽Kav53UY D-{.6.l'I֖8=S ++>hyuٻ0<UU0?߄YYɚwj@RœVG OL3 ƿmrG?ՑkpSG@CDwkvN|t0oQ/ DdkJCg0$3r+ MTf%۶9$%7CͿ]ixv+&p5"V”Mw꣒@}>־hliæ8]-b۶kMK3ڗ喭sgC3KBl˟ix{hΛKRU0G,Ν{+;q+y=q.ࡆqx<Qp%^FFb4'ʛ{$GY $iL{]ï~kb&N MɶSQd*~qJM9iдvflW#3TE4ɤa~Q94m 4+Q=j\6%vY[h!WW־l@.Z|FĄn1pS4,@pu9 r7nPAk(hNl(=O%N}LE=kHTf%`*[ ymr)@$u,'Iys vrᙨ%_)SMڻ0<dDOBu fVG5eT`LtWU֛g'<p(zV 5<"E *𫿍%o4`Te V2&K\Ұ ʒ?sKͫ0Q09ҖYůdJ6‡q*L3<ES^,NiBӲ[LhJ|f3f6jS(\>єm,5+GQ”kU+mJCM[ :͔45֔+o]J|vz3Q_4htkp/д|*ihxw U9yɇ)h2u2Oܭt|Su`~|+mk߁fF5t.^$E)[B6B'[vljnó]g Rܝw+14l4<{M?%PXU} 5-MqnZ~;oGG wދftTgW2[w2<1D9z6<bûBI֔0AJxt)(Y<YNN}̜Fȷr'7<;kwmj6üfP`gi8kٲgtS5g;z}YVóE^sOo(`3^͚J>6fݰ;wit*g`sJz/8HeKk'G2=k0YU~-9F%Mb. !d3 ?s{XI~ EcG3=T4e`q/IW:z6mdJ|bṡbIHPGPtxC߯v70qr<ɴlkjsgpcg'>\(I[=J`J6)Kvlۛ+EwG{@h󺋦dNLin$\`ETY4+鈿lZw'e;k^mpΡM#2xhs=F S?c/7X F78q &гM\W^2%yr6g)(fijv3{4"QܭNzqs@SFBSڥ?3m ?} deɷ|!Ydx ͔|[-֔lI (!KsCd8͘i@_HY7׀̿5/pa<éW_nx"JT9k{ u< hJ,n֯Ӟ4<5l\4Wʞ!{F7y6<1`yJ!Ux١z/ؽ\k f dzгƜ xU:SCf~3%5x(J*bքp6~r>:ǜ+[(*ʙcxFsc[FCu%ʟ0>v%z߽G{STW3|ȚhbAI*~#oxfcRv)ݺl*FJ=#D{82qwEqwŔ`av@7f~΁'))Sbz<?lt9d#ܣxn*[Ɣ<װsѸ975*xFۍhrU;өkߦ{S[bʛw{\ᴭyw\So?\#Lrp)Y E=lLsDnV$Ot\pl;7('(exs@]cx>pFMg0#ە_7o}fxnc)SzdeҜfN Xxvɱ];`6m;q)({V/kT9U 7+V2d_/+ ϖ`i.mJv4w6-ߖN{nVٳ N^#!`I)_%gٸ6.nSNܚ}ÖٴSl;02AJxt~5<(IR#JfLUSshQ](ĦWl:S玖E)TY۷W ;i.SFиXt8eq:7WeWշ*9`~9e j 3л@@ EE$T"`/ *^Q* -H#l6 算̜9jfw1**_βo1%ߩNf*J@I ) ĽWڽ|w |(>{|~7ug\өFAG5PW_ox{we5kT+M٣M%_?*5R*6/K.UJcK.$mfS!%޿w $ood{UjEx^QѲ5u˫IӒ?2RPd wʻ%%޿ZuZud6{sU$#[{E7$UzQ9K~iyȫYsdn=:Y'tE}qKK?_7󎿜;NSA~sn|/wKo);umT IDAT-so6ϛn[r玬$7MO9eKe$$Ungt W:iޟJҾ E4T jeᆱW]jвwZq>OSW[nH~[PX Ff/Krܒ^4!j*G+5y {xMWDžuŸ:'P~:<^ٺS u1KR48KRM@yV8V9m#4 firh}UF 9ǗzeZAn"pP[ׂ3c~Q =5Ol>Ҙ6e-3LS[i]KKޟO'kkwyAW]pkouUIjuJ#vp/R)**+Yoƾ93:ʣ,mE W}*$s^+S~nZ_{n Wes4:3YӎLsdRnsNj\@Ŕ {WE Q-ə^_~W_qJ'<ffb7FHͪѝC~[iNuc|WxBky}3CA/v qp.w'f]u'PաqjzO;.o5mtݘu\(.Y[ueUe7x=I5j룕dLpTRjI yrŵm'?I:<5~5zBF]Vs9nVkvl Ы?G/R`-m^GvUfRH NnhrETa\(6BB;U}V0lv?g;3ӥK~~PB222d>e6//TɅoUkv Y)?U:G~ |RC?5nT[D%J::oGkN[ni-yTT5kJ5M]V>o-.Qo%pV`waqu<㨶lMoVjjdeQ*:X0[Ƿ=C>` 9]FFcA0+r_SίGk'|y]SxF*]ѓ*kȠVAb"6.sp\JjvJ{C&=АZPA;W)WA`S@μ5GǦ$>\Ԧвz5RnM'D+2.]ݘRuU8>2m헪6~/Fo-Yc45?/;!޹S5{L)tҺwԿ;${@tn:E~b*~D M7FiܯןS𯟩#Y5z> w6WJ.w2K@sC͎$O\sM]PWdr8$<}.m롷˓Wiܓ ~4Uzuվ5>uKTO5p?B]⠾[:<+МRuU8>2-IGKfjuwiO)ڥe3_ӔqTmx8PXwZjbSz {k:<7V2Hf}/ԹB}giw?ks5ISA.w2K@sK͎Mkdv9mkw$OͽV/Haժ8b}e][L)A oQΈ5 x1G.GUo[:H9옖NzQkMZavipZM|qƽ{3ҙ<;%乫fǓE.m̘IznP+HüoV:iC-{p,r24u[s=Dw, @őSݝMW[ϭ*+]KW[k0n[z>x z]U8>V]5jHGV։]K:tp!zΗ+ܥ{%3W k@C:xVS_mZ8W;ۜ\#c~Z uSXF@xa][3A+ޑf.w2K@ sc͎'_ /V2hK<2 UѧVz}{-88W}Ka)ñc^~?^?:W)N ӒIǞK_?Q,zz3)q|/Pvh#u雄g՞DCuݻ8AV}&P|#I,-,mWG~a+uJK _jEe X~7^'n+8)cR˝Pr]BK֟SGUtӳ7NZr Tw 0=Q>QZ4u&^pD[4kg:rK))m^ Ntdh׳+|s\; TSrT>?/D5Bet]uV8>ҹrfż*c`5 Nֆ3Կ^3xzjzvFR@CI.:>.9#s {.]7+ѰE~TjKԺ~*{j%zX]pP(jm{4=F|Bk$1nzcݢkU>ҼFСnNSI%1%%R͎~_ ~.]+bg'{fM%{^:[]@KUS{Y?u˖jqpŠ5u_2P!$)QWx~āܟh|i-~(\1#_y$9+i-p! X]NT5\z o؈^U/qTD~j5hVD^wDYUB^'wSI%pJfFBB|L@I(H(JJJJWbb38eYŋEVͰ~Z+ue=_ĄRJ5^qqqUI Ҳpժɽ=\xIڹ_ɴsM˿]GӴ}^%BT=o]کi+=) ]ڝ]m۶)<<£BBBmvv;C(JkU/k.vk#ͫ!TƗyͳ)ԆY)Y_RߟJ}e§> 5r/}[7E.˲dKm/^[񾒒JBBhY :+ J]U)9ڡVO_|3/vW\geyA6eEWdoK8jw/jW $ɫ^Z8KoHzQTXx@Æ s4.CPm7*M:Uƍs`ɲbIڹkݫgGҡCΨ놛tȑBs!N.+Y9;%.=յJW]K2W7J!.KyO= C$Mj%I au^^Z3a]}a# Rx{\Lh,I͊~#Wk泷銖զczmRNz&ڐa4ѨBW7{}7!umQG!A^)Տ .:4M nKU;h*je0111ڵkfΜ)0j֬Yyӧ0"*NAѣGܨ1ڵ{խ'f#CҶ;4lH3B+_+\ۓOܓ_(,sR2zxZ~LOǩP PP{vUdhu<ŵb%7͙K҅ٳ$)F˵f< JG<V6wT^z-rһvelmoU5T$%'+9w3A/w:X$G7hu}+ݻ e>^/[hѶզ+ѨQ$e02 BAiي1c r ~v.y2d4M1q|^1%^ әo~Zn1Ɛ˵=.IM:o)Լj&>>oY֭)ɱxnzoad4:\ =5IO݆~oGN,8k,+۪/fLrR5cƌ3*TruVМ>i:t4mՊRY45zuW'{D%FVR9TT^E50LIS=mO ) KŒTt%֩>6NSz׊ %lޢl֪}{FS=ֵC53u n%mZmmw$=l!=a[jj"ԑ]ڑ"UɐTaCURXw_掿xO_[$Ig\$~)..6NS%;ߙ-JzWd,FTR!V\ zTSWU$j%P͚gz6SS 'm>p>]MrJ-ZIt՚Lo]-+^'O㭮 B%){4OܕpTVVɐd͐6Cv!8eis,pbcT/P =a۶ѣWz\%=p]ն׽.7ra7 l+R$˒%%:^$:ÖSdYiIiɕkLӿ_*#Oy:"ʓ^{W#PfnːM^j%ӴᰔdZ6Cg:ӒaH^"')e:L9d\$[H+)@e=(_FvRMUum`5꣪ަкG,eZT4aSҲL C5Zċ=z?NrZO'P+Bq#z>P~䎈eSHD +]OΫ;i>)C^vl$jܪ.=_eȐ$Y!/dsHNP\G*>rQYC0e3㫫.Qy$ٕ%_m sN IYNV{,K9S C6(Vwy:P,諼GJO?j(yKwFVm?˲yr%h.*5 ~?ò x#+B1Ͳ}ǩadhȴIiLK#l2dLf?Rt(]:P~LV8i1)P+B, U0$e&'y,K2KlLY2G$%A -6 IF]DpJ0|||t:d=t׷e=(g,4é: J^-mS`U,9>2%4 T}V(PMwdfk@I={(%%Ee+--UwRZ6(_LKrɿnzִ+Ϯ@?խIlYnCSNI L}|(~Ʋ x#+ˆVbb֮]Rݷ5jƍئ%ɴ,e9-;VuԩcMٛLC#t^@6|VeT)%2e*-}tSM=WCy&=TQ nRǎձcgOGWY+gd4nuaRܾx}㿚2M)ӒdJ4fZrC[g:RV,=]9(VX (L$0dѴ9e92eKQ)L޾^J4e35}zаL)!9lYzJ7}UVFWV J@9dI2rFW,[BBe3$ %i)-˔,0|e k Krd$`k6$e*)UݨVX (8-KNKr8-!ɒeYy%eW&a6%9rXs)C+bX (r⡂j>] IDATZ%P+8 T+QYVse}:gQ޾~HoOvŪAZtBeeei{rPl֭TDXqTV^n\avՁzՊUQ8VY@JLLtY)N \mܪdO)̒aKQfHժoU``p΢X iڼ(}f05m\6[7z\+WYdeddtz:Nl6((VBy?:r䰚7o!__Rwjj6nܠ*Uq&2_.xy:PRԲeK)%%TmԤIYg@e=Q #==MN%,!ǝN,Rfffmz>wy:Pwbd%T(ey:Bz>wX LY/*܇b%T(e}ࢲ(VBR֧Y+ \TSFVJ2W#ޠ7PJvW߫tS5O7 >s.۩7G+AolőRuЯ_$`EDTѽ>BpkNܼJMUm|<l6%$Wr!Q,˒ajJBBϸ08Tkn}+LwNUSX%ۯwntwNb7]qzfIuM/-7Yq(T*,.hu5Z f'3@aQo@d;V]Rm~[Ǔ⠪]SQ 3^^ݥ:5߿.#ɾY_6O듃ݶj Zhz<ذWw<}{5$קWjUd@ctcߞPDrr-4MY|Pf[?p@M>]aٗeY.ܨڵ{խ'ӛWڵ{Cϒۓ qj'X>w*zKdKK5Uria~}RΚ~H?s~ޯi"uwJz.:nM˛AZRޚ'I>/sZnZؤsnVsެo5[xEѨQ$)oT  ӧf+8=F]?o6Q,7&#CҶ;4#K\r|}"IMMƍ szf|_{gM2`f^ 2uhvhځx~(vZ?{ǂmc:]Z$Ֆ+)]H,Z$K>W TL}~~Ȑ_t>f ]~L!'kS >Y&߉9,Ҥ 'pW'HɈJ#RZ^$I^^ުQ[`ÇԦM)%%-6MM4X 7pH>Gk }Uլ_G#N]5#QKщ_w >z]M)N7"gc7o5i&I7rOXN6T5-ՁE}Ej[8[թ#i ^e۝+yʔj;аs-^ՍяQIk%MwWEc[~&ٕO9`)## $׋-t*11rJ9,k"0tf1LVV=KYYr:-=t^La8s.VhwuOj{^%ۛMԥPҕ /]9)[WIs֤٢V Iڤ}jꊻ&h{&|4}2iZz/h>j_~&sLy\ҮUhΏOKeIR?<6$u|w6!uoM_S5Ukd&O|VJRi|+Ñ 9. > cXg2˙:z\}~g/^ z4öm[գG|ו|Jz4) Y󇢢x4Զ[nݶm 9+)~ߣP nPwg2[+b]`rOWVcCz1PY]ܶ6٫-ɿnTjŹŲLOG(TY]| +Vj6RX#Kmw87je=m۷kҔi YS륦4MM{g5j//gܯ|DEڞ=4c{ZaZhvZ U?2Mu} P(VBbeZY8OsުiȫTJѿ~wK3\viUU6IVuT]ukHlG ߕB땙դ>@X ;cΞx^MBsG:G:n Ӥ)okNm*2P^ :gehmnt,~2A.}u\U5,S;|QW#OԅLiƎ'}Y7En1ӵG4V>(dYm߻iVcK}0&YYHϔin*OFO( +<,P'і3eY:ٱI?)?V{B3CtYj$KPGA QOֻ89\IS\G.@I*b[3+SN]df)#3KTx#Y (cL;ᆵU?,ݮyZlջ~,˲毵:ȈZfmJ$w wT%;rI7|$LqڝݠoN̲)m^9X뚵օ.Q`ietʙ۠>GP!ijYa*IWO+~)HR$i=75=P5kڤtڻhQtȑc ;q8I! Q%]3zBaL=}G?eZm=azAEmVR}TB(45mB%IJIҝz$ͦnY3H^v³޷eYE$I%)..N tPR̓txaxV.X Jy)1)CPJ ֕= ։ZtEnLeB,`d% ,KP˖[֥SGv͒G:z$ڞ=t5=%IU*W{}Z"/񶅵]wRںNZ8z^ Kwtnڴu\lx~VjL\UVGՊΟuC?TJY{AP|}Ҽv餻Cq|ڳujkuБeZа޿iE->2M:yJyBgՋ KezY8Z9W Gd W+Ջ7GL+b[_vk|Y-\x\]| 3,>-p 1 11p֬CQQ msHRtIJ8^=amj5hаN){*fUk+ܯ駬1d Vh|dL9taO!ݐeURR"uJ*WUHlf?> m?/pY (C_/\K/noB%Ij֤^5B_ooܤ֫U%Ә_{R\hv`ofɑvDҎ.MIӔTpB,JPʡ JJ@pMg"Eկ!>TgvP(VBa6oG{p8Ju>>>Y3LM6f+ͲLOGPalݺEG&/_;55E7n֭[ԸqrY Paǩe˖JKKSJJJfI&Zz>pnX PadR߷eY,MYmIp?PxMڔ|eY;G*>\yYKNCvgn9y{{>7f/Tei: X LY/*;TRMW*USv8o>UV6UTӞ={TZub'==M (TH+B)|="""eff꾽TrUGئVpۗSYYYUݺ(TH+B)Ӭ|= Pddd-jm{ gnz:Ycd%T(e}䢲={VrrLӔBs(\Yim<;5h7Yg*?tQY('CQA^p"*?EEDQp @^QQąK6YhJr~֦'i~߯WMOe1P)>=ڵ#:’5T#3m~U: _^|!m8y-8ߡ]luUaX,_Zii]Vo$:xB0`]vlݺDDDDDDD$8X/jT d1glke>};mCb+||sߦ<0]6ӧOm1>a '&Onݺ=* Ђ% j>-V84{+8$P/T7o^׼YT#c)ڽG̴Y\y 1M0=)-OrJ <)"""""""~iR>-X`VNW;'[`Xpkb %gt V-ve.60.ނґ1B C`-5X,\MeaҜ5V21,OǕ1WKo͝ˎnJ)t2rHJSc|BB6qqcD&NVpZ8mڔd'Lq;q',V"""""""J,>|JHX{`X\>-Jpɬ׸+p9n*Q=&tfjŷctuD^;\N7үubϺo-ΰ4=6әvضW -} OᓭDDӤM2fq:QXxqÇgX,o0 ?Ҙ0y U˖o*ӂ% F>Flg6 wZ\'5e =Fj[:S#skgON-F9ٙE;.Z4c?VoJW+[z M}WbFq_gQp(ynG$!!ɓ',+PiĈ,Xvұcǘ0y*v-yg`t: }`,lLKX!+p;f7Z$""""""|]O`bQ=^}*Ξјkmd9zu;,>MX}JagQ `Cka۷%K\^J=qHNIM\t3fp߃cپcOxsfy=0c'ؽgqGՑFE$߿ *+1:[ IDAT`0q&0J?^ǧJ% a\ ,?z'`q8(ҊZubg.X7 RT:… ॗ^r,o}D|))4e̼?B ~N'V+̚9;G˾DF=[jْfby 6⬛2iнW>Z$""""RX /"t{Onȡ՝/yq"__y?xQ'a}|a7ۊ>7ɣo|7+H8,=:Ob+|oGgPV$XX,̙PS"Ҏ/p2݆H(?n'##Gбcl9f^zԮ]M$22V`IDDDD$Y  _BĊi۶_?[4h}|hR"""""0 v;$''ѨQcԩaH1=Jjj MPZ5´XIDDDD J".DDDDDUrssHvmfZڵ\"##1 CDDDDD-V苁}|""""",4pG.`Y 9NGDDDDD*+IH16W^ `߾}>|Q N:4o2JMLMLM=uqO]Ba'? 6NQ~W~<{b&fjJ=\gjڸ.fUС^$DXVZu vdРn/ KII.vGnn]t%22̷'2?Yf⨉.Y4q8dggFRR"=z,QHEZbbb]6l6?Tϖ'5qO]LM\+LmVUNy 51S351S351S=u1S);p0iHS:Tp|BF6%eQ"_ک_ aE*ReFBg=u1S35q3LmSD$d6g۶-4hАJvVV&))ɴku}|V}zMMLMLM=uqO]DDDPIBUeFBg=u1S35q3LmSD$dlaן~{(n[U:DLMLMLMSLMDDDG"eǑ.fjb&Õzx6{bVhThb% eYǰX,<9%LMLMLMSLMD$tu~^aT*"Fg=u1S35q3LmS}`,`;wf]AX~}YLMLMLMSLMDDDʗaG~"5SLMĕzR3qO]̂$"—;yщ4!==GLRR2bLMLMLMSLMDDDD$.fjb&Õzx6{bVh]i˾DyikHE #+a`=oE.E`Y5cWpʶצ^ oHg=u1S35q3LmSPibD$4Qݷ/a=}8}V_o{➺HT^LҺݩ uɯ?n$c+/3{̸.w:?dBD}g-ܯaq۱p8󮓷g^ߦf O%7'Ķi p6(H~LMS351SWJ=v#;Y֧\n.7ė?r+P"^4%l]@>O{l[&|Srռ \V+^}c9?nKuhު-oZZX;z>o=?wq֐g^Ν7CL9rIZ>\G o؊S/SSڙY]tIa+~4?]8Jqfj➺RWx6YUjJ2n±ciu9DFFUO௿d-t~*%q8Q:c|g)NMd7}BzFq9 &fjb&fjb&fj➺.fj"R$ ^Եءб8m\ײY{Ť9 xmB?jV}A5psfP9nn8S^p#9m -:Nn''` iƾikTN Lk ޚ.6Hb"4jm7$  ī} ;z6\vI"t'sI#JGֱb4Fq[d'o-X07gqC_^u5M\rpzڶMڡC /cc14Ӓ{g_sÿӮ÷1dFя'\k9['-[2jwo$ܖޛ?5auZ߹}H#Ѵ9N[k^ZG{&[y&w|ƏO0}[XX+5S"Rg2{8=e}ξ&œڝXb[5l fnb閛fgv&n*ps綖\t"3 dLm3q@Aryk>Gz/:6nԠYpfg{-Q f%d84'/57vg`m|otMAfA2ÑȰ%e˻Zoۑø5 ɱb(aZ(/4.fjb&Õzx6{bVhLiFFaiܨ͛7_f{փ{/1YCn*zJMLMLM=uqO]DY"U> N~ڠA#F<[g|M*8y{˯aVdds ԇto1zJC\zG<;66wəgfyѬz9Oiݵ^ric=kKl,|r@N'N~z *f>fLj}(ojb&fjb&fjb&{b&"~P]bÇFkMdu+kI~랶{3KrŽoyΣu~,n;(=+$7]˩f 6[GgSp~oڎ(IDaS3I5qk_͈*)0dJ[& #)$1G ~J[uMuLOw Csp?jj%FQK̈S\Et4`wK.Yu솅0"VL Y8Kڇ`fj➺RWx6YUjJR}|ɗ}=)ۗCrŷbpX4EҎU>51S351S351S=u1S?0p8-ջp+9$Y}-i]=u?|zpɍ=ipۺV wnhK۶ j^EńNyW:?^ v9o_$|q #(ya|;+]I9rBaSmcŝKyc<ҧD]L:Srs;'7wbr#7w=#G0#GerQޒD.isэU`.?_(<~qt+yĕϚ{b&fjJ=\gjڸ.fU+I ɝ@_433̂ϟ{z:撜T51S351S351S=u1S fdq45N$XYgRyשېFx}qwֱ-|:rv,pUm'x*z$Wvo}:\seAlMN/N m7k y= \_ĸmnlwb?z=s?}jIEGXsy@$hb%#=-, :6?$tm|r864%|,4hED;;y2^̈ĥr֍5)yέܿ=u4ׇͬXHnhP n'v@ 'o7L5}R}y-3mَ\scF.y72k}waENw }.f7UUz?k&+pgj㞺U&Z$!%v}|,m)))8&fjb&fjb&fj➺.fj"R?Ii\&=5^g^s>>_^Sp@:MaCZ\O'x +ڟ5C{'rX>-dbلOuqedžC}.RNDӦ+GK `Qغ_Qc87iNas^!6q=`zH~ON܏WBioCsS1f^f.xA]K9Ă۰~ ]1mgC%Wy$ hSi a?kO;gAyH>f }i4Ùa@5e'׊W>cCy<Ȣi̋\2\j7,`x0e8y@7oNƑ]>Dj~LMS351SWJ=T[jb&fjb&fjb&{b&"""KpLMS351SWJ=a '&OnݺPajeNXLMLMLMSLMDDDKKz=Ϛ{b&fjJ=\gjڸ.fUOeEsh*65h@HBy|͛KIK;ƄSص{>6i ` b4a{`iyk޽{iР!ѕ{ܵLRRmQ-{➺UT5SLMĕzR3qO]̪ZR.V:K>`+9gĵ83yח]IW!祌yb2V0HY&<7`nZwDm]4pWsYc˯O2i &TƯ }^ɰռ7oo'1agߴKnf_Kܽ0]ݙ4hw<:IW1:7s?S2>awYR ,Ot:XxqpHK;)޳6qql߱S1-aR8M?GSRh1iRS_ͭmGDDҲe+5kV-{➺UT5SLMĕzR3qO]̪Zš^Tod/-e΍]~u.c:ЩE5nLMry\oM>/k`]=Eց%\혀^>ʊ."wբy|2a;X?¯=IwuZDZvqNϩV¾f;Y|;;܌=NiMXfK\t>2yշ<ޔ?[t՜VoL}g}/J+$$${n-Zb1Qi,\ZXNr1&Lʮ{hղ%/<7ʽ;h˴>adРe_xx8A(:9?(${u["""""pMZZIIC /i$\KǘjORSShԨqæL|³V_ew6n 0"tpAvV֯Xj׮Mdd$6"""""Χ#+ŜuG3ÛײMrS?Ҭa0"#8͸eˣֳ>x}lwp5b;Ӷ5e-}A!~زOyӞ1ijg"k8vM%^l'l?{^ IغG,'zTZkhz{xs|ng>%<|u -!!ɓ'`XX,.GT1b ,(q d33 ,Op8܎fM)N}'""""""s㫱)+H=np|Ҫz:2ҪװQz85/ե0")PO!"""""7aO~v#;1h>>a=f{OޔTR^-M`xd̍oJ܃Q%uZ7@dK!~3d`RCڴ;VT~~MJࡎmI^x1w-=w:2Dmd5W|{o=4/_ (u67/nѣ8Aѥ%8:\1|v;Kܫ`dXXp!K. >B/9%f̚YhjY3gp{ٗX!c(I8f?`;hղ%x4nf1NՀ: HZmS/* O9ګC:D;7R>zB ##kQtt3SDZh^eѲ8 tI][vE֋}lk2"|wh.VKs(X4|p.\XJh58-VJCNqa2c&ah0h8L?/bBKLwLk|}4)p8&--Dz!֯Xj׮Mdd$6C ӑD] 񉈈T$-V苁}|""""""""Ry `߾}>|ሔ0ԩC-X,-VbNX>srOy}75x7FyW12,[-w'5=z;q7qٱDڧherv_ߤեwTh_>wVdUkHZ } |O~a]s[,%,$ۋSeLn_3g`~ &݄J5Çi֗){3  Xȶ3X0EBd7YulZ-sƐ87Wg+ϛ}mOˍw^M^%Tx{ 6z{C&?x &"""ݞg&22)7'Nd_Hfv}o\ۚ'/cN)7[ ;7ۥM4[TsA OsEy37Mٷ¼C*X[a>(/gEsc >e-ʻb7b% )~@_qS KyU3ͲWdcv;N|OWPlZ%ONHƜ(_^5_LGw+2O y{埏1~>_u-]Ւ9l2sVqtAVV4@ԡ^҆WYJ<^E(ffнZg#MepؑCYY}9wqC >`3+s&d>sS1Ghkז0t?w+] 싽_k/Ͻ!֧&>z9rݻIFF#RnV+;v_~.J>[%ڼwtbU&~)ϼ 3[T(o>7[󲥟 RB2[T)آBe~6QHU苁}|elO-5'О r_֑tX1l.־KrvozR yv/]ڋ(֭i_=a~d\\#od-g/~юN{W+U6^Ï/#ߘ.Ά h,X?2hVG~Q oBjW1Sl$Ξ~gGKsg`wixNzC6\x7Nӵo\k5a3]⬤޾in~]ʯ^?y >4yǞ7߬T>bpxx5hذ!o𳰰0i&^Irssp8 NNB0 v{ܠV6/]7E !~)ϼ?[T(o>7[ y lic -*y>Й ax @>A"O8Z1ǎ9OV6VZ`wM1'#X°٪S={|ؼlӟgγ33XJYYEU89jy*7G:*pd>\Ƴ/ڰZ_V{ٽBfM }1SĢꏻOX\gKscO}i^L:쪸ymrKz5 >>NS5J;[T~cR&URX?27|@(͖}B}n֋ yR l6[T)|lQ!4?JR #3W!I$"]| o%u:j&s[<ʇMg?7M>_ϔYuy`ąem_9*t.ز5S 9;fzhkN7Y86ֺJvv6DXq;Agu։ &>k,<._HRn3{vmX #6ujs7FBR.$%5!11FPо9ƊR_Mq?{/!~{[ $9Ǟo>#":tk 曯b%-:ujsE(-R.|]tsmh mᖧ'1o|i-oMyif/'>7e-ԏ@jG$dDDDpرZbt,}|# +V?~[h{~5漻/WZ{zE}X?߿B<ЫzN3M٘\F.4d3oPR}~{^\ǝȐ㶳Mr٬n5x^6_a/`Eø󆾴(&^I߭dMvOƜ|ap}.NHhG t ̋Į_xR۠!?CPqUN8t 6T%_{d1>N &"UUnn.QQՂbAac{(^Zmz=h 6>͵$i3GS+'G49 /~|72ZU]r{,؄l˞JbiM#+[?{,1nV/zOͤ\[ H43᮹}SZ zѤa-l_ WgQ=!}Q}'Ч f%sqBG$=n}ӟev\3FN{h ~u`?f [gBM)Ufo{*sBH XEt̵wt+r yO[\lQ~CwIUx3,ħB| &U$?yK4 ҬF*<"F0oh3^Y<79Η>71ib教<31rz;:PR}.BD<6ɿ`ĥcFO)\uUo+؛>OrZq8Ad}^& fv6>d'׾`ݧ'=؛þ7` $ $z m\.?9ԯsAoѠt(ҎAB)s/PcPj"""RAN6رGD]4\-q.(/~ .7"o~-l5u>o+ >U<+IȰׯ?P ,JOu(0ZCe>ˑ7s c^DcOG7ϙ|pMN?݌sͶNJR}!GȅՆב#@Vkrb;'zq /bДwcZ `Ir1^iFxMN6XžA\Ү< ={VD֦?8ckKV'I[rv"v܃4.Mksٞ{Cw1?Jm"""""Aǹ6[38϶%/C/7=?y.(u_T P﴾[~2ؚssݣ|aſ|m~6T]>o)s7@nЋE$9t7'IM쩩"1۬}{*Il׹\;!%vJz5[n .6J6 O| &0_dMsonzx3=Jܿc]s w< l5򨊽>SϿ!֧5pYIDQ:Λ GEf23O^VF k!c'A}Ѧ) kXH+}c{rxƻt ##D׭aDW hb8O IDAT<$qiԱu|Ҟ,ݦzeY,\+?-jdR. &2rٜC۰WJѵ4M|ף߬[<گnٷ=(~8zl{!RRٻʴ)ABJ"*bAQPb{A, V׊VcWDQ,tHOBzfy$gR I)&g2srF=͏>;u|s7GuS4m|y}{Ɯ۶{̦lҏv8{3i5^όxG?dWzUD%ϰ9£Hm XxY'u]7gVxnl Fsj>Gz#("~r♜{`<=xOOcC۰0RHg`n_ >5ؐHܗ'٣Z'SgAy~PM{opœ=~^#Xw|㦋hAO\eøk80 ‡1ɽywM"%v{\w~6|riC&]Eif҆k)kK`+vLZt-s6ۙ򨣹3iuNE˯ YVZ}}d ߻tew6)93DBmelkmpV*o`}q>e@P _3k|3%N=\Hů|YVQe+:tp_~3\L|ro}2' f6ts|vF_ڿ; Skg|}g)pQj3(EmiNK[2?/-zfBvLZA.m6i2iѱy9iNN_LZqe-&g g;EFmKW.b_vzlsmg}*#3'3i1nJb.IZ$5%cm%eu=|(=zݛrf] d}il ozu.vkz9찱.ڸis>"Xٯq"6ZMvi}O&$ag#:/˓5OJl< כ׭K4holM擞zb60mvNF%f6R΢ԙ<Vݯ zV^y"qg㗹8wp@M/ !VJAa={ҟKIHH$""GU'"""""ޢDDDDDDDKe+kYz2OOnQio%f럐Nk.eB`TkO&_p bv,ԋ#N:-7H#ZK|1&Q^P\ʊVc=opÁ@5+.N妼p3/("""""jV/ˠ}򝹼|H}T>s+#2?)pvcӹH'Β1} ^l_v j=xMKm͟ !r3bu^7U%#G^yn, G^R'qລ' ?B<.Az$ݣE՗sI?35$/6Έ/brJ$7z8?~N3=neL{/~WN8ӱ=g4(y<ͪ $YDfZݚctWYa3Q {=&r#|ô˾ٵ\Lq2;gykqFEF:$Mmqb}\7M^420L0sHHۗcﲽ#B9ZMsf2~iwXܙO@HOg?/i79:J66Bh/"""""htd"^%`s?~E_ŇqE\КTg>_]<›އ# @8 J**jgsձ;jJI ?rȽ/ 0sv-r“cF 1񟷲9·9vpgG=Eil,ϨC/H$7-XmTUcF-{y,0Q$$~[s)J(+)"X0ѓiTS2%0عcf0Բ&ޟޗqAWbd(nC쿺 ;Fe9oN.L˸Ta7sђSxcI&z6h?[_èw_37]0\TV̾*y?pk\;6j/8oI+h19՟j7Ğ|E?I٩7Zl2 B7vw2Czp/ ˿$"""""""e У`QE6?̟ͬg1ozUB c52O $z&²L ի@I %weӢoXmg\ʑTf-Ʀ2f7uj&=˭+GĉGG_ƪ#91;$OGpv# MϠXef ۽;PPsgP/8vvٜGjqFDJOXi6:"o|KV#yp&5SSF3\UT,QdڕwSo{tc5qݸk&Mwgu^j*&` $4(Ԍ&n>ddW;fs*Jg廊lW&۫wY/Ƴi1ՌUNT%唙&fO,ZC8_` ]oՙp`j# ڰ@@@{=~B)?nm[zz=|tL8O䙮7p-Y&,0\u;7?o~O#9bX{ iCbƁL꽣l|_Ff%7h|EX/i@F767ɓ؃Ĵ8aZWrJ1pU== 򵡵I!Ї6bג6 l+f\4k7}očʊ3ٹ妲i14sٰC[^eӯf3\;?%C4F?5+If)FW2ktnfv[/,%q>QUBI5tk "`g#H?YʄVl&qY1gx{a$i?զx&sc/ނVV C|r.D &4g9ԋy\6l  v+ᄓGKѬ0r(KYb8,*e/#+z^~a83K {߾/^L#v4Լ^lYnĄS歹zEe.OfȞ ʳ 3y6jb?HoO|l ?&3Iey<yQYr >4͝5ެTk 3K^|Gġ4_x4սϤ'~RsڏAT]${s _""""""mf%2+J nvoUU2^H3=~ _5}K~q51 tf2!uf% vdϬ1cz1i<5f*|d>:W^ν 8n>Q^u†rwqlw<8F o_"o %P9ySnc[!:eLϾOmnCPM8|ޚ=oAb9wXn}؞#~܂ra 8zNndd`%a᜝r .7itB_mR2>c \q)!xCx뼟S#<~s #pn+-{!`&r"Cƨ/dЌ׹ֿw, |g-&3cT仹q=7lq ͫl[?G]='䛐A W}؍{q3>ΣAbQ9 Ӂ/Z;I"FWwm#n1185m` S}5U*R}~&iRY+o>ra wĝ8# 1 EDDDDDf6՝ZDvk7{afշȒDDDDDڅ"rr>|Kv'd4\=ۥzu>|o*o*6eXNN^R˗/o_h &<<?vLWu%lp "*<r=s+?ؘpmmpEDpN UMei!+1lN# ǁR` +kiNbnTPR G`8A9rP{$Elݹ]$i]}N@X!9LU5\t,/sdMb in?곇#9T~HxD8A~86p,/lV]nMo˗/%!!p84񜈈HWKa}>OyVdiˬ.pkiWncszYEuuQ^OyVf5򨿷"]\M)ݖKEWy![ =XCd4C"[HsrSQ]41P;eZ in?sl&n^fOL2ZriԬ$]_.~^~D9g"}y6wg䢢b""ۼhd%l#5 *++q.Iv@¼]H8Nnv0>?"xG-}Q+:7WٝJ7/eN6xG'""""""Yl6$DGǒAll.GTTKbbOo"""""">UJ$?]FG켯% KmƦ >fL3 K- !>YHOEE|];og""""""""zH`\VX,))HJJv)"""""ڷY1A&Y|=+yr^&̸;d.3xFۙD?r(Hr@%Vmil. IU>Iad8Dp|XWEA\qY2'lMmL:8A&Ɠ4Pw7 ՝cըhp-QTT]SNTo=f0cpMIуl:cu呔EDDDDDDDd#]HiU#-r8'j뷺H ?gPzV_IDT{Eqcw'e永Mx}7l$$+s*;aRe,Kӿg(&&H߱j\ dQf͠HJ{9-̏Ǿ[Q󿊘(EJYNZz:RRxl8vt o{e{u3Or7{aO>63Q~fIIy$S&VJX)+ebL,2F0kN*L1;{/{J* eLֵܿC17(+a IDATGsI?m6/׎ y:}~b J{{#sP gԌdFvξgSZMa̝3kg]S{RKnu8KdYwFFFx!Ӕ2R&VJX)ϔgJHgV3bLI}ʣ>8e8erꌙYi n.θzdm狢 jZ׬88mp$ 2@du SrnDGԔ; uU%;zA4R~޷TgmiTjE7q7yyIMeYacfqͷ~n^=xˋhnO`u *\.]JX)+ebL2Lx\tfz?kL9iBwF[點 o-K(^y%%J~Gdzj呔k~Ʞa`gqŵS3E4sj֭@n_nJU[+!] nM؃?Lg:'2\E{18pm9jl?(fl%TyzsPR#I,̛[vĨY3_oٰ;J-hvٲ%cÏn7yp8dݨni\w\n>2Lˍ$"""""""""""""""]_Hⱁ -Br(Eg.H QocRRoDESwULx8994{#N";̤cf>ͫ_R`rw I= ڹwcaplI?V}2Z쮺 K~nfGKr嶭FY4ytLl6nwFTL$33m۶v]Hq:DFF"""""7kURPX_c"_|a8w="O!9Fq@`.>2GqtHg5KbMBW,afleƏ.BRB02W;MX~]@M ~f؄ `#!1Ta1Pjtnyξ JmnNڅ XjT0 o """"">JJҥoDDDDDDDDcm""""""J<ݳ;/z}""""""""tHDDDDDD.YI_oDDDDDDDDcrmԬ$]a_ODDDDDDDD:&""""""{5+IbKh'"""""""""""""""'YI  [ˈ m// }>xYIDDDDDD6jV.#&yKNrw1)]a'Y6b{1l$Ν8kau~]@VS'SgAy~@%+~%+""""""GJe?Mkrܯ(};NK/zz}""""""""|yd% e5K6T}+?9Irh RlManx/XDž 3p$7xaR4C]rOv,j=xMKwy?ؘS@y@ ObP."-oM 2Cnj6g~8n;,i gݭ\DDDDDD:FVY hVfv/[Ɠ`0xow}”0AƏ/CC2)i79:J66Bhw0Muϼh/^ŋ'oVSYQXoz7 Or~jͿ.ͯpUq0 yOCvN?{ vl>j.CŦYK?/nCfMAsN?a&;]\:;3iγ??Xl\GGdx LSˉHf%X̣/oG 'M}kR^a312o9Unx\Xɤl2 B7vw2Czp/ ͬ ;Fe9v-aT;m8j{-'.kQ^meܙ-iM(1|Nj-1360ͭҰw= 8bַp<&]1P^(/R6}*vkTD&VaF,{/g9I 5ƨ A  $#)Ng廊*W,ibb\oscI}.*f7?d:r J^Y9 ׎m\k5q[ռ|\e31kdiDDDDDDDDDDnJsr;K}gF $NxCnfamesѷ_͢gv~8oK5nU5].\=hqQY(DMx|=Ҏ͇*;Wqܛ %|ѧ?SV=_'wLb֢?`h뚦 UUTM7Xj$:԰,$KcQͺAm0ͨ[}җCZ"81aUn&6}~6#olȩ8^Jyv-sdž}gGDDDDD)vo """""""""2w4an㒱N~~VLLw2.KWx_X_Ķ̿XUfbVo}?װ~~|Eb؛[4푈ߦhY6Qb4QY\rr +jq s鿏X%i;f31pL%eX,N1 ;ZϼY`˺UdSiGkym SKزRJ˪0Z)~vL%"""""J"unMdd_fp8(,,WޤpxL2R&VJx\8e8er*YI^Đ!C0 Ç@8/_QG)QJKʖ-9㌳l&j7֭;Æ2;2R&VJX)+erL4.WᅻwjVh򥤦v{ߎƪYmذNJ>J{믿s9>m'==劈t i&:M|>x\DZOM}ʣqʦq3b2Qt) o_yј%eǍҥKZY(+ebL2R&)ϔK-e~3y?H*++1 0 I8D.+WxlX|$={xv=)3yShiLXuLԬ$]9991j/ĥ᯿VSUޥL2R&VJx\Ey2R&VJX)+erLXuEDD|vaWp2Mk\>x\JyShiLXuLԬ$"#hvW0wFX)+ebL2Lx\ X222#88刴rrILR4rcLyShiLXuLԬ$]\uPm+ !!pm[!!Tw)+ebL2R&)ϔUW^XDDė͹Xjo#nHI״sg3?Vd7)))ϔUW̤UJ07?cU6Fd"})C%;L9^K";;NvvqqqTw)+ebL2R&)ϔUW^XDDė#]Hi3bJԧ>8e8erꊙ[X)Kg0ze>ݢpm^OӵI|Cm'{[nE6d}qII)dffP^^(//'-m=zxYAX)+ebL2Lx\7)))ϔUW̤EJ?Ogs?.3Edn̢h{>k~i"zs/.KKLL7`5 T}!ݰa=$&vebL2R&V3r^94""""ɡGD ܭ[jj }8B{}LxJ>8e8erꊙ8N:%VDqq7`94CCg[o$?w8ᤱp,Y-\MuTYdm\ N4Ƙ?GHsdʹ 2_[>M2s\d  { {}m&唧Q@>(_?RN賙O/j{ a֮ωѺukkQ\\M'-=^))}d'gɯKٸi,]G0?3N9:G1!jh[tFEE97v;Ծn:'6 MEE۶m#++e~{ Lpp#)+ebL2R&)ϔK}AA^ ??bcclu>ڵkbĈQ8=Ti MUUat: ڣݳ}{1UUUǖݵ~:wO 4t$';;kʼK{aVW ` IDAT>￯ ##BBB0L\*ͦaÆӭ[2(:8(88 FmqE7VSBiCZZ&QJ 'FҤs]"=yr{#?Fd+l<#(2iY)qF)rߊr9$9v9$} lZw(OIe˚W*~TI[}筊Ezc8PDPhOl6ja ?Cf4k42m/(Ku̞Qװq$gzj*11QJIIhiWJ~u-rYamM@A&FdbD&FdbD&FdG.uÕ-IZdhED+$$TNS55TYY٣JMjIfYaaaPmmbckNm۶UvMj@f+SPXXOVVJMMʕڼysZMUUU4xpC&qEgdC&M7+?2v%:-%mT=6<)G݇ Q&ar|[L2h.*۴5yG.I$uiuTU%)yGh]-߰Xgi#?LY=h… nk׮b ?v]fSoY,htju?֮Lv;&IVUVUYcKsXbcc\G.KpJ!!! Tee,PYu5󕗷^C S||Y,fosN-_L9JK᭢nɒչs|٦n[]L&XQ G{Y^d2bf~hhU[[+)kJbRAA"##PTxuZ6M۷oQYiUB>9ڲe"[>.]\aۊTLL֣%DUU""qPQ\\gdӀ,Ji 7*foz[XX+!!Q+V,fkr{#Ubb6-iȐJHHTRRRDرc֮]c8NJJ۽{uA+lg%$&õm@cD&4+/L[,66Vኋrh{?/5lףGOmז{TZ%B#]ſO z ֩^%R۶mQN΀v yG.3i@ge[c q Go_?>-W=^FF W)җUcuz" 2\եKp~KD-YH6UQQpmR[kׁe***T^^~G'Ֆi͛\ZiFUUU)55葇{<<#d4m@q J*N%4*:a{–uտ@ Īk׮-@5tVH=rqEMlm@q CJbK:&IݻPi>-_U⥦vWZZw>/!yxF6 3^Ь@^xKJIIhiWJ~u-rYaArCxd"egg+))YQQъWHHNjjjU]]2ٳG˕=œrqEMl4+!8 7%<#W4 @Y AtFz}b[9z}b[_Y Acu*--j ok8PUVjuiJ;4h UTTMm6e˖zl |f% N96nTuu1^]Mhjc>_be%J2 J*pQK4+!6k^/]T}@WEd2=Cڢ^n'Ս.1d2M}ڇO}\JTh*͛}Rg?ZisKЕ}GrQII$)66[ZԬ4菟ꧻ㟼z3tZ>&>SRRL<8tQtndukz4+N?5*mٚm۷?={j.o7Kt'j߾F5KV/yYi2d#/Kt땒do=xf>{ 8b;%(s$L2~a]0"]]z{tth%%232m 4ycԔ)SQ_wͦT?Tr-jVyROL~5q~s U֩WjL˥LW^yN!Iz:롷V5rnXO^|aM˧jd}ª#٩%h*H%%%zښ9)=4|7^yyuYߞJ]hQRdJ? 2䰟Jn֙{u|qCo̙FHZyX4/3ZEv/T[?EMF=v-RѾ\MВWzGek]sΐIu K Gw6n]ݢ !-<菟ꧻӽZ@e.IkATns8$Ydj]=hfSfFfϘ&.qhӦIhMڴ>nG$mw[7@kQ/"f1c?8P̊l6ja ?Cf4k42m/(Ku̞Qװq$gzn@f*UUIjTBI>Bjڐ#hGS/Yi~.#D[|_+IvKzqʉء~OS"-/T?|Mp&S=)ApW֪Z55UY}ԬmΟS!F zGR?qfNGn17=7;Q:\s EM}v;+YJ@{JJ* J*N%4*%T}@hVBP f@hVBPq8(%TNKhTK4+!hnlV^]-ݵm6tOEoUJJZXY A#++K6[VX6vxxVvv1^Ѭah̘3fKq+5&XY @@ lMfs5LĈLĈL=rq\=rq\\+p\\gdӀ,<##21"ňLy"3q\c&)SLwGyy__?};tc483ɯ21"#21"#21"=r1"=rqE=rqEMlĈL##21"W<<#=r1jNE6[KAt 4+h4+h4+h4+h!.ákר`jkkaaa5Y 05t֮]}jZkժvY_= ++!hРATQQ6lVNN-[(54*++d;pv]NSz}fw7ڎf |TNKhTK4+!z3P;4+!E^/Ѭ۬z}dw:VVBP 6(UEZS{k"a+21"#21"#21"=ri=7?kWsuɰ}6NUhɊM*ܽWevbҰ+AMl]U6pwW[չ2ОԹ4)Qo}QϼJ'51dB+lgdCx4LjL$q<<#=r1 L,SLcG>xkzU?P'fua@֫kdְsMYY} ꕗZ'ZPYAڿqQJTE{\뭵dbD&FdbD&FdbD&{Ҵ*V}OYU&FwlJrMрMZZiiYYJRN;YQZdʓ(A5QmVBJilpȄ<#W4 Ȇm=riHxF6Qpf̕ʵdOksƩt{ݨq|Z',GrQII$)6wG(\%t%'i`'dubR?MuVpG.K3kgs"ld­$kTpGw?D ;c#I]dm餴n \$V;}c&G&"ȦYxF6xv{#&p 3l#`ͤYR?Oo6׵/m\ZruSDLyDM~X{w9AʡuyJRN27ͤmyU21"#21"#21"=ri:5\&wl}8]xU:J6G2dBBC=--:aT5vgB+lgdSm\c3qEgdo&hVg*XH%lՇ Ng+Sj|m۾]~ٳUsy^~?Q4Zޮ^|B%5E='߯^== #21"#21"#2q\#k6iaJJTu)Ӯb-FԢ4zz6b}&"ȦYxF6pxJCe}<<#=r1 LnV*AJ!g7lbp(EC~W-. W.}Kpׯש~Jrnբw̓ג&_>UcO'VNuCokkܙ𱞼TRi_uYJy&$GBbnos'#e)[&gVm#}ئZ;{/vCF)GDo&"ȦYxF6똯xTǼ2qEgdo&!M[}T3aN_5iU彠sޮ?@O/QNG_i##(x^'OԂpMxg\E?{ӟp\yCҟP?>5CkYz❇o רǿֻV.E§u;2.IښNf,%*޽O>rXkkĈLĈLĈL#pN>Gjt]+&3٩_|mCt5t0eӲ+f.KkOd4)M˕FEߋ8*̫tRy&"ȦYxF6Fnk {#z?Fd +l<#(x3iY)qF)ruEyv_,QQnΒ$# UxYRM!!sGI8.&.NI7FN@wN t'oOiOcWKսlslJKMլu ?~fiie^PLS_u Ky7IziO|6hl |[U[nCN== #21"#21"#2q\#ÙCnLpeh&Z3+Vg*oO6-(+(?Oye|ty[YNsz;p\\gdӀ,<##^5=K=#2yxF6{bXL2!)Vx{|o2uq}%,Z{6׮D%[~?^QQҥѱ9vwVW֘dkZr Egw:$OxF_lԱIgw[+suŐ3Ǹuvpi=ǙZ'N]3^բbݬ95Gu}ջwﺟndrioiҩ^ }ʼn: j {s6;+!!Yc]<m[ɩkRz߿YU>G]ߑu=L-ZD111thURc+//keԒu)rQjTE)wkb;)GdbD&FdbD&FdbD&{(;2XQ%٬jYa!M4WZ5h(uQUUuO":࿛_GewiUmٱ^?JFꄾRmYEJ?yfB+lg=^I\cD&73l#`l־TEK)=k̗m~棽RTw Ջש|__<]њ[Ov[tI*ЌisnXύ⻿ ojke%ϓ ߺLڪyl?Q=&v;A>w 'GdNp,jg|NU9hn:K}nǽ soP{?f<7̝k ֭Ygw{h32Cd2d״zEgjf٭U hbW'%fiĨ~J覩F5qTrtޕ)ZG_3[RSk۶m*//lӟߪv[FVVlBXLmz훭c>_39N8l"h4+h4+h4+h4+h4+h4+h4+h4+h!.ákר`jkkaaa5Y 0fS׮]]FЬ~:he(תU+~:eg|f%4h***T^^ަ6ѲeK=6z}FFeev{_nt@.&45\ь1]/w |f%@o |f%@_(ݮ[h۶ڳgl(22Rճg/bwhVBP m>o+((…?*&&F QbbU[[KiFm޼I5l1#%vff+TmmKunR]JPY @r,xJ[4I:Zt T^PUUL&;i:cUXC}JJj!.;wZ'tp2rڹs]N1N_{}AUFnܥ@[dw+UZZUVVjV^9ԨR]$koԎ;/K\=tv_4*|"""R ΝE.%(5keWvV{fi[4ul{ē]}_X?se@45ًvhǎo9Ԕ!ɤ/\*--  9JxVޚ%dhJz*++)Iz[*);u!<<\zj WuuQV}7i]6ڢ7XwETeX/}*[) ,GZks4Eu1X}BTS]6߬oW P5U77OEejE^v4JbccUיgNL&N;L}g֭,|#@ٯ5_~hc`ګuKi:Jy^skUR_9Ok.P hVYk IeUvm^ ┳5[TF_ߦ>/FUZ2m]%9T<.9},zF/pӊD ]zƿV{0 =ɫOR +))SnwGR\\KP?q>>Q ?˷hKuGXØ2?Ч6koHrX_wRB%@snfM3F_NXHzLo2@un{Pf]5R9zv?Oa:wQn)->t*9Ez<)(\%t%'i`'dubR?MuVW5m1fEDDg뢁cwy$!)^}--E͑j:tNRdvY[vSbqVhFӴV~ɬı ֤wi;BtIhE%%zڲ5_cS|ӰνRuKNִqRMlݷYص⋯ux9)QkztpwT+Ф r@^p5ό˧kםKF믏$*ʷO g]Ȕ^9ZS7oY Vs(]RUN27m۬>9nO7aaa/\棫:$I o ӑ1uSgSeS БvX!n5ٓ.P %9^y(\/{:5;u==EClgt~EMv~Z''6u髹5#)"Q^gYc-M'?fԜ-*覬c]?K/Y|UwZwz?k֔kpI*Ѳԃ/kvȜO.DY4_&WMǗn3?Ԣ-Jv&2)S5?_6iؔ|%\cRSRTc2mulJKMKi䥺uHOm~ЭK~Q5ؓ=8W/M )ԕOOWeFSE SNs[9 / @qucpZt-[h,KYEwrDP&Ikk䦙v~HJJʕoEGG*rsW(99{::O~\#K&/U:WSkKZ׬TS5{X/-~:"Xo^1\ygqgVhɋi4WOYO%:g.֛y>3^{T_NJPZC:=L }JDŽ6^_[gկݲoXWZB+>kӚ*+5f4C/)]pZpH}f5_ W.O]y_nT}I茯c=+A!۔u m۟TZZyT[3=]3?%٬;Gy7)Rs{5qdϜ!G+X t ]252&jPuUe9LEww)Mw)蚕¬r8%cVڶm[+U^~K2Z;w$%%iΝZd**”ص=(]>>I2G1'*wo*ڰY+;oڢcdnI=ޞ,$SXghJ3g>{))>L}gr]z uZ j}%ɦAN umCHԄkԣ?j"W8\/ۤ?/ӦuեɒcL=n \7-ׂoҚz0]7Gw&Iz?4g6Mf뎙Tyz.\+שR;-Pڱi6KuӼ-[~{vLfϘޙ^P<{y}vmV+kLYdYV%|McFMMNQ5r- @g2[N98e2>Z;8N*bxљ:3tɣ4$ݪ_rwZѡAqkN-x>heYiHjvY6>,-vIZ DM% 1/Ipʒ_lCAe+F+,I.2ĺG,.mt[*7wU[tJmՒ;K$uiV~\v5*nfk[s'7v_vH'J[ݻ׵Y3әVHRf]CjEPE62324{49v2tjis=ڸi}a6nx%ЖuGT+I!VR*I#jj䋏2Y,!M{_Q!RTgEy;vܩjtɲZ}8+Ν;f[S {Sc/uhw-lUtxuM1_\9U}#;@~vj3蘔P/>#/AޠgmKbddޘ1A.g%T"4南5ïT=}gV<sKJ$Y.bZQ_#󯟭3S??>4E魢֭olŝr9$9v9TYVk_CTpWlJKMլu ?kplfM[&ޡ~36n$LO׳Ӟ2TxZW_(ᢧuB$itZtZwh7x\zS)t`M%+K|N0L' dS~v~xQ4 v*TL'vCw)og6vkԨ4*͚T IDAT|"""R ׬f#'R,jdV=ba]Z6 "aɍtRkǸjQR#[RNzOs:w|bmHɃNNM{Y?.'{ԹۻI2Id! PD,b-ViֺdeaVú<8Z4?No9UOii)uF 8%^(!+{5`Hgܘ^Gi֯^Сglq\W1L>{|xX0oNN 95Q餰̉ ,zwLsUʩ)W;=?{5K'o0_p=):w|l-Kv?ލHΝ;HO۷!-/0Կ!dAdvso|?Bu^[F}w?3gAeUOZ,9'DDDDDDkX,lѫsf%svZX|S5)hJdm\MmjV8nw; fmx,k+v)ib+ƾXI&07Y!F~p2hZK{k+]TܻrZs0~zw}87 ;.';o4~,dИ?wW0kD`G$XviI.F:MkNx<<5gKOT2^G>&o&|k]Dl> XfKfxp<~g&/ųYm/"""-O ??={v3hP:?޽:(ȹ!(q#cÇ+ 3{p rQ9+~f`!{00#8u 6&#='DDDDDDk*ضwj z&J3+e{NH:0FJrV< ӉtP]s|ca=BN PdJ`~s{Gˇ,3SoCO n`w~ze mlwd{9:I' оI歿OȎuk`XKx翾35|S*o϶s}ulډm2am,^KiN75-!""", e˖DDDd~MMm"3sd'3 ^&x}-'+,͠7rg2Zu:X5mWVDooJHb8ױk6(e"4'3vvV|<"|}YY-^DвeK_3~Ev3 |'zzJ͒ۆ;[8t C#44sjʒ`0F ys.{G5V""">wkFsyR?"f57Hhhg _X,  '  f',,P AAx<46SSSÑ#GD||_ F%Nıcl .Ө`鄇k^QG^fvtKjVn%Л=_ p"""5DDDy&c #88ۃH]jfcZ_DDrC{x~f8n&$$[Rt+DDDD|`0Nbb28|0eUHmm & %>$$$bbZ wts?Cff;[ EODDDf3DFFلd2bsR jVn%Л=HG0 ffYI;=HGRt+DDDDDDDDDDDDDDDD: rb4r}&ODDDDDDDDDDDDDDD@WRTTDmm-S:G\\B'"""""""""""""""4YI4Kټ9N4(k=HG3x<CH(//wirbbb+NDDDDDDDDDDDDDDDDD:DDDDDDDDDDDDDDDDDSYIDDDDDDDDDDDDDDDDD:DDDDDDDDDDDDDDDDDSYIDDDDDDDDDDDDDDDDD:DDDDDDDDDDDDDDDDDS;to.}RT#GPSShGDF$9IIɘL&Gf%0Ŭ_ 6h}Dt:b]ٳMde"11ߑEDD(//(""""""̈́ҳg/bc[2x<CH(//w&6n@q.Ktvq  & Dii 6iii :EDD$UTT!C1-#""""""݌QG~,Pl6xpl߾N.$$;C0]2IjV_CLS .'FYd16[ #;#tQ[;v=EDDDDDDz֬!C;WRn㫯vPUUɸqtuuulݚW_`Р.ײVig!{KeШsUD5%"""TYY %%Ϯv[<䴥 :!H7箢pl_ѦPĥ5n8qfT_8ը9 *}Rj g̮qZDDDDDD:b!_?f ȱQXD*jMCrpbzMg6|:A=ʈy f%6JKK6lNh$==܍gm |mqps* M#G{ >߯?/??=3f]쨊$=>KyEDD֮]Ô)КASXbcc1:0mcmucΛDQv|\~hg3ym[Uդ'm\MFo`6Vhale8.>b\:Gwf]Sζ/7j#W\:p/f%6\. lWekxa'Mcӓ9dhx?W1니vAQƵۙx<Xٿ/v@Js4b+]sCNl%d8ޞa gվ""""""ՄZC'\p+}lq{-{2.65>IH iJjVn@__ۛM;_kkq Q$s⟋蚇,§v!RRRqmr9ILLfϞ=jVi37ww_Ke`z>)CtNym!!!44c6[;*""""""r.;{gGsn`ZvYtAp`4b4f ~W">՚mF!y;=VS@ċHǛm3eLXW7#>c;_mKJ=|?H{8d#yE/<\^] Uzn'<}?qrss|LDDk2HH'**g:j"<6[ CDT=}f f:6c}W㢡_mbKڶ34Öew>p~f \lr/ f%97z3P}T3q$TSt z7Z)'X&g=z6 ;uƷ^'ڟrhKO0vW7?~9#[̉ȹg[?q]vx[HQQQj=PnUokk}߰lTTTC oӆϢwq F I7ެ -ExHXxe{ E{NNhlj<C0A2ñZLdjȋnW ?~x0k/VHE?TK˟Lr5|[`0;g'xh:vȴ_i3fsoYӲ5-DDDʕQRrx@V(%9 j uD=M71kkk}8t cǎSt 65k>Y)q4+&ϺHDzmXpF$oִMZ*(*vw~*'AG<mQ/DMf挍5LxQ.v(MLƇS/Fd&ۋX4&tE3B+9>Oud:=Ͻ/7rDVGsoM}iسg7c0Zݰ{.O蠔"""熠a~ $h`5]Gq0Hɦ8zF%iQ .scE|ZuFSt!9ҦZ7kY;Vl5W]|""""`XHKD>|Ν)++ۅhh4tB>3zfȐjT4M;fwi6-;tCG6}nwnmjֲ* A?[YxbPX7__ħL{/\i*}>{C6n+Μ?]CZ(O?7PSOg0'y!-ˋdGǓmWgɏGsgLg.h, amϷ]Eee>8}ݻ#<%\s(.)g1e$%HsV+f͛(**n%,,nNg#uuJ%33 ͎jw|saEa*6 rrp8GDDDDDDcwnflIixQql&MuC; {pc\$23R)ΊM/S{ٷi's\^GɞE$`.ҷYӘӑכG3.`ÇKչV^^C ᝛p?0eDFo\=Z3=z}yc2pnO|2v*ɄJTTcZxK?Cff;RJ*daev.w9E[ ryL>ϽY}3 jrmү'岁 f݂OU"+X?Wsb;̓cE 5BӉ^<;2s[gFr0E\9Fޫ{,d}~~ xp,|b{| Kp\ga2sd{ w !"""f6&22x&\'M&AA!X,?'Vd#ԛ\q2&&n:2z~`Wz/K`Oa!2n{'1Z:~ss9xa&/h(/e Q4u w}Ƿ~{vqrN}͟;Ԕu]_;S~{|}ODDD# f3DEEEddDDDDDDDDDDD!-OVdtZn~bZGm-nrdz@Ky-Vb,y:dʙmYѫ&5,~bljJW4{Y KN̛CXVOTd% -OVϢ sX;j>5IDATJLJ")/o\ fϢTl `Ì4 ;PFCT:\{' kuol୻q^B;6ĝ|1<.%pȾb8,6T0yMؽ8~vLx ֿ42)xg}2f%V}rQHA%%%ŝbII uZ Z#/22;d2"""""""""""""""" znbٲ EEΞzcNJ#"""""""""""""""T R^'IENDB`easyeffects-4.8.7/images/equalizer2.png000066400000000000000000002414621424023573300201050ustar00rootroot00000000000000PNG  IHDRpsBIT|dtEXtSoftwaregnome-screenshot>*tEXtCreation Timesex 11 Jan 2019 10:42:31 -02 IDATxw|SWM̲7DP*q{/ nΟ{W-DeѽWQZ(t$mҤ|<||6m'a@%\瞻%$$$l6aZ|ׯ_]t޽VZ8NNog20Lfعs炤ǁM&`ݻnѢ͆aWDDDDDDDDD v޽ ))C=4}ܸq[VpqkLM&SKxO0L8ν" u@"""""""""tL&[aU&N'۶m%5u?c@HJBu '4AS{|e˖ d 0T9z۶dgg⛎[nSEEl'QtTem۶RXX@}DDDDDDD< )=>%M&jilgrYY>9lGF~(..qy@X&1 tB/XZZB@?j!Áalj˔p8 ܕDDDq@b}6bټ{S2e,Aͽw!څ͠`ďdƐԭ%%V Qxk=۲DC'׳""ROmM!ɱK tPwx]ODDD_iO”f@?}k_\ž_s_aZ+_Gwx|UX?J ~ʣ|vCRN,vXֽ{wd;1{\'"Ϛj\S{|rl䣯z>$.g_Τ/VlV_U,ڴIP_b2JX&z&(""_>DDDq #< p *h swJ~q2ˈ*cS^y~r\G۵ e35bOc/ْZJtޜ<*.HK-y"/ð1)ed~{q~k[Ȧyoʷش3'3y v>Ż/¹'"O>{ 6 7}cW_s/# h)` K8X !!K{r}`3yaZY {-O@ہc;:ۇB*b҅D#;pxx:&ǒi&& À}?vABQ$w WUDD965s=>??(JcL0ZNXlOk.gH`j?߸$3.xI-b޼U:xdEѪiex]\{i<05`8-䯬\t7.?5M*~ Gnzmg'r:XJ׉@+k9W5 xɧyݘL8laxXJM]CpkDDD+< ,ŷ9bNN^z洶b~\pigq٧-DΦͤ| FWnv6=mwvܬ7 qLN,_OۄRը\EDDDw|,,,fu6&&].YԴ4~E6nLn]kha7VͷeEd)aa\{ޯ47|^{riVtY@n}S,+ֲzJ~ywKѳS 8;Ld5é$Lt't& / N\^3sm9FW]`5k\z]֠6ؑf{m;~P Y^\ED+e'U}l8/KGL^|U/G${Gg@3}۷ӺU+N5q{uJ7ײn3h`2_0[tr\qŞ RDDD/K/‚U|~mF֮T*Ԝ-?xwS.I˅W}Wz%Q)-@h߾tH<Ϛumk.fAd-nL>?Υ?x96O=˒gΚu<;BBd.OХgO[?[4UDD<{Yٷy9zCkfU{yy,] .AVV6SϜj|p.ŧu tN ˆ[O4LeYW.p:.]DDDŽ;bߜn]*Y-r,zlKt3ظnbl6 DƝZ$ƌ+N#`\_^&~e?Ev=t>n#*9k|"86݂Zov""ҴEq3THvNF2ZKIK;L&3' =ss),JsON'GRce ih6ӛILLܼ<G3T$%uu_q56GO" Sp[nW>.xgx9GmOx鹧݊aÆx*;qC!**~ A`` .̬,N2CM񉈈xB}Vᅗ]z5W]JAAAu?mªO`;_r RZ?73y׸;<2N=k%\*)q⺛naΝt;vpM73Ocy5s>6n,|~6ЧwonF< ǎmxF8oc̸"p:,^(r]/?W)--ep>F5NC/ 8~g4 SO9!""R_z٥r]}#񾂂nV+̝Gjz1L81aG-[RPA ;/%]I!%|`BPx6lgڏ͈߳6Wq[jCڞG_~/@[_/kb͊e5nB/fKk,qZba`Z+8*2y a׭[{dٱs3yN= }2iʡ&N^^W07~|>sV̄QD +:X۷PXOLT8'S^+Ύ)*̣E| ':%so<Ͽ>Șzűmo6|\~ Ǻ`oXw0Q/z'O$$&:-XIhWz_ShGQ:/OnJvl`VfL=(mX5v.:5Ƭ6uޏ:ڦ`cVXXȗ|S1oV$Ϛ|aa ;ŕv[vT<1t:qV~ĉ֓停gyՙ5Œ4TƝԑwzf?@N1V:n9'glFyVOS!OgCs>ÝNK0Ǎ#.6vqWu=]P,#ph"}~-ccoŞl9a!,X~E.Sv .]HkS%l&:C2AhM^m[i;f{/շs+MiFtTSxB&9ٗ}(XqI!~sܭ,2dRXC||cJ )2s;Rh֗i@,&p)-#7nld}wQ0& KOkK>4Yש;o.̮];Gu\{#PJJ/Fbg=OU4X~#Xn%*" cN&4:alI[7v BV=E LOXS'Mj̵gjNz9?9:IQrDG?5;mlgS8S5ErL94NQI '&wq#]_uhRؔsm*o ^_e#>ݓmمV ?7VcwʩFώ7M4JuaٮXjO8v(bȺR? ;wnb$Us5>ÀT/G#""0_>߻}Ʉ*nSIY M=r ?f•lwL9mHjn:ܼbX?|Ze>/zeYߢ3l8F~k8̳+%:~]KlTpҼ_gә=ޱ/?}BOڮ8;nƸάHJy k?nBL0LjS\USfpE}]8S1?j)CN[N}{EELp'B;MUmנ"ߍrT?jG{|""ΝXj5Y6kyp ago2hGms8 23iIvߟ;j/sX>^XYdGӰ-Ѭ-k7"!F˶IU} %+I =\*fiL9sH̼v5yuDzܪjXvmC,b"MILMC{tɶu PYP'&%ivɷ_<5=ͭG r2}ꙸ>,,XŒ3-8,X ۣ+tX`tDnXL^+L%V/}!Lh]e98!1a`2jbq)j>1DFmc⏿&!*:Ă26o;ۆ6=ޏkmWƵAhh( ,kEW~v|yW\z|qRBkɱNq=>)0d}zb?Yrۏd6Sk,};3 AݵY9"BVsJ6fbGN3_0mcԽU :[-Cz7lVw>+& ^{C:%٪WG28:S᫅KX ?ōevf\r*%m;յ Cmzޏ5imWsv|Hs>?_OM~| =>2 3}& )3+I1ك%˗c1q8n^ҫEVb+9YlނCð;I&c:vH"<2܂V^N)u83?(8x Jc6RXT@DX$ѡEe2lXͦYt &.O{b4-&1{{t?|P|q;b_v~]nhӡtp8&%ʞZ>f Ӿ[wVeˆ8ۮ8gգ kwMh"mjc8L&L;RnԼpB#pNg䑾[, IDATw3:vh˔5+鑔tף/#\qC<"e` ZFӞ_F~\l5=FӲmgĠ^W(s^~]Vvkn`aъtoO6G>RHINާE::t-n=#Gb ujk65msOu?;nᆪE(e8cBC=>"_OM&q8.MLv8ѥͮM*i'RaTt:J>J -#5Wl/v;q )))9jmݓ,& 0ffx*3X̴iK.']`lV|EII1aډSRRn5Af3/zۙѷ>#&Ӫ}Wƍɒxw &YcF@IU NIi)GUH-[6ג&_{A:;y4vR¢>i,_E JvTL6+VJJJX6 ; K&FZ:BmmWOUqje0um#`Zez#9wb465LtiߜOl6; 5̸_deokb1ӶU=JvKIq!Ā!}Ylwf^~͊ ߕF0h>a>cNDݙ<~,,? 4$Ɲ<)۷ҫz!I-t$5/^yMDc*jF1~|7ݼKGZfJ~ E+6G3;6}m}jhS܊OPƄ`Κ|5EEe ȸX33۹L47_6ƞe*((2mV3֭[hڵKVRRLj:vLNIUٶm+;vl#>>*2>2 Áf#++4 |IHhN\\W:W9?θǗU-`F' >.3#"<>4w/V>/ݸ'PDDDDDD""Ҹr/#ȗ#R2wmck^:E@tKӷ1/Iz8~=Sq۷Hb #> Un bo2<ϭ+Fgá4kMbgDZ Yk#=|$As>W磈4)? ~Զo_5sw<0 ߼6(%]?^p) ,utČOpF]+9#KgיW9~94E䇤kNv@sz ʵH,"""""kJ>HX̃bO}ojOӹsxaPDH8;?{I䪫'V3?8}Y*w:j \7uH<0޹%S8N,eiw.?QR>) 8w-Wp޺q !.,"""""KJ>HR3AD^Ad3>Iw?ZMWKvs^eGzsFpջwzbTy,^gv,^NЈ;H>/sp~eO:vLK~t E/)(""K QNvYh:fݮy`xxpʨ|t9gL$ξE+`K@7]v/)(""I$a}no$EO4k"m[²ȓx{-60Lpobq&c͆ItiQȊkh>'qJX,+I=NGRt)(f7)(""MXaaþ@BV\׫E9:9|9[s'.௢ZQg Փ ^-3Q%=L]l^axbq""҄0tʹ>W_,@ q멡,}JF?q߿/۟߶UFߦRڟĨGopv;oח:q&Oש⏷/bq 0|y%9yiꥷ7x||J[:f5|YN0DDDD磈,fQfFЬ""""""""">`d(_""""""J>u 5'%ױxI9& ΏvȻfd#""""" ("""""""""^䣈x"""""""""QD*1`u"""""""磈T|daH"R IVqE0سgYY8_# &&mc2|4bJ>H%&i޽6 NppÑZaßݻD_#"""""""uY 0qfݫ'۶m=wcϞ]:AvNѭ[Wzի|z1N"M)8Bݪ2i2A'Vq$'RdrYf5GʚtDDDCjJ@@)){@{Neo0V2j0'mbh=|nȞuǹ??)# [N~]稣:lV&3ŔbeBH0 Դ4z>D9;َٞ]bY))&r:bځykgq0zlMaUQhCUw,{ w۞⋯cYXe=SQDna V kq PPLa`cWI!{&ϙYM3ba8x `t8p8zZV)*' g\z =|QDDDDD@ 7ޜjzSQmj/ 6J찗  `Ӊik7qآrbWY6Sc֐$C=8E[7|ٕVoWYiʾ勎!p&>-w <4idYIZ^n²Z$ιgO ߭}JYIDDDDD]J>@`@Z)]KevU'8D 0(-]:=ⷽL9u$gh֕m3gmrMN{CwǬIӈ5+g8=jBavaڪOHM7ЎXPϹgO ??ZZDDDDD08RGBRwfLa$$9ӻsO\t&tb}/}VksN<9O>pɉa8|C[ry1،jRuwHmh,[~9'0{h(4d{p+FWx4.ݍf{k}#G-40 [a_nsB8t?~ұܠd PQDDe88 yՕ7w"Mx_/_mD'v[^ +p(ڼ& Xcqb7y3d C8IyR>6BZyt^h 8{9:+,I)7ȼT i85&z1y[n+f]O߰VYˠ |T9Vt Lejش "oPQDDq0J:{X1)-Edɤxqr{)9+F^3{II[罱+9OQőˈwtXLv;B).[]$g:%I"b6`EX:O. (0n+&/+b3q|2 S ٩6甒z [ף4Z)0EEa skZZ!k(5`t""""iJ>SwbIlV^XDaݷV-[^0݅rPIjmkr9]E˼vJ r))da. QJ;^CFqNՇ*%maOe{x|?ƥr [w^HDDDDM]{,ڹ]()u{hcױ}sst[uB=^ܪc (ƙvlVsCGU(-ݪSAG`*j똢)KJqOXD7pVV6Z$V|YO5wK"?k^NuztLn&}ΌtZU?_7]9I6Qp.׉xQ]u®suNu/=z\ܢCO ]SκW:=%6'$\v->ܿzCLD˭z=zޭ(("""5PN"z;]pV=wW pn]gz[CI՗Dvpf9C\cnނfsǺh!q=ǎ':5pȱ0 Zа`ܿÐc~W4\Mm^HDDD%r/^$U],SzF>8e+(;J(;S$"Kn/Z\DDjRGSpgMl5y\[ɭ2݊Mixȱ0NxxÑjѯO/( Gݮزz! 7olư[ow{tM*hnтŶbBaCD,o6+ztgmU>޺m%%tڅ;w={QXTHNߟW3ˣcdeeN 00?:"4St h.KLQ ºdCg\hDDD6h&O_[-b=yu,#""g'H*U{.~KN~8"}+V3x1"֭[vOf:EPP0w 11ס4_kC :y v=۲s"?~|pK֨.>ϾbD""RfA$'u("""U |&St]{^pe²AG`֗;""r icc[uL!%^HDDDD ҵ ׯk՗Ջ!Y:wC߻\ŝh[K "!(zs|@""5Hde sB/AطnvN@ޔ|A$֯].o 'yMЋ/1rs\vM &| ÆӻՄ_ȝqiN>XUv0rsZ J>|9sp|s'D^kîƋ4-Q` 5)n߿qӗ~Mt^fRg^2ĭTNî {tˇ]} cP㖈7 /FhnWSu0@ ~?\'G!$ċQ7Vt .™VO>vR]?Ŷ5)":Һ n 77dNÏi^B4RMnMͥޅ""S@w92 %^ IDDDD,crSӱX GN 4@фQX@f닠KO oy\sy6Ouy{HPчnBXڵbH"""""Pn]ުa[[WĶ^FuQDDDDDĶ|Z˙(Ki:1/w[_ĭYxDDğ(("""""uRŏǤ IDATn ?|/F#"""UEDDD] ⮈x'EDDDDDDDD1SQDDDDDz6MjW|i24uQcԅ[ow3=RD"K®Nu nǝ hf\hD_k37&?1ZYk -Z4|[u~ }2p+~OD|CG?)#J>x}z1M󺚂Cp5ʽeC*[K\ٻ(M/$!PzU4PCQXQQ@C4D@(`I yH $l{gdεa%La  Q0IQ!B!,ûCLdm˗LJ$ʻ/4mKL-UD$(..h\\Mgxjk6D G!Df7SNw+Y1rG$4۬[zx^Î)|=>7֩ųkrʯY |tb[bZg<2gϤW]d,k|C%DN|ޏ v{b4yϦyKlZ4u"RD\]{n1Nvgz۴lf1* 1шɿ3k'7ir6Q0HQi2yr !ēգc"*u;ɡC7Lښ$Z+~ˑw Os.T:B!0]ubӸ 0ʶ:g\rLk)Fatyw}^i)ͿԻq`g!Xj}MN$5m&Oܤ~ݤDޓ"Sq!,Sz4HlQ"P=wMxo9SpjUgian4cW1UBF_@gEVlr1%&%MZp +Q㍮8ňDN? z6|7͛.vuFFx#nz'G!Br%xڄC;Jqm`e$׸v*bB.I SD^FװP"sV@zУIÊb4Yso7ΤqO|{iԗqqFNhbj"i\FI> ! =^᷊xjV?ϝR7=ho]-q14"jR~Nxv܍8+GZc̛Y:d0GZ-`f{Kϱ~T-iQ3+[|Q=d;]Eؤ;C4ԣwsd5sWT}lJVj4 θ]Y6 );ʴ^Sнl,%_b5Y c!X 2YrC( pߠ.E'_D fM$p}n<Ĺh|kSH]\2!kB3u`ҷ^+䏣Wn!2I0Q@$&;i|GQ(h˙CLMH n\)9 {v0<4ƹqo$aXUE[ Q2<o7)aiۮ}.F# I> !?>:{ba.Dw@]:]>3E\})Jگt bnoǍC opwd16ү#xc$6Y߾z0{Q 7`L}Yط o<&o*| jQWjFN&Rw+$1K߲}i\\ӠjOn}.xܐnގ) 6GK8)1|Gė)5G_<^GmȘŸL6%B ˛bM\[|lqG3w<V~F;}*;HA+:|^1w?|1b4ξ55^®<嵥JgksCar=K#G!D36z MAL{1q#/~1v5x=7xtk\y y)9Wwv b?pnНmg-]!W-WYocXXJڜŷt} 6>B2 : b;qN0Wr4G9Z^e3E,?iuN V8;;[4v"3Qc$v2˻.YS,1=i/3Ͳ^>~g- _NtZ-&Ֆ* sѝ>C3i 3h]{$WLr^sX;:`XbГݩN>QťT,D\Rj13~2QQD<ԨJyZ5/ eu'-y"۴Ԯ_Էq~99ѧP~]l&r4DZ!2\K*i )CDI3x ! I_ !,?jʶgPlTh NCͩP׺0WkCw_o )pV?UH+_=㩧ڏjѥc >X5]ߦSuwndli:6E-WaX_/A뙾 BBXzi&t~L05Q7J ^{Vf־@^Xx=6Eq"Gȅ$BdpICm;S&GK5qM0y?W~M]|BX,fjZ r|z=|~T͏,_5EӊMKU8,]6qtZ۾l ZPs,؟Fk_v?neWlBM9q)&}f?N58q$J1 !D~%ir!DwwfRmIo"HEzp:~7)g!G!Diۛe^7Bk(Q'LL.mNjV`E#޴xw<-M]U:+n,ۥD1A^释siʺk04o"΂MX')U`{3պ~ķ]Ӗk9OBaif!Ti?D 8{&#¼56mҸ DwIGCXu$PcOxuz7q3w(B!DrBNcaxb$+#B$"stnE"E!D'3Z&IW[n6b4"Hd?ęO@0w3HQ!@}Hݷ=:!iɣAZ-!99 }ϤDǗoIc?IΫ(;gHψUB2y-!iQ ~6lQ8&&dQ2 +Mp74nbR53T)4Φ)4E)uR:F>,}9;c-66G1l_juˣ5Yyu%j| WG1W|^ *VB ƿE!0'=h4~;ؼdL;buU*yKZשvob].%LcUZﵰ&=t>?j|Wyuvy5:ΫuN^v3ޕ怞4-i~%(ƕr5נntdvyՖ)3y)CeЄ%==FU|X'iYد{+X= 0Ur-fܼy{AVVV[EQ D\̡o녲8^!BJ?q~N\(+Vy޼ LԃO-o5=^avR3.v:Žʏd]QN ]Oy;=r=\e|| xgظd91c<:P ibF~ZF-{s?~}H~iBFKqڙ;bb9};a\mKeqD9)wr?)(Ȃ8z_•{ݵœFs?`6uHV\\kCΔJ=O'RF~S}I/?#l$m,<qѧS濊sTx[_P%9۩;zoGt)U X+ZA$?柪y4ky2_qߣvmpDh4T\#GKQi/,E~Ca(S*,X͟X4ԭOz}у>xM۳[5{C-KEz~;>qI2~sp)A'Q("# Ks5[ѺTxvu4(O-囿3l`,rnv.CUmDW$&&׫zTU}z=:t:/3a!܏~Ra:{t rJ||x$/xe `f*TiWbEDrz-Q{.=w#&ӳ],cǶDzת%rϿ96VwCO2:?o%c˕;WF%L gjMQ<<Ѓ@4u"""ݗL)xxԫ 6~'V Kx3mu NWsПl:Au2l`Ӑk1ۤ#X^.o~x24Nr?)VxqƳLyjoF# Y?:NS:X;T}K WVγwk3CvΜZz3oz{<0M4"qwS%yNEǜ[98sX0CnMӬtӊ/p }\іlE,w`,76`j|8-% \Ű-zb^ĎvcW[sӯ2oMr-&(ƒB$ W~Ra(ۢKW%uQP"+GB1 okxJ,g0ΌCwc7 /U|xq0.~NJOU3y;-sX.y2O"B2y"kc22 ?$a8f8hҪI]MI?aȠɡ(m4Ѵ؍lDCwM=vV'Bgsp(r?)T۷SujTn]Hd2eFYQ;0Wt*Fi-;k!O;[K=hz93ʤcw'W)ʭؔZN/`\WzTӱ2{<KF?γh*4[\c 1.2`6 n9q"=ƒB8] / e!Bh!ɘiӌ:%)mMq!|_mF0vY1Wbj7n1<%+ΧTjEjWo:|fyG MWEKm=T4Jv-g]XEz?_:ע}[5\9 rpf:W'-UCXz]7X4G8pMi^7mxVP{2u`Gʙ6[wba =ꍯW^2wArf7"֣yq r}\B!ijY"u}ׄr?)(\ӥ]Xns?ޖhX;S+ wJmw6^ɮey[N絆ōJh}1zdAD~evQ8&[Ɋ+E&umO\9Dg98s+%44D!!AHH0u˴|`UGљ_Ǯش~#;N:^X>cڋ#xyy₭-Z6B!R'B!B!B"( ; 1  㿝xB!B&=B!B!*,,1! @||Hp lmm ȄBŊ gB! [nQd4 oݺEHHHe^^^,.=@5z,HsCz^Δ"82WnqgijBT)bCsΟ!N?)l.]Ysqq)/^SYrOC/ߣ|Xj.^=-eT=}]:reH i/B!Dᣨ< ~Iiͼ|Li} 3^JFDDL:2^`*Wa[t59s,5}Jܸ2"v6Kxn|5M;;G gL{x//o(BQ4U 98~a ;? (~'xggtzm}R2S+40&`ՆbY^(@UU 'O}EDD02`,zc-WgI,'SF 1dQ3w_8vʤeM^\fcZ6,_겠%Nafn+r4k`} }>ْx;we$ ɨ1ct/ÄI@˯vӓg3""៏$4,׭0MR 1$]>8¶TWdG1~'jUcB!"5>I !2g8y.XEQpsueݤ>9٘;!1.5Ast4ڳ}{jA!ZXks5,di;/oϣsO'7GK9t=},զH"*e>w;.]dڦd 0ڽ:t(r(6u"TW7$jW4Ef3f tc(Jc?>MNntT O}0.ơj3?d(tt6)>O `m6 1B}/Qw<]`FA! f5o-S;!1*\ŚGW&dzr6/ORжܻ ~y8;W[Ь UP}Wؗjߤ{cyG$\XԹٲ7ns;<2抯SR^T_@m.L7>ް3$H{޹Xd=5#*WJڛ3|K !2v5T /1v[mp2UŞo?yz&;!P2"TңO/' ?o&->GFGc z=S)lm򣎎O܈ބJ YIc#GCgLT梪XG悿;p\2{j]3vF32,i/(l,DARAUUܜ>ZD!(fڛ@eyg>}(em 8j $gxn"M&h{Z{)Gl2<9:L'pkaO|1)71\B໻~`4G^tnUrln0gΜ4 ~`l%UU5=^Aa^`бzRݷT|u̜5(S4!ݸ505H=1_xL!7PqoAŜѼwݛנ\1K ׫ o䮡 rv&B!OG{W%Ё:OVѡ}Q,uۈ+;xoa1eh7~3{=o+ eٻu/+atFY}0eAH 8v4)n;zcK !=cEa4:?%ғ ᙶ[ I&DC636φeKq2%?׋Z7I{!DSG!~ { Gi?@iW !B<+EnBlݺr*5K.Ю]t ADDDL:2^`|||s:Lܼy#@>M/myB gL{x//o\\\EQt_^S˧$FZ&97U@: £5Kc7cL>Ns*+-a!Q] QP\z~/;,x/bKB䌔ģFZ`c`kJ}4Tu*zbM*(ItzE+mRRo H#)BcHQX`K<&!DBU6uS"Tq8߮%`PՒ4wT9w$h@(^ ~zf.B!0$EQMa6_v3yBB䔔V\iKW8^ ei=U\ox:^PMraR/I[]<`FG"G!BdM¢^5=ۺuCD &EHzOFƖDlAK"Z;g^z\iq.J:й&( Ŵi,F!9/ jOAO!_RG)jGwq,ޡ$V wUkG5/+Bíl`FxIa|Z>B!0(,,{|B!%p  08(A<@Z٣A/OZNEB&z(BHQXNB! Evh=Zhht (I=T0 ?δ/V(IgrQB!Ț$ŰAסhͲAm{|B!( T0 ~ aDk p.>HD`0w"UvTIۊNTŨF1iuRQ!Fw> ˍ7w)pz%KBQ0TT#"8KC -vZ4;Ӧ {{]!AgHZxJ=?ڮcw8;BAz> Q|yB8~<<ݷ=+VR !"SWשӥ_(Aq'(z;P!S;/{kzP %[cw_Δ`p[@dB5I> Z -x%]=>!B jrXJu>)KQӉJ"n|E6I *`0` ֠ӺrlyA];DzSN-îBa I> !BQ * :[}U+Cq֊%3C덫;t$2qF 6XV5Ba I> !BQQMD V.hТ`PUD(h usYۦ\t?xL_Ww0{.62,3S>ܾh6~Ů~g q\55s#z苿3itζZĺ~n{i/ a^^EQ y¹GH;u|^]S'v-BHQQ̠wQww>Se<> ~ZOw6;t3iw |՟K?1Ռg6^ll,xvf잤N#(Nsfp0O-а03DQ}>,A6L{B2nsj2#( bϋYgj>Ī|>w>:Wۋ,H{Q0$ r]ܣB!!G!DRU&yA5jGma鏨U2,Oޫsjըgk q);}N}6n|ظXp.Nҥɸo(PB3o 2K?YGJxA݉|ԓ~ >K J5? ^ʽ]%BU1{fO^do! :> !"k|B0θ>V@9~T(S&uZІ:gj9iƁ=9{pfa0x{t׽ک}GcF^Z4dD8.zȚi]GEYȔѺ=~=YZFs9O"}@^T5iw~~2]!!G!Dw:AҡLroHuR x Uǯr1 }=Ł݃;(j6W2uťY(4,[΃$CFu`A]#nvO\ xMYnG[I>Lm]W&XڑC1)W$֙pFrR!yMB.6s/*[`L%'~ Zst &ԋ#3hzZGvy/pf,yS} +B2e-k\˜/Gs쩼 ?ҫhݶ'|¹.O\]!<*Tga3 |֨{;'7s%viS O0wƧdz/BQXHQQş_ tZh|}& ָmBQh8p"n=_쫓YoOWܳi3G3kG5)^z5Yc_>U͛,Y{QLI&dTiWbEDrz-Q{.钆>IՂVV@3}Ћ|&dI'r[ek%k xueÄ7BQ(IQX sg N}P'UTC_Ay&6~ׅc%zNZE;R2^$Rv~4%hYcZ;Ayz{Szd'J&1sԮM2٧~m}K3xxm"""ݗbyH_.he-(E|| fh)?}5(B|…DFFШQlmvkLL4O…TT@WĜdcя>| i(8tsJ/M]2 ܉]OFL*kJ8cK;sYӚo7%uӛYq?G1cgX0| Z\mvW_Dgv=._Aڵ %$wq<I%eЪs]QqNǦTw,* ,K,B":H|xw*wۋLf2B!T|~zR nmz`8:lee*O|*R}ӝO ;{_czzwj6(m27>~0'E~CGǧ׹Y"ioBB">>>ܾs6mNSYyg/}ÿ)?o F>[? 66XiUjqJv-COJt:5,Дqq)g%X'Sv; {WMy{] 6 P/wۋLޕ(B! "'lݺZ5ci׮c{|C """ Nzn/0H+NHah|cMY^BC gL{x//o\\\EQtB!\߅0=+lNF$ ȂB!Bd$Ex{|Ξ2"+^!B|%E WfBQ H{!B!DvhB!B!2IGaQ{B!B!DN2c5|կ+-с&nK=utS )ˮ{yuaes&B!B!e3c4GfXۍț82mGE\s8fR3xzШ`v])r(bR슈ťH(B!BĨ,^?ZUyp':Wxx c܎/gېU&n^w?naJGI^ۡrI)XvGk;Ƚr5ϛ;ܹs-s0h|è5&Rr%}ڕA;mz -Ve勇Y8[n:ȹk!D{Q^'>8>5]28K8ujSiԱbSR:$`Ϙj'bЄ_LW+`q`+YzEë dѢE߽{!ƈddX_W0z&|C3]$n12`lqYbLu{[ IDAT&_QpH{!B!DuiN@1bҢc,%p7_gġ=شCn!^4= gΓ/uS ^ê`Mx \5u[Ӱ=8U*uJpqoI!8]EuМΝ$}8 R;ҳ.oGՖ})71@qym2:nI<+ .\( 2$M_~̟?ߨģ)=###5fAׯSti6F{¥W1+&tx2NǠgӪKf۷};va²I{!B!ғu16XH"b 'dgpS赠Mc&@{q?*f=8@WDV,uMײjYҾkzAOlm?a^{utuݾnIsu~wa!k>Y{(vGu DNװdvE3f (Jc?>3L2޵w3b05}Ȁq94^O7VTܘy{ͺ!D!B!O*Us!WVгn-Zv(;~M;b3wfoެ +<:UW:{{fݴ$\XԹٲ7ns;<۷#8TBVBY/_y'0gSC;>m0"Hs"SrG?/^8$Y8QǬS1 GvT \Q_1oLcȉzSq|9n"!Om.2X^(~޽xp9o} !tY'է~{Sŀ91}hĻfDmdg"4Փs&AW]ں5iw7^K|eV.Gيsli}Erz+V\5m_EQX`666i֥ )Rޕ8sZRϐ*g0h`洩 7s%1kzR+)]S<B!`tD7nٻaTTTܗ4+۬E-m߬~憚KjgZiSY={YjnYi斢( 0,s@Pd`~^5]2s|OhhEWENN6ERR-[\}VKDDD|u_FL˃&q έEc/c'}VvUd{Zج/ɳ^3{q齰e Ǐ`ʕBCC\-_ a$=W=1yVoDDD6q-03R\FRYʨID 9VY[HVsY҄ |q;[LX>?VODDDj oslNMVl*.&/Dʷif>;汱 t%ݻvayn>]vc9gp""""Sk>T7z}"""ڥ 7 `u3޽zn|2܆;F R~l*CXDW/D%r+1<;^sv^#UHmQhDDD̚e_.8,w qgb^H"#" ~Oxݵl6> %5i^;s/dDG5 -m/99j}m..WyN2"8Ŏ~ospÁOG3IMMfݺ5ԩ3;w)sWYuMo?.ijDnxBO}ϛj(sǞO/ײ55s7ru؁yOus2DӪmοe8A9pz?W 0atO1 p88y@4^Hyy׶5͞IPPn̹) 2i4MDQx}[_ ?8699CnИOd6 NjfO2i2A-7҄l=c8#EtmI#Yz;y[(Aҟf ", /7{C9""R%z/"x!R|}uL|zS'O䷕+ٲmy{5!=%L rٺ^ O(šdH .nyy+yN͹Gew.5ğt"]2#uJ[ykn8a,gDDDjG "+r bγϲ,xi1ij2U8n:}Lp~5M~ _x7!Й&n#@If+3&q Oꁟ2ymxN:Tހǭޞ[:3O _(|*L& 9Vvyn#૮$??_~]AJj*v︝L{vcwZn"knv{a};ͳ/w|i/z{]O.v7Ĵo^ޟk&_b=JWW,"""QDDaJ} ^曥w%sC9x kK.v$&sUgӮm[EاъAwͧ0)nЉyIl33Ϡ}#D^ '?u?lu75vo qoOViܐr5)|*Q "x!*oKƛ|__q%wם8t5@kv'y:*/iE?n7m]}a;\?K%;(riL9r~s$Pt3/Μ9O}Dwn焔O_1\DDDʦQD4F?s/"_b;nC>η}GPn:N'AA\]k}G&vYvG}ϥޟ[~#'GI{!AM7'qғ;B rp$##s 0s{L>x$;{6ߧ"R%$"x!*oC o/ap7 ڶnŋd}كg3{/;},-ϛHs𘓌}N2ʮBvzE)"""5EᣈT 9Vy޿ v`rr=4b-o Rgn6nU>BBBh,]cke}vF-9y̲f޽^(- """I6Cffra5z윜l֯Ms. 9VY}fMɻٳ'Nl%#N.]Xfu뫌 Å>:n@!uƋMEY>>J0LnƏmi_6V25aΝ4^z~ݷVnZ#4^]/VODDDj7R";|lZjѢ9{rMPڴiK˖-]/.Y}'"""GS~ڐ(A>}ӧoKx!Ǫ@/9@g5ZB@DD>Jcp?r_Nגi QO,z}"""_\rS$aZB@DDz(|:5[>//9`DDD4Q,z}""""""""ofyu*Ńi mDDDDDDDDD*412m,aUµo!%+o2}6_nw>tv4Ml6[LTzh棈K*>-۬ȤOq(lj\.~9o1L{!**)ST2220p3i6lX9Xd`Z/ϗ23 3225n><蟗)PvsmҪ匌LF&۵}vܕO-HNIadxu՝J˸T("""""""]-u _h֫NGi}{a}ưdˏ[giԥ+Mɷ;]4-q`Ϲ3+,-!\`/o = ǼFq07”h~πl0.\ڏi|`ԸHLm6̜4sFؑǒ^}-~~,'"""""""OULF?=xlb-{ %9>:gl9k>0r_Gxeٿ%^+ZqT}w/.Xz!s`Z yW}ż +ߤoyShh5G_BBƍ( oV.\ߋeff2j( x&nLcÏe6F&L`b_0 u8RuPQDDDDDDD,ʯwSW:a-kiƐ%opg(_Xk[#6|OY.㩒\4({&4ٵkW׋/.xeG_g=2b)o׎L60}̜6y۶,;Qa3a;=-"""""""b5~L0MZ5'u`b;"4:xnfT6*iа!v'o>s%5A#|Rl6/!!!̟?cEZ{cgM/ GxnfM]gWRRMQ) l@6m1RuX_G } hEԝu\z\tNSg"l;P dC}'H{y%cg1PXl6͛P@6^xR3 W 0HK13 dp8HN]ZRߑuɬSyp f?;Lfg<wrӉ%g7Kz:V~{KVO 8Snǘ 30k cNʲ+#ޑڟ7ofR/$@ *fpeb222HNNO5X]iE%JOO0b%AAADGGӪUl6[YmXf͛Ehh(. ("""R3"e,YMRR.Wz:a.2rrY/hٲei@S(u=g5ӻwoN'ف.2v;]taժ Dx  4RCz}VSPa:HE!r\.E24^xf?IHHHyaDDS(ugZ>+R.<$R Ϭ6^iӖ(BBBc-u=@!@5)|:"LD|Bf t R \GSnkz}֤4^$ukM)V_SY>׈4^ՖkM!!! =0Ge>nJ*DW/Dj~DDD Έkӄzssбc2z}""""QDDDS(uF||<ɬ[=vXX8:us=gUU!"x!R#'"""P(uęg3^_].ymĶ4̙"bA/D|_DDD|QD,l $ k}N !k^ۮmEv c4^X=[#A9mhʶ?wx'D4^4MMDD_4QD,/3r:t_A~q;o6"D׹ yc͉ދA7y_rm!=cߖS%Nֹ<OpU/CL}i?"*R _0cZnyIdΆ oۨNR_[fB>vo& |wp؃BK)ȱNᣈX_f2ydG`doXA=榉 Od6 NjfO2i2A-7҄l=c8#EtmI#e"d/ym brqWȑ4^87mxZ-Lg~<7"cMr ذ/\Naܵ\ێ41q-r0x˟gįx.""$"rlpŒ;r %a8s^{0pl$߀.>-++v1nv ,IS˥6m1pq9T be/!$@RjGS0p؃.>FٽR ""rS("50m0+( l/m.0lxWcons҉rN㉫g\p:au6BjÖoo`۞|uArEFl|e8c6uh߮>[s: @cW̿ٷ#&߽fsV=t`Kh|h+cZzo~~[C:n>V!EK)(|cAvr2M.3>`«qԫhe"K|'Nl6}48W|Rv>ހǭޞ_VDBxci97w56I}<3Sh4mKS;x#?#C02|S`o+\t<ԣ>ɂGF%f1foHM71aXsl;eђyCDDD>m 7L̢ 6N~Z?g4zѱy_}C'~r^/ssMӄ|uʕHx!5i✮;W~+nI0CE!(#m9R6rkv87gΓ{rÊ[68s3߀_/5ٷkW4pF_¢e>,FNW0Bn\N2'=v:䰁"ϙIFF&?37Gs97욝+RiіvMr?{/ϗꪫ՚[r GmGִk̊U;eK'#E00͒R ""rS(uFn0qk00M/`/lSޛAΌ#y4;$#ޟ P@vz [D*D]I<>[81q-_sKF7qٝM94:{efZkO4էךѧ ]zh-z7piUhrx_&]|/I~;1~?KNP}N2ГsY y}Gv㆑Sk{ _S(J _W.QM9|f}QKl4t:ge[ w.ы㙸mDDXQz}Vdネ {xh }G;㦜~(NU^my_r _ٵ/^̿*`dŜy«V={n#ϟ̯ ؓ||Gc&YOm`#"Bf՚9Sp*y=yif}u^{vZ"Gά#R ""rlS(u[>+5lD$4^Ԭ:3'|=$$-303_SEDD|Q z}Vvg""5/u29+D& i,_C85܈LᣈXZ`#"~Bf?ƜO `(@r Q(u[> 0\@b9nAppp ex!եο)f_j6]H-geof ߔ%Kn]F=-&6l3ZH5jΝ;4Mݜwаa@/ /ݦnu&""/ش%o +O~e9wR*"234lھ22 /eՠ*ZhΞ=)j ]eҦM[ZlRD,Cg/:iEǞw.;n.w?d9 of:T'4{bʔ)z F&0L7 V7v>}ҧO@""B鏪uk䚏vZ?6|11&/ϗ2o3225nLώDڷkm=~"T)kтݻ0cEu2.. 5TƎۉ$$$ݧł-[2h #B|S'fǟ;ӵO36cgie2~+c+_9w;A R2|_,Jw֨z6U| A;ٲ|!7_و'ӻ8a;4"ȹM= W5_58h?ΞWXSJPʟ|ESt; wOrҿ\ςJ}<.vRьĶcBB;vॗ^fq … } +LFDڶiOlٺ'Febh΀{cG=w3 o5T=zEhh(N."""RU(|l~5) yo/~o8 oPw`(Eo"``KC]⊰5\Ƹg'qAFXEd3F|Gugw|_϶Lwm:x3]Frg|}=ڮ8AsypF\SL\.7A+wb2L2 ŐwxeWؼpa-=~ M_OHH`ܸqW+?2x[YpgFxwxsf< g#&=ap8ZNy*anJ;|bkP,^ůWl[[y x9{Z5io<ɀSa.CT k N=^#eڵ%nj /#o\A#^XcxK=VtuuUVp Wn7i0k4ZőZ-5xSTgѡ};v$&j=cӥNPP$'裂 caILADDAAAZQDDDR _'@DϞD-/Yr0ѫG#f֧ǥ{a+ h*ЪH[QMw)Kٳt 6]ÃC =Dz+;ѽBz~xd٘7o ^xRL|]Sq0 <0M*Yi̚>y ` ge?mә4b$}E ߒC3~o8%y?yy]үWsr|: zxVO=_>ju6xݻi_WF;|qÌ{.>XrVoq#Yd830Ԯ,<Iyl`?:2˫t{w'y0 RSSnW 0MSZZf<턄"*!ii{عs.l#LjSPCq 6o >EnwAQ&*""""ǘ U@PM[uxhC\):={SzV8iKz |JBbr-#?Vb}x,ױ*;. Bm(}@7D'`G7_,N8g0z׬e~v4U瓉vXfcܹU@R?T>ۍ>|Q41((0L$77#Т /byy.Bزe_Ȣ1$$3p?U*b]68vGӮ5QDDD`3+3KĂ>:tlą^1W$557.| p\&!CyyT), #""s"VVx !((áQDDDR5EY+bي?:BCC]v/?Q Ȣ1::jQĺfyS("""rlQ(u1wn][`+@7q&\56M1J)i5^'(-Zasy8xlLӦjJQ(ugY>)[qRa NzgD|H""""""%)|:jeDĻH"""""")|:k*Z>QDDDDDRg`.vG@v} '"s8܌fW("""""G3Zy?4^z5z\')tإm^T\Qp)x@&nkaatԙΝ^TNQ)""""""L]~WDDjiڵ4 ècРAZjfc'= "::r=ʱf׮]dgI&85{BU޽{l@˖-k)Iݺu#<ݻ 44Fm՞zRz$b]:ZDDiӢEiڴ)vСɸ\=vpp0۷7X':{Ӽyrt҅UVZ7ӻwoN'5zlOԗ#R(""Ǵ|ʟYU)(';;; upԗTgociZ7]u{'gKIwꑈu]XOAAAm7Kc'ۚ=3$;HĚ4QDDDD,6/O^kNKigKIwꑈ5)| $ksI})M=L})IN="""""bYyKm:/'/%ީG"TfxѬM5Y԰ODDDͧګRzRz$bMT v-ui$m};7akaD5mEnas8je}"R9cf#a.2&O?R,E})[yͳXRb٘<>YRzRz$bM ؽi]1m#4kԠF#y|mVZYfKx4n̎Dnھ}L1 Wo}s'5bWR2Pؓ}~nݺҚM)mXz1@aOԔr>W+YKigKIwHQ(uFz>vv}5zp;UsnߘwƌHll,9<cp5+$4;4Y5kBVVSg"5u/ p5O})[Ezs|l/=9c{q$'7- ^QD})M=L})IN=&Rgf(20j؆abǕ[6VOD|ӫGb5#%5}~͚ѫG@z E vf_lZW89*1 ԗ7ӛqqJJboZZ-ۧ7*1 ԗԗ#Q惽>Hپ^=@pRRS AWSXOHIMeK/tҽ[WpV@뮬F{拯?^x=v&88;o>~ _ZDݼk8s٣;w}''kK+ȇ=ٕTfOv%%쬹'xx~xXGS>%HْSReo?C.O_rooFƍRkMٳw/?KqOuW^v N.y/of,`lMigKigKIwHͳ2|HYnz `J_V߷0xe?Tje?:2a<џ|S=DqO.6K(C=W_R64343$;HĚ棈r'Q/Ȉ>cxk nysɻ\~%degv,F/eSoJSO1=nR%ܚ5h߾ۛ'%5͚1l>s-; IDATۚ5ܹիGhh([ogWRZK/p#''7n`R4343$;Hĺ|xFw.Ct~5DVUHF<ЂٻYnsZrS<^y7_gxۇHORRSi܈XZݺBJj*{ pU˩Cdggv:v%%ѬiSZjɪk{BvŮ$_޽zUwN})zSzRzRz$bM:ڙOL2!jL z7uZ+lTUYg##pᨨއ7ZDa縶mx4n-wofVT.Z!!tgq4nԈ'/=R}ZR64343$;HĚ*>nY'UKsx.63XSZ+## 1 7ƍaÆz<zN݋nۦ 6 FN",9WOߟ}HKKl6K?GFrss⚡M)M=L})M=L})IN=:rI|y*ϗ23 3225ns`bc)Qt2ݦ)ӫm6~N3v;<6wTl_ddd22a<;i߮ f[mcLLS`'E vfdxu՝J˸("u[UH-b8=Ulaz7`s[3Kغ U# ~Ubfmv>{jqm͂y5_|ܟ/[V<.aL=ta/hv2z#tQΜ4il8 PXטM p%ǯg0TNJdԸ HLm6̜4?ʖxbX&& H_{q\G۰r"R~yM)M=L})M=L})IN=*_p&( .A78E8!dL ^юZGrz_zž{yjs#Z5ev; '_  ;0FMߜSsCsWص]ׯ1COn j4Msxwxsf< g#&=ap8{sDDʢM)M=L})M=L})IN=&]p&I(_mڝ*>A sUJL=6Uyhb)/SX]xwTPb5bF%S/zVn% <-x^גW&x##FJv4nULdi<ȣlݶGeY (Uǘ O?nқwԗ7'/'/%ީG"5vv8mlT~<5)]N_i={cp8ɖɼx8u2x,|3,*JoR8TBAh "rvł뉧?4; xvyx`96;PfspiU5Ԉ J7g0oLxQE/.o@ڽ(9-"Mv>\jl)ה3erJyDk҃%dќHF,\Y38b̡7s+Ѷ9] (&k4h1XnN0SgWSVijb9"|G~ ȓi!t}Go%8*7k0ʳDmR@3":+H13mӭ8 7c̈6j7 iۚGO&?"kX~yx}c$ fܵ(bٶl%9YIx~4f#''~Ԡ>T4 <<& L#E( ͊fh*21xց6eʥ6ƙ2qM8S&){HĸM+4ϏS|3Ύ tj>FdžrP~RžBrVг#qP1&Nu7 OTk7[_)Zֲe4eV5꺭2Otttם-IKK#:5͚5kuM||F]'K͔3erqL\S.U)qy|\3wi|uPZ.#y!Uyv96~[=k.-w<@ᄋw+q0KW+o;x"īq}G_`d\IDNN||<dSZZڨ *^wbٿ? QVV^LHHHhzBL8S&)g5RpOo1i |a2HHHЇJf .PK͔3erqL\S.U)q(~='"""""""Mj>_1͌^75pQNeFODDDDDDDě4Qћ{FODDDDDDDě|bgDDDDDDDDIG+F&5op(-C}E7q6 Vm2Ip4#a^wmxQ0.k9)kEYF]w@P-;1Z}_ysr,s:Zb!` u).>S}|o~dL e?SL:SXws=kvv:]F_˭Yk6Sq2Ͼ\[)NwLdZb_,Q}&$}.eme{0c9/O{x*ٺG'0W4|λLz&ןIO7$mGIj3I'L{Z_WR5֪zN2;CsϨo!Uxzoo_.yoO1"RcS2EDD3cxS]z&Qw{ X7-pǨ6&= >*r|]؊#*2dk_3 ikhs=<z<8.4՟FW^q.c tmGfxAtH,> p6;_z C?Tb ?۔ kD1Am%%MxPggh3}He+}G~n;Ss3"""Ǚ1[ 44]FA W Syof+U `Ob( m _S(+xsUHLMimB\';|bs Zuk^XΒHPP`u[PRRAV9 %&MrV^)۹l[ qig!$T= }Fu~qy_Q?;jߺ_7jSm?>Lj?f&""rr>_?q=M8DFF1I" Bڥ-%9u}izqfNW j$lߑCp>t7R E6םS) L EsMqV_hE9ꌙA MpH-u֙D} Eq-H,{oOGTR|Q6ޞx?d6ŷ9~+=]RRAflFTNLRvuԶ?2}>?41'mݾS˾;h6}єSm瘦(""v&qnlWqZD:jtݶ#kAcd_s9\9z7ߛߗn"ݸοq되cOL3W_{_+['on 9KAΨKvGu:`\7OMU۴/Ξg"s'"l,o=ٹcS-<هXNlr!k}Ip5uw4lNo~Qusjd&|ĺ?%. 3?f[ciLG~UvμLx= yY mOZs<JOc}OL4EzU b =}OŤדa,!:HQeB!$m쌚 }_,*\ˆ拏xk<]r.9ܱ$s{ w=erm\C o}c K_λt}ӟMʻS%U̾VU{TnX sf}e5O{7K gс"Bc:fOI /~ h_ב{+>3( mI|ӹk]~(3DF%q4:WE~XY~"iە 3NחSdR7QRDꛟ%a'eq9LMӗFģ}Z6w4lWˤ&GmW^cTf"dr8j-T|ݻ7vl& d}rrk.""""""")|Q\\n5m61z}""""""""ަ_Ecĺݏf4z}""""""""ޤW~'"""""""Mj>1zsxW>xW~Z&pFDDDDDDDDDF>_1B'"""""""MuX}!Sn:֌ v^ʫE10F׵<XqC >>]]Ћ'؈S#'30?oD#EDDDDDDT_r7_ v^ɛIh:ET~~>NS8t萯 4w1rps_m,b &y:h"Ev(ʬ3,Lf.x%b0d”p?=YOu.,3rv϶DG4 ]Ůdb )\9=-[uŇF(ƕ_p񘔘HRb"iLӰ}!>.l&MsrHA""""""""o>n>f,b||n+!{|5 &,A.}ۭ^gU3֎nJ IDAT~K͟|MzNdxb!{ώ{0#J6Bi,Xκ뺞J,ߟńd"څ%99_PBX P#xZ<pرlsg$)S}䣫:4pYF>o>Ġ+0[Qa!vnašBB*;㯥E,;@.ğzj_nDTTy#|t)K+?femISqyfb۰O5vf$!>XQGȔZϙS""""""""Fݮki2 \Ď#cJ;iGU߾$%RޗGԍ!=%vЅ7ܿp˸iL4PPRr ع11|q<^|V,`[]lV>`V,oUG@Z7y:%%ҡ}{^|aVG_1B'"""""""Mj>_1zsxWvc7^gHIGZZ lٲɌb!//:Ҿ},Km4DDDXtlvO45ůFODjU?A}9nj޽{شi].)cѱ=e$Ҹ|fl/Sv>ݺukHgذt옄jnSRRdypիKo0DDDXtlvO4> QXXhGQQRSSKhH֮]Á7n< (..>Aʯj)++V?~:W02 |LNN7QJ.]ڵ[>q-;;t unc2=:]ZnCB425oX,{P=wKqk+WI)Ád K +cѱ=e$;:ZDD;wneVa|NLL,͛7'5u7+2-5EDDjp$&&aYG6v:w^_l)cѱ=e$[j> ++xvI=x21SF"k>ȑÄ6 ;E21SF"棈H-JXBOj6[ٱ|21SF"ӮEDDj֜Cu(yGn!šzsB)#RQDD-[F~T333hݺ7+2-5EDDjО4!=%zsB)#RQDD w =)))!>?>*cѱ=e$[ ζmڸ Mw캧oDYHH=zbDDDҦM,377J4L8222شi $$qn`DDDXtlvO7vNAA>CIpp-d˖رc;]vk3D۶((cÆt֓8BCC 応L&lL6n\O||[vCH)#RQFVV&{F]l[n_BBBHN ڵڵ+CXXsBCCpPVf#G˦MoKϞVx21SF""l6vmp88ӥKw"""ٸqiiiF``vGBi2qf233ٲe3&B^^:t}X,_蔍3erqL\S.:6{Bpwaɒ/oOku14W!''izJJJߟͯ[wҢY vuO&:5112q-##U~"""޽ҺiDGjrp{f=ѿ@ڵkqL\S.Δkʥ*SF"KGK|A߾}ZÆ km> j>Ԯbqqq g:^`w{ :.DLZn t옄jnc1LL&, LHNNW.)g5L\\ӱ=e$xtڵҍ^c2&88sP(BquLNXv qc2(..2v2Zf ,\!V#qL\S.Δkʥf:6DxGSODD/;;tƌÁvבBzzz#T3erqL\S.""MW*~գ'""r :Q6+]ʣ/MqL\S.ΔkEDPQDDD$ܹ-[W/ ҼysRSzsJ8S&)g5""Ҵ(~l餤ҡ}{z^IDRRSyd:V}o2:y^ODD'!=iKpQQ)){KxqL\S.ΔkEDiSY\w[ѓxF7c# s ,௃U'0u{e'Մ{o+ppƌ(MLYE*((i3ؗR{ilLn &MC>Wu'PRR޽{S/{즤x"l)ה3eriZtÙ;~=?Io˓U'O$q!D,XZd2p8dddi@HH7k3erqL\S.""MK !"* `q;E{ EK2gJ7g0oLx>g7 w@39EDwL&m۶ ҭ[Obc =>2L Dii lܸ$$4eL\)הHJJf :?7`̋ذs ;c1Ope(td˱l <͆`Xl*p87yCX6^|a8("b0!!!$'w`tڕN!,9!p8(+RZZ̑#GeӦ Ƿg^>+eL\)הH@vk.nd:(>gA[_KiCnx'F܉o2tzSwF%_meІPͽLm699'[Rum>Vp8L&l2x1ptNDD$7n --X nw`rhٙ=ZH~9fzƙ2qM8S&)X׷Xk>qIͯ;xa꺕#pլ_O:܆)OћrlI-CDDdykׁ(<|Z4 n2SPXB$$#&&p|]zS6Δkř2qM4 5XPcAmsᙝLX1򅪳s%\9MQ %j٭y)K*,lL'Sfb%""Ґiݺ53pc#88蔼сqL\S.ΔkED|~o棈4-&`1 9(W[ƙ2qM8S&)RQћ{FODDDDDDDě|pzFODDDDDDDě|bFODDDDDDDě|b&5ůn>oRQѯhDDDDDDDDIGAAAlVfOoq6 QXXhGQQRSSKhxF>HNN&''SZZڨ Ktڭy^(~b srC}]KFODDDDDDDtڵ45EDDDDDDDDA(""""""""" BGij>HPQDDDDDDDDD""""""""" |棈4_ -vm~'## ڨ Mw캧oDDDDDDDDMG;vl !C$88Q}h![Ǝڵ[ODDDDDDD|I޽)**Qm6֭ׯgDDDDDDDDMGElv[fp8(--q'"""""""m_4N<ƮODDDDDDDě4Qu 2z}""""""""ޤ7^(~ ^7(~5>o gDDDDDDDDDAh,4z}""""""""T2:ah̠Kn%<i<XqC >>]]Ћ'؈S#'30?oD#EDDDDDDT_r7_ v^ɛIh:ET~~>NS8t萯 4w1rps_m,b &y:h"E_p񘔘HRb"iLӰ}!>.l&MsrHA""""""""o>n>f,b||n+!{|5 &,1ch~6w>gM~QGIY1_W>;Cˑ8͑ES~ޣ- :r:_(!1I5v#X6zp8v~/o \3^~2~f" a]'RQ<>m:)thߞf))T<# Uߛ̯u:F>!o>,(q`;_䞹۱;[wnn͡I<̝y,{l 8 C0mٙ c[K L[Ukع3nHyG>O3i uk䣈cA O~Oq b6J ,Y &8s/- baUq;.]ʏ٣hb/o`_@߲h~9Xfv l6rrO*h2yyL&6[F}4T}VVk'"""""""M|5xj%$isy倃W<?;ڜWXꯏ9߲mW>TӪMQ %j^] Z|2l63H"GFG+Fo>oRQa>oj"GW׊qfFODDDDDDDěHQ3Fo>oRQn&5ůFODDDDDDDě|fldv>oSQF||[vNttk5k֨..."''Ν8 HnA>kʥfƙ2qM8S&){Ha(~#99,6n\Oiii;$$.]ҵk='"ugϯnrCP&))g5L\R)#er"RINNK?au"""""""""|棈45EDDDDDDDDA(""""""""" BGij>HPQDDDDDDDDD""""""""" |]vm4Vk;((6mb޽'f랾6poضwѳg/CuGeolي]5*d7RU"""""""4QFVV&{F]l[n_65oa9mn͆ᠴy^oW|;n>oG+F&5gD‘_]O4'1si_ӋZ-9TJt\"!.mʤ>+5L\ӱ=e${SNu"ްkڴi 99$'wv9U(,yy(".eǶT1j2dSInerqL\S.ӱ=e$ uz xk֬Yˆx k:~|";<]Ztɀx˷yͯxn.FkdL:G&OСC.GDv~ Kx,،08ZT4k29﹀qE\)הKtlvOD=fZ}[N;Ԭq-ݷGZUoIS/%t2\|ynkb#1p݌jF>4(Y۶ײ Zیp3Gh<)"+)} (Wkř2qMLfHa;v;@-[F?Uc9g["ãIp.A:ÂdWO,"mM&L 𓽶db )\9=-[uŕ/wӮ_G's53Xm;1?3N$&"mwcc>kL\~i_odEy4لԍi[*g. '`F=P)~eY| Վ${;Zu''/?x1)1D3<) |VW|\YL:eug EN!4,&[g"l}oᆪ?g&LH#H#@B !(˪*u-+.]Q" H-@$NKH2i3#@&$39y}>s90߹Ͻ oe#%+NBr(Z:Ʀ1i\1i4۴XWƦJr/0|p F?!%z:gn~+fקqM 3ŗ5S1f _mIGް cL"]jsX\tD&7m"j(b׳[t7缄z Ǐgxʒ f/`s Ivgύ㌱oęŷ!d7 VWi,Ų2~| yy1ss4'%<֫/0DZ_{if>!l'Ԥ+fƂÿ{uǀf1r))ǀx ކ4&GsnhLq9Ƥq鳹i#iVqȆݮ}:zͿfҙ3 b*|T!~[>5o]x_r\bE_0@1} ƴ&Ӧ'~d_EH#VAN dk2Y\BɞZJJʀƯjrg !gs;V.s6]7F"N]I3b翟dpS4clo|dðt17^Co2o) ?ڼjl/l6oNٌv-G'soJw޼;6oF;`ٰshکϯ ZZhl:V <<ݎOeW~Izj;r~-8fL{"uo%<65(w0i\NLcs60y.=z ~7\r ׌9eG,g.cu2.ELН3gaf>7qv㕂|{l6((o gQ__όSyi 8춓ֆ3")LJ=O'"""""""J*>Jb{vq󉈈ҡxODDDDDDDĕT|6f {z>W3;teΝTVVp8aVKtt)ODDDDDDD4Q:d Y6vKϞ+xz>W38DDDDDDDm"""""""""&T|6⣈ EDDDDDDDDM("""""""""mBGSHqq#8MGi*>HPQDDDDDDDDDڄngM菉]CDD$}0{z>WSQ:-[(//cг1-zJ6ld˖,zJ9%󉈈aЯ_?V+zmHJJ NX|""""""""tVl6vݯmp8֞O'"l6;ع3{RQqDN L||qqL&wG6t((zmxv>WgŊ _F}}=sXn Anq,"b } m|}}9hwGT|p;Iyz`_L71I swi3V$?]4$`0 -mgq|go."Z=v_C[DD:.8ǩ)ƺmsw,=}%%#ݨ>\|bv;uuuTWWʍ7BAAWrszdw[Gq)_Nן"wG4Q:OXN^d0gƕD;HTTT@A.EƦv W]u-6aaƶCZ^N_ؐW¾:_B8?fkiT]m׷iRV~m/yB?w, P?_eE\7#߱M}b{VA?qVUXҽr :7QGPaZ.L"O v-ߵ2 mZԔw6nkٝ%k :lsԚ VYIL;A7|!.fd.+ٛ#߭.'4R0*]PB]3nVQDg~]'ҷp߭^qLz΂{s>pR]ń% 9wo2k5:X8*އΝØw!2f̹y"֭YtBTT46[7r8DFFO^ Hg/$=?> Ꜿ-ζkiϦUKZ_tED|}}]mo^#Σz"vup?7r)gu ,,y,DQҙD' T吾zgN!,[.t(>󹏍|Kk\컖KוU@46 {2y^w™9NgpWP^yrƯm_ieϞ$&&a|Znپ}"-b'/+`i$zƮTHisv-5|||lk*""r:j|q!u5SVG14=[Q|&QM[$PeU|ϽϒX{`xpt|+bSop"7]}eLKE-~㖋7!.;sqGjnΡޠsodB?)nĥM_d'b/38ѤY^49~EN 7ݙ;޺ZXj%.J&r1!$$-rLЛ`|Hqv-5#\OϞ)i""QYU[HfpJтJn>oTT>.ଓd={* `ƎٻمH'ϸ{?c{ HLL0廲I Kͼr[ W_v?K~ Jÿ(qZi²r\]f>:/44**89~iit!w^N콯&~(GNOk>>D||6]LT[[Ν;[P|[|}}J^m]#<<W`>q "Z\!u֬_XL%k2vLa8c0;]tXd~glԛgi7 &ջ^GgHYXZw#xhl6;O?(M76epm`#gƻk7;uluN-N<$i0~v]KwA]]]_EDDN'&ϙJΙ?z6;sV_]I}L 55`^MVs0el_D.&jD1fps,$ڲ HLNV4Ւee<vc)@:+ɴZw޽򦰰EDN=&]6o1 yV+pm;ۮFII uu{t|Vk)))!<XKxψkTC.~)=뫩k6u &泭eY-X,` y}1Fϡi|;+HMun !~_O#ocqZkWed0 6`Ieo'1IpP .f#L;c3SRPkg(F*JJ"v`gϞ{$g۵ؽ!C("".ۉ~tN ˸3|Ƅw3i{*WST^C:7fhYV?ڊ .t k5y"M7n`K&ٙLa+u~CL ,`F- $ 3Ʊh͛l\p 10n$G62`} IDAT$_8х1Ca2*ΌJA}KFYY<*/i8|q`xWvt&]<bhq8n"%7K 搒DN&'V6?%krʵ0<+I9ۮFuڲ6a.ej- 'sw Sb!1!Bmmf\rm?6I>%ZՇq簭"CuF[ÎAIOjhb(/ǩ , y;>o(6u6E}13n5Q2M{KnaVE5@<\ҳU؍'?>9%3C6="s:8l=Q)Y |8w /8<2G=[\&:}s;TۑP{qp`ۙȇ&?3l6[9L&qݺa Ϲo99/p9f#+!~m~νcqǓ'7G䂉q%3s۷ЫW alXOZTխ¾b7ܛH e,'?/l2K;35Nhym)ijӪ%;)oM.lXJexY3(ڸK -8*y=[qvhgwn&|s"V/^iɄk)ٜvwƦ_Wj*XWF5 ˮJ Zuvumi~|߽_kyeF dwq30C8~$LO}&` ƃ2E%q;遇)*.&)1Ona;`i5pÏK5f;.ǣO< pcsbwᆲ_ """0MFrHϺukHK♓"0z4+ټ|!31CR =ba]K$95Y>iՒ o/""_mx[>?_PkZ'Y`;gG`4Sa%&$7A;6>i֮` e##XьJiӧəeL{{nyuZYl-Fu|n}>j͇OyKZ}}"҄:Ifz**ZŚ5[q4ΩI!W,~=_%"cQot0V>/RrCGQI+3'ňY<:,^D)?ma9y`K29; 9;Ҟ-4=fQ\\HGiIPqԩ lrccBg gTXv ;w$22 ???}RUeJI@@[+"=t NII +Z5@DD\LJBBCrH\N3|׭c"1)\8RTA%?]{xl\)O̝CdF_ޟWmd+ bʳ"҉'y3~aEGy䍅m~2ukt 5q<>^w3{^r9:97z~<(| `[ՇH{1 ӭ[J=O'"""""""J*>Jb{vq󉈈ҡxODDDDDDDĕT|6f {z>W3;teΝTVVp8aVKtt)ODDDDDDD4Q:d Y6vKϞ+xz>W38DDDDDDD$pw ki*>HК"""fl6;ع3{RQqDN L||qqL&wG6⣈|V@@XX8as@999ؾ=u0pt"r (..zwGחΝvwIΈQገªU+\HBBvv;dd2QXX_~Frr2}pwt`%%%ЧO_f㈈HaVŗpwq6VzJJKK?FbcQ]]}p8Q]]MHH(7x ^Eē]JjjoEDĥ|};ѯ_JJ4-kieEٚ&"uƥwi NQQrh6UW]{MXXV6䕰ΗDOEZ+UW[@ڄh zޟ1DDNiĄf .n,`oo1GTlb͖Ja& $>/'{4EJaUc֩綟ǯ_)FVy)IxA_tlRFAsVvq8 F… &4"-vM bفh5P>aZ.L"O v-ߵ2ڴj ))!"rJ۸i{ewJ)pq;{~儦aPjf[% Js 'kq"2?7gshCja\xvM^`oWhJȤaΌ+i+ں֭YtBTT46Q6H) 3Iଫϥo$*@Ň?:/{4~˲ZڿiՒv o/""___vx`[׈^]!}B0BXT7p6Ztv͛7w?!"">Rkۧﱤ%ݯC./W.ϷW?%.x={v8nپ}"-b'/+`i$zƮTHZڿkPSSla״UDDtCz12Ck9;kŖ.I8Txtm8KG0lɢCnEȫ*ٰ!-[ի[_<=_3{dsV>] }1w$ٹ@_|GɬvcᔫgS|p{s;w~Xlcޅ˘1Vz?<;$ˠ]uvy2*&t.ޭ^49~EN-7ݙ;֍ILLbժdd(ȩd"66fRV^T1@o"‚a@#Ag۵$3s=={FWӍZźuktAo '*ְgO%^l1{y';<(,,_~XV*++F22Vg;wA'yc&;wC_>&^;Y<]Cy Ǜ_Ɔa[;o߫xAN}9y??h]tC:||p#}|6]LT[[Ν;[P|[|}}J^m]#<<W`>q "Z\TToY1 !]LG0l3Z6 qҝ<=_S_u'MY&?x ؒeй7qdB?)nĥN7꿵w+ij0ZnV."ES 4hK;ۮᠮ"""Njkjz K(c{':]v1-Ń(;?|Q|΋!6+,N03i!!i[C. .?9""b}DE{MaazL&/vm<8j|YζkiQRRB]]-{~/c#""ZEfzJJJoc,; S<#BI[YX6Fc C(t);vV6ˊ,k(Jc{O BGVVF{r:dlϻt 9rM`wı8vRPkg(F*JJ"Ng~ =h|BZڿk]ʐ!CUxD~YGeܙG>c»V~AM,>^]%jqUZ5T|Ӌ{y} ^]L-G=l qla޽{&hfeT/:3bN/"֭YbiYaRR8D\|M5dI@ 8ۮFuڲ6a.ejj?cbliReFo3ۇq簭"C_mU@PU򺆊ҡxBO,!#p*|Zz5.GR|W&ǯ=b`gov?3+my8VwO|~Ohvb]*Y=ܗ{,!ʩ iX23ױ}{z`0=;'g555ĶQJϫ[?}o57lXN~P?.uC]i6MfsVV~A6ZBj+6?q6z+kaZ+^el7=7/b吖Ll %y'}-RQ:O5n?k x磥|Z==ͣ{7Y=w~ƴKqēv._DZbлw_֯_K``L&x9Tgݺ5 jI =l^ Ș!LLV%ݬvNٴjI]PZ-0п 䋈o6K<-/gס?g-,0ĝ)A_~`BPx\B;t';~$cUC46< ֭a1|S+x)p QD$ٰaw҇h|}}q8q8w5`4k3%a6GeřidRP*>\("".WSSͲeKݻ8Sc&f>JtO'"Z^B^__ ^^8ꩭ{nbbҧO_EE[ ~_~^5a7|ɎݯEPa27=AVG]ă}x>$w#"""gTXv ;w$22 ???}RUeJI@@[+"=t NII +Z#""aa;JԬy7 goqa07h~6E|ZxkSBkfvKi棈 tOPP0{졤m۲d2aJll7"# l"~oE oDͻ~Ӟ;^y?|ײ] y1xkWiEUHVVVC`yG vw$9y|y!"b6 #((lL&1}H%^ ~|f /= v].Ą?OVMpU?r*8As7ws.|qۢ\oe'}]OD f@BBBX !((PGY!\f1N_J?5zy9_"G$vݼ W7w`0r{74k#0LdC o; /z/^ zMSΖo'L0ui GTP,x:ӕP]oaUeL2`8Y~^=3.! {.<&%&]<2÷aCLt4EE<4yJ9.*.&6& EDDDDDDD֬c9v)[ϼG{G/ Gl'3>f}E PگgqE\6]H4qG],eho䊿e!Δ_4~ +,]5O޿=!  rpR>nQqldzW]QZ3cՖ|j;=Asf)S#>.ӟ=)ܼ<fπtU^}9K4QDDDDDDD] {7?sMn'-tkX NÞ]E\-HDF6K5b.s@U'p.7_ 9$k.`$L d]!@Mq1e;HlLF^3'=[_8lÏӦP}cc9}iD5QDDDDDDD |C^tP`ppC!m` |@Ј _I_ǬٺxmNZ}+fcF x6 ܙWIDATd2QXXЮp85}*wMz_0QGRDD#8G Zx%)]z r_~i &_?Y0oi_9Dl5b?j{f#]v \WfN|2xtX*?dS>72sDpWP96F:JKn}>T1u*N3EDDDDDDв#&؛d$?[/~Cpoօ<~˫@%s-Ϭ%x~v3͍\¿,YSDm?|̶G0I_Λ +z?#o,do ]{ s޶ %.EV!""""""" B!޽[3dgoa1|z >ɂ z.**J<>/;; :yy&Sif>J1<5CNNIg>zrC4QDDDDDDD\{p;!DIENDB`easyeffects-4.8.7/images/master_screenshot_test.png000066400000000000000000103504251424023573300226120ustar00rootroot00000000000000PNG  IHDRsBITO IDATx {39>28=!b IDAT!$6ag IDAT!, IDAT   -&+ IDAT   { 28=28=!!!! '+.&*/ '+.&*/ '+.&*/ '+.&*/ '+.!] IDATךo7l{<۰'\k;ql1!!!  |z -;K]Q5|z'ZI㼣#UMЛr 7fo;mGya(    IDAT ;I3ƹa.1̍e Bto3zq [VԲ&0=NNA/ڷ0@Q`O/ﶆrǒTQ%YOڷ0@Q`O/ݻ0K[ZO'y|칅RCR&0=NNA/ڳ PM̿+X-ݨ%OsL٥ta+ J|n:mn4ﶆsP~X"ܦ%OsL٥ta+ ުB1&"+װ ,CIʫͭ P' ʹPlI",CIʫͭ P' ʹPlI"-DK ˩֮'^5۾1T? (ݵ>B1&"+װ 쌏 {싓QLH/,)ݑ  LHF543hdbƭqkjMaPߟҼm)B@."!=P黯"6WSX9 "XyvÔj ")7HQ> ďUC^-"XyvÔj ")7HQ> !Vxẉti.IZ[.IQ9Мb[0ct=P*"6WSX9 z[  1Mbk_5njMG pml987OVX\YXidb28= ␘}w %*-:9DA>ǀyu!$(39>m IDATãkd_#!730RMIŞ  744411:975^W7Okl-Z״5w4Ლ,BcncCѪ%4PcfV.ڲ,BcncCiR=,fE뫔%4PcfV.Ɗurp:86eb`7>@JGHHEC–qlj3.,mf`<87RMI@>>CA@:87u)ޭy}]-ˢ|b'䲐A*,?鵆}]-ˢ|bBmaRK ՞{A*,?쌐B>;tpnD@>C@=v~=DHü=DHüB?>@>=̥-m)+TgN"῱#_O* 2\`B]' &Ep)#_O* 2\`B])(&Ep)l IDAT}0/.ڀ:7tsyts?<9rxz΍653 1/.-+)#! RNKqA  3YoL ͉QD H,Ry{g.CPRG& ͉QD HRy{g.CPRG& olk.,+753{zchkTRPmhg '&%FBB)''hnqRON643=;:Wp. 9kO7\<`ẍmyy@ 9kO7\<`ẍmyyB 431IGFsnnÖtpnHEB=96h`\.*)HGEzvu$"!~{zGFDyqliA?>okh@>> IDATYURCR-eD+Һ"qc8ףRH5&CR-eD+Һ"qc=  + ΣRH5&eba;;8|xv>EI»QZ`ÖtpnD@=zutHEBE@;JHF=:8GEDNIFQE@ GEMQC>QC>QE@R@; O;6 &;>H 81/:66 R@; UJH QC>QC>QE@R@; O;6 QE@ GEMQC>QC>QE@R@; O;6  >88 733PLILR`LpQt2Wy\LpQt ,\cWy\>:7EC@ IDATumhb\Vheclih4;='&%EAA 󻾾(&&PMLΠTPOSG>UJC  SG>TIA B81 QKPLA9 ??FTIA   SG>SG>UJC  SG>-%D?IEJ@<:!1.->FJº {skdyts &$$yusSPOLII439 QLQZFD  71-!B25B25 42@K>8!439:56  868" "B25B25 42@K>8!439 QLQZFD  71-!B25B25 42@K>8!439*'=1(' 2'1 ?98 C=;  QLQ439A>;%#"1.- QPN" V\`+*(ywkge;97rnl.06YRM ޾ 4/* "'D87 ƻV** *-=,#,#W.06H;1' HA@(_TY** *-=,#,#W.06YRM ޾ 4/* "'D87 ƻV** *-=,#,#W.06 ZPM=4.80N9:CYRM.06('& IDATyvuNSVyvtȿ#!   ZROú  7>C7>C-$!%+UIB C=@ȿ#! UIB QF=PJO #'5UIB 7>C7>C-$!%+UIB C=@ȿ#!   ZROú  7>C7>C-$!%+UIB C=@ȿ#! ,)-#!& ȿ#! 51.+!+!W IEHPHJ &"&    A@HE80 E8/") !'E:<+!+!W ,#$  65<E80 E8/") !'E:<+!+!W IEHPHJ &"&    A@HE80 E8/") !'E:<+!+!W   IEHPHJ+!+!W   .07 '$ $&-0 #4*4*F4*4*F4*:1)½@=@D75  .07 IDAT&#% 55<4*4*F4*4*F4*:1)½@=@D75  .07 '$ $&-0 #4*4*F4*4*F4*:1)½@=@D75  .07  %(/   '$ .07$#!>;9: /$_TY@77Ү A40  @;BͿ [RX/ $+?. $_TY5,$@;FK=7": D;@ݬ SLSYMXOB=/ $+?. $_TY5,$@;FK=7": /$_TY@77Ү A40  @;BͿ [RX/ $+?. $_TY5,$@;FK=7":@89ӭ =8; /$:)&$)&$LHEJEB28=  %( %( #% ﱷ_YV RMJKABKABKAB󶻾`ZV *('#% #% #% #'+39>&ڂ IDAT  (&$631JEHJEHJEH EB?875     (&$621732732C@>    731731 P IDAT              {  X IDATNrv7 IDATŕl IDAT%)-39>SA IDAT {/ IDAT᳸ IDATI IDAT%] IDAT {Hà IDATa IDAT\_: IDATgulJ IDAT {z IDATL IDAT#] IDAT$ IDAT_ IDAT {7j E IDATI IDAT_' IDATuxq IDAT {# IDATt5 IDATJ IDAT4d IDAT {9X‚ IDATQ IDAT}N IDAT IDAT {Y IDATR IDAT1 IDATH(N IDAT {n^ IDAT1 IDAT IDAT%q IDAT {gj IDATB IDAT@ IDAT٢$ IDATfJvfJvfJv { IDAT˫q`GFG?N]j™yYOJ>HU]}vJQlJ]qM:BȧPD8?B8?B8?B8?B9DnvJQlJ]ΑX:?B8?B9IΑX:?B8?B9I˫q`GFG?N]jvJQlJ]Ыn\GGJKb›nUNJ?JW^|™yYOJ>HU]}vJQlJ]›nUNJ?JW^|ʎU:?B8?B8?B8?GhvJQlJ]̞hOJHHU]}vJQlJ]б-\d!ڙtܦ`Rz୏(4yR +B@2o‡F 2o‡F б-\d!ڙtҝo}I{HȶAjM~ܦ`RzȶAjM~RT️:t,~୏(б-\d!ڙtܦ`Rz6h6">aM@/ص,ZF %OfOcMb ʋLwPx4ᮊg{%nʱ6lAʋLwPx46h6">aM@/_ IDATʋLwPx4긠JtI) 9bk Biw *OK2!ص,ZF %OfOcMb ʋLwPx4 Biw *OK2!ݮR}Q( ʋLwPx4)VM08M> <ᮊg{%nݮR}Q( ʋLwPx46h6">aM@/ص,ZF %OfOcMb ݮR}Q( ʋLwPx4#F(%&& 6uu֢vw0J)ߧd==:6uu֢vw0J)#F6uu֢vw0J))~a| 4Qhnb6ܷ6c,(%&& 6uu֢vw0J)ܷ6c,}G *;QihP-ʖ}%km=6uu֢vw0J) <;;U+ ̵#<8ߧd=ʖ}%km=6uu֢vw0J)#F(%&& ʖ}%km=6uu֢vw0J)߰$iB  n<%4䷇{s`. ۩c=巵E4 n<%4䷇{s`. ߰$iBn<%4䷇{s`. ϽwٯxV|K Kz>  n<%4䷇{s`. |K Kz>6rrȢrN޴~K~Y* n<%4䷇{s`. -[qS|~iR8mP$۩c=޴~K~Y* n<%4䷇{s`. ߰$iB  ޴~K~Y* n<%4䷇{s`. = IDATܮrYQ Ul,ndʕvZ{@ݫg=ٸ!Ky'Ul,ndʕvZ{@ܮrYQUl,ndʕvZ{@ #K]K#.SZCxU HHƦp q8 Ul,ndʕvZ{@ HHƦp q9 #>jhtLSٷGP) Ul,ndʕvZ{@ޣwzl@"׶|tNݫg=ٷGP) Ul,ndʕvZ{@ܮrYQ ٷGP) Ul,ndʕvZ{@զ}o^\' "#$!٧y<||T|QC8?B:UfGUʹ-II٧y<||Tզ}o^\' ٧y<||T!&!@WG'"#$!٧y<||T!@WG'/ex!yv٧y<||T?PC%,MM7|QC8?B:UfGU/ex!yv٧y<||Tզ}o^\' "#$!/ex!yv٧y<||TΝxth~T# (JIԩܲ+JF组kh/  Dƫn2`j+DZ:L@组kh/ Νxth~T# 组kh/ !GL)涣ӭ,@3ɞۻ +.(JIԩܲ+JF组kh/  IDATɞۻ +.ɋR?tɘØ+>7Hzv {t组kh/ #$׶&!ɋR?t Dƫn2`j+Hzv {t组kh/ Νxth~T# (JIԩܲ+JFHzv {t组kh/ Ƥ\ Ey<%Z~lT 5O|MŴWPx4龴 ?9 ŴWPx4yNwE2wQyNwE2wPƤ\ Ey<ŴWPx4P|vW"7XlO/F7ښs!.=s`= %Z~lT 5O|MŴWPx4/F7ښs!.=s`= 0MDڙs *;`fM?rzqvo@ŴWPx4.hllV/Fy}\#?rzqvo@ŴWPx4Ƥ\ Ey<%Z~lT 5O|M?rzqvo@ŴWPx428=).228=39> {W IDATѿ IDAT!"# ('& IDAT('&GŽG IDAT*)(6C IDAT {[ IDATtm{,tm{,tm{,:K0RJV%QL IDAT M( $ C ( :)L+tkV DtkV DtkVu O< R' aaidcf44l@hVu U?Q$ tkV G39k2$ ^U~ IDATG/). &/#S UNg/#S UNgcXx5 a^ 66BJC{-:8gYr1Lx34U #/$ȴ^ EBN |A (hPV3 K LI.I.! U4$ ! R  Q   F,0t.. ! cD/    ;;a,#     m'ZGZt[} IDAT {M) x & >      '> 0G4  ""! k;,4 @% ? u666M)(. 7  O(. 7  O^C #  Y@ "  V& S536 + J 6B/ T10. CRCR= R&ok-xfX?+ ;#yL? P3> \EyJK IDAT28=28=6tkVutkVuC PML('&28=39>ƾ IDAT' IDAT{rÁc IDAT {\! IDAT#fI IDAT  + IDAT  D IDAT   {@~ IDAT' IDATn Pn PG` IDAT׆4]N m??n PjBs`8  .QiA$7an PȂ1_AjŔhG- !8XnBtc=" Mgkm_df( IDATbͱgӰ|PU#ҢU ʡow+~MlBʁHFn `֜CPErĴE_^bd`]\hdc_ceJOQKPR {6^h<4'@bf1 6$ Rov@NiU%؟D`7h~V(ron@>=987txyB@?hedMKJ)('vz|><;hedő$## Z4Z_a@>=@>=Z_aHe IDAT$##V[]V[]$##^M }zy976pml<;:osua_^TQPpmlJHHkgg&%$ @ Dki/а.z> tt1MKJMKJ422&%$ǚife;99B IDATOjCpS-cJ6i:V'$>[S|c.;99;9928=28= PML('&28=39>G8 IDATdk IDAT {1W IDATFYh IDAT        R9 IDAT    ; IDAT { IDAT5 IDATx IDAT    [ IDAT   {I IDATq IDATj$ IDATn PdUN m۵hL6% "-;N𷟬r;3Mw^ɱc.?[ U& IDAT欟34 Z `ߐ=2т1_AjÒfE,/Il}ec}M,  '7OpR ׆4(@`n PnDymD'  2Ygkm_dfݧSX$̡,~MlBGGph߬WhDOȯER?)z٨XǢuPeĵG͟Uϩvs^bd`]\hdc_ceJOQKPR.X IDAT {ңOU@:US&إ Bhn8 Bna7ǓAJ EUD6ctJ A?+txyb`_987987b`_txyMKJTQPƠPU:.TS)᪟  ldⶁX;'<Z_a@>=@>=Z_a$##V[]V[]$##󼟪@1걟 7QL뼱u[4lnrturqpmlpmlzwuosupml\ab\abpmlM IDAT쳟]l񹟫!̻ڪ  Eig, 迒 6je: Ei- ߛd^ ҟMKJ976422TQP&%$ifeife&%$嬠BM@ 7MGß1o~L)O,;p/J1CpS-cJ9b4DQ?gu-Jˬ[$ޒX0 1y1BS`M- Sj>h-$?~-=;99;9928=28=ק IDAT PML('&28=39>n< IDATA IDAT {vX IDAT  u IDAT          {m IDATjٵ IDAT {J IDAT IDAT  C IDAT  I IDAT   {Ѽ[ IDATX IDAT%} IDAT۵hL6% "-;NN mr;3Mw^ɱc.}ec}M,  '7OpR ׆4(@`ӂ1_AjŔhG- !8Xgkm_dfE_ IDATȯER?)z٨XǢuPe-~MlBʁHFn `֜CPEr^bd`]\hdc_ceJOQKPR {AJ EUD Gov@!NiU%ܟtxyb`_987987b`_txyMKJTQPldⶁX;'<Z4 IDATZ_a@>=@>=Z_a$##V[]V[]$##7QL뼱u[4l^ҁ0nrturqpmlpmlzwuosupml\ab\abpml EiVԛd^!b>  ҟ @ Dki/а.z> tt1MKJMKJ422&%$ǚife;99) IDATJˬ[$ޒX0 1y1BS`M- Sj>h-$?~-=CpS-cJ6i:V'$>[S|c.;99;99 )R|R|%XX 2nn:jjm' IDATxe7 IDAT {8 IDAT5Q7i IDAT       (# IDAT     X IDAT {i IDAT8I IDAT,e IDAT    .4 IDAT   U} r0 IDAT IDATt IDATn Pn Pn PD$s׆4+zj GN m۵hL6% "-;NN m؜䦍?[ r;3Mw^ɱc.)Γ IDAT찍͖ Z `ߐ=2Ղ1_Ajn Pќg?# #An׆4(@`nDymD'  2Yաh=  'Fo}ec}M,  '7OpR ׆4(@`ӂ1_AjŔhG- !8Xgkm_dfUmX̕఍%alJ+~MlBķQڽv(_Q)z٨XǢuPeĵG͟UϩvsxOd,x˜A׶ȯER?)z٨XǢuPe-~MlBʁHFn `֜CPEr^bd`]\hdc_ceJOQKPR!̞ IDAT Dpi2sQ~ ?ok62_nE 9ld=أ EUD6ctJ A?+Aho<MlY(AJ EUD Gov@!NiU%ܟtxyb`_987987b`_txyMKJTQP)drMXs\ⶁX;'<  ldⶁX;'<Z4Z_a@>=@>=Z_a$##V[]V[]$##Qra%0hpE u[4l 7QL뼱u[4l^ҁ0nrturqpmlpmlzwuosupml\ab\abpmlIQ IDAT9{+!̻ڪ ͡Ȕ&[]: ҟ A^Y ⴕ Ei- ߛd^ ҟ  Dki/ ¥[XMKJ976422TQP&%$ifeife&%$1o~L)O,;p/J1CpS-cJh-$?~-= Cc9҇D)1_%H5Jˬ[$ޒX0 1y1BS`M- Sj>h-$?~-=CpS-cJ6i:V'$>[S|c.;99;9928=28=K$ IDAT PML('&28=39>.P IDATa`, IDAT IDAT  -l IDAT          ?V IDAT/g IDAT IDATy. IDAT   IDAT  b IDAT   E] IDATn IDATQ[ IDATٱdH2!  )9Nq;4Q{kèM}fctD# (;UzQÒfE,/IljBs`8  .QiA$7anCvg?# #AnnBtc=" MŔhG- !8XZ9#  #4KjZ9#  #4KjÒfE,/IlnBtc=" Mgkm_df: IDATɯEQ> GGph߬WhDObͱgӰ|PU#ҢU ʡowķQڽv(_QĴEWۂHFn `֜CPErƇc{jŸo.ݓƇc{jŸo.ݓGGph߬WhDOĴE_^bd`]\hdc_ceJOQKPR Bhn8 Bna7Ǔ6^h<24'@bf186$2_nE 9ld=أ7h~V( Gov@!NiU%ܟħ'YGħ'YG Bhn8 Bna7Ǔ7h~V(txyb`_987987b`_txyMKJTQP   Z4?mQ& mZL>0!9t?mQ& mZL>0!9t  ֊m IDATZ_a@>=@>=Z_a$##V[]V[]$##7QL켱  ^ҁ0.i}HȔ.i}HȔ nrturqpmlpmlzwuosupml\ab\abpml Ei- e_ɯaz Eig, 迒 6je:͡Ȕ&[]; Dki/ ¥[Xˊ[g5DID,  ˊ[g5DID,   Eig, 迒 6je:MKJ976422TQP&%$ifeife&%$'Z IDATJˬ\$ݐT, "5Pv  9b4DQ?gu-[S|c.1bt@qM/I3UR1bt@qM/I3UR 9b4DQ?gu-;99;9928=28=n$CO[  (&&('&28=39>*((*((E` IDAT?I IDAT2s IDAT IDAT       % IDAT      IDAT{B IDATæc IDATX IDAT    w6 IDAT   b IDATT/ IDATTy IDATn Pn Pn PD$s׆4+zj GN mٱdH2!  )9N؜䦍?[ q;4Q{kèM`Ar IDAT찍͖ Z `ߐ=2ӂ1_Ajn Pќg?# #An׆4(@`nDymD'  2Yաh=  'Fo}fctD# (;UzQÒfE,/IljBs`8  .QiA$7anCvg?# #AnnBtc=" MŔhG- !8XZ9#  #4KjZ9#  #4KjÒfE,/IlnBtc=" Mgkm_dfUmX̕఍%alJ-~MlBķQڽv(_Q)z٨XǢuPeĵG͟UϩvsxOd,x˜A׶ɯEQ> GGph߬WhDObͱgӰ|PU#ҢU ʡowķQڽv(_QĴEWۂHFn `֜CPErƇc{jŸo.ݓƇc{jŸo.ݓGGph߬WhDOĴE_^bd`]\hdc_ceJOQKPR` IDAT Dpi2sQ~ ?ok62_nE 9ld=أ EUD6ctJ A?+Aho<MlY( Bhn8 Bna7Ǔ6^h<24'@bf186$2_nE 9ld=أ7h~V( Gov@!NiU%ܟħ'YGħ'YG Bhn8 Bna7Ǔ7h~V(txyb`_987987b`_txyMKJTQP)drMXs\ⶁX;'<     Z4?mQ& mZL>0!9t?mQ& mZL>0!9t  Z_a@>=@>=Z_a$##V[]V[]$##Qra%0hpE u[4l 7QL켱  ^ҁ0.i}HȔ.i}HȔ nrturqpmlpmlzwuosupml\ab\abpmlX| IDAT9{+!̻ڪ ͡Ȕ&[]: ҟ A^Y ⴕ Ei- e_ɯaz Eig, 迒 6je:͡Ȕ&[]; Dki/ ¥[Xˊ[g5DID,  ˊ[g5DID,   Eig, 迒 6je:MKJ976422TQP&%$ifeife&%$1o~L)O,;p/J1CpS-cJh-$?~-= Cc9҇D)1_%H5Jˬ\$ݐT, "5Pv  9b4DQ?gu-[S|c.1bt@qM/I3UR1bt@qM/I3UR 9b4DQ?gu-;99;9928=28=& IDATn$CO[  ('&28=39> IDAT?>] IDAT-4 IDAT  Ր IDAT          ai IDAT՞n IDATr6@ IDATR IDAT  ~{ IDAT   IDAT   _ IDATb IDATn PE! IDATٱdH2!  )9Nq;4Q{kèM}fctD# (;UzQÒfE,/IlnDymD'  2Yh[}- DÒfE,/Ilh[}- DŔhG- !8XnBtc=" Mgkm_df IDATɯEQ> GGph߬WhDOĵG͟Uϩvs@b[%˦IcVGGph߬WhDO @b[%˦IcV́HFn `֜CPErĴE_^bd`]\hdc_ceJOQKPR Bhn8 Bna7Ǔ6ctJ A?+3`_1񹥲ƦRcM Bhn8 Bna7Ǔ3`_1񹥲ƦRcM Gov@!NiU%ܟ7h~V(txyb`_987987b`_txyMKJTQP  &\b? ھ#ZcC   &\b? ھ#ZcC Z4'w IDATZ_a@>=@>=Z_a$##V[]V[]$##7QL켱FC  UbIzÚi0_`6 UbIzÚi0_`6^M }zy976pml<;:osua_^TQPpmlJHHkgg&%$ Ei- e_ɯaz Eig, 迒 6je:LbSп =c]) Eig, 迒 6je:LbSп =c]) Dki/ ¥[XMKJ976422TQP&%$ifeife&%$' IDATJˬ\$ݐT, "5Pv  9b4DQ?gu- CbZ#HcV 9b4DQ?gu- CbZ#HcV 6i:V'$>[S|c.;99;9928=28= ('&28=39>?ȡ IDAT$ IDAT IDATf IDAT       Jj IDAT     !dr IDAT-1 IDATu2 IDATƠ IDAT    b IDAT   I* IDAT IDATBW IDATn P׆4 *?]׆4<\s!ä}Ud\r"N IDAT0F<׆4(@`Z9#  #4KjZ9#  #4KjnDymD'  2YԡmD'  2Y׆4(@`nDymD'  2YɚnM2  7[ŔhG- !8XnBtc=" Mgkm_dfҼ69))z٨XǢuPeƇc{jŸo.ݓƇc{jŸo.ݓĵG͟UϩvsĵG͟Uϩvs)z٨XǢuPeĵG͟Uϩvs˃ICh?͢`ʁHFn `֜CPErĴE_^bd`]\hdc_ceJOQKPR-H IDATO3|4gnJ EUDħ'YGħ'YGO%u6ctJ A?+6ctJ A?+ EUD6ctJ A?+Bu]- 'Eo`* Gov@!NiU%ܟ7h~V(txyb`_987987b`_txyMKJTQP\ˇ@ ʈQ[ⶁX;'<?mQ& mZL>0!9t?mQ& mZL>0!9t\ۋ9ⶁX;'<Z4Z_a@>=@>=Z_a$##V[]V[]$##1PG'u[4l.i}HȔ.i}HȔu[4l^ҁ0nrturqpmlpmlzwuosupml\ab\abpmlH5[u IDATϰ+/' ҟˊ[g5DID,  ˊ[g5DID,   ҟ Dkk1 vݽ| Dki/ ¥[XMKJ976422TQP&%$ifeife&%$O;:X~o(Sj>h-$?~-=1bt@qM/I3UR1bt@qM/I3UROjSj>h-$?~-=5~kE n5/YDK' 6i:V'$>[S|c.;99;9928=28= IDAT ('&28=39> IDAT IDAT[" IDAT  2"d IDAT           IDATـ IDATS IDAT w IDAT    IDAT  Tv IDAT   'A{ IDAT, IDATn PkU IDAT׆4<N m\N?a!FQTɚnM2  7[n PƂ1_AjŔhG- !8XnBtc=" Mgkm_dfq4 IDATNp,zdgr%e[˃ICh?͢`-~MlBʁHFn `֜CPErĴE_^bd`]\hdc_ceJOQKPRO$t֋9>>yyQ 2{HGu]-Eo Rov@NiU%؟D`7h~V(ron@>=987txyB@?hedMKJ)('vz|><;hedő$##\ۋ9/ivPFpn6 Z4\8 IDATZ_a@>=@>=Z_a$##V[]V[]$##zv {qCS^M }zy976pml<;:osua_^TQPpmlJHHkgg&%$jaTŧ_hc Dkk1 vݽ|  Dki/ ¥[XMKJ976422TQP&%$ifeife&%$, IDATOjٖak]Z1Oh&t^5~kE n5/YDK'CpS-cJ6i:V'$>[S|c.;99;9928=28= ('&28=39> IDATN3 IDATc IDATl\ IDAT       m IDAT     )> IDAT , IDAT;e7 IDATE[ IDAT    @ZK IDAT   ] IDATڥ# IDAT IDATn Pn PٱdH2!  )9NN mrETNd<îz IDAT?}fctD# (;UzQnBtc="_x( JZ9#  #4Kjӂ1_Aj׆4(@`n PkfŔhG- !8XnBtc=" Mgkm_dfɯEQ> ĴEn%객ͬ DZI݈c{jŸo.ݓ-~MlB )z٨XǢuPeAюCʁHFn `֜CPErĴE_^bd`]\hdc_ceJOQKPRvr IDAT7h~V(5de5󻝧˫HZKħ'YG EUDeOw(d|> Gov@!NiU%ܟ7h~V(txyb`_987987b`_txyMKJTQP%]hGǞƫKYH?mQ& mZL>0!9tⶁX;'<{PbKKZ4Z_a@>=@>=Z_a$##V[]V[]$##7QL켱RiU֝jtMYE.i}HȔu[4lחZU 5ze&^ҁ0nrturqpmlpmlzwuosupml\ab\abpml> IDAT Ei- e_ɯaz Cg_(PYA ˊ[g5DID,    ҟru"]; Dki/ ¥[XMKJ976422TQP&%$ifeife&%$Jˬ\$ݐT, "5Pv 2cf: RZ= 1bt@qM/I3URCpS-cJRj>h-$?~-=ޢTf 6i:V'$>[S|c.;99;9928=28=B%n&vԉ7|P IDAT ('&28=39>ݶ 6ea4N 'n :in()$ IDAT^^N9 IDAT IDAT  . IDAT       IDAT28=\uv IDATE IDATkN IDAT=O IDAT=O IDAT=O IDATB IDAT=O IDAT=O IDAT=O IDAT IDAT=O IDAT=O IDAT=O IDATf IDAT=O IDAT=O IDAT=O IDATq IDAT=O IDAT=O IDAT=O IDATek IDAT=O IDAT=O IDAT=O IDAT_- IDAT=O IDAT=O IDAT=O IDATB.# IDAT=O%IDATɢ?"hvIENDB`easyeffects-4.8.7/images/pulseeffects.png000066400000000000000000002256001424023573300205060ustar00rootroot00000000000000PNG  IHDR#+TsBIT|dtEXtSoftwaregnome-screenshot>*tEXtCreation Timesex 11 Jan 2019 10:53:07 -02G  IDATxwXW{+K]:*"`b4bIyDXb45=k1DcE]l 4[?]`]2̳-9s@K6}{h$Gۻ~JJaI^^uDE""""""H$0 W%Z wt@DDDDDD$D+7&E$]^wlP(F֑#k#"""t* ^^M񥦦"00ЮqI$$//$dee2c:ΣG^9vAA>N<ww4hnNrr''#"""9]U鴸q}9cX;I$~bܸdff8R8t(AsF:7oB.>"f-;]|T7m=gG; 1c +#t$~Yq_/»Q{<)_c/q&Kzhm#"9]UիW9h4 'E降wz=F#Z`"F aM|D8ξ09gbo|?9Ύ+ __w-b#9[w&ތL'H#G%*r.Gr4>&"+圮*dj}&l`0XQqc#rħX8 @έIښXbϴ{q!V%)lێL&$~nѠӴ۾ï9Iɢؗ{|Dh.h \u?^@fF& 88w Y uCl(ًNOq9 \]@7W/ʞכEjOOl}]LLj#+?q|*rn C~/%wB}?}ێ|Z1uȈl8Yk>V6vl@׾xh#@&~h2,dqqvX ^4']ok}cmՊJDT.b?g{|T>YEGDfD+S4ETbWikΔpL¹7BwB6<ۑ zhߦ֜o1˝]?}7a^?9b!<#:]3Ф)< p~vDXh wrr"&zz'ꇇAt ꉖƑFEuCl"r3N-r qR .h$<]<3Za0f^C/X#XYK8}6n{pbΜ;�ʼnK c`puq +_"rؗXZ[+|݊AG؝_; `(3<*L,sp\` 1`|{kx&Ƃ/BFf}`҄h*VgD ZīS࿟ERr2ioإWqɓh4H<~~YǬfFB"`[qUGFDUF79q$$k5jnXgwצcg@3Hhp +ڴS^M3,׫~}x0ل)PqwJD5'Wì#YkEE_}]9M{3231Ïp=50HpAu˳UO)SjMeqft:nO$޳ m H\dQhR}p vAd䏀iy>2{<=h"ⳇpsf!xeFL#[&ΞHAkJ냧g+ f>}nÉ?ilmy;?~6rAMяg?DTChu.fs&N@vŭ[ؽw/zn,230l`9JW!YUo VTj6ѲYs xΝD.\@`@@Ŋjf K8yyy]Z 2 >߈3ejq%qr@o}¹=pps - 4KǐY۲%ei$:'D6V:}^Ō˟᫿D^+ n|tvt:k 8>H"SvhѼ֬[?^Fbb0й{ulfhLpw43gӳ=-8rM噼sg<ZqZӌ?.G~~J EKJ:돟2/ClaK+'㡇,۹3\hb"ޝ_xx`0P(0bsoMCk cGDDDd9]utRl cW Eǡ]pvvF^^2 ЪziiV\| ݽϕ::YsHp cO!Hko_~\fǪtU~~``YUv7n)еK%Z-&DDDDg3RY4I?^E2; qy\wFHxfTDu: G~Y}KaߛX2 8e7~O8\#GP ~3Gcn?^cklJɆ20MØ3E-^ֱ-JmԦǪ1hoMyժ}@m}5 ?_2CJ ҩCѝ:tU %*g"""";1ߝ{!<K۱- ¨WsI0@,z%Zp}-ηymy.]/_n\)__C Ǜj_OFΕ|vΩnfd }͛sHrw7o6tpFOwÞڕV4PTTLW IN` Z|m?Ti(xV ZK)JHp3{3gDLmlS"+;^S(?.Bq1Q;#6-%dڃY7z`%zaƮ> h&\qFX˶h@ U5?G!hZU/0 cѦUK3m*OzzCaah4ƒBw4UikKV8;GypHp0.^͛@B-7 {b=Ec<QחُV7ok,&x{y)E( 7"dzzuڌ/罆sѺu;t A.&zq>M#m?Uy ~&,j {s*ZŶ|NG{`㐛kaUnѢ)#3/N~ /]Bz.^ĤɯbmcUih{__)NƜ>'7&}>z5ڥm܈c3 a0ϞJp9+Vqq1oh2>D/t~a6ZƝppzO~c\VG 0_.f+gFcعkuޘMI`n-N3 pwGakS߼(~ ^…iXtX{~͙윻K>6bꅆ⽷ݽB/ך3}zd<{v44g0ˆ}zBqT4&#̬,$>vmZȄEGJDDDGqq1֬ۀ6 Y|ԓ5(=Aa{+f <Ӯl5@3者@=s+.](˳٨'q\ JqN9{GDysq;jxqk8{MUdA0L-|0cde,-]7$/_ƌf㽷ͭ/ϋ͜?֬^}qwV-wл'`l@fyT|+3+ YmCAao/89}{̖;rbTC{wcΧ:oF#4͝6pw-D"ϦPw[0Ope̘Iz&u+âw_[nUƚzï+Ǿ Jߧ7{" 瑟 OWmQΈ}b9B'u o X/<dA,] BYX&"z%d',\ +#LEtly[m/5?73G!;cGNV6W ئch;S\XzVgc;V]'Q7..}VL¤[7b=.B{iBn_~GzNdnhvވ 379?1o:V_:8{!TjFԊ$vFdIm,g_nU+WT0%YFK9:h4VI6gN` ΛP=ޛS1Ïqe |r< >‰>׀A訦7u|K?V%zWY[k3Ck{E&C@G Rcc&o\IςҐ!{CrElؼFZZa퐛Ċr]R*ڪyϫmL&tFJPM+Gzn z2HC4bǗUCj<~Yv:2zR.gNP%VܻAa/"vX9[ N#3+LYM;"ʳȜ*YKi\j4 0PhD^'N[Y5jxvSpW( <Թ;Nqe~bz#DH!7ELsxC@dP{#7du okpRP~+|žH"Z A`K%C^]ڡivuĪmWJ mx?)ߏ5턞q{y.YK.| 3HkKTo:~~es38Xf{?xSV)U:j)s>YǖŻovu._T8X_~~>ޙ6(**͛7t=GO#q 7+LԐ ?N7w8tmCz^pR1Q[ۑ~.*zt `SrJdhp%9?8Ry)naH=md‰d\8=?~'_PTbyۮV=mg=[aeM~mgs36e˜Ѽa4N?1M!7' u=ѻǣP8NU>(*pra]"gqRˆ㷟!Y>=uD+$FvI+X/]Pfm|F#pFZGCj<_@_i8tpF {*OG飐@ݺ(pp94 [ȱuh8ĕ7i@ij-R7zv /2KsB=Çl$t&kMQ]Z2t5b@N?"21ߣ*]j8tp7?k*,]jr{g QPK5H}EͥK`2U{IK`Fp`'Zw|2 C}L}nv-t*6ڎGuhժL\-ˆ~Mre!/+MB $ n^uq:|?PSiX7,GJj6v߉ sYj24Z oB]!UbUmg.{.hCkk:QdދGaչamLPn=Hd2xK`?)%I`dHN _;cPc^b?g{|T;1Y$'&/^ºۋ%7~*# 42;@Y4{|br SBسJaQޣgw'Qo 8KF=K RFDF&! Q2-:Z COO4F|[$p2*ǟ u̖w1@0SϽGX}ن{%.^ G̓#MVmە_E۰2ئwhNuo;avA˯G~E9Iɢo=>1..:* 11س?d[*fY{~ٙiήn0 ~n\=9yE8tx?"obH=m!!9nvgvކ29sI@d]56Dh}9cWYr#dرoE@CRJ0w?G&^fVmKmĀ]!q̊XYj;K*׆6yչ턙k۽^;b/=u+k7l(/ gg۷%s6G`P(묚*9K`ЗY~#Ժ/lR|b酴8~bq ˔ے0sJnANMdRԭユ1"@8EpsU!q8Zƶk8Q(R|;"ZwAϭ٩57A\^رkUNvCG@'Q܅$Dmig,CҥKW\iXH:,^-ƄywD^aoUG:|soaӎ}0hXukgb,Q*jC~v8yePt|S0r e 涝sn&6A1fڭGz؊5G~~N7Y722zz 8Ɏl IDAT*ɔ*O,tUIUs6G$//d6 x{8œtAA}!ZQQ!RQ~C4hnNrr.^LH&>Irkox~}j61U\2i\=۴bۑ-egg5kܨQ(,,ukq3#J{pNWt:-0ӽb?g{| k\$+yݸ"jUJ)Ǝrl'''baaaHKGA"aM|bS7$Cʄڶi}'T^/@JW-WjmZ}Ȗ<==1j q⏵kq##7oи8S tUIPO8Q&Y$"""WXX5Ao0`ēO8:";,l?$U{r.JDDDDDDt:G@DDDDDD"#pt DDDDDD$2W;:"""""" ޴HDDDD6|Rb„*M,_a_.rt8DTILJF#"" #Q d*DQ.AP2a$,Qݟ(bHT1Y$""" JK1a$ޘ,QYJK1a$,QX(bHT=1Y$""""7Q,ńaHDDDDVhX #Qd,lX #Q!`ttDDDT$ RF#O/jwwtJ'j58{, rmOD ;vb9*"Uڗ_.BF ///H$GDDk׮ܹ0aC AQ5vr܂h`[HHBjF.4 w4hGzuBkI+f"gB3t*Q7tR\V$B%Er'/-µw9\ůZvx9U*Gݺ>%6lo :Z }\y{zD J>.MDHnti/t^S^2lqP~c>o$<;].ULֺ&X&Qw&َ4/_,71IRAaquX&Ǔ@RYgHKKTHM~gijuu-ձVU8Ѿg$~G}hܥ_뢁*fAۛw#-=.mѿsS8lD?IHEc D?,bӫm.Uf,U9^Aͮd-[ٳtmv\"kؓ1*O^=EhҀ8߇:>XK+DL Qww7 ] p;Y<< )*Bd#][~|t D$>LjZm"Ulj6-ª,%>$M:+B~ƆCx"ul;n<ӷ f(*ܽ4 g8œSѿU`H5,4 >;:*4ȦqC!k~t'O@w`<*WW&DdS&RM*"]z7 ؄lO?i^hdgDǘ%ETuPdzǏA#pEb"8F K~#$STNț \$XE'"l:n3?LzɷRaNUOkbb UģUo!V+ƝPKtKa l? ,_t4:‘km7 \JΆys8YEyTg~,WpI{7y+lwKØ#\#eD`r-1+v=^cW=鉣kqg678mïnѢMk]]E x?ؼs~ڛ"+kwot$"cHD5Jyl+ܚ0VP(Z OѱjKnNY7˵_9 Q,:$1%PO RDe={ίݷ x D"@}G= ~)c NYAALcRYQb=ɓ(޴Qua) oPW Ԋz=233PT%&"2"U]rz<;DSi'7i%P ԏFʎu cHeXJ q;E C Y$"%&T22ѱ`M[cLjQ=O>/屢D)XN5p}K)6]jh5a*-1YjX\dvBTrQ) GP.]$gNwuͮHTĞ=>""{cHDdBfn&$NNg#2yxȣa"|dWh>l(ZNj'MG= MfBìmHK!=Bڂ/RRRiiӿu~yJTv0hQ|t 'qH1:" x E"0eNfGA$y5AKهD6Q1jmEbuo}͜eN0 ֑!w(qAzz*=Vkc+N :zE ?9twF\HL)XHH؏B;FGdR_||rMdDc7m4LydSv9Ҫ1q~ 8DT;rgW[R#BjC CN`^}Pa=6H G^l$|_8DDT0YfS>N rElkH`Ƚ%XGCNEo`1>q-`NO:ov#=d*=BQnG[/M4wOͰc4)X0 ЎQu BxRm[k*64[Gg]o}Χl7;|dBѦ ~EWo/_B Q eTsr;(XnM/8َv.|5sX\daDDT{ea(޼IS>j 0Y qw7[GڄuܿXdq5c7џ=B3ѤAA43''%"da#=NQ\{>EEfG(=yNGV%=NP8zٍܷ/Bjm*5sy}tj&YӞP=|=!""Gl+)(eM>}n$GᲥ KI9Zԫ?}zܮcQ"ݩ(DyMe:c'0`逢BGDDDUfɢ!=:PP(v3Yh(QϘg,.Ar=z݇D .@,qRVnD}TDd 5Wx:CU?ih'Zm6ɓY/l:QXMSHDD5]Y'G޻o ;yL3C`pya4o#,(Äncb//#(Q˂ ""qCѾ`'s=g{LrI.1Qkh cN73S\ eL38?=z%i<̩FDTՌy5R\ [Q'ute1"mxHD׳HDD,4콆vƶfyE""rYH]Ok&G@DDT)Lat'OЩ_>ՎNfnЙY/Ixm"""1=5""*?NDD(LL!gȿYPM""""ш+W 3&z]-鉺u xd(.Of#u* ~D{Adcx,Y$""""WBӢcpr68y^u?kСP5T]h8zN4Fd!8Ѳ2ѲeK"??߮ǖJDBAd1mtl.h-tgX1Y$"".UbBEDUG@7`T0tu_v1/ӧʲI<,QD |bc8$L2E>AQdj1'cLː7;YgŭIQdj-bоPv5Y. kAq bHDDDDV?\`s&6dH,1Y$"""Z2=lcyE8um0=0Y$  "3sk8yA!|: rFb^qtp(' 1Yt; )0"Q' `HTܤ>3""k! ȼ<@T"U_gJ{!ɢצ-'GDƐm*G[j%99&$j5?^[OΨ_T8"U^8: "{!ɢvn8YP0 # 487#Q`,]^FX2oj? Ð&Xruc3EHOH E_IbdjRMduW>QŕWpQ^=L;2qE7[h9hƭq Q  w~A'Q<|`B%/F=}ڃkˀlbmi3YxR@DD5SέތI9px]13 ZY '#h#O7ڶgktTcv$|4<ōs 8x!Q:|0]/.BgH`~PU&Na X0o.^|n>T*bHZ8c9B`v \R $ț \dv?L"T{q́% U{YǑx:w .YbfD3C`8$]0aR3LZ9ò9cqZ N]Z6 \c Ł1#vwŲgatŤԼgx$;s/ "qUwW6xMi2>PƞT IDATjo\"ѤRf.{gҪ?&>? kAuX'w}[eFڼ?9²kEw0&ժ0c٫:K߆gfLXqLUSx핗{?>M1g"Q5Sڬ ^X/&/x F)SLKVc>Ú1 :U0N>*:M*OSlv6$n LE}DDDVnVKI\hd\lyɲְ_",Wv VPvlEl+H׉iYxCud:R{0#q*Y)0 \_|43Z*p;^}crwShQT l*XGR'A& / '5d !Q{ ֱgEXnPm/ J>J룔^^}̶<~07RĶTi+gBi!uwc+b[X\dy}/a_?˟ !!}/غ u:P>QuPdKUi5enE4RӦX`9Bt Ɯԑ{X0 X{N`!_Ij $"""(..FNN_֎N@ Å ɂm dQvMtp Zd2aDDDDTk}iҳHE""""D,::՘,Qe0;|w[ShA>>}ߘӃ.+G=L0f ̙>ώxGń`]I11`5c,sLI"2 [9Sy);>,Ҫ͙{7gE!0fX\Ś?b:|h *K+biXcKo<|3v=T8^nlxKh﫜漍u!~ҽy8n>^Lu-}KDiq~, {cAIǙǑo,꼊=[ZĩmۏE 1z$+\^1 z( ro݂B5F#6E['CjMeVQ9p|=jƈv Fl%wGW18@ H?Y=U$Ȓb[zm2%2wW>LBqm[fJ 7f/)k-Y_-=Ɠbz+ZEiwH"0e8: cΓxUHI"1EJJ |}b6TTTT OuoAT rU%hyaqq6ٟaP'筢Ts&3,A}_!knP2U[V3$~7rz8zQ|{/eMg?BRHOLSgO2̪-Yrz*$zvo|8M6݋:)PdoPD (*q CʒLE "r EwR(ҴMޟuAΓsgT(j:9N aμ>>ؼv-II%ظԵ+F*4[ TVsPsMpA9#""p5A5|QF ƓHwXVŶQ/T,K hp}<Φ?# _Qh[myx{xe_"G[Zj@ 11 ;'[򽄦vUo#ǵlLРA#]'Tt`PճҤdI|7f~ Ku[Zl9SɿBɉ^-[[sqv[@`~euߟ#U鑬i%߅|(~+泫 4T$mIoćϸ\X>R m>n@p`vXyIcJh*9qR! ѹb['rFH)'R%[Z 9`gpqi e~|gEFVϕh@A7nЯޤ'cƈw1go>(I 8Ól+ncAی3{yo!w$qۖr]˾dьٸ-Eo\7LZ$1ٷu GaT0^VBc7Sa~10ڌN@7oiL&|%ʭ̘ idk+nnp0>xk/?Ǜzjv: 6'>2Q2/b\^FC$H!CoiMk;5|~f-m>\] &k|Jx-~&^^q <8Q:hiۻLk9N !sϐzyE9oEwy5cvk_3gn~K+g2+8YL aY<oS xzXpyb Y\Y*؀K_Ç:R43)_CS/?qƫĚNVKzNnxH>1)2w*V82^){8#Z߮5+Vq5 I!_^eH'Vi|2m q[Z9)ߣe}[ΚV K:[VB=/ٖқYeڏ>v/lۍcۦ~cOQӲM},N`{T3 VW9 nxy'" s((J } K?^ ϱS~Z#Hŝ3="YLI,8ʋ{Q95w1Ihݤ'}jD9?Ν7W/47z5X>k',HNN~fr/~6ѥ+ϯ҈qHAV-o :1m}o|pm2=< ~;x!X7Hw.Fw'hݟs/Ȯ_0g+3wzqR!`KLϵ̙% 瀅H5RyԸK|Q(oi L&zwC["cUm~}YOvX/Oͷ+ضd ?S1.T+lJ+kt(a3y\<{xkT5N3X4۷47~E"s~zд36 ưcS 5ykdۢI|LO1izo qjL7u|qZ\=xߥ>w/qR!xt͹O F\|0K?gZ'H%3"墣B! EӑNBBfN=7NNNhZ4|WfF&JB!B#uB!tQpbco ~YXX쌯*USRӹ8c&Q֑TYޡ=}ZꈢdQ!BKdeeҢE+?|I!(a:!BDEaBrgQ!B[sgc0I ɊB!0\8[֡Zt✸ Oj$K4t(1 E1CkrgQ!3cKKnfzck"Nr zaUAcuܣ$l„$YB!Y}oNud+  YGڝۇS a , nB!0 iii`c劢(zt">Il\:bH|tC&SdQyx WC|:<ýhyΒY흊ݒhC!gL=og<<}'d{Rw?ڂV4ģXU8HzkH`@-uz{"-FƾܖzժQ^s [>N-H=`ܪȕW;aNȕWX 3"oCEauC@kg+VY2dz)WK 껫ؑx.6TĸT匞7rB!0Lq{m~ǺQZ[|Uj}ͪ<;ּJKl=&M9:ھAn:դYlÓL܇+ƚwxnl4}&bD"/#xjw^LVPsOGpʕυGW23N1BURA⽼(g ,:]'hVϑZq>O|qE>Gq9d4#L6f1àtC2z!J2R ShYŖU5l=Y۾1~za-'Z&/Zxݏ3iU~&Rv:@&_G ~#u7Sj ]kl>̋QǍrH RzֽF ,]ߞ@G7]7%sq'[37tF?5!)R>g!̼7BZhZ餑AFeBֺaK|gz=j5X-*Ƣxs|t)Ə3Zź,08Yh;pJ29|5-uc:Xϯsf9UQ_߸F~:ds4zީÒgҾp6ĔnF ~ֲy3́}iբQ3>E1CoY@ 59[ة,SӠ!I:}ZzP`6Z5*@QC#RER-eRǛv~,PTL:Po 0MO@[ѪMռ&9!>`-Qx*^kz'q_1MzHhϳ#Yu ^)[%Wq26,mR#Rd`B! ,z)TRTGbʡ+:@EjvX}>!ଥ>㧢h}<{*ƺ?8s[-,yX72hUUd=am.%i)|G<7r: fM&,˂:Uli\dsK(S%q> -Q'mw(wAVJ&/leEjZ8_ ~O :B!)ޤMJr5;ۤ0p~s AC!y>U‘!S}Q6t:$$$AZ%To^gW괰2wȠ Uѣ VFSyD΢B!JH}f_V1D%x]M1{”$YB!ʐ "e#)u'Lw_t[>}&֘[= "&YcJTݐu'P^oɢ'ldQ!(#6fjZߕFӓC(nZ@z7LfS;7<+[W8Ê{wv!JC yG':#',ZrE]F!cN(ɐxgM+GKT^vlJBQ)hb-JH kK&J<6.˅0wtYզC밴k"l..'&bzb(X=7ByrgQ!(VM*&Cme%=e/i]+~+Ƈu$;')#Dpuu#,, 77wlmmKTo^88 \n+ u:w/vy7YoD!B}gPw. 3QBPǢyoװ)W a]QxP!OXBRn}g!Cq=!'7nDq233K IDATm++-~~UɷkHJ*Ņ]6zT+KKg!'Y:C'ENDŽnEK*wTANZ{ tD I@UJ. ت&s?a-~~#5u$$ 2ABK(BQ)kzTU+)t1Qآ8{좢l5MgiVoNΑ90CfuE!& ɢBQ٪bO$k3D8j |Q B; ,〵-Ԡ+tep5w+R ~xf/Ba"%;RV!FRhL=OV@UAY#nPuvTUM!&ͰpiaU註SB=rgQ!(^lΦcdhAn͇+/gmϞBez7`۠1O82pMܼ}&D!dQ!(zvS,R@crSJSxSiKm0pi'! hqud84.ՁF~'B!̅$B!DSdbfj]e4z5Z[S* .^fOiKϗ:RI!AZB2KEQfzBBFVVVmeeEJԪUu>=>!Dhށ%m?G-Bդળ~Veh[DT|VEPV]Ъt:.B IEq9h޼%Zm垒̙39AA* !JEmLW!95mm FB! &ɢ(3"#Sn]RSSINN.Ѷj55k#&clQ8`goPBR,2#--NA{Nqt(BFFFe=>!Qpbcoӕggg|}OO⌙D[GVRRg{~jDCEQ"׶ހ2B^a (2iѢɆDDDėKƆ <ӫ*h|QQߴT=DCEQ(bB!ʓXׯo!"7Y޼V ٿΎ[{ZI1IEcɘ'B&"##ۣ`dٔ$,CBȌ+dQ)~B!s"XNI1YQI(B!13O$Y&$ɢ(S꠹'B7fh6EY66T*^O|Ru<` X!BQ0EQL0 @>Df;Ygص"QIq"E\&znt ASɠV!Pm~*!!''"Q(BBsaBI-:4O.iځ+}_3JtP!CӋOBpqq)BaB=z5 a, 2ҘEK| `hsGv9ŋ>gHXDMk0œ0 ^ÃYONgBB"#>KTt4׮6fB!0, 2R|Z]JUg0]46,|k{Egr"Wk9PG= |^EilzJEߵwfmr?Zty,a*TM tok]8oW]$J3hРś7oK΄Dg'UP*a4nTS"2*#'h|MBQ6cYeUc >\U ΅œ}P5.Yͨn.W[RWiwyWiU אNJ\m >=׉I2ӱʰ#8߮(`^GQ{=/_~wYdAc 㜐J??Ξ/fQ-*BC=~F7o^oƽx<Ba^$Y&T32b$WNsi%ٚr ʖc| ,cŊ80kbPͮXfǿwrȴ俹ETI)w+ /88'3hР(,]ڸ8ײ_AE]sO&..ΨmBG^qBQtإ h$bH|$dyEG<G^L_P}V~*o; "<*dav1>P'>Zœx;3N yl![Y_0wAţ9գnD֭ń6`xR0'Osi.\d: b6l+3(Y(1=>!0 ~>`ҝp#[1 T?M'qrO|:{ וUƬ-EذW~ʅ+q^=wF3L$L1dBQ0x%FУK|C uZ}އ ^ փ}k46ٌkׅ?{ӿmCuƼ'6l%Qzlތvs`nZhn:OQLφ*Da(y3¤T4M=Ϙ| O Xᣗ۷t{#$jOv\HOXH=;q߅(ez1uO^g^A$L1gBk:t:=HW(Ql slwnʅ1I(LIEQ{2f !I+cӮ>6ynL( sl Vp!#”$Ye^o?BTj:aUyP ,2v2=(F>Dļe$L1|s\=E{c~ \yhkqE@Îַ5d5{9u*WcU˿.-_MF7o,k1t4::G]ff)mKOG&nVoG,tϿLX1+T¿Nc܇8CEQfXYYeVkLҾ^C3GZW_|r2ѧ6UK_g5Y)~C,?Ҿ_7|ɔ%*fOHª5uBG2d9z7LfS;7<+[W8CKWz +k>s>P}pnnږhiiDGGX3293h0 AW1kSX{33p[>t7)ei_'#>_/Qtxgo=(\vūi0`CD΢eO]'3*@LĵD\\V֎},2zDGGrQ22XLmQ#1sOpד56$$$co@$obE73 *+G;06!}yGW ]ʕ @C:wEUe$YeFcA۶h۶CɓWpaJv a| jփ ,fk{5U+wq2JEe[oͺ-pSR*VO}^xm^/m8t8R\ބ?lחydz;tt=cZr?B{Y79~{72pIjK/JUGԳM^hd.lp -yuX?mo0 V?HHt՚ʐ7i_Yk`bOU;9z:;<|} m[8R0KK|[43+7#;#\4UMTTA',!W{Z7ިau߱O-BޢCnYt Sߎ9[eOkfޔ]㓉8eWO`Da= \9χ`̭O2v7O_WRm]5n])Ԋg~:m޲R3.VOҸ1Eg}ؕFe7rc)|5腷A^Db&#[\V(`ޫ!^0DWqQoh"FlXg},j EsB WW7HNNFQ}z KzqF#NG%HPNtxtn}϶O.Qi}cBܙ,}^̧sfcX9<ɝE!zx;*X7tvh dFnaܰo8vtϴgH;/Yd&^ѣ/Μ[5PnmK8fIOfTKTi>`*n`Bm-9$y@;~CRBdt1U8u:,ʑ&o "sXW*ߗUo&}fŎߏ3~ Ls}22HIC7=gݚdǃWr.GnBJڟ:Z6ϩÓ251/F5$;2&6?|t:E}B//On܈#dffhVVZo? ,-kגTс A]Rm(wExWtV7A[Xqr;:G.#|0o"=c$B7 [g'^h$pR,$xдm*@~;-..V*4?uV4k"׭{8x7@|| Pd콂`AB+wN^wH";ayo'(5#|} JXxµ8=OSz\x<@g;ݲO>,=аw-x2 <ٚ{kU_h;KVkhР 42u(yh<<':v#R kЕ 8g߭'3t,n'ɢIOKC;rƩ^鳶.JK6be7bXVշ//z}ޒSfuq&ʼnT/\#BUY<&źvq΀z ؟FUw;sU3";tf~Ljw%q.6ujQ !(M)~ Kh:@D2F@ǰW|#B|~>{5t_R :;ECĦ DU>{\DU2NNacz4U,bd{3.@ +u/l {F5\;.T{7c.4}{&KAuaMʭ82}tO![QN]!1 ']E&%q䯃Oq޳oy34@?ii%[fڵ,c,2ܓ1sO!(?233L>DQ3GFGIM-Ȳ)IIXWm !ɢ(SƝ'B7>DD)᱊bydQ)B!?6{|LdQ!BcfI(LHEQAsO!(olL]' JJՌaTae`>tnmCcc IDAT6xLU{:zRqF+B!̅(&}i\+\xt/F"5z+d{tyfF.Z/EE$Nbł 7t Ѭ3zKDNM,W;qc@||BH?Uÿ2k(2]_yK3] u%ѥW̗G^1:O9WNΣC7fw^oocd,::&=qmbQ z]I߳zB'Ie2c$H5B%V2N{/(DS;SOǛ829Bq"WIu;,:,v 3좬"o0dF]m%$$06x"O N.$n#a.drq$ޛ֘L:HVPS,Y;7ZŖɣsXK4f8^r kt.ju`ШLML#I(D=E{ѹ{⽐+b)\CYCgGGXؼHIHYCyb23Y4_G־/pF릅6a"I/^|ӧJHHdI\}d̄L BUC{Kxzx0)899Y&!!%*:kW3+w&Fq[;Y5.dPHJ<Ήo4[rǬ~DJ*6uR~ۓ UNȧ3!hWny~4R.͂WY89*:!rpݨhg0;U ^eWPgss?IBeٗ$M{Wf_=*kVѥܤ jJѿr!)P&4Cޫ]uec^᩺UpRU??ȹQ3&a sٱl(ퟨ;۾Ï!w4h}͛7eBB"cŀU ZOJBB3QQ g9qGEGm͔g7j=k9~'ѧ]NX^Wg[M/jGGw"޳to/ܞS5NC JiV I$&>.9}6ӭh'Lw΢( Մ;ojn\İ{0TU^=Wx7,iV }79QV/R6NϞH`4˵Ϣք˵ VJ 9-xP$gW#ˈNG|aŽKx+OF}{OmzRJY9RWYIXq\O %xe|^]@ +rG8""ҨX/y[Tek4рO1֣6c^ DD'|/r7i0ȋ$lEgZO|Bl9z8lћe+nqtj=뱤j]oY7=Y9w;Ufc3k9cưwODncJ/1tTʩ$;dq>2Oҹ#|=;nžͰdQ9_Mxѹ3ѝk&9R-F5칒FwuMsd9wSu |>1u22HJwPݻٝIA٫8c]|?ڜû;ֳfo=zs5>V_ӁϹMl85 yQ8q"YvU%o&K,Ak$\We'\ ^9&c'=a4N3FP ?7;|8$"$B"})]NU7˯U[[KSJV[Rj)& !{D$&I|Ιs{{gF̽ϻݯC>}2.QGQDf w N|{(u`=qOe.?ɞhRUPs7'P=vK޿,;6 W3{Olp'PE)]:yW'T ,^OPГug'Q4 q9.gfϹq&_71S8&L@@qQ܊,+m VΠy;Ws\]9%3p^2nd.9v5\FoP oyxe[_˕AK;CeLAM.,F UVe@]!_γۣ2sdDT(Byߝ{nqxcvji5=2/'lPfl:|H۲: !3k:uӏ)Q/8]Wb^f};.EUIVwo}ʙ?k!\mK35[Q(~??*4h_6sE.cǙDPj;kޭ_+Tի8)u؉ bBeaӐ94OިKrZwoW- ī=~kJԶsfԩڂ%s= h9s(VM 2*=q  yA!r_:0 lyf[ Hu=}y% jH4nFL>N١$@cA))X['X3˚:B* ɐmx§Wig|U<+3h]VVFJ5JŊ+bҥOKzj)s%'\iohu:j5,GC#1d&%s7nPÃyg>wؐNͷ0w@.WGÆѦE] gvH1G2}< >ϿMg0wwy0nUBIPVt6YөkbI1ɿ[c7 pvOnJS7.ߣdz NegqΌ 1nn ƣLf}5k,d|_G6AĔ5kצ~ A@t rd>Jp#EPx7(ŦG8iϳ5-|gdd䃛܈pvMy;º A@eFĄ17;7== %t=ܚ;w)xBBB8ժ;c9ˮwaHy+t~[4*Өm|{츚;+q%v«Fۻ`ռCbO"[~(7fFRdԄ_~X"[_GQݻn¥( ju?Ar'˱L|i,j(reouQ:G_KqJ$Sl.##tE{{)D?19}}?{ġ[ =V=sf_`Cɿ}\w^ZNX~*TXv-7n):%Tt>e׫钶4&㉻Jp5O"CaxI|yd#oc7Ȭ;1?h+fW{9z&Ve1I7i:g{.UtXŖ?;_s 4Ha[y7r o7NU?O7\e{_xz5/<ӻEsٓѣL͝ZB3:91 mUPcumD7axw㽶₋dW]wo!7gN]tTiSAZmM-dQwW6vó_u:eKBwig,=JٰK:x۞W{W͆ Y'w4zg ڍ7V{ZfX :UQj* (VOiv;մgٱG3iƄl'`x2vN潅82ƔqެYT*%`(>E{:Ceo?<گ`@f׻35]S¤ Tx}a^xa3V]1/3ϭ}]gc5.mgha(_ hK2/#u\G!21\BhB|e^>OӅ}46ľMKIC .TMT|Hy|?զ S6sZyU筞UXe+!~k_ˍ^J?2cүi8U >}4jIvoһ>)+0f͝,ǰ#QEsPQ1|h߭4t= QB/pړ-$]0-RBOG7 ?sH8% <_&be(kYڬzSd .:,v1HT*/^R"$4+jh$%%js,a=L~|1^tv*߹v?^>ɦ߰Ƕ-?B4Dܸ̝xg!?("/ߧsy++9l8z+9S=`hxUky11ɯhN/̢cP7ąr'n4f0R] [m>!xILzVXcxܲw^>C[7=3^X׸qz?(3.tYrs/a@]+.0|_+VЩC{t:zšU߲PU(BmXbQ|r㕗]qFNܭ's{dǚ⟏դ8>-pq26+I_2t^uӘ4zV \IϢ_~ VG2&6LچiO{ЧNAgt{t6^t5%aQ!+F/s拧~?91{gyI=ϜB1'ħcd(Vˣl84.Tj =!i?sxJ;4M`ǨW2gOٹd2E)[9gtfD8 uM?1h ]7mֱ{8y7+-xd<*?GL5\>)I}=#^U -gc>p}NõVkJ=;_xUKz??dz pD%[uʧ&wsMjLrNSY;zey9ԤFlڴM[f ơ| ˏ}j3f>&4{ k8w/193c6pT ٣w*K7&3޲g#6((QPeIStjC 9]?tG Sm FMJi\'bJ/"رc+^^&ƍkk1}_ cBO@TT!!ԩSϹy+cqige]kA{϶dsjżk;&3I)/l`MFUl3V;}<[Gj%so0"Q=x-2ygt*ui7OT"ޢwg83yr@N|&Ο;eg|ֺX%ؐ{VdQ+:y{|B!DAcSD;:I(s7BGHϢ0%IEaeehQs~9t 7BES 4IEVk׮\BrIqRBj2BܧHϢ0%IEMXXΝ!111W붱bJTq2f !O1D~'ɢ74 5Y3S.sO!(h,,,L>E2$<|4gOrv6I!B!ҒdQW^(5jMŋz *UΓ !B$" C5#&&&WVT\3gNg{|Ʀ ""J),,,(Z(K{Rrn!BBEoǡ(ztMLEAדas؂jxL֓{-"0M]Bg"t&ѹ#[„ sna>$Y)'u (cSddk6iOS'%YB!soؼ9o>[в[7lr5PnM"E-̇$"_=>cJJJ4yOjn/$$"o1ͰmxN4Y.L&Mطq$$"1d3ԓ*"1̈́bdX^LRdd-̇$"_1;s ROB6u\ܼCCὬPPkp|]XuÔ !BS&}i_'9}ZwTP $$$鰳vћ:q ,pja_z[ eytS;n`v<_8 t8UjBYq sgꈬ>6">Gf ZO1o.ݩR3L*P?Bp!:u{}T*<$%t$%%`h k5Qàd1/o}; U+A-A^C>Uk:O^Ȣ5ӶrQEsqpp`ƌ9ZWTTc}'(:Mc'w'$&srrzvbBG/Ӱ١KwX-7Ns|v,GWxlYt]g\|V_rqƻ~#* ˒M?`H收2u,"#)e˘9s&G6.y3'0kzɪqnЁ.mkSBEw}iV.9TF۷/44o#FN-JB9}7ЂΝ;?~Sv ]~SvsmSޒOv}ח~G؏'OqEzHr?cYl=BbB\-Y|?"۲ڸF+[IL)Ӹu6l\g{>i=l)j Tj 9E\t|==x_ m =n[$X^.d,VBE>pTh'`:w睶Cl+>ؼO 5@޼_g:UZk:ORELgؾaO EQc”i9n^q~<rneX\Ws)贉$Faə<4?xͦt eu~CJgt47QS^є\fǂ-Sq R$r{q]ܫҬ8|ԥhE<ńrFv{Cʈb \z'n;qATPfzea2/dd[Ųj +Tj)M؈m!{ ʚ8CY0]8ȑbMV@Ν8}ĒZ.e,OpafOKZ5DN'[=IРobɥ`>ڶ_e]ʾ!Wig|U<+3h]dFGOƂ>fE@EJY; O/N1 vQTX+++.]ԾQL2o_r•v+NZ faH Ic`ŝT* Z .^D3|"u#uF7#K'ƍ?zϘr<0?ދZSg# Ŝ+P !mƆ{lFV%J|Li%@دi7.~@ĹM̞DeHweqΌ 1iQ j,h=(U*+II h4/uEIz<oɫ 8w.ƦhijVHbg31fv/V=x7ؙ v 7)Qv/>a?m?IP7[;D>zT4ϠΝ<4`mm Bʷ[8 V;/$nHH+S91'=g1&}*O[ꍜvk. _,^ŗRXd @jد_?VX/( M7RZϺ֠h Y.~>rZ¹~יubY*ǵ7(Y8;9z{6GB4PyxP cl&ɿT̗G6V`?f}VdԘ ٴs;i>͢Ps &tZx&ݤEVgY:kcۏ \4ߗrCʈEǢ~ IQ AVq1'w&jjDDDrҋpLӕxK Yk cM0}>8םsm)Y{@͊0v$6myGq~v57(XKEOMVE$TGÚĞ9iSj?.RaClVhw>Y¸ pfJö۩=ˎ=iP ?$a:#9,XQZѽ=S {~ς3Lx [?GK1/6aLHHv''wd[( aaي##IpRyfRP|ߣ^_[6 @y/\eh: R'\)BBBQQQ 5.%r 18YhjPOws><>]:W6xO%hU_O*ԂjyZV!a̚;~3Y8Ǐa#F( VçF3b[hp..2] 5釡wٝ;/^<ǩ,l(8K}Ų_.xGBG{6CryJSeZE[;qAAQ,iӷ)kڛvo!7n䣒4'ϵ7іʶw8O^B33SUC\AxYK>2u.?U##6lxG4wˇж%-tBQmaȔJb/(BMSr*>VVHRRZ63V+=~p?guJ劜9{ZMmٻ? וP( MT*2M'Ĥg[[a56<^O2iRFKWSWpWX[j EQж KW0j}$^AAe&Jg?%,_P YL)r$ߴ~gY3hנ BҧSvۺX9IvMXϙ/AS.q.;}jkzRc_\5*G \Ď,1<4sR{WsMh4,ǰ>'(8^TAqM.\GǢB U-vJS˻qչ&JTC*PFiY6;s/033~oWsynݺIJQTYo޼ABBnn&:?Jn6qi.%yҢN4r^nE/k٧vT$Bd{|fhBh4,#:}DEEѫ{׷o\!ȐCMf`R_I'xu UM4>~0n26w'Nt R; (#^Ozvʺޥ ~ϙ VοHJ,FtoJRg].66!LBt$aQĉ.T %S.bϚF:iBsز~Z-?|Oh蓧ujբuKbcc"Q=x-2ygt*ui7O̐٠ǔ՟eQ'Nm! eD^ݑ*5d'8zSɢ1G ؽCnQT.]p)*Wk)lmmWVHLLΝ;;w7Ҹg܆tXRoV3V{|wR>ת^oC=>cjrj3\y؁}$$$fЄfoCxmGM3`.&rypʑ/aOoaˈ<+ G29Sr ޕ8u*UD   Kz=IIZ㉎&""Vjժ?~bC{bՉkՉ{=>c3 ϼBEYV;Ϡrٌy,,{{{*VB";w@\\\)\0VtzDbc Cll kסD XY"{2f[AIBdlKT*vvv)SG߿Oxx(7n\'&&F-NNθ{{{ryH(μP=>c+hɱB6;ښŋ@RnhI+k4,,,b6$"_1/|s$YBaZ%=GRamm!f$"߰BQԯ)/r1rN !0of,:QI( 7\vg*T(W뎏#,, *gX 'U!Dc ҳ(LIEox{{¹sgHLLպmllX*e{|faaaTKKK-"0MNw,|CY351u(2X1gMړV&WB{æ# bRbTO$X9;na$YBR\ $%%jVVxx=WB{ækn\[!B!ҒdQq(NEAדasO!L$]mPq.0 %mRsN?)fˡ_s"]gc=Rx٥Dqn?hgɵ[P&g&>NElr-\l9/]7W0^}/رڵ49Mvg ͥhy($$$EHH0uyR*] D'~(;N1%KUna|Un`ZuGJj|bW[? ̙S5Ƙ$="_1sO!LnVE"3q sn[5s>Fg,F_gBx"1>>Ws)\/֤}h^-̇$"1dBӰ $GSE1Vj'IѸ_D%GGt -JœH(s3TJ̫k <[i}tt.DAݱ&[IEb<=>!0Ii>v:4a:, !-TAX,HUdj&ɢW̽uBSaTl̠߱ER*Dd0,%%s L۶fWc<WG{_0{z?f̘uEEE1w2cڤ 8::h}B!&PLCn.cv:4a:F]ЫS]:$ć^7'?SUXX=s PR+ IDATRC3aaD8Yċ} yw=?;_#nj#4, /OOΙNt?{6G~΍7bDY(1a4ҍ[!2k M{AEI\roLr6oEr9>}R-FIz|6-;y@Kb\;Ŋ"h !uZgu?J=xb xŞjN$<ҵH%0/+Tի8)u؉ b Ư0 QQ` ]Y `R9KvŖs$G&у["hꇬӅzWu*+V`eeҥKڗ2=)R-KNti.NZ faH Ic`-yY0Tժʑ{<`U܁[ZGOGb] OoH]1rr-p#T!"% ˻u+oGk+GV{̘ΰ#y}g`P0e0뫩Ɵ}mPJe7QN\{y}>ɣRqׄˇYxj{WՄLemm @HHȓmuS] \;5iɫN) MyJbɒ% 4(u[~XbEEC?u?AӦ})NeOk8~pYLhY7^`\?ҍ[, !a7#X})kx9՗#.M$OQԣ0֚tܺ3aܹlj+\OvĚn:bv?Gz"-*X4rRx)âshr;'fᜲjӳP3=ˆAx%y0dixfo~+i?MF0g:Y׼696?WW͆ Y'w4zg  coYp VaVxkU~s>/YII(ᭃwd[( aa] ; [JR8o,T*$=B|'P(RFF'VcSczّO(GŠN|bJo j7H7!\CBØ5w> fpFDQCOGf𡸺Y}LlYJT3O4ޛ)ѷLo]Õ w~_`Ǟ|8E}0o k6%_φtr k/ė?DVvh6ǫN`ݜ۲#bԀ" Jŋ^j詹'Qٍ/yH!z}XTըjVrz^)k-N(LJv4’ ["@y;@DzXASY-*DDD( ڶaL?hu aJ%oCe.0WwUa^BvU㷙>~?i7=췃ϖU9Ro"v L/, ѳš 3e2)y!!DRȻػv?_^}'bT~-jch4Zf" :bXa ’118ÎhٓA * V,n w_|>?d|ΝKv̘FVC-rf!LekW^Oa$n?~[{Лah(Zp_{8IIy+82;Iy'h]ֽ}Ff:39-pZwlpwN5gڻ)baK4(e%qRsp6KJWWda !aZ-v`Mz|mOz=$& z uٍڷm}WlO&xY0TC:B%ҝNz-7zRa_Ğm)YX.>Bz"TXGՖntW(dE|(;7jȈOp 6ĘSFtr L(o]Ȅ^o=>!Dz=aAl[@-jtǫ)gVx6mFYJy9Uo8k6>m!-nʁgg6 q&AwBlM16_vKusi7(ZNɣY}"/nC𑣌~Al,|{=>!DZ-{ )>_m@jkiۿ%%tToZ||*ػGv2=hpu]N)[eQ4,qfS rrm>v`A]2L,j$"_1dBd.!!+'P'5WAQWiF=woRM&q/W[\=y$Xg,;=a|06m?ŵ{zJzJ}+;ΥغURWw<3܎.D-Þ)v# ;fwL~+Nz U*ר΍˦KX pj#݄-on=X,be!Dʵ9 ?#I C$ ܈|EӛBdNu;#ʦ=۹uIi:23kKFE^%ɢW BdNӡ$_>>c1>!hbbHHL@EӡP֨ \=f}ϚfAoI+Yl{w|M7{L!AbvZZjVmժGj޲wr!ȸ!z%ysܛs4ыclv[lnBQMP?l"Y BJRd{*R'v$ &<JJ"&!duz`ʆTmX ZӛcLM E꺬jR 3Ԗ<ԩ$<)V]\%`T6 !缒  ؒ9n-mg U{g|xP]|X?‡M$B~{{6>A#(U%o'\;q ZMYW&KmP8uL&xs=Eu+z-aJ.\#9nel*үgysfM& U(*>D[E7F(6ʕ+GHHׯ{T^!2 Q(T'JRv|5s%URq{lFBFNP(Y(Be#1nSN/ނևߥZmjQ2Qg.$8ҹkmoP4::1M$B!iڴ9M6/P ===]hڷW&1!ǮɵΕPk#{m}?6#沫#G<e^֚)qus,'I7вjƌ,)FLR'fC\ϋ8,Mc_a) ].WLUr|!F =dzbˇL$ 2 귯ZQ%{ߣW&ShE=귯[tC Gdυ(ѮoML%ʶl?x9[@U<+|ÒK%Bdί[1C J꺃b,Vٖrrg޳F|wR )MXV-OCtDZA>!!E 8"YAAA EAAA b̢Plj޽C@_EPP-+VF*'  dQ(6߿GTT$7D/urM߿{2>AAAL$BHժU'66P-JP^^WMt=>AAAL$BJAVU*lz| h4prsssH$YQ'&pw$%&Pӳu+OT,u C$BRu( ‡$ d4hTdCDptt̲ㅿg-uCʪP ޽<61qnAwdQ(V4MQ#]OA>$axxx˗/e,G5I ƍ9cH?`"Y]Ot=>AAp$''fHO Bil&>#KA] }݂ɢPzÝ' ]")䱊;.-, ŊwACf]O(D(  |t<ɢPD(+~wPAΟu>@8jShw$IڏI JWjJiabAMLT-k: Ic`  h4EEE#|ԲX£#M\d84'rwEk *\;Tޫ/p#Fj+"#033}:r#ZAAq <%UYǶo5+Qaavʊ4.sScV.$FСC133c֬YH&xNCR3sd,,, t}  w۾kwڞ_I$BҪjVo+դ!XgDDqŊ̞=kDD&O}|)S +$O4t9=pp:|iuuA(9;&;Բ{ǝηᭈnBzd1vp# 7X4ꂭ%]h\L{Т214sR|ꦖFxDeyY3VUJafbCןɕUCh^5Ʀi@u۴]O$W~Kؙb_1Gn)@qe'Lqٙw'53 3Х3Ve;nɜȨjȊ+2^{y$;Q ..0iڌnEޞ`&xN2CBptp(A_B7IzwHB]-71PY<%G[M"cJyިJQ*5e܈1\8I_]/h7^`]=]zPB1ܖgp7&i&2IKCOsg`&i?6oۦzoL= X~p,+T&R(36I۸K%ڶ^fuow3% צѼ4ODdI^>>IQh4 ڵk3ߟ+Wj5v1/H&N/ul,KYW||}?iJ[+տ-6^tQA:f'\~׺dQ(ByhW'mAHx})޽RVvdl7^x%:3uLںYʴ4sY&qV,ߞʯI|4ʏܽ neE40%LT9t:Um]X|)-Kqs{cD9}@CJ IN)Dmgذ0ZۥVO1>7=ԩS2̉Xr%R[6g#**S'5Zp>4jϟc&xNgBèRC&8 ԎzPtiN)㵰pLɓOg0<x/n:m =g[ EF< *ƕGDBC#~O*w~5f1q#^/r[Z?ի,jZ)sR_SvME`35uL}δq%4m۴XOs\UE?.>W\3//͝*KM>F,5Ҿw},L+j43nݺwNmaČ~]5**׹squq? qzbVqL> ӳ[, рFnԲö.‰*a|!25Mutk̼{=wPwc`&T)Fֽ zTX4+ŵrCƃs+_'O2aԌ&LʓOq+_>WV""-Բ*tlb͟$q1]|9&|?ٓcl O-nފeo6;6/{8<G?jVbmZT_+ija PUw6,*X$׭zI$VZB~{eYznQL>oѼ*ꗟZF*E2xH $ܤDZx\Pٙsg 'Bc8}%&ȑ| qoC|9r<1jjÇT3ܴ;Uľgm]:cy <7#Q?ʹiy?Iey:/a4>T)9o桾11"6ɢ[WoU񥜋ExG YM &T4*YT/#/]&wwM 6+S_{]ye2eTڃK<]Ĥj]bCv1=t.(Ų6Y{%gzy7a̸-j!% 1 sR,Y0TZyT{PR4D_ԙG`܈:`pk|(Ok8T W͎8#\4Cٸ2 ׿6ѹ?5/s6m4)2fXaiȋ *rk+z>~ͯiCtT111E> ̽PRkx 9sH$TɢEQ6tq`á#ǎr|ɇr8h$OptY:Ocx=qA}gHx 谼CW͛hT*KC*Qc÷#g![[ d1.6_F(Bϧ2j(gvzwKsPV`֢xi9uƉ+9 47i`D^k/ƴ%?Hm)0{.raKv-}0‹\4I+p}z,qryJX>nH$,]zvIUSO<4xvkxscYךm۫5nf]vϰux'a/SӫV({O`oTE ̋:ڜezٜHӂ$+kq4#^4s:Tơ['vfbjLg2#k .QR#۞ueg~@ K,Zȓ[y"0E3ewdns@C0q/wNwU>Jtof:O1&)@@4V@PQ^q(Sݽ=ڙз%Qtu319i| fĠ.y[ޒAJq7LA=wlSZ :m=};޵+wz:"tDE6AtKU,>QXX{󠮞?u m!QP?{|j fps?jTjۦ&)q4*G&s# iE.J} *mie?sANl3Y׭Gퟶ@;C:M1z%g!ZOf \8}F KYƧ鏐&)O#*%2#\0, hYFz|#d< Cj{ n,"-;XBomG,=.}T//ๆ{>] w{\>7Xt-5 ?Bhn~jXiH016|}K7xC y}B@Vmi!s*ߐ/"jLN~ύCٺ"wC0/[χU)exACnm9PTF:9Quo?23YiY pX11&Ϳ+SeWcrut^D^軅ྐྵl^yۛߎKuf\9/CG8/ lV1V>TyҚaWkkݑER(ziڔ|UX1e%1ZѸF^f?"QCI |k_=FR}'8Ǘap WġZ3;D{#ɩ~͛8|mb@QU(sgJUv$y]b/<~h8hu&Цg7F~f4qqaRguClM%?'!4򾔕jS&!CuTYPF-$"8J(>rn>I>+.bȽS,gM(/K1Jasi'dO-4Ė7u 1Za =YI e[XrkˌhҖZy=>dQ(Vt= ӛaj3fO#~FjJioQ)pr:ScQ~c=Y 7Jn&IEf+\QͦL=J"7?^M9?EYCpm7q:4 ?]_%WdzAbJAiaNVDԃ9>Nϡ39| bݒD@\qZOfcpCÐ?{+R2aF6;!IŘsRQ2}YɀSC-G 6˹ק#Zq ZNp1QWeItWT* $Z=dQ(Vj>z|) nO5:g׎uqT$Az-uc,$aba@bUe# &f&HkPHI 8öxÇЈH"SL b7c{w\Di>mJjE>zs|q #"cNNnD>qT fۥV8֥ß "(~Mgu]jZm#D9d\ i/b(-]۪#ui{ ,Y!":H"" ) ނd2 6E͕x]kI4v*(K)Y#jtbHWNaƣ<Ά]xHv3O, Ŋu=>]Шը!펙$nCO)@ZH^~ۊJtՋNv4~dns//+ϣ<;N%o Rmi`}3/4s~?pr!wضTA(Pd.VU:(p*3ⷵttv n X= ktOqiY|EH2Q:,.$6"WUQ /\͜ivqSƒH d=>PbCPRL*U Jeǧ+L]` boP]7M\J# fH N{KvlFXz K^ 1Zӷz9bx}W,e$@C,*SWKtiRyQa ͸gO)D,^ٯA!_5 P>EH|  ]\]?̹Q$ܠN3Aq΋dIZ4-h=ǹ~'x{d}|ϟeQ(6x6nxBB)_Bet=>օ~u27F|a+b}#dAtezejD^ZW(z믎FsusCq*M㧧`U\Yn@v܂5lhWo:2yĆ_ iPa2T{?[6ȘN!vΦ.6(BUSklE=Z|a`C M^Nro- ~/NePƒGx TDO5).-ԅ>Վ-V|;`cOY=ldC}Fj3Yq̏bvKxE2I-d}=>dQ(6ʕ+GHHׯ{T7w1]OwXj| ^ǖs}C>sw ފL*PCGV2XOmn\E/rO[r'- Zfg6-~}Tu<8obkDD{[6t8M\ܞDȨQc,%L-G L)јNԹ< |(&ve(]){M@^Sڂ  ST$&&IPP5j*!ϼaccTZ4s2*?N*ղ\~vܣГmd{4:򺌝fff(Jd2-wZUym5ŵ#{?  ;ϏB֍[*iOFJm.׵\׀fcDȈn  ގ`]Br$Bsi-Sfw%$ob wvn ;uqT=r5 4S`CP܉dQAA I2jԨݨeJ%yN#)EJ=ΡPԠIm*%,  ;JdޞE(   dA$   D(   A$   D(   Ă*jwGJJJ[PP-+VF*'  dQ(6߿GTT$7D/urM߿{2>AAAL$BHժU'66P-JP^^WMt=>AAAL$BJAVU*lz|  Hb(VkQF)Os7׶_3>h\Ыv'ȱtGW ?#BMpА"8Mfl_~+W3p)jM¨ry7s l([5_~ՙ*W+I t8sVm? [.ٴ'sh0 czEYV9/{8Q̝Oy)s`?:S ‡gy`Ӽ.XS"+CȑǗ0cEJ eDؠ~@V̨j8{;u7; eKUws=;bqb.HEE+7X0oodq?UQ`LE(YRSV?1a\  KLX[P]A(O$ *LL%«4 ZV="Y]Ot=w&0;΀3@x%>ߘ Q2EIyzOJ9ʮ$=_⻚8cn_Q:~8-X\_ZQ'7=uj}Smʔ(?+x揫_=]KJJTv*f2+rB8Ɗp-.SѣQ#&R##c",XA]Q#J2Ch[bb"(ܯ"AŶqD1ŅU]w&F-LjAu1jyb"Krd2#2ZT\q)';6oNV:s^*"122"((d1.ZT*5>!CeQ(VtǗW|Mwa&FfY:sr9nFW 5~0kV{ǁa+-)S5v9<0aۂ'XgƯy$=ul *e `GsNjXWxijӟVw..kKKh`YҨ!G3m? hKu6=xgt ' \1}99B`Mt]88(AY& QDRHHHЈ{bo*0JMddD& ֟r1F1CwbZħ'X~7g\h_hnn{=!\^ 3_ `㰡\nE]K՚̑iYSbW}sHV݀X #%( ?y +GC'.P2'\;n4l (57H.sa\$'q{bȪ٧]2&_ƈ[JDUe^|`nf=5P^ ZuYN1lrҨKnY]g>+7 VgYCeP}"IR) RRR03P|PnB/AT*C@(?VXF# ?b_ʁ?&OZ0 #IJDQPqefJ~ћ]mPa|gjO%9R۝uFٌXNfDԃS8ɢPz˝Ǘd&@e-R;)CJO̊=>x=RoДJcLe f]m:!uz/;aT'Ɣ0I` &}}v!yK ~MvGR/vG/g쪷to31dYs*}[+'sY g6g̕d !DlHk2|jzifޗ_!f:/\HoWY D װs?&,Ƈkl<ͥC^X,rh4$$$ T?W}ySrT|C߱hs>sx-&擙idxcDo|N'p9#=<)mGƅS-=q fbhYϻ bό\1IX?-d6uk/ff}7iyK^g*Rcp[4rי$qbBF]EZē_7}:g]Y[wz8Woc~ oϷ=c"!fd rGԡRO qӐ Y~|ױZʔSvqM>6Dݹ^g$;ؤtY]7;ܼ} gB 'rtrЕv;]|&xʺɫ23k#»xăԮ۱n]J;`qI]O@X4/$"#ӫ&ؖ6t9nL} k#:B'4/cĵdh.B|xόޜt}J`V*>/[vq~,>zDEđbSg`>cle0?c)$^7%p1"(ʪ"#ʉSQ~ˆkG7oFg=Uʾ˹2]`| ,-@Qq SzNkHQ/<Bԑ$ 2 B%U__j utG4kP;?<9rC32?D&Xb* ZU SW}T,|Cƭ]CLU gɥLoVg̪Ax2c%rfVdjL $k8Q VGVQjES,9~LpD ϐiL'H\iyu%N JR|ݛ[hM )(_,]CI9T7?פ /aOû/Zi{azZYf$VN(R@\E#}%F(" 0փLTjf&r Ͱ@.5P2iXZY!%aAܭRz棚8TFi6TݮK :#)Qgӂcy: ;TkwlK)8~!1@"H'/[־ۊ,6w!,j-)$RHIyu=9z(P(#;gtOzyMڐSyc\7n?d\e".Z`j9Q71CLo,fƣ^}m/8>maTUo\ئ5H i6t|SVNQ>SD "o6l~j+3jY[JֵE>D '^v!w=  ?Y cJZO;3ڍ&9}O;x4V3X)Gn`Y. c ƘYaVr*OXЪY|9b#r^^eYg,dw6-@Wz10Gh 01cr5%A.Eah+=M1anm6M)ò IDAT.|ޡ%KRo3_.L(C2!fǗ$J_@Ea04yv!.NJv6"l w(W3W#i>76@.#s[4rY1s!J7ZUa#7TU]&}sT$SbcGWPUN<كz9&`n+" R(h}]a0.uƳ$m.(ObqbX532t B0tP̘5kV+22 P̜: $gJr?_8;f<½okVjKI($}Zr2Z2%44:f={Q.g+Rd,OzuU+al\0*F}= i飯}Nz3rз-Kbs]%7[eOn-(JR RfLIMm濜@/ceN]FÚbQVF#!5O^' +^O)!J_~.h&n_gOYHe~#n{c?~,=xAlHM+]hv]bzWeݹ\gX;S( ũ@g.&cpjҏM:!'+VxMm.N"#8uO}|iTfxL¨m|֖3ζ322?N 8$vl0 !pja_=2x/3@j$=>굷U$ %d9.]+auC.6=Ԙ^ PX[b1SoPucjcc,! ;<MGӢ@ WVLc K> LI*71r{tRXFO j]?n\MhvI%ڴv`S g%?;BJ:m*Z:ɐJ$$kSyyLýstC#Rѳ_cYYu?~cUohLZ%ØsŃ ZMRIg)T@+MM2\+}~J߹a^P?{d_|c~QBOOyzDFl[Y7&JzylY~nsh%Tpfֳ Z:A1v:*ݻe3m8n6_`!d_ӷN>.M0F,3g|#_C+iv_qPޓ%MX3W6=ݧAQV'F͜Jj5_rՙϛw?'^{X&qp8fl9O<㧹LV0®K~ܴxfMZϿX͊κqB.n2w7U 4k_{yj#22 G3i fxN..9q' 0 Ӳ#=EGOˬ<۽[iJudb-/a̝h8t_6N#jނ?<׍9,Һ}*. ͨVKF^깣8fRA3'ά6]>,JxK[gwi]cTals/.#rwI1dF,GƣX[dBP._m"Oәe7n$XPARNRg>37rpl$n;e3);?~*4~sDvX/.ݡWAs|\6)攮ڌiSvK!: {m"8<- óOȣn~cghJqs>qjj˛xbnWMSۆ#1o>| Sg0=}oJ ['wZOz% fK_n5ǁQ/@cB< QǦ Z| MNzlS2Y"W-edzx \(_'t z~$c.167XhIFؔ^ %T)̑bESJ ҈~hhi#80 bϗnt#dų[7UʹO#6nܩXʀws/$MvBW&y5Yx{ozaN 0i(36Z^ñԂ\:O-~o}#5Y|a:dX|YM%OOO|||Xf jժ\R88u:O}|)̒Ia =xMڵ1YzKZ)s/]HHVu Stf4 VԡPcKlD{OmlX{e2%So1vF(‹)OOON 쾔Eq\2of8 j5H'xNs˜T*Uqd7~AAM6MU/ni&5uve$H+b" ȼTA[rSoΣ*IX!P@i+*ZZjV֥Z?% .u UR7"PYl KBBBw 2y3甹瓜S|<5: ?İ~\~ݹtqRW/C^^^ݿO(zOOEj>,]eǞ xXmw={sxj3#_=aKfO-""""O~:r1nNYM M]Kwm|0ؗg. dfx9wԥ a9x,D5teg`< < M>EV-YP[?<ܲ,X fJ^~~d8o k c=JIaQrb!d}l? ?Cg:j>?kNrpJ(N灙Sk qUUd#J3c|HP 6e'f} U0 x =Mun5,\ipxX ,g~ÒλqM>=:{^aGgĴL"VC߾!+k׷>: ?޳(b-?{>/E )v/cv'""""⥲(!|v'""""e|/xN"R+wv'""""⥕E )v/cv'""""⥲(!Ų]ODDDDKeQB {>/E ᘦ#,([IDDI=H}`񗄄$rss)//UQql[m>(!#-- ͛3ܑ <h{F* v]*"""""",H#*""""""҈6xˣ it6mйsgR0 #s mp#" kmK2t,ĪwS>qgNeQBWk,Ysؿ@_zU۶e9R'~"""]]c3YE~aѣ';v$'g_Ó0d% j3ƌ> ˲{z["""Һ:t>}R1M7{%iIN޽{`~rXvh4E,UhT'fYCmtt֭7[rؗ,3ꪊ-"""1nX֙ѹOTn :0c*()c>-#"}*R쾚d|v?s$%$pPQ;PT\^ѱk+"""ӹjڵLz9`.ڵkHvQʁ8G.C-:s_Q}О il8ɆaL=@Dΐav޵p `>DDDDo1͚cʃe5vaa+nWٰt ?-Vm;ЅҼ,6M?9MgTRR @tt'iD+\jjo2w{n&4󊈈H ;?bz< 9Сc3>ў hJЙ>/3u_I6ضqq͹=?Qh_šC1:#YÇU,߲,O$?|MmQ0"cI}.:18-sOsgz7ԉWNo}ͷ0ɭv7ukװn~}9 >n OƦ8&^6k0f(["""Һ%&KEEi_ZQQAv㛳FJބ2q:vU6;-z&Ye3de^\B33t1Lu2\q_oᒡDGőv (Âs0 =Yxc<'5?:?$XRG{W1q#|BטS žJJJbj>Cn^>`HdoBcѩcttc_gob=|u;]tfTEDDb=u%[MUU 'E7ee(eeeU&y㎰Ïْbs7_|ޫmY|.۶5wao*b~[&=K~ť3^b-m*Lr_rXᓕr@qyxQL:;qd#W_?e}\N˻nOT.ʙjKJJd+% ڇ5+NYĶ+ea,}lI [1'cٓOp)yEDDD#22mt\ϷX`(/Wȫ=nta _C'P= '~kut+k|:KRn]wǹLU>|]O}/$ kgP5 nϛv+g>%>ok&]BZX>_s/Aks:OZh&.W)5鬴y 1 Ӭ.,""8O4MhӦ-7 >Ӄͤ݁#yT )w3ygŽ8;2z :63؈Sݹnx2hxv.HnCXێ }źoal[/Hq :^7[Rn7nw555Uoͽg/3eDGw"&&nݺѭ[7bbbEUޡo~A͐ &6ytf3rYA """ZtHka}=EKeQB˘S6m0M7Gp0cY&m۶DDDD#T%}%kXrss}=ҦeTVVryEDDDBʢ=?dB6mHMMM@ %WDDD$,JH{{>r89,m0#"""J,JH,{1RYb{ODDDDKeQBFxxxwߌ8q"Dnn.x<**M|7T{>(!#-- ͛3ܑ <|gSr ADDDDl@H#*""""""҈ʢ4("""""",H#*""""""҈ʢ4("""""",H#m@_,bǎv:wxx8ݻ`Р!8M DDDDD3<'!Daǎ>\̐!C Gu7tÀ[e>/0@DDDDδ(!ɰaèt󒄔`s[>w>/,JH-v'""""⥲(!eDDDDDj,JH󉈈x,JHev'"""" nDDDDDD,JHʝ󉈈x/aFӯs>Y=N+l$^ ޓDDDDDD45ke} u ofZm[Y*²|MЎ|㲈}tgrWRR @tt'iD+""""Z4,{|qGJGjxٛN\[e琛ǟB{`n9 ].PDDDDB]w:a8fmIh .k2e $F1a`0 Ɠ\}ޗMs;q."==R]# XRR%;'^)),^(?N>dpϬ9^aWg\v'˲%ZYkVYl?Ç{ !Od=/qרW^z%~7X781VoyXægy܇y[59E*--/p=h!`YKƼ|{`gf9ʍJ?mpsdd!=E =#˯;.0BBgw{?.}ta:ebZV9s۝w{xZ$Llci2?5,N]gI4؃2n(]dʼ-YP[z˲,X fJ^~~P2zs,]X[vWJ m[DDDDğZ,VQUWDDPIAAзQXdX¬EpE+w֮4MODDDDKeQB˘󉈈x,JHx}_󉈈x,JHʝ󉈈x,JH{{>/E )e2f|"""""^*R~O󉈈xq:7xtRPPཞ={jzܾ}ٴk׎ٳ;q6w\Xã$Dر̝Ѿ}]YYUH~0``r(ZpüoIENDB`easyeffects-4.8.7/images/test_signals.png000066400000000000000000001200761424023573300205160ustar00rootroot00000000000000PNG  IHDR|H `sBIT|dtEXtSoftwaregnome-screenshot> IDATxw|TeLf2C*!B ""+U\s-_Ve-˺UQwA EDHH#IdR&L~ wHI!Aܹ39G-ok=aPjB!Bti555*++?y* ?Nfa:wB!B!RPTj4 N"pBL:}!!!V+555=^!B!ӧ7GGG?3f,TuB!BMuu5QOޯ2͹*dB!ARaٲUeeeVͦ !B!h?*ʪql6R˥biZ,B!B\jT*Fe6LKKHpp0nnLMMar첲R9޽;e B!BZ*F#|z`OQXhj }{%Bz1>?Z_ho]6{nO=?aAxnLu(%i?yk]g p=6LO¯F(BthTѸ?v;Djjv[ ]Ӈܻt+:{@:FfcQ[ _cAsYy$\&eB!DCR |^!E|yqk?fYأWOBV~t}vBթ[UFj: }#o9C훟Y 8\5qx{.NVc\+4f,E[?7?27"&r]w0g ^é_}ysI0pon-9|FaVͨsg6^Xig_0n-8o!e| !%J:tsx "ҿcl o~ wJG % J˸6uUj5$'Sq/zDC)ϭ%ǭ!g3nJT4"rRp$|PӍaBR]>Bte5TWUP{/|@ǴîOp KA̧97vT_&.Bcnc>0r>)\ذ>.C) J!(_qA^nU{`'.^~>#ETe?l213AKa$Χ%bX|oBtxWiaϾ :}'v#kPFpρLu3ٟ&k<[$o+ؒy{~̰‹}jR^CjWVb&%=wb tKs !Moǫع o/O-~}k2|y7I>yxxtvy?B!dBjrWs-Xź9V}&Yg<8>Z~6-Ӓ{O"mZytY!T[ڹg|qsJŦۑoCGPYYIҡ:xB! (;LF5~>jFͧBMTaCGjj =w'5_y9r/s5B!B jO?^|HKO'w/;*}))DEFjſX6s=1^MV3vH۰_vn6sUsk xB!BK;}ؘN.GERFXh(z6O<`zfc}=scF ++Ei/edݟB!u~u??~u"zHMK'%5=x hc)_`a~1]z|"s&$NorT !oEAVpv>%'B G<cW tSdfjhBNUGלbt5vw|FY~e;Eh5nlhB"8z$~AV!%H55-_wTzD!DXsW0{PB#`S; -*+JWRYeLA>>VBq)>V) AwJxm#7u Cb2r8l*ƶ9q*+L53fNl'3n8^iRECѽzVUEb*q_/o*mP^^DכR2ϜcӦ54{6~!ဆ>cfA!hFtRPP@eeOk_edf{zBkEPH_6oʊ2e+p8g.<jl<<+87JΤjrJM%'B!:˜ QoRFqFB!B6q=Ӈ0SJ N]ܑ !B!hucOجvǛD_q !B!h#P:}0 VUɎe7`-7] !B!hFt*-e$5vBM1 !B!h-ҩQ^K[PSvuȄB!BI3|}k=S?*#$B!,{#B!4SaPQK[UY)J#B!B&9Û;cTB!B.ϷxB!BVMTT[ʰ%r-Ґ]!B!PӖ:F>{3ih-jxX!7#`/y2RxwMPNZ=w ~ 퇭ʊZmHi~ǶQċ:V!B!~m:4_OBMa:Pj9vǾ^JO+:{8u:}c瑽~LhXL੨5Z*K(JOJӱm;z xqتe] ->B!h  o'q:P+fSkuz}Oavv4[̟?!7qK:>蹄 _DUfv^O!Bt>*o}d4c]r\hcT"݈(gOp)k9v#^NAdC/8GPp3ϜlÆϢ̇JŹ<,vhK@!wf_9VT*[^NxE\P!B.ZpAz}:lkh.;R#)s=&=G_h=O b.ӿ"vΟ%&S{XJΒ m%8v"̙Kf:}P5~B!oEYW[E I?y6^Ca\.U{:Dk 3Omʌ1VtI}#[W&sQ '"(=A[x^_{$}?G\SM 40M|&Ɣ݌%>|vr~ξF?!XvCG|r\FgG!Lsx1A0e%3S l{63I8>nX4zܴ:'wvTW>֣S(O̘KOpBO7?E96KC~Ǜlyv\>^R^C1_MѢ9i`7ZnLhU|XLu+3fqr-\JiIQþ 0G"Bp>UOjb{j{{I#? IDAT,/9/}h†$|":*+jd>~k lV {޹Ww\A72frO<>x4>تI@R5i>=K%!@ BFEo} TrՏ0Kckz S1Zkzz FQzb7,z ?rh[zьY{gE!.z`:J֕DNkt9%+JwI5R6>{s^KJd+qHZ#eTWViuD[H8`m0ꌳHuN1n!1CქHPOL9OhI۴Xn:";,N mV [Vwb :f׸9.eÆbϒkz}Ǡh?/d'5lX!5RwցO|Y gFj{{߽/klV e,'woMO$c뇄ۢ <ݣ8#XL8k$w.^%|~|aC&r-\fzkG>sA.ߏ7ɋZ5 \g&/"dziDǴx(/t~џFKĸ_g뙰KwzMs~0{MjH]1naa\bǽGon 1W\B+ij!'q ";k`OԦT#4n6l&#fۋjnZ8 |kM.a ?ß=)(`W>WP ^ 9z|B 4jbsR)H$&"'֪.s&nR"c5G3'=tEBG7zw@* ˌY&~GD‚.{c)=⦡ gK1ׇ֥ JyQ>6 N:JUvy 2% a }4]+y#{[.~MQku5ZkBߚN 9넏ݪ "ZnK#;+yQ̉^k|-!z]U>b6Ǿ^J֮/nc:gKz&>l+wu^srh<|g[8j|Mذ.Co[FyQN,e&XWOHo*ͅMNs z q-;V{|VԻ9;>!h4Çß-L`Qu ̡ج) ;#Na3[ǷSUa&xF8޵>Pg{ 2jekRw }g<@@U!S>Vpv\duSĸu H'9pz~j܍`w mMhL4[fl{.>/f_g8-c:JnwDNŁDii>}ufb5o0V>ϙRhijV6>Fs*'wRD9.`}~jso h"vZWiMJMɝ go8{wh+@܍/r.+A8Q>w ?'wcf=NCϭS@/#;cq"-WNBjGKIWNw a K':_(/aՙf=GrxM0Iaz[آy/qڬy 5iCk}jّu-rڨN*D$,h†]Me$6>־3 l:{l~iߧگWӖcG.9b:2e, S`=@ʈlf{>(=}2dTJ N9PkMNlSZnb[w`-7a< Fiwo:SM==>>w6~6}Ccb^)9|<u >mK !u.TBopQu1:}OoH\z|q鰘 8zc_ذٿ\^A v}=ԍ;D17?-S&8f"y6:Y-H`Q-a=cۚZnVmÿ=14{b6iѓxG2x10j.kMnqvJ&bvYs)~L~f!h 4e]?I@~֩lKVe/rH3!r69)#gAfϪvқ\JrQkAkeYkgrQhR;i?q 07`d! ]"{g=ayю3wrِ 9E$~3x9.0uwkS|Sjr9(-+a;CuZ%{WuI\çSi|ǛlV %g 9FKe)SC֧ꈻq)l|ɝ#fsٳpgspXZm"j"nZ2w|R3I8UNKgk(/bPjLT腏Cĸ*F2tfPhE϶ ;o ER)I&(f| Uf. ̘ŹEϴ[D#BG: 4P9/[Oia)1^9@MzC,:@{I!N]&%k}eʝ>!$ s$.kB0z.ZO}2~ƘRwEǕ̎ފ6Uk!-p1(t\˥L Uǒh@Nm粎5X[9dl O{-QqS^[|^`>1e0c_/u۬LYG |;9S1i g*k5>تD;҂S ?Sz~f`1Jy`W ߰. 41eBmR{-Ufb?VQ= qc}g‰^#' =1Wa3o%w,Bt3I?Co]F{Pku <?xĥ; F_2Qs)L蘊2QiS:JBSVp FɦpVemϰT;eMTM-ڗ3i4zQhhvd{xpr.fo ޻}GO+Z= ؜靟RAY)rNnL`ZOHʋ)?}W~>)>`QF{=nqTU)3f]jMz;2thUTU]fY{}fi +ЀZŜFG?*cdQ7&|Bu!EVyC#)U)K|]_CV3x;G>#eǫ%Liϓ~ihޖ颭dZ7{d۬JrOĴI>j`z+Г$'!öd)sMf3F_c5^G]Ay/z?JAɝN/8_::}XMT dg쁎)8j -(,J 2OHoLǀ zlSK03E'lLmt'-< JEʌYTQq zmunL J4xy9-Vm.Oѽ*#tS<_>!|&?عO7;m'$05{9: >zn BVf"qCrq;e]˅LK S_Hj:P+JOl2{dZ:.ds_{S^QɅu؉yTUf8 N9Eh<|F Ɠ;I٠'$iQCcJru)xZfK;7~ت5gjy!X/>?Vo=7_2Y+0ˌ+z A{9)?#YV^FiA&B:}0Cnz3kF̴GIwTmk1n!Qy\ќttJ!]h36_5yQsx "LG (3FW(=#gߚN> !V{:Zg)8@Ƞb7F _Eo6[0wF ԞzRJCSqǶx?fP ~N0Lh0 | f=̤N8 zL> 8b*gKj 1ԧXq ”\(SU^Bi~c,lUV-2979-7f9Qܤ~ƨ:bU/[{cg|ʋrui~ZGţh)Lx̘;8[g (fW9/C>gAoz D > >S1]OOaۋ$vIyQsx,r"lUVNf@[83ɥLZ,'T@U߰u鞀-aKq:Kii$_DYl::_CdLZf~Ǜ{s.-\Ja&ZLT ?FKEH߰jeށ@;;4k9z|iӂ1r㋌' I\$|EMF>-z 2eS)>=cʍI3o_!{WxG:UJsQUn] 3~lNLh}*k[͞wS=Lk~2쮳zT+Ke 6D>@rB/ԍtbyV_8Jsz !kAM>eZj-U^` _ASks9[ 竒=~ o9ت^mq #nZ,OH4gog3X*L|&Ɠ;epgF鵨 ĜRu[VVSdL 3Y$8fӬl}=L#4J.#/i#nsUpEIݴ;SZkx ]^Vϩ䬣OHo/dN5o0c ԽVG <:Kg͘AS~"v:ZA8#nj`Z4C߽%oSy6&vSE ʇW + k? ;)~BnGp)ݣ]Nm[uǭ*_.VY߂K*'x?L}}-i赵 fԧ7ĞzJ|]KjAB)Y)z3%!Jecija3M\ib9_vV*EU{/޻;?oх]11QkL)B~KNc`QF~]|` qT&ooUsrhYHe cD"P7 s| Ww Oy9$}cC1}P œ=q3WQב-3f7( @R+@[c6.30kɑ=茢3Qס!jҢm>rO=.#/]=ݱlBD 9O2-R-O5/d3a;KwbyiNu;aXƦTqP|ʒ5`4>mjPT@DONijǷ92/pÇZL =MXnKL vP4e_ǚYlzn9e(@Tl_)4^{>ʚ@geȡ Ɣ|%sгk}zDי }=سg%9'b*(=Ox|~PZȎ:+8BQ~ q򳔺mg|p}{_dSnvq70z.@DAqfa[T8!4R7UOMY>wroٔf1}B$B4`Zؿl]zIpx6([3=q[DEu22N (/֍'\Bh<|~s=:@ ow*MSRPqHgܖV>!Ѹ;hQ{:cS,aw#Rn@4/z]XJu#[L$;mc xc_woY+ "6FKi~zu>~{Sτ(#"=j!֧J94Q*h-3չ*e_Qz"{W[B)’o _M1XLc'z1^F_2`9;fS绖3tÒVjL52rh<d{޾ ֗ ~r%9ÜEb Iڦ oE3iQ _\ 5?u DM^DqfƔݎ O:S6B1~ Y-}xLOH4e,&œUY7RjsV FB>!}ߓc?aLgc&8 HYM$]oXz5PkXJJVM}pիɍl:}0~CsL IDAT 6KSQ2$ zd6&Dv:ֿ3NZ{.xz_~'"4:F?Ke*rSHY9OHEiՊ J}ʹ#ڧ] &8v:@ҷ~~7<{KIA:Z~ʋ!x^{6^p)ڂb;Z5CiZ(-7|:}P J`B+s^ $)OsT.,16xmya6j sn^dc ގ`ޜR\QOpZ2Ϩ.z;3f*bt GŬ_bo#̺>{\{(ͻp"3b4"{Tp|jku*7 tR''0ۚ5_BEUf.[q oRIݸ\1S1e+>!1es̘EIN2A1u]Gw \Gܧڼ}/'u4Y!ړ|BvU{zB,}0Z,%VT FGOvX[t~c*\NMlJȡMf\L]4iО2@c=ޔ-$rSW(I&4J~У8wGRb$gZGfFV~7j3PZU:yT*Ep%r2c AYgZ6z7|z m*暯2Ϭ(Gfe63u ILG>sM MmV [>pSYR)/iUTZmlc n!FG!l,-~5֕U&sի :A2%CZ1;UXgQc&8ƭ3$&m4F=G;}*믑#)Jf&{ȡ C&UAc[T \0+R%Xv}%c bI14N.v$e/CO7)u+e$cZc(=- lQ.}WZ)g68_~nQOHoGMWѓ1~z~ .;8+$m$'W.2>}Y-d^C]4Yt pzPtԍQk 8k\'׿NƖ1NPȡ cEYx*aJr1ا?hQjnSJߎ֣XJTUNuWL~} #ًzDժ96Mdz tWk^,_Cw?{T `\AEd=LM+vYfijiiVvJ+K=Wm 1~3wgC`0_my~9ZY$O~*\KWDrP1ƢD^cQzbC&z+D-yoX zۣpj|'BwEY'C+Ehކ^S_ogϴ'z#m JP.ZAV<븡WoeQrkGQ#s'hZ܃)6)IhRyڞ7ř{gGg-8y1Nj¤%F`L9Rn}NǛD )0ɡ  Y(Xv[dlCJ~#Dkڡ7|j6"W+*}$BzEg|B^mk[8|DJ/i/_h :ߨaZ]'uQ mj`]*LIۡJQ(&g6*N^8i/4QG˸9(xw"?i-UDE :  >"jpEwEjBj^>fZ" "+>,Ef>u#4J!hq^Cc EH 9u| 2Z]oG-֘ QvSq{ߕkDkmVFy}%@gq$Vzb^رKЦjb3е|]V߫Qʡ,Fh^&hUR㩵Dљ=&BڂEZi$4EYBA\sHta4̙ O7)|!}NWUY Ie_EYLJ/X_0x:](:nK{z1`V;8Lun s#ڼ?*}$s;M2?uU Qd^moGqr̭ kZ"0EL΢8IKrqm ϧը k )’#*}$.O]FE9Dt /o12>Wֵ8ŸHJS~WXڦF&x5x,tSYؚj1ƢKP(k/0$("fOmQŜ" yɬN]AXw2BFO\tu!Ji53'LZ P/nOlG|0zo*mvU( # k_Xr|I߆кPD 'yck݆ \(dFQ~1 $٤AcTHD%ZLv 7-`gCF$lWzVeaMu.>"j4jy!2_z0u5y А{H[5iq&:s~ڠNv|E" صnBwh"?J4AS~W/W,6)P! FJaBZ|/%9?~i~L xx`ע{ ߯@IhSV"IeLaDC-lP-8Sg!(mVk Q#:g~]R;=mN4&aznPl! |"fU(j8|{{,{9 Evm !řdmMT ؿySCu7@‰4"~!цu7乬1ڪobc:ힵyTȴE!2mҋG {+Ȣڡ9LDZ9\m+: ř{~zzU~gh%l?_$x/Lir H[5H, ?E~&-MJ#u2w/ktS Bug"Fቿk[h!o &Y [ EHBX7eY][ oeYF, ! VM3fGDDB߱Иۃ 'DZo_vy1!LS5aSȴglFNN?T /Du'ϷfMiȊsI1}iSvǥZ@@Ti>JA jka? Ъz/O7MRrdIV݂6B \vjD&aexv$+nTqr{:n6>h1Pӛ!ш> >(Zi"H\, ŦSm=>X_g 8.ՐmW5!L5r%[uFLU/>n(zHUdaphia!(6հ_m} pWPvQF$g @QW/~oE6@qƼXRW_8$IbkI2n%u0h6, 7/rhl VFyIU.SQz4gB=L(KrV@0 oBOs:[ŜI-im2VYIe[ s1=Ǣ8sIZr 3"aCvڡ Ց^4jBc͆oP$2ED?C, ÁOEuH@a? NuDl+YǑt ! =.T_a ze{P*yaGQR !|4wkU"]IuGּ^tD7YU`WhExn!cboP!S'!(V?u͸Ѕj ޼ء*}/NEƔQ^|:h$-h OCm/"fN):^\h}$a-i *yʢ:dD%Zr.TWW@Ha&Ii26{p El? ҈M\CQpڶ=BxnPl** .6[}xJgInc DRCexQd S=ce]5!eࣦQU[,1ڽAW^UBUR4jƳ8 *![UW *4R#J]ߛLGC,FmXi- ,ζZ 86yQqQn9tF֞(܋^Do ͇$Ǿs3o^&W,Sep54"^w)Xs,X8ޅs|lt7 ZTzLc[MEHU6i^ йq26.w\ 2.$I2bL׹;K!SѦN+{4WJsm)ZQ#/''1dme{BOB!sZW&Q(MWZ.avwsqW8yDU(lX a6ˋpaS%2xQT4긝U|f*JfᄦVN'Tt5Z|Ptu:&q@xޟ#pVXR?gm`lU^n9)qv\F+E#h2LCyMp|lk+dX'L-: }? Y"g~K/6dAlM1KhH9 ]|\b$\5ByceYY?~ťG1p_}sb;^D m~o֕5؉e|!|T?(iIT}YjbPLME֞~raq~‰_ʼn_޵zA7:eJ/ʖg?Zma ؈4"aIuo uJi**B  sʢlE⌝CLaU~Fqb;6jQRn3l" :?uy~K{* 3[=Ҧ2 ^r_xKdtt8#ov?~( ZQz" DEGealg~]E9$2 O0^Wd-̩55! k.ǷaScr)xcQu|]ծGhڡj*^-Rt$5N.Nnt-ujcSB?ؾ[fF$"[>q* S:;:'dGoPk-!2.߶ϝPrdѝ'R#_8$K:GXlJ*H ȴ&- z|lÒ?,m|VX[B;F)!KZrwFcGlXʢ/F| Ɵ#3|DDMHm<5?B GӂmH4Ť( a2| 5%EYÉdgd?*[:JQط/[ǔeh2"#!8. ! = y<$~=Ew9hm(bz5d$cPtzEvHޤX - ggધ~߀~q4FmER* FV8 yCeQtN$քv Yt}3U qjI  ̔^2B9~Oo1Qs3ZUbH#֘m`ƌ;h(p-FTH餆Z968FXO'dCQB-/>s$$ #!mB36_8͇ۢF @?ugbQ#QfKGg_ *p7ް 9G/2x2B9~_YPtzw8 bYalYPLxSv -YL* BYcpw 4jA<$mWZd4/H`YSYkHMJkR)X\=i0,&>`[te1 "߲ZfcVCn8V{SE%ܶPpD ť][k(?`-KNm9V_6d{/ %~+"nFޟ,gGDDDH5ԚWN֞HeGBV-!(PTņ deVAb* Fp|Ґ&ʹ S8}"Qp&{][*:e5BM܏||DDDDD(K_1*j>",9㩣ѦQA$ pAS9D@9'-!+ p%W:A[5mJ6O864 ^0TT%yд#2_km,Bc :hSoBCzz}_Q#;y1N{6eׇ(o!W 5'P mh(ِEwp:3|DDDDD͔#n}ޤ GdA1~M67#S? jThPu}!&>W}.k/ Bz `Yb5cYƦOlFW{\U?G^^CDDDDDD )|DDDDDDnbGDDDDD)}*7 w,,*LFx0f} |9C+[Ixar+T؀K^Fbxuط v ʍo5۶&s:qb+hxy~(빍-)阽ށ' ا U~;_B݈ע0c3V}:fj{ $ǒrhe=mt{@\@Sٯ`w5!|][5]=aHIoxo:۫(-xUعO[ j4~ $rHǒT_bAhlkG@4 T$-DR-Ns~kEIl8YAAaH6==؎jfet? ~.ݎg|;7kb'X'pBK0L-prz } O,RxG`v}K׊38_: ŽegPaxhH$Jf9质(G~[c7%+4)Ujt7?g~bnR 3k^3W] m/܆v9f2q{s*J۟K??PKh[JH! ?DX4>Zr@EEU{\Ď~Fp8ǭ-ܷtY?-?gxu`[ vScB/cbjfXE\ +pE(Uy!0,]PuoxC;D>?w fܛoE4̙d9f4iOy+&qW?uZAig-GWLzNt6ƠCJ}%{BpdnڡΏ`odf.ouo֢X=nmᾥk\2')k%_}g;} 4v ,S e\8~x) ޛ >H0ǒ֞3i=SV2xWɑ .b+-/= PsPfj2sP`5Z ޛݐPWX]{O^Pܳ Kw!_C9i RQpO+ܳv_3GZt ̿ o.8ӦaXlam Ppk'gՍ5MO[aB:tH_{!`:J.77|.Ft6D6@\á*_Z<_xj& onW?(Έk o7 zTHT'"k>""hPSVjjjP]] h  1أƤj]=""r1f\H2j"""j<)f\>"""jL)f\>"""jL)f\>"""jL)|DD.Ӌ9v1)xdf_4jpdm(su:}FɩtY}h ?6r;-98=?""qJ'Q -<0{RFIA&=Vy 3< k6|~?\ K}pgѽ{ """S \ș <Ϥ80IAhwXUr5t?NnM Qr"EmUj<)sr>w( 1v-Ikb;_~ay$<8(^J~fma+W OIqo1gXנX_8xՒP$ ]ފ`Ch*NO܌}Pmj3:˿ފCʠ u7߃ZO#Gnӥs2vD#"" 9YN{gk!lS3}as%s, c'>[̦X{ļ;z=/u&|c>v>_5VɓdxOGpSɈ |Re0FFNC8|,c[X[= PT]jz?<=x~ =Jf-~ ݞӇWU G"һIqyXH-qkZHuJW @1~W\N>|bj49GmѓBJuNJ'3//ݷTLtl*Z|DD.TO@s^{$)<JsL3[RZp2D*-||^x2UQcL5xMd%VOciP:s:tRjg*udd@9:hi{7w]%o< 5'UW9Nar7*ҿA 3q6_]JXL0}B!j+HDD- >"ij;~|0 je(WRHjo|QU5D\Tm3QD'pG5i]4ά)bĐZo<|%š063t\V~1}߆I EGJuFE*UOؼUUU]>諩4!cfŀE @(DtjU(-t|s+7bkֽDojU(=w7;eKv)Eq@fYQQ7 Lť12Y$߻3>'|lVi> ZȪ""\mj*hksx-1^~^WBEc2~*caVSLSybg5 >ƬJQuǴBt:輒-O62R =\>j5ڷk8x>""ON8'ϼϖ4?j֠§/^/&1>Jy zYϽYSkilqv}:? yNY\_y~G᭡ՙNMtm_Ѯ[ڄ@Wr ~=0|2}9^x'^aPD~nzrj6|DD.کbti(fW3YJ]Zm9{/~/.ŀPyƤDW^݀N[Zhb&`ɂP|t-JQ0zǼG@"ʠZyW+6I,;"ktQaGDBZ->"""j< \e󉈈11#"r!Z.'BDDD 1GDDD 1#""ĀȅQcbGD""55rPMi5y+/IDATv0ȅHHH+\t Z!7R)趮 >""DAAFᐛ#66111 G^^.!OW>""""""7ŀM1#"""""rS >""""""7ŀM1#"""""rS >""""""7ŀM1#"""""rS >""""""7ŀM1#"""""rS >""""""7ŀM1#"""""rS >""""""7ŀM\=""j~Nǽ17uɸkX$& CCDDDNcGDDycqQ1#""w;b`* |+<}.KWK8e73dgP̯wjI=2kK1*~]@464^ǞêIko5wλۉ7X~pɘ24נpZ,v+ w0b: /DZ⋐'78r*sV?>9K_0w%H݃g"@yx9C'B{v }2f,w[EG=~' #etΏő)5q ?BCLXw ޽: 22!]rٟG~3<Q3ÀlТJ|5N Řh"lb ;ޏw cx_pE%n/T)c# HA2L[=kn*ŭ=;ZLꋳ{_@6ይ(I+gަ.}0=V,0P?ؖSGe "";1߸L=U iO$wN4NvG῿U? eDDD.ŋDDdg xk5B80|:w*^ :Nk at*(d66Yc0!:mT`1#""dhlI*E^37JF`$j?(/W_[@qpxX 䐗;O؍ @MDcP l/ȁnKDDjIDD ǧ3R:z<"_}G(ԁ=&?1~2 }ݪ;w*'_QD$ݍ˶¿(n7ژȵ#"Gbexvn>D5(/p1}0w8;[IDDxތ 31ZhޜUW'bACaF 剈#""rVV? 1#"fS:F ()~3ctFDDB RmKfsLxΓ!"fk3|DD$??vPlH$ Fd$K#fAAAҥ+b_W((Gxx5;ǎl1ADn\\ ٓH y 5|DD@RB"aGjb_TUUzDD)|DDDDDDnbGDDDDD)|DDDDDDnbGDRU8s ??,? W ٻ_o{ `DDDD->""R1 C-G2lxx0Ck6QQa"/?#j~<oaQ3$r][ G?g/;^EHDDD->""Wގ?BCތHsZV)>f}ģ!""j>S8 CMn 'Ĺdd͎ZJer[uu=<<0L_ŗ(--m5W \ eA&3=(A@qqWDG|qqܶ gϞū/jd=v ߾eӆF \E힞%y0tKjrۖ?D^^Ŷjx=&A ѵ#e(+3].~h_т64;|ERpaM75X3s(̝cF1&!ɯN]6Y{2$tڊPC5 \ū?`O?p ݄纡Do݊{D"qp""rx0#BTQ=4W)../BzZrk4ճwϞ.k1#"r!^, Ð=!8_짼k4ԇa^ b,zaq>y |?雔} k'r"Ug᥃9x~2yc]0u~5wXJkQ _iZprT_jOq j#§+,k|d'[XYh̼/IWxf{l+#J%vuL[o5,&YY@8(>#~߼ qXwqk#O?*frޒ;zJEWyjŻl;q}u4Cx,ˢylcabZ!_]]-c!a!rrQZZ*O!:II9ّYTV[ĴAָ,9ZDԛ|~p:N=4DW34 CC0pP L0Mٙ CC@) LAg^T`Z MEFӒξ^Y ߿ |Yխ_{/>Բӏ,<*~=qEðjG'~?ǓV'犛y^9wڱ׵,`es_/xmw{bvVB!ϋY{c?>m۶}aBa#++dDFIjlyx)#~p:qzi lævC4,?P F]a _ /W lM L31 x>XŇ[|,(v |f^Xo'Dcva4{:O;5gpwD)4q^Y8nG: MXMO~p%ӧWKf Wc-+#)1<2nxRO !_97FÉeg b LKE16 `a?Ӂ~ũ+| Tn?~/đ_ȅ3߁ig6 )-fx)L)::B:̟?m"d)\v^ @5B™߈#;k%d]kC0'xpB͟lPϥ{Վ=*QLsagp'Á]qfԞyII|O1~lND2&7#=-{)e !* 4)_UZD˲losN9uF@C(N\f.Ibax#HS`$ZG ڡ0ѻ>Q|h]:nN4q}8lᥡM8!-Eyvz6~={ iil8$i@ mEXͼɳ$ʖVGs 7_+t6jD y&ضq[w\X<^jBjܴ=od>(>ٽ(P@}t?{}H81cFYIqA|g/1!񴴶rPh; !XKyyC^#%ddHu!K0$ rwtt´t3mT9ʉ& d5Ob%QȢX ~=A;HY>#Z:|T|6OykiG6"slk -OU8_'@" LaŘŃsNr3+}hK,.^ºWYb~rEf?OƔ[]=_U@5I\r.3.\_8aBO)_kN[@jj*+VTT~G, Π+Ţo;@eS'q;9B ;^{rtZ9u+;T#h&1nOQa~OFǩcpM@;oSϻu&!KeיPG[MxQ.W&7kig\`r@  AL:{^3G{^? !ؽ3jk3et3D)չÜk~*++ٹs; įB3%T;+6&f_" |.e׉ssْ\Tȳ[[9x7ϋic¦+.dW'+m2}82ߤi8T6o ?7ށ%B!\.&L ֭U2RWN.vLt !B!bu;>!B!N|B!]cQB!⬰;]؝#=. 7M: r3 O!BqV̚1}D9<#=%d7pےş!VUuܞB!B m~oo HA4M L8^{f<ωB!TJ)Z[[ݵdUru\B!BQ`nR!B!P?C*1<7IENDB`easyeffects-4.8.7/include/000077500000000000000000000000001424023573300154615ustar00rootroot00000000000000easyeffects-4.8.7/include/app_info_ui.hpp000066400000000000000000000055061424023573300204700ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef APP_INFO_UI_HPP #define APP_INFO_UI_HPP #include #include #include #include #include #include #include #include #include #include "blocklist_settings_ui.hpp" #include "plugin_ui_base.hpp" #include "preset_type.hpp" #include "pulse_manager.hpp" #include "util.hpp" class AppInfoUi : public Gtk::Grid { public: AppInfoUi(BaseObjectType* cobject, const Glib::RefPtr& builder, std::shared_ptr info, PulseManager* pulse_manager); AppInfoUi(const AppInfoUi&) = delete; auto operator=(const AppInfoUi&) -> AppInfoUi& = delete; AppInfoUi(const AppInfoUi&&) = delete; auto operator=(const AppInfoUi &&) -> AppInfoUi& = delete; ~AppInfoUi() override; Gtk::Switch* enable = nullptr; Gtk::ToggleButton* mute = nullptr; Gtk::CheckButton* blocklist = nullptr; Gtk::Scale* volume = nullptr; Gtk::Image* app_icon = nullptr; Gtk::Image* mute_icon = nullptr; Gtk::Label* app_name = nullptr; Gtk::Label* media_name = nullptr; Gtk::Label* format = nullptr; Gtk::Label* rate = nullptr; Gtk::Label* channels = nullptr; Gtk::Label* resampler = nullptr; Gtk::Label* buffer = nullptr; Gtk::Label* latency = nullptr; Gtk::Label* state = nullptr; std::shared_ptr app_info; void update(const std::shared_ptr& info); private: std::string log_tag = "app_info_ui: "; static std::locale global_locale; bool running = true, is_enabled = true, is_blocklisted = true, pre_bl_state = true; sigc::connection enable_connection; sigc::connection volume_connection; sigc::connection mute_connection; sigc::connection blocklist_connection; sigc::connection timeout_connection; PulseManager* pm = nullptr; void init_widgets(); void connect_signals(); auto on_enable_app(bool state) -> bool; void on_volume_changed(); void on_mute(); auto float_to_localized_string(const float& value, const int& places) -> std::string; }; #endif easyeffects-4.8.7/include/application.hpp000066400000000000000000000040601424023573300204750ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef APPLICATION_HPP #define APPLICATION_HPP #include #include #include #include "presets_manager.hpp" #include "pulse_manager.hpp" #include "sink_input_effects.hpp" #include "source_output_effects.hpp" class Application : public Gtk::Application { public: Application(); Application(const Application&) = delete; auto operator=(const Application&) -> Application& = delete; Application(const Application&&) = delete; auto operator=(const Application &&) -> Application& = delete; ~Application() override; static auto create() -> Glib::RefPtr; Glib::RefPtr settings; std::unique_ptr pm; std::unique_ptr sie; std::unique_ptr soe; std::unique_ptr presets_manager; protected: auto on_command_line(const Glib::RefPtr& command_line) -> int override; auto on_handle_local_options(const Glib::RefPtr& options) -> int; void on_startup() override; void on_activate() override; private: std::string log_tag = "application: "; std::string last_sink_dev_name, last_source_dev_name; bool running_as_service = false; void create_actions(); void update_bypass_state(const std::string& key); }; #endif easyeffects-4.8.7/include/application_ui.hpp000066400000000000000000000066531424023573300212040ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef APPLICATION_WINDOW_HPP #define APPLICATION_WINDOW_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "application.hpp" #include "blocklist_settings_ui.hpp" #include "calibration_ui.hpp" #include "general_settings_ui.hpp" #include "presets_menu_ui.hpp" #include "pulse_info_ui.hpp" #include "pulse_settings_ui.hpp" #include "sink_input_effects_ui.hpp" #include "source_output_effects_ui.hpp" #include "spectrum_settings_ui.hpp" #include "util.hpp" class ApplicationUi : public Gtk::ApplicationWindow { public: ApplicationUi(BaseObjectType* cobject, const Glib::RefPtr& builder, Application* application); ApplicationUi(const ApplicationUi&) = delete; auto operator=(const ApplicationUi&) -> ApplicationUi& = delete; ApplicationUi(const ApplicationUi&&) = delete; auto operator=(const ApplicationUi &&) -> ApplicationUi& = delete; ~ApplicationUi() override; static auto create(Application* app) -> ApplicationUi*; private: std::string log_tag = "application_ui: "; Application* app; Glib::RefPtr settings; std::locale global_locale; Gtk::Button *calibration_button = nullptr, *help_button = nullptr; Gtk::ToggleButton* bypass_button = nullptr; Gtk::Stack *stack = nullptr, *stack_menu_settings = nullptr; Gtk::Label* headerbar_info = nullptr; Gtk::Popover* presets_menu = nullptr; Gtk::MenuButton* presets_menu_button = nullptr; Gtk::Label* presets_menu_label = nullptr; Gtk::Grid* subtitle_grid = nullptr; Gtk::HeaderBar* headerbar = nullptr; Gtk::Image *headerbar_icon1 = nullptr, *headerbar_icon2 = nullptr; std::vector connections; PresetsMenuUi* presets_menu_ui = nullptr; SinkInputEffectsUi* sie_ui = nullptr; SourceOutputEffectsUi* soe_ui = nullptr; PulseInfoUi* pulse_info_ui = nullptr; int sie_latency = 0, soe_latency = 0; static void get_object(const Glib::RefPtr& builder, const std::string& name, Glib::RefPtr& object) { object = Glib::RefPtr::cast_dynamic(builder->get_object(name)); } void update_headerbar_subtitle(const int& index); static void apply_css_style(const std::string& css_file_name); void on_stack_visible_child_changed(); void on_calibration_button_clicked(); }; #endif easyeffects-4.8.7/include/autogain.hpp000066400000000000000000000025261424023573300200060ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef AUTOGAIN_HPP #define AUTOGAIN_HPP #include "plugin_base.hpp" class AutoGain : public PluginBase { public: AutoGain(const std::string& tag, const std::string& schema, const std::string& schema_path); AutoGain(const AutoGain&) = delete; auto operator=(const AutoGain&) -> AutoGain& = delete; AutoGain(const AutoGain&&) = delete; auto operator=(const AutoGain &&) -> AutoGain& = delete; ~AutoGain() override; GstElement* autogain = nullptr; sigc::signal momentary, shortterm, integrated, relative, loudness, range, gain; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/autogain_preset.hpp000066400000000000000000000027101424023573300213630ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef AUTOGAIN_PRESET_HPP #define AUTOGAIN_PRESET_HPP #include "plugin_preset_base.hpp" class AutoGainPreset : public PluginPresetBase { public: AutoGainPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/autogain_ui.hpp000066400000000000000000000044231424023573300205010ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef AUTOGAIN_UI_HPP #define AUTOGAIN_UI_HPP #include "plugin_ui_base.hpp" class AutoGainUi : public Gtk::Grid, public PluginUiBase { public: AutoGainUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); AutoGainUi(const AutoGainUi&) = delete; auto operator=(const AutoGainUi&) -> AutoGainUi& = delete; AutoGainUi(const AutoGainUi&&) = delete; auto operator=(const AutoGainUi &&) -> AutoGainUi& = delete; ~AutoGainUi() override; void on_new_momentary(const float& value); void on_new_shortterm(const float& value); void on_new_integrated(const float& value); void on_new_relative(const float& value); void on_new_loudness(const float& value); void on_new_range(const float& value); void on_new_gain(const float& value); void reset() override; private: Glib::RefPtr input_gain, output_gain, target, weight_m, weight_s, weight_i; Gtk::LevelBar *m_level = nullptr, *s_level = nullptr, *i_level = nullptr, *r_level = nullptr, *g_level = nullptr, *l_level = nullptr, *lra_level = nullptr; Gtk::Label *m_label = nullptr, *s_label = nullptr, *i_label = nullptr, *r_label = nullptr, *g_label = nullptr, *l_label = nullptr, *lra_label = nullptr; Gtk::Button* reset_history = nullptr; Gtk::ToggleButton *detect_silence = nullptr, *use_geometric_mean = nullptr; Gtk::Grid *weight_m_grid = nullptr, *weight_s_grid = nullptr, *weight_i_grid = nullptr; }; #endif easyeffects-4.8.7/include/bass_enhancer.hpp000066400000000000000000000026041424023573300207670ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef BASS_ENHANCER_HPP #define BASS_ENHANCER_HPP #include "plugin_base.hpp" class BassEnhancer : public PluginBase { public: BassEnhancer(const std::string& tag, const std::string& schema, const std::string& schema_path); BassEnhancer(const BassEnhancer&) = delete; auto operator=(const BassEnhancer&) -> BassEnhancer& = delete; BassEnhancer(const BassEnhancer&&) = delete; auto operator=(const BassEnhancer &&) -> BassEnhancer& = delete; ~BassEnhancer() override; GstElement* bass_enhancer = nullptr; sigc::connection harmonics_connection; sigc::signal harmonics; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/bass_enhancer_preset.hpp000066400000000000000000000027471424023573300223610ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef BASS_ENHANCER_PRESET_HPP #define BASS_ENHANCER_PRESET_HPP #include "plugin_preset_base.hpp" class BassEnhancerPreset : public PluginPresetBase { public: BassEnhancerPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/bass_enhancer_ui.hpp000066400000000000000000000033641424023573300214700ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef BASS_ENHANCER_UI_HPP #define BASS_ENHANCER_UI_HPP #include "plugin_ui_base.hpp" class BassEnhancerUi : public Gtk::Grid, public PluginUiBase { public: BassEnhancerUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); BassEnhancerUi(const BassEnhancerUi&) = delete; auto operator=(const BassEnhancerUi&) -> BassEnhancerUi& = delete; BassEnhancerUi(const BassEnhancerUi&&) = delete; auto operator=(const BassEnhancerUi &&) -> BassEnhancerUi& = delete; ~BassEnhancerUi() override; void on_new_harmonics_level(double value); void reset() override; private: Glib::RefPtr amount, blend, floorv, harmonics, input_gain, output_gain, scope; Gtk::LevelBar* harmonics_levelbar = nullptr; Gtk::Label* harmonics_levelbar_label = nullptr; Gtk::SpinButton* floor_freq = nullptr; Gtk::ToggleButton *floor_active = nullptr, *listen = nullptr; }; #endif easyeffects-4.8.7/include/blocklist_settings_ui.hpp000066400000000000000000000055141424023573300226020ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef BLOCKLIST_SETTINGS_UI_HPP #define BLOCKLIST_SETTINGS_UI_HPP #include #include #include #include #include #include #include #include #include #include #include "preset_type.hpp" #include "util.hpp" class BlocklistSettingsUi : public Gtk::Grid { public: BlocklistSettingsUi(BaseObjectType* cobject, const Glib::RefPtr& builder); BlocklistSettingsUi(const BlocklistSettingsUi&) = delete; auto operator=(const BlocklistSettingsUi&) -> BlocklistSettingsUi& = delete; BlocklistSettingsUi(const BlocklistSettingsUi&&) = delete; auto operator=(const BlocklistSettingsUi &&) -> BlocklistSettingsUi& = delete; ~BlocklistSettingsUi() override; static void add_to_stack(Gtk::Stack* stack); // Blocklist management static methods static auto add_new_entry(const std::string& name, PresetType preset_type) -> bool; static void remove_entry(const std::string& name, PresetType preset_type); static auto app_is_blocklisted(const std::string& name, PresetType preset_type) -> bool; static auto get_blocklisted_apps_visibility() -> bool; private: std::string log_tag = "blocklist_settings_ui: "; Gtk::Switch* show_blocklisted_apps = nullptr; Gtk::Button *add_blocklist_in = nullptr, *add_blocklist_out = nullptr; static Gtk::ListBox *blocklist_in_listbox, *blocklist_out_listbox; Gtk::Entry *blocklist_in_name = nullptr, *blocklist_out_name = nullptr; Gtk::ScrolledWindow *blocklist_in_scrolled_window = nullptr, *blocklist_out_scrolled_window = nullptr; Glib::RefPtr settings; // singleton pointer used to access settings from static methods // needed because Gio::Settings instance can't be made static static BlocklistSettingsUi* thisPtr; static std::vector connections; static void populate_blocklist_in_listbox(); static void populate_blocklist_out_listbox(); static auto on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int; }; #endif easyeffects-4.8.7/include/calibration_mic.hpp000066400000000000000000000037761424023573300213260ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CALIBRATION_MIC_HPP #define CALIBRATION_MIC_HPP #include #include #include #include class CalibrationMic { public: CalibrationMic(); CalibrationMic(const CalibrationMic&) = delete; auto operator=(const CalibrationMic&) -> CalibrationMic& = delete; CalibrationMic(const CalibrationMic&&) = delete; auto operator=(const CalibrationMic &&) -> CalibrationMic& = delete; ~CalibrationMic(); std::string log_tag = "calibration_mic: "; GstElement *pipeline = nullptr, *source = nullptr, *sink = nullptr, *spectrum = nullptr; uint min_spectrum_freq = 20U; // Hz uint max_spectrum_freq = 20000U; // Hz int spectrum_threshold = -120; // dB uint spectrum_nbands = 3200U, spectrum_nfreqs = 0U; uint spectrum_npoints = 300U; // number of points displayed float spline_f0 = 0.0F, spline_df = 0.0F; bool measure_noise = false, subtract_noise = false; std::vector spectrum_freqs, spectrum_x_axis; std::vector spectrum_mag_tmp, spectrum_mag, noise; sigc::signal> new_spectrum; sigc::signal noise_measured; void set_window(const double& value); void set_source_monitor_name(const std::string& name); private: GstBus* bus = nullptr; }; #endif easyeffects-4.8.7/include/calibration_mic_ui.hpp000066400000000000000000000033601424023573300220100ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CALIBRATION_MIC_UI_HPP #define CALIBRATION_MIC_UI_HPP #include #include #include #include #include #include #include "calibration_mic.hpp" class CalibrationMicUi : public Gtk::Grid { public: CalibrationMicUi(BaseObjectType* cobject, const Glib::RefPtr& builder); CalibrationMicUi(const CalibrationMicUi&) = delete; auto operator=(const CalibrationMicUi&) -> CalibrationMicUi& = delete; CalibrationMicUi(const CalibrationMicUi&&) = delete; auto operator=(const CalibrationMicUi &&) -> CalibrationMicUi& = delete; ~CalibrationMicUi() override; std::unique_ptr cm; private: std::string log_tag = "calibration_mic_ui: "; const double default_time_window = 2.0; // seconds Gtk::Button* measure_noise = nullptr; Gtk::ToggleButton* subtract_noise = nullptr; Gtk::Spinner* spinner = nullptr; Gtk::SpinButton* time_window = nullptr; }; #endif easyeffects-4.8.7/include/calibration_signals.hpp000066400000000000000000000037671424023573300222160ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CALIBRATION_SIGNALS_HPP #define CALIBRATION_SIGNALS_HPP #include #include #include #include class CalibrationSignals { public: CalibrationSignals(); CalibrationSignals(const CalibrationSignals&) = delete; auto operator=(const CalibrationSignals&) -> CalibrationSignals& = delete; CalibrationSignals(const CalibrationSignals&&) = delete; auto operator=(const CalibrationSignals&&) -> CalibrationSignals& = delete; ~CalibrationSignals(); std::string log_tag = "calibration_signals: "; GstElement *pipeline = nullptr, *source = nullptr, *sink = nullptr, *spectrum = nullptr; uint min_spectrum_freq = 20U; // Hz uint max_spectrum_freq = 20000U; // Hz int spectrum_threshold = -120; // dB uint spectrum_nbands = 3200U, spectrum_nfreqs = 0U; uint spectrum_npoints = 300U; // number of points displayed float spline_f0 = 0.0F, spline_df = 0.0F; std::vector spectrum_freqs, spectrum_x_axis; std::vector spectrum_mag_tmp, spectrum_mag; sigc::signal> new_spectrum; void start() const; void stop() const; void set_freq(const double& value) const; void set_volume(const double& value) const; private: GstBus* bus = nullptr; }; #endif easyeffects-4.8.7/include/calibration_signals_ui.hpp000066400000000000000000000033411424023573300226770ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CALIBRATION_SIGNALS_UI_HPP #define CALIBRATION_SIGNALS_UI_HPP #include #include #include #include #include #include #include "calibration_signals.hpp" class CalibrationSignalsUi : public Gtk::Grid { public: CalibrationSignalsUi(BaseObjectType* cobject, const Glib::RefPtr& builder); CalibrationSignalsUi(const CalibrationSignalsUi&) = delete; auto operator=(const CalibrationSignalsUi&) -> CalibrationSignalsUi& = delete; CalibrationSignalsUi(const CalibrationSignalsUi&&) = delete; auto operator=(const CalibrationSignalsUi &&) -> CalibrationSignalsUi& = delete; ~CalibrationSignalsUi() override; std::unique_ptr cs; private: std::string log_tag = "calibration_signals_ui: "; Gtk::Switch* enable = nullptr; Gtk::Scale* volume = nullptr; Gtk::SpinButton* frequency = nullptr; Gtk::ComboBoxText* wave = nullptr; }; #endif easyeffects-4.8.7/include/calibration_ui.hpp000066400000000000000000000046441424023573300211660ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CALIBRATION_UI_HPP #define CALIBRATION_UI_HPP #include #include #include #include #include #include #include "calibration_mic_ui.hpp" #include "calibration_signals_ui.hpp" #include "util.hpp" class CalibrationUi : public Gtk::Window { public: CalibrationUi(BaseObjectType* cobject, const Glib::RefPtr& builder); CalibrationUi(const CalibrationUi&) = delete; auto operator=(const CalibrationUi&) -> CalibrationUi& = delete; CalibrationUi(const CalibrationUi&&) = delete; auto operator=(const CalibrationUi &&) -> CalibrationUi& = delete; ~CalibrationUi() override; static auto create() -> CalibrationUi*; void set_source_monitor_name(const std::string& name); private: std::string log_tag = "calibration_ui: "; std::locale global_locale; Gtk::Stack* stack = nullptr; Gtk::DrawingArea* spectrum = nullptr; Gtk::HeaderBar* headerbar = nullptr; sigc::connection spectrum_connection; bool mouse_inside = false; double mouse_intensity = 0.0, mouse_freq = 0.0, min_mag = 0.0, max_mag = 0.0; std::vector spectrum_mag; CalibrationSignalsUi* calibration_signals_ui = nullptr; CalibrationMicUi* calibration_mic_ui = nullptr; void on_new_spectrum(const std::vector& magnitudes); auto on_spectrum_draw(const Cairo::RefPtr& ctx) -> bool; auto on_spectrum_enter_notify_event(GdkEventCrossing* event) -> bool; auto on_spectrum_leave_notify_event(GdkEventCrossing* event) -> bool; auto on_spectrum_motion_notify_event(GdkEventMotion* event) -> bool; void on_stack_visible_child_changed(); }; #endif easyeffects-4.8.7/include/compressor.hpp000066400000000000000000000030351424023573300203670ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef COMPRESSOR_HPP #define COMPRESSOR_HPP #include "plugin_base.hpp" class Compressor : public PluginBase { public: Compressor(const std::string& tag, const std::string& schema, const std::string& schema_path); Compressor(const Compressor&) = delete; auto operator=(const Compressor&) -> Compressor& = delete; Compressor(const Compressor&&) = delete; auto operator=(const Compressor &&) -> Compressor& = delete; ~Compressor() override; GstElement* compressor = nullptr; sigc::connection input_level_connection, output_level_connection, reduction_connection, sidechain_connection, curve_connection; sigc::signal> input_level, output_level; sigc::signal reduction, sidechain, curve; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/compressor_preset.hpp000066400000000000000000000027551424023573300217610ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef COMPRESSOR_PRESET_HPP #define COMPRESSOR_PRESET_HPP #include "plugin_preset_base.hpp" class CompressorPreset : public PluginPresetBase { public: CompressorPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr input_settings, output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/compressor_ui.hpp000066400000000000000000000041121424023573300210610ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef COMPRESSOR_UI_HPP #define COMPRESSOR_UI_HPP #include "plugin_ui_base.hpp" class CompressorUi : public Gtk::Grid, public PluginUiBase { public: CompressorUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); CompressorUi(const CompressorUi&) = delete; auto operator=(const CompressorUi&) -> CompressorUi& = delete; CompressorUi(const CompressorUi&&) = delete; auto operator=(const CompressorUi &&) -> CompressorUi& = delete; ~CompressorUi() override; void on_new_reduction(double value); void on_new_sidechain(double value); void on_new_curve(double value); void reset() override; private: Glib::RefPtr attack, release, release_threshold, threshold, knee, ratio, makeup, boost_threshold, preamp, reactivity, lookahead, input_gain, output_gain, hpf_freq, lpf_freq; Gtk::LevelBar *reduction = nullptr, *sidechain = nullptr, *curve = nullptr; Gtk::Label *reduction_label = nullptr, *sidechain_label = nullptr, *curve_label = nullptr; Gtk::ComboBoxText *compression_mode = nullptr, *sidechain_type = nullptr, *sidechain_mode = nullptr, *sidechain_source = nullptr, *lpf_mode = nullptr, *hpf_mode = nullptr; Gtk::ToggleButton* listen = nullptr; }; #endif easyeffects-4.8.7/include/convolver.hpp000066400000000000000000000024271424023573300202140ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CONVOLVER_HPP #define CONVOLVER_HPP #include "plugin_base.hpp" class Convolver : public PluginBase { public: Convolver(const std::string& tag, const std::string& schema, const std::string& schema_path); Convolver(const Convolver&) = delete; auto operator=(const Convolver&) -> Convolver& = delete; Convolver(const Convolver&&) = delete; auto operator=(const Convolver&&) -> Convolver& = delete; ~Convolver() override; GstElement *convolver = nullptr, *adapter = nullptr; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/convolver_preset.hpp000066400000000000000000000027311424023573300215740ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CONVOLVER_PRESET_HPP #define CONVOLVER_PRESET_HPP #include "plugin_preset_base.hpp" class ConvolverPreset : public PluginPresetBase { public: ConvolverPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/convolver_ui.hpp000066400000000000000000000077211424023573300207130ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CONVOLVER_UI_HPP #define CONVOLVER_UI_HPP #include #include #include #include #include #include #include #include "glibmm/main.h" #include "glibmm/miscutils.h" #include "plugin_ui_base.hpp" #include "sigc++/functors/ptr_fun.h" class ConvolverUi : public Gtk::Grid, public PluginUiBase { public: ConvolverUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); ConvolverUi(const ConvolverUi&) = delete; auto operator=(const ConvolverUi&) -> ConvolverUi& = delete; ConvolverUi(const ConvolverUi&&) = delete; auto operator=(const ConvolverUi&&) -> ConvolverUi& = delete; ~ConvolverUi() override; void reset() override; private: std::string log_tag = "convolver_ui: "; Glib::RefPtr input_gain, output_gain, ir_width; Gtk::ListBox* irs_listbox = nullptr; Gtk::MenuButton* irs_menu_button = nullptr; Gtk::ScrolledWindow* irs_scrolled_window = nullptr; Gtk::Button* import_irs = nullptr; Gtk::DrawingArea *left_plot = nullptr, *right_plot = nullptr; Gtk::Label *label_file_name = nullptr, *label_sampling_rate = nullptr, *label_samples = nullptr, *label_duration = nullptr; Gtk::ToggleButton* show_fft = nullptr; Pango::FontDescription font; boost::filesystem::path irs_dir; bool mouse_inside = false, show_fft_spectrum = false; unsigned int max_plot_points = 1000U; float mouse_intensity = 0.0F, mouse_time = 0.0F, mouse_freq = 0.0F; float min_left = 0.0F, max_left = 0.0F, min_right = 0.0F, max_right = 0.0F; float max_time = 0.0F; float fft_min_left = 0.0F, fft_max_left = 0.0F, fft_min_right = 0.0F, fft_max_right = 0.0F; float fft_max_freq = 0.0F, fft_min_freq = 0.0F; std::vector left_mag, right_mag, time_axis; std::vector left_spectrum, right_spectrum, freq_axis; Glib::RefPtr spectrum_settings; std::mutex lock_guard_irs_info; std::vector> futures; auto get_irs_names() -> std::vector; void import_irs_file(const std::string& file_path); void remove_irs_file(const std::string& name); void populate_irs_listbox(); static auto on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int; void on_irs_menu_button_clicked(); void on_import_irs_clicked(); void get_irs_info(); void get_irs_spectrum(const int& rate); void draw_channel(Gtk::DrawingArea* da, const Cairo::RefPtr& ctx, const std::vector& magnitudes); void update_mouse_info_L(GdkEventMotion* event); void update_mouse_info_R(GdkEventMotion* event); auto on_left_draw(const Cairo::RefPtr& ctx) -> bool; auto on_left_motion_notify_event(GdkEventMotion* event) -> bool; auto on_right_draw(const Cairo::RefPtr& ctx) -> bool; auto on_right_motion_notify_event(GdkEventMotion* event) -> bool; auto on_mouse_enter_notify_event(GdkEventCrossing* event) -> bool; auto on_mouse_leave_notify_event(GdkEventCrossing* event) -> bool; }; #endif easyeffects-4.8.7/include/crossfeed.hpp000066400000000000000000000024041424023573300201470ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CROSSFEED_HPP #define CROSSFEED_HPP #include "plugin_base.hpp" class Crossfeed : public PluginBase { public: Crossfeed(const std::string& tag, const std::string& schema, const std::string& schema_path); Crossfeed(const Crossfeed&) = delete; auto operator=(const Crossfeed&) -> Crossfeed& = delete; Crossfeed(const Crossfeed&&) = delete; auto operator=(const Crossfeed &&) -> Crossfeed& = delete; ~Crossfeed() override; GstElement* crossfeed = nullptr; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/crossfeed_preset.hpp000066400000000000000000000027311424023573300215340ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CROSSFEED_PRESET_HPP #define CROSSFEED_PRESET_HPP #include "plugin_preset_base.hpp" class CrossfeedPreset : public PluginPresetBase { public: CrossfeedPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/crossfeed_ui.hpp000066400000000000000000000030171424023573300206450ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CROSSFEED_UI_HPP #define CROSSFEED_UI_HPP #include "plugin_ui_base.hpp" class CrossfeedUi : public Gtk::Grid, public PluginUiBase { public: CrossfeedUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); CrossfeedUi(const CrossfeedUi&) = delete; auto operator=(const CrossfeedUi&) -> CrossfeedUi& = delete; CrossfeedUi(const CrossfeedUi&&) = delete; auto operator=(const CrossfeedUi &&) -> CrossfeedUi& = delete; ~CrossfeedUi() override; void reset() override; private: Glib::RefPtr fcut, feed; Gtk::Button *preset_cmoy = nullptr, *preset_default = nullptr, *preset_jmeier = nullptr; void init_presets_buttons(); }; #endif easyeffects-4.8.7/include/crystalizer.hpp000066400000000000000000000026611424023573300205520ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CRYSTALIZER_HPP #define CRYSTALIZER_HPP #include "plugin_base.hpp" class Crystalizer : public PluginBase { public: Crystalizer(const std::string& tag, const std::string& schema, const std::string& schema_path); Crystalizer(const Crystalizer&) = delete; auto operator=(const Crystalizer&) -> Crystalizer& = delete; Crystalizer(const Crystalizer&&) = delete; auto operator=(const Crystalizer&&) -> Crystalizer& = delete; ~Crystalizer() override; GstElement *crystalizer = nullptr, *adapter = nullptr; sigc::connection range_before_connection, range_after_connection; sigc::signal range_before, range_after; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/crystalizer_preset.hpp000066400000000000000000000027241424023573300221340ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CRYSTALIZER_PRESET_HPP #define CRYSTALIZER_PRESET_HPP #include "plugin_preset_base.hpp" class CrystalizerPreset : public PluginPresetBase { public: CrystalizerPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/crystalizer_ui.hpp000066400000000000000000000034301424023573300212420ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef CRYSTALIZER_UI_HPP #define CRYSTALIZER_UI_HPP #include "plugin_ui_base.hpp" class CrystalizerUi : public Gtk::Grid, public PluginUiBase { public: CrystalizerUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); CrystalizerUi(const CrystalizerUi&) = delete; auto operator=(const CrystalizerUi&) -> CrystalizerUi& = delete; CrystalizerUi(const CrystalizerUi&&) = delete; auto operator=(const CrystalizerUi &&) -> CrystalizerUi& = delete; ~CrystalizerUi() override; void on_new_range_before(double value); void on_new_range_after(double value); void reset() override; private: Gtk::Grid* bands_grid = nullptr; Gtk::LevelBar *range_before = nullptr, *range_after = nullptr; Gtk::Label *range_before_label = nullptr, *range_after_label = nullptr; Gtk::ToggleButton* aggressive = nullptr; Glib::RefPtr input_gain, output_gain; void build_bands(const int& nbands); }; #endif easyeffects-4.8.7/include/deesser.hpp000066400000000000000000000025361424023573300176320ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef DEESSER_HPP #define DEESSER_HPP #include "plugin_base.hpp" class Deesser : public PluginBase { public: Deesser(const std::string& tag, const std::string& schema, const std::string& schema_path); Deesser(const Deesser&) = delete; auto operator=(const Deesser&) -> Deesser& = delete; Deesser(const Deesser&&) = delete; auto operator=(const Deesser &&) -> Deesser& = delete; ~Deesser() override; GstElement* deesser = nullptr; sigc::connection compression_connection, detected_connection; sigc::signal compression, detected; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/deesser_preset.hpp000066400000000000000000000027241424023573300212130ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef DEESSER_PRESET_HPP #define DEESSER_PRESET_HPP #include "plugin_preset_base.hpp" class DeesserPreset : public PluginPresetBase { public: DeesserPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr input_settings, output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/deesser_ui.hpp000066400000000000000000000033561424023573300203300ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef DEESSER_UI_HPP #define DEESSER_UI_HPP #include "plugin_ui_base.hpp" class DeesserUi : public Gtk::Grid, public PluginUiBase { public: DeesserUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); DeesserUi(const DeesserUi&) = delete; auto operator=(const DeesserUi&) -> DeesserUi& = delete; DeesserUi(const DeesserUi&&) = delete; auto operator=(const DeesserUi &&) -> DeesserUi& = delete; ~DeesserUi() override; void on_new_compression(double value); void on_new_detected(double value); void reset() override; private: Glib::RefPtr threshold, ratio, makeup, f1_freq, f2_freq, f1_level, f2_level, f2_q, laxity; Gtk::LevelBar *compression = nullptr, *detected = nullptr; Gtk::Label *compression_label = nullptr, *detected_label = nullptr; Gtk::ComboBoxText *detection = nullptr, *mode = nullptr; Gtk::ToggleButton* sc_listen = nullptr; }; #endif easyeffects-4.8.7/include/delay.hpp000066400000000000000000000023141424023573300172700ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef DELAY_HPP #define DELAY_HPP #include "plugin_base.hpp" class Delay : public PluginBase { public: Delay(const std::string& tag, const std::string& schema, const std::string& schema_path); Delay(const Delay&) = delete; auto operator=(const Delay&) -> Delay& = delete; Delay(const Delay&&) = delete; auto operator=(const Delay &&) -> Delay& = delete; ~Delay() override; GstElement* delay = nullptr; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/delay_preset.hpp000066400000000000000000000026741424023573300206630ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef DELAY_PRESET_HPP #define DELAY_PRESET_HPP #include "plugin_preset_base.hpp" class DelayPreset : public PluginPresetBase { public: DelayPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/delay_ui.hpp000066400000000000000000000025601424023573300177700ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef DELAY_UI_HPP #define DELAY_UI_HPP #include "plugin_ui_base.hpp" class DelayUi : public Gtk::Grid, public PluginUiBase { public: DelayUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); DelayUi(const DelayUi&) = delete; auto operator=(const DelayUi&) -> DelayUi& = delete; DelayUi(const DelayUi&&) = delete; auto operator=(const DelayUi &&) -> DelayUi& = delete; ~DelayUi() override; void reset() override; private: Glib::RefPtr input_gain, output_gain, time_l, time_r; }; #endif easyeffects-4.8.7/include/effects_base_ui.hpp000066400000000000000000000133561424023573300213100ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef EFFECTS_BASE_UI_HPP #define EFFECTS_BASE_UI_HPP #include #include #include #include #include #include #include #include #include #include #include #include "app_info_ui.hpp" #include "blocklist_settings_ui.hpp" #include "preset_type.hpp" #include "plugin_ui_base.hpp" #include "pulse_manager.hpp" #include "spectrum_ui.hpp" #include "util.hpp" class EffectsBaseUi { public: EffectsBaseUi(const Glib::RefPtr& builder, Glib::RefPtr refSettings, PulseManager* pulse_manager); EffectsBaseUi(const EffectsBaseUi&) = delete; auto operator=(const EffectsBaseUi&) -> EffectsBaseUi& = delete; EffectsBaseUi(const EffectsBaseUi&&) = delete; auto operator=(const EffectsBaseUi &&) -> EffectsBaseUi& = delete; virtual ~EffectsBaseUi(); virtual void on_app_added(std::shared_ptr app_info) = 0; void on_app_changed(const std::shared_ptr& app_info); void on_app_removed(uint idx); void on_new_output_level_db(const std::array& peak); protected: Glib::RefPtr settings; Gtk::ListBox* listbox = nullptr; Gtk::Stack* stack = nullptr; Gtk::Box *apps_box = nullptr, *app_button_row = nullptr, *global_level_meter_grid = nullptr; Gtk::Image *app_input_icon = nullptr, *app_output_icon = nullptr, *saturation_icon = nullptr; Gtk::Label *global_output_level_left = nullptr, *global_output_level_right = nullptr; PulseManager* pm = nullptr; std::vector apps_list; std::vector connections; SpectrumUi* spectrum_ui = nullptr; template void add_to_listbox(T p) { auto* row = Gtk::manage(new Gtk::ListBoxRow()); auto* eventBox = Gtk::manage(new Gtk::EventBox()); eventBox->add(*p->listbox_control); row->add(*eventBox); row->set_name(p->name); row->set_margin_bottom(6); row->set_margin_right(6); row->set_margin_left(6); std::vector listTargets; auto entry = Gtk::TargetEntry("Gtk::ListBoxRow", Gtk::TARGET_SAME_APP, 0); listTargets.emplace_back(entry); eventBox->drag_source_set(listTargets, Gdk::MODIFIER_MASK, Gdk::ACTION_MOVE); eventBox->drag_dest_set(listTargets, Gtk::DEST_DEFAULT_ALL, Gdk::ACTION_MOVE); eventBox->signal_drag_data_get().connect( [=](const Glib::RefPtr& context, Gtk::SelectionData& selection_data, guint info, guint time) { selection_data.set(selection_data.get_target(), p->name); }); eventBox->signal_drag_data_received().connect([=](const Glib::RefPtr& context, int x, int y, const Gtk::SelectionData& selection_data, guint info, guint time) { const int length = selection_data.get_length(); if ((length >= 0) && (selection_data.get_format() == 8)) { auto src = selection_data.get_data_as_string(); auto dst = p->name; if (src != dst) { auto order = Glib::Variant>(); settings->get_value("plugins", order); auto vorder = order.get(); auto r1 = std::find(std::begin(vorder), std::end(vorder), src); if (r1 != std::end(vorder)) { // for (auto v : vorder) { // std::cout << v << std::endl; // } vorder.erase(r1); auto r2 = std::find(std::begin(vorder), std::end(vorder), dst); vorder.insert(r2, src); settings->set_string_array("plugins", vorder); // std::cout << "" << std::endl; // for (auto v : vorder) { // std::cout << v << std::endl; // } } } } context->drag_finish(false, false, time); }); eventBox->signal_drag_begin().connect([=](const Glib::RefPtr& context) { auto w = row->get_allocated_width(); auto h = row->get_allocated_height(); auto surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, w, h); auto ctx = Cairo::Context::create(surface); auto styleContext = row->get_style_context(); styleContext->add_class("drag-listboxrow-icon"); gtk_widget_draw(GTK_WIDGET(row->gobj()), ctx->cobj()); styleContext->remove_class("drag-listboxrow-icon"); context->set_icon(surface); }); listbox->add(*row); } private: Gtk::Box* placeholder_spectrum = nullptr; static std::locale global_locale; auto on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int; template auto level_to_localized_string_showpos(const T& value, const int& places) -> std::string { std::ostringstream msg; msg.imbue(global_locale); msg.precision(places); msg << ((value > 0.0) ? "+" : "") << std::fixed << value; return msg.str(); } }; #endif easyeffects-4.8.7/include/equalizer.hpp000066400000000000000000000030731424023573300201760ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef EQUALIZER_HPP #define EQUALIZER_HPP #include "plugin_base.hpp" class Equalizer : public PluginBase { public: Equalizer(const std::string& tag, const std::string& schema, const std::string& schema_path, const std::string& schema_channel, const std::string& schema_channel_left_path, const std::string& schema_channel_right_path); Equalizer(const Equalizer&) = delete; auto operator=(const Equalizer&) -> Equalizer& = delete; Equalizer(const Equalizer&&) = delete; auto operator=(const Equalizer &&) -> Equalizer& = delete; ~Equalizer() override; GstElement* equalizer = nullptr; void update_equalizer(); private: GSettings *settings_left = nullptr, *settings_right = nullptr; void bind_band(GstElement* equalizer, const int& index); }; #endif easyeffects-4.8.7/include/equalizer_preset.hpp000066400000000000000000000041131424023573300215540ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef EQUALIZER_PRESET_HPP #define EQUALIZER_PRESET_HPP #include "plugin_preset_base.hpp" class EqualizerPreset : public PluginPresetBase { public: EqualizerPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: std::string log_tag = "equalizer_preset: "; Glib::RefPtr input_settings, input_settings_left, input_settings_right, output_settings, output_settings_left, output_settings_right; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; static void save_channel(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings, const int& nbands); void load_channel(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings, const int& nbands); void load_legacy_preset(); }; #endif easyeffects-4.8.7/include/equalizer_ui.hpp000066400000000000000000000072531424023573300206770ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef EQUALIZER_UI_HPP #define EQUALIZER_UI_HPP #include #include "plugin_ui_base.hpp" enum FilterType : const unsigned int { PEAKING = 1U, LOW_PASS = 1U << 1U, LOW_PASS_Q = 1U << 2U, HIGH_PASS = 1U << 3U, HIGH_PASS_Q = 1U << 4U, BAND_PASS = 1U << 5U, LOW_SHELF = 1U << 6U, LOW_SHELF_xdB = 1U << 7U, HIGH_SHELF = 1U << 8U, HIGH_SHELF_xdB = 1U << 9U, NOTCH = 1U << 10U, ALL_PASS = 1U << 11U }; struct ImportedBand { unsigned int type; float freq; float gain; float quality_factor; float slope_dB; }; class EqualizerUi : public Gtk::Grid, public PluginUiBase { public: EqualizerUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path, const std::string& schema_channel, const std::string& schema_channel_left_path, const std::string& schema_channel_right_path); EqualizerUi(const EqualizerUi&) = delete; auto operator=(const EqualizerUi&) -> EqualizerUi& = delete; EqualizerUi(const EqualizerUi&&) = delete; auto operator=(const EqualizerUi &&) -> EqualizerUi& = delete; ~EqualizerUi() override; void reset() override; private: int max_bands = 30; Glib::RefPtr settings_left, settings_right; Glib::RefPtr nbands, input_gain, output_gain; Gtk::Grid *bands_grid_left = nullptr, *bands_grid_right = nullptr; Gtk::Button *flat_response = nullptr, *calculate_freqs = nullptr, *import_apo = nullptr; Gtk::ListBox* presets_listbox = nullptr; Gtk::Switch* split_channels = nullptr; Gtk::Stack* stack = nullptr; Gtk::StackSwitcher* stack_switcher = nullptr; Gtk::ComboBoxText* mode = nullptr; std::vector connections_bands; std::string presets_path = "/com/github/wwmm/pulseeffects/presets/"; void load_preset(const std::string& file_name); void on_nbands_changed(); void build_bands(Gtk::Grid* bands_grid, const Glib::RefPtr& cfg, const int& nbands, const bool& split_mode); void on_flat_response(); void on_calculate_frequencies(); static auto on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int; void populate_presets_listbox(); void on_import_apo_preset_clicked(); auto parse_apo_filter(const std::string& line, struct ImportedBand& filter) -> bool; void import_apo_preset(const std::string& file_path); std::unordered_map const FilterTypeMap = { {"PK", FilterType::PEAKING}, {"LP", FilterType::LOW_PASS}, {"LPQ", FilterType::LOW_PASS_Q}, {"HP", FilterType::HIGH_PASS}, {"HPQ", FilterType::HIGH_PASS_Q}, {"BP", FilterType::BAND_PASS}, {"LS", FilterType::LOW_SHELF}, {"LSC", FilterType::LOW_SHELF_xdB}, {"HS", FilterType::HIGH_SHELF}, {"HSC", FilterType::HIGH_SHELF_xdB}, {"NO", FilterType::NOTCH}, {"AP", FilterType::ALL_PASS}}; }; #endif easyeffects-4.8.7/include/exciter.hpp000066400000000000000000000024731424023573300176430ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef EXCITER_HPP #define EXCITER_HPP #include "plugin_base.hpp" class Exciter : public PluginBase { public: Exciter(const std::string& tag, const std::string& schema, const std::string& schema_path); Exciter(const Exciter&) = delete; auto operator=(const Exciter&) -> Exciter& = delete; Exciter(const Exciter&&) = delete; auto operator=(const Exciter &&) -> Exciter& = delete; ~Exciter() override; GstElement* exciter = nullptr; sigc::connection harmonics_connection; sigc::signal harmonics; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/exciter_preset.hpp000066400000000000000000000027041424023573300212220ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef EXCITER_PRESET_HPP #define EXCITER_PRESET_HPP #include "plugin_preset_base.hpp" class ExciterPreset : public PluginPresetBase { public: ExciterPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/exciter_ui.hpp000066400000000000000000000032371424023573300203370ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef EXCITER_UI_HPP #define EXCITER_UI_HPP #include "plugin_ui_base.hpp" class ExciterUi : public Gtk::Grid, public PluginUiBase { public: ExciterUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); ExciterUi(const ExciterUi&) = delete; auto operator=(const ExciterUi&) -> ExciterUi& = delete; ExciterUi(const ExciterUi&&) = delete; auto operator=(const ExciterUi &&) -> ExciterUi& = delete; ~ExciterUi() override; void on_new_harmonics_level(double value); void reset() override; private: Glib::RefPtr amount, blend, ceilv, harmonics, input_gain, output_gain, scope; Gtk::LevelBar* harmonics_levelbar = nullptr; Gtk::Label* harmonics_levelbar_label = nullptr; Gtk::SpinButton* ceil_freq = nullptr; Gtk::ToggleButton *ceil_active = nullptr, *listen = nullptr; }; #endif easyeffects-4.8.7/include/filter.hpp000066400000000000000000000025361424023573300174650ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef FILTER_HPP #define FILTER_HPP #include "plugin_base.hpp" class Filter : public PluginBase { public: Filter(const std::string& tag, const std::string& schema, const std::string& schema_path); Filter(const Filter&) = delete; auto operator=(const Filter&) -> Filter& = delete; Filter(const Filter&&) = delete; auto operator=(const Filter &&) -> Filter& = delete; ~Filter(); GstElement* filter = nullptr; sigc::connection input_level_connection, output_level_connection; sigc::signal> input_level, output_level; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/filter_preset.hpp000066400000000000000000000027201424023573300210420ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef FILTER_PRESET_HPP #define FILTER_PRESET_HPP #include "plugin_preset_base.hpp" class FilterPreset : public PluginPresetBase { public: FilterPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr input_settings, output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/filter_ui.hpp000066400000000000000000000031441424023573300201560ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef FILTER_UI_HPP #define FILTER_UI_HPP #include "plugin_ui_base.hpp" class FilterUi : public Gtk::Grid, public PluginUiBase { public: FilterUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); FilterUi(const FilterUi&) = delete; auto operator=(const FilterUi&) -> FilterUi& = delete; FilterUi(const FilterUi&&) = delete; auto operator=(const FilterUi &&) -> FilterUi& = delete; ~FilterUi() override; void reset() override; private: Glib::RefPtr input_gain, output_gain, frequency, resonance, inertia; Gtk::ComboBoxText* mode = nullptr; Gtk::Button *preset_muted = nullptr, *preset_disco = nullptr, *preset_distant_headphones = nullptr, *preset_default = nullptr; void init_presets_buttons(); }; #endif easyeffects-4.8.7/include/gate.hpp000066400000000000000000000024131424023573300171120ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef GATE_HPP #define GATE_HPP #include "plugin_base.hpp" class Gate : public PluginBase { public: Gate(const std::string& tag, const std::string& schema, const std::string& schema_path); Gate(const Gate&) = delete; auto operator=(const Gate&) -> Gate& = delete; Gate(const Gate&&) = delete; auto operator=(const Gate &&) -> Gate& = delete; ~Gate() override; GstElement* gate = nullptr; sigc::connection gating_connection; sigc::signal gating; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/gate_preset.hpp000066400000000000000000000027101424023573300204740ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef GATE_PRESET_HPP #define GATE_PRESET_HPP #include "plugin_preset_base.hpp" class GatePreset : public PluginPresetBase { public: GatePreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr input_settings, output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/gate_ui.hpp000066400000000000000000000030461424023573300176120ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef GATE_UI_HPP #define GATE_UI_HPP #include "plugin_ui_base.hpp" class GateUi : public Gtk::Grid, public PluginUiBase { public: GateUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); GateUi(const GateUi&) = delete; auto operator=(const GateUi&) -> GateUi& = delete; GateUi(const GateUi&&) = delete; auto operator=(const GateUi &&) -> GateUi& = delete; ~GateUi() override; void on_new_gating(double value); void reset() override; private: Glib::RefPtr attack, release, threshold, knee, ratio, range, input, makeup; Gtk::LevelBar* gating = nullptr; Gtk::Label* gating_label = nullptr; Gtk::ComboBoxText *detection = nullptr, *stereo_link = nullptr; }; #endif easyeffects-4.8.7/include/general_settings_ui.hpp000066400000000000000000000052601424023573300222270ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef GENERAL_SETTINGS_UI_HPP #define GENERAL_SETTINGS_UI_HPP #include #include #include #include #include #include #include #include #include #include #include "application.hpp" class GeneralSettingsUi : public Gtk::Grid { public: GeneralSettingsUi(BaseObjectType* cobject, const Glib::RefPtr& builder, Application* application); GeneralSettingsUi(const GeneralSettingsUi&) = delete; auto operator=(const GeneralSettingsUi&) -> GeneralSettingsUi& = delete; GeneralSettingsUi(const GeneralSettingsUi&&) = delete; auto operator=(const GeneralSettingsUi&&) -> GeneralSettingsUi& = delete; ~GeneralSettingsUi() override; static void add_to_stack(Gtk::Stack* stack, Application* app); private: std::string log_tag = "general_settings_ui: "; Glib::RefPtr settings; Application* app = nullptr; Gtk::Switch *enable_autostart = nullptr, *enable_all_sinkinputs = nullptr, *enable_all_sourceoutputs = nullptr, *theme_switch = nullptr; Gtk::Button *reset_settings = nullptr, *about_button = nullptr; Gtk::SpinButton *realtime_priority_control = nullptr, *niceness_control = nullptr; Gtk::ComboBoxText* priority_type = nullptr; Glib::RefPtr adjustment_priority, adjustment_niceness, adjustment_audio_activity_timeout; std::vector connections; static void get_object(const Glib::RefPtr& builder, const std::string& name, Glib::RefPtr& object) { object = Glib::RefPtr::cast_dynamic(builder->get_object(name)); } void init_autostart_switch(); auto on_enable_autostart(bool state) -> bool; void on_reset_settings(); void set_priority_controls_visibility(); }; #endif easyeffects-4.8.7/include/limiter.hpp000066400000000000000000000026671424023573300176520ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef LIMITER_HPP #define LIMITER_HPP #include "plugin_base.hpp" class Limiter : public PluginBase { public: Limiter(const std::string& tag, const std::string& schema, const std::string& schema_path); Limiter(const Limiter&) = delete; auto operator=(const Limiter&) -> Limiter& = delete; Limiter(const Limiter&&) = delete; auto operator=(const Limiter &&) -> Limiter& = delete; ~Limiter() override; GstElement* limiter = nullptr; sigc::connection input_level_connection, output_level_connection, attenuation_connection; sigc::signal> input_level, output_level; sigc::signal attenuation; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/limiter_preset.hpp000066400000000000000000000027241424023573300212260ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef LIMITER_PRESET_HPP #define LIMITER_PRESET_HPP #include "plugin_preset_base.hpp" class LimiterPreset : public PluginPresetBase { public: LimiterPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr input_settings, output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/limiter_ui.hpp000066400000000000000000000032171424023573300203370ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef LIMITER_UI_HPP #define LIMITER_UI_HPP #include "plugin_ui_base.hpp" class LimiterUi : public Gtk::Grid, public PluginUiBase { public: LimiterUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); LimiterUi(const LimiterUi&) = delete; auto operator=(const LimiterUi&) -> LimiterUi& = delete; LimiterUi(const LimiterUi&&) = delete; auto operator=(const LimiterUi &&) -> LimiterUi& = delete; ~LimiterUi() override; void on_new_attenuation(double value); void reset() override; private: Glib::RefPtr input_gain, limit, lookahead, release, oversampling, asc_level, output_gain; Gtk::ToggleButton *auto_level = nullptr, *asc = nullptr; Gtk::Grid* asc_grid = nullptr; Gtk::LevelBar* attenuation = nullptr; Gtk::Label* attenuation_label = nullptr; }; #endif easyeffects-4.8.7/include/loudness.hpp000066400000000000000000000023661424023573300200350ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef LOUDNESS_HPP #define LOUDNESS_HPP #include "plugin_base.hpp" class Loudness : public PluginBase { public: Loudness(const std::string& tag, const std::string& schema, const std::string& schema_path); Loudness(const Loudness&) = delete; auto operator=(const Loudness&) -> Loudness& = delete; Loudness(const Loudness&&) = delete; auto operator=(const Loudness &&) -> Loudness& = delete; ~Loudness() override; GstElement* loudness = nullptr; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/loudness_preset.hpp000066400000000000000000000027101424023573300214100ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef LOUDNESS_PRESET_HPP #define LOUDNESS_PRESET_HPP #include "plugin_preset_base.hpp" class LoudnessPreset : public PluginPresetBase { public: LoudnessPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/loudness_ui.hpp000066400000000000000000000027051424023573300205270ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef LOUDNESS_UI_HPP #define LOUDNESS_UI_HPP #include "plugin_ui_base.hpp" class LoudnessUi : public Gtk::Grid, public PluginUiBase { public: LoudnessUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); LoudnessUi(const LoudnessUi&) = delete; auto operator=(const LoudnessUi&) -> LoudnessUi& = delete; LoudnessUi(const LoudnessUi&&) = delete; auto operator=(const LoudnessUi &&) -> LoudnessUi& = delete; ~LoudnessUi() override; void reset() override; private: Glib::RefPtr input, volume; Gtk::ComboBoxText *fft_size = nullptr, *standard = nullptr; }; #endif easyeffects-4.8.7/include/maximizer.hpp000066400000000000000000000025271424023573300202050ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef MAXIMIZER_HPP #define MAXIMIZER_HPP #include "plugin_base.hpp" class Maximizer : public PluginBase { public: Maximizer(const std::string& tag, const std::string& schema, const std::string& schema_path); Maximizer(const Maximizer&) = delete; auto operator=(const Maximizer&) -> Maximizer& = delete; Maximizer(const Maximizer&&) = delete; auto operator=(const Maximizer &&) -> Maximizer& = delete; ~Maximizer() override; GstElement* maximizer = nullptr; sigc::connection reduction_connection; sigc::signal reduction; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/maximizer_preset.hpp000066400000000000000000000027341424023573300215670ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef MAXIMIZER_PRESET_HPP #define MAXIMIZER_PRESET_HPP #include "plugin_preset_base.hpp" class MaximizerPreset : public PluginPresetBase { public: MaximizerPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr output_settings, input_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/maximizer_ui.hpp000066400000000000000000000030331424023573300206730ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef MAXIMIZER_UI_HPP #define MAXIMIZER_UI_HPP #include "plugin_ui_base.hpp" class MaximizerUi : public Gtk::Grid, public PluginUiBase { public: MaximizerUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); MaximizerUi(const MaximizerUi&) = delete; auto operator=(const MaximizerUi&) -> MaximizerUi& = delete; MaximizerUi(const MaximizerUi&&) = delete; auto operator=(const MaximizerUi &&) -> MaximizerUi& = delete; ~MaximizerUi() override; void on_new_reduction(double value); void reset() override; private: Glib::RefPtr release, threshold, ceiling; Gtk::LevelBar* reduction = nullptr; Gtk::Label* reduction_label = nullptr; }; #endif easyeffects-4.8.7/include/multiband_compressor.hpp000066400000000000000000000035501424023573300224300ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef MULTIBAND_COMPRESSOR_HPP #define MULTIBAND_COMPRESSOR_HPP #include "plugin_base.hpp" class MultibandCompressor : public PluginBase { public: MultibandCompressor(const std::string& tag, const std::string& schema, const std::string& schema_path); MultibandCompressor(const MultibandCompressor&) = delete; auto operator=(const MultibandCompressor&) -> MultibandCompressor& = delete; MultibandCompressor(const MultibandCompressor&&) = delete; auto operator=(const MultibandCompressor &&) -> MultibandCompressor& = delete; ~MultibandCompressor() override; GstElement* multiband_compressor = nullptr; sigc::connection input_level_connection, output_level_connection; sigc::connection output0_connection, output1_connection, output2_connection, output3_connection, compression0_connection, compression1_connection, compression2_connection, compression3_connection; sigc::signal> input_level, output_level; sigc::signal output0, output1, output2, output3, compression0, compression1, compression2, compression3; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/multiband_compressor_preset.hpp000066400000000000000000000030231424023573300240050ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef MULTIBAND_COMPRESSOR_PRESET_HPP #define MULTIBAND_COMPRESSOR_PRESET_HPP #include "plugin_preset_base.hpp" class MultibandCompressorPreset : public PluginPresetBase { public: MultibandCompressorPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr input_settings, output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/multiband_compressor_ui.hpp000066400000000000000000000060531424023573300231260ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef MULTIBAND_COMPRESSOR_UI_HPP #define MULTIBAND_COMPRESSOR_UI_HPP #include "plugin_ui_base.hpp" class MultibandCompressorUi : public Gtk::Grid, public PluginUiBase { public: MultibandCompressorUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); MultibandCompressorUi(const MultibandCompressorUi&) = delete; auto operator=(const MultibandCompressorUi&) -> MultibandCompressorUi& = delete; MultibandCompressorUi(const MultibandCompressorUi&&) = delete; auto operator=(const MultibandCompressorUi &&) -> MultibandCompressorUi& = delete; ~MultibandCompressorUi() override; void on_new_output0(double value); void on_new_output1(double value); void on_new_output2(double value); void on_new_output3(double value); void on_new_compression0(double value); void on_new_compression1(double value); void on_new_compression2(double value); void on_new_compression3(double value); void reset() override; private: Glib::RefPtr freq0, freq1, freq2, input_gain, output_gain; Glib::RefPtr attack0, release0, threshold0, knee0, ratio0, makeup0; Glib::RefPtr attack1, release1, threshold1, knee1, ratio1, makeup1; Glib::RefPtr attack2, release2, threshold2, knee2, ratio2, makeup2; Glib::RefPtr attack3, release3, threshold3, knee3, ratio3, makeup3; Gtk::LevelBar *output0 = nullptr, *output1 = nullptr, *output2 = nullptr, *output3 = nullptr; Gtk::Label *output0_label = nullptr, *output1_label = nullptr, *output2_label = nullptr, *output3_label = nullptr; Gtk::LevelBar *compression0 = nullptr, *compression1 = nullptr, *compression2 = nullptr, *compression3 = nullptr; Gtk::Label *compression0_label = nullptr, *compression1_label = nullptr, *compression2_label = nullptr, *compression3_label = nullptr; Gtk::ComboBoxText *mode = nullptr, *detection0 = nullptr, *detection1 = nullptr, *detection2 = nullptr, *detection3 = nullptr; Gtk::ToggleButton *bypass0 = nullptr, *bypass1 = nullptr, *bypass2 = nullptr, *bypass3 = nullptr, *solo0 = nullptr, *solo1 = nullptr, *solo2 = nullptr, *solo3 = nullptr; }; #endif easyeffects-4.8.7/include/multiband_gate.hpp000066400000000000000000000033541424023573300211560ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef MULTIBAND_GATE_HPP #define MULTIBAND_GATE_HPP #include "plugin_base.hpp" class MultibandGate : public PluginBase { public: MultibandGate(const std::string& tag, const std::string& schema, const std::string& schema_path); MultibandGate(const MultibandGate&) = delete; auto operator=(const MultibandGate&) -> MultibandGate& = delete; MultibandGate(const MultibandGate&&) = delete; auto operator=(const MultibandGate &&) -> MultibandGate& = delete; ~MultibandGate() override; GstElement* multiband_gate = nullptr; sigc::connection input_level_connection, output_level_connection; sigc::connection output0_connection, output1_connection, output2_connection, output3_connection, gating0_connection, gating1_connection, gating2_connection, gating3_connection; sigc::signal> input_level, output_level; sigc::signal output0, output1, output2, output3, gating0, gating1, gating2, gating3; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/multiband_gate_preset.hpp000066400000000000000000000027561424023573300225450ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef MULTIBAND_GATE_PRESET_HPP #define MULTIBAND_GATE_PRESET_HPP #include "plugin_preset_base.hpp" class MultibandGatePreset : public PluginPresetBase { public: MultibandGatePreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr input_settings, output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/multiband_gate_ui.hpp000066400000000000000000000056421424023573300216550ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef MULTIBAND_GATE_UI_HPP #define MULTIBAND_GATE_UI_HPP #include "plugin_ui_base.hpp" class MultibandGateUi : public Gtk::Grid, public PluginUiBase { public: MultibandGateUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); MultibandGateUi(const MultibandGateUi&) = delete; auto operator=(const MultibandGateUi&) -> MultibandGateUi& = delete; MultibandGateUi(const MultibandGateUi&&) = delete; auto operator=(const MultibandGateUi &&) -> MultibandGateUi& = delete; ~MultibandGateUi() override; void on_new_output0(double value); void on_new_output1(double value); void on_new_output2(double value); void on_new_output3(double value); void on_new_gating0(double value); void on_new_gating1(double value); void on_new_gating2(double value); void on_new_gating3(double value); void reset() override; private: Glib::RefPtr freq0, freq1, freq2, input_gain, output_gain; Glib::RefPtr range0, attack0, release0, threshold0, knee0, ratio0, makeup0; Glib::RefPtr range1, attack1, release1, threshold1, knee1, ratio1, makeup1; Glib::RefPtr range2, attack2, release2, threshold2, knee2, ratio2, makeup2; Glib::RefPtr range3, attack3, release3, threshold3, knee3, ratio3, makeup3; Gtk::LevelBar *output0 = nullptr, *output1 = nullptr, *output2 = nullptr, *output3 = nullptr; Gtk::Label *output0_label = nullptr, *output1_label = nullptr, *output2_label = nullptr, *output3_label = nullptr; Gtk::LevelBar *gating0 = nullptr, *gating1 = nullptr, *gating2 = nullptr, *gating3 = nullptr; Gtk::Label *gating0_label = nullptr, *gating1_label = nullptr, *gating2_label = nullptr, *gating3_label = nullptr; Gtk::ComboBoxText *mode = nullptr, *detection0 = nullptr, *detection1 = nullptr, *detection2 = nullptr, *detection3 = nullptr; Gtk::ToggleButton *bypass0 = nullptr, *bypass1 = nullptr, *bypass2 = nullptr, *bypass3 = nullptr, *solo0 = nullptr, *solo1 = nullptr, *solo2 = nullptr, *solo3 = nullptr; }; #endif easyeffects-4.8.7/include/pipeline_base.hpp000066400000000000000000000125721424023573300210000ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PIPELINE_BASE_HPP #define PIPELINE_BASE_HPP #include #include #include #include #include "compressor.hpp" #include "deesser.hpp" #include "equalizer.hpp" #include "filter.hpp" #include "gate.hpp" #include "limiter.hpp" #include "maximizer.hpp" #include "pitch.hpp" #include "pulse_manager.hpp" #include "realtime_kit.hpp" #include "reverb.hpp" #include "rnnoise.hpp" #include "stereo_tools.hpp" class PipelineBase { public: PipelineBase(const std::string& tag, PulseManager* pulse_manager); PipelineBase(const PipelineBase&) = delete; auto operator=(const PipelineBase&) -> PipelineBase& = delete; PipelineBase(const PipelineBase&&) = delete; auto operator=(const PipelineBase&&) -> PipelineBase& = delete; virtual ~PipelineBase(); bool playing = false; std::string log_tag; PulseManager* pm = nullptr; GstElement *pipeline = nullptr, *source = nullptr, *queue_src = nullptr, *sink = nullptr, *src_type = nullptr, *effects_bin = nullptr, *identity_in = nullptr, *identity_out = nullptr, *spectrum = nullptr, *spectrum_bin = nullptr, *spectrum_identity_in = nullptr, *spectrum_identity_out = nullptr, *global_level_meter = nullptr, *global_level_meter_bin = nullptr, *level_meter_identity_in = nullptr, *level_meter_identity_out = nullptr; GstBus* bus = nullptr; GSettings *settings = nullptr, *child_settings = nullptr, *spectrum_settings = nullptr; std::vector plugins_order, plugins_order_old; std::map plugins; std::unique_ptr limiter; std::unique_ptr compressor; std::unique_ptr filter; std::unique_ptr equalizer; std::unique_ptr reverb; std::unique_ptr gate; std::unique_ptr deesser; std::unique_ptr pitch; std::unique_ptr stereo_tools; std::unique_ptr maximizer; std::unique_ptr rnnoise; std::unique_ptr rtkit; GstClockTime state_check_timeout = 5 * GST_SECOND; uint sampling_rate = 0U; bool resizing_spectrum = false; uint min_spectrum_freq = 20U; // Hz uint max_spectrum_freq = 20000U; // Hz int spectrum_threshold = -120; // dB uint spectrum_nbands = 1600U, spectrum_nfreqs = 0U; float spline_f0 = 0.0F, spline_df = 0.0F; uint spectrum_start_index = 0U; std::vector spectrum_freqs, spectrum_x_axis; std::vector spectrum_mag_tmp, spectrum_mag; void do_bypass(const bool& value); auto bypass_state() -> bool; void enable_spectrum(); void disable_spectrum(); static auto get_peak(GstMessage* message) -> std::array; void set_source_monitor_name(const std::string& name); void set_output_sink_name(const std::string& name) const; void set_null_pipeline(); void update_pipeline_state(); void get_latency(); void init_spectrum(); void update_spectrum_interval(const double& value) const; sigc::signal> new_spectrum; sigc::signal new_latency; sigc::signal> global_output_level; sigc::signal> equalizer_input_level; sigc::signal> equalizer_output_level; sigc::signal> pitch_input_level; sigc::signal> pitch_output_level; sigc::signal> gate_input_level; sigc::signal> gate_output_level; sigc::signal> deesser_input_level; sigc::signal> deesser_output_level; sigc::signal> maximizer_input_level; sigc::signal> maximizer_output_level; sigc::signal> rnnoise_input_level; sigc::signal> rnnoise_output_level; protected: void set_pulseaudio_props(const std::string& props) const; void set_caps(const uint& sampling_rate); void on_app_added(const std::shared_ptr& app_info); void on_app_changed(const std::shared_ptr& app_info); void on_app_removed(uint idx); void on_sink_changed(const std::shared_ptr& sink_info); void on_source_changed(const std::shared_ptr& source_info); private: GstElement* capsfilter = nullptr; std::vector> apps_list; sigc::connection timeout_connection; void init_spectrum_bin(); void init_global_level_meter_bin(); void init_effects_bin(); auto apps_want_to_play() -> bool; auto get_required_plugin(const gchar* factoryname, const gchar* name) const -> GstElement*; }; #endif easyeffects-4.8.7/include/pipeline_common.hpp000066400000000000000000000122261424023573300213520ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PIPELINE_COMMON_HPP #define PIPELINE_COMMON_HPP #include #include #include #include "util.hpp" template void update_effects_order(gpointer user_data) { auto l = static_cast(user_data); // unlinking elements using old plugins order gst_element_unlink(l->identity_in, l->plugins[l->plugins_order_old[0]]); for (unsigned long int n = 1U; n < l->plugins_order_old.size(); n++) { gst_element_unlink(l->plugins[l->plugins_order_old[n - 1U]], l->plugins[l->plugins_order_old[n]]); } gst_element_unlink(l->plugins[l->plugins_order_old.back()], l->identity_out); // linking elements using the new plugins order if (gst_element_link(l->identity_in, l->plugins[l->plugins_order[0]])) { util::debug(l->log_tag + "linked identity_in to " + l->plugins_order[0]); } else { util::debug(l->log_tag + "failed to link identity_in to " + l->plugins_order[0]); } for (unsigned long int n = 1U; n < l->plugins_order.size(); n++) { auto p1_name = l->plugins_order[n - 1U]; auto p2_name = l->plugins_order[n]; if (gst_element_link(l->plugins[p1_name], l->plugins[p2_name])) { util::debug(l->log_tag + "linked " + p1_name + " to " + p2_name); } else { util::debug(l->log_tag + "failed to link " + p1_name + " to " + p2_name); } } if (gst_element_link(l->plugins[l->plugins_order.back()], l->identity_out)) { util::debug(l->log_tag + "linked " + l->plugins_order.back() + " to identity_out"); } else { util::debug(l->log_tag + "failed to link " + l->plugins_order.back() + " to identity_out"); } } template auto check_update(gpointer user_data) -> bool { auto l = static_cast(user_data); bool update = false; gchar* name = nullptr; GVariantIter* iter = nullptr; g_settings_get(l->child_settings, "plugins", "as", &iter); l->plugins_order_old = l->plugins_order; l->plugins_order.clear(); while (g_variant_iter_next(iter, "s", &name)) { l->plugins_order.emplace_back(name); g_free(name); } g_variant_iter_free(iter); if (l->plugins_order.size() != l->plugins_order_old.size()) { update = true; } if (!std::equal(l->plugins_order.begin(), l->plugins_order.end(), l->plugins_order_old.begin())) { update = true; } if (update) { std::string list; for (const auto& name : l->plugins_order) { list += name + ","; } util::debug(l->log_tag + "new plugins order: [" + list + "]"); } return update; } template auto event_probe_cb(GstPad* pad, GstPadProbeInfo* info, gpointer user_data) -> GstPadProbeReturn { if (GST_EVENT_TYPE(GST_PAD_PROBE_INFO_DATA(info)) != GST_EVENT_CUSTOM_DOWNSTREAM) { return GST_PAD_PROBE_PASS; } gst_pad_remove_probe(pad, GST_PAD_PROBE_INFO_ID(info)); if (check_update(user_data)) { update_effects_order(user_data); } return GST_PAD_PROBE_DROP; } template auto on_pad_blocked(GstPad* pad, GstPadProbeInfo* info, gpointer user_data) -> GstPadProbeReturn { auto l = static_cast(user_data); gst_pad_remove_probe(pad, GST_PAD_PROBE_INFO_ID(info)); auto srcpad = gst_element_get_static_pad(l->identity_out, "src"); gst_pad_add_probe(srcpad, static_cast(GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM), event_probe_cb, user_data, NULL); auto sinkpad = gst_element_get_static_pad(l->queue_src, "sink"); GstStructure* s = gst_structure_new_empty("reorder_plugins"); GstEvent* event = gst_event_new_custom(GST_EVENT_CUSTOM_DOWNSTREAM, s); gst_pad_send_event(sinkpad, event); gst_object_unref(sinkpad); gst_object_unref(srcpad); return GST_PAD_PROBE_OK; } template auto on_pad_idle(GstPad* pad, GstPadProbeInfo* info, gpointer user_data) -> GstPadProbeReturn { if (check_update(user_data)) { update_effects_order(user_data); } return GST_PAD_PROBE_REMOVE; } template void on_plugins_order_changed(GSettings* settings, gchar* key, T* l) { auto srcpad = gst_element_get_static_pad(l->source, "src"); GstState state; GstState pending; gst_element_get_state(l->pipeline, &state, &pending, 0); if (state != GST_STATE_PLAYING) { gst_pad_add_probe(srcpad, GST_PAD_PROBE_TYPE_IDLE, on_pad_idle, l, nullptr); } else { gst_pad_add_probe(srcpad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM, on_pad_blocked, l, nullptr); } g_object_unref(srcpad); } #endif easyeffects-4.8.7/include/pitch.hpp000066400000000000000000000023141424023573300173010ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PITCH_HPP #define PITCH_HPP #include "plugin_base.hpp" class Pitch : public PluginBase { public: Pitch(const std::string& tag, const std::string& schema, const std::string& schema_path); Pitch(const Pitch&) = delete; auto operator=(const Pitch&) -> Pitch& = delete; Pitch(const Pitch&&) = delete; auto operator=(const Pitch &&) -> Pitch& = delete; ~Pitch() override; GstElement* pitch = nullptr; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/pitch_preset.hpp000066400000000000000000000027141424023573300206670ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PITCH_PRESET_HPP #define PITCH_PRESET_HPP #include "plugin_preset_base.hpp" class PitchPreset : public PluginPresetBase { public: PitchPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr input_settings, output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/pitch_ui.hpp000066400000000000000000000027151424023573300200030ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PITCH_UI_HPP #define PITCH_UI_HPP #include "plugin_ui_base.hpp" class PitchUi : public Gtk::Grid, public PluginUiBase { public: PitchUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); PitchUi(const PitchUi&) = delete; auto operator=(const PitchUi&) -> PitchUi& = delete; PitchUi(const PitchUi&&) = delete; auto operator=(const PitchUi &&) -> PitchUi& = delete; ~PitchUi() override; void reset() override; private: Gtk::ToggleButton *faster = nullptr, *formant_preserving = nullptr; Glib::RefPtr cents, crispness, semitones, octaves, input_gain, output_gain; }; #endif easyeffects-4.8.7/include/plugin_base.hpp000066400000000000000000000030441424023573300204630ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PLUGIN_BASE_HPP #define PLUGIN_BASE_HPP #include #include #include #include class PluginBase { public: PluginBase(std::string tag, std::string plugin_name, const std::string& schema, const std::string& schema_path); PluginBase(const PluginBase&) = delete; auto operator=(const PluginBase&) -> PluginBase& = delete; PluginBase(const PluginBase&&) = delete; auto operator=(const PluginBase &&) -> PluginBase& = delete; virtual ~PluginBase(); std::string log_tag, name; GstElement *plugin = nullptr, *bin = nullptr, *identity_in = nullptr, *identity_out = nullptr; bool plugin_is_installed = false; void enable(); void disable(); protected: GSettings* settings = nullptr; auto is_installed(GstElement* e) -> bool; }; #endif easyeffects-4.8.7/include/plugin_preset_base.hpp000066400000000000000000000056401424023573300220510ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PLUGIN_PRESET_BASE_HPP #define PLUGIN_PRESET_BASE_HPP #include #include #include #include "preset_type.hpp" class PluginPresetBase { public: PluginPresetBase() {} virtual ~PluginPresetBase() {} virtual void write(PresetType preset_type, boost::property_tree::ptree& root) = 0; virtual void read(PresetType preset_type, const boost::property_tree::ptree& root) = 0; protected: virtual void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) = 0; virtual void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) = 0; template T get_default(const Glib::RefPtr& settings, const std::string& key) { Glib::Variant value; settings->get_default_value(key, value); return value.get(); } template void update_key(const boost::property_tree::ptree& root, const Glib::RefPtr& settings, const std::string& key, const std::string& json_key) { Glib::Variant aux; settings->get_value(key, aux); T current_value = aux.get(); T new_value = root.get(json_key, get_default(settings, key)); if (is_different(current_value, new_value)) { auto v = Glib::Variant::create(new_value); settings->set_value(key, v); } } void update_string_key(const boost::property_tree::ptree& root, const Glib::RefPtr& settings, const std::string& key, const std::string& json_key) { std::string current_value = settings->get_string(key); std::string new_value = root.get( json_key, get_default(settings, key)); if (current_value != new_value) { settings->set_string(key, new_value); } } private: template bool is_different(const T& a, const T& b) { return a != b; } }; #endif easyeffects-4.8.7/include/plugin_ui_base.hpp000066400000000000000000000135051424023573300211630ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PLUGIN_UI_BASE_HPP #define PLUGIN_UI_BASE_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "util.hpp" class PluginUiBase { public: PluginUiBase(const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); PluginUiBase(const PluginUiBase&) = delete; auto operator=(const PluginUiBase&) -> PluginUiBase& = delete; PluginUiBase(const PluginUiBase&&) = delete; auto operator=(const PluginUiBase &&) -> PluginUiBase& = delete; virtual ~PluginUiBase(); std::string name; Gtk::Box* listbox_control = nullptr; Gtk::Button *plugin_up = nullptr, *plugin_down = nullptr; void on_new_input_level(const std::array& peak); void on_new_output_level(const std::array& peak); void on_new_input_level_db(const std::array& peak); void on_new_output_level_db(const std::array& peak); // reset plugin method virtual void reset() = 0; protected: Glib::RefPtr settings; Gtk::Button* reset_button = nullptr; Gtk::CheckButton* enable = nullptr; Gtk::Box* controls = nullptr; Gtk::LevelBar *input_level_left = nullptr, *input_level_right = nullptr; Gtk::LevelBar *output_level_left = nullptr, *output_level_right = nullptr; Gtk::Label *input_level_left_label = nullptr, *input_level_right_label = nullptr; Gtk::Label *output_level_left_label = nullptr, *output_level_right_label = nullptr; std::vector connections; static void get_object(const Glib::RefPtr& builder, const std::string& name, Glib::RefPtr& object) { object = Glib::RefPtr::cast_dynamic(builder->get_object(name)); } template auto level_to_localized_string_showpos(const T& value, const int& places) -> std::string { std::ostringstream msg; msg.imbue(global_locale); msg.precision(places); msg << ((value > 0.0F) ? "+" : "") << std::fixed << value; return msg.str(); } template auto level_to_localized_string(const T& value, const int& places) -> std::string { std::ostringstream msg; msg.imbue(global_locale); msg.precision(places); msg << std::fixed << value; return msg.str(); } auto string_to_float(const std::string& value) -> float; private: static std::locale global_locale; static std::locale c_locale; template void update_level(const T1& w_left, const T2& w_left_label, const T3& w_right, const T4& w_right_label, const std::array& peak) { auto left = peak[0]; auto right = peak[1]; auto left_db = util::linear_to_db(left); auto right_db = util::linear_to_db(right); if (left_db >= -99.0) { w_left->set_value(left); w_left_label->set_text(level_to_localized_string(left_db, 0)); } else { w_left->set_value(0.0); w_left_label->set_text("-99"); } if (right_db >= -99.0) { w_right->set_value(right); w_right_label->set_text(level_to_localized_string(right_db, 0)); } else { w_right->set_value(0.0); w_right_label->set_text("-99"); } } template void update_level_db(const T1& w_left, const T2& w_left_label, const T3& w_right, const T4& w_right_label, const std::array& peak) { auto left = peak[0]; auto right = peak[1]; if (left >= -99.0) { auto db_value = util::db_to_linear(left); if (db_value < 0.0) { db_value = 0.0; } else if (db_value > 1.0) { db_value = 1.0; } w_left->set_value(db_value); w_left_label->set_text(level_to_localized_string(left, 0)); } else { w_left->set_value(0.0); w_left_label->set_text("-99"); } if (right >= -99.0) { auto db_value = util::db_to_linear(right); if (db_value < 0.0) { db_value = 0.0; } else if (db_value > 1.0) { db_value = 1.0; } w_right->set_value(db_value); w_right_label->set_text(level_to_localized_string(right, 0)); } else { w_right->set_value(0.0); w_right_label->set_text("-99"); } } }; #endif easyeffects-4.8.7/include/preset_type.hpp000066400000000000000000000015261424023573300205410ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PRESET_TYPE_HPP #define PRESET_TYPE_HPP enum class PresetType { input, output }; #endif easyeffects-4.8.7/include/presets_manager.hpp000066400000000000000000000132441424023573300213550ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PRESETS_MANAGER_HPP #define PRESETS_MANAGER_HPP #include #include #include #include #include "autogain_preset.hpp" #include "bass_enhancer_preset.hpp" #include "compressor_preset.hpp" #include "convolver_preset.hpp" #include "crossfeed_preset.hpp" #include "crystalizer_preset.hpp" #include "deesser_preset.hpp" #include "delay_preset.hpp" #include "equalizer_preset.hpp" #include "exciter_preset.hpp" #include "filter_preset.hpp" #include "gate_preset.hpp" #include "limiter_preset.hpp" #include "loudness_preset.hpp" #include "maximizer_preset.hpp" #include "multiband_compressor_preset.hpp" #include "multiband_gate_preset.hpp" #include "pitch_preset.hpp" #include "preset_type.hpp" #include "reverb_preset.hpp" #include "rnnoise_preset.hpp" #include "spectrum_preset.hpp" #include "stereo_tools_preset.hpp" #include "webrtc_preset.hpp" class PresetsManager { public: PresetsManager(); PresetsManager(const PresetsManager&) = delete; auto operator=(const PresetsManager&) -> PresetsManager& = delete; PresetsManager(const PresetsManager&&) = delete; auto operator=(const PresetsManager&&) -> PresetsManager& = delete; ~PresetsManager(); auto get_names(PresetType preset_type) -> std::vector; static auto search_names(boost::filesystem::directory_iterator& it) -> std::vector; void add(PresetType preset_type, const std::string& name); void save(PresetType preset_type, const std::string& name); void remove(PresetType preset_type, const std::string& name); void load(PresetType preset_type, const std::string& name); void import(PresetType preset_type, const std::string& file_path); void add_autoload(const std::string& device, const std::string& name); void remove_autoload(const std::string& device, const std::string& name); auto find_autoload(const std::string& device) -> std::string; void autoload(PresetType preset_type, const std::string& device); auto preset_file_exists(PresetType preset_type, const std::string& name) -> bool; private: std::string log_tag = "presets_manager: "; boost::filesystem::path user_presets_dir, user_input_dir, user_output_dir, autoload_dir; std::vector system_input_dir, system_output_dir; Glib::RefPtr settings, sie_settings, soe_settings; std::unique_ptr limiter; std::unique_ptr bass_enhancer; std::unique_ptr compressor; std::unique_ptr crossfeed; std::unique_ptr deesser; std::unique_ptr equalizer; std::unique_ptr exciter; std::unique_ptr filter; std::unique_ptr gate; std::unique_ptr maximizer; std::unique_ptr pitch; std::unique_ptr reverb; std::unique_ptr webrtc; std::unique_ptr multiband_compressor; std::unique_ptr loudness; std::unique_ptr multiband_gate; std::unique_ptr stereo_tools; std::unique_ptr convolver; std::unique_ptr crystalizer; std::unique_ptr autogain; std::unique_ptr delay; std::unique_ptr rnnoise; std::unique_ptr spectrum; template auto get_default(const Glib::RefPtr& settings, const std::string& key) -> T { Glib::Variant value; settings->get_default_value(key, value); return value.get(); } template void update_key(const boost::property_tree::ptree& root, const Glib::RefPtr& settings, const std::string& key, const std::string& json_key) { Glib::Variant aux; settings->get_value(key, aux); T current_value = aux.get(); T new_value = root.get(json_key, get_default(settings, key)); if (is_different(current_value, new_value)) { auto v = Glib::Variant::create(new_value); settings->set_value(key, v); } } void update_string_key(const boost::property_tree::ptree& root, const Glib::RefPtr& settings, const std::string& key, const std::string& json_key) { std::string current_value = settings->get_string(key); std::string new_value = root.get(json_key, get_default(settings, key)); if (current_value != new_value) { settings->set_string(key, new_value); } } template auto is_different(const T& a, const T& b) -> bool { return a != b; } void create_user_directory(const boost::filesystem::path& path); void save_blocklist(PresetType preset_type, boost::property_tree::ptree& root); void load_blocklist(PresetType preset_type, const boost::property_tree::ptree& root); }; #endif easyeffects-4.8.7/include/presets_menu_ui.hpp000066400000000000000000000051731424023573300214060ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PRESETS_MENU_UI_HPP #define PRESETS_MENU_UI_HPP #include #include #include #include #include #include #include #include #include "application.hpp" #include "preset_type.hpp" class PresetsMenuUi : public Gtk::Grid { public: PresetsMenuUi(BaseObjectType* cobject, const Glib::RefPtr& builder, Glib::RefPtr refSettings, Application* application); PresetsMenuUi(const PresetsMenuUi&) = delete; auto operator=(const PresetsMenuUi&) -> PresetsMenuUi& = delete; PresetsMenuUi(const PresetsMenuUi&&) = delete; auto operator=(const PresetsMenuUi &&) -> PresetsMenuUi& = delete; ~PresetsMenuUi() override; static auto add_to_popover(Gtk::Popover* popover, Application* app) -> PresetsMenuUi*; void on_presets_menu_button_clicked(); auto build_device_name(PresetType preset_type, const std::string& device) -> std::string; private: std::string log_tag = "presets_menu_ui: "; Glib::RefPtr settings; Application* app = nullptr; Gtk::Button *add_output = nullptr, *add_input = nullptr, *import_output = nullptr, *import_input = nullptr; Gtk::ListBox *output_listbox = nullptr, *input_listbox = nullptr; Gtk::Entry *output_name = nullptr, *input_name = nullptr; Gtk::ScrolledWindow *output_scrolled_window = nullptr, *input_scrolled_window = nullptr; std::vector connections; void create_preset(PresetType preset_type); void import_preset(PresetType preset_type); void populate_listbox(PresetType preset_type); static auto on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int; void reset_menu_button_label(); auto is_autoloaded(PresetType preset_type, const std::string& name) -> bool; }; #endif easyeffects-4.8.7/include/pulse_info_ui.hpp000066400000000000000000000043751424023573300210430ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PULSE_INFO_UI_HPP #define PULSE_INFO_UI_HPP #include #include #include #include #include #include #include "pulse_manager.hpp" class PulseInfoUi : public Gtk::Box { public: PulseInfoUi(BaseObjectType* cobject, const Glib::RefPtr& builder, PulseManager* pm_ptr); PulseInfoUi(const PulseInfoUi&) = delete; auto operator=(const PulseInfoUi&) -> PulseInfoUi& = delete; PulseInfoUi(const PulseInfoUi&&) = delete; auto operator=(const PulseInfoUi &&) -> PulseInfoUi& = delete; ~PulseInfoUi() override; static auto add_to_stack(Gtk::Stack* stack, PulseManager* pm) -> PulseInfoUi*; private: std::string log_tag = "pulse_info: "; PulseManager* pm = nullptr; Gtk::Stack* stack = nullptr; Gtk::Label *server_name = nullptr, *server_version = nullptr, *default_sink = nullptr, *default_source = nullptr, *protocol = nullptr, *server_sample_format = nullptr, *server_rate = nullptr, *server_channels = nullptr, *server_channel_mapping = nullptr, *config_file = nullptr; Gtk::ListBox *listbox_modules = nullptr, *listbox_clients = nullptr, *listbox_config = nullptr, *listbox_resamplers = nullptr; std::vector connections; void update_server_info(); void get_pulse_conf(); void get_resamplers(); static auto on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int; void on_stack_visible_child_changed(); }; #endif easyeffects-4.8.7/include/pulse_manager.hpp000066400000000000000000000237471424023573300210310ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PULSE_MANAGER_HPP #define PULSE_MANAGER_HPP #include #include #include #include #include #include #include #include #include struct myServerInfo { std::string server_name; std::string server_version; std::string default_sink_name; std::string default_source_name; std::string protocol; std::string format; std::string channel_map; uint rate; uint8_t channels; }; struct mySinkInfo { std::string name; uint index; std::string description; uint owner_module; uint monitor_source; std::string monitor_source_name; uint rate; std::string format; std::string active_port; }; struct mySourceInfo { std::string name; uint index; std::string description; uint rate; std::string format; std::string active_port; }; struct myModuleInfo { std::string name; uint index; std::string argument; }; struct myClientInfo { std::string name; uint index; std::string binary; }; struct AppInfo { std::string app_type; uint index; std::string name; std::string icon_name; std::string media_name; uint8_t channels; double volume; uint rate; std::string resampler; std::string format; int mute; bool connected; bool visible; uint buffer; uint latency; int corked; bool wants_to_play; }; class ParseAppInfo; class PulseManager { public: PulseManager(); PulseManager(const PulseManager&) = delete; auto operator=(const PulseManager&) -> PulseManager& = delete; PulseManager(const PulseManager&&) = delete; auto operator=(const PulseManager &&) -> PulseManager& = delete; ~PulseManager(); pa_threaded_mainloop* main_loop = nullptr; myServerInfo server_info; std::shared_ptr apps_sink_info; std::shared_ptr mic_sink_info; auto get_sink_info(const std::string& name) -> std::shared_ptr; auto get_source_info(const std::string& name) -> std::shared_ptr; std::vector blocklist_in; // for input effects std::vector blocklist_out; // for output effects void find_sink_inputs(); void find_source_outputs(); void find_sinks(); void find_sources(); auto move_sink_input_to_pulseeffects(const std::string& name, uint idx) -> bool; auto remove_sink_input_from_pulseeffects(const std::string& name, uint idx) -> bool; auto move_source_output_to_pulseeffects(const std::string& name, uint idx) -> bool; auto remove_source_output_from_pulseeffects(const std::string& name, uint idx) -> bool; void set_sink_input_volume(const std::string& name, uint idx, uint8_t channels, uint value); void set_sink_input_mute(const std::string& name, uint idx, bool state); void set_source_output_volume(const std::string& name, uint idx, uint8_t channels, uint value); void set_source_output_mute(const std::string& name, uint idx, bool state); void get_sink_input_info(uint idx); void update_server_info(const pa_server_info* info); void get_modules_info(); void get_clients_info(); void set_sink_volume_by_name(const std::string& name, uint8_t channels, uint value); sigc::signal> source_added; sigc::signal> source_changed; sigc::signal source_removed; sigc::signal> sink_added; sigc::signal> sink_changed; sigc::signal sink_removed; sigc::signal new_default_sink; sigc::signal new_default_source; sigc::signal> sink_input_added; sigc::signal> sink_input_changed; sigc::signal sink_input_removed; sigc::signal> source_output_added; sigc::signal> source_output_changed; sigc::signal source_output_removed; sigc::signal server_changed; sigc::signal> module_info; sigc::signal> client_info; private: std::string log_tag = "pulse_manager: "; bool context_ready = false; pa_mainloop_api* main_loop_api = nullptr; pa_context* context = nullptr; std::array blocklist_apps = { "PulseEffectsWebrtcProbe", "gsd-media-keys", "GNOME Shell", "libcanberra", "Screenshot", "speech-dispatcher"}; std::array blocklist_media_name = {"pulsesink probe", "bell-window-system", "audio-volume-change", "screen-capture"}; std::array blocklist_media_role = {"event"}; std::array blocklist_app_id = {"com.github.wwmm.pulseeffects.sinkinputs", "com.github.wwmm.pulseeffects.sourceoutputs", "org.PulseAudio.pavucontrol", "org.gnome.VolumeControl"}; static void context_state_cb(pa_context* ctx, void* data); void subscribe_to_events(); void get_server_info(); auto get_default_sink_info() -> std::shared_ptr; auto get_default_source_info() -> std::shared_ptr; auto load_sink(const std::string& name, const std::string& description, uint rate) -> std::shared_ptr; void load_apps_sink(); void load_mic_sink(); auto load_module(const std::string& name, const std::string& argument) -> bool; void unload_module(uint idx); void unload_sinks(); void drain_context(); void new_app(const pa_sink_input_info* info); void new_app(const pa_source_output_info* info); void changed_app(const pa_sink_input_info* info); void changed_app(const pa_source_output_info* info); static void print_app_info(const std::shared_ptr& info); auto app_is_connected(const pa_sink_input_info* info) -> bool; auto app_is_connected(const pa_source_output_info* info) -> bool; static auto get_latency(const pa_sink_input_info* info) -> uint { return info->sink_usec; } static auto get_latency(const pa_source_output_info* info) -> uint { return info->source_usec; } template auto parse_app_info(const T& info) -> std::shared_ptr { std::string app_name; std::string media_name; std::string media_role; std::string app_id; auto ai = std::make_shared(); bool forbidden_app = false; auto prop = pa_proplist_gets(info->proplist, "application.name"); if (prop != nullptr) { app_name = prop; forbidden_app = std::find(std::begin(blocklist_apps), std::end(blocklist_apps), app_name) != std::end(blocklist_apps); if (forbidden_app) { return nullptr; } } prop = pa_proplist_gets(info->proplist, "media.name"); if (prop != nullptr) { media_name = prop; if (app_name.empty()) { app_name = media_name; } forbidden_app = std::find(std::begin(blocklist_media_name), std::end(blocklist_media_name), media_name) != std::end(blocklist_media_name); if (forbidden_app) { return nullptr; } } prop = pa_proplist_gets(info->proplist, "media.role"); if (prop != nullptr) { media_role = prop; forbidden_app = std::find(std::begin(blocklist_media_role), std::end(blocklist_media_role), media_role) != std::end(blocklist_media_role); if (forbidden_app) { return nullptr; } } prop = pa_proplist_gets(info->proplist, "application.id"); if (prop != nullptr) { app_id = prop; forbidden_app = std::find(std::begin(blocklist_app_id), std::end(blocklist_app_id), app_id) != std::end(blocklist_app_id); if (forbidden_app) { return nullptr; } } prop = pa_proplist_gets(info->proplist, "application.icon_name"); std::string icon_name; if (prop != nullptr) { icon_name = prop; } else { prop = pa_proplist_gets(info->proplist, "media.icon_name"); if (prop != nullptr) { if (std::strcmp(prop, "audio-card-bluetooth") == 0) { // there is no GTK icon with this name given by Pulseaudio =/ } else { icon_name = "bluetooth-symbolic"; } } else { icon_name = "audio-x-generic-symbolic"; } } // Connection flag: it specifies only the primary state that can be enabled/disabled by the user ai->connected = app_is_connected(info); // Initialize visibility to true, it will be properly updated forward ai->visible = true; // linear volume ai->volume = 100.0 * (static_cast(pa_cvolume_max(&info->volume)) / PA_VOLUME_NORM); if (info->resample_method) { ai->resampler = info->resample_method; } else { ai->resampler = "none"; } ai->format = pa_sample_format_to_string(info->sample_spec.format); ai->index = info->index; ai->name = app_name; ai->media_name = media_name; ai->icon_name = icon_name; ai->channels = info->volume.channels; ai->rate = info->sample_spec.rate; ai->mute = info->mute; ai->buffer = info->buffer_usec; ai->latency = get_latency(info); ai->corked = info->corked; ai->wants_to_play = ai->connected && !ai->corked; return ai; } }; #endif easyeffects-4.8.7/include/pulse_settings_ui.hpp000066400000000000000000000062221424023573300217410ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef PULSE_SETTINGS_UI_HPP #define PULSE_SETTINGS_UI_HPP #include #include #include #include #include #include #include #include #include #include #include "application.hpp" class PulseSettingsUi : public Gtk::Grid { public: PulseSettingsUi(BaseObjectType* cobject, const Glib::RefPtr& builder, Application* application); PulseSettingsUi(const PulseSettingsUi&) = delete; auto operator=(const PulseSettingsUi&) -> PulseSettingsUi& = delete; PulseSettingsUi(const PulseSettingsUi&&) = delete; auto operator=(const PulseSettingsUi &&) -> PulseSettingsUi& = delete; ~PulseSettingsUi() override; static void add_to_stack(Gtk::Stack* stack, Application* app); private: std::string log_tag = "pulse_settings_ui: "; Glib::RefPtr settings, sie_settings, soe_settings; Application* app = nullptr; Gtk::ToggleButton *use_default_sink = nullptr, *use_default_source = nullptr; Gtk::ComboBox *input_device = nullptr, *output_device = nullptr; Gtk::ComboBoxText *blocksize_in = nullptr, *blocksize_out = nullptr; Glib::RefPtr sie_input_buffer, sie_input_latency, sie_output_buffer, sie_output_latency, soe_input_buffer, soe_input_latency, soe_output_buffer, soe_output_latency; Glib::RefPtr sink_list, source_list; std::vector connections; static void get_object(const Glib::RefPtr& builder, const std::string& name, Glib::RefPtr& object) { object = Glib::RefPtr::cast_dynamic(builder->get_object(name)); } static void get_object(const Glib::RefPtr& builder, const std::string& name, Glib::RefPtr& object) { object = Glib::RefPtr::cast_dynamic(builder->get_object(name)); } void on_sink_added(const std::shared_ptr& info); void on_sink_removed(uint idx); void on_source_added(const std::shared_ptr& info); void on_source_removed(uint idx); void on_use_default_sink_toggled(); void on_use_default_source_toggled(); void on_input_device_changed(); void on_output_device_changed(); }; #endif easyeffects-4.8.7/include/realtime_kit.hpp000066400000000000000000000030101424023573300206350ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef REALTIMEKIT_HPP #define REALTIMEKIT_HPP #include #include #define RTKIT_SERVICE_NAME "org.freedesktop.RealtimeKit1" #define RTKIT_OBJECT_PATH "/org/freedesktop/RealtimeKit1" class RealtimeKit { public: RealtimeKit(const std::string& tag); void set_priority(const std::string& source_name, const int& priority); void set_nice(const std::string& source_name, const int& nice_value); private: std::string log_tag; Glib::RefPtr proxy; Glib::RefPtr properties_proxy; auto get_int_property(const char* propname) -> long long; void make_realtime(const std::string& source_name, const int& priority); void make_high_priority(const std::string& source_name, const int& nice_value); }; #endif easyeffects-4.8.7/include/reverb.hpp000066400000000000000000000025471424023573300174670ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef REVERB_HPP #define REVERB_HPP #include "plugin_base.hpp" class Reverb : public PluginBase { public: Reverb(const std::string& tag, const std::string& schema, const std::string& schema_path); Reverb(const Reverb&) = delete; auto operator=(const Reverb&) -> Reverb& = delete; Reverb(const Reverb&&) = delete; auto operator=(const Reverb &&) -> Reverb& = delete; ~Reverb() override; GstElement* reverb = nullptr; sigc::connection input_level_connection, output_level_connection; sigc::signal> input_level, output_level; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/reverb_preset.hpp000066400000000000000000000027201424023573300210420ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef REVERB_PRESET_HPP #define REVERB_PRESET_HPP #include "plugin_preset_base.hpp" class ReverbPreset : public PluginPresetBase { public: ReverbPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr input_settings, output_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/reverb_ui.hpp000066400000000000000000000034131424023573300201550ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef REVERB_UI_HPP #define REVERB_UI_HPP #include "plugin_ui_base.hpp" class ReverbUi : public Gtk::Grid, public PluginUiBase { public: ReverbUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); ReverbUi(const ReverbUi&) = delete; auto operator=(const ReverbUi&) -> ReverbUi& = delete; ReverbUi(const ReverbUi&&) = delete; auto operator=(const ReverbUi &&) -> ReverbUi& = delete; ~ReverbUi() override; void reset() override; private: Glib::RefPtr input_gain, output_gain, predelay, decay_time, diffusion, amount, dry, hf_damp, bass_cut, treble_cut; Gtk::ComboBoxText* room_size = nullptr; Gtk::Button *preset_room = nullptr, *preset_empty_walls = nullptr, *preset_ambience = nullptr, *preset_large_empty_hall = nullptr, *preset_disco = nullptr, *preset_large_occupied_hall = nullptr, *preset_default = nullptr; void init_presets_buttons(); }; #endif easyeffects-4.8.7/include/rnnoise.hpp000066400000000000000000000025621424023573300176540ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef RNNOISE_HPP #define RNNOISE_HPP #include "plugin_base.hpp" class RNNoise : public PluginBase { public: RNNoise(const std::string& tag, const std::string& schema, const std::string& schema_path); RNNoise(const RNNoise&) = delete; auto operator=(const RNNoise&) -> RNNoise& = delete; RNNoise(const RNNoise&&) = delete; auto operator=(const RNNoise&&) -> RNNoise& = delete; ~RNNoise() override; GstElement* rnnoise = nullptr; void set_caps_out(const uint& sampling_rate); private: GstElement *capsfilter_in = nullptr, *capsfilter_out = nullptr; void bind_to_gsettings(); void set_caps_in(); }; #endif easyeffects-4.8.7/include/rnnoise_preset.hpp000066400000000000000000000027241424023573300212360ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef RNNOISE_PRESET_HPP #define RNNOISE_PRESET_HPP #include "plugin_preset_base.hpp" class RNNoisePreset : public PluginPresetBase { public: RNNoisePreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr output_settings, input_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/rnnoise_ui.hpp000066400000000000000000000041011424023573300203400ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef RNNOISE_UI_HPP #define RNNOISE_UI_HPP #include #include #include "glibmm/miscutils.h" #include "plugin_ui_base.hpp" class RNNoiseUi : public Gtk::Grid, public PluginUiBase { public: RNNoiseUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); RNNoiseUi(const RNNoiseUi&) = delete; auto operator=(const RNNoiseUi&) -> RNNoiseUi& = delete; RNNoiseUi(const RNNoiseUi&&) = delete; auto operator=(const RNNoiseUi&&) -> RNNoiseUi& = delete; ~RNNoiseUi() override; void reset() override; private: std::string log_tag = "rnnoise_ui: "; std::string default_model_name; Glib::RefPtr input_gain, output_gain; Gtk::Button* import_model = nullptr; Gtk::Frame* model_list_frame = nullptr; Gtk::ListBox* model_listbox = nullptr; Gtk::Label* active_model_name = nullptr; std::filesystem::path model_dir; void on_import_model_clicked(); static auto on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int; void import_model_file(const std::string& file_path); void populate_model_listbox(); auto get_model_names() -> std::vector; void remove_model_file(const std::string& name); void set_active_model_label(); }; #endif easyeffects-4.8.7/include/sink_input_effects.hpp000066400000000000000000000061261424023573300220610ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef SINK_INPUT_EFFECTS_HPP #define SINK_INPUT_EFFECTS_HPP #include "autogain.hpp" #include "bass_enhancer.hpp" #include "convolver.hpp" #include "crossfeed.hpp" #include "crystalizer.hpp" #include "delay.hpp" #include "exciter.hpp" #include "loudness.hpp" #include "multiband_compressor.hpp" #include "multiband_gate.hpp" #include "pipeline_base.hpp" #include "pulse_manager.hpp" class SinkInputEffects : public PipelineBase { public: SinkInputEffects(PulseManager* pulse_manager); SinkInputEffects(const SinkInputEffects&) = delete; auto operator=(const SinkInputEffects&) -> SinkInputEffects& = delete; SinkInputEffects(const SinkInputEffects&&) = delete; auto operator=(const SinkInputEffects&&) -> SinkInputEffects& = delete; ~SinkInputEffects() override; std::unique_ptr bass_enhancer; std::unique_ptr exciter; std::unique_ptr crossfeed; std::unique_ptr multiband_compressor; std::unique_ptr loudness; std::unique_ptr multiband_gate; std::unique_ptr convolver; std::unique_ptr crystalizer; std::unique_ptr autogain; std::unique_ptr delay; sigc::signal> bass_enhancer_input_level; sigc::signal> bass_enhancer_output_level; sigc::signal> exciter_input_level; sigc::signal> exciter_output_level; sigc::signal> crossfeed_input_level; sigc::signal> crossfeed_output_level; sigc::signal> loudness_input_level; sigc::signal> loudness_output_level; sigc::signal> convolver_input_level; sigc::signal> convolver_output_level; sigc::signal> crystalizer_input_level; sigc::signal> crystalizer_output_level; sigc::signal> autogain_input_level; sigc::signal> autogain_output_level; sigc::signal> delay_input_level; sigc::signal> delay_output_level; private: void add_plugins_to_pipeline(); void on_app_added(const std::shared_ptr& app_info); }; #endif easyeffects-4.8.7/include/sink_input_effects_ui.hpp000066400000000000000000000062721424023573300225600ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef SINK_INPUT_EFFECTS_UI_HPP #define SINK_INPUT_EFFECTS_UI_HPP #include "autogain_ui.hpp" #include "bass_enhancer_ui.hpp" #include "compressor_ui.hpp" #include "convolver_ui.hpp" #include "crossfeed_ui.hpp" #include "crystalizer_ui.hpp" #include "deesser_ui.hpp" #include "delay_ui.hpp" #include "effects_base_ui.hpp" #include "equalizer_ui.hpp" #include "exciter_ui.hpp" #include "filter_ui.hpp" #include "gate_ui.hpp" #include "limiter_ui.hpp" #include "loudness_ui.hpp" #include "maximizer_ui.hpp" #include "multiband_compressor_ui.hpp" #include "multiband_gate_ui.hpp" #include "pitch_ui.hpp" #include "reverb_ui.hpp" #include "rnnoise.hpp" #include "rnnoise_ui.hpp" #include "sink_input_effects.hpp" #include "stereo_tools_ui.hpp" class SinkInputEffectsUi : public Gtk::Box, public EffectsBaseUi { public: SinkInputEffectsUi(BaseObjectType* cobject, const Glib::RefPtr& refBuilder, const Glib::RefPtr& refSettings, SinkInputEffects* sie_ptr); SinkInputEffectsUi(const SinkInputEffectsUi&) = delete; auto operator=(const SinkInputEffectsUi&) -> SinkInputEffectsUi& = delete; SinkInputEffectsUi(const SinkInputEffectsUi&&) = delete; auto operator=(const SinkInputEffectsUi&&) -> SinkInputEffectsUi& = delete; ~SinkInputEffectsUi() override; static auto add_to_stack(Gtk::Stack* stack, SinkInputEffects* sie_ptr) -> SinkInputEffectsUi*; void on_app_added(std::shared_ptr app_info) override; protected: std::string log_tag = "sie_ui: "; private: SinkInputEffects* sie = nullptr; LimiterUi* limiter_ui = nullptr; CompressorUi* compressor_ui = nullptr; FilterUi* filter_ui = nullptr; EqualizerUi* equalizer_ui = nullptr; PitchUi* pitch_ui = nullptr; ReverbUi* reverb_ui = nullptr; BassEnhancerUi* bass_enhancer_ui = nullptr; ExciterUi* exciter_ui = nullptr; CrossfeedUi* crossfeed_ui = nullptr; MaximizerUi* maximizer_ui = nullptr; MultibandCompressorUi* multiband_compressor_ui = nullptr; LoudnessUi* loudness_ui = nullptr; GateUi* gate_ui = nullptr; MultibandGateUi* multiband_gate_ui = nullptr; DeesserUi* deesser_ui = nullptr; StereoToolsUi* stereo_tools_ui = nullptr; ConvolverUi* convolver_ui = nullptr; CrystalizerUi* crystalizer_ui = nullptr; AutoGainUi* autogain_ui = nullptr; DelayUi* delay_ui = nullptr; RNNoiseUi* rnnoise_ui = nullptr; void level_meters_connections(); void up_down_connections(); }; #endif easyeffects-4.8.7/include/source_output_effects.hpp000066400000000000000000000034021424023573300226100ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef SOURCE_OUTPUT_EFFECTS_HPP #define SOURCE_OUTPUT_EFFECTS_HPP #include "multiband_compressor.hpp" #include "multiband_gate.hpp" #include "pipeline_base.hpp" #include "pulse_manager.hpp" #include "webrtc.hpp" class SourceOutputEffects : public PipelineBase { public: SourceOutputEffects(PulseManager* pulse_manager); SourceOutputEffects(const SourceOutputEffects&) = delete; auto operator=(const SourceOutputEffects&) -> SourceOutputEffects& = delete; SourceOutputEffects(const SourceOutputEffects&&) = delete; auto operator=(const SourceOutputEffects &&) -> SourceOutputEffects& = delete; ~SourceOutputEffects() override; std::unique_ptr webrtc; std::unique_ptr multiband_compressor; std::unique_ptr multiband_gate; sigc::signal> webrtc_input_level; sigc::signal> webrtc_output_level; private: void add_plugins_to_pipeline(); void on_app_added(const std::shared_ptr& app_info); }; #endif easyeffects-4.8.7/include/source_output_effects_ui.hpp000066400000000000000000000054131424023573300233110ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef SOURCE_OUTPUT_EFFECTS_UI_HPP #define SOURCE_OUTPUT_EFFECTS_UI_HPP #include "compressor_ui.hpp" #include "deesser_ui.hpp" #include "effects_base_ui.hpp" #include "equalizer_ui.hpp" #include "filter_ui.hpp" #include "gate_ui.hpp" #include "limiter_ui.hpp" #include "maximizer_ui.hpp" #include "multiband_compressor_ui.hpp" #include "multiband_gate_ui.hpp" #include "pitch_ui.hpp" #include "reverb_ui.hpp" #include "rnnoise_ui.hpp" #include "source_output_effects.hpp" #include "stereo_tools_ui.hpp" #include "webrtc_ui.hpp" class SourceOutputEffectsUi : public Gtk::Box, public EffectsBaseUi { public: SourceOutputEffectsUi(BaseObjectType* cobject, const Glib::RefPtr& refBuilder, const Glib::RefPtr& refSettings, SourceOutputEffects* soe_ptr); SourceOutputEffectsUi(const SourceOutputEffectsUi&) = delete; auto operator=(const SourceOutputEffectsUi&) -> SourceOutputEffectsUi& = delete; SourceOutputEffectsUi(const SourceOutputEffectsUi&&) = delete; auto operator=(const SourceOutputEffectsUi&&) -> SourceOutputEffectsUi& = delete; ~SourceOutputEffectsUi() override; static auto add_to_stack(Gtk::Stack* stack, SourceOutputEffects* soe_ptr) -> SourceOutputEffectsUi*; void on_app_added(std::shared_ptr app_info) override; protected: std::string log_tag = "soe_ui: "; private: SourceOutputEffects* soe = nullptr; LimiterUi* limiter_ui = nullptr; CompressorUi* compressor_ui = nullptr; FilterUi* filter_ui = nullptr; EqualizerUi* equalizer_ui = nullptr; ReverbUi* reverb_ui = nullptr; GateUi* gate_ui = nullptr; DeesserUi* deesser_ui = nullptr; PitchUi* pitch_ui = nullptr; WebrtcUi* webrtc_ui = nullptr; MultibandCompressorUi* multiband_compressor_ui = nullptr; MultibandGateUi* multiband_gate_ui = nullptr; StereoToolsUi* stereo_tools_ui = nullptr; MaximizerUi* maximizer_ui = nullptr; RNNoiseUi* rnnoise_ui = nullptr; void level_meters_connections(); void up_down_connections(); }; #endif easyeffects-4.8.7/include/spectrum_preset.hpp000066400000000000000000000027011424023573300214160ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef SPECTRUM_PRESET_HPP #define SPECTRUM_PRESET_HPP #include "plugin_preset_base.hpp" class SpectrumPreset : public PluginPresetBase { public: SpectrumPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/spectrum_settings_ui.hpp000066400000000000000000000051551424023573300224570ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef SPECTRUM_SETTINGS_UI_HPP #define SPECTRUM_SETTINGS_UI_HPP #include #include #include #include #include #include #include #include #include #include "application.hpp" class SpectrumSettingsUi : public Gtk::Grid { public: SpectrumSettingsUi(BaseObjectType* cobject, const Glib::RefPtr& builder, Application* application); SpectrumSettingsUi(const SpectrumSettingsUi&) = delete; auto operator=(const SpectrumSettingsUi&) -> SpectrumSettingsUi& = delete; SpectrumSettingsUi(const SpectrumSettingsUi&&) = delete; auto operator=(const SpectrumSettingsUi &&) -> SpectrumSettingsUi& = delete; ~SpectrumSettingsUi() override; static void add_to_stack(Gtk::Stack* stack, Application* app); private: std::string log_tag = "spectrum_settings_ui: "; Glib::RefPtr settings; Application* app = nullptr; Gtk::Switch *show = nullptr, *use_custom_color = nullptr, *fill = nullptr, *show_bar_border = nullptr, *use_gradient = nullptr; Gtk::ColorButton *spectrum_color_button = nullptr, *gradient_color_button = nullptr, *axis_color_button = nullptr; Gtk::ComboBoxText* spectrum_type = nullptr; Glib::RefPtr n_points, height, sampling_freq, line_width, minimum_frequency, maximum_frequency; std::vector connections; static void get_object(const Glib::RefPtr& builder, const std::string& name, Glib::RefPtr& object) { object = Glib::RefPtr::cast_dynamic(builder->get_object(name)); } auto on_show_spectrum(bool state) -> bool; void on_spectrum_sampling_freq_set(); auto on_use_custom_color(bool state) -> bool; }; #endif easyeffects-4.8.7/include/spectrum_ui.hpp000066400000000000000000000045311424023573300205340ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef SPECTRUM_UI_HPP #define SPECTRUM_UI_HPP #include #include #include #include #include #include "util.hpp" class SpectrumUi : public Gtk::Grid { public: SpectrumUi(BaseObjectType* cobject, const Glib::RefPtr& builder); SpectrumUi(const SpectrumUi&) = delete; auto operator=(const SpectrumUi&) -> SpectrumUi& = delete; SpectrumUi(const SpectrumUi&&) = delete; auto operator=(const SpectrumUi &&) -> SpectrumUi& = delete; ~SpectrumUi() override; static auto add_to_box(Gtk::Box* box) -> SpectrumUi*; void on_new_spectrum(const std::vector& magnitudes); void clear_spectrum(); private: std::string log_tag = "spectrum_ui: "; Glib::RefPtr settings; std::locale global_locale; Gtk::DrawingArea* spectrum = nullptr; Gdk::RGBA color, color_frequency_axis_labels, gradient_color; std::vector connections; bool mouse_inside = false; int axis_height = 0; double mouse_intensity = 0.0, mouse_freq = 0.0; std::vector spectrum_mag; auto on_spectrum_draw(const Cairo::RefPtr& ctx) -> bool; auto on_spectrum_enter_notify_event(GdkEventCrossing* event) -> bool; auto on_spectrum_leave_notify_event(GdkEventCrossing* event) -> bool; auto on_spectrum_motion_notify_event(GdkEventMotion* event) -> bool; void init_color(); void init_frequency_labels_color(); void init_gradient_color(); auto draw_frequency_axis(const Cairo::RefPtr& ctx, const int& width, const int& height) -> int; }; #endif easyeffects-4.8.7/include/stereo_tools.hpp000066400000000000000000000026601424023573300207170ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef STEREO_TOOLS_HPP #define STEREO_TOOLS_HPP #include "plugin_base.hpp" class StereoTools : public PluginBase { public: StereoTools(const std::string& tag, const std::string& schema, const std::string& schema_path); StereoTools(const StereoTools&) = delete; auto operator=(const StereoTools&) -> StereoTools& = delete; StereoTools(const StereoTools&&) = delete; auto operator=(const StereoTools &&) -> StereoTools& = delete; ~StereoTools() override; GstElement* stereo_tools = nullptr; sigc::connection input_level_connection, output_level_connection; sigc::signal> input_level, output_level; private: void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/stereo_tools_preset.hpp000066400000000000000000000027461424023573300223060ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef STEREO_TOOLS_PRESET_HPP #define STEREO_TOOLS_PRESET_HPP #include "plugin_preset_base.hpp" class StereoToolsPreset : public PluginPresetBase { public: StereoToolsPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr output_settings, input_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/stereo_tools_ui.hpp000066400000000000000000000032771424023573300214210ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef STEREO_TOOLS_UI_HPP #define STEREO_TOOLS_UI_HPP #include "plugin_ui_base.hpp" class StereoToolsUi : public Gtk::Grid, public PluginUiBase { public: StereoToolsUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); StereoToolsUi(const StereoToolsUi&) = delete; auto operator=(const StereoToolsUi&) -> StereoToolsUi& = delete; StereoToolsUi(const StereoToolsUi&&) = delete; auto operator=(const StereoToolsUi &&) -> StereoToolsUi& = delete; ~StereoToolsUi() override; void reset() override; private: Glib::RefPtr input_gain, output_gain, balance_in, balance_out, slev, sbal, mlev, mpan, stereo_base, delay, sc_level, stereo_phase; Gtk::ComboBoxText* mode = nullptr; Gtk::ToggleButton *softclip = nullptr, *mutel = nullptr, *muter = nullptr, *phasel = nullptr, *phaser = nullptr; }; #endif easyeffects-4.8.7/include/util.hpp000066400000000000000000000050171424023573300171520ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef UTIL_HPP #define UTIL_HPP #include #include #include #include #include #include #include namespace util { const float minimum_db_level = -99.0F; const float minimum_linear_level = 0.00001F; void debug(const std::string& s); void error(const std::string& s); void critical(const std::string& s); void warning(const std::string& s); void info(const std::string& s); auto get_global_locale() -> std::locale; auto get_c_locale() -> std::locale; auto logspace(const float& start, const float& stop, const uint& npoints) -> std::vector; auto linspace(const float& start, const float& stop, const uint& npoints) -> std::vector; template auto linear_to_db(const T& amp) -> T { return (amp >= minimum_linear_level) ? (20.0F * log10f(amp)) : minimum_db_level; } template auto db_to_linear(const T& db) -> T { return expf((db / 20.0F) * logf(10.0F)); } auto db20_gain_to_linear(GValue* value, GVariant* variant, gpointer user_data) -> gboolean; auto linear_gain_to_db20(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant*; auto db10_gain_to_linear(GValue* value, GVariant* variant, gpointer user_data) -> gboolean; auto double_to_float(GValue* value, GVariant* variant, gpointer user_data) -> gboolean; auto db20_gain_to_linear_double(GValue* value, GVariant* variant, gpointer user_data) -> gboolean; auto linear_double_gain_to_db20(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant*; auto double_x10_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean; auto ms_to_ns(GValue* value, GVariant* variant, gpointer user_data) -> gboolean; void print_thread_id(); } // namespace util #endif easyeffects-4.8.7/include/webrtc.hpp000066400000000000000000000026261424023573300174660ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef WEBRTC_HPP #define WEBRTC_HPP #include "plugin_base.hpp" class Webrtc : public PluginBase { public: Webrtc(const std::string& tag, const std::string& schema, const std::string& schema_path, const int& sampling_rate); Webrtc(const Webrtc&) = delete; auto operator=(const Webrtc&) -> Webrtc& = delete; Webrtc(const Webrtc&&) = delete; auto operator=(const Webrtc &&) -> Webrtc& = delete; ~Webrtc() override; GstElement *webrtc = nullptr, *probe_bin = nullptr, *probe_src = nullptr; int rate; void set_probe_src_device(const std::string& name); private: void build_probe_bin(); void build_dsp_bin(); void bind_to_gsettings(); }; #endif easyeffects-4.8.7/include/webrtc_preset.hpp000066400000000000000000000026771424023573300210560ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef WEBRTC_PRESET_HPP #define WEBRTC_PRESET_HPP #include "plugin_preset_base.hpp" class WebrtcPreset : public PluginPresetBase { public: WebrtcPreset(); void write(PresetType preset_type, boost::property_tree::ptree& root) override; void read(PresetType preset_type, const boost::property_tree::ptree& root) override; private: Glib::RefPtr input_settings; void save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; void load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) override; }; #endif easyeffects-4.8.7/include/webrtc_ui.hpp000066400000000000000000000035401424023573300201570ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef WEBRTC_UI_HPP #define WEBRTC_UI_HPP #include "plugin_ui_base.hpp" class WebrtcUi : public Gtk::Grid, public PluginUiBase { public: WebrtcUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path); WebrtcUi(const WebrtcUi&) = delete; auto operator=(const WebrtcUi&) -> WebrtcUi& = delete; WebrtcUi(const WebrtcUi&&) = delete; auto operator=(const WebrtcUi &&) -> WebrtcUi& = delete; ~WebrtcUi() override; void reset() override; private: Glib::RefPtr compression_gain_db, target_level_dbfs, voice_detection_frame_size; Gtk::ToggleButton *echo_cancel = nullptr, *extended_filter = nullptr, *high_pass_filter = nullptr, *delay_agnostic = nullptr, *noise_suppression = nullptr, *gain_control = nullptr, *limiter = nullptr, *voice_detection = nullptr; Gtk::ComboBoxText *echo_suppression_level = nullptr, *noise_suppression_level = nullptr, *gain_control_mode = nullptr, *voice_detection_likelihood = nullptr; }; #endif easyeffects-4.8.7/meson.build000066400000000000000000000025371424023573300162070ustar00rootroot00000000000000project( 'pulseeffects', 'c', 'cpp', default_options : ['cpp_std=c++17','buildtype=debugoptimized'], version: '4.8.7', meson_version: '>= 0.40.0' ) add_global_arguments('-DG_LOG_DOMAIN="pulseeffects"', language : 'c') add_global_arguments('-DG_LOG_DOMAIN="pulseeffects"', language : 'cpp') add_global_arguments('-DGETTEXT_PACKAGE="@0@"'.format(meson.project_name()), language:'c') gnome_mod = import('gnome') i18n_mod = import('i18n') prefix = get_option('prefix') bindir = join_paths(prefix, get_option('bindir')) datadir = join_paths(prefix, get_option('datadir')) localedir = join_paths(prefix, get_option('localedir')) include_dir = include_directories('include') config_h_dir = include_directories('.') plugins_install_dir = '@0@/gstreamer-1.0'.format(get_option('libdir')) # Configuration conf = configuration_data() conf.set_quoted('GETTEXT_PACKAGE', meson.project_name()) conf.set_quoted('LOCALE_DIR', localedir) conf.set_quoted('VERSION', meson.project_version()) conf.set_quoted('PACKAGE', 'PulseEffects') conf.set_quoted('PLUGINS_INSTALL_DIR', join_paths(prefix, plugins_install_dir)) configure_file(output: 'config.h', configuration: conf) plugins_cxx_args = [ '-Wl,-Bsymbolic-functions', '-fvisibility=hidden', '-fno-strict-aliasing' ] subdir('data') subdir('po') subdir('help') subdir('src') meson.add_install_script('meson_post_install.py') easyeffects-4.8.7/meson_post_install.py000066400000000000000000000013071424023573300203250ustar00rootroot00000000000000#!/usr/bin/env python3 import os import subprocess prefix = os.environ.get('MESON_INSTALL_PREFIX', '/usr/local') datadir = os.path.join(prefix, 'share') # Packaging tools define DESTDIR and this isn't needed for them if 'DESTDIR' not in os.environ: print('Compiling gsettings schemas...') subprocess.call( ['glib-compile-schemas', os.path.join(datadir, 'glib-2.0', 'schemas')]) print('Updating icon cache...') subprocess.call(['gtk-update-icon-cache', '-qtf', os.path.join(datadir, 'icons', 'hicolor')]) print('Updating desktop database...') subprocess.call(['update-desktop-database', '-q', os.path.join(datadir, 'applications')]) easyeffects-4.8.7/po/000077500000000000000000000000001424023573300144545ustar00rootroot00000000000000easyeffects-4.8.7/po/LINGUAS000066400000000000000000000000551424023573300155010ustar00rootroot00000000000000cs de fr_FR hr id_ID it_IT pl pt_BR ru sk sv easyeffects-4.8.7/po/POTFILES.in000066400000000000000000000032651424023573300162370ustar00rootroot00000000000000data/com.github.wwmm.pulseeffects.appdata.xml.in data/com.github.wwmm.pulseeffects.desktop.in data/schemas/com.github.wwmm.pulseeffects.gschema.xml data/ui/about.glade.in data/ui/app_button_row.glade data/ui/app_info.glade data/ui/application.glade data/ui/autogain.glade data/ui/bass_enhancer.glade data/ui/blocklist_row.glade data/ui/blocklist_settings.glade data/ui/calibration.glade data/ui/calibration_signals.glade data/ui/calibration_mic.glade data/ui/client_info.glade data/ui/compressor.glade data/ui/convolver.glade data/ui/crossfeed.glade data/ui/crystalizer.glade data/ui/crystalizer_band.glade data/ui/deesser.glade data/ui/delay.glade data/ui/effects_base.glade data/ui/equalizer.glade data/ui/equalizer_band.glade data/ui/equalizer_preset_row.glade data/ui/exciter.glade data/ui/filter.glade data/ui/general_settings.glade data/ui/gate.glade data/ui/irs_row.glade data/ui/limiter.glade data/ui/loudness.glade data/ui/maximizer.glade data/ui/module_info.glade data/ui/multiband_compressor.glade data/ui/multiband_gate.glade data/ui/pitch.glade data/ui/preset_row.glade data/ui/presets_menu.glade data/ui/pulse_info.glade data/ui/pulse_conf_file_line.glade data/ui/pulse_settings.glade data/ui/reverb.glade data/ui/spectrum.glade data/ui/spectrum_settings.glade data/ui/stereo_tools.glade data/ui/webrtc.glade data/ui/rnnoise.glade src/app_info_ui.cpp src/application.cpp src/application_ui.cpp src/blocklist_settings_ui.cpp src/calibration_ui.cpp src/convolver_ui.cpp src/effects_base_ui.cpp src/equalizer_ui.cpp src/general_settings_ui.cpp src/pulse_settings_ui.cpp src/presets_menu_ui.cpp src/sink_input_effects_ui.cpp src/spectrum_settings_ui.cpp src/spectrum_ui.cpp src/source_output_effects_ui.cpp easyeffects-4.8.7/po/cs.po000066400000000000000000001275621424023573300154360ustar00rootroot00000000000000# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Pavel Fric , 2017, 2018, 2019. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-14 23:58+0100\n" "PO-Revision-Date: 2019-08-25 21:29+0200\n" "Last-Translator: Mlocik97\n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Lokalize 19.04.0\n" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 data/ui/application.glade:61 msgid "PulseEffects" msgstr "PulseEffects" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Zvukové efekty pro programy využívající PulseAudio" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Wellington Wallace" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects je pokročilým nástrojem pro zacházení se zvukem. Obsahuje mimo " "jiné nástroj ekvalizéru, omezovače (limiter), kompresoru a dozvuku. Na " "doplnění je také vestavěn analyzátor spektra." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "Protože PulseEffects používá výchozí zvukový server PulseAudio, bude " "pracovat s většinou, pokud už ne se všemi vámi používanými programy. Všechny " "podporované programy jsou ukázány v hlavním okně, v němž je možné kterýkoli " "z nich ručně povolit." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Vedle práce se zvukovým výstupem dokáže PulseEffects efekty použít i na " "vstupní zařízení, jako je mikrofon. To je užitečné mimo jiné při nahrávání " "zvuku, pracuje to ale dobře během hlasových hovorů." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "Když je PulseEffects spuštěn, zapamatuje si příhodně nastavení používané při " "posledním sezení. Je možné i uložení všech nynějších nastavení jako profilů." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "Nastavit hlasitost a zapnout/vypnout efekty" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "Zahrnuje ekvalizér s vestavěnými přednastaveními" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Omezovač vstupu" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:52 #: data/ui/compressor.glade:110 data/ui/compressor.glade:589 #: data/ui/webrtc.glade:633 msgid "Compressor" msgstr "Kompresor" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Kalibrace" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "Ekvalizér, kompresor a jiné zvukové efekty" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "omezovač (limiter);kompresor;dozvuk;ekvalizér;automatická hlasitost;" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:44 #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:47 msgid "\"Presets\"" msgstr "\"Přednastavení\"" #: data/ui/about.glade.in:11 msgid "Audio effects for PulseAudio applications" msgstr "Zvukové efekty pro programy PulseAudio" #: data/ui/app_button_row.glade:49 msgid "Applications" msgstr "Programy" #: data/ui/app_info.glade:203 #, fuzzy msgid "Add to Blocklist" msgstr "Černá listina" #: data/ui/app_info.glade:239 msgid "Format" msgstr "Formát" #: data/ui/app_info.glade:264 data/ui/convolver.glade:348 msgid "Rate" msgstr "Kmitočet" #: data/ui/app_info.glade:289 data/ui/pulse_info.glade:239 #: data/ui/stereo_tools.glade:756 msgid "Channels" msgstr "Kanály" #: data/ui/app_info.glade:314 msgid "Resampler" msgstr "Převzorkovač" #: data/ui/app_info.glade:339 data/ui/pulse_settings.glade:159 #: data/ui/pulse_settings.glade:259 data/ui/pulse_settings.glade:464 #: data/ui/pulse_settings.glade:564 msgid "Buffer" msgstr "Vyrovnávací paměť" #: data/ui/app_info.glade:364 data/ui/pulse_settings.glade:190 #: data/ui/pulse_settings.glade:290 data/ui/pulse_settings.glade:476 #: data/ui/pulse_settings.glade:576 msgid "Latency" msgstr "Prodleva" #: data/ui/app_info.glade:389 msgid "State" msgstr "Stav" #: data/ui/application.glade:142 src/calibration_ui.cpp:64 #: src/calibration_ui.cpp:191 msgid "Test Signals" msgstr "Zkušební signály" #: data/ui/application.glade:157 msgid "Global Bypass" msgstr "Přepustení" #: data/ui/application.glade:172 data/ui/equalizer.glade:331 #: data/ui/general_settings.glade:289 msgid "Settings" msgstr "Nastavení" #: data/ui/application.glade:194 msgid "Help" msgstr "Nápověda" #: data/ui/application.glade:217 data/ui/crossfeed.glade:240 #: data/ui/equalizer.glade:403 data/ui/filter.glade:344 #: data/ui/reverb.glade:401 src/presets_menu_ui.cpp:133 #: src/presets_menu_ui.cpp:285 src/presets_menu_ui.cpp:286 #: src/presets_menu_ui.cpp:303 src/presets_menu_ui.cpp:304 msgid "Presets" msgstr "Přednastavení" #: data/ui/autogain.glade:90 msgid "Auto Gain" msgstr "Automatické zesílení" #: data/ui/autogain.glade:161 data/ui/bass_enhancer.glade:167 #: data/ui/compressor.glade:214 data/ui/convolver.glade:218 #: data/ui/crossfeed.glade:136 data/ui/crystalizer.glade:134 #: data/ui/deesser.glade:182 data/ui/delay.glade:144 #: data/ui/equalizer.glade:450 data/ui/equalizer_band.glade:187 #: data/ui/equalizer_band.glade:230 data/ui/exciter.glade:167 #: data/ui/filter.glade:243 data/ui/general_settings.glade:298 #: data/ui/gate.glade:172 data/ui/limiter.glade:166 data/ui/loudness.glade:174 #: data/ui/maximizer.glade:139 data/ui/multiband_compressor.glade:307 #: data/ui/multiband_gate.glade:331 data/ui/pitch.glade:158 #: data/ui/reverb.glade:299 data/ui/stereo_tools.glade:194 #: data/ui/webrtc.glade:141 data/ui/rnnoise.glade:139 msgid "Reset" msgstr "Vrátit na výchozí" #: data/ui/autogain.glade:185 data/ui/rnnoise.glade:163 msgid "Based on" msgstr "Na základě" #: data/ui/autogain.glade:262 #, fuzzy msgid "Reset History" msgstr "Vymazat Historii" #: data/ui/autogain.glade:274 msgid "Detect Silence" msgstr "Zjištění Ticha" #: data/ui/autogain.glade:286 #, fuzzy msgid "Use Geometric Mean" msgstr "Použít přechod" #: data/ui/autogain.glade:325 msgid "Target" msgstr "Cíl" #: data/ui/autogain.glade:374 data/ui/autogain.glade:779 msgid "Momentary" msgstr "Chvilkové" #: data/ui/autogain.glade:434 msgid "Weights" msgstr "Váhy" #: data/ui/autogain.glade:448 data/ui/autogain.glade:792 msgid "Short Term" msgstr "Jednorázové" #: data/ui/autogain.glade:497 data/ui/autogain.glade:805 msgid "Integrated" msgstr "Sjednocené" #: data/ui/autogain.glade:564 data/ui/autogain.glade:1076 #: data/ui/bass_enhancer.glade:596 data/ui/compressor.glade:1086 #: data/ui/convolver.glade:575 data/ui/crossfeed.glade:391 #: data/ui/crystalizer.glade:250 data/ui/deesser.glade:783 #: data/ui/delay.glade:328 data/ui/equalizer.glade:682 #: data/ui/exciter.glade:596 data/ui/filter.glade:508 data/ui/gate.glade:689 #: data/ui/limiter.glade:501 data/ui/loudness.glade:238 #: data/ui/loudness.glade:431 data/ui/maximizer.glade:358 #: data/ui/multiband_compressor.glade:2103 data/ui/multiband_gate.glade:2262 #: data/ui/pitch.glade:450 data/ui/presets_menu.glade:238 #: data/ui/reverb.glade:753 data/ui/stereo_tools.glade:427 #: data/ui/stereo_tools.glade:931 data/ui/webrtc.glade:780 #: data/ui/rnnoise.glade:362 msgid "Input" msgstr "Vstup" #: data/ui/autogain.glade:577 data/ui/autogain.glade:1020 #: data/ui/bass_enhancer.glade:625 data/ui/compressor.glade:1099 #: data/ui/convolver.glade:588 data/ui/crossfeed.glade:405 #: data/ui/crystalizer.glade:263 data/ui/deesser.glade:797 #: data/ui/delay.glade:341 data/ui/equalizer.glade:695 #: data/ui/exciter.glade:625 data/ui/filter.glade:521 data/ui/gate.glade:703 #: data/ui/limiter.glade:636 data/ui/loudness.glade:271 #: data/ui/loudness.glade:445 data/ui/maximizer.glade:372 #: data/ui/multiband_compressor.glade:894 #: data/ui/multiband_compressor.glade:1272 #: data/ui/multiband_compressor.glade:1651 #: data/ui/multiband_compressor.glade:2030 #: data/ui/multiband_compressor.glade:2116 data/ui/multiband_gate.glade:951 #: data/ui/multiband_gate.glade:1363 data/ui/multiband_gate.glade:1776 #: data/ui/multiband_gate.glade:2189 data/ui/multiband_gate.glade:2275 #: data/ui/pitch.glade:463 data/ui/presets_menu.glade:137 #: data/ui/reverb.glade:766 data/ui/stereo_tools.glade:901 #: data/ui/stereo_tools.glade:944 data/ui/webrtc.glade:794 #: data/ui/rnnoise.glade:375 msgid "Output" msgstr "Výstup" #: data/ui/autogain.glade:899 msgid "Relative" msgstr "Relativní" #: data/ui/autogain.glade:912 data/ui/compressor.glade:1262 msgid "Gain" msgstr "Zesílení" #: data/ui/autogain.glade:980 msgid "Loudness" msgstr "Hlasitost" #: data/ui/autogain.glade:1034 msgid "Range" msgstr "Rozsah" #: data/ui/bass_enhancer.glade:116 msgid "Bass Enhancer" msgstr "Zlepšovač hloubek" #: data/ui/bass_enhancer.glade:191 data/ui/compressor.glade:238 #: data/ui/crossfeed.glade:160 data/ui/deesser.glade:206 #: data/ui/delay.glade:168 data/ui/equalizer.glade:474 #: data/ui/exciter.glade:191 data/ui/filter.glade:267 data/ui/gate.glade:196 #: data/ui/limiter.glade:190 data/ui/loudness.glade:143 #: data/ui/maximizer.glade:163 data/ui/multiband_compressor.glade:331 #: data/ui/multiband_gate.glade:355 data/ui/pitch.glade:182 #: data/ui/reverb.glade:323 data/ui/stereo_tools.glade:218 #: data/ui/webrtc.glade:165 msgid "Provided by" msgstr "Poskytuje" #: data/ui/bass_enhancer.glade:259 data/ui/compressor.glade:602 #: data/ui/deesser.glade:274 data/ui/exciter.glade:259 msgid "Listen" msgstr "Poslouchat" #: data/ui/bass_enhancer.glade:302 data/ui/exciter.glade:303 msgid "3rd" msgstr "3." #: data/ui/bass_enhancer.glade:315 data/ui/exciter.glade:316 msgid "2nd" msgstr "2." #: data/ui/bass_enhancer.glade:327 data/ui/exciter.glade:328 msgid "Blend Harmonics" msgstr "Míchat harmonické kmity" #: data/ui/bass_enhancer.glade:355 data/ui/exciter.glade:357 #: data/ui/reverb.glade:498 msgid "Amount" msgstr "Množství" #: data/ui/bass_enhancer.glade:367 data/ui/bass_enhancer.glade:504 #: data/ui/exciter.glade:369 data/ui/exciter.glade:504 msgid "Harmonics" msgstr "Harmonické kmity" #: data/ui/bass_enhancer.glade:379 data/ui/exciter.glade:381 msgid "Scope" msgstr "Rozsah" #: data/ui/bass_enhancer.glade:472 msgid "Floor" msgstr "Spodní mez" #: data/ui/blocklist_settings.glade:52 data/ui/blocklist_settings.glade:155 #: data/ui/presets_menu.glade:65 data/ui/presets_menu.glade:166 msgid "Create Preset" msgstr "Vytvořit přednastavení" #: data/ui/blocklist_settings.glade:68 data/ui/blocklist_settings.glade:171 #: data/ui/presets_menu.glade:52 data/ui/presets_menu.glade:153 #: data/ui/pulse_info.glade:50 msgid "Name" msgstr "Název" #: data/ui/blocklist_settings.glade:81 msgid "Reconnect the microphone to apply new changes made to the Blocklist" msgstr "Znovu připojit mikrofon pro použití změn provedených v Blocklistu" #: data/ui/blocklist_settings.glade:139 data/ui/pulse_settings.glade:383 msgid "Input Effects" msgstr "Vstupní efekty" #: data/ui/blocklist_settings.glade:230 msgid "Restart the player to apply new changes made to the Blocklist" msgstr "Restartovat přehrávač pro použití změn provedených v Blocklistu" #: data/ui/blocklist_settings.glade:242 data/ui/pulse_settings.glade:688 msgid "Output Effects" msgstr "Výstupní efekty" #: data/ui/blocklist_settings.glade:265 msgid "Show Blocklisted Apps in Main Tab" msgstr "Zobrazit Aplikace z Blocklistu na Hlavní Kartě" #: data/ui/calibration_signals.glade:32 msgid "Sine" msgstr "Sinus" #: data/ui/calibration_signals.glade:33 msgid "Square" msgstr "Čtverec" #: data/ui/calibration_signals.glade:34 msgid "Saw" msgstr "Pila" #: data/ui/calibration_signals.glade:35 msgid "Triangle" msgstr "Trojúhelník" #: data/ui/calibration_signals.glade:36 msgid "Silence" msgstr "Ticho" #: data/ui/calibration_signals.glade:37 msgid "White Noise" msgstr "Bílý šum" #: data/ui/calibration_signals.glade:38 msgid "Pink Noise" msgstr "Růžový šum" #: data/ui/calibration_signals.glade:39 msgid "Sine Table" msgstr "Sinusová tabulka" #: data/ui/calibration_signals.glade:40 msgid "Ticks" msgstr "Tiknutí" #: data/ui/calibration_signals.glade:41 msgid "Gaussian Noise" msgstr "Gaussovský šum" #: data/ui/calibration_signals.glade:42 msgid "Red Noise" msgstr "Červený šum" #: data/ui/calibration_signals.glade:43 msgid "Blue Noise" msgstr "Modrý šum" #: data/ui/calibration_signals.glade:44 msgid "Violet Noise" msgstr "Fialový šum" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Hlasitost" #: data/ui/calibration_signals.glade:135 data/ui/equalizer_band.glade:158 #: data/ui/filter.glade:394 msgid "Frequency" msgstr "Kmitočet" #: data/ui/calibration_mic.glade:33 msgid "Window" msgstr "Okno" #: data/ui/calibration_mic.glade:90 msgid "Measure Noise" msgstr "Změřit šum" #: data/ui/calibration_mic.glade:119 msgid "Subtract Noise" msgstr "Odečíst šum" #: data/ui/compressor.glade:386 data/ui/deesser.glade:436 #: data/ui/gate.glade:498 data/ui/maximizer.glade:242 #: data/ui/multiband_compressor.glade:707 #: data/ui/multiband_compressor.glade:1085 #: data/ui/multiband_compressor.glade:1464 #: data/ui/multiband_compressor.glade:1843 data/ui/multiband_gate.glade:731 #: data/ui/multiband_gate.glade:1142 data/ui/multiband_gate.glade:1555 #: data/ui/multiband_gate.glade:1968 msgid "Threshold" msgstr "Práh" #: data/ui/compressor.glade:420 data/ui/deesser.glade:448 #: data/ui/gate.glade:532 data/ui/multiband_compressor.glade:741 #: data/ui/multiband_compressor.glade:1119 #: data/ui/multiband_compressor.glade:1498 #: data/ui/multiband_compressor.glade:1877 data/ui/multiband_gate.glade:765 #: data/ui/multiband_gate.glade:1176 data/ui/multiband_gate.glade:1589 #: data/ui/multiband_gate.glade:2002 msgid "Ratio" msgstr "Poměr" #: data/ui/compressor.glade:452 data/ui/gate.glade:564 #: data/ui/multiband_compressor.glade:773 #: data/ui/multiband_compressor.glade:1151 #: data/ui/multiband_compressor.glade:1530 #: data/ui/multiband_compressor.glade:1909 data/ui/multiband_gate.glade:797 #: data/ui/multiband_gate.glade:1208 data/ui/multiband_gate.glade:1621 #: data/ui/multiband_gate.glade:2034 msgid "Knee" msgstr "Přechod" #: data/ui/compressor.glade:486 data/ui/deesser.glade:532 #: data/ui/gate.glade:598 data/ui/multiband_compressor.glade:807 #: data/ui/multiband_compressor.glade:1185 #: data/ui/multiband_compressor.glade:1564 #: data/ui/multiband_compressor.glade:1943 data/ui/multiband_gate.glade:831 #: data/ui/multiband_gate.glade:1242 data/ui/multiband_gate.glade:1655 #: data/ui/multiband_gate.glade:2068 msgid "Makeup" msgstr "Pozvednutí" #: data/ui/compressor.glade:520 data/ui/gate.glade:464 #: data/ui/limiter.glade:363 data/ui/maximizer.glade:266 #: data/ui/multiband_compressor.glade:673 #: data/ui/multiband_compressor.glade:1051 #: data/ui/multiband_compressor.glade:1430 #: data/ui/multiband_compressor.glade:1809 data/ui/multiband_gate.glade:697 #: data/ui/multiband_gate.glade:1108 data/ui/multiband_gate.glade:1521 #: data/ui/multiband_gate.glade:1934 msgid "Release" msgstr "Uvolnění" #: data/ui/compressor.glade:532 data/ui/gate.glade:430 #: data/ui/multiband_compressor.glade:639 #: data/ui/multiband_compressor.glade:1017 #: data/ui/multiband_compressor.glade:1396 #: data/ui/multiband_compressor.glade:1775 data/ui/multiband_gate.glade:663 #: data/ui/multiband_gate.glade:1074 data/ui/multiband_gate.glade:1487 #: data/ui/multiband_gate.glade:1900 msgid "Attack" msgstr "Náběh" #: data/ui/compressor.glade:559 msgid "Downward" msgstr "Dolů" #: data/ui/compressor.glade:560 msgid "Upward" msgstr "Nahoru" #: data/ui/compressor.glade:573 msgid "Compression Mode" msgstr "Kompresní režim" #: data/ui/compressor.glade:649 msgid "Pre-amplification" msgstr "Předzesílení" #: data/ui/compressor.glade:683 msgid "Reactivity" msgstr "Reaktivita" #: data/ui/compressor.glade:716 data/ui/limiter.glade:375 msgid "Lookahead" msgstr "Výhled" #: data/ui/compressor.glade:730 msgid "Feed-forward" msgstr "Kanál-vpřed" #: data/ui/compressor.glade:731 msgid "Feed-back" msgstr "Kanál-zpět" #: data/ui/compressor.glade:744 data/ui/equalizer_band.glade:51 msgid "Type" msgstr "Typ" #: data/ui/compressor.glade:758 data/ui/deesser.glade:731 #: data/ui/gate.glade:303 data/ui/multiband_compressor.glade:611 #: data/ui/multiband_compressor.glade:989 #: data/ui/multiband_compressor.glade:1368 #: data/ui/multiband_compressor.glade:1747 data/ui/multiband_gate.glade:635 #: data/ui/multiband_gate.glade:1046 data/ui/multiband_gate.glade:1459 #: data/ui/multiband_gate.glade:1872 msgid "Peak" msgstr "Vrchol" #: data/ui/compressor.glade:759 data/ui/deesser.glade:730 #: data/ui/gate.glade:302 data/ui/multiband_compressor.glade:610 #: data/ui/multiband_compressor.glade:988 #: data/ui/multiband_compressor.glade:1367 #: data/ui/multiband_compressor.glade:1746 data/ui/multiband_gate.glade:634 #: data/ui/multiband_gate.glade:1045 data/ui/multiband_gate.glade:1458 #: data/ui/multiband_gate.glade:1871 msgid "RMS" msgstr "RMS" #: data/ui/compressor.glade:760 msgid "Low-Pass" msgstr "Dolní pásmo" #: data/ui/compressor.glade:761 msgid "Uniform" msgstr "Rovnoměrný" #: data/ui/compressor.glade:774 data/ui/deesser.glade:702 #: data/ui/equalizer.glade:257 data/ui/equalizer_band.glade:84 #: data/ui/multiband_compressor.glade:412 data/ui/multiband_gate.glade:436 #: data/ui/stereo_tools.glade:591 data/ui/webrtc.glade:483 msgid "Mode" msgstr "Režim" #: data/ui/compressor.glade:788 msgid "Middle" msgstr "Střední" #: data/ui/compressor.glade:789 msgid "Side" msgstr "Postranní" #: data/ui/compressor.glade:790 data/ui/delay.glade:247 #: data/ui/equalizer.glade:612 data/ui/stereo_tools.glade:655 msgid "Left" msgstr "Levý" #: data/ui/compressor.glade:791 data/ui/delay.glade:280 #: data/ui/equalizer.glade:654 data/ui/stereo_tools.glade:724 msgid "Right" msgstr "Pravý" #: data/ui/compressor.glade:804 msgid "Source" msgstr "Zdroj" #: data/ui/compressor.glade:820 data/ui/compressor.glade:1274 msgid "Sidechain" msgstr "Postranní řetězec" #: data/ui/compressor.glade:925 msgid "Relative Release Threshold" msgstr "Relativní Práh Uvolnění" #: data/ui/compressor.glade:937 #, fuzzy msgid "Boost Threshold" msgstr "Práh" #: data/ui/compressor.glade:949 #, fuzzy msgid "High-pass Frequency" msgstr "Tlumení vysokého kmitočtu" #: data/ui/compressor.glade:961 #, fuzzy msgid "Low-pass Frequency" msgstr "Spočítat kmitočty" #: data/ui/compressor.glade:973 #, fuzzy msgid "High-pass Filter Mode" msgstr "Vysokopásmový filtr" #: data/ui/compressor.glade:985 msgid "Low-pass Filter Mode" msgstr "Nízkopropustný Mód Filtru" #: data/ui/compressor.glade:999 data/ui/compressor.glade:1017 #: data/ui/equalizer_band.glade:63 msgid "Off" msgstr "Vypnuto" #: data/ui/compressor.glade:1000 data/ui/compressor.glade:1018 #, fuzzy msgid "12 dB/oct" msgstr "Nízká pásmová propust 12 dB/okt" #: data/ui/compressor.glade:1001 data/ui/compressor.glade:1019 #, fuzzy msgid "24 dB/oct" msgstr "Nízká pásmová propust 24 dB/okt" #: data/ui/compressor.glade:1002 data/ui/compressor.glade:1020 #, fuzzy msgid "36 dB/oct" msgstr "Nízká pásmová propust 36 dB/okt" #: data/ui/compressor.glade:1043 #, fuzzy msgid "Advanced" msgstr "Nastavení" #: data/ui/compressor.glade:1347 msgid "Curve" msgstr "Křivka" #: data/ui/convolver.glade:90 msgid "Convolver" msgstr "Svinovač" #: data/ui/convolver.glade:125 msgid "Import Impulse" msgstr "Zavést impuls" #: data/ui/convolver.glade:129 msgid "Import Impulse Response File" msgstr "Zavést soubor s odpovědí impulsu" #: data/ui/convolver.glade:309 msgid "L" msgstr "L" #: data/ui/convolver.glade:323 msgid "R" msgstr "P" #: data/ui/convolver.glade:390 msgid "Duration" msgstr "Doba trvání" #: data/ui/convolver.glade:402 msgid "Samples" msgstr "Vzorky" #: data/ui/convolver.glade:435 src/convolver_ui.cpp:285 msgid "Impulse Response" msgstr "Odpověď impulsu" #: data/ui/convolver.glade:458 msgid "Select the impulse Response File" msgstr "Vybrat soubor s odpovědí impulsu" #: data/ui/convolver.glade:477 src/spectrum_settings_ui.cpp:195 msgid "Spectrum" msgstr "Spektrum" #: data/ui/convolver.glade:520 msgid "Stereo Width" msgstr "Šířka sterea" #: data/ui/crossfeed.glade:104 msgid "Crossfeed" msgstr "Prolínání kanálů" #: data/ui/crossfeed.glade:254 msgid "Jmeier" msgstr "Jmeier" #: data/ui/crossfeed.glade:266 data/ui/filter.glade:183 #: data/ui/reverb.glade:259 msgid "Default" msgstr "Výchozí" #: data/ui/crossfeed.glade:278 msgid "Cmoy" msgstr "Sluchátkový zesilovač (CMoy)" #: data/ui/crossfeed.glade:308 msgid "Cutoff" msgstr "Useknutí" #: data/ui/crossfeed.glade:341 msgid "Feed" msgstr "Kanál" #: data/ui/crystalizer.glade:90 msgid "Crystalizer" msgstr "Krystalizátor" #: data/ui/crystalizer.glade:200 msgid "Aggressive Mode" msgstr "Agresivní režim" #: data/ui/crystalizer.glade:464 msgid "Before" msgstr "Před" #: data/ui/crystalizer.glade:477 msgid "After" msgstr "Po" #: data/ui/crystalizer.glade:550 msgid "Loudness Range" msgstr "Rozsah hlasitosti" #: data/ui/crystalizer_band.glade:28 data/ui/equalizer_band.glade:316 #: data/ui/stereo_tools.glade:680 data/ui/stereo_tools.glade:737 msgid "Mute" msgstr "Ztlumit" #: data/ui/crystalizer_band.glade:40 data/ui/multiband_compressor.glade:580 #: data/ui/multiband_compressor.glade:958 #: data/ui/multiband_compressor.glade:1337 #: data/ui/multiband_compressor.glade:1716 data/ui/multiband_gate.glade:604 #: data/ui/multiband_gate.glade:1015 data/ui/multiband_gate.glade:1428 #: data/ui/multiband_gate.glade:1841 msgid "Bypass" msgstr "Překlenutí" #: data/ui/deesser.glade:125 msgid "Deesser" msgstr "Odstraňovač sykotu" #: data/ui/deesser.glade:309 #, fuzzy msgid "F1 Gain" msgstr "Zesílení" #: data/ui/deesser.glade:321 #, fuzzy msgid "F2 Level" msgstr "Úroveň" #: data/ui/deesser.glade:333 #, fuzzy msgid "F2 Peak Q" msgstr "Vrchol Q" #: data/ui/deesser.glade:424 msgid "Laxity" msgstr "Nedbalost" #: data/ui/deesser.glade:585 #, fuzzy msgid "F1 Split" msgstr "Rozdělit" #: data/ui/deesser.glade:597 #, fuzzy msgid "F2 Peak" msgstr "Vrchol" #: data/ui/deesser.glade:690 data/ui/gate.glade:288 msgid "Detection" msgstr "Zjištění" #: data/ui/deesser.glade:715 msgid "Wide" msgstr "Rozšířit" #: data/ui/deesser.glade:716 msgid "Split" msgstr "Rozdělit" #: data/ui/deesser.glade:959 data/ui/multiband_gate.glade:865 #: data/ui/multiband_gate.glade:1298 data/ui/multiband_gate.glade:1711 #: data/ui/multiband_gate.glade:2124 msgid "Reduction" msgstr "Snížení" #: data/ui/deesser.glade:972 msgid "Detected" msgstr "Zjištěno" #: data/ui/delay.glade:90 msgid "Delay" msgstr "Zpoždění" #: data/ui/equalizer.glade:44 msgid "Equalizer" msgstr "Ekvalizér" #: data/ui/equalizer.glade:160 msgid "Flat Response" msgstr "Uhladit" #: data/ui/equalizer.glade:175 msgid "Calculate Frequencies" msgstr "Vypočítat Kmitočty" #: data/ui/equalizer.glade:213 msgid "Bands" msgstr "Pásma" #: data/ui/equalizer.glade:269 msgid "IIR" msgstr "IIR" #: data/ui/equalizer.glade:270 msgid "FIR" msgstr "FIR" #: data/ui/equalizer.glade:271 msgid "FFT" msgstr "FFT" #: data/ui/equalizer.glade:304 msgid "Split Channels" msgstr "Rozdělit kanály" #: data/ui/equalizer.glade:389 #, fuzzy msgid "Apply APO Preset" msgstr "APO Přednastavení" #: data/ui/equalizer_band.glade:64 msgid "Bell" msgstr "Zvonek" #: data/ui/equalizer_band.glade:65 msgid "High Pass" msgstr "Horní pásmo" #: data/ui/equalizer_band.glade:66 msgid "High Shelf" msgstr "Horní práh" #: data/ui/equalizer_band.glade:67 msgid "Low Pass" msgstr "Dolní pásmo" #: data/ui/equalizer_band.glade:68 msgid "Low Shelf" msgstr "Dolní práh" #: data/ui/equalizer_band.glade:69 msgid "Notch" msgstr "Vroubek" #: data/ui/equalizer_band.glade:70 data/ui/filter.glade:427 msgid "Resonance" msgstr "Rezonance" #: data/ui/equalizer_band.glade:71 #, fuzzy msgid "All Pass" msgstr "Dolní pásmo" #: data/ui/equalizer_band.glade:96 msgid "RLC (BT)" msgstr "RLC (BT)" #: data/ui/equalizer_band.glade:97 msgid "RLC (MT)" msgstr "RLC (MT)" #: data/ui/equalizer_band.glade:98 msgid "BWC (BT)" msgstr "BWC (BT)" #: data/ui/equalizer_band.glade:99 msgid "BWC (MT)" msgstr "BWC (MT)" #: data/ui/equalizer_band.glade:100 msgid "LRX (BT)" msgstr "LRX (BT)" #: data/ui/equalizer_band.glade:101 msgid "LRX (MT)" msgstr "LRX (MT)" #: data/ui/equalizer_band.glade:102 msgid "APO (DR)" msgstr "APO (DR)" #: data/ui/equalizer_band.glade:115 msgid "Slope" msgstr "Sklon" #: data/ui/equalizer_band.glade:203 msgid "Quality" msgstr "Jakost" #: data/ui/equalizer_band.glade:253 msgid "Width" msgstr "Šířka" #: data/ui/equalizer_band.glade:304 data/ui/multiband_compressor.glade:593 #: data/ui/multiband_compressor.glade:971 #: data/ui/multiband_compressor.glade:1350 #: data/ui/multiband_compressor.glade:1729 data/ui/multiband_gate.glade:617 #: data/ui/multiband_gate.glade:1028 data/ui/multiband_gate.glade:1441 #: data/ui/multiband_gate.glade:1854 msgid "Solo" msgstr "Sólo" #: data/ui/equalizer_preset_row.glade:39 data/ui/irs_row.glade:44 msgid "Apply" msgstr "Použít" #: data/ui/exciter.glade:116 msgid "Exciter" msgstr "Zvukový budič" #: data/ui/exciter.glade:472 data/ui/maximizer.glade:254 msgid "Ceiling" msgstr "Strop" #: data/ui/filter.glade:97 msgid "Filter" msgstr "Filtr" #: data/ui/filter.glade:147 msgid "Muted" msgstr "Ztlumeno" #: data/ui/filter.glade:159 data/ui/reverb.glade:233 msgid "Disco" msgstr "Disko" #: data/ui/filter.glade:171 msgid "Distant Headphones" msgstr "Vzdálená sluchátka" #: data/ui/filter.glade:360 msgid "12dB/oct Lowpass" msgstr "Nízká pásmová propust 12 dB/okt" #: data/ui/filter.glade:361 msgid "24dB/oct Lowpass" msgstr "Nízká pásmová propust 24 dB/okt" #: data/ui/filter.glade:362 msgid "36dB/oct Lowpass" msgstr "Nízká pásmová propust 36 dB/okt" #: data/ui/filter.glade:363 msgid "12dB/oct Highpass" msgstr "Vysoká pásmová propust 12 dB/okt" #: data/ui/filter.glade:364 msgid "24dB/oct Highpass" msgstr "Vysoká pásmová propust 24 dB/okt" #: data/ui/filter.glade:365 msgid "36dB/oct Highpass" msgstr "Vysoká pásmová propust 36 dB/okt" #: data/ui/filter.glade:366 msgid "6dB/oct Bandpass" msgstr "Pásmová propustnost 6 dB/okt" #: data/ui/filter.glade:367 msgid "12dB/oct Bandpass" msgstr "Pásmová propustnost 12 dB/okt" #: data/ui/filter.glade:368 msgid "18dB/oct Bandpass" msgstr "Pásmová propustnost 18 dB/okt" #: data/ui/filter.glade:369 msgid "6dB/oct Bandreject" msgstr "Vyloučení pásma 6 dB/okt" #: data/ui/filter.glade:370 msgid "12dB/oct Bandreject" msgstr "Vyloučení pásma 12 dB/okt" #: data/ui/filter.glade:371 msgid "18dB/oct Bandreject" msgstr "Vyloučení pásma 18 dB/okt" #: data/ui/filter.glade:460 msgid "Inertia" msgstr "Setrvačnost" #: data/ui/general_settings.glade:58 msgid "Start Service at Login" msgstr "Spustit službu při přihlášení" #: data/ui/general_settings.glade:82 msgid "Process All Outputs" msgstr "Zpracovat všechny výstupy" #: data/ui/general_settings.glade:94 msgid "Process All Inputs" msgstr "Zpracovat všechny vstupy" #: data/ui/general_settings.glade:130 msgid "Use Dark Theme" msgstr "Použít tmavý vzhled" #: data/ui/general_settings.glade:158 data/ui/general_settings.glade:220 msgid "Niceness" msgstr "Přívětivost" #: data/ui/general_settings.glade:159 msgid "Real Time" msgstr "Ve skutečném čase" #: data/ui/general_settings.glade:160 msgid "None" msgstr "Žádný" #: data/ui/general_settings.glade:208 msgid "Priority Type" msgstr "Typ přednosti" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "Přednost" #: data/ui/general_settings.glade:244 msgid "Activity Timeout" msgstr "" #: data/ui/general_settings.glade:325 msgid "About" msgstr "O programu" #: data/ui/gate.glade:97 msgid "Gate" msgstr "Brána" #: data/ui/gate.glade:330 #, fuzzy msgid "Maximum Gain Reduction" msgstr "Zmenšení zesílení" #: data/ui/gate.glade:379 msgid "Stereo Link" msgstr "Spojení sterea" #: data/ui/gate.glade:393 msgid "Average" msgstr "Průměr" #: data/ui/gate.glade:394 msgid "Maximum" msgstr "Nejvýše" #: data/ui/gate.glade:632 #, fuzzy msgid "Input Level" msgstr "Omezovač vstupu" #: data/ui/gate.glade:864 data/ui/multiband_gate.glade:911 #: data/ui/multiband_gate.glade:1323 data/ui/multiband_gate.glade:1736 #: data/ui/multiband_gate.glade:2149 msgid "Gating" msgstr "Hradlo" #: data/ui/limiter.glade:96 data/ui/webrtc.glade:612 msgid "Limiter" msgstr "Omezovač" #: data/ui/limiter.glade:266 msgid "Automatic Smoothing Control" msgstr "Automatické Vyhlazení" #: data/ui/limiter.glade:278 msgid "Automatic Leveling" msgstr "Automatické Úrovně" #: data/ui/limiter.glade:308 msgid "Limit" msgstr "Omezení" #: data/ui/limiter.glade:409 msgid "Oversampling" msgstr "Převzorkování" #: data/ui/limiter.glade:447 msgid "ASC" msgstr "ASC" #: data/ui/limiter.glade:595 msgid "Attenuation" msgstr "Tlumení" #: data/ui/loudness.glade:90 msgid "Loudness Compensator" msgstr "Kompenzace Hlasitosti" #: data/ui/loudness.glade:328 msgid "Standard" msgstr "Standardní" #: data/ui/loudness.glade:341 msgid "Flat" msgstr "Rovný" #: data/ui/loudness.glade:342 msgid "ISO226-2003" msgstr "ISO226-2003" #: data/ui/loudness.glade:343 msgid "Fletcher-Munson" msgstr "Fletcher-Munson" #: data/ui/loudness.glade:344 msgid "Robinson-Dadson" msgstr "Robinson-Dadson" #: data/ui/loudness.glade:370 #, fuzzy msgid "FFT Size" msgstr "Rozměry rámečku" #: data/ui/maximizer.glade:95 msgid "Maximizer" msgstr "Zvětšovač" #: data/ui/maximizer.glade:386 msgid "Gain Reduction" msgstr "Zmenšení zesílení" #: data/ui/multiband_compressor.glade:139 msgid "Multiband Compressor" msgstr "Vícepásmový kompresor" #: data/ui/multiband_compressor.glade:426 data/ui/multiband_gate.glade:450 msgid "LR4" msgstr "LR4" #: data/ui/multiband_compressor.glade:427 data/ui/multiband_gate.glade:451 msgid "LR8" msgstr "LR8" #: data/ui/multiband_compressor.glade:441 data/ui/multiband_gate.glade:465 msgid "Split 1/2" msgstr "Rozdělit 1/2" #: data/ui/multiband_compressor.glade:454 data/ui/multiband_gate.glade:478 msgid "Split 2/3" msgstr "Rozdělit 2/3" #: data/ui/multiband_compressor.glade:467 data/ui/multiband_gate.glade:491 msgid "Split 3/4" msgstr "Rozdělit 3/4" #: data/ui/multiband_compressor.glade:854 #: data/ui/multiband_compressor.glade:1232 #: data/ui/multiband_compressor.glade:1611 #: data/ui/multiband_compressor.glade:1990 msgid "Compression" msgstr "Komprese" #: data/ui/multiband_compressor.glade:937 data/ui/multiband_gate.glade:994 msgid "Sub Band" msgstr "Spodní pásmo" #: data/ui/multiband_compressor.glade:1315 data/ui/multiband_gate.glade:1406 msgid "Low Band" msgstr "Nízké pásmo" #: data/ui/multiband_compressor.glade:1694 data/ui/multiband_gate.glade:1819 msgid "Mid Band" msgstr "Střední pásmo" #: data/ui/multiband_compressor.glade:2073 data/ui/multiband_gate.glade:2232 msgid "High Band" msgstr "Vysoké pásmo" #: data/ui/multiband_gate.glade:139 msgid "Multiband Gate" msgstr "Vícepásmová brána" #: data/ui/pitch.glade:102 msgid "Pitch" msgstr "Výška tónu" #: data/ui/pitch.glade:270 msgid "Cents" msgstr "Centy" #: data/ui/pitch.glade:300 msgid "Semitones" msgstr "Půltóny" #: data/ui/pitch.glade:330 msgid "Octaves" msgstr "Oktávy" #: data/ui/pitch.glade:360 msgid "Crispness" msgstr "Křehkost" #: data/ui/pitch.glade:402 msgid "Faster" msgstr "Rychleji" #: data/ui/pitch.glade:414 msgid "Preserve Formant" msgstr "Zachovat složku rozhodující o barvě zvuku" #: data/ui/preset_row.glade:55 msgid "Load" msgstr "Načíst" #: data/ui/preset_row.glade:70 msgid "Save current settings to this preset file" msgstr "Uložit nynější nastavení do tohoto souboru s přednastavením" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "Odstranit tento soubor s přednastavením" #: data/ui/preset_row.glade:98 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" "Automaticky použít toto přednastavení, když je nyní používané zařízení " "zapojeno v systému" #: data/ui/presets_menu.glade:81 data/ui/presets_menu.glade:182 #: src/presets_menu_ui.cpp:129 msgid "Import Presets" msgstr "Zavést přednastavení" #: data/ui/pulse_info.glade:77 msgid "Version" msgstr "Verze" #: data/ui/pulse_info.glade:104 msgid "Default Sink" msgstr "Výchozí zeslabení" #: data/ui/pulse_info.glade:116 msgid "Default Source" msgstr "Výchozí zdroj" #: data/ui/pulse_info.glade:158 msgid "Protocol" msgstr "Protokol" #: data/ui/pulse_info.glade:185 msgid "Default Sample Format" msgstr "Výchozí formát vzorku" #: data/ui/pulse_info.glade:212 msgid "Default Sampling Rate" msgstr "Výchozí rychlost vzorkování" #: data/ui/pulse_info.glade:266 msgid "Channel Mapping" msgstr "Přiřazení kanálu" #: data/ui/pulse_info.glade:291 msgid "Server" msgstr "Server" #: data/ui/pulse_info.glade:336 msgid "Modules" msgstr "Moduly" #: data/ui/pulse_info.glade:382 msgid "Clients" msgstr "Klienti" #: data/ui/pulse_info.glade:446 msgid "File" msgstr "Soubor" #: data/ui/pulse_info.glade:456 msgid "Configuration" msgstr "Nastavení" #: data/ui/pulse_info.glade:489 msgid "Resamplers" msgstr "Převzorkovače" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:403 msgid "Use Default" msgstr "Použít Výchozí" #: data/ui/pulse_settings.glade:147 data/ui/pulse_settings.glade:452 msgid "Pipeline Input" msgstr "" #: data/ui/pulse_settings.glade:247 data/ui/pulse_settings.glade:552 #, fuzzy msgid "Pipeline Output" msgstr "Ekvalizér - výstup" #: data/ui/pulse_settings.glade:347 data/ui/pulse_settings.glade:652 msgid "Block Size" msgstr "Velikost Bloku" #: data/ui/reverb.glade:130 msgid "Reverberation" msgstr "Dozvuk" #: data/ui/reverb.glade:181 msgid "Ambience" msgstr "Okolní prostředí" #: data/ui/reverb.glade:194 msgid "Empty Walls" msgstr "Prázdné zdi" #: data/ui/reverb.glade:207 msgid "Room" msgstr "Pokoj" #: data/ui/reverb.glade:220 msgid "Large Empty Hall" msgstr "Velký prázdný sál" #: data/ui/reverb.glade:246 msgid "Large Occupied Hall" msgstr "Velký obsazený sál" #: data/ui/reverb.glade:453 msgid "Pre Delay" msgstr "Předzpoždění" #: data/ui/reverb.glade:465 msgid "Decay Time" msgstr "Čas dozvuku" #: data/ui/reverb.glade:531 msgid "Dry" msgstr "Zkušební" #: data/ui/reverb.glade:563 msgid "Bass Cut" msgstr "Ořezání hloubek" #: data/ui/reverb.glade:615 msgid "Treble Cut" msgstr "Ořezání výšek" #: data/ui/reverb.glade:660 msgid "Diffusion" msgstr "Rozptylování" #: data/ui/reverb.glade:672 msgid "Room Size" msgstr "Velikost prostoru" #: data/ui/reverb.glade:684 msgid "Small" msgstr "Malý" #: data/ui/reverb.glade:685 msgid "Medium" msgstr "Střední" #: data/ui/reverb.glade:686 msgid "Large" msgstr "Velký" #: data/ui/reverb.glade:687 msgid "Tunnel" msgstr "Chodba" #: data/ui/reverb.glade:688 msgid "Large/smooth" msgstr "Velký/plynulý" #: data/ui/reverb.glade:689 msgid "Experimental" msgstr "Pokusný" #: data/ui/reverb.glade:702 msgid "High Frequency Damping" msgstr "Tlumení vysokého kmitočtu" #: data/ui/spectrum_settings.glade:77 msgid "Show Spectrum" msgstr "Ukázat spektrum" #: data/ui/spectrum_settings.glade:89 msgid "Fill" msgstr "Výplň" #: data/ui/spectrum_settings.glade:125 msgid "Border" msgstr "Okraj" #: data/ui/spectrum_settings.glade:149 msgid "Use Custom Color" msgstr "Použít vlastní barvu" #: data/ui/spectrum_settings.glade:173 msgid "Use Gradient" msgstr "Použít přechod" #: data/ui/spectrum_settings.glade:315 msgid "Points" msgstr "Body" #: data/ui/spectrum_settings.glade:327 msgid "Height" msgstr "Výška" #: data/ui/spectrum_settings.glade:339 msgid "Line Width" msgstr "Šířka čáry" #: data/ui/spectrum_settings.glade:351 msgid "Sampling" msgstr "Vzorkování" #: data/ui/spectrum_settings.glade:363 #, fuzzy msgid "Minimum Frequency" msgstr "Minimální Kmitočet" #: data/ui/spectrum_settings.glade:375 #, fuzzy msgid "Maximum Frequency" msgstr "Maximální Kmitočet" #: data/ui/spectrum_settings.glade:410 msgid "Spectrum Type" msgstr "Typ spektra" #: data/ui/spectrum_settings.glade:423 msgid "Bars" msgstr "Pruhy" #: data/ui/spectrum_settings.glade:424 msgid "Lines" msgstr "Čáry" #: data/ui/spectrum_settings.glade:437 msgid "Spectrum Color" msgstr "Barva spektra" #: data/ui/spectrum_settings.glade:449 msgid "Gradient Color" msgstr "Barva přechodu" #: data/ui/spectrum_settings.glade:461 msgid "Axis Color" msgstr "" #: data/ui/stereo_tools.glade:108 msgid "Stereo Tools" msgstr "Nástroje sterea" #: data/ui/stereo_tools.glade:334 data/ui/stereo_tools.glade:775 msgid "Balance" msgstr "Vyvážení" #: data/ui/stereo_tools.glade:365 msgid "S/C Level" msgstr "Úroveň S/C" #: data/ui/stereo_tools.glade:406 msgid "Softclip" msgstr "Softclip" #: data/ui/stereo_tools.glade:452 msgid "Side Level" msgstr "Postranní úroveň" #: data/ui/stereo_tools.glade:503 msgid "Side Balance" msgstr "Postranní vyvážení" #: data/ui/stereo_tools.glade:535 msgid "Middle Level" msgstr "Prostřední úroveň" #: data/ui/stereo_tools.glade:547 msgid "Middle Panorama" msgstr "Prostřední panorama" #: data/ui/stereo_tools.glade:604 msgid "LR > LR (Stereo Default)" msgstr "LP > LP (výchozí stereo)" #: data/ui/stereo_tools.glade:605 msgid "LR > MS (Stereo to Mid-Side)" msgstr "LP > SS (stereo ke střední straně)" #: data/ui/stereo_tools.glade:606 msgid "MS > LR (Mid-Side to Stereo)" msgstr "SS > LP (střední strana ke stereu)" #: data/ui/stereo_tools.glade:607 msgid "LR > LL (Mono Left Channel)" msgstr "LP > LL (mono levý kanál)" #: data/ui/stereo_tools.glade:608 msgid "LR > RR (Mono Right Channel)" msgstr "LP > PP (mono pravý kanál)" #: data/ui/stereo_tools.glade:609 msgid "LR > L+R (Mono Sum L+R)" msgstr "LP > L+P (mono součet L+P)" #: data/ui/stereo_tools.glade:610 msgid "LR > RL (Stereo Flip Channels)" msgstr "LR > RL (stereo obrácení kanálů)" #: data/ui/stereo_tools.glade:627 msgid "Stereo Matrix" msgstr "Matrice sterea" #: data/ui/stereo_tools.glade:668 data/ui/stereo_tools.glade:709 msgid "Invert Phase" msgstr "Obrátit fázi" #: data/ui/stereo_tools.glade:806 msgid "Delay L/R" msgstr "Zpoždění L/P" #: data/ui/stereo_tools.glade:839 msgid "Stereo Base" msgstr "Základ sterea" #: data/ui/stereo_tools.glade:871 msgid "Stereo Phase" msgstr "Fáze sterea" #: data/ui/webrtc.glade:96 msgid "WebRTC" msgstr "WebRTC" #: data/ui/webrtc.glade:256 data/ui/webrtc.glade:389 data/ui/webrtc.glade:460 #: data/ui/webrtc.glade:648 msgid "Enable" msgstr "Povolit" #: data/ui/webrtc.glade:279 msgid "Extended Filter" msgstr "Rozšířený filtr" #: data/ui/webrtc.glade:292 msgid "High Pass Filter" msgstr "Vysokopásmový filtr" #: data/ui/webrtc.glade:309 data/ui/webrtc.glade:425 data/ui/webrtc.glade:698 msgid "Low" msgstr "Nízký" #: data/ui/webrtc.glade:310 data/ui/webrtc.glade:426 data/ui/webrtc.glade:699 msgid "Moderate" msgstr "Střední" #: data/ui/webrtc.glade:311 data/ui/webrtc.glade:427 data/ui/webrtc.glade:700 msgid "High" msgstr "Vysoký" #: data/ui/webrtc.glade:324 data/ui/webrtc.glade:412 #, fuzzy msgid "Suppression Level" msgstr "Úroveň potlačení" #: data/ui/webrtc.glade:361 msgid "Delay Agnostic" msgstr "Zpozdit absolutní" #: data/ui/webrtc.glade:375 msgid "Echo Canceller" msgstr "Potlačovač echa" #: data/ui/webrtc.glade:428 msgid "Very High" msgstr "Velmi vysoký" #: data/ui/webrtc.glade:445 msgid "Noise Suppressor" msgstr "Potlačovač šumu" #: data/ui/webrtc.glade:496 msgid "Adaptive Digital" msgstr "Přizpůsobivý digitální" #: data/ui/webrtc.glade:497 msgid "Fixed Digital" msgstr "Pevný digitální" #: data/ui/webrtc.glade:514 msgid "Gain Controller" msgstr "Ovladač zesílení" #: data/ui/webrtc.glade:540 msgid "Target Level" msgstr "Úroveň cíle" #: data/ui/webrtc.glade:572 msgid "Maximum Gain" msgstr "Největší zesílení" #: data/ui/webrtc.glade:672 msgid "Detection Likelihood" msgstr "Pravděpodobnost zjištění" #: data/ui/webrtc.glade:684 msgid "Frame Size" msgstr "Rozměry rámečku" #: data/ui/webrtc.glade:697 msgid "Very Low" msgstr "Velmi nízká" #: data/ui/webrtc.glade:737 msgid "Voice Detector" msgstr "Zjišťovatel hlasu" #: data/ui/rnnoise.glade:90 #, fuzzy msgid "Noise Reduction" msgstr "Zmenšení zesílení" #: data/ui/rnnoise.glade:242 #, fuzzy msgid "Import Model" msgstr "Zavést impuls" #: data/ui/rnnoise.glade:246 #, fuzzy msgid "Import Model File" msgstr "Zavést soubor s impulsem" #: data/ui/rnnoise.glade:311 #, fuzzy msgid "Active Model" msgstr "Agresivní režim" #: data/ui/rnnoise.glade:324 msgid "Standard RNNoise Model" msgstr "" #: src/app_info_ui.cpp:120 msgid "paused" msgstr "Pozastaveno" #: src/app_info_ui.cpp:122 msgid "playing" msgstr "Přehrává se" #: src/application.cpp:38 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "Ukončit PulseEffects. Užitečné, když běži ve služebním režimu." #: src/application.cpp:40 msgid "Show available presets." msgstr "Ukázat dostupná přednastavení." #: src/application.cpp:43 msgid "Load a preset. Example: pulseeffects -l music" msgstr "Nahrát přednastavení. Příklad: pulseeffects -l music" #: src/application.cpp:45 msgid "Reset PulseEffects." msgstr "Vynulovat PulseEffects." #: src/application.cpp:48 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "Globální propuštění. 1 pro zapnutí, 2 pro vypnutí, 3 pro získání stavu" #: src/application.cpp:50 msgid "Hide the Window." msgstr "Skrýt Okno" #: src/application.cpp:284 msgid "Output Presets: " msgstr "Výstupní přednastavení:" #: src/application.cpp:292 msgid "Input Presets: " msgstr "Vstupní přednastavení:" #: src/blocklist_settings_ui.cpp:191 msgid "Blocklist" msgstr "Černá listina" #: src/calibration_ui.cpp:198 msgid "Calibration Microphone" msgstr "Kalibrace mikrofonu" #: src/convolver_ui.cpp:281 msgid "Import Impulse File" msgstr "Zavést soubor s impulsem" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Open" msgstr "Otevřít" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Cancel" msgstr "Zrušit" #: src/convolver_ui.cpp:318 src/convolver_ui.cpp:319 src/convolver_ui.cpp:321 msgid "Failed" msgstr "Nepodařilo se" #: src/convolver_ui.cpp:323 msgid "Could Not Load The Impulse File" msgstr "Nepodařilo se nahrát soubor s impulsem" #: src/equalizer_ui.cpp:380 msgid "infinity" msgstr "nekonečno" #: src/equalizer_ui.cpp:738 #, fuzzy msgid "Import APO Preset File" msgstr "Zavést APO přednastavení" #: src/equalizer_ui.cpp:743 #, fuzzy msgid "APO Presets" msgstr "APO Přednastavení" #: src/general_settings_ui.cpp:149 msgid "General" msgstr "Obecné" #: src/pulse_settings_ui.cpp:168 msgid "Pulseaudio" msgstr "Pulseaudio" #~ msgid "Import APO Presets" #~ msgstr "Zavést APO Přednastavení" #~ msgid "Reference Signal" #~ msgstr "Referenční Signál" #~ msgid "Input Gain" #~ msgstr "Vstupní zesílení" #, fuzzy #~ msgid "Output Gain" #~ msgstr "Vstupní zesílení" #, fuzzy #~ msgid "Gain Detection" #~ msgstr "Zmenšení zesílení" #~ msgid "Scale" #~ msgstr "Měřítko" #~ msgid "Exponent" #~ msgstr "Exponent" easyeffects-4.8.7/po/de.po000066400000000000000000001247071424023573300154170ustar00rootroot00000000000000# German translation for Pulseeffects. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PulseEffects package. # Bleuzen , 2017. # msgid "" msgstr "" "Project-Id-Version: PulseEffects\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-14 23:58+0100\n" "PO-Revision-Date: 2020-01-12 17:49+0100\n" "Last-Translator: David Keller \n" "Language-Team: \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 data/ui/application.glade:61 msgid "PulseEffects" msgstr "PulseEffects" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Audio Effekte für Pulseaudio Anwendungen" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Wellington Wallace" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects ist ein Audio-Manipulations-Tool. Es enthält einen Equalizer, " "Limiter, Kompressor, Hall und ein Spektrumanalysator." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "Da PulseEffects den Standard PulseAudio Sound Server benutzt, funktioniert " "es mit so ziemlich allen Anwendungen. Alle unterstützten Anwendungen werden " "im Hauptfenster angezeigt, wo alle individuell Ein-/Ausgeschaltet werden " "können." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Neben der Sound Manipulation des Ausgangs, kann PulseEffects auch Effekte " "auf Eingabegeräte, z.B. Mikrofone, anwenden. Dies ist sinnvoll für z.B. " "Audioaufnahmen oder VOIP Anwendungen." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "Wenn PulseEffects startet, stellt es die Konfiguration der letzten Sitzung " "wieder her. Es ist auch möglich, die aktuellen Einstellungen als Profil / " "Preset in einer Datei zu speichern." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "Einstellen der Lautstärke und Ein-/Ausschalten von Effekten" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "Enthält einen Equalizer mit integrierten Presets" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Eingabe-Limiter" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:52 #: data/ui/compressor.glade:110 data/ui/compressor.glade:589 #: data/ui/webrtc.glade:633 msgid "Compressor" msgstr "Kompressor" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Kalibrierung" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "Equalizer, Kompressor und andere Audioeffekte" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "Limiter;Kompressor;Hall;Equalizer;Autovolumen;" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:44 #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:47 msgid "\"Presets\"" msgstr "\"Presets\"" #: data/ui/about.glade.in:11 msgid "Audio effects for PulseAudio applications" msgstr "Audioeffekte für Pulseaudio-Anwendungen" #: data/ui/app_button_row.glade:49 msgid "Applications" msgstr "Anwendungen" #: data/ui/app_info.glade:203 #, fuzzy msgid "Add to Blocklist" msgstr "Sperrliste" #: data/ui/app_info.glade:239 msgid "Format" msgstr "Format" #: data/ui/app_info.glade:264 data/ui/convolver.glade:348 msgid "Rate" msgstr "Rate" #: data/ui/app_info.glade:289 data/ui/pulse_info.glade:239 #: data/ui/stereo_tools.glade:756 msgid "Channels" msgstr "Kanäle" #: data/ui/app_info.glade:314 msgid "Resampler" msgstr "Resampler" #: data/ui/app_info.glade:339 data/ui/pulse_settings.glade:159 #: data/ui/pulse_settings.glade:259 data/ui/pulse_settings.glade:464 #: data/ui/pulse_settings.glade:564 msgid "Buffer" msgstr "Puffer" #: data/ui/app_info.glade:364 data/ui/pulse_settings.glade:190 #: data/ui/pulse_settings.glade:290 data/ui/pulse_settings.glade:476 #: data/ui/pulse_settings.glade:576 msgid "Latency" msgstr "Latenz" #: data/ui/app_info.glade:389 msgid "State" msgstr "Status" #: data/ui/application.glade:142 src/calibration_ui.cpp:64 #: src/calibration_ui.cpp:191 msgid "Test Signals" msgstr "Testsignale" #: data/ui/application.glade:157 msgid "Global Bypass" msgstr "Globale Umleitung" #: data/ui/application.glade:172 data/ui/equalizer.glade:331 #: data/ui/general_settings.glade:289 msgid "Settings" msgstr "Einstellungen" #: data/ui/application.glade:194 msgid "Help" msgstr "Hilfe" #: data/ui/application.glade:217 data/ui/crossfeed.glade:240 #: data/ui/equalizer.glade:403 data/ui/filter.glade:344 #: data/ui/reverb.glade:401 src/presets_menu_ui.cpp:133 #: src/presets_menu_ui.cpp:285 src/presets_menu_ui.cpp:286 #: src/presets_menu_ui.cpp:303 src/presets_menu_ui.cpp:304 msgid "Presets" msgstr "Presets" #: data/ui/autogain.glade:90 msgid "Auto Gain" msgstr "Automatische Verstärkungsregelung" #: data/ui/autogain.glade:161 data/ui/bass_enhancer.glade:167 #: data/ui/compressor.glade:214 data/ui/convolver.glade:218 #: data/ui/crossfeed.glade:136 data/ui/crystalizer.glade:134 #: data/ui/deesser.glade:182 data/ui/delay.glade:144 #: data/ui/equalizer.glade:450 data/ui/equalizer_band.glade:187 #: data/ui/equalizer_band.glade:230 data/ui/exciter.glade:167 #: data/ui/filter.glade:243 data/ui/general_settings.glade:298 #: data/ui/gate.glade:172 data/ui/limiter.glade:166 data/ui/loudness.glade:174 #: data/ui/maximizer.glade:139 data/ui/multiband_compressor.glade:307 #: data/ui/multiband_gate.glade:331 data/ui/pitch.glade:158 #: data/ui/reverb.glade:299 data/ui/stereo_tools.glade:194 #: data/ui/webrtc.glade:141 data/ui/rnnoise.glade:139 msgid "Reset" msgstr "Zurücksetzen" #: data/ui/autogain.glade:185 data/ui/rnnoise.glade:163 msgid "Based on" msgstr "" #: data/ui/autogain.glade:262 msgid "Reset History" msgstr "Verlauf löschen" #: data/ui/autogain.glade:274 msgid "Detect Silence" msgstr "Stille erkennen" #: data/ui/autogain.glade:286 msgid "Use Geometric Mean" msgstr "Geometrisches Mittel nutzen" #: data/ui/autogain.glade:325 msgid "Target" msgstr "Ziel" #: data/ui/autogain.glade:374 data/ui/autogain.glade:779 msgid "Momentary" msgstr "Momentan" #: data/ui/autogain.glade:434 msgid "Weights" msgstr "Gewichte" #: data/ui/autogain.glade:448 data/ui/autogain.glade:792 msgid "Short Term" msgstr "Kurzfristig" #: data/ui/autogain.glade:497 data/ui/autogain.glade:805 msgid "Integrated" msgstr "Integriert" #: data/ui/autogain.glade:564 data/ui/autogain.glade:1076 #: data/ui/bass_enhancer.glade:596 data/ui/compressor.glade:1086 #: data/ui/convolver.glade:575 data/ui/crossfeed.glade:391 #: data/ui/crystalizer.glade:250 data/ui/deesser.glade:783 #: data/ui/delay.glade:328 data/ui/equalizer.glade:682 #: data/ui/exciter.glade:596 data/ui/filter.glade:508 data/ui/gate.glade:689 #: data/ui/limiter.glade:501 data/ui/loudness.glade:238 #: data/ui/loudness.glade:431 data/ui/maximizer.glade:358 #: data/ui/multiband_compressor.glade:2103 data/ui/multiband_gate.glade:2262 #: data/ui/pitch.glade:450 data/ui/presets_menu.glade:238 #: data/ui/reverb.glade:753 data/ui/stereo_tools.glade:427 #: data/ui/stereo_tools.glade:931 data/ui/webrtc.glade:780 #: data/ui/rnnoise.glade:362 msgid "Input" msgstr "Eingang" #: data/ui/autogain.glade:577 data/ui/autogain.glade:1020 #: data/ui/bass_enhancer.glade:625 data/ui/compressor.glade:1099 #: data/ui/convolver.glade:588 data/ui/crossfeed.glade:405 #: data/ui/crystalizer.glade:263 data/ui/deesser.glade:797 #: data/ui/delay.glade:341 data/ui/equalizer.glade:695 #: data/ui/exciter.glade:625 data/ui/filter.glade:521 data/ui/gate.glade:703 #: data/ui/limiter.glade:636 data/ui/loudness.glade:271 #: data/ui/loudness.glade:445 data/ui/maximizer.glade:372 #: data/ui/multiband_compressor.glade:894 #: data/ui/multiband_compressor.glade:1272 #: data/ui/multiband_compressor.glade:1651 #: data/ui/multiband_compressor.glade:2030 #: data/ui/multiband_compressor.glade:2116 data/ui/multiband_gate.glade:951 #: data/ui/multiband_gate.glade:1363 data/ui/multiband_gate.glade:1776 #: data/ui/multiband_gate.glade:2189 data/ui/multiband_gate.glade:2275 #: data/ui/pitch.glade:463 data/ui/presets_menu.glade:137 #: data/ui/reverb.glade:766 data/ui/stereo_tools.glade:901 #: data/ui/stereo_tools.glade:944 data/ui/webrtc.glade:794 #: data/ui/rnnoise.glade:375 msgid "Output" msgstr "Ausgang" #: data/ui/autogain.glade:899 msgid "Relative" msgstr "Relativ" #: data/ui/autogain.glade:912 data/ui/compressor.glade:1262 msgid "Gain" msgstr "Verstärkung" #: data/ui/autogain.glade:980 msgid "Loudness" msgstr "Lautstärke" #: data/ui/autogain.glade:1034 msgid "Range" msgstr "Umfang" #: data/ui/bass_enhancer.glade:116 msgid "Bass Enhancer" msgstr "Bassverstärker" #: data/ui/bass_enhancer.glade:191 data/ui/compressor.glade:238 #: data/ui/crossfeed.glade:160 data/ui/deesser.glade:206 #: data/ui/delay.glade:168 data/ui/equalizer.glade:474 #: data/ui/exciter.glade:191 data/ui/filter.glade:267 data/ui/gate.glade:196 #: data/ui/limiter.glade:190 data/ui/loudness.glade:143 #: data/ui/maximizer.glade:163 data/ui/multiband_compressor.glade:331 #: data/ui/multiband_gate.glade:355 data/ui/pitch.glade:182 #: data/ui/reverb.glade:323 data/ui/stereo_tools.glade:218 #: data/ui/webrtc.glade:165 msgid "Provided by" msgstr "" #: data/ui/bass_enhancer.glade:259 data/ui/compressor.glade:602 #: data/ui/deesser.glade:274 data/ui/exciter.glade:259 msgid "Listen" msgstr "Zuhören" #: data/ui/bass_enhancer.glade:302 data/ui/exciter.glade:303 msgid "3rd" msgstr "Dritte" #: data/ui/bass_enhancer.glade:315 data/ui/exciter.glade:316 msgid "2nd" msgstr "Zweite" #: data/ui/bass_enhancer.glade:327 data/ui/exciter.glade:328 msgid "Blend Harmonics" msgstr "Oberwellen mischen" #: data/ui/bass_enhancer.glade:355 data/ui/exciter.glade:357 #: data/ui/reverb.glade:498 msgid "Amount" msgstr "Betrag" #: data/ui/bass_enhancer.glade:367 data/ui/bass_enhancer.glade:504 #: data/ui/exciter.glade:369 data/ui/exciter.glade:504 msgid "Harmonics" msgstr "Obertöne" #: data/ui/bass_enhancer.glade:379 data/ui/exciter.glade:381 msgid "Scope" msgstr "Bereich" #: data/ui/bass_enhancer.glade:472 msgid "Floor" msgstr "Boden" #: data/ui/blocklist_settings.glade:52 data/ui/blocklist_settings.glade:155 #: data/ui/presets_menu.glade:65 data/ui/presets_menu.glade:166 msgid "Create Preset" msgstr "Preset erstellen" #: data/ui/blocklist_settings.glade:68 data/ui/blocklist_settings.glade:171 #: data/ui/presets_menu.glade:52 data/ui/presets_menu.glade:153 #: data/ui/pulse_info.glade:50 msgid "Name" msgstr "Name" #: data/ui/blocklist_settings.glade:81 msgid "Reconnect the microphone to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:139 data/ui/pulse_settings.glade:383 msgid "Input Effects" msgstr "Eingangseffekte" #: data/ui/blocklist_settings.glade:230 msgid "Restart the player to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:242 data/ui/pulse_settings.glade:688 msgid "Output Effects" msgstr "Ausgabeeffekte" #: data/ui/blocklist_settings.glade:265 msgid "Show Blocklisted Apps in Main Tab" msgstr "" #: data/ui/calibration_signals.glade:32 msgid "Sine" msgstr "Sinus" #: data/ui/calibration_signals.glade:33 msgid "Square" msgstr "Rechteck" #: data/ui/calibration_signals.glade:34 msgid "Saw" msgstr "Sägezahn" #: data/ui/calibration_signals.glade:35 msgid "Triangle" msgstr "Dreieck" #: data/ui/calibration_signals.glade:36 msgid "Silence" msgstr "Ruhe" #: data/ui/calibration_signals.glade:37 msgid "White Noise" msgstr "Weißes Rauschen" #: data/ui/calibration_signals.glade:38 msgid "Pink Noise" msgstr "Rosa Rauschen" #: data/ui/calibration_signals.glade:39 msgid "Sine Table" msgstr "Sinustabelle" #: data/ui/calibration_signals.glade:40 msgid "Ticks" msgstr "Ticken" #: data/ui/calibration_signals.glade:41 msgid "Gaussian Noise" msgstr "Gaußsches Rauschen" #: data/ui/calibration_signals.glade:42 msgid "Red Noise" msgstr "Rotes Rauschen" #: data/ui/calibration_signals.glade:43 msgid "Blue Noise" msgstr "Blaues Rauschen" #: data/ui/calibration_signals.glade:44 msgid "Violet Noise" msgstr "Violettes Rauschen" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Lautstärke" #: data/ui/calibration_signals.glade:135 data/ui/equalizer_band.glade:158 #: data/ui/filter.glade:394 msgid "Frequency" msgstr "Frequenz" #: data/ui/calibration_mic.glade:33 msgid "Window" msgstr "Fenster" #: data/ui/calibration_mic.glade:90 msgid "Measure Noise" msgstr "Rauschen messen" #: data/ui/calibration_mic.glade:119 msgid "Subtract Noise" msgstr "Rauschen reduzieren" #: data/ui/compressor.glade:386 data/ui/deesser.glade:436 #: data/ui/gate.glade:498 data/ui/maximizer.glade:242 #: data/ui/multiband_compressor.glade:707 #: data/ui/multiband_compressor.glade:1085 #: data/ui/multiband_compressor.glade:1464 #: data/ui/multiband_compressor.glade:1843 data/ui/multiband_gate.glade:731 #: data/ui/multiband_gate.glade:1142 data/ui/multiband_gate.glade:1555 #: data/ui/multiband_gate.glade:1968 msgid "Threshold" msgstr "Schwelle" #: data/ui/compressor.glade:420 data/ui/deesser.glade:448 #: data/ui/gate.glade:532 data/ui/multiband_compressor.glade:741 #: data/ui/multiband_compressor.glade:1119 #: data/ui/multiband_compressor.glade:1498 #: data/ui/multiband_compressor.glade:1877 data/ui/multiband_gate.glade:765 #: data/ui/multiband_gate.glade:1176 data/ui/multiband_gate.glade:1589 #: data/ui/multiband_gate.glade:2002 msgid "Ratio" msgstr "Verhältnis" #: data/ui/compressor.glade:452 data/ui/gate.glade:564 #: data/ui/multiband_compressor.glade:773 #: data/ui/multiband_compressor.glade:1151 #: data/ui/multiband_compressor.glade:1530 #: data/ui/multiband_compressor.glade:1909 data/ui/multiband_gate.glade:797 #: data/ui/multiband_gate.glade:1208 data/ui/multiband_gate.glade:1621 #: data/ui/multiband_gate.glade:2034 msgid "Knee" msgstr "Übergang" #: data/ui/compressor.glade:486 data/ui/deesser.glade:532 #: data/ui/gate.glade:598 data/ui/multiband_compressor.glade:807 #: data/ui/multiband_compressor.glade:1185 #: data/ui/multiband_compressor.glade:1564 #: data/ui/multiband_compressor.glade:1943 data/ui/multiband_gate.glade:831 #: data/ui/multiband_gate.glade:1242 data/ui/multiband_gate.glade:1655 #: data/ui/multiband_gate.glade:2068 msgid "Makeup" msgstr "Hebung" #: data/ui/compressor.glade:520 data/ui/gate.glade:464 #: data/ui/limiter.glade:363 data/ui/maximizer.glade:266 #: data/ui/multiband_compressor.glade:673 #: data/ui/multiband_compressor.glade:1051 #: data/ui/multiband_compressor.glade:1430 #: data/ui/multiband_compressor.glade:1809 data/ui/multiband_gate.glade:697 #: data/ui/multiband_gate.glade:1108 data/ui/multiband_gate.glade:1521 #: data/ui/multiband_gate.glade:1934 msgid "Release" msgstr "Ausklingzeit" #: data/ui/compressor.glade:532 data/ui/gate.glade:430 #: data/ui/multiband_compressor.glade:639 #: data/ui/multiband_compressor.glade:1017 #: data/ui/multiband_compressor.glade:1396 #: data/ui/multiband_compressor.glade:1775 data/ui/multiband_gate.glade:663 #: data/ui/multiband_gate.glade:1074 data/ui/multiband_gate.glade:1487 #: data/ui/multiband_gate.glade:1900 msgid "Attack" msgstr "Anstiegszeit" #: data/ui/compressor.glade:559 msgid "Downward" msgstr "Abwärts" #: data/ui/compressor.glade:560 msgid "Upward" msgstr "Aufwärts" #: data/ui/compressor.glade:573 msgid "Compression Mode" msgstr "Kompressionsmodus" #: data/ui/compressor.glade:649 msgid "Pre-amplification" msgstr "Vorverstärkung" #: data/ui/compressor.glade:683 msgid "Reactivity" msgstr "Reaktivität" #: data/ui/compressor.glade:716 data/ui/limiter.glade:375 msgid "Lookahead" msgstr "Ausblick" #: data/ui/compressor.glade:730 msgid "Feed-forward" msgstr "Feedforward" #: data/ui/compressor.glade:731 msgid "Feed-back" msgstr "Feedback" #: data/ui/compressor.glade:744 data/ui/equalizer_band.glade:51 msgid "Type" msgstr "Typ" #: data/ui/compressor.glade:758 data/ui/deesser.glade:731 #: data/ui/gate.glade:303 data/ui/multiband_compressor.glade:611 #: data/ui/multiband_compressor.glade:989 #: data/ui/multiband_compressor.glade:1368 #: data/ui/multiband_compressor.glade:1747 data/ui/multiband_gate.glade:635 #: data/ui/multiband_gate.glade:1046 data/ui/multiband_gate.glade:1459 #: data/ui/multiband_gate.glade:1872 msgid "Peak" msgstr "Hochpunkt" #: data/ui/compressor.glade:759 data/ui/deesser.glade:730 #: data/ui/gate.glade:302 data/ui/multiband_compressor.glade:610 #: data/ui/multiband_compressor.glade:988 #: data/ui/multiband_compressor.glade:1367 #: data/ui/multiband_compressor.glade:1746 data/ui/multiband_gate.glade:634 #: data/ui/multiband_gate.glade:1045 data/ui/multiband_gate.glade:1458 #: data/ui/multiband_gate.glade:1871 msgid "RMS" msgstr "RMS" #: data/ui/compressor.glade:760 msgid "Low-Pass" msgstr "Tiefpass" #: data/ui/compressor.glade:761 msgid "Uniform" msgstr "Einheitlich" #: data/ui/compressor.glade:774 data/ui/deesser.glade:702 #: data/ui/equalizer.glade:257 data/ui/equalizer_band.glade:84 #: data/ui/multiband_compressor.glade:412 data/ui/multiband_gate.glade:436 #: data/ui/stereo_tools.glade:591 data/ui/webrtc.glade:483 msgid "Mode" msgstr "Modus" #: data/ui/compressor.glade:788 msgid "Middle" msgstr "Mitte" #: data/ui/compressor.glade:789 msgid "Side" msgstr "Seite" #: data/ui/compressor.glade:790 data/ui/delay.glade:247 #: data/ui/equalizer.glade:612 data/ui/stereo_tools.glade:655 msgid "Left" msgstr "Links" #: data/ui/compressor.glade:791 data/ui/delay.glade:280 #: data/ui/equalizer.glade:654 data/ui/stereo_tools.glade:724 msgid "Right" msgstr "Rechts" #: data/ui/compressor.glade:804 msgid "Source" msgstr "Quelle" #: data/ui/compressor.glade:820 data/ui/compressor.glade:1274 msgid "Sidechain" msgstr "Sidechain" #: data/ui/compressor.glade:925 msgid "Relative Release Threshold" msgstr "" #: data/ui/compressor.glade:937 #, fuzzy msgid "Boost Threshold" msgstr "Schwelle" #: data/ui/compressor.glade:949 #, fuzzy msgid "High-pass Frequency" msgstr "Frequenz zurücksetzen" #: data/ui/compressor.glade:961 #, fuzzy msgid "Low-pass Frequency" msgstr "Frequenz zurücksetzen" #: data/ui/compressor.glade:973 #, fuzzy msgid "High-pass Filter Mode" msgstr "Hochpassfilter" #: data/ui/compressor.glade:985 msgid "Low-pass Filter Mode" msgstr "" #: data/ui/compressor.glade:999 data/ui/compressor.glade:1017 #: data/ui/equalizer_band.glade:63 msgid "Off" msgstr "Aus" #: data/ui/compressor.glade:1000 data/ui/compressor.glade:1018 #, fuzzy msgid "12 dB/oct" msgstr "12dB/okt Tiefpass" #: data/ui/compressor.glade:1001 data/ui/compressor.glade:1019 #, fuzzy msgid "24 dB/oct" msgstr "24dB/okt Tiefpass" #: data/ui/compressor.glade:1002 data/ui/compressor.glade:1020 #, fuzzy msgid "36 dB/oct" msgstr "36dB/okt Tiefpass" #: data/ui/compressor.glade:1043 #, fuzzy msgid "Advanced" msgstr "Einstellungen" #: data/ui/compressor.glade:1347 msgid "Curve" msgstr "Kurve" #: data/ui/convolver.glade:90 msgid "Convolver" msgstr "Convolver" #: data/ui/convolver.glade:125 msgid "Import Impulse" msgstr "Impuls importieren" #: data/ui/convolver.glade:129 msgid "Import Impulse Response File" msgstr "Impulsantwortdatei importieren" #: data/ui/convolver.glade:309 msgid "L" msgstr "L" #: data/ui/convolver.glade:323 msgid "R" msgstr "R" #: data/ui/convolver.glade:390 msgid "Duration" msgstr "Dauer" #: data/ui/convolver.glade:402 msgid "Samples" msgstr "Probenahme" #: data/ui/convolver.glade:435 src/convolver_ui.cpp:285 msgid "Impulse Response" msgstr "Impulsantwort" #: data/ui/convolver.glade:458 msgid "Select the impulse Response File" msgstr "Auswahl der Impulsantwortdatei" #: data/ui/convolver.glade:477 src/spectrum_settings_ui.cpp:195 msgid "Spectrum" msgstr "Spektrum" #: data/ui/convolver.glade:520 msgid "Stereo Width" msgstr "Stereo-Breite" #: data/ui/crossfeed.glade:104 msgid "Crossfeed" msgstr "Crossfeed" #: data/ui/crossfeed.glade:254 msgid "Jmeier" msgstr "Jmeier" #: data/ui/crossfeed.glade:266 data/ui/filter.glade:183 #: data/ui/reverb.glade:259 msgid "Default" msgstr "Standard" #: data/ui/crossfeed.glade:278 msgid "Cmoy" msgstr "Cmoy" #: data/ui/crossfeed.glade:308 msgid "Cutoff" msgstr "Abgrenzung" #: data/ui/crossfeed.glade:341 msgid "Feed" msgstr "Speisung" #: data/ui/crystalizer.glade:90 msgid "Crystalizer" msgstr "Crystalizer" #: data/ui/crystalizer.glade:200 msgid "Aggressive Mode" msgstr "Aggressiver Modus" #: data/ui/crystalizer.glade:464 msgid "Before" msgstr "Vorher" #: data/ui/crystalizer.glade:477 msgid "After" msgstr "Nachher" #: data/ui/crystalizer.glade:550 msgid "Loudness Range" msgstr "Lautstärkebereich" #: data/ui/crystalizer_band.glade:28 data/ui/equalizer_band.glade:316 #: data/ui/stereo_tools.glade:680 data/ui/stereo_tools.glade:737 msgid "Mute" msgstr "Stummschalten" #: data/ui/crystalizer_band.glade:40 data/ui/multiband_compressor.glade:580 #: data/ui/multiband_compressor.glade:958 #: data/ui/multiband_compressor.glade:1337 #: data/ui/multiband_compressor.glade:1716 data/ui/multiband_gate.glade:604 #: data/ui/multiband_gate.glade:1015 data/ui/multiband_gate.glade:1428 #: data/ui/multiband_gate.glade:1841 msgid "Bypass" msgstr "Umleitung" #: data/ui/deesser.glade:125 msgid "Deesser" msgstr "Deesser" #: data/ui/deesser.glade:309 #, fuzzy msgid "F1 Gain" msgstr "Verstärkung" #: data/ui/deesser.glade:321 #, fuzzy msgid "F2 Level" msgstr "Ebene" #: data/ui/deesser.glade:333 #, fuzzy msgid "F2 Peak Q" msgstr "Höchstwert Q" #: data/ui/deesser.glade:424 msgid "Laxity" msgstr "Nachgiebigkeit" #: data/ui/deesser.glade:585 #, fuzzy msgid "F1 Split" msgstr "Teilen" #: data/ui/deesser.glade:597 #, fuzzy msgid "F2 Peak" msgstr "Hochpunkt" #: data/ui/deesser.glade:690 data/ui/gate.glade:288 msgid "Detection" msgstr "Erkennung" #: data/ui/deesser.glade:715 msgid "Wide" msgstr "Breit" #: data/ui/deesser.glade:716 msgid "Split" msgstr "Teilen" #: data/ui/deesser.glade:959 data/ui/multiband_gate.glade:865 #: data/ui/multiband_gate.glade:1298 data/ui/multiband_gate.glade:1711 #: data/ui/multiband_gate.glade:2124 msgid "Reduction" msgstr "Senkung" #: data/ui/deesser.glade:972 msgid "Detected" msgstr "Erkannt" #: data/ui/delay.glade:90 msgid "Delay" msgstr "Verzögerung" #: data/ui/equalizer.glade:44 msgid "Equalizer" msgstr "Equalizer" #: data/ui/equalizer.glade:160 msgid "Flat Response" msgstr "Glätten" #: data/ui/equalizer.glade:175 msgid "Calculate Frequencies" msgstr "Frequenzen berechnen" #: data/ui/equalizer.glade:213 msgid "Bands" msgstr "Bereiche" #: data/ui/equalizer.glade:269 msgid "IIR" msgstr "IIR" #: data/ui/equalizer.glade:270 msgid "FIR" msgstr "FIR" #: data/ui/equalizer.glade:271 msgid "FFT" msgstr "FFT" #: data/ui/equalizer.glade:304 msgid "Split Channels" msgstr "Kanäle trennen" #: data/ui/equalizer.glade:389 #, fuzzy msgid "Apply APO Preset" msgstr "Presets" #: data/ui/equalizer_band.glade:64 msgid "Bell" msgstr "Glocke" #: data/ui/equalizer_band.glade:65 msgid "High Pass" msgstr "Hochpass" #: data/ui/equalizer_band.glade:66 msgid "High Shelf" msgstr "Höhen-Kuhschwanzfilter" #: data/ui/equalizer_band.glade:67 msgid "Low Pass" msgstr "Tiefpass" #: data/ui/equalizer_band.glade:68 msgid "Low Shelf" msgstr "Tiefen-Kuhschwanzfilter" #: data/ui/equalizer_band.glade:69 msgid "Notch" msgstr "Badewannenfilter" #: data/ui/equalizer_band.glade:70 data/ui/filter.glade:427 msgid "Resonance" msgstr "Resonanz" #: data/ui/equalizer_band.glade:71 #, fuzzy msgid "All Pass" msgstr "Tiefpass" #: data/ui/equalizer_band.glade:96 msgid "RLC (BT)" msgstr "RLC (BT)" #: data/ui/equalizer_band.glade:97 msgid "RLC (MT)" msgstr "RLC (MT)" #: data/ui/equalizer_band.glade:98 msgid "BWC (BT)" msgstr "BWC (BT)" #: data/ui/equalizer_band.glade:99 msgid "BWC (MT)" msgstr "BWC (MT)" #: data/ui/equalizer_band.glade:100 msgid "LRX (BT)" msgstr "LRX (BT)" #: data/ui/equalizer_band.glade:101 msgid "LRX (MT)" msgstr "LRX (MT)" #: data/ui/equalizer_band.glade:102 msgid "APO (DR)" msgstr "APO (DR)" #: data/ui/equalizer_band.glade:115 msgid "Slope" msgstr "Steigung" #: data/ui/equalizer_band.glade:203 msgid "Quality" msgstr "Qualität" #: data/ui/equalizer_band.glade:253 msgid "Width" msgstr "Breite" #: data/ui/equalizer_band.glade:304 data/ui/multiband_compressor.glade:593 #: data/ui/multiband_compressor.glade:971 #: data/ui/multiband_compressor.glade:1350 #: data/ui/multiband_compressor.glade:1729 data/ui/multiband_gate.glade:617 #: data/ui/multiband_gate.glade:1028 data/ui/multiband_gate.glade:1441 #: data/ui/multiband_gate.glade:1854 msgid "Solo" msgstr "Solo" #: data/ui/equalizer_preset_row.glade:39 data/ui/irs_row.glade:44 msgid "Apply" msgstr "Anwenden" #: data/ui/exciter.glade:116 msgid "Exciter" msgstr "Exciter" #: data/ui/exciter.glade:472 data/ui/maximizer.glade:254 msgid "Ceiling" msgstr "Grenze" #: data/ui/filter.glade:97 msgid "Filter" msgstr "Filter" #: data/ui/filter.glade:147 msgid "Muted" msgstr "Stumm" #: data/ui/filter.glade:159 data/ui/reverb.glade:233 msgid "Disco" msgstr "Disco" #: data/ui/filter.glade:171 msgid "Distant Headphones" msgstr "Entfernte Kopfhörer" #: data/ui/filter.glade:360 msgid "12dB/oct Lowpass" msgstr "12dB/okt Tiefpass" #: data/ui/filter.glade:361 msgid "24dB/oct Lowpass" msgstr "24dB/okt Tiefpass" #: data/ui/filter.glade:362 msgid "36dB/oct Lowpass" msgstr "36dB/okt Tiefpass" #: data/ui/filter.glade:363 msgid "12dB/oct Highpass" msgstr "12dB/okt Hochpass" #: data/ui/filter.glade:364 msgid "24dB/oct Highpass" msgstr "24dB/okt Hochpass" #: data/ui/filter.glade:365 msgid "36dB/oct Highpass" msgstr "36dB/okt Hochpass" #: data/ui/filter.glade:366 msgid "6dB/oct Bandpass" msgstr "6dB/okt Bandpass" #: data/ui/filter.glade:367 msgid "12dB/oct Bandpass" msgstr "12dB/okt Bandpass" #: data/ui/filter.glade:368 msgid "18dB/oct Bandpass" msgstr "18dB/okt Bandpass" #: data/ui/filter.glade:369 msgid "6dB/oct Bandreject" msgstr "6dB/okt Bandsperre" #: data/ui/filter.glade:370 msgid "12dB/oct Bandreject" msgstr "12dB/okt Bandsperre" #: data/ui/filter.glade:371 msgid "18dB/oct Bandreject" msgstr "18dB/okt Bandsperre" #: data/ui/filter.glade:460 msgid "Inertia" msgstr "Trägheit" #: data/ui/general_settings.glade:58 msgid "Start Service at Login" msgstr "Dienst beim Login starten" #: data/ui/general_settings.glade:82 msgid "Process All Outputs" msgstr "Alle Ausgänge verarbeiten" #: data/ui/general_settings.glade:94 msgid "Process All Inputs" msgstr "Alle Eingänge verarbeiten" #: data/ui/general_settings.glade:130 msgid "Use Dark Theme" msgstr "Benutze dunkles Thema" #: data/ui/general_settings.glade:158 data/ui/general_settings.glade:220 msgid "Niceness" msgstr "Qualität" #: data/ui/general_settings.glade:159 msgid "Real Time" msgstr "Echtzeit" #: data/ui/general_settings.glade:160 msgid "None" msgstr "Keine" #: data/ui/general_settings.glade:208 msgid "Priority Type" msgstr "Prioritätstyp" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "Priorität" #: data/ui/general_settings.glade:244 msgid "Activity Timeout" msgstr "" #: data/ui/general_settings.glade:325 msgid "About" msgstr "Über" #: data/ui/gate.glade:97 msgid "Gate" msgstr "Gate" #: data/ui/gate.glade:330 #, fuzzy msgid "Maximum Gain Reduction" msgstr "Amplitudenreduktion" #: data/ui/gate.glade:379 msgid "Stereo Link" msgstr "Stereoverbindung" #: data/ui/gate.glade:393 msgid "Average" msgstr "Durchschnitt" #: data/ui/gate.glade:394 msgid "Maximum" msgstr "Maximum" #: data/ui/gate.glade:632 #, fuzzy msgid "Input Level" msgstr "Limiter" #: data/ui/gate.glade:864 data/ui/multiband_gate.glade:911 #: data/ui/multiband_gate.glade:1323 data/ui/multiband_gate.glade:1736 #: data/ui/multiband_gate.glade:2149 msgid "Gating" msgstr "Gating" #: data/ui/limiter.glade:96 data/ui/webrtc.glade:612 msgid "Limiter" msgstr "Limiter" #: data/ui/limiter.glade:266 msgid "Automatic Smoothing Control" msgstr "" #: data/ui/limiter.glade:278 msgid "Automatic Leveling" msgstr "" #: data/ui/limiter.glade:308 msgid "Limit" msgstr "Grenze" #: data/ui/limiter.glade:409 msgid "Oversampling" msgstr "Überabtastung" #: data/ui/limiter.glade:447 msgid "ASC" msgstr "ASC" #: data/ui/limiter.glade:595 msgid "Attenuation" msgstr "Dämpfung" #: data/ui/loudness.glade:90 msgid "Loudness Compensator" msgstr "" #: data/ui/loudness.glade:328 msgid "Standard" msgstr "" #: data/ui/loudness.glade:341 msgid "Flat" msgstr "" #: data/ui/loudness.glade:342 msgid "ISO226-2003" msgstr "" #: data/ui/loudness.glade:343 msgid "Fletcher-Munson" msgstr "" #: data/ui/loudness.glade:344 msgid "Robinson-Dadson" msgstr "" #: data/ui/loudness.glade:370 #, fuzzy msgid "FFT Size" msgstr "Rahmengröße" #: data/ui/maximizer.glade:95 msgid "Maximizer" msgstr "Maximierer" #: data/ui/maximizer.glade:386 msgid "Gain Reduction" msgstr "Amplitudenreduktion" #: data/ui/multiband_compressor.glade:139 msgid "Multiband Compressor" msgstr "Multiband-Kompressor" #: data/ui/multiband_compressor.glade:426 data/ui/multiband_gate.glade:450 msgid "LR4" msgstr "LR4" #: data/ui/multiband_compressor.glade:427 data/ui/multiband_gate.glade:451 msgid "LR8" msgstr "LR8" #: data/ui/multiband_compressor.glade:441 data/ui/multiband_gate.glade:465 msgid "Split 1/2" msgstr "1/2 Teilen" #: data/ui/multiband_compressor.glade:454 data/ui/multiband_gate.glade:478 msgid "Split 2/3" msgstr "2/3 Teilen" #: data/ui/multiband_compressor.glade:467 data/ui/multiband_gate.glade:491 msgid "Split 3/4" msgstr "3/4 Teilen" #: data/ui/multiband_compressor.glade:854 #: data/ui/multiband_compressor.glade:1232 #: data/ui/multiband_compressor.glade:1611 #: data/ui/multiband_compressor.glade:1990 msgid "Compression" msgstr "Kompression" #: data/ui/multiband_compressor.glade:937 data/ui/multiband_gate.glade:994 msgid "Sub Band" msgstr "Subband" #: data/ui/multiband_compressor.glade:1315 data/ui/multiband_gate.glade:1406 msgid "Low Band" msgstr "Tiefband" #: data/ui/multiband_compressor.glade:1694 data/ui/multiband_gate.glade:1819 msgid "Mid Band" msgstr "Mittelband" #: data/ui/multiband_compressor.glade:2073 data/ui/multiband_gate.glade:2232 msgid "High Band" msgstr "Hochband" #: data/ui/multiband_gate.glade:139 msgid "Multiband Gate" msgstr "Multiband Gate" #: data/ui/pitch.glade:102 msgid "Pitch" msgstr "Tonhöhe" #: data/ui/pitch.glade:270 msgid "Cents" msgstr "Cent" #: data/ui/pitch.glade:300 msgid "Semitones" msgstr "Halbtöne" #: data/ui/pitch.glade:330 msgid "Octaves" msgstr "Oktaven" #: data/ui/pitch.glade:360 msgid "Crispness" msgstr "Klarheit" #: data/ui/pitch.glade:402 msgid "Faster" msgstr "Schneller" #: data/ui/pitch.glade:414 msgid "Preserve Formant" msgstr "Formant erhalten" #: data/ui/preset_row.glade:55 msgid "Load" msgstr "" #: data/ui/preset_row.glade:70 msgid "Save current settings to this preset file" msgstr "Aktuelle Einstellungen in dieser Preset-Datei speichern" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "Diese Preset-Datei entfernen" #: data/ui/preset_row.glade:98 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" "Dieses Preset automatisch anwenden, wenn das aktuell verwendete Gerät an das " "System angeschlossen ist" #: data/ui/presets_menu.glade:81 data/ui/presets_menu.glade:182 #: src/presets_menu_ui.cpp:129 msgid "Import Presets" msgstr "Presets importieren" #: data/ui/pulse_info.glade:77 msgid "Version" msgstr "Version" #: data/ui/pulse_info.glade:104 msgid "Default Sink" msgstr "Standard Audiosenke" #: data/ui/pulse_info.glade:116 msgid "Default Source" msgstr "Standard Audioquelle" #: data/ui/pulse_info.glade:158 msgid "Protocol" msgstr "Protokoll" #: data/ui/pulse_info.glade:185 msgid "Default Sample Format" msgstr "Standard Samplingformat" #: data/ui/pulse_info.glade:212 msgid "Default Sampling Rate" msgstr "Standard Samplingrate" #: data/ui/pulse_info.glade:266 msgid "Channel Mapping" msgstr "Kanalzuordnung" #: data/ui/pulse_info.glade:291 msgid "Server" msgstr "Server" #: data/ui/pulse_info.glade:336 msgid "Modules" msgstr "Module" #: data/ui/pulse_info.glade:382 msgid "Clients" msgstr "Clients" #: data/ui/pulse_info.glade:446 msgid "File" msgstr "Datei" #: data/ui/pulse_info.glade:456 msgid "Configuration" msgstr "Konfiguration" #: data/ui/pulse_info.glade:489 msgid "Resamplers" msgstr "Resampler" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:403 msgid "Use Default" msgstr "Vorgabe verwenden" #: data/ui/pulse_settings.glade:147 data/ui/pulse_settings.glade:452 msgid "Pipeline Input" msgstr "Pipeline-Eingang" #: data/ui/pulse_settings.glade:247 data/ui/pulse_settings.glade:552 msgid "Pipeline Output" msgstr "Pipeline-Ausgang" #: data/ui/pulse_settings.glade:347 data/ui/pulse_settings.glade:652 msgid "Block Size" msgstr "Blockgröße" #: data/ui/reverb.glade:130 msgid "Reverberation" msgstr "Nachhall" #: data/ui/reverb.glade:181 msgid "Ambience" msgstr "Atmosphäre" #: data/ui/reverb.glade:194 msgid "Empty Walls" msgstr "Leere Wände" #: data/ui/reverb.glade:207 msgid "Room" msgstr "Raum" #: data/ui/reverb.glade:220 msgid "Large Empty Hall" msgstr "Große leere Halle" #: data/ui/reverb.glade:246 msgid "Large Occupied Hall" msgstr "Große besetzte Halle" #: data/ui/reverb.glade:453 msgid "Pre Delay" msgstr "Vorverzögerung" #: data/ui/reverb.glade:465 msgid "Decay Time" msgstr "Abklingzeit" #: data/ui/reverb.glade:531 msgid "Dry" msgstr "Trocken" #: data/ui/reverb.glade:563 msgid "Bass Cut" msgstr "Bassschnitt" #: data/ui/reverb.glade:615 msgid "Treble Cut" msgstr "Höhenschnitt" #: data/ui/reverb.glade:660 msgid "Diffusion" msgstr "Verbreitung" #: data/ui/reverb.glade:672 msgid "Room Size" msgstr "Raumgröße" #: data/ui/reverb.glade:684 msgid "Small" msgstr "Klein" #: data/ui/reverb.glade:685 msgid "Medium" msgstr "Mittel" #: data/ui/reverb.glade:686 msgid "Large" msgstr "Groß" #: data/ui/reverb.glade:687 msgid "Tunnel" msgstr "Tunnel" #: data/ui/reverb.glade:688 msgid "Large/smooth" msgstr "Groß/sanft" #: data/ui/reverb.glade:689 msgid "Experimental" msgstr "Experimentell" #: data/ui/reverb.glade:702 msgid "High Frequency Damping" msgstr "Hochfrequenz-Dämpfung" #: data/ui/spectrum_settings.glade:77 msgid "Show Spectrum" msgstr "Spektrum anzeigen" #: data/ui/spectrum_settings.glade:89 msgid "Fill" msgstr "Ausfüllen" #: data/ui/spectrum_settings.glade:125 msgid "Border" msgstr "Grenze" #: data/ui/spectrum_settings.glade:149 msgid "Use Custom Color" msgstr "Benutzerdefinierte Farbe benutzen" #: data/ui/spectrum_settings.glade:173 msgid "Use Gradient" msgstr "Farbverlauf nutzen" #: data/ui/spectrum_settings.glade:315 msgid "Points" msgstr "Punkte" #: data/ui/spectrum_settings.glade:327 msgid "Height" msgstr "Höhe" #: data/ui/spectrum_settings.glade:339 msgid "Line Width" msgstr "Linienbreite" #: data/ui/spectrum_settings.glade:351 msgid "Sampling" msgstr "Abtastrate" #: data/ui/spectrum_settings.glade:363 #, fuzzy msgid "Minimum Frequency" msgstr "Frequenz" #: data/ui/spectrum_settings.glade:375 #, fuzzy msgid "Maximum Frequency" msgstr "Frequenz" #: data/ui/spectrum_settings.glade:410 msgid "Spectrum Type" msgstr "Spektrumstyp" #: data/ui/spectrum_settings.glade:423 msgid "Bars" msgstr "Balken" #: data/ui/spectrum_settings.glade:424 msgid "Lines" msgstr "Linien" #: data/ui/spectrum_settings.glade:437 msgid "Spectrum Color" msgstr "Spektrumfarbe" #: data/ui/spectrum_settings.glade:449 msgid "Gradient Color" msgstr "Verlaufsfarbe" #: data/ui/spectrum_settings.glade:461 msgid "Axis Color" msgstr "" #: data/ui/stereo_tools.glade:108 msgid "Stereo Tools" msgstr "Stereowerkzeuge" #: data/ui/stereo_tools.glade:334 data/ui/stereo_tools.glade:775 msgid "Balance" msgstr "Balance" #: data/ui/stereo_tools.glade:365 msgid "S/C Level" msgstr "S/C-Level" #: data/ui/stereo_tools.glade:406 msgid "Softclip" msgstr "Softclip" #: data/ui/stereo_tools.glade:452 msgid "Side Level" msgstr "Seitenebene" #: data/ui/stereo_tools.glade:503 msgid "Side Balance" msgstr "Seitenausgleich" #: data/ui/stereo_tools.glade:535 msgid "Middle Level" msgstr "Mittlere Ebene" #: data/ui/stereo_tools.glade:547 msgid "Middle Panorama" msgstr "Mittleres Panorama" #: data/ui/stereo_tools.glade:604 msgid "LR > LR (Stereo Default)" msgstr "LR > LR (Stereo Standard)" #: data/ui/stereo_tools.glade:605 msgid "LR > MS (Stereo to Mid-Side)" msgstr "LR > MS (Stereo zu Mittelseite)" #: data/ui/stereo_tools.glade:606 msgid "MS > LR (Mid-Side to Stereo)" msgstr "MS > LR (Mittelseite zu Stereo)" #: data/ui/stereo_tools.glade:607 msgid "LR > LL (Mono Left Channel)" msgstr "LR > LL (Linker Monokanal)" #: data/ui/stereo_tools.glade:608 msgid "LR > RR (Mono Right Channel)" msgstr "LR > RR (Rechter Monokanal)" #: data/ui/stereo_tools.glade:609 msgid "LR > L+R (Mono Sum L+R)" msgstr "LR > L+R (Monosumme L+R)" #: data/ui/stereo_tools.glade:610 msgid "LR > RL (Stereo Flip Channels)" msgstr "LR > RL (Stereo Kanäle tauschen)" #: data/ui/stereo_tools.glade:627 msgid "Stereo Matrix" msgstr "Stereo-Matrix" #: data/ui/stereo_tools.glade:668 data/ui/stereo_tools.glade:709 msgid "Invert Phase" msgstr "Phase umkehren" #: data/ui/stereo_tools.glade:806 msgid "Delay L/R" msgstr "Verzögerung L/R" #: data/ui/stereo_tools.glade:839 msgid "Stereo Base" msgstr "Stereo Basis" #: data/ui/stereo_tools.glade:871 msgid "Stereo Phase" msgstr "Stereo Phase" #: data/ui/webrtc.glade:96 msgid "WebRTC" msgstr "" #: data/ui/webrtc.glade:256 data/ui/webrtc.glade:389 data/ui/webrtc.glade:460 #: data/ui/webrtc.glade:648 msgid "Enable" msgstr "Aktivieren" #: data/ui/webrtc.glade:279 msgid "Extended Filter" msgstr "Erweiterter Filter" #: data/ui/webrtc.glade:292 msgid "High Pass Filter" msgstr "Hochpassfilter" #: data/ui/webrtc.glade:309 data/ui/webrtc.glade:425 data/ui/webrtc.glade:698 msgid "Low" msgstr "Tief" #: data/ui/webrtc.glade:310 data/ui/webrtc.glade:426 data/ui/webrtc.glade:699 msgid "Moderate" msgstr "Mäßig" #: data/ui/webrtc.glade:311 data/ui/webrtc.glade:427 data/ui/webrtc.glade:700 msgid "High" msgstr "Hoch" #: data/ui/webrtc.glade:324 data/ui/webrtc.glade:412 #, fuzzy msgid "Suppression Level" msgstr "Unterdrückungsgrad" #: data/ui/webrtc.glade:361 msgid "Delay Agnostic" msgstr "Verzögerungsagnostisch" #: data/ui/webrtc.glade:375 msgid "Echo Canceller" msgstr "Echounterdrückung" #: data/ui/webrtc.glade:428 msgid "Very High" msgstr "Sehr hoch" #: data/ui/webrtc.glade:445 msgid "Noise Suppressor" msgstr "Rauschunterdrücker" #: data/ui/webrtc.glade:496 msgid "Adaptive Digital" msgstr "Adaptiv Digital" #: data/ui/webrtc.glade:497 msgid "Fixed Digital" msgstr "Fixiert Digital" #: data/ui/webrtc.glade:514 msgid "Gain Controller" msgstr "Verstärkungsregler" #: data/ui/webrtc.glade:540 msgid "Target Level" msgstr "Zielwert" #: data/ui/webrtc.glade:572 msgid "Maximum Gain" msgstr "Maximale Verstärkung" #: data/ui/webrtc.glade:672 msgid "Detection Likelihood" msgstr "Erkennungswahrscheinlichkeit" #: data/ui/webrtc.glade:684 msgid "Frame Size" msgstr "Rahmengröße" #: data/ui/webrtc.glade:697 msgid "Very Low" msgstr "Sehr Tief" #: data/ui/webrtc.glade:737 msgid "Voice Detector" msgstr "Spracherkennung" #: data/ui/rnnoise.glade:90 #, fuzzy msgid "Noise Reduction" msgstr "Amplitudenreduktion" #: data/ui/rnnoise.glade:242 #, fuzzy msgid "Import Model" msgstr "Impuls importieren" #: data/ui/rnnoise.glade:246 #, fuzzy msgid "Import Model File" msgstr "Impulsdatei importieren" #: data/ui/rnnoise.glade:311 #, fuzzy msgid "Active Model" msgstr "Aggressiver Modus" #: data/ui/rnnoise.glade:324 msgid "Standard RNNoise Model" msgstr "" #: src/app_info_ui.cpp:120 msgid "paused" msgstr "Pausiert" #: src/app_info_ui.cpp:122 msgid "playing" msgstr "Spielt" #: src/application.cpp:38 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "Beende PulseEffects. Nützlich bei der Ausführung als Service." #: src/application.cpp:40 msgid "Show available presets." msgstr "Verfügbare Presets anzeigen." #: src/application.cpp:43 msgid "Load a preset. Example: pulseeffects -l music" msgstr "Lade ein Preset. Beispiel: pulseeffects -l music" #: src/application.cpp:45 msgid "Reset PulseEffects." msgstr "PulseEffects zurücksetzen." #: src/application.cpp:48 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "" "Globale Umleitung. 1 zum Aktivieren, 2 zum Deaktivieren und 3 zum Erhalten " "des Status" #: src/application.cpp:50 msgid "Hide the Window." msgstr "" #: src/application.cpp:284 msgid "Output Presets: " msgstr "Ausgabe-Presets: " #: src/application.cpp:292 msgid "Input Presets: " msgstr "Eingangs-Presets: " #: src/blocklist_settings_ui.cpp:191 msgid "Blocklist" msgstr "Sperrliste" #: src/calibration_ui.cpp:198 msgid "Calibration Microphone" msgstr "Kalibrationsmikrofon" #: src/convolver_ui.cpp:281 msgid "Import Impulse File" msgstr "Impulsdatei importieren" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Open" msgstr "Öffnen" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Cancel" msgstr "Abbrechen" #: src/convolver_ui.cpp:318 src/convolver_ui.cpp:319 src/convolver_ui.cpp:321 msgid "Failed" msgstr "Gescheitert" #: src/convolver_ui.cpp:323 msgid "Could Not Load The Impulse File" msgstr "Die Impulsdatei konnte nicht geladen werden" #: src/equalizer_ui.cpp:380 msgid "infinity" msgstr "Unendlich" #: src/equalizer_ui.cpp:738 #, fuzzy msgid "Import APO Preset File" msgstr "Presets importieren" #: src/equalizer_ui.cpp:743 #, fuzzy msgid "APO Presets" msgstr "Presets" #: src/general_settings_ui.cpp:149 msgid "General" msgstr "Allgemein" #: src/pulse_settings_ui.cpp:168 msgid "Pulseaudio" msgstr "PulseAudio" #, fuzzy #~ msgid "Import APO Presets" #~ msgstr "Presets importieren" #~ msgid "Input Gain" #~ msgstr "Eingabeverstärkung" #, fuzzy #~ msgid "Output Gain" #~ msgstr "Eingabeverstärkung" #, fuzzy #~ msgid "Gain Detection" #~ msgstr "Amplitudenreduktion" #~ msgid "Scale" #~ msgstr "Skala" #~ msgid "Exponent" #~ msgstr "Exponent" easyeffects-4.8.7/po/es_CO.po000066400000000000000000001150001424023573300160010ustar00rootroot00000000000000# Spanish (CO) translation for Pulseeffects. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the Pulseeffects package. # CCaroV , 2019. # msgid "" msgstr "" "Project-Id-Version: pulseeffects\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-28 14:03-0300\n" "PO-Revision-Date: 2020-01-09 18:18-0500\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.6\n" "Last-Translator: Christian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: es_CO\n" #: data/ui/application.glade:46 src/calibration_ui.cpp:39 #: src/calibration_ui.cpp:164 msgid "Test Signals" msgstr "Señal de Prueba" #: data/ui/application.glade:61 msgid "Global Bypass" msgstr "Bypass Global" #: data/ui/application.glade:83 #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 msgid "PulseEffects" msgstr "PulseEffects" #: data/ui/application.glade:155 data/ui/general_settings.glade:107 #: data/ui/equalizer.glade:253 msgid "Settings" msgstr "Ajustes" #: data/ui/application.glade:177 msgid "Help" msgstr "Ayuda" #: data/ui/application.glade:200 data/ui/filter.glade:204 #: data/ui/equalizer.glade:309 data/ui/reverb.glade:284 #: data/ui/crossfeed.glade:47 src/presets_menu_ui.cpp:115 #: src/presets_menu_ui.cpp:274 src/presets_menu_ui.cpp:291 msgid "Presets" msgstr "Perfiles" #: data/ui/spectrum_settings.glade:59 msgid "Show Spectrum" msgstr "Mostrar Espectro" #: data/ui/spectrum_settings.glade:84 msgid "Fill" msgstr "Rellenar" #: data/ui/spectrum_settings.glade:109 msgid "Border" msgstr "Bordes" #: data/ui/spectrum_settings.glade:134 msgid "Use Custom Color" msgstr "Usar Color Personalizado" #: data/ui/spectrum_settings.glade:159 msgid "Use Gradient" msgstr "Usar Degradado" #: data/ui/spectrum_settings.glade:185 msgid "Spectrum Color" msgstr "Color del Espectro" #: data/ui/spectrum_settings.glade:213 msgid "Gradient Color" msgstr "Color del Degradado" #: data/ui/spectrum_settings.glade:241 msgid "Spectrum Type" msgstr "Tipo de Espectro" #: data/ui/spectrum_settings.glade:255 msgid "Bars" msgstr "Barras" #: data/ui/spectrum_settings.glade:256 msgid "Lines" msgstr "Lineas" #: data/ui/spectrum_settings.glade:271 msgid "Points" msgstr "Puntos" #: data/ui/spectrum_settings.glade:303 msgid "Height" msgstr "Altura" #: data/ui/spectrum_settings.glade:336 msgid "Scale" msgstr "Escala" #: data/ui/spectrum_settings.glade:369 msgid "Exponent" msgstr "Exponente" #: data/ui/spectrum_settings.glade:402 msgid "Sampling" msgstr "Muestreo" #: data/ui/spectrum_settings.glade:433 msgid "Line Width" msgstr "Ancho de Linea" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:389 msgid "Use Default" msgstr "Usar Predeterminado" #: data/ui/pulse_settings.glade:150 data/ui/pulse_settings.glade:440 msgid "Block Size" msgstr "Tamaño de Bloque" #: data/ui/pulse_settings.glade:196 data/ui/pulse_settings.glade:486 msgid "Pipeline Input" msgstr "Caudal de Entrada" #: data/ui/pulse_settings.glade:210 data/ui/pulse_settings.glade:301 #: data/ui/pulse_settings.glade:500 data/ui/pulse_settings.glade:591 #: data/ui/app_info.glade:159 msgid "Buffer" msgstr "Buffer" #: data/ui/pulse_settings.glade:243 data/ui/pulse_settings.glade:334 #: data/ui/pulse_settings.glade:513 data/ui/pulse_settings.glade:604 #: data/ui/app_info.glade:186 msgid "Latency" msgstr "Latencia" #: data/ui/pulse_settings.glade:287 data/ui/pulse_settings.glade:577 msgid "Pipeline Output" msgstr "Caudal de Salida" #: data/ui/pulse_settings.glade:370 data/ui/blocklist_settings.glade:130 msgid "Input Effects" msgstr "Efectos de Entrada" #: data/ui/pulse_settings.glade:660 data/ui/blocklist_settings.glade:224 msgid "Output Effects" msgstr "Efectos de Salida" #: data/ui/blocklist_settings.glade:53 data/ui/blocklist_settings.glade:147 #: data/ui/presets_menu.glade:68 data/ui/presets_menu.glade:177 msgid "Create Preset" msgstr "Crear Perfil" #: data/ui/blocklist_settings.glade:72 data/ui/blocklist_settings.glade:166 #: data/ui/pulse_info.glade:49 data/ui/presets_menu.glade:55 #: data/ui/presets_menu.glade:164 msgid "Name" msgstr "Nombre" #: data/ui/general_settings.glade:31 msgid "Start Service at Login" msgstr "Iniciar Servicio al Iniciar Sesión" #: data/ui/general_settings.glade:56 msgid "Process All Outputs" msgstr "Procesar Todas las Salidas" #: data/ui/general_settings.glade:81 msgid "Use Dark Theme" msgstr "Usar Tema Oscuro" #: data/ui/general_settings.glade:116 data/ui/equalizer_band.glade:183 #: data/ui/equalizer_band.glade:229 msgid "Reset" msgstr "Restablecer" #: data/ui/general_settings.glade:133 data/ui/general_settings.glade:206 msgid "Niceness" msgstr "Meticulosidad" #: data/ui/general_settings.glade:134 msgid "Real Time" msgstr "Tiempo Real" #: data/ui/general_settings.glade:135 msgid "None" msgstr "Ninguno" #: data/ui/general_settings.glade:151 msgid "Priority Type" msgstr "Tipo de Prioridad" #: data/ui/general_settings.glade:161 msgid "About" msgstr "Acerca de" #: data/ui/general_settings.glade:180 msgid "Process All Inputs" msgstr "Procesar Todas las Entradas" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "Prioridad" #: data/ui/about.glade.in:11 msgid "Audio effects for PulseAudio applications" msgstr "Efectos de Sonido para las aplicaciones de PulseAudio" #: data/ui/app_info.glade:51 msgid "Format" msgstr "Formato" #: data/ui/app_info.glade:78 data/ui/convolver.glade:257 msgid "Rate" msgstr "Tasa" #: data/ui/app_info.glade:105 data/ui/pulse_info.glade:238 #: data/ui/stereo_tools.glade:629 msgid "Channels" msgstr "Canales" # Resampler does not have an official translation #: data/ui/app_info.glade:132 msgid "Resampler" msgstr "Remuestreador" #: data/ui/app_info.glade:213 msgid "State" msgstr "Estado" #: data/ui/pulse_info.glade:76 msgid "Version" msgstr "Versión" #: data/ui/pulse_info.glade:103 msgid "Default Sink" msgstr "Profundidad Predeterminda" #: data/ui/pulse_info.glade:115 msgid "Default Source" msgstr "Fuente Predeterminada" #: data/ui/pulse_info.glade:157 msgid "Protocol" msgstr "Protocolo" #: data/ui/pulse_info.glade:184 msgid "Default Sample Format" msgstr "Formato de Muestreo Predeterminado" #: data/ui/pulse_info.glade:211 msgid "Default Sampling Rate" msgstr "Tasa de Muestreo por Defecto" #: data/ui/pulse_info.glade:265 msgid "Channel Mapping" msgstr "Mapa de Canales" #: data/ui/pulse_info.glade:290 msgid "Server" msgstr "Servidor" #: data/ui/pulse_info.glade:335 msgid "Modules" msgstr "Módulos" #: data/ui/pulse_info.glade:381 msgid "Clients" msgstr "Clientes" #: data/ui/pulse_info.glade:444 msgid "File" msgstr "Archivo" #: data/ui/pulse_info.glade:454 msgid "Configuration" msgstr "Configuración" # Resamplers does not have an official translation #: data/ui/pulse_info.glade:487 msgid "Resamplers" msgstr "Remuestreadores" #: data/ui/autogain.glade:24 msgid "Auto Gain" msgstr "Ganancia Automática" #: data/ui/autogain.glade:145 msgid "Reset History" msgstr "Restablecer Historial" #: data/ui/autogain.glade:157 msgid "Detect Silence" msgstr "Detectar Silencio" #: data/ui/autogain.glade:169 msgid "Use Geometric Mean" msgstr "Usar la Media Geométrica" #: data/ui/autogain.glade:198 msgid "Target" msgstr "Objetivo" #: data/ui/autogain.glade:214 msgid "-23" msgstr "-23" #: data/ui/autogain.glade:249 data/ui/autogain.glade:591 msgid "Momentary" msgstr "Momentáneo" #: data/ui/autogain.glade:264 data/ui/autogain.glade:604 msgid "Short Term" msgstr "Corto Plazo" #: data/ui/autogain.glade:279 data/ui/autogain.glade:617 msgid "Integrated" msgstr "Integrado" #: data/ui/autogain.glade:349 msgid "Weights" msgstr "Fuerza" #: data/ui/autogain.glade:378 data/ui/autogain.glade:570 #: data/ui/limiter.glade:365 data/ui/compressor.glade:718 #: data/ui/multiband_compressor.glade:1958 data/ui/filter.glade:368 #: data/ui/equalizer.glade:516 data/ui/reverb.glade:630 #: data/ui/bass_enhancer.glade:479 data/ui/exciter.glade:483 #: data/ui/stereo_tools.glade:299 data/ui/stereo_tools.glade:804 #: data/ui/crossfeed.glade:202 data/ui/maximizer.glade:239 #: data/ui/loudness.glade:244 data/ui/gate.glade:487 #: data/ui/multiband_gate.glade:2107 data/ui/deesser.glade:568 #: data/ui/convolver.glade:477 data/ui/crystalizer.glade:228 #: data/ui/pitch.glade:322 data/ui/webrtc.glade:624 data/ui/delay.glade:210 #: data/ui/presets_menu.glade:255 msgid "Input" msgstr "Entrada" #: data/ui/autogain.glade:393 data/ui/autogain.glade:826 #: data/ui/limiter.glade:380 data/ui/compressor.glade:733 #: data/ui/multiband_compressor.glade:753 #: data/ui/multiband_compressor.glade:1130 #: data/ui/multiband_compressor.glade:1508 #: data/ui/multiband_compressor.glade:1886 #: data/ui/multiband_compressor.glade:1973 data/ui/filter.glade:383 #: data/ui/equalizer.glade:531 data/ui/reverb.glade:645 #: data/ui/bass_enhancer.glade:511 data/ui/exciter.glade:515 #: data/ui/stereo_tools.glade:776 data/ui/stereo_tools.glade:818 #: data/ui/crossfeed.glade:217 data/ui/maximizer.glade:254 #: data/ui/loudness.glade:162 data/ui/loudness.glade:259 data/ui/gate.glade:502 #: data/ui/multiband_gate.glade:806 data/ui/multiband_gate.glade:1215 #: data/ui/multiband_gate.glade:1625 data/ui/multiband_gate.glade:2035 #: data/ui/multiband_gate.glade:2122 data/ui/deesser.glade:583 #: data/ui/convolver.glade:492 data/ui/crystalizer.glade:243 #: data/ui/pitch.glade:336 data/ui/webrtc.glade:639 data/ui/delay.glade:225 #: data/ui/presets_menu.glade:146 msgid "Output" msgstr "Salida" #: data/ui/autogain.glade:708 msgid "Relative" msgstr "Reativo" #: data/ui/autogain.glade:721 data/ui/compressor.glade:900 #: data/ui/deesser.glade:295 msgid "Gain" msgstr "Ganancia" #: data/ui/autogain.glade:787 data/ui/loudness.glade:24 #: data/ui/loudness.glade:128 msgid "Loudness" msgstr "Loudness" #: data/ui/autogain.glade:840 msgid "Range" msgstr "Rango" #: data/ui/limiter.glade:30 data/ui/webrtc.glade:395 msgid "Limiter" msgstr "Limitador" #: data/ui/limiter.glade:149 msgid "Input Gain" msgstr "Ganancia de Entrada" #: data/ui/limiter.glade:182 msgid "Limit" msgstr "Límite" #: data/ui/limiter.glade:237 data/ui/compressor.glade:373 #: data/ui/multiband_compressor.glade:534 #: data/ui/multiband_compressor.glade:907 #: data/ui/multiband_compressor.glade:1285 #: data/ui/multiband_compressor.glade:1663 data/ui/maximizer.glade:213 #: data/ui/gate.glade:299 data/ui/multiband_gate.glade:554 #: data/ui/multiband_gate.glade:960 data/ui/multiband_gate.glade:1370 #: data/ui/multiband_gate.glade:1780 msgid "Release" msgstr "Liberar" #: data/ui/limiter.glade:250 data/ui/compressor.glade:570 msgid "Lookahead" msgstr "Atenuación" #: data/ui/limiter.glade:285 msgid "Oversampling" msgstr "Sobre Muestreo" #: data/ui/limiter.glade:334 msgid "ASC" msgstr "ASC" #: data/ui/limiter.glade:395 msgid "Attenuation" msgstr "Atenuación" #: data/ui/compressor.glade:30 data/ui/compressor.glade:442 #: data/ui/webrtc.glade:482 data/com.github.wwmm.pulseeffects.appdata.xml.in:52 msgid "Compressor" msgstr "Compresor" #: data/ui/compressor.glade:239 data/ui/multiband_compressor.glade:568 #: data/ui/multiband_compressor.glade:942 #: data/ui/multiband_compressor.glade:1320 #: data/ui/multiband_compressor.glade:1698 data/ui/maximizer.glade:126 #: data/ui/gate.glade:333 data/ui/multiband_gate.glade:588 #: data/ui/multiband_gate.glade:995 data/ui/multiband_gate.glade:1405 #: data/ui/multiband_gate.glade:1815 data/ui/deesser.glade:458 msgid "Threshold" msgstr "Límite" #: data/ui/compressor.glade:272 data/ui/multiband_compressor.glade:601 #: data/ui/multiband_compressor.glade:976 #: data/ui/multiband_compressor.glade:1354 #: data/ui/multiband_compressor.glade:1732 data/ui/gate.glade:366 #: data/ui/multiband_gate.glade:621 data/ui/multiband_gate.glade:1029 #: data/ui/multiband_gate.glade:1439 data/ui/multiband_gate.glade:1849 #: data/ui/deesser.glade:491 msgid "Ratio" msgstr "Radio" #: data/ui/compressor.glade:304 data/ui/multiband_compressor.glade:633 #: data/ui/multiband_compressor.glade:1009 #: data/ui/multiband_compressor.glade:1387 #: data/ui/multiband_compressor.glade:1765 data/ui/gate.glade:398 #: data/ui/multiband_gate.glade:653 data/ui/multiband_gate.glade:1062 #: data/ui/multiband_gate.glade:1472 data/ui/multiband_gate.glade:1882 msgid "Knee" msgstr "Codo" #: data/ui/compressor.glade:338 data/ui/multiband_compressor.glade:667 #: data/ui/multiband_compressor.glade:1044 #: data/ui/multiband_compressor.glade:1422 #: data/ui/multiband_compressor.glade:1800 data/ui/gate.glade:432 #: data/ui/multiband_gate.glade:687 data/ui/multiband_gate.glade:1097 #: data/ui/multiband_gate.glade:1507 data/ui/multiband_gate.glade:1917 #: data/ui/deesser.glade:522 msgid "Makeup" msgstr "Amplificación" #: data/ui/compressor.glade:386 data/ui/multiband_compressor.glade:500 #: data/ui/multiband_compressor.glade:872 #: data/ui/multiband_compressor.glade:1250 #: data/ui/multiband_compressor.glade:1628 data/ui/gate.glade:265 #: data/ui/multiband_gate.glade:520 data/ui/multiband_gate.glade:925 #: data/ui/multiband_gate.glade:1335 data/ui/multiband_gate.glade:1745 msgid "Attack" msgstr "Ataque" #: data/ui/compressor.glade:413 msgid "Downward" msgstr "Hacia Abajo" #: data/ui/compressor.glade:414 msgid "Upward" msgstr "Hacia Arriba" #: data/ui/compressor.glade:426 msgid "Compression Mode" msgstr "Modo de Compresión" #: data/ui/compressor.glade:454 data/ui/bass_enhancer.glade:145 #: data/ui/exciter.glade:145 data/ui/deesser.glade:162 msgid "Listen" msgstr "Escuchar" #: data/ui/compressor.glade:500 msgid "Pre-amplification" msgstr "Pre-amplificación" #: data/ui/compressor.glade:535 msgid "Reactivity" msgstr "Reactividad" #: data/ui/compressor.glade:583 msgid "Feed-forward" msgstr "Adelantar" #: data/ui/compressor.glade:584 msgid "Feed-back" msgstr "Realimentar" #: data/ui/compressor.glade:598 data/ui/equalizer_band.glade:48 msgid "Type" msgstr "Tipo" #: data/ui/compressor.glade:612 data/ui/multiband_compressor.glade:473 #: data/ui/multiband_compressor.glade:845 #: data/ui/multiband_compressor.glade:1223 #: data/ui/multiband_compressor.glade:1601 data/ui/gate.glade:220 #: data/ui/multiband_gate.glade:493 data/ui/multiband_gate.glade:898 #: data/ui/multiband_gate.glade:1308 data/ui/multiband_gate.glade:1718 #: data/ui/deesser.glade:218 data/ui/deesser.glade:328 msgid "Peak" msgstr "Pico" #: data/ui/compressor.glade:613 data/ui/multiband_compressor.glade:472 #: data/ui/multiband_compressor.glade:844 #: data/ui/multiband_compressor.glade:1222 #: data/ui/multiband_compressor.glade:1600 data/ui/gate.glade:219 #: data/ui/multiband_gate.glade:492 data/ui/multiband_gate.glade:897 #: data/ui/multiband_gate.glade:1307 data/ui/multiband_gate.glade:1717 #: data/ui/deesser.glade:217 msgid "RMS" msgstr "RMS" #: data/ui/compressor.glade:614 msgid "Low-Pass" msgstr "Paso Bajo" #: data/ui/compressor.glade:615 msgid "Uniform" msgstr "Uniforme" #: data/ui/compressor.glade:629 data/ui/multiband_compressor.glade:283 #: data/ui/equalizer.glade:200 data/ui/equalizer_band.glade:79 #: data/ui/stereo_tools.glade:461 data/ui/multiband_gate.glade:303 #: data/ui/deesser.glade:204 data/ui/webrtc.glade:350 msgid "Mode" msgstr "Modo" #: data/ui/compressor.glade:643 msgid "Middle" msgstr "Medio" #: data/ui/compressor.glade:644 msgid "Side" msgstr "Lado" #: data/ui/compressor.glade:645 data/ui/equalizer.glade:448 #: data/ui/stereo_tools.glade:524 data/ui/delay.glade:131 msgid "Left" msgstr "Izquierda" #: data/ui/compressor.glade:646 data/ui/equalizer.glade:489 #: data/ui/stereo_tools.glade:596 data/ui/delay.glade:163 msgid "Right" msgstr "Derecha" #: data/ui/compressor.glade:660 msgid "Source" msgstr "Fuente" #: data/ui/compressor.glade:676 data/ui/compressor.glade:913 msgid "Sidechain" msgstr "Cadena Lateral" #: data/ui/compressor.glade:989 msgid "Curve" msgstr "Curva" #: data/ui/multiband_compressor.glade:70 msgid "Multiband Compressor" msgstr "Compresor Multibanda" #: data/ui/multiband_compressor.glade:297 data/ui/multiband_gate.glade:317 msgid "LR4" msgstr "LR4" #: data/ui/multiband_compressor.glade:298 data/ui/multiband_gate.glade:318 msgid "LR8" msgstr "LR8" #: data/ui/multiband_compressor.glade:312 data/ui/multiband_gate.glade:332 msgid "Split 1/2" msgstr "Dividir 1/2" #: data/ui/multiband_compressor.glade:325 data/ui/multiband_gate.glade:345 msgid "Split 2/3" msgstr "Dividir 2/3" #: data/ui/multiband_compressor.glade:338 data/ui/multiband_gate.glade:358 msgid "Split 3/4" msgstr "Dividir 3/4" #: data/ui/multiband_compressor.glade:442 #: data/ui/multiband_compressor.glade:814 #: data/ui/multiband_compressor.glade:1192 #: data/ui/multiband_compressor.glade:1570 data/ui/multiband_gate.glade:462 #: data/ui/multiband_gate.glade:867 data/ui/multiband_gate.glade:1277 #: data/ui/multiband_gate.glade:1687 data/ui/crystalizer_band.glade:39 msgid "Bypass" msgstr "Bypass" #: data/ui/multiband_compressor.glade:455 #: data/ui/multiband_compressor.glade:827 #: data/ui/multiband_compressor.glade:1205 #: data/ui/multiband_compressor.glade:1583 data/ui/equalizer_band.glade:302 #: data/ui/multiband_gate.glade:475 data/ui/multiband_gate.glade:880 #: data/ui/multiband_gate.glade:1290 data/ui/multiband_gate.glade:1700 msgid "Solo" msgstr "Solo" #: data/ui/multiband_compressor.glade:713 #: data/ui/multiband_compressor.glade:1090 #: data/ui/multiband_compressor.glade:1468 #: data/ui/multiband_compressor.glade:1846 msgid "Compression" msgstr "Compresión" #: data/ui/multiband_compressor.glade:796 data/ui/multiband_gate.glade:849 msgid "Sub Band" msgstr "Sub Banda" #: data/ui/multiband_compressor.glade:1173 data/ui/multiband_gate.glade:1258 msgid "Low Band" msgstr "Banda Baja" #: data/ui/multiband_compressor.glade:1551 data/ui/multiband_gate.glade:1668 msgid "Mid Band" msgstr "Banda Media" #: data/ui/multiband_compressor.glade:1929 data/ui/multiband_gate.glade:2078 msgid "High Band" msgstr "Banda Alta" #: data/ui/filter.glade:31 msgid "Filter" msgstr "Filtro" #: data/ui/filter.glade:123 msgid "Muted" msgstr "Silenciado" #: data/ui/filter.glade:135 data/ui/reverb.glade:209 msgid "Disco" msgstr "Disco" #: data/ui/filter.glade:147 msgid "Distant Headphones" msgstr "Audífonos a Distancia" #: data/ui/filter.glade:159 data/ui/reverb.glade:235 data/ui/crossfeed.glade:72 msgid "Default" msgstr "Predeterminado" #: data/ui/filter.glade:220 msgid "12dB/oct Lowpass" msgstr "12dB/oct Paso Bajo" #: data/ui/filter.glade:221 msgid "24dB/oct Lowpass" msgstr "24dB/oct Paso Bajo" #: data/ui/filter.glade:222 msgid "36dB/oct Lowpass" msgstr "36dB/oct Paso Bajo" #: data/ui/filter.glade:223 msgid "12dB/oct Highpass" msgstr "12dB/oct Pase Alto" #: data/ui/filter.glade:224 msgid "24dB/oct Highpass" msgstr "24dB/oct Pase Alto" #: data/ui/filter.glade:225 msgid "36dB/oct Highpass" msgstr "36dB/oct Pase Alto" #: data/ui/filter.glade:226 msgid "6dB/oct Bandpass" msgstr "6dB/oct Paso de Banda" #: data/ui/filter.glade:227 msgid "12dB/oct Bandpass" msgstr "12dB/oct Paso de Banda" #: data/ui/filter.glade:228 msgid "18dB/oct Bandpass" msgstr "18dB/oct Paso de Banda" #: data/ui/filter.glade:229 msgid "6dB/oct Bandreject" msgstr "6dB/oct Rechazo de Banda" #: data/ui/filter.glade:230 msgid "12dB/oct Bandreject" msgstr "12dB/oct Rechazo de Banda" #: data/ui/filter.glade:231 msgid "18dB/oct Bandreject" msgstr "18dB/oct Rechazo de Banda" #: data/ui/filter.glade:254 data/ui/equalizer_band.glade:152 #: data/ui/calibration_signals.glade:32 msgid "Frequency" msgstr "Frecuencia" #: data/ui/filter.glade:288 data/ui/equalizer_band.glade:67 msgid "Resonance" msgstr "Resonancia" #: data/ui/filter.glade:323 msgid "Inertia" msgstr "Inercia" #: data/ui/equalizer.glade:24 msgid "Equalizer" msgstr "Ecualizador" #: data/ui/equalizer.glade:129 msgid "Split Channels" msgstr "Dividir Canales" #: data/ui/equalizer.glade:155 msgid "IIR" msgstr "IIR" #: data/ui/equalizer.glade:156 msgid "FIR" msgstr "FIR" #: data/ui/equalizer.glade:157 msgid "FFT" msgstr "FFT" #: data/ui/equalizer.glade:187 msgid "Bands" msgstr "Bandas" #: data/ui/equalizer.glade:209 msgid "Flat Response" msgstr "Respuesta Plana" #: data/ui/equalizer.glade:224 msgid "Calculate Frequencies" msgstr "Calcular Frecuencias" #: data/ui/equalizer.glade:238 msgid "Reset Equalizer" msgstr "Restablecer Ecualizador" #: data/ui/equalizer_band.glade:60 msgid "Off" msgstr "Apagdo" #: data/ui/equalizer_band.glade:61 msgid "Bell" msgstr "Timbre" #: data/ui/equalizer_band.glade:62 msgid "High Pass" msgstr "Pase Alto" #: data/ui/equalizer_band.glade:63 msgid "High Shelf" msgstr "Estante Alto" #: data/ui/equalizer_band.glade:64 msgid "Low Pass" msgstr "Paso Bajo" #: data/ui/equalizer_band.glade:65 msgid "Low Shelf" msgstr "Estante Bajo" #: data/ui/equalizer_band.glade:66 msgid "Notch" msgstr "Muesca" #: data/ui/equalizer_band.glade:91 msgid "RLC (BT)" msgstr "RLC (BT)" #: data/ui/equalizer_band.glade:92 msgid "RLC (MT)" msgstr "RLC (MT)" #: data/ui/equalizer_band.glade:93 msgid "BWC (BT)" msgstr "BWC (BT)" #: data/ui/equalizer_band.glade:94 msgid "BWC (MT)" msgstr "BWC (MT)" #: data/ui/equalizer_band.glade:95 msgid "LRX (BT)" msgstr "LRX (BT)" #: data/ui/equalizer_band.glade:96 msgid "LRX (MT)" msgstr "LRX (MT)" #: data/ui/equalizer_band.glade:97 msgid "APO (DR)" msgstr "APO (DR)" #: data/ui/equalizer_band.glade:109 msgid "Slope" msgstr "Pendiente" #: data/ui/equalizer_band.glade:121 msgid "x1" msgstr "x1" #: data/ui/equalizer_band.glade:122 msgid "x2" msgstr "x2" #: data/ui/equalizer_band.glade:123 msgid "x3" msgstr "x3" #: data/ui/equalizer_band.glade:124 msgid "x4" msgstr "x4" #: data/ui/equalizer_band.glade:201 msgid "Quality" msgstr "Calidad" #: data/ui/equalizer_band.glade:252 msgid "Width" msgstr "Anchura" #: data/ui/equalizer_band.glade:314 data/ui/stereo_tools.glade:550 #: data/ui/stereo_tools.glade:609 data/ui/crystalizer_band.glade:27 msgid "Mute" msgstr "Silenciar" #: data/ui/equalizer_preset_row.glade:37 data/ui/irs_row.glade:59 #: data/ui/preset_row.glade:51 msgid "Apply" msgstr "Aplicar" #: data/ui/reverb.glade:64 msgid "Reverberation" msgstr "Reverberación" #: data/ui/reverb.glade:157 msgid "Ambience" msgstr "Ambiente" #: data/ui/reverb.glade:170 msgid "Empty Walls" msgstr "Paredes Vacías" #: data/ui/reverb.glade:183 msgid "Room" msgstr "Habitación" #: data/ui/reverb.glade:196 msgid "Large Empty Hall" msgstr "Habitación Vacía Grande" #: data/ui/reverb.glade:222 msgid "Large Occupied Hall" msgstr "Habitación Ocupada Grande" #: data/ui/reverb.glade:334 msgid "Pre Delay" msgstr "Pre Retraso" #: data/ui/reverb.glade:347 msgid "Decay Time" msgstr "Tiempo de Decaimiento" #: data/ui/reverb.glade:380 data/ui/bass_enhancer.glade:242 #: data/ui/exciter.glade:245 msgid "Amount" msgstr "Cantidad" #: data/ui/reverb.glade:412 msgid "Dry" msgstr "Secar" #: data/ui/reverb.glade:444 msgid "Bass Cut" msgstr "Corte de Bajos" #: data/ui/reverb.glade:495 msgid "Treble Cut" msgstr "Corte de Sobreagudos" #: data/ui/reverb.glade:538 msgid "Diffusion" msgstr "Difusión" #: data/ui/reverb.glade:550 msgid "Room Size" msgstr "Tamaño de la Habitación" #: data/ui/reverb.glade:563 msgid "Small" msgstr "Pequeña" #: data/ui/reverb.glade:564 msgid "Medium" msgstr "Mediana" #: data/ui/reverb.glade:565 msgid "Large" msgstr "Grande" #: data/ui/reverb.glade:566 msgid "Tunnel" msgstr "Túnel" #: data/ui/reverb.glade:567 msgid "Large/smooth" msgstr "Grande/Liso" #: data/ui/reverb.glade:568 msgid "Experimental" msgstr "Experimental" #: data/ui/reverb.glade:581 msgid "High Frequency Damping" msgstr "Amortiguación de Alta Frecuencia" #: data/ui/bass_enhancer.glade:50 msgid "Bass Enhancer" msgstr "Potenciado de Graves" #: data/ui/bass_enhancer.glade:186 data/ui/exciter.glade:187 msgid "3rd" msgstr "3era" #: data/ui/bass_enhancer.glade:198 data/ui/exciter.glade:199 msgid "2nd" msgstr "2nda" #: data/ui/bass_enhancer.glade:210 data/ui/exciter.glade:211 msgid "Blend Harmonics" msgstr "Mezclar Harmónicos" #: data/ui/bass_enhancer.glade:254 data/ui/bass_enhancer.glade:386 #: data/ui/exciter.glade:258 data/ui/exciter.glade:390 msgid "Harmonics" msgstr "Harmónicos" #: data/ui/bass_enhancer.glade:266 data/ui/exciter.glade:271 msgid "Scope" msgstr "Alcance" #: data/ui/bass_enhancer.glade:355 msgid "Floor" msgstr "Fondo" #: data/ui/exciter.glade:50 msgid "Exciter" msgstr "Excitador" #: data/ui/exciter.glade:358 data/ui/maximizer.glade:159 msgid "Ceiling" msgstr "Límite" #: data/ui/stereo_tools.glade:42 msgid "Stereo Tools" msgstr "Herramientas Estéreo" #: data/ui/stereo_tools.glade:207 msgid "Softclip" msgstr "Clip Suave" #: data/ui/stereo_tools.glade:231 data/ui/stereo_tools.glade:647 msgid "Balance" msgstr "Balance" #: data/ui/stereo_tools.glade:263 msgid "S/C Level" msgstr "Nivel S/C" #: data/ui/stereo_tools.glade:321 msgid "Side Level" msgstr "Nivel Lateral" #: data/ui/stereo_tools.glade:372 msgid "Side Balance" msgstr "Balance Lateral" #: data/ui/stereo_tools.glade:404 msgid "Middle Level" msgstr "Nivel Medio" #: data/ui/stereo_tools.glade:417 msgid "Middle Panorama" msgstr "Panorama Medio" #: data/ui/stereo_tools.glade:475 msgid "LR > LR (Stereo Default)" msgstr "LR > LR (Estéreo Predeterminado)" #: data/ui/stereo_tools.glade:476 msgid "LR > MS (Stereo to Mid-Side)" msgstr "LR > MS (Estéreo hacia Medio Lado)" #: data/ui/stereo_tools.glade:477 msgid "MS > LR (Mid-Side to Stereo)" msgstr "MS > LR (Medio Lado - Estéreo)" #: data/ui/stereo_tools.glade:478 msgid "LR > LL (Mono Left Channel)" msgstr "LR > LL (Canal Izquierdo Mono)" #: data/ui/stereo_tools.glade:479 msgid "LR > RR (Mono Right Channel)" msgstr "LR > RR (Canal Derecho Mono)" #: data/ui/stereo_tools.glade:480 msgid "LR > L+R (Mono Sum L+R)" msgstr "LR > L+R (Suma Mono L+R)" #: data/ui/stereo_tools.glade:481 msgid "LR > RL (Stereo Flip Channels)" msgstr "LR > RL (Intercambiar Canales)" #: data/ui/stereo_tools.glade:498 msgid "Stereo Matrix" msgstr "Matriz Estéreo" #: data/ui/stereo_tools.glade:537 data/ui/stereo_tools.glade:578 msgid "Invert Phase" msgstr "Invertir Fase" #: data/ui/stereo_tools.glade:679 msgid "Delay L/R" msgstr "Retraso L/R" #: data/ui/stereo_tools.glade:713 msgid "Stereo Base" msgstr "Base Estéreo" #: data/ui/stereo_tools.glade:746 msgid "Stereo Phase" msgstr "Fase Estéreo" #: data/ui/crossfeed.glade:59 msgid "Jmeier" msgstr "Jmeier" #: data/ui/crossfeed.glade:85 msgid "Cmoy" msgstr "Cmoy" #: data/ui/crossfeed.glade:122 msgid "Cutoff" msgstr "Umbral" #: data/ui/crossfeed.glade:155 msgid "Feed" msgstr "Alimentar" #: data/ui/crossfeed.glade:392 msgid "Crossfeed" msgstr "Crossfeed" #: data/ui/maximizer.glade:29 msgid "Maximizer" msgstr "Maximizador" #: data/ui/maximizer.glade:269 data/ui/gate.glade:190 msgid "Gain Reduction" msgstr "Reducción de Ganancia" #: data/ui/loudness.glade:196 msgid "Link" msgstr "Acoplar" #: data/ui/gate.glade:31 msgid "Gate" msgstr "Puerta de Ruido" #: data/ui/gate.glade:162 data/ui/deesser.glade:190 msgid "Detection" msgstr "Detección" #: data/ui/gate.glade:176 msgid "Stereo Link" msgstr "Acoplamiento Estéreo" #: data/ui/gate.glade:235 msgid "Average" msgstr "Promedio" #: data/ui/gate.glade:236 msgid "Maximum" msgstr "Máximo" #: data/ui/gate.glade:667 data/ui/multiband_gate.glade:766 #: data/ui/multiband_gate.glade:1175 data/ui/multiband_gate.glade:1585 #: data/ui/multiband_gate.glade:1995 msgid "Gating" msgstr "Puerta" #: data/ui/multiband_gate.glade:70 msgid "Multiband Gate" msgstr "Puerta Multibanda" #: data/ui/multiband_gate.glade:722 data/ui/multiband_gate.glade:1152 #: data/ui/multiband_gate.glade:1562 data/ui/multiband_gate.glade:1972 #: data/ui/deesser.glade:748 msgid "Reduction" msgstr "Reducción" #: data/ui/deesser.glade:61 msgid "Deesser" msgstr "Deesser" #: data/ui/deesser.glade:232 msgid "Wide" msgstr "Ancho" #: data/ui/deesser.glade:233 data/ui/deesser.glade:262 msgid "Split" msgstr "Dividir" #: data/ui/deesser.glade:381 msgid "Level" msgstr "Nivel" #: data/ui/deesser.glade:394 msgid "Peak Q" msgstr "Pico Q" #: data/ui/deesser.glade:426 msgid "Laxity" msgstr "Relajamiento" #: data/ui/deesser.glade:761 msgid "Detected" msgstr "Detectado" #: data/ui/convolver.glade:24 msgid "Convolver" msgstr "Convolver" #: data/ui/convolver.glade:101 msgid "Import Impulse" msgstr "Importar Archivo Impulse" #: data/ui/convolver.glade:105 msgid "Import Impulse Response File" msgstr "Importar Archivo de Respuesta Impulse" #: data/ui/convolver.glade:221 msgid "L" msgstr "L" #: data/ui/convolver.glade:235 msgid "R" msgstr "R" #: data/ui/convolver.glade:298 msgid "Duration" msgstr "Duración" #: data/ui/convolver.glade:309 msgid "Samples" msgstr "Muestras" #: data/ui/convolver.glade:342 src/convolver_ui.cpp:251 msgid "Impulse Response" msgstr "Respuesta de Impulse" #: data/ui/convolver.glade:362 msgid "Select the impulse Response File" msgstr "Seleccione el Archivo de Respuesta Impulse" #: data/ui/convolver.glade:382 src/spectrum_settings_ui.cpp:143 msgid "Spectrum" msgstr "Espectro" #: data/ui/convolver.glade:423 msgid "Stereo Width" msgstr "Amplitud Estéreo" #: data/ui/crystalizer.glade:48 msgid "Crystalizer" msgstr "Cristalizador" #: data/ui/crystalizer.glade:161 msgid "Aggressive Mode" msgstr "Modo Agresivo" #: data/ui/crystalizer.glade:420 msgid "Loudness Range" msgstr "Rango de Sonoridad" #: data/ui/crystalizer.glade:439 msgid "Before" msgstr "Antes" #: data/ui/crystalizer.glade:452 msgid "After" msgstr "Después" #: data/ui/pitch.glade:36 msgid "Pitch" msgstr "Tono" #: data/ui/pitch.glade:142 msgid "Faster" msgstr "Más Rápido" #: data/ui/pitch.glade:156 msgid "Preserve Formant" msgstr "Conservar Formato" #: data/ui/pitch.glade:180 msgid "Cents" msgstr "Acentos" #: data/ui/pitch.glade:211 msgid "Semitones" msgstr "Semitonos" #: data/ui/pitch.glade:242 msgid "Octaves" msgstr "Octavas" #: data/ui/pitch.glade:273 msgid "Crispness" msgstr "Frescura" #: data/ui/webrtc.glade:30 msgid "Webrtc" msgstr "Webrtc" #: data/ui/webrtc.glade:137 data/ui/webrtc.glade:257 data/ui/webrtc.glade:327 #: data/ui/webrtc.glade:496 msgid "Enable" msgstr "Habilitar" #: data/ui/webrtc.glade:158 msgid "Extended Filter" msgstr "Filtro Extendido" #: data/ui/webrtc.glade:171 msgid "Delay Agnostic" msgstr "Retraso Agnóstico" #: data/ui/webrtc.glade:183 msgid "High Pass Filter" msgstr "Filtro de Pase Alto" #: data/ui/webrtc.glade:212 data/ui/webrtc.glade:280 msgid "Suppresion Level" msgstr "Nivel de Supresión" #: data/ui/webrtc.glade:225 data/ui/webrtc.glade:293 data/ui/webrtc.glade:548 msgid "Low" msgstr "Bajo" #: data/ui/webrtc.glade:226 data/ui/webrtc.glade:294 data/ui/webrtc.glade:549 msgid "Moderate" msgstr "Moderado" #: data/ui/webrtc.glade:227 data/ui/webrtc.glade:295 data/ui/webrtc.glade:550 msgid "High" msgstr "Alto" #: data/ui/webrtc.glade:244 msgid "Echo Canceller" msgstr "Cancelador de Eco" #: data/ui/webrtc.glade:296 msgid "Very High" msgstr "Muy Alto" #: data/ui/webrtc.glade:313 msgid "Noise Suppressor" msgstr "Supresor de Ruido" #: data/ui/webrtc.glade:363 msgid "Adaptive Digital" msgstr "Adaptado Digital" #: data/ui/webrtc.glade:364 msgid "Fixed Digital" msgstr "Arreglo Digital" #: data/ui/webrtc.glade:381 msgid "Gain Controller" msgstr "Regulador de Ganancia" #: data/ui/webrtc.glade:419 msgid "Target Level" msgstr "Nivel Objetivo" #: data/ui/webrtc.glade:448 msgid "Maximum Gain" msgstr "Ganancia Máxima" #: data/ui/webrtc.glade:521 msgid "Detection Likelihood" msgstr "Probabilidad de Detección" #: data/ui/webrtc.glade:534 msgid "Frame Size" msgstr "Tamaño del Marco" #: data/ui/webrtc.glade:547 msgid "Very Low" msgstr "Muy Bajo" #: data/ui/webrtc.glade:584 msgid "Voice Detector" msgstr "Detector de Voz" #: data/ui/delay.glade:24 msgid "Delay" msgstr "Retraso" #: data/ui/preset_row.glade:68 msgid "Save current settings to this preset file" msgstr "Guardar esta configuración a este perfil" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "Borrar este perfil" #: data/ui/preset_row.glade:100 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" "Automáticamente aplicar este perfil siempre que el dispositivo actual esté " "conectado" #: data/ui/presets_menu.glade:86 data/ui/presets_menu.glade:195 #: src/presets_menu_ui.cpp:110 msgid "Import Presets" msgstr "Importar Perfiles" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Volumen" #: data/ui/calibration_signals.glade:108 msgid "Sine" msgstr "Seno" #: data/ui/calibration_signals.glade:109 msgid "Square" msgstr "Cuadrado" #: data/ui/calibration_signals.glade:110 msgid "Saw" msgstr "Sierra" #: data/ui/calibration_signals.glade:111 msgid "Triangle" msgstr "Triángulo" #: data/ui/calibration_signals.glade:112 msgid "Silence" msgstr "Silencio" #: data/ui/calibration_signals.glade:113 msgid "White Noise" msgstr "Ruido Blanco" #: data/ui/calibration_signals.glade:114 msgid "Pink Noise" msgstr "Ruido Rosa" #: data/ui/calibration_signals.glade:115 msgid "Sine Table" msgstr "Mesa Sinusoidal" #: data/ui/calibration_signals.glade:116 msgid "Ticks" msgstr "Ticks" #: data/ui/calibration_signals.glade:117 msgid "Gaussian Noise" msgstr "Ruido Gaussiano" #: data/ui/calibration_signals.glade:118 msgid "Red Noise" msgstr "Ruido Rojo" #: data/ui/calibration_signals.glade:119 msgid "Blue Noise" msgstr "Ruido Azul" #: data/ui/calibration_signals.glade:120 msgid "Violet Noise" msgstr "Ruido Violeta" #: data/ui/calibration_mic.glade:29 msgid "Window" msgstr "Ventana" #: data/ui/calibration_mic.glade:70 msgid "Measure Noise" msgstr "Medir Ruido" #: data/ui/calibration_mic.glade:99 msgid "Subtract Noise" msgstr "Reducir Ruido" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Efectos de Sonido para las Aplicaciones de PulseAudio" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Wellington Wallace" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects es una avanzada herramienta de manipulación de audio. Incluye " "un ecualizador, limitador, compresor y herramienta de reverberación , solo " "por mencionar algunos. Para complementar esto hay también incluido un " "analizador de espectro." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "Debido a que PulseEffects usa por defecto el servicio de sonido PulseAudio, " "este funcionará con la mayoría, sino que todas, las aplicaciones que use. " "Todas las aplicaciones son mostradas en la ventana principal donde pueden " "ser habilitadas individualmente." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Además de manipular el sonido de salida, PulseEffects puede aplicar efectos " "a dispositivos de entrada, como micrófonos. Esto es útil, por ejemplo, en la " "grabación de audio, pero también funciona correctamente durante " "conversaciones de voces." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "Cuando PulseEffects esté activo este convenientemente recordará la " "configuración usada en la última sesión. También es posible guardar la " "configuración actual como un perfil." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "Establecer el volumen y encender/apagar los efectos" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "Incluye un ecualizador con perfiles incluidos" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Limitador de Entrada" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Calibración" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "Ecualizador, Compresor y Otros Efectos de Sonido" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "limitador;compresor;reverberación;ecualizador;autovolumen;" #. Translators: This is an icon name, don't translate! #: data/com.github.wwmm.pulseeffects.desktop.in:10 msgid "pulseeffects" msgstr "pulseeffects" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:201 msgid "\"Presets\"" msgstr "\"Perfiles\"" #: src/application.cpp:19 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "" "Salir de PulseEffects. Útil cuando se está ejecutando en modo de servicio." #: src/application.cpp:21 msgid "Show available presets." msgstr "Mostrar perfiles disponibles." #: src/application.cpp:24 msgid "Load a preset. Example: pulseeffects -l music" msgstr "Cargar un perfil. Ejemplo: pulseeffects -l music" #: src/application.cpp:26 msgid "Reset PulseEffects." msgstr "Restablecer PulseEffects." #: src/application.cpp:29 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "" "Bypass global, 1 para habilitar, 2 para deshabilitar y 3 para obtener el " "estado" #: src/application.cpp:263 msgid "Output Presets: " msgstr "Perfiles de Dispositivos de Salida: " #: src/application.cpp:271 msgid "Input Presets: " msgstr "Perfiles de Dispositivos de Entrada: " #: src/effects_base_ui.cpp:27 msgid "Applications" msgstr "Aplicaciones" #: src/blocklist_settings_ui.cpp:71 msgid "Blocklist" msgstr "Lista Negra" #: src/general_settings_ui.cpp:121 msgid "General" msgstr "General" #: src/pulse_settings_ui.cpp:138 msgid "Pulseaudio" msgstr "Pulseaudio" #: src/presets_menu_ui.cpp:111 src/convolver_ui.cpp:247 msgid "Open" msgstr "Abrir" #: src/presets_menu_ui.cpp:111 src/convolver_ui.cpp:247 msgid "Cancel" msgstr "Cancelar" #: src/app_info_ui.cpp:85 msgid "paused" msgstr "pausado" #: src/app_info_ui.cpp:87 msgid "playing" msgstr "reproduciendo" #: src/calibration_ui.cpp:171 msgid "Calibration Microphone" msgstr "Calibrar Micrófono" #: src/convolver_ui.cpp:246 msgid "Import Impulse File" msgstr "Importar Archivo Impulse" #: src/convolver_ui.cpp:290 src/convolver_ui.cpp:291 src/convolver_ui.cpp:293 msgid "Failed" msgstr "Fallido" #: src/convolver_ui.cpp:295 msgid "Could Not Load The Impulse File" msgstr "No se pudo encontrar el archivo Impulse" #: src/equalizer_ui.cpp:307 src/equalizer_ui.cpp:426 msgid "infinity" msgstr "infinidad" easyeffects-4.8.7/po/es_MX.po000066400000000000000000001150001424023573300160240ustar00rootroot00000000000000# Spanish (MX) translation for Pulseeffects. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the Pulseeffects package. # CCaroV , 2019. # msgid "" msgstr "" "Project-Id-Version: pulseeffects\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-28 14:03-0300\n" "PO-Revision-Date: 2020-01-09 18:18-0500\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.6\n" "Last-Translator: Christian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: es_CO\n" #: data/ui/application.glade:46 src/calibration_ui.cpp:39 #: src/calibration_ui.cpp:164 msgid "Test Signals" msgstr "Señal de Prueba" #: data/ui/application.glade:61 msgid "Global Bypass" msgstr "Bypass Global" #: data/ui/application.glade:83 #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 msgid "PulseEffects" msgstr "PulseEffects" #: data/ui/application.glade:155 data/ui/general_settings.glade:107 #: data/ui/equalizer.glade:253 msgid "Settings" msgstr "Ajustes" #: data/ui/application.glade:177 msgid "Help" msgstr "Ayuda" #: data/ui/application.glade:200 data/ui/filter.glade:204 #: data/ui/equalizer.glade:309 data/ui/reverb.glade:284 #: data/ui/crossfeed.glade:47 src/presets_menu_ui.cpp:115 #: src/presets_menu_ui.cpp:274 src/presets_menu_ui.cpp:291 msgid "Presets" msgstr "Perfiles" #: data/ui/spectrum_settings.glade:59 msgid "Show Spectrum" msgstr "Mostrar Espectro" #: data/ui/spectrum_settings.glade:84 msgid "Fill" msgstr "Rellenar" #: data/ui/spectrum_settings.glade:109 msgid "Border" msgstr "Bordes" #: data/ui/spectrum_settings.glade:134 msgid "Use Custom Color" msgstr "Usar Color Personalizado" #: data/ui/spectrum_settings.glade:159 msgid "Use Gradient" msgstr "Usar Degradado" #: data/ui/spectrum_settings.glade:185 msgid "Spectrum Color" msgstr "Color del Espectro" #: data/ui/spectrum_settings.glade:213 msgid "Gradient Color" msgstr "Color del Degradado" #: data/ui/spectrum_settings.glade:241 msgid "Spectrum Type" msgstr "Tipo de Espectro" #: data/ui/spectrum_settings.glade:255 msgid "Bars" msgstr "Barras" #: data/ui/spectrum_settings.glade:256 msgid "Lines" msgstr "Lineas" #: data/ui/spectrum_settings.glade:271 msgid "Points" msgstr "Puntos" #: data/ui/spectrum_settings.glade:303 msgid "Height" msgstr "Altura" #: data/ui/spectrum_settings.glade:336 msgid "Scale" msgstr "Escala" #: data/ui/spectrum_settings.glade:369 msgid "Exponent" msgstr "Exponente" #: data/ui/spectrum_settings.glade:402 msgid "Sampling" msgstr "Muestreo" #: data/ui/spectrum_settings.glade:433 msgid "Line Width" msgstr "Ancho de Linea" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:389 msgid "Use Default" msgstr "Usar Predeterminado" #: data/ui/pulse_settings.glade:150 data/ui/pulse_settings.glade:440 msgid "Block Size" msgstr "Tamaño de Bloque" #: data/ui/pulse_settings.glade:196 data/ui/pulse_settings.glade:486 msgid "Pipeline Input" msgstr "Caudal de Entrada" #: data/ui/pulse_settings.glade:210 data/ui/pulse_settings.glade:301 #: data/ui/pulse_settings.glade:500 data/ui/pulse_settings.glade:591 #: data/ui/app_info.glade:159 msgid "Buffer" msgstr "Buffer" #: data/ui/pulse_settings.glade:243 data/ui/pulse_settings.glade:334 #: data/ui/pulse_settings.glade:513 data/ui/pulse_settings.glade:604 #: data/ui/app_info.glade:186 msgid "Latency" msgstr "Latencia" #: data/ui/pulse_settings.glade:287 data/ui/pulse_settings.glade:577 msgid "Pipeline Output" msgstr "Caudal de Salida" #: data/ui/pulse_settings.glade:370 data/ui/blocklist_settings.glade:130 msgid "Input Effects" msgstr "Efectos de Entrada" #: data/ui/pulse_settings.glade:660 data/ui/blocklist_settings.glade:224 msgid "Output Effects" msgstr "Efectos de Salida" #: data/ui/blocklist_settings.glade:53 data/ui/blocklist_settings.glade:147 #: data/ui/presets_menu.glade:68 data/ui/presets_menu.glade:177 msgid "Create Preset" msgstr "Crear Perfil" #: data/ui/blocklist_settings.glade:72 data/ui/blocklist_settings.glade:166 #: data/ui/pulse_info.glade:49 data/ui/presets_menu.glade:55 #: data/ui/presets_menu.glade:164 msgid "Name" msgstr "Nombre" #: data/ui/general_settings.glade:31 msgid "Start Service at Login" msgstr "Iniciar Servicio al Iniciar Sesión" #: data/ui/general_settings.glade:56 msgid "Process All Outputs" msgstr "Procesar Todas las Salidas" #: data/ui/general_settings.glade:81 msgid "Use Dark Theme" msgstr "Usar Tema Oscuro" #: data/ui/general_settings.glade:116 data/ui/equalizer_band.glade:183 #: data/ui/equalizer_band.glade:229 msgid "Reset" msgstr "Restablecer" #: data/ui/general_settings.glade:133 data/ui/general_settings.glade:206 msgid "Niceness" msgstr "Meticulosidad" #: data/ui/general_settings.glade:134 msgid "Real Time" msgstr "Tiempo Real" #: data/ui/general_settings.glade:135 msgid "None" msgstr "Ninguno" #: data/ui/general_settings.glade:151 msgid "Priority Type" msgstr "Tipo de Prioridad" #: data/ui/general_settings.glade:161 msgid "About" msgstr "Acerca de" #: data/ui/general_settings.glade:180 msgid "Process All Inputs" msgstr "Procesar Todas las Entradas" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "Prioridad" #: data/ui/about.glade.in:11 msgid "Audio effects for PulseAudio applications" msgstr "Efectos de Sonido para las aplicaciones de PulseAudio" #: data/ui/app_info.glade:51 msgid "Format" msgstr "Formato" #: data/ui/app_info.glade:78 data/ui/convolver.glade:257 msgid "Rate" msgstr "Tasa" #: data/ui/app_info.glade:105 data/ui/pulse_info.glade:238 #: data/ui/stereo_tools.glade:629 msgid "Channels" msgstr "Canales" # Resampler does not have an official translation #: data/ui/app_info.glade:132 msgid "Resampler" msgstr "Remuestreador" #: data/ui/app_info.glade:213 msgid "State" msgstr "Estado" #: data/ui/pulse_info.glade:76 msgid "Version" msgstr "Versión" #: data/ui/pulse_info.glade:103 msgid "Default Sink" msgstr "Profundidad Predeterminda" #: data/ui/pulse_info.glade:115 msgid "Default Source" msgstr "Fuente Predeterminada" #: data/ui/pulse_info.glade:157 msgid "Protocol" msgstr "Protocolo" #: data/ui/pulse_info.glade:184 msgid "Default Sample Format" msgstr "Formato de Muestreo Predeterminado" #: data/ui/pulse_info.glade:211 msgid "Default Sampling Rate" msgstr "Tasa de Muestreo por Defecto" #: data/ui/pulse_info.glade:265 msgid "Channel Mapping" msgstr "Mapa de Canales" #: data/ui/pulse_info.glade:290 msgid "Server" msgstr "Servidor" #: data/ui/pulse_info.glade:335 msgid "Modules" msgstr "Módulos" #: data/ui/pulse_info.glade:381 msgid "Clients" msgstr "Clientes" #: data/ui/pulse_info.glade:444 msgid "File" msgstr "Archivo" #: data/ui/pulse_info.glade:454 msgid "Configuration" msgstr "Configuración" # Resamplers does not have an official translation #: data/ui/pulse_info.glade:487 msgid "Resamplers" msgstr "Remuestreadores" #: data/ui/autogain.glade:24 msgid "Auto Gain" msgstr "Ganancia Automática" #: data/ui/autogain.glade:145 msgid "Reset History" msgstr "Restablecer Historial" #: data/ui/autogain.glade:157 msgid "Detect Silence" msgstr "Detectar Silencio" #: data/ui/autogain.glade:169 msgid "Use Geometric Mean" msgstr "Usar la Media Geométrica" #: data/ui/autogain.glade:198 msgid "Target" msgstr "Objetivo" #: data/ui/autogain.glade:214 msgid "-23" msgstr "-23" #: data/ui/autogain.glade:249 data/ui/autogain.glade:591 msgid "Momentary" msgstr "Momentáneo" #: data/ui/autogain.glade:264 data/ui/autogain.glade:604 msgid "Short Term" msgstr "Corto Plazo" #: data/ui/autogain.glade:279 data/ui/autogain.glade:617 msgid "Integrated" msgstr "Integrado" #: data/ui/autogain.glade:349 msgid "Weights" msgstr "Fuerza" #: data/ui/autogain.glade:378 data/ui/autogain.glade:570 #: data/ui/limiter.glade:365 data/ui/compressor.glade:718 #: data/ui/multiband_compressor.glade:1958 data/ui/filter.glade:368 #: data/ui/equalizer.glade:516 data/ui/reverb.glade:630 #: data/ui/bass_enhancer.glade:479 data/ui/exciter.glade:483 #: data/ui/stereo_tools.glade:299 data/ui/stereo_tools.glade:804 #: data/ui/crossfeed.glade:202 data/ui/maximizer.glade:239 #: data/ui/loudness.glade:244 data/ui/gate.glade:487 #: data/ui/multiband_gate.glade:2107 data/ui/deesser.glade:568 #: data/ui/convolver.glade:477 data/ui/crystalizer.glade:228 #: data/ui/pitch.glade:322 data/ui/webrtc.glade:624 data/ui/delay.glade:210 #: data/ui/presets_menu.glade:255 msgid "Input" msgstr "Entrada" #: data/ui/autogain.glade:393 data/ui/autogain.glade:826 #: data/ui/limiter.glade:380 data/ui/compressor.glade:733 #: data/ui/multiband_compressor.glade:753 #: data/ui/multiband_compressor.glade:1130 #: data/ui/multiband_compressor.glade:1508 #: data/ui/multiband_compressor.glade:1886 #: data/ui/multiband_compressor.glade:1973 data/ui/filter.glade:383 #: data/ui/equalizer.glade:531 data/ui/reverb.glade:645 #: data/ui/bass_enhancer.glade:511 data/ui/exciter.glade:515 #: data/ui/stereo_tools.glade:776 data/ui/stereo_tools.glade:818 #: data/ui/crossfeed.glade:217 data/ui/maximizer.glade:254 #: data/ui/loudness.glade:162 data/ui/loudness.glade:259 data/ui/gate.glade:502 #: data/ui/multiband_gate.glade:806 data/ui/multiband_gate.glade:1215 #: data/ui/multiband_gate.glade:1625 data/ui/multiband_gate.glade:2035 #: data/ui/multiband_gate.glade:2122 data/ui/deesser.glade:583 #: data/ui/convolver.glade:492 data/ui/crystalizer.glade:243 #: data/ui/pitch.glade:336 data/ui/webrtc.glade:639 data/ui/delay.glade:225 #: data/ui/presets_menu.glade:146 msgid "Output" msgstr "Salida" #: data/ui/autogain.glade:708 msgid "Relative" msgstr "Reativo" #: data/ui/autogain.glade:721 data/ui/compressor.glade:900 #: data/ui/deesser.glade:295 msgid "Gain" msgstr "Ganancia" #: data/ui/autogain.glade:787 data/ui/loudness.glade:24 #: data/ui/loudness.glade:128 msgid "Loudness" msgstr "Loudness" #: data/ui/autogain.glade:840 msgid "Range" msgstr "Rango" #: data/ui/limiter.glade:30 data/ui/webrtc.glade:395 msgid "Limiter" msgstr "Limitador" #: data/ui/limiter.glade:149 msgid "Input Gain" msgstr "Ganancia de Entrada" #: data/ui/limiter.glade:182 msgid "Limit" msgstr "Límite" #: data/ui/limiter.glade:237 data/ui/compressor.glade:373 #: data/ui/multiband_compressor.glade:534 #: data/ui/multiband_compressor.glade:907 #: data/ui/multiband_compressor.glade:1285 #: data/ui/multiband_compressor.glade:1663 data/ui/maximizer.glade:213 #: data/ui/gate.glade:299 data/ui/multiband_gate.glade:554 #: data/ui/multiband_gate.glade:960 data/ui/multiband_gate.glade:1370 #: data/ui/multiband_gate.glade:1780 msgid "Release" msgstr "Liberar" #: data/ui/limiter.glade:250 data/ui/compressor.glade:570 msgid "Lookahead" msgstr "Atenuación" #: data/ui/limiter.glade:285 msgid "Oversampling" msgstr "Sobre Muestreo" #: data/ui/limiter.glade:334 msgid "ASC" msgstr "ASC" #: data/ui/limiter.glade:395 msgid "Attenuation" msgstr "Atenuación" #: data/ui/compressor.glade:30 data/ui/compressor.glade:442 #: data/ui/webrtc.glade:482 data/com.github.wwmm.pulseeffects.appdata.xml.in:52 msgid "Compressor" msgstr "Compresor" #: data/ui/compressor.glade:239 data/ui/multiband_compressor.glade:568 #: data/ui/multiband_compressor.glade:942 #: data/ui/multiband_compressor.glade:1320 #: data/ui/multiband_compressor.glade:1698 data/ui/maximizer.glade:126 #: data/ui/gate.glade:333 data/ui/multiband_gate.glade:588 #: data/ui/multiband_gate.glade:995 data/ui/multiband_gate.glade:1405 #: data/ui/multiband_gate.glade:1815 data/ui/deesser.glade:458 msgid "Threshold" msgstr "Límite" #: data/ui/compressor.glade:272 data/ui/multiband_compressor.glade:601 #: data/ui/multiband_compressor.glade:976 #: data/ui/multiband_compressor.glade:1354 #: data/ui/multiband_compressor.glade:1732 data/ui/gate.glade:366 #: data/ui/multiband_gate.glade:621 data/ui/multiband_gate.glade:1029 #: data/ui/multiband_gate.glade:1439 data/ui/multiband_gate.glade:1849 #: data/ui/deesser.glade:491 msgid "Ratio" msgstr "Radio" #: data/ui/compressor.glade:304 data/ui/multiband_compressor.glade:633 #: data/ui/multiband_compressor.glade:1009 #: data/ui/multiband_compressor.glade:1387 #: data/ui/multiband_compressor.glade:1765 data/ui/gate.glade:398 #: data/ui/multiband_gate.glade:653 data/ui/multiband_gate.glade:1062 #: data/ui/multiband_gate.glade:1472 data/ui/multiband_gate.glade:1882 msgid "Knee" msgstr "Codo" #: data/ui/compressor.glade:338 data/ui/multiband_compressor.glade:667 #: data/ui/multiband_compressor.glade:1044 #: data/ui/multiband_compressor.glade:1422 #: data/ui/multiband_compressor.glade:1800 data/ui/gate.glade:432 #: data/ui/multiband_gate.glade:687 data/ui/multiband_gate.glade:1097 #: data/ui/multiband_gate.glade:1507 data/ui/multiband_gate.glade:1917 #: data/ui/deesser.glade:522 msgid "Makeup" msgstr "Amplificación" #: data/ui/compressor.glade:386 data/ui/multiband_compressor.glade:500 #: data/ui/multiband_compressor.glade:872 #: data/ui/multiband_compressor.glade:1250 #: data/ui/multiband_compressor.glade:1628 data/ui/gate.glade:265 #: data/ui/multiband_gate.glade:520 data/ui/multiband_gate.glade:925 #: data/ui/multiband_gate.glade:1335 data/ui/multiband_gate.glade:1745 msgid "Attack" msgstr "Ataque" #: data/ui/compressor.glade:413 msgid "Downward" msgstr "Hacia Abajo" #: data/ui/compressor.glade:414 msgid "Upward" msgstr "Hacia Arriba" #: data/ui/compressor.glade:426 msgid "Compression Mode" msgstr "Modo de Compresión" #: data/ui/compressor.glade:454 data/ui/bass_enhancer.glade:145 #: data/ui/exciter.glade:145 data/ui/deesser.glade:162 msgid "Listen" msgstr "Escuchar" #: data/ui/compressor.glade:500 msgid "Pre-amplification" msgstr "Pre-amplificación" #: data/ui/compressor.glade:535 msgid "Reactivity" msgstr "Reactividad" #: data/ui/compressor.glade:583 msgid "Feed-forward" msgstr "Adelantar" #: data/ui/compressor.glade:584 msgid "Feed-back" msgstr "Realimentar" #: data/ui/compressor.glade:598 data/ui/equalizer_band.glade:48 msgid "Type" msgstr "Tipo" #: data/ui/compressor.glade:612 data/ui/multiband_compressor.glade:473 #: data/ui/multiband_compressor.glade:845 #: data/ui/multiband_compressor.glade:1223 #: data/ui/multiband_compressor.glade:1601 data/ui/gate.glade:220 #: data/ui/multiband_gate.glade:493 data/ui/multiband_gate.glade:898 #: data/ui/multiband_gate.glade:1308 data/ui/multiband_gate.glade:1718 #: data/ui/deesser.glade:218 data/ui/deesser.glade:328 msgid "Peak" msgstr "Pico" #: data/ui/compressor.glade:613 data/ui/multiband_compressor.glade:472 #: data/ui/multiband_compressor.glade:844 #: data/ui/multiband_compressor.glade:1222 #: data/ui/multiband_compressor.glade:1600 data/ui/gate.glade:219 #: data/ui/multiband_gate.glade:492 data/ui/multiband_gate.glade:897 #: data/ui/multiband_gate.glade:1307 data/ui/multiband_gate.glade:1717 #: data/ui/deesser.glade:217 msgid "RMS" msgstr "RMS" #: data/ui/compressor.glade:614 msgid "Low-Pass" msgstr "Paso Bajo" #: data/ui/compressor.glade:615 msgid "Uniform" msgstr "Uniforme" #: data/ui/compressor.glade:629 data/ui/multiband_compressor.glade:283 #: data/ui/equalizer.glade:200 data/ui/equalizer_band.glade:79 #: data/ui/stereo_tools.glade:461 data/ui/multiband_gate.glade:303 #: data/ui/deesser.glade:204 data/ui/webrtc.glade:350 msgid "Mode" msgstr "Modo" #: data/ui/compressor.glade:643 msgid "Middle" msgstr "Medio" #: data/ui/compressor.glade:644 msgid "Side" msgstr "Lado" #: data/ui/compressor.glade:645 data/ui/equalizer.glade:448 #: data/ui/stereo_tools.glade:524 data/ui/delay.glade:131 msgid "Left" msgstr "Izquierda" #: data/ui/compressor.glade:646 data/ui/equalizer.glade:489 #: data/ui/stereo_tools.glade:596 data/ui/delay.glade:163 msgid "Right" msgstr "Derecha" #: data/ui/compressor.glade:660 msgid "Source" msgstr "Fuente" #: data/ui/compressor.glade:676 data/ui/compressor.glade:913 msgid "Sidechain" msgstr "Cadena Lateral" #: data/ui/compressor.glade:989 msgid "Curve" msgstr "Curva" #: data/ui/multiband_compressor.glade:70 msgid "Multiband Compressor" msgstr "Compresor Multibanda" #: data/ui/multiband_compressor.glade:297 data/ui/multiband_gate.glade:317 msgid "LR4" msgstr "LR4" #: data/ui/multiband_compressor.glade:298 data/ui/multiband_gate.glade:318 msgid "LR8" msgstr "LR8" #: data/ui/multiband_compressor.glade:312 data/ui/multiband_gate.glade:332 msgid "Split 1/2" msgstr "Dividir 1/2" #: data/ui/multiband_compressor.glade:325 data/ui/multiband_gate.glade:345 msgid "Split 2/3" msgstr "Dividir 2/3" #: data/ui/multiband_compressor.glade:338 data/ui/multiband_gate.glade:358 msgid "Split 3/4" msgstr "Dividir 3/4" #: data/ui/multiband_compressor.glade:442 #: data/ui/multiband_compressor.glade:814 #: data/ui/multiband_compressor.glade:1192 #: data/ui/multiband_compressor.glade:1570 data/ui/multiband_gate.glade:462 #: data/ui/multiband_gate.glade:867 data/ui/multiband_gate.glade:1277 #: data/ui/multiband_gate.glade:1687 data/ui/crystalizer_band.glade:39 msgid "Bypass" msgstr "Bypass" #: data/ui/multiband_compressor.glade:455 #: data/ui/multiband_compressor.glade:827 #: data/ui/multiband_compressor.glade:1205 #: data/ui/multiband_compressor.glade:1583 data/ui/equalizer_band.glade:302 #: data/ui/multiband_gate.glade:475 data/ui/multiband_gate.glade:880 #: data/ui/multiband_gate.glade:1290 data/ui/multiband_gate.glade:1700 msgid "Solo" msgstr "Solo" #: data/ui/multiband_compressor.glade:713 #: data/ui/multiband_compressor.glade:1090 #: data/ui/multiband_compressor.glade:1468 #: data/ui/multiband_compressor.glade:1846 msgid "Compression" msgstr "Compresión" #: data/ui/multiband_compressor.glade:796 data/ui/multiband_gate.glade:849 msgid "Sub Band" msgstr "Sub Banda" #: data/ui/multiband_compressor.glade:1173 data/ui/multiband_gate.glade:1258 msgid "Low Band" msgstr "Banda Baja" #: data/ui/multiband_compressor.glade:1551 data/ui/multiband_gate.glade:1668 msgid "Mid Band" msgstr "Banda Media" #: data/ui/multiband_compressor.glade:1929 data/ui/multiband_gate.glade:2078 msgid "High Band" msgstr "Banda Alta" #: data/ui/filter.glade:31 msgid "Filter" msgstr "Filtro" #: data/ui/filter.glade:123 msgid "Muted" msgstr "Silenciado" #: data/ui/filter.glade:135 data/ui/reverb.glade:209 msgid "Disco" msgstr "Disco" #: data/ui/filter.glade:147 msgid "Distant Headphones" msgstr "Audífonos a Distancia" #: data/ui/filter.glade:159 data/ui/reverb.glade:235 data/ui/crossfeed.glade:72 msgid "Default" msgstr "Predeterminado" #: data/ui/filter.glade:220 msgid "12dB/oct Lowpass" msgstr "12dB/oct Paso Bajo" #: data/ui/filter.glade:221 msgid "24dB/oct Lowpass" msgstr "24dB/oct Paso Bajo" #: data/ui/filter.glade:222 msgid "36dB/oct Lowpass" msgstr "36dB/oct Paso Bajo" #: data/ui/filter.glade:223 msgid "12dB/oct Highpass" msgstr "12dB/oct Pase Alto" #: data/ui/filter.glade:224 msgid "24dB/oct Highpass" msgstr "24dB/oct Pase Alto" #: data/ui/filter.glade:225 msgid "36dB/oct Highpass" msgstr "36dB/oct Pase Alto" #: data/ui/filter.glade:226 msgid "6dB/oct Bandpass" msgstr "6dB/oct Paso de Banda" #: data/ui/filter.glade:227 msgid "12dB/oct Bandpass" msgstr "12dB/oct Paso de Banda" #: data/ui/filter.glade:228 msgid "18dB/oct Bandpass" msgstr "18dB/oct Paso de Banda" #: data/ui/filter.glade:229 msgid "6dB/oct Bandreject" msgstr "6dB/oct Rechazo de Banda" #: data/ui/filter.glade:230 msgid "12dB/oct Bandreject" msgstr "12dB/oct Rechazo de Banda" #: data/ui/filter.glade:231 msgid "18dB/oct Bandreject" msgstr "18dB/oct Rechazo de Banda" #: data/ui/filter.glade:254 data/ui/equalizer_band.glade:152 #: data/ui/calibration_signals.glade:32 msgid "Frequency" msgstr "Frecuencia" #: data/ui/filter.glade:288 data/ui/equalizer_band.glade:67 msgid "Resonance" msgstr "Resonancia" #: data/ui/filter.glade:323 msgid "Inertia" msgstr "Inercia" #: data/ui/equalizer.glade:24 msgid "Equalizer" msgstr "Ecualizador" #: data/ui/equalizer.glade:129 msgid "Split Channels" msgstr "Dividir Canales" #: data/ui/equalizer.glade:155 msgid "IIR" msgstr "IIR" #: data/ui/equalizer.glade:156 msgid "FIR" msgstr "FIR" #: data/ui/equalizer.glade:157 msgid "FFT" msgstr "FFT" #: data/ui/equalizer.glade:187 msgid "Bands" msgstr "Bandas" #: data/ui/equalizer.glade:209 msgid "Flat Response" msgstr "Respuesta Plana" #: data/ui/equalizer.glade:224 msgid "Calculate Frequencies" msgstr "Calcular Frecuencias" #: data/ui/equalizer.glade:238 msgid "Reset Equalizer" msgstr "Restablecer Ecualizador" #: data/ui/equalizer_band.glade:60 msgid "Off" msgstr "Apagdo" #: data/ui/equalizer_band.glade:61 msgid "Bell" msgstr "Timbre" #: data/ui/equalizer_band.glade:62 msgid "High Pass" msgstr "Pase Alto" #: data/ui/equalizer_band.glade:63 msgid "High Shelf" msgstr "Estante Alto" #: data/ui/equalizer_band.glade:64 msgid "Low Pass" msgstr "Paso Bajo" #: data/ui/equalizer_band.glade:65 msgid "Low Shelf" msgstr "Estante Bajo" #: data/ui/equalizer_band.glade:66 msgid "Notch" msgstr "Muesca" #: data/ui/equalizer_band.glade:91 msgid "RLC (BT)" msgstr "RLC (BT)" #: data/ui/equalizer_band.glade:92 msgid "RLC (MT)" msgstr "RLC (MT)" #: data/ui/equalizer_band.glade:93 msgid "BWC (BT)" msgstr "BWC (BT)" #: data/ui/equalizer_band.glade:94 msgid "BWC (MT)" msgstr "BWC (MT)" #: data/ui/equalizer_band.glade:95 msgid "LRX (BT)" msgstr "LRX (BT)" #: data/ui/equalizer_band.glade:96 msgid "LRX (MT)" msgstr "LRX (MT)" #: data/ui/equalizer_band.glade:97 msgid "APO (DR)" msgstr "APO (DR)" #: data/ui/equalizer_band.glade:109 msgid "Slope" msgstr "Pendiente" #: data/ui/equalizer_band.glade:121 msgid "x1" msgstr "x1" #: data/ui/equalizer_band.glade:122 msgid "x2" msgstr "x2" #: data/ui/equalizer_band.glade:123 msgid "x3" msgstr "x3" #: data/ui/equalizer_band.glade:124 msgid "x4" msgstr "x4" #: data/ui/equalizer_band.glade:201 msgid "Quality" msgstr "Calidad" #: data/ui/equalizer_band.glade:252 msgid "Width" msgstr "Anchura" #: data/ui/equalizer_band.glade:314 data/ui/stereo_tools.glade:550 #: data/ui/stereo_tools.glade:609 data/ui/crystalizer_band.glade:27 msgid "Mute" msgstr "Silenciar" #: data/ui/equalizer_preset_row.glade:37 data/ui/irs_row.glade:59 #: data/ui/preset_row.glade:51 msgid "Apply" msgstr "Aplicar" #: data/ui/reverb.glade:64 msgid "Reverberation" msgstr "Reverberación" #: data/ui/reverb.glade:157 msgid "Ambience" msgstr "Ambiente" #: data/ui/reverb.glade:170 msgid "Empty Walls" msgstr "Paredes Vacías" #: data/ui/reverb.glade:183 msgid "Room" msgstr "Habitación" #: data/ui/reverb.glade:196 msgid "Large Empty Hall" msgstr "Habitación Vacía Grande" #: data/ui/reverb.glade:222 msgid "Large Occupied Hall" msgstr "Habitación Ocupada Grande" #: data/ui/reverb.glade:334 msgid "Pre Delay" msgstr "Pre Retraso" #: data/ui/reverb.glade:347 msgid "Decay Time" msgstr "Tiempo de Decaimiento" #: data/ui/reverb.glade:380 data/ui/bass_enhancer.glade:242 #: data/ui/exciter.glade:245 msgid "Amount" msgstr "Cantidad" #: data/ui/reverb.glade:412 msgid "Dry" msgstr "Secar" #: data/ui/reverb.glade:444 msgid "Bass Cut" msgstr "Corte de Bajos" #: data/ui/reverb.glade:495 msgid "Treble Cut" msgstr "Corte de Sobreagudos" #: data/ui/reverb.glade:538 msgid "Diffusion" msgstr "Difusión" #: data/ui/reverb.glade:550 msgid "Room Size" msgstr "Tamaño de la Habitación" #: data/ui/reverb.glade:563 msgid "Small" msgstr "Pequeña" #: data/ui/reverb.glade:564 msgid "Medium" msgstr "Mediana" #: data/ui/reverb.glade:565 msgid "Large" msgstr "Grande" #: data/ui/reverb.glade:566 msgid "Tunnel" msgstr "Túnel" #: data/ui/reverb.glade:567 msgid "Large/smooth" msgstr "Grande/Liso" #: data/ui/reverb.glade:568 msgid "Experimental" msgstr "Experimental" #: data/ui/reverb.glade:581 msgid "High Frequency Damping" msgstr "Amortiguación de Alta Frecuencia" #: data/ui/bass_enhancer.glade:50 msgid "Bass Enhancer" msgstr "Potenciado de Graves" #: data/ui/bass_enhancer.glade:186 data/ui/exciter.glade:187 msgid "3rd" msgstr "3era" #: data/ui/bass_enhancer.glade:198 data/ui/exciter.glade:199 msgid "2nd" msgstr "2nda" #: data/ui/bass_enhancer.glade:210 data/ui/exciter.glade:211 msgid "Blend Harmonics" msgstr "Mezclar Harmónicos" #: data/ui/bass_enhancer.glade:254 data/ui/bass_enhancer.glade:386 #: data/ui/exciter.glade:258 data/ui/exciter.glade:390 msgid "Harmonics" msgstr "Harmónicos" #: data/ui/bass_enhancer.glade:266 data/ui/exciter.glade:271 msgid "Scope" msgstr "Alcance" #: data/ui/bass_enhancer.glade:355 msgid "Floor" msgstr "Fondo" #: data/ui/exciter.glade:50 msgid "Exciter" msgstr "Excitador" #: data/ui/exciter.glade:358 data/ui/maximizer.glade:159 msgid "Ceiling" msgstr "Límite" #: data/ui/stereo_tools.glade:42 msgid "Stereo Tools" msgstr "Herramientas Estéreo" #: data/ui/stereo_tools.glade:207 msgid "Softclip" msgstr "Clip Suave" #: data/ui/stereo_tools.glade:231 data/ui/stereo_tools.glade:647 msgid "Balance" msgstr "Balance" #: data/ui/stereo_tools.glade:263 msgid "S/C Level" msgstr "Nivel S/C" #: data/ui/stereo_tools.glade:321 msgid "Side Level" msgstr "Nivel Lateral" #: data/ui/stereo_tools.glade:372 msgid "Side Balance" msgstr "Balance Lateral" #: data/ui/stereo_tools.glade:404 msgid "Middle Level" msgstr "Nivel Medio" #: data/ui/stereo_tools.glade:417 msgid "Middle Panorama" msgstr "Panorama Medio" #: data/ui/stereo_tools.glade:475 msgid "LR > LR (Stereo Default)" msgstr "LR > LR (Estéreo Predeterminado)" #: data/ui/stereo_tools.glade:476 msgid "LR > MS (Stereo to Mid-Side)" msgstr "LR > MS (Estéreo hacia Medio Lado)" #: data/ui/stereo_tools.glade:477 msgid "MS > LR (Mid-Side to Stereo)" msgstr "MS > LR (Medio Lado - Estéreo)" #: data/ui/stereo_tools.glade:478 msgid "LR > LL (Mono Left Channel)" msgstr "LR > LL (Canal Izquierdo Mono)" #: data/ui/stereo_tools.glade:479 msgid "LR > RR (Mono Right Channel)" msgstr "LR > RR (Canal Derecho Mono)" #: data/ui/stereo_tools.glade:480 msgid "LR > L+R (Mono Sum L+R)" msgstr "LR > L+R (Suma Mono L+R)" #: data/ui/stereo_tools.glade:481 msgid "LR > RL (Stereo Flip Channels)" msgstr "LR > RL (Intercambiar Canales)" #: data/ui/stereo_tools.glade:498 msgid "Stereo Matrix" msgstr "Matriz Estéreo" #: data/ui/stereo_tools.glade:537 data/ui/stereo_tools.glade:578 msgid "Invert Phase" msgstr "Invertir Fase" #: data/ui/stereo_tools.glade:679 msgid "Delay L/R" msgstr "Retraso L/R" #: data/ui/stereo_tools.glade:713 msgid "Stereo Base" msgstr "Base Estéreo" #: data/ui/stereo_tools.glade:746 msgid "Stereo Phase" msgstr "Fase Estéreo" #: data/ui/crossfeed.glade:59 msgid "Jmeier" msgstr "Jmeier" #: data/ui/crossfeed.glade:85 msgid "Cmoy" msgstr "Cmoy" #: data/ui/crossfeed.glade:122 msgid "Cutoff" msgstr "Umbral" #: data/ui/crossfeed.glade:155 msgid "Feed" msgstr "Alimentar" #: data/ui/crossfeed.glade:392 msgid "Crossfeed" msgstr "Crossfeed" #: data/ui/maximizer.glade:29 msgid "Maximizer" msgstr "Maximizador" #: data/ui/maximizer.glade:269 data/ui/gate.glade:190 msgid "Gain Reduction" msgstr "Reducción de Ganancia" #: data/ui/loudness.glade:196 msgid "Link" msgstr "Acoplar" #: data/ui/gate.glade:31 msgid "Gate" msgstr "Puerta de Ruido" #: data/ui/gate.glade:162 data/ui/deesser.glade:190 msgid "Detection" msgstr "Detección" #: data/ui/gate.glade:176 msgid "Stereo Link" msgstr "Acoplamiento Estéreo" #: data/ui/gate.glade:235 msgid "Average" msgstr "Promedio" #: data/ui/gate.glade:236 msgid "Maximum" msgstr "Máximo" #: data/ui/gate.glade:667 data/ui/multiband_gate.glade:766 #: data/ui/multiband_gate.glade:1175 data/ui/multiband_gate.glade:1585 #: data/ui/multiband_gate.glade:1995 msgid "Gating" msgstr "Puerta" #: data/ui/multiband_gate.glade:70 msgid "Multiband Gate" msgstr "Puerta Multibanda" #: data/ui/multiband_gate.glade:722 data/ui/multiband_gate.glade:1152 #: data/ui/multiband_gate.glade:1562 data/ui/multiband_gate.glade:1972 #: data/ui/deesser.glade:748 msgid "Reduction" msgstr "Reducción" #: data/ui/deesser.glade:61 msgid "Deesser" msgstr "Deesser" #: data/ui/deesser.glade:232 msgid "Wide" msgstr "Ancho" #: data/ui/deesser.glade:233 data/ui/deesser.glade:262 msgid "Split" msgstr "Dividir" #: data/ui/deesser.glade:381 msgid "Level" msgstr "Nivel" #: data/ui/deesser.glade:394 msgid "Peak Q" msgstr "Pico Q" #: data/ui/deesser.glade:426 msgid "Laxity" msgstr "Relajamiento" #: data/ui/deesser.glade:761 msgid "Detected" msgstr "Detectado" #: data/ui/convolver.glade:24 msgid "Convolver" msgstr "Convolver" #: data/ui/convolver.glade:101 msgid "Import Impulse" msgstr "Importar Archivo Impulse" #: data/ui/convolver.glade:105 msgid "Import Impulse Response File" msgstr "Importar Archivo de Respuesta Impulse" #: data/ui/convolver.glade:221 msgid "L" msgstr "L" #: data/ui/convolver.glade:235 msgid "R" msgstr "R" #: data/ui/convolver.glade:298 msgid "Duration" msgstr "Duración" #: data/ui/convolver.glade:309 msgid "Samples" msgstr "Muestras" #: data/ui/convolver.glade:342 src/convolver_ui.cpp:251 msgid "Impulse Response" msgstr "Respuesta de Impulse" #: data/ui/convolver.glade:362 msgid "Select the impulse Response File" msgstr "Seleccione el Archivo de Respuesta Impulse" #: data/ui/convolver.glade:382 src/spectrum_settings_ui.cpp:143 msgid "Spectrum" msgstr "Espectro" #: data/ui/convolver.glade:423 msgid "Stereo Width" msgstr "Amplitud Estéreo" #: data/ui/crystalizer.glade:48 msgid "Crystalizer" msgstr "Cristalizador" #: data/ui/crystalizer.glade:161 msgid "Aggressive Mode" msgstr "Modo Agresivo" #: data/ui/crystalizer.glade:420 msgid "Loudness Range" msgstr "Rango de Sonoridad" #: data/ui/crystalizer.glade:439 msgid "Before" msgstr "Antes" #: data/ui/crystalizer.glade:452 msgid "After" msgstr "Después" #: data/ui/pitch.glade:36 msgid "Pitch" msgstr "Tono" #: data/ui/pitch.glade:142 msgid "Faster" msgstr "Más Rápido" #: data/ui/pitch.glade:156 msgid "Preserve Formant" msgstr "Conservar Formato" #: data/ui/pitch.glade:180 msgid "Cents" msgstr "Acentos" #: data/ui/pitch.glade:211 msgid "Semitones" msgstr "Semitonos" #: data/ui/pitch.glade:242 msgid "Octaves" msgstr "Octavas" #: data/ui/pitch.glade:273 msgid "Crispness" msgstr "Frescura" #: data/ui/webrtc.glade:30 msgid "Webrtc" msgstr "Webrtc" #: data/ui/webrtc.glade:137 data/ui/webrtc.glade:257 data/ui/webrtc.glade:327 #: data/ui/webrtc.glade:496 msgid "Enable" msgstr "Habilitar" #: data/ui/webrtc.glade:158 msgid "Extended Filter" msgstr "Filtro Extendido" #: data/ui/webrtc.glade:171 msgid "Delay Agnostic" msgstr "Retraso Agnóstico" #: data/ui/webrtc.glade:183 msgid "High Pass Filter" msgstr "Filtro de Pase Alto" #: data/ui/webrtc.glade:212 data/ui/webrtc.glade:280 msgid "Suppresion Level" msgstr "Nivel de Supresión" #: data/ui/webrtc.glade:225 data/ui/webrtc.glade:293 data/ui/webrtc.glade:548 msgid "Low" msgstr "Bajo" #: data/ui/webrtc.glade:226 data/ui/webrtc.glade:294 data/ui/webrtc.glade:549 msgid "Moderate" msgstr "Moderado" #: data/ui/webrtc.glade:227 data/ui/webrtc.glade:295 data/ui/webrtc.glade:550 msgid "High" msgstr "Alto" #: data/ui/webrtc.glade:244 msgid "Echo Canceller" msgstr "Cancelador de Eco" #: data/ui/webrtc.glade:296 msgid "Very High" msgstr "Muy Alto" #: data/ui/webrtc.glade:313 msgid "Noise Suppressor" msgstr "Supresor de Ruido" #: data/ui/webrtc.glade:363 msgid "Adaptive Digital" msgstr "Adaptado Digital" #: data/ui/webrtc.glade:364 msgid "Fixed Digital" msgstr "Arreglo Digital" #: data/ui/webrtc.glade:381 msgid "Gain Controller" msgstr "Regulador de Ganancia" #: data/ui/webrtc.glade:419 msgid "Target Level" msgstr "Nivel Objetivo" #: data/ui/webrtc.glade:448 msgid "Maximum Gain" msgstr "Ganancia Máxima" #: data/ui/webrtc.glade:521 msgid "Detection Likelihood" msgstr "Probabilidad de Detección" #: data/ui/webrtc.glade:534 msgid "Frame Size" msgstr "Tamaño del Marco" #: data/ui/webrtc.glade:547 msgid "Very Low" msgstr "Muy Bajo" #: data/ui/webrtc.glade:584 msgid "Voice Detector" msgstr "Detector de Voz" #: data/ui/delay.glade:24 msgid "Delay" msgstr "Retraso" #: data/ui/preset_row.glade:68 msgid "Save current settings to this preset file" msgstr "Guardar esta configuración a este perfil" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "Borrar este perfil" #: data/ui/preset_row.glade:100 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" "Automáticamente aplicar este perfil siempre que el dispositivo actual esté " "conectado" #: data/ui/presets_menu.glade:86 data/ui/presets_menu.glade:195 #: src/presets_menu_ui.cpp:110 msgid "Import Presets" msgstr "Importar Perfiles" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Volumen" #: data/ui/calibration_signals.glade:108 msgid "Sine" msgstr "Seno" #: data/ui/calibration_signals.glade:109 msgid "Square" msgstr "Cuadrado" #: data/ui/calibration_signals.glade:110 msgid "Saw" msgstr "Sierra" #: data/ui/calibration_signals.glade:111 msgid "Triangle" msgstr "Triángulo" #: data/ui/calibration_signals.glade:112 msgid "Silence" msgstr "Silencio" #: data/ui/calibration_signals.glade:113 msgid "White Noise" msgstr "Ruido Blanco" #: data/ui/calibration_signals.glade:114 msgid "Pink Noise" msgstr "Ruido Rosa" #: data/ui/calibration_signals.glade:115 msgid "Sine Table" msgstr "Mesa Sinusoidal" #: data/ui/calibration_signals.glade:116 msgid "Ticks" msgstr "Ticks" #: data/ui/calibration_signals.glade:117 msgid "Gaussian Noise" msgstr "Ruido Gaussiano" #: data/ui/calibration_signals.glade:118 msgid "Red Noise" msgstr "Ruido Rojo" #: data/ui/calibration_signals.glade:119 msgid "Blue Noise" msgstr "Ruido Azul" #: data/ui/calibration_signals.glade:120 msgid "Violet Noise" msgstr "Ruido Violeta" #: data/ui/calibration_mic.glade:29 msgid "Window" msgstr "Ventana" #: data/ui/calibration_mic.glade:70 msgid "Measure Noise" msgstr "Medir Ruido" #: data/ui/calibration_mic.glade:99 msgid "Subtract Noise" msgstr "Reducir Ruido" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Efectos de Sonido para las Aplicaciones de PulseAudio" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Wellington Wallace" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects es una avanzada herramienta de manipulación de audio. Incluye " "un ecualizador, limitador, compresor y herramienta de reverberación , solo " "por mencionar algunos. Para complementar esto hay también incluido un " "analizador de espectro." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "Debido a que PulseEffects usa por defecto el servicio de sonido PulseAudio, " "este funcionará con la mayoría, sino que todas, las aplicaciones que use. " "Todas las aplicaciones son mostradas en la ventana principal donde pueden " "ser habilitadas individualmente." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Además de manipular el sonido de salida, PulseEffects puede aplicar efectos " "a dispositivos de entrada, como micrófonos. Esto es útil, por ejemplo, en la " "grabación de audio, pero también funciona correctamente durante " "conversaciones de voces." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "Cuando PulseEffects esté activo este convenientemente recordará la " "configuración usada en la última sesión. También es posible guardar la " "configuración actual como un perfil." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "Establecer el volumen y encender/apagar los efectos" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "Incluye un ecualizador con perfiles incluidos" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Limitador de Entrada" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Calibración" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "Ecualizador, Compresor y Otros Efectos de Sonido" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "limitador;compresor;reverberación;ecualizador;autovolumen;" #. Translators: This is an icon name, don't translate! #: data/com.github.wwmm.pulseeffects.desktop.in:10 msgid "pulseeffects" msgstr "pulseeffects" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:201 msgid "\"Presets\"" msgstr "\"Perfiles\"" #: src/application.cpp:19 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "" "Salir de PulseEffects. Útil cuando se está ejecutando en modo de servicio." #: src/application.cpp:21 msgid "Show available presets." msgstr "Mostrar perfiles disponibles." #: src/application.cpp:24 msgid "Load a preset. Example: pulseeffects -l music" msgstr "Cargar un perfil. Ejemplo: pulseeffects -l music" #: src/application.cpp:26 msgid "Reset PulseEffects." msgstr "Restablecer PulseEffects." #: src/application.cpp:29 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "" "Bypass global, 1 para habilitar, 2 para deshabilitar y 3 para obtener el " "estado" #: src/application.cpp:263 msgid "Output Presets: " msgstr "Perfiles de Dispositivos de Salida: " #: src/application.cpp:271 msgid "Input Presets: " msgstr "Perfiles de Dispositivos de Entrada: " #: src/effects_base_ui.cpp:27 msgid "Applications" msgstr "Aplicaciones" #: src/blocklist_settings_ui.cpp:71 msgid "Blocklist" msgstr "Lista Negra" #: src/general_settings_ui.cpp:121 msgid "General" msgstr "General" #: src/pulse_settings_ui.cpp:138 msgid "Pulseaudio" msgstr "Pulseaudio" #: src/presets_menu_ui.cpp:111 src/convolver_ui.cpp:247 msgid "Open" msgstr "Abrir" #: src/presets_menu_ui.cpp:111 src/convolver_ui.cpp:247 msgid "Cancel" msgstr "Cancelar" #: src/app_info_ui.cpp:85 msgid "paused" msgstr "pausado" #: src/app_info_ui.cpp:87 msgid "playing" msgstr "reproduciendo" #: src/calibration_ui.cpp:171 msgid "Calibration Microphone" msgstr "Calibrar Micrófono" #: src/convolver_ui.cpp:246 msgid "Import Impulse File" msgstr "Importar Archivo Impulse" #: src/convolver_ui.cpp:290 src/convolver_ui.cpp:291 src/convolver_ui.cpp:293 msgid "Failed" msgstr "Fallido" #: src/convolver_ui.cpp:295 msgid "Could Not Load The Impulse File" msgstr "No se pudo encontrar el archivo Impulse" #: src/equalizer_ui.cpp:307 src/equalizer_ui.cpp:426 msgid "infinity" msgstr "infinidad" easyeffects-4.8.7/po/es_VE.po000066400000000000000000001150001424023573300160120ustar00rootroot00000000000000# Spanish (VE) translation for Pulseeffects. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the Pulseeffects package. # CCaroV , 2019. # msgid "" msgstr "" "Project-Id-Version: pulseeffects\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-28 14:03-0300\n" "PO-Revision-Date: 2020-01-09 18:18-0500\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.6\n" "Last-Translator: Christian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: es_CO\n" #: data/ui/application.glade:46 src/calibration_ui.cpp:39 #: src/calibration_ui.cpp:164 msgid "Test Signals" msgstr "Señal de Prueba" #: data/ui/application.glade:61 msgid "Global Bypass" msgstr "Bypass Global" #: data/ui/application.glade:83 #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 msgid "PulseEffects" msgstr "PulseEffects" #: data/ui/application.glade:155 data/ui/general_settings.glade:107 #: data/ui/equalizer.glade:253 msgid "Settings" msgstr "Ajustes" #: data/ui/application.glade:177 msgid "Help" msgstr "Ayuda" #: data/ui/application.glade:200 data/ui/filter.glade:204 #: data/ui/equalizer.glade:309 data/ui/reverb.glade:284 #: data/ui/crossfeed.glade:47 src/presets_menu_ui.cpp:115 #: src/presets_menu_ui.cpp:274 src/presets_menu_ui.cpp:291 msgid "Presets" msgstr "Perfiles" #: data/ui/spectrum_settings.glade:59 msgid "Show Spectrum" msgstr "Mostrar Espectro" #: data/ui/spectrum_settings.glade:84 msgid "Fill" msgstr "Rellenar" #: data/ui/spectrum_settings.glade:109 msgid "Border" msgstr "Bordes" #: data/ui/spectrum_settings.glade:134 msgid "Use Custom Color" msgstr "Usar Color Personalizado" #: data/ui/spectrum_settings.glade:159 msgid "Use Gradient" msgstr "Usar Degradado" #: data/ui/spectrum_settings.glade:185 msgid "Spectrum Color" msgstr "Color del Espectro" #: data/ui/spectrum_settings.glade:213 msgid "Gradient Color" msgstr "Color del Degradado" #: data/ui/spectrum_settings.glade:241 msgid "Spectrum Type" msgstr "Tipo de Espectro" #: data/ui/spectrum_settings.glade:255 msgid "Bars" msgstr "Barras" #: data/ui/spectrum_settings.glade:256 msgid "Lines" msgstr "Lineas" #: data/ui/spectrum_settings.glade:271 msgid "Points" msgstr "Puntos" #: data/ui/spectrum_settings.glade:303 msgid "Height" msgstr "Altura" #: data/ui/spectrum_settings.glade:336 msgid "Scale" msgstr "Escala" #: data/ui/spectrum_settings.glade:369 msgid "Exponent" msgstr "Exponente" #: data/ui/spectrum_settings.glade:402 msgid "Sampling" msgstr "Muestreo" #: data/ui/spectrum_settings.glade:433 msgid "Line Width" msgstr "Ancho de Linea" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:389 msgid "Use Default" msgstr "Usar Predeterminado" #: data/ui/pulse_settings.glade:150 data/ui/pulse_settings.glade:440 msgid "Block Size" msgstr "Tamaño de Bloque" #: data/ui/pulse_settings.glade:196 data/ui/pulse_settings.glade:486 msgid "Pipeline Input" msgstr "Caudal de Entrada" #: data/ui/pulse_settings.glade:210 data/ui/pulse_settings.glade:301 #: data/ui/pulse_settings.glade:500 data/ui/pulse_settings.glade:591 #: data/ui/app_info.glade:159 msgid "Buffer" msgstr "Buffer" #: data/ui/pulse_settings.glade:243 data/ui/pulse_settings.glade:334 #: data/ui/pulse_settings.glade:513 data/ui/pulse_settings.glade:604 #: data/ui/app_info.glade:186 msgid "Latency" msgstr "Latencia" #: data/ui/pulse_settings.glade:287 data/ui/pulse_settings.glade:577 msgid "Pipeline Output" msgstr "Caudal de Salida" #: data/ui/pulse_settings.glade:370 data/ui/blocklist_settings.glade:130 msgid "Input Effects" msgstr "Efectos de Entrada" #: data/ui/pulse_settings.glade:660 data/ui/blocklist_settings.glade:224 msgid "Output Effects" msgstr "Efectos de Salida" #: data/ui/blocklist_settings.glade:53 data/ui/blocklist_settings.glade:147 #: data/ui/presets_menu.glade:68 data/ui/presets_menu.glade:177 msgid "Create Preset" msgstr "Crear Perfil" #: data/ui/blocklist_settings.glade:72 data/ui/blocklist_settings.glade:166 #: data/ui/pulse_info.glade:49 data/ui/presets_menu.glade:55 #: data/ui/presets_menu.glade:164 msgid "Name" msgstr "Nombre" #: data/ui/general_settings.glade:31 msgid "Start Service at Login" msgstr "Iniciar Servicio al Iniciar Sesión" #: data/ui/general_settings.glade:56 msgid "Process All Outputs" msgstr "Procesar Todas las Salidas" #: data/ui/general_settings.glade:81 msgid "Use Dark Theme" msgstr "Usar Tema Oscuro" #: data/ui/general_settings.glade:116 data/ui/equalizer_band.glade:183 #: data/ui/equalizer_band.glade:229 msgid "Reset" msgstr "Restablecer" #: data/ui/general_settings.glade:133 data/ui/general_settings.glade:206 msgid "Niceness" msgstr "Meticulosidad" #: data/ui/general_settings.glade:134 msgid "Real Time" msgstr "Tiempo Real" #: data/ui/general_settings.glade:135 msgid "None" msgstr "Ninguno" #: data/ui/general_settings.glade:151 msgid "Priority Type" msgstr "Tipo de Prioridad" #: data/ui/general_settings.glade:161 msgid "About" msgstr "Acerca de" #: data/ui/general_settings.glade:180 msgid "Process All Inputs" msgstr "Procesar Todas las Entradas" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "Prioridad" #: data/ui/about.glade.in:11 msgid "Audio effects for PulseAudio applications" msgstr "Efectos de Sonido para las aplicaciones de PulseAudio" #: data/ui/app_info.glade:51 msgid "Format" msgstr "Formato" #: data/ui/app_info.glade:78 data/ui/convolver.glade:257 msgid "Rate" msgstr "Tasa" #: data/ui/app_info.glade:105 data/ui/pulse_info.glade:238 #: data/ui/stereo_tools.glade:629 msgid "Channels" msgstr "Canales" # Resampler does not have an official translation #: data/ui/app_info.glade:132 msgid "Resampler" msgstr "Remuestreador" #: data/ui/app_info.glade:213 msgid "State" msgstr "Estado" #: data/ui/pulse_info.glade:76 msgid "Version" msgstr "Versión" #: data/ui/pulse_info.glade:103 msgid "Default Sink" msgstr "Profundidad Predeterminda" #: data/ui/pulse_info.glade:115 msgid "Default Source" msgstr "Fuente Predeterminada" #: data/ui/pulse_info.glade:157 msgid "Protocol" msgstr "Protocolo" #: data/ui/pulse_info.glade:184 msgid "Default Sample Format" msgstr "Formato de Muestreo Predeterminado" #: data/ui/pulse_info.glade:211 msgid "Default Sampling Rate" msgstr "Tasa de Muestreo por Defecto" #: data/ui/pulse_info.glade:265 msgid "Channel Mapping" msgstr "Mapa de Canales" #: data/ui/pulse_info.glade:290 msgid "Server" msgstr "Servidor" #: data/ui/pulse_info.glade:335 msgid "Modules" msgstr "Módulos" #: data/ui/pulse_info.glade:381 msgid "Clients" msgstr "Clientes" #: data/ui/pulse_info.glade:444 msgid "File" msgstr "Archivo" #: data/ui/pulse_info.glade:454 msgid "Configuration" msgstr "Configuración" # Resamplers does not have an official translation #: data/ui/pulse_info.glade:487 msgid "Resamplers" msgstr "Remuestreadores" #: data/ui/autogain.glade:24 msgid "Auto Gain" msgstr "Ganancia Automática" #: data/ui/autogain.glade:145 msgid "Reset History" msgstr "Restablecer Historial" #: data/ui/autogain.glade:157 msgid "Detect Silence" msgstr "Detectar Silencio" #: data/ui/autogain.glade:169 msgid "Use Geometric Mean" msgstr "Usar la Media Geométrica" #: data/ui/autogain.glade:198 msgid "Target" msgstr "Objetivo" #: data/ui/autogain.glade:214 msgid "-23" msgstr "-23" #: data/ui/autogain.glade:249 data/ui/autogain.glade:591 msgid "Momentary" msgstr "Momentáneo" #: data/ui/autogain.glade:264 data/ui/autogain.glade:604 msgid "Short Term" msgstr "Corto Plazo" #: data/ui/autogain.glade:279 data/ui/autogain.glade:617 msgid "Integrated" msgstr "Integrado" #: data/ui/autogain.glade:349 msgid "Weights" msgstr "Fuerza" #: data/ui/autogain.glade:378 data/ui/autogain.glade:570 #: data/ui/limiter.glade:365 data/ui/compressor.glade:718 #: data/ui/multiband_compressor.glade:1958 data/ui/filter.glade:368 #: data/ui/equalizer.glade:516 data/ui/reverb.glade:630 #: data/ui/bass_enhancer.glade:479 data/ui/exciter.glade:483 #: data/ui/stereo_tools.glade:299 data/ui/stereo_tools.glade:804 #: data/ui/crossfeed.glade:202 data/ui/maximizer.glade:239 #: data/ui/loudness.glade:244 data/ui/gate.glade:487 #: data/ui/multiband_gate.glade:2107 data/ui/deesser.glade:568 #: data/ui/convolver.glade:477 data/ui/crystalizer.glade:228 #: data/ui/pitch.glade:322 data/ui/webrtc.glade:624 data/ui/delay.glade:210 #: data/ui/presets_menu.glade:255 msgid "Input" msgstr "Entrada" #: data/ui/autogain.glade:393 data/ui/autogain.glade:826 #: data/ui/limiter.glade:380 data/ui/compressor.glade:733 #: data/ui/multiband_compressor.glade:753 #: data/ui/multiband_compressor.glade:1130 #: data/ui/multiband_compressor.glade:1508 #: data/ui/multiband_compressor.glade:1886 #: data/ui/multiband_compressor.glade:1973 data/ui/filter.glade:383 #: data/ui/equalizer.glade:531 data/ui/reverb.glade:645 #: data/ui/bass_enhancer.glade:511 data/ui/exciter.glade:515 #: data/ui/stereo_tools.glade:776 data/ui/stereo_tools.glade:818 #: data/ui/crossfeed.glade:217 data/ui/maximizer.glade:254 #: data/ui/loudness.glade:162 data/ui/loudness.glade:259 data/ui/gate.glade:502 #: data/ui/multiband_gate.glade:806 data/ui/multiband_gate.glade:1215 #: data/ui/multiband_gate.glade:1625 data/ui/multiband_gate.glade:2035 #: data/ui/multiband_gate.glade:2122 data/ui/deesser.glade:583 #: data/ui/convolver.glade:492 data/ui/crystalizer.glade:243 #: data/ui/pitch.glade:336 data/ui/webrtc.glade:639 data/ui/delay.glade:225 #: data/ui/presets_menu.glade:146 msgid "Output" msgstr "Salida" #: data/ui/autogain.glade:708 msgid "Relative" msgstr "Reativo" #: data/ui/autogain.glade:721 data/ui/compressor.glade:900 #: data/ui/deesser.glade:295 msgid "Gain" msgstr "Ganancia" #: data/ui/autogain.glade:787 data/ui/loudness.glade:24 #: data/ui/loudness.glade:128 msgid "Loudness" msgstr "Loudness" #: data/ui/autogain.glade:840 msgid "Range" msgstr "Rango" #: data/ui/limiter.glade:30 data/ui/webrtc.glade:395 msgid "Limiter" msgstr "Limitador" #: data/ui/limiter.glade:149 msgid "Input Gain" msgstr "Ganancia de Entrada" #: data/ui/limiter.glade:182 msgid "Limit" msgstr "Límite" #: data/ui/limiter.glade:237 data/ui/compressor.glade:373 #: data/ui/multiband_compressor.glade:534 #: data/ui/multiband_compressor.glade:907 #: data/ui/multiband_compressor.glade:1285 #: data/ui/multiband_compressor.glade:1663 data/ui/maximizer.glade:213 #: data/ui/gate.glade:299 data/ui/multiband_gate.glade:554 #: data/ui/multiband_gate.glade:960 data/ui/multiband_gate.glade:1370 #: data/ui/multiband_gate.glade:1780 msgid "Release" msgstr "Liberar" #: data/ui/limiter.glade:250 data/ui/compressor.glade:570 msgid "Lookahead" msgstr "Atenuación" #: data/ui/limiter.glade:285 msgid "Oversampling" msgstr "Sobre Muestreo" #: data/ui/limiter.glade:334 msgid "ASC" msgstr "ASC" #: data/ui/limiter.glade:395 msgid "Attenuation" msgstr "Atenuación" #: data/ui/compressor.glade:30 data/ui/compressor.glade:442 #: data/ui/webrtc.glade:482 data/com.github.wwmm.pulseeffects.appdata.xml.in:52 msgid "Compressor" msgstr "Compresor" #: data/ui/compressor.glade:239 data/ui/multiband_compressor.glade:568 #: data/ui/multiband_compressor.glade:942 #: data/ui/multiband_compressor.glade:1320 #: data/ui/multiband_compressor.glade:1698 data/ui/maximizer.glade:126 #: data/ui/gate.glade:333 data/ui/multiband_gate.glade:588 #: data/ui/multiband_gate.glade:995 data/ui/multiband_gate.glade:1405 #: data/ui/multiband_gate.glade:1815 data/ui/deesser.glade:458 msgid "Threshold" msgstr "Límite" #: data/ui/compressor.glade:272 data/ui/multiband_compressor.glade:601 #: data/ui/multiband_compressor.glade:976 #: data/ui/multiband_compressor.glade:1354 #: data/ui/multiband_compressor.glade:1732 data/ui/gate.glade:366 #: data/ui/multiband_gate.glade:621 data/ui/multiband_gate.glade:1029 #: data/ui/multiband_gate.glade:1439 data/ui/multiband_gate.glade:1849 #: data/ui/deesser.glade:491 msgid "Ratio" msgstr "Radio" #: data/ui/compressor.glade:304 data/ui/multiband_compressor.glade:633 #: data/ui/multiband_compressor.glade:1009 #: data/ui/multiband_compressor.glade:1387 #: data/ui/multiband_compressor.glade:1765 data/ui/gate.glade:398 #: data/ui/multiband_gate.glade:653 data/ui/multiband_gate.glade:1062 #: data/ui/multiband_gate.glade:1472 data/ui/multiband_gate.glade:1882 msgid "Knee" msgstr "Codo" #: data/ui/compressor.glade:338 data/ui/multiband_compressor.glade:667 #: data/ui/multiband_compressor.glade:1044 #: data/ui/multiband_compressor.glade:1422 #: data/ui/multiband_compressor.glade:1800 data/ui/gate.glade:432 #: data/ui/multiband_gate.glade:687 data/ui/multiband_gate.glade:1097 #: data/ui/multiband_gate.glade:1507 data/ui/multiband_gate.glade:1917 #: data/ui/deesser.glade:522 msgid "Makeup" msgstr "Amplificación" #: data/ui/compressor.glade:386 data/ui/multiband_compressor.glade:500 #: data/ui/multiband_compressor.glade:872 #: data/ui/multiband_compressor.glade:1250 #: data/ui/multiband_compressor.glade:1628 data/ui/gate.glade:265 #: data/ui/multiband_gate.glade:520 data/ui/multiband_gate.glade:925 #: data/ui/multiband_gate.glade:1335 data/ui/multiband_gate.glade:1745 msgid "Attack" msgstr "Ataque" #: data/ui/compressor.glade:413 msgid "Downward" msgstr "Hacia Abajo" #: data/ui/compressor.glade:414 msgid "Upward" msgstr "Hacia Arriba" #: data/ui/compressor.glade:426 msgid "Compression Mode" msgstr "Modo de Compresión" #: data/ui/compressor.glade:454 data/ui/bass_enhancer.glade:145 #: data/ui/exciter.glade:145 data/ui/deesser.glade:162 msgid "Listen" msgstr "Escuchar" #: data/ui/compressor.glade:500 msgid "Pre-amplification" msgstr "Pre-amplificación" #: data/ui/compressor.glade:535 msgid "Reactivity" msgstr "Reactividad" #: data/ui/compressor.glade:583 msgid "Feed-forward" msgstr "Adelantar" #: data/ui/compressor.glade:584 msgid "Feed-back" msgstr "Realimentar" #: data/ui/compressor.glade:598 data/ui/equalizer_band.glade:48 msgid "Type" msgstr "Tipo" #: data/ui/compressor.glade:612 data/ui/multiband_compressor.glade:473 #: data/ui/multiband_compressor.glade:845 #: data/ui/multiband_compressor.glade:1223 #: data/ui/multiband_compressor.glade:1601 data/ui/gate.glade:220 #: data/ui/multiband_gate.glade:493 data/ui/multiband_gate.glade:898 #: data/ui/multiband_gate.glade:1308 data/ui/multiband_gate.glade:1718 #: data/ui/deesser.glade:218 data/ui/deesser.glade:328 msgid "Peak" msgstr "Pico" #: data/ui/compressor.glade:613 data/ui/multiband_compressor.glade:472 #: data/ui/multiband_compressor.glade:844 #: data/ui/multiband_compressor.glade:1222 #: data/ui/multiband_compressor.glade:1600 data/ui/gate.glade:219 #: data/ui/multiband_gate.glade:492 data/ui/multiband_gate.glade:897 #: data/ui/multiband_gate.glade:1307 data/ui/multiband_gate.glade:1717 #: data/ui/deesser.glade:217 msgid "RMS" msgstr "RMS" #: data/ui/compressor.glade:614 msgid "Low-Pass" msgstr "Paso Bajo" #: data/ui/compressor.glade:615 msgid "Uniform" msgstr "Uniforme" #: data/ui/compressor.glade:629 data/ui/multiband_compressor.glade:283 #: data/ui/equalizer.glade:200 data/ui/equalizer_band.glade:79 #: data/ui/stereo_tools.glade:461 data/ui/multiband_gate.glade:303 #: data/ui/deesser.glade:204 data/ui/webrtc.glade:350 msgid "Mode" msgstr "Modo" #: data/ui/compressor.glade:643 msgid "Middle" msgstr "Medio" #: data/ui/compressor.glade:644 msgid "Side" msgstr "Lado" #: data/ui/compressor.glade:645 data/ui/equalizer.glade:448 #: data/ui/stereo_tools.glade:524 data/ui/delay.glade:131 msgid "Left" msgstr "Izquierda" #: data/ui/compressor.glade:646 data/ui/equalizer.glade:489 #: data/ui/stereo_tools.glade:596 data/ui/delay.glade:163 msgid "Right" msgstr "Derecha" #: data/ui/compressor.glade:660 msgid "Source" msgstr "Fuente" #: data/ui/compressor.glade:676 data/ui/compressor.glade:913 msgid "Sidechain" msgstr "Cadena Lateral" #: data/ui/compressor.glade:989 msgid "Curve" msgstr "Curva" #: data/ui/multiband_compressor.glade:70 msgid "Multiband Compressor" msgstr "Compresor Multibanda" #: data/ui/multiband_compressor.glade:297 data/ui/multiband_gate.glade:317 msgid "LR4" msgstr "LR4" #: data/ui/multiband_compressor.glade:298 data/ui/multiband_gate.glade:318 msgid "LR8" msgstr "LR8" #: data/ui/multiband_compressor.glade:312 data/ui/multiband_gate.glade:332 msgid "Split 1/2" msgstr "Dividir 1/2" #: data/ui/multiband_compressor.glade:325 data/ui/multiband_gate.glade:345 msgid "Split 2/3" msgstr "Dividir 2/3" #: data/ui/multiband_compressor.glade:338 data/ui/multiband_gate.glade:358 msgid "Split 3/4" msgstr "Dividir 3/4" #: data/ui/multiband_compressor.glade:442 #: data/ui/multiband_compressor.glade:814 #: data/ui/multiband_compressor.glade:1192 #: data/ui/multiband_compressor.glade:1570 data/ui/multiband_gate.glade:462 #: data/ui/multiband_gate.glade:867 data/ui/multiband_gate.glade:1277 #: data/ui/multiband_gate.glade:1687 data/ui/crystalizer_band.glade:39 msgid "Bypass" msgstr "Bypass" #: data/ui/multiband_compressor.glade:455 #: data/ui/multiband_compressor.glade:827 #: data/ui/multiband_compressor.glade:1205 #: data/ui/multiband_compressor.glade:1583 data/ui/equalizer_band.glade:302 #: data/ui/multiband_gate.glade:475 data/ui/multiband_gate.glade:880 #: data/ui/multiband_gate.glade:1290 data/ui/multiband_gate.glade:1700 msgid "Solo" msgstr "Solo" #: data/ui/multiband_compressor.glade:713 #: data/ui/multiband_compressor.glade:1090 #: data/ui/multiband_compressor.glade:1468 #: data/ui/multiband_compressor.glade:1846 msgid "Compression" msgstr "Compresión" #: data/ui/multiband_compressor.glade:796 data/ui/multiband_gate.glade:849 msgid "Sub Band" msgstr "Sub Banda" #: data/ui/multiband_compressor.glade:1173 data/ui/multiband_gate.glade:1258 msgid "Low Band" msgstr "Banda Baja" #: data/ui/multiband_compressor.glade:1551 data/ui/multiband_gate.glade:1668 msgid "Mid Band" msgstr "Banda Media" #: data/ui/multiband_compressor.glade:1929 data/ui/multiband_gate.glade:2078 msgid "High Band" msgstr "Banda Alta" #: data/ui/filter.glade:31 msgid "Filter" msgstr "Filtro" #: data/ui/filter.glade:123 msgid "Muted" msgstr "Silenciado" #: data/ui/filter.glade:135 data/ui/reverb.glade:209 msgid "Disco" msgstr "Disco" #: data/ui/filter.glade:147 msgid "Distant Headphones" msgstr "Audífonos a Distancia" #: data/ui/filter.glade:159 data/ui/reverb.glade:235 data/ui/crossfeed.glade:72 msgid "Default" msgstr "Predeterminado" #: data/ui/filter.glade:220 msgid "12dB/oct Lowpass" msgstr "12dB/oct Paso Bajo" #: data/ui/filter.glade:221 msgid "24dB/oct Lowpass" msgstr "24dB/oct Paso Bajo" #: data/ui/filter.glade:222 msgid "36dB/oct Lowpass" msgstr "36dB/oct Paso Bajo" #: data/ui/filter.glade:223 msgid "12dB/oct Highpass" msgstr "12dB/oct Pase Alto" #: data/ui/filter.glade:224 msgid "24dB/oct Highpass" msgstr "24dB/oct Pase Alto" #: data/ui/filter.glade:225 msgid "36dB/oct Highpass" msgstr "36dB/oct Pase Alto" #: data/ui/filter.glade:226 msgid "6dB/oct Bandpass" msgstr "6dB/oct Paso de Banda" #: data/ui/filter.glade:227 msgid "12dB/oct Bandpass" msgstr "12dB/oct Paso de Banda" #: data/ui/filter.glade:228 msgid "18dB/oct Bandpass" msgstr "18dB/oct Paso de Banda" #: data/ui/filter.glade:229 msgid "6dB/oct Bandreject" msgstr "6dB/oct Rechazo de Banda" #: data/ui/filter.glade:230 msgid "12dB/oct Bandreject" msgstr "12dB/oct Rechazo de Banda" #: data/ui/filter.glade:231 msgid "18dB/oct Bandreject" msgstr "18dB/oct Rechazo de Banda" #: data/ui/filter.glade:254 data/ui/equalizer_band.glade:152 #: data/ui/calibration_signals.glade:32 msgid "Frequency" msgstr "Frecuencia" #: data/ui/filter.glade:288 data/ui/equalizer_band.glade:67 msgid "Resonance" msgstr "Resonancia" #: data/ui/filter.glade:323 msgid "Inertia" msgstr "Inercia" #: data/ui/equalizer.glade:24 msgid "Equalizer" msgstr "Ecualizador" #: data/ui/equalizer.glade:129 msgid "Split Channels" msgstr "Dividir Canales" #: data/ui/equalizer.glade:155 msgid "IIR" msgstr "IIR" #: data/ui/equalizer.glade:156 msgid "FIR" msgstr "FIR" #: data/ui/equalizer.glade:157 msgid "FFT" msgstr "FFT" #: data/ui/equalizer.glade:187 msgid "Bands" msgstr "Bandas" #: data/ui/equalizer.glade:209 msgid "Flat Response" msgstr "Respuesta Plana" #: data/ui/equalizer.glade:224 msgid "Calculate Frequencies" msgstr "Calcular Frecuencias" #: data/ui/equalizer.glade:238 msgid "Reset Equalizer" msgstr "Restablecer Ecualizador" #: data/ui/equalizer_band.glade:60 msgid "Off" msgstr "Apagdo" #: data/ui/equalizer_band.glade:61 msgid "Bell" msgstr "Timbre" #: data/ui/equalizer_band.glade:62 msgid "High Pass" msgstr "Pase Alto" #: data/ui/equalizer_band.glade:63 msgid "High Shelf" msgstr "Estante Alto" #: data/ui/equalizer_band.glade:64 msgid "Low Pass" msgstr "Paso Bajo" #: data/ui/equalizer_band.glade:65 msgid "Low Shelf" msgstr "Estante Bajo" #: data/ui/equalizer_band.glade:66 msgid "Notch" msgstr "Muesca" #: data/ui/equalizer_band.glade:91 msgid "RLC (BT)" msgstr "RLC (BT)" #: data/ui/equalizer_band.glade:92 msgid "RLC (MT)" msgstr "RLC (MT)" #: data/ui/equalizer_band.glade:93 msgid "BWC (BT)" msgstr "BWC (BT)" #: data/ui/equalizer_band.glade:94 msgid "BWC (MT)" msgstr "BWC (MT)" #: data/ui/equalizer_band.glade:95 msgid "LRX (BT)" msgstr "LRX (BT)" #: data/ui/equalizer_band.glade:96 msgid "LRX (MT)" msgstr "LRX (MT)" #: data/ui/equalizer_band.glade:97 msgid "APO (DR)" msgstr "APO (DR)" #: data/ui/equalizer_band.glade:109 msgid "Slope" msgstr "Pendiente" #: data/ui/equalizer_band.glade:121 msgid "x1" msgstr "x1" #: data/ui/equalizer_band.glade:122 msgid "x2" msgstr "x2" #: data/ui/equalizer_band.glade:123 msgid "x3" msgstr "x3" #: data/ui/equalizer_band.glade:124 msgid "x4" msgstr "x4" #: data/ui/equalizer_band.glade:201 msgid "Quality" msgstr "Calidad" #: data/ui/equalizer_band.glade:252 msgid "Width" msgstr "Anchura" #: data/ui/equalizer_band.glade:314 data/ui/stereo_tools.glade:550 #: data/ui/stereo_tools.glade:609 data/ui/crystalizer_band.glade:27 msgid "Mute" msgstr "Silenciar" #: data/ui/equalizer_preset_row.glade:37 data/ui/irs_row.glade:59 #: data/ui/preset_row.glade:51 msgid "Apply" msgstr "Aplicar" #: data/ui/reverb.glade:64 msgid "Reverberation" msgstr "Reverberación" #: data/ui/reverb.glade:157 msgid "Ambience" msgstr "Ambiente" #: data/ui/reverb.glade:170 msgid "Empty Walls" msgstr "Paredes Vacías" #: data/ui/reverb.glade:183 msgid "Room" msgstr "Habitación" #: data/ui/reverb.glade:196 msgid "Large Empty Hall" msgstr "Habitación Vacía Grande" #: data/ui/reverb.glade:222 msgid "Large Occupied Hall" msgstr "Habitación Ocupada Grande" #: data/ui/reverb.glade:334 msgid "Pre Delay" msgstr "Pre Retraso" #: data/ui/reverb.glade:347 msgid "Decay Time" msgstr "Tiempo de Decaimiento" #: data/ui/reverb.glade:380 data/ui/bass_enhancer.glade:242 #: data/ui/exciter.glade:245 msgid "Amount" msgstr "Cantidad" #: data/ui/reverb.glade:412 msgid "Dry" msgstr "Secar" #: data/ui/reverb.glade:444 msgid "Bass Cut" msgstr "Corte de Bajos" #: data/ui/reverb.glade:495 msgid "Treble Cut" msgstr "Corte de Sobreagudos" #: data/ui/reverb.glade:538 msgid "Diffusion" msgstr "Difusión" #: data/ui/reverb.glade:550 msgid "Room Size" msgstr "Tamaño de la Habitación" #: data/ui/reverb.glade:563 msgid "Small" msgstr "Pequeña" #: data/ui/reverb.glade:564 msgid "Medium" msgstr "Mediana" #: data/ui/reverb.glade:565 msgid "Large" msgstr "Grande" #: data/ui/reverb.glade:566 msgid "Tunnel" msgstr "Túnel" #: data/ui/reverb.glade:567 msgid "Large/smooth" msgstr "Grande/Liso" #: data/ui/reverb.glade:568 msgid "Experimental" msgstr "Experimental" #: data/ui/reverb.glade:581 msgid "High Frequency Damping" msgstr "Amortiguación de Alta Frecuencia" #: data/ui/bass_enhancer.glade:50 msgid "Bass Enhancer" msgstr "Potenciado de Graves" #: data/ui/bass_enhancer.glade:186 data/ui/exciter.glade:187 msgid "3rd" msgstr "3era" #: data/ui/bass_enhancer.glade:198 data/ui/exciter.glade:199 msgid "2nd" msgstr "2nda" #: data/ui/bass_enhancer.glade:210 data/ui/exciter.glade:211 msgid "Blend Harmonics" msgstr "Mezclar Harmónicos" #: data/ui/bass_enhancer.glade:254 data/ui/bass_enhancer.glade:386 #: data/ui/exciter.glade:258 data/ui/exciter.glade:390 msgid "Harmonics" msgstr "Harmónicos" #: data/ui/bass_enhancer.glade:266 data/ui/exciter.glade:271 msgid "Scope" msgstr "Alcance" #: data/ui/bass_enhancer.glade:355 msgid "Floor" msgstr "Fondo" #: data/ui/exciter.glade:50 msgid "Exciter" msgstr "Excitador" #: data/ui/exciter.glade:358 data/ui/maximizer.glade:159 msgid "Ceiling" msgstr "Límite" #: data/ui/stereo_tools.glade:42 msgid "Stereo Tools" msgstr "Herramientas Estéreo" #: data/ui/stereo_tools.glade:207 msgid "Softclip" msgstr "Clip Suave" #: data/ui/stereo_tools.glade:231 data/ui/stereo_tools.glade:647 msgid "Balance" msgstr "Balance" #: data/ui/stereo_tools.glade:263 msgid "S/C Level" msgstr "Nivel S/C" #: data/ui/stereo_tools.glade:321 msgid "Side Level" msgstr "Nivel Lateral" #: data/ui/stereo_tools.glade:372 msgid "Side Balance" msgstr "Balance Lateral" #: data/ui/stereo_tools.glade:404 msgid "Middle Level" msgstr "Nivel Medio" #: data/ui/stereo_tools.glade:417 msgid "Middle Panorama" msgstr "Panorama Medio" #: data/ui/stereo_tools.glade:475 msgid "LR > LR (Stereo Default)" msgstr "LR > LR (Estéreo Predeterminado)" #: data/ui/stereo_tools.glade:476 msgid "LR > MS (Stereo to Mid-Side)" msgstr "LR > MS (Estéreo hacia Medio Lado)" #: data/ui/stereo_tools.glade:477 msgid "MS > LR (Mid-Side to Stereo)" msgstr "MS > LR (Medio Lado - Estéreo)" #: data/ui/stereo_tools.glade:478 msgid "LR > LL (Mono Left Channel)" msgstr "LR > LL (Canal Izquierdo Mono)" #: data/ui/stereo_tools.glade:479 msgid "LR > RR (Mono Right Channel)" msgstr "LR > RR (Canal Derecho Mono)" #: data/ui/stereo_tools.glade:480 msgid "LR > L+R (Mono Sum L+R)" msgstr "LR > L+R (Suma Mono L+R)" #: data/ui/stereo_tools.glade:481 msgid "LR > RL (Stereo Flip Channels)" msgstr "LR > RL (Intercambiar Canales)" #: data/ui/stereo_tools.glade:498 msgid "Stereo Matrix" msgstr "Matriz Estéreo" #: data/ui/stereo_tools.glade:537 data/ui/stereo_tools.glade:578 msgid "Invert Phase" msgstr "Invertir Fase" #: data/ui/stereo_tools.glade:679 msgid "Delay L/R" msgstr "Retraso L/R" #: data/ui/stereo_tools.glade:713 msgid "Stereo Base" msgstr "Base Estéreo" #: data/ui/stereo_tools.glade:746 msgid "Stereo Phase" msgstr "Fase Estéreo" #: data/ui/crossfeed.glade:59 msgid "Jmeier" msgstr "Jmeier" #: data/ui/crossfeed.glade:85 msgid "Cmoy" msgstr "Cmoy" #: data/ui/crossfeed.glade:122 msgid "Cutoff" msgstr "Umbral" #: data/ui/crossfeed.glade:155 msgid "Feed" msgstr "Alimentar" #: data/ui/crossfeed.glade:392 msgid "Crossfeed" msgstr "Crossfeed" #: data/ui/maximizer.glade:29 msgid "Maximizer" msgstr "Maximizador" #: data/ui/maximizer.glade:269 data/ui/gate.glade:190 msgid "Gain Reduction" msgstr "Reducción de Ganancia" #: data/ui/loudness.glade:196 msgid "Link" msgstr "Acoplar" #: data/ui/gate.glade:31 msgid "Gate" msgstr "Puerta de Ruido" #: data/ui/gate.glade:162 data/ui/deesser.glade:190 msgid "Detection" msgstr "Detección" #: data/ui/gate.glade:176 msgid "Stereo Link" msgstr "Acoplamiento Estéreo" #: data/ui/gate.glade:235 msgid "Average" msgstr "Promedio" #: data/ui/gate.glade:236 msgid "Maximum" msgstr "Máximo" #: data/ui/gate.glade:667 data/ui/multiband_gate.glade:766 #: data/ui/multiband_gate.glade:1175 data/ui/multiband_gate.glade:1585 #: data/ui/multiband_gate.glade:1995 msgid "Gating" msgstr "Puerta" #: data/ui/multiband_gate.glade:70 msgid "Multiband Gate" msgstr "Puerta Multibanda" #: data/ui/multiband_gate.glade:722 data/ui/multiband_gate.glade:1152 #: data/ui/multiband_gate.glade:1562 data/ui/multiband_gate.glade:1972 #: data/ui/deesser.glade:748 msgid "Reduction" msgstr "Reducción" #: data/ui/deesser.glade:61 msgid "Deesser" msgstr "Deesser" #: data/ui/deesser.glade:232 msgid "Wide" msgstr "Ancho" #: data/ui/deesser.glade:233 data/ui/deesser.glade:262 msgid "Split" msgstr "Dividir" #: data/ui/deesser.glade:381 msgid "Level" msgstr "Nivel" #: data/ui/deesser.glade:394 msgid "Peak Q" msgstr "Pico Q" #: data/ui/deesser.glade:426 msgid "Laxity" msgstr "Relajamiento" #: data/ui/deesser.glade:761 msgid "Detected" msgstr "Detectado" #: data/ui/convolver.glade:24 msgid "Convolver" msgstr "Convolver" #: data/ui/convolver.glade:101 msgid "Import Impulse" msgstr "Importar Archivo Impulse" #: data/ui/convolver.glade:105 msgid "Import Impulse Response File" msgstr "Importar Archivo de Respuesta Impulse" #: data/ui/convolver.glade:221 msgid "L" msgstr "L" #: data/ui/convolver.glade:235 msgid "R" msgstr "R" #: data/ui/convolver.glade:298 msgid "Duration" msgstr "Duración" #: data/ui/convolver.glade:309 msgid "Samples" msgstr "Muestras" #: data/ui/convolver.glade:342 src/convolver_ui.cpp:251 msgid "Impulse Response" msgstr "Respuesta de Impulse" #: data/ui/convolver.glade:362 msgid "Select the impulse Response File" msgstr "Seleccione el Archivo de Respuesta Impulse" #: data/ui/convolver.glade:382 src/spectrum_settings_ui.cpp:143 msgid "Spectrum" msgstr "Espectro" #: data/ui/convolver.glade:423 msgid "Stereo Width" msgstr "Amplitud Estéreo" #: data/ui/crystalizer.glade:48 msgid "Crystalizer" msgstr "Cristalizador" #: data/ui/crystalizer.glade:161 msgid "Aggressive Mode" msgstr "Modo Agresivo" #: data/ui/crystalizer.glade:420 msgid "Loudness Range" msgstr "Rango de Sonoridad" #: data/ui/crystalizer.glade:439 msgid "Before" msgstr "Antes" #: data/ui/crystalizer.glade:452 msgid "After" msgstr "Después" #: data/ui/pitch.glade:36 msgid "Pitch" msgstr "Tono" #: data/ui/pitch.glade:142 msgid "Faster" msgstr "Más Rápido" #: data/ui/pitch.glade:156 msgid "Preserve Formant" msgstr "Conservar Formato" #: data/ui/pitch.glade:180 msgid "Cents" msgstr "Acentos" #: data/ui/pitch.glade:211 msgid "Semitones" msgstr "Semitonos" #: data/ui/pitch.glade:242 msgid "Octaves" msgstr "Octavas" #: data/ui/pitch.glade:273 msgid "Crispness" msgstr "Frescura" #: data/ui/webrtc.glade:30 msgid "Webrtc" msgstr "Webrtc" #: data/ui/webrtc.glade:137 data/ui/webrtc.glade:257 data/ui/webrtc.glade:327 #: data/ui/webrtc.glade:496 msgid "Enable" msgstr "Habilitar" #: data/ui/webrtc.glade:158 msgid "Extended Filter" msgstr "Filtro Extendido" #: data/ui/webrtc.glade:171 msgid "Delay Agnostic" msgstr "Retraso Agnóstico" #: data/ui/webrtc.glade:183 msgid "High Pass Filter" msgstr "Filtro de Pase Alto" #: data/ui/webrtc.glade:212 data/ui/webrtc.glade:280 msgid "Suppresion Level" msgstr "Nivel de Supresión" #: data/ui/webrtc.glade:225 data/ui/webrtc.glade:293 data/ui/webrtc.glade:548 msgid "Low" msgstr "Bajo" #: data/ui/webrtc.glade:226 data/ui/webrtc.glade:294 data/ui/webrtc.glade:549 msgid "Moderate" msgstr "Moderado" #: data/ui/webrtc.glade:227 data/ui/webrtc.glade:295 data/ui/webrtc.glade:550 msgid "High" msgstr "Alto" #: data/ui/webrtc.glade:244 msgid "Echo Canceller" msgstr "Cancelador de Eco" #: data/ui/webrtc.glade:296 msgid "Very High" msgstr "Muy Alto" #: data/ui/webrtc.glade:313 msgid "Noise Suppressor" msgstr "Supresor de Ruido" #: data/ui/webrtc.glade:363 msgid "Adaptive Digital" msgstr "Adaptado Digital" #: data/ui/webrtc.glade:364 msgid "Fixed Digital" msgstr "Arreglo Digital" #: data/ui/webrtc.glade:381 msgid "Gain Controller" msgstr "Regulador de Ganancia" #: data/ui/webrtc.glade:419 msgid "Target Level" msgstr "Nivel Objetivo" #: data/ui/webrtc.glade:448 msgid "Maximum Gain" msgstr "Ganancia Máxima" #: data/ui/webrtc.glade:521 msgid "Detection Likelihood" msgstr "Probabilidad de Detección" #: data/ui/webrtc.glade:534 msgid "Frame Size" msgstr "Tamaño del Marco" #: data/ui/webrtc.glade:547 msgid "Very Low" msgstr "Muy Bajo" #: data/ui/webrtc.glade:584 msgid "Voice Detector" msgstr "Detector de Voz" #: data/ui/delay.glade:24 msgid "Delay" msgstr "Retraso" #: data/ui/preset_row.glade:68 msgid "Save current settings to this preset file" msgstr "Guardar esta configuración a este perfil" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "Borrar este perfil" #: data/ui/preset_row.glade:100 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" "Automáticamente aplicar este perfil siempre que el dispositivo actual esté " "conectado" #: data/ui/presets_menu.glade:86 data/ui/presets_menu.glade:195 #: src/presets_menu_ui.cpp:110 msgid "Import Presets" msgstr "Importar Perfiles" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Volumen" #: data/ui/calibration_signals.glade:108 msgid "Sine" msgstr "Seno" #: data/ui/calibration_signals.glade:109 msgid "Square" msgstr "Cuadrado" #: data/ui/calibration_signals.glade:110 msgid "Saw" msgstr "Sierra" #: data/ui/calibration_signals.glade:111 msgid "Triangle" msgstr "Triángulo" #: data/ui/calibration_signals.glade:112 msgid "Silence" msgstr "Silencio" #: data/ui/calibration_signals.glade:113 msgid "White Noise" msgstr "Ruido Blanco" #: data/ui/calibration_signals.glade:114 msgid "Pink Noise" msgstr "Ruido Rosa" #: data/ui/calibration_signals.glade:115 msgid "Sine Table" msgstr "Mesa Sinusoidal" #: data/ui/calibration_signals.glade:116 msgid "Ticks" msgstr "Ticks" #: data/ui/calibration_signals.glade:117 msgid "Gaussian Noise" msgstr "Ruido Gaussiano" #: data/ui/calibration_signals.glade:118 msgid "Red Noise" msgstr "Ruido Rojo" #: data/ui/calibration_signals.glade:119 msgid "Blue Noise" msgstr "Ruido Azul" #: data/ui/calibration_signals.glade:120 msgid "Violet Noise" msgstr "Ruido Violeta" #: data/ui/calibration_mic.glade:29 msgid "Window" msgstr "Ventana" #: data/ui/calibration_mic.glade:70 msgid "Measure Noise" msgstr "Medir Ruido" #: data/ui/calibration_mic.glade:99 msgid "Subtract Noise" msgstr "Reducir Ruido" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Efectos de Sonido para las Aplicaciones de PulseAudio" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Wellington Wallace" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects es una avanzada herramienta de manipulación de audio. Incluye " "un ecualizador, limitador, compresor y herramienta de reverberación , solo " "por mencionar algunos. Para complementar esto hay también incluido un " "analizador de espectro." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "Debido a que PulseEffects usa por defecto el servicio de sonido PulseAudio, " "este funcionará con la mayoría, sino que todas, las aplicaciones que use. " "Todas las aplicaciones son mostradas en la ventana principal donde pueden " "ser habilitadas individualmente." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Además de manipular el sonido de salida, PulseEffects puede aplicar efectos " "a dispositivos de entrada, como micrófonos. Esto es útil, por ejemplo, en la " "grabación de audio, pero también funciona correctamente durante " "conversaciones de voces." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "Cuando PulseEffects esté activo este convenientemente recordará la " "configuración usada en la última sesión. También es posible guardar la " "configuración actual como un perfil." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "Establecer el volumen y encender/apagar los efectos" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "Incluye un ecualizador con perfiles incluidos" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Limitador de Entrada" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Calibración" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "Ecualizador, Compresor y Otros Efectos de Sonido" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "limitador;compresor;reverberación;ecualizador;autovolumen;" #. Translators: This is an icon name, don't translate! #: data/com.github.wwmm.pulseeffects.desktop.in:10 msgid "pulseeffects" msgstr "pulseeffects" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:201 msgid "\"Presets\"" msgstr "\"Perfiles\"" #: src/application.cpp:19 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "" "Salir de PulseEffects. Útil cuando se está ejecutando en modo de servicio." #: src/application.cpp:21 msgid "Show available presets." msgstr "Mostrar perfiles disponibles." #: src/application.cpp:24 msgid "Load a preset. Example: pulseeffects -l music" msgstr "Cargar un perfil. Ejemplo: pulseeffects -l music" #: src/application.cpp:26 msgid "Reset PulseEffects." msgstr "Restablecer PulseEffects." #: src/application.cpp:29 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "" "Bypass global, 1 para habilitar, 2 para deshabilitar y 3 para obtener el " "estado" #: src/application.cpp:263 msgid "Output Presets: " msgstr "Perfiles de Dispositivos de Salida: " #: src/application.cpp:271 msgid "Input Presets: " msgstr "Perfiles de Dispositivos de Entrada: " #: src/effects_base_ui.cpp:27 msgid "Applications" msgstr "Aplicaciones" #: src/blocklist_settings_ui.cpp:71 msgid "Blocklist" msgstr "Lista Negra" #: src/general_settings_ui.cpp:121 msgid "General" msgstr "General" #: src/pulse_settings_ui.cpp:138 msgid "Pulseaudio" msgstr "Pulseaudio" #: src/presets_menu_ui.cpp:111 src/convolver_ui.cpp:247 msgid "Open" msgstr "Abrir" #: src/presets_menu_ui.cpp:111 src/convolver_ui.cpp:247 msgid "Cancel" msgstr "Cancelar" #: src/app_info_ui.cpp:85 msgid "paused" msgstr "pausado" #: src/app_info_ui.cpp:87 msgid "playing" msgstr "reproduciendo" #: src/calibration_ui.cpp:171 msgid "Calibration Microphone" msgstr "Calibrar Micrófono" #: src/convolver_ui.cpp:246 msgid "Import Impulse File" msgstr "Importar Archivo Impulse" #: src/convolver_ui.cpp:290 src/convolver_ui.cpp:291 src/convolver_ui.cpp:293 msgid "Failed" msgstr "Fallido" #: src/convolver_ui.cpp:295 msgid "Could Not Load The Impulse File" msgstr "No se pudo encontrar el archivo Impulse" #: src/equalizer_ui.cpp:307 src/equalizer_ui.cpp:426 msgid "infinity" msgstr "infinidad" easyeffects-4.8.7/po/fr_FR.po000066400000000000000000001216661424023573300160260ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-14 23:58+0100\n" "PO-Revision-Date: 2017-08-29 11:00+0200\n" "Last-Translator: Nathan Graule \n" "Language-Team: \n" "Language: fr_FR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.1\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 data/ui/application.glade:61 msgid "PulseEffects" msgstr "PulseEffects" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Effets audio pour applications PulseAudio" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects est un outil avancé de manipulation audio. Il inclut, entre " "autres, un égaliseur, limiteur, compresseur et effet de réverbération. Aussi " "présent est un analyseur de fréquences." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "Parce que PulseEffects utilise le serveur PulseAudio par défaut, cet outil " "fonctionne avec la grande majorité des applications. Les applications " "compatibles sont présentées dans la fenêtre principale, où vous pouvez les " "activer manuellement." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "En plus de la manipulation de la sortie audio, PulseEffects peut aussi " "manipuler l'entrée audio, depuis par exemple un microphone; ce qui est utile " "pour l'enregistrement audio ou pour une conversation." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "PuseEffets se rappelle de la configuration utilisée lors du lancement " "précédent. Il est aussi possible de sauvegarder tous les paramètres dans des " "profils personnalisés." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Limiteur d'entrée" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:52 #: data/ui/compressor.glade:110 data/ui/compressor.glade:589 #: data/ui/webrtc.glade:633 msgid "Compressor" msgstr "Compresseur" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Calibration" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "" #: data/com.github.wwmm.pulseeffects.desktop.in:6 #, fuzzy msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "limiter;compressor;reverberation;equalizer;autovolume;" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:44 #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:47 #, fuzzy msgid "\"Presets\"" msgstr "Préréglage" #: data/ui/about.glade.in:11 #, fuzzy msgid "Audio effects for PulseAudio applications" msgstr "Effets audio pour applications PulseAudio" #: data/ui/app_button_row.glade:49 #, fuzzy msgid "Applications" msgstr "Calibration" #: data/ui/app_info.glade:203 msgid "Add to Blocklist" msgstr "" #: data/ui/app_info.glade:239 msgid "Format" msgstr "" #: data/ui/app_info.glade:264 data/ui/convolver.glade:348 msgid "Rate" msgstr "" #: data/ui/app_info.glade:289 data/ui/pulse_info.glade:239 #: data/ui/stereo_tools.glade:756 msgid "Channels" msgstr "" #: data/ui/app_info.glade:314 msgid "Resampler" msgstr "" #: data/ui/app_info.glade:339 data/ui/pulse_settings.glade:159 #: data/ui/pulse_settings.glade:259 data/ui/pulse_settings.glade:464 #: data/ui/pulse_settings.glade:564 #, fuzzy msgid "Buffer" msgstr "Latence" #: data/ui/app_info.glade:364 data/ui/pulse_settings.glade:190 #: data/ui/pulse_settings.glade:290 data/ui/pulse_settings.glade:476 #: data/ui/pulse_settings.glade:576 msgid "Latency" msgstr "Latence" #: data/ui/app_info.glade:389 msgid "State" msgstr "" #: data/ui/application.glade:142 src/calibration_ui.cpp:64 #: src/calibration_ui.cpp:191 #, fuzzy msgid "Test Signals" msgstr "Signal de test" #: data/ui/application.glade:157 msgid "Global Bypass" msgstr "" #: data/ui/application.glade:172 data/ui/equalizer.glade:331 #: data/ui/general_settings.glade:289 msgid "Settings" msgstr "Paramètres" #: data/ui/application.glade:194 msgid "Help" msgstr "" #: data/ui/application.glade:217 data/ui/crossfeed.glade:240 #: data/ui/equalizer.glade:403 data/ui/filter.glade:344 #: data/ui/reverb.glade:401 src/presets_menu_ui.cpp:133 #: src/presets_menu_ui.cpp:285 src/presets_menu_ui.cpp:286 #: src/presets_menu_ui.cpp:303 src/presets_menu_ui.cpp:304 msgid "Presets" msgstr "Préréglage" #: data/ui/autogain.glade:90 #, fuzzy msgid "Auto Gain" msgstr "Gain d'entrée [dB]" #: data/ui/autogain.glade:161 data/ui/bass_enhancer.glade:167 #: data/ui/compressor.glade:214 data/ui/convolver.glade:218 #: data/ui/crossfeed.glade:136 data/ui/crystalizer.glade:134 #: data/ui/deesser.glade:182 data/ui/delay.glade:144 #: data/ui/equalizer.glade:450 data/ui/equalizer_band.glade:187 #: data/ui/equalizer_band.glade:230 data/ui/exciter.glade:167 #: data/ui/filter.glade:243 data/ui/general_settings.glade:298 #: data/ui/gate.glade:172 data/ui/limiter.glade:166 data/ui/loudness.glade:174 #: data/ui/maximizer.glade:139 data/ui/multiband_compressor.glade:307 #: data/ui/multiband_gate.glade:331 data/ui/pitch.glade:158 #: data/ui/reverb.glade:299 data/ui/stereo_tools.glade:194 #: data/ui/webrtc.glade:141 data/ui/rnnoise.glade:139 msgid "Reset" msgstr "Remettre à zéro" #: data/ui/autogain.glade:185 data/ui/rnnoise.glade:163 msgid "Based on" msgstr "" #: data/ui/autogain.glade:262 msgid "Reset History" msgstr "" #: data/ui/autogain.glade:274 #, fuzzy msgid "Detect Silence" msgstr "Atténuation" #: data/ui/autogain.glade:286 msgid "Use Geometric Mean" msgstr "" #: data/ui/autogain.glade:325 #, fuzzy msgid "Target" msgstr "Cible [dB]" #: data/ui/autogain.glade:374 data/ui/autogain.glade:779 msgid "Momentary" msgstr "" #: data/ui/autogain.glade:434 msgid "Weights" msgstr "" #: data/ui/autogain.glade:448 data/ui/autogain.glade:792 msgid "Short Term" msgstr "" #: data/ui/autogain.glade:497 data/ui/autogain.glade:805 msgid "Integrated" msgstr "" #: data/ui/autogain.glade:564 data/ui/autogain.glade:1076 #: data/ui/bass_enhancer.glade:596 data/ui/compressor.glade:1086 #: data/ui/convolver.glade:575 data/ui/crossfeed.glade:391 #: data/ui/crystalizer.glade:250 data/ui/deesser.glade:783 #: data/ui/delay.glade:328 data/ui/equalizer.glade:682 #: data/ui/exciter.glade:596 data/ui/filter.glade:508 data/ui/gate.glade:689 #: data/ui/limiter.glade:501 data/ui/loudness.glade:238 #: data/ui/loudness.glade:431 data/ui/maximizer.glade:358 #: data/ui/multiband_compressor.glade:2103 data/ui/multiband_gate.glade:2262 #: data/ui/pitch.glade:450 data/ui/presets_menu.glade:238 #: data/ui/reverb.glade:753 data/ui/stereo_tools.glade:427 #: data/ui/stereo_tools.glade:931 data/ui/webrtc.glade:780 #: data/ui/rnnoise.glade:362 msgid "Input" msgstr "Entrée" #: data/ui/autogain.glade:577 data/ui/autogain.glade:1020 #: data/ui/bass_enhancer.glade:625 data/ui/compressor.glade:1099 #: data/ui/convolver.glade:588 data/ui/crossfeed.glade:405 #: data/ui/crystalizer.glade:263 data/ui/deesser.glade:797 #: data/ui/delay.glade:341 data/ui/equalizer.glade:695 #: data/ui/exciter.glade:625 data/ui/filter.glade:521 data/ui/gate.glade:703 #: data/ui/limiter.glade:636 data/ui/loudness.glade:271 #: data/ui/loudness.glade:445 data/ui/maximizer.glade:372 #: data/ui/multiband_compressor.glade:894 #: data/ui/multiband_compressor.glade:1272 #: data/ui/multiband_compressor.glade:1651 #: data/ui/multiband_compressor.glade:2030 #: data/ui/multiband_compressor.glade:2116 data/ui/multiband_gate.glade:951 #: data/ui/multiband_gate.glade:1363 data/ui/multiband_gate.glade:1776 #: data/ui/multiband_gate.glade:2189 data/ui/multiband_gate.glade:2275 #: data/ui/pitch.glade:463 data/ui/presets_menu.glade:137 #: data/ui/reverb.glade:766 data/ui/stereo_tools.glade:901 #: data/ui/stereo_tools.glade:944 data/ui/webrtc.glade:794 #: data/ui/rnnoise.glade:375 msgid "Output" msgstr "Sortie" #: data/ui/autogain.glade:899 msgid "Relative" msgstr "" #: data/ui/autogain.glade:912 data/ui/compressor.glade:1262 #, fuzzy msgid "Gain" msgstr "Gain d'entrée [dB]" #: data/ui/autogain.glade:980 msgid "Loudness" msgstr "" #: data/ui/autogain.glade:1034 msgid "Range" msgstr "" #: data/ui/bass_enhancer.glade:116 #, fuzzy msgid "Bass Enhancer" msgstr "Amélioration audio" #: data/ui/bass_enhancer.glade:191 data/ui/compressor.glade:238 #: data/ui/crossfeed.glade:160 data/ui/deesser.glade:206 #: data/ui/delay.glade:168 data/ui/equalizer.glade:474 #: data/ui/exciter.glade:191 data/ui/filter.glade:267 data/ui/gate.glade:196 #: data/ui/limiter.glade:190 data/ui/loudness.glade:143 #: data/ui/maximizer.glade:163 data/ui/multiband_compressor.glade:331 #: data/ui/multiband_gate.glade:355 data/ui/pitch.glade:182 #: data/ui/reverb.glade:323 data/ui/stereo_tools.glade:218 #: data/ui/webrtc.glade:165 msgid "Provided by" msgstr "" #: data/ui/bass_enhancer.glade:259 data/ui/compressor.glade:602 #: data/ui/deesser.glade:274 data/ui/exciter.glade:259 msgid "Listen" msgstr "" #: data/ui/bass_enhancer.glade:302 data/ui/exciter.glade:303 msgid "3rd" msgstr "" #: data/ui/bass_enhancer.glade:315 data/ui/exciter.glade:316 msgid "2nd" msgstr "" #: data/ui/bass_enhancer.glade:327 data/ui/exciter.glade:328 msgid "Blend Harmonics" msgstr "" #: data/ui/bass_enhancer.glade:355 data/ui/exciter.glade:357 #: data/ui/reverb.glade:498 msgid "Amount" msgstr "" #: data/ui/bass_enhancer.glade:367 data/ui/bass_enhancer.glade:504 #: data/ui/exciter.glade:369 data/ui/exciter.glade:504 msgid "Harmonics" msgstr "" #: data/ui/bass_enhancer.glade:379 data/ui/exciter.glade:381 msgid "Scope" msgstr "" #: data/ui/bass_enhancer.glade:472 msgid "Floor" msgstr "" #: data/ui/blocklist_settings.glade:52 data/ui/blocklist_settings.glade:155 #: data/ui/presets_menu.glade:65 data/ui/presets_menu.glade:166 #, fuzzy msgid "Create Preset" msgstr "Sauvegarder préglage" #: data/ui/blocklist_settings.glade:68 data/ui/blocklist_settings.glade:171 #: data/ui/presets_menu.glade:52 data/ui/presets_menu.glade:153 #: data/ui/pulse_info.glade:50 msgid "Name" msgstr "" #: data/ui/blocklist_settings.glade:81 msgid "Reconnect the microphone to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:139 data/ui/pulse_settings.glade:383 #, fuzzy msgid "Input Effects" msgstr "PulseEffects" #: data/ui/blocklist_settings.glade:230 msgid "Restart the player to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:242 data/ui/pulse_settings.glade:688 #, fuzzy msgid "Output Effects" msgstr "Limiteur d'entrée" #: data/ui/blocklist_settings.glade:265 msgid "Show Blocklisted Apps in Main Tab" msgstr "" #: data/ui/calibration_signals.glade:32 msgid "Sine" msgstr "Sinusoïde" #: data/ui/calibration_signals.glade:33 msgid "Square" msgstr "Carrée" #: data/ui/calibration_signals.glade:34 msgid "Saw" msgstr "Dent de scie" #: data/ui/calibration_signals.glade:35 msgid "Triangle" msgstr "Triangle" #: data/ui/calibration_signals.glade:36 #, fuzzy msgid "Silence" msgstr "Silence" #: data/ui/calibration_signals.glade:37 msgid "White Noise" msgstr "Bruit blanc" #: data/ui/calibration_signals.glade:38 msgid "Pink Noise" msgstr "Bruit rose" #: data/ui/calibration_signals.glade:39 msgid "Sine Table" msgstr "Table sinusoïdale" #: data/ui/calibration_signals.glade:40 msgid "Ticks" msgstr "Ticks" #: data/ui/calibration_signals.glade:41 msgid "Gaussian Noise" msgstr "Bruit Gaussien" #: data/ui/calibration_signals.glade:42 msgid "Red Noise" msgstr "Bruit rouge" #: data/ui/calibration_signals.glade:43 msgid "Blue Noise" msgstr "Bruit bleu" #: data/ui/calibration_signals.glade:44 msgid "Violet Noise" msgstr "Bruit violet" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Volume" #: data/ui/calibration_signals.glade:135 data/ui/equalizer_band.glade:158 #: data/ui/filter.glade:394 #, fuzzy msgid "Frequency" msgstr "Fréquence [Hz]" #: data/ui/calibration_mic.glade:33 #, fuzzy msgid "Window" msgstr "Fenêtre [s]" #: data/ui/calibration_mic.glade:90 msgid "Measure Noise" msgstr "Mesurer le bruit" #: data/ui/calibration_mic.glade:119 msgid "Subtract Noise" msgstr "Enlever le bruit" #: data/ui/compressor.glade:386 data/ui/deesser.glade:436 #: data/ui/gate.glade:498 data/ui/maximizer.glade:242 #: data/ui/multiband_compressor.glade:707 #: data/ui/multiband_compressor.glade:1085 #: data/ui/multiband_compressor.glade:1464 #: data/ui/multiband_compressor.glade:1843 data/ui/multiband_gate.glade:731 #: data/ui/multiband_gate.glade:1142 data/ui/multiband_gate.glade:1555 #: data/ui/multiband_gate.glade:1968 #, fuzzy msgid "Threshold" msgstr "Seuil [dB]" #: data/ui/compressor.glade:420 data/ui/deesser.glade:448 #: data/ui/gate.glade:532 data/ui/multiband_compressor.glade:741 #: data/ui/multiband_compressor.glade:1119 #: data/ui/multiband_compressor.glade:1498 #: data/ui/multiband_compressor.glade:1877 data/ui/multiband_gate.glade:765 #: data/ui/multiband_gate.glade:1176 data/ui/multiband_gate.glade:1589 #: data/ui/multiband_gate.glade:2002 #, fuzzy msgid "Ratio" msgstr "Ratio [n:1]" #: data/ui/compressor.glade:452 data/ui/gate.glade:564 #: data/ui/multiband_compressor.glade:773 #: data/ui/multiband_compressor.glade:1151 #: data/ui/multiband_compressor.glade:1530 #: data/ui/multiband_compressor.glade:1909 data/ui/multiband_gate.glade:797 #: data/ui/multiband_gate.glade:1208 data/ui/multiband_gate.glade:1621 #: data/ui/multiband_gate.glade:2034 #, fuzzy msgid "Knee" msgstr "Coudée [dB]" #: data/ui/compressor.glade:486 data/ui/deesser.glade:532 #: data/ui/gate.glade:598 data/ui/multiband_compressor.glade:807 #: data/ui/multiband_compressor.glade:1185 #: data/ui/multiband_compressor.glade:1564 #: data/ui/multiband_compressor.glade:1943 data/ui/multiband_gate.glade:831 #: data/ui/multiband_gate.glade:1242 data/ui/multiband_gate.glade:1655 #: data/ui/multiband_gate.glade:2068 #, fuzzy msgid "Makeup" msgstr "Gain de remise [dB]" #: data/ui/compressor.glade:520 data/ui/gate.glade:464 #: data/ui/limiter.glade:363 data/ui/maximizer.glade:266 #: data/ui/multiband_compressor.glade:673 #: data/ui/multiband_compressor.glade:1051 #: data/ui/multiband_compressor.glade:1430 #: data/ui/multiband_compressor.glade:1809 data/ui/multiband_gate.glade:697 #: data/ui/multiband_gate.glade:1108 data/ui/multiband_gate.glade:1521 #: data/ui/multiband_gate.glade:1934 #, fuzzy msgid "Release" msgstr "Relâche [s]" #: data/ui/compressor.glade:532 data/ui/gate.glade:430 #: data/ui/multiband_compressor.glade:639 #: data/ui/multiband_compressor.glade:1017 #: data/ui/multiband_compressor.glade:1396 #: data/ui/multiband_compressor.glade:1775 data/ui/multiband_gate.glade:663 #: data/ui/multiband_gate.glade:1074 data/ui/multiband_gate.glade:1487 #: data/ui/multiband_gate.glade:1900 #, fuzzy msgid "Attack" msgstr "Attaque [ms]" #: data/ui/compressor.glade:559 msgid "Downward" msgstr "" #: data/ui/compressor.glade:560 msgid "Upward" msgstr "" #: data/ui/compressor.glade:573 #, fuzzy msgid "Compression Mode" msgstr "Aucune compression" #: data/ui/compressor.glade:649 #, fuzzy msgid "Pre-amplification" msgstr "Calibration" #: data/ui/compressor.glade:683 msgid "Reactivity" msgstr "" #: data/ui/compressor.glade:716 data/ui/limiter.glade:375 msgid "Lookahead" msgstr "" #: data/ui/compressor.glade:730 msgid "Feed-forward" msgstr "" #: data/ui/compressor.glade:731 #, fuzzy msgid "Feed-back" msgstr "Coudée [dB]" #: data/ui/compressor.glade:744 data/ui/equalizer_band.glade:51 msgid "Type" msgstr "" #: data/ui/compressor.glade:758 data/ui/deesser.glade:731 #: data/ui/gate.glade:303 data/ui/multiband_compressor.glade:611 #: data/ui/multiband_compressor.glade:989 #: data/ui/multiband_compressor.glade:1368 #: data/ui/multiband_compressor.glade:1747 data/ui/multiband_gate.glade:635 #: data/ui/multiband_gate.glade:1046 data/ui/multiband_gate.glade:1459 #: data/ui/multiband_gate.glade:1872 msgid "Peak" msgstr "" #: data/ui/compressor.glade:759 data/ui/deesser.glade:730 #: data/ui/gate.glade:302 data/ui/multiband_compressor.glade:610 #: data/ui/multiband_compressor.glade:988 #: data/ui/multiband_compressor.glade:1367 #: data/ui/multiband_compressor.glade:1746 data/ui/multiband_gate.glade:634 #: data/ui/multiband_gate.glade:1045 data/ui/multiband_gate.glade:1458 #: data/ui/multiband_gate.glade:1871 msgid "RMS" msgstr "" #: data/ui/compressor.glade:760 #, fuzzy msgid "Low-Pass" msgstr "Passe-bas" #: data/ui/compressor.glade:761 msgid "Uniform" msgstr "" #: data/ui/compressor.glade:774 data/ui/deesser.glade:702 #: data/ui/equalizer.glade:257 data/ui/equalizer_band.glade:84 #: data/ui/multiband_compressor.glade:412 data/ui/multiband_gate.glade:436 #: data/ui/stereo_tools.glade:591 data/ui/webrtc.glade:483 msgid "Mode" msgstr "" #: data/ui/compressor.glade:788 #, fuzzy msgid "Middle" msgstr "Niveau" #: data/ui/compressor.glade:789 #, fuzzy msgid "Side" msgstr "Gain d'entrée [dB]" #: data/ui/compressor.glade:790 data/ui/delay.glade:247 #: data/ui/equalizer.glade:612 data/ui/stereo_tools.glade:655 msgid "Left" msgstr "" #: data/ui/compressor.glade:791 data/ui/delay.glade:280 #: data/ui/equalizer.glade:654 data/ui/stereo_tools.glade:724 msgid "Right" msgstr "" #: data/ui/compressor.glade:804 msgid "Source" msgstr "" #: data/ui/compressor.glade:820 data/ui/compressor.glade:1274 #, fuzzy msgid "Sidechain" msgstr "Gain d'entrée [dB]" #: data/ui/compressor.glade:925 msgid "Relative Release Threshold" msgstr "" #: data/ui/compressor.glade:937 #, fuzzy msgid "Boost Threshold" msgstr "Seuil [dB]" #: data/ui/compressor.glade:949 #, fuzzy msgid "High-pass Frequency" msgstr "Recentrer fréquences" #: data/ui/compressor.glade:961 #, fuzzy msgid "Low-pass Frequency" msgstr "Recentrer fréquences" #: data/ui/compressor.glade:973 #, fuzzy msgid "High-pass Filter Mode" msgstr "Passe-haut" #: data/ui/compressor.glade:985 msgid "Low-pass Filter Mode" msgstr "" #: data/ui/compressor.glade:999 data/ui/compressor.glade:1017 #: data/ui/equalizer_band.glade:63 msgid "Off" msgstr "" #: data/ui/compressor.glade:1000 data/ui/compressor.glade:1018 msgid "12 dB/oct" msgstr "" #: data/ui/compressor.glade:1001 data/ui/compressor.glade:1019 msgid "24 dB/oct" msgstr "" #: data/ui/compressor.glade:1002 data/ui/compressor.glade:1020 msgid "36 dB/oct" msgstr "" #: data/ui/compressor.glade:1043 #, fuzzy msgid "Advanced" msgstr "Paramètres" #: data/ui/compressor.glade:1347 msgid "Curve" msgstr "" #: data/ui/convolver.glade:90 msgid "Convolver" msgstr "" #: data/ui/convolver.glade:125 #, fuzzy msgid "Import Impulse" msgstr "Réponse plane" #: data/ui/convolver.glade:129 msgid "Import Impulse Response File" msgstr "" #: data/ui/convolver.glade:309 msgid "L" msgstr "L" #: data/ui/convolver.glade:323 msgid "R" msgstr "R" #: data/ui/convolver.glade:390 #, fuzzy msgid "Duration" msgstr "Calibration" #: data/ui/convolver.glade:402 msgid "Samples" msgstr "" #: data/ui/convolver.glade:435 src/convolver_ui.cpp:285 #, fuzzy msgid "Impulse Response" msgstr "Réponse plane" #: data/ui/convolver.glade:458 #, fuzzy msgid "Select the impulse Response File" msgstr "Réponse plane" #: data/ui/convolver.glade:477 src/spectrum_settings_ui.cpp:195 msgid "Spectrum" msgstr "Spectromètre" #: data/ui/convolver.glade:520 #, fuzzy msgid "Stereo Width" msgstr "Amélioration audio" #: data/ui/crossfeed.glade:104 msgid "Crossfeed" msgstr "" #: data/ui/crossfeed.glade:254 msgid "Jmeier" msgstr "" #: data/ui/crossfeed.glade:266 data/ui/filter.glade:183 #: data/ui/reverb.glade:259 msgid "Default" msgstr "" #: data/ui/crossfeed.glade:278 msgid "Cmoy" msgstr "" #: data/ui/crossfeed.glade:308 #, fuzzy msgid "Cutoff" msgstr "Coupure [Hz]" #: data/ui/crossfeed.glade:341 #, fuzzy msgid "Feed" msgstr "Coudée [dB]" #: data/ui/crystalizer.glade:90 #, fuzzy msgid "Crystalizer" msgstr "Égaliseur" #: data/ui/crystalizer.glade:200 #, fuzzy msgid "Aggressive Mode" msgstr "Aucune compression" #: data/ui/crystalizer.glade:464 msgid "Before" msgstr "" #: data/ui/crystalizer.glade:477 msgid "After" msgstr "" #: data/ui/crystalizer.glade:550 msgid "Loudness Range" msgstr "" #: data/ui/crystalizer_band.glade:28 data/ui/equalizer_band.glade:316 #: data/ui/stereo_tools.glade:680 data/ui/stereo_tools.glade:737 msgid "Mute" msgstr "" #: data/ui/crystalizer_band.glade:40 data/ui/multiband_compressor.glade:580 #: data/ui/multiband_compressor.glade:958 #: data/ui/multiband_compressor.glade:1337 #: data/ui/multiband_compressor.glade:1716 data/ui/multiband_gate.glade:604 #: data/ui/multiband_gate.glade:1015 data/ui/multiband_gate.glade:1428 #: data/ui/multiband_gate.glade:1841 msgid "Bypass" msgstr "" #: data/ui/deesser.glade:125 msgid "Deesser" msgstr "" #: data/ui/deesser.glade:309 #, fuzzy msgid "F1 Gain" msgstr "Gain d'entrée [dB]" #: data/ui/deesser.glade:321 #, fuzzy msgid "F2 Level" msgstr "Niveau" #: data/ui/deesser.glade:333 msgid "F2 Peak Q" msgstr "" #: data/ui/deesser.glade:424 msgid "Laxity" msgstr "" #: data/ui/deesser.glade:585 msgid "F1 Split" msgstr "" #: data/ui/deesser.glade:597 msgid "F2 Peak" msgstr "" #: data/ui/deesser.glade:690 data/ui/gate.glade:288 #, fuzzy msgid "Detection" msgstr "Atténuation" #: data/ui/deesser.glade:715 msgid "Wide" msgstr "" #: data/ui/deesser.glade:716 msgid "Split" msgstr "" #: data/ui/deesser.glade:959 data/ui/multiband_gate.glade:865 #: data/ui/multiband_gate.glade:1298 data/ui/multiband_gate.glade:1711 #: data/ui/multiband_gate.glade:2124 #, fuzzy msgid "Reduction" msgstr "Réduction de gain" #: data/ui/deesser.glade:972 #, fuzzy msgid "Detected" msgstr "Atténuation" #: data/ui/delay.glade:90 #, fuzzy msgid "Delay" msgstr "Relâche [ms]" #: data/ui/equalizer.glade:44 msgid "Equalizer" msgstr "Égaliseur" #: data/ui/equalizer.glade:160 msgid "Flat Response" msgstr "Réponse plane" #: data/ui/equalizer.glade:175 msgid "Calculate Frequencies" msgstr "" #: data/ui/equalizer.glade:213 msgid "Bands" msgstr "" #: data/ui/equalizer.glade:269 msgid "IIR" msgstr "" #: data/ui/equalizer.glade:270 msgid "FIR" msgstr "" #: data/ui/equalizer.glade:271 msgid "FFT" msgstr "" #: data/ui/equalizer.glade:304 msgid "Split Channels" msgstr "" #: data/ui/equalizer.glade:389 #, fuzzy msgid "Apply APO Preset" msgstr "Préréglage" #: data/ui/equalizer_band.glade:64 msgid "Bell" msgstr "" #: data/ui/equalizer_band.glade:65 #, fuzzy msgid "High Pass" msgstr "Passe-haut" #: data/ui/equalizer_band.glade:66 msgid "High Shelf" msgstr "" #: data/ui/equalizer_band.glade:67 msgid "Low Pass" msgstr "Passe-bas" #: data/ui/equalizer_band.glade:68 msgid "Low Shelf" msgstr "" #: data/ui/equalizer_band.glade:69 msgid "Notch" msgstr "" #: data/ui/equalizer_band.glade:70 data/ui/filter.glade:427 msgid "Resonance" msgstr "" #: data/ui/equalizer_band.glade:71 #, fuzzy msgid "All Pass" msgstr "Passe-bas" #: data/ui/equalizer_band.glade:96 msgid "RLC (BT)" msgstr "" #: data/ui/equalizer_band.glade:97 msgid "RLC (MT)" msgstr "" #: data/ui/equalizer_band.glade:98 msgid "BWC (BT)" msgstr "" #: data/ui/equalizer_band.glade:99 msgid "BWC (MT)" msgstr "" #: data/ui/equalizer_band.glade:100 msgid "LRX (BT)" msgstr "" #: data/ui/equalizer_band.glade:101 msgid "LRX (MT)" msgstr "" #: data/ui/equalizer_band.glade:102 msgid "APO (DR)" msgstr "" #: data/ui/equalizer_band.glade:115 msgid "Slope" msgstr "" #: data/ui/equalizer_band.glade:203 #, fuzzy msgid "Quality" msgstr "Remettre facteurs Q" #: data/ui/equalizer_band.glade:253 msgid "Width" msgstr "Largeur" #: data/ui/equalizer_band.glade:304 data/ui/multiband_compressor.glade:593 #: data/ui/multiband_compressor.glade:971 #: data/ui/multiband_compressor.glade:1350 #: data/ui/multiband_compressor.glade:1729 data/ui/multiband_gate.glade:617 #: data/ui/multiband_gate.glade:1028 data/ui/multiband_gate.glade:1441 #: data/ui/multiband_gate.glade:1854 msgid "Solo" msgstr "" #: data/ui/equalizer_preset_row.glade:39 data/ui/irs_row.glade:44 msgid "Apply" msgstr "" #: data/ui/exciter.glade:116 msgid "Exciter" msgstr "" #: data/ui/exciter.glade:472 data/ui/maximizer.glade:254 #, fuzzy msgid "Ceiling" msgstr "Limite [dB]" #: data/ui/filter.glade:97 msgid "Filter" msgstr "" #: data/ui/filter.glade:147 msgid "Muted" msgstr "" #: data/ui/filter.glade:159 data/ui/reverb.glade:233 msgid "Disco" msgstr "" #: data/ui/filter.glade:171 msgid "Distant Headphones" msgstr "" #: data/ui/filter.glade:360 msgid "12dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:361 msgid "24dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:362 msgid "36dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:363 msgid "12dB/oct Highpass" msgstr "" #: data/ui/filter.glade:364 msgid "24dB/oct Highpass" msgstr "" #: data/ui/filter.glade:365 msgid "36dB/oct Highpass" msgstr "" #: data/ui/filter.glade:366 msgid "6dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:367 msgid "12dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:368 msgid "18dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:369 msgid "6dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:370 msgid "12dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:371 msgid "18dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:460 msgid "Inertia" msgstr "" #: data/ui/general_settings.glade:58 msgid "Start Service at Login" msgstr "" #: data/ui/general_settings.glade:82 msgid "Process All Outputs" msgstr "" #: data/ui/general_settings.glade:94 msgid "Process All Inputs" msgstr "" #: data/ui/general_settings.glade:130 msgid "Use Dark Theme" msgstr "Utiliser thème sombre" #: data/ui/general_settings.glade:158 data/ui/general_settings.glade:220 msgid "Niceness" msgstr "" #: data/ui/general_settings.glade:159 msgid "Real Time" msgstr "" #: data/ui/general_settings.glade:160 msgid "None" msgstr "" #: data/ui/general_settings.glade:208 msgid "Priority Type" msgstr "" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "" #: data/ui/general_settings.glade:244 msgid "Activity Timeout" msgstr "" #: data/ui/general_settings.glade:325 msgid "About" msgstr "" #: data/ui/gate.glade:97 msgid "Gate" msgstr "" #: data/ui/gate.glade:330 #, fuzzy msgid "Maximum Gain Reduction" msgstr "Réduction de gain" #: data/ui/gate.glade:379 #, fuzzy msgid "Stereo Link" msgstr "Amélioration audio" #: data/ui/gate.glade:393 msgid "Average" msgstr "" #: data/ui/gate.glade:394 msgid "Maximum" msgstr "" #: data/ui/gate.glade:632 #, fuzzy msgid "Input Level" msgstr "Limiteur d'entrée" #: data/ui/gate.glade:864 data/ui/multiband_gate.glade:911 #: data/ui/multiband_gate.glade:1323 data/ui/multiband_gate.glade:1736 #: data/ui/multiband_gate.glade:2149 msgid "Gating" msgstr "" #: data/ui/limiter.glade:96 data/ui/webrtc.glade:612 #, fuzzy msgid "Limiter" msgstr "Limite [dB]" #: data/ui/limiter.glade:266 msgid "Automatic Smoothing Control" msgstr "" #: data/ui/limiter.glade:278 msgid "Automatic Leveling" msgstr "" #: data/ui/limiter.glade:308 #, fuzzy msgid "Limit" msgstr "Limite [dB]" #: data/ui/limiter.glade:409 msgid "Oversampling" msgstr "" #: data/ui/limiter.glade:447 msgid "ASC" msgstr "" #: data/ui/limiter.glade:595 msgid "Attenuation" msgstr "Atténuation" #: data/ui/loudness.glade:90 msgid "Loudness Compensator" msgstr "" #: data/ui/loudness.glade:328 msgid "Standard" msgstr "" #: data/ui/loudness.glade:341 msgid "Flat" msgstr "" #: data/ui/loudness.glade:342 msgid "ISO226-2003" msgstr "" #: data/ui/loudness.glade:343 msgid "Fletcher-Munson" msgstr "" #: data/ui/loudness.glade:344 msgid "Robinson-Dadson" msgstr "" # Taking lingual shortcuts to squeeze it in the text box #: data/ui/loudness.glade:370 #, fuzzy msgid "FFT Size" msgstr "Taille pièce" #: data/ui/maximizer.glade:95 msgid "Maximizer" msgstr "" #: data/ui/maximizer.glade:386 msgid "Gain Reduction" msgstr "Réduction de gain" #: data/ui/multiband_compressor.glade:139 #, fuzzy msgid "Multiband Compressor" msgstr "Compresseur" #: data/ui/multiband_compressor.glade:426 data/ui/multiband_gate.glade:450 msgid "LR4" msgstr "" #: data/ui/multiband_compressor.glade:427 data/ui/multiband_gate.glade:451 msgid "LR8" msgstr "" #: data/ui/multiband_compressor.glade:441 data/ui/multiband_gate.glade:465 msgid "Split 1/2" msgstr "" #: data/ui/multiband_compressor.glade:454 data/ui/multiband_gate.glade:478 msgid "Split 2/3" msgstr "" #: data/ui/multiband_compressor.glade:467 data/ui/multiband_gate.glade:491 msgid "Split 3/4" msgstr "" #: data/ui/multiband_compressor.glade:854 #: data/ui/multiband_compressor.glade:1232 #: data/ui/multiband_compressor.glade:1611 #: data/ui/multiband_compressor.glade:1990 #, fuzzy msgid "Compression" msgstr "Aucune compression" #: data/ui/multiband_compressor.glade:937 data/ui/multiband_gate.glade:994 #, fuzzy msgid "Sub Band" msgstr "Entrée [dB]" #: data/ui/multiband_compressor.glade:1315 data/ui/multiband_gate.glade:1406 #, fuzzy msgid "Low Band" msgstr "Passe-bas" #: data/ui/multiband_compressor.glade:1694 data/ui/multiband_gate.glade:1819 #, fuzzy msgid "Mid Band" msgstr "Gain d'entrée [dB]" #: data/ui/multiband_compressor.glade:2073 data/ui/multiband_gate.glade:2232 #, fuzzy msgid "High Band" msgstr "Passe-haut" #: data/ui/multiband_gate.glade:139 #, fuzzy msgid "Multiband Gate" msgstr "Compresseur" #: data/ui/pitch.glade:102 msgid "Pitch" msgstr "" #: data/ui/pitch.glade:270 msgid "Cents" msgstr "" #: data/ui/pitch.glade:300 msgid "Semitones" msgstr "" #: data/ui/pitch.glade:330 msgid "Octaves" msgstr "" #: data/ui/pitch.glade:360 msgid "Crispness" msgstr "" #: data/ui/pitch.glade:402 msgid "Faster" msgstr "" #: data/ui/pitch.glade:414 msgid "Preserve Formant" msgstr "" #: data/ui/preset_row.glade:55 msgid "Load" msgstr "" #: data/ui/preset_row.glade:70 msgid "Save current settings to this preset file" msgstr "" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "" #: data/ui/preset_row.glade:98 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" #: data/ui/presets_menu.glade:81 data/ui/presets_menu.glade:182 #: src/presets_menu_ui.cpp:129 #, fuzzy msgid "Import Presets" msgstr "Ouvrir préréglage" #: data/ui/pulse_info.glade:77 msgid "Version" msgstr "" #: data/ui/pulse_info.glade:104 msgid "Default Sink" msgstr "" #: data/ui/pulse_info.glade:116 msgid "Default Source" msgstr "" #: data/ui/pulse_info.glade:158 msgid "Protocol" msgstr "" #: data/ui/pulse_info.glade:185 msgid "Default Sample Format" msgstr "" #: data/ui/pulse_info.glade:212 msgid "Default Sampling Rate" msgstr "" #: data/ui/pulse_info.glade:266 msgid "Channel Mapping" msgstr "" #: data/ui/pulse_info.glade:291 msgid "Server" msgstr "" #: data/ui/pulse_info.glade:336 msgid "Modules" msgstr "" #: data/ui/pulse_info.glade:382 msgid "Clients" msgstr "" #: data/ui/pulse_info.glade:446 msgid "File" msgstr "" #: data/ui/pulse_info.glade:456 #, fuzzy msgid "Configuration" msgstr "Calibration" #: data/ui/pulse_info.glade:489 msgid "Resamplers" msgstr "" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:403 msgid "Use Default" msgstr "" #: data/ui/pulse_settings.glade:147 data/ui/pulse_settings.glade:452 msgid "Pipeline Input" msgstr "" #: data/ui/pulse_settings.glade:247 data/ui/pulse_settings.glade:552 #, fuzzy msgid "Pipeline Output" msgstr "Égaliseur - Sortie" # Taking lingual shortcuts to squeeze it in the text box #: data/ui/pulse_settings.glade:347 data/ui/pulse_settings.glade:652 #, fuzzy msgid "Block Size" msgstr "Taille pièce" #: data/ui/reverb.glade:130 msgid "Reverberation" msgstr "Réverberation" #: data/ui/reverb.glade:181 #, fuzzy msgid "Ambience" msgstr "Silence" #: data/ui/reverb.glade:194 msgid "Empty Walls" msgstr "" # Taking lingual shortcuts to squeeze it in the text box #: data/ui/reverb.glade:207 #, fuzzy msgid "Room" msgstr "Taille pièce" #: data/ui/reverb.glade:220 msgid "Large Empty Hall" msgstr "" #: data/ui/reverb.glade:246 msgid "Large Occupied Hall" msgstr "" #: data/ui/reverb.glade:453 #, fuzzy msgid "Pre Delay" msgstr "Relâche [ms]" #: data/ui/reverb.glade:465 msgid "Decay Time" msgstr "" #: data/ui/reverb.glade:531 msgid "Dry" msgstr "" #: data/ui/reverb.glade:563 msgid "Bass Cut" msgstr "" #: data/ui/reverb.glade:615 msgid "Treble Cut" msgstr "" #: data/ui/reverb.glade:660 msgid "Diffusion" msgstr "" # Taking lingual shortcuts to squeeze it in the text box #: data/ui/reverb.glade:672 msgid "Room Size" msgstr "Taille pièce" #: data/ui/reverb.glade:684 #, fuzzy msgid "Small" msgstr "Petite pièce" #: data/ui/reverb.glade:685 msgid "Medium" msgstr "" #: data/ui/reverb.glade:686 #, fuzzy msgid "Large" msgstr "Cible [dB]" #: data/ui/reverb.glade:687 msgid "Tunnel" msgstr "" #: data/ui/reverb.glade:688 msgid "Large/smooth" msgstr "" #: data/ui/reverb.glade:689 msgid "Experimental" msgstr "" #: data/ui/reverb.glade:702 msgid "High Frequency Damping" msgstr "" #: data/ui/spectrum_settings.glade:77 #, fuzzy msgid "Show Spectrum" msgstr "Spectromètre" #: data/ui/spectrum_settings.glade:89 msgid "Fill" msgstr "" #: data/ui/spectrum_settings.glade:125 msgid "Border" msgstr "" #: data/ui/spectrum_settings.glade:149 msgid "Use Custom Color" msgstr "" #: data/ui/spectrum_settings.glade:173 msgid "Use Gradient" msgstr "" #: data/ui/spectrum_settings.glade:315 #, fuzzy msgid "Points" msgstr "Points" #: data/ui/spectrum_settings.glade:327 msgid "Height" msgstr "" #: data/ui/spectrum_settings.glade:339 #, fuzzy msgid "Line Width" msgstr "Largeur" #: data/ui/spectrum_settings.glade:351 msgid "Sampling" msgstr "" #: data/ui/spectrum_settings.glade:363 #, fuzzy msgid "Minimum Frequency" msgstr "Fréquence [Hz]" #: data/ui/spectrum_settings.glade:375 #, fuzzy msgid "Maximum Frequency" msgstr "Fréquence [Hz]" #: data/ui/spectrum_settings.glade:410 #, fuzzy msgid "Spectrum Type" msgstr "Spectromètre" #: data/ui/spectrum_settings.glade:423 msgid "Bars" msgstr "" #: data/ui/spectrum_settings.glade:424 msgid "Lines" msgstr "" #: data/ui/spectrum_settings.glade:437 #, fuzzy msgid "Spectrum Color" msgstr "Spectromètre" #: data/ui/spectrum_settings.glade:449 msgid "Gradient Color" msgstr "" #: data/ui/spectrum_settings.glade:461 msgid "Axis Color" msgstr "" #: data/ui/stereo_tools.glade:108 #, fuzzy msgid "Stereo Tools" msgstr "Amélioration audio" #: data/ui/stereo_tools.glade:334 data/ui/stereo_tools.glade:775 #, fuzzy msgid "Balance" msgstr "Amélioration audio" #: data/ui/stereo_tools.glade:365 #, fuzzy msgid "S/C Level" msgstr "Niveau" #: data/ui/stereo_tools.glade:406 msgid "Softclip" msgstr "" #: data/ui/stereo_tools.glade:452 #, fuzzy msgid "Side Level" msgstr "Niveau" #: data/ui/stereo_tools.glade:503 #, fuzzy msgid "Side Balance" msgstr "Amélioration audio" #: data/ui/stereo_tools.glade:535 #, fuzzy msgid "Middle Level" msgstr "Niveau" #: data/ui/stereo_tools.glade:547 #, fuzzy msgid "Middle Panorama" msgstr "Panorama" #: data/ui/stereo_tools.glade:604 msgid "LR > LR (Stereo Default)" msgstr "" #: data/ui/stereo_tools.glade:605 msgid "LR > MS (Stereo to Mid-Side)" msgstr "" #: data/ui/stereo_tools.glade:606 msgid "MS > LR (Mid-Side to Stereo)" msgstr "" #: data/ui/stereo_tools.glade:607 msgid "LR > LL (Mono Left Channel)" msgstr "" #: data/ui/stereo_tools.glade:608 msgid "LR > RR (Mono Right Channel)" msgstr "" #: data/ui/stereo_tools.glade:609 msgid "LR > L+R (Mono Sum L+R)" msgstr "" #: data/ui/stereo_tools.glade:610 msgid "LR > RL (Stereo Flip Channels)" msgstr "" #: data/ui/stereo_tools.glade:627 #, fuzzy msgid "Stereo Matrix" msgstr "Amélioration audio" #: data/ui/stereo_tools.glade:668 data/ui/stereo_tools.glade:709 msgid "Invert Phase" msgstr "" #: data/ui/stereo_tools.glade:806 #, fuzzy msgid "Delay L/R" msgstr "Relâche [ms]" #: data/ui/stereo_tools.glade:839 #, fuzzy msgid "Stereo Base" msgstr "Amélioration audio" #: data/ui/stereo_tools.glade:871 #, fuzzy msgid "Stereo Phase" msgstr "Amélioration audio" #: data/ui/webrtc.glade:96 msgid "WebRTC" msgstr "" #: data/ui/webrtc.glade:256 data/ui/webrtc.glade:389 data/ui/webrtc.glade:460 #: data/ui/webrtc.glade:648 #, fuzzy msgid "Enable" msgstr "Table sinusoïdale" #: data/ui/webrtc.glade:279 msgid "Extended Filter" msgstr "" #: data/ui/webrtc.glade:292 #, fuzzy msgid "High Pass Filter" msgstr "Passe-haut" #: data/ui/webrtc.glade:309 data/ui/webrtc.glade:425 data/ui/webrtc.glade:698 msgid "Low" msgstr "" #: data/ui/webrtc.glade:310 data/ui/webrtc.glade:426 data/ui/webrtc.glade:699 msgid "Moderate" msgstr "" #: data/ui/webrtc.glade:311 data/ui/webrtc.glade:427 data/ui/webrtc.glade:700 #, fuzzy msgid "High" msgstr "Passe-haut" #: data/ui/webrtc.glade:324 data/ui/webrtc.glade:412 #, fuzzy msgid "Suppression Level" msgstr "Réduction de gain" #: data/ui/webrtc.glade:361 msgid "Delay Agnostic" msgstr "" #: data/ui/webrtc.glade:375 #, fuzzy msgid "Echo Canceller" msgstr "Amélioration audio" #: data/ui/webrtc.glade:428 #, fuzzy msgid "Very High" msgstr "Passe-haut" #: data/ui/webrtc.glade:445 #, fuzzy msgid "Noise Suppressor" msgstr "Compresseur" #: data/ui/webrtc.glade:496 msgid "Adaptive Digital" msgstr "" #: data/ui/webrtc.glade:497 msgid "Fixed Digital" msgstr "" #: data/ui/webrtc.glade:514 msgid "Gain Controller" msgstr "" #: data/ui/webrtc.glade:540 #, fuzzy msgid "Target Level" msgstr "Cible [dB]" #: data/ui/webrtc.glade:572 msgid "Maximum Gain" msgstr "" #: data/ui/webrtc.glade:672 #, fuzzy msgid "Detection Likelihood" msgstr "Atténuation" # Taking lingual shortcuts to squeeze it in the text box #: data/ui/webrtc.glade:684 #, fuzzy msgid "Frame Size" msgstr "Taille pièce" #: data/ui/webrtc.glade:697 msgid "Very Low" msgstr "" #: data/ui/webrtc.glade:737 #, fuzzy msgid "Voice Detector" msgstr "Atténuation" #: data/ui/rnnoise.glade:90 #, fuzzy msgid "Noise Reduction" msgstr "Réduction de gain" #: data/ui/rnnoise.glade:242 #, fuzzy msgid "Import Model" msgstr "Réponse plane" #: data/ui/rnnoise.glade:246 #, fuzzy msgid "Import Model File" msgstr "Réponse plane" #: data/ui/rnnoise.glade:311 #, fuzzy msgid "Active Model" msgstr "Aucune compression" #: data/ui/rnnoise.glade:324 msgid "Standard RNNoise Model" msgstr "" #: src/app_info_ui.cpp:120 msgid "paused" msgstr "" #: src/app_info_ui.cpp:122 msgid "playing" msgstr "" #: src/application.cpp:38 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "" #: src/application.cpp:40 msgid "Show available presets." msgstr "" #: src/application.cpp:43 msgid "Load a preset. Example: pulseeffects -l music" msgstr "" #: src/application.cpp:45 #, fuzzy msgid "Reset PulseEffects." msgstr "PulseEffects" #: src/application.cpp:48 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "" #: src/application.cpp:50 msgid "Hide the Window." msgstr "" #: src/application.cpp:284 #, fuzzy msgid "Output Presets: " msgstr "Préréglage" #: src/application.cpp:292 #, fuzzy msgid "Input Presets: " msgstr "Ouvrir préréglage" #: src/blocklist_settings_ui.cpp:191 msgid "Blocklist" msgstr "" #: src/calibration_ui.cpp:198 #, fuzzy msgid "Calibration Microphone" msgstr "Calibration de la correction microphone" #: src/convolver_ui.cpp:281 #, fuzzy msgid "Import Impulse File" msgstr "Réponse plane" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Open" msgstr "" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 #, fuzzy msgid "Cancel" msgstr "Amélioration audio" #: src/convolver_ui.cpp:318 src/convolver_ui.cpp:319 src/convolver_ui.cpp:321 msgid "Failed" msgstr "" #: src/convolver_ui.cpp:323 msgid "Could Not Load The Impulse File" msgstr "" #: src/equalizer_ui.cpp:380 msgid "infinity" msgstr "" #: src/equalizer_ui.cpp:738 #, fuzzy msgid "Import APO Preset File" msgstr "Ouvrir préréglage" #: src/equalizer_ui.cpp:743 #, fuzzy msgid "APO Presets" msgstr "Préréglage" #: src/general_settings_ui.cpp:149 msgid "General" msgstr "Général" #: src/pulse_settings_ui.cpp:168 msgid "Pulseaudio" msgstr "" #, fuzzy #~ msgid "Import APO Presets" #~ msgstr "Ouvrir préréglage" #, fuzzy #~ msgid "Input Gain" #~ msgstr "Gain d'entrée [dB]" #, fuzzy #~ msgid "Output Gain" #~ msgstr "Gain d'entrée [dB]" #, fuzzy #~ msgid "Gain Detection" #~ msgstr "Réduction de gain" easyeffects-4.8.7/po/hr.po000066400000000000000000001251431424023573300154330ustar00rootroot00000000000000# Croatian translation for Pulseeffects. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PulseEffects package. # gogo , 2017. # rooty , 2018. # flipwise , 2018. msgid "" msgstr "" "Project-Id-Version: PulseEffects\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-14 23:58+0100\n" "PO-Revision-Date: 2018-11-22 20:12+0200\n" "Last-Translator: flipwise \n" "Language-Team: Croatian\n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.7\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 data/ui/application.glade:61 msgid "PulseEffects" msgstr "PulseEffects" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Zvučni efekti za Pulseaudio aplikacije" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Wellington Wallace" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects je napredan alat za manipulaciju zvukom. Uključuje ekvalizator, " "graničnik, kompresor, alat odjeka te mnoge druge druge alate. Još sadrži i " "ugrađeni analizator spektra." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "Zato što PulseEffects koristi zadani PulseAudio zvučni poslužitelj, radit će " "s većinom, ako ne i sa svim aplikacijama koje koristite. Sve podržane " "aplikacije su prikazane u glavnom prozoru, gdje se na svaku pojedinačno može " "omogućiti utjecaj efekata." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Osim manipuliranja izlaza zvuka, PulseEffects može primijeniti efekte i na " "ulazni uređaj, poput mikrofona. To je na primjer korisno pri snimanju zvuka, " "ali isto tako funkcionira dobro i tijekom glasovnih razgovora." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "Kad je PulseEffects pokrenut, upotrijebit će podešavanja od prošlog puta. " "Također je moguće spremiti sve trenutne postavke kao predloške." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "Postavi razinu zvuka te uključi/isključi efekte" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "Uključuje i ekvalizator s ugrađenim predlošcima" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Graničnik ulaza" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:52 #: data/ui/compressor.glade:110 data/ui/compressor.glade:589 #: data/ui/webrtc.glade:633 msgid "Compressor" msgstr "Kompresor" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Kalibracija" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "Ekvalizator, kompresor i drugi audio efekti" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "graničnik;kompresor;odjek;ekvalizator;automatska glasnoća zvuka;" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:44 #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:47 #, fuzzy msgid "\"Presets\"" msgstr "Predlošci" #: data/ui/about.glade.in:11 #, fuzzy msgid "Audio effects for PulseAudio applications" msgstr "Zvučni efekti za Pulseaudio aplikacije" #: data/ui/app_button_row.glade:49 msgid "Applications" msgstr "Aplikacije" #: data/ui/app_info.glade:203 #, fuzzy msgid "Add to Blocklist" msgstr "Crna lista" #: data/ui/app_info.glade:239 msgid "Format" msgstr "Format" #: data/ui/app_info.glade:264 data/ui/convolver.glade:348 msgid "Rate" msgstr "Frekvencija" #: data/ui/app_info.glade:289 data/ui/pulse_info.glade:239 #: data/ui/stereo_tools.glade:756 msgid "Channels" msgstr "Kanali" #: data/ui/app_info.glade:314 msgid "Resampler" msgstr "Promjena frekvencije" #: data/ui/app_info.glade:339 data/ui/pulse_settings.glade:159 #: data/ui/pulse_settings.glade:259 data/ui/pulse_settings.glade:464 #: data/ui/pulse_settings.glade:564 msgid "Buffer" msgstr "Latencija međuspremnika" #: data/ui/app_info.glade:364 data/ui/pulse_settings.glade:190 #: data/ui/pulse_settings.glade:290 data/ui/pulse_settings.glade:476 #: data/ui/pulse_settings.glade:576 msgid "Latency" msgstr "Latencija" #: data/ui/app_info.glade:389 msgid "State" msgstr "Stanje" #: data/ui/application.glade:142 src/calibration_ui.cpp:64 #: src/calibration_ui.cpp:191 msgid "Test Signals" msgstr "Testni signali" #: data/ui/application.glade:157 #, fuzzy msgid "Global Bypass" msgstr "Premosnica" #: data/ui/application.glade:172 data/ui/equalizer.glade:331 #: data/ui/general_settings.glade:289 msgid "Settings" msgstr "Postavke" #: data/ui/application.glade:194 msgid "Help" msgstr "Pomoć" #: data/ui/application.glade:217 data/ui/crossfeed.glade:240 #: data/ui/equalizer.glade:403 data/ui/filter.glade:344 #: data/ui/reverb.glade:401 src/presets_menu_ui.cpp:133 #: src/presets_menu_ui.cpp:285 src/presets_menu_ui.cpp:286 #: src/presets_menu_ui.cpp:303 src/presets_menu_ui.cpp:304 msgid "Presets" msgstr "Predlošci" #: data/ui/autogain.glade:90 #, fuzzy msgid "Auto Gain" msgstr "Automatsko pojačavanje" #: data/ui/autogain.glade:161 data/ui/bass_enhancer.glade:167 #: data/ui/compressor.glade:214 data/ui/convolver.glade:218 #: data/ui/crossfeed.glade:136 data/ui/crystalizer.glade:134 #: data/ui/deesser.glade:182 data/ui/delay.glade:144 #: data/ui/equalizer.glade:450 data/ui/equalizer_band.glade:187 #: data/ui/equalizer_band.glade:230 data/ui/exciter.glade:167 #: data/ui/filter.glade:243 data/ui/general_settings.glade:298 #: data/ui/gate.glade:172 data/ui/limiter.glade:166 data/ui/loudness.glade:174 #: data/ui/maximizer.glade:139 data/ui/multiband_compressor.glade:307 #: data/ui/multiband_gate.glade:331 data/ui/pitch.glade:158 #: data/ui/reverb.glade:299 data/ui/stereo_tools.glade:194 #: data/ui/webrtc.glade:141 data/ui/rnnoise.glade:139 msgid "Reset" msgstr "Vrati na tvorničke postavke" #: data/ui/autogain.glade:185 data/ui/rnnoise.glade:163 msgid "Based on" msgstr "" #: data/ui/autogain.glade:262 #, fuzzy msgid "Reset History" msgstr "Vrati izvornu kvalitetu" #: data/ui/autogain.glade:274 #, fuzzy msgid "Detect Silence" msgstr "Detekcija" #: data/ui/autogain.glade:286 msgid "Use Geometric Mean" msgstr "" #: data/ui/autogain.glade:325 msgid "Target" msgstr "Meta" #: data/ui/autogain.glade:374 data/ui/autogain.glade:779 msgid "Momentary" msgstr "Trenutačno" #: data/ui/autogain.glade:434 #, fuzzy msgid "Weights" msgstr "Otežanja" #: data/ui/autogain.glade:448 data/ui/autogain.glade:792 msgid "Short Term" msgstr "Kratkoročno" #: data/ui/autogain.glade:497 data/ui/autogain.glade:805 msgid "Integrated" msgstr "Integrirano" #: data/ui/autogain.glade:564 data/ui/autogain.glade:1076 #: data/ui/bass_enhancer.glade:596 data/ui/compressor.glade:1086 #: data/ui/convolver.glade:575 data/ui/crossfeed.glade:391 #: data/ui/crystalizer.glade:250 data/ui/deesser.glade:783 #: data/ui/delay.glade:328 data/ui/equalizer.glade:682 #: data/ui/exciter.glade:596 data/ui/filter.glade:508 data/ui/gate.glade:689 #: data/ui/limiter.glade:501 data/ui/loudness.glade:238 #: data/ui/loudness.glade:431 data/ui/maximizer.glade:358 #: data/ui/multiband_compressor.glade:2103 data/ui/multiband_gate.glade:2262 #: data/ui/pitch.glade:450 data/ui/presets_menu.glade:238 #: data/ui/reverb.glade:753 data/ui/stereo_tools.glade:427 #: data/ui/stereo_tools.glade:931 data/ui/webrtc.glade:780 #: data/ui/rnnoise.glade:362 msgid "Input" msgstr "Ulaz" #: data/ui/autogain.glade:577 data/ui/autogain.glade:1020 #: data/ui/bass_enhancer.glade:625 data/ui/compressor.glade:1099 #: data/ui/convolver.glade:588 data/ui/crossfeed.glade:405 #: data/ui/crystalizer.glade:263 data/ui/deesser.glade:797 #: data/ui/delay.glade:341 data/ui/equalizer.glade:695 #: data/ui/exciter.glade:625 data/ui/filter.glade:521 data/ui/gate.glade:703 #: data/ui/limiter.glade:636 data/ui/loudness.glade:271 #: data/ui/loudness.glade:445 data/ui/maximizer.glade:372 #: data/ui/multiband_compressor.glade:894 #: data/ui/multiband_compressor.glade:1272 #: data/ui/multiband_compressor.glade:1651 #: data/ui/multiband_compressor.glade:2030 #: data/ui/multiband_compressor.glade:2116 data/ui/multiband_gate.glade:951 #: data/ui/multiband_gate.glade:1363 data/ui/multiband_gate.glade:1776 #: data/ui/multiband_gate.glade:2189 data/ui/multiband_gate.glade:2275 #: data/ui/pitch.glade:463 data/ui/presets_menu.glade:137 #: data/ui/reverb.glade:766 data/ui/stereo_tools.glade:901 #: data/ui/stereo_tools.glade:944 data/ui/webrtc.glade:794 #: data/ui/rnnoise.glade:375 msgid "Output" msgstr "Izlaz" #: data/ui/autogain.glade:899 msgid "Relative" msgstr "Relativno" #: data/ui/autogain.glade:912 data/ui/compressor.glade:1262 msgid "Gain" msgstr "Pojačanje" #: data/ui/autogain.glade:980 msgid "Loudness" msgstr "Glasnoća" #: data/ui/autogain.glade:1034 msgid "Range" msgstr "Raspon" #: data/ui/bass_enhancer.glade:116 msgid "Bass Enhancer" msgstr "Pojačanje basa" #: data/ui/bass_enhancer.glade:191 data/ui/compressor.glade:238 #: data/ui/crossfeed.glade:160 data/ui/deesser.glade:206 #: data/ui/delay.glade:168 data/ui/equalizer.glade:474 #: data/ui/exciter.glade:191 data/ui/filter.glade:267 data/ui/gate.glade:196 #: data/ui/limiter.glade:190 data/ui/loudness.glade:143 #: data/ui/maximizer.glade:163 data/ui/multiband_compressor.glade:331 #: data/ui/multiband_gate.glade:355 data/ui/pitch.glade:182 #: data/ui/reverb.glade:323 data/ui/stereo_tools.glade:218 #: data/ui/webrtc.glade:165 msgid "Provided by" msgstr "" #: data/ui/bass_enhancer.glade:259 data/ui/compressor.glade:602 #: data/ui/deesser.glade:274 data/ui/exciter.glade:259 msgid "Listen" msgstr "Poslušaj" #: data/ui/bass_enhancer.glade:302 data/ui/exciter.glade:303 msgid "3rd" msgstr "3." #: data/ui/bass_enhancer.glade:315 data/ui/exciter.glade:316 msgid "2nd" msgstr "2." #: data/ui/bass_enhancer.glade:327 data/ui/exciter.glade:328 msgid "Blend Harmonics" msgstr "Spajanje harmonijskog reda" #: data/ui/bass_enhancer.glade:355 data/ui/exciter.glade:357 #: data/ui/reverb.glade:498 msgid "Amount" msgstr "Jačina" #: data/ui/bass_enhancer.glade:367 data/ui/bass_enhancer.glade:504 #: data/ui/exciter.glade:369 data/ui/exciter.glade:504 msgid "Harmonics" msgstr "Harmonijski red" #: data/ui/bass_enhancer.glade:379 data/ui/exciter.glade:381 msgid "Scope" msgstr "Raspon" #: data/ui/bass_enhancer.glade:472 msgid "Floor" msgstr "Dno" #: data/ui/blocklist_settings.glade:52 data/ui/blocklist_settings.glade:155 #: data/ui/presets_menu.glade:65 data/ui/presets_menu.glade:166 msgid "Create Preset" msgstr "Stvori predložak" #: data/ui/blocklist_settings.glade:68 data/ui/blocklist_settings.glade:171 #: data/ui/presets_menu.glade:52 data/ui/presets_menu.glade:153 #: data/ui/pulse_info.glade:50 msgid "Name" msgstr "Naziv" #: data/ui/blocklist_settings.glade:81 msgid "Reconnect the microphone to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:139 data/ui/pulse_settings.glade:383 msgid "Input Effects" msgstr "Ulazni efekti" #: data/ui/blocklist_settings.glade:230 msgid "Restart the player to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:242 data/ui/pulse_settings.glade:688 msgid "Output Effects" msgstr "Izlazni efekti" #: data/ui/blocklist_settings.glade:265 msgid "Show Blocklisted Apps in Main Tab" msgstr "" #: data/ui/calibration_signals.glade:32 msgid "Sine" msgstr "Sinus" #: data/ui/calibration_signals.glade:33 msgid "Square" msgstr "Kvadrat" #: data/ui/calibration_signals.glade:34 msgid "Saw" msgstr "Pila" #: data/ui/calibration_signals.glade:35 msgid "Triangle" msgstr "Trokut" #: data/ui/calibration_signals.glade:36 #, fuzzy msgid "Silence" msgstr "Tišina" #: data/ui/calibration_signals.glade:37 msgid "White Noise" msgstr "Bijeli šum" #: data/ui/calibration_signals.glade:38 msgid "Pink Noise" msgstr "Rozi šum" #: data/ui/calibration_signals.glade:39 msgid "Sine Table" msgstr "Sinus tablica" #: data/ui/calibration_signals.glade:40 msgid "Ticks" msgstr "Otkucaji" #: data/ui/calibration_signals.glade:41 msgid "Gaussian Noise" msgstr "Gaussov šum" #: data/ui/calibration_signals.glade:42 msgid "Red Noise" msgstr "Crveni šum" #: data/ui/calibration_signals.glade:43 msgid "Blue Noise" msgstr "Plavi šum" #: data/ui/calibration_signals.glade:44 msgid "Violet Noise" msgstr "Ljubičasti šum" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Glasnoća" #: data/ui/calibration_signals.glade:135 data/ui/equalizer_band.glade:158 #: data/ui/filter.glade:394 msgid "Frequency" msgstr "Frekvencija" #: data/ui/calibration_mic.glade:33 msgid "Window" msgstr "Prozor" #: data/ui/calibration_mic.glade:90 msgid "Measure Noise" msgstr "Izmjeri šum" #: data/ui/calibration_mic.glade:119 msgid "Subtract Noise" msgstr "Izdvoji šum" #: data/ui/compressor.glade:386 data/ui/deesser.glade:436 #: data/ui/gate.glade:498 data/ui/maximizer.glade:242 #: data/ui/multiband_compressor.glade:707 #: data/ui/multiband_compressor.glade:1085 #: data/ui/multiband_compressor.glade:1464 #: data/ui/multiband_compressor.glade:1843 data/ui/multiband_gate.glade:731 #: data/ui/multiband_gate.glade:1142 data/ui/multiband_gate.glade:1555 #: data/ui/multiband_gate.glade:1968 msgid "Threshold" msgstr "Prag" #: data/ui/compressor.glade:420 data/ui/deesser.glade:448 #: data/ui/gate.glade:532 data/ui/multiband_compressor.glade:741 #: data/ui/multiband_compressor.glade:1119 #: data/ui/multiband_compressor.glade:1498 #: data/ui/multiband_compressor.glade:1877 data/ui/multiband_gate.glade:765 #: data/ui/multiband_gate.glade:1176 data/ui/multiband_gate.glade:1589 #: data/ui/multiband_gate.glade:2002 msgid "Ratio" msgstr "Omjer" #: data/ui/compressor.glade:452 data/ui/gate.glade:564 #: data/ui/multiband_compressor.glade:773 #: data/ui/multiband_compressor.glade:1151 #: data/ui/multiband_compressor.glade:1530 #: data/ui/multiband_compressor.glade:1909 data/ui/multiband_gate.glade:797 #: data/ui/multiband_gate.glade:1208 data/ui/multiband_gate.glade:1621 #: data/ui/multiband_gate.glade:2034 #, fuzzy msgid "Knee" msgstr "Koljeno" #: data/ui/compressor.glade:486 data/ui/deesser.glade:532 #: data/ui/gate.glade:598 data/ui/multiband_compressor.glade:807 #: data/ui/multiband_compressor.glade:1185 #: data/ui/multiband_compressor.glade:1564 #: data/ui/multiband_compressor.glade:1943 data/ui/multiband_gate.glade:831 #: data/ui/multiband_gate.glade:1242 data/ui/multiband_gate.glade:1655 #: data/ui/multiband_gate.glade:2068 #, fuzzy msgid "Makeup" msgstr "Dorada" #: data/ui/compressor.glade:520 data/ui/gate.glade:464 #: data/ui/limiter.glade:363 data/ui/maximizer.glade:266 #: data/ui/multiband_compressor.glade:673 #: data/ui/multiband_compressor.glade:1051 #: data/ui/multiband_compressor.glade:1430 #: data/ui/multiband_compressor.glade:1809 data/ui/multiband_gate.glade:697 #: data/ui/multiband_gate.glade:1108 data/ui/multiband_gate.glade:1521 #: data/ui/multiband_gate.glade:1934 msgid "Release" msgstr "Vrijeme prijelaza" #: data/ui/compressor.glade:532 data/ui/gate.glade:430 #: data/ui/multiband_compressor.glade:639 #: data/ui/multiband_compressor.glade:1017 #: data/ui/multiband_compressor.glade:1396 #: data/ui/multiband_compressor.glade:1775 data/ui/multiband_gate.glade:663 #: data/ui/multiband_gate.glade:1074 data/ui/multiband_gate.glade:1487 #: data/ui/multiband_gate.glade:1900 msgid "Attack" msgstr "Pokretanje" #: data/ui/compressor.glade:559 msgid "Downward" msgstr "" #: data/ui/compressor.glade:560 msgid "Upward" msgstr "" #: data/ui/compressor.glade:573 #, fuzzy msgid "Compression Mode" msgstr "Kompresija" #: data/ui/compressor.glade:649 #, fuzzy msgid "Pre-amplification" msgstr "Aplikacije" #: data/ui/compressor.glade:683 msgid "Reactivity" msgstr "" #: data/ui/compressor.glade:716 data/ui/limiter.glade:375 msgid "Lookahead" msgstr "Preduhvatiti" #: data/ui/compressor.glade:730 msgid "Feed-forward" msgstr "" #: data/ui/compressor.glade:731 #, fuzzy msgid "Feed-back" msgstr "Dovod zvuka" #: data/ui/compressor.glade:744 data/ui/equalizer_band.glade:51 msgid "Type" msgstr "" #: data/ui/compressor.glade:758 data/ui/deesser.glade:731 #: data/ui/gate.glade:303 data/ui/multiband_compressor.glade:611 #: data/ui/multiband_compressor.glade:989 #: data/ui/multiband_compressor.glade:1368 #: data/ui/multiband_compressor.glade:1747 data/ui/multiband_gate.glade:635 #: data/ui/multiband_gate.glade:1046 data/ui/multiband_gate.glade:1459 #: data/ui/multiband_gate.glade:1872 msgid "Peak" msgstr "Vrhunac" #: data/ui/compressor.glade:759 data/ui/deesser.glade:730 #: data/ui/gate.glade:302 data/ui/multiband_compressor.glade:610 #: data/ui/multiband_compressor.glade:988 #: data/ui/multiband_compressor.glade:1367 #: data/ui/multiband_compressor.glade:1746 data/ui/multiband_gate.glade:634 #: data/ui/multiband_gate.glade:1045 data/ui/multiband_gate.glade:1458 #: data/ui/multiband_gate.glade:1871 msgid "RMS" msgstr "RMS" #: data/ui/compressor.glade:760 #, fuzzy msgid "Low-Pass" msgstr "Nizak prolaz" #: data/ui/compressor.glade:761 msgid "Uniform" msgstr "" #: data/ui/compressor.glade:774 data/ui/deesser.glade:702 #: data/ui/equalizer.glade:257 data/ui/equalizer_band.glade:84 #: data/ui/multiband_compressor.glade:412 data/ui/multiband_gate.glade:436 #: data/ui/stereo_tools.glade:591 data/ui/webrtc.glade:483 msgid "Mode" msgstr "Način" #: data/ui/compressor.glade:788 #, fuzzy msgid "Middle" msgstr "Srednji nivo" #: data/ui/compressor.glade:789 #, fuzzy msgid "Side" msgstr "Strana" #: data/ui/compressor.glade:790 data/ui/delay.glade:247 #: data/ui/equalizer.glade:612 data/ui/stereo_tools.glade:655 msgid "Left" msgstr "Lijevo" #: data/ui/compressor.glade:791 data/ui/delay.glade:280 #: data/ui/equalizer.glade:654 data/ui/stereo_tools.glade:724 msgid "Right" msgstr "Desno" #: data/ui/compressor.glade:804 #, fuzzy msgid "Source" msgstr "Izvor" #: data/ui/compressor.glade:820 data/ui/compressor.glade:1274 #, fuzzy msgid "Sidechain" msgstr "Postranični ulaz" #: data/ui/compressor.glade:925 msgid "Relative Release Threshold" msgstr "" #: data/ui/compressor.glade:937 #, fuzzy msgid "Boost Threshold" msgstr "Prag" #: data/ui/compressor.glade:949 #, fuzzy msgid "High-pass Frequency" msgstr "Prigušivanje visokih frekvencija" #: data/ui/compressor.glade:961 #, fuzzy msgid "Low-pass Frequency" msgstr "Izračunaj frekvencije" #: data/ui/compressor.glade:973 #, fuzzy msgid "High-pass Filter Mode" msgstr "Filter visokog prolaza" #: data/ui/compressor.glade:985 msgid "Low-pass Filter Mode" msgstr "" #: data/ui/compressor.glade:999 data/ui/compressor.glade:1017 #: data/ui/equalizer_band.glade:63 msgid "Off" msgstr "" #: data/ui/compressor.glade:1000 data/ui/compressor.glade:1018 #, fuzzy msgid "12 dB/oct" msgstr "12dB/oct niski prolaz" #: data/ui/compressor.glade:1001 data/ui/compressor.glade:1019 #, fuzzy msgid "24 dB/oct" msgstr "24dB/oct niski prolaz" #: data/ui/compressor.glade:1002 data/ui/compressor.glade:1020 #, fuzzy msgid "36 dB/oct" msgstr "36dB/oct niski prolaz" #: data/ui/compressor.glade:1043 #, fuzzy msgid "Advanced" msgstr "Napredne postavke" #: data/ui/compressor.glade:1347 msgid "Curve" msgstr "" #: data/ui/convolver.glade:90 msgid "Convolver" msgstr "Konvolver" #: data/ui/convolver.glade:125 #, fuzzy msgid "Import Impulse" msgstr "Učitaj impuls" #: data/ui/convolver.glade:129 msgid "Import Impulse Response File" msgstr "Učitaj datoteku reakcije impulsa" #: data/ui/convolver.glade:309 msgid "L" msgstr "L" #: data/ui/convolver.glade:323 msgid "R" msgstr "D" #: data/ui/convolver.glade:390 #, fuzzy msgid "Duration" msgstr "Trajanje" #: data/ui/convolver.glade:402 #, fuzzy msgid "Samples" msgstr "Semplovi" #: data/ui/convolver.glade:435 src/convolver_ui.cpp:285 #, fuzzy msgid "Impulse Response" msgstr "Reakcija impulsa" #: data/ui/convolver.glade:458 #, fuzzy msgid "Select the impulse Response File" msgstr "Odaberite datoteku reakcije impulsa" #: data/ui/convolver.glade:477 src/spectrum_settings_ui.cpp:195 msgid "Spectrum" msgstr "Spektar" #: data/ui/convolver.glade:520 #, fuzzy msgid "Stereo Width" msgstr "Stereo širina" #: data/ui/crossfeed.glade:104 msgid "Crossfeed" msgstr "Križno spajanje" #: data/ui/crossfeed.glade:254 msgid "Jmeier" msgstr "" #: data/ui/crossfeed.glade:266 data/ui/filter.glade:183 #: data/ui/reverb.glade:259 msgid "Default" msgstr "Tvorničke postavke" #: data/ui/crossfeed.glade:278 msgid "Cmoy" msgstr "Cmoy" #: data/ui/crossfeed.glade:308 msgid "Cutoff" msgstr "Prekid" #: data/ui/crossfeed.glade:341 msgid "Feed" msgstr "Dovod zvuka" #: data/ui/crystalizer.glade:90 #, fuzzy msgid "Crystalizer" msgstr "Kristalizator" #: data/ui/crystalizer.glade:200 #, fuzzy msgid "Aggressive Mode" msgstr "Kompresija" #: data/ui/crystalizer.glade:464 msgid "Before" msgstr "" #: data/ui/crystalizer.glade:477 msgid "After" msgstr "" #: data/ui/crystalizer.glade:550 #, fuzzy msgid "Loudness Range" msgstr "Glasnoća" #: data/ui/crystalizer_band.glade:28 data/ui/equalizer_band.glade:316 #: data/ui/stereo_tools.glade:680 data/ui/stereo_tools.glade:737 msgid "Mute" msgstr "Bezvučno" #: data/ui/crystalizer_band.glade:40 data/ui/multiband_compressor.glade:580 #: data/ui/multiband_compressor.glade:958 #: data/ui/multiband_compressor.glade:1337 #: data/ui/multiband_compressor.glade:1716 data/ui/multiband_gate.glade:604 #: data/ui/multiband_gate.glade:1015 data/ui/multiband_gate.glade:1428 #: data/ui/multiband_gate.glade:1841 msgid "Bypass" msgstr "Premosnica" #: data/ui/deesser.glade:125 msgid "Deesser" msgstr "De-esiranje" #: data/ui/deesser.glade:309 #, fuzzy msgid "F1 Gain" msgstr "Pojačanje" #: data/ui/deesser.glade:321 #, fuzzy msgid "F2 Level" msgstr "Razina" #: data/ui/deesser.glade:333 #, fuzzy msgid "F2 Peak Q" msgstr "Vrhunac Q" #: data/ui/deesser.glade:424 msgid "Laxity" msgstr "Popustljivost" #: data/ui/deesser.glade:585 #, fuzzy msgid "F1 Split" msgstr "Razdvojeno" #: data/ui/deesser.glade:597 #, fuzzy msgid "F2 Peak" msgstr "Vrhunac" #: data/ui/deesser.glade:690 data/ui/gate.glade:288 msgid "Detection" msgstr "Detekcija" #: data/ui/deesser.glade:715 msgid "Wide" msgstr "Široko" #: data/ui/deesser.glade:716 #, fuzzy msgid "Split" msgstr "Razdvojeno" #: data/ui/deesser.glade:959 data/ui/multiband_gate.glade:865 #: data/ui/multiband_gate.glade:1298 data/ui/multiband_gate.glade:1711 #: data/ui/multiband_gate.glade:2124 msgid "Reduction" msgstr "Smanjenje" #: data/ui/deesser.glade:972 #, fuzzy msgid "Detected" msgstr "Detektirano" #: data/ui/delay.glade:90 msgid "Delay" msgstr "Kašnjenje" #: data/ui/equalizer.glade:44 msgid "Equalizer" msgstr "Ekvalizator" #: data/ui/equalizer.glade:160 msgid "Flat Response" msgstr "Ravan izlaz" #: data/ui/equalizer.glade:175 msgid "Calculate Frequencies" msgstr "Izračunaj frekvencije" #: data/ui/equalizer.glade:213 msgid "Bands" msgstr "Broj raspona" #: data/ui/equalizer.glade:269 msgid "IIR" msgstr "" #: data/ui/equalizer.glade:270 msgid "FIR" msgstr "" #: data/ui/equalizer.glade:271 msgid "FFT" msgstr "" #: data/ui/equalizer.glade:304 #, fuzzy msgid "Split Channels" msgstr "Kanali" #: data/ui/equalizer.glade:389 #, fuzzy msgid "Apply APO Preset" msgstr "Predlošci" #: data/ui/equalizer_band.glade:64 msgid "Bell" msgstr "" #: data/ui/equalizer_band.glade:65 #, fuzzy msgid "High Pass" msgstr "Filter visokog prolaza" #: data/ui/equalizer_band.glade:66 msgid "High Shelf" msgstr "Visoki shelf" #: data/ui/equalizer_band.glade:67 msgid "Low Pass" msgstr "Nizak prolaz" #: data/ui/equalizer_band.glade:68 msgid "Low Shelf" msgstr "Niski shelf" #: data/ui/equalizer_band.glade:69 msgid "Notch" msgstr "" #: data/ui/equalizer_band.glade:70 data/ui/filter.glade:427 msgid "Resonance" msgstr "Rezonancija" #: data/ui/equalizer_band.glade:71 #, fuzzy msgid "All Pass" msgstr "Nizak prolaz" #: data/ui/equalizer_band.glade:96 msgid "RLC (BT)" msgstr "" #: data/ui/equalizer_band.glade:97 msgid "RLC (MT)" msgstr "" #: data/ui/equalizer_band.glade:98 msgid "BWC (BT)" msgstr "" #: data/ui/equalizer_band.glade:99 msgid "BWC (MT)" msgstr "" #: data/ui/equalizer_band.glade:100 msgid "LRX (BT)" msgstr "" #: data/ui/equalizer_band.glade:101 msgid "LRX (MT)" msgstr "" #: data/ui/equalizer_band.glade:102 msgid "APO (DR)" msgstr "" #: data/ui/equalizer_band.glade:115 msgid "Slope" msgstr "" #: data/ui/equalizer_band.glade:203 msgid "Quality" msgstr "Kvaliteta" #: data/ui/equalizer_band.glade:253 msgid "Width" msgstr "Širina" #: data/ui/equalizer_band.glade:304 data/ui/multiband_compressor.glade:593 #: data/ui/multiband_compressor.glade:971 #: data/ui/multiband_compressor.glade:1350 #: data/ui/multiband_compressor.glade:1729 data/ui/multiband_gate.glade:617 #: data/ui/multiband_gate.glade:1028 data/ui/multiband_gate.glade:1441 #: data/ui/multiband_gate.glade:1854 msgid "Solo" msgstr "Solo" #: data/ui/equalizer_preset_row.glade:39 data/ui/irs_row.glade:44 msgid "Apply" msgstr "" #: data/ui/exciter.glade:116 msgid "Exciter" msgstr "Uzbuđivač" #: data/ui/exciter.glade:472 data/ui/maximizer.glade:254 msgid "Ceiling" msgstr "Vrh" #: data/ui/filter.glade:97 #, fuzzy msgid "Filter" msgstr "Filter" #: data/ui/filter.glade:147 #, fuzzy msgid "Muted" msgstr "Bezvučno" #: data/ui/filter.glade:159 data/ui/reverb.glade:233 msgid "Disco" msgstr "Disco" #: data/ui/filter.glade:171 msgid "Distant Headphones" msgstr "Udaljene slušalice" #: data/ui/filter.glade:360 msgid "12dB/oct Lowpass" msgstr "12dB/oct niski prolaz" #: data/ui/filter.glade:361 msgid "24dB/oct Lowpass" msgstr "24dB/oct niski prolaz" #: data/ui/filter.glade:362 msgid "36dB/oct Lowpass" msgstr "36dB/oct niski prolaz" #: data/ui/filter.glade:363 msgid "12dB/oct Highpass" msgstr "12dB/oct visoki prolaz" #: data/ui/filter.glade:364 msgid "24dB/oct Highpass" msgstr "24dB/oct visoki prolaz" #: data/ui/filter.glade:365 msgid "36dB/oct Highpass" msgstr "36dB/oct visoki prolaz" #: data/ui/filter.glade:366 msgid "6dB/oct Bandpass" msgstr "6dB/oct band prolaz" #: data/ui/filter.glade:367 msgid "12dB/oct Bandpass" msgstr "12dB/oct band prolaz" #: data/ui/filter.glade:368 msgid "18dB/oct Bandpass" msgstr "18dB/oct band prolaz" #: data/ui/filter.glade:369 msgid "6dB/oct Bandreject" msgstr "6dB/oct odbijanje banda" #: data/ui/filter.glade:370 msgid "12dB/oct Bandreject" msgstr "12dB/oct odbijanje banda" #: data/ui/filter.glade:371 msgid "18dB/oct Bandreject" msgstr "18dB/oct odbijanje banda" #: data/ui/filter.glade:460 msgid "Inertia" msgstr "Inercija" #: data/ui/general_settings.glade:58 msgid "Start Service at Login" msgstr "Pokreni servis pri pokretanju računala" #: data/ui/general_settings.glade:82 msgid "Process All Outputs" msgstr "" #: data/ui/general_settings.glade:94 msgid "Process All Inputs" msgstr "" #: data/ui/general_settings.glade:130 msgid "Use Dark Theme" msgstr "Koristi tamnu temu" #: data/ui/general_settings.glade:158 data/ui/general_settings.glade:220 msgid "Niceness" msgstr "" #: data/ui/general_settings.glade:159 #, fuzzy msgid "Real Time" msgstr "Vrijeme opadanja intenziteta signala" #: data/ui/general_settings.glade:160 msgid "None" msgstr "" #: data/ui/general_settings.glade:208 msgid "Priority Type" msgstr "" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "" #: data/ui/general_settings.glade:244 msgid "Activity Timeout" msgstr "" #: data/ui/general_settings.glade:325 msgid "About" msgstr "" #: data/ui/gate.glade:97 msgid "Gate" msgstr "Vrata" #: data/ui/gate.glade:330 #, fuzzy msgid "Maximum Gain Reduction" msgstr "Ograničenje pojačanja" #: data/ui/gate.glade:379 msgid "Stereo Link" msgstr "Stereo veza" #: data/ui/gate.glade:393 #, fuzzy msgid "Average" msgstr "Prosjek" #: data/ui/gate.glade:394 #, fuzzy msgid "Maximum" msgstr "Maksimum" #: data/ui/gate.glade:632 #, fuzzy msgid "Input Level" msgstr "Ulazni uređaj" #: data/ui/gate.glade:864 data/ui/multiband_gate.glade:911 #: data/ui/multiband_gate.glade:1323 data/ui/multiband_gate.glade:1736 #: data/ui/multiband_gate.glade:2149 msgid "Gating" msgstr "" #: data/ui/limiter.glade:96 data/ui/webrtc.glade:612 msgid "Limiter" msgstr "Graničnik" #: data/ui/limiter.glade:266 msgid "Automatic Smoothing Control" msgstr "" #: data/ui/limiter.glade:278 msgid "Automatic Leveling" msgstr "" #: data/ui/limiter.glade:308 msgid "Limit" msgstr "Granica" #: data/ui/limiter.glade:409 msgid "Oversampling" msgstr "Jači sampling" #: data/ui/limiter.glade:447 msgid "ASC" msgstr "ASC" #: data/ui/limiter.glade:595 msgid "Attenuation" msgstr "Prigušenje" #: data/ui/loudness.glade:90 msgid "Loudness Compensator" msgstr "" #: data/ui/loudness.glade:328 msgid "Standard" msgstr "" #: data/ui/loudness.glade:341 msgid "Flat" msgstr "" #: data/ui/loudness.glade:342 msgid "ISO226-2003" msgstr "" #: data/ui/loudness.glade:343 msgid "Fletcher-Munson" msgstr "" #: data/ui/loudness.glade:344 msgid "Robinson-Dadson" msgstr "" #: data/ui/loudness.glade:370 #, fuzzy msgid "FFT Size" msgstr "Veličina okvira" #: data/ui/maximizer.glade:95 msgid "Maximizer" msgstr "Maksimizer" #: data/ui/maximizer.glade:386 msgid "Gain Reduction" msgstr "Ograničenje pojačanja" #: data/ui/multiband_compressor.glade:139 #, fuzzy msgid "Multiband Compressor" msgstr "Višerasponski kompresor" #: data/ui/multiband_compressor.glade:426 data/ui/multiband_gate.glade:450 msgid "LR4" msgstr "" #: data/ui/multiband_compressor.glade:427 data/ui/multiband_gate.glade:451 msgid "LR8" msgstr "" #: data/ui/multiband_compressor.glade:441 data/ui/multiband_gate.glade:465 #, fuzzy msgid "Split 1/2" msgstr "Razdvojeno 1/2" #: data/ui/multiband_compressor.glade:454 data/ui/multiband_gate.glade:478 #, fuzzy msgid "Split 2/3" msgstr "Razdvojeno 2/3" #: data/ui/multiband_compressor.glade:467 data/ui/multiband_gate.glade:491 #, fuzzy msgid "Split 3/4" msgstr "Razdvojeno 3/4" #: data/ui/multiband_compressor.glade:854 #: data/ui/multiband_compressor.glade:1232 #: data/ui/multiband_compressor.glade:1611 #: data/ui/multiband_compressor.glade:1990 #, fuzzy msgid "Compression" msgstr "Kompresija" #: data/ui/multiband_compressor.glade:937 data/ui/multiband_gate.glade:994 #, fuzzy msgid "Sub Band" msgstr "Sub band" #: data/ui/multiband_compressor.glade:1315 data/ui/multiband_gate.glade:1406 #, fuzzy msgid "Low Band" msgstr "Niski band" #: data/ui/multiband_compressor.glade:1694 data/ui/multiband_gate.glade:1819 #, fuzzy msgid "Mid Band" msgstr "Srednji band" #: data/ui/multiband_compressor.glade:2073 data/ui/multiband_gate.glade:2232 #, fuzzy msgid "High Band" msgstr "Visoki band" #: data/ui/multiband_gate.glade:139 #, fuzzy msgid "Multiband Gate" msgstr "Višerasponska vrata" #: data/ui/pitch.glade:102 msgid "Pitch" msgstr "Visina" #: data/ui/pitch.glade:270 msgid "Cents" msgstr "Centi" #: data/ui/pitch.glade:300 msgid "Semitones" msgstr "Polustepeni" #: data/ui/pitch.glade:330 msgid "Octaves" msgstr "Oktave" #: data/ui/pitch.glade:360 msgid "Crispness" msgstr "Oštrina" #: data/ui/pitch.glade:402 msgid "Faster" msgstr "Brže" #: data/ui/pitch.glade:414 msgid "Preserve Formant" msgstr "Sačuvaj formant" #: data/ui/preset_row.glade:55 msgid "Load" msgstr "" #: data/ui/preset_row.glade:70 #, fuzzy msgid "Save current settings to this preset file" msgstr "Spremi trenutne postavke u predložak" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "" #: data/ui/preset_row.glade:98 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" #: data/ui/presets_menu.glade:81 data/ui/presets_menu.glade:182 #: src/presets_menu_ui.cpp:129 msgid "Import Presets" msgstr "Učitaj predloške" #: data/ui/pulse_info.glade:77 msgid "Version" msgstr "" #: data/ui/pulse_info.glade:104 #, fuzzy msgid "Default Sink" msgstr "Tvorničke postavke" #: data/ui/pulse_info.glade:116 #, fuzzy msgid "Default Source" msgstr "Tvorničke postavke" #: data/ui/pulse_info.glade:158 msgid "Protocol" msgstr "" #: data/ui/pulse_info.glade:185 msgid "Default Sample Format" msgstr "" #: data/ui/pulse_info.glade:212 msgid "Default Sampling Rate" msgstr "" #: data/ui/pulse_info.glade:266 #, fuzzy msgid "Channel Mapping" msgstr "Kanali" #: data/ui/pulse_info.glade:291 msgid "Server" msgstr "" #: data/ui/pulse_info.glade:336 msgid "Modules" msgstr "" #: data/ui/pulse_info.glade:382 #, fuzzy msgid "Clients" msgstr "Centi" #: data/ui/pulse_info.glade:446 msgid "File" msgstr "" #: data/ui/pulse_info.glade:456 #, fuzzy msgid "Configuration" msgstr "Trajanje" #: data/ui/pulse_info.glade:489 #, fuzzy msgid "Resamplers" msgstr "Promjena frekvencije" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:403 msgid "Use Default" msgstr "Koristi tvorničke postavke" #: data/ui/pulse_settings.glade:147 data/ui/pulse_settings.glade:452 msgid "Pipeline Input" msgstr "" #: data/ui/pulse_settings.glade:247 data/ui/pulse_settings.glade:552 #, fuzzy msgid "Pipeline Output" msgstr "Ekvalizator - Izlaz" #: data/ui/pulse_settings.glade:347 data/ui/pulse_settings.glade:652 #, fuzzy msgid "Block Size" msgstr "Veličina bloka" #: data/ui/reverb.glade:130 msgid "Reverberation" msgstr "Reverberacija" #: data/ui/reverb.glade:181 #, fuzzy msgid "Ambience" msgstr "Ambijent" #: data/ui/reverb.glade:194 msgid "Empty Walls" msgstr "Prazna soba" #: data/ui/reverb.glade:207 #, fuzzy msgid "Room" msgstr "Soba" #: data/ui/reverb.glade:220 msgid "Large Empty Hall" msgstr "Velika prazna dvorana" #: data/ui/reverb.glade:246 msgid "Large Occupied Hall" msgstr "Velika popunjena dvorana" #: data/ui/reverb.glade:453 #, fuzzy msgid "Pre Delay" msgstr "Prijevremeno kašnjenje" #: data/ui/reverb.glade:465 msgid "Decay Time" msgstr "Vrijeme opadanja intenziteta signala" #: data/ui/reverb.glade:531 msgid "Dry" msgstr "Suhoća" #: data/ui/reverb.glade:563 msgid "Bass Cut" msgstr "Odrezivanje basa" #: data/ui/reverb.glade:615 msgid "Treble Cut" msgstr "Odrezivanje trebla" #: data/ui/reverb.glade:660 msgid "Diffusion" msgstr "Difuzija" #: data/ui/reverb.glade:672 msgid "Room Size" msgstr "Veličina sobe" #: data/ui/reverb.glade:684 #, fuzzy msgid "Small" msgstr "Mala" #: data/ui/reverb.glade:685 msgid "Medium" msgstr "Osrednja" #: data/ui/reverb.glade:686 #, fuzzy msgid "Large" msgstr "Velika" #: data/ui/reverb.glade:687 msgid "Tunnel" msgstr "Tunel" #: data/ui/reverb.glade:688 msgid "Large/smooth" msgstr "Velika/glatko" #: data/ui/reverb.glade:689 msgid "Experimental" msgstr "Eksperimentalna" #: data/ui/reverb.glade:702 msgid "High Frequency Damping" msgstr "Prigušivanje visokih frekvencija" #: data/ui/spectrum_settings.glade:77 #, fuzzy msgid "Show Spectrum" msgstr "Spektar" #: data/ui/spectrum_settings.glade:89 msgid "Fill" msgstr "" #: data/ui/spectrum_settings.glade:125 msgid "Border" msgstr "" #: data/ui/spectrum_settings.glade:149 msgid "Use Custom Color" msgstr "Koristi vlastitu boju" #: data/ui/spectrum_settings.glade:173 msgid "Use Gradient" msgstr "" #: data/ui/spectrum_settings.glade:315 msgid "Points" msgstr "Broj traka" #: data/ui/spectrum_settings.glade:327 #, fuzzy msgid "Height" msgstr "Visina" #: data/ui/spectrum_settings.glade:339 #, fuzzy msgid "Line Width" msgstr "Širina" #: data/ui/spectrum_settings.glade:351 #, fuzzy msgid "Sampling" msgstr "Jači sampling" #: data/ui/spectrum_settings.glade:363 #, fuzzy msgid "Minimum Frequency" msgstr "Frekvencija" #: data/ui/spectrum_settings.glade:375 #, fuzzy msgid "Maximum Frequency" msgstr "Frekvencija" #: data/ui/spectrum_settings.glade:410 #, fuzzy msgid "Spectrum Type" msgstr "Spektar" #: data/ui/spectrum_settings.glade:423 msgid "Bars" msgstr "" #: data/ui/spectrum_settings.glade:424 msgid "Lines" msgstr "" #: data/ui/spectrum_settings.glade:437 #, fuzzy msgid "Spectrum Color" msgstr "Boja spektra" #: data/ui/spectrum_settings.glade:449 msgid "Gradient Color" msgstr "" #: data/ui/spectrum_settings.glade:461 msgid "Axis Color" msgstr "" #: data/ui/stereo_tools.glade:108 #, fuzzy msgid "Stereo Tools" msgstr "Stereo alati" #: data/ui/stereo_tools.glade:334 data/ui/stereo_tools.glade:775 msgid "Balance" msgstr "Ravnoteža" #: data/ui/stereo_tools.glade:365 #, fuzzy msgid "S/C Level" msgstr "S/C Razina" #: data/ui/stereo_tools.glade:406 msgid "Softclip" msgstr "" #: data/ui/stereo_tools.glade:452 #, fuzzy msgid "Side Level" msgstr "Stranična razina" #: data/ui/stereo_tools.glade:503 #, fuzzy msgid "Side Balance" msgstr "Stranična ravnoteža" #: data/ui/stereo_tools.glade:535 #, fuzzy msgid "Middle Level" msgstr "Srednji nivo" #: data/ui/stereo_tools.glade:547 #, fuzzy msgid "Middle Panorama" msgstr "Srednja panorama" #: data/ui/stereo_tools.glade:604 msgid "LR > LR (Stereo Default)" msgstr "" #: data/ui/stereo_tools.glade:605 msgid "LR > MS (Stereo to Mid-Side)" msgstr "" #: data/ui/stereo_tools.glade:606 msgid "MS > LR (Mid-Side to Stereo)" msgstr "" #: data/ui/stereo_tools.glade:607 msgid "LR > LL (Mono Left Channel)" msgstr "" #: data/ui/stereo_tools.glade:608 msgid "LR > RR (Mono Right Channel)" msgstr "" #: data/ui/stereo_tools.glade:609 msgid "LR > L+R (Mono Sum L+R)" msgstr "" #: data/ui/stereo_tools.glade:610 msgid "LR > RL (Stereo Flip Channels)" msgstr "" #: data/ui/stereo_tools.glade:627 #, fuzzy msgid "Stereo Matrix" msgstr "Stereo matrica" #: data/ui/stereo_tools.glade:668 data/ui/stereo_tools.glade:709 msgid "Invert Phase" msgstr "Inverzija faze" #: data/ui/stereo_tools.glade:806 #, fuzzy msgid "Delay L/R" msgstr "Kašnjenje L/D" #: data/ui/stereo_tools.glade:839 #, fuzzy msgid "Stereo Base" msgstr "Stereo baza" #: data/ui/stereo_tools.glade:871 #, fuzzy msgid "Stereo Phase" msgstr "Stereo faza" #: data/ui/webrtc.glade:96 msgid "WebRTC" msgstr "" #: data/ui/webrtc.glade:256 data/ui/webrtc.glade:389 data/ui/webrtc.glade:460 #: data/ui/webrtc.glade:648 msgid "Enable" msgstr "Omogući" #: data/ui/webrtc.glade:279 msgid "Extended Filter" msgstr "Prošireni filter" #: data/ui/webrtc.glade:292 msgid "High Pass Filter" msgstr "Filter visokog prolaza" #: data/ui/webrtc.glade:309 data/ui/webrtc.glade:425 data/ui/webrtc.glade:698 msgid "Low" msgstr "Nisko" #: data/ui/webrtc.glade:310 data/ui/webrtc.glade:426 data/ui/webrtc.glade:699 msgid "Moderate" msgstr "Umjereno" #: data/ui/webrtc.glade:311 data/ui/webrtc.glade:427 data/ui/webrtc.glade:700 msgid "High" msgstr "Visoko" #: data/ui/webrtc.glade:324 data/ui/webrtc.glade:412 #, fuzzy msgid "Suppression Level" msgstr "Razina supresije" #: data/ui/webrtc.glade:361 msgid "Delay Agnostic" msgstr "" #: data/ui/webrtc.glade:375 msgid "Echo Canceller" msgstr "Poništenje jeke" #: data/ui/webrtc.glade:428 #, fuzzy msgid "Very High" msgstr "Jako visoko" #: data/ui/webrtc.glade:445 msgid "Noise Suppressor" msgstr "Supresija buke" #: data/ui/webrtc.glade:496 msgid "Adaptive Digital" msgstr "" #: data/ui/webrtc.glade:497 msgid "Fixed Digital" msgstr "" #: data/ui/webrtc.glade:514 msgid "Gain Controller" msgstr "Kontrola pojačanja" #: data/ui/webrtc.glade:540 msgid "Target Level" msgstr "Ciljana razina" #: data/ui/webrtc.glade:572 msgid "Maximum Gain" msgstr "Najveće pojačanje" #: data/ui/webrtc.glade:672 msgid "Detection Likelihood" msgstr "Vjerojatnost detekcije" #: data/ui/webrtc.glade:684 msgid "Frame Size" msgstr "Veličina okvira" #: data/ui/webrtc.glade:697 msgid "Very Low" msgstr "Vrlo nisko" #: data/ui/webrtc.glade:737 msgid "Voice Detector" msgstr "Detektor glasa" #: data/ui/rnnoise.glade:90 #, fuzzy msgid "Noise Reduction" msgstr "Ograničenje pojačanja" #: data/ui/rnnoise.glade:242 #, fuzzy msgid "Import Model" msgstr "Učitaj impuls" #: data/ui/rnnoise.glade:246 #, fuzzy msgid "Import Model File" msgstr "Učitaj impuls datoteku" #: data/ui/rnnoise.glade:311 #, fuzzy msgid "Active Model" msgstr "Kompresija" #: data/ui/rnnoise.glade:324 msgid "Standard RNNoise Model" msgstr "" #: src/app_info_ui.cpp:120 msgid "paused" msgstr "pauzirano" #: src/app_info_ui.cpp:122 msgid "playing" msgstr "reprodukcija" #: src/application.cpp:38 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "" "Zatvori PulseEffects. Korisno pri upotrebi u servisnom načinu pokretanja." #: src/application.cpp:40 msgid "Show available presets." msgstr "Prikaži dostupne predloške." #: src/application.cpp:43 msgid "Load a preset. Example: pulseeffects -l music" msgstr "Učitaj predložak. Primjer: pulseeffects -l music" #: src/application.cpp:45 #, fuzzy msgid "Reset PulseEffects." msgstr "PulseEffects" #: src/application.cpp:48 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "" #: src/application.cpp:50 msgid "Hide the Window." msgstr "" #: src/application.cpp:284 #, fuzzy msgid "Output Presets: " msgstr "Predlošci: " #: src/application.cpp:292 #, fuzzy msgid "Input Presets: " msgstr "Učitaj predloške" #: src/blocklist_settings_ui.cpp:191 msgid "Blocklist" msgstr "Crna lista" #: src/calibration_ui.cpp:198 #, fuzzy msgid "Calibration Microphone" msgstr "Kalibracija mikrofona" #: src/convolver_ui.cpp:281 #, fuzzy msgid "Import Impulse File" msgstr "Učitaj impuls datoteku" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Open" msgstr "Otvori" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Cancel" msgstr "Poništi" #: src/convolver_ui.cpp:318 src/convolver_ui.cpp:319 src/convolver_ui.cpp:321 msgid "Failed" msgstr "Nije uspjelo" #: src/convolver_ui.cpp:323 msgid "Could Not Load The Impulse File" msgstr "Nije bilo moguće učitati impuls datoteku" #: src/equalizer_ui.cpp:380 msgid "infinity" msgstr "" #: src/equalizer_ui.cpp:738 #, fuzzy msgid "Import APO Preset File" msgstr "Učitaj predloške" #: src/equalizer_ui.cpp:743 #, fuzzy msgid "APO Presets" msgstr "Predlošci" #: src/general_settings_ui.cpp:149 msgid "General" msgstr "Općenito" #: src/pulse_settings_ui.cpp:168 msgid "Pulseaudio" msgstr "Pulseaudio" #, fuzzy #~ msgid "Import APO Presets" #~ msgstr "Učitaj predloške" #~ msgid "Input Gain" #~ msgstr "Pojačanje ulaza" #, fuzzy #~ msgid "Output Gain" #~ msgstr "Pojačanje ulaza" #, fuzzy #~ msgid "Gain Detection" #~ msgstr "Ograničenje pojačanja" easyeffects-4.8.7/po/id_ID.po000066400000000000000000001250401424023573300157660ustar00rootroot00000000000000# This is Indonesia translate file for PE. We are need your help to completely translate this project. You can translate PuleEffect's help file to Indonesian to develop this project. If you any question about translating process, just send email that I have been desribed below. But if you want to support such as reporting any bugs, go ahead to github page @ https://github.com/wwmm/pulseeffects/ # Copyright (C) 2018 # This file is distributed under the same license as the PulseEffects package. # Dika Muhamad A. , 2018. # msgid "" msgstr "" "Project-Id-Version: pulseeffects\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-14 23:58+0100\n" "PO-Revision-Date: 2019-01-17 18:30+0700\n" "Last-Translator: \n" "Language-Team: \n" "Language: id_ID\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2\n" "Plural-Forms: nplurals=1; plural=0;\n" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 data/ui/application.glade:61 msgid "PulseEffects" msgstr "PulseEffects" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Penerap Efek Suara untuk Aplikasi Berbasis Pulseaudio" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Wellington Wallace" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects merupakan aplikasi pengubah efek suara. Berisi modul-modul " "seperti ekualiser, pembatas, kompresor, dan modul penggema. Dilengkapi juga " "dengan Penganalisis Spektrum untuk memantau efek yang diterapkan." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "PulseEffects bekerja dengan aplikasi berbasis PulseAudio. Aplikasi yang " "mendukung PulseEffects akan ditampilkan pada jendela utama aplikasi." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Selain mengolah suara yang keluar, PulseEffects dapat mengolah efek suara " "seperti pada mikrofon dan pengakat masukan lainnya. PulseEffects juga " "bekerja dengan baik ketika dipakai dalam percakapan suara." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "Ketika PulseEffects dijalankan, preset terakhir yang dipakai akan termuat " "otomatis. Anda juga dapat menyimpan pengaturan yang telah dibuat ke dalam " "profil tersendiri." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "Atur Volume dan hidupkan/matikan Efek" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "Dilengkapi dengan Ekualiser dengan Preset Bawaan" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Pembatas Masukan" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:52 #: data/ui/compressor.glade:110 data/ui/compressor.glade:589 #: data/ui/webrtc.glade:633 msgid "Compressor" msgstr "Kompresor" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Kalibrasi" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "Equalizer, Compressor and Other Audio Effects" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "limiter;compressor;reverberation;equalizer;autovolume;" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:44 #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:47 msgid "\"Presets\"" msgstr "Preset" #: data/ui/about.glade.in:11 msgid "Audio effects for PulseAudio applications" msgstr "Terapkan Efek Suara via PulseAudio" #: data/ui/app_button_row.glade:49 msgid "Applications" msgstr "Aplikasi" #: data/ui/app_info.glade:203 #, fuzzy msgid "Add to Blocklist" msgstr "Daftar Blokir" #: data/ui/app_info.glade:239 msgid "Format" msgstr "Format Resampling" #: data/ui/app_info.glade:264 data/ui/convolver.glade:348 msgid "Rate" msgstr "Rataan Frekuensi" #: data/ui/app_info.glade:289 data/ui/pulse_info.glade:239 #: data/ui/stereo_tools.glade:756 msgid "Channels" msgstr "Total Kanal" #: data/ui/app_info.glade:314 msgid "Resampler" msgstr "Modus Penyampling" #: data/ui/app_info.glade:339 data/ui/pulse_settings.glade:159 #: data/ui/pulse_settings.glade:259 data/ui/pulse_settings.glade:464 #: data/ui/pulse_settings.glade:564 msgid "Buffer" msgstr "Ukuran Penyangga" #: data/ui/app_info.glade:364 data/ui/pulse_settings.glade:190 #: data/ui/pulse_settings.glade:290 data/ui/pulse_settings.glade:476 #: data/ui/pulse_settings.glade:576 msgid "Latency" msgstr "Besar Latensi" #: data/ui/app_info.glade:389 msgid "State" msgstr "Status" #: data/ui/application.glade:142 src/calibration_ui.cpp:64 #: src/calibration_ui.cpp:191 msgid "Test Signals" msgstr "Uji Sinyal" #: data/ui/application.glade:157 #, fuzzy msgid "Global Bypass" msgstr "Bypass" #: data/ui/application.glade:172 data/ui/equalizer.glade:331 #: data/ui/general_settings.glade:289 msgid "Settings" msgstr "Setelan" #: data/ui/application.glade:194 msgid "Help" msgstr "Bantuan" #: data/ui/application.glade:217 data/ui/crossfeed.glade:240 #: data/ui/equalizer.glade:403 data/ui/filter.glade:344 #: data/ui/reverb.glade:401 src/presets_menu_ui.cpp:133 #: src/presets_menu_ui.cpp:285 src/presets_menu_ui.cpp:286 #: src/presets_menu_ui.cpp:303 src/presets_menu_ui.cpp:304 msgid "Presets" msgstr "Preset" #: data/ui/autogain.glade:90 msgid "Auto Gain" msgstr "Gain Otomatis" #: data/ui/autogain.glade:161 data/ui/bass_enhancer.glade:167 #: data/ui/compressor.glade:214 data/ui/convolver.glade:218 #: data/ui/crossfeed.glade:136 data/ui/crystalizer.glade:134 #: data/ui/deesser.glade:182 data/ui/delay.glade:144 #: data/ui/equalizer.glade:450 data/ui/equalizer_band.glade:187 #: data/ui/equalizer_band.glade:230 data/ui/exciter.glade:167 #: data/ui/filter.glade:243 data/ui/general_settings.glade:298 #: data/ui/gate.glade:172 data/ui/limiter.glade:166 data/ui/loudness.glade:174 #: data/ui/maximizer.glade:139 data/ui/multiband_compressor.glade:307 #: data/ui/multiband_gate.glade:331 data/ui/pitch.glade:158 #: data/ui/reverb.glade:299 data/ui/stereo_tools.glade:194 #: data/ui/webrtc.glade:141 data/ui/rnnoise.glade:139 msgid "Reset" msgstr "Atur Ulang" #: data/ui/autogain.glade:185 data/ui/rnnoise.glade:163 msgid "Based on" msgstr "" #: data/ui/autogain.glade:262 msgid "Reset History" msgstr "" #: data/ui/autogain.glade:274 #, fuzzy msgid "Detect Silence" msgstr "Deteksi" #: data/ui/autogain.glade:286 #, fuzzy msgid "Use Geometric Mean" msgstr "Terapkan Gradien warna" #: data/ui/autogain.glade:325 msgid "Target" msgstr "Target" #: data/ui/autogain.glade:374 data/ui/autogain.glade:779 msgid "Momentary" msgstr "Efek Sejenak" #: data/ui/autogain.glade:434 msgid "Weights" msgstr "Tinggi" #: data/ui/autogain.glade:448 data/ui/autogain.glade:792 msgid "Short Term" msgstr "Waktu Singkat" #: data/ui/autogain.glade:497 data/ui/autogain.glade:805 msgid "Integrated" msgstr "Terintegrasi" #: data/ui/autogain.glade:564 data/ui/autogain.glade:1076 #: data/ui/bass_enhancer.glade:596 data/ui/compressor.glade:1086 #: data/ui/convolver.glade:575 data/ui/crossfeed.glade:391 #: data/ui/crystalizer.glade:250 data/ui/deesser.glade:783 #: data/ui/delay.glade:328 data/ui/equalizer.glade:682 #: data/ui/exciter.glade:596 data/ui/filter.glade:508 data/ui/gate.glade:689 #: data/ui/limiter.glade:501 data/ui/loudness.glade:238 #: data/ui/loudness.glade:431 data/ui/maximizer.glade:358 #: data/ui/multiband_compressor.glade:2103 data/ui/multiband_gate.glade:2262 #: data/ui/pitch.glade:450 data/ui/presets_menu.glade:238 #: data/ui/reverb.glade:753 data/ui/stereo_tools.glade:427 #: data/ui/stereo_tools.glade:931 data/ui/webrtc.glade:780 #: data/ui/rnnoise.glade:362 msgid "Input" msgstr "Masukan" #: data/ui/autogain.glade:577 data/ui/autogain.glade:1020 #: data/ui/bass_enhancer.glade:625 data/ui/compressor.glade:1099 #: data/ui/convolver.glade:588 data/ui/crossfeed.glade:405 #: data/ui/crystalizer.glade:263 data/ui/deesser.glade:797 #: data/ui/delay.glade:341 data/ui/equalizer.glade:695 #: data/ui/exciter.glade:625 data/ui/filter.glade:521 data/ui/gate.glade:703 #: data/ui/limiter.glade:636 data/ui/loudness.glade:271 #: data/ui/loudness.glade:445 data/ui/maximizer.glade:372 #: data/ui/multiband_compressor.glade:894 #: data/ui/multiband_compressor.glade:1272 #: data/ui/multiband_compressor.glade:1651 #: data/ui/multiband_compressor.glade:2030 #: data/ui/multiband_compressor.glade:2116 data/ui/multiband_gate.glade:951 #: data/ui/multiband_gate.glade:1363 data/ui/multiband_gate.glade:1776 #: data/ui/multiband_gate.glade:2189 data/ui/multiband_gate.glade:2275 #: data/ui/pitch.glade:463 data/ui/presets_menu.glade:137 #: data/ui/reverb.glade:766 data/ui/stereo_tools.glade:901 #: data/ui/stereo_tools.glade:944 data/ui/webrtc.glade:794 #: data/ui/rnnoise.glade:375 msgid "Output" msgstr "Output" #: data/ui/autogain.glade:899 msgid "Relative" msgstr "Relatif" #: data/ui/autogain.glade:912 data/ui/compressor.glade:1262 msgid "Gain" msgstr "Besar Gain" #: data/ui/autogain.glade:980 msgid "Loudness" msgstr "Kelantangan" #: data/ui/autogain.glade:1034 msgid "Range" msgstr "Rentang" #: data/ui/bass_enhancer.glade:116 msgid "Bass Enhancer" msgstr "Penguat Bass" #: data/ui/bass_enhancer.glade:191 data/ui/compressor.glade:238 #: data/ui/crossfeed.glade:160 data/ui/deesser.glade:206 #: data/ui/delay.glade:168 data/ui/equalizer.glade:474 #: data/ui/exciter.glade:191 data/ui/filter.glade:267 data/ui/gate.glade:196 #: data/ui/limiter.glade:190 data/ui/loudness.glade:143 #: data/ui/maximizer.glade:163 data/ui/multiband_compressor.glade:331 #: data/ui/multiband_gate.glade:355 data/ui/pitch.glade:182 #: data/ui/reverb.glade:323 data/ui/stereo_tools.glade:218 #: data/ui/webrtc.glade:165 msgid "Provided by" msgstr "" #: data/ui/bass_enhancer.glade:259 data/ui/compressor.glade:602 #: data/ui/deesser.glade:274 data/ui/exciter.glade:259 msgid "Listen" msgstr "Uji Pengaturan" #: data/ui/bass_enhancer.glade:302 data/ui/exciter.glade:303 msgid "3rd" msgstr "Ketiga" #: data/ui/bass_enhancer.glade:315 data/ui/exciter.glade:316 msgid "2nd" msgstr "Kedua" #: data/ui/bass_enhancer.glade:327 data/ui/exciter.glade:328 msgid "Blend Harmonics" msgstr "Pencampuran Harmonik" #: data/ui/bass_enhancer.glade:355 data/ui/exciter.glade:357 #: data/ui/reverb.glade:498 msgid "Amount" msgstr "Besaran" #: data/ui/bass_enhancer.glade:367 data/ui/bass_enhancer.glade:504 #: data/ui/exciter.glade:369 data/ui/exciter.glade:504 msgid "Harmonics" msgstr "Harmonik" #: data/ui/bass_enhancer.glade:379 data/ui/exciter.glade:381 msgid "Scope" msgstr "Frekuensi Target Bass" #: data/ui/bass_enhancer.glade:472 msgid "Floor" msgstr "Monitor Lantai" #: data/ui/blocklist_settings.glade:52 data/ui/blocklist_settings.glade:155 #: data/ui/presets_menu.glade:65 data/ui/presets_menu.glade:166 msgid "Create Preset" msgstr "Buat Preset" #: data/ui/blocklist_settings.glade:68 data/ui/blocklist_settings.glade:171 #: data/ui/presets_menu.glade:52 data/ui/presets_menu.glade:153 #: data/ui/pulse_info.glade:50 msgid "Name" msgstr "Nama" #: data/ui/blocklist_settings.glade:81 msgid "Reconnect the microphone to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:139 data/ui/pulse_settings.glade:383 msgid "Input Effects" msgstr "Efek Input" #: data/ui/blocklist_settings.glade:230 msgid "Restart the player to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:242 data/ui/pulse_settings.glade:688 msgid "Output Effects" msgstr "Efek Luaran" #: data/ui/blocklist_settings.glade:265 msgid "Show Blocklisted Apps in Main Tab" msgstr "" #: data/ui/calibration_signals.glade:32 msgid "Sine" msgstr "Sinus" #: data/ui/calibration_signals.glade:33 msgid "Square" msgstr "Kotak" #: data/ui/calibration_signals.glade:34 msgid "Saw" msgstr "Gergaji" #: data/ui/calibration_signals.glade:35 msgid "Triangle" msgstr "Segitiga" #: data/ui/calibration_signals.glade:36 msgid "Silence" msgstr "Diam" #: data/ui/calibration_signals.glade:37 msgid "White Noise" msgstr "Derau Putih" #: data/ui/calibration_signals.glade:38 msgid "Pink Noise" msgstr "Derau Merah Muda" #: data/ui/calibration_signals.glade:39 msgid "Sine Table" msgstr "Tabel Sinus" #: data/ui/calibration_signals.glade:40 msgid "Ticks" msgstr "Ketukan per Detik" #: data/ui/calibration_signals.glade:41 msgid "Gaussian Noise" msgstr "Derau Gaussia" #: data/ui/calibration_signals.glade:42 msgid "Red Noise" msgstr "Derau Merah" #: data/ui/calibration_signals.glade:43 msgid "Blue Noise" msgstr "Derau Biru" #: data/ui/calibration_signals.glade:44 msgid "Violet Noise" msgstr "Derau Ungu" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Volume" #: data/ui/calibration_signals.glade:135 data/ui/equalizer_band.glade:158 #: data/ui/filter.glade:394 msgid "Frequency" msgstr "Frekuensi" #: data/ui/calibration_mic.glade:33 msgid "Window" msgstr "Jendela" #: data/ui/calibration_mic.glade:90 msgid "Measure Noise" msgstr "Ukur Derau" #: data/ui/calibration_mic.glade:119 msgid "Subtract Noise" msgstr "Kurangi Derau" #: data/ui/compressor.glade:386 data/ui/deesser.glade:436 #: data/ui/gate.glade:498 data/ui/maximizer.glade:242 #: data/ui/multiband_compressor.glade:707 #: data/ui/multiband_compressor.glade:1085 #: data/ui/multiband_compressor.glade:1464 #: data/ui/multiband_compressor.glade:1843 data/ui/multiband_gate.glade:731 #: data/ui/multiband_gate.glade:1142 data/ui/multiband_gate.glade:1555 #: data/ui/multiband_gate.glade:1968 msgid "Threshold" msgstr "Ambang Batas" #: data/ui/compressor.glade:420 data/ui/deesser.glade:448 #: data/ui/gate.glade:532 data/ui/multiband_compressor.glade:741 #: data/ui/multiband_compressor.glade:1119 #: data/ui/multiband_compressor.glade:1498 #: data/ui/multiband_compressor.glade:1877 data/ui/multiband_gate.glade:765 #: data/ui/multiband_gate.glade:1176 data/ui/multiband_gate.glade:1589 #: data/ui/multiband_gate.glade:2002 msgid "Ratio" msgstr "Rasio" #: data/ui/compressor.glade:452 data/ui/gate.glade:564 #: data/ui/multiband_compressor.glade:773 #: data/ui/multiband_compressor.glade:1151 #: data/ui/multiband_compressor.glade:1530 #: data/ui/multiband_compressor.glade:1909 data/ui/multiband_gate.glade:797 #: data/ui/multiband_gate.glade:1208 data/ui/multiband_gate.glade:1621 #: data/ui/multiband_gate.glade:2034 msgid "Knee" msgstr "Knee" #: data/ui/compressor.glade:486 data/ui/deesser.glade:532 #: data/ui/gate.glade:598 data/ui/multiband_compressor.glade:807 #: data/ui/multiband_compressor.glade:1185 #: data/ui/multiband_compressor.glade:1564 #: data/ui/multiband_compressor.glade:1943 data/ui/multiband_gate.glade:831 #: data/ui/multiband_gate.glade:1242 data/ui/multiband_gate.glade:1655 #: data/ui/multiband_gate.glade:2068 msgid "Makeup" msgstr "Penguatan" #: data/ui/compressor.glade:520 data/ui/gate.glade:464 #: data/ui/limiter.glade:363 data/ui/maximizer.glade:266 #: data/ui/multiband_compressor.glade:673 #: data/ui/multiband_compressor.glade:1051 #: data/ui/multiband_compressor.glade:1430 #: data/ui/multiband_compressor.glade:1809 data/ui/multiband_gate.glade:697 #: data/ui/multiband_gate.glade:1108 data/ui/multiband_gate.glade:1521 #: data/ui/multiband_gate.glade:1934 msgid "Release" msgstr "Rilis" #: data/ui/compressor.glade:532 data/ui/gate.glade:430 #: data/ui/multiband_compressor.glade:639 #: data/ui/multiband_compressor.glade:1017 #: data/ui/multiband_compressor.glade:1396 #: data/ui/multiband_compressor.glade:1775 data/ui/multiband_gate.glade:663 #: data/ui/multiband_gate.glade:1074 data/ui/multiband_gate.glade:1487 #: data/ui/multiband_gate.glade:1900 msgid "Attack" msgstr "Attack" #: data/ui/compressor.glade:559 msgid "Downward" msgstr "Kompresi Menekan" #: data/ui/compressor.glade:560 msgid "Upward" msgstr "Kompresi Mengangkat" #: data/ui/compressor.glade:573 #, fuzzy msgid "Compression Mode" msgstr "Modus Kompresi" #: data/ui/compressor.glade:649 #, fuzzy msgid "Pre-amplification" msgstr "Pra-Amplifikasi" #: data/ui/compressor.glade:683 msgid "Reactivity" msgstr "Pengaktifan Ulang" #: data/ui/compressor.glade:716 data/ui/limiter.glade:375 msgid "Lookahead" msgstr "Lookahead" #: data/ui/compressor.glade:730 msgid "Feed-forward" msgstr "Feed-forward" #: data/ui/compressor.glade:731 #, fuzzy msgid "Feed-back" msgstr "Volume Penyuapan" #: data/ui/compressor.glade:744 data/ui/equalizer_band.glade:51 msgid "Type" msgstr "Tipe" #: data/ui/compressor.glade:758 data/ui/deesser.glade:731 #: data/ui/gate.glade:303 data/ui/multiband_compressor.glade:611 #: data/ui/multiband_compressor.glade:989 #: data/ui/multiband_compressor.glade:1368 #: data/ui/multiband_compressor.glade:1747 data/ui/multiband_gate.glade:635 #: data/ui/multiband_gate.glade:1046 data/ui/multiband_gate.glade:1459 #: data/ui/multiband_gate.glade:1872 msgid "Peak" msgstr "Peak" #: data/ui/compressor.glade:759 data/ui/deesser.glade:730 #: data/ui/gate.glade:302 data/ui/multiband_compressor.glade:610 #: data/ui/multiband_compressor.glade:988 #: data/ui/multiband_compressor.glade:1367 #: data/ui/multiband_compressor.glade:1746 data/ui/multiband_gate.glade:634 #: data/ui/multiband_gate.glade:1045 data/ui/multiband_gate.glade:1458 #: data/ui/multiband_gate.glade:1871 msgid "RMS" msgstr "RMS" #: data/ui/compressor.glade:760 #, fuzzy msgid "Low-Pass" msgstr "Band Rendah" #: data/ui/compressor.glade:761 msgid "Uniform" msgstr "Uniform" #: data/ui/compressor.glade:774 data/ui/deesser.glade:702 #: data/ui/equalizer.glade:257 data/ui/equalizer_band.glade:84 #: data/ui/multiband_compressor.glade:412 data/ui/multiband_gate.glade:436 #: data/ui/stereo_tools.glade:591 data/ui/webrtc.glade:483 msgid "Mode" msgstr "Modus" #: data/ui/compressor.glade:788 #, fuzzy msgid "Middle" msgstr "Volume Kanal Tengah" #: data/ui/compressor.glade:789 msgid "Side" msgstr "Volume Kanal Sisi" #: data/ui/compressor.glade:790 data/ui/delay.glade:247 #: data/ui/equalizer.glade:612 data/ui/stereo_tools.glade:655 msgid "Left" msgstr "Kiri" #: data/ui/compressor.glade:791 data/ui/delay.glade:280 #: data/ui/equalizer.glade:654 data/ui/stereo_tools.glade:724 msgid "Right" msgstr "Kanan" #: data/ui/compressor.glade:804 msgid "Source" msgstr "Sumber" #: data/ui/compressor.glade:820 data/ui/compressor.glade:1274 msgid "Sidechain" msgstr "Sidechain" #: data/ui/compressor.glade:925 msgid "Relative Release Threshold" msgstr "" #: data/ui/compressor.glade:937 #, fuzzy msgid "Boost Threshold" msgstr "Ambang Batas" #: data/ui/compressor.glade:949 #, fuzzy msgid "High-pass Frequency" msgstr "Frekuensi Tinggi" #: data/ui/compressor.glade:961 #, fuzzy msgid "Low-pass Frequency" msgstr "Frekuensi Terendah" #: data/ui/compressor.glade:973 #, fuzzy msgid "High-pass Filter Mode" msgstr "Filter High Pass" #: data/ui/compressor.glade:985 msgid "Low-pass Filter Mode" msgstr "" #: data/ui/compressor.glade:999 data/ui/compressor.glade:1017 #: data/ui/equalizer_band.glade:63 msgid "Off" msgstr "Mati" #: data/ui/compressor.glade:1000 data/ui/compressor.glade:1018 #, fuzzy msgid "12 dB/oct" msgstr "Lowpass 12dB/oktaf" #: data/ui/compressor.glade:1001 data/ui/compressor.glade:1019 #, fuzzy msgid "24 dB/oct" msgstr "Lowpass 24dB/oktaf" #: data/ui/compressor.glade:1002 data/ui/compressor.glade:1020 #, fuzzy msgid "36 dB/oct" msgstr "Lowpass 36dB/oktaf" #: data/ui/compressor.glade:1043 msgid "Advanced" msgstr "" #: data/ui/compressor.glade:1347 msgid "Curve" msgstr "Bentuk Kurva" #: data/ui/convolver.glade:90 msgid "Convolver" msgstr "Konvolver" #: data/ui/convolver.glade:125 msgid "Import Impulse" msgstr "Muat Impuls" #: data/ui/convolver.glade:129 msgid "Import Impulse Response File" msgstr "Muat Berkas Respons Impuls" #: data/ui/convolver.glade:309 msgid "L" msgstr "Kiri" #: data/ui/convolver.glade:323 msgid "R" msgstr "Kanan" #: data/ui/convolver.glade:390 msgid "Duration" msgstr "Durasi" #: data/ui/convolver.glade:402 msgid "Samples" msgstr "Jumlah Sampel" #: data/ui/convolver.glade:435 src/convolver_ui.cpp:285 msgid "Impulse Response" msgstr "Respons Impuls" #: data/ui/convolver.glade:458 msgid "Select the impulse Response File" msgstr "Pilih Berkas Repons Impuls" #: data/ui/convolver.glade:477 src/spectrum_settings_ui.cpp:195 msgid "Spectrum" msgstr "Spektrum" #: data/ui/convolver.glade:520 msgid "Stereo Width" msgstr "Lebar Stereo" #: data/ui/crossfeed.glade:104 msgid "Crossfeed" msgstr "Crossfeed" #: data/ui/crossfeed.glade:254 msgid "Jmeier" msgstr "J. Meier" #: data/ui/crossfeed.glade:266 data/ui/filter.glade:183 #: data/ui/reverb.glade:259 msgid "Default" msgstr "Aturan Bawaan" #: data/ui/crossfeed.glade:278 msgid "Cmoy" msgstr "C. Moy" #: data/ui/crossfeed.glade:308 msgid "Cutoff" msgstr "Frekuensi Potong" #: data/ui/crossfeed.glade:341 msgid "Feed" msgstr "Volume Penyuapan" #: data/ui/crystalizer.glade:90 msgid "Crystalizer" msgstr "Pengkristal Suara" #: data/ui/crystalizer.glade:200 #, fuzzy msgid "Aggressive Mode" msgstr "Modus Agresif" #: data/ui/crystalizer.glade:464 msgid "Before" msgstr "Sebelum" #: data/ui/crystalizer.glade:477 msgid "After" msgstr "Sesudah" #: data/ui/crystalizer.glade:550 #, fuzzy msgid "Loudness Range" msgstr "Rentang Kelantangan" #: data/ui/crystalizer_band.glade:28 data/ui/equalizer_band.glade:316 #: data/ui/stereo_tools.glade:680 data/ui/stereo_tools.glade:737 msgid "Mute" msgstr "Bungkam" #: data/ui/crystalizer_band.glade:40 data/ui/multiband_compressor.glade:580 #: data/ui/multiband_compressor.glade:958 #: data/ui/multiband_compressor.glade:1337 #: data/ui/multiband_compressor.glade:1716 data/ui/multiband_gate.glade:604 #: data/ui/multiband_gate.glade:1015 data/ui/multiband_gate.glade:1428 #: data/ui/multiband_gate.glade:1841 msgid "Bypass" msgstr "Bypass" #: data/ui/deesser.glade:125 msgid "Deesser" msgstr "Penghilang Desis" #: data/ui/deesser.glade:309 #, fuzzy msgid "F1 Gain" msgstr "Besar Gain" #: data/ui/deesser.glade:321 #, fuzzy msgid "F2 Level" msgstr "Level" #: data/ui/deesser.glade:333 #, fuzzy msgid "F2 Peak Q" msgstr "Peak Q" #: data/ui/deesser.glade:424 msgid "Laxity" msgstr "Laksitas" #: data/ui/deesser.glade:585 #, fuzzy msgid "F1 Split" msgstr "Pisah" #: data/ui/deesser.glade:597 #, fuzzy msgid "F2 Peak" msgstr "Peak" #: data/ui/deesser.glade:690 data/ui/gate.glade:288 msgid "Detection" msgstr "Deteksi" #: data/ui/deesser.glade:715 msgid "Wide" msgstr "Luas" #: data/ui/deesser.glade:716 msgid "Split" msgstr "Pisah" #: data/ui/deesser.glade:959 data/ui/multiband_gate.glade:865 #: data/ui/multiband_gate.glade:1298 data/ui/multiband_gate.glade:1711 #: data/ui/multiband_gate.glade:2124 msgid "Reduction" msgstr "Pengurangan" #: data/ui/deesser.glade:972 msgid "Detected" msgstr "Terlacak" #: data/ui/delay.glade:90 #, fuzzy msgid "Delay" msgstr "Penundaan" #: data/ui/equalizer.glade:44 msgid "Equalizer" msgstr "Ekualiser" #: data/ui/equalizer.glade:160 msgid "Flat Response" msgstr "Respons Datar" #: data/ui/equalizer.glade:175 msgid "Calculate Frequencies" msgstr "Hitung Frekuensi" #: data/ui/equalizer.glade:213 msgid "Bands" msgstr "Jumlah Band" #: data/ui/equalizer.glade:269 msgid "IIR" msgstr "IIR" #: data/ui/equalizer.glade:270 msgid "FIR" msgstr "FIR" #: data/ui/equalizer.glade:271 msgid "FFT" msgstr "FFT" #: data/ui/equalizer.glade:304 msgid "Split Channels" msgstr "Pisahkan Kanal" #: data/ui/equalizer.glade:389 #, fuzzy msgid "Apply APO Preset" msgstr "Preset" #: data/ui/equalizer_band.glade:64 msgid "Bell" msgstr "Bell" #: data/ui/equalizer_band.glade:65 #, fuzzy msgid "High Pass" msgstr "High Pass" #: data/ui/equalizer_band.glade:66 msgid "High Shelf" msgstr "High Shelf" #: data/ui/equalizer_band.glade:67 #, fuzzy msgid "Low Pass" msgstr "Pass Rendah" #: data/ui/equalizer_band.glade:68 msgid "Low Shelf" msgstr "Low Shelf" #: data/ui/equalizer_band.glade:69 msgid "Notch" msgstr "" #: data/ui/equalizer_band.glade:70 data/ui/filter.glade:427 msgid "Resonance" msgstr "Resonansi" #: data/ui/equalizer_band.glade:71 #, fuzzy msgid "All Pass" msgstr "Pass Rendah" #: data/ui/equalizer_band.glade:96 msgid "RLC (BT)" msgstr "" #: data/ui/equalizer_band.glade:97 msgid "RLC (MT)" msgstr "" #: data/ui/equalizer_band.glade:98 msgid "BWC (BT)" msgstr "" #: data/ui/equalizer_band.glade:99 msgid "BWC (MT)" msgstr "" #: data/ui/equalizer_band.glade:100 msgid "LRX (BT)" msgstr "" #: data/ui/equalizer_band.glade:101 msgid "LRX (MT)" msgstr "" #: data/ui/equalizer_band.glade:102 msgid "APO (DR)" msgstr "" #: data/ui/equalizer_band.glade:115 msgid "Slope" msgstr "Besar Lembah" #: data/ui/equalizer_band.glade:203 msgid "Quality" msgstr "Kualitas" #: data/ui/equalizer_band.glade:253 msgid "Width" msgstr "Lebar" #: data/ui/equalizer_band.glade:304 data/ui/multiband_compressor.glade:593 #: data/ui/multiband_compressor.glade:971 #: data/ui/multiband_compressor.glade:1350 #: data/ui/multiband_compressor.glade:1729 data/ui/multiband_gate.glade:617 #: data/ui/multiband_gate.glade:1028 data/ui/multiband_gate.glade:1441 #: data/ui/multiband_gate.glade:1854 msgid "Solo" msgstr "Solo" #: data/ui/equalizer_preset_row.glade:39 data/ui/irs_row.glade:44 msgid "Apply" msgstr "Terapkan" #: data/ui/exciter.glade:116 msgid "Exciter" msgstr "Penguat Frekuensi Tinggi" #: data/ui/exciter.glade:472 data/ui/maximizer.glade:254 msgid "Ceiling" msgstr "Langit-langit" #: data/ui/filter.glade:97 msgid "Filter" msgstr "Filter" #: data/ui/filter.glade:147 msgid "Muted" msgstr "Dibungkam" #: data/ui/filter.glade:159 data/ui/reverb.glade:233 msgid "Disco" msgstr "Disko" #: data/ui/filter.glade:171 msgid "Distant Headphones" msgstr "Headphone Berjarak" #: data/ui/filter.glade:360 msgid "12dB/oct Lowpass" msgstr "Lowpass 12dB/oktaf" #: data/ui/filter.glade:361 msgid "24dB/oct Lowpass" msgstr "Lowpass 24dB/oktaf" #: data/ui/filter.glade:362 msgid "36dB/oct Lowpass" msgstr "Lowpass 36dB/oktaf" #: data/ui/filter.glade:363 msgid "12dB/oct Highpass" msgstr "Highpass 12dB/oktaf" #: data/ui/filter.glade:364 msgid "24dB/oct Highpass" msgstr "Highpass 24dB/oktaf" #: data/ui/filter.glade:365 msgid "36dB/oct Highpass" msgstr "Highpass 36dB/oktaf" #: data/ui/filter.glade:366 msgid "6dB/oct Bandpass" msgstr "Bandpass 6dB/oktaf" #: data/ui/filter.glade:367 msgid "12dB/oct Bandpass" msgstr "Bandpass 12dB/oktaf" #: data/ui/filter.glade:368 msgid "18dB/oct Bandpass" msgstr "Bandpass 18dB/oktaf" #: data/ui/filter.glade:369 msgid "6dB/oct Bandreject" msgstr "Bandreject 6dB/oktaf" #: data/ui/filter.glade:370 msgid "12dB/oct Bandreject" msgstr "Bandpass 12dB/oktaf" #: data/ui/filter.glade:371 msgid "18dB/oct Bandreject" msgstr "Bandpass 18dB/oktaf" #: data/ui/filter.glade:460 msgid "Inertia" msgstr "Kelembaman" #: data/ui/general_settings.glade:58 msgid "Start Service at Login" msgstr "Mulai Layanan Saat Startup" #: data/ui/general_settings.glade:82 msgid "Process All Outputs" msgstr "Proses Semua Output" #: data/ui/general_settings.glade:94 msgid "Process All Inputs" msgstr "Proses Semua Input" #: data/ui/general_settings.glade:130 msgid "Use Dark Theme" msgstr "Gunakan Tema Gelap" #: data/ui/general_settings.glade:158 data/ui/general_settings.glade:220 msgid "Niceness" msgstr "Proritas Sempurna" #: data/ui/general_settings.glade:159 msgid "Real Time" msgstr "Waktu Real Time" #: data/ui/general_settings.glade:160 msgid "None" msgstr "Biarkan" #: data/ui/general_settings.glade:208 msgid "Priority Type" msgstr "Atur Prioritas" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "Atur Prioritas" #: data/ui/general_settings.glade:244 msgid "Activity Timeout" msgstr "" #: data/ui/general_settings.glade:325 msgid "About" msgstr "Tentang PulseEffects" #: data/ui/gate.glade:97 msgid "Gate" msgstr "Gate" #: data/ui/gate.glade:330 #, fuzzy msgid "Maximum Gain Reduction" msgstr "Pengurangan Kuatan" #: data/ui/gate.glade:379 msgid "Stereo Link" msgstr "Penautan Stereo" #: data/ui/gate.glade:393 msgid "Average" msgstr "Rata-Rata" #: data/ui/gate.glade:394 msgid "Maximum" msgstr "Maksimal" #: data/ui/gate.glade:632 #, fuzzy msgid "Input Level" msgstr "Pembatas Masukan" #: data/ui/gate.glade:864 data/ui/multiband_gate.glade:911 #: data/ui/multiband_gate.glade:1323 data/ui/multiband_gate.glade:1736 #: data/ui/multiband_gate.glade:2149 msgid "Gating" msgstr "Gating" #: data/ui/limiter.glade:96 data/ui/webrtc.glade:612 msgid "Limiter" msgstr "Pembatas" #: data/ui/limiter.glade:266 msgid "Automatic Smoothing Control" msgstr "" #: data/ui/limiter.glade:278 msgid "Automatic Leveling" msgstr "" #: data/ui/limiter.glade:308 msgid "Limit" msgstr "Batas" #: data/ui/limiter.glade:409 msgid "Oversampling" msgstr "Peningkat Sampling" #: data/ui/limiter.glade:447 msgid "ASC" msgstr "ASC" #: data/ui/limiter.glade:595 msgid "Attenuation" msgstr "Atenuasi" #: data/ui/loudness.glade:90 msgid "Loudness Compensator" msgstr "" #: data/ui/loudness.glade:328 msgid "Standard" msgstr "" #: data/ui/loudness.glade:341 msgid "Flat" msgstr "" #: data/ui/loudness.glade:342 msgid "ISO226-2003" msgstr "" #: data/ui/loudness.glade:343 msgid "Fletcher-Munson" msgstr "" #: data/ui/loudness.glade:344 msgid "Robinson-Dadson" msgstr "" #: data/ui/loudness.glade:370 #, fuzzy msgid "FFT Size" msgstr "Ukuran Bingkai" #: data/ui/maximizer.glade:95 msgid "Maximizer" msgstr "Pemaksimal Gain" #: data/ui/maximizer.glade:386 msgid "Gain Reduction" msgstr "Pengurangan Kuatan" #: data/ui/multiband_compressor.glade:139 msgid "Multiband Compressor" msgstr "Kompresor Multiband" #: data/ui/multiband_compressor.glade:426 data/ui/multiband_gate.glade:450 msgid "LR4" msgstr "LR4" #: data/ui/multiband_compressor.glade:427 data/ui/multiband_gate.glade:451 msgid "LR8" msgstr "LR8" #: data/ui/multiband_compressor.glade:441 data/ui/multiband_gate.glade:465 msgid "Split 1/2" msgstr "Split 1/2" #: data/ui/multiband_compressor.glade:454 data/ui/multiband_gate.glade:478 msgid "Split 2/3" msgstr "Split 2/3" #: data/ui/multiband_compressor.glade:467 data/ui/multiband_gate.glade:491 msgid "Split 3/4" msgstr "Split 3/4" #: data/ui/multiband_compressor.glade:854 #: data/ui/multiband_compressor.glade:1232 #: data/ui/multiband_compressor.glade:1611 #: data/ui/multiband_compressor.glade:1990 msgid "Compression" msgstr "Kompresi" #: data/ui/multiband_compressor.glade:937 data/ui/multiband_gate.glade:994 msgid "Sub Band" msgstr "Band Sub" #: data/ui/multiband_compressor.glade:1315 data/ui/multiband_gate.glade:1406 msgid "Low Band" msgstr "Band Rendah" #: data/ui/multiband_compressor.glade:1694 data/ui/multiband_gate.glade:1819 msgid "Mid Band" msgstr "Band Tengah" #: data/ui/multiband_compressor.glade:2073 data/ui/multiband_gate.glade:2232 msgid "High Band" msgstr "Band Tinggi" #: data/ui/multiband_gate.glade:139 msgid "Multiband Gate" msgstr "Multiband Gate" #: data/ui/pitch.glade:102 msgid "Pitch" msgstr "Nada" #: data/ui/pitch.glade:270 msgid "Cents" msgstr "Sen" #: data/ui/pitch.glade:300 msgid "Semitones" msgstr "Seminada" #: data/ui/pitch.glade:330 msgid "Octaves" msgstr "Oktav" #: data/ui/pitch.glade:360 msgid "Crispness" msgstr "Kerenyahan" #: data/ui/pitch.glade:402 msgid "Faster" msgstr "Lebih Cepat" #: data/ui/pitch.glade:414 msgid "Preserve Formant" msgstr "Jaga Bentuk" #: data/ui/preset_row.glade:55 msgid "Load" msgstr "" #: data/ui/preset_row.glade:70 msgid "Save current settings to this preset file" msgstr "Simpan Setelan Saat Ini Ke Berkas Preset" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "Hapus Berkas Preset Ini" #: data/ui/preset_row.glade:98 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" #: data/ui/presets_menu.glade:81 data/ui/presets_menu.glade:182 #: src/presets_menu_ui.cpp:129 msgid "Import Presets" msgstr "Muat Preset" #: data/ui/pulse_info.glade:77 msgid "Version" msgstr "" #: data/ui/pulse_info.glade:104 #, fuzzy msgid "Default Sink" msgstr "Aturan Bawaan" #: data/ui/pulse_info.glade:116 #, fuzzy msgid "Default Source" msgstr "Aturan Bawaan" #: data/ui/pulse_info.glade:158 msgid "Protocol" msgstr "" #: data/ui/pulse_info.glade:185 msgid "Default Sample Format" msgstr "" #: data/ui/pulse_info.glade:212 msgid "Default Sampling Rate" msgstr "" #: data/ui/pulse_info.glade:266 #, fuzzy msgid "Channel Mapping" msgstr "Total Kanal" #: data/ui/pulse_info.glade:291 msgid "Server" msgstr "" #: data/ui/pulse_info.glade:336 msgid "Modules" msgstr "" #: data/ui/pulse_info.glade:382 #, fuzzy msgid "Clients" msgstr "Sen" #: data/ui/pulse_info.glade:446 msgid "File" msgstr "" #: data/ui/pulse_info.glade:456 #, fuzzy msgid "Configuration" msgstr "Durasi" #: data/ui/pulse_info.glade:489 #, fuzzy msgid "Resamplers" msgstr "Modus Penyampling" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:403 msgid "Use Default" msgstr "Gunakan Aturan Bawaan" #: data/ui/pulse_settings.glade:147 data/ui/pulse_settings.glade:452 msgid "Pipeline Input" msgstr "" #: data/ui/pulse_settings.glade:247 data/ui/pulse_settings.glade:552 msgid "Pipeline Output" msgstr "" #: data/ui/pulse_settings.glade:347 data/ui/pulse_settings.glade:652 msgid "Block Size" msgstr "Ukuran Blok" #: data/ui/reverb.glade:130 msgid "Reverberation" msgstr "Penggemaan" #: data/ui/reverb.glade:181 msgid "Ambience" msgstr "Suasana" #: data/ui/reverb.glade:194 msgid "Empty Walls" msgstr "Tembok Kosong" #: data/ui/reverb.glade:207 msgid "Room" msgstr "Ruangan" #: data/ui/reverb.glade:220 msgid "Large Empty Hall" msgstr "Aula Besar Kosong" #: data/ui/reverb.glade:246 msgid "Large Occupied Hall" msgstr "Aula Besar Terisi Penuh" #: data/ui/reverb.glade:453 msgid "Pre Delay" msgstr "Pra Tunda" #: data/ui/reverb.glade:465 msgid "Decay Time" msgstr "Waktu Decay" #: data/ui/reverb.glade:531 msgid "Dry" msgstr "Dry" #: data/ui/reverb.glade:563 msgid "Bass Cut" msgstr "Potong Bass" #: data/ui/reverb.glade:615 msgid "Treble Cut" msgstr "Potong Treble" #: data/ui/reverb.glade:660 msgid "Diffusion" msgstr "Difusi" #: data/ui/reverb.glade:672 msgid "Room Size" msgstr "Ukuran Ruangan" #: data/ui/reverb.glade:684 msgid "Small" msgstr "Kecil" #: data/ui/reverb.glade:685 msgid "Medium" msgstr "Sedang" #: data/ui/reverb.glade:686 msgid "Large" msgstr "Besar" #: data/ui/reverb.glade:687 msgid "Tunnel" msgstr "Terowongan" #: data/ui/reverb.glade:688 msgid "Large/smooth" msgstr "Besar/Halus" #: data/ui/reverb.glade:689 msgid "Experimental" msgstr "Eksperimental" #: data/ui/reverb.glade:702 msgid "High Frequency Damping" msgstr "Pembasahan Frekuensi Tinggi" #: data/ui/spectrum_settings.glade:77 #, fuzzy msgid "Show Spectrum" msgstr "Spektrum" #: data/ui/spectrum_settings.glade:89 msgid "Fill" msgstr "Spektrum Batangan" #: data/ui/spectrum_settings.glade:125 msgid "Border" msgstr "" #: data/ui/spectrum_settings.glade:149 msgid "Use Custom Color" msgstr "Gunakan Warna Kustom" #: data/ui/spectrum_settings.glade:173 msgid "Use Gradient" msgstr "Terapkan Gradien warna" #: data/ui/spectrum_settings.glade:315 msgid "Points" msgstr "Titik" #: data/ui/spectrum_settings.glade:327 msgid "Height" msgstr "Tinggi" #: data/ui/spectrum_settings.glade:339 #, fuzzy msgid "Line Width" msgstr "Lebar" #: data/ui/spectrum_settings.glade:351 msgid "Sampling" msgstr "Atur Sampling" #: data/ui/spectrum_settings.glade:363 #, fuzzy msgid "Minimum Frequency" msgstr "Frekuensi" #: data/ui/spectrum_settings.glade:375 #, fuzzy msgid "Maximum Frequency" msgstr "Frekuensi" #: data/ui/spectrum_settings.glade:410 #, fuzzy msgid "Spectrum Type" msgstr "Spektrum" #: data/ui/spectrum_settings.glade:423 msgid "Bars" msgstr "Batang" #: data/ui/spectrum_settings.glade:424 msgid "Lines" msgstr "" #: data/ui/spectrum_settings.glade:437 msgid "Spectrum Color" msgstr "Warna Spektrum" #: data/ui/spectrum_settings.glade:449 msgid "Gradient Color" msgstr "Warna Gradien" #: data/ui/spectrum_settings.glade:461 msgid "Axis Color" msgstr "" #: data/ui/stereo_tools.glade:108 msgid "Stereo Tools" msgstr "Pengolah Stereo" #: data/ui/stereo_tools.glade:334 data/ui/stereo_tools.glade:775 msgid "Balance" msgstr "Keseimbangan" #: data/ui/stereo_tools.glade:365 msgid "S/C Level" msgstr "Level Sisi/Tengah" #: data/ui/stereo_tools.glade:406 msgid "Softclip" msgstr "Kliping Lunak" #: data/ui/stereo_tools.glade:452 msgid "Side Level" msgstr "Volume Kanal Sisi" #: data/ui/stereo_tools.glade:503 msgid "Side Balance" msgstr "Keseimbangan Sisi" #: data/ui/stereo_tools.glade:535 msgid "Middle Level" msgstr "Volume Kanal Tengah" #: data/ui/stereo_tools.glade:547 msgid "Middle Panorama" msgstr "Panorama Kanal Tengah" #: data/ui/stereo_tools.glade:604 msgid "LR > LR (Stereo Default)" msgstr "Kiri-Kanan > Kiri-Kanan (Stereo Standar)" #: data/ui/stereo_tools.glade:605 msgid "LR > MS (Stereo to Mid-Side)" msgstr "Kiri-Kanan > Tengah (Stereo ke Sisi Tengah)" #: data/ui/stereo_tools.glade:606 msgid "MS > LR (Mid-Side to Stereo)" msgstr "Tengah > Kiri-Kanan (Sisi Tengah ke Stereo)" #: data/ui/stereo_tools.glade:607 msgid "LR > LL (Mono Left Channel)" msgstr "Kiri-Kanan > Kiri-Kiri (Kanal Kiri Mono)" #: data/ui/stereo_tools.glade:608 msgid "LR > RR (Mono Right Channel)" msgstr "Kiri-Kanan > Kanan-kanan (Kanal Kanan Mono)" #: data/ui/stereo_tools.glade:609 msgid "LR > L+R (Mono Sum L+R)" msgstr "Kiri-Kanan > Kiri+Kanan (Kiri Mono + Kanan Mono)" #: data/ui/stereo_tools.glade:610 msgid "LR > RL (Stereo Flip Channels)" msgstr "Kiri-Kanan > Kanan-Kiri (Pembalikan Setereo)" #: data/ui/stereo_tools.glade:627 msgid "Stereo Matrix" msgstr "Matriks Stereo" #: data/ui/stereo_tools.glade:668 data/ui/stereo_tools.glade:709 msgid "Invert Phase" msgstr "Balikkan Phase" #: data/ui/stereo_tools.glade:806 msgid "Delay L/R" msgstr "Penundaan Kiri/Kanan" #: data/ui/stereo_tools.glade:839 msgid "Stereo Base" msgstr "Basis Stereo" #: data/ui/stereo_tools.glade:871 msgid "Stereo Phase" msgstr "Phase Stereo" #: data/ui/webrtc.glade:96 msgid "WebRTC" msgstr "" #: data/ui/webrtc.glade:256 data/ui/webrtc.glade:389 data/ui/webrtc.glade:460 #: data/ui/webrtc.glade:648 msgid "Enable" msgstr "Hidupkan" #: data/ui/webrtc.glade:279 msgid "Extended Filter" msgstr "Filter Diperluas" #: data/ui/webrtc.glade:292 msgid "High Pass Filter" msgstr "Filter High Pass" #: data/ui/webrtc.glade:309 data/ui/webrtc.glade:425 data/ui/webrtc.glade:698 msgid "Low" msgstr "Rendah" #: data/ui/webrtc.glade:310 data/ui/webrtc.glade:426 data/ui/webrtc.glade:699 msgid "Moderate" msgstr "Sedang" #: data/ui/webrtc.glade:311 data/ui/webrtc.glade:427 data/ui/webrtc.glade:700 msgid "High" msgstr "Tinggi" #: data/ui/webrtc.glade:324 data/ui/webrtc.glade:412 #, fuzzy msgid "Suppression Level" msgstr "Tingkat Supresi" #: data/ui/webrtc.glade:361 msgid "Delay Agnostic" msgstr "Penundaan Agnosti" #: data/ui/webrtc.glade:375 msgid "Echo Canceller" msgstr "Penghilang Gema" #: data/ui/webrtc.glade:428 msgid "Very High" msgstr "Sangat Tinggi" #: data/ui/webrtc.glade:445 msgid "Noise Suppressor" msgstr "Supresor Derau" #: data/ui/webrtc.glade:496 msgid "Adaptive Digital" msgstr "Digital Adaptif" #: data/ui/webrtc.glade:497 msgid "Fixed Digital" msgstr "Digital Tetap" #: data/ui/webrtc.glade:514 msgid "Gain Controller" msgstr "Pengatur Angkatan" #: data/ui/webrtc.glade:540 msgid "Target Level" msgstr "Target Tingkat" #: data/ui/webrtc.glade:572 msgid "Maximum Gain" msgstr "Angkatan Maksimal" #: data/ui/webrtc.glade:672 msgid "Detection Likelihood" msgstr "Lacak Keberadaan Vokal" #: data/ui/webrtc.glade:684 msgid "Frame Size" msgstr "Ukuran Bingkai" #: data/ui/webrtc.glade:697 msgid "Very Low" msgstr "Sangat Rendah" #: data/ui/webrtc.glade:737 msgid "Voice Detector" msgstr "Pelacak Vokal" #: data/ui/rnnoise.glade:90 #, fuzzy msgid "Noise Reduction" msgstr "Pengurangan Kuatan" #: data/ui/rnnoise.glade:242 #, fuzzy msgid "Import Model" msgstr "Muat Impuls" #: data/ui/rnnoise.glade:246 #, fuzzy msgid "Import Model File" msgstr "Muat Berkas Impuls" #: data/ui/rnnoise.glade:311 #, fuzzy msgid "Active Model" msgstr "Modus Agresif" #: data/ui/rnnoise.glade:324 msgid "Standard RNNoise Model" msgstr "" #: src/app_info_ui.cpp:120 msgid "paused" msgstr "terjeda" #: src/app_info_ui.cpp:122 msgid "playing" msgstr "memutar" #: src/application.cpp:38 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "Tutup PulseEffects. Berguna Ketika Berjalan dalam Modus Layanan." #: src/application.cpp:40 msgid "Show available presets." msgstr "Tampilkan Preset Tersedia." #: src/application.cpp:43 msgid "Load a preset. Example: pulseeffects -l music" msgstr "Muat Preset. Misalkan: pulseeffects -l music" #: src/application.cpp:45 msgid "Reset PulseEffects." msgstr "Atur Ulang PulseEffects" #: src/application.cpp:48 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "" #: src/application.cpp:50 msgid "Hide the Window." msgstr "" #: src/application.cpp:284 #, fuzzy msgid "Output Presets: " msgstr "Preset Output:" #: src/application.cpp:292 #, fuzzy msgid "Input Presets: " msgstr "Preset Input" #: src/blocklist_settings_ui.cpp:191 msgid "Blocklist" msgstr "Daftar Blokir" #: src/calibration_ui.cpp:198 msgid "Calibration Microphone" msgstr "Kalibrasikan Mikrofon" #: src/convolver_ui.cpp:281 msgid "Import Impulse File" msgstr "Muat Berkas Impuls" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Open" msgstr "Buka" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Cancel" msgstr "Batal" #: src/convolver_ui.cpp:318 src/convolver_ui.cpp:319 src/convolver_ui.cpp:321 msgid "Failed" msgstr "Gagal" #: src/convolver_ui.cpp:323 msgid "Could Not Load The Impulse File" msgstr "Tidak dapat Memuat Berkas Impuls" #: src/equalizer_ui.cpp:380 msgid "infinity" msgstr "Tak Terbatas" #: src/equalizer_ui.cpp:738 #, fuzzy msgid "Import APO Preset File" msgstr "Muat Preset" #: src/equalizer_ui.cpp:743 #, fuzzy msgid "APO Presets" msgstr "Preset" #: src/general_settings_ui.cpp:149 msgid "General" msgstr "Umum" #: src/pulse_settings_ui.cpp:168 msgid "Pulseaudio" msgstr "Pulseaudio" #, fuzzy #~ msgid "Import APO Presets" #~ msgstr "Muat Preset" #~ msgid "Input Gain" #~ msgstr "Gain Input" #, fuzzy #~ msgid "Output Gain" #~ msgstr "Gain Input" #, fuzzy #~ msgid "Gain Detection" #~ msgstr "Pengurangan Kuatan" #~ msgid "Scale" #~ msgstr "Skala" #~ msgid "Exponent" #~ msgstr "Eksponen" easyeffects-4.8.7/po/it_IT.po000066400000000000000000001255671424023573300160440ustar00rootroot00000000000000# Italian translation file for PulseEffects # Copyright (C) 2018 # This file is distributed under the same license as the PulseEffects package. # Matteo Iervasi , 2018. # Gianluca Boiano , 2018. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-14 23:58+0100\n" "PO-Revision-Date: 2019-03-28 17:38+0100\n" "Last-Translator: Gianluca Boiano \n" "Language-Team: \n" "Language: it_IT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Translator: Giusy Digital\n" "Translator: Matteo Iervasi \n" "X-Generator: Poedit 2.2.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 data/ui/application.glade:61 msgid "PulseEffects" msgstr "PulseEffects" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Effetti Audio per Applicazioni PulseAudio" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Wellington Wallace" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects è uno strumento avanzato di manipolazione dell'audio. Include " "diversi plugin tra cui un equalizzatore, un limitatore, un compressore e uno " "strumento per il riverbero. È dotato inoltre di un analizzatore di spettro." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "Utilizzando il server audio predefinito PulseAudio, PulseEffects funzionerà " "con quasi tutte le applicazione installate. Le applicazioni supportate sono " "mostrate nella finestra principale dove si possono abilitare individualmente." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Oltre a manipolare il suono in uscita, PulseEffects è in grado di applicare " "effetti ad un dispositivo di input, come un microfono. È utile, per esempio, " "nelle registrazioni audio e nelle conversazioni vocali." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "All'avvio di PulseEffects verrà caricata la configurazione usata nell'ultima " "sessione. È anche possibile salvare tutte le impostazioni correnti in file " "di profili." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "Imposta il volume e abilita/disabilita effetti" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "Include un equalizzatore con profili preesistenti" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Limitatore Ingresso" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:52 #: data/ui/compressor.glade:110 data/ui/compressor.glade:589 #: data/ui/webrtc.glade:633 msgid "Compressor" msgstr "Compressore" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Calibrazione" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "Equalizzatore, Compressore e Altri Effetti Audio" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "limitatore;compressore;riverbero;equalizzatore;autovolume;" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:44 #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:47 msgid "\"Presets\"" msgstr "\"Profili\"" #: data/ui/about.glade.in:11 msgid "Audio effects for PulseAudio applications" msgstr "Effetti audio per applicazioni PulseAudio" #: data/ui/app_button_row.glade:49 msgid "Applications" msgstr "Applicazioni" #: data/ui/app_info.glade:203 msgid "Add to Blocklist" msgstr "Aggiungi ad App Escluse" #: data/ui/app_info.glade:239 msgid "Format" msgstr "Formato" #: data/ui/app_info.glade:264 data/ui/convolver.glade:348 msgid "Rate" msgstr "Frequenza" #: data/ui/app_info.glade:289 data/ui/pulse_info.glade:239 #: data/ui/stereo_tools.glade:756 msgid "Channels" msgstr "Canali" #: data/ui/app_info.glade:314 msgid "Resampler" msgstr "Ricampionamento" #: data/ui/app_info.glade:339 data/ui/pulse_settings.glade:159 #: data/ui/pulse_settings.glade:259 data/ui/pulse_settings.glade:464 #: data/ui/pulse_settings.glade:564 msgid "Buffer" msgstr "Buffer" #: data/ui/app_info.glade:364 data/ui/pulse_settings.glade:190 #: data/ui/pulse_settings.glade:290 data/ui/pulse_settings.glade:476 #: data/ui/pulse_settings.glade:576 msgid "Latency" msgstr "Latenza" #: data/ui/app_info.glade:389 msgid "State" msgstr "Stato" #: data/ui/application.glade:142 src/calibration_ui.cpp:64 #: src/calibration_ui.cpp:191 msgid "Test Signals" msgstr "Segnali di Test" #: data/ui/application.glade:157 msgid "Global Bypass" msgstr "Bypass Globale" #: data/ui/application.glade:172 data/ui/equalizer.glade:331 #: data/ui/general_settings.glade:289 msgid "Settings" msgstr "Impostazioni" #: data/ui/application.glade:194 msgid "Help" msgstr "Aiuto" #: data/ui/application.glade:217 data/ui/crossfeed.glade:240 #: data/ui/equalizer.glade:403 data/ui/filter.glade:344 #: data/ui/reverb.glade:401 src/presets_menu_ui.cpp:133 #: src/presets_menu_ui.cpp:285 src/presets_menu_ui.cpp:286 #: src/presets_menu_ui.cpp:303 src/presets_menu_ui.cpp:304 msgid "Presets" msgstr "Profili" #: data/ui/autogain.glade:90 msgid "Auto Gain" msgstr "Auto Guadagno" #: data/ui/autogain.glade:161 data/ui/bass_enhancer.glade:167 #: data/ui/compressor.glade:214 data/ui/convolver.glade:218 #: data/ui/crossfeed.glade:136 data/ui/crystalizer.glade:134 #: data/ui/deesser.glade:182 data/ui/delay.glade:144 #: data/ui/equalizer.glade:450 data/ui/equalizer_band.glade:187 #: data/ui/equalizer_band.glade:230 data/ui/exciter.glade:167 #: data/ui/filter.glade:243 data/ui/general_settings.glade:298 #: data/ui/gate.glade:172 data/ui/limiter.glade:166 data/ui/loudness.glade:174 #: data/ui/maximizer.glade:139 data/ui/multiband_compressor.glade:307 #: data/ui/multiband_gate.glade:331 data/ui/pitch.glade:158 #: data/ui/reverb.glade:299 data/ui/stereo_tools.glade:194 #: data/ui/webrtc.glade:141 data/ui/rnnoise.glade:139 msgid "Reset" msgstr "Reset" #: data/ui/autogain.glade:185 data/ui/rnnoise.glade:163 msgid "Based on" msgstr "Basato su" #: data/ui/autogain.glade:262 msgid "Reset History" msgstr "Reset Cronologia" #: data/ui/autogain.glade:274 msgid "Detect Silence" msgstr "Rilevazione Silenzio" #: data/ui/autogain.glade:286 msgid "Use Geometric Mean" msgstr "Usa Media Geometrica" #: data/ui/autogain.glade:325 msgid "Target" msgstr "Livello" #: data/ui/autogain.glade:374 data/ui/autogain.glade:779 msgid "Momentary" msgstr "Momentaneo" #: data/ui/autogain.glade:434 msgid "Weights" msgstr "Ampiezze" #: data/ui/autogain.glade:448 data/ui/autogain.glade:792 msgid "Short Term" msgstr "Breve Termine" #: data/ui/autogain.glade:497 data/ui/autogain.glade:805 msgid "Integrated" msgstr "Integrato" #: data/ui/autogain.glade:564 data/ui/autogain.glade:1076 #: data/ui/bass_enhancer.glade:596 data/ui/compressor.glade:1086 #: data/ui/convolver.glade:575 data/ui/crossfeed.glade:391 #: data/ui/crystalizer.glade:250 data/ui/deesser.glade:783 #: data/ui/delay.glade:328 data/ui/equalizer.glade:682 #: data/ui/exciter.glade:596 data/ui/filter.glade:508 data/ui/gate.glade:689 #: data/ui/limiter.glade:501 data/ui/loudness.glade:238 #: data/ui/loudness.glade:431 data/ui/maximizer.glade:358 #: data/ui/multiband_compressor.glade:2103 data/ui/multiband_gate.glade:2262 #: data/ui/pitch.glade:450 data/ui/presets_menu.glade:238 #: data/ui/reverb.glade:753 data/ui/stereo_tools.glade:427 #: data/ui/stereo_tools.glade:931 data/ui/webrtc.glade:780 #: data/ui/rnnoise.glade:362 msgid "Input" msgstr "Ingresso" #: data/ui/autogain.glade:577 data/ui/autogain.glade:1020 #: data/ui/bass_enhancer.glade:625 data/ui/compressor.glade:1099 #: data/ui/convolver.glade:588 data/ui/crossfeed.glade:405 #: data/ui/crystalizer.glade:263 data/ui/deesser.glade:797 #: data/ui/delay.glade:341 data/ui/equalizer.glade:695 #: data/ui/exciter.glade:625 data/ui/filter.glade:521 data/ui/gate.glade:703 #: data/ui/limiter.glade:636 data/ui/loudness.glade:271 #: data/ui/loudness.glade:445 data/ui/maximizer.glade:372 #: data/ui/multiband_compressor.glade:894 #: data/ui/multiband_compressor.glade:1272 #: data/ui/multiband_compressor.glade:1651 #: data/ui/multiband_compressor.glade:2030 #: data/ui/multiband_compressor.glade:2116 data/ui/multiband_gate.glade:951 #: data/ui/multiband_gate.glade:1363 data/ui/multiband_gate.glade:1776 #: data/ui/multiband_gate.glade:2189 data/ui/multiband_gate.glade:2275 #: data/ui/pitch.glade:463 data/ui/presets_menu.glade:137 #: data/ui/reverb.glade:766 data/ui/stereo_tools.glade:901 #: data/ui/stereo_tools.glade:944 data/ui/webrtc.glade:794 #: data/ui/rnnoise.glade:375 msgid "Output" msgstr "Uscita" #: data/ui/autogain.glade:899 msgid "Relative" msgstr "Relativo" #: data/ui/autogain.glade:912 data/ui/compressor.glade:1262 msgid "Gain" msgstr "Guadagno" #: data/ui/autogain.glade:980 msgid "Loudness" msgstr "Loudness" #: data/ui/autogain.glade:1034 msgid "Range" msgstr "Gamma" #: data/ui/bass_enhancer.glade:116 msgid "Bass Enhancer" msgstr "Enfasi Bassi" #: data/ui/bass_enhancer.glade:191 data/ui/compressor.glade:238 #: data/ui/crossfeed.glade:160 data/ui/deesser.glade:206 #: data/ui/delay.glade:168 data/ui/equalizer.glade:474 #: data/ui/exciter.glade:191 data/ui/filter.glade:267 data/ui/gate.glade:196 #: data/ui/limiter.glade:190 data/ui/loudness.glade:143 #: data/ui/maximizer.glade:163 data/ui/multiband_compressor.glade:331 #: data/ui/multiband_gate.glade:355 data/ui/pitch.glade:182 #: data/ui/reverb.glade:323 data/ui/stereo_tools.glade:218 #: data/ui/webrtc.glade:165 msgid "Provided by" msgstr "Fornito da" #: data/ui/bass_enhancer.glade:259 data/ui/compressor.glade:602 #: data/ui/deesser.glade:274 data/ui/exciter.glade:259 msgid "Listen" msgstr "Ascolta" #: data/ui/bass_enhancer.glade:302 data/ui/exciter.glade:303 msgid "3rd" msgstr "3a" #: data/ui/bass_enhancer.glade:315 data/ui/exciter.glade:316 msgid "2nd" msgstr "2a" #: data/ui/bass_enhancer.glade:327 data/ui/exciter.glade:328 msgid "Blend Harmonics" msgstr "Mix Armoniche" #: data/ui/bass_enhancer.glade:355 data/ui/exciter.glade:357 #: data/ui/reverb.glade:498 msgid "Amount" msgstr "Quantità" #: data/ui/bass_enhancer.glade:367 data/ui/bass_enhancer.glade:504 #: data/ui/exciter.glade:369 data/ui/exciter.glade:504 msgid "Harmonics" msgstr "Armoniche" #: data/ui/bass_enhancer.glade:379 data/ui/exciter.glade:381 msgid "Scope" msgstr "Soglia" #: data/ui/bass_enhancer.glade:472 msgid "Floor" msgstr "Limite Inferiore" #: data/ui/blocklist_settings.glade:52 data/ui/blocklist_settings.glade:155 #: data/ui/presets_menu.glade:65 data/ui/presets_menu.glade:166 msgid "Create Preset" msgstr "Crea Profilo" #: data/ui/blocklist_settings.glade:68 data/ui/blocklist_settings.glade:171 #: data/ui/presets_menu.glade:52 data/ui/presets_menu.glade:153 #: data/ui/pulse_info.glade:50 msgid "Name" msgstr "Nome" #: data/ui/blocklist_settings.glade:81 msgid "Reconnect the microphone to apply new changes made to the Blocklist" msgstr "Riconnetti il microfono per applicare le modifiche alle App Escluse" #: data/ui/blocklist_settings.glade:139 data/ui/pulse_settings.glade:383 msgid "Input Effects" msgstr "Effetti in Ingresso" #: data/ui/blocklist_settings.glade:230 msgid "Restart the player to apply new changes made to the Blocklist" msgstr "Riavvia il media player per applicare le modifiche alle App Escluse" #: data/ui/blocklist_settings.glade:242 data/ui/pulse_settings.glade:688 msgid "Output Effects" msgstr "Effetti in Uscita" #: data/ui/blocklist_settings.glade:265 msgid "Show Blocklisted Apps in Main Tab" msgstr "Mostra Applicazioni Escluse nella Scheda Principale" #: data/ui/calibration_signals.glade:32 msgid "Sine" msgstr "Sinusoidale" #: data/ui/calibration_signals.glade:33 msgid "Square" msgstr "Quadra" #: data/ui/calibration_signals.glade:34 msgid "Saw" msgstr "A Dente di Sega" #: data/ui/calibration_signals.glade:35 msgid "Triangle" msgstr "Triangolare" #: data/ui/calibration_signals.glade:36 msgid "Silence" msgstr "Silenzio" #: data/ui/calibration_signals.glade:37 msgid "White Noise" msgstr "Rumore bianco" #: data/ui/calibration_signals.glade:38 msgid "Pink Noise" msgstr "Rumore Rosa" #: data/ui/calibration_signals.glade:39 msgid "Sine Table" msgstr "Tabella sinusoidale" #: data/ui/calibration_signals.glade:40 msgid "Ticks" msgstr "Battiti" #: data/ui/calibration_signals.glade:41 msgid "Gaussian Noise" msgstr "Rumore Gaussiano" #: data/ui/calibration_signals.glade:42 msgid "Red Noise" msgstr "Rumore Rosso" #: data/ui/calibration_signals.glade:43 msgid "Blue Noise" msgstr "Rumore Blu" #: data/ui/calibration_signals.glade:44 msgid "Violet Noise" msgstr "Rumore Viola" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Volume" #: data/ui/calibration_signals.glade:135 data/ui/equalizer_band.glade:158 #: data/ui/filter.glade:394 msgid "Frequency" msgstr "Frequenza" #: data/ui/calibration_mic.glade:33 msgid "Window" msgstr "Finestra" #: data/ui/calibration_mic.glade:90 msgid "Measure Noise" msgstr "Misura Rumore" #: data/ui/calibration_mic.glade:119 msgid "Subtract Noise" msgstr "Sottrai Rumore" #: data/ui/compressor.glade:386 data/ui/deesser.glade:436 #: data/ui/gate.glade:498 data/ui/maximizer.glade:242 #: data/ui/multiband_compressor.glade:707 #: data/ui/multiband_compressor.glade:1085 #: data/ui/multiband_compressor.glade:1464 #: data/ui/multiband_compressor.glade:1843 data/ui/multiband_gate.glade:731 #: data/ui/multiband_gate.glade:1142 data/ui/multiband_gate.glade:1555 #: data/ui/multiband_gate.glade:1968 msgid "Threshold" msgstr "Soglia" #: data/ui/compressor.glade:420 data/ui/deesser.glade:448 #: data/ui/gate.glade:532 data/ui/multiband_compressor.glade:741 #: data/ui/multiband_compressor.glade:1119 #: data/ui/multiband_compressor.glade:1498 #: data/ui/multiband_compressor.glade:1877 data/ui/multiband_gate.glade:765 #: data/ui/multiband_gate.glade:1176 data/ui/multiband_gate.glade:1589 #: data/ui/multiband_gate.glade:2002 msgid "Ratio" msgstr "Rapporto" #: data/ui/compressor.glade:452 data/ui/gate.glade:564 #: data/ui/multiband_compressor.glade:773 #: data/ui/multiband_compressor.glade:1151 #: data/ui/multiband_compressor.glade:1530 #: data/ui/multiband_compressor.glade:1909 data/ui/multiband_gate.glade:797 #: data/ui/multiband_gate.glade:1208 data/ui/multiband_gate.glade:1621 #: data/ui/multiband_gate.glade:2034 msgid "Knee" msgstr "Curvatura" #: data/ui/compressor.glade:486 data/ui/deesser.glade:532 #: data/ui/gate.glade:598 data/ui/multiband_compressor.glade:807 #: data/ui/multiband_compressor.glade:1185 #: data/ui/multiband_compressor.glade:1564 #: data/ui/multiband_compressor.glade:1943 data/ui/multiband_gate.glade:831 #: data/ui/multiband_gate.glade:1242 data/ui/multiband_gate.glade:1655 #: data/ui/multiband_gate.glade:2068 msgid "Makeup" msgstr "Guadagno" #: data/ui/compressor.glade:520 data/ui/gate.glade:464 #: data/ui/limiter.glade:363 data/ui/maximizer.glade:266 #: data/ui/multiband_compressor.glade:673 #: data/ui/multiband_compressor.glade:1051 #: data/ui/multiband_compressor.glade:1430 #: data/ui/multiband_compressor.glade:1809 data/ui/multiband_gate.glade:697 #: data/ui/multiband_gate.glade:1108 data/ui/multiband_gate.glade:1521 #: data/ui/multiband_gate.glade:1934 msgid "Release" msgstr "Rilascio" #: data/ui/compressor.glade:532 data/ui/gate.glade:430 #: data/ui/multiband_compressor.glade:639 #: data/ui/multiband_compressor.glade:1017 #: data/ui/multiband_compressor.glade:1396 #: data/ui/multiband_compressor.glade:1775 data/ui/multiband_gate.glade:663 #: data/ui/multiband_gate.glade:1074 data/ui/multiband_gate.glade:1487 #: data/ui/multiband_gate.glade:1900 msgid "Attack" msgstr "Attacco" #: data/ui/compressor.glade:559 msgid "Downward" msgstr "Riduttiva" #: data/ui/compressor.glade:560 msgid "Upward" msgstr "Espansiva" #: data/ui/compressor.glade:573 msgid "Compression Mode" msgstr "Modalità di compressione" #: data/ui/compressor.glade:649 msgid "Pre-amplification" msgstr "Pre-amplificazione" #: data/ui/compressor.glade:683 msgid "Reactivity" msgstr "Reattività" #: data/ui/compressor.glade:716 data/ui/limiter.glade:375 msgid "Lookahead" msgstr "Lookahead" #: data/ui/compressor.glade:730 msgid "Feed-forward" msgstr "Prelievo in ingresso" #: data/ui/compressor.glade:731 msgid "Feed-back" msgstr "Prelievo in uscita" #: data/ui/compressor.glade:744 data/ui/equalizer_band.glade:51 msgid "Type" msgstr "Tipo" #: data/ui/compressor.glade:758 data/ui/deesser.glade:731 #: data/ui/gate.glade:303 data/ui/multiband_compressor.glade:611 #: data/ui/multiband_compressor.glade:989 #: data/ui/multiband_compressor.glade:1368 #: data/ui/multiband_compressor.glade:1747 data/ui/multiband_gate.glade:635 #: data/ui/multiband_gate.glade:1046 data/ui/multiband_gate.glade:1459 #: data/ui/multiband_gate.glade:1872 msgid "Peak" msgstr "Picco" #: data/ui/compressor.glade:759 data/ui/deesser.glade:730 #: data/ui/gate.glade:302 data/ui/multiband_compressor.glade:610 #: data/ui/multiband_compressor.glade:988 #: data/ui/multiband_compressor.glade:1367 #: data/ui/multiband_compressor.glade:1746 data/ui/multiband_gate.glade:634 #: data/ui/multiband_gate.glade:1045 data/ui/multiband_gate.glade:1458 #: data/ui/multiband_gate.glade:1871 msgid "RMS" msgstr "RMS" #: data/ui/compressor.glade:760 msgid "Low-Pass" msgstr "Passa Basso" #: data/ui/compressor.glade:761 msgid "Uniform" msgstr "Uniforme" #: data/ui/compressor.glade:774 data/ui/deesser.glade:702 #: data/ui/equalizer.glade:257 data/ui/equalizer_band.glade:84 #: data/ui/multiband_compressor.glade:412 data/ui/multiband_gate.glade:436 #: data/ui/stereo_tools.glade:591 data/ui/webrtc.glade:483 msgid "Mode" msgstr "Modalità" #: data/ui/compressor.glade:788 msgid "Middle" msgstr "Intermedia" #: data/ui/compressor.glade:789 msgid "Side" msgstr "Laterale" #: data/ui/compressor.glade:790 data/ui/delay.glade:247 #: data/ui/equalizer.glade:612 data/ui/stereo_tools.glade:655 msgid "Left" msgstr "Canale Sinistro" #: data/ui/compressor.glade:791 data/ui/delay.glade:280 #: data/ui/equalizer.glade:654 data/ui/stereo_tools.glade:724 msgid "Right" msgstr "Canale Destro" #: data/ui/compressor.glade:804 msgid "Source" msgstr "Sorgente" #: data/ui/compressor.glade:820 data/ui/compressor.glade:1274 msgid "Sidechain" msgstr "Sidechain" #: data/ui/compressor.glade:925 msgid "Relative Release Threshold" msgstr "Soglia di Rilascio Relativa" #: data/ui/compressor.glade:937 msgid "Boost Threshold" msgstr "Soglia di Incremento" #: data/ui/compressor.glade:949 msgid "High-pass Frequency" msgstr "Frequenza Passa-Alto" #: data/ui/compressor.glade:961 msgid "Low-pass Frequency" msgstr "Frequenza Passa-Basso" #: data/ui/compressor.glade:973 msgid "High-pass Filter Mode" msgstr "Filtro Passa-Alto" #: data/ui/compressor.glade:985 msgid "Low-pass Filter Mode" msgstr "Filtro Passa-Basso" #: data/ui/compressor.glade:999 data/ui/compressor.glade:1017 #: data/ui/equalizer_band.glade:63 msgid "Off" msgstr "Spento" #: data/ui/compressor.glade:1000 data/ui/compressor.glade:1018 msgid "12 dB/oct" msgstr "12 dB/ott" #: data/ui/compressor.glade:1001 data/ui/compressor.glade:1019 msgid "24 dB/oct" msgstr "24 dB/ott" #: data/ui/compressor.glade:1002 data/ui/compressor.glade:1020 msgid "36 dB/oct" msgstr "36 dB/ott" #: data/ui/compressor.glade:1043 msgid "Advanced" msgstr "Avanzate" #: data/ui/compressor.glade:1347 msgid "Curve" msgstr "Curva" #: data/ui/convolver.glade:90 msgid "Convolver" msgstr "Convolutore" #: data/ui/convolver.glade:125 msgid "Import Impulse" msgstr "Importa Impulso" #: data/ui/convolver.glade:129 msgid "Import Impulse Response File" msgstr "Importa File di Risposta Impulsiva" #: data/ui/convolver.glade:309 msgid "L" msgstr "S" #: data/ui/convolver.glade:323 msgid "R" msgstr "D" #: data/ui/convolver.glade:390 msgid "Duration" msgstr "Durata" #: data/ui/convolver.glade:402 msgid "Samples" msgstr "Campioni" #: data/ui/convolver.glade:435 src/convolver_ui.cpp:285 msgid "Impulse Response" msgstr "Risposta Impulsiva" #: data/ui/convolver.glade:458 msgid "Select the impulse Response File" msgstr "Seleziona il File di Risposta Impulsiva" #: data/ui/convolver.glade:477 src/spectrum_settings_ui.cpp:195 msgid "Spectrum" msgstr "Spettro" #: data/ui/convolver.glade:520 msgid "Stereo Width" msgstr "Ampiezza Stereo" #: data/ui/crossfeed.glade:104 msgid "Crossfeed" msgstr "Crossfeed" #: data/ui/crossfeed.glade:254 msgid "Jmeier" msgstr "Jmeier" #: data/ui/crossfeed.glade:266 data/ui/filter.glade:183 #: data/ui/reverb.glade:259 msgid "Default" msgstr "Predefinito" #: data/ui/crossfeed.glade:278 msgid "Cmoy" msgstr "Cmoy" #: data/ui/crossfeed.glade:308 msgid "Cutoff" msgstr "Taglio" #: data/ui/crossfeed.glade:341 msgid "Feed" msgstr "Feed" #: data/ui/crystalizer.glade:90 msgid "Crystalizer" msgstr "Crystalizer" #: data/ui/crystalizer.glade:200 msgid "Aggressive Mode" msgstr "Modalità Aggressiva" #: data/ui/crystalizer.glade:464 msgid "Before" msgstr "Prima" #: data/ui/crystalizer.glade:477 msgid "After" msgstr "Dopo" #: data/ui/crystalizer.glade:550 msgid "Loudness Range" msgstr "Gamma Loudness" #: data/ui/crystalizer_band.glade:28 data/ui/equalizer_band.glade:316 #: data/ui/stereo_tools.glade:680 data/ui/stereo_tools.glade:737 msgid "Mute" msgstr "Silenzia" #: data/ui/crystalizer_band.glade:40 data/ui/multiband_compressor.glade:580 #: data/ui/multiband_compressor.glade:958 #: data/ui/multiband_compressor.glade:1337 #: data/ui/multiband_compressor.glade:1716 data/ui/multiband_gate.glade:604 #: data/ui/multiband_gate.glade:1015 data/ui/multiband_gate.glade:1428 #: data/ui/multiband_gate.glade:1841 msgid "Bypass" msgstr "Bypass" #: data/ui/deesser.glade:125 msgid "Deesser" msgstr "Deesser" #: data/ui/deesser.glade:309 msgid "F1 Gain" msgstr "F1 Guadagno" #: data/ui/deesser.glade:321 msgid "F2 Level" msgstr "F2 Livello" #: data/ui/deesser.glade:333 msgid "F2 Peak Q" msgstr "F2 Picco Q" #: data/ui/deesser.glade:424 msgid "Laxity" msgstr "Lassità" #: data/ui/deesser.glade:585 msgid "F1 Split" msgstr "F1 Split" #: data/ui/deesser.glade:597 msgid "F2 Peak" msgstr "F2 Picco" #: data/ui/deesser.glade:690 data/ui/gate.glade:288 msgid "Detection" msgstr "Rilevamento" #: data/ui/deesser.glade:715 msgid "Wide" msgstr "Banda Larga" #: data/ui/deesser.glade:716 msgid "Split" msgstr "Split" #: data/ui/deesser.glade:959 data/ui/multiband_gate.glade:865 #: data/ui/multiband_gate.glade:1298 data/ui/multiband_gate.glade:1711 #: data/ui/multiband_gate.glade:2124 msgid "Reduction" msgstr "Riduzione" #: data/ui/deesser.glade:972 msgid "Detected" msgstr "Rilevato" #: data/ui/delay.glade:90 msgid "Delay" msgstr "Delay" #: data/ui/equalizer.glade:44 msgid "Equalizer" msgstr "Equalizzatore" #: data/ui/equalizer.glade:160 msgid "Flat Response" msgstr "Risposta Piatta" #: data/ui/equalizer.glade:175 msgid "Calculate Frequencies" msgstr "Calcola Frequenze" #: data/ui/equalizer.glade:213 msgid "Bands" msgstr "Bande" #: data/ui/equalizer.glade:269 msgid "IIR" msgstr "IIR" #: data/ui/equalizer.glade:270 msgid "FIR" msgstr "FIR" #: data/ui/equalizer.glade:271 msgid "FFT" msgstr "FFT" #: data/ui/equalizer.glade:304 msgid "Split Channels" msgstr "Separa Canali" #: data/ui/equalizer.glade:389 msgid "Apply APO Preset" msgstr "Applica Profilo APO" #: data/ui/equalizer_band.glade:64 msgid "Bell" msgstr "A Campana" #: data/ui/equalizer_band.glade:65 msgid "High Pass" msgstr "Passa Alto" #: data/ui/equalizer_band.glade:66 msgid "High Shelf" msgstr "Sopra Soglia" #: data/ui/equalizer_band.glade:67 msgid "Low Pass" msgstr "Passa Basso" #: data/ui/equalizer_band.glade:68 msgid "Low Shelf" msgstr "Sotto Soglia" #: data/ui/equalizer_band.glade:69 msgid "Notch" msgstr "Elimina Banda" #: data/ui/equalizer_band.glade:70 data/ui/filter.glade:427 msgid "Resonance" msgstr "Risonanza" #: data/ui/equalizer_band.glade:71 msgid "All Pass" msgstr "Passa Tutto" #: data/ui/equalizer_band.glade:96 msgid "RLC (BT)" msgstr "RLC (BT)" #: data/ui/equalizer_band.glade:97 msgid "RLC (MT)" msgstr "RLC (MT)" #: data/ui/equalizer_band.glade:98 msgid "BWC (BT)" msgstr "BWC (BT)" #: data/ui/equalizer_band.glade:99 msgid "BWC (MT)" msgstr "BWC (MT)" #: data/ui/equalizer_band.glade:100 msgid "LRX (BT)" msgstr "LRX (BT)" #: data/ui/equalizer_band.glade:101 msgid "LRX (MT)" msgstr "LRX (MT)" #: data/ui/equalizer_band.glade:102 msgid "APO (DR)" msgstr "APO (DR)" #: data/ui/equalizer_band.glade:115 msgid "Slope" msgstr "Pendenza" #: data/ui/equalizer_band.glade:203 msgid "Quality" msgstr "Qualità" #: data/ui/equalizer_band.glade:253 msgid "Width" msgstr "Ampiezza" #: data/ui/equalizer_band.glade:304 data/ui/multiband_compressor.glade:593 #: data/ui/multiband_compressor.glade:971 #: data/ui/multiband_compressor.glade:1350 #: data/ui/multiband_compressor.glade:1729 data/ui/multiband_gate.glade:617 #: data/ui/multiband_gate.glade:1028 data/ui/multiband_gate.glade:1441 #: data/ui/multiband_gate.glade:1854 msgid "Solo" msgstr "Isola" #: data/ui/equalizer_preset_row.glade:39 data/ui/irs_row.glade:44 msgid "Apply" msgstr "Applica" #: data/ui/exciter.glade:116 msgid "Exciter" msgstr "Exciter" #: data/ui/exciter.glade:472 data/ui/maximizer.glade:254 msgid "Ceiling" msgstr "Limite Superiore" #: data/ui/filter.glade:97 msgid "Filter" msgstr "Filtro" #: data/ui/filter.glade:147 msgid "Muted" msgstr "Silenziato" #: data/ui/filter.glade:159 data/ui/reverb.glade:233 msgid "Disco" msgstr "Disco" #: data/ui/filter.glade:171 msgid "Distant Headphones" msgstr "Cuffie Distanti" #: data/ui/filter.glade:360 msgid "12dB/oct Lowpass" msgstr "Passa Basso 12dB/ott" #: data/ui/filter.glade:361 msgid "24dB/oct Lowpass" msgstr "Passa Basso 24dB/ott" #: data/ui/filter.glade:362 msgid "36dB/oct Lowpass" msgstr "Passa Basso 36dB/ott" #: data/ui/filter.glade:363 msgid "12dB/oct Highpass" msgstr "Passa Alto 12dB/ott" #: data/ui/filter.glade:364 msgid "24dB/oct Highpass" msgstr "Passa Alto 24dB/ott" #: data/ui/filter.glade:365 msgid "36dB/oct Highpass" msgstr "Passa Alto 36dB/ott" #: data/ui/filter.glade:366 msgid "6dB/oct Bandpass" msgstr "Passa Banda 6dB/ott" #: data/ui/filter.glade:367 msgid "12dB/oct Bandpass" msgstr "Passa Banda 12dB/ott" #: data/ui/filter.glade:368 msgid "18dB/oct Bandpass" msgstr "Passa Banda 18dB/ott" #: data/ui/filter.glade:369 msgid "6dB/oct Bandreject" msgstr "Elimina Banda 6dB/ott" #: data/ui/filter.glade:370 msgid "12dB/oct Bandreject" msgstr "Elimina Banda 12dB/ott" #: data/ui/filter.glade:371 msgid "18dB/oct Bandreject" msgstr "Elimina Banda 18dB/ott" #: data/ui/filter.glade:460 msgid "Inertia" msgstr "Inerzia" #: data/ui/general_settings.glade:58 msgid "Start Service at Login" msgstr "Esegui Servizio all'Avvio" #: data/ui/general_settings.glade:82 msgid "Process All Outputs" msgstr "Processa Tutto in Uscita" #: data/ui/general_settings.glade:94 msgid "Process All Inputs" msgstr "Processa Tutto in Ingresso" #: data/ui/general_settings.glade:130 msgid "Use Dark Theme" msgstr "Usa Tema Scuro" #: data/ui/general_settings.glade:158 data/ui/general_settings.glade:220 msgid "Niceness" msgstr "Livello Nice" #: data/ui/general_settings.glade:159 msgid "Real Time" msgstr "Tempo Reale" #: data/ui/general_settings.glade:160 msgid "None" msgstr "Nessuna" #: data/ui/general_settings.glade:208 msgid "Priority Type" msgstr "Tipo Priorità" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "Valore Priorità" #: data/ui/general_settings.glade:244 msgid "Activity Timeout" msgstr "Timeout Attività" #: data/ui/general_settings.glade:325 msgid "About" msgstr "Info" #: data/ui/gate.glade:97 msgid "Gate" msgstr "Gate" #: data/ui/gate.glade:330 msgid "Maximum Gain Reduction" msgstr "Massima Riduzione Guadagno" #: data/ui/gate.glade:379 msgid "Stereo Link" msgstr "Relazione Canali" #: data/ui/gate.glade:393 msgid "Average" msgstr "Media" #: data/ui/gate.glade:394 msgid "Maximum" msgstr "Massima" #: data/ui/gate.glade:632 msgid "Input Level" msgstr "Livello in Ingresso" #: data/ui/gate.glade:864 data/ui/multiband_gate.glade:911 #: data/ui/multiband_gate.glade:1323 data/ui/multiband_gate.glade:1736 #: data/ui/multiband_gate.glade:2149 msgid "Gating" msgstr "Gating" #: data/ui/limiter.glade:96 data/ui/webrtc.glade:612 msgid "Limiter" msgstr "Limitatore" #: data/ui/limiter.glade:266 msgid "Automatic Smoothing Control" msgstr "Auto-Controllo Smussamento (ASC)" #: data/ui/limiter.glade:278 msgid "Automatic Leveling" msgstr "Livellamento Automatico" #: data/ui/limiter.glade:308 msgid "Limit" msgstr "Limite" #: data/ui/limiter.glade:409 msgid "Oversampling" msgstr "Sovracampionamento" #: data/ui/limiter.glade:447 msgid "ASC" msgstr "ASC" #: data/ui/limiter.glade:595 msgid "Attenuation" msgstr "Attenuazione" #: data/ui/loudness.glade:90 msgid "Loudness Compensator" msgstr "Bilanciamento Loudness" #: data/ui/loudness.glade:328 msgid "Standard" msgstr "Standard" #: data/ui/loudness.glade:341 msgid "Flat" msgstr "Flat" #: data/ui/loudness.glade:342 msgid "ISO226-2003" msgstr "ISO226-2003" #: data/ui/loudness.glade:343 msgid "Fletcher-Munson" msgstr "Fletcher-Munson" #: data/ui/loudness.glade:344 msgid "Robinson-Dadson" msgstr "Robinson-Dadson" #: data/ui/loudness.glade:370 msgid "FFT Size" msgstr "Dimensione FFT" #: data/ui/maximizer.glade:95 msgid "Maximizer" msgstr "Maximizer" #: data/ui/maximizer.glade:386 msgid "Gain Reduction" msgstr "Riduzione Guadagno" #: data/ui/multiband_compressor.glade:139 msgid "Multiband Compressor" msgstr "Compressore Multibanda" #: data/ui/multiband_compressor.glade:426 data/ui/multiband_gate.glade:450 msgid "LR4" msgstr "LR4" #: data/ui/multiband_compressor.glade:427 data/ui/multiband_gate.glade:451 msgid "LR8" msgstr "LR8" #: data/ui/multiband_compressor.glade:441 data/ui/multiband_gate.glade:465 msgid "Split 1/2" msgstr "Frequenza Split 1/2" #: data/ui/multiband_compressor.glade:454 data/ui/multiband_gate.glade:478 msgid "Split 2/3" msgstr "Frequenza Split 2/3" #: data/ui/multiband_compressor.glade:467 data/ui/multiband_gate.glade:491 msgid "Split 3/4" msgstr "Frequenza Split 3/4" #: data/ui/multiband_compressor.glade:854 #: data/ui/multiband_compressor.glade:1232 #: data/ui/multiband_compressor.glade:1611 #: data/ui/multiband_compressor.glade:1990 msgid "Compression" msgstr "Compressione" #: data/ui/multiband_compressor.glade:937 data/ui/multiband_gate.glade:994 msgid "Sub Band" msgstr "Sottobanda" #: data/ui/multiband_compressor.glade:1315 data/ui/multiband_gate.glade:1406 msgid "Low Band" msgstr "Banda Bassa" #: data/ui/multiband_compressor.glade:1694 data/ui/multiband_gate.glade:1819 msgid "Mid Band" msgstr "Banda Media" #: data/ui/multiband_compressor.glade:2073 data/ui/multiband_gate.glade:2232 msgid "High Band" msgstr "Banda Alta" #: data/ui/multiband_gate.glade:139 msgid "Multiband Gate" msgstr "Gate Multibanda" #: data/ui/pitch.glade:102 msgid "Pitch" msgstr "Intonazione" #: data/ui/pitch.glade:270 msgid "Cents" msgstr "Centesimi" #: data/ui/pitch.glade:300 msgid "Semitones" msgstr "Semitoni" #: data/ui/pitch.glade:330 msgid "Octaves" msgstr "Ottave" #: data/ui/pitch.glade:360 msgid "Crispness" msgstr "Chiarezza" #: data/ui/pitch.glade:402 msgid "Faster" msgstr "Più Veloce" #: data/ui/pitch.glade:414 msgid "Preserve Formant" msgstr "Preserva Formante" #: data/ui/preset_row.glade:55 msgid "Load" msgstr "Carica" #: data/ui/preset_row.glade:70 msgid "Save current settings to this preset file" msgstr "Salva impostazioni attuali in questo profilo" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "Rimuovi questo profilo" #: data/ui/preset_row.glade:98 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" "Applica automaticamente questo profilo ogni volta che il dispositivo viene " "connesso al sistema" #: data/ui/presets_menu.glade:81 data/ui/presets_menu.glade:182 #: src/presets_menu_ui.cpp:129 msgid "Import Presets" msgstr "Importa Profili" #: data/ui/pulse_info.glade:77 msgid "Version" msgstr "Versione" #: data/ui/pulse_info.glade:104 msgid "Default Sink" msgstr "Sink Predefinito" #: data/ui/pulse_info.glade:116 msgid "Default Source" msgstr "Sorgente Predefinita" #: data/ui/pulse_info.glade:158 msgid "Protocol" msgstr "Protocollo" #: data/ui/pulse_info.glade:185 msgid "Default Sample Format" msgstr "Formato di Campionamento Predefinito" #: data/ui/pulse_info.glade:212 msgid "Default Sampling Rate" msgstr "Frequenza di Campionamento Predefinita" #: data/ui/pulse_info.glade:266 msgid "Channel Mapping" msgstr "Mappatura Canali" #: data/ui/pulse_info.glade:291 msgid "Server" msgstr "Server" #: data/ui/pulse_info.glade:336 msgid "Modules" msgstr "Moduli" #: data/ui/pulse_info.glade:382 msgid "Clients" msgstr "Client" #: data/ui/pulse_info.glade:446 msgid "File" msgstr "File" #: data/ui/pulse_info.glade:456 msgid "Configuration" msgstr "Configurazione" #: data/ui/pulse_info.glade:489 msgid "Resamplers" msgstr "Ricampionamento" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:403 msgid "Use Default" msgstr "Usa Predefinito" #: data/ui/pulse_settings.glade:147 data/ui/pulse_settings.glade:452 msgid "Pipeline Input" msgstr "In Ingresso alla Pipeline" #: data/ui/pulse_settings.glade:247 data/ui/pulse_settings.glade:552 msgid "Pipeline Output" msgstr "In Uscita alla Pipeline" #: data/ui/pulse_settings.glade:347 data/ui/pulse_settings.glade:652 msgid "Block Size" msgstr "Dimensione Blocco" #: data/ui/reverb.glade:130 msgid "Reverberation" msgstr "Riverbero" #: data/ui/reverb.glade:181 msgid "Ambience" msgstr "Ambiente" #: data/ui/reverb.glade:194 msgid "Empty Walls" msgstr "Mura Vuote" #: data/ui/reverb.glade:207 msgid "Room" msgstr "Stanza" #: data/ui/reverb.glade:220 msgid "Large Empty Hall" msgstr "Sala Grande Vuota" #: data/ui/reverb.glade:246 msgid "Large Occupied Hall" msgstr "Sala Grande Occupata" #: data/ui/reverb.glade:453 msgid "Pre Delay" msgstr "Pre Ritardo" #: data/ui/reverb.glade:465 msgid "Decay Time" msgstr "Decadimento" #: data/ui/reverb.glade:531 msgid "Dry" msgstr "Trascuranza" #: data/ui/reverb.glade:563 msgid "Bass Cut" msgstr "Taglio Bassi" #: data/ui/reverb.glade:615 msgid "Treble Cut" msgstr "Taglio Alti" #: data/ui/reverb.glade:660 msgid "Diffusion" msgstr "Diffusione" #: data/ui/reverb.glade:672 msgid "Room Size" msgstr "Dimensione Stanza" #: data/ui/reverb.glade:684 msgid "Small" msgstr "Piccola" #: data/ui/reverb.glade:685 msgid "Medium" msgstr "Media" #: data/ui/reverb.glade:686 msgid "Large" msgstr "Grande" #: data/ui/reverb.glade:687 msgid "Tunnel" msgstr "Tunnel" #: data/ui/reverb.glade:688 msgid "Large/smooth" msgstr "Grande/liscia" #: data/ui/reverb.glade:689 msgid "Experimental" msgstr "Sperimentale" #: data/ui/reverb.glade:702 msgid "High Frequency Damping" msgstr "Smorza Alte Frequenze" #: data/ui/spectrum_settings.glade:77 msgid "Show Spectrum" msgstr "Mostra Spettro" #: data/ui/spectrum_settings.glade:89 msgid "Fill" msgstr "Riempi" #: data/ui/spectrum_settings.glade:125 msgid "Border" msgstr "Bordo" #: data/ui/spectrum_settings.glade:149 msgid "Use Custom Color" msgstr "Personalizza Colore" #: data/ui/spectrum_settings.glade:173 msgid "Use Gradient" msgstr "Usa Sfumatura" #: data/ui/spectrum_settings.glade:315 msgid "Points" msgstr "Punti" #: data/ui/spectrum_settings.glade:327 msgid "Height" msgstr "Altezza" #: data/ui/spectrum_settings.glade:339 msgid "Line Width" msgstr "Spessore Linea" #: data/ui/spectrum_settings.glade:351 msgid "Sampling" msgstr "Campionamento" #: data/ui/spectrum_settings.glade:363 msgid "Minimum Frequency" msgstr "Frequenza Minima" #: data/ui/spectrum_settings.glade:375 msgid "Maximum Frequency" msgstr "Frequenza Massima" #: data/ui/spectrum_settings.glade:410 msgid "Spectrum Type" msgstr "Tipo Spettro" #: data/ui/spectrum_settings.glade:423 msgid "Bars" msgstr "Barre" #: data/ui/spectrum_settings.glade:424 msgid "Lines" msgstr "Linee" #: data/ui/spectrum_settings.glade:437 msgid "Spectrum Color" msgstr "Colore Spettro" #: data/ui/spectrum_settings.glade:449 msgid "Gradient Color" msgstr "Colore Sfumatura" #: data/ui/spectrum_settings.glade:461 msgid "Axis Color" msgstr "Colore Asse" #: data/ui/stereo_tools.glade:108 msgid "Stereo Tools" msgstr "Strumenti Stereo" #: data/ui/stereo_tools.glade:334 data/ui/stereo_tools.glade:775 msgid "Balance" msgstr "Bilanciamento" #: data/ui/stereo_tools.glade:365 msgid "S/C Level" msgstr "Livello S/C" #: data/ui/stereo_tools.glade:406 msgid "Softclip" msgstr "Softclip" #: data/ui/stereo_tools.glade:452 msgid "Side Level" msgstr "Livello Laterale" #: data/ui/stereo_tools.glade:503 msgid "Side Balance" msgstr "Bilanciamento Laterale" #: data/ui/stereo_tools.glade:535 msgid "Middle Level" msgstr "Livello Medio" #: data/ui/stereo_tools.glade:547 msgid "Middle Panorama" msgstr "Panorama Medio" #: data/ui/stereo_tools.glade:604 msgid "LR > LR (Stereo Default)" msgstr "SD > SD (Predefinito Stereo)" #: data/ui/stereo_tools.glade:605 msgid "LR > MS (Stereo to Mid-Side)" msgstr "SD > MS (Stereo a Mid-Side)" #: data/ui/stereo_tools.glade:606 msgid "MS > LR (Mid-Side to Stereo)" msgstr "MS > SD (Mid-Side a Stereo)" #: data/ui/stereo_tools.glade:607 msgid "LR > LL (Mono Left Channel)" msgstr "SD > SS (Canale Sinistro Mono)" #: data/ui/stereo_tools.glade:608 msgid "LR > RR (Mono Right Channel)" msgstr "SD > DD (Canale Destro Mono)" #: data/ui/stereo_tools.glade:609 msgid "LR > L+R (Mono Sum L+R)" msgstr "SD > S+D (Somma Canali a Mono)" #: data/ui/stereo_tools.glade:610 msgid "LR > RL (Stereo Flip Channels)" msgstr "SD > DS (Inverti Canali Stereo)" #: data/ui/stereo_tools.glade:627 msgid "Stereo Matrix" msgstr "Matrice Stereo" #: data/ui/stereo_tools.glade:668 data/ui/stereo_tools.glade:709 msgid "Invert Phase" msgstr "Inverti Fase" #: data/ui/stereo_tools.glade:806 msgid "Delay L/R" msgstr "Delay S/D" #: data/ui/stereo_tools.glade:839 msgid "Stereo Base" msgstr "Base Stereo" #: data/ui/stereo_tools.glade:871 msgid "Stereo Phase" msgstr "Fase Stereo" #: data/ui/webrtc.glade:96 msgid "WebRTC" msgstr "WebRTC" #: data/ui/webrtc.glade:256 data/ui/webrtc.glade:389 data/ui/webrtc.glade:460 #: data/ui/webrtc.glade:648 msgid "Enable" msgstr "Attiva" #: data/ui/webrtc.glade:279 msgid "Extended Filter" msgstr "Filtro Esteso" #: data/ui/webrtc.glade:292 msgid "High Pass Filter" msgstr "Filtro Passa Alto" #: data/ui/webrtc.glade:309 data/ui/webrtc.glade:425 data/ui/webrtc.glade:698 msgid "Low" msgstr "Basso" #: data/ui/webrtc.glade:310 data/ui/webrtc.glade:426 data/ui/webrtc.glade:699 msgid "Moderate" msgstr "Moderato" #: data/ui/webrtc.glade:311 data/ui/webrtc.glade:427 data/ui/webrtc.glade:700 msgid "High" msgstr "Alto" #: data/ui/webrtc.glade:324 data/ui/webrtc.glade:412 msgid "Suppression Level" msgstr "Livello Soppressione" #: data/ui/webrtc.glade:361 msgid "Delay Agnostic" msgstr "Ritardo Agnostico" #: data/ui/webrtc.glade:375 msgid "Echo Canceller" msgstr "Rimozione Eco" #: data/ui/webrtc.glade:428 msgid "Very High" msgstr "Molto Alto" #: data/ui/webrtc.glade:445 msgid "Noise Suppressor" msgstr "Soppressore Rumore" #: data/ui/webrtc.glade:496 msgid "Adaptive Digital" msgstr "Digitale Adattivo" #: data/ui/webrtc.glade:497 msgid "Fixed Digital" msgstr "Digitale Fisso" #: data/ui/webrtc.glade:514 msgid "Gain Controller" msgstr "Controllo Guadagno" #: data/ui/webrtc.glade:540 msgid "Target Level" msgstr "Livello Soglia" #: data/ui/webrtc.glade:572 msgid "Maximum Gain" msgstr "Guadagno Massimo" #: data/ui/webrtc.glade:672 msgid "Detection Likelihood" msgstr "Probabilità Rilevamento" #: data/ui/webrtc.glade:684 msgid "Frame Size" msgstr "Dimensione frame" #: data/ui/webrtc.glade:697 msgid "Very Low" msgstr "Molto Basso" #: data/ui/webrtc.glade:737 msgid "Voice Detector" msgstr "Rilevatore Voce" #: data/ui/rnnoise.glade:90 msgid "Noise Reduction" msgstr "Riduzione Rumore" #: data/ui/rnnoise.glade:242 msgid "Import Model" msgstr "Importa Modello" #: data/ui/rnnoise.glade:246 msgid "Import Model File" msgstr "Importa File di Modello" #: data/ui/rnnoise.glade:311 msgid "Active Model" msgstr "Modello Attivo" #: data/ui/rnnoise.glade:324 msgid "Standard RNNoise Model" msgstr "Standard RNNoise" #: src/app_info_ui.cpp:120 msgid "paused" msgstr "pausa" #: src/app_info_ui.cpp:122 msgid "playing" msgstr "riproduzione" #: src/application.cpp:38 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "Esci da PulseEffects. Utile quando in esecuzione come servizio." #: src/application.cpp:40 msgid "Show available presets." msgstr "Mostra profili disponibili." #: src/application.cpp:43 msgid "Load a preset. Example: pulseeffects -l music" msgstr "Carica un profilo. Esempio: pulseeffects -l music" #: src/application.cpp:45 msgid "Reset PulseEffects." msgstr "Reset PulseEffects." #: src/application.cpp:48 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "Bypass globale. 1 per abilitare, 2 per disabilitare e 3 per lo stato" #: src/application.cpp:50 msgid "Hide the Window." msgstr "Nascondi la Finestra" #: src/application.cpp:284 msgid "Output Presets: " msgstr "Profili Uscita: " #: src/application.cpp:292 msgid "Input Presets: " msgstr "Profili Ingresso: " #: src/blocklist_settings_ui.cpp:191 msgid "Blocklist" msgstr "App Escluse" #: src/calibration_ui.cpp:198 msgid "Calibration Microphone" msgstr "Calibrazione Microfono" #: src/convolver_ui.cpp:281 msgid "Import Impulse File" msgstr "Importa File di Impulso" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Open" msgstr "Apri" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Cancel" msgstr "Annulla" #: src/convolver_ui.cpp:318 src/convolver_ui.cpp:319 src/convolver_ui.cpp:321 msgid "Failed" msgstr "Fallito" #: src/convolver_ui.cpp:323 msgid "Could Not Load The Impulse File" msgstr "Impossibile Caricare il File di Impulso" #: src/equalizer_ui.cpp:380 msgid "infinity" msgstr "infinito" #: src/equalizer_ui.cpp:738 msgid "Import APO Preset File" msgstr "Importa Profilo APO" #: src/equalizer_ui.cpp:743 msgid "APO Presets" msgstr "Profili APO" #: src/general_settings_ui.cpp:149 msgid "General" msgstr "Generale" #: src/pulse_settings_ui.cpp:168 msgid "Pulseaudio" msgstr "Pulseaudio" #~ msgid "Import APO Presets" #~ msgstr "Importa Profili APO" #~ msgid "Reference Signal" #~ msgstr "Segnale di Riferimento" #~ msgid "Input Gain" #~ msgstr "Guadagno in Ingresso" #~ msgid "Output Gain" #~ msgstr "Guadagno in Uscita" easyeffects-4.8.7/po/meson.build000066400000000000000000000000721424023573300166150ustar00rootroot00000000000000i18n_mod.gettext(meson.project_name(), preset: 'glib' ) easyeffects-4.8.7/po/pl.po000066400000000000000000001242071424023573300154350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PulseEffects package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PulseEffects\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-14 23:58+0100\n" "PO-Revision-Date: 2018-06-21 21:34+0200\n" "Last-Translator: Piotr Komur, pkomur@gmail.com\n" "Language-Team: \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.8\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 data/ui/application.glade:61 msgid "PulseEffects" msgstr "PulseEffects" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Efekty dźwiękowe dla programu Pulseaudio" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Wellington Wallace" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects to zaawansowane narzędzie do manipulacji dźwiękiem. Zawiera " "między innymi korektor, limiter, kompresor i narzędzie do generowania " "pogłosu. Uzupełnieniem tego jest wbudowany analizator widma." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "Ponieważ PulseEffects używa domyślnego serwera dźwięku PulseAudio, będzie on " "działał z większością, jeśli nie wszystkimi używanymi programami. Wszystkie " "obsługiwane programy są prezentowane w oknie głównym, gdzie każdy z nich " "może być aktywowany indywidualnie." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Oprócz manipulowania wyjściem dźwiękowym, PulseEffects jest w stanie " "zastosować efekty do urządzenia wejściowego, takiego jak mikrofon. Jest to " "przydatne na przykład przy nagrywaniu dźwięku, ale sprawdza się również " "podczas rozmów głosowych." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "Podczas uruchamiania, PulseEffects wygodnie przypomni sobie konfigurację " "użytą w ostatniej sesji. Możliwe jest również zapisanie wszystkich bieżących " "ustawień w postaci profilów." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Limiter wejścia" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:52 #: data/ui/compressor.glade:110 data/ui/compressor.glade:589 #: data/ui/webrtc.glade:633 msgid "Compressor" msgstr "Kompresor" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Kalibracja" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "Korektor, kompresor i inne efekty audio" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "limiter;kompresor;pogłos;korektor;autogłośność;" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:44 #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:47 #, fuzzy msgid "\"Presets\"" msgstr "Profile" #: data/ui/about.glade.in:11 #, fuzzy msgid "Audio effects for PulseAudio applications" msgstr "Efekty dźwiękowe dla programu Pulseaudio" #: data/ui/app_button_row.glade:49 msgid "Applications" msgstr "Programy" #: data/ui/app_info.glade:203 msgid "Add to Blocklist" msgstr "" #: data/ui/app_info.glade:239 msgid "Format" msgstr "Format" # Próbkowanie? #: data/ui/app_info.glade:264 data/ui/convolver.glade:348 msgid "Rate" msgstr "Częstotliwość" #: data/ui/app_info.glade:289 data/ui/pulse_info.glade:239 #: data/ui/stereo_tools.glade:756 msgid "Channels" msgstr "Kanały" #: data/ui/app_info.glade:314 msgid "Resampler" msgstr "Resampler" #: data/ui/app_info.glade:339 data/ui/pulse_settings.glade:159 #: data/ui/pulse_settings.glade:259 data/ui/pulse_settings.glade:464 #: data/ui/pulse_settings.glade:564 msgid "Buffer" msgstr "Bufor" #: data/ui/app_info.glade:364 data/ui/pulse_settings.glade:190 #: data/ui/pulse_settings.glade:290 data/ui/pulse_settings.glade:476 #: data/ui/pulse_settings.glade:576 msgid "Latency" msgstr "Oczekiwanie" #: data/ui/app_info.glade:389 msgid "State" msgstr "Stan" #: data/ui/application.glade:142 src/calibration_ui.cpp:64 #: src/calibration_ui.cpp:191 msgid "Test Signals" msgstr "Sygnały testowe" #: data/ui/application.glade:157 msgid "Global Bypass" msgstr "" #: data/ui/application.glade:172 data/ui/equalizer.glade:331 #: data/ui/general_settings.glade:289 msgid "Settings" msgstr "Ustawienia" #: data/ui/application.glade:194 msgid "Help" msgstr "" #: data/ui/application.glade:217 data/ui/crossfeed.glade:240 #: data/ui/equalizer.glade:403 data/ui/filter.glade:344 #: data/ui/reverb.glade:401 src/presets_menu_ui.cpp:133 #: src/presets_menu_ui.cpp:285 src/presets_menu_ui.cpp:286 #: src/presets_menu_ui.cpp:303 src/presets_menu_ui.cpp:304 msgid "Presets" msgstr "Profile" #: data/ui/autogain.glade:90 #, fuzzy msgid "Auto Gain" msgstr "Wzmocnienie wej." #: data/ui/autogain.glade:161 data/ui/bass_enhancer.glade:167 #: data/ui/compressor.glade:214 data/ui/convolver.glade:218 #: data/ui/crossfeed.glade:136 data/ui/crystalizer.glade:134 #: data/ui/deesser.glade:182 data/ui/delay.glade:144 #: data/ui/equalizer.glade:450 data/ui/equalizer_band.glade:187 #: data/ui/equalizer_band.glade:230 data/ui/exciter.glade:167 #: data/ui/filter.glade:243 data/ui/general_settings.glade:298 #: data/ui/gate.glade:172 data/ui/limiter.glade:166 data/ui/loudness.glade:174 #: data/ui/maximizer.glade:139 data/ui/multiband_compressor.glade:307 #: data/ui/multiband_gate.glade:331 data/ui/pitch.glade:158 #: data/ui/reverb.glade:299 data/ui/stereo_tools.glade:194 #: data/ui/webrtc.glade:141 data/ui/rnnoise.glade:139 msgid "Reset" msgstr "Zresetuj" #: data/ui/autogain.glade:185 data/ui/rnnoise.glade:163 msgid "Based on" msgstr "" #: data/ui/autogain.glade:262 #, fuzzy msgid "Reset History" msgstr "Resetuj jakość" #: data/ui/autogain.glade:274 #, fuzzy msgid "Detect Silence" msgstr "Wykrycie" #: data/ui/autogain.glade:286 msgid "Use Geometric Mean" msgstr "" #: data/ui/autogain.glade:325 msgid "Target" msgstr "Cel" #: data/ui/autogain.glade:374 data/ui/autogain.glade:779 msgid "Momentary" msgstr "" #: data/ui/autogain.glade:434 #, fuzzy msgid "Weights" msgstr "Wysokość" #: data/ui/autogain.glade:448 data/ui/autogain.glade:792 msgid "Short Term" msgstr "" #: data/ui/autogain.glade:497 data/ui/autogain.glade:805 msgid "Integrated" msgstr "" #: data/ui/autogain.glade:564 data/ui/autogain.glade:1076 #: data/ui/bass_enhancer.glade:596 data/ui/compressor.glade:1086 #: data/ui/convolver.glade:575 data/ui/crossfeed.glade:391 #: data/ui/crystalizer.glade:250 data/ui/deesser.glade:783 #: data/ui/delay.glade:328 data/ui/equalizer.glade:682 #: data/ui/exciter.glade:596 data/ui/filter.glade:508 data/ui/gate.glade:689 #: data/ui/limiter.glade:501 data/ui/loudness.glade:238 #: data/ui/loudness.glade:431 data/ui/maximizer.glade:358 #: data/ui/multiband_compressor.glade:2103 data/ui/multiband_gate.glade:2262 #: data/ui/pitch.glade:450 data/ui/presets_menu.glade:238 #: data/ui/reverb.glade:753 data/ui/stereo_tools.glade:427 #: data/ui/stereo_tools.glade:931 data/ui/webrtc.glade:780 #: data/ui/rnnoise.glade:362 msgid "Input" msgstr "Wejście" #: data/ui/autogain.glade:577 data/ui/autogain.glade:1020 #: data/ui/bass_enhancer.glade:625 data/ui/compressor.glade:1099 #: data/ui/convolver.glade:588 data/ui/crossfeed.glade:405 #: data/ui/crystalizer.glade:263 data/ui/deesser.glade:797 #: data/ui/delay.glade:341 data/ui/equalizer.glade:695 #: data/ui/exciter.glade:625 data/ui/filter.glade:521 data/ui/gate.glade:703 #: data/ui/limiter.glade:636 data/ui/loudness.glade:271 #: data/ui/loudness.glade:445 data/ui/maximizer.glade:372 #: data/ui/multiband_compressor.glade:894 #: data/ui/multiband_compressor.glade:1272 #: data/ui/multiband_compressor.glade:1651 #: data/ui/multiband_compressor.glade:2030 #: data/ui/multiband_compressor.glade:2116 data/ui/multiband_gate.glade:951 #: data/ui/multiband_gate.glade:1363 data/ui/multiband_gate.glade:1776 #: data/ui/multiband_gate.glade:2189 data/ui/multiband_gate.glade:2275 #: data/ui/pitch.glade:463 data/ui/presets_menu.glade:137 #: data/ui/reverb.glade:766 data/ui/stereo_tools.glade:901 #: data/ui/stereo_tools.glade:944 data/ui/webrtc.glade:794 #: data/ui/rnnoise.glade:375 msgid "Output" msgstr "Wyjście" #: data/ui/autogain.glade:899 msgid "Relative" msgstr "" #: data/ui/autogain.glade:912 data/ui/compressor.glade:1262 msgid "Gain" msgstr "Wzmocnienie" #: data/ui/autogain.glade:980 msgid "Loudness" msgstr "" #: data/ui/autogain.glade:1034 msgid "Range" msgstr "" #: data/ui/bass_enhancer.glade:116 msgid "Bass Enhancer" msgstr "Wzmacniacz basów" #: data/ui/bass_enhancer.glade:191 data/ui/compressor.glade:238 #: data/ui/crossfeed.glade:160 data/ui/deesser.glade:206 #: data/ui/delay.glade:168 data/ui/equalizer.glade:474 #: data/ui/exciter.glade:191 data/ui/filter.glade:267 data/ui/gate.glade:196 #: data/ui/limiter.glade:190 data/ui/loudness.glade:143 #: data/ui/maximizer.glade:163 data/ui/multiband_compressor.glade:331 #: data/ui/multiband_gate.glade:355 data/ui/pitch.glade:182 #: data/ui/reverb.glade:323 data/ui/stereo_tools.glade:218 #: data/ui/webrtc.glade:165 msgid "Provided by" msgstr "" #: data/ui/bass_enhancer.glade:259 data/ui/compressor.glade:602 #: data/ui/deesser.glade:274 data/ui/exciter.glade:259 msgid "Listen" msgstr "Słuchaj" #: data/ui/bass_enhancer.glade:302 data/ui/exciter.glade:303 msgid "3rd" msgstr "Trzecie" #: data/ui/bass_enhancer.glade:315 data/ui/exciter.glade:316 msgid "2nd" msgstr "Drugie" # Wpleć/wmieszaj/dodaj #: data/ui/bass_enhancer.glade:327 data/ui/exciter.glade:328 msgid "Blend Harmonics" msgstr "Wprowadź harmoniczne" #: data/ui/bass_enhancer.glade:355 data/ui/exciter.glade:357 #: data/ui/reverb.glade:498 msgid "Amount" msgstr "Ilość" #: data/ui/bass_enhancer.glade:367 data/ui/bass_enhancer.glade:504 #: data/ui/exciter.glade:369 data/ui/exciter.glade:504 msgid "Harmonics" msgstr "Harmoniczne" #: data/ui/bass_enhancer.glade:379 data/ui/exciter.glade:381 msgid "Scope" msgstr "Zakres" #: data/ui/bass_enhancer.glade:472 msgid "Floor" msgstr "Podłoga" #: data/ui/blocklist_settings.glade:52 data/ui/blocklist_settings.glade:155 #: data/ui/presets_menu.glade:65 data/ui/presets_menu.glade:166 msgid "Create Preset" msgstr "Utwórz profil" #: data/ui/blocklist_settings.glade:68 data/ui/blocklist_settings.glade:171 #: data/ui/presets_menu.glade:52 data/ui/presets_menu.glade:153 #: data/ui/pulse_info.glade:50 msgid "Name" msgstr "Nazwa" #: data/ui/blocklist_settings.glade:81 msgid "Reconnect the microphone to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:139 data/ui/pulse_settings.glade:383 msgid "Input Effects" msgstr "Efekty wejściowe" #: data/ui/blocklist_settings.glade:230 msgid "Restart the player to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:242 data/ui/pulse_settings.glade:688 msgid "Output Effects" msgstr "Efekty wyjściowe" #: data/ui/blocklist_settings.glade:265 msgid "Show Blocklisted Apps in Main Tab" msgstr "" #: data/ui/calibration_signals.glade:32 msgid "Sine" msgstr "Sinus" #: data/ui/calibration_signals.glade:33 msgid "Square" msgstr "Prostokąt" #: data/ui/calibration_signals.glade:34 msgid "Saw" msgstr "Piła" #: data/ui/calibration_signals.glade:35 msgid "Triangle" msgstr "Trójkąt" #: data/ui/calibration_signals.glade:36 msgid "Silence" msgstr "Cisza" #: data/ui/calibration_signals.glade:37 msgid "White Noise" msgstr "Biały szum" #: data/ui/calibration_signals.glade:38 msgid "Pink Noise" msgstr "Różowy szum" #: data/ui/calibration_signals.glade:39 msgid "Sine Table" msgstr "Sinus tabl." # tyknięcia, kliknięcia #: data/ui/calibration_signals.glade:40 msgid "Ticks" msgstr "Działki" #: data/ui/calibration_signals.glade:41 msgid "Gaussian Noise" msgstr "Szum Gaussa" #: data/ui/calibration_signals.glade:42 msgid "Red Noise" msgstr "Szum czerwony" #: data/ui/calibration_signals.glade:43 msgid "Blue Noise" msgstr "Szum niebieski" #: data/ui/calibration_signals.glade:44 msgid "Violet Noise" msgstr " Szum fioletowy" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Głośność" #: data/ui/calibration_signals.glade:135 data/ui/equalizer_band.glade:158 #: data/ui/filter.glade:394 msgid "Frequency" msgstr "Częstotliwość" #: data/ui/calibration_mic.glade:33 msgid "Window" msgstr "Okno" #: data/ui/calibration_mic.glade:90 msgid "Measure Noise" msgstr "Mierz szum" #: data/ui/calibration_mic.glade:119 msgid "Subtract Noise" msgstr "Odejmij szum" #: data/ui/compressor.glade:386 data/ui/deesser.glade:436 #: data/ui/gate.glade:498 data/ui/maximizer.glade:242 #: data/ui/multiband_compressor.glade:707 #: data/ui/multiband_compressor.glade:1085 #: data/ui/multiband_compressor.glade:1464 #: data/ui/multiband_compressor.glade:1843 data/ui/multiband_gate.glade:731 #: data/ui/multiband_gate.glade:1142 data/ui/multiband_gate.glade:1555 #: data/ui/multiband_gate.glade:1968 msgid "Threshold" msgstr "Próg" #: data/ui/compressor.glade:420 data/ui/deesser.glade:448 #: data/ui/gate.glade:532 data/ui/multiband_compressor.glade:741 #: data/ui/multiband_compressor.glade:1119 #: data/ui/multiband_compressor.glade:1498 #: data/ui/multiband_compressor.glade:1877 data/ui/multiband_gate.glade:765 #: data/ui/multiband_gate.glade:1176 data/ui/multiband_gate.glade:1589 #: data/ui/multiband_gate.glade:2002 msgid "Ratio" msgstr "Stosunek" #: data/ui/compressor.glade:452 data/ui/gate.glade:564 #: data/ui/multiband_compressor.glade:773 #: data/ui/multiband_compressor.glade:1151 #: data/ui/multiband_compressor.glade:1530 #: data/ui/multiband_compressor.glade:1909 data/ui/multiband_gate.glade:797 #: data/ui/multiband_gate.glade:1208 data/ui/multiband_gate.glade:1621 #: data/ui/multiband_gate.glade:2034 msgid "Knee" msgstr "Kolano" # Uzupełnienie wzmocnienia/ nadrobienie wzmocnienia, wypełnienie # czasem po prostu Output, więc Wyjście albo Wzmocnienie #: data/ui/compressor.glade:486 data/ui/deesser.glade:532 #: data/ui/gate.glade:598 data/ui/multiband_compressor.glade:807 #: data/ui/multiband_compressor.glade:1185 #: data/ui/multiband_compressor.glade:1564 #: data/ui/multiband_compressor.glade:1943 data/ui/multiband_gate.glade:831 #: data/ui/multiband_gate.glade:1242 data/ui/multiband_gate.glade:1655 #: data/ui/multiband_gate.glade:2068 msgid "Makeup" msgstr "Wzmocnienie" #: data/ui/compressor.glade:520 data/ui/gate.glade:464 #: data/ui/limiter.glade:363 data/ui/maximizer.glade:266 #: data/ui/multiband_compressor.glade:673 #: data/ui/multiband_compressor.glade:1051 #: data/ui/multiband_compressor.glade:1430 #: data/ui/multiband_compressor.glade:1809 data/ui/multiband_gate.glade:697 #: data/ui/multiband_gate.glade:1108 data/ui/multiband_gate.glade:1521 #: data/ui/multiband_gate.glade:1934 msgid "Release" msgstr "Wyzwolenie" #: data/ui/compressor.glade:532 data/ui/gate.glade:430 #: data/ui/multiband_compressor.glade:639 #: data/ui/multiband_compressor.glade:1017 #: data/ui/multiband_compressor.glade:1396 #: data/ui/multiband_compressor.glade:1775 data/ui/multiband_gate.glade:663 #: data/ui/multiband_gate.glade:1074 data/ui/multiband_gate.glade:1487 #: data/ui/multiband_gate.glade:1900 msgid "Attack" msgstr "Atak" #: data/ui/compressor.glade:559 #, fuzzy msgid "Downward" msgstr "Dół" #: data/ui/compressor.glade:560 msgid "Upward" msgstr "" #: data/ui/compressor.glade:573 #, fuzzy msgid "Compression Mode" msgstr "Kompresor" #: data/ui/compressor.glade:649 #, fuzzy msgid "Pre-amplification" msgstr "Programy" #: data/ui/compressor.glade:683 msgid "Reactivity" msgstr "Reaktywność" # Podgląd, albo "patrz w przód", zapas #: data/ui/compressor.glade:716 data/ui/limiter.glade:375 msgid "Lookahead" msgstr "Lookahead" #: data/ui/compressor.glade:730 msgid "Feed-forward" msgstr "" # Wejście? #: data/ui/compressor.glade:731 #, fuzzy msgid "Feed-back" msgstr "Feed" #: data/ui/compressor.glade:744 data/ui/equalizer_band.glade:51 msgid "Type" msgstr "" #: data/ui/compressor.glade:758 data/ui/deesser.glade:731 #: data/ui/gate.glade:303 data/ui/multiband_compressor.glade:611 #: data/ui/multiband_compressor.glade:989 #: data/ui/multiband_compressor.glade:1368 #: data/ui/multiband_compressor.glade:1747 data/ui/multiband_gate.glade:635 #: data/ui/multiband_gate.glade:1046 data/ui/multiband_gate.glade:1459 #: data/ui/multiband_gate.glade:1872 msgid "Peak" msgstr "Szczyt" #: data/ui/compressor.glade:759 data/ui/deesser.glade:730 #: data/ui/gate.glade:302 data/ui/multiband_compressor.glade:610 #: data/ui/multiband_compressor.glade:988 #: data/ui/multiband_compressor.glade:1367 #: data/ui/multiband_compressor.glade:1746 data/ui/multiband_gate.glade:634 #: data/ui/multiband_gate.glade:1045 data/ui/multiband_gate.glade:1458 #: data/ui/multiband_gate.glade:1871 msgid "RMS" msgstr "RMS" #: data/ui/compressor.glade:760 #, fuzzy msgid "Low-Pass" msgstr "Dolnoprzepustowy" #: data/ui/compressor.glade:761 msgid "Uniform" msgstr "Równomierny" #: data/ui/compressor.glade:774 data/ui/deesser.glade:702 #: data/ui/equalizer.glade:257 data/ui/equalizer_band.glade:84 #: data/ui/multiband_compressor.glade:412 data/ui/multiband_gate.glade:436 #: data/ui/stereo_tools.glade:591 data/ui/webrtc.glade:483 msgid "Mode" msgstr "Tryb" #: data/ui/compressor.glade:788 #, fuzzy msgid "Middle" msgstr "Środek" #: data/ui/compressor.glade:789 msgid "Side" msgstr "Strona" #: data/ui/compressor.glade:790 data/ui/delay.glade:247 #: data/ui/equalizer.glade:612 data/ui/stereo_tools.glade:655 msgid "Left" msgstr "Lewy" #: data/ui/compressor.glade:791 data/ui/delay.glade:280 #: data/ui/equalizer.glade:654 data/ui/stereo_tools.glade:724 msgid "Right" msgstr "Prawy" #: data/ui/compressor.glade:804 msgid "Source" msgstr "Źródło" #: data/ui/compressor.glade:820 data/ui/compressor.glade:1274 msgid "Sidechain" msgstr "Łańcuch boczny" #: data/ui/compressor.glade:925 msgid "Relative Release Threshold" msgstr "" #: data/ui/compressor.glade:937 #, fuzzy msgid "Boost Threshold" msgstr "Próg" #: data/ui/compressor.glade:949 #, fuzzy msgid "High-pass Frequency" msgstr "Tłumienie wysokich tonów" #: data/ui/compressor.glade:961 #, fuzzy msgid "Low-pass Frequency" msgstr "Przelicz częstotliwości" #: data/ui/compressor.glade:973 #, fuzzy msgid "High-pass Filter Mode" msgstr "Filtr górnoprzepustowy" #: data/ui/compressor.glade:985 msgid "Low-pass Filter Mode" msgstr "" #: data/ui/compressor.glade:999 data/ui/compressor.glade:1017 #: data/ui/equalizer_band.glade:63 msgid "Off" msgstr "" #: data/ui/compressor.glade:1000 data/ui/compressor.glade:1018 #, fuzzy msgid "12 dB/oct" msgstr "12dB/okt dolnoprzepustowy" #: data/ui/compressor.glade:1001 data/ui/compressor.glade:1019 #, fuzzy msgid "24 dB/oct" msgstr "24dB/okt dolnoprzepustowy" #: data/ui/compressor.glade:1002 data/ui/compressor.glade:1020 #, fuzzy msgid "36 dB/oct" msgstr "36dB/okt dolnoprzepustowy" #: data/ui/compressor.glade:1043 #, fuzzy msgid "Advanced" msgstr "Ustawienia zaawansowane" #: data/ui/compressor.glade:1347 msgid "Curve" msgstr "" #: data/ui/convolver.glade:90 msgid "Convolver" msgstr "" #: data/ui/convolver.glade:125 #, fuzzy msgid "Import Impulse" msgstr "Importuj profile" #: data/ui/convolver.glade:129 msgid "Import Impulse Response File" msgstr "" #: data/ui/convolver.glade:309 msgid "L" msgstr "L" #: data/ui/convolver.glade:323 msgid "R" msgstr "P" #: data/ui/convolver.glade:390 #, fuzzy msgid "Duration" msgstr "Kalibracja" #: data/ui/convolver.glade:402 #, fuzzy msgid "Samples" msgstr "Resampler" #: data/ui/convolver.glade:435 src/convolver_ui.cpp:285 #, fuzzy msgid "Impulse Response" msgstr "Płaska odpowiedź" #: data/ui/convolver.glade:458 msgid "Select the impulse Response File" msgstr "" #: data/ui/convolver.glade:477 src/spectrum_settings_ui.cpp:195 msgid "Spectrum" msgstr "Widmo" #: data/ui/convolver.glade:520 #, fuzzy msgid "Stereo Width" msgstr "Powiązanie stereo" #: data/ui/crossfeed.glade:104 msgid "Crossfeed" msgstr "Crossfeed" #: data/ui/crossfeed.glade:254 msgid "Jmeier" msgstr "Jmeier" #: data/ui/crossfeed.glade:266 data/ui/filter.glade:183 #: data/ui/reverb.glade:259 msgid "Default" msgstr "Domyślne" #: data/ui/crossfeed.glade:278 msgid "Cmoy" msgstr "Cmoy" #: data/ui/crossfeed.glade:308 msgid "Cutoff" msgstr "Odcięcie" # Wejście? #: data/ui/crossfeed.glade:341 msgid "Feed" msgstr "Feed" #: data/ui/crystalizer.glade:90 #, fuzzy msgid "Crystalizer" msgstr "Resetuj korektor" #: data/ui/crystalizer.glade:200 #, fuzzy msgid "Aggressive Mode" msgstr "Kompresor" #: data/ui/crystalizer.glade:464 msgid "Before" msgstr "" #: data/ui/crystalizer.glade:477 msgid "After" msgstr "" #: data/ui/crystalizer.glade:550 msgid "Loudness Range" msgstr "" #: data/ui/crystalizer_band.glade:28 data/ui/equalizer_band.glade:316 #: data/ui/stereo_tools.glade:680 data/ui/stereo_tools.glade:737 msgid "Mute" msgstr "Wycisz" #: data/ui/crystalizer_band.glade:40 data/ui/multiband_compressor.glade:580 #: data/ui/multiband_compressor.glade:958 #: data/ui/multiband_compressor.glade:1337 #: data/ui/multiband_compressor.glade:1716 data/ui/multiband_gate.glade:604 #: data/ui/multiband_gate.glade:1015 data/ui/multiband_gate.glade:1428 #: data/ui/multiband_gate.glade:1841 msgid "Bypass" msgstr "" #: data/ui/deesser.glade:125 msgid "Deesser" msgstr "De-Esser" #: data/ui/deesser.glade:309 #, fuzzy msgid "F1 Gain" msgstr "Wzmocnienie" #: data/ui/deesser.glade:321 #, fuzzy msgid "F2 Level" msgstr "Poziom" #: data/ui/deesser.glade:333 #, fuzzy msgid "F2 Peak Q" msgstr "Szczyt Q" #: data/ui/deesser.glade:424 msgid "Laxity" msgstr "Swoboda" #: data/ui/deesser.glade:585 #, fuzzy msgid "F1 Split" msgstr "Podzielony" #: data/ui/deesser.glade:597 #, fuzzy msgid "F2 Peak" msgstr "Szczyt" #: data/ui/deesser.glade:690 data/ui/gate.glade:288 msgid "Detection" msgstr "Wykrycie" #: data/ui/deesser.glade:715 msgid "Wide" msgstr "Szeroki" #: data/ui/deesser.glade:716 msgid "Split" msgstr "Podzielony" #: data/ui/deesser.glade:959 data/ui/multiband_gate.glade:865 #: data/ui/multiband_gate.glade:1298 data/ui/multiband_gate.glade:1711 #: data/ui/multiband_gate.glade:2124 msgid "Reduction" msgstr "Redukcja" #: data/ui/deesser.glade:972 msgid "Detected" msgstr "Wykryto" #: data/ui/delay.glade:90 #, fuzzy msgid "Delay" msgstr "Przedopóźnienie" #: data/ui/equalizer.glade:44 msgid "Equalizer" msgstr "Korektor" #: data/ui/equalizer.glade:160 msgid "Flat Response" msgstr "Płaska odpowiedź" #: data/ui/equalizer.glade:175 msgid "Calculate Frequencies" msgstr "Przelicz częstotliwości" #: data/ui/equalizer.glade:213 msgid "Bands" msgstr "Pasma" #: data/ui/equalizer.glade:269 msgid "IIR" msgstr "" #: data/ui/equalizer.glade:270 msgid "FIR" msgstr "" #: data/ui/equalizer.glade:271 msgid "FFT" msgstr "" #: data/ui/equalizer.glade:304 #, fuzzy msgid "Split Channels" msgstr "Kanały" #: data/ui/equalizer.glade:389 #, fuzzy msgid "Apply APO Preset" msgstr "Profile" #: data/ui/equalizer_band.glade:64 msgid "Bell" msgstr "" #: data/ui/equalizer_band.glade:65 #, fuzzy msgid "High Pass" msgstr "Filtr górnoprzepustowy" #: data/ui/equalizer_band.glade:66 msgid "High Shelf" msgstr "Górna wartość" #: data/ui/equalizer_band.glade:67 #, fuzzy msgid "Low Pass" msgstr "Dolnoprzepustowy" #: data/ui/equalizer_band.glade:68 msgid "Low Shelf" msgstr "Dolna Wartość" #: data/ui/equalizer_band.glade:69 msgid "Notch" msgstr "" #: data/ui/equalizer_band.glade:70 data/ui/filter.glade:427 msgid "Resonance" msgstr "Rezonans" #: data/ui/equalizer_band.glade:71 #, fuzzy msgid "All Pass" msgstr "Dolnoprzepustowy" #: data/ui/equalizer_band.glade:96 msgid "RLC (BT)" msgstr "" #: data/ui/equalizer_band.glade:97 msgid "RLC (MT)" msgstr "" #: data/ui/equalizer_band.glade:98 msgid "BWC (BT)" msgstr "" #: data/ui/equalizer_band.glade:99 msgid "BWC (MT)" msgstr "" #: data/ui/equalizer_band.glade:100 msgid "LRX (BT)" msgstr "" #: data/ui/equalizer_band.glade:101 msgid "LRX (MT)" msgstr "" #: data/ui/equalizer_band.glade:102 msgid "APO (DR)" msgstr "" #: data/ui/equalizer_band.glade:115 msgid "Slope" msgstr "" #: data/ui/equalizer_band.glade:203 msgid "Quality" msgstr "Jakość" #: data/ui/equalizer_band.glade:253 msgid "Width" msgstr "Szerokość" #: data/ui/equalizer_band.glade:304 data/ui/multiband_compressor.glade:593 #: data/ui/multiband_compressor.glade:971 #: data/ui/multiband_compressor.glade:1350 #: data/ui/multiband_compressor.glade:1729 data/ui/multiband_gate.glade:617 #: data/ui/multiband_gate.glade:1028 data/ui/multiband_gate.glade:1441 #: data/ui/multiband_gate.glade:1854 msgid "Solo" msgstr "" #: data/ui/equalizer_preset_row.glade:39 data/ui/irs_row.glade:44 msgid "Apply" msgstr "" #: data/ui/exciter.glade:116 msgid "Exciter" msgstr "Exciter" #: data/ui/exciter.glade:472 data/ui/maximizer.glade:254 msgid "Ceiling" msgstr "Sufit" #: data/ui/filter.glade:97 msgid "Filter" msgstr "Filtr" #: data/ui/filter.glade:147 msgid "Muted" msgstr "Wyciszony" #: data/ui/filter.glade:159 data/ui/reverb.glade:233 msgid "Disco" msgstr "Disco" #: data/ui/filter.glade:171 msgid "Distant Headphones" msgstr "Odległe słuchawki" #: data/ui/filter.glade:360 msgid "12dB/oct Lowpass" msgstr "12dB/okt dolnoprzepustowy" #: data/ui/filter.glade:361 msgid "24dB/oct Lowpass" msgstr "24dB/okt dolnoprzepustowy" #: data/ui/filter.glade:362 msgid "36dB/oct Lowpass" msgstr "36dB/okt dolnoprzepustowy" #: data/ui/filter.glade:363 msgid "12dB/oct Highpass" msgstr "12dB/okt górnoprzepustowy" #: data/ui/filter.glade:364 msgid "24dB/oct Highpass" msgstr "24dB/okt górnoprzepustowy" #: data/ui/filter.glade:365 msgid "36dB/oct Highpass" msgstr "36dB/okt górnoprzepustowy" #: data/ui/filter.glade:366 msgid "6dB/oct Bandpass" msgstr "6dB/okt środkowoprzepustowy" #: data/ui/filter.glade:367 msgid "12dB/oct Bandpass" msgstr "12dB/okt środkowoprzepustowy" #: data/ui/filter.glade:368 msgid "18dB/oct Bandpass" msgstr "18dB/okt środkowoprzepustowy" #: data/ui/filter.glade:369 msgid "6dB/oct Bandreject" msgstr "6dB/okt Środkowozaporowy" #: data/ui/filter.glade:370 msgid "12dB/oct Bandreject" msgstr "12dB/okt środkowozaporowy" #: data/ui/filter.glade:371 msgid "18dB/oct Bandreject" msgstr "18dB/okt środkowozaporowy" #: data/ui/filter.glade:460 msgid "Inertia" msgstr "Inercja" #: data/ui/general_settings.glade:58 msgid "Start Service at Login" msgstr "Uruchom usługę przy logowaniu" #: data/ui/general_settings.glade:82 msgid "Process All Outputs" msgstr "" #: data/ui/general_settings.glade:94 msgid "Process All Inputs" msgstr "" #: data/ui/general_settings.glade:130 msgid "Use Dark Theme" msgstr "Używaj ciemnego motywu" #: data/ui/general_settings.glade:158 data/ui/general_settings.glade:220 msgid "Niceness" msgstr "" #: data/ui/general_settings.glade:159 #, fuzzy msgid "Real Time" msgstr "Czas zaniku" #: data/ui/general_settings.glade:160 msgid "None" msgstr "" #: data/ui/general_settings.glade:208 msgid "Priority Type" msgstr "" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "" #: data/ui/general_settings.glade:244 msgid "Activity Timeout" msgstr "" #: data/ui/general_settings.glade:325 msgid "About" msgstr "" #: data/ui/gate.glade:97 msgid "Gate" msgstr "Bramka" #: data/ui/gate.glade:330 #, fuzzy msgid "Maximum Gain Reduction" msgstr "Redukcja wzmocnienia" #: data/ui/gate.glade:379 msgid "Stereo Link" msgstr "Powiązanie stereo" #: data/ui/gate.glade:393 msgid "Average" msgstr "Średnia" #: data/ui/gate.glade:394 msgid "Maximum" msgstr "Maksimum" #: data/ui/gate.glade:632 #, fuzzy msgid "Input Level" msgstr "Urządzenie wejściowe" #: data/ui/gate.glade:864 data/ui/multiband_gate.glade:911 #: data/ui/multiband_gate.glade:1323 data/ui/multiband_gate.glade:1736 #: data/ui/multiband_gate.glade:2149 msgid "Gating" msgstr "" #: data/ui/limiter.glade:96 data/ui/webrtc.glade:612 msgid "Limiter" msgstr "Limiter" #: data/ui/limiter.glade:266 msgid "Automatic Smoothing Control" msgstr "" #: data/ui/limiter.glade:278 msgid "Automatic Leveling" msgstr "" #: data/ui/limiter.glade:308 msgid "Limit" msgstr "Limit" #: data/ui/limiter.glade:409 msgid "Oversampling" msgstr "Nadpróbkowanie" #: data/ui/limiter.glade:447 msgid "ASC" msgstr "ASC" # Tłumienie? #: data/ui/limiter.glade:595 msgid "Attenuation" msgstr "Tłumienie" #: data/ui/loudness.glade:90 msgid "Loudness Compensator" msgstr "" #: data/ui/loudness.glade:328 msgid "Standard" msgstr "" #: data/ui/loudness.glade:341 msgid "Flat" msgstr "" #: data/ui/loudness.glade:342 msgid "ISO226-2003" msgstr "" #: data/ui/loudness.glade:343 msgid "Fletcher-Munson" msgstr "" #: data/ui/loudness.glade:344 msgid "Robinson-Dadson" msgstr "" #: data/ui/loudness.glade:370 #, fuzzy msgid "FFT Size" msgstr "Rozmiar ramki" #: data/ui/maximizer.glade:95 msgid "Maximizer" msgstr "Maximizer" #: data/ui/maximizer.glade:386 msgid "Gain Reduction" msgstr "Redukcja wzmocnienia" #: data/ui/multiband_compressor.glade:139 #, fuzzy msgid "Multiband Compressor" msgstr "Kompresor" #: data/ui/multiband_compressor.glade:426 data/ui/multiband_gate.glade:450 msgid "LR4" msgstr "" #: data/ui/multiband_compressor.glade:427 data/ui/multiband_gate.glade:451 msgid "LR8" msgstr "" #: data/ui/multiband_compressor.glade:441 data/ui/multiband_gate.glade:465 #, fuzzy msgid "Split 1/2" msgstr "Podzielony" #: data/ui/multiband_compressor.glade:454 data/ui/multiband_gate.glade:478 #, fuzzy msgid "Split 2/3" msgstr "Podzielony" #: data/ui/multiband_compressor.glade:467 data/ui/multiband_gate.glade:491 #, fuzzy msgid "Split 3/4" msgstr "Podzielony" #: data/ui/multiband_compressor.glade:854 #: data/ui/multiband_compressor.glade:1232 #: data/ui/multiband_compressor.glade:1611 #: data/ui/multiband_compressor.glade:1990 #, fuzzy msgid "Compression" msgstr "Kompresor" #: data/ui/multiband_compressor.glade:937 data/ui/multiband_gate.glade:994 #, fuzzy msgid "Sub Band" msgstr "Pasma" #: data/ui/multiband_compressor.glade:1315 data/ui/multiband_gate.glade:1406 #, fuzzy msgid "Low Band" msgstr "Dolnoprzepustowy" #: data/ui/multiband_compressor.glade:1694 data/ui/multiband_gate.glade:1819 #, fuzzy msgid "Mid Band" msgstr "Pasma" #: data/ui/multiband_compressor.glade:2073 data/ui/multiband_gate.glade:2232 #, fuzzy msgid "High Band" msgstr "Górnoprzepustowy" #: data/ui/multiband_gate.glade:139 msgid "Multiband Gate" msgstr "" #: data/ui/pitch.glade:102 msgid "Pitch" msgstr "Wysokość" #: data/ui/pitch.glade:270 msgid "Cents" msgstr "Centy" #: data/ui/pitch.glade:300 msgid "Semitones" msgstr "Półtony" #: data/ui/pitch.glade:330 msgid "Octaves" msgstr "Oktawy" #: data/ui/pitch.glade:360 msgid "Crispness" msgstr "Czystość" #: data/ui/pitch.glade:402 msgid "Faster" msgstr "Szybszy" #: data/ui/pitch.glade:414 msgid "Preserve Formant" msgstr "Zachowaj formant" #: data/ui/preset_row.glade:55 msgid "Load" msgstr "" #: data/ui/preset_row.glade:70 msgid "Save current settings to this preset file" msgstr "" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "" #: data/ui/preset_row.glade:98 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" #: data/ui/presets_menu.glade:81 data/ui/presets_menu.glade:182 #: src/presets_menu_ui.cpp:129 msgid "Import Presets" msgstr "Importuj profile" #: data/ui/pulse_info.glade:77 msgid "Version" msgstr "" #: data/ui/pulse_info.glade:104 #, fuzzy msgid "Default Sink" msgstr "Domyślne" #: data/ui/pulse_info.glade:116 #, fuzzy msgid "Default Source" msgstr "Domyślne" #: data/ui/pulse_info.glade:158 msgid "Protocol" msgstr "" #: data/ui/pulse_info.glade:185 msgid "Default Sample Format" msgstr "" #: data/ui/pulse_info.glade:212 msgid "Default Sampling Rate" msgstr "" #: data/ui/pulse_info.glade:266 #, fuzzy msgid "Channel Mapping" msgstr "Kanały" #: data/ui/pulse_info.glade:291 msgid "Server" msgstr "" #: data/ui/pulse_info.glade:336 msgid "Modules" msgstr "" #: data/ui/pulse_info.glade:382 #, fuzzy msgid "Clients" msgstr "Centy" #: data/ui/pulse_info.glade:446 msgid "File" msgstr "" #: data/ui/pulse_info.glade:456 #, fuzzy msgid "Configuration" msgstr "Kalibracja" #: data/ui/pulse_info.glade:489 #, fuzzy msgid "Resamplers" msgstr "Resampler" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:403 msgid "Use Default" msgstr "Użyj domyślnych" #: data/ui/pulse_settings.glade:147 data/ui/pulse_settings.glade:452 msgid "Pipeline Input" msgstr "" #: data/ui/pulse_settings.glade:247 data/ui/pulse_settings.glade:552 msgid "Pipeline Output" msgstr "" #: data/ui/pulse_settings.glade:347 data/ui/pulse_settings.glade:652 #, fuzzy msgid "Block Size" msgstr "Rozmiar pomieszczenia" #: data/ui/reverb.glade:130 msgid "Reverberation" msgstr "Pogłos" #: data/ui/reverb.glade:181 msgid "Ambience" msgstr "Otoczenie" #: data/ui/reverb.glade:194 msgid "Empty Walls" msgstr "Gołe ściany" #: data/ui/reverb.glade:207 msgid "Room" msgstr "Pokój" #: data/ui/reverb.glade:220 msgid "Large Empty Hall" msgstr "Duża pusta sala" #: data/ui/reverb.glade:246 msgid "Large Occupied Hall" msgstr "Duża pełna sala" #: data/ui/reverb.glade:453 msgid "Pre Delay" msgstr "Przedopóźnienie" #: data/ui/reverb.glade:465 msgid "Decay Time" msgstr "Czas zaniku" #: data/ui/reverb.glade:531 msgid "Dry" msgstr "Suchy" #: data/ui/reverb.glade:563 msgid "Bass Cut" msgstr "Odcięcie basu" #: data/ui/reverb.glade:615 msgid "Treble Cut" msgstr "Odcięcie sopranu" #: data/ui/reverb.glade:660 msgid "Diffusion" msgstr "Rozproszenie" #: data/ui/reverb.glade:672 msgid "Room Size" msgstr "Rozmiar pomieszczenia" #: data/ui/reverb.glade:684 msgid "Small" msgstr "Mały" #: data/ui/reverb.glade:685 msgid "Medium" msgstr "Średni" #: data/ui/reverb.glade:686 msgid "Large" msgstr "Duży" #: data/ui/reverb.glade:687 msgid "Tunnel" msgstr "Tunel" #: data/ui/reverb.glade:688 msgid "Large/smooth" msgstr "Duży/gładki" #: data/ui/reverb.glade:689 msgid "Experimental" msgstr "Experymentalne" #: data/ui/reverb.glade:702 msgid "High Frequency Damping" msgstr "Tłumienie wysokich tonów" #: data/ui/spectrum_settings.glade:77 #, fuzzy msgid "Show Spectrum" msgstr "Widmo" #: data/ui/spectrum_settings.glade:89 msgid "Fill" msgstr "" #: data/ui/spectrum_settings.glade:125 msgid "Border" msgstr "" #: data/ui/spectrum_settings.glade:149 msgid "Use Custom Color" msgstr "Użyj własnego koloru" #: data/ui/spectrum_settings.glade:173 msgid "Use Gradient" msgstr "" #: data/ui/spectrum_settings.glade:315 msgid "Points" msgstr "Punkty" #: data/ui/spectrum_settings.glade:327 msgid "Height" msgstr "Wysokość" #: data/ui/spectrum_settings.glade:339 #, fuzzy msgid "Line Width" msgstr "Szerokość" #: data/ui/spectrum_settings.glade:351 #, fuzzy msgid "Sampling" msgstr "Nadpróbkowanie" #: data/ui/spectrum_settings.glade:363 #, fuzzy msgid "Minimum Frequency" msgstr "Częstotliwość" #: data/ui/spectrum_settings.glade:375 #, fuzzy msgid "Maximum Frequency" msgstr "Częstotliwość" #: data/ui/spectrum_settings.glade:410 #, fuzzy msgid "Spectrum Type" msgstr "Widmo" #: data/ui/spectrum_settings.glade:423 msgid "Bars" msgstr "" #: data/ui/spectrum_settings.glade:424 msgid "Lines" msgstr "" #: data/ui/spectrum_settings.glade:437 msgid "Spectrum Color" msgstr "Kolor widma" #: data/ui/spectrum_settings.glade:449 msgid "Gradient Color" msgstr "" #: data/ui/spectrum_settings.glade:461 msgid "Axis Color" msgstr "" #: data/ui/stereo_tools.glade:108 #, fuzzy msgid "Stereo Tools" msgstr "Powiązanie stereo" #: data/ui/stereo_tools.glade:334 data/ui/stereo_tools.glade:775 msgid "Balance" msgstr "Balans" #: data/ui/stereo_tools.glade:365 #, fuzzy msgid "S/C Level" msgstr "Poziom" #: data/ui/stereo_tools.glade:406 msgid "Softclip" msgstr "" #: data/ui/stereo_tools.glade:452 #, fuzzy msgid "Side Level" msgstr "Poziom" #: data/ui/stereo_tools.glade:503 #, fuzzy msgid "Side Balance" msgstr "Balans" #: data/ui/stereo_tools.glade:535 #, fuzzy msgid "Middle Level" msgstr "Środek" #: data/ui/stereo_tools.glade:547 #, fuzzy msgid "Middle Panorama" msgstr "Panorama" #: data/ui/stereo_tools.glade:604 msgid "LR > LR (Stereo Default)" msgstr "" #: data/ui/stereo_tools.glade:605 msgid "LR > MS (Stereo to Mid-Side)" msgstr "" #: data/ui/stereo_tools.glade:606 msgid "MS > LR (Mid-Side to Stereo)" msgstr "" #: data/ui/stereo_tools.glade:607 msgid "LR > LL (Mono Left Channel)" msgstr "" #: data/ui/stereo_tools.glade:608 msgid "LR > RR (Mono Right Channel)" msgstr "" #: data/ui/stereo_tools.glade:609 msgid "LR > L+R (Mono Sum L+R)" msgstr "" #: data/ui/stereo_tools.glade:610 msgid "LR > RL (Stereo Flip Channels)" msgstr "" #: data/ui/stereo_tools.glade:627 #, fuzzy msgid "Stereo Matrix" msgstr "Powiązanie stereo" #: data/ui/stereo_tools.glade:668 data/ui/stereo_tools.glade:709 msgid "Invert Phase" msgstr "Odwróć fazę" #: data/ui/stereo_tools.glade:806 #, fuzzy msgid "Delay L/R" msgstr "Opóźnienie" #: data/ui/stereo_tools.glade:839 #, fuzzy msgid "Stereo Base" msgstr "Wzmacniacz stereo" #: data/ui/stereo_tools.glade:871 #, fuzzy msgid "Stereo Phase" msgstr "Wzmacniacz stereo" #: data/ui/webrtc.glade:96 msgid "WebRTC" msgstr "" #: data/ui/webrtc.glade:256 data/ui/webrtc.glade:389 data/ui/webrtc.glade:460 #: data/ui/webrtc.glade:648 msgid "Enable" msgstr "Włącz" #: data/ui/webrtc.glade:279 msgid "Extended Filter" msgstr "Rozszerzony Filtr" #: data/ui/webrtc.glade:292 msgid "High Pass Filter" msgstr "Filtr górnoprzepustowy" #: data/ui/webrtc.glade:309 data/ui/webrtc.glade:425 data/ui/webrtc.glade:698 msgid "Low" msgstr "Nisko" #: data/ui/webrtc.glade:310 data/ui/webrtc.glade:426 data/ui/webrtc.glade:699 msgid "Moderate" msgstr "Średni" #: data/ui/webrtc.glade:311 data/ui/webrtc.glade:427 data/ui/webrtc.glade:700 msgid "High" msgstr "Wysoki" #: data/ui/webrtc.glade:324 data/ui/webrtc.glade:412 #, fuzzy msgid "Suppression Level" msgstr "Poziom tłumienia" #: data/ui/webrtc.glade:361 msgid "Delay Agnostic" msgstr "Niezależny od opóźnienia" #: data/ui/webrtc.glade:375 msgid "Echo Canceller" msgstr "Usuwanie echa" #: data/ui/webrtc.glade:428 msgid "Very High" msgstr "Bardzo wysokie" #: data/ui/webrtc.glade:445 msgid "Noise Suppressor" msgstr "Tłumienie szumu" #: data/ui/webrtc.glade:496 msgid "Adaptive Digital" msgstr "Cyfrowy adaptacyjny" #: data/ui/webrtc.glade:497 msgid "Fixed Digital" msgstr "Cyfrowy ustalony" #: data/ui/webrtc.glade:514 msgid "Gain Controller" msgstr "Kontroler wzmocnienia" #: data/ui/webrtc.glade:540 msgid "Target Level" msgstr "Poziom docelowy" #: data/ui/webrtc.glade:572 msgid "Maximum Gain" msgstr "Maksymalne wzmocnienie" #: data/ui/webrtc.glade:672 msgid "Detection Likelihood" msgstr "Szansa wykrycia" #: data/ui/webrtc.glade:684 msgid "Frame Size" msgstr "Rozmiar ramki" #: data/ui/webrtc.glade:697 msgid "Very Low" msgstr "Bardzo niskie" #: data/ui/webrtc.glade:737 msgid "Voice Detector" msgstr "Wykrywanie głosu" #: data/ui/rnnoise.glade:90 #, fuzzy msgid "Noise Reduction" msgstr "Redukcja wzmocnienia" #: data/ui/rnnoise.glade:242 #, fuzzy msgid "Import Model" msgstr "Importuj profile" #: data/ui/rnnoise.glade:246 #, fuzzy msgid "Import Model File" msgstr "Importuj profile" #: data/ui/rnnoise.glade:311 #, fuzzy msgid "Active Model" msgstr "Kompresor" #: data/ui/rnnoise.glade:324 msgid "Standard RNNoise Model" msgstr "" #: src/app_info_ui.cpp:120 msgid "paused" msgstr "zatrzymany" #: src/app_info_ui.cpp:122 msgid "playing" msgstr "gra" #: src/application.cpp:38 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "Wyłącz PulseEffects. Przydatne przy pracy w trybie usługi." #: src/application.cpp:40 msgid "Show available presets." msgstr "Pokaż dostępne profile." #: src/application.cpp:43 msgid "Load a preset. Example: pulseeffects -l music" msgstr "Załaduj profil. Przykład: pulseeffects -l music" #: src/application.cpp:45 #, fuzzy msgid "Reset PulseEffects." msgstr "PulseEffects" #: src/application.cpp:48 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "" #: src/application.cpp:50 msgid "Hide the Window." msgstr "" #: src/application.cpp:284 #, fuzzy msgid "Output Presets: " msgstr "Profile: " #: src/application.cpp:292 #, fuzzy msgid "Input Presets: " msgstr "Importuj profile" #: src/blocklist_settings_ui.cpp:191 msgid "Blocklist" msgstr "" #: src/calibration_ui.cpp:198 msgid "Calibration Microphone" msgstr "Kalibracja mikrofonu" #: src/convolver_ui.cpp:281 msgid "Import Impulse File" msgstr "" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Open" msgstr "" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 #, fuzzy msgid "Cancel" msgstr "Balans" #: src/convolver_ui.cpp:318 src/convolver_ui.cpp:319 src/convolver_ui.cpp:321 msgid "Failed" msgstr "" #: src/convolver_ui.cpp:323 msgid "Could Not Load The Impulse File" msgstr "" #: src/equalizer_ui.cpp:380 msgid "infinity" msgstr "" #: src/equalizer_ui.cpp:738 #, fuzzy msgid "Import APO Preset File" msgstr "Importuj profile" #: src/equalizer_ui.cpp:743 #, fuzzy msgid "APO Presets" msgstr "Profile" #: src/general_settings_ui.cpp:149 msgid "General" msgstr "Ogólne" #: src/pulse_settings_ui.cpp:168 msgid "Pulseaudio" msgstr "Pulseaudio" #, fuzzy #~ msgid "Import APO Presets" #~ msgstr "Importuj profile" #~ msgid "Input Gain" #~ msgstr "Wzmocnienie wej." #, fuzzy #~ msgid "Output Gain" #~ msgstr "Wzmocnienie wej." #, fuzzy #~ msgid "Gain Detection" #~ msgstr "Redukcja wzmocnienia" easyeffects-4.8.7/po/pt_BR.po000066400000000000000000001256211424023573300160310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # Wellington Wallace Miguel Melo , 2017. # msgid "" msgstr "" "Project-Id-Version: PulseEffects\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-14 23:58+0100\n" "PO-Revision-Date: 2019-09-10 12:56-0300\n" "Last-Translator: Patrik Nilsson \n" "Language-Team: Portuguese <>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.1\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-SourceCharset: UTF-8\n" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 data/ui/application.glade:61 msgid "PulseEffects" msgstr "PulseEffects" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Efeitos de Áudio para Programas que Utilizam Pulseaudio" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects é uma ferramenta avançada de edição de áudio. Ele inclui " "equalizador, limitador, compressor e um plugin de reverberação. Estas " "ferramentas são complementadas por um analisador de espectro." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "Como o PulseEffects usa o servidor de áudio padrão PulseAudio ele irá " "funcionar com a maioria das aplicações que você usa, senão todas. Todos os " "aplicativos suportados estão presentes na janela principal, onde cada uma " "pode ser habilitada individualmente." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Além de manipular saída de som o PulseEffects também é capaz de aplicar " "efeitos em dispositivos de entrada, como um microfone. Isto é útil, por " "exemplo, em gravação de áudio mas também funciona em conversas." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "Quando inicializado, o PulseEffects irá convenientemente lembrar das " "configurações utilizadas na última sessão. Também é possível salvar todas as " "configurações\n" "como perfis." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "Definir o volume e ligar / desligar efeitos" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "Inclui um equalizador com predefinições incorporadas" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Limitador de Entrada" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:52 #: data/ui/compressor.glade:110 data/ui/compressor.glade:589 #: data/ui/webrtc.glade:633 msgid "Compressor" msgstr "Compressor" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Calibração" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "Equalizador, Compressor e Outros Efeitos de Áudio" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "limitador;compressor;reverberação;equalizador;autovolume;" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:44 #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:47 msgid "\"Presets\"" msgstr "\"Predefinições\"" #: data/ui/about.glade.in:11 msgid "Audio effects for PulseAudio applications" msgstr "Efeitos de áudio para programas que Utilizam Pulseaudio" #: data/ui/app_button_row.glade:49 msgid "Applications" msgstr "Aplicativos" #: data/ui/app_info.glade:203 #, fuzzy msgid "Add to Blocklist" msgstr "Lista Negra" #: data/ui/app_info.glade:239 msgid "Format" msgstr "Formato" #: data/ui/app_info.glade:264 data/ui/convolver.glade:348 msgid "Rate" msgstr "Taxa" #: data/ui/app_info.glade:289 data/ui/pulse_info.glade:239 #: data/ui/stereo_tools.glade:756 msgid "Channels" msgstr "Canais" #: data/ui/app_info.glade:314 msgid "Resampler" msgstr "Resampler" #: data/ui/app_info.glade:339 data/ui/pulse_settings.glade:159 #: data/ui/pulse_settings.glade:259 data/ui/pulse_settings.glade:464 #: data/ui/pulse_settings.glade:564 msgid "Buffer" msgstr "Buffer" #: data/ui/app_info.glade:364 data/ui/pulse_settings.glade:190 #: data/ui/pulse_settings.glade:290 data/ui/pulse_settings.glade:476 #: data/ui/pulse_settings.glade:576 msgid "Latency" msgstr "Latência" #: data/ui/app_info.glade:389 msgid "State" msgstr "Estado" #: data/ui/application.glade:142 src/calibration_ui.cpp:64 #: src/calibration_ui.cpp:191 msgid "Test Signals" msgstr "Sinais de Teste" #: data/ui/application.glade:157 #, fuzzy msgid "Global Bypass" msgstr "Ignorar" #: data/ui/application.glade:172 data/ui/equalizer.glade:331 #: data/ui/general_settings.glade:289 msgid "Settings" msgstr "Configurações" #: data/ui/application.glade:194 msgid "Help" msgstr "Ajuda" #: data/ui/application.glade:217 data/ui/crossfeed.glade:240 #: data/ui/equalizer.glade:403 data/ui/filter.glade:344 #: data/ui/reverb.glade:401 src/presets_menu_ui.cpp:133 #: src/presets_menu_ui.cpp:285 src/presets_menu_ui.cpp:286 #: src/presets_menu_ui.cpp:303 src/presets_menu_ui.cpp:304 msgid "Presets" msgstr "Predefinições" #: data/ui/autogain.glade:90 msgid "Auto Gain" msgstr "Ganho Automático" #: data/ui/autogain.glade:161 data/ui/bass_enhancer.glade:167 #: data/ui/compressor.glade:214 data/ui/convolver.glade:218 #: data/ui/crossfeed.glade:136 data/ui/crystalizer.glade:134 #: data/ui/deesser.glade:182 data/ui/delay.glade:144 #: data/ui/equalizer.glade:450 data/ui/equalizer_band.glade:187 #: data/ui/equalizer_band.glade:230 data/ui/exciter.glade:167 #: data/ui/filter.glade:243 data/ui/general_settings.glade:298 #: data/ui/gate.glade:172 data/ui/limiter.glade:166 data/ui/loudness.glade:174 #: data/ui/maximizer.glade:139 data/ui/multiband_compressor.glade:307 #: data/ui/multiband_gate.glade:331 data/ui/pitch.glade:158 #: data/ui/reverb.glade:299 data/ui/stereo_tools.glade:194 #: data/ui/webrtc.glade:141 data/ui/rnnoise.glade:139 msgid "Reset" msgstr "Resetar" #: data/ui/autogain.glade:185 data/ui/rnnoise.glade:163 msgid "Based on" msgstr "" #: data/ui/autogain.glade:262 msgid "Reset History" msgstr "Redefinir Histórico" #: data/ui/autogain.glade:274 msgid "Detect Silence" msgstr "Detectar Silêncio" #: data/ui/autogain.glade:286 #, fuzzy msgid "Use Geometric Mean" msgstr "Usar Gradiente" #: data/ui/autogain.glade:325 msgid "Target" msgstr "Alvo" #: data/ui/autogain.glade:374 data/ui/autogain.glade:779 msgid "Momentary" msgstr "Momentâneo" #: data/ui/autogain.glade:434 msgid "Weights" msgstr "Pesos" #: data/ui/autogain.glade:448 data/ui/autogain.glade:792 msgid "Short Term" msgstr "Curto Prazo" #: data/ui/autogain.glade:497 data/ui/autogain.glade:805 msgid "Integrated" msgstr "Integrada" #: data/ui/autogain.glade:564 data/ui/autogain.glade:1076 #: data/ui/bass_enhancer.glade:596 data/ui/compressor.glade:1086 #: data/ui/convolver.glade:575 data/ui/crossfeed.glade:391 #: data/ui/crystalizer.glade:250 data/ui/deesser.glade:783 #: data/ui/delay.glade:328 data/ui/equalizer.glade:682 #: data/ui/exciter.glade:596 data/ui/filter.glade:508 data/ui/gate.glade:689 #: data/ui/limiter.glade:501 data/ui/loudness.glade:238 #: data/ui/loudness.glade:431 data/ui/maximizer.glade:358 #: data/ui/multiband_compressor.glade:2103 data/ui/multiband_gate.glade:2262 #: data/ui/pitch.glade:450 data/ui/presets_menu.glade:238 #: data/ui/reverb.glade:753 data/ui/stereo_tools.glade:427 #: data/ui/stereo_tools.glade:931 data/ui/webrtc.glade:780 #: data/ui/rnnoise.glade:362 msgid "Input" msgstr "Entrada" #: data/ui/autogain.glade:577 data/ui/autogain.glade:1020 #: data/ui/bass_enhancer.glade:625 data/ui/compressor.glade:1099 #: data/ui/convolver.glade:588 data/ui/crossfeed.glade:405 #: data/ui/crystalizer.glade:263 data/ui/deesser.glade:797 #: data/ui/delay.glade:341 data/ui/equalizer.glade:695 #: data/ui/exciter.glade:625 data/ui/filter.glade:521 data/ui/gate.glade:703 #: data/ui/limiter.glade:636 data/ui/loudness.glade:271 #: data/ui/loudness.glade:445 data/ui/maximizer.glade:372 #: data/ui/multiband_compressor.glade:894 #: data/ui/multiband_compressor.glade:1272 #: data/ui/multiband_compressor.glade:1651 #: data/ui/multiband_compressor.glade:2030 #: data/ui/multiband_compressor.glade:2116 data/ui/multiband_gate.glade:951 #: data/ui/multiband_gate.glade:1363 data/ui/multiband_gate.glade:1776 #: data/ui/multiband_gate.glade:2189 data/ui/multiband_gate.glade:2275 #: data/ui/pitch.glade:463 data/ui/presets_menu.glade:137 #: data/ui/reverb.glade:766 data/ui/stereo_tools.glade:901 #: data/ui/stereo_tools.glade:944 data/ui/webrtc.glade:794 #: data/ui/rnnoise.glade:375 msgid "Output" msgstr "Saída" #: data/ui/autogain.glade:899 msgid "Relative" msgstr "Relativo" #: data/ui/autogain.glade:912 data/ui/compressor.glade:1262 msgid "Gain" msgstr "Ganho" #: data/ui/autogain.glade:980 msgid "Loudness" msgstr "Sonoridade" #: data/ui/autogain.glade:1034 msgid "Range" msgstr "Alcance" #: data/ui/bass_enhancer.glade:116 msgid "Bass Enhancer" msgstr "Reforçador de Graves" #: data/ui/bass_enhancer.glade:191 data/ui/compressor.glade:238 #: data/ui/crossfeed.glade:160 data/ui/deesser.glade:206 #: data/ui/delay.glade:168 data/ui/equalizer.glade:474 #: data/ui/exciter.glade:191 data/ui/filter.glade:267 data/ui/gate.glade:196 #: data/ui/limiter.glade:190 data/ui/loudness.glade:143 #: data/ui/maximizer.glade:163 data/ui/multiband_compressor.glade:331 #: data/ui/multiband_gate.glade:355 data/ui/pitch.glade:182 #: data/ui/reverb.glade:323 data/ui/stereo_tools.glade:218 #: data/ui/webrtc.glade:165 msgid "Provided by" msgstr "" #: data/ui/bass_enhancer.glade:259 data/ui/compressor.glade:602 #: data/ui/deesser.glade:274 data/ui/exciter.glade:259 msgid "Listen" msgstr "Escutar" #: data/ui/bass_enhancer.glade:302 data/ui/exciter.glade:303 msgid "3rd" msgstr "3°" #: data/ui/bass_enhancer.glade:315 data/ui/exciter.glade:316 msgid "2nd" msgstr "2°" #: data/ui/bass_enhancer.glade:327 data/ui/exciter.glade:328 msgid "Blend Harmonics" msgstr "Mistura de Harmônicos" #: data/ui/bass_enhancer.glade:355 data/ui/exciter.glade:357 #: data/ui/reverb.glade:498 msgid "Amount" msgstr "Quantidade" #: data/ui/bass_enhancer.glade:367 data/ui/bass_enhancer.glade:504 #: data/ui/exciter.glade:369 data/ui/exciter.glade:504 msgid "Harmonics" msgstr "Harmônico" #: data/ui/bass_enhancer.glade:379 data/ui/exciter.glade:381 msgid "Scope" msgstr "Escopo" #: data/ui/bass_enhancer.glade:472 msgid "Floor" msgstr "Piso" #: data/ui/blocklist_settings.glade:52 data/ui/blocklist_settings.glade:155 #: data/ui/presets_menu.glade:65 data/ui/presets_menu.glade:166 msgid "Create Preset" msgstr "Criar Predefinição" #: data/ui/blocklist_settings.glade:68 data/ui/blocklist_settings.glade:171 #: data/ui/presets_menu.glade:52 data/ui/presets_menu.glade:153 #: data/ui/pulse_info.glade:50 msgid "Name" msgstr "Nome" #: data/ui/blocklist_settings.glade:81 msgid "Reconnect the microphone to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:139 data/ui/pulse_settings.glade:383 msgid "Input Effects" msgstr "Efeitos de Entrada" #: data/ui/blocklist_settings.glade:230 msgid "Restart the player to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:242 data/ui/pulse_settings.glade:688 msgid "Output Effects" msgstr "Efeitos de Saída" #: data/ui/blocklist_settings.glade:265 msgid "Show Blocklisted Apps in Main Tab" msgstr "" #: data/ui/calibration_signals.glade:32 msgid "Sine" msgstr "Seno" #: data/ui/calibration_signals.glade:33 msgid "Square" msgstr "Quadrada" #: data/ui/calibration_signals.glade:34 msgid "Saw" msgstr "Serra" #: data/ui/calibration_signals.glade:35 msgid "Triangle" msgstr "Triângulo" #: data/ui/calibration_signals.glade:36 msgid "Silence" msgstr "Silencio" #: data/ui/calibration_signals.glade:37 msgid "White Noise" msgstr "Ruído Branco" #: data/ui/calibration_signals.glade:38 msgid "Pink Noise" msgstr "Ruído Rosa" #: data/ui/calibration_signals.glade:39 msgid "Sine Table" msgstr "Tabela de Seno" #: data/ui/calibration_signals.glade:40 msgid "Ticks" msgstr "Tique-Taque" #: data/ui/calibration_signals.glade:41 msgid "Gaussian Noise" msgstr "Ruído Gaussiano" #: data/ui/calibration_signals.glade:42 msgid "Red Noise" msgstr "Ruído Vermelho" #: data/ui/calibration_signals.glade:43 msgid "Blue Noise" msgstr "Ruído Azul" #: data/ui/calibration_signals.glade:44 msgid "Violet Noise" msgstr "Ruído Violeta" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Volume" #: data/ui/calibration_signals.glade:135 data/ui/equalizer_band.glade:158 #: data/ui/filter.glade:394 msgid "Frequency" msgstr "Frequência" #: data/ui/calibration_mic.glade:33 msgid "Window" msgstr "Janela" #: data/ui/calibration_mic.glade:90 msgid "Measure Noise" msgstr "Medir Ruído" #: data/ui/calibration_mic.glade:119 msgid "Subtract Noise" msgstr "Subtrair Ruído" #: data/ui/compressor.glade:386 data/ui/deesser.glade:436 #: data/ui/gate.glade:498 data/ui/maximizer.glade:242 #: data/ui/multiband_compressor.glade:707 #: data/ui/multiband_compressor.glade:1085 #: data/ui/multiband_compressor.glade:1464 #: data/ui/multiband_compressor.glade:1843 data/ui/multiband_gate.glade:731 #: data/ui/multiband_gate.glade:1142 data/ui/multiband_gate.glade:1555 #: data/ui/multiband_gate.glade:1968 msgid "Threshold" msgstr "Limiar" #: data/ui/compressor.glade:420 data/ui/deesser.glade:448 #: data/ui/gate.glade:532 data/ui/multiband_compressor.glade:741 #: data/ui/multiband_compressor.glade:1119 #: data/ui/multiband_compressor.glade:1498 #: data/ui/multiband_compressor.glade:1877 data/ui/multiband_gate.glade:765 #: data/ui/multiband_gate.glade:1176 data/ui/multiband_gate.glade:1589 #: data/ui/multiband_gate.glade:2002 msgid "Ratio" msgstr "Razão" #: data/ui/compressor.glade:452 data/ui/gate.glade:564 #: data/ui/multiband_compressor.glade:773 #: data/ui/multiband_compressor.glade:1151 #: data/ui/multiband_compressor.glade:1530 #: data/ui/multiband_compressor.glade:1909 data/ui/multiband_gate.glade:797 #: data/ui/multiband_gate.glade:1208 data/ui/multiband_gate.glade:1621 #: data/ui/multiband_gate.glade:2034 msgid "Knee" msgstr "Joelho" #: data/ui/compressor.glade:486 data/ui/deesser.glade:532 #: data/ui/gate.glade:598 data/ui/multiband_compressor.glade:807 #: data/ui/multiband_compressor.glade:1185 #: data/ui/multiband_compressor.glade:1564 #: data/ui/multiband_compressor.glade:1943 data/ui/multiband_gate.glade:831 #: data/ui/multiband_gate.glade:1242 data/ui/multiband_gate.glade:1655 #: data/ui/multiband_gate.glade:2068 msgid "Makeup" msgstr "Ganho de Saída" #: data/ui/compressor.glade:520 data/ui/gate.glade:464 #: data/ui/limiter.glade:363 data/ui/maximizer.glade:266 #: data/ui/multiband_compressor.glade:673 #: data/ui/multiband_compressor.glade:1051 #: data/ui/multiband_compressor.glade:1430 #: data/ui/multiband_compressor.glade:1809 data/ui/multiband_gate.glade:697 #: data/ui/multiband_gate.glade:1108 data/ui/multiband_gate.glade:1521 #: data/ui/multiband_gate.glade:1934 msgid "Release" msgstr "Liberação" #: data/ui/compressor.glade:532 data/ui/gate.glade:430 #: data/ui/multiband_compressor.glade:639 #: data/ui/multiband_compressor.glade:1017 #: data/ui/multiband_compressor.glade:1396 #: data/ui/multiband_compressor.glade:1775 data/ui/multiband_gate.glade:663 #: data/ui/multiband_gate.glade:1074 data/ui/multiband_gate.glade:1487 #: data/ui/multiband_gate.glade:1900 msgid "Attack" msgstr "Ataque" #: data/ui/compressor.glade:559 msgid "Downward" msgstr "Para Baixo" #: data/ui/compressor.glade:560 msgid "Upward" msgstr "Para Cima" #: data/ui/compressor.glade:573 msgid "Compression Mode" msgstr "Modo de Compressão" #: data/ui/compressor.glade:649 msgid "Pre-amplification" msgstr "Pré-amplificação" #: data/ui/compressor.glade:683 msgid "Reactivity" msgstr "Reatividade" #: data/ui/compressor.glade:716 data/ui/limiter.glade:375 msgid "Lookahead" msgstr "Lookahead" #: data/ui/compressor.glade:730 msgid "Feed-forward" msgstr "Feed-forward" #: data/ui/compressor.glade:731 msgid "Feed-back" msgstr "Feed-back" #: data/ui/compressor.glade:744 data/ui/equalizer_band.glade:51 msgid "Type" msgstr "Tipo" #: data/ui/compressor.glade:758 data/ui/deesser.glade:731 #: data/ui/gate.glade:303 data/ui/multiband_compressor.glade:611 #: data/ui/multiband_compressor.glade:989 #: data/ui/multiband_compressor.glade:1368 #: data/ui/multiband_compressor.glade:1747 data/ui/multiband_gate.glade:635 #: data/ui/multiband_gate.glade:1046 data/ui/multiband_gate.glade:1459 #: data/ui/multiband_gate.glade:1872 msgid "Peak" msgstr "Pico" #: data/ui/compressor.glade:759 data/ui/deesser.glade:730 #: data/ui/gate.glade:302 data/ui/multiband_compressor.glade:610 #: data/ui/multiband_compressor.glade:988 #: data/ui/multiband_compressor.glade:1367 #: data/ui/multiband_compressor.glade:1746 data/ui/multiband_gate.glade:634 #: data/ui/multiband_gate.glade:1045 data/ui/multiband_gate.glade:1458 #: data/ui/multiband_gate.glade:1871 msgid "RMS" msgstr "RMS" #: data/ui/compressor.glade:760 msgid "Low-Pass" msgstr "Passa-Baixa" #: data/ui/compressor.glade:761 msgid "Uniform" msgstr "Uniforme" #: data/ui/compressor.glade:774 data/ui/deesser.glade:702 #: data/ui/equalizer.glade:257 data/ui/equalizer_band.glade:84 #: data/ui/multiband_compressor.glade:412 data/ui/multiband_gate.glade:436 #: data/ui/stereo_tools.glade:591 data/ui/webrtc.glade:483 msgid "Mode" msgstr "Modo" #: data/ui/compressor.glade:788 msgid "Middle" msgstr "Meio" #: data/ui/compressor.glade:789 msgid "Side" msgstr "Lado" #: data/ui/compressor.glade:790 data/ui/delay.glade:247 #: data/ui/equalizer.glade:612 data/ui/stereo_tools.glade:655 msgid "Left" msgstr "Esquerda" #: data/ui/compressor.glade:791 data/ui/delay.glade:280 #: data/ui/equalizer.glade:654 data/ui/stereo_tools.glade:724 msgid "Right" msgstr "Direita" #: data/ui/compressor.glade:804 msgid "Source" msgstr "Fonte" #: data/ui/compressor.glade:820 data/ui/compressor.glade:1274 msgid "Sidechain" msgstr "Cadeia Lateral" #: data/ui/compressor.glade:925 msgid "Relative Release Threshold" msgstr "" #: data/ui/compressor.glade:937 #, fuzzy msgid "Boost Threshold" msgstr "Limiar" #: data/ui/compressor.glade:949 #, fuzzy msgid "High-pass Frequency" msgstr "Frequências Mais Altas" #: data/ui/compressor.glade:961 #, fuzzy msgid "Low-pass Frequency" msgstr "Frequências Mais Baixas" #: data/ui/compressor.glade:973 #, fuzzy msgid "High-pass Filter Mode" msgstr "Filtro Passa-Alta" #: data/ui/compressor.glade:985 msgid "Low-pass Filter Mode" msgstr "" #: data/ui/compressor.glade:999 data/ui/compressor.glade:1017 #: data/ui/equalizer_band.glade:63 msgid "Off" msgstr "Desligado" #: data/ui/compressor.glade:1000 data/ui/compressor.glade:1018 #, fuzzy msgid "12 dB/oct" msgstr "12dB/oct Passa-Baixa" #: data/ui/compressor.glade:1001 data/ui/compressor.glade:1019 #, fuzzy msgid "24 dB/oct" msgstr "24dB/oct Passa-Baixa" #: data/ui/compressor.glade:1002 data/ui/compressor.glade:1020 #, fuzzy msgid "36 dB/oct" msgstr "36dB/oct Passa-Baixa" #: data/ui/compressor.glade:1043 #, fuzzy msgid "Advanced" msgstr "Configurações Avançadas" #: data/ui/compressor.glade:1347 msgid "Curve" msgstr "Curva" #: data/ui/convolver.glade:90 msgid "Convolver" msgstr "Convolver" #: data/ui/convolver.glade:125 msgid "Import Impulse" msgstr "Importar Impulso" #: data/ui/convolver.glade:129 msgid "Import Impulse Response File" msgstr "Arquivo da Resposta de Impulso" #: data/ui/convolver.glade:309 msgid "L" msgstr "L" #: data/ui/convolver.glade:323 msgid "R" msgstr "R" #: data/ui/convolver.glade:390 msgid "Duration" msgstr "Duração" #: data/ui/convolver.glade:402 msgid "Samples" msgstr "Amostras" #: data/ui/convolver.glade:435 src/convolver_ui.cpp:285 msgid "Impulse Response" msgstr "Resposta de Impulso" #: data/ui/convolver.glade:458 msgid "Select the impulse Response File" msgstr "Selecione o Arquivo com a Resposta de Impulso" #: data/ui/convolver.glade:477 src/spectrum_settings_ui.cpp:195 msgid "Spectrum" msgstr "Espectro" #: data/ui/convolver.glade:520 msgid "Stereo Width" msgstr "Largura do Stereo" #: data/ui/crossfeed.glade:104 msgid "Crossfeed" msgstr "Crossfeed" #: data/ui/crossfeed.glade:254 msgid "Jmeier" msgstr "Jmeier" #: data/ui/crossfeed.glade:266 data/ui/filter.glade:183 #: data/ui/reverb.glade:259 msgid "Default" msgstr "Padrão" #: data/ui/crossfeed.glade:278 msgid "Cmoy" msgstr "Cmoy" #: data/ui/crossfeed.glade:308 msgid "Cutoff" msgstr "Corte" #: data/ui/crossfeed.glade:341 msgid "Feed" msgstr "Alimentação" #: data/ui/crystalizer.glade:90 msgid "Crystalizer" msgstr "Cristalizador" #: data/ui/crystalizer.glade:200 msgid "Aggressive Mode" msgstr "Modo Agressivo" #: data/ui/crystalizer.glade:464 msgid "Before" msgstr "Antes" #: data/ui/crystalizer.glade:477 msgid "After" msgstr "Depois" #: data/ui/crystalizer.glade:550 msgid "Loudness Range" msgstr "Faixa de Sonoridade" #: data/ui/crystalizer_band.glade:28 data/ui/equalizer_band.glade:316 #: data/ui/stereo_tools.glade:680 data/ui/stereo_tools.glade:737 msgid "Mute" msgstr "Mudo" #: data/ui/crystalizer_band.glade:40 data/ui/multiband_compressor.glade:580 #: data/ui/multiband_compressor.glade:958 #: data/ui/multiband_compressor.glade:1337 #: data/ui/multiband_compressor.glade:1716 data/ui/multiband_gate.glade:604 #: data/ui/multiband_gate.glade:1015 data/ui/multiband_gate.glade:1428 #: data/ui/multiband_gate.glade:1841 msgid "Bypass" msgstr "Ignorar" #: data/ui/deesser.glade:125 msgid "Deesser" msgstr "Deesser" #: data/ui/deesser.glade:309 #, fuzzy msgid "F1 Gain" msgstr "Ganho" #: data/ui/deesser.glade:321 #, fuzzy msgid "F2 Level" msgstr "Nível" #: data/ui/deesser.glade:333 #, fuzzy msgid "F2 Peak Q" msgstr "Pico Q" #: data/ui/deesser.glade:424 msgid "Laxity" msgstr "Frouxidão" #: data/ui/deesser.glade:585 #, fuzzy msgid "F1 Split" msgstr "Separado" #: data/ui/deesser.glade:597 #, fuzzy msgid "F2 Peak" msgstr "Pico" #: data/ui/deesser.glade:690 data/ui/gate.glade:288 msgid "Detection" msgstr "Detecção" #: data/ui/deesser.glade:715 msgid "Wide" msgstr "Amplo" #: data/ui/deesser.glade:716 msgid "Split" msgstr "Separado" #: data/ui/deesser.glade:959 data/ui/multiband_gate.glade:865 #: data/ui/multiband_gate.glade:1298 data/ui/multiband_gate.glade:1711 #: data/ui/multiband_gate.glade:2124 msgid "Reduction" msgstr "Redução" #: data/ui/deesser.glade:972 msgid "Detected" msgstr "Detectado" #: data/ui/delay.glade:90 msgid "Delay" msgstr "Atraso" #: data/ui/equalizer.glade:44 msgid "Equalizer" msgstr "Equalizador" #: data/ui/equalizer.glade:160 msgid "Flat Response" msgstr "Resposta Plana" #: data/ui/equalizer.glade:175 msgid "Calculate Frequencies" msgstr "Calcular Frequências" #: data/ui/equalizer.glade:213 msgid "Bands" msgstr "Bandas" #: data/ui/equalizer.glade:269 msgid "IIR" msgstr "IIR" #: data/ui/equalizer.glade:270 msgid "FIR" msgstr "FIR" #: data/ui/equalizer.glade:271 msgid "FFT" msgstr "FFT" #: data/ui/equalizer.glade:304 msgid "Split Channels" msgstr "Canais Separados" #: data/ui/equalizer.glade:389 #, fuzzy msgid "Apply APO Preset" msgstr "Predefinições" #: data/ui/equalizer_band.glade:64 msgid "Bell" msgstr "Sino" #: data/ui/equalizer_band.glade:65 msgid "High Pass" msgstr "Passa Altas" #: data/ui/equalizer_band.glade:66 msgid "High Shelf" msgstr "High Shelf" #: data/ui/equalizer_band.glade:67 msgid "Low Pass" msgstr "Passa-Baixa" #: data/ui/equalizer_band.glade:68 msgid "Low Shelf" msgstr "Low Shelf" #: data/ui/equalizer_band.glade:69 msgid "Notch" msgstr "Rejeita-faixa" #: data/ui/equalizer_band.glade:70 data/ui/filter.glade:427 msgid "Resonance" msgstr "Ressonância" #: data/ui/equalizer_band.glade:71 #, fuzzy msgid "All Pass" msgstr "Passa-Baixa" #: data/ui/equalizer_band.glade:96 msgid "RLC (BT)" msgstr "RLC (BT)" #: data/ui/equalizer_band.glade:97 msgid "RLC (MT)" msgstr "RLC (MT)" #: data/ui/equalizer_band.glade:98 msgid "BWC (BT)" msgstr "BWC (BT)" #: data/ui/equalizer_band.glade:99 msgid "BWC (MT)" msgstr "BWC (MT)" #: data/ui/equalizer_band.glade:100 msgid "LRX (BT)" msgstr "LRX (BT)" #: data/ui/equalizer_band.glade:101 msgid "LRX (MT)" msgstr "LRX (MT)" #: data/ui/equalizer_band.glade:102 msgid "APO (DR)" msgstr "APO (DR)" #: data/ui/equalizer_band.glade:115 msgid "Slope" msgstr "Inclinação" #: data/ui/equalizer_band.glade:203 msgid "Quality" msgstr "Qualidade" #: data/ui/equalizer_band.glade:253 msgid "Width" msgstr "Largura" #: data/ui/equalizer_band.glade:304 data/ui/multiband_compressor.glade:593 #: data/ui/multiband_compressor.glade:971 #: data/ui/multiband_compressor.glade:1350 #: data/ui/multiband_compressor.glade:1729 data/ui/multiband_gate.glade:617 #: data/ui/multiband_gate.glade:1028 data/ui/multiband_gate.glade:1441 #: data/ui/multiband_gate.glade:1854 msgid "Solo" msgstr "Sozinho" #: data/ui/equalizer_preset_row.glade:39 data/ui/irs_row.glade:44 msgid "Apply" msgstr "Aplicar" #: data/ui/exciter.glade:116 msgid "Exciter" msgstr "Excitador" #: data/ui/exciter.glade:472 data/ui/maximizer.glade:254 msgid "Ceiling" msgstr "Teto" #: data/ui/filter.glade:97 msgid "Filter" msgstr "Filtro" #: data/ui/filter.glade:147 msgid "Muted" msgstr "Mudo" #: data/ui/filter.glade:159 data/ui/reverb.glade:233 msgid "Disco" msgstr "Discoteca" #: data/ui/filter.glade:171 msgid "Distant Headphones" msgstr "Fones de Ouvido Distantes" #: data/ui/filter.glade:360 msgid "12dB/oct Lowpass" msgstr "12dB/oct Passa-Baixa" #: data/ui/filter.glade:361 msgid "24dB/oct Lowpass" msgstr "24dB/oct Passa-Baixa" #: data/ui/filter.glade:362 msgid "36dB/oct Lowpass" msgstr "36dB/oct Passa-Baixa" #: data/ui/filter.glade:363 msgid "12dB/oct Highpass" msgstr "12dB/oct Passa-Alta" #: data/ui/filter.glade:364 msgid "24dB/oct Highpass" msgstr "24dB/oct Passa-Alta" #: data/ui/filter.glade:365 msgid "36dB/oct Highpass" msgstr "36dB/oct Passa-Alta" #: data/ui/filter.glade:366 msgid "6dB/oct Bandpass" msgstr "6dB/oct Passa-Banda" #: data/ui/filter.glade:367 msgid "12dB/oct Bandpass" msgstr "12dB/oct Passa-Banda" #: data/ui/filter.glade:368 msgid "18dB/oct Bandpass" msgstr "18dB/oct Passa-Banda" #: data/ui/filter.glade:369 msgid "6dB/oct Bandreject" msgstr "6dB/oct Rejeita-Faixa" #: data/ui/filter.glade:370 msgid "12dB/oct Bandreject" msgstr "12dB/oct Rejeita-Faixa" #: data/ui/filter.glade:371 msgid "18dB/oct Bandreject" msgstr "18dB/oct Rejeita-Faixa" #: data/ui/filter.glade:460 msgid "Inertia" msgstr "Inércia" #: data/ui/general_settings.glade:58 msgid "Start Service at Login" msgstr "Inicializar Serviço no Login" #: data/ui/general_settings.glade:82 msgid "Process All Outputs" msgstr "Processar Todas as Saídas" #: data/ui/general_settings.glade:94 msgid "Process All Inputs" msgstr "Processar Todas as Entradas" #: data/ui/general_settings.glade:130 msgid "Use Dark Theme" msgstr "Usar Tema Escuro" #: data/ui/general_settings.glade:158 data/ui/general_settings.glade:220 msgid "Niceness" msgstr "Gentileza" #: data/ui/general_settings.glade:159 msgid "Real Time" msgstr "Tempo Real" #: data/ui/general_settings.glade:160 msgid "None" msgstr "Nenhuma" #: data/ui/general_settings.glade:208 msgid "Priority Type" msgstr "Tipo de Prioridade" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "Prioridade" #: data/ui/general_settings.glade:244 msgid "Activity Timeout" msgstr "" #: data/ui/general_settings.glade:325 msgid "About" msgstr "Sobre" #: data/ui/gate.glade:97 msgid "Gate" msgstr "Gate" #: data/ui/gate.glade:330 #, fuzzy msgid "Maximum Gain Reduction" msgstr "Redução de Ganho" #: data/ui/gate.glade:379 msgid "Stereo Link" msgstr "Elo Stereo" #: data/ui/gate.glade:393 msgid "Average" msgstr "Médio" #: data/ui/gate.glade:394 msgid "Maximum" msgstr "Máximo" #: data/ui/gate.glade:632 #, fuzzy msgid "Input Level" msgstr "Dispositivo de Entrada" #: data/ui/gate.glade:864 data/ui/multiband_gate.glade:911 #: data/ui/multiband_gate.glade:1323 data/ui/multiband_gate.glade:1736 #: data/ui/multiband_gate.glade:2149 msgid "Gating" msgstr "Gating" #: data/ui/limiter.glade:96 data/ui/webrtc.glade:612 msgid "Limiter" msgstr "Limitador" #: data/ui/limiter.glade:266 msgid "Automatic Smoothing Control" msgstr "" #: data/ui/limiter.glade:278 msgid "Automatic Leveling" msgstr "" #: data/ui/limiter.glade:308 msgid "Limit" msgstr "Limite" #: data/ui/limiter.glade:409 msgid "Oversampling" msgstr "Oversampling" #: data/ui/limiter.glade:447 msgid "ASC" msgstr "ASC" #: data/ui/limiter.glade:595 msgid "Attenuation" msgstr "Atenuação" #: data/ui/loudness.glade:90 msgid "Loudness Compensator" msgstr "" #: data/ui/loudness.glade:328 msgid "Standard" msgstr "" #: data/ui/loudness.glade:341 msgid "Flat" msgstr "Plano" #: data/ui/loudness.glade:342 msgid "ISO226-2003" msgstr "" #: data/ui/loudness.glade:343 msgid "Fletcher-Munson" msgstr "" #: data/ui/loudness.glade:344 msgid "Robinson-Dadson" msgstr "" #: data/ui/loudness.glade:370 #, fuzzy msgid "FFT Size" msgstr "Tamanho do Quadro" #: data/ui/maximizer.glade:95 msgid "Maximizer" msgstr "Maximizador" #: data/ui/maximizer.glade:386 msgid "Gain Reduction" msgstr "Redução de Ganho" #: data/ui/multiband_compressor.glade:139 msgid "Multiband Compressor" msgstr "Compressor Multibandas" #: data/ui/multiband_compressor.glade:426 data/ui/multiband_gate.glade:450 msgid "LR4" msgstr "LR4" #: data/ui/multiband_compressor.glade:427 data/ui/multiband_gate.glade:451 msgid "LR8" msgstr "LR8" #: data/ui/multiband_compressor.glade:441 data/ui/multiband_gate.glade:465 msgid "Split 1/2" msgstr "Disivão 1/2" #: data/ui/multiband_compressor.glade:454 data/ui/multiband_gate.glade:478 msgid "Split 2/3" msgstr "Disivão 2/3" #: data/ui/multiband_compressor.glade:467 data/ui/multiband_gate.glade:491 msgid "Split 3/4" msgstr "Disivão 3/4" #: data/ui/multiband_compressor.glade:854 #: data/ui/multiband_compressor.glade:1232 #: data/ui/multiband_compressor.glade:1611 #: data/ui/multiband_compressor.glade:1990 msgid "Compression" msgstr "Compressão" #: data/ui/multiband_compressor.glade:937 data/ui/multiband_gate.glade:994 msgid "Sub Band" msgstr "Banda" #: data/ui/multiband_compressor.glade:1315 data/ui/multiband_gate.glade:1406 msgid "Low Band" msgstr "Banda Baixa" #: data/ui/multiband_compressor.glade:1694 data/ui/multiband_gate.glade:1819 msgid "Mid Band" msgstr "Banda Média" #: data/ui/multiband_compressor.glade:2073 data/ui/multiband_gate.glade:2232 msgid "High Band" msgstr "Banda Alta" #: data/ui/multiband_gate.glade:139 msgid "Multiband Gate" msgstr "Gate Multibandas" #: data/ui/pitch.glade:102 msgid "Pitch" msgstr "Altura" #: data/ui/pitch.glade:270 msgid "Cents" msgstr "Cents" #: data/ui/pitch.glade:300 msgid "Semitones" msgstr "Semitons" #: data/ui/pitch.glade:330 msgid "Octaves" msgstr "Oitavas" #: data/ui/pitch.glade:360 msgid "Crispness" msgstr "Clareza" #: data/ui/pitch.glade:402 msgid "Faster" msgstr "Mais Rápido" #: data/ui/pitch.glade:414 msgid "Preserve Formant" msgstr "Preservar Formante" #: data/ui/preset_row.glade:55 msgid "Load" msgstr "" #: data/ui/preset_row.glade:70 msgid "Save current settings to this preset file" msgstr "Salvar Configurações atuais para este arquivo de predefinição" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "Remover este arquivo de predefinição" #: data/ui/preset_row.glade:98 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" "Aplique automaticamente esta predefinição sempre que o dispositivo usado " "atualmente for conectado no sistema" #: data/ui/presets_menu.glade:81 data/ui/presets_menu.glade:182 #: src/presets_menu_ui.cpp:129 msgid "Import Presets" msgstr "Importar Predefinições" #: data/ui/pulse_info.glade:77 msgid "Version" msgstr "Versão" #: data/ui/pulse_info.glade:104 msgid "Default Sink" msgstr "Saída Padrão" #: data/ui/pulse_info.glade:116 msgid "Default Source" msgstr "Entrada Padrão" #: data/ui/pulse_info.glade:158 msgid "Protocol" msgstr "Protocolo" #: data/ui/pulse_info.glade:185 msgid "Default Sample Format" msgstr "Formato de Amostra Padrão" #: data/ui/pulse_info.glade:212 msgid "Default Sampling Rate" msgstr "Taxa de Amostragem Padrão" #: data/ui/pulse_info.glade:266 msgid "Channel Mapping" msgstr "Mapeamento de Canal" #: data/ui/pulse_info.glade:291 msgid "Server" msgstr "Servidor" #: data/ui/pulse_info.glade:336 msgid "Modules" msgstr "Módulos" #: data/ui/pulse_info.glade:382 msgid "Clients" msgstr "Clientes" #: data/ui/pulse_info.glade:446 msgid "File" msgstr "Arquivo" #: data/ui/pulse_info.glade:456 msgid "Configuration" msgstr "Configuração" #: data/ui/pulse_info.glade:489 msgid "Resamplers" msgstr "Resamplers" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:403 msgid "Use Default" msgstr "Usar Padrão" #: data/ui/pulse_settings.glade:147 data/ui/pulse_settings.glade:452 msgid "Pipeline Input" msgstr "Entrada da Pipeline" #: data/ui/pulse_settings.glade:247 data/ui/pulse_settings.glade:552 msgid "Pipeline Output" msgstr "Saída da Pipeline" #: data/ui/pulse_settings.glade:347 data/ui/pulse_settings.glade:652 msgid "Block Size" msgstr "Tamanho do Bloco" #: data/ui/reverb.glade:130 msgid "Reverberation" msgstr "Reverberação" #: data/ui/reverb.glade:181 msgid "Ambience" msgstr "Ambiente" #: data/ui/reverb.glade:194 msgid "Empty Walls" msgstr "Paredes Vazias" #: data/ui/reverb.glade:207 msgid "Room" msgstr "Quarto" #: data/ui/reverb.glade:220 msgid "Large Empty Hall" msgstr "Grande Salão Vazio" #: data/ui/reverb.glade:246 msgid "Large Occupied Hall" msgstr "Grande Salão Ocupado" #: data/ui/reverb.glade:453 msgid "Pre Delay" msgstr "Pré Atraso" #: data/ui/reverb.glade:465 msgid "Decay Time" msgstr "Tempo de Decaimento" #: data/ui/reverb.glade:531 msgid "Dry" msgstr "Seco" #: data/ui/reverb.glade:563 msgid "Bass Cut" msgstr "Corte de Grave" #: data/ui/reverb.glade:615 msgid "Treble Cut" msgstr "Corte de Agudo" #: data/ui/reverb.glade:660 msgid "Diffusion" msgstr "Difusão" #: data/ui/reverb.glade:672 msgid "Room Size" msgstr "Tamanho do quarto" #: data/ui/reverb.glade:684 msgid "Small" msgstr "Pequeno" #: data/ui/reverb.glade:685 msgid "Medium" msgstr "Médio" #: data/ui/reverb.glade:686 msgid "Large" msgstr "Grande" #: data/ui/reverb.glade:687 msgid "Tunnel" msgstr "Túnel" #: data/ui/reverb.glade:688 msgid "Large/smooth" msgstr "Grande/Suave" #: data/ui/reverb.glade:689 msgid "Experimental" msgstr "Experimental" #: data/ui/reverb.glade:702 msgid "High Frequency Damping" msgstr "Amortecimento de Alta Frequência" #: data/ui/spectrum_settings.glade:77 msgid "Show Spectrum" msgstr "Mostrar Espectro" #: data/ui/spectrum_settings.glade:89 msgid "Fill" msgstr "Preencher" #: data/ui/spectrum_settings.glade:125 msgid "Border" msgstr "Borda" #: data/ui/spectrum_settings.glade:149 msgid "Use Custom Color" msgstr "Usar Cor Customizada" #: data/ui/spectrum_settings.glade:173 msgid "Use Gradient" msgstr "Usar Gradiente" #: data/ui/spectrum_settings.glade:315 msgid "Points" msgstr "Pontos" #: data/ui/spectrum_settings.glade:327 msgid "Height" msgstr "Altura" #: data/ui/spectrum_settings.glade:339 msgid "Line Width" msgstr "Largura da Linha" #: data/ui/spectrum_settings.glade:351 msgid "Sampling" msgstr "Amostragem" #: data/ui/spectrum_settings.glade:363 #, fuzzy msgid "Minimum Frequency" msgstr "Frequência" #: data/ui/spectrum_settings.glade:375 #, fuzzy msgid "Maximum Frequency" msgstr "Frequência" #: data/ui/spectrum_settings.glade:410 msgid "Spectrum Type" msgstr "Tipo de Espectro" #: data/ui/spectrum_settings.glade:423 msgid "Bars" msgstr "Barras" #: data/ui/spectrum_settings.glade:424 msgid "Lines" msgstr "Linhas" #: data/ui/spectrum_settings.glade:437 msgid "Spectrum Color" msgstr "Cor do Espectro" #: data/ui/spectrum_settings.glade:449 msgid "Gradient Color" msgstr "Cor do Gradiente" #: data/ui/spectrum_settings.glade:461 msgid "Axis Color" msgstr "" #: data/ui/stereo_tools.glade:108 msgid "Stereo Tools" msgstr "Ferramentas Stereo" #: data/ui/stereo_tools.glade:334 data/ui/stereo_tools.glade:775 msgid "Balance" msgstr "Balanço" #: data/ui/stereo_tools.glade:365 msgid "S/C Level" msgstr "Nível de S/C" #: data/ui/stereo_tools.glade:406 msgid "Softclip" msgstr "Clipe Macio" #: data/ui/stereo_tools.glade:452 msgid "Side Level" msgstr "Nível Lateral" #: data/ui/stereo_tools.glade:503 msgid "Side Balance" msgstr "Balanço Lateral" #: data/ui/stereo_tools.glade:535 msgid "Middle Level" msgstr "Nível do Meio" #: data/ui/stereo_tools.glade:547 msgid "Middle Panorama" msgstr "Panorama do Meio" #: data/ui/stereo_tools.glade:604 msgid "LR > LR (Stereo Default)" msgstr "ED > ED (Stereo Padrão)" #: data/ui/stereo_tools.glade:605 msgid "LR > MS (Stereo to Mid-Side)" msgstr "ED > ML (Stereo para Meio-Lado)" #: data/ui/stereo_tools.glade:606 msgid "MS > LR (Mid-Side to Stereo)" msgstr "ML > ED (Meio-Lado para Stereo)" #: data/ui/stereo_tools.glade:607 msgid "LR > LL (Mono Left Channel)" msgstr "ED > EE (Canal Esquerdo Mono)" #: data/ui/stereo_tools.glade:608 msgid "LR > RR (Mono Right Channel)" msgstr "ED > DD (Canal Direito Mono)" #: data/ui/stereo_tools.glade:609 msgid "LR > L+R (Mono Sum L+R)" msgstr "ED > E+D (Soma Mono E+D)" #: data/ui/stereo_tools.glade:610 msgid "LR > RL (Stereo Flip Channels)" msgstr "ED > DL (Alternar Canais Stereo)" #: data/ui/stereo_tools.glade:627 msgid "Stereo Matrix" msgstr "Matriz Stereo" #: data/ui/stereo_tools.glade:668 data/ui/stereo_tools.glade:709 msgid "Invert Phase" msgstr "Inverter Fase" #: data/ui/stereo_tools.glade:806 msgid "Delay L/R" msgstr "Atraso E/D" #: data/ui/stereo_tools.glade:839 msgid "Stereo Base" msgstr "Base Stereo" #: data/ui/stereo_tools.glade:871 msgid "Stereo Phase" msgstr "Fase Stereo" #: data/ui/webrtc.glade:96 msgid "WebRTC" msgstr "" #: data/ui/webrtc.glade:256 data/ui/webrtc.glade:389 data/ui/webrtc.glade:460 #: data/ui/webrtc.glade:648 msgid "Enable" msgstr "Habilitar" #: data/ui/webrtc.glade:279 msgid "Extended Filter" msgstr "Filtro Estendido" #: data/ui/webrtc.glade:292 msgid "High Pass Filter" msgstr "Filtro Passa-Alta" #: data/ui/webrtc.glade:309 data/ui/webrtc.glade:425 data/ui/webrtc.glade:698 msgid "Low" msgstr "Baixo" #: data/ui/webrtc.glade:310 data/ui/webrtc.glade:426 data/ui/webrtc.glade:699 msgid "Moderate" msgstr "Moderado" #: data/ui/webrtc.glade:311 data/ui/webrtc.glade:427 data/ui/webrtc.glade:700 msgid "High" msgstr "Alto" #: data/ui/webrtc.glade:324 data/ui/webrtc.glade:412 #, fuzzy msgid "Suppression Level" msgstr "Nível de Supressão" #: data/ui/webrtc.glade:361 msgid "Delay Agnostic" msgstr "Atraso Agnóstico" #: data/ui/webrtc.glade:375 msgid "Echo Canceller" msgstr "Cancelador de Eco" #: data/ui/webrtc.glade:428 msgid "Very High" msgstr "Muito Alto" #: data/ui/webrtc.glade:445 msgid "Noise Suppressor" msgstr "Supressor de Ruído" #: data/ui/webrtc.glade:496 msgid "Adaptive Digital" msgstr "Digital Adaptativo" #: data/ui/webrtc.glade:497 msgid "Fixed Digital" msgstr "Digital Fixo" #: data/ui/webrtc.glade:514 msgid "Gain Controller" msgstr "Controlador de Ganho" #: data/ui/webrtc.glade:540 msgid "Target Level" msgstr "Nível Alvo" #: data/ui/webrtc.glade:572 msgid "Maximum Gain" msgstr "Ganho Máximo" #: data/ui/webrtc.glade:672 msgid "Detection Likelihood" msgstr "Probabilidade de Detecção" #: data/ui/webrtc.glade:684 msgid "Frame Size" msgstr "Tamanho do Quadro" #: data/ui/webrtc.glade:697 msgid "Very Low" msgstr "Muito Baixo" #: data/ui/webrtc.glade:737 msgid "Voice Detector" msgstr "Detector de Voz" #: data/ui/rnnoise.glade:90 #, fuzzy msgid "Noise Reduction" msgstr "Redução de Ganho" #: data/ui/rnnoise.glade:242 #, fuzzy msgid "Import Model" msgstr "Importar Impulso" #: data/ui/rnnoise.glade:246 #, fuzzy msgid "Import Model File" msgstr "Importar Arquivo com a Resposta de Impulso" #: data/ui/rnnoise.glade:311 #, fuzzy msgid "Active Model" msgstr "Modo Agressivo" #: data/ui/rnnoise.glade:324 msgid "Standard RNNoise Model" msgstr "" #: src/app_info_ui.cpp:120 msgid "paused" msgstr "pausado" #: src/app_info_ui.cpp:122 msgid "playing" msgstr "tocando" #: src/application.cpp:38 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "Sair do PulseEffects. Útil quando executando em modo de serviço." #: src/application.cpp:40 msgid "Show available presets." msgstr "Mostrar predefinições disponíveis." #: src/application.cpp:43 msgid "Load a preset. Example: pulseeffects -l music" msgstr "Carregar uma predefinição. Exemplo: pulseeffects -l musica" #: src/application.cpp:45 msgid "Reset PulseEffects." msgstr "Redefinir o PulseEffects." #: src/application.cpp:48 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "" #: src/application.cpp:50 msgid "Hide the Window." msgstr "" #: src/application.cpp:284 msgid "Output Presets: " msgstr "Predefinições de Saída: " #: src/application.cpp:292 msgid "Input Presets: " msgstr "Predefinições de Entrada: " #: src/blocklist_settings_ui.cpp:191 msgid "Blocklist" msgstr "Lista Negra" #: src/calibration_ui.cpp:198 msgid "Calibration Microphone" msgstr "Microfone de Calibração" #: src/convolver_ui.cpp:281 msgid "Import Impulse File" msgstr "Importar Arquivo com a Resposta de Impulso" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Open" msgstr "Abrir" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Cancel" msgstr "Cancelar" #: src/convolver_ui.cpp:318 src/convolver_ui.cpp:319 src/convolver_ui.cpp:321 msgid "Failed" msgstr "Falhou" #: src/convolver_ui.cpp:323 msgid "Could Not Load The Impulse File" msgstr "Não Foi Possível Carregar o Arquivo com o Impulso" #: src/equalizer_ui.cpp:380 msgid "infinity" msgstr "infinito" #: src/equalizer_ui.cpp:738 #, fuzzy msgid "Import APO Preset File" msgstr "Importar Predefinições" #: src/equalizer_ui.cpp:743 #, fuzzy msgid "APO Presets" msgstr "Predefinições" #: src/general_settings_ui.cpp:149 msgid "General" msgstr "Geral" #: src/pulse_settings_ui.cpp:168 msgid "Pulseaudio" msgstr "Pulseaudio" #, fuzzy #~ msgid "Import APO Presets" #~ msgstr "Importar Predefinições" #~ msgid "Input Gain" #~ msgstr "Ganho de Entrada" #, fuzzy #~ msgid "Output Gain" #~ msgstr "Ganho de Entrada" #, fuzzy #~ msgid "Gain Detection" #~ msgstr "Redução de Ganho" #~ msgid "Scale" #~ msgstr "Escala" #~ msgid "Exponent" #~ msgstr "Expoente" easyeffects-4.8.7/po/pulseeffects.pot000066400000000000000000001105631424023573300176760ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pulseeffects package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: pulseeffects\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-14 23:58+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 data/ui/application.glade:61 msgid "PulseEffects" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:52 #: data/ui/compressor.glade:110 data/ui/compressor.glade:589 #: data/ui/webrtc.glade:633 msgid "Compressor" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:44 #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:47 msgid "\"Presets\"" msgstr "" #: data/ui/about.glade.in:11 msgid "Audio effects for PulseAudio applications" msgstr "" #: data/ui/app_button_row.glade:49 msgid "Applications" msgstr "" #: data/ui/app_info.glade:203 msgid "Add to Blocklist" msgstr "" #: data/ui/app_info.glade:239 msgid "Format" msgstr "" #: data/ui/app_info.glade:264 data/ui/convolver.glade:348 msgid "Rate" msgstr "" #: data/ui/app_info.glade:289 data/ui/pulse_info.glade:239 #: data/ui/stereo_tools.glade:756 msgid "Channels" msgstr "" #: data/ui/app_info.glade:314 msgid "Resampler" msgstr "" #: data/ui/app_info.glade:339 data/ui/pulse_settings.glade:159 #: data/ui/pulse_settings.glade:259 data/ui/pulse_settings.glade:464 #: data/ui/pulse_settings.glade:564 msgid "Buffer" msgstr "" #: data/ui/app_info.glade:364 data/ui/pulse_settings.glade:190 #: data/ui/pulse_settings.glade:290 data/ui/pulse_settings.glade:476 #: data/ui/pulse_settings.glade:576 msgid "Latency" msgstr "" #: data/ui/app_info.glade:389 msgid "State" msgstr "" #: data/ui/application.glade:142 src/calibration_ui.cpp:64 #: src/calibration_ui.cpp:191 msgid "Test Signals" msgstr "" #: data/ui/application.glade:157 msgid "Global Bypass" msgstr "" #: data/ui/application.glade:172 data/ui/equalizer.glade:331 #: data/ui/general_settings.glade:289 msgid "Settings" msgstr "" #: data/ui/application.glade:194 msgid "Help" msgstr "" #: data/ui/application.glade:217 data/ui/crossfeed.glade:240 #: data/ui/equalizer.glade:403 data/ui/filter.glade:344 #: data/ui/reverb.glade:401 src/presets_menu_ui.cpp:133 #: src/presets_menu_ui.cpp:285 src/presets_menu_ui.cpp:286 #: src/presets_menu_ui.cpp:303 src/presets_menu_ui.cpp:304 msgid "Presets" msgstr "" #: data/ui/autogain.glade:90 msgid "Auto Gain" msgstr "" #: data/ui/autogain.glade:161 data/ui/bass_enhancer.glade:167 #: data/ui/compressor.glade:214 data/ui/convolver.glade:218 #: data/ui/crossfeed.glade:136 data/ui/crystalizer.glade:134 #: data/ui/deesser.glade:182 data/ui/delay.glade:144 #: data/ui/equalizer.glade:450 data/ui/equalizer_band.glade:187 #: data/ui/equalizer_band.glade:230 data/ui/exciter.glade:167 #: data/ui/filter.glade:243 data/ui/general_settings.glade:298 #: data/ui/gate.glade:172 data/ui/limiter.glade:166 data/ui/loudness.glade:174 #: data/ui/maximizer.glade:139 data/ui/multiband_compressor.glade:307 #: data/ui/multiband_gate.glade:331 data/ui/pitch.glade:158 #: data/ui/reverb.glade:299 data/ui/stereo_tools.glade:194 #: data/ui/webrtc.glade:141 data/ui/rnnoise.glade:139 msgid "Reset" msgstr "" #: data/ui/autogain.glade:185 data/ui/rnnoise.glade:163 msgid "Based on" msgstr "" #: data/ui/autogain.glade:262 msgid "Reset History" msgstr "" #: data/ui/autogain.glade:274 msgid "Detect Silence" msgstr "" #: data/ui/autogain.glade:286 msgid "Use Geometric Mean" msgstr "" #: data/ui/autogain.glade:325 msgid "Target" msgstr "" #: data/ui/autogain.glade:374 data/ui/autogain.glade:779 msgid "Momentary" msgstr "" #: data/ui/autogain.glade:434 msgid "Weights" msgstr "" #: data/ui/autogain.glade:448 data/ui/autogain.glade:792 msgid "Short Term" msgstr "" #: data/ui/autogain.glade:497 data/ui/autogain.glade:805 msgid "Integrated" msgstr "" #: data/ui/autogain.glade:564 data/ui/autogain.glade:1076 #: data/ui/bass_enhancer.glade:596 data/ui/compressor.glade:1086 #: data/ui/convolver.glade:575 data/ui/crossfeed.glade:391 #: data/ui/crystalizer.glade:250 data/ui/deesser.glade:783 #: data/ui/delay.glade:328 data/ui/equalizer.glade:682 #: data/ui/exciter.glade:596 data/ui/filter.glade:508 data/ui/gate.glade:689 #: data/ui/limiter.glade:501 data/ui/loudness.glade:238 #: data/ui/loudness.glade:431 data/ui/maximizer.glade:358 #: data/ui/multiband_compressor.glade:2103 data/ui/multiband_gate.glade:2262 #: data/ui/pitch.glade:450 data/ui/presets_menu.glade:238 #: data/ui/reverb.glade:753 data/ui/stereo_tools.glade:427 #: data/ui/stereo_tools.glade:931 data/ui/webrtc.glade:780 #: data/ui/rnnoise.glade:362 msgid "Input" msgstr "" #: data/ui/autogain.glade:577 data/ui/autogain.glade:1020 #: data/ui/bass_enhancer.glade:625 data/ui/compressor.glade:1099 #: data/ui/convolver.glade:588 data/ui/crossfeed.glade:405 #: data/ui/crystalizer.glade:263 data/ui/deesser.glade:797 #: data/ui/delay.glade:341 data/ui/equalizer.glade:695 #: data/ui/exciter.glade:625 data/ui/filter.glade:521 data/ui/gate.glade:703 #: data/ui/limiter.glade:636 data/ui/loudness.glade:271 #: data/ui/loudness.glade:445 data/ui/maximizer.glade:372 #: data/ui/multiband_compressor.glade:894 #: data/ui/multiband_compressor.glade:1272 #: data/ui/multiband_compressor.glade:1651 #: data/ui/multiband_compressor.glade:2030 #: data/ui/multiband_compressor.glade:2116 data/ui/multiband_gate.glade:951 #: data/ui/multiband_gate.glade:1363 data/ui/multiband_gate.glade:1776 #: data/ui/multiband_gate.glade:2189 data/ui/multiband_gate.glade:2275 #: data/ui/pitch.glade:463 data/ui/presets_menu.glade:137 #: data/ui/reverb.glade:766 data/ui/stereo_tools.glade:901 #: data/ui/stereo_tools.glade:944 data/ui/webrtc.glade:794 #: data/ui/rnnoise.glade:375 msgid "Output" msgstr "" #: data/ui/autogain.glade:899 msgid "Relative" msgstr "" #: data/ui/autogain.glade:912 data/ui/compressor.glade:1262 msgid "Gain" msgstr "" #: data/ui/autogain.glade:980 msgid "Loudness" msgstr "" #: data/ui/autogain.glade:1034 msgid "Range" msgstr "" #: data/ui/bass_enhancer.glade:116 msgid "Bass Enhancer" msgstr "" #: data/ui/bass_enhancer.glade:191 data/ui/compressor.glade:238 #: data/ui/crossfeed.glade:160 data/ui/deesser.glade:206 #: data/ui/delay.glade:168 data/ui/equalizer.glade:474 #: data/ui/exciter.glade:191 data/ui/filter.glade:267 data/ui/gate.glade:196 #: data/ui/limiter.glade:190 data/ui/loudness.glade:143 #: data/ui/maximizer.glade:163 data/ui/multiband_compressor.glade:331 #: data/ui/multiband_gate.glade:355 data/ui/pitch.glade:182 #: data/ui/reverb.glade:323 data/ui/stereo_tools.glade:218 #: data/ui/webrtc.glade:165 msgid "Provided by" msgstr "" #: data/ui/bass_enhancer.glade:259 data/ui/compressor.glade:602 #: data/ui/deesser.glade:274 data/ui/exciter.glade:259 msgid "Listen" msgstr "" #: data/ui/bass_enhancer.glade:302 data/ui/exciter.glade:303 msgid "3rd" msgstr "" #: data/ui/bass_enhancer.glade:315 data/ui/exciter.glade:316 msgid "2nd" msgstr "" #: data/ui/bass_enhancer.glade:327 data/ui/exciter.glade:328 msgid "Blend Harmonics" msgstr "" #: data/ui/bass_enhancer.glade:355 data/ui/exciter.glade:357 #: data/ui/reverb.glade:498 msgid "Amount" msgstr "" #: data/ui/bass_enhancer.glade:367 data/ui/bass_enhancer.glade:504 #: data/ui/exciter.glade:369 data/ui/exciter.glade:504 msgid "Harmonics" msgstr "" #: data/ui/bass_enhancer.glade:379 data/ui/exciter.glade:381 msgid "Scope" msgstr "" #: data/ui/bass_enhancer.glade:472 msgid "Floor" msgstr "" #: data/ui/blocklist_settings.glade:52 data/ui/blocklist_settings.glade:155 #: data/ui/presets_menu.glade:65 data/ui/presets_menu.glade:166 msgid "Create Preset" msgstr "" #: data/ui/blocklist_settings.glade:68 data/ui/blocklist_settings.glade:171 #: data/ui/presets_menu.glade:52 data/ui/presets_menu.glade:153 #: data/ui/pulse_info.glade:50 msgid "Name" msgstr "" #: data/ui/blocklist_settings.glade:81 msgid "Reconnect the microphone to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:139 data/ui/pulse_settings.glade:383 msgid "Input Effects" msgstr "" #: data/ui/blocklist_settings.glade:230 msgid "Restart the player to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:242 data/ui/pulse_settings.glade:688 msgid "Output Effects" msgstr "" #: data/ui/blocklist_settings.glade:265 msgid "Show Blocklisted Apps in Main Tab" msgstr "" #: data/ui/calibration_signals.glade:32 msgid "Sine" msgstr "" #: data/ui/calibration_signals.glade:33 msgid "Square" msgstr "" #: data/ui/calibration_signals.glade:34 msgid "Saw" msgstr "" #: data/ui/calibration_signals.glade:35 msgid "Triangle" msgstr "" #: data/ui/calibration_signals.glade:36 msgid "Silence" msgstr "" #: data/ui/calibration_signals.glade:37 msgid "White Noise" msgstr "" #: data/ui/calibration_signals.glade:38 msgid "Pink Noise" msgstr "" #: data/ui/calibration_signals.glade:39 msgid "Sine Table" msgstr "" #: data/ui/calibration_signals.glade:40 msgid "Ticks" msgstr "" #: data/ui/calibration_signals.glade:41 msgid "Gaussian Noise" msgstr "" #: data/ui/calibration_signals.glade:42 msgid "Red Noise" msgstr "" #: data/ui/calibration_signals.glade:43 msgid "Blue Noise" msgstr "" #: data/ui/calibration_signals.glade:44 msgid "Violet Noise" msgstr "" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "" #: data/ui/calibration_signals.glade:135 data/ui/equalizer_band.glade:158 #: data/ui/filter.glade:394 msgid "Frequency" msgstr "" #: data/ui/calibration_mic.glade:33 msgid "Window" msgstr "" #: data/ui/calibration_mic.glade:90 msgid "Measure Noise" msgstr "" #: data/ui/calibration_mic.glade:119 msgid "Subtract Noise" msgstr "" #: data/ui/compressor.glade:386 data/ui/deesser.glade:436 #: data/ui/gate.glade:498 data/ui/maximizer.glade:242 #: data/ui/multiband_compressor.glade:707 #: data/ui/multiband_compressor.glade:1085 #: data/ui/multiband_compressor.glade:1464 #: data/ui/multiband_compressor.glade:1843 data/ui/multiband_gate.glade:731 #: data/ui/multiband_gate.glade:1142 data/ui/multiband_gate.glade:1555 #: data/ui/multiband_gate.glade:1968 msgid "Threshold" msgstr "" #: data/ui/compressor.glade:420 data/ui/deesser.glade:448 #: data/ui/gate.glade:532 data/ui/multiband_compressor.glade:741 #: data/ui/multiband_compressor.glade:1119 #: data/ui/multiband_compressor.glade:1498 #: data/ui/multiband_compressor.glade:1877 data/ui/multiband_gate.glade:765 #: data/ui/multiband_gate.glade:1176 data/ui/multiband_gate.glade:1589 #: data/ui/multiband_gate.glade:2002 msgid "Ratio" msgstr "" #: data/ui/compressor.glade:452 data/ui/gate.glade:564 #: data/ui/multiband_compressor.glade:773 #: data/ui/multiband_compressor.glade:1151 #: data/ui/multiband_compressor.glade:1530 #: data/ui/multiband_compressor.glade:1909 data/ui/multiband_gate.glade:797 #: data/ui/multiband_gate.glade:1208 data/ui/multiband_gate.glade:1621 #: data/ui/multiband_gate.glade:2034 msgid "Knee" msgstr "" #: data/ui/compressor.glade:486 data/ui/deesser.glade:532 #: data/ui/gate.glade:598 data/ui/multiband_compressor.glade:807 #: data/ui/multiband_compressor.glade:1185 #: data/ui/multiband_compressor.glade:1564 #: data/ui/multiband_compressor.glade:1943 data/ui/multiband_gate.glade:831 #: data/ui/multiband_gate.glade:1242 data/ui/multiband_gate.glade:1655 #: data/ui/multiband_gate.glade:2068 msgid "Makeup" msgstr "" #: data/ui/compressor.glade:520 data/ui/gate.glade:464 #: data/ui/limiter.glade:363 data/ui/maximizer.glade:266 #: data/ui/multiband_compressor.glade:673 #: data/ui/multiband_compressor.glade:1051 #: data/ui/multiband_compressor.glade:1430 #: data/ui/multiband_compressor.glade:1809 data/ui/multiband_gate.glade:697 #: data/ui/multiband_gate.glade:1108 data/ui/multiband_gate.glade:1521 #: data/ui/multiband_gate.glade:1934 msgid "Release" msgstr "" #: data/ui/compressor.glade:532 data/ui/gate.glade:430 #: data/ui/multiband_compressor.glade:639 #: data/ui/multiband_compressor.glade:1017 #: data/ui/multiband_compressor.glade:1396 #: data/ui/multiband_compressor.glade:1775 data/ui/multiband_gate.glade:663 #: data/ui/multiband_gate.glade:1074 data/ui/multiband_gate.glade:1487 #: data/ui/multiband_gate.glade:1900 msgid "Attack" msgstr "" #: data/ui/compressor.glade:559 msgid "Downward" msgstr "" #: data/ui/compressor.glade:560 msgid "Upward" msgstr "" #: data/ui/compressor.glade:573 msgid "Compression Mode" msgstr "" #: data/ui/compressor.glade:649 msgid "Pre-amplification" msgstr "" #: data/ui/compressor.glade:683 msgid "Reactivity" msgstr "" #: data/ui/compressor.glade:716 data/ui/limiter.glade:375 msgid "Lookahead" msgstr "" #: data/ui/compressor.glade:730 msgid "Feed-forward" msgstr "" #: data/ui/compressor.glade:731 msgid "Feed-back" msgstr "" #: data/ui/compressor.glade:744 data/ui/equalizer_band.glade:51 msgid "Type" msgstr "" #: data/ui/compressor.glade:758 data/ui/deesser.glade:731 #: data/ui/gate.glade:303 data/ui/multiband_compressor.glade:611 #: data/ui/multiband_compressor.glade:989 #: data/ui/multiband_compressor.glade:1368 #: data/ui/multiband_compressor.glade:1747 data/ui/multiband_gate.glade:635 #: data/ui/multiband_gate.glade:1046 data/ui/multiband_gate.glade:1459 #: data/ui/multiband_gate.glade:1872 msgid "Peak" msgstr "" #: data/ui/compressor.glade:759 data/ui/deesser.glade:730 #: data/ui/gate.glade:302 data/ui/multiband_compressor.glade:610 #: data/ui/multiband_compressor.glade:988 #: data/ui/multiband_compressor.glade:1367 #: data/ui/multiband_compressor.glade:1746 data/ui/multiband_gate.glade:634 #: data/ui/multiband_gate.glade:1045 data/ui/multiband_gate.glade:1458 #: data/ui/multiband_gate.glade:1871 msgid "RMS" msgstr "" #: data/ui/compressor.glade:760 msgid "Low-Pass" msgstr "" #: data/ui/compressor.glade:761 msgid "Uniform" msgstr "" #: data/ui/compressor.glade:774 data/ui/deesser.glade:702 #: data/ui/equalizer.glade:257 data/ui/equalizer_band.glade:84 #: data/ui/multiband_compressor.glade:412 data/ui/multiband_gate.glade:436 #: data/ui/stereo_tools.glade:591 data/ui/webrtc.glade:483 msgid "Mode" msgstr "" #: data/ui/compressor.glade:788 msgid "Middle" msgstr "" #: data/ui/compressor.glade:789 msgid "Side" msgstr "" #: data/ui/compressor.glade:790 data/ui/delay.glade:247 #: data/ui/equalizer.glade:612 data/ui/stereo_tools.glade:655 msgid "Left" msgstr "" #: data/ui/compressor.glade:791 data/ui/delay.glade:280 #: data/ui/equalizer.glade:654 data/ui/stereo_tools.glade:724 msgid "Right" msgstr "" #: data/ui/compressor.glade:804 msgid "Source" msgstr "" #: data/ui/compressor.glade:820 data/ui/compressor.glade:1274 msgid "Sidechain" msgstr "" #: data/ui/compressor.glade:925 msgid "Relative Release Threshold" msgstr "" #: data/ui/compressor.glade:937 msgid "Boost Threshold" msgstr "" #: data/ui/compressor.glade:949 msgid "High-pass Frequency" msgstr "" #: data/ui/compressor.glade:961 msgid "Low-pass Frequency" msgstr "" #: data/ui/compressor.glade:973 msgid "High-pass Filter Mode" msgstr "" #: data/ui/compressor.glade:985 msgid "Low-pass Filter Mode" msgstr "" #: data/ui/compressor.glade:999 data/ui/compressor.glade:1017 #: data/ui/equalizer_band.glade:63 msgid "Off" msgstr "" #: data/ui/compressor.glade:1000 data/ui/compressor.glade:1018 msgid "12 dB/oct" msgstr "" #: data/ui/compressor.glade:1001 data/ui/compressor.glade:1019 msgid "24 dB/oct" msgstr "" #: data/ui/compressor.glade:1002 data/ui/compressor.glade:1020 msgid "36 dB/oct" msgstr "" #: data/ui/compressor.glade:1043 msgid "Advanced" msgstr "" #: data/ui/compressor.glade:1347 msgid "Curve" msgstr "" #: data/ui/convolver.glade:90 msgid "Convolver" msgstr "" #: data/ui/convolver.glade:125 msgid "Import Impulse" msgstr "" #: data/ui/convolver.glade:129 msgid "Import Impulse Response File" msgstr "" #: data/ui/convolver.glade:309 msgid "L" msgstr "" #: data/ui/convolver.glade:323 msgid "R" msgstr "" #: data/ui/convolver.glade:390 msgid "Duration" msgstr "" #: data/ui/convolver.glade:402 msgid "Samples" msgstr "" #: data/ui/convolver.glade:435 src/convolver_ui.cpp:285 msgid "Impulse Response" msgstr "" #: data/ui/convolver.glade:458 msgid "Select the impulse Response File" msgstr "" #: data/ui/convolver.glade:477 src/spectrum_settings_ui.cpp:195 msgid "Spectrum" msgstr "" #: data/ui/convolver.glade:520 msgid "Stereo Width" msgstr "" #: data/ui/crossfeed.glade:104 msgid "Crossfeed" msgstr "" #: data/ui/crossfeed.glade:254 msgid "Jmeier" msgstr "" #: data/ui/crossfeed.glade:266 data/ui/filter.glade:183 #: data/ui/reverb.glade:259 msgid "Default" msgstr "" #: data/ui/crossfeed.glade:278 msgid "Cmoy" msgstr "" #: data/ui/crossfeed.glade:308 msgid "Cutoff" msgstr "" #: data/ui/crossfeed.glade:341 msgid "Feed" msgstr "" #: data/ui/crystalizer.glade:90 msgid "Crystalizer" msgstr "" #: data/ui/crystalizer.glade:200 msgid "Aggressive Mode" msgstr "" #: data/ui/crystalizer.glade:464 msgid "Before" msgstr "" #: data/ui/crystalizer.glade:477 msgid "After" msgstr "" #: data/ui/crystalizer.glade:550 msgid "Loudness Range" msgstr "" #: data/ui/crystalizer_band.glade:28 data/ui/equalizer_band.glade:316 #: data/ui/stereo_tools.glade:680 data/ui/stereo_tools.glade:737 msgid "Mute" msgstr "" #: data/ui/crystalizer_band.glade:40 data/ui/multiband_compressor.glade:580 #: data/ui/multiband_compressor.glade:958 #: data/ui/multiband_compressor.glade:1337 #: data/ui/multiband_compressor.glade:1716 data/ui/multiband_gate.glade:604 #: data/ui/multiband_gate.glade:1015 data/ui/multiband_gate.glade:1428 #: data/ui/multiband_gate.glade:1841 msgid "Bypass" msgstr "" #: data/ui/deesser.glade:125 msgid "Deesser" msgstr "" #: data/ui/deesser.glade:309 msgid "F1 Gain" msgstr "" #: data/ui/deesser.glade:321 msgid "F2 Level" msgstr "" #: data/ui/deesser.glade:333 msgid "F2 Peak Q" msgstr "" #: data/ui/deesser.glade:424 msgid "Laxity" msgstr "" #: data/ui/deesser.glade:585 msgid "F1 Split" msgstr "" #: data/ui/deesser.glade:597 msgid "F2 Peak" msgstr "" #: data/ui/deesser.glade:690 data/ui/gate.glade:288 msgid "Detection" msgstr "" #: data/ui/deesser.glade:715 msgid "Wide" msgstr "" #: data/ui/deesser.glade:716 msgid "Split" msgstr "" #: data/ui/deesser.glade:959 data/ui/multiband_gate.glade:865 #: data/ui/multiband_gate.glade:1298 data/ui/multiband_gate.glade:1711 #: data/ui/multiband_gate.glade:2124 msgid "Reduction" msgstr "" #: data/ui/deesser.glade:972 msgid "Detected" msgstr "" #: data/ui/delay.glade:90 msgid "Delay" msgstr "" #: data/ui/equalizer.glade:44 msgid "Equalizer" msgstr "" #: data/ui/equalizer.glade:160 msgid "Flat Response" msgstr "" #: data/ui/equalizer.glade:175 msgid "Calculate Frequencies" msgstr "" #: data/ui/equalizer.glade:213 msgid "Bands" msgstr "" #: data/ui/equalizer.glade:269 msgid "IIR" msgstr "" #: data/ui/equalizer.glade:270 msgid "FIR" msgstr "" #: data/ui/equalizer.glade:271 msgid "FFT" msgstr "" #: data/ui/equalizer.glade:304 msgid "Split Channels" msgstr "" #: data/ui/equalizer.glade:389 msgid "Apply APO Preset" msgstr "" #: data/ui/equalizer_band.glade:64 msgid "Bell" msgstr "" #: data/ui/equalizer_band.glade:65 msgid "High Pass" msgstr "" #: data/ui/equalizer_band.glade:66 msgid "High Shelf" msgstr "" #: data/ui/equalizer_band.glade:67 msgid "Low Pass" msgstr "" #: data/ui/equalizer_band.glade:68 msgid "Low Shelf" msgstr "" #: data/ui/equalizer_band.glade:69 msgid "Notch" msgstr "" #: data/ui/equalizer_band.glade:70 data/ui/filter.glade:427 msgid "Resonance" msgstr "" #: data/ui/equalizer_band.glade:71 msgid "All Pass" msgstr "" #: data/ui/equalizer_band.glade:96 msgid "RLC (BT)" msgstr "" #: data/ui/equalizer_band.glade:97 msgid "RLC (MT)" msgstr "" #: data/ui/equalizer_band.glade:98 msgid "BWC (BT)" msgstr "" #: data/ui/equalizer_band.glade:99 msgid "BWC (MT)" msgstr "" #: data/ui/equalizer_band.glade:100 msgid "LRX (BT)" msgstr "" #: data/ui/equalizer_band.glade:101 msgid "LRX (MT)" msgstr "" #: data/ui/equalizer_band.glade:102 msgid "APO (DR)" msgstr "" #: data/ui/equalizer_band.glade:115 msgid "Slope" msgstr "" #: data/ui/equalizer_band.glade:203 msgid "Quality" msgstr "" #: data/ui/equalizer_band.glade:253 msgid "Width" msgstr "" #: data/ui/equalizer_band.glade:304 data/ui/multiband_compressor.glade:593 #: data/ui/multiband_compressor.glade:971 #: data/ui/multiband_compressor.glade:1350 #: data/ui/multiband_compressor.glade:1729 data/ui/multiband_gate.glade:617 #: data/ui/multiband_gate.glade:1028 data/ui/multiband_gate.glade:1441 #: data/ui/multiband_gate.glade:1854 msgid "Solo" msgstr "" #: data/ui/equalizer_preset_row.glade:39 data/ui/irs_row.glade:44 msgid "Apply" msgstr "" #: data/ui/exciter.glade:116 msgid "Exciter" msgstr "" #: data/ui/exciter.glade:472 data/ui/maximizer.glade:254 msgid "Ceiling" msgstr "" #: data/ui/filter.glade:97 msgid "Filter" msgstr "" #: data/ui/filter.glade:147 msgid "Muted" msgstr "" #: data/ui/filter.glade:159 data/ui/reverb.glade:233 msgid "Disco" msgstr "" #: data/ui/filter.glade:171 msgid "Distant Headphones" msgstr "" #: data/ui/filter.glade:360 msgid "12dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:361 msgid "24dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:362 msgid "36dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:363 msgid "12dB/oct Highpass" msgstr "" #: data/ui/filter.glade:364 msgid "24dB/oct Highpass" msgstr "" #: data/ui/filter.glade:365 msgid "36dB/oct Highpass" msgstr "" #: data/ui/filter.glade:366 msgid "6dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:367 msgid "12dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:368 msgid "18dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:369 msgid "6dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:370 msgid "12dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:371 msgid "18dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:460 msgid "Inertia" msgstr "" #: data/ui/general_settings.glade:58 msgid "Start Service at Login" msgstr "" #: data/ui/general_settings.glade:82 msgid "Process All Outputs" msgstr "" #: data/ui/general_settings.glade:94 msgid "Process All Inputs" msgstr "" #: data/ui/general_settings.glade:130 msgid "Use Dark Theme" msgstr "" #: data/ui/general_settings.glade:158 data/ui/general_settings.glade:220 msgid "Niceness" msgstr "" #: data/ui/general_settings.glade:159 msgid "Real Time" msgstr "" #: data/ui/general_settings.glade:160 msgid "None" msgstr "" #: data/ui/general_settings.glade:208 msgid "Priority Type" msgstr "" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "" #: data/ui/general_settings.glade:244 msgid "Activity Timeout" msgstr "" #: data/ui/general_settings.glade:325 msgid "About" msgstr "" #: data/ui/gate.glade:97 msgid "Gate" msgstr "" #: data/ui/gate.glade:330 msgid "Maximum Gain Reduction" msgstr "" #: data/ui/gate.glade:379 msgid "Stereo Link" msgstr "" #: data/ui/gate.glade:393 msgid "Average" msgstr "" #: data/ui/gate.glade:394 msgid "Maximum" msgstr "" #: data/ui/gate.glade:632 msgid "Input Level" msgstr "" #: data/ui/gate.glade:864 data/ui/multiband_gate.glade:911 #: data/ui/multiband_gate.glade:1323 data/ui/multiband_gate.glade:1736 #: data/ui/multiband_gate.glade:2149 msgid "Gating" msgstr "" #: data/ui/limiter.glade:96 data/ui/webrtc.glade:612 msgid "Limiter" msgstr "" #: data/ui/limiter.glade:266 msgid "Automatic Smoothing Control" msgstr "" #: data/ui/limiter.glade:278 msgid "Automatic Leveling" msgstr "" #: data/ui/limiter.glade:308 msgid "Limit" msgstr "" #: data/ui/limiter.glade:409 msgid "Oversampling" msgstr "" #: data/ui/limiter.glade:447 msgid "ASC" msgstr "" #: data/ui/limiter.glade:595 msgid "Attenuation" msgstr "" #: data/ui/loudness.glade:90 msgid "Loudness Compensator" msgstr "" #: data/ui/loudness.glade:328 msgid "Standard" msgstr "" #: data/ui/loudness.glade:341 msgid "Flat" msgstr "" #: data/ui/loudness.glade:342 msgid "ISO226-2003" msgstr "" #: data/ui/loudness.glade:343 msgid "Fletcher-Munson" msgstr "" #: data/ui/loudness.glade:344 msgid "Robinson-Dadson" msgstr "" #: data/ui/loudness.glade:370 msgid "FFT Size" msgstr "" #: data/ui/maximizer.glade:95 msgid "Maximizer" msgstr "" #: data/ui/maximizer.glade:386 msgid "Gain Reduction" msgstr "" #: data/ui/multiband_compressor.glade:139 msgid "Multiband Compressor" msgstr "" #: data/ui/multiband_compressor.glade:426 data/ui/multiband_gate.glade:450 msgid "LR4" msgstr "" #: data/ui/multiband_compressor.glade:427 data/ui/multiband_gate.glade:451 msgid "LR8" msgstr "" #: data/ui/multiband_compressor.glade:441 data/ui/multiband_gate.glade:465 msgid "Split 1/2" msgstr "" #: data/ui/multiband_compressor.glade:454 data/ui/multiband_gate.glade:478 msgid "Split 2/3" msgstr "" #: data/ui/multiband_compressor.glade:467 data/ui/multiband_gate.glade:491 msgid "Split 3/4" msgstr "" #: data/ui/multiband_compressor.glade:854 #: data/ui/multiband_compressor.glade:1232 #: data/ui/multiband_compressor.glade:1611 #: data/ui/multiband_compressor.glade:1990 msgid "Compression" msgstr "" #: data/ui/multiband_compressor.glade:937 data/ui/multiband_gate.glade:994 msgid "Sub Band" msgstr "" #: data/ui/multiband_compressor.glade:1315 data/ui/multiband_gate.glade:1406 msgid "Low Band" msgstr "" #: data/ui/multiband_compressor.glade:1694 data/ui/multiband_gate.glade:1819 msgid "Mid Band" msgstr "" #: data/ui/multiband_compressor.glade:2073 data/ui/multiband_gate.glade:2232 msgid "High Band" msgstr "" #: data/ui/multiband_gate.glade:139 msgid "Multiband Gate" msgstr "" #: data/ui/pitch.glade:102 msgid "Pitch" msgstr "" #: data/ui/pitch.glade:270 msgid "Cents" msgstr "" #: data/ui/pitch.glade:300 msgid "Semitones" msgstr "" #: data/ui/pitch.glade:330 msgid "Octaves" msgstr "" #: data/ui/pitch.glade:360 msgid "Crispness" msgstr "" #: data/ui/pitch.glade:402 msgid "Faster" msgstr "" #: data/ui/pitch.glade:414 msgid "Preserve Formant" msgstr "" #: data/ui/preset_row.glade:55 msgid "Load" msgstr "" #: data/ui/preset_row.glade:70 msgid "Save current settings to this preset file" msgstr "" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "" #: data/ui/preset_row.glade:98 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" #: data/ui/presets_menu.glade:81 data/ui/presets_menu.glade:182 #: src/presets_menu_ui.cpp:129 msgid "Import Presets" msgstr "" #: data/ui/pulse_info.glade:77 msgid "Version" msgstr "" #: data/ui/pulse_info.glade:104 msgid "Default Sink" msgstr "" #: data/ui/pulse_info.glade:116 msgid "Default Source" msgstr "" #: data/ui/pulse_info.glade:158 msgid "Protocol" msgstr "" #: data/ui/pulse_info.glade:185 msgid "Default Sample Format" msgstr "" #: data/ui/pulse_info.glade:212 msgid "Default Sampling Rate" msgstr "" #: data/ui/pulse_info.glade:266 msgid "Channel Mapping" msgstr "" #: data/ui/pulse_info.glade:291 msgid "Server" msgstr "" #: data/ui/pulse_info.glade:336 msgid "Modules" msgstr "" #: data/ui/pulse_info.glade:382 msgid "Clients" msgstr "" #: data/ui/pulse_info.glade:446 msgid "File" msgstr "" #: data/ui/pulse_info.glade:456 msgid "Configuration" msgstr "" #: data/ui/pulse_info.glade:489 msgid "Resamplers" msgstr "" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:403 msgid "Use Default" msgstr "" #: data/ui/pulse_settings.glade:147 data/ui/pulse_settings.glade:452 msgid "Pipeline Input" msgstr "" #: data/ui/pulse_settings.glade:247 data/ui/pulse_settings.glade:552 msgid "Pipeline Output" msgstr "" #: data/ui/pulse_settings.glade:347 data/ui/pulse_settings.glade:652 msgid "Block Size" msgstr "" #: data/ui/reverb.glade:130 msgid "Reverberation" msgstr "" #: data/ui/reverb.glade:181 msgid "Ambience" msgstr "" #: data/ui/reverb.glade:194 msgid "Empty Walls" msgstr "" #: data/ui/reverb.glade:207 msgid "Room" msgstr "" #: data/ui/reverb.glade:220 msgid "Large Empty Hall" msgstr "" #: data/ui/reverb.glade:246 msgid "Large Occupied Hall" msgstr "" #: data/ui/reverb.glade:453 msgid "Pre Delay" msgstr "" #: data/ui/reverb.glade:465 msgid "Decay Time" msgstr "" #: data/ui/reverb.glade:531 msgid "Dry" msgstr "" #: data/ui/reverb.glade:563 msgid "Bass Cut" msgstr "" #: data/ui/reverb.glade:615 msgid "Treble Cut" msgstr "" #: data/ui/reverb.glade:660 msgid "Diffusion" msgstr "" #: data/ui/reverb.glade:672 msgid "Room Size" msgstr "" #: data/ui/reverb.glade:684 msgid "Small" msgstr "" #: data/ui/reverb.glade:685 msgid "Medium" msgstr "" #: data/ui/reverb.glade:686 msgid "Large" msgstr "" #: data/ui/reverb.glade:687 msgid "Tunnel" msgstr "" #: data/ui/reverb.glade:688 msgid "Large/smooth" msgstr "" #: data/ui/reverb.glade:689 msgid "Experimental" msgstr "" #: data/ui/reverb.glade:702 msgid "High Frequency Damping" msgstr "" #: data/ui/spectrum_settings.glade:77 msgid "Show Spectrum" msgstr "" #: data/ui/spectrum_settings.glade:89 msgid "Fill" msgstr "" #: data/ui/spectrum_settings.glade:125 msgid "Border" msgstr "" #: data/ui/spectrum_settings.glade:149 msgid "Use Custom Color" msgstr "" #: data/ui/spectrum_settings.glade:173 msgid "Use Gradient" msgstr "" #: data/ui/spectrum_settings.glade:315 msgid "Points" msgstr "" #: data/ui/spectrum_settings.glade:327 msgid "Height" msgstr "" #: data/ui/spectrum_settings.glade:339 msgid "Line Width" msgstr "" #: data/ui/spectrum_settings.glade:351 msgid "Sampling" msgstr "" #: data/ui/spectrum_settings.glade:363 msgid "Minimum Frequency" msgstr "" #: data/ui/spectrum_settings.glade:375 msgid "Maximum Frequency" msgstr "" #: data/ui/spectrum_settings.glade:410 msgid "Spectrum Type" msgstr "" #: data/ui/spectrum_settings.glade:423 msgid "Bars" msgstr "" #: data/ui/spectrum_settings.glade:424 msgid "Lines" msgstr "" #: data/ui/spectrum_settings.glade:437 msgid "Spectrum Color" msgstr "" #: data/ui/spectrum_settings.glade:449 msgid "Gradient Color" msgstr "" #: data/ui/spectrum_settings.glade:461 msgid "Axis Color" msgstr "" #: data/ui/stereo_tools.glade:108 msgid "Stereo Tools" msgstr "" #: data/ui/stereo_tools.glade:334 data/ui/stereo_tools.glade:775 msgid "Balance" msgstr "" #: data/ui/stereo_tools.glade:365 msgid "S/C Level" msgstr "" #: data/ui/stereo_tools.glade:406 msgid "Softclip" msgstr "" #: data/ui/stereo_tools.glade:452 msgid "Side Level" msgstr "" #: data/ui/stereo_tools.glade:503 msgid "Side Balance" msgstr "" #: data/ui/stereo_tools.glade:535 msgid "Middle Level" msgstr "" #: data/ui/stereo_tools.glade:547 msgid "Middle Panorama" msgstr "" #: data/ui/stereo_tools.glade:604 msgid "LR > LR (Stereo Default)" msgstr "" #: data/ui/stereo_tools.glade:605 msgid "LR > MS (Stereo to Mid-Side)" msgstr "" #: data/ui/stereo_tools.glade:606 msgid "MS > LR (Mid-Side to Stereo)" msgstr "" #: data/ui/stereo_tools.glade:607 msgid "LR > LL (Mono Left Channel)" msgstr "" #: data/ui/stereo_tools.glade:608 msgid "LR > RR (Mono Right Channel)" msgstr "" #: data/ui/stereo_tools.glade:609 msgid "LR > L+R (Mono Sum L+R)" msgstr "" #: data/ui/stereo_tools.glade:610 msgid "LR > RL (Stereo Flip Channels)" msgstr "" #: data/ui/stereo_tools.glade:627 msgid "Stereo Matrix" msgstr "" #: data/ui/stereo_tools.glade:668 data/ui/stereo_tools.glade:709 msgid "Invert Phase" msgstr "" #: data/ui/stereo_tools.glade:806 msgid "Delay L/R" msgstr "" #: data/ui/stereo_tools.glade:839 msgid "Stereo Base" msgstr "" #: data/ui/stereo_tools.glade:871 msgid "Stereo Phase" msgstr "" #: data/ui/webrtc.glade:96 msgid "WebRTC" msgstr "" #: data/ui/webrtc.glade:256 data/ui/webrtc.glade:389 data/ui/webrtc.glade:460 #: data/ui/webrtc.glade:648 msgid "Enable" msgstr "" #: data/ui/webrtc.glade:279 msgid "Extended Filter" msgstr "" #: data/ui/webrtc.glade:292 msgid "High Pass Filter" msgstr "" #: data/ui/webrtc.glade:309 data/ui/webrtc.glade:425 data/ui/webrtc.glade:698 msgid "Low" msgstr "" #: data/ui/webrtc.glade:310 data/ui/webrtc.glade:426 data/ui/webrtc.glade:699 msgid "Moderate" msgstr "" #: data/ui/webrtc.glade:311 data/ui/webrtc.glade:427 data/ui/webrtc.glade:700 msgid "High" msgstr "" #: data/ui/webrtc.glade:324 data/ui/webrtc.glade:412 msgid "Suppression Level" msgstr "" #: data/ui/webrtc.glade:361 msgid "Delay Agnostic" msgstr "" #: data/ui/webrtc.glade:375 msgid "Echo Canceller" msgstr "" #: data/ui/webrtc.glade:428 msgid "Very High" msgstr "" #: data/ui/webrtc.glade:445 msgid "Noise Suppressor" msgstr "" #: data/ui/webrtc.glade:496 msgid "Adaptive Digital" msgstr "" #: data/ui/webrtc.glade:497 msgid "Fixed Digital" msgstr "" #: data/ui/webrtc.glade:514 msgid "Gain Controller" msgstr "" #: data/ui/webrtc.glade:540 msgid "Target Level" msgstr "" #: data/ui/webrtc.glade:572 msgid "Maximum Gain" msgstr "" #: data/ui/webrtc.glade:672 msgid "Detection Likelihood" msgstr "" #: data/ui/webrtc.glade:684 msgid "Frame Size" msgstr "" #: data/ui/webrtc.glade:697 msgid "Very Low" msgstr "" #: data/ui/webrtc.glade:737 msgid "Voice Detector" msgstr "" #: data/ui/rnnoise.glade:90 msgid "Noise Reduction" msgstr "" #: data/ui/rnnoise.glade:242 msgid "Import Model" msgstr "" #: data/ui/rnnoise.glade:246 msgid "Import Model File" msgstr "" #: data/ui/rnnoise.glade:311 msgid "Active Model" msgstr "" #: data/ui/rnnoise.glade:324 msgid "Standard RNNoise Model" msgstr "" #: src/app_info_ui.cpp:120 msgid "paused" msgstr "" #: src/app_info_ui.cpp:122 msgid "playing" msgstr "" #: src/application.cpp:38 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "" #: src/application.cpp:40 msgid "Show available presets." msgstr "" #: src/application.cpp:43 msgid "Load a preset. Example: pulseeffects -l music" msgstr "" #: src/application.cpp:45 msgid "Reset PulseEffects." msgstr "" #: src/application.cpp:48 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "" #: src/application.cpp:50 msgid "Hide the Window." msgstr "" #: src/application.cpp:284 msgid "Output Presets: " msgstr "" #: src/application.cpp:292 msgid "Input Presets: " msgstr "" #: src/blocklist_settings_ui.cpp:191 msgid "Blocklist" msgstr "" #: src/calibration_ui.cpp:198 msgid "Calibration Microphone" msgstr "" #: src/convolver_ui.cpp:281 msgid "Import Impulse File" msgstr "" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Open" msgstr "" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Cancel" msgstr "" #: src/convolver_ui.cpp:318 src/convolver_ui.cpp:319 src/convolver_ui.cpp:321 msgid "Failed" msgstr "" #: src/convolver_ui.cpp:323 msgid "Could Not Load The Impulse File" msgstr "" #: src/equalizer_ui.cpp:380 msgid "infinity" msgstr "" #: src/equalizer_ui.cpp:738 msgid "Import APO Preset File" msgstr "" #: src/equalizer_ui.cpp:743 msgid "APO Presets" msgstr "" #: src/general_settings_ui.cpp:149 msgid "General" msgstr "" #: src/pulse_settings_ui.cpp:168 msgid "Pulseaudio" msgstr "" easyeffects-4.8.7/po/ru.po000066400000000000000000001461271424023573300154550ustar00rootroot00000000000000# PulseEffects Russian translation # This file is distributed under the same license as the PulseEffects package. # ⓒ Mikhail Novosyolov [mikhailnov] , 2017-2019 # ⓒ Georgiy Starodubtsov [Mewsimka] , 2018 # ⓒ Denis Goncharov, 2018 # ⓒ Vladimir Penchikov , 2018 msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-14 23:58+0100\n" "PO-Revision-Date: 2018-07-18 22:14+0300\n" "Last-Translator: Mikhail Novosyolov \n" "Language-Team: \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.1\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 data/ui/application.glade:61 msgid "PulseEffects" msgstr "PulseEffects" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Аудиоэффекты для приложений PulseAudio" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Уоллис Веллингтон" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects — это продвинутая программа манипуляции звуком в режиме " "реального времени. Она включает в себя эквалайзер, ограничитель (лимитер), " "компрессор, утилиту для ревербации и многое другое. Более того, имеется " "встроенный анализатор аудиоспектра." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "Так как PulseEffects использует стандартный сервер PulseAudio, программа " "будет работать с большинством используемых Вами приложений. Все " "поддерживаемые представлены в главном окне, где для каждого могут быть " "произведены настройки эффектов " #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Помимо изменения звука на выходе, PulseEffects также может добавлять " "аудиоэффекты к входным аудиопотокам, таким как микрофон. Это полезно, " "например, во время аудиозаписи или голосовой конференции." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "Удобно то, что при запуске PulseEffects автоматически подгрузит настройки из " "предыдущей сессии работы. Также можно сохранить текущие настройки в набор " "преднастроек." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "Настройка громкости и вкл/откл эффектов" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "Содержит эквалайзер с предустановками" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Ограничитель ввода" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:52 #: data/ui/compressor.glade:110 data/ui/compressor.glade:589 #: data/ui/webrtc.glade:633 msgid "Compressor" msgstr "Компрессор" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Калибровка" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "Эквалайзер, Компрессор и другие аудиоэффекты" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "лимитер;компрессор;ребербатор;эквалайзер;автогромкость;" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:44 #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:47 msgid "\"Presets\"" msgstr "\"Предустановки\"" #: data/ui/about.glade.in:11 msgid "Audio effects for PulseAudio applications" msgstr "Аудиоэффекты для приложений PulseAudio" #: data/ui/app_button_row.glade:49 msgid "Applications" msgstr "Приложения" #: data/ui/app_info.glade:203 #, fuzzy msgid "Add to Blocklist" msgstr "Черный список" #: data/ui/app_info.glade:239 msgid "Format" msgstr "Формат" #: data/ui/app_info.glade:264 data/ui/convolver.glade:348 msgid "Rate" msgstr "Частота" #: data/ui/app_info.glade:289 data/ui/pulse_info.glade:239 #: data/ui/stereo_tools.glade:756 msgid "Channels" msgstr "Каналы" #: data/ui/app_info.glade:314 msgid "Resampler" msgstr "Ресемплер" #: data/ui/app_info.glade:339 data/ui/pulse_settings.glade:159 #: data/ui/pulse_settings.glade:259 data/ui/pulse_settings.glade:464 #: data/ui/pulse_settings.glade:564 msgid "Buffer" msgstr "Буфер" #: data/ui/app_info.glade:364 data/ui/pulse_settings.glade:190 #: data/ui/pulse_settings.glade:290 data/ui/pulse_settings.glade:476 #: data/ui/pulse_settings.glade:576 msgid "Latency" msgstr "Задержка" #: data/ui/app_info.glade:389 msgid "State" msgstr "Состояние" #: data/ui/application.glade:142 src/calibration_ui.cpp:64 #: src/calibration_ui.cpp:191 msgid "Test Signals" msgstr "Проверочный сигнал" #: data/ui/application.glade:157 #, fuzzy msgid "Global Bypass" msgstr "Обход" #: data/ui/application.glade:172 data/ui/equalizer.glade:331 #: data/ui/general_settings.glade:289 msgid "Settings" msgstr "Настройки" #: data/ui/application.glade:194 msgid "Help" msgstr "Справка" #: data/ui/application.glade:217 data/ui/crossfeed.glade:240 #: data/ui/equalizer.glade:403 data/ui/filter.glade:344 #: data/ui/reverb.glade:401 src/presets_menu_ui.cpp:133 #: src/presets_menu_ui.cpp:285 src/presets_menu_ui.cpp:286 #: src/presets_menu_ui.cpp:303 src/presets_menu_ui.cpp:304 msgid "Presets" msgstr "Предустановки" #: data/ui/autogain.glade:90 msgid "Auto Gain" msgstr "Контроль громкости по EBU R 128" #: data/ui/autogain.glade:161 data/ui/bass_enhancer.glade:167 #: data/ui/compressor.glade:214 data/ui/convolver.glade:218 #: data/ui/crossfeed.glade:136 data/ui/crystalizer.glade:134 #: data/ui/deesser.glade:182 data/ui/delay.glade:144 #: data/ui/equalizer.glade:450 data/ui/equalizer_band.glade:187 #: data/ui/equalizer_band.glade:230 data/ui/exciter.glade:167 #: data/ui/filter.glade:243 data/ui/general_settings.glade:298 #: data/ui/gate.glade:172 data/ui/limiter.glade:166 data/ui/loudness.glade:174 #: data/ui/maximizer.glade:139 data/ui/multiband_compressor.glade:307 #: data/ui/multiband_gate.glade:331 data/ui/pitch.glade:158 #: data/ui/reverb.glade:299 data/ui/stereo_tools.glade:194 #: data/ui/webrtc.glade:141 data/ui/rnnoise.glade:139 msgid "Reset" msgstr "Сбросить" #: data/ui/autogain.glade:185 data/ui/rnnoise.glade:163 msgid "Based on" msgstr "" # #, fuzzy #: data/ui/autogain.glade:262 msgid "Reset History" msgstr "Сбросить историю" #: data/ui/autogain.glade:274 msgid "Detect Silence" msgstr "Определять тишину" #: data/ui/autogain.glade:286 #, fuzzy msgid "Use Geometric Mean" msgstr "Использовать градиент" #: data/ui/autogain.glade:325 msgid "Target" msgstr "Целевой уровень громкости" #: data/ui/autogain.glade:374 data/ui/autogain.glade:779 msgid "Momentary" msgstr "Моментальные измерения" #: data/ui/autogain.glade:434 msgid "Weights" msgstr "Вес в расчете громкости" #: data/ui/autogain.glade:448 data/ui/autogain.glade:792 msgid "Short Term" msgstr "Короткие измерения" # Время интеграции — это величина, характеризующая быстродействие измерителя. # https://tech.ebu.ch/docs/factsheets/Factsheet-R128-2011-RUS.pdf # В документе выше переводчик перевел 'Integrated' как 'Интегрированные', # хотя сам же написал, что это "измерения от начала до конца" # Яндекс.Переводчик перевел лучше — "Комплексные измерения" #: data/ui/autogain.glade:497 data/ui/autogain.glade:805 msgid "Integrated" msgstr "Комплексные измерения" # ############################################### # https://github.com/wwmm/pulseeffects/pull/289 # Left here for future thinking # msgid "Influence of measurements with momentary integration time" # msgstr "Влияние измерений с моментальным временем интеграции" # msgid "Influence of measurements with short integration time" # msgstr "Влияние измерений с малым временем интеграции" # msgid "Influence of integrated measurements" # msgstr "Влияние комплексных измерений" # ############################################### #: data/ui/autogain.glade:564 data/ui/autogain.glade:1076 #: data/ui/bass_enhancer.glade:596 data/ui/compressor.glade:1086 #: data/ui/convolver.glade:575 data/ui/crossfeed.glade:391 #: data/ui/crystalizer.glade:250 data/ui/deesser.glade:783 #: data/ui/delay.glade:328 data/ui/equalizer.glade:682 #: data/ui/exciter.glade:596 data/ui/filter.glade:508 data/ui/gate.glade:689 #: data/ui/limiter.glade:501 data/ui/loudness.glade:238 #: data/ui/loudness.glade:431 data/ui/maximizer.glade:358 #: data/ui/multiband_compressor.glade:2103 data/ui/multiband_gate.glade:2262 #: data/ui/pitch.glade:450 data/ui/presets_menu.glade:238 #: data/ui/reverb.glade:753 data/ui/stereo_tools.glade:427 #: data/ui/stereo_tools.glade:931 data/ui/webrtc.glade:780 #: data/ui/rnnoise.glade:362 msgid "Input" msgstr "Вход" #: data/ui/autogain.glade:577 data/ui/autogain.glade:1020 #: data/ui/bass_enhancer.glade:625 data/ui/compressor.glade:1099 #: data/ui/convolver.glade:588 data/ui/crossfeed.glade:405 #: data/ui/crystalizer.glade:263 data/ui/deesser.glade:797 #: data/ui/delay.glade:341 data/ui/equalizer.glade:695 #: data/ui/exciter.glade:625 data/ui/filter.glade:521 data/ui/gate.glade:703 #: data/ui/limiter.glade:636 data/ui/loudness.glade:271 #: data/ui/loudness.glade:445 data/ui/maximizer.glade:372 #: data/ui/multiband_compressor.glade:894 #: data/ui/multiband_compressor.glade:1272 #: data/ui/multiband_compressor.glade:1651 #: data/ui/multiband_compressor.glade:2030 #: data/ui/multiband_compressor.glade:2116 data/ui/multiband_gate.glade:951 #: data/ui/multiband_gate.glade:1363 data/ui/multiband_gate.glade:1776 #: data/ui/multiband_gate.glade:2189 data/ui/multiband_gate.glade:2275 #: data/ui/pitch.glade:463 data/ui/presets_menu.glade:137 #: data/ui/reverb.glade:766 data/ui/stereo_tools.glade:901 #: data/ui/stereo_tools.glade:944 data/ui/webrtc.glade:794 #: data/ui/rnnoise.glade:375 msgid "Output" msgstr "Выход" #: data/ui/autogain.glade:899 msgid "Relative" msgstr "Относительное значение" #: data/ui/autogain.glade:912 data/ui/compressor.glade:1262 msgid "Gain" msgstr "Усиление" #: data/ui/autogain.glade:980 msgid "Loudness" msgstr "Громкость" # ??? Не уверен в переводе #: data/ui/autogain.glade:1034 msgid "Range" msgstr "Диапазон" # Энхансер (он же Эксайтер) — это прибор, который генерирует высшие гармоники низких частот, благодаря чему повышается локализация низких частот и их «читаемость». # «Бас-Энхансер» или «Глубокий бас» #: data/ui/bass_enhancer.glade:116 msgid "Bass Enhancer" msgstr "Усиление басов (бас-энхансер)" #: data/ui/bass_enhancer.glade:191 data/ui/compressor.glade:238 #: data/ui/crossfeed.glade:160 data/ui/deesser.glade:206 #: data/ui/delay.glade:168 data/ui/equalizer.glade:474 #: data/ui/exciter.glade:191 data/ui/filter.glade:267 data/ui/gate.glade:196 #: data/ui/limiter.glade:190 data/ui/loudness.glade:143 #: data/ui/maximizer.glade:163 data/ui/multiband_compressor.glade:331 #: data/ui/multiband_gate.glade:355 data/ui/pitch.glade:182 #: data/ui/reverb.glade:323 data/ui/stereo_tools.glade:218 #: data/ui/webrtc.glade:165 msgid "Provided by" msgstr "" #: data/ui/bass_enhancer.glade:259 data/ui/compressor.glade:602 #: data/ui/deesser.glade:274 data/ui/exciter.glade:259 msgid "Listen" msgstr "Прослушать" #: data/ui/bass_enhancer.glade:302 data/ui/exciter.glade:303 msgid "3rd" msgstr "3-ий" #: data/ui/bass_enhancer.glade:315 data/ui/exciter.glade:316 msgid "2nd" msgstr "2-ой" #: data/ui/bass_enhancer.glade:327 data/ui/exciter.glade:328 msgid "Blend Harmonics" msgstr "Смешение гармоник" #: data/ui/bass_enhancer.glade:355 data/ui/exciter.glade:357 #: data/ui/reverb.glade:498 msgid "Amount" msgstr "Величина" #: data/ui/bass_enhancer.glade:367 data/ui/bass_enhancer.glade:504 #: data/ui/exciter.glade:369 data/ui/exciter.glade:504 msgid "Harmonics" msgstr "Гармоники" #: data/ui/bass_enhancer.glade:379 data/ui/exciter.glade:381 msgid "Scope" msgstr "Диапазон частот" #: data/ui/bass_enhancer.glade:472 msgid "Floor" msgstr "Нижний порог" #: data/ui/blocklist_settings.glade:52 data/ui/blocklist_settings.glade:155 #: data/ui/presets_menu.glade:65 data/ui/presets_menu.glade:166 msgid "Create Preset" msgstr "Создать новый набор предустановок" #: data/ui/blocklist_settings.glade:68 data/ui/blocklist_settings.glade:171 #: data/ui/presets_menu.glade:52 data/ui/presets_menu.glade:153 #: data/ui/pulse_info.glade:50 msgid "Name" msgstr "Название" #: data/ui/blocklist_settings.glade:81 msgid "Reconnect the microphone to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:139 data/ui/pulse_settings.glade:383 msgid "Input Effects" msgstr "Эффекты для ввода звука" #: data/ui/blocklist_settings.glade:230 msgid "Restart the player to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:242 data/ui/pulse_settings.glade:688 msgid "Output Effects" msgstr "Эффекты для вывода звука" #: data/ui/blocklist_settings.glade:265 msgid "Show Blocklisted Apps in Main Tab" msgstr "" #: data/ui/calibration_signals.glade:32 msgid "Sine" msgstr "Синусоида" #: data/ui/calibration_signals.glade:33 msgid "Square" msgstr "Квадратный" #: data/ui/calibration_signals.glade:34 msgid "Saw" msgstr "Пилообразный" #: data/ui/calibration_signals.glade:35 msgid "Triangle" msgstr "Треугольный" #: data/ui/calibration_signals.glade:36 msgid "Silence" msgstr "Тишина" #: data/ui/calibration_signals.glade:37 msgid "White Noise" msgstr "Белый шум" #: data/ui/calibration_signals.glade:38 msgid "Pink Noise" msgstr "Розовый шум" #: data/ui/calibration_signals.glade:39 msgid "Sine Table" msgstr "Таблица синусоид" #: data/ui/calibration_signals.glade:40 msgid "Ticks" msgstr "Тики" #: data/ui/calibration_signals.glade:41 msgid "Gaussian Noise" msgstr "Гауссовский шум" #: data/ui/calibration_signals.glade:42 msgid "Red Noise" msgstr "Красный шум" #: data/ui/calibration_signals.glade:43 msgid "Blue Noise" msgstr "Голубой шум" #: data/ui/calibration_signals.glade:44 msgid "Violet Noise" msgstr "Фиолетовый шум" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Громкость" #: data/ui/calibration_signals.glade:135 data/ui/equalizer_band.glade:158 #: data/ui/filter.glade:394 msgid "Frequency" msgstr "Частота" #: data/ui/calibration_mic.glade:33 msgid "Window" msgstr "Окно" #: data/ui/calibration_mic.glade:90 msgid "Measure Noise" msgstr "Измерение шума" #: data/ui/calibration_mic.glade:119 msgid "Subtract Noise" msgstr "Вычетание шума" #: data/ui/compressor.glade:386 data/ui/deesser.glade:436 #: data/ui/gate.glade:498 data/ui/maximizer.glade:242 #: data/ui/multiband_compressor.glade:707 #: data/ui/multiband_compressor.glade:1085 #: data/ui/multiband_compressor.glade:1464 #: data/ui/multiband_compressor.glade:1843 data/ui/multiband_gate.glade:731 #: data/ui/multiband_gate.glade:1142 data/ui/multiband_gate.glade:1555 #: data/ui/multiband_gate.glade:1968 msgid "Threshold" msgstr "Порог срабатывания" #: data/ui/compressor.glade:420 data/ui/deesser.glade:448 #: data/ui/gate.glade:532 data/ui/multiband_compressor.glade:741 #: data/ui/multiband_compressor.glade:1119 #: data/ui/multiband_compressor.glade:1498 #: data/ui/multiband_compressor.glade:1877 data/ui/multiband_gate.glade:765 #: data/ui/multiband_gate.glade:1176 data/ui/multiband_gate.glade:1589 #: data/ui/multiband_gate.glade:2002 msgid "Ratio" msgstr "Степень сжатия" #: data/ui/compressor.glade:452 data/ui/gate.glade:564 #: data/ui/multiband_compressor.glade:773 #: data/ui/multiband_compressor.glade:1151 #: data/ui/multiband_compressor.glade:1530 #: data/ui/multiband_compressor.glade:1909 data/ui/multiband_gate.glade:797 #: data/ui/multiband_gate.glade:1208 data/ui/multiband_gate.glade:1621 #: data/ui/multiband_gate.glade:2034 msgid "Knee" msgstr "Колено (излом)" #: data/ui/compressor.glade:486 data/ui/deesser.glade:532 #: data/ui/gate.glade:598 data/ui/multiband_compressor.glade:807 #: data/ui/multiband_compressor.glade:1185 #: data/ui/multiband_compressor.glade:1564 #: data/ui/multiband_compressor.glade:1943 data/ui/multiband_gate.glade:831 #: data/ui/multiband_gate.glade:1242 data/ui/multiband_gate.glade:1655 #: data/ui/multiband_gate.glade:2068 msgid "Makeup" msgstr "Компенсирование" #: data/ui/compressor.glade:520 data/ui/gate.glade:464 #: data/ui/limiter.glade:363 data/ui/maximizer.glade:266 #: data/ui/multiband_compressor.glade:673 #: data/ui/multiband_compressor.glade:1051 #: data/ui/multiband_compressor.glade:1430 #: data/ui/multiband_compressor.glade:1809 data/ui/multiband_gate.glade:697 #: data/ui/multiband_gate.glade:1108 data/ui/multiband_gate.glade:1521 #: data/ui/multiband_gate.glade:1934 msgid "Release" msgstr "Восстановление" #: data/ui/compressor.glade:532 data/ui/gate.glade:430 #: data/ui/multiband_compressor.glade:639 #: data/ui/multiband_compressor.glade:1017 #: data/ui/multiband_compressor.glade:1396 #: data/ui/multiband_compressor.glade:1775 data/ui/multiband_gate.glade:663 #: data/ui/multiband_gate.glade:1074 data/ui/multiband_gate.glade:1487 #: data/ui/multiband_gate.glade:1900 msgid "Attack" msgstr "Атака" #: data/ui/compressor.glade:559 msgid "Downward" msgstr "" #: data/ui/compressor.glade:560 msgid "Upward" msgstr "" #: data/ui/compressor.glade:573 msgid "Compression Mode" msgstr "Редим сжатия" #: data/ui/compressor.glade:649 msgid "Pre-amplification" msgstr "Предварительное усилиние" #: data/ui/compressor.glade:683 msgid "Reactivity" msgstr "Скорость реакции" #: data/ui/compressor.glade:716 data/ui/limiter.glade:375 msgid "Lookahead" msgstr "Задержка (lookahead)" #: data/ui/compressor.glade:730 msgid "Feed-forward" msgstr "Прямая связь" #: data/ui/compressor.glade:731 msgid "Feed-back" msgstr "Обратная связь" #: data/ui/compressor.glade:744 data/ui/equalizer_band.glade:51 msgid "Type" msgstr "Тип" #: data/ui/compressor.glade:758 data/ui/deesser.glade:731 #: data/ui/gate.glade:303 data/ui/multiband_compressor.glade:611 #: data/ui/multiband_compressor.glade:989 #: data/ui/multiband_compressor.glade:1368 #: data/ui/multiband_compressor.glade:1747 data/ui/multiband_gate.glade:635 #: data/ui/multiband_gate.glade:1046 data/ui/multiband_gate.glade:1459 #: data/ui/multiband_gate.glade:1872 msgid "Peak" msgstr "Пик" #: data/ui/compressor.glade:759 data/ui/deesser.glade:730 #: data/ui/gate.glade:302 data/ui/multiband_compressor.glade:610 #: data/ui/multiband_compressor.glade:988 #: data/ui/multiband_compressor.glade:1367 #: data/ui/multiband_compressor.glade:1746 data/ui/multiband_gate.glade:634 #: data/ui/multiband_gate.glade:1045 data/ui/multiband_gate.glade:1458 #: data/ui/multiband_gate.glade:1871 msgid "RMS" msgstr "RMS (среднеквадратичный уровень сигнала)" #: data/ui/compressor.glade:760 msgid "Low-Pass" msgstr "Фильтр низких частот" #: data/ui/compressor.glade:761 msgid "Uniform" msgstr "Равномерно" #: data/ui/compressor.glade:774 data/ui/deesser.glade:702 #: data/ui/equalizer.glade:257 data/ui/equalizer_band.glade:84 #: data/ui/multiband_compressor.glade:412 data/ui/multiband_gate.glade:436 #: data/ui/stereo_tools.glade:591 data/ui/webrtc.glade:483 msgid "Mode" msgstr "Режим" #: data/ui/compressor.glade:788 msgid "Middle" msgstr "Средний" # #, fuzzy #: data/ui/compressor.glade:789 msgid "Side" msgstr "Усиление ввода [дБ]" #: data/ui/compressor.glade:790 data/ui/delay.glade:247 #: data/ui/equalizer.glade:612 data/ui/stereo_tools.glade:655 msgid "Left" msgstr "Левый" #: data/ui/compressor.glade:791 data/ui/delay.glade:280 #: data/ui/equalizer.glade:654 data/ui/stereo_tools.glade:724 msgid "Right" msgstr "Правый" # #, fuzzy #: data/ui/compressor.glade:804 msgid "Source" msgstr "Средний источник" # #, fuzzy #: data/ui/compressor.glade:820 data/ui/compressor.glade:1274 msgid "Sidechain" msgstr "Усиление ввода [дБ]" #: data/ui/compressor.glade:925 msgid "Relative Release Threshold" msgstr "" #: data/ui/compressor.glade:937 #, fuzzy msgid "Boost Threshold" msgstr "Порог срабатывания" #: data/ui/compressor.glade:949 #, fuzzy msgid "High-pass Frequency" msgstr "Высокочастотное демпфирование" #: data/ui/compressor.glade:961 #, fuzzy msgid "Low-pass Frequency" msgstr "Подсчитать частоты" #: data/ui/compressor.glade:973 #, fuzzy msgid "High-pass Filter Mode" msgstr "Высокачастотный фильтр" #: data/ui/compressor.glade:985 msgid "Low-pass Filter Mode" msgstr "" #: data/ui/compressor.glade:999 data/ui/compressor.glade:1017 #: data/ui/equalizer_band.glade:63 msgid "Off" msgstr "Выкл" #: data/ui/compressor.glade:1000 data/ui/compressor.glade:1018 msgid "12 dB/oct" msgstr "" #: data/ui/compressor.glade:1001 data/ui/compressor.glade:1019 msgid "24 dB/oct" msgstr "" #: data/ui/compressor.glade:1002 data/ui/compressor.glade:1020 msgid "36 dB/oct" msgstr "" # #, fuzzy #: data/ui/compressor.glade:1043 #, fuzzy msgid "Advanced" msgstr "Параметры" #: data/ui/compressor.glade:1347 msgid "Curve" msgstr "Кривая" #: data/ui/convolver.glade:90 msgid "Convolver" msgstr "Конвольвер" #: data/ui/convolver.glade:125 msgid "Import Impulse" msgstr "Импортировать импульс" #: data/ui/convolver.glade:129 msgid "Import Impulse Response File" msgstr "Импортировать файл импульсной реакции" #: data/ui/convolver.glade:309 msgid "L" msgstr "Л" #: data/ui/convolver.glade:323 msgid "R" msgstr "Пр" #: data/ui/convolver.glade:390 msgid "Duration" msgstr "Продолжительность" #: data/ui/convolver.glade:402 msgid "Samples" msgstr "Образцы" #: data/ui/convolver.glade:435 src/convolver_ui.cpp:285 msgid "Impulse Response" msgstr "Импульсная реакция" #: data/ui/convolver.glade:458 msgid "Select the impulse Response File" msgstr "Выбрать файл с импульсной реакцией" #: data/ui/convolver.glade:477 src/spectrum_settings_ui.cpp:195 msgid "Spectrum" msgstr "Спектр" #: data/ui/convolver.glade:520 msgid "Stereo Width" msgstr "Ширина стерео" #: data/ui/crossfeed.glade:104 msgid "Crossfeed" msgstr "Перекрестная подача" #: data/ui/crossfeed.glade:254 msgid "Jmeier" msgstr "" #: data/ui/crossfeed.glade:266 data/ui/filter.glade:183 #: data/ui/reverb.glade:259 msgid "Default" msgstr "По умолчанию" #: data/ui/crossfeed.glade:278 msgid "Cmoy" msgstr "" #: data/ui/crossfeed.glade:308 msgid "Cutoff" msgstr "Усечение" #: data/ui/crossfeed.glade:341 msgid "Feed" msgstr "Подача" #: data/ui/crystalizer.glade:90 msgid "Crystalizer" msgstr "Кристаллизатор" #: data/ui/crystalizer.glade:200 msgid "Aggressive Mode" msgstr "Агрессивный режим" #: data/ui/crystalizer.glade:464 msgid "Before" msgstr "До" #: data/ui/crystalizer.glade:477 msgid "After" msgstr "После" #: data/ui/crystalizer.glade:550 msgid "Loudness Range" msgstr "Диапазон громкости" #: data/ui/crystalizer_band.glade:28 data/ui/equalizer_band.glade:316 #: data/ui/stereo_tools.glade:680 data/ui/stereo_tools.glade:737 msgid "Mute" msgstr "Приглушить" #: data/ui/crystalizer_band.glade:40 data/ui/multiband_compressor.glade:580 #: data/ui/multiband_compressor.glade:958 #: data/ui/multiband_compressor.glade:1337 #: data/ui/multiband_compressor.glade:1716 data/ui/multiband_gate.glade:604 #: data/ui/multiband_gate.glade:1015 data/ui/multiband_gate.glade:1428 #: data/ui/multiband_gate.glade:1841 msgid "Bypass" msgstr "Обход" # http://wikisound.org/Деэссер; предназначен для уменьшения или устранения избыточно шипящих звуков в записи человеческого голоса #: data/ui/deesser.glade:125 msgid "Deesser" msgstr "Антишипение (деэссер)" #: data/ui/deesser.glade:309 #, fuzzy msgid "F1 Gain" msgstr "Усиление" #: data/ui/deesser.glade:321 #, fuzzy msgid "F2 Level" msgstr "Уровень" #: data/ui/deesser.glade:333 #, fuzzy msgid "F2 Peak Q" msgstr "Добротность (Q)" #: data/ui/deesser.glade:424 msgid "Laxity" msgstr "Допуск на срабатывание" #: data/ui/deesser.glade:585 #, fuzzy msgid "F1 Split" msgstr "Частота раздела" #: data/ui/deesser.glade:597 #, fuzzy msgid "F2 Peak" msgstr "Пик" #: data/ui/deesser.glade:690 data/ui/gate.glade:288 msgid "Detection" msgstr "Определение" #: data/ui/deesser.glade:715 msgid "Wide" msgstr "" #: data/ui/deesser.glade:716 msgid "Split" msgstr "Частота раздела" #: data/ui/deesser.glade:959 data/ui/multiband_gate.glade:865 #: data/ui/multiband_gate.glade:1298 data/ui/multiband_gate.glade:1711 #: data/ui/multiband_gate.glade:2124 msgid "Reduction" msgstr "Увеличение ослабления" #: data/ui/deesser.glade:972 msgid "Detected" msgstr "Определено" #: data/ui/delay.glade:90 msgid "Delay" msgstr "Задержка" #: data/ui/equalizer.glade:44 msgid "Equalizer" msgstr "Эквалайзер" #: data/ui/equalizer.glade:160 msgid "Flat Response" msgstr "Плоская АЧХ" #: data/ui/equalizer.glade:175 msgid "Calculate Frequencies" msgstr "Подсчитать частоты" #: data/ui/equalizer.glade:213 msgid "Bands" msgstr "Кол-во полос эквалайзера" #: data/ui/equalizer.glade:269 msgid "IIR" msgstr "" #: data/ui/equalizer.glade:270 msgid "FIR" msgstr "" #: data/ui/equalizer.glade:271 msgid "FFT" msgstr "" #: data/ui/equalizer.glade:304 msgid "Split Channels" msgstr "Разделить каналы" #: data/ui/equalizer.glade:389 #, fuzzy msgid "Apply APO Preset" msgstr "Предустановки" #: data/ui/equalizer_band.glade:64 msgid "Bell" msgstr "" #: data/ui/equalizer_band.glade:65 msgid "High Pass" msgstr "Высокачастотный фильтр" #: data/ui/equalizer_band.glade:66 msgid "High Shelf" msgstr "Высокочастотный полочный фильтр" #: data/ui/equalizer_band.glade:67 msgid "Low Pass" msgstr "Фильтр низких частот" #: data/ui/equalizer_band.glade:68 msgid "Low Shelf" msgstr "Низкочастотный полочный фильтр" #: data/ui/equalizer_band.glade:69 msgid "Notch" msgstr "" #: data/ui/equalizer_band.glade:70 data/ui/filter.glade:427 msgid "Resonance" msgstr "Резонансы" #: data/ui/equalizer_band.glade:71 #, fuzzy msgid "All Pass" msgstr "Фильтр низких частот" #: data/ui/equalizer_band.glade:96 msgid "RLC (BT)" msgstr "" #: data/ui/equalizer_band.glade:97 msgid "RLC (MT)" msgstr "" #: data/ui/equalizer_band.glade:98 msgid "BWC (BT)" msgstr "" #: data/ui/equalizer_band.glade:99 msgid "BWC (MT)" msgstr "" #: data/ui/equalizer_band.glade:100 msgid "LRX (BT)" msgstr "" #: data/ui/equalizer_band.glade:101 msgid "LRX (MT)" msgstr "" #: data/ui/equalizer_band.glade:102 msgid "APO (DR)" msgstr "" #: data/ui/equalizer_band.glade:115 msgid "Slope" msgstr "" #: data/ui/equalizer_band.glade:203 msgid "Quality" msgstr "Качество" #: data/ui/equalizer_band.glade:253 msgid "Width" msgstr "Ширина" #: data/ui/equalizer_band.glade:304 data/ui/multiband_compressor.glade:593 #: data/ui/multiband_compressor.glade:971 #: data/ui/multiband_compressor.glade:1350 #: data/ui/multiband_compressor.glade:1729 data/ui/multiband_gate.glade:617 #: data/ui/multiband_gate.glade:1028 data/ui/multiband_gate.glade:1441 #: data/ui/multiband_gate.glade:1854 msgid "Solo" msgstr "Соло" #: data/ui/equalizer_preset_row.glade:39 data/ui/irs_row.glade:44 msgid "Apply" msgstr "Применить" #: data/ui/exciter.glade:116 msgid "Exciter" msgstr "Генератор" #: data/ui/exciter.glade:472 data/ui/maximizer.glade:254 msgid "Ceiling" msgstr "Верхний порог" #: data/ui/filter.glade:97 msgid "Filter" msgstr "Фильтр" #: data/ui/filter.glade:147 msgid "Muted" msgstr "Приглушенный" #: data/ui/filter.glade:159 data/ui/reverb.glade:233 msgid "Disco" msgstr "Диско" #: data/ui/filter.glade:171 msgid "Distant Headphones" msgstr "Находящиеся далеко наушники" #: data/ui/filter.glade:360 msgid "12dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:361 msgid "24dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:362 msgid "36dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:363 msgid "12dB/oct Highpass" msgstr "" #: data/ui/filter.glade:364 msgid "24dB/oct Highpass" msgstr "" #: data/ui/filter.glade:365 msgid "36dB/oct Highpass" msgstr "" #: data/ui/filter.glade:366 msgid "6dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:367 msgid "12dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:368 msgid "18dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:369 msgid "6dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:370 msgid "12dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:371 msgid "18dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:460 msgid "Inertia" msgstr "Инертность" #: data/ui/general_settings.glade:58 msgid "Start Service at Login" msgstr "Запуск службы при запуске" #: data/ui/general_settings.glade:82 msgid "Process All Outputs" msgstr "Вкл. для всех выводов" #: data/ui/general_settings.glade:94 msgid "Process All Inputs" msgstr "Вкл. для всех вводов" #: data/ui/general_settings.glade:130 msgid "Use Dark Theme" msgstr "Исп. тёмную тему" #: data/ui/general_settings.glade:158 data/ui/general_settings.glade:220 msgid "Niceness" msgstr "Приоритет процесса (nice)" #: data/ui/general_settings.glade:159 msgid "Real Time" msgstr "Режим реального времени" #: data/ui/general_settings.glade:160 msgid "None" msgstr "Никакой" #: data/ui/general_settings.glade:208 msgid "Priority Type" msgstr "Тип приоритета процесса" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "Приоритет" #: data/ui/general_settings.glade:244 msgid "Activity Timeout" msgstr "" #: data/ui/general_settings.glade:325 msgid "About" msgstr "О программе" # http://wikisound.org/Гейт: шумовой гейт или просто гейт — это электронное устройство или плагин динамической обработки, который используется для контроля уровня звукового сигнала. Гейт пропускает или глушит сигнал в зависимости от установленного порогового значения. Он очень часто используется для подавления шума в паузах. #: data/ui/gate.glade:97 msgid "Gate" msgstr "Шумовые ворота (гейт)" #: data/ui/gate.glade:330 #, fuzzy msgid "Maximum Gain Reduction" msgstr "Увеличение ослабления" # В данном режиме «Компрессор» обрабатывает сигналы сразу двух каналов (стерео), уравнивая их уровни. #: data/ui/gate.glade:379 msgid "Stereo Link" msgstr "Стереосвязка" #: data/ui/gate.glade:393 msgid "Average" msgstr "Средняя" #: data/ui/gate.glade:394 msgid "Maximum" msgstr "Максимум" # #, fuzzy #: data/ui/gate.glade:632 #, fuzzy msgid "Input Level" msgstr "Ограничитель ввода" #: data/ui/gate.glade:864 data/ui/multiband_gate.glade:911 #: data/ui/multiband_gate.glade:1323 data/ui/multiband_gate.glade:1736 #: data/ui/multiband_gate.glade:2149 msgid "Gating" msgstr "" #: data/ui/limiter.glade:96 data/ui/webrtc.glade:612 msgid "Limiter" msgstr "Ограничитель уровня звука (лимитер)" #: data/ui/limiter.glade:266 msgid "Automatic Smoothing Control" msgstr "" #: data/ui/limiter.glade:278 msgid "Automatic Leveling" msgstr "" #: data/ui/limiter.glade:308 msgid "Limit" msgstr "Ограничение" #: data/ui/limiter.glade:409 msgid "Oversampling" msgstr "Передискретизация" #: data/ui/limiter.glade:447 msgid "ASC" msgstr "Адаптивное управление наклоном" #: data/ui/limiter.glade:595 msgid "Attenuation" msgstr "Затухание" #: data/ui/loudness.glade:90 msgid "Loudness Compensator" msgstr "" #: data/ui/loudness.glade:328 msgid "Standard" msgstr "" #: data/ui/loudness.glade:341 msgid "Flat" msgstr "" #: data/ui/loudness.glade:342 msgid "ISO226-2003" msgstr "" #: data/ui/loudness.glade:343 msgid "Fletcher-Munson" msgstr "" #: data/ui/loudness.glade:344 msgid "Robinson-Dadson" msgstr "" # Taking lingual shortcuts to squeeze it in the text box #: data/ui/loudness.glade:370 #, fuzzy msgid "FFT Size" msgstr "Размер кадра" #: data/ui/maximizer.glade:95 msgid "Maximizer" msgstr "Максимизатор" #: data/ui/maximizer.glade:386 msgid "Gain Reduction" msgstr "Увеличение ослабления" #: data/ui/multiband_compressor.glade:139 msgid "Multiband Compressor" msgstr "Многополосный компрессор" #: data/ui/multiband_compressor.glade:426 data/ui/multiband_gate.glade:450 msgid "LR4" msgstr "" #: data/ui/multiband_compressor.glade:427 data/ui/multiband_gate.glade:451 msgid "LR8" msgstr "" #: data/ui/multiband_compressor.glade:441 data/ui/multiband_gate.glade:465 msgid "Split 1/2" msgstr "Разделение 1/2" #: data/ui/multiband_compressor.glade:454 data/ui/multiband_gate.glade:478 msgid "Split 2/3" msgstr "Разделение 2/3" #: data/ui/multiband_compressor.glade:467 data/ui/multiband_gate.glade:491 msgid "Split 3/4" msgstr "Разделение 3/4" #: data/ui/multiband_compressor.glade:854 #: data/ui/multiband_compressor.glade:1232 #: data/ui/multiband_compressor.glade:1611 #: data/ui/multiband_compressor.glade:1990 msgid "Compression" msgstr "Сжатие" #: data/ui/multiband_compressor.glade:937 data/ui/multiband_gate.glade:994 msgid "Sub Band" msgstr "Поддиапазон" #: data/ui/multiband_compressor.glade:1315 data/ui/multiband_gate.glade:1406 msgid "Low Band" msgstr "Фильтр низких частот" #: data/ui/multiband_compressor.glade:1694 data/ui/multiband_gate.glade:1819 msgid "Mid Band" msgstr "Средние частоты" #: data/ui/multiband_compressor.glade:2073 data/ui/multiband_gate.glade:2232 msgid "High Band" msgstr "Высокие частоты" #: data/ui/multiband_gate.glade:139 msgid "Multiband Gate" msgstr "Многополосные шумовые ворота" #: data/ui/pitch.glade:102 msgid "Pitch" msgstr "Высота тона" #: data/ui/pitch.glade:270 msgid "Cents" msgstr "Центы" #: data/ui/pitch.glade:300 msgid "Semitones" msgstr "Полутона" #: data/ui/pitch.glade:330 msgid "Octaves" msgstr "Октавы" #: data/ui/pitch.glade:360 msgid "Crispness" msgstr "Чёткость" #: data/ui/pitch.glade:402 msgid "Faster" msgstr "Быстрее" #: data/ui/pitch.glade:414 msgid "Preserve Formant" msgstr "Сохранить формат" #: data/ui/preset_row.glade:55 msgid "Load" msgstr "" #: data/ui/preset_row.glade:70 msgid "Save current settings to this preset file" msgstr "Сохранить текущие настройки в этот набор преднастроек" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "Удалить этот файл с предустановками" #: data/ui/preset_row.glade:98 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" "Автоматически применять этот набор предустановок, когда текущее звукое " "устройство подключают к системе" #: data/ui/presets_menu.glade:81 data/ui/presets_menu.glade:182 #: src/presets_menu_ui.cpp:129 msgid "Import Presets" msgstr "Импортировать предустановки" #: data/ui/pulse_info.glade:77 msgid "Version" msgstr "Версия" #: data/ui/pulse_info.glade:104 msgid "Default Sink" msgstr "Устройство вывода по умолчанию" #: data/ui/pulse_info.glade:116 msgid "Default Source" msgstr "Устройство ввода по умолчанию" #: data/ui/pulse_info.glade:158 msgid "Protocol" msgstr "Версия протокола сервера" #: data/ui/pulse_info.glade:185 msgid "Default Sample Format" msgstr "Спецификация отсчётов по умолчанию" #: data/ui/pulse_info.glade:212 msgid "Default Sampling Rate" msgstr "Частота дискретизации по умолчанию" #: data/ui/pulse_info.glade:266 msgid "Channel Mapping" msgstr "Схема каналов" #: data/ui/pulse_info.glade:291 msgid "Server" msgstr "Сервер" #: data/ui/pulse_info.glade:336 msgid "Modules" msgstr "Модули" #: data/ui/pulse_info.glade:382 msgid "Clients" msgstr "Клиенты" #: data/ui/pulse_info.glade:446 msgid "File" msgstr "Файл" #: data/ui/pulse_info.glade:456 msgid "Configuration" msgstr "Параметры" #: data/ui/pulse_info.glade:489 msgid "Resamplers" msgstr "Ресемплеры" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:403 msgid "Use Default" msgstr "По умолчанию" #: data/ui/pulse_settings.glade:147 data/ui/pulse_settings.glade:452 msgid "Pipeline Input" msgstr "" #: data/ui/pulse_settings.glade:247 data/ui/pulse_settings.glade:552 #, fuzzy msgid "Pipeline Output" msgstr "Эквалайзер - Выход" # Taking lingual shortcuts to squeeze it in the text box #: data/ui/pulse_settings.glade:347 data/ui/pulse_settings.glade:652 msgid "Block Size" msgstr "Размер блока" #: data/ui/reverb.glade:130 msgid "Reverberation" msgstr "Ревербация" #: data/ui/reverb.glade:181 msgid "Ambience" msgstr "Окр. среда" #: data/ui/reverb.glade:194 msgid "Empty Walls" msgstr "Пустые стены" # Taking lingual shortcuts to squeeze it in the text box #: data/ui/reverb.glade:207 msgid "Room" msgstr "Комната" #: data/ui/reverb.glade:220 msgid "Large Empty Hall" msgstr "Большой пустой зал" #: data/ui/reverb.glade:246 msgid "Large Occupied Hall" msgstr "Большой занятый чем-то зал" #: data/ui/reverb.glade:453 msgid "Pre Delay" msgstr "Предзадержка" #: data/ui/reverb.glade:465 msgid "Decay Time" msgstr "Время распада" #: data/ui/reverb.glade:531 msgid "Dry" msgstr "Влажность" #: data/ui/reverb.glade:563 msgid "Bass Cut" msgstr "Обрезка басов" #: data/ui/reverb.glade:615 msgid "Treble Cut" msgstr "Обрезка тембра" #: data/ui/reverb.glade:660 msgid "Diffusion" msgstr "Диффузия" # Taking lingual shortcuts to squeeze it in the text box #: data/ui/reverb.glade:672 msgid "Room Size" msgstr "Размер комнаты" #: data/ui/reverb.glade:684 msgid "Small" msgstr "Маленькая" #: data/ui/reverb.glade:685 msgid "Medium" msgstr "Средняя" #: data/ui/reverb.glade:686 msgid "Large" msgstr "Огромная" #: data/ui/reverb.glade:687 msgid "Tunnel" msgstr "Туннель" #: data/ui/reverb.glade:688 msgid "Large/smooth" msgstr "Большой/плавный" #: data/ui/reverb.glade:689 msgid "Experimental" msgstr "Экспериментальный" #: data/ui/reverb.glade:702 msgid "High Frequency Damping" msgstr "Высокочастотное демпфирование" #: data/ui/spectrum_settings.glade:77 msgid "Show Spectrum" msgstr "Показывать спектр" #: data/ui/spectrum_settings.glade:89 msgid "Fill" msgstr "Заполнить" #: data/ui/spectrum_settings.glade:125 msgid "Border" msgstr "Граница" #: data/ui/spectrum_settings.glade:149 msgid "Use Custom Color" msgstr "Использовать свой цвет" #: data/ui/spectrum_settings.glade:173 msgid "Use Gradient" msgstr "Использовать градиент" #: data/ui/spectrum_settings.glade:315 msgid "Points" msgstr "Точки" #: data/ui/spectrum_settings.glade:327 msgid "Height" msgstr "Высота" #: data/ui/spectrum_settings.glade:339 msgid "Line Width" msgstr "Ширина линии" #: data/ui/spectrum_settings.glade:351 msgid "Sampling" msgstr "Передискретизация" #: data/ui/spectrum_settings.glade:363 #, fuzzy msgid "Minimum Frequency" msgstr "Частота" #: data/ui/spectrum_settings.glade:375 #, fuzzy msgid "Maximum Frequency" msgstr "Частота" #: data/ui/spectrum_settings.glade:410 msgid "Spectrum Type" msgstr "Тип спектра" #: data/ui/spectrum_settings.glade:423 msgid "Bars" msgstr "Полосы" #: data/ui/spectrum_settings.glade:424 msgid "Lines" msgstr "Линии" #: data/ui/spectrum_settings.glade:437 msgid "Spectrum Color" msgstr "Цвет спектра" #: data/ui/spectrum_settings.glade:449 msgid "Gradient Color" msgstr "Цвет градиента" #: data/ui/spectrum_settings.glade:461 msgid "Axis Color" msgstr "" #: data/ui/stereo_tools.glade:108 msgid "Stereo Tools" msgstr "Стереокорректоры" #: data/ui/stereo_tools.glade:334 data/ui/stereo_tools.glade:775 msgid "Balance" msgstr "Баланс" #: data/ui/stereo_tools.glade:365 msgid "S/C Level" msgstr "Уровень Раздельный/Центр" #: data/ui/stereo_tools.glade:406 msgid "Softclip" msgstr "" #: data/ui/stereo_tools.glade:452 msgid "Side Level" msgstr "Боковой уровень" #: data/ui/stereo_tools.glade:503 msgid "Side Balance" msgstr "Боковой баланс" #: data/ui/stereo_tools.glade:535 msgid "Middle Level" msgstr "Средний уровень" #: data/ui/stereo_tools.glade:547 msgid "Middle Panorama" msgstr "Срединная панорама" #: data/ui/stereo_tools.glade:604 msgid "LR > LR (Stereo Default)" msgstr "Стерео" #: data/ui/stereo_tools.glade:605 msgid "LR > MS (Stereo to Mid-Side)" msgstr "Стерео > Моно-Раздельно" #: data/ui/stereo_tools.glade:606 msgid "MS > LR (Mid-Side to Stereo)" msgstr "Моно-Раздельно > Стерео" #: data/ui/stereo_tools.glade:607 msgid "LR > LL (Mono Left Channel)" msgstr "Стерео > Моно левый канал" #: data/ui/stereo_tools.glade:608 msgid "LR > RR (Mono Right Channel)" msgstr "Стерео > Моно правый канал" #: data/ui/stereo_tools.glade:609 msgid "LR > L+R (Mono Sum L+R)" msgstr "Стерео > Моно левый+правый каналы" #: data/ui/stereo_tools.glade:610 msgid "LR > RL (Stereo Flip Channels)" msgstr "Стерео > Поменять каналы местами" #: data/ui/stereo_tools.glade:627 msgid "Stereo Matrix" msgstr "Стерео матрица" #: data/ui/stereo_tools.glade:668 data/ui/stereo_tools.glade:709 msgid "Invert Phase" msgstr "Инвертировать фазу" #: data/ui/stereo_tools.glade:806 msgid "Delay L/R" msgstr "Задержка Л/П" #: data/ui/stereo_tools.glade:839 msgid "Stereo Base" msgstr "Стерео база" #: data/ui/stereo_tools.glade:871 msgid "Stereo Phase" msgstr "Стерео фаза" #: data/ui/webrtc.glade:96 msgid "WebRTC" msgstr "" #: data/ui/webrtc.glade:256 data/ui/webrtc.glade:389 data/ui/webrtc.glade:460 #: data/ui/webrtc.glade:648 msgid "Enable" msgstr "Включить" #: data/ui/webrtc.glade:279 msgid "Extended Filter" msgstr "Расширенный фильтр" #: data/ui/webrtc.glade:292 msgid "High Pass Filter" msgstr "Высокачастотный фильтр" #: data/ui/webrtc.glade:309 data/ui/webrtc.glade:425 data/ui/webrtc.glade:698 msgid "Low" msgstr "Низкочастотный фильтр" #: data/ui/webrtc.glade:310 data/ui/webrtc.glade:426 data/ui/webrtc.glade:699 msgid "Moderate" msgstr "Средний" #: data/ui/webrtc.glade:311 data/ui/webrtc.glade:427 data/ui/webrtc.glade:700 msgid "High" msgstr "Высокий" #: data/ui/webrtc.glade:324 data/ui/webrtc.glade:412 #, fuzzy msgid "Suppression Level" msgstr "Уровень подавления" #: data/ui/webrtc.glade:361 msgid "Delay Agnostic" msgstr "Задержка" #: data/ui/webrtc.glade:375 msgid "Echo Canceller" msgstr "Эхо и шумо подавление" #: data/ui/webrtc.glade:428 msgid "Very High" msgstr "Очень высокий" #: data/ui/webrtc.glade:445 msgid "Noise Suppressor" msgstr "Простой шумодав" # # TODO: Mode/Режим заменить на "Режим сжатия" #: data/ui/webrtc.glade:496 msgid "Adaptive Digital" msgstr "Адаптивное цифровое сжатие" #: data/ui/webrtc.glade:497 msgid "Fixed Digital" msgstr "Фиксированное цифровое сжатие" #: data/ui/webrtc.glade:514 msgid "Gain Controller" msgstr "Автоконтроль усиления (AGC)" #: data/ui/webrtc.glade:540 msgid "Target Level" msgstr "Целевой результат" #: data/ui/webrtc.glade:572 msgid "Maximum Gain" msgstr "Максимальное увеличение" #: data/ui/webrtc.glade:672 msgid "Detection Likelihood" msgstr "Вероятность обнаружения" # Taking lingual shortcuts to squeeze it in the text box #: data/ui/webrtc.glade:684 msgid "Frame Size" msgstr "Размер кадра" #: data/ui/webrtc.glade:697 msgid "Very Low" msgstr "Очень низкий" #: data/ui/webrtc.glade:737 msgid "Voice Detector" msgstr "Обнаруживатель голоса" #: data/ui/rnnoise.glade:90 #, fuzzy msgid "Noise Reduction" msgstr "Увеличение ослабления" #: data/ui/rnnoise.glade:242 #, fuzzy msgid "Import Model" msgstr "Импортировать импульс" #: data/ui/rnnoise.glade:246 #, fuzzy msgid "Import Model File" msgstr "Импортировать импульс" #: data/ui/rnnoise.glade:311 #, fuzzy msgid "Active Model" msgstr "Агрессивный режим" #: data/ui/rnnoise.glade:324 msgid "Standard RNNoise Model" msgstr "" #: src/app_info_ui.cpp:120 msgid "paused" msgstr "на паузе" #: src/app_info_ui.cpp:122 msgid "playing" msgstr "воспроизводится" #: src/application.cpp:38 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "Выйти из PulseEffects. Полезно при запуске в режиме отладки." #: src/application.cpp:40 msgid "Show available presets." msgstr "Показать доступные пресеты." #: src/application.cpp:43 msgid "Load a preset. Example: pulseeffects -l music" msgstr "Загрузить пресет. Пример: pulseeffects -l music" #: src/application.cpp:45 msgid "Reset PulseEffects." msgstr "Сбросить настройки PulseEffects" #: src/application.cpp:48 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "" #: src/application.cpp:50 msgid "Hide the Window." msgstr "" #: src/application.cpp:284 msgid "Output Presets: " msgstr "Выходные предустановки: " #: src/application.cpp:292 msgid "Input Presets: " msgstr "Входные предустановки: " #: src/blocklist_settings_ui.cpp:191 msgid "Blocklist" msgstr "Черный список" #: src/calibration_ui.cpp:198 msgid "Calibration Microphone" msgstr "Калибровка корректировки микрофона" #: src/convolver_ui.cpp:281 msgid "Import Impulse File" msgstr "Импортировать импульс" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Open" msgstr "Открыть" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Cancel" msgstr "Отмена" #: src/convolver_ui.cpp:318 src/convolver_ui.cpp:319 src/convolver_ui.cpp:321 msgid "Failed" msgstr "Не получилось" #: src/convolver_ui.cpp:323 msgid "Could Not Load The Impulse File" msgstr "Не смогли загрузить файл с импульсными реакциями" #: src/equalizer_ui.cpp:380 msgid "infinity" msgstr "" #: src/equalizer_ui.cpp:738 #, fuzzy msgid "Import APO Preset File" msgstr "Импортировать предустановки" #: src/equalizer_ui.cpp:743 #, fuzzy msgid "APO Presets" msgstr "Предустановки" #: src/general_settings_ui.cpp:149 msgid "General" msgstr "Общие" #: src/pulse_settings_ui.cpp:168 msgid "Pulseaudio" msgstr "" #, fuzzy #~ msgid "Import APO Presets" #~ msgstr "Импортировать предустановки" #~ msgid "Input Gain" #~ msgstr "Уровень предусиления" #, fuzzy #~ msgid "Output Gain" #~ msgstr "Уровень предусиления" #, fuzzy #~ msgid "Gain Detection" #~ msgstr "Увеличение ослабления" #~ msgid "Scale" #~ msgstr "Масштаб" #~ msgid "Exponent" #~ msgstr "Степень" easyeffects-4.8.7/po/sk.po000066400000000000000000001271061424023573300154400ustar00rootroot00000000000000# Slovak translation for Pulseeffects. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Mlocik97 , 2020. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-14 23:58+0100\n" "PO-Revision-Date: 2019-09-07 22:19+0200\n" "Last-Translator: Mlocik97\n" "Language-Team: \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.1\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 data/ui/application.glade:61 msgid "PulseEffects" msgstr "PulseEffects" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Zvukové efekty pre aplikácie využívajúce PulseAudio" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Wellington Wallace" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects je pokročilý nástroj pre úpravu zvuku. Obsahuje taktiež " "Equalizér, Limiter, Kompresor, nástroj Ozveny, a viacero ďalších.Pre " "doplnenie napríklad aj zabudovaný analyzátor spektra." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "Pretože PulseEffects používa predvolene zvukový server PulseAudio, funguje s " "väčšinou ak nie všetkými programami. Všetky podprované programy sú zobrazené " "v hlavnom okne, kde je ich možné individuálne povoliť." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Popri práci s úpravou výstupného zvuku, PulseEffects je možné použiť aj na " "úpravu vstupných zvukov z mikrofónu. To má výhodu napríklad pri nahrávaní, " "ale je výborný aj pre hlasové hovory." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "Keď je PulseEffect spustený, zapamätá si posledné používané nastavenia, " "Taktiež je možné uložiť všetky aktuálne nastavenia ako profily" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "Nastaviť hlasitosť a zapnúť/vypnúť efekty" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "Zahrňuje ekvalizér s prednastavenými profilmy" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Vstupný Obmedzovač" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:52 #: data/ui/compressor.glade:110 data/ui/compressor.glade:589 #: data/ui/webrtc.glade:633 msgid "Compressor" msgstr "Kompresor" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Kalibrácia" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "Ekvalizér, Kompresor a Ďalšie Audio Efekty" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "Limiter;Kompresor;Ozvena;Equalizér;Automatická hlasitosť;" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:44 #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:47 msgid "\"Presets\"" msgstr "\"Predvoľby\"" #: data/ui/about.glade.in:11 #, fuzzy msgid "Audio effects for PulseAudio applications" msgstr "Zvukové efekty pre programy PulseAudio" #: data/ui/app_button_row.glade:49 msgid "Applications" msgstr "Aplikácie" #: data/ui/app_info.glade:203 #, fuzzy msgid "Add to Blocklist" msgstr "Čierny List" #: data/ui/app_info.glade:239 msgid "Format" msgstr "Formát" #: data/ui/app_info.glade:264 data/ui/convolver.glade:348 msgid "Rate" msgstr "Kmitočet" #: data/ui/app_info.glade:289 data/ui/pulse_info.glade:239 #: data/ui/stereo_tools.glade:756 msgid "Channels" msgstr "Kanály" #: data/ui/app_info.glade:314 msgid "Resampler" msgstr "Prevzorkovač" #: data/ui/app_info.glade:339 data/ui/pulse_settings.glade:159 #: data/ui/pulse_settings.glade:259 data/ui/pulse_settings.glade:464 #: data/ui/pulse_settings.glade:564 msgid "Buffer" msgstr "Vyrovnávacia Pamäť" #: data/ui/app_info.glade:364 data/ui/pulse_settings.glade:190 #: data/ui/pulse_settings.glade:290 data/ui/pulse_settings.glade:476 #: data/ui/pulse_settings.glade:576 msgid "Latency" msgstr "Odozva" #: data/ui/app_info.glade:389 msgid "State" msgstr "Stav" #: data/ui/application.glade:142 src/calibration_ui.cpp:64 #: src/calibration_ui.cpp:191 msgid "Test Signals" msgstr "Skúšobné Signály" #: data/ui/application.glade:157 msgid "Global Bypass" msgstr "Prepustiť" #: data/ui/application.glade:172 data/ui/equalizer.glade:331 #: data/ui/general_settings.glade:289 msgid "Settings" msgstr "Nastavenia" #: data/ui/application.glade:194 msgid "Help" msgstr "Nápoveda" #: data/ui/application.glade:217 data/ui/crossfeed.glade:240 #: data/ui/equalizer.glade:403 data/ui/filter.glade:344 #: data/ui/reverb.glade:401 src/presets_menu_ui.cpp:133 #: src/presets_menu_ui.cpp:285 src/presets_menu_ui.cpp:286 #: src/presets_menu_ui.cpp:303 src/presets_menu_ui.cpp:304 msgid "Presets" msgstr "Predvoľby" #: data/ui/autogain.glade:90 msgid "Auto Gain" msgstr "Automatická hlasitosť" #: data/ui/autogain.glade:161 data/ui/bass_enhancer.glade:167 #: data/ui/compressor.glade:214 data/ui/convolver.glade:218 #: data/ui/crossfeed.glade:136 data/ui/crystalizer.glade:134 #: data/ui/deesser.glade:182 data/ui/delay.glade:144 #: data/ui/equalizer.glade:450 data/ui/equalizer_band.glade:187 #: data/ui/equalizer_band.glade:230 data/ui/exciter.glade:167 #: data/ui/filter.glade:243 data/ui/general_settings.glade:298 #: data/ui/gate.glade:172 data/ui/limiter.glade:166 data/ui/loudness.glade:174 #: data/ui/maximizer.glade:139 data/ui/multiband_compressor.glade:307 #: data/ui/multiband_gate.glade:331 data/ui/pitch.glade:158 #: data/ui/reverb.glade:299 data/ui/stereo_tools.glade:194 #: data/ui/webrtc.glade:141 data/ui/rnnoise.glade:139 msgid "Reset" msgstr "Obnoviť pôvodné hodnoty" #: data/ui/autogain.glade:185 data/ui/rnnoise.glade:163 msgid "Based on" msgstr "Na základe" #: data/ui/autogain.glade:262 msgid "Reset History" msgstr "Vymazať Históriu" #: data/ui/autogain.glade:274 #, fuzzy msgid "Detect Silence" msgstr "Zistenie Ticha" #: data/ui/autogain.glade:286 #, fuzzy msgid "Use Geometric Mean" msgstr "Použiť Geometrický Priemer" #: data/ui/autogain.glade:325 msgid "Target" msgstr "Ciel" #: data/ui/autogain.glade:374 data/ui/autogain.glade:779 msgid "Momentary" msgstr "Okamžitá" #: data/ui/autogain.glade:434 msgid "Weights" msgstr "Váhy" #: data/ui/autogain.glade:448 data/ui/autogain.glade:792 msgid "Short Term" msgstr "Krátkodobá" #: data/ui/autogain.glade:497 data/ui/autogain.glade:805 msgid "Integrated" msgstr "Integrovaná" #: data/ui/autogain.glade:564 data/ui/autogain.glade:1076 #: data/ui/bass_enhancer.glade:596 data/ui/compressor.glade:1086 #: data/ui/convolver.glade:575 data/ui/crossfeed.glade:391 #: data/ui/crystalizer.glade:250 data/ui/deesser.glade:783 #: data/ui/delay.glade:328 data/ui/equalizer.glade:682 #: data/ui/exciter.glade:596 data/ui/filter.glade:508 data/ui/gate.glade:689 #: data/ui/limiter.glade:501 data/ui/loudness.glade:238 #: data/ui/loudness.glade:431 data/ui/maximizer.glade:358 #: data/ui/multiband_compressor.glade:2103 data/ui/multiband_gate.glade:2262 #: data/ui/pitch.glade:450 data/ui/presets_menu.glade:238 #: data/ui/reverb.glade:753 data/ui/stereo_tools.glade:427 #: data/ui/stereo_tools.glade:931 data/ui/webrtc.glade:780 #: data/ui/rnnoise.glade:362 msgid "Input" msgstr "Vstup" #: data/ui/autogain.glade:577 data/ui/autogain.glade:1020 #: data/ui/bass_enhancer.glade:625 data/ui/compressor.glade:1099 #: data/ui/convolver.glade:588 data/ui/crossfeed.glade:405 #: data/ui/crystalizer.glade:263 data/ui/deesser.glade:797 #: data/ui/delay.glade:341 data/ui/equalizer.glade:695 #: data/ui/exciter.glade:625 data/ui/filter.glade:521 data/ui/gate.glade:703 #: data/ui/limiter.glade:636 data/ui/loudness.glade:271 #: data/ui/loudness.glade:445 data/ui/maximizer.glade:372 #: data/ui/multiband_compressor.glade:894 #: data/ui/multiband_compressor.glade:1272 #: data/ui/multiband_compressor.glade:1651 #: data/ui/multiband_compressor.glade:2030 #: data/ui/multiband_compressor.glade:2116 data/ui/multiband_gate.glade:951 #: data/ui/multiband_gate.glade:1363 data/ui/multiband_gate.glade:1776 #: data/ui/multiband_gate.glade:2189 data/ui/multiband_gate.glade:2275 #: data/ui/pitch.glade:463 data/ui/presets_menu.glade:137 #: data/ui/reverb.glade:766 data/ui/stereo_tools.glade:901 #: data/ui/stereo_tools.glade:944 data/ui/webrtc.glade:794 #: data/ui/rnnoise.glade:375 msgid "Output" msgstr "Výstup" #: data/ui/autogain.glade:899 msgid "Relative" msgstr "Relatívna" #: data/ui/autogain.glade:912 data/ui/compressor.glade:1262 msgid "Gain" msgstr "Zisk" #: data/ui/autogain.glade:980 msgid "Loudness" msgstr "Hlasitosť" #: data/ui/autogain.glade:1034 msgid "Range" msgstr "Rozsah" #: data/ui/bass_enhancer.glade:116 msgid "Bass Enhancer" msgstr "Vylepšovač Hĺbok" #: data/ui/bass_enhancer.glade:191 data/ui/compressor.glade:238 #: data/ui/crossfeed.glade:160 data/ui/deesser.glade:206 #: data/ui/delay.glade:168 data/ui/equalizer.glade:474 #: data/ui/exciter.glade:191 data/ui/filter.glade:267 data/ui/gate.glade:196 #: data/ui/limiter.glade:190 data/ui/loudness.glade:143 #: data/ui/maximizer.glade:163 data/ui/multiband_compressor.glade:331 #: data/ui/multiband_gate.glade:355 data/ui/pitch.glade:182 #: data/ui/reverb.glade:323 data/ui/stereo_tools.glade:218 #: data/ui/webrtc.glade:165 msgid "Provided by" msgstr "Poskytuje" #: data/ui/bass_enhancer.glade:259 data/ui/compressor.glade:602 #: data/ui/deesser.glade:274 data/ui/exciter.glade:259 msgid "Listen" msgstr "Počúvať" #: data/ui/bass_enhancer.glade:302 data/ui/exciter.glade:303 msgid "3rd" msgstr "3." #: data/ui/bass_enhancer.glade:315 data/ui/exciter.glade:316 msgid "2nd" msgstr "2." #: data/ui/bass_enhancer.glade:327 data/ui/exciter.glade:328 msgid "Blend Harmonics" msgstr "Miešať Harmonické Kmity" #: data/ui/bass_enhancer.glade:355 data/ui/exciter.glade:357 #: data/ui/reverb.glade:498 msgid "Amount" msgstr "Množstvo" #: data/ui/bass_enhancer.glade:367 data/ui/bass_enhancer.glade:504 #: data/ui/exciter.glade:369 data/ui/exciter.glade:504 msgid "Harmonics" msgstr "Harmonickosť" #: data/ui/bass_enhancer.glade:379 data/ui/exciter.glade:381 #, fuzzy msgid "Scope" msgstr "Zrezanie [Hz]" #: data/ui/bass_enhancer.glade:472 msgid "Floor" msgstr "Spodná hranica" #: data/ui/blocklist_settings.glade:52 data/ui/blocklist_settings.glade:155 #: data/ui/presets_menu.glade:65 data/ui/presets_menu.glade:166 msgid "Create Preset" msgstr "Vytvoriť Predvoľbu" #: data/ui/blocklist_settings.glade:68 data/ui/blocklist_settings.glade:171 #: data/ui/presets_menu.glade:52 data/ui/presets_menu.glade:153 #: data/ui/pulse_info.glade:50 msgid "Name" msgstr "Názov" #: data/ui/blocklist_settings.glade:81 msgid "Reconnect the microphone to apply new changes made to the Blocklist" msgstr "Znovu pripojiť mikrofón pre použitie zmien vykonaných v Blockliste" #: data/ui/blocklist_settings.glade:139 data/ui/pulse_settings.glade:383 msgid "Input Effects" msgstr "Vstupné Efekty" #: data/ui/blocklist_settings.glade:230 msgid "Restart the player to apply new changes made to the Blocklist" msgstr "Reštartovať prehrávač pre použitie zmien vykonaných v Blockliste" #: data/ui/blocklist_settings.glade:242 data/ui/pulse_settings.glade:688 msgid "Output Effects" msgstr "Výstupné Efekty" #: data/ui/blocklist_settings.glade:265 msgid "Show Blocklisted Apps in Main Tab" msgstr "Zobraziť Aplikácie z Blocklistu na Hlavnej Karte" #: data/ui/calibration_signals.glade:32 msgid "Sine" msgstr "Sínus" #: data/ui/calibration_signals.glade:33 msgid "Square" msgstr "Štvorec" #: data/ui/calibration_signals.glade:34 msgid "Saw" msgstr "Píla" #: data/ui/calibration_signals.glade:35 msgid "Triangle" msgstr "Trojuholník" #: data/ui/calibration_signals.glade:36 msgid "Silence" msgstr "Ticho" #: data/ui/calibration_signals.glade:37 msgid "White Noise" msgstr "Biely Šum" #: data/ui/calibration_signals.glade:38 msgid "Pink Noise" msgstr "Ružový Šum" #: data/ui/calibration_signals.glade:39 msgid "Sine Table" msgstr "Sínusová Tabuľka" #: data/ui/calibration_signals.glade:40 msgid "Ticks" msgstr "Tiky" #: data/ui/calibration_signals.glade:41 msgid "Gaussian Noise" msgstr "Gaussový Šum" #: data/ui/calibration_signals.glade:42 msgid "Red Noise" msgstr "Červený Šum" #: data/ui/calibration_signals.glade:43 msgid "Blue Noise" msgstr "Modrý Šum" #: data/ui/calibration_signals.glade:44 msgid "Violet Noise" msgstr "Fialový Šum" #: data/ui/calibration_signals.glade:64 #, fuzzy msgid "Volume" msgstr "Automatická hlasitosť" #: data/ui/calibration_signals.glade:135 data/ui/equalizer_band.glade:158 #: data/ui/filter.glade:394 msgid "Frequency" msgstr "Frekvencia" #: data/ui/calibration_mic.glade:33 msgid "Window" msgstr "Okno" #: data/ui/calibration_mic.glade:90 msgid "Measure Noise" msgstr "Merať Šum" #: data/ui/calibration_mic.glade:119 msgid "Subtract Noise" msgstr "Oddeliť Šum" #: data/ui/compressor.glade:386 data/ui/deesser.glade:436 #: data/ui/gate.glade:498 data/ui/maximizer.glade:242 #: data/ui/multiband_compressor.glade:707 #: data/ui/multiband_compressor.glade:1085 #: data/ui/multiband_compressor.glade:1464 #: data/ui/multiband_compressor.glade:1843 data/ui/multiband_gate.glade:731 #: data/ui/multiband_gate.glade:1142 data/ui/multiband_gate.glade:1555 #: data/ui/multiband_gate.glade:1968 #, fuzzy msgid "Threshold" msgstr "Prah" #: data/ui/compressor.glade:420 data/ui/deesser.glade:448 #: data/ui/gate.glade:532 data/ui/multiband_compressor.glade:741 #: data/ui/multiband_compressor.glade:1119 #: data/ui/multiband_compressor.glade:1498 #: data/ui/multiband_compressor.glade:1877 data/ui/multiband_gate.glade:765 #: data/ui/multiband_gate.glade:1176 data/ui/multiband_gate.glade:1589 #: data/ui/multiband_gate.glade:2002 msgid "Ratio" msgstr "Pomer" #: data/ui/compressor.glade:452 data/ui/gate.glade:564 #: data/ui/multiband_compressor.glade:773 #: data/ui/multiband_compressor.glade:1151 #: data/ui/multiband_compressor.glade:1530 #: data/ui/multiband_compressor.glade:1909 data/ui/multiband_gate.glade:797 #: data/ui/multiband_gate.glade:1208 data/ui/multiband_gate.glade:1621 #: data/ui/multiband_gate.glade:2034 msgid "Knee" msgstr "Prechod" #: data/ui/compressor.glade:486 data/ui/deesser.glade:532 #: data/ui/gate.glade:598 data/ui/multiband_compressor.glade:807 #: data/ui/multiband_compressor.glade:1185 #: data/ui/multiband_compressor.glade:1564 #: data/ui/multiband_compressor.glade:1943 data/ui/multiband_gate.glade:831 #: data/ui/multiband_gate.glade:1242 data/ui/multiband_gate.glade:1655 #: data/ui/multiband_gate.glade:2068 msgid "Makeup" msgstr "Pozdvihnutie" #: data/ui/compressor.glade:520 data/ui/gate.glade:464 #: data/ui/limiter.glade:363 data/ui/maximizer.glade:266 #: data/ui/multiband_compressor.glade:673 #: data/ui/multiband_compressor.glade:1051 #: data/ui/multiband_compressor.glade:1430 #: data/ui/multiband_compressor.glade:1809 data/ui/multiband_gate.glade:697 #: data/ui/multiband_gate.glade:1108 data/ui/multiband_gate.glade:1521 #: data/ui/multiband_gate.glade:1934 msgid "Release" msgstr "Uvoľnenie" #: data/ui/compressor.glade:532 data/ui/gate.glade:430 #: data/ui/multiband_compressor.glade:639 #: data/ui/multiband_compressor.glade:1017 #: data/ui/multiband_compressor.glade:1396 #: data/ui/multiband_compressor.glade:1775 data/ui/multiband_gate.glade:663 #: data/ui/multiband_gate.glade:1074 data/ui/multiband_gate.glade:1487 #: data/ui/multiband_gate.glade:1900 msgid "Attack" msgstr "Nábeh" #: data/ui/compressor.glade:559 msgid "Downward" msgstr "Dole" #: data/ui/compressor.glade:560 msgid "Upward" msgstr "Hore" #: data/ui/compressor.glade:573 msgid "Compression Mode" msgstr "Mód Kompresora" #: data/ui/compressor.glade:649 msgid "Pre-amplification" msgstr "Predzosilnenie" #: data/ui/compressor.glade:683 msgid "Reactivity" msgstr "Reaktivita" #: data/ui/compressor.glade:716 data/ui/limiter.glade:375 msgid "Lookahead" msgstr "Výhľad" #: data/ui/compressor.glade:730 msgid "Feed-forward" msgstr "Kanál-Vpred" #: data/ui/compressor.glade:731 msgid "Feed-back" msgstr "Kanál-Vzad" #: data/ui/compressor.glade:744 data/ui/equalizer_band.glade:51 msgid "Type" msgstr "Typ" #: data/ui/compressor.glade:758 data/ui/deesser.glade:731 #: data/ui/gate.glade:303 data/ui/multiband_compressor.glade:611 #: data/ui/multiband_compressor.glade:989 #: data/ui/multiband_compressor.glade:1368 #: data/ui/multiband_compressor.glade:1747 data/ui/multiband_gate.glade:635 #: data/ui/multiband_gate.glade:1046 data/ui/multiband_gate.glade:1459 #: data/ui/multiband_gate.glade:1872 msgid "Peak" msgstr "Vrchol" #: data/ui/compressor.glade:759 data/ui/deesser.glade:730 #: data/ui/gate.glade:302 data/ui/multiband_compressor.glade:610 #: data/ui/multiband_compressor.glade:988 #: data/ui/multiband_compressor.glade:1367 #: data/ui/multiband_compressor.glade:1746 data/ui/multiband_gate.glade:634 #: data/ui/multiband_gate.glade:1045 data/ui/multiband_gate.glade:1458 #: data/ui/multiband_gate.glade:1871 msgid "RMS" msgstr "RMS" #: data/ui/compressor.glade:760 msgid "Low-Pass" msgstr "Dolný Prechod" #: data/ui/compressor.glade:761 msgid "Uniform" msgstr "Rovnomerný" #: data/ui/compressor.glade:774 data/ui/deesser.glade:702 #: data/ui/equalizer.glade:257 data/ui/equalizer_band.glade:84 #: data/ui/multiband_compressor.glade:412 data/ui/multiband_gate.glade:436 #: data/ui/stereo_tools.glade:591 data/ui/webrtc.glade:483 msgid "Mode" msgstr "Mód" #: data/ui/compressor.glade:788 msgid "Middle" msgstr "Stredný" #: data/ui/compressor.glade:789 msgid "Side" msgstr "Postranný" #: data/ui/compressor.glade:790 data/ui/delay.glade:247 #: data/ui/equalizer.glade:612 data/ui/stereo_tools.glade:655 msgid "Left" msgstr "Ľavý" #: data/ui/compressor.glade:791 data/ui/delay.glade:280 #: data/ui/equalizer.glade:654 data/ui/stereo_tools.glade:724 msgid "Right" msgstr "Pravý" #: data/ui/compressor.glade:804 msgid "Source" msgstr "Zdroj" #: data/ui/compressor.glade:820 data/ui/compressor.glade:1274 msgid "Sidechain" msgstr "Postranný reťazec" #: data/ui/compressor.glade:925 msgid "Relative Release Threshold" msgstr "Relatívny Prah Uvoľnenia" #: data/ui/compressor.glade:937 #, fuzzy msgid "Boost Threshold" msgstr "Prah" #: data/ui/compressor.glade:949 #, fuzzy msgid "High-pass Frequency" msgstr "Vysokofrekvenčné tlmenie" #: data/ui/compressor.glade:961 #, fuzzy msgid "Low-pass Frequency" msgstr "Nízkopriepustná Frekvencia" #: data/ui/compressor.glade:973 #, fuzzy msgid "High-pass Filter Mode" msgstr "Horný prechod" #: data/ui/compressor.glade:985 msgid "Low-pass Filter Mode" msgstr "Nízkopriepustný Mód Filtra" #: data/ui/compressor.glade:999 data/ui/compressor.glade:1017 #: data/ui/equalizer_band.glade:63 msgid "Off" msgstr "Vypnutý" #: data/ui/compressor.glade:1000 data/ui/compressor.glade:1018 msgid "12 dB/oct" msgstr "Níska pásmová priepusť 12dB/okt" #: data/ui/compressor.glade:1001 data/ui/compressor.glade:1019 msgid "24 dB/oct" msgstr "Níska pásmová priepusť 24dB/okt" #: data/ui/compressor.glade:1002 data/ui/compressor.glade:1020 msgid "36 dB/oct" msgstr "Níska pásmová priepusť 36dB/okt" #: data/ui/compressor.glade:1043 msgid "Advanced" msgstr "Pokročilé" #: data/ui/compressor.glade:1347 msgid "Curve" msgstr "Krivka" #: data/ui/convolver.glade:90 msgid "Convolver" msgstr "Svinovač" #: data/ui/convolver.glade:125 msgid "Import Impulse" msgstr "Načítať Impulz" #: data/ui/convolver.glade:129 msgid "Import Impulse Response File" msgstr "Načitať Odpoveď Impulzu" #: data/ui/convolver.glade:309 msgid "L" msgstr "Ľ" #: data/ui/convolver.glade:323 msgid "R" msgstr "P" #: data/ui/convolver.glade:390 #, fuzzy msgid "Duration" msgstr "Zoslabenie" #: data/ui/convolver.glade:402 msgid "Samples" msgstr "Vzorky" #: data/ui/convolver.glade:435 src/convolver_ui.cpp:285 msgid "Impulse Response" msgstr "Odpoveď Impulzu" #: data/ui/convolver.glade:458 msgid "Select the impulse Response File" msgstr "Zvolte Súbor Impulzu" #: data/ui/convolver.glade:477 src/spectrum_settings_ui.cpp:195 msgid "Spectrum" msgstr "Spektrum" #: data/ui/convolver.glade:520 msgid "Stereo Width" msgstr "Šírka sterea" #: data/ui/crossfeed.glade:104 msgid "Crossfeed" msgstr "Prelínanie kanálov" #: data/ui/crossfeed.glade:254 msgid "Jmeier" msgstr "Jmeier" #: data/ui/crossfeed.glade:266 data/ui/filter.glade:183 #: data/ui/reverb.glade:259 msgid "Default" msgstr "Predvolený" #: data/ui/crossfeed.glade:278 msgid "Cmoy" msgstr "Slúchadkový zosilovač (CMoy)" #: data/ui/crossfeed.glade:308 msgid "Cutoff" msgstr "Zrezanie" #: data/ui/crossfeed.glade:341 msgid "Feed" msgstr "Kanál" #: data/ui/crystalizer.glade:90 msgid "Crystalizer" msgstr "Kryštalizátor" #: data/ui/crystalizer.glade:200 msgid "Aggressive Mode" msgstr "Agresívny Režim" #: data/ui/crystalizer.glade:464 msgid "Before" msgstr "Pred" #: data/ui/crystalizer.glade:477 msgid "After" msgstr "Po" #: data/ui/crystalizer.glade:550 msgid "Loudness Range" msgstr "Dynamický Rozsah" #: data/ui/crystalizer_band.glade:28 data/ui/equalizer_band.glade:316 #: data/ui/stereo_tools.glade:680 data/ui/stereo_tools.glade:737 msgid "Mute" msgstr "Stíšený" #: data/ui/crystalizer_band.glade:40 data/ui/multiband_compressor.glade:580 #: data/ui/multiband_compressor.glade:958 #: data/ui/multiband_compressor.glade:1337 #: data/ui/multiband_compressor.glade:1716 data/ui/multiband_gate.glade:604 #: data/ui/multiband_gate.glade:1015 data/ui/multiband_gate.glade:1428 #: data/ui/multiband_gate.glade:1841 msgid "Bypass" msgstr "Prepustiť" #: data/ui/deesser.glade:125 msgid "Deesser" msgstr "Deesser" #: data/ui/deesser.glade:309 #, fuzzy msgid "F1 Gain" msgstr "Zisk" #: data/ui/deesser.glade:321 #, fuzzy msgid "F2 Level" msgstr "Úroveň" #: data/ui/deesser.glade:333 #, fuzzy msgid "F2 Peak Q" msgstr "Vrchol Q" #: data/ui/deesser.glade:424 msgid "Laxity" msgstr "Nedbanlivosť" #: data/ui/deesser.glade:585 #, fuzzy msgid "F1 Split" msgstr "Rozdeliť" #: data/ui/deesser.glade:597 #, fuzzy msgid "F2 Peak" msgstr "Vrchol" #: data/ui/deesser.glade:690 data/ui/gate.glade:288 msgid "Detection" msgstr "Detekcia" #: data/ui/deesser.glade:715 msgid "Wide" msgstr "Široký" #: data/ui/deesser.glade:716 msgid "Split" msgstr "Rozdeliť" #: data/ui/deesser.glade:959 data/ui/multiband_gate.glade:865 #: data/ui/multiband_gate.glade:1298 data/ui/multiband_gate.glade:1711 #: data/ui/multiband_gate.glade:2124 msgid "Reduction" msgstr "Redukcia" #: data/ui/deesser.glade:972 msgid "Detected" msgstr "Zistené" #: data/ui/delay.glade:90 msgid "Delay" msgstr "Onsekorenie" #: data/ui/equalizer.glade:44 msgid "Equalizer" msgstr "Ekvalizér" #: data/ui/equalizer.glade:160 msgid "Flat Response" msgstr "Vyhladiť" #: data/ui/equalizer.glade:175 msgid "Calculate Frequencies" msgstr "Vypočítať Frekvencie" #: data/ui/equalizer.glade:213 msgid "Bands" msgstr "Bands" #: data/ui/equalizer.glade:269 msgid "IIR" msgstr "IIR" #: data/ui/equalizer.glade:270 msgid "FIR" msgstr "FIR" #: data/ui/equalizer.glade:271 msgid "FFT" msgstr "FFT" #: data/ui/equalizer.glade:304 msgid "Split Channels" msgstr "Rozdeliť Kanály" #: data/ui/equalizer.glade:389 #, fuzzy msgid "Apply APO Preset" msgstr "APO Predvoľby" #: data/ui/equalizer_band.glade:64 msgid "Bell" msgstr "Zvonek" #: data/ui/equalizer_band.glade:65 msgid "High Pass" msgstr "Horné Pásmo" #: data/ui/equalizer_band.glade:66 msgid "High Shelf" msgstr "Horný Prah" #: data/ui/equalizer_band.glade:67 msgid "Low Pass" msgstr "Dolné Pásmo" #: data/ui/equalizer_band.glade:68 msgid "Low Shelf" msgstr "Dolný Prah" #: data/ui/equalizer_band.glade:69 msgid "Notch" msgstr "Zárez" #: data/ui/equalizer_band.glade:70 data/ui/filter.glade:427 msgid "Resonance" msgstr "Rezonancia" #: data/ui/equalizer_band.glade:71 #, fuzzy msgid "All Pass" msgstr "Dolné Pásmo" #: data/ui/equalizer_band.glade:96 msgid "RLC (BT)" msgstr "RLC (BT)" #: data/ui/equalizer_band.glade:97 msgid "RLC (MT)" msgstr "RLC (MT)" #: data/ui/equalizer_band.glade:98 msgid "BWC (BT)" msgstr "BWC (BT)" #: data/ui/equalizer_band.glade:99 msgid "BWC (MT)" msgstr "BWC (MT)" #: data/ui/equalizer_band.glade:100 msgid "LRX (BT)" msgstr "LRX (BT)" #: data/ui/equalizer_band.glade:101 msgid "LRX (MT)" msgstr "LRX (MT)" #: data/ui/equalizer_band.glade:102 msgid "APO (DR)" msgstr "APO (DR)" #: data/ui/equalizer_band.glade:115 msgid "Slope" msgstr "Sklon" #: data/ui/equalizer_band.glade:203 msgid "Quality" msgstr "Kvalita" #: data/ui/equalizer_band.glade:253 msgid "Width" msgstr "Šírka" #: data/ui/equalizer_band.glade:304 data/ui/multiband_compressor.glade:593 #: data/ui/multiband_compressor.glade:971 #: data/ui/multiband_compressor.glade:1350 #: data/ui/multiband_compressor.glade:1729 data/ui/multiband_gate.glade:617 #: data/ui/multiband_gate.glade:1028 data/ui/multiband_gate.glade:1441 #: data/ui/multiband_gate.glade:1854 msgid "Solo" msgstr "Sólo" #: data/ui/equalizer_preset_row.glade:39 data/ui/irs_row.glade:44 msgid "Apply" msgstr "Použiť" #: data/ui/exciter.glade:116 msgid "Exciter" msgstr "Zvukový budič" #: data/ui/exciter.glade:472 data/ui/maximizer.glade:254 #, fuzzy msgid "Ceiling" msgstr "Obmedzenie [dB]" #: data/ui/filter.glade:97 msgid "Filter" msgstr "Filter" #: data/ui/filter.glade:147 msgid "Muted" msgstr "Stíšený" #: data/ui/filter.glade:159 data/ui/reverb.glade:233 msgid "Disco" msgstr "Disko" #: data/ui/filter.glade:171 msgid "Distant Headphones" msgstr "Vzdialená Slúchadlá" #: data/ui/filter.glade:360 msgid "12dB/oct Lowpass" msgstr "Níska pásmová priepusť 12dB/okt" #: data/ui/filter.glade:361 msgid "24dB/oct Lowpass" msgstr "Níska pásmová priepusť 24dB/okt" #: data/ui/filter.glade:362 msgid "36dB/oct Lowpass" msgstr "Níska pásmová priepusť 36dB/okt" #: data/ui/filter.glade:363 msgid "12dB/oct Highpass" msgstr "Vysoká pásmová priepusť 12dB/okt" #: data/ui/filter.glade:364 msgid "24dB/oct Highpass" msgstr "Vysoká pásmová priepusť 24dB/okt" #: data/ui/filter.glade:365 msgid "36dB/oct Highpass" msgstr "Vysoká pásmová priepusť 36dB/okt" #: data/ui/filter.glade:366 msgid "6dB/oct Bandpass" msgstr "Pásmová priepusť 6dB/okt" #: data/ui/filter.glade:367 msgid "12dB/oct Bandpass" msgstr "Pásmová priepusť 12dB/okt" #: data/ui/filter.glade:368 msgid "18dB/oct Bandpass" msgstr "Pásmová priepusť 18dB/okt" #: data/ui/filter.glade:369 msgid "6dB/oct Bandreject" msgstr "Vylúčenie pásma 6dB/okt" #: data/ui/filter.glade:370 msgid "12dB/oct Bandreject" msgstr "Vylúčenie pásma 12dB/okt" #: data/ui/filter.glade:371 msgid "18dB/oct Bandreject" msgstr "Vylúčenie pásma 18dB/okt" #: data/ui/filter.glade:460 msgid "Inertia" msgstr "Zotrvačnosť" #: data/ui/general_settings.glade:58 msgid "Start Service at Login" msgstr "Spustiť Službu pri Prihlásení" #: data/ui/general_settings.glade:82 msgid "Process All Outputs" msgstr "Spracovať Všetky Výstupy" #: data/ui/general_settings.glade:94 msgid "Process All Inputs" msgstr "Spracovať Všetky Vstupy" #: data/ui/general_settings.glade:130 msgid "Use Dark Theme" msgstr "Použiť Tmavú Tému" #: data/ui/general_settings.glade:158 data/ui/general_settings.glade:220 msgid "Niceness" msgstr "Prívetivosť" #: data/ui/general_settings.glade:159 msgid "Real Time" msgstr "V Reálnom Čase" #: data/ui/general_settings.glade:160 msgid "None" msgstr "Žiadny" #: data/ui/general_settings.glade:208 msgid "Priority Type" msgstr "Typ Priority" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "Priorita" #: data/ui/general_settings.glade:244 msgid "Activity Timeout" msgstr "" #: data/ui/general_settings.glade:325 msgid "About" msgstr "O Programu" #: data/ui/gate.glade:97 msgid "Gate" msgstr "Brána" #: data/ui/gate.glade:330 #, fuzzy msgid "Maximum Gain Reduction" msgstr "Redukcia zosilnenia" #: data/ui/gate.glade:379 msgid "Stereo Link" msgstr "Spojenie sterea" #: data/ui/gate.glade:393 msgid "Average" msgstr "Priemerná" #: data/ui/gate.glade:394 msgid "Maximum" msgstr "Maximálna" #: data/ui/gate.glade:632 msgid "Input Level" msgstr "Vstupný Obmedzovač" #: data/ui/gate.glade:864 data/ui/multiband_gate.glade:911 #: data/ui/multiband_gate.glade:1323 data/ui/multiband_gate.glade:1736 #: data/ui/multiband_gate.glade:2149 msgid "Gating" msgstr "Hradlo" #: data/ui/limiter.glade:96 data/ui/webrtc.glade:612 msgid "Limiter" msgstr "Obmedzovač" #: data/ui/limiter.glade:266 msgid "Automatic Smoothing Control" msgstr "Automatické Vyhladenie" #: data/ui/limiter.glade:278 msgid "Automatic Leveling" msgstr "Automatické Úrovne" #: data/ui/limiter.glade:308 msgid "Limit" msgstr "Obmedzenie" #: data/ui/limiter.glade:409 msgid "Oversampling" msgstr "Prevzorkovanie" #: data/ui/limiter.glade:447 msgid "ASC" msgstr "ASC" #: data/ui/limiter.glade:595 msgid "Attenuation" msgstr "Zoslabenie" #: data/ui/loudness.glade:90 msgid "Loudness Compensator" msgstr "Kompenzácia Hlasitosti" #: data/ui/loudness.glade:328 msgid "Standard" msgstr "Štandardný" #: data/ui/loudness.glade:341 msgid "Flat" msgstr "Rovný" #: data/ui/loudness.glade:342 msgid "ISO226-2003" msgstr "ISO226-2003" #: data/ui/loudness.glade:343 msgid "Fletcher-Munson" msgstr "Fletcher-Munson" #: data/ui/loudness.glade:344 msgid "Robinson-Dadson" msgstr "Robinson-Dadson" #: data/ui/loudness.glade:370 #, fuzzy msgid "FFT Size" msgstr "Veľkosť miestnosti" #: data/ui/maximizer.glade:95 msgid "Maximizer" msgstr "Zosilovač" #: data/ui/maximizer.glade:386 msgid "Gain Reduction" msgstr "Redukcia zosilnenia" #: data/ui/multiband_compressor.glade:139 msgid "Multiband Compressor" msgstr "Viacpásmový Kompresor" #: data/ui/multiband_compressor.glade:426 data/ui/multiband_gate.glade:450 msgid "LR4" msgstr "LR4" #: data/ui/multiband_compressor.glade:427 data/ui/multiband_gate.glade:451 msgid "LR8" msgstr "LR8" #: data/ui/multiband_compressor.glade:441 data/ui/multiband_gate.glade:465 msgid "Split 1/2" msgstr "Rozdeliť 1/2" #: data/ui/multiband_compressor.glade:454 data/ui/multiband_gate.glade:478 msgid "Split 2/3" msgstr "Rozdeliť 2/3" #: data/ui/multiband_compressor.glade:467 data/ui/multiband_gate.glade:491 msgid "Split 3/4" msgstr "Rozdeliť 3/4" #: data/ui/multiband_compressor.glade:854 #: data/ui/multiband_compressor.glade:1232 #: data/ui/multiband_compressor.glade:1611 #: data/ui/multiband_compressor.glade:1990 msgid "Compression" msgstr "Kompresia" #: data/ui/multiband_compressor.glade:937 data/ui/multiband_gate.glade:994 msgid "Sub Band" msgstr "Spodné Pásmo" #: data/ui/multiband_compressor.glade:1315 data/ui/multiband_gate.glade:1406 msgid "Low Band" msgstr "Nízke Pásmo" #: data/ui/multiband_compressor.glade:1694 data/ui/multiband_gate.glade:1819 msgid "Mid Band" msgstr "Stredné Pásmo" #: data/ui/multiband_compressor.glade:2073 data/ui/multiband_gate.glade:2232 msgid "High Band" msgstr "Vysoké Pásmo" #: data/ui/multiband_gate.glade:139 msgid "Multiband Gate" msgstr "Viacpásmová Brána" #: data/ui/pitch.glade:102 msgid "Pitch" msgstr "Výška tónu" #: data/ui/pitch.glade:270 msgid "Cents" msgstr "Centy" #: data/ui/pitch.glade:300 msgid "Semitones" msgstr "Poltóny" #: data/ui/pitch.glade:330 msgid "Octaves" msgstr "Okrávy" #: data/ui/pitch.glade:360 msgid "Crispness" msgstr "Krehkosť" #: data/ui/pitch.glade:402 msgid "Faster" msgstr "Rýchlo" #: data/ui/pitch.glade:414 msgid "Preserve Formant" msgstr "Zachovať žložku rozhodujúcu o farbe zvuku" #: data/ui/preset_row.glade:55 msgid "Load" msgstr "Načítať" #: data/ui/preset_row.glade:70 msgid "Save current settings to this preset file" msgstr "Uložiť súčastné nastavenia do tejto predvoľby" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "Odstrániť predvoľbu" #: data/ui/preset_row.glade:98 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" "Automaticky použiť toto nastavenie, keď je aktuálne používané zariadenie " "zapojené v systéme" #: data/ui/presets_menu.glade:81 data/ui/presets_menu.glade:182 #: src/presets_menu_ui.cpp:129 msgid "Import Presets" msgstr "Načítať predvoľbu" #: data/ui/pulse_info.glade:77 msgid "Version" msgstr "Verzia" #: data/ui/pulse_info.glade:104 #, fuzzy msgid "Default Sink" msgstr "Predvolené Zoslabnutie" #: data/ui/pulse_info.glade:116 msgid "Default Source" msgstr "Predvolený Zdroj" #: data/ui/pulse_info.glade:158 msgid "Protocol" msgstr "Protokol" #: data/ui/pulse_info.glade:185 msgid "Default Sample Format" msgstr "Predvolený Formát Vzorku" #: data/ui/pulse_info.glade:212 msgid "Default Sampling Rate" msgstr "Predvolená Rýchlosť Vzorkovania" #: data/ui/pulse_info.glade:266 msgid "Channel Mapping" msgstr "Priradenie Kanálu" #: data/ui/pulse_info.glade:291 msgid "Server" msgstr "Server" #: data/ui/pulse_info.glade:336 msgid "Modules" msgstr "Moduly" #: data/ui/pulse_info.glade:382 msgid "Clients" msgstr "Klienti" #: data/ui/pulse_info.glade:446 msgid "File" msgstr "Súbor" #: data/ui/pulse_info.glade:456 msgid "Configuration" msgstr "Konfigurácia" #: data/ui/pulse_info.glade:489 msgid "Resamplers" msgstr "Prevzorkovače" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:403 msgid "Use Default" msgstr "Použiť Predvolený" #: data/ui/pulse_settings.glade:147 data/ui/pulse_settings.glade:452 msgid "Pipeline Input" msgstr "Pipeline vstup" #: data/ui/pulse_settings.glade:247 data/ui/pulse_settings.glade:552 msgid "Pipeline Output" msgstr "Pipeline výstup" #: data/ui/pulse_settings.glade:347 data/ui/pulse_settings.glade:652 msgid "Block Size" msgstr "Veľkosť Bloku" #: data/ui/reverb.glade:130 msgid "Reverberation" msgstr "Ozvena" #: data/ui/reverb.glade:181 msgid "Ambience" msgstr "Okolie" #: data/ui/reverb.glade:194 msgid "Empty Walls" msgstr "Prázdne Steny" #: data/ui/reverb.glade:207 msgid "Room" msgstr "Miestnosť" #: data/ui/reverb.glade:220 msgid "Large Empty Hall" msgstr "Veľká Miestnosť (Prázdna)" #: data/ui/reverb.glade:246 msgid "Large Occupied Hall" msgstr "Veľká miestnosť (Plná)" #: data/ui/reverb.glade:453 msgid "Pre Delay" msgstr "Predspozdnenie" #: data/ui/reverb.glade:465 msgid "Decay Time" msgstr "Čas Dozvuku" #: data/ui/reverb.glade:531 msgid "Dry" msgstr "Zkúšobný" #: data/ui/reverb.glade:563 msgid "Bass Cut" msgstr "Odrezanie Bassov" #: data/ui/reverb.glade:615 msgid "Treble Cut" msgstr "Odrezanie Výšok" #: data/ui/reverb.glade:660 msgid "Diffusion" msgstr "Rozptylovanie" #: data/ui/reverb.glade:672 msgid "Room Size" msgstr "Veľkosť Miestnosti" #: data/ui/reverb.glade:684 msgid "Small" msgstr "Malá" #: data/ui/reverb.glade:685 msgid "Medium" msgstr "Stredná" #: data/ui/reverb.glade:686 msgid "Large" msgstr "Veľká" #: data/ui/reverb.glade:687 msgid "Tunnel" msgstr "Tunel" #: data/ui/reverb.glade:688 msgid "Large/smooth" msgstr "Veľký/plynulý" #: data/ui/reverb.glade:689 msgid "Experimental" msgstr "Pokusný" #: data/ui/reverb.glade:702 msgid "High Frequency Damping" msgstr "Vysokofrekvenčné tlmenie" #: data/ui/spectrum_settings.glade:77 msgid "Show Spectrum" msgstr "Zobraziť Spektrum" #: data/ui/spectrum_settings.glade:89 msgid "Fill" msgstr "Výplň" #: data/ui/spectrum_settings.glade:125 msgid "Border" msgstr "Okraj" #: data/ui/spectrum_settings.glade:149 msgid "Use Custom Color" msgstr "Použiť Vlastnú Farbu" #: data/ui/spectrum_settings.glade:173 msgid "Use Gradient" msgstr "Použiť Tieňovanie" #: data/ui/spectrum_settings.glade:315 msgid "Points" msgstr "Body" #: data/ui/spectrum_settings.glade:327 msgid "Height" msgstr "Výška" #: data/ui/spectrum_settings.glade:339 msgid "Line Width" msgstr "Šírka Čáry" #: data/ui/spectrum_settings.glade:351 msgid "Sampling" msgstr "Vzorkovanie" #: data/ui/spectrum_settings.glade:363 msgid "Minimum Frequency" msgstr "Minimálna Frekvencia" #: data/ui/spectrum_settings.glade:375 msgid "Maximum Frequency" msgstr "Maximálna Frekvencia" #: data/ui/spectrum_settings.glade:410 msgid "Spectrum Type" msgstr "Typ Spektra" #: data/ui/spectrum_settings.glade:423 msgid "Bars" msgstr "Pruhy" #: data/ui/spectrum_settings.glade:424 msgid "Lines" msgstr "Čiary" #: data/ui/spectrum_settings.glade:437 msgid "Spectrum Color" msgstr "Farba Spektra" #: data/ui/spectrum_settings.glade:449 msgid "Gradient Color" msgstr "Odtieň" #: data/ui/spectrum_settings.glade:461 msgid "Axis Color" msgstr "" #: data/ui/stereo_tools.glade:108 msgid "Stereo Tools" msgstr "Stereo Nástroje" #: data/ui/stereo_tools.glade:334 data/ui/stereo_tools.glade:775 msgid "Balance" msgstr "Vyváženie" #: data/ui/stereo_tools.glade:365 msgid "S/C Level" msgstr "S/C Úroveň" #: data/ui/stereo_tools.glade:406 msgid "Softclip" msgstr "Softclip" #: data/ui/stereo_tools.glade:452 #, fuzzy msgid "Side Level" msgstr "Postranná Úroveň" #: data/ui/stereo_tools.glade:503 msgid "Side Balance" msgstr "Vyváženie Strán" #: data/ui/stereo_tools.glade:535 msgid "Middle Level" msgstr "Stredová Úroveň" #: data/ui/stereo_tools.glade:547 msgid "Middle Panorama" msgstr "Stredná paronáma" #: data/ui/stereo_tools.glade:604 msgid "LR > LR (Stereo Default)" msgstr "ĽP > PĽ (Štandardné Stereo)" #: data/ui/stereo_tools.glade:605 msgid "LR > MS (Stereo to Mid-Side)" msgstr "ĽP > SS (Stereo ku strejnej strane)" #: data/ui/stereo_tools.glade:606 msgid "MS > LR (Mid-Side to Stereo)" msgstr "SS > ĽP (Stredná strana ku Stereu)" #: data/ui/stereo_tools.glade:607 msgid "LR > LL (Mono Left Channel)" msgstr "ĽP > ĽĽ (Mono Ľavý Kanál)" #: data/ui/stereo_tools.glade:608 msgid "LR > RR (Mono Right Channel)" msgstr "ĽP > PP (Mono Pravý Kanál)" #: data/ui/stereo_tools.glade:609 msgid "LR > L+R (Mono Sum L+R)" msgstr "ĽP > Ľ+P (Mono Sčítanie Ľ+P)" #: data/ui/stereo_tools.glade:610 msgid "LR > RL (Stereo Flip Channels)" msgstr "ĽP > PĽ (Stereo Preklopené Kanály)" #: data/ui/stereo_tools.glade:627 msgid "Stereo Matrix" msgstr "Matrice Sterea" #: data/ui/stereo_tools.glade:668 data/ui/stereo_tools.glade:709 msgid "Invert Phase" msgstr "Preklopiť fázu" #: data/ui/stereo_tools.glade:806 msgid "Delay L/R" msgstr "Opozdenie Ľ/P" #: data/ui/stereo_tools.glade:839 msgid "Stereo Base" msgstr "Základ Sterea" #: data/ui/stereo_tools.glade:871 msgid "Stereo Phase" msgstr "Fáza Sterea" #: data/ui/webrtc.glade:96 msgid "WebRTC" msgstr "WebRTC" #: data/ui/webrtc.glade:256 data/ui/webrtc.glade:389 data/ui/webrtc.glade:460 #: data/ui/webrtc.glade:648 msgid "Enable" msgstr "Povolené" #: data/ui/webrtc.glade:279 msgid "Extended Filter" msgstr "Rozšírený Filter" #: data/ui/webrtc.glade:292 msgid "High Pass Filter" msgstr "Horný prechod" #: data/ui/webrtc.glade:309 data/ui/webrtc.glade:425 data/ui/webrtc.glade:698 msgid "Low" msgstr "Nízky" #: data/ui/webrtc.glade:310 data/ui/webrtc.glade:426 data/ui/webrtc.glade:699 msgid "Moderate" msgstr "Stredný" #: data/ui/webrtc.glade:311 data/ui/webrtc.glade:427 data/ui/webrtc.glade:700 msgid "High" msgstr "Vysoký" #: data/ui/webrtc.glade:324 data/ui/webrtc.glade:412 #, fuzzy msgid "Suppression Level" msgstr "Redukcia zosilnenia" #: data/ui/webrtc.glade:361 msgid "Delay Agnostic" msgstr "Absolútne opozdenie" #: data/ui/webrtc.glade:375 msgid "Echo Canceller" msgstr "Zrušiť Ozvenu" #: data/ui/webrtc.glade:428 msgid "Very High" msgstr "Veľmi vysoká" #: data/ui/webrtc.glade:445 msgid "Noise Suppressor" msgstr "Potláčač Šumu" #: data/ui/webrtc.glade:496 msgid "Adaptive Digital" msgstr "Prispôsobivý Digitálny" #: data/ui/webrtc.glade:497 msgid "Fixed Digital" msgstr "Pevný Digitálny" #: data/ui/webrtc.glade:514 msgid "Gain Controller" msgstr "Ovládač Zosilnenia" #: data/ui/webrtc.glade:540 msgid "Target Level" msgstr "Cielová Úroveň" #: data/ui/webrtc.glade:572 msgid "Maximum Gain" msgstr "Maximálny Zisk" #: data/ui/webrtc.glade:672 msgid "Detection Likelihood" msgstr "Pravdepodobnosť Zistenia" #: data/ui/webrtc.glade:684 msgid "Frame Size" msgstr "Veľkosť Rámca" #: data/ui/webrtc.glade:697 msgid "Very Low" msgstr "Veľmi nízka" #: data/ui/webrtc.glade:737 msgid "Voice Detector" msgstr "Detekcia Reči" #: data/ui/rnnoise.glade:90 #, fuzzy msgid "Noise Reduction" msgstr "Redukcia zosilnenia" #: data/ui/rnnoise.glade:242 #, fuzzy msgid "Import Model" msgstr "Načítať Impulz" #: data/ui/rnnoise.glade:246 #, fuzzy msgid "Import Model File" msgstr "Načítať Impulz Súbor" #: data/ui/rnnoise.glade:311 #, fuzzy msgid "Active Model" msgstr "Agresívny Režim" #: data/ui/rnnoise.glade:324 msgid "Standard RNNoise Model" msgstr "" #: src/app_info_ui.cpp:120 msgid "paused" msgstr "pozastavené" #: src/app_info_ui.cpp:122 msgid "playing" msgstr "hrá" #: src/application.cpp:38 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "Ukončiť PulseEffect. Užitočné pre beh v režimu služby." #: src/application.cpp:40 msgid "Show available presets." msgstr "Zobraziť Dostupné Predvoľby" #: src/application.cpp:43 msgid "Load a preset. Example: pulseeffects -l music" msgstr "Načítať Predvoľby. Napr.: pulseeffects -l music" #: src/application.cpp:45 msgid "Reset PulseEffects." msgstr "Resetnúť PulseEffects" #: src/application.cpp:48 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "" "Globálne prepustenie. 1 pre zapnutie, 2 pre vypnutie, 3 pre získanie stavu" #: src/application.cpp:50 msgid "Hide the Window." msgstr "Skryť Okno" #: src/application.cpp:284 msgid "Output Presets: " msgstr "Výstupné Predvoľby: " #: src/application.cpp:292 msgid "Input Presets: " msgstr "Vstupné Predvoľby: " #: src/blocklist_settings_ui.cpp:191 msgid "Blocklist" msgstr "Čierny List" #: src/calibration_ui.cpp:198 msgid "Calibration Microphone" msgstr "Kalibrovať Mikrofón" #: src/convolver_ui.cpp:281 msgid "Import Impulse File" msgstr "Načítať Impulz Súbor" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Open" msgstr "Otvoriť" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Cancel" msgstr "Zrušiť" #: src/convolver_ui.cpp:318 src/convolver_ui.cpp:319 src/convolver_ui.cpp:321 msgid "Failed" msgstr "Zlyhanie" #: src/convolver_ui.cpp:323 msgid "Could Not Load The Impulse File" msgstr "Nie Je Možné Načítať Impulz súbor" #: src/equalizer_ui.cpp:380 msgid "infinity" msgstr "nekonečno" #: src/equalizer_ui.cpp:738 msgid "Import APO Preset File" msgstr "Načítať APO predvoľbu" #: src/equalizer_ui.cpp:743 msgid "APO Presets" msgstr "APO Predvoľby" #: src/general_settings_ui.cpp:149 msgid "General" msgstr "Všeobecné" #: src/pulse_settings_ui.cpp:168 msgid "Pulseaudio" msgstr "Pulseaudio" #~ msgid "Import APO Presets" #~ msgstr "Načítať APO predvoľbu" #~ msgid "Reference Signal" #~ msgstr "Referenčný Signál" #, fuzzy #~ msgid "Input Gain" #~ msgstr "Vstupné Zosilnenie" #~ msgid "Output Gain" #~ msgstr "Výstupný Zisk" #, fuzzy #~ msgid "Gain Detection" #~ msgstr "Redukcia zosilnenia" #~ msgid "Scale" #~ msgstr "Mierka" #~ msgid "Exponent" #~ msgstr "Exponent" easyeffects-4.8.7/po/sv.po000066400000000000000000001220441424023573300154470ustar00rootroot00000000000000# Swedish translation of PulseEffects application. # Copyright (C) 2017 # This file is distributed under the same license as the pulseeffects package. # Patrik Nilsson , 2017. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-14 23:58+0100\n" "PO-Revision-Date: 2017-10-14 10:20+0200\n" "Last-Translator: Patrik Nilsson \n" "Language-Team: \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.4\n" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 data/ui/application.glade:61 msgid "PulseEffects" msgstr "PulseEffects" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "Ljudeffekter för PulseAudio applikationer" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Wellington Wallace" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects är ett avancerat verktyg för manipulation av ljud. Det " "innehåller en ljudutjämnare (equalizer), ljudbegränsare (limiter), " "kompressor och ett efterklangsverktyg (eko), för att bara nämna några få. " "Där finns även en inbyggd frekvensanalysator som kompletterar dessa." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "Eftersom PulseEffects använder sig av standard PulseAudio som ljudserver " "stödjer den de flesta, om inte alla, program du använder. Alla applikationer " "som stöds presenteras i huvudfönstret, där var och en kan aktiveras " "individuellt." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Förutom att manipulera dina programs ljud kan PulseEffects tillämpa effekter " "på en ingångsenhet, såsom en mikrofon. Detta är exempelvis användbart vid " "ljudinspelning, men det fungerar även bra under röstsamtal." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "När PulseEffects startas kommer det ihåg konfigurationen som användes under " "den senaste sessionen. Det är också möjligt att spara alla aktuella " "inställningar som profiler." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Ingångs-begränsning" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:52 #: data/ui/compressor.glade:110 data/ui/compressor.glade:589 #: data/ui/webrtc.glade:633 msgid "Compressor" msgstr "Kompressor" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Kalibrering" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "" "limiter;begränsare;kompressor;eko;efterklang;equalizer;utjämnare;auto;volym;" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:44 #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:47 #, fuzzy msgid "\"Presets\"" msgstr "Profiler" #: data/ui/about.glade.in:11 #, fuzzy msgid "Audio effects for PulseAudio applications" msgstr "Ljudeffekter för PulseAudio applikationer" #: data/ui/app_button_row.glade:49 msgid "Applications" msgstr "Program" #: data/ui/app_info.glade:203 msgid "Add to Blocklist" msgstr "" #: data/ui/app_info.glade:239 msgid "Format" msgstr "Format" #: data/ui/app_info.glade:264 data/ui/convolver.glade:348 msgid "Rate" msgstr "Takt" #: data/ui/app_info.glade:289 data/ui/pulse_info.glade:239 #: data/ui/stereo_tools.glade:756 msgid "Channels" msgstr "Kanaler" #: data/ui/app_info.glade:314 msgid "Resampler" msgstr "Resampler" #: data/ui/app_info.glade:339 data/ui/pulse_settings.glade:159 #: data/ui/pulse_settings.glade:259 data/ui/pulse_settings.glade:464 #: data/ui/pulse_settings.glade:564 #, fuzzy msgid "Buffer" msgstr "Latens" #: data/ui/app_info.glade:364 data/ui/pulse_settings.glade:190 #: data/ui/pulse_settings.glade:290 data/ui/pulse_settings.glade:476 #: data/ui/pulse_settings.glade:576 msgid "Latency" msgstr "Latens" #: data/ui/app_info.glade:389 msgid "State" msgstr "" #: data/ui/application.glade:142 src/calibration_ui.cpp:64 #: src/calibration_ui.cpp:191 #, fuzzy msgid "Test Signals" msgstr "Testsignal" #: data/ui/application.glade:157 msgid "Global Bypass" msgstr "" #: data/ui/application.glade:172 data/ui/equalizer.glade:331 #: data/ui/general_settings.glade:289 msgid "Settings" msgstr "Inställningar" #: data/ui/application.glade:194 msgid "Help" msgstr "" #: data/ui/application.glade:217 data/ui/crossfeed.glade:240 #: data/ui/equalizer.glade:403 data/ui/filter.glade:344 #: data/ui/reverb.glade:401 src/presets_menu_ui.cpp:133 #: src/presets_menu_ui.cpp:285 src/presets_menu_ui.cpp:286 #: src/presets_menu_ui.cpp:303 src/presets_menu_ui.cpp:304 msgid "Presets" msgstr "Profiler" #: data/ui/autogain.glade:90 #, fuzzy msgid "Auto Gain" msgstr "Ingångsförstärkning (dB)" #: data/ui/autogain.glade:161 data/ui/bass_enhancer.glade:167 #: data/ui/compressor.glade:214 data/ui/convolver.glade:218 #: data/ui/crossfeed.glade:136 data/ui/crystalizer.glade:134 #: data/ui/deesser.glade:182 data/ui/delay.glade:144 #: data/ui/equalizer.glade:450 data/ui/equalizer_band.glade:187 #: data/ui/equalizer_band.glade:230 data/ui/exciter.glade:167 #: data/ui/filter.glade:243 data/ui/general_settings.glade:298 #: data/ui/gate.glade:172 data/ui/limiter.glade:166 data/ui/loudness.glade:174 #: data/ui/maximizer.glade:139 data/ui/multiband_compressor.glade:307 #: data/ui/multiband_gate.glade:331 data/ui/pitch.glade:158 #: data/ui/reverb.glade:299 data/ui/stereo_tools.glade:194 #: data/ui/webrtc.glade:141 data/ui/rnnoise.glade:139 msgid "Reset" msgstr "Återställ" #: data/ui/autogain.glade:185 data/ui/rnnoise.glade:163 msgid "Based on" msgstr "" #: data/ui/autogain.glade:262 #, fuzzy msgid "Reset History" msgstr "Återställ kvalitet" #: data/ui/autogain.glade:274 #, fuzzy msgid "Detect Silence" msgstr "Försvagning" #: data/ui/autogain.glade:286 msgid "Use Geometric Mean" msgstr "" #: data/ui/autogain.glade:325 #, fuzzy msgid "Target" msgstr "Målvärde (dB)" #: data/ui/autogain.glade:374 data/ui/autogain.glade:779 msgid "Momentary" msgstr "" #: data/ui/autogain.glade:434 msgid "Weights" msgstr "" #: data/ui/autogain.glade:448 data/ui/autogain.glade:792 msgid "Short Term" msgstr "" #: data/ui/autogain.glade:497 data/ui/autogain.glade:805 msgid "Integrated" msgstr "" #: data/ui/autogain.glade:564 data/ui/autogain.glade:1076 #: data/ui/bass_enhancer.glade:596 data/ui/compressor.glade:1086 #: data/ui/convolver.glade:575 data/ui/crossfeed.glade:391 #: data/ui/crystalizer.glade:250 data/ui/deesser.glade:783 #: data/ui/delay.glade:328 data/ui/equalizer.glade:682 #: data/ui/exciter.glade:596 data/ui/filter.glade:508 data/ui/gate.glade:689 #: data/ui/limiter.glade:501 data/ui/loudness.glade:238 #: data/ui/loudness.glade:431 data/ui/maximizer.glade:358 #: data/ui/multiband_compressor.glade:2103 data/ui/multiband_gate.glade:2262 #: data/ui/pitch.glade:450 data/ui/presets_menu.glade:238 #: data/ui/reverb.glade:753 data/ui/stereo_tools.glade:427 #: data/ui/stereo_tools.glade:931 data/ui/webrtc.glade:780 #: data/ui/rnnoise.glade:362 msgid "Input" msgstr "Ingång" #: data/ui/autogain.glade:577 data/ui/autogain.glade:1020 #: data/ui/bass_enhancer.glade:625 data/ui/compressor.glade:1099 #: data/ui/convolver.glade:588 data/ui/crossfeed.glade:405 #: data/ui/crystalizer.glade:263 data/ui/deesser.glade:797 #: data/ui/delay.glade:341 data/ui/equalizer.glade:695 #: data/ui/exciter.glade:625 data/ui/filter.glade:521 data/ui/gate.glade:703 #: data/ui/limiter.glade:636 data/ui/loudness.glade:271 #: data/ui/loudness.glade:445 data/ui/maximizer.glade:372 #: data/ui/multiband_compressor.glade:894 #: data/ui/multiband_compressor.glade:1272 #: data/ui/multiband_compressor.glade:1651 #: data/ui/multiband_compressor.glade:2030 #: data/ui/multiband_compressor.glade:2116 data/ui/multiband_gate.glade:951 #: data/ui/multiband_gate.glade:1363 data/ui/multiband_gate.glade:1776 #: data/ui/multiband_gate.glade:2189 data/ui/multiband_gate.glade:2275 #: data/ui/pitch.glade:463 data/ui/presets_menu.glade:137 #: data/ui/reverb.glade:766 data/ui/stereo_tools.glade:901 #: data/ui/stereo_tools.glade:944 data/ui/webrtc.glade:794 #: data/ui/rnnoise.glade:375 msgid "Output" msgstr "Utgång" #: data/ui/autogain.glade:899 msgid "Relative" msgstr "" #: data/ui/autogain.glade:912 data/ui/compressor.glade:1262 #, fuzzy msgid "Gain" msgstr "Ingångsförstärkning (dB)" #: data/ui/autogain.glade:980 msgid "Loudness" msgstr "" #: data/ui/autogain.glade:1034 msgid "Range" msgstr "" #: data/ui/bass_enhancer.glade:116 #, fuzzy msgid "Bass Enhancer" msgstr "Ljudförstärkare" #: data/ui/bass_enhancer.glade:191 data/ui/compressor.glade:238 #: data/ui/crossfeed.glade:160 data/ui/deesser.glade:206 #: data/ui/delay.glade:168 data/ui/equalizer.glade:474 #: data/ui/exciter.glade:191 data/ui/filter.glade:267 data/ui/gate.glade:196 #: data/ui/limiter.glade:190 data/ui/loudness.glade:143 #: data/ui/maximizer.glade:163 data/ui/multiband_compressor.glade:331 #: data/ui/multiband_gate.glade:355 data/ui/pitch.glade:182 #: data/ui/reverb.glade:323 data/ui/stereo_tools.glade:218 #: data/ui/webrtc.glade:165 msgid "Provided by" msgstr "" #: data/ui/bass_enhancer.glade:259 data/ui/compressor.glade:602 #: data/ui/deesser.glade:274 data/ui/exciter.glade:259 msgid "Listen" msgstr "" #: data/ui/bass_enhancer.glade:302 data/ui/exciter.glade:303 msgid "3rd" msgstr "" #: data/ui/bass_enhancer.glade:315 data/ui/exciter.glade:316 msgid "2nd" msgstr "" #: data/ui/bass_enhancer.glade:327 data/ui/exciter.glade:328 msgid "Blend Harmonics" msgstr "" #: data/ui/bass_enhancer.glade:355 data/ui/exciter.glade:357 #: data/ui/reverb.glade:498 msgid "Amount" msgstr "" #: data/ui/bass_enhancer.glade:367 data/ui/bass_enhancer.glade:504 #: data/ui/exciter.glade:369 data/ui/exciter.glade:504 msgid "Harmonics" msgstr "" #: data/ui/bass_enhancer.glade:379 data/ui/exciter.glade:381 msgid "Scope" msgstr "" #: data/ui/bass_enhancer.glade:472 msgid "Floor" msgstr "" #: data/ui/blocklist_settings.glade:52 data/ui/blocklist_settings.glade:155 #: data/ui/presets_menu.glade:65 data/ui/presets_menu.glade:166 #, fuzzy msgid "Create Preset" msgstr "Ta bort profil" #: data/ui/blocklist_settings.glade:68 data/ui/blocklist_settings.glade:171 #: data/ui/presets_menu.glade:52 data/ui/presets_menu.glade:153 #: data/ui/pulse_info.glade:50 msgid "Name" msgstr "Namn" #: data/ui/blocklist_settings.glade:81 msgid "Reconnect the microphone to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:139 data/ui/pulse_settings.glade:383 #, fuzzy msgid "Input Effects" msgstr "PulseEffects" #: data/ui/blocklist_settings.glade:230 msgid "Restart the player to apply new changes made to the Blocklist" msgstr "" #: data/ui/blocklist_settings.glade:242 data/ui/pulse_settings.glade:688 #, fuzzy msgid "Output Effects" msgstr "Ingångs-begränsning" #: data/ui/blocklist_settings.glade:265 msgid "Show Blocklisted Apps in Main Tab" msgstr "" #: data/ui/calibration_signals.glade:32 msgid "Sine" msgstr "Sinus" #: data/ui/calibration_signals.glade:33 msgid "Square" msgstr "Fyrkant" #: data/ui/calibration_signals.glade:34 msgid "Saw" msgstr "Sågtand" #: data/ui/calibration_signals.glade:35 msgid "Triangle" msgstr "Triangel" #: data/ui/calibration_signals.glade:36 #, fuzzy msgid "Silence" msgstr "Tystnad" #: data/ui/calibration_signals.glade:37 msgid "White Noise" msgstr "Vitt brus" #: data/ui/calibration_signals.glade:38 msgid "Pink Noise" msgstr "Skärt brus" #: data/ui/calibration_signals.glade:39 msgid "Sine Table" msgstr "Sinustabell" #: data/ui/calibration_signals.glade:40 msgid "Ticks" msgstr "Tickande" #: data/ui/calibration_signals.glade:41 msgid "Gaussian Noise" msgstr "Gaussiskt brus" #: data/ui/calibration_signals.glade:42 msgid "Red Noise" msgstr "Rött brus" #: data/ui/calibration_signals.glade:43 msgid "Blue Noise" msgstr "Blått brus" #: data/ui/calibration_signals.glade:44 msgid "Violet Noise" msgstr "Violett brus" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Volym" #: data/ui/calibration_signals.glade:135 data/ui/equalizer_band.glade:158 #: data/ui/filter.glade:394 #, fuzzy msgid "Frequency" msgstr "Frekvens (Hz)" #: data/ui/calibration_mic.glade:33 #, fuzzy msgid "Window" msgstr "Mellanrum (s)" #: data/ui/calibration_mic.glade:90 msgid "Measure Noise" msgstr "Mät brus" #: data/ui/calibration_mic.glade:119 msgid "Subtract Noise" msgstr "Ta bort brus" #: data/ui/compressor.glade:386 data/ui/deesser.glade:436 #: data/ui/gate.glade:498 data/ui/maximizer.glade:242 #: data/ui/multiband_compressor.glade:707 #: data/ui/multiband_compressor.glade:1085 #: data/ui/multiband_compressor.glade:1464 #: data/ui/multiband_compressor.glade:1843 data/ui/multiband_gate.glade:731 #: data/ui/multiband_gate.glade:1142 data/ui/multiband_gate.glade:1555 #: data/ui/multiband_gate.glade:1968 #, fuzzy msgid "Threshold" msgstr "Tröskelvärde (dB)" #: data/ui/compressor.glade:420 data/ui/deesser.glade:448 #: data/ui/gate.glade:532 data/ui/multiband_compressor.glade:741 #: data/ui/multiband_compressor.glade:1119 #: data/ui/multiband_compressor.glade:1498 #: data/ui/multiband_compressor.glade:1877 data/ui/multiband_gate.glade:765 #: data/ui/multiband_gate.glade:1176 data/ui/multiband_gate.glade:1589 #: data/ui/multiband_gate.glade:2002 #, fuzzy msgid "Ratio" msgstr "Förhållande (n:1)" #: data/ui/compressor.glade:452 data/ui/gate.glade:564 #: data/ui/multiband_compressor.glade:773 #: data/ui/multiband_compressor.glade:1151 #: data/ui/multiband_compressor.glade:1530 #: data/ui/multiband_compressor.glade:1909 data/ui/multiband_gate.glade:797 #: data/ui/multiband_gate.glade:1208 data/ui/multiband_gate.glade:1621 #: data/ui/multiband_gate.glade:2034 #, fuzzy msgid "Knee" msgstr "Knee-värde (dB)" #: data/ui/compressor.glade:486 data/ui/deesser.glade:532 #: data/ui/gate.glade:598 data/ui/multiband_compressor.glade:807 #: data/ui/multiband_compressor.glade:1185 #: data/ui/multiband_compressor.glade:1564 #: data/ui/multiband_compressor.glade:1943 data/ui/multiband_gate.glade:831 #: data/ui/multiband_gate.glade:1242 data/ui/multiband_gate.glade:1655 #: data/ui/multiband_gate.glade:2068 #, fuzzy msgid "Makeup" msgstr "Makeup (dB)" #: data/ui/compressor.glade:520 data/ui/gate.glade:464 #: data/ui/limiter.glade:363 data/ui/maximizer.glade:266 #: data/ui/multiband_compressor.glade:673 #: data/ui/multiband_compressor.glade:1051 #: data/ui/multiband_compressor.glade:1430 #: data/ui/multiband_compressor.glade:1809 data/ui/multiband_gate.glade:697 #: data/ui/multiband_gate.glade:1108 data/ui/multiband_gate.glade:1521 #: data/ui/multiband_gate.glade:1934 #, fuzzy msgid "Release" msgstr "Release (s)" #: data/ui/compressor.glade:532 data/ui/gate.glade:430 #: data/ui/multiband_compressor.glade:639 #: data/ui/multiband_compressor.glade:1017 #: data/ui/multiband_compressor.glade:1396 #: data/ui/multiband_compressor.glade:1775 data/ui/multiband_gate.glade:663 #: data/ui/multiband_gate.glade:1074 data/ui/multiband_gate.glade:1487 #: data/ui/multiband_gate.glade:1900 #, fuzzy msgid "Attack" msgstr "Attack (ms)" #: data/ui/compressor.glade:559 msgid "Downward" msgstr "" #: data/ui/compressor.glade:560 msgid "Upward" msgstr "" #: data/ui/compressor.glade:573 #, fuzzy msgid "Compression Mode" msgstr "Ingen komprimering" #: data/ui/compressor.glade:649 #, fuzzy msgid "Pre-amplification" msgstr "Program" #: data/ui/compressor.glade:683 msgid "Reactivity" msgstr "" #: data/ui/compressor.glade:716 data/ui/limiter.glade:375 msgid "Lookahead" msgstr "" #: data/ui/compressor.glade:730 msgid "Feed-forward" msgstr "" #: data/ui/compressor.glade:731 #, fuzzy msgid "Feed-back" msgstr "Knee-värde (dB)" #: data/ui/compressor.glade:744 data/ui/equalizer_band.glade:51 msgid "Type" msgstr "" #: data/ui/compressor.glade:758 data/ui/deesser.glade:731 #: data/ui/gate.glade:303 data/ui/multiband_compressor.glade:611 #: data/ui/multiband_compressor.glade:989 #: data/ui/multiband_compressor.glade:1368 #: data/ui/multiband_compressor.glade:1747 data/ui/multiband_gate.glade:635 #: data/ui/multiband_gate.glade:1046 data/ui/multiband_gate.glade:1459 #: data/ui/multiband_gate.glade:1872 msgid "Peak" msgstr "Peak" #: data/ui/compressor.glade:759 data/ui/deesser.glade:730 #: data/ui/gate.glade:302 data/ui/multiband_compressor.glade:610 #: data/ui/multiband_compressor.glade:988 #: data/ui/multiband_compressor.glade:1367 #: data/ui/multiband_compressor.glade:1746 data/ui/multiband_gate.glade:634 #: data/ui/multiband_gate.glade:1045 data/ui/multiband_gate.glade:1458 #: data/ui/multiband_gate.glade:1871 msgid "RMS" msgstr "" #: data/ui/compressor.glade:760 #, fuzzy msgid "Low-Pass" msgstr "Lågpass" #: data/ui/compressor.glade:761 msgid "Uniform" msgstr "" #: data/ui/compressor.glade:774 data/ui/deesser.glade:702 #: data/ui/equalizer.glade:257 data/ui/equalizer_band.glade:84 #: data/ui/multiband_compressor.glade:412 data/ui/multiband_gate.glade:436 #: data/ui/stereo_tools.glade:591 data/ui/webrtc.glade:483 msgid "Mode" msgstr "" #: data/ui/compressor.glade:788 #, fuzzy msgid "Middle" msgstr "Nivå" #: data/ui/compressor.glade:789 #, fuzzy msgid "Side" msgstr "Ingångsförstärkning (dB)" #: data/ui/compressor.glade:790 data/ui/delay.glade:247 #: data/ui/equalizer.glade:612 data/ui/stereo_tools.glade:655 msgid "Left" msgstr "" #: data/ui/compressor.glade:791 data/ui/delay.glade:280 #: data/ui/equalizer.glade:654 data/ui/stereo_tools.glade:724 msgid "Right" msgstr "" #: data/ui/compressor.glade:804 msgid "Source" msgstr "" #: data/ui/compressor.glade:820 data/ui/compressor.glade:1274 #, fuzzy msgid "Sidechain" msgstr "Ingångsförstärkning (dB)" #: data/ui/compressor.glade:925 msgid "Relative Release Threshold" msgstr "" #: data/ui/compressor.glade:937 #, fuzzy msgid "Boost Threshold" msgstr "Tröskelvärde (dB)" #: data/ui/compressor.glade:949 #, fuzzy msgid "High-pass Frequency" msgstr "Återställ frekvens" #: data/ui/compressor.glade:961 #, fuzzy msgid "Low-pass Frequency" msgstr "Återställ frekvens" #: data/ui/compressor.glade:973 #, fuzzy msgid "High-pass Filter Mode" msgstr "Högpass" #: data/ui/compressor.glade:985 msgid "Low-pass Filter Mode" msgstr "" #: data/ui/compressor.glade:999 data/ui/compressor.glade:1017 #: data/ui/equalizer_band.glade:63 msgid "Off" msgstr "" #: data/ui/compressor.glade:1000 data/ui/compressor.glade:1018 msgid "12 dB/oct" msgstr "" #: data/ui/compressor.glade:1001 data/ui/compressor.glade:1019 msgid "24 dB/oct" msgstr "" #: data/ui/compressor.glade:1002 data/ui/compressor.glade:1020 msgid "36 dB/oct" msgstr "" #: data/ui/compressor.glade:1043 #, fuzzy msgid "Advanced" msgstr "Inställningar" #: data/ui/compressor.glade:1347 msgid "Curve" msgstr "" #: data/ui/convolver.glade:90 msgid "Convolver" msgstr "" #: data/ui/convolver.glade:125 #, fuzzy msgid "Import Impulse" msgstr "Platt respons" #: data/ui/convolver.glade:129 msgid "Import Impulse Response File" msgstr "" #: data/ui/convolver.glade:309 msgid "L" msgstr "V" #: data/ui/convolver.glade:323 msgid "R" msgstr "H" #: data/ui/convolver.glade:390 #, fuzzy msgid "Duration" msgstr "Kalibrering" #: data/ui/convolver.glade:402 #, fuzzy msgid "Samples" msgstr "Resampler" #: data/ui/convolver.glade:435 src/convolver_ui.cpp:285 #, fuzzy msgid "Impulse Response" msgstr "Platt respons" #: data/ui/convolver.glade:458 #, fuzzy msgid "Select the impulse Response File" msgstr "Platt respons" #: data/ui/convolver.glade:477 src/spectrum_settings_ui.cpp:195 msgid "Spectrum" msgstr "Spektrum" #: data/ui/convolver.glade:520 #, fuzzy msgid "Stereo Width" msgstr "Ljudförstärkare" #: data/ui/crossfeed.glade:104 msgid "Crossfeed" msgstr "" #: data/ui/crossfeed.glade:254 msgid "Jmeier" msgstr "" #: data/ui/crossfeed.glade:266 data/ui/filter.glade:183 #: data/ui/reverb.glade:259 msgid "Default" msgstr "" #: data/ui/crossfeed.glade:278 msgid "Cmoy" msgstr "" #: data/ui/crossfeed.glade:308 #, fuzzy msgid "Cutoff" msgstr "Cut-off (Hz)" #: data/ui/crossfeed.glade:341 #, fuzzy msgid "Feed" msgstr "Knee-värde (dB)" #: data/ui/crystalizer.glade:90 #, fuzzy msgid "Crystalizer" msgstr "Utjämnare" #: data/ui/crystalizer.glade:200 #, fuzzy msgid "Aggressive Mode" msgstr "Ingen komprimering" #: data/ui/crystalizer.glade:464 msgid "Before" msgstr "" #: data/ui/crystalizer.glade:477 msgid "After" msgstr "" #: data/ui/crystalizer.glade:550 msgid "Loudness Range" msgstr "" #: data/ui/crystalizer_band.glade:28 data/ui/equalizer_band.glade:316 #: data/ui/stereo_tools.glade:680 data/ui/stereo_tools.glade:737 msgid "Mute" msgstr "" #: data/ui/crystalizer_band.glade:40 data/ui/multiband_compressor.glade:580 #: data/ui/multiband_compressor.glade:958 #: data/ui/multiband_compressor.glade:1337 #: data/ui/multiband_compressor.glade:1716 data/ui/multiband_gate.glade:604 #: data/ui/multiband_gate.glade:1015 data/ui/multiband_gate.glade:1428 #: data/ui/multiband_gate.glade:1841 msgid "Bypass" msgstr "" #: data/ui/deesser.glade:125 msgid "Deesser" msgstr "" #: data/ui/deesser.glade:309 #, fuzzy msgid "F1 Gain" msgstr "Ingångsförstärkning (dB)" #: data/ui/deesser.glade:321 #, fuzzy msgid "F2 Level" msgstr "Nivå" #: data/ui/deesser.glade:333 #, fuzzy msgid "F2 Peak Q" msgstr "Peak" #: data/ui/deesser.glade:424 msgid "Laxity" msgstr "" #: data/ui/deesser.glade:585 msgid "F1 Split" msgstr "" #: data/ui/deesser.glade:597 #, fuzzy msgid "F2 Peak" msgstr "Peak" #: data/ui/deesser.glade:690 data/ui/gate.glade:288 #, fuzzy msgid "Detection" msgstr "Försvagning" #: data/ui/deesser.glade:715 msgid "Wide" msgstr "" #: data/ui/deesser.glade:716 msgid "Split" msgstr "" #: data/ui/deesser.glade:959 data/ui/multiband_gate.glade:865 #: data/ui/multiband_gate.glade:1298 data/ui/multiband_gate.glade:1711 #: data/ui/multiband_gate.glade:2124 #, fuzzy msgid "Reduction" msgstr "Förstärkningsreducering" #: data/ui/deesser.glade:972 #, fuzzy msgid "Detected" msgstr "Försvagning" #: data/ui/delay.glade:90 #, fuzzy msgid "Delay" msgstr "Release (ms)" #: data/ui/equalizer.glade:44 msgid "Equalizer" msgstr "Utjämnare" #: data/ui/equalizer.glade:160 msgid "Flat Response" msgstr "Platt respons" #: data/ui/equalizer.glade:175 msgid "Calculate Frequencies" msgstr "" #: data/ui/equalizer.glade:213 msgid "Bands" msgstr "" #: data/ui/equalizer.glade:269 msgid "IIR" msgstr "" #: data/ui/equalizer.glade:270 msgid "FIR" msgstr "" #: data/ui/equalizer.glade:271 msgid "FFT" msgstr "" #: data/ui/equalizer.glade:304 #, fuzzy msgid "Split Channels" msgstr "Kanaler" #: data/ui/equalizer.glade:389 #, fuzzy msgid "Apply APO Preset" msgstr "Profiler" #: data/ui/equalizer_band.glade:64 msgid "Bell" msgstr "" #: data/ui/equalizer_band.glade:65 #, fuzzy msgid "High Pass" msgstr "Högpass" #: data/ui/equalizer_band.glade:66 msgid "High Shelf" msgstr "High Shelf" #: data/ui/equalizer_band.glade:67 msgid "Low Pass" msgstr "Lågpass" #: data/ui/equalizer_band.glade:68 msgid "Low Shelf" msgstr "Low Shelf" #: data/ui/equalizer_band.glade:69 msgid "Notch" msgstr "" #: data/ui/equalizer_band.glade:70 data/ui/filter.glade:427 msgid "Resonance" msgstr "" #: data/ui/equalizer_band.glade:71 #, fuzzy msgid "All Pass" msgstr "Lågpass" #: data/ui/equalizer_band.glade:96 msgid "RLC (BT)" msgstr "" #: data/ui/equalizer_band.glade:97 msgid "RLC (MT)" msgstr "" #: data/ui/equalizer_band.glade:98 msgid "BWC (BT)" msgstr "" #: data/ui/equalizer_band.glade:99 msgid "BWC (MT)" msgstr "" #: data/ui/equalizer_band.glade:100 msgid "LRX (BT)" msgstr "" #: data/ui/equalizer_band.glade:101 msgid "LRX (MT)" msgstr "" #: data/ui/equalizer_band.glade:102 msgid "APO (DR)" msgstr "" #: data/ui/equalizer_band.glade:115 msgid "Slope" msgstr "" #: data/ui/equalizer_band.glade:203 msgid "Quality" msgstr "Kvalitet" #: data/ui/equalizer_band.glade:253 msgid "Width" msgstr "Bredd" #: data/ui/equalizer_band.glade:304 data/ui/multiband_compressor.glade:593 #: data/ui/multiband_compressor.glade:971 #: data/ui/multiband_compressor.glade:1350 #: data/ui/multiband_compressor.glade:1729 data/ui/multiband_gate.glade:617 #: data/ui/multiband_gate.glade:1028 data/ui/multiband_gate.glade:1441 #: data/ui/multiband_gate.glade:1854 msgid "Solo" msgstr "" #: data/ui/equalizer_preset_row.glade:39 data/ui/irs_row.glade:44 msgid "Apply" msgstr "" #: data/ui/exciter.glade:116 msgid "Exciter" msgstr "" #: data/ui/exciter.glade:472 data/ui/maximizer.glade:254 #, fuzzy msgid "Ceiling" msgstr "Gränsvärde (dB)" #: data/ui/filter.glade:97 #, fuzzy msgid "Filter" msgstr "Filter typ" #: data/ui/filter.glade:147 msgid "Muted" msgstr "" #: data/ui/filter.glade:159 data/ui/reverb.glade:233 msgid "Disco" msgstr "" #: data/ui/filter.glade:171 msgid "Distant Headphones" msgstr "" #: data/ui/filter.glade:360 msgid "12dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:361 msgid "24dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:362 msgid "36dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:363 msgid "12dB/oct Highpass" msgstr "" #: data/ui/filter.glade:364 msgid "24dB/oct Highpass" msgstr "" #: data/ui/filter.glade:365 msgid "36dB/oct Highpass" msgstr "" #: data/ui/filter.glade:366 msgid "6dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:367 msgid "12dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:368 msgid "18dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:369 msgid "6dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:370 msgid "12dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:371 msgid "18dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:460 msgid "Inertia" msgstr "" #: data/ui/general_settings.glade:58 msgid "Start Service at Login" msgstr "" #: data/ui/general_settings.glade:82 msgid "Process All Outputs" msgstr "" #: data/ui/general_settings.glade:94 msgid "Process All Inputs" msgstr "" #: data/ui/general_settings.glade:130 msgid "Use Dark Theme" msgstr "Använd mörkt tema" #: data/ui/general_settings.glade:158 data/ui/general_settings.glade:220 msgid "Niceness" msgstr "" #: data/ui/general_settings.glade:159 msgid "Real Time" msgstr "" #: data/ui/general_settings.glade:160 msgid "None" msgstr "" #: data/ui/general_settings.glade:208 msgid "Priority Type" msgstr "" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "" #: data/ui/general_settings.glade:244 msgid "Activity Timeout" msgstr "" #: data/ui/general_settings.glade:325 msgid "About" msgstr "" #: data/ui/gate.glade:97 msgid "Gate" msgstr "" #: data/ui/gate.glade:330 #, fuzzy msgid "Maximum Gain Reduction" msgstr "Förstärkningsreducering" #: data/ui/gate.glade:379 #, fuzzy msgid "Stereo Link" msgstr "Ljudförstärkare" #: data/ui/gate.glade:393 msgid "Average" msgstr "" #: data/ui/gate.glade:394 msgid "Maximum" msgstr "" #: data/ui/gate.glade:632 #, fuzzy msgid "Input Level" msgstr "Ingångs-begränsning" #: data/ui/gate.glade:864 data/ui/multiband_gate.glade:911 #: data/ui/multiband_gate.glade:1323 data/ui/multiband_gate.glade:1736 #: data/ui/multiband_gate.glade:2149 msgid "Gating" msgstr "" #: data/ui/limiter.glade:96 data/ui/webrtc.glade:612 #, fuzzy msgid "Limiter" msgstr "Gränsvärde (dB)" #: data/ui/limiter.glade:266 msgid "Automatic Smoothing Control" msgstr "" #: data/ui/limiter.glade:278 msgid "Automatic Leveling" msgstr "" #: data/ui/limiter.glade:308 #, fuzzy msgid "Limit" msgstr "Gränsvärde (dB)" #: data/ui/limiter.glade:409 msgid "Oversampling" msgstr "" #: data/ui/limiter.glade:447 msgid "ASC" msgstr "" #: data/ui/limiter.glade:595 msgid "Attenuation" msgstr "Försvagning" #: data/ui/loudness.glade:90 msgid "Loudness Compensator" msgstr "" #: data/ui/loudness.glade:328 msgid "Standard" msgstr "" #: data/ui/loudness.glade:341 msgid "Flat" msgstr "" #: data/ui/loudness.glade:342 msgid "ISO226-2003" msgstr "" #: data/ui/loudness.glade:343 msgid "Fletcher-Munson" msgstr "" #: data/ui/loudness.glade:344 msgid "Robinson-Dadson" msgstr "" #: data/ui/loudness.glade:370 #, fuzzy msgid "FFT Size" msgstr "Rumsstorlek" #: data/ui/maximizer.glade:95 msgid "Maximizer" msgstr "" #: data/ui/maximizer.glade:386 msgid "Gain Reduction" msgstr "Förstärkningsreducering" #: data/ui/multiband_compressor.glade:139 #, fuzzy msgid "Multiband Compressor" msgstr "Kompressor" #: data/ui/multiband_compressor.glade:426 data/ui/multiband_gate.glade:450 msgid "LR4" msgstr "" #: data/ui/multiband_compressor.glade:427 data/ui/multiband_gate.glade:451 msgid "LR8" msgstr "" #: data/ui/multiband_compressor.glade:441 data/ui/multiband_gate.glade:465 msgid "Split 1/2" msgstr "" #: data/ui/multiband_compressor.glade:454 data/ui/multiband_gate.glade:478 msgid "Split 2/3" msgstr "" #: data/ui/multiband_compressor.glade:467 data/ui/multiband_gate.glade:491 msgid "Split 3/4" msgstr "" #: data/ui/multiband_compressor.glade:854 #: data/ui/multiband_compressor.glade:1232 #: data/ui/multiband_compressor.glade:1611 #: data/ui/multiband_compressor.glade:1990 #, fuzzy msgid "Compression" msgstr "Ingen komprimering" #: data/ui/multiband_compressor.glade:937 data/ui/multiband_gate.glade:994 #, fuzzy msgid "Sub Band" msgstr "Ljudstyrka (dB) (in)" #: data/ui/multiband_compressor.glade:1315 data/ui/multiband_gate.glade:1406 #, fuzzy msgid "Low Band" msgstr "Lågpass" #: data/ui/multiband_compressor.glade:1694 data/ui/multiband_gate.glade:1819 #, fuzzy msgid "Mid Band" msgstr "Ingångsförstärkning (dB)" #: data/ui/multiband_compressor.glade:2073 data/ui/multiband_gate.glade:2232 #, fuzzy msgid "High Band" msgstr "Högpass" #: data/ui/multiband_gate.glade:139 #, fuzzy msgid "Multiband Gate" msgstr "Kompressor" #: data/ui/pitch.glade:102 msgid "Pitch" msgstr "" #: data/ui/pitch.glade:270 msgid "Cents" msgstr "" #: data/ui/pitch.glade:300 msgid "Semitones" msgstr "" #: data/ui/pitch.glade:330 msgid "Octaves" msgstr "" #: data/ui/pitch.glade:360 msgid "Crispness" msgstr "" #: data/ui/pitch.glade:402 msgid "Faster" msgstr "" #: data/ui/pitch.glade:414 msgid "Preserve Formant" msgstr "" #: data/ui/preset_row.glade:55 msgid "Load" msgstr "" #: data/ui/preset_row.glade:70 #, fuzzy msgid "Save current settings to this preset file" msgstr "Spara nuvarande inställningar som profil" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "" #: data/ui/preset_row.glade:98 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" #: data/ui/presets_menu.glade:81 data/ui/presets_menu.glade:182 #: src/presets_menu_ui.cpp:129 #, fuzzy msgid "Import Presets" msgstr "Öppna förinställning" #: data/ui/pulse_info.glade:77 msgid "Version" msgstr "" #: data/ui/pulse_info.glade:104 msgid "Default Sink" msgstr "" #: data/ui/pulse_info.glade:116 msgid "Default Source" msgstr "" #: data/ui/pulse_info.glade:158 msgid "Protocol" msgstr "" #: data/ui/pulse_info.glade:185 msgid "Default Sample Format" msgstr "" #: data/ui/pulse_info.glade:212 msgid "Default Sampling Rate" msgstr "" #: data/ui/pulse_info.glade:266 #, fuzzy msgid "Channel Mapping" msgstr "Kanaler" #: data/ui/pulse_info.glade:291 msgid "Server" msgstr "" #: data/ui/pulse_info.glade:336 msgid "Modules" msgstr "" #: data/ui/pulse_info.glade:382 msgid "Clients" msgstr "" #: data/ui/pulse_info.glade:446 msgid "File" msgstr "" #: data/ui/pulse_info.glade:456 #, fuzzy msgid "Configuration" msgstr "Kalibrering" #: data/ui/pulse_info.glade:489 #, fuzzy msgid "Resamplers" msgstr "Resampler" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:403 msgid "Use Default" msgstr "" #: data/ui/pulse_settings.glade:147 data/ui/pulse_settings.glade:452 msgid "Pipeline Input" msgstr "" #: data/ui/pulse_settings.glade:247 data/ui/pulse_settings.glade:552 #, fuzzy msgid "Pipeline Output" msgstr "Ljudutjämnare - Utgång" #: data/ui/pulse_settings.glade:347 data/ui/pulse_settings.glade:652 #, fuzzy msgid "Block Size" msgstr "Rumsstorlek" #: data/ui/reverb.glade:130 msgid "Reverberation" msgstr "Efterljud (eko)" #: data/ui/reverb.glade:181 #, fuzzy msgid "Ambience" msgstr "Tystnad" #: data/ui/reverb.glade:194 msgid "Empty Walls" msgstr "" #: data/ui/reverb.glade:207 #, fuzzy msgid "Room" msgstr "Rumsstorlek" #: data/ui/reverb.glade:220 msgid "Large Empty Hall" msgstr "" #: data/ui/reverb.glade:246 msgid "Large Occupied Hall" msgstr "" #: data/ui/reverb.glade:453 #, fuzzy msgid "Pre Delay" msgstr "Release (ms)" #: data/ui/reverb.glade:465 msgid "Decay Time" msgstr "" #: data/ui/reverb.glade:531 msgid "Dry" msgstr "" #: data/ui/reverb.glade:563 msgid "Bass Cut" msgstr "" #: data/ui/reverb.glade:615 msgid "Treble Cut" msgstr "" #: data/ui/reverb.glade:660 msgid "Diffusion" msgstr "" #: data/ui/reverb.glade:672 msgid "Room Size" msgstr "Rumsstorlek" #: data/ui/reverb.glade:684 #, fuzzy msgid "Small" msgstr "Litet rum" #: data/ui/reverb.glade:685 msgid "Medium" msgstr "" #: data/ui/reverb.glade:686 #, fuzzy msgid "Large" msgstr "Målvärde (dB)" #: data/ui/reverb.glade:687 msgid "Tunnel" msgstr "" #: data/ui/reverb.glade:688 msgid "Large/smooth" msgstr "" #: data/ui/reverb.glade:689 msgid "Experimental" msgstr "" #: data/ui/reverb.glade:702 msgid "High Frequency Damping" msgstr "" #: data/ui/spectrum_settings.glade:77 #, fuzzy msgid "Show Spectrum" msgstr "Spektrum" #: data/ui/spectrum_settings.glade:89 msgid "Fill" msgstr "" #: data/ui/spectrum_settings.glade:125 msgid "Border" msgstr "" #: data/ui/spectrum_settings.glade:149 msgid "Use Custom Color" msgstr "" #: data/ui/spectrum_settings.glade:173 msgid "Use Gradient" msgstr "" #: data/ui/spectrum_settings.glade:315 msgid "Points" msgstr "Punkter" #: data/ui/spectrum_settings.glade:327 msgid "Height" msgstr "" #: data/ui/spectrum_settings.glade:339 #, fuzzy msgid "Line Width" msgstr "Bredd" #: data/ui/spectrum_settings.glade:351 #, fuzzy msgid "Sampling" msgstr "Resampler" #: data/ui/spectrum_settings.glade:363 #, fuzzy msgid "Minimum Frequency" msgstr "Frekvens (Hz)" #: data/ui/spectrum_settings.glade:375 #, fuzzy msgid "Maximum Frequency" msgstr "Frekvens (Hz)" #: data/ui/spectrum_settings.glade:410 #, fuzzy msgid "Spectrum Type" msgstr "Spektrum" #: data/ui/spectrum_settings.glade:423 msgid "Bars" msgstr "" #: data/ui/spectrum_settings.glade:424 msgid "Lines" msgstr "" #: data/ui/spectrum_settings.glade:437 #, fuzzy msgid "Spectrum Color" msgstr "Spektrum" #: data/ui/spectrum_settings.glade:449 msgid "Gradient Color" msgstr "" #: data/ui/spectrum_settings.glade:461 msgid "Axis Color" msgstr "" #: data/ui/stereo_tools.glade:108 #, fuzzy msgid "Stereo Tools" msgstr "Ljudförstärkare" #: data/ui/stereo_tools.glade:334 data/ui/stereo_tools.glade:775 #, fuzzy msgid "Balance" msgstr "Ljudförstärkare" #: data/ui/stereo_tools.glade:365 #, fuzzy msgid "S/C Level" msgstr "Nivå" #: data/ui/stereo_tools.glade:406 msgid "Softclip" msgstr "" #: data/ui/stereo_tools.glade:452 #, fuzzy msgid "Side Level" msgstr "Nivå" #: data/ui/stereo_tools.glade:503 #, fuzzy msgid "Side Balance" msgstr "Ljudförstärkare" #: data/ui/stereo_tools.glade:535 #, fuzzy msgid "Middle Level" msgstr "Nivå" #: data/ui/stereo_tools.glade:547 #, fuzzy msgid "Middle Panorama" msgstr "Panorama" #: data/ui/stereo_tools.glade:604 msgid "LR > LR (Stereo Default)" msgstr "" #: data/ui/stereo_tools.glade:605 msgid "LR > MS (Stereo to Mid-Side)" msgstr "" #: data/ui/stereo_tools.glade:606 msgid "MS > LR (Mid-Side to Stereo)" msgstr "" #: data/ui/stereo_tools.glade:607 #, fuzzy msgid "LR > LL (Mono Left Channel)" msgstr "Kanaler" #: data/ui/stereo_tools.glade:608 #, fuzzy msgid "LR > RR (Mono Right Channel)" msgstr "Kanaler" #: data/ui/stereo_tools.glade:609 msgid "LR > L+R (Mono Sum L+R)" msgstr "" #: data/ui/stereo_tools.glade:610 msgid "LR > RL (Stereo Flip Channels)" msgstr "" #: data/ui/stereo_tools.glade:627 #, fuzzy msgid "Stereo Matrix" msgstr "Ljudförstärkare" #: data/ui/stereo_tools.glade:668 data/ui/stereo_tools.glade:709 msgid "Invert Phase" msgstr "" #: data/ui/stereo_tools.glade:806 #, fuzzy msgid "Delay L/R" msgstr "Release (ms)" #: data/ui/stereo_tools.glade:839 #, fuzzy msgid "Stereo Base" msgstr "Ljudförstärkare" #: data/ui/stereo_tools.glade:871 #, fuzzy msgid "Stereo Phase" msgstr "Ljudförstärkare" #: data/ui/webrtc.glade:96 msgid "WebRTC" msgstr "" #: data/ui/webrtc.glade:256 data/ui/webrtc.glade:389 data/ui/webrtc.glade:460 #: data/ui/webrtc.glade:648 #, fuzzy msgid "Enable" msgstr "Sinustabell" #: data/ui/webrtc.glade:279 msgid "Extended Filter" msgstr "" #: data/ui/webrtc.glade:292 #, fuzzy msgid "High Pass Filter" msgstr "Högpass" #: data/ui/webrtc.glade:309 data/ui/webrtc.glade:425 data/ui/webrtc.glade:698 msgid "Low" msgstr "" #: data/ui/webrtc.glade:310 data/ui/webrtc.glade:426 data/ui/webrtc.glade:699 msgid "Moderate" msgstr "" #: data/ui/webrtc.glade:311 data/ui/webrtc.glade:427 data/ui/webrtc.glade:700 #, fuzzy msgid "High" msgstr "Högpass" #: data/ui/webrtc.glade:324 data/ui/webrtc.glade:412 #, fuzzy msgid "Suppression Level" msgstr "Förstärkningsreducering" #: data/ui/webrtc.glade:361 msgid "Delay Agnostic" msgstr "" #: data/ui/webrtc.glade:375 #, fuzzy msgid "Echo Canceller" msgstr "Ljudförstärkare" #: data/ui/webrtc.glade:428 #, fuzzy msgid "Very High" msgstr "Högpass" #: data/ui/webrtc.glade:445 #, fuzzy msgid "Noise Suppressor" msgstr "Kompressor" #: data/ui/webrtc.glade:496 msgid "Adaptive Digital" msgstr "" #: data/ui/webrtc.glade:497 msgid "Fixed Digital" msgstr "" #: data/ui/webrtc.glade:514 msgid "Gain Controller" msgstr "" #: data/ui/webrtc.glade:540 #, fuzzy msgid "Target Level" msgstr "Målvärde (dB)" #: data/ui/webrtc.glade:572 msgid "Maximum Gain" msgstr "" #: data/ui/webrtc.glade:672 #, fuzzy msgid "Detection Likelihood" msgstr "Försvagning" #: data/ui/webrtc.glade:684 #, fuzzy msgid "Frame Size" msgstr "Rumsstorlek" #: data/ui/webrtc.glade:697 msgid "Very Low" msgstr "" #: data/ui/webrtc.glade:737 #, fuzzy msgid "Voice Detector" msgstr "Försvagning" #: data/ui/rnnoise.glade:90 #, fuzzy msgid "Noise Reduction" msgstr "Förstärkningsreducering" #: data/ui/rnnoise.glade:242 #, fuzzy msgid "Import Model" msgstr "Platt respons" #: data/ui/rnnoise.glade:246 #, fuzzy msgid "Import Model File" msgstr "Platt respons" #: data/ui/rnnoise.glade:311 #, fuzzy msgid "Active Model" msgstr "Ingen komprimering" #: data/ui/rnnoise.glade:324 msgid "Standard RNNoise Model" msgstr "" #: src/app_info_ui.cpp:120 msgid "paused" msgstr "" #: src/app_info_ui.cpp:122 msgid "playing" msgstr "" #: src/application.cpp:38 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "" #: src/application.cpp:40 msgid "Show available presets." msgstr "" #: src/application.cpp:43 msgid "Load a preset. Example: pulseeffects -l music" msgstr "" #: src/application.cpp:45 #, fuzzy msgid "Reset PulseEffects." msgstr "PulseEffects" #: src/application.cpp:48 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "" #: src/application.cpp:50 msgid "Hide the Window." msgstr "" #: src/application.cpp:284 #, fuzzy msgid "Output Presets: " msgstr "Profiler" #: src/application.cpp:292 #, fuzzy msgid "Input Presets: " msgstr "Öppna förinställning" #: src/blocklist_settings_ui.cpp:191 msgid "Blocklist" msgstr "" #: src/calibration_ui.cpp:198 #, fuzzy msgid "Calibration Microphone" msgstr "Kalibrering och mikrofon korrigering" #: src/convolver_ui.cpp:281 #, fuzzy msgid "Import Impulse File" msgstr "Platt respons" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 msgid "Open" msgstr "" #: src/convolver_ui.cpp:281 src/equalizer_ui.cpp:739 #: src/presets_menu_ui.cpp:129 #, fuzzy msgid "Cancel" msgstr "Ljudförstärkare" #: src/convolver_ui.cpp:318 src/convolver_ui.cpp:319 src/convolver_ui.cpp:321 msgid "Failed" msgstr "" #: src/convolver_ui.cpp:323 msgid "Could Not Load The Impulse File" msgstr "" #: src/equalizer_ui.cpp:380 msgid "infinity" msgstr "" #: src/equalizer_ui.cpp:738 #, fuzzy msgid "Import APO Preset File" msgstr "Öppna förinställning" #: src/equalizer_ui.cpp:743 #, fuzzy msgid "APO Presets" msgstr "Profiler" #: src/general_settings_ui.cpp:149 msgid "General" msgstr "Allmänt" #: src/pulse_settings_ui.cpp:168 msgid "Pulseaudio" msgstr "" #, fuzzy #~ msgid "Import APO Presets" #~ msgstr "Öppna förinställning" #, fuzzy #~ msgid "Input Gain" #~ msgstr "Ingångsförstärkning (dB)" #, fuzzy #~ msgid "Output Gain" #~ msgstr "Ingångsförstärkning (dB)" #, fuzzy #~ msgid "Gain Detection" #~ msgstr "Förstärkningsreducering" easyeffects-4.8.7/po/tr.po000066400000000000000000001136651424023573300154550ustar00rootroot00000000000000# PulseEffects Türkçe Çeviri Dosyası. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pulseeffects package. # Serdar Sağlam , 2019. # msgid "" msgstr "" "Project-Id-Version: pulseeffects\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-10 13:00-0300\n" "PO-Revision-Date: 2019-09-13 19:47+0300\n" "Last-Translator: Serdar Sağlam \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.1\n" "Plural-Forms: nplurals=1; plural=0;\n" #: data/ui/application.glade:41 src/calibration_ui.cpp:39 #: src/calibration_ui.cpp:164 msgid "Test Signals" msgstr "Test Sinyalleri" #: data/ui/application.glade:63 #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 msgid "PulseEffects" msgstr "PulseEffects" #: data/ui/application.glade:135 data/ui/general_settings.glade:107 #: data/ui/equalizer.glade:253 msgid "Settings" msgstr "Ayarlar" #: data/ui/application.glade:157 msgid "Help" msgstr "Yardım" #: data/ui/application.glade:180 data/ui/filter.glade:204 #: data/ui/equalizer.glade:309 data/ui/reverb.glade:284 #: data/ui/crossfeed.glade:47 src/presets_menu_ui.cpp:115 #: src/presets_menu_ui.cpp:274 src/presets_menu_ui.cpp:291 msgid "Presets" msgstr "Ön Ayarlar" #: data/ui/spectrum_settings.glade:59 msgid "Show Spectrum" msgstr "Spektrumu Göster" #: data/ui/spectrum_settings.glade:84 msgid "Fill" msgstr "Dolgu" #: data/ui/spectrum_settings.glade:109 msgid "Border" msgstr "Kenar" #: data/ui/spectrum_settings.glade:134 msgid "Use Custom Color" msgstr "Özel Renk Kullan" #: data/ui/spectrum_settings.glade:159 msgid "Use Gradient" msgstr "Geçişli Renk Kullan" #: data/ui/spectrum_settings.glade:185 msgid "Spectrum Color" msgstr "Spektrum Rengi" #: data/ui/spectrum_settings.glade:213 msgid "Gradient Color" msgstr "Geçiş Rengi" #: data/ui/spectrum_settings.glade:241 msgid "Spectrum Type" msgstr "Spektrum Türü" #: data/ui/spectrum_settings.glade:255 msgid "Bars" msgstr "Barlar" #: data/ui/spectrum_settings.glade:256 msgid "Lines" msgstr "Çizgiler" #: data/ui/spectrum_settings.glade:271 msgid "Points" msgstr "Noktalar" #: data/ui/spectrum_settings.glade:303 msgid "Height" msgstr "Yükseklik" #: data/ui/spectrum_settings.glade:336 msgid "Scale" msgstr "Ölçek" #: data/ui/spectrum_settings.glade:369 msgid "Exponent" msgstr "Katsayı" #: data/ui/spectrum_settings.glade:402 msgid "Sampling" msgstr "Örnekleme" #: data/ui/spectrum_settings.glade:433 msgid "Line Width" msgstr "Hat Genişliği" #: data/ui/pulse_settings.glade:98 data/ui/pulse_settings.glade:387 msgid "Use Default" msgstr "Öntanımlıyı Kullan" #: data/ui/pulse_settings.glade:150 data/ui/pulse_settings.glade:438 msgid "Block Size" msgstr "Blok Boyutu" #: data/ui/pulse_settings.glade:195 data/ui/pulse_settings.glade:483 msgid "Pipeline Input" msgstr "Pipeline Giriş" #: data/ui/pulse_settings.glade:209 data/ui/pulse_settings.glade:299 #: data/ui/pulse_settings.glade:497 data/ui/pulse_settings.glade:587 #: data/ui/app_info.glade:159 msgid "Buffer" msgstr "Arabellek" #: data/ui/pulse_settings.glade:242 data/ui/pulse_settings.glade:332 #: data/ui/pulse_settings.glade:510 data/ui/pulse_settings.glade:600 #: data/ui/app_info.glade:186 msgid "Latency" msgstr "Gecikme" #: data/ui/pulse_settings.glade:285 data/ui/pulse_settings.glade:573 msgid "Pipeline Output" msgstr "Pipeline Çıkış" #: data/ui/pulse_settings.glade:368 data/ui/blocklist_settings.glade:130 msgid "Input Effects" msgstr "Giriş Efektleri" #: data/ui/pulse_settings.glade:656 data/ui/blocklist_settings.glade:224 msgid "Output Effects" msgstr "Çıkış Efektleri" #: data/ui/blocklist_settings.glade:53 data/ui/blocklist_settings.glade:147 #: data/ui/presets_menu.glade:68 data/ui/presets_menu.glade:177 msgid "Create Preset" msgstr "Hazır Ayar Oluştur" #: data/ui/blocklist_settings.glade:72 data/ui/blocklist_settings.glade:166 #: data/ui/pulse_info.glade:49 data/ui/presets_menu.glade:55 #: data/ui/presets_menu.glade:164 msgid "Name" msgstr "İsim" #: data/ui/general_settings.glade:31 msgid "Start Service at Login" msgstr "Oturum Açarken Hizmeti Başlat" #: data/ui/general_settings.glade:56 msgid "Process All Outputs" msgstr "Tüm Çıkışları İşle" #: data/ui/general_settings.glade:81 msgid "Use Dark Theme" msgstr "Koyu Tema Kullan" #: data/ui/general_settings.glade:116 data/ui/equalizer_band.glade:183 #: data/ui/equalizer_band.glade:229 msgid "Reset" msgstr "Sıfırla" #: data/ui/general_settings.glade:133 data/ui/general_settings.glade:206 msgid "Niceness" msgstr "Hassaslık" #: data/ui/general_settings.glade:134 msgid "Real Time" msgstr "Eş Zamanlı" #: data/ui/general_settings.glade:135 msgid "None" msgstr "Hiçbiri" #: data/ui/general_settings.glade:151 msgid "Priority Type" msgstr "Öncelik Türü" #: data/ui/general_settings.glade:161 msgid "About" msgstr "Hakkında" #: data/ui/general_settings.glade:180 msgid "Process All Inputs" msgstr "Tüm Girişleri İşle" #: data/ui/general_settings.glade:232 msgid "Priority" msgstr "Öncelik" #: data/ui/about.glade.in:11 msgid "Audio effects for PulseAudio applications" msgstr "PulseAudio uygulamaları için ses efektleri" #: data/ui/app_info.glade:51 msgid "Format" msgstr "Biçim" #: data/ui/app_info.glade:78 data/ui/convolver.glade:257 msgid "Rate" msgstr "Oran" #: data/ui/app_info.glade:105 data/ui/pulse_info.glade:238 #: data/ui/stereo_tools.glade:629 msgid "Channels" msgstr "Kanallar" #: data/ui/app_info.glade:132 msgid "Resampler" msgstr "Örnekleme" #: data/ui/app_info.glade:213 msgid "State" msgstr "Durum" #: data/ui/pulse_info.glade:76 msgid "Version" msgstr "Sürüm" #: data/ui/pulse_info.glade:103 msgid "Default Sink" msgstr "Öntanımlı Sink" #: data/ui/pulse_info.glade:115 msgid "Default Source" msgstr "Öntanımlı Kaynak" #: data/ui/pulse_info.glade:157 msgid "Protocol" msgstr "Protokol" #: data/ui/pulse_info.glade:184 msgid "Default Sample Format" msgstr "Öntanımlı Örnek Biçimi" #: data/ui/pulse_info.glade:211 msgid "Default Sampling Rate" msgstr "Öntanımlı Örnekleme Hızı" #: data/ui/pulse_info.glade:265 msgid "Channel Mapping" msgstr "Kanal Eşleme" #: data/ui/pulse_info.glade:290 msgid "Server" msgstr "Sunucu" #: data/ui/pulse_info.glade:335 msgid "Modules" msgstr "Modüller" #: data/ui/pulse_info.glade:381 msgid "Clients" msgstr "İstemciler" #: data/ui/pulse_info.glade:444 msgid "File" msgstr "Dosya" #: data/ui/pulse_info.glade:454 msgid "Configuration" msgstr "Yapılandırma" #: data/ui/pulse_info.glade:487 msgid "Resamplers" msgstr "Örnekleyiciler" #: data/ui/autogain.glade:24 msgid "Auto Gain" msgstr "Otomatik Kazanç" #: data/ui/autogain.glade:145 msgid "Reset History" msgstr "Geçmişi Sıfırla" #: data/ui/autogain.glade:157 msgid "Detect Silence" msgstr "Sessizliği Algıla" #: data/ui/autogain.glade:188 data/ui/autogain.glade:567 msgid "Momentary" msgstr "Anlık" #: data/ui/autogain.glade:203 data/ui/autogain.glade:580 msgid "Short Term" msgstr "Kısa Süreli" #: data/ui/autogain.glade:218 data/ui/autogain.glade:593 msgid "Integrated" msgstr "Tümleşik" #: data/ui/autogain.glade:289 msgid "Weights" msgstr "Ağırlık" #: data/ui/autogain.glade:323 msgid "Target" msgstr "Hedef" #: data/ui/autogain.glade:354 data/ui/autogain.glade:546 #: data/ui/limiter.glade:365 data/ui/compressor.glade:718 #: data/ui/multiband_compressor.glade:1958 data/ui/filter.glade:368 #: data/ui/equalizer.glade:516 data/ui/reverb.glade:630 #: data/ui/bass_enhancer.glade:479 data/ui/exciter.glade:483 #: data/ui/stereo_tools.glade:299 data/ui/stereo_tools.glade:804 #: data/ui/crossfeed.glade:202 data/ui/maximizer.glade:239 #: data/ui/loudness.glade:244 data/ui/gate.glade:487 #: data/ui/multiband_gate.glade:2107 data/ui/deesser.glade:568 #: data/ui/convolver.glade:477 data/ui/crystalizer.glade:228 #: data/ui/pitch.glade:322 data/ui/webrtc.glade:624 data/ui/delay.glade:210 #: data/ui/presets_menu.glade:255 msgid "Input" msgstr "Giriş" #: data/ui/autogain.glade:369 data/ui/autogain.glade:802 #: data/ui/limiter.glade:380 data/ui/compressor.glade:733 #: data/ui/multiband_compressor.glade:753 #: data/ui/multiband_compressor.glade:1130 #: data/ui/multiband_compressor.glade:1508 #: data/ui/multiband_compressor.glade:1886 #: data/ui/multiband_compressor.glade:1973 data/ui/filter.glade:383 #: data/ui/equalizer.glade:531 data/ui/reverb.glade:645 #: data/ui/bass_enhancer.glade:511 data/ui/exciter.glade:515 #: data/ui/stereo_tools.glade:776 data/ui/stereo_tools.glade:818 #: data/ui/crossfeed.glade:217 data/ui/maximizer.glade:254 #: data/ui/loudness.glade:162 data/ui/loudness.glade:259 data/ui/gate.glade:502 #: data/ui/multiband_gate.glade:806 data/ui/multiband_gate.glade:1215 #: data/ui/multiband_gate.glade:1625 data/ui/multiband_gate.glade:2035 #: data/ui/multiband_gate.glade:2122 data/ui/deesser.glade:583 #: data/ui/convolver.glade:492 data/ui/crystalizer.glade:243 #: data/ui/pitch.glade:336 data/ui/webrtc.glade:639 data/ui/delay.glade:225 #: data/ui/presets_menu.glade:146 msgid "Output" msgstr "Çıkış" #: data/ui/autogain.glade:684 msgid "Relative" msgstr "Göreceli" #: data/ui/autogain.glade:697 data/ui/compressor.glade:900 #: data/ui/deesser.glade:295 msgid "Gain" msgstr "Kazanç" #: data/ui/autogain.glade:763 data/ui/loudness.glade:24 #: data/ui/loudness.glade:128 msgid "Loudness" msgstr "Yüksek Ses" #: data/ui/autogain.glade:816 msgid "Range" msgstr "Sınır" #: data/ui/limiter.glade:30 data/ui/webrtc.glade:395 msgid "Limiter" msgstr "Sınırlayıcı" #: data/ui/limiter.glade:149 msgid "Input Gain" msgstr "Giriş Kazancı" #: data/ui/limiter.glade:182 msgid "Limit" msgstr "Limit" #: data/ui/limiter.glade:237 data/ui/compressor.glade:373 #: data/ui/multiband_compressor.glade:534 #: data/ui/multiband_compressor.glade:907 #: data/ui/multiband_compressor.glade:1285 #: data/ui/multiband_compressor.glade:1663 data/ui/maximizer.glade:213 #: data/ui/gate.glade:299 data/ui/multiband_gate.glade:554 #: data/ui/multiband_gate.glade:960 data/ui/multiband_gate.glade:1370 #: data/ui/multiband_gate.glade:1780 msgid "Release" msgstr "Bırak" #: data/ui/limiter.glade:250 data/ui/compressor.glade:570 msgid "Lookahead" msgstr "İlerleme" #: data/ui/limiter.glade:285 msgid "Oversampling" msgstr "Aşırı Örnekleme" #: data/ui/limiter.glade:334 msgid "ASC" msgstr "ASC" #: data/ui/limiter.glade:395 msgid "Attenuation" msgstr "Zayıflatma" #: data/ui/compressor.glade:30 data/ui/compressor.glade:442 #: data/ui/webrtc.glade:482 data/com.github.wwmm.pulseeffects.appdata.xml.in:52 msgid "Compressor" msgstr "Sıkıştırıcı" #: data/ui/compressor.glade:239 data/ui/multiband_compressor.glade:568 #: data/ui/multiband_compressor.glade:942 #: data/ui/multiband_compressor.glade:1320 #: data/ui/multiband_compressor.glade:1698 data/ui/maximizer.glade:126 #: data/ui/gate.glade:333 data/ui/multiband_gate.glade:588 #: data/ui/multiband_gate.glade:995 data/ui/multiband_gate.glade:1405 #: data/ui/multiband_gate.glade:1815 data/ui/deesser.glade:458 msgid "Threshold" msgstr "Eşik" #: data/ui/compressor.glade:272 data/ui/multiband_compressor.glade:601 #: data/ui/multiband_compressor.glade:976 #: data/ui/multiband_compressor.glade:1354 #: data/ui/multiband_compressor.glade:1732 data/ui/gate.glade:366 #: data/ui/multiband_gate.glade:621 data/ui/multiband_gate.glade:1029 #: data/ui/multiband_gate.glade:1439 data/ui/multiband_gate.glade:1849 #: data/ui/deesser.glade:491 msgid "Ratio" msgstr "Oran" #: data/ui/compressor.glade:304 data/ui/multiband_compressor.glade:633 #: data/ui/multiband_compressor.glade:1009 #: data/ui/multiband_compressor.glade:1387 #: data/ui/multiband_compressor.glade:1765 data/ui/gate.glade:398 #: data/ui/multiband_gate.glade:653 data/ui/multiband_gate.glade:1062 #: data/ui/multiband_gate.glade:1472 data/ui/multiband_gate.glade:1882 msgid "Knee" msgstr "Oynak" #: data/ui/compressor.glade:338 data/ui/multiband_compressor.glade:667 #: data/ui/multiband_compressor.glade:1044 #: data/ui/multiband_compressor.glade:1422 #: data/ui/multiband_compressor.glade:1800 data/ui/gate.glade:432 #: data/ui/multiband_gate.glade:687 data/ui/multiband_gate.glade:1097 #: data/ui/multiband_gate.glade:1507 data/ui/multiband_gate.glade:1917 #: data/ui/deesser.glade:522 msgid "Makeup" msgstr "Süs" #: data/ui/compressor.glade:386 data/ui/multiband_compressor.glade:500 #: data/ui/multiband_compressor.glade:872 #: data/ui/multiband_compressor.glade:1250 #: data/ui/multiband_compressor.glade:1628 data/ui/gate.glade:265 #: data/ui/multiband_gate.glade:520 data/ui/multiband_gate.glade:925 #: data/ui/multiband_gate.glade:1335 data/ui/multiband_gate.glade:1745 msgid "Attack" msgstr "Atak" #: data/ui/compressor.glade:413 msgid "Downward" msgstr "Aşağıya" #: data/ui/compressor.glade:414 msgid "Upward" msgstr "Yukarıya" #: data/ui/compressor.glade:426 msgid "Compression Mode" msgstr "Sıkıştırma Kipi" #: data/ui/compressor.glade:454 data/ui/bass_enhancer.glade:145 #: data/ui/exciter.glade:145 data/ui/deesser.glade:162 msgid "Listen" msgstr "Liste" #: data/ui/compressor.glade:500 msgid "Pre-amplification" msgstr "Öntanımlı-yükselticiler" #: data/ui/compressor.glade:535 msgid "Reactivity" msgstr "Tepkinirlik" #: data/ui/compressor.glade:583 msgid "Feed-forward" msgstr "İleri-besleme" #: data/ui/compressor.glade:584 msgid "Feed-back" msgstr "Geri-besleme" #: data/ui/compressor.glade:598 data/ui/equalizer_band.glade:48 msgid "Type" msgstr "Tür" #: data/ui/compressor.glade:612 data/ui/multiband_compressor.glade:473 #: data/ui/multiband_compressor.glade:845 #: data/ui/multiband_compressor.glade:1223 #: data/ui/multiband_compressor.glade:1601 data/ui/gate.glade:220 #: data/ui/multiband_gate.glade:493 data/ui/multiband_gate.glade:898 #: data/ui/multiband_gate.glade:1308 data/ui/multiband_gate.glade:1718 #: data/ui/deesser.glade:218 data/ui/deesser.glade:328 msgid "Peak" msgstr "Doruk" #: data/ui/compressor.glade:613 data/ui/multiband_compressor.glade:472 #: data/ui/multiband_compressor.glade:844 #: data/ui/multiband_compressor.glade:1222 #: data/ui/multiband_compressor.glade:1600 data/ui/gate.glade:219 #: data/ui/multiband_gate.glade:492 data/ui/multiband_gate.glade:897 #: data/ui/multiband_gate.glade:1307 data/ui/multiband_gate.glade:1717 #: data/ui/deesser.glade:217 msgid "RMS" msgstr "RMS" #: data/ui/compressor.glade:614 msgid "Low-Pass" msgstr "Düşük-Geçiş" #: data/ui/compressor.glade:615 msgid "Uniform" msgstr "Aynı" #: data/ui/compressor.glade:629 data/ui/multiband_compressor.glade:283 #: data/ui/equalizer.glade:200 data/ui/equalizer_band.glade:79 #: data/ui/stereo_tools.glade:461 data/ui/multiband_gate.glade:303 #: data/ui/deesser.glade:204 data/ui/webrtc.glade:350 msgid "Mode" msgstr "Kip" #: data/ui/compressor.glade:643 msgid "Middle" msgstr "Orta" #: data/ui/compressor.glade:644 msgid "Side" msgstr "Yan" #: data/ui/compressor.glade:645 data/ui/equalizer.glade:448 #: data/ui/stereo_tools.glade:524 data/ui/delay.glade:131 msgid "Left" msgstr "Sol" #: data/ui/compressor.glade:646 data/ui/equalizer.glade:489 #: data/ui/stereo_tools.glade:596 data/ui/delay.glade:163 msgid "Right" msgstr "Sağ" #: data/ui/compressor.glade:660 msgid "Source" msgstr "Kaynak" #: data/ui/compressor.glade:676 data/ui/compressor.glade:913 msgid "Sidechain" msgstr "Yanzincir" #: data/ui/compressor.glade:989 msgid "Curve" msgstr "Eğri" #: data/ui/multiband_compressor.glade:70 msgid "Multiband Compressor" msgstr "Çoklu Bant Şıkıştırıcı" #: data/ui/multiband_compressor.glade:297 data/ui/multiband_gate.glade:317 msgid "LR4" msgstr "LR4" #: data/ui/multiband_compressor.glade:298 data/ui/multiband_gate.glade:318 msgid "LR8" msgstr "LR8" #: data/ui/multiband_compressor.glade:312 data/ui/multiband_gate.glade:332 msgid "Split 1/2" msgstr "1/2 Böl" #: data/ui/multiband_compressor.glade:325 data/ui/multiband_gate.glade:345 msgid "Split 2/3" msgstr "2/3 Böl" #: data/ui/multiband_compressor.glade:338 data/ui/multiband_gate.glade:358 msgid "Split 3/4" msgstr "3/4 Böl" #: data/ui/multiband_compressor.glade:442 #: data/ui/multiband_compressor.glade:814 #: data/ui/multiband_compressor.glade:1192 #: data/ui/multiband_compressor.glade:1570 data/ui/multiband_gate.glade:462 #: data/ui/multiband_gate.glade:867 data/ui/multiband_gate.glade:1277 #: data/ui/multiband_gate.glade:1687 data/ui/crystalizer_band.glade:39 msgid "Bypass" msgstr "Atla" #: data/ui/multiband_compressor.glade:455 #: data/ui/multiband_compressor.glade:827 #: data/ui/multiband_compressor.glade:1205 #: data/ui/multiband_compressor.glade:1583 data/ui/equalizer_band.glade:302 #: data/ui/multiband_gate.glade:475 data/ui/multiband_gate.glade:880 #: data/ui/multiband_gate.glade:1290 data/ui/multiband_gate.glade:1700 msgid "Solo" msgstr "Tekli" #: data/ui/multiband_compressor.glade:713 #: data/ui/multiband_compressor.glade:1090 #: data/ui/multiband_compressor.glade:1468 #: data/ui/multiband_compressor.glade:1846 msgid "Compression" msgstr "Sıkıştırma" #: data/ui/multiband_compressor.glade:796 data/ui/multiband_gate.glade:849 msgid "Sub Band" msgstr "Alt Bant" #: data/ui/multiband_compressor.glade:1173 data/ui/multiband_gate.glade:1258 msgid "Low Band" msgstr "Düşük Bant" #: data/ui/multiband_compressor.glade:1551 data/ui/multiband_gate.glade:1668 msgid "Mid Band" msgstr "Orta Bant" #: data/ui/multiband_compressor.glade:1929 data/ui/multiband_gate.glade:2078 msgid "High Band" msgstr "Yüksek Bant" #: data/ui/filter.glade:31 msgid "Filter" msgstr "Süzgeç" #: data/ui/filter.glade:123 msgid "Muted" msgstr "Sessiz" #: data/ui/filter.glade:135 data/ui/reverb.glade:209 msgid "Disco" msgstr "Disko" #: data/ui/filter.glade:147 msgid "Distant Headphones" msgstr "Uzak Kulaklıklar" #: data/ui/filter.glade:159 data/ui/reverb.glade:235 data/ui/crossfeed.glade:72 msgid "Default" msgstr "Öntanımlı" #: data/ui/filter.glade:220 msgid "12dB/oct Lowpass" msgstr "12dB/oct Düşük geçiş" #: data/ui/filter.glade:221 msgid "24dB/oct Lowpass" msgstr "24dB/oct Düşük geçiş" #: data/ui/filter.glade:222 msgid "36dB/oct Lowpass" msgstr "36dB/oct Düşük geçiş" #: data/ui/filter.glade:223 msgid "12dB/oct Highpass" msgstr "12dB/oct Yüksek geçiş" #: data/ui/filter.glade:224 msgid "24dB/oct Highpass" msgstr "24dB/oct Yüksek geçiş" #: data/ui/filter.glade:225 msgid "36dB/oct Highpass" msgstr "36dB/oct Yüksek geçiş" #: data/ui/filter.glade:226 msgid "6dB/oct Bandpass" msgstr "6dB/oct Bant geçişi" #: data/ui/filter.glade:227 msgid "12dB/oct Bandpass" msgstr "12dB/oct Bant geçişi" #: data/ui/filter.glade:228 msgid "18dB/oct Bandpass" msgstr "18dB/oct Bant geçişi" #: data/ui/filter.glade:229 msgid "6dB/oct Bandreject" msgstr "6dB/oct Bant reddet" #: data/ui/filter.glade:230 msgid "12dB/oct Bandreject" msgstr "12dB/oct Bant reddet" #: data/ui/filter.glade:231 msgid "18dB/oct Bandreject" msgstr "12dB/oct Bant reddet" #: data/ui/filter.glade:254 data/ui/equalizer_band.glade:152 #: data/ui/calibration_signals.glade:32 msgid "Frequency" msgstr "Sıklık" #: data/ui/filter.glade:288 data/ui/equalizer_band.glade:67 msgid "Resonance" msgstr "Çınlama" #: data/ui/filter.glade:323 msgid "Inertia" msgstr "Durağan" #: data/ui/equalizer.glade:24 msgid "Equalizer" msgstr "Ekolayzır" #: data/ui/equalizer.glade:129 msgid "Split Channels" msgstr "Kanalları Böl" #: data/ui/equalizer.glade:155 msgid "IIR" msgstr "IIR" #: data/ui/equalizer.glade:156 msgid "FIR" msgstr "FIR" #: data/ui/equalizer.glade:157 msgid "FFT" msgstr "FFT" #: data/ui/equalizer.glade:187 msgid "Bands" msgstr "Bantlar" #: data/ui/equalizer.glade:209 msgid "Flat Response" msgstr "Düz Yanıt" #: data/ui/equalizer.glade:224 msgid "Calculate Frequencies" msgstr "Frekansları Hesapla" #: data/ui/equalizer.glade:238 msgid "Reset Equalizer" msgstr "Ekolayzır Sıfırla" #: data/ui/equalizer_band.glade:60 msgid "Off" msgstr "Kapalı" #: data/ui/equalizer_band.glade:61 msgid "Bell" msgstr "Çan" #: data/ui/equalizer_band.glade:62 msgid "High Pass" msgstr "Yüksek Geçiş" #: data/ui/equalizer_band.glade:63 msgid "High Shelf" msgstr "Yüksek Sığlık" #: data/ui/equalizer_band.glade:64 msgid "Low Pass" msgstr "Düşük Geçiş" #: data/ui/equalizer_band.glade:65 msgid "Low Shelf" msgstr "Düşük Sığlık" #: data/ui/equalizer_band.glade:66 msgid "Notch" msgstr "Çentik" #: data/ui/equalizer_band.glade:91 msgid "RLC (BT)" msgstr "RLC (BT)" #: data/ui/equalizer_band.glade:92 msgid "RLC (MT)" msgstr "RLC (MT)" #: data/ui/equalizer_band.glade:93 msgid "BWC (BT)" msgstr "BWC (BT)" #: data/ui/equalizer_band.glade:94 msgid "BWC (MT)" msgstr "BWC (MT)" #: data/ui/equalizer_band.glade:95 msgid "LRX (BT)" msgstr "LRX (BT)" #: data/ui/equalizer_band.glade:96 msgid "LRX (MT)" msgstr "LRX (MT)" #: data/ui/equalizer_band.glade:97 msgid "APO (DR)" msgstr "APO (DR)" #: data/ui/equalizer_band.glade:109 msgid "Slope" msgstr "Eğim" #: data/ui/equalizer_band.glade:121 msgid "x1" msgstr "x1" #: data/ui/equalizer_band.glade:122 msgid "x2" msgstr "x2" #: data/ui/equalizer_band.glade:123 msgid "x3" msgstr "x3" #: data/ui/equalizer_band.glade:124 msgid "x4" msgstr "x4" #: data/ui/equalizer_band.glade:201 msgid "Quality" msgstr "Kalite" #: data/ui/equalizer_band.glade:252 msgid "Width" msgstr "Genişlik" #: data/ui/equalizer_band.glade:314 data/ui/stereo_tools.glade:550 #: data/ui/stereo_tools.glade:609 data/ui/crystalizer_band.glade:27 msgid "Mute" msgstr "Sessiz" #: data/ui/equalizer_preset_row.glade:37 data/ui/irs_row.glade:59 #: data/ui/preset_row.glade:51 msgid "Apply" msgstr "Uygula" #: data/ui/reverb.glade:64 msgid "Reverberation" msgstr "Yankılanma" #: data/ui/reverb.glade:157 msgid "Ambience" msgstr "Ortam" #: data/ui/reverb.glade:170 msgid "Empty Walls" msgstr "Boş Duvarlar" #: data/ui/reverb.glade:183 msgid "Room" msgstr "Oda" #: data/ui/reverb.glade:196 msgid "Large Empty Hall" msgstr "Büyük Boş Salon" #: data/ui/reverb.glade:222 msgid "Large Occupied Hall" msgstr "Büyük Dolu Salon" #: data/ui/reverb.glade:334 msgid "Pre Delay" msgstr "Ön Gecikme" #: data/ui/reverb.glade:347 msgid "Decay Time" msgstr "Bozunma Süresi" #: data/ui/reverb.glade:380 data/ui/bass_enhancer.glade:242 #: data/ui/exciter.glade:245 msgid "Amount" msgstr "Miktar" #: data/ui/reverb.glade:412 msgid "Dry" msgstr "Sertlik" #: data/ui/reverb.glade:444 msgid "Bass Cut" msgstr "Bas Kesim" #: data/ui/reverb.glade:495 msgid "Treble Cut" msgstr "Tiz Kesim" #: data/ui/reverb.glade:538 msgid "Diffusion" msgstr "Yayılma" #: data/ui/reverb.glade:550 msgid "Room Size" msgstr "Oda Boyutu" #: data/ui/reverb.glade:563 msgid "Small" msgstr "Küçük" #: data/ui/reverb.glade:564 msgid "Medium" msgstr "Orta" #: data/ui/reverb.glade:565 msgid "Large" msgstr "Büyük" #: data/ui/reverb.glade:566 msgid "Tunnel" msgstr "Tünel" #: data/ui/reverb.glade:567 msgid "Large/smooth" msgstr "Büyük/pürüzsüz" #: data/ui/reverb.glade:568 msgid "Experimental" msgstr "Deneysel" #: data/ui/reverb.glade:581 msgid "High Frequency Damping" msgstr "Yüksek Frekans Sönümleme" #: data/ui/bass_enhancer.glade:50 msgid "Bass Enhancer" msgstr "Bas Yükseltici" #: data/ui/bass_enhancer.glade:186 data/ui/exciter.glade:187 msgid "3rd" msgstr "3." #: data/ui/bass_enhancer.glade:198 data/ui/exciter.glade:199 msgid "2nd" msgstr "2." #: data/ui/bass_enhancer.glade:210 data/ui/exciter.glade:211 msgid "Blend Harmonics" msgstr "Harmonik Karışımları" #: data/ui/bass_enhancer.glade:254 data/ui/bass_enhancer.glade:386 #: data/ui/exciter.glade:258 data/ui/exciter.glade:390 msgid "Harmonics" msgstr "Harmonikler" #: data/ui/bass_enhancer.glade:266 data/ui/exciter.glade:271 msgid "Scope" msgstr "Kapsam" #: data/ui/bass_enhancer.glade:355 msgid "Floor" msgstr "Zemin" #: data/ui/exciter.glade:50 msgid "Exciter" msgstr "Uyarıcı" #: data/ui/exciter.glade:358 data/ui/maximizer.glade:159 msgid "Ceiling" msgstr "Tavan" #: data/ui/stereo_tools.glade:42 msgid "Stereo Tools" msgstr "Stereo Araçları" #: data/ui/stereo_tools.glade:207 msgid "Softclip" msgstr "Yumuşak kırpım" #: data/ui/stereo_tools.glade:231 data/ui/stereo_tools.glade:647 msgid "Balance" msgstr "Denge" #: data/ui/stereo_tools.glade:263 msgid "S/C Level" msgstr "S/C Seviye" #: data/ui/stereo_tools.glade:321 msgid "Side Level" msgstr "Seviye Tarafı" #: data/ui/stereo_tools.glade:372 msgid "Side Balance" msgstr "Denge Tarafı" #: data/ui/stereo_tools.glade:404 msgid "Middle Level" msgstr "Orta Seviye" #: data/ui/stereo_tools.glade:417 msgid "Middle Panorama" msgstr "Orta Panorama" #: data/ui/stereo_tools.glade:475 msgid "LR > LR (Stereo Default)" msgstr "LR > LR (Stereo Öntanımlı)" #: data/ui/stereo_tools.glade:476 msgid "LR > MS (Stereo to Mid-Side)" msgstr "LR > MS (Stereo Orta Tarafa)" #: data/ui/stereo_tools.glade:477 msgid "MS > LR (Mid-Side to Stereo)" msgstr "MS > LR (Orta Taraftan Stereo)" #: data/ui/stereo_tools.glade:478 msgid "LR > LL (Mono Left Channel)" msgstr "LR > LL (Mono Sol Kanal)" #: data/ui/stereo_tools.glade:479 msgid "LR > RR (Mono Right Channel)" msgstr "LR > RR (Mono Sağ Kanal)" #: data/ui/stereo_tools.glade:480 msgid "LR > L+R (Mono Sum L+R)" msgstr "LR > L+R (Mono İşlem L+R)" #: data/ui/stereo_tools.glade:481 msgid "LR > RL (Stereo Flip Channels)" msgstr "LR > RL (Stereo Kanalları Ters Çevir)" #: data/ui/stereo_tools.glade:498 msgid "Stereo Matrix" msgstr "Stereo Matris" #: data/ui/stereo_tools.glade:537 data/ui/stereo_tools.glade:578 msgid "Invert Phase" msgstr "Ters Faz" #: data/ui/stereo_tools.glade:679 msgid "Delay L/R" msgstr "Gecikme L/R" #: data/ui/stereo_tools.glade:713 msgid "Stereo Base" msgstr "Stereo Taban" #: data/ui/stereo_tools.glade:746 msgid "Stereo Phase" msgstr "Stereo Faz" #: data/ui/crossfeed.glade:59 msgid "Jmeier" msgstr "Jmeier" #: data/ui/crossfeed.glade:85 msgid "Cmoy" msgstr "Cmoy" #: data/ui/crossfeed.glade:122 msgid "Cutoff" msgstr "Kesici" #: data/ui/crossfeed.glade:155 msgid "Feed" msgstr "Akış" #: data/ui/crossfeed.glade:392 msgid "Crossfeed" msgstr "Çapraz Besleme" #: data/ui/maximizer.glade:29 msgid "Maximizer" msgstr "Yükseltici" #: data/ui/maximizer.glade:269 data/ui/gate.glade:190 msgid "Gain Reduction" msgstr "Kazanç Azaltma" #: data/ui/loudness.glade:196 msgid "Link" msgstr "Bağ" #: data/ui/gate.glade:31 msgid "Gate" msgstr "Aralık" #: data/ui/gate.glade:162 data/ui/deesser.glade:190 msgid "Detection" msgstr "Keşif" #: data/ui/gate.glade:176 msgid "Stereo Link" msgstr "Stereo Bağ" #: data/ui/gate.glade:235 msgid "Average" msgstr "Ortalama" #: data/ui/gate.glade:236 msgid "Maximum" msgstr "Azami" #: data/ui/gate.glade:667 data/ui/multiband_gate.glade:766 #: data/ui/multiband_gate.glade:1175 data/ui/multiband_gate.glade:1585 #: data/ui/multiband_gate.glade:1995 msgid "Gating" msgstr "Geçitleme" #: data/ui/multiband_gate.glade:70 msgid "Multiband Gate" msgstr "Çoklu Bant Geçitleme" #: data/ui/multiband_gate.glade:722 data/ui/multiband_gate.glade:1152 #: data/ui/multiband_gate.glade:1562 data/ui/multiband_gate.glade:1972 #: data/ui/deesser.glade:748 msgid "Reduction" msgstr "Azalım" #: data/ui/deesser.glade:61 msgid "Deesser" msgstr "Deesser" #: data/ui/deesser.glade:232 msgid "Wide" msgstr "Geniş" #: data/ui/deesser.glade:233 data/ui/deesser.glade:262 msgid "Split" msgstr "Ayır" #: data/ui/deesser.glade:381 msgid "Level" msgstr "Seviye" #: data/ui/deesser.glade:394 msgid "Peak Q" msgstr "Q Doruk" #: data/ui/deesser.glade:426 msgid "Laxity" msgstr "Gevşeklik" #: data/ui/deesser.glade:761 msgid "Detected" msgstr "Saptanan" #: data/ui/convolver.glade:24 msgid "Convolver" msgstr "Sarsıcı" #: data/ui/convolver.glade:101 msgid "Import Impulse" msgstr "Dürtü Dosyasını İçeri Al" #: data/ui/convolver.glade:105 msgid "Import Impulse Response File" msgstr "Dürtü Yanıt Dosyasını İçeri Aktar" #: data/ui/convolver.glade:221 msgid "L" msgstr "L" #: data/ui/convolver.glade:235 msgid "R" msgstr "R" #: data/ui/convolver.glade:298 msgid "Duration" msgstr "Süre" #: data/ui/convolver.glade:309 msgid "Samples" msgstr "Örnekler" #: data/ui/convolver.glade:342 src/convolver_ui.cpp:251 msgid "Impulse Response" msgstr "Dürtü Yanıtı" #: data/ui/convolver.glade:362 msgid "Select the impulse Response File" msgstr "Dürtü Yanıt Dosyasını Seç" #: data/ui/convolver.glade:382 src/spectrum_settings_ui.cpp:143 msgid "Spectrum" msgstr "Spektrum" #: data/ui/convolver.glade:423 msgid "Stereo Width" msgstr "Stereo Genişliği" #: data/ui/crystalizer.glade:48 msgid "Crystalizer" msgstr "Kristalleştirici" #: data/ui/crystalizer.glade:161 msgid "Aggressive Mode" msgstr "Agresif Kip" #: data/ui/crystalizer.glade:420 msgid "Loudness Range" msgstr "Yüksek Ses Aralığı" #: data/ui/crystalizer.glade:439 msgid "Before" msgstr "Öncesi" #: data/ui/crystalizer.glade:452 msgid "After" msgstr "Sonrası" #: data/ui/pitch.glade:36 msgid "Pitch" msgstr "Perde" #: data/ui/pitch.glade:142 msgid "Faster" msgstr "Daha Hızlı" #: data/ui/pitch.glade:156 msgid "Preserve Formant" msgstr "Biçimlendiriciyi Koru" #: data/ui/pitch.glade:180 msgid "Cents" msgstr "Küsür" #: data/ui/pitch.glade:211 msgid "Semitones" msgstr "Yarım Ses" #: data/ui/pitch.glade:242 msgid "Octaves" msgstr "Oktav" #: data/ui/pitch.glade:273 msgid "Crispness" msgstr "Canlılık" #: data/ui/webrtc.glade:30 msgid "Webrtc" msgstr "Webrtc" #: data/ui/webrtc.glade:137 data/ui/webrtc.glade:257 data/ui/webrtc.glade:327 #: data/ui/webrtc.glade:496 msgid "Enable" msgstr "Etkinleştir" #: data/ui/webrtc.glade:158 msgid "Extended Filter" msgstr "Genişletilmiş Süzgeç" #: data/ui/webrtc.glade:171 msgid "Delay Agnostic" msgstr "Agnostik Gecikme" #: data/ui/webrtc.glade:183 msgid "High Pass Filter" msgstr "Yüksek Geçiş Süzgeci" #: data/ui/webrtc.glade:212 data/ui/webrtc.glade:280 msgid "Suppresion Level" msgstr "Bastırma Seviyesi" #: data/ui/webrtc.glade:225 data/ui/webrtc.glade:293 data/ui/webrtc.glade:548 msgid "Low" msgstr "Düşük" #: data/ui/webrtc.glade:226 data/ui/webrtc.glade:294 data/ui/webrtc.glade:549 msgid "Moderate" msgstr "Ölçülü" #: data/ui/webrtc.glade:227 data/ui/webrtc.glade:295 data/ui/webrtc.glade:550 msgid "High" msgstr "Yüksek" #: data/ui/webrtc.glade:244 msgid "Echo Canceller" msgstr "Yankı Önleyici" #: data/ui/webrtc.glade:296 msgid "Very High" msgstr "Çok Yüksek" #: data/ui/webrtc.glade:313 msgid "Noise Suppressor" msgstr "Gürültü Baskılayıcı" #: data/ui/webrtc.glade:363 msgid "Adaptive Digital" msgstr "Dijital Uyarlamalı" #: data/ui/webrtc.glade:364 msgid "Fixed Digital" msgstr "Dijital Sabitleyici" #: data/ui/webrtc.glade:381 msgid "Gain Controller" msgstr "Kazanç Denetleyicisi" #: data/ui/webrtc.glade:419 msgid "Target Level" msgstr "Hedef Seviye" #: data/ui/webrtc.glade:448 msgid "Maximum Gain" msgstr "Azami Kazanç" #: data/ui/webrtc.glade:521 msgid "Detection Likelihood" msgstr "Algılama Olasılığı" #: data/ui/webrtc.glade:534 msgid "Frame Size" msgstr "Çerçeve Boyutu" #: data/ui/webrtc.glade:547 msgid "Very Low" msgstr "Çok Düşük" #: data/ui/webrtc.glade:584 msgid "Voice Detector" msgstr "Ses Dedektörü" #: data/ui/delay.glade:24 msgid "Delay" msgstr "Gecikme" #: data/ui/preset_row.glade:68 msgid "Save current settings to this preset file" msgstr "Geçerli ayarları bu ön ayar dosyasına kaydet" #: data/ui/preset_row.glade:84 msgid "Remove this preset file" msgstr "Hazır ayar dosyasını kaldır" #: data/ui/preset_row.glade:100 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "" "Şu anda kullanılan cihaz sisteme takılı olduğunda bu ön ayarı otomatik " "olarak uygula" #: data/ui/presets_menu.glade:86 data/ui/presets_menu.glade:195 #: src/presets_menu_ui.cpp:110 msgid "Import Presets" msgstr "Önayarları İçe Aktar" #: data/ui/calibration_signals.glade:64 msgid "Volume" msgstr "Ses" #: data/ui/calibration_signals.glade:108 msgid "Sine" msgstr "Sinüs" #: data/ui/calibration_signals.glade:109 msgid "Square" msgstr "Kare" #: data/ui/calibration_signals.glade:110 msgid "Saw" msgstr "Kesir" #: data/ui/calibration_signals.glade:111 msgid "Triangle" msgstr "Üçgen" #: data/ui/calibration_signals.glade:112 msgid "Silence" msgstr "Sessizlik" #: data/ui/calibration_signals.glade:113 msgid "White Noise" msgstr "Beyaz Gürültü" #: data/ui/calibration_signals.glade:114 msgid "Pink Noise" msgstr "Pembe Gürültü" #: data/ui/calibration_signals.glade:115 msgid "Sine Table" msgstr "Sinüs Tablosu" #: data/ui/calibration_signals.glade:116 msgid "Ticks" msgstr "İşaretler" #: data/ui/calibration_signals.glade:117 msgid "Gaussian Noise" msgstr "Gauss Gürültü" #: data/ui/calibration_signals.glade:118 msgid "Red Noise" msgstr "Kırmızı Gürültü" #: data/ui/calibration_signals.glade:119 msgid "Blue Noise" msgstr "Mavi Gürültü" #: data/ui/calibration_signals.glade:120 msgid "Violet Noise" msgstr "Menekşe Gürültü" #: data/ui/calibration_mic.glade:29 msgid "Window" msgstr "Pencere" #: data/ui/calibration_mic.glade:70 msgid "Measure Noise" msgstr "Gürültü Ölçümü" #: data/ui/calibration_mic.glade:99 msgid "Subtract Noise" msgstr "Gürültü Çıkar" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "PulseAudio Uygulamaları için Ses Efektleri" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Wellington Wallace" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects gelişmiş bir ses işleme aracıdır. Bir ekolayzır, sınırlayıcı, " "sıkıştırıcı ve yankılanma araçları içerir. Bunları tamamlamak için ayrıca " "bir spektrum analizörü bulunmaktadır." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "PulseEffects, varsayılan PulseAudio ses sunucusunu kullandığından, " "kullandığınız uygulamaların tümü olmasa da çoğu ile çalışacaktır. " "Desteklenen tüm uygulamalar, her birinin ayrı ayrı etkinleştirilebileceği " "ana pencerede sunulur." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "Ses çıkışını manipüle etmenin yanı sıra, PulseEffects, mikrofon gibi bir " "giriş cihazına da efektler uygulayabilir. Bu özellik ses kaydında da " "kullanışlıdır ve sesli konuşmalarda da iyi çalışır." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "PulseEffects başlatıldığında, son oturumda kullanılan ayarlamaları " "rahatlıkla hatırlayacaktır. Tüm mevcut ayarları profil olarak kaydetmek de " "mümkündür." #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "Sesi ayarla ve efektleri aç/kapat" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "Yerleşik ön ayarlara sahip bir ekolayzır içerir" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "Giriş Sınırlayıcı" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "Kalibrasyon" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "Ekolayzır, Sıkıştırıcı ve Diğer Ses Efektleri" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "" "sınırlayıcı,kompresör,yankı,ekolayzır,otomatikses;yükseltici;sıkıştırıcı;" #. Translators: This is an icon name, don't translate! #: data/com.github.wwmm.pulseeffects.desktop.in:10 msgid "pulseeffects" msgstr "pulseeffects" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:201 msgid "\"Presets\"" msgstr "\"Ön Ayarlar\"" #: src/application.cpp:19 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "PulseEffects'ten çık. Servis kipinde çalışırken kullanışlıdır." #: src/application.cpp:21 msgid "Show available presets." msgstr "Kullanılabilir hazır ayarları göster." #: src/application.cpp:24 msgid "Load a preset. Example: pulseeffects -l music" msgstr "Bir ön ayar yükle. Örnek: pulseeffects -l music" #: src/application.cpp:26 msgid "Reset PulseEffects." msgstr "PulseEffects’i Sıfırla." #: src/application.cpp:233 msgid "Output Presets: " msgstr "Çıkış Ön Ayarları: " #: src/application.cpp:241 msgid "Input Presets: " msgstr "Giriş Ön Ayarları: " #: src/effects_base_ui.cpp:27 msgid "Applications" msgstr "Uygulamalar" #: src/blocklist_settings_ui.cpp:71 msgid "Blocklist" msgstr "Karaliste" #: src/general_settings_ui.cpp:121 msgid "General" msgstr "Genel" #: src/pulse_settings_ui.cpp:138 msgid "Pulseaudio" msgstr "Pulseaudio" #: src/presets_menu_ui.cpp:111 src/convolver_ui.cpp:247 msgid "Open" msgstr "Aç" #: src/presets_menu_ui.cpp:111 src/convolver_ui.cpp:247 msgid "Cancel" msgstr "İptal" #: src/app_info_ui.cpp:85 msgid "paused" msgstr "durdurulmuş" #: src/app_info_ui.cpp:87 msgid "playing" msgstr "oynatılıyor" #: src/calibration_ui.cpp:171 msgid "Calibration Microphone" msgstr "Mikrofon Kalibrasyonu" #: src/convolver_ui.cpp:246 msgid "Import Impulse File" msgstr "Dürtü Dosyasını İçe Aktar" #: src/convolver_ui.cpp:290 src/convolver_ui.cpp:291 src/convolver_ui.cpp:293 msgid "Failed" msgstr "Başarısız" #: src/convolver_ui.cpp:295 msgid "Could Not Load The Impulse File" msgstr "Dürtü Dosyası Yüklenemedi" #: src/equalizer_ui.cpp:307 src/equalizer_ui.cpp:426 msgid "infinity" msgstr "sonsuzluk" easyeffects-4.8.7/po/zh_CN.po000066400000000000000000001217141424023573300160230ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pulseeffects package. # FIRST AUTHOR , YEAR. # eternal , 2020. # msgid "" msgstr "" "Project-Id-Version: pulseeffects\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-10-08 19:22+0200\n" "PO-Revision-Date: 2020-11-01 16:15+0800\n" "Last-Translator: eternal \n" "Language-Team: Chinese - China \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Gtranslator 3.38.0\n" "Plural-Forms: nplurals=1; plural=0\n" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:5 #: data/com.github.wwmm.pulseeffects.desktop.in:3 data/ui/application.glade:61 msgid "PulseEffects" msgstr "PulseEffects" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:8 #: data/com.github.wwmm.pulseeffects.desktop.in:5 msgid "Audio Effects for PulseAudio Applications" msgstr "PulseAudio 音频效果器" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:9 msgid "Wellington Wallace" msgstr "Wellington Wallace" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:11 msgid "" "PulseEffects is an advanced audio manipulation tools. It includes an " "equalizer, limiter, compressor and a reverberation tool, just to mention a " "few. To complement this there is also a built in spectrum analyzer." msgstr "" "PulseEffects 是一个高级音频处理工具。 它包括均衡器,限制器,压缩器和混响工" "具,等等。 比如,还有一个内置的频谱分析仪。" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:16 msgid "" "Because PulseEffects uses the default PulseAudio sound server it will work " "with most, if not all, applications you use. All supported applications are " "presented in the main window, where each can be enabled individually." msgstr "" "由于 PulseEffects 默认使用 PulseAudio 音频服务器,因此它将与您使用的大多数" "(并非全部)应用程序一起使用。 所有受支持的应用程序都显示在主窗口中,可以在其" "中单独启用每个应用程序。" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:22 msgid "" "Besides manipulating sound output, PulseEffects is able to apply effects to " "an input device, such as a microphone. This is, for example, useful in audio " "recording, but it also works well during voice conversations." msgstr "" "除了处理音频输出外,PulseEffects 还可以将效果应用于输入设备,例如麦克风。 例" "如,在录音时很有用,并在语音通话时也能很好地工作。" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:27 msgid "" "When PulseEffects is launched it will conveniently remember the " "configuration used in the last session. It is also possible to save all the " "current settings as profiles." msgstr "" "启动 PulseEffects 时,载入上一个会话中使用的配置。 也可以将所有当前设置另存为" "配置文件。" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:40 msgid "Set the volume and turn on/off effects" msgstr "设置音量并 打开/关闭音效" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:44 msgid "Includes an equalizer with built-in presets" msgstr "包含内置的均衡器配置" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:48 msgid "Input Limiter" msgstr "输入限制器" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:52 #: data/ui/compressor.glade:110 data/ui/compressor.glade:488 #: data/ui/webrtc.glade:540 msgid "Compressor" msgstr "压缩器" #: data/com.github.wwmm.pulseeffects.appdata.xml.in:56 msgid "Calibration" msgstr "校准校准" #: data/com.github.wwmm.pulseeffects.desktop.in:4 msgid "Equalizer, Compressor and Other Audio Effects" msgstr "均衡器, 压缩器和其他音效" #: data/com.github.wwmm.pulseeffects.desktop.in:6 msgid "limiter;compressor;reverberation;equalizer;autovolume;" msgstr "限制器;压缩器;混响;均衡器;自动音量;" #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:44 #: data/schemas/com.github.wwmm.pulseeffects.gschema.xml:47 msgid "\"Presets\"" msgstr "\"配置\"" #: data/ui/about.glade.in:11 msgid "Audio effects for PulseAudio applications" msgstr "PulseAudio 音频效果器" #: data/ui/app_button_row.glade:49 msgid "Applications" msgstr "程序" #: data/ui/app_info.glade:191 msgid "Add to Blocklist" msgstr "加入黑名单" #: data/ui/app_info.glade:226 msgid "Format" msgstr "格式" #: data/ui/app_info.glade:251 data/ui/convolver.glade:288 msgid "Rate" msgstr "速率" #: data/ui/app_info.glade:276 data/ui/pulse_info.glade:239 #: data/ui/stereo_tools.glade:659 msgid "Channels" msgstr "声道" #: data/ui/app_info.glade:301 msgid "Resampler" msgstr "重采样" #: data/ui/app_info.glade:326 data/ui/pulse_settings.glade:164 #: data/ui/pulse_settings.glade:263 data/ui/pulse_settings.glade:469 #: data/ui/pulse_settings.glade:568 msgid "Buffer" msgstr "缓冲" #: data/ui/app_info.glade:351 data/ui/pulse_settings.glade:195 #: data/ui/pulse_settings.glade:294 data/ui/pulse_settings.glade:481 #: data/ui/pulse_settings.glade:580 msgid "Latency" msgstr "延迟" #: data/ui/app_info.glade:376 msgid "State" msgstr "状态" #: data/ui/application.glade:142 src/calibration_ui.cpp:58 #: src/calibration_ui.cpp:183 msgid "Test Signals" msgstr "测试信号" #: data/ui/application.glade:157 msgid "Global Bypass" msgstr "全局旁路" #: data/ui/application.glade:172 data/ui/equalizer.glade:300 #: data/ui/general_settings.glade:253 msgid "Settings" msgstr "设置" #: data/ui/application.glade:194 msgid "Help" msgstr "帮助" #: data/ui/application.glade:217 data/ui/crossfeed.glade:49 #: data/ui/equalizer.glade:357 data/ui/filter.glade:254 #: data/ui/reverb.glade:311 src/presets_menu_ui.cpp:133 #: src/presets_menu_ui.cpp:286 src/presets_menu_ui.cpp:287 #: src/presets_menu_ui.cpp:304 src/presets_menu_ui.cpp:305 msgid "Presets" msgstr "配置" #: data/ui/autogain.glade:90 msgid "Auto Gain" msgstr "自动增益" #: data/ui/autogain.glade:172 msgid "Reset History" msgstr "清除记录" #: data/ui/autogain.glade:184 msgid "Detect Silence" msgstr "无声检测" #: data/ui/autogain.glade:196 msgid "Use Geometric Mean" msgstr "使用几何平均值" #: data/ui/autogain.glade:235 msgid "Target" msgstr "目标" #: data/ui/autogain.glade:284 data/ui/autogain.glade:689 msgid "Momentary" msgstr "瞬时" #: data/ui/autogain.glade:344 msgid "Weights" msgstr "权重" #: data/ui/autogain.glade:358 data/ui/autogain.glade:702 msgid "Short Term" msgstr "近期" #: data/ui/autogain.glade:407 data/ui/autogain.glade:715 msgid "Integrated" msgstr "综合" #: data/ui/autogain.glade:474 data/ui/autogain.glade:985 #: data/ui/bass_enhancer.glade:499 data/ui/compressor.glade:973 #: data/ui/convolver.glade:513 data/ui/crossfeed.glade:196 #: data/ui/crystalizer.glade:186 data/ui/deesser.glade:692 #: data/ui/delay.glade:236 data/ui/equalizer.glade:546 #: data/ui/exciter.glade:499 data/ui/filter.glade:415 data/ui/gate.glade:599 #: data/ui/limiter.glade:407 data/ui/loudness.glade:161 #: data/ui/loudness.glade:352 data/ui/maximizer.glade:264 #: data/ui/multiband_compressor.glade:1980 data/ui/multiband_gate.glade:2133 #: data/ui/pitch.glade:355 data/ui/presets_menu.glade:258 #: data/ui/reverb.glade:649 data/ui/stereo_tools.glade:334 #: data/ui/stereo_tools.glade:830 data/ui/webrtc.glade:685 msgid "Input" msgstr "输入" #: data/ui/autogain.glade:487 data/ui/autogain.glade:930 #: data/ui/bass_enhancer.glade:528 data/ui/compressor.glade:986 #: data/ui/convolver.glade:526 data/ui/crossfeed.glade:210 #: data/ui/crystalizer.glade:199 data/ui/deesser.glade:706 #: data/ui/delay.glade:249 data/ui/equalizer.glade:559 #: data/ui/exciter.glade:528 data/ui/filter.glade:428 data/ui/gate.glade:613 #: data/ui/limiter.glade:542 data/ui/loudness.glade:193 #: data/ui/loudness.glade:366 data/ui/maximizer.glade:278 #: data/ui/multiband_compressor.glade:789 #: data/ui/multiband_compressor.glade:1161 #: data/ui/multiband_compressor.glade:1534 #: data/ui/multiband_compressor.glade:1907 #: data/ui/multiband_compressor.glade:1993 data/ui/multiband_gate.glade:846 #: data/ui/multiband_gate.glade:1250 data/ui/multiband_gate.glade:1655 #: data/ui/multiband_gate.glade:2060 data/ui/multiband_gate.glade:2146 #: data/ui/pitch.glade:368 data/ui/presets_menu.glade:148 #: data/ui/reverb.glade:662 data/ui/stereo_tools.glade:800 #: data/ui/stereo_tools.glade:843 data/ui/webrtc.glade:699 msgid "Output" msgstr "输出" #: data/ui/autogain.glade:809 msgid "Relative" msgstr "相对值" #: data/ui/autogain.glade:822 data/ui/compressor.glade:1149 msgid "Gain" msgstr "增益" #: data/ui/autogain.glade:890 msgid "Loudness" msgstr "响度" #: data/ui/autogain.glade:944 msgid "Range" msgstr "范围" #: data/ui/autogain.glade:1014 data/ui/bass_enhancer.glade:674 #: data/ui/compressor.glade:1323 data/ui/convolver.glade:728 #: data/ui/crossfeed.glade:382 data/ui/crystalizer.glade:513 #: data/ui/deesser.glade:971 data/ui/delay.glade:451 #: data/ui/equalizer.glade:761 data/ui/equalizer_band.glade:186 #: data/ui/equalizer_band.glade:229 data/ui/exciter.glade:674 #: data/ui/filter.glade:630 data/ui/general_settings.glade:262 #: data/ui/gate.glade:837 data/ui/limiter.glade:672 data/ui/loudness.glade:578 #: data/ui/maximizer.glade:503 data/ui/multiband_compressor.glade:2195 #: data/ui/multiband_gate.glade:2348 data/ui/pitch.glade:570 #: data/ui/reverb.glade:864 data/ui/stereo_tools.glade:1045 #: data/ui/webrtc.glade:871 msgid "Reset" msgstr "重置" #: data/ui/autogain.glade:1038 msgid "Based on" msgstr "基于" #: data/ui/bass_enhancer.glade:116 msgid "Bass Enhancer" msgstr "低音增强" #: data/ui/bass_enhancer.glade:169 data/ui/compressor.glade:501 #: data/ui/deesser.glade:184 data/ui/exciter.glade:169 msgid "Listen" msgstr "聆听" #: data/ui/bass_enhancer.glade:212 data/ui/exciter.glade:213 msgid "3rd" msgstr "3次" #: data/ui/bass_enhancer.glade:225 data/ui/exciter.glade:226 msgid "2nd" msgstr "2次" #: data/ui/bass_enhancer.glade:237 data/ui/exciter.glade:238 msgid "Blend Harmonics" msgstr "谐波注入" #: data/ui/bass_enhancer.glade:265 data/ui/exciter.glade:267 #: data/ui/reverb.glade:405 msgid "Amount" msgstr "程度" #: data/ui/bass_enhancer.glade:277 data/ui/bass_enhancer.glade:407 #: data/ui/exciter.glade:279 data/ui/exciter.glade:407 msgid "Harmonics" msgstr "谐波" #: data/ui/bass_enhancer.glade:289 data/ui/exciter.glade:291 msgid "Scope" msgstr "范围" #: data/ui/bass_enhancer.glade:375 msgid "Floor" msgstr "下限" #: data/ui/bass_enhancer.glade:698 data/ui/compressor.glade:1347 #: data/ui/crossfeed.glade:406 data/ui/deesser.glade:995 #: data/ui/delay.glade:475 data/ui/equalizer.glade:785 #: data/ui/exciter.glade:698 data/ui/filter.glade:654 data/ui/gate.glade:861 #: data/ui/limiter.glade:696 data/ui/loudness.glade:547 #: data/ui/maximizer.glade:527 data/ui/multiband_compressor.glade:2219 #: data/ui/multiband_gate.glade:2372 data/ui/pitch.glade:594 #: data/ui/reverb.glade:888 data/ui/stereo_tools.glade:1069 #: data/ui/webrtc.glade:895 msgid "Provided by" msgstr "提供者" #: data/ui/blocklist_settings.glade:55 data/ui/blocklist_settings.glade:163 #: data/ui/presets_menu.glade:70 data/ui/presets_menu.glade:180 msgid "Create Preset" msgstr "保存配置" #: data/ui/blocklist_settings.glade:74 data/ui/blocklist_settings.glade:182 #: data/ui/presets_menu.glade:57 data/ui/presets_menu.glade:167 #: data/ui/pulse_info.glade:50 msgid "Name" msgstr "名称" #: data/ui/blocklist_settings.glade:87 msgid "Reconnect the microphone to apply new changes made to the Blocklist" msgstr "重新连接麦克风使新的黑名单列表生效" #: data/ui/blocklist_settings.glade:145 data/ui/pulse_settings.glade:386 msgid "Input Effects" msgstr "输入效果" #: data/ui/blocklist_settings.glade:242 msgid "Restart the player to apply new changes made to the Blocklist" msgstr "重启播放器使新的黑名单列表生效" #: data/ui/blocklist_settings.glade:253 data/ui/pulse_settings.glade:691 msgid "Output Effects" msgstr "输入效果" #: data/ui/blocklist_settings.glade:277 msgid "Show Blocklisted Apps in Main Tab" msgstr "在主面板上显示黑名单中的程序" #: data/ui/calibration_signals.glade:31 data/ui/equalizer_band.glade:157 #: data/ui/filter.glade:304 msgid "Frequency" msgstr "频率" #: data/ui/calibration_signals.glade:63 msgid "Volume" msgstr "音量" #: data/ui/calibration_signals.glade:107 msgid "Sine" msgstr "正弦波" #: data/ui/calibration_signals.glade:108 msgid "Square" msgstr "方波" #: data/ui/calibration_signals.glade:109 msgid "Saw" msgstr "锯齿波" #: data/ui/calibration_signals.glade:110 msgid "Triangle" msgstr "三角波" #: data/ui/calibration_signals.glade:111 msgid "Silence" msgstr "静音" #: data/ui/calibration_signals.glade:112 msgid "White Noise" msgstr "白噪声" #: data/ui/calibration_signals.glade:113 msgid "Pink Noise" msgstr "粉红噪声" #: data/ui/calibration_signals.glade:114 msgid "Sine Table" msgstr "正弦波表" #: data/ui/calibration_signals.glade:115 msgid "Ticks" msgstr "滴答声" #: data/ui/calibration_signals.glade:116 msgid "Gaussian Noise" msgstr "高斯噪声" #: data/ui/calibration_signals.glade:117 msgid "Red Noise" msgstr "红噪声" #: data/ui/calibration_signals.glade:118 msgid "Blue Noise" msgstr "蓝噪声" #: data/ui/calibration_signals.glade:119 msgid "Violet Noise" msgstr "紫噪声" #: data/ui/calibration_mic.glade:29 msgid "Window" msgstr "窗口" #: data/ui/calibration_mic.glade:70 msgid "Measure Noise" msgstr "检测噪音" #: data/ui/calibration_mic.glade:99 msgid "Subtract Noise" msgstr "降低噪音" #: data/ui/compressor.glade:292 data/ui/deesser.glade:345 #: data/ui/gate.glade:408 data/ui/maximizer.glade:152 #: data/ui/multiband_compressor.glade:609 #: data/ui/multiband_compressor.glade:978 #: data/ui/multiband_compressor.glade:1351 #: data/ui/multiband_compressor.glade:1724 data/ui/multiband_gate.glade:633 #: data/ui/multiband_gate.glade:1035 data/ui/multiband_gate.glade:1440 #: data/ui/multiband_gate.glade:1845 msgid "Threshold" msgstr "阈值" #: data/ui/compressor.glade:324 data/ui/deesser.glade:357 #: data/ui/gate.glade:442 data/ui/multiband_compressor.glade:641 #: data/ui/multiband_compressor.glade:1011 #: data/ui/multiband_compressor.glade:1384 #: data/ui/multiband_compressor.glade:1757 data/ui/multiband_gate.glade:665 #: data/ui/multiband_gate.glade:1068 data/ui/multiband_gate.glade:1473 #: data/ui/multiband_gate.glade:1878 msgid "Ratio" msgstr "比率" #: data/ui/compressor.glade:354 data/ui/gate.glade:474 #: data/ui/multiband_compressor.glade:671 #: data/ui/multiband_compressor.glade:1042 #: data/ui/multiband_compressor.glade:1415 #: data/ui/multiband_compressor.glade:1788 data/ui/multiband_gate.glade:695 #: data/ui/multiband_gate.glade:1099 data/ui/multiband_gate.glade:1504 #: data/ui/multiband_gate.glade:1909 msgid "Knee" msgstr "拐点" #: data/ui/compressor.glade:386 data/ui/deesser.glade:441 #: data/ui/gate.glade:508 data/ui/multiband_compressor.glade:703 #: data/ui/multiband_compressor.glade:1075 #: data/ui/multiband_compressor.glade:1448 #: data/ui/multiband_compressor.glade:1821 data/ui/multiband_gate.glade:727 #: data/ui/multiband_gate.glade:1132 data/ui/multiband_gate.glade:1537 #: data/ui/multiband_gate.glade:1942 msgid "Makeup" msgstr "补偿" #: data/ui/compressor.glade:419 data/ui/gate.glade:374 #: data/ui/limiter.glade:271 data/ui/maximizer.glade:176 #: data/ui/multiband_compressor.glade:577 #: data/ui/multiband_compressor.glade:945 #: data/ui/multiband_compressor.glade:1318 #: data/ui/multiband_compressor.glade:1691 data/ui/multiband_gate.glade:601 #: data/ui/multiband_gate.glade:1002 data/ui/multiband_gate.glade:1407 #: data/ui/multiband_gate.glade:1812 msgid "Release" msgstr "释放时间" #: data/ui/compressor.glade:431 data/ui/gate.glade:340 #: data/ui/multiband_compressor.glade:545 #: data/ui/multiband_compressor.glade:912 #: data/ui/multiband_compressor.glade:1285 #: data/ui/multiband_compressor.glade:1658 data/ui/multiband_gate.glade:569 #: data/ui/multiband_gate.glade:969 data/ui/multiband_gate.glade:1374 #: data/ui/multiband_gate.glade:1779 msgid "Attack" msgstr "起始时间" #: data/ui/compressor.glade:458 msgid "Downward" msgstr "向下" #: data/ui/compressor.glade:459 msgid "Upward" msgstr "向上" #: data/ui/compressor.glade:472 msgid "Compression Mode" msgstr "压缩模式" #: data/ui/compressor.glade:547 msgid "Pre-amplification" msgstr "前置放大" #: data/ui/compressor.glade:579 msgid "Reactivity" msgstr "响应" #: data/ui/compressor.glade:611 data/ui/limiter.glade:283 msgid "Lookahead" msgstr "预测时间" #: data/ui/compressor.glade:625 msgid "Feed-forward" msgstr "前馈式" #: data/ui/compressor.glade:626 msgid "Feed-back" msgstr "反馈式" #: data/ui/compressor.glade:639 data/ui/equalizer_band.glade:51 msgid "Type" msgstr "类型" #: data/ui/compressor.glade:653 data/ui/deesser.glade:640 #: data/ui/gate.glade:213 data/ui/multiband_compressor.glade:517 #: data/ui/multiband_compressor.glade:884 #: data/ui/multiband_compressor.glade:1257 #: data/ui/multiband_compressor.glade:1630 data/ui/multiband_gate.glade:541 #: data/ui/multiband_gate.glade:941 data/ui/multiband_gate.glade:1346 #: data/ui/multiband_gate.glade:1751 msgid "Peak" msgstr "峰值" #: data/ui/compressor.glade:654 data/ui/deesser.glade:639 #: data/ui/gate.glade:212 data/ui/multiband_compressor.glade:516 #: data/ui/multiband_compressor.glade:883 #: data/ui/multiband_compressor.glade:1256 #: data/ui/multiband_compressor.glade:1629 data/ui/multiband_gate.glade:540 #: data/ui/multiband_gate.glade:940 data/ui/multiband_gate.glade:1345 #: data/ui/multiband_gate.glade:1750 msgid "RMS" msgstr "均方根值" #: data/ui/compressor.glade:655 msgid "Low-Pass" msgstr "低通" #: data/ui/compressor.glade:656 msgid "Uniform" msgstr "均值" #: data/ui/compressor.glade:669 data/ui/deesser.glade:611 #: data/ui/equalizer.glade:161 data/ui/equalizer_band.glade:83 #: data/ui/multiband_compressor.glade:322 data/ui/multiband_gate.glade:346 #: data/ui/stereo_tools.glade:494 data/ui/webrtc.glade:393 msgid "Mode" msgstr "模式" #: data/ui/compressor.glade:683 msgid "Middle" msgstr "中央" #: data/ui/compressor.glade:684 msgid "Side" msgstr "侧边" #: data/ui/compressor.glade:685 data/ui/delay.glade:157 #: data/ui/equalizer.glade:476 data/ui/stereo_tools.glade:558 msgid "Left" msgstr "左" #: data/ui/compressor.glade:686 data/ui/delay.glade:189 #: data/ui/equalizer.glade:518 data/ui/stereo_tools.glade:627 msgid "Right" msgstr "右" #: data/ui/compressor.glade:699 msgid "Source" msgstr "源" #: data/ui/compressor.glade:715 data/ui/compressor.glade:1161 msgid "Sidechain" msgstr "侧链" #: data/ui/compressor.glade:812 msgid "Relative Release Threshold" msgstr "相对释放阈值" #: data/ui/compressor.glade:824 msgid "Boost Threshold" msgstr "提升阈值" #: data/ui/compressor.glade:836 msgid "High-pass Frequency" msgstr "高通频率" #: data/ui/compressor.glade:848 msgid "Low-pass Frequency" msgstr "低通频率" #: data/ui/compressor.glade:860 msgid "High-pass Filter Mode" msgstr "高通过滤模式" #: data/ui/compressor.glade:872 msgid "Low-pass Filter Mode" msgstr "低通过滤模式" #: data/ui/compressor.glade:886 data/ui/compressor.glade:904 #: data/ui/equalizer_band.glade:63 msgid "Off" msgstr "关" #: data/ui/compressor.glade:887 data/ui/compressor.glade:905 msgid "12 dB/oct" msgstr "" #: data/ui/compressor.glade:888 data/ui/compressor.glade:906 msgid "24 dB/oct" msgstr "" #: data/ui/compressor.glade:889 data/ui/compressor.glade:907 msgid "36 dB/oct" msgstr "" #: data/ui/compressor.glade:930 msgid "Advanced" msgstr "高级" #: data/ui/compressor.glade:1234 msgid "Curve" msgstr "压缩曲线" #: data/ui/convolver.glade:90 msgid "Convolver" msgstr "卷积混响器" #: data/ui/convolver.glade:125 msgid "Import Impulse" msgstr "导入 Impulse" #: data/ui/convolver.glade:129 msgid "Import Impulse Response File" msgstr "导入 impulse 解析文件" #: data/ui/convolver.glade:249 msgid "L" msgstr "左" #: data/ui/convolver.glade:263 msgid "R" msgstr "右" #: data/ui/convolver.glade:330 msgid "Duration" msgstr "持续时间" #: data/ui/convolver.glade:342 msgid "Samples" msgstr "样本" #: data/ui/convolver.glade:375 src/convolver_ui.cpp:293 msgid "Impulse Response" msgstr "Impulse 解析" #: data/ui/convolver.glade:398 msgid "Select the impulse Response File" msgstr "选择 impulse 解析文件" #: data/ui/convolver.glade:417 src/spectrum_settings_ui.cpp:195 msgid "Spectrum" msgstr "频谱" #: data/ui/convolver.glade:458 msgid "Stereo Width" msgstr "立体声宽度" #: data/ui/crossfeed.glade:63 msgid "Jmeier" msgstr "Jmeier" #: data/ui/crossfeed.glade:75 data/ui/filter.glade:183 data/ui/reverb.glade:259 msgid "Default" msgstr "默认" #: data/ui/crossfeed.glade:87 msgid "Cmoy" msgstr "Cmoy" #: data/ui/crossfeed.glade:117 msgid "Cutoff" msgstr "截止" #: data/ui/crossfeed.glade:148 msgid "Feed" msgstr "反馈" #: data/ui/crossfeed.glade:540 msgid "Crossfeed" msgstr "交叉反馈" #: data/ui/crystalizer.glade:90 msgid "Crystalizer" msgstr "" #: data/ui/crystalizer.glade:136 msgid "Aggressive Mode" msgstr "积极模式" #: data/ui/crystalizer.glade:400 msgid "Before" msgstr "原始" #: data/ui/crystalizer.glade:413 msgid "After" msgstr "当前" #: data/ui/crystalizer.glade:484 msgid "Loudness Range" msgstr "响度范围" #: data/ui/crystalizer_band.glade:28 data/ui/equalizer_band.glade:315 #: data/ui/stereo_tools.glade:583 data/ui/stereo_tools.glade:640 msgid "Mute" msgstr "静音静音" #: data/ui/crystalizer_band.glade:40 data/ui/multiband_compressor.glade:486 #: data/ui/multiband_compressor.glade:853 #: data/ui/multiband_compressor.glade:1226 #: data/ui/multiband_compressor.glade:1599 data/ui/multiband_gate.glade:510 #: data/ui/multiband_gate.glade:910 data/ui/multiband_gate.glade:1315 #: data/ui/multiband_gate.glade:1720 msgid "Bypass" msgstr "旁路" #: data/ui/deesser.glade:125 msgid "Deesser" msgstr "齿音消除" #: data/ui/deesser.glade:219 msgid "F1 Gain" msgstr "" #: data/ui/deesser.glade:231 msgid "F2 Level" msgstr "" #: data/ui/deesser.glade:243 msgid "F2 Peak Q" msgstr "" #: data/ui/deesser.glade:333 msgid "Laxity" msgstr "" #: data/ui/deesser.glade:494 msgid "F1 Split" msgstr "" #: data/ui/deesser.glade:506 msgid "F2 Peak" msgstr "" #: data/ui/deesser.glade:599 data/ui/gate.glade:198 msgid "Detection" msgstr "侦测" #: data/ui/deesser.glade:624 msgid "Wide" msgstr "宽频段" #: data/ui/deesser.glade:625 msgid "Split" msgstr "分割频段" #: data/ui/deesser.glade:868 data/ui/multiband_gate.glade:760 #: data/ui/multiband_gate.glade:1185 data/ui/multiband_gate.glade:1590 #: data/ui/multiband_gate.glade:1995 msgid "Reduction" msgstr "衰减" #: data/ui/deesser.glade:881 msgid "Detected" msgstr "已侦测到" #: data/ui/delay.glade:90 msgid "Delay" msgstr "延迟" #: data/ui/equalizer.glade:44 msgid "Equalizer" msgstr "均衡器" #: data/ui/equalizer.glade:173 msgid "Bands" msgstr "频段" #: data/ui/equalizer.glade:185 msgid "Split Channels" msgstr "分离声道" #: data/ui/equalizer.glade:199 msgid "IIR" msgstr "" #: data/ui/equalizer.glade:200 msgid "FIR" msgstr "" #: data/ui/equalizer.glade:201 msgid "FFT" msgstr "" #: data/ui/equalizer.glade:253 msgid "Flat Response" msgstr "平坦响应" #: data/ui/equalizer.glade:267 msgid "Calculate Frequencies" msgstr "频率响应" #: data/ui/equalizer.glade:280 msgid "Import APO Presets" msgstr "导入 APO 配置" #: data/ui/equalizer_band.glade:64 msgid "Bell" msgstr "带通" #: data/ui/equalizer_band.glade:65 msgid "High Pass" msgstr "" #: data/ui/equalizer_band.glade:66 msgid "High Shelf" msgstr "" #: data/ui/equalizer_band.glade:67 msgid "Low Pass" msgstr "" #: data/ui/equalizer_band.glade:68 msgid "Low Shelf" msgstr "" #: data/ui/equalizer_band.glade:69 msgid "Notch" msgstr "" #: data/ui/equalizer_band.glade:70 data/ui/filter.glade:336 msgid "Resonance" msgstr "共鸣" #: data/ui/equalizer_band.glade:95 msgid "RLC (BT)" msgstr "" #: data/ui/equalizer_band.glade:96 msgid "RLC (MT)" msgstr "" #: data/ui/equalizer_band.glade:97 msgid "BWC (BT)" msgstr "" #: data/ui/equalizer_band.glade:98 msgid "BWC (MT)" msgstr "" #: data/ui/equalizer_band.glade:99 msgid "LRX (BT)" msgstr "" #: data/ui/equalizer_band.glade:100 msgid "LRX (MT)" msgstr "" #: data/ui/equalizer_band.glade:101 msgid "APO (DR)" msgstr "" #: data/ui/equalizer_band.glade:114 msgid "Slope" msgstr "斜率" #: data/ui/equalizer_band.glade:202 msgid "Quality" msgstr "品质" #: data/ui/equalizer_band.glade:252 msgid "Width" msgstr "宽度" #: data/ui/equalizer_band.glade:303 data/ui/multiband_compressor.glade:499 #: data/ui/multiband_compressor.glade:866 #: data/ui/multiband_compressor.glade:1239 #: data/ui/multiband_compressor.glade:1612 data/ui/multiband_gate.glade:523 #: data/ui/multiband_gate.glade:923 data/ui/multiband_gate.glade:1328 #: data/ui/multiband_gate.glade:1733 msgid "Solo" msgstr "独奏" #: data/ui/equalizer_preset_row.glade:37 data/ui/irs_row.glade:59 msgid "Apply" msgstr "应用" #: data/ui/exciter.glade:116 msgid "Exciter" msgstr "激励器" #: data/ui/exciter.glade:375 data/ui/maximizer.glade:164 msgid "Ceiling" msgstr "上限" #: data/ui/filter.glade:97 msgid "Filter" msgstr "过滤器" #: data/ui/filter.glade:147 msgid "Muted" msgstr "已静音" #: data/ui/filter.glade:159 data/ui/reverb.glade:233 msgid "Disco" msgstr "舞厅" #: data/ui/filter.glade:171 msgid "Distant Headphones" msgstr "无线耳机" #: data/ui/filter.glade:270 msgid "12dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:271 msgid "24dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:272 msgid "36dB/oct Lowpass" msgstr "" #: data/ui/filter.glade:273 msgid "12dB/oct Highpass" msgstr "" #: data/ui/filter.glade:274 msgid "24dB/oct Highpass" msgstr "" #: data/ui/filter.glade:275 msgid "36dB/oct Highpass" msgstr "" #: data/ui/filter.glade:276 msgid "6dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:277 msgid "12dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:278 msgid "18dB/oct Bandpass" msgstr "" #: data/ui/filter.glade:279 msgid "6dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:280 msgid "12dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:281 msgid "18dB/oct Bandreject" msgstr "" #: data/ui/filter.glade:369 msgid "Inertia" msgstr "惯性" #: data/ui/general_settings.glade:52 msgid "Start Service at Login" msgstr "登录时启动服务" #: data/ui/general_settings.glade:76 msgid "Process All Outputs" msgstr "处理所有输出" #: data/ui/general_settings.glade:88 msgid "Process All Inputs" msgstr "处理所有输入" #: data/ui/general_settings.glade:124 msgid "Use Dark Theme" msgstr "使用暗色主题" #: data/ui/general_settings.glade:152 data/ui/general_settings.glade:214 msgid "Niceness" msgstr "Niceness" #: data/ui/general_settings.glade:153 msgid "Real Time" msgstr "Real Time" #: data/ui/general_settings.glade:154 msgid "None" msgstr "无" #: data/ui/general_settings.glade:202 msgid "Priority Type" msgstr "优先级别类型" #: data/ui/general_settings.glade:226 msgid "Priority" msgstr "Priority" #: data/ui/general_settings.glade:289 msgid "About" msgstr "关于" #: data/ui/gate.glade:97 msgid "Gate" msgstr "门限" #: data/ui/gate.glade:240 msgid "Maximum Gain Reduction" msgstr "最大增益衰减" #: data/ui/gate.glade:289 msgid "Stereo Link" msgstr "立体声连锁" #: data/ui/gate.glade:303 msgid "Average" msgstr "平均值" #: data/ui/gate.glade:304 msgid "Maximum" msgstr "最大值" #: data/ui/gate.glade:542 msgid "Input Level" msgstr "输入级别" #: data/ui/gate.glade:774 data/ui/multiband_gate.glade:806 #: data/ui/multiband_gate.glade:1210 data/ui/multiband_gate.glade:1615 #: data/ui/multiband_gate.glade:2020 msgid "Gating" msgstr "门控" #: data/ui/limiter.glade:96 data/ui/webrtc.glade:519 msgid "Limiter" msgstr "限制器" #: data/ui/limiter.glade:176 msgid "Automatic Smoothing Control" msgstr "自动平滑控制" #: data/ui/limiter.glade:188 msgid "Automatic Leveling" msgstr "自动调平" #: data/ui/limiter.glade:218 msgid "Limit" msgstr "限制" #: data/ui/limiter.glade:316 msgid "Oversampling" msgstr "超采样" #: data/ui/limiter.glade:353 msgid "ASC" msgstr "ASC" #: data/ui/limiter.glade:501 msgid "Attenuation" msgstr "衰减" #: data/ui/loudness.glade:90 msgid "Loudness Compensator" msgstr "响度补偿" #: data/ui/loudness.glade:136 msgid "Reference Signal" msgstr "参考信号" #: data/ui/loudness.glade:249 msgid "Standard" msgstr "标准" #: data/ui/loudness.glade:262 msgid "Flat" msgstr "平坦" #: data/ui/loudness.glade:263 msgid "ISO226-2003" msgstr "" #: data/ui/loudness.glade:264 msgid "Fletcher-Munson" msgstr "" #: data/ui/loudness.glade:265 msgid "Robinson-Dadson" msgstr "" #: data/ui/loudness.glade:291 msgid "FFT Size" msgstr "FFT 大小" #: data/ui/maximizer.glade:95 msgid "Maximizer" msgstr "最大化工具" #: data/ui/maximizer.glade:292 msgid "Gain Reduction" msgstr "增益衰减" #: data/ui/multiband_compressor.glade:139 msgid "Multiband Compressor" msgstr "多频段压缩器" #: data/ui/multiband_compressor.glade:336 data/ui/multiband_gate.glade:360 msgid "LR4" msgstr "" #: data/ui/multiband_compressor.glade:337 data/ui/multiband_gate.glade:361 msgid "LR8" msgstr "" #: data/ui/multiband_compressor.glade:351 data/ui/multiband_gate.glade:375 msgid "Split 1/2" msgstr "分割 1/2" #: data/ui/multiband_compressor.glade:364 data/ui/multiband_gate.glade:388 msgid "Split 2/3" msgstr "分割 2/3" #: data/ui/multiband_compressor.glade:377 data/ui/multiband_gate.glade:401 msgid "Split 3/4" msgstr "分割 3/4" #: data/ui/multiband_compressor.glade:749 #: data/ui/multiband_compressor.glade:1121 #: data/ui/multiband_compressor.glade:1494 #: data/ui/multiband_compressor.glade:1867 msgid "Compression" msgstr "压缩" #: data/ui/multiband_compressor.glade:832 data/ui/multiband_gate.glade:889 msgid "Sub Band" msgstr "子频" #: data/ui/multiband_compressor.glade:1204 data/ui/multiband_gate.glade:1293 msgid "Low Band" msgstr "低频" #: data/ui/multiband_compressor.glade:1577 data/ui/multiband_gate.glade:1698 msgid "Mid Band" msgstr "中频" #: data/ui/multiband_compressor.glade:1950 data/ui/multiband_gate.glade:2103 msgid "High Band" msgstr "高频" #: data/ui/multiband_gate.glade:139 msgid "Multiband Gate" msgstr "多频段门限" #: data/ui/pitch.glade:102 msgid "Pitch" msgstr "音高" #: data/ui/pitch.glade:180 msgid "Cents" msgstr "音分" #: data/ui/pitch.glade:209 msgid "Semitones" msgstr "半音" #: data/ui/pitch.glade:238 msgid "Octaves" msgstr "八度" #: data/ui/pitch.glade:267 msgid "Crispness" msgstr "清脆感" #: data/ui/pitch.glade:307 msgid "Faster" msgstr "快速" #: data/ui/pitch.glade:319 msgid "Preserve Formant" msgstr "共振保护" #: data/ui/preset_row.glade:52 msgid "Load" msgstr "加载" #: data/ui/preset_row.glade:69 msgid "Save current settings to this preset file" msgstr "将当前设置保存到配置文件" #: data/ui/preset_row.glade:85 msgid "Remove this preset file" msgstr "删除此配置文件" #: data/ui/preset_row.glade:101 msgid "" "Automatically apply this preset whenever the currently used device is " "plugged in the system" msgstr "新设备插入系统时,都会自动应用此配置" #: data/ui/presets_menu.glade:88 data/ui/presets_menu.glade:198 #: src/presets_menu_ui.cpp:129 msgid "Import Presets" msgstr "加载配置配置" #: data/ui/pulse_info.glade:77 msgid "Version" msgstr "版本" #: data/ui/pulse_info.glade:104 msgid "Default Sink" msgstr "默认输出设备" #: data/ui/pulse_info.glade:116 msgid "Default Source" msgstr "默认输入设备" #: data/ui/pulse_info.glade:158 msgid "Protocol" msgstr "协议" #: data/ui/pulse_info.glade:185 msgid "Default Sample Format" msgstr "默认样本格式" #: data/ui/pulse_info.glade:212 msgid "Default Sampling Rate" msgstr "默认采样率" #: data/ui/pulse_info.glade:266 msgid "Channel Mapping" msgstr "声道映射" #: data/ui/pulse_info.glade:291 msgid "Server" msgstr "服务器" #: data/ui/pulse_info.glade:336 msgid "Modules" msgstr "模块" #: data/ui/pulse_info.glade:382 msgid "Clients" msgstr "客户端" #: data/ui/pulse_info.glade:446 msgid "File" msgstr "文件" #: data/ui/pulse_info.glade:456 msgid "Configuration" msgstr "参数" #: data/ui/pulse_info.glade:489 msgid "Resamplers" msgstr "重采样" #: data/ui/pulse_settings.glade:103 data/ui/pulse_settings.glade:409 msgid "Use Default" msgstr "使用默认" #: data/ui/pulse_settings.glade:152 data/ui/pulse_settings.glade:457 msgid "Pipeline Input" msgstr "管道输入" #: data/ui/pulse_settings.glade:251 data/ui/pulse_settings.glade:556 msgid "Pipeline Output" msgstr "管道输出" #: data/ui/pulse_settings.glade:350 data/ui/pulse_settings.glade:655 msgid "Block Size" msgstr "缓冲区大小" #: data/ui/reverb.glade:130 msgid "Reverberation" msgstr "混响" #: data/ui/reverb.glade:181 msgid "Ambience" msgstr "氛围" #: data/ui/reverb.glade:194 msgid "Empty Walls" msgstr "空旷" #: data/ui/reverb.glade:207 msgid "Room" msgstr "房间" #: data/ui/reverb.glade:220 msgid "Large Empty Hall" msgstr "空荡的大厅" #: data/ui/reverb.glade:246 msgid "Large Occupied Hall" msgstr "拥挤的大厅" #: data/ui/reverb.glade:362 msgid "Pre Delay" msgstr "预延迟" #: data/ui/reverb.glade:374 msgid "Decay Time" msgstr "延迟时间" #: data/ui/reverb.glade:436 msgid "Dry" msgstr "干声" #: data/ui/reverb.glade:467 msgid "Bass Cut" msgstr "低切" #: data/ui/reverb.glade:515 msgid "Treble Cut" msgstr "高切" #: data/ui/reverb.glade:558 msgid "Diffusion" msgstr "扩散" #: data/ui/reverb.glade:570 msgid "Room Size" msgstr "房间大小" #: data/ui/reverb.glade:582 msgid "Small" msgstr "小" #: data/ui/reverb.glade:583 msgid "Medium" msgstr "中" #: data/ui/reverb.glade:584 msgid "Large" msgstr "大" #: data/ui/reverb.glade:585 msgid "Tunnel" msgstr "通道" #: data/ui/reverb.glade:586 msgid "Large/smooth" msgstr "大/平整" #: data/ui/reverb.glade:587 msgid "Experimental" msgstr "实验性" #: data/ui/reverb.glade:600 msgid "High Frequency Damping" msgstr "高频阻尼" #: data/ui/spectrum_settings.glade:77 msgid "Show Spectrum" msgstr "显示频谱" #: data/ui/spectrum_settings.glade:89 msgid "Fill" msgstr "填充频谱" #: data/ui/spectrum_settings.glade:125 msgid "Border" msgstr "显示边界" #: data/ui/spectrum_settings.glade:149 msgid "Use Custom Color" msgstr "自定义颜色" #: data/ui/spectrum_settings.glade:173 msgid "Use Gradient" msgstr "使用渐变" #: data/ui/spectrum_settings.glade:315 msgid "Points" msgstr "数量" #: data/ui/spectrum_settings.glade:327 msgid "Height" msgstr "高度" #: data/ui/spectrum_settings.glade:339 msgid "Line Width" msgstr "线宽" #: data/ui/spectrum_settings.glade:351 msgid "Sampling" msgstr "采样" #: data/ui/spectrum_settings.glade:363 msgid "Minimum Frequency" msgstr "最低频率" #: data/ui/spectrum_settings.glade:375 msgid "Maximum Frequency" msgstr "最高频率" #: data/ui/spectrum_settings.glade:410 msgid "Spectrum Type" msgstr "频谱类型" #: data/ui/spectrum_settings.glade:423 msgid "Bars" msgstr "柱状" #: data/ui/spectrum_settings.glade:424 msgid "Lines" msgstr "线型" #: data/ui/spectrum_settings.glade:437 msgid "Spectrum Color" msgstr "光谱颜色" #: data/ui/spectrum_settings.glade:449 msgid "Gradient Color" msgstr "渐变色" #: data/ui/spectrum_settings.glade:461 msgid "Axis Color" msgstr "轴标颜色" #: data/ui/stereo_tools.glade:108 msgid "Stereo Tools" msgstr "立体声工具" #: data/ui/stereo_tools.glade:244 data/ui/stereo_tools.glade:678 msgid "Balance" msgstr "平衡" #: data/ui/stereo_tools.glade:274 msgid "S/C Level" msgstr "S/C 级别" #: data/ui/stereo_tools.glade:313 msgid "Softclip" msgstr "柔化处理" #: data/ui/stereo_tools.glade:359 msgid "Side Level" msgstr "侧边级别" #: data/ui/stereo_tools.glade:408 msgid "Side Balance" msgstr "侧边平衡" #: data/ui/stereo_tools.glade:439 msgid "Middle Level" msgstr "中置级别" #: data/ui/stereo_tools.glade:451 msgid "Middle Panorama" msgstr "中置全景" #: data/ui/stereo_tools.glade:507 msgid "LR > LR (Stereo Default)" msgstr "LR > LR (默认立体声)" #: data/ui/stereo_tools.glade:508 msgid "LR > MS (Stereo to Mid-Side)" msgstr "LR > MS (立体声至中-侧)" #: data/ui/stereo_tools.glade:509 msgid "MS > LR (Mid-Side to Stereo)" msgstr "MS > LR (中-侧至立体声)" #: data/ui/stereo_tools.glade:510 msgid "LR > LL (Mono Left Channel)" msgstr "LR > LL (单声道左)" #: data/ui/stereo_tools.glade:511 msgid "LR > RR (Mono Right Channel)" msgstr "LR > RR (单声道右)" #: data/ui/stereo_tools.glade:512 msgid "LR > L+R (Mono Sum L+R)" msgstr "LR > L+R (单声道左右合并)" #: data/ui/stereo_tools.glade:513 msgid "LR > RL (Stereo Flip Channels)" msgstr "LR > RL (立体声翻转)" #: data/ui/stereo_tools.glade:530 msgid "Stereo Matrix" msgstr "立体声阵距" #: data/ui/stereo_tools.glade:571 data/ui/stereo_tools.glade:612 msgid "Invert Phase" msgstr "反转相位" #: data/ui/stereo_tools.glade:708 msgid "Delay L/R" msgstr "延迟 L/R" #: data/ui/stereo_tools.glade:740 msgid "Stereo Base" msgstr "立体声基线" #: data/ui/stereo_tools.glade:771 msgid "Stereo Phase" msgstr "立体声相位" #: data/ui/webrtc.glade:96 msgid "WebRTC" msgstr "即时通信" #: data/ui/webrtc.glade:166 data/ui/webrtc.glade:299 data/ui/webrtc.glade:370 #: data/ui/webrtc.glade:555 msgid "Enable" msgstr "启用" #: data/ui/webrtc.glade:189 msgid "Extended Filter" msgstr "扩展过滤器" #: data/ui/webrtc.glade:202 msgid "High Pass Filter" msgstr "高通过滤器" #: data/ui/webrtc.glade:219 data/ui/webrtc.glade:335 data/ui/webrtc.glade:605 msgid "Low" msgstr "低" #: data/ui/webrtc.glade:220 data/ui/webrtc.glade:336 data/ui/webrtc.glade:606 msgid "Moderate" msgstr "中等" #: data/ui/webrtc.glade:221 data/ui/webrtc.glade:337 data/ui/webrtc.glade:607 msgid "High" msgstr "高" #: data/ui/webrtc.glade:234 data/ui/webrtc.glade:322 msgid "Suppression Level" msgstr "抑制等级" #: data/ui/webrtc.glade:271 msgid "Delay Agnostic" msgstr "延迟" #: data/ui/webrtc.glade:285 msgid "Echo Canceller" msgstr "回音消除" #: data/ui/webrtc.glade:338 msgid "Very High" msgstr "非常高" #: data/ui/webrtc.glade:355 msgid "Noise Suppressor" msgstr "噪音抑制" #: data/ui/webrtc.glade:406 msgid "Adaptive Digital" msgstr "自动适应" #: data/ui/webrtc.glade:407 msgid "Fixed Digital" msgstr "固定值" #: data/ui/webrtc.glade:424 msgid "Gain Controller" msgstr "增益控制器" #: data/ui/webrtc.glade:450 msgid "Target Level" msgstr "目标等级" #: data/ui/webrtc.glade:481 msgid "Maximum Gain" msgstr "最大增益" #: data/ui/webrtc.glade:579 msgid "Detection Likelihood" msgstr "预侦测" #: data/ui/webrtc.glade:591 msgid "Frame Size" msgstr "帧大小" #: data/ui/webrtc.glade:604 msgid "Very Low" msgstr "非常低" #: data/ui/webrtc.glade:642 msgid "Voice Detector" msgstr "声音检测" #: src/app_info_ui.cpp:112 msgid "paused" msgstr "已暂停" #: src/app_info_ui.cpp:114 msgid "playing" msgstr "正在播放" #: src/application.cpp:38 msgid "Quit PulseEffects. Useful when running in service mode." msgstr "退出 PulseEffects。 在服务模式下运行时很有用。" #: src/application.cpp:40 msgid "Show available presets." msgstr "显示可用配置。" #: src/application.cpp:43 msgid "Load a preset. Example: pulseeffects -l music" msgstr "加载配置。 示例:pulseeffects -l music" #: src/application.cpp:45 msgid "Reset PulseEffects." msgstr "重设 PulseEffects。" #: src/application.cpp:48 msgid "Global bypass. 1 to enable, 2 to disable and 3 to get status" msgstr "全局旁路。 1 启用,2 禁用,3 获取状态" #: src/application.cpp:50 msgid "Hide the Window." msgstr "隐藏隐藏窗口。" #: src/application.cpp:284 msgid "Output Presets: " msgstr "输出设备: " #: src/application.cpp:292 msgid "Input Presets: " msgstr "输入设备: " #: src/blocklist_settings_ui.cpp:191 msgid "Blocklist" msgstr "黑名单" #: src/calibration_ui.cpp:190 msgid "Calibration Microphone" msgstr "校准麦克风" #: src/convolver_ui.cpp:289 msgid "Import Impulse File" msgstr "导入 Impulse 文件" #: src/convolver_ui.cpp:289 src/equalizer_ui.cpp:844 #: src/presets_menu_ui.cpp:129 msgid "Open" msgstr "打开" #: src/convolver_ui.cpp:289 src/equalizer_ui.cpp:844 #: src/presets_menu_ui.cpp:129 msgid "Cancel" msgstr "取消" #: src/convolver_ui.cpp:326 src/convolver_ui.cpp:327 src/convolver_ui.cpp:329 msgid "Failed" msgstr "失败" #: src/convolver_ui.cpp:331 msgid "Could Not Load The Impulse File" msgstr "无法加载 Impulse 文件" #: src/equalizer_ui.cpp:376 src/equalizer_ui.cpp:509 msgid "infinity" msgstr "" #: src/equalizer_ui.cpp:843 msgid "Import APO Preset File" msgstr "加载 APO 配置" #: src/equalizer_ui.cpp:848 msgid "APO Presets" msgstr "APO 配置" #: src/general_settings_ui.cpp:147 msgid "General" msgstr "通用" #: src/pulse_settings_ui.cpp:168 msgid "Pulseaudio" msgstr "PulseAudio" #~ msgid "Scale" #~ msgstr "比例" #~ msgid "Exponent" #~ msgstr "指数" #~ msgid "Input Gain" #~ msgstr "输入增益" #~ msgid "Reset Equalizer" #~ msgstr "重设均衡器" #~ msgid "PulseEffects was updated" #~ msgstr "PulseEffects 已经是最新版本" #~ msgid "" #~ "It is recommended to reset its configuration after an update. Do you want " #~ "to do this?" #~ msgstr "建议在更新后进行重设配置。是否执行此操作?" #~ msgid "Yes" #~ msgstr "是" #~ msgid "No" #~ msgstr "否" easyeffects-4.8.7/pulseeffects.code-workspace000066400000000000000000000037731424023573300213700ustar00rootroot00000000000000{ "folders": [ { "path": "." } ], "settings": { "mesonbuild.buildFolder": "_build", "mesonbuild.configureOnOpen": true, "mesonbuild.configureOptions": [ "--buildtype=debugoptimized", "--cpp_std=c++17" ], "editor.formatOnSave": true, "editor.rulers": [120], "files.associations": { "*.page": "xml", "*.tcc": "cpp", "iostream": "cpp", "cctype": "cpp", "clocale": "cpp", "cmath": "cpp", "csignal": "cpp", "cstdarg": "cpp", "cstddef": "cpp", "cstdio": "cpp", "cstdlib": "cpp", "cstring": "cpp", "ctime": "cpp", "cwchar": "cpp", "cwctype": "cpp", "array": "cpp", "atomic": "cpp", "strstream": "cpp", "bit": "cpp", "bitset": "cpp", "chrono": "cpp", "codecvt": "cpp", "complex": "cpp", "condition_variable": "cpp", "cstdint": "cpp", "deque": "cpp", "list": "cpp", "map": "cpp", "set": "cpp", "unordered_map": "cpp", "vector": "cpp", "exception": "cpp", "string_view": "cpp", "fstream": "cpp", "functional": "cpp", "future": "cpp", "initializer_list": "cpp", "iomanip": "cpp", "iosfwd": "cpp", "istream": "cpp", "limits": "cpp", "memory": "cpp", "mutex": "cpp", "new": "cpp", "numeric": "cpp", "optional": "cpp", "ostream": "cpp", "ratio": "cpp", "sstream": "cpp", "stdexcept": "cpp", "streambuf": "cpp", "string": "cpp", "system_error": "cpp", "thread": "cpp", "type_traits": "cpp", "tuple": "cpp", "typeindex": "cpp", "typeinfo": "cpp", "utility": "cpp", "valarray": "cpp", "variant": "cpp", "algorithm": "cpp", "hash_map": "cpp", "iterator": "cpp", "memory_resource": "cpp", "random": "cpp", "cfenv": "cpp", "cinttypes": "cpp" }, "xml.format.joinContentLines": true } } easyeffects-4.8.7/src/000077500000000000000000000000001424023573300146255ustar00rootroot00000000000000easyeffects-4.8.7/src/adapter/000077500000000000000000000000001424023573300162455ustar00rootroot00000000000000easyeffects-4.8.7/src/adapter/README.md000066400000000000000000000003411424023573300175220ustar00rootroot00000000000000# PulseEffects Buffer Size Adapter Simple plugin that gives output buffers with the desired number of samples. You can test this plugin from command line executing: `gst-launch-1.0 -v audiotestsrc ! peadapter ! pulsesink` easyeffects-4.8.7/src/adapter/gstpeadapter.cpp000066400000000000000000000310331424023573300214340ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "gstpeadapter.hpp" #include #include "config.h" #include "util.hpp" GST_DEBUG_CATEGORY_STATIC(peadapter_debug); #define GST_CAT_DEFAULT (peadapter_debug) static void gst_peadapter_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec); static void gst_peadapter_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec); static GstFlowReturn gst_peadapter_chain(GstPad* pad, GstObject* parent, GstBuffer* buffer); static gboolean gst_peadapter_sink_event(GstPad* pad, GstObject* parent, GstEvent* event); static GstStateChangeReturn gst_peadapter_change_state(GstElement* element, GstStateChange transition); static gboolean gst_peadapter_src_query(GstPad* pad, GstObject* parent, GstQuery* query); static void gst_peadapter_finalize(GObject* object); static GstFlowReturn gst_peadapter_process(GstPeadapter* peadapter); static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS("audio/x-raw,format=F32LE,rate=[1,max]," "channels=2,layout=interleaved")); static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS("audio/x-raw,format=F32LE,rate=[1,max]," "channels=2,layout=interleaved")); enum { PROP_BLOCKSIZE = 1 }; enum { BLOCKSIZE_64 = 64, BLOCKSIZE_128 = 128, BLOCKSIZE_256 = 256, BLOCKSIZE_480 = 480, BLOCKSIZE_512 = 512, BLOCKSIZE_1024 = 1024, BLOCKSIZE_2048 = 2048, BLOCKSIZE_4096 = 4096 }; #define GST_TYPE_PEADAPTER_BLOCKSIZE (gst_peadapter_blocksize_get_type()) static GType gst_peadapter_blocksize_get_type(void) { static GType gtype = 0; if (gtype == 0) { static const GEnumValue values[] = {{BLOCKSIZE_64, "Block size 64", "64"}, {BLOCKSIZE_128, "Block size 128", "128"}, {BLOCKSIZE_256, "Block size 256", "256"}, {BLOCKSIZE_480, "Block size 480", "480"}, {BLOCKSIZE_512, "Block size 512 (default)", "512"}, {BLOCKSIZE_1024, "Block size 1024", "1024"}, {BLOCKSIZE_2048, "Block size 2048", "2048"}, {BLOCKSIZE_4096, "Block size 4096", "4096"}, {0, NULL, NULL}}; gtype = g_enum_register_static("GstPeadapterBlockSize", values); } return gtype; } #define gst_peadapter_parent_class parent_class G_DEFINE_TYPE_WITH_CODE(GstPeadapter, gst_peadapter, GST_TYPE_ELEMENT, GST_DEBUG_CATEGORY_INIT(peadapter_debug, "peadapter", 0, "Peadapter")); static void gst_peadapter_class_init(GstPeadapterClass* klass) { GObjectClass* gobject_class; GstElementClass* gstelement_class; gobject_class = (GObjectClass*)klass; gstelement_class = (GstElementClass*)(klass); gobject_class->set_property = gst_peadapter_set_property; gobject_class->get_property = gst_peadapter_get_property; gst_element_class_add_static_pad_template(gstelement_class, &srctemplate); gst_element_class_add_static_pad_template(gstelement_class, &sinktemplate); gstelement_class->change_state = gst_peadapter_change_state; gobject_class->finalize = gst_peadapter_finalize; gst_element_class_set_static_metadata(gstelement_class, "Peadapter element", "Filter", "Allows to change the buffer size", "Wellington "); g_object_class_install_property( gobject_class, PROP_BLOCKSIZE, g_param_spec_enum("blocksize", "Block Size", "Number of Samples in the Audio Buffer", GST_TYPE_PEADAPTER_BLOCKSIZE, BLOCKSIZE_512, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } static void gst_peadapter_init(GstPeadapter* peadapter) { peadapter->rate = -1; peadapter->bpf = -1; peadapter->blocksize = 512; peadapter->inbuf_n_samples = -1; peadapter->flag_discont = false; peadapter->adapter = gst_adapter_new(); peadapter->srcpad = gst_pad_new_from_static_template(&srctemplate, "src"); /* configure event function on the pad before adding the pad to the element */ gst_pad_set_query_function(peadapter->srcpad, gst_peadapter_src_query); gst_element_add_pad(GST_ELEMENT(peadapter), peadapter->srcpad); peadapter->sinkpad = gst_pad_new_from_static_template(&sinktemplate, "sink"); gst_pad_set_chain_function(peadapter->sinkpad, GST_DEBUG_FUNCPTR(gst_peadapter_chain)); gst_pad_set_event_function(peadapter->sinkpad, GST_DEBUG_FUNCPTR(gst_peadapter_sink_event)); gst_element_add_pad(GST_ELEMENT(peadapter), peadapter->sinkpad); } static void gst_peadapter_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec) { GstPeadapter* peadapter = GST_PEADAPTER(object); switch (prop_id) { case PROP_BLOCKSIZE: { peadapter->blocksize = g_value_get_enum(value); gst_element_post_message(GST_ELEMENT_CAST(peadapter), gst_message_new_latency(GST_OBJECT_CAST(peadapter))); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static void gst_peadapter_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec) { GstPeadapter* peadapter = GST_PEADAPTER(object); switch (prop_id) { case PROP_BLOCKSIZE: g_value_set_enum(value, peadapter->blocksize); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static GstFlowReturn gst_peadapter_chain(GstPad* pad, GstObject* parent, GstBuffer* buffer) { GstPeadapter* peadapter = GST_PEADAPTER(parent); GstFlowReturn ret = GST_FLOW_OK; if (GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DISCONT)) { gst_adapter_clear(peadapter->adapter); peadapter->inbuf_n_samples = -1; peadapter->flag_discont = true; } if (peadapter->inbuf_n_samples == -1) { GstMapInfo map; gst_buffer_map(buffer, &map, GST_MAP_READ); peadapter->inbuf_n_samples = static_cast(map.size) / peadapter->bpf; util::debug("peadapter: input block size " + std::to_string(peadapter->inbuf_n_samples) + " frames"); util::debug("peadapter: we will read in chunks of " + std::to_string(peadapter->blocksize) + " frames"); gst_buffer_unmap(buffer, &map); } gst_adapter_push(peadapter->adapter, buffer); ret = gst_peadapter_process(peadapter); return ret; } static GstFlowReturn gst_peadapter_process(GstPeadapter* peadapter) { GstFlowReturn ret = GST_FLOW_OK; gsize nbytes = peadapter->blocksize * peadapter->bpf; auto duration = GST_FRAMES_TO_CLOCK_TIME(peadapter->blocksize, peadapter->rate); while (gst_adapter_available(peadapter->adapter) > nbytes && (ret == GST_FLOW_OK)) { GstBuffer* b = gst_adapter_take_buffer(peadapter->adapter, nbytes); if (b != nullptr) { b = gst_buffer_make_writable(b); GST_BUFFER_OFFSET(b) = gst_adapter_prev_offset(peadapter->adapter, nullptr); GST_BUFFER_PTS(b) = gst_adapter_prev_pts(peadapter->adapter, nullptr); GST_BUFFER_DURATION(b) = duration; if (peadapter->flag_discont) { gst_buffer_set_flags(b, GST_BUFFER_FLAG_DISCONT); gst_buffer_set_flags(b, GST_BUFFER_FLAG_RESYNC); peadapter->flag_discont = false; } else { gst_buffer_unset_flags(b, GST_BUFFER_FLAG_DISCONT); } gst_buffer_set_flags(b, GST_BUFFER_FLAG_NON_DROPPABLE); gst_buffer_set_flags(b, GST_BUFFER_FLAG_LIVE); ret = gst_pad_push(peadapter->srcpad, b); } } return ret; } static gboolean gst_peadapter_sink_event(GstPad* pad, GstObject* parent, GstEvent* event) { GstPeadapter* peadapter = GST_PEADAPTER(parent); gboolean ret = true; switch (GST_EVENT_TYPE(event)) { case GST_EVENT_CAPS: { GstCaps* caps; GstAudioInfo info; gst_event_parse_caps(event, &caps); gst_audio_info_from_caps(&info, caps); peadapter->rate = GST_AUDIO_INFO_RATE(&info); peadapter->bpf = GST_AUDIO_INFO_BPF(&info); /* push the event downstream */ ret = gst_pad_push_event(peadapter->srcpad, event); break; } case GST_EVENT_FLUSH_START: { gst_peadapter_process(peadapter); gst_adapter_clear(peadapter->adapter); peadapter->inbuf_n_samples = -1; ret = gst_pad_push_event(peadapter->srcpad, event); break; } case GST_EVENT_EOS: { gst_peadapter_process(peadapter); gst_adapter_clear(peadapter->adapter); peadapter->inbuf_n_samples = -1; ret = gst_pad_push_event(peadapter->srcpad, event); break; } default: ret = gst_pad_push_event(peadapter->srcpad, event); break; } return ret; } static GstStateChangeReturn gst_peadapter_change_state(GstElement* element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstPeadapter* peadapter = GST_PEADAPTER(element); /*up changes*/ switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; default: break; } /*down changes*/ ret = GST_ELEMENT_CLASS(parent_class)->change_state(element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: { gst_adapter_clear(peadapter->adapter); peadapter->inbuf_n_samples = -1; break; } default: break; } return ret; } static gboolean gst_peadapter_src_query(GstPad* pad, GstObject* parent, GstQuery* query) { GstPeadapter* peadapter = GST_PEADAPTER(parent); bool ret = true; switch (GST_QUERY_TYPE(query)) { case GST_QUERY_LATENCY: { if (peadapter->rate > 0) { ret = gst_pad_peer_query(peadapter->sinkpad, query); if (ret && peadapter->inbuf_n_samples != -1 && peadapter->inbuf_n_samples < peadapter->blocksize) { GstClockTime min = 0; GstClockTime max = 0; gboolean live = 0; gst_query_parse_latency(query, &live, &min, &max); /* add our own latency */ auto frame_difference = peadapter->blocksize - peadapter->inbuf_n_samples; if (frame_difference > 0) { auto latency = gst_util_uint64_scale_round(frame_difference, GST_SECOND, peadapter->rate); min += latency; if (max != GST_CLOCK_TIME_NONE) { max += latency; } } gst_query_set_latency(query, live, min, max); } } else { ret = false; } break; } default: /* just call the default handler */ ret = gst_pad_query_default(pad, parent, query); break; } return ret; } void gst_peadapter_finalize(GObject* object) { GstPeadapter* peadapter = GST_PEADAPTER(object); GST_DEBUG_OBJECT(peadapter, "finalize"); gst_adapter_clear(peadapter->adapter); g_object_unref(peadapter->adapter); /* clean up object here */ G_OBJECT_CLASS(gst_peadapter_parent_class)->finalize(object); } static gboolean plugin_init(GstPlugin* plugin) { /* FIXME Remember to set the rank if it's an element that is meant to be autoplugged by decodebin. */ return gst_element_register(plugin, "peadapter", GST_RANK_NONE, GST_TYPE_PEADAPTER); } GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, peadapter, "PulseEffects Buffer Adapter", plugin_init, VERSION, "LGPL", PACKAGE, "https://github.com/wwmm/pulseeffects") easyeffects-4.8.7/src/adapter/gstpeadapter.hpp000066400000000000000000000036261424023573300214500ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef GST_PEADAPTER_HPP #define GST_PEADAPTER_HPP #include #include G_BEGIN_DECLS #define GST_TYPE_PEADAPTER (gst_peadapter_get_type()) #define GST_PEADAPTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_PEADAPTER, GstPeadapter)) #define GST_PEADAPTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_PEADAPTER, GstPeadapterClass)) #define GST_IS_PEADAPTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_PEADAPTER)) #define GST_IS_PEADAPTER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_PEADAPTER)) /** * GstPeadapter: * * The private peadapter structure */ struct GstPeadapter { GstElement parent; /* properties */ int blocksize; // number of samples in the outout buffer /*< private >*/ int rate; // sampling rate int bpf; // bytes per frame : channels * bps int inbuf_n_samples; // number of samples in the input buffer bool flag_discont; GstAdapter* adapter = nullptr; GstPad* srcpad = nullptr; GstPad* sinkpad = nullptr; }; struct GstPeadapterClass { GstElementClass parent_class; }; G_GNUC_INTERNAL GType gst_peadapter_get_type(void); G_END_DECLS #endif easyeffects-4.8.7/src/adapter/meson.build000066400000000000000000000006471424023573300204160ustar00rootroot00000000000000plugin_sources = [ 'gstpeadapter.cpp', '../util.cpp' ] plugin_deps = [ dependency('gstreamer-1.0'), dependency('gstreamer-base-1.0'), dependency('gstreamer-controller-1.0'), dependency('gstreamer-audio-1.0') ] library( 'gstpeadapter', plugin_sources, include_directories : [include_dir,config_h_dir], dependencies : plugin_deps, install: true, install_dir : plugins_install_dir, cpp_args: plugins_cxx_args ) easyeffects-4.8.7/src/app_info_ui.cpp000066400000000000000000000153031424023573300176230ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "app_info_ui.hpp" std::locale AppInfoUi::global_locale = util::get_global_locale(); AppInfoUi::AppInfoUi(BaseObjectType* cobject, const Glib::RefPtr& builder, std::shared_ptr info, PulseManager* pulse_manager) : Gtk::Grid(cobject), app_info(std::move(info)), pm(pulse_manager) { // loading glade widgets builder->get_widget("enable", enable); builder->get_widget("app_icon", app_icon); builder->get_widget("app_name", app_name); builder->get_widget("media_name", media_name); builder->get_widget("volume", volume); builder->get_widget("mute", mute); builder->get_widget("blocklist", blocklist); builder->get_widget("mute_icon", mute_icon); builder->get_widget("format", format); builder->get_widget("rate", rate); builder->get_widget("channels", channels); builder->get_widget("resampler", resampler); builder->get_widget("buffer", buffer); builder->get_widget("latency", latency); builder->get_widget("state", state); is_blocklisted = BlocklistSettingsUi::app_is_blocklisted( app_info->name, (app_info->app_type == "sink_input") ? PresetType::output : PresetType::input); is_enabled = app_info->connected && !is_blocklisted; init_widgets(); connect_signals(); if (app_info->app_type == "sink_input") { timeout_connection = Glib::signal_timeout().connect_seconds( [&]() { if (app_info != nullptr) { if (app_info->wants_to_play) { pm->get_sink_input_info(app_info->index); } } return running; }, 5); } } AppInfoUi::~AppInfoUi() { running = false; timeout_connection.disconnect(); util::debug(log_tag + app_info->name + " info ui destroyed"); } void AppInfoUi::init_widgets() { const float ms_factor = 0.001F; enable->set_active(is_enabled && !is_blocklisted); enable->set_sensitive(!is_blocklisted); blocklist->set_active(is_blocklisted); app_icon->set_from_icon_name(app_info->icon_name, Gtk::ICON_SIZE_BUTTON); app_name->set_text(app_info->name); if (app_info->name == app_info->media_name || app_info->media_name.empty()) { media_name->set_visible(false); } else { media_name->set_visible(true); media_name->set_text(app_info->media_name); } volume->set_value(app_info->volume); mute->set_active(app_info->mute != 0); format->set_text(app_info->format); rate->set_text(std::to_string(app_info->rate) + " Hz"); channels->set_text(std::to_string(app_info->channels)); resampler->set_text(app_info->resampler); buffer->set_text(float_to_localized_string(app_info->buffer * ms_factor, 1) + " ms"); latency->set_text(float_to_localized_string(app_info->latency * ms_factor, 1) + " ms"); if (app_info->corked != 0) { state->set_text(_("paused")); } else { state->set_text(_("playing")); } } void AppInfoUi::connect_signals() { enable_connection = enable->signal_state_set().connect(sigc::mem_fun(*this, &AppInfoUi::on_enable_app), false); volume_connection = volume->signal_value_changed().connect(sigc::mem_fun(*this, &AppInfoUi::on_volume_changed)); mute_connection = mute->signal_toggled().connect(sigc::mem_fun(*this, &AppInfoUi::on_mute)); blocklist_connection = blocklist->signal_clicked().connect([=]() { PresetType preset_type = (app_info->app_type == "sink_input") ? PresetType::output : PresetType::input; if (blocklist->get_active()) { // Add new entry to blocklist vector BlocklistSettingsUi::add_new_entry(app_info->name, preset_type); pre_bl_state = is_enabled; is_blocklisted = true; if (is_enabled) { enable->set_active(false); } enable->set_sensitive(false); } else { // Remove app name entry from blocklist vector BlocklistSettingsUi::remove_entry(app_info->name, preset_type); is_blocklisted = false; enable->set_sensitive(true); if (pre_bl_state) { enable->set_active(true); } } }); } auto AppInfoUi::on_enable_app(bool state) -> bool { bool success = false; if (state) { if (app_info->app_type == "sink_input") { success = pm->move_sink_input_to_pulseeffects(app_info->name, app_info->index); } else { success = pm->move_source_output_to_pulseeffects(app_info->name, app_info->index); } } else { if (app_info->app_type == "sink_input") { success = pm->remove_sink_input_from_pulseeffects(app_info->name, app_info->index); } else { success = pm->remove_source_output_from_pulseeffects(app_info->name, app_info->index); } } if (success) { is_enabled = state; } return false; } void AppInfoUi::on_volume_changed() { auto value = volume->get_value(); if (app_info->app_type == "sink_input") { pm->set_sink_input_volume(app_info->name, app_info->index, app_info->channels, value); } else { pm->set_source_output_volume(app_info->name, app_info->index, app_info->channels, value); } } void AppInfoUi::on_mute() { bool state = mute->get_active(); if (state) { mute_icon->set_from_icon_name("audio-volume-muted-symbolic", Gtk::ICON_SIZE_BUTTON); volume->set_sensitive(false); } else { mute_icon->set_from_icon_name("audio-volume-high-symbolic", Gtk::ICON_SIZE_BUTTON); volume->set_sensitive(true); } if (app_info->app_type == "sink_input") { pm->set_sink_input_mute(app_info->name, app_info->index, state); } else { pm->set_source_output_mute(app_info->name, app_info->index, state); } } void AppInfoUi::update(const std::shared_ptr& info) { app_info = info; enable_connection.disconnect(); volume_connection.disconnect(); mute_connection.disconnect(); blocklist_connection.disconnect(); init_widgets(); connect_signals(); } auto AppInfoUi::float_to_localized_string(const float& value, const int& places) -> std::string { std::ostringstream msg; msg.imbue(global_locale); msg.precision(places); msg << std::fixed << value; return msg.str(); } easyeffects-4.8.7/src/application.cpp000066400000000000000000000256271424023573300176500ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "application.hpp" #include #include #include #include #include "application_ui.hpp" #include "config.h" #include "pulse_manager.hpp" #include "util.hpp" Application::Application() : Gtk::Application("com.github.wwmm.pulseeffects", Gio::APPLICATION_HANDLES_COMMAND_LINE) { Glib::set_application_name("PulseEffects"); Glib::setenv("PULSE_PROP_application.id", "com.github.wwmm.pulseeffects"); Glib::setenv("PULSE_PROP_application.icon_name", "pulseeffects"); signal_handle_local_options().connect(sigc::mem_fun(*this, &Application::on_handle_local_options), false); add_main_option_entry(Gio::Application::OPTION_TYPE_BOOL, "quit", 'q', _("Quit PulseEffects. Useful when running in service mode.")); add_main_option_entry(Gio::Application::OPTION_TYPE_BOOL, "presets", 'p', _("Show available presets.")); add_main_option_entry(Gio::Application::OPTION_TYPE_STRING, "load-preset", 'l', _("Load a preset. Example: pulseeffects -l music")); add_main_option_entry(Gio::Application::OPTION_TYPE_BOOL, "reset", 'r', _("Reset PulseEffects.")); add_main_option_entry(Gio::Application::OPTION_TYPE_INT, "bypass", 'b', _("Global bypass. 1 to enable, 2 to disable and 3 to get status")); add_main_option_entry(Gio::Application::OPTION_TYPE_BOOL, "hide-window", 'w', _("Hide the Window.")); } Application::~Application() { util::debug(log_tag + " destroyed"); } auto Application::create() -> Glib::RefPtr { return Glib::RefPtr(new Application()); } auto Application::on_command_line(const Glib::RefPtr& command_line) -> int { auto options = command_line->get_options_dict(); if (options->contains("quit")) { for (const auto& w : get_windows()) { w->hide(); } quit(); } else if (options->contains("load-preset")) { Glib::ustring name; if (!options->lookup_value("load-preset", name)) { util::debug(log_tag + "failed to load preset: " + name); } else { if (presets_manager->preset_file_exists(PresetType::input, name)) { presets_manager->load(PresetType::input, name); } if (presets_manager->preset_file_exists(PresetType::output, name)) { presets_manager->load(PresetType::output, name); } } } else if (options->contains("reset")) { settings->reset(""); util::info(log_tag + "All settings were reset"); } else if (options->contains("hide-window")) { util::info(log_tag + "Hiding the window..."); for (const auto& w : get_windows()) { w->hide(); } } else if (options->contains("bypass")) { int bypass_arg = 2; if (options->lookup_value("bypass", bypass_arg)) { if (bypass_arg == 1) { settings->set_boolean("bypass", true); } else if (bypass_arg == 2) { settings->set_boolean("bypass", false); } } } else { activate(); } return Gtk::Application::on_command_line(command_line); } void Application::on_startup() { Gtk::Application::on_startup(); util::debug(log_tag + "PE version: " + std::string(VERSION)); settings = Gio::Settings::create("com.github.wwmm.pulseeffects"); if ((get_flags() & Gio::ApplicationFlags::APPLICATION_IS_SERVICE) != 0U) { running_as_service = true; } create_actions(); pm = std::make_unique(); sie = std::make_unique(pm.get()); soe = std::make_unique(pm.get()); presets_manager = std::make_unique(); pm->blocklist_in = settings->get_string_array("blocklist-in"); pm->blocklist_out = settings->get_string_array("blocklist-out"); pm->new_default_sink.connect([&](auto name) { util::debug("new default sink: " + name); if (name != "") { sie->set_output_sink_name(name); soe->webrtc->set_probe_src_device(name + ".monitor"); } }); pm->new_default_source.connect([&](auto name) { util::debug("new default source: " + name); if (name != "") { soe->set_source_monitor_name(name); } }); pm->sink_changed.connect([&](const std::shared_ptr& info) { if (info->name == pm->server_info.default_sink_name) { Glib::signal_timeout().connect_seconds_once( [=]() { // checking if after 3 seconds this sink still is the default sink if (info->name == pm->server_info.default_sink_name) { auto current_info = pm->get_sink_info(info->name); if (current_info != nullptr) { auto port = current_info->active_port; std::string dev_name; if (port != "null") { dev_name = current_info->name + ":" + port; } else { dev_name = current_info->name; } if (dev_name != last_sink_dev_name) { last_sink_dev_name = dev_name; presets_manager->autoload(PresetType::output, dev_name); } } } }, 3); } }); pm->source_changed.connect([&](const std::shared_ptr& info) { if (info->name == pm->server_info.default_source_name) { Glib::signal_timeout().connect_seconds_once( [=]() { // checking if after 3 seconds this source still is the default source if (info->name == pm->server_info.default_source_name) { auto current_info = pm->get_source_info(info->name); if (current_info != nullptr) { auto port = current_info->active_port; std::string dev_name; if (port != "null") { dev_name = current_info->name + ":" + port; } else { dev_name = current_info->name; } if (dev_name != last_source_dev_name) { last_source_dev_name = dev_name; presets_manager->autoload(PresetType::input, dev_name); } } } }, 3); } }); settings->signal_changed("blocklist-in").connect([=](auto key) { pm->blocklist_in = settings->get_string_array("blocklist-in"); }); settings->signal_changed("blocklist-out").connect([=](auto key) { pm->blocklist_out = settings->get_string_array("blocklist-out"); }); settings->signal_changed("bypass").connect([=](auto key) { update_bypass_state(key); }); update_bypass_state("bypass"); if (running_as_service) { pm->find_sink_inputs(); pm->find_source_outputs(); pm->find_sinks(); pm->find_sources(); util::debug(log_tag + "Running in Background"); hold(); } } void Application::on_activate() { if (get_active_window() == nullptr) { /* Note to myself: do not wrap this pointer in a smart pointer. Causes memory leaks when closing the window because GTK reference counting system will see that there is still someone with an object reference and it won't free the widgets. */ auto* window = ApplicationUi::create(this); add_window(*window); window->signal_hide().connect([&, window]() { int width = 0; int height = 0; window->get_size(width, height); settings->set_int("window-width", width); settings->set_int("window-height", height); delete window; }); window->show_all(); pm->find_sink_inputs(); pm->find_source_outputs(); pm->find_sinks(); pm->find_sources(); } } auto Application::on_handle_local_options(const Glib::RefPtr& options) -> int { if (!options) { std::cerr << G_STRFUNC << ": options is null." << std::endl; } // Remove some options to show that we have handled them in the local // instance, so they won't be passed to the primary (remote) instance: options->remove("preset"); presets_manager = std::make_unique(); if (options->contains("presets")) { std::string list; for (const auto& name : presets_manager->get_names(PresetType::output)) { list += name + ","; } std::clog << _("Output Presets: ") + list << std::endl; list = ""; for (const auto& name : presets_manager->get_names(PresetType::input)) { list += name + ","; } std::clog << _("Input Presets: ") + list << std::endl; return EXIT_SUCCESS; } if (options->contains("bypass")) { int bypass_arg = 2; if (options->lookup_value("bypass", bypass_arg)) { if (bypass_arg == 3) { auto cfg = Gio::Settings::create("com.github.wwmm.pulseeffects"); std::clog << cfg->get_boolean("bypass") << std::endl; return EXIT_SUCCESS; } } } return -1; } void Application::create_actions() { add_action("about", [&]() { auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/about.glade"); auto* dialog = (Gtk::Dialog*)builder->get_object("about_dialog").get(); dialog->signal_response().connect([=](auto response_id) { switch (response_id) { case Gtk::RESPONSE_CLOSE: case Gtk::RESPONSE_CANCEL: case Gtk::RESPONSE_DELETE_EVENT: { dialog->hide(); util::debug(log_tag + "hiding the about dialog window"); break; } default: util::debug(log_tag + "unexpected about dialog response!"); break; } }); dialog->set_transient_for(*get_active_window()); dialog->show(); // Bring it to the front, in case it was already shown: dialog->present(); }); add_action("help", [&] { auto* window = get_active_window(); window->show_uri("help:pulseeffects", gtk_get_current_event_time()); }); add_action("quit", [&] { auto* window = get_active_window(); window->hide(); }); set_accel_for_action("app.help", "F1"); set_accel_for_action("app.quit", "Q"); } void Application::update_bypass_state(const std::string& key) { auto state = settings->get_boolean(key); if (state) { util::info(log_tag + "enabling global bypass"); sie->do_bypass(true); soe->do_bypass(true); } else { util::info(log_tag + "disabling global bypass"); sie->do_bypass(false); soe->do_bypass(false); } } easyeffects-4.8.7/src/application_ui.cpp000066400000000000000000000212001424023573300203240ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "application_ui.hpp" ApplicationUi::ApplicationUi(BaseObjectType* cobject, const Glib::RefPtr& builder, Application* application) : Gtk::ApplicationWindow(cobject), app(application), settings(app->settings), global_locale(util::get_global_locale()) { apply_css_style("custom.css"); Gtk::IconTheme::get_default()->add_resource_path("/com/github/wwmm/pulseeffects/icons"); // loading glade widgets builder->get_widget("stack", stack); builder->get_widget("stack_menu_settings", stack_menu_settings); builder->get_widget("presets_menu_button", presets_menu_button); builder->get_widget("presets_menu", presets_menu); builder->get_widget("presets_menu_label", presets_menu_label); builder->get_widget("calibration_button", calibration_button); builder->get_widget("subtitle_grid", subtitle_grid); builder->get_widget("headerbar", headerbar); builder->get_widget("help_button", help_button); builder->get_widget("bypass_button", bypass_button); builder->get_widget("headerbar_icon1", headerbar_icon1); builder->get_widget("headerbar_icon2", headerbar_icon2); builder->get_widget("headerbar_info", headerbar_info); presets_menu_ui = PresetsMenuUi::add_to_popover(presets_menu, app); sie_ui = SinkInputEffectsUi::add_to_stack(stack, app->sie.get()); soe_ui = SourceOutputEffectsUi::add_to_stack(stack, app->soe.get()); GeneralSettingsUi::add_to_stack(stack_menu_settings, app); SpectrumSettingsUi::add_to_stack(stack_menu_settings, app); PulseSettingsUi::add_to_stack(stack_menu_settings, app); BlocklistSettingsUi::add_to_stack(stack_menu_settings); pulse_info_ui = PulseInfoUi::add_to_stack(stack, app->pm.get()); stack->connect_property_changed("visible-child", sigc::mem_fun(*this, &ApplicationUi::on_stack_visible_child_changed)); // calibration calibration_button->signal_clicked().connect(sigc::mem_fun(*this, &ApplicationUi::on_calibration_button_clicked)); // signals connections.emplace_back(app->pm->new_default_sink.connect([&](auto name) { if (stack->get_visible_child_name() == "sink_inputs") { update_headerbar_subtitle(0); } })); connections.emplace_back(app->pm->new_default_source.connect([&](auto name) { if (stack->get_visible_child_name() == "source_outputs") { update_headerbar_subtitle(1); } })); help_button->signal_clicked().connect([=]() { app->activate_action("help"); }); presets_menu_button->signal_clicked().connect( sigc::mem_fun(*presets_menu_ui, &PresetsMenuUi::on_presets_menu_button_clicked)); presets_menu_label->set_text(settings->get_string("last-used-output-preset")); connections.emplace_back(settings->signal_changed("last-used-input-preset").connect([=](auto key) { presets_menu_label->set_text(settings->get_string("last-used-input-preset")); })); connections.emplace_back(settings->signal_changed("last-used-output-preset").connect([=](auto key) { presets_menu_label->set_text(settings->get_string("last-used-output-preset")); })); // headerbar info connections.emplace_back(app->sie->new_latency.connect([=](int latency) { sie_latency = latency; if (stack->get_visible_child_name() == "sink_inputs") { update_headerbar_subtitle(0); } })); if (app->sie->playing) { app->sie->get_latency(); } connections.emplace_back(app->soe->new_latency.connect([=](int latency) { soe_latency = latency; if (stack->get_visible_child_name() == "source_outputs") { update_headerbar_subtitle(1); } })); if (app->soe->playing) { app->soe->get_latency(); } // updating headerbar info update_headerbar_subtitle(0); // binding glade widgets to gsettings keys auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("use-dark-theme", Gtk::Settings::get_default().get(), "gtk_application_prefer_dark_theme", flag); settings->bind("bypass", bypass_button, "active", flag); // restore window size auto window_width = settings->get_int("window-width"); auto window_height = settings->get_int("window-height"); if (window_width > 0 && window_height > 0) { set_default_size(window_width, window_height); } } ApplicationUi::~ApplicationUi() { for (auto& c : connections) { c.disconnect(); } util::debug(log_tag + "destroyed"); } auto ApplicationUi::create(Application* app_this) -> ApplicationUi* { auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/application.glade"); ApplicationUi* window = nullptr; builder->get_widget_derived("ApplicationUi", window, app_this); return window; } void ApplicationUi::apply_css_style(const std::string& css_file_name) { auto provider = Gtk::CssProvider::create(); provider->load_from_resource("/com/github/wwmm/pulseeffects/ui/" + css_file_name); auto screen = Gdk::Screen::get_default(); auto priority = GTK_STYLE_PROVIDER_PRIORITY_APPLICATION; Gtk::StyleContext::add_provider_for_screen(screen, provider, priority); } void ApplicationUi::update_headerbar_subtitle(const int& index) { std::ostringstream null_sink_rate; std::ostringstream current_dev_rate; const float khz_factor = 0.001F; null_sink_rate.imbue(global_locale); null_sink_rate.precision(1); current_dev_rate.imbue(global_locale); current_dev_rate.precision(1); switch (index) { case 0: { // sie subtitle_grid->show(); headerbar_icon1->set_from_icon_name("emblem-music-symbolic", Gtk::ICON_SIZE_MENU); headerbar_icon2->set_from_icon_name("audio-speakers-symbolic", Gtk::ICON_SIZE_MENU); null_sink_rate << std::fixed << app->pm->apps_sink_info->rate * khz_factor << "kHz"; auto sink = app->pm->get_sink_info(app->pm->server_info.default_sink_name); current_dev_rate << std::fixed << sink->rate * khz_factor << "kHz"; headerbar_info->set_text(" ⟶ " + app->pm->apps_sink_info->format + " " + null_sink_rate.str() + " ⟶ float32le " + null_sink_rate.str() + " ⟶ " + sink->format + " " + current_dev_rate.str() + " ⟶ " + std::to_string(sie_latency) + "ms ⟶ "); break; } case 1: { // soe subtitle_grid->show(); headerbar_icon1->set_from_icon_name("audio-input-microphone-symbolic", Gtk::ICON_SIZE_MENU); headerbar_icon2->set_from_icon_name("emblem-music-symbolic", Gtk::ICON_SIZE_MENU); null_sink_rate << std::fixed << app->pm->mic_sink_info->rate * khz_factor << "kHz"; auto source = app->pm->get_source_info(app->pm->server_info.default_source_name); current_dev_rate << std::fixed << source->rate * khz_factor << "kHz"; headerbar_info->set_text(" ⟶ " + source->format + " " + current_dev_rate.str() + " ⟶ float32le " + null_sink_rate.str() + " ⟶ " + app->pm->mic_sink_info->format + " " + null_sink_rate.str() + " ⟶ " + std::to_string(soe_latency) + "ms ⟶ "); break; } default: // pulse info subtitle_grid->hide(); break; } } void ApplicationUi::on_stack_visible_child_changed() { auto name = stack->get_visible_child_name(); if (name == std::string("sink_inputs")) { update_headerbar_subtitle(0); presets_menu_label->set_text(settings->get_string("last-used-output-preset")); } else if (name == std::string("source_outputs")) { update_headerbar_subtitle(1); presets_menu_label->set_text(settings->get_string("last-used-input-preset")); } else if (name == std::string("pulse_info")) { update_headerbar_subtitle(2); } } void ApplicationUi::on_calibration_button_clicked() { std::shared_ptr calibration_ui(CalibrationUi::create()); auto c = app->pm->new_default_source.connect([=](auto name) { calibration_ui->set_source_monitor_name(name); }); calibration_ui->signal_hide().connect([=]() { c->disconnect(); }); calibration_ui->show_all(); } easyeffects-4.8.7/src/autogain.cpp000066400000000000000000000135271424023573300171500ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "autogain.hpp" #include #include "util.hpp" namespace { void on_m_changed(GObject* gobject, GParamSpec* pspec, AutoGain* a) { float v = 0.0F; g_object_get(a->autogain, "m", &v, nullptr); Glib::signal_idle().connect_once([=] { a->momentary.emit(v); }); } void on_s_changed(GObject* gobject, GParamSpec* pspec, AutoGain* a) { float v = 0.0F; g_object_get(a->autogain, "s", &v, nullptr); Glib::signal_idle().connect_once([=] { a->shortterm.emit(v); }); } void on_i_changed(GObject* gobject, GParamSpec* pspec, AutoGain* a) { float v = 0.0F; g_object_get(a->autogain, "i", &v, nullptr); Glib::signal_idle().connect_once([=] { a->integrated.emit(v); }); } void on_r_changed(GObject* gobject, GParamSpec* pspec, AutoGain* a) { float v = 0.0F; g_object_get(a->autogain, "r", &v, nullptr); Glib::signal_idle().connect_once([=] { a->relative.emit(v); }); } void on_l_changed(GObject* gobject, GParamSpec* pspec, AutoGain* a) { float v = 0.0F; g_object_get(a->autogain, "l", &v, nullptr); Glib::signal_idle().connect_once([=] { a->loudness.emit(v); }); } void on_lra_changed(GObject* gobject, GParamSpec* pspec, AutoGain* a) { float v = 0.0F; g_object_get(a->autogain, "lra", &v, nullptr); Glib::signal_idle().connect_once([=] { a->range.emit(v); }); } void on_g_changed(GObject* gobject, GParamSpec* pspec, AutoGain* a) { float v = 0.0F; g_object_get(a->autogain, "g", &v, nullptr); Glib::signal_idle().connect_once([=] { a->gain.emit(v); }); } } // namespace AutoGain::AutoGain(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "autogain", schema, schema_path) { autogain = gst_element_factory_make("peautogain", nullptr); if (is_installed(autogain)) { auto* input_gain = gst_element_factory_make("volume", nullptr); auto* in_level = gst_element_factory_make("level", "autogain_input_level"); auto* output_gain = gst_element_factory_make("volume", nullptr); auto* out_level = gst_element_factory_make("level", "autogain_output_level"); auto* audioconvert_in = gst_element_factory_make("audioconvert", "autogain_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "autogain_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), input_gain, in_level, audioconvert_in, autogain, audioconvert_out, output_gain, out_level, nullptr); gst_element_link_many(input_gain, in_level, audioconvert_in, autogain, audioconvert_out, output_gain, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(input_gain, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); bind_to_gsettings(); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", autogain, "notify-host", G_SETTINGS_BIND_DEFAULT); g_signal_connect(autogain, "notify::m", G_CALLBACK(on_m_changed), this); g_signal_connect(autogain, "notify::s", G_CALLBACK(on_s_changed), this); g_signal_connect(autogain, "notify::i", G_CALLBACK(on_i_changed), this); g_signal_connect(autogain, "notify::r", G_CALLBACK(on_r_changed), this); g_signal_connect(autogain, "notify::l", G_CALLBACK(on_l_changed), this); g_signal_connect(autogain, "notify::lra", G_CALLBACK(on_lra_changed), this); g_signal_connect(autogain, "notify::g", G_CALLBACK(on_g_changed), this); g_settings_bind_with_mapping(settings, "input-gain", input_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", output_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } AutoGain::~AutoGain() { util::debug(log_tag + name + " destroyed"); } void AutoGain::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "target", autogain, "target", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind(settings, "weight-m", autogain, "weight-m", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "weight-s", autogain, "weight-s", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "weight-i", autogain, "weight-i", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "detect-silence", autogain, "detect-silence", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "use-geometric-mean", autogain, "use-geometric-mean", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "reset", autogain, "reset", G_SETTINGS_BIND_DEFAULT); } easyeffects-4.8.7/src/autogain/000077500000000000000000000000001424023573300164345ustar00rootroot00000000000000easyeffects-4.8.7/src/autogain/README.md000066400000000000000000000003521424023573300177130ustar00rootroot00000000000000# PulseEffects autogain Simple plugin that changes audio gain to match the levels recommended by the ebur128 standard. You can test this plugin from command line executing: `gst-launch-1.0 -v audiotestsrc ! peautogain ! pulsesink` easyeffects-4.8.7/src/autogain/gstpeautogain.cpp000066400000000000000000000437571424023573300220320ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ /** * SECTION:element-gstpeautogain * * The peautogain element does auto volume and is based on libebur128. * * * Example launch line * |[ * gst-launch-1.0 -v audiotestsrc ! peautogain ! pulsesink * ]| * The peautogain element does auto volume and is based on libebur128. * */ #include "gstpeautogain.hpp" #include #include #include #include #include "config.h" #include "util.hpp" GST_DEBUG_CATEGORY_STATIC(gst_peautogain_debug_category); #define GST_CAT_DEFAULT gst_peautogain_debug_category /* prototypes */ static void gst_peautogain_set_property(GObject* object, guint property_id, const GValue* value, GParamSpec* pspec); static void gst_peautogain_get_property(GObject* object, guint property_id, GValue* value, GParamSpec* pspec); static auto gst_peautogain_setup(GstAudioFilter* filter, const GstAudioInfo* info) -> gboolean; static auto gst_peautogain_transform_ip(GstBaseTransform* trans, GstBuffer* buffer) -> GstFlowReturn; static void gst_peautogain_finalize(GObject* object); static void gst_peautogain_setup_ebur(GstPeautogain* peautogain); static void gst_peautogain_reset(GstPeautogain* peautogain); static void gst_peautogain_process(GstPeautogain* peautogain, GstBuffer* buffer); enum { PROP_TARGET = 1, PROP_WEIGHT_M, PROP_WEIGHT_S, PROP_WEIGHT_I, PROP_M, PROP_S, PROP_I, PROP_R, PROP_L, PROP_G, PROP_LRA, PROP_NOTIFY, PROP_DETECT_SILENCE, PROP_RESET, PROP_USE_GEOMETRIC_MEAN }; /* pad templates */ static GstStaticPadTemplate gst_peautogain_src_template = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS("audio/x-raw,format=F32LE,rate=[1,max]," "channels=2,layout=interleaved")); static GstStaticPadTemplate gst_peautogain_sink_template = GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS("audio/x-raw,format=F32LE,rate=[1,max]," "channels=2,layout=interleaved")); /* class initialization */ G_DEFINE_TYPE_WITH_CODE( GstPeautogain, gst_peautogain, GST_TYPE_AUDIO_FILTER, GST_DEBUG_CATEGORY_INIT(gst_peautogain_debug_category, "peautogain", 0, "debug category for peautogain element")); static void gst_peautogain_class_init(GstPeautogainClass* klass) { GObjectClass* gobject_class = G_OBJECT_CLASS(klass); GstBaseTransformClass* base_transform_class = GST_BASE_TRANSFORM_CLASS(klass); GstAudioFilterClass* audio_filter_class = GST_AUDIO_FILTER_CLASS(klass); /* Setting up pads and setting metadata should be moved to base_class_init if you intend to subclass this class. */ gst_element_class_add_static_pad_template(GST_ELEMENT_CLASS(klass), &gst_peautogain_src_template); gst_element_class_add_static_pad_template(GST_ELEMENT_CLASS(klass), &gst_peautogain_sink_template); gst_element_class_set_static_metadata(GST_ELEMENT_CLASS(klass), "PulseEffects ebur128 level meter", "Generic", "PulseEffects ebur128 level meter", "Wellington "); /* define virtual function pointers */ gobject_class->set_property = gst_peautogain_set_property; gobject_class->get_property = gst_peautogain_get_property; gobject_class->finalize = gst_peautogain_finalize; audio_filter_class->setup = GST_DEBUG_FUNCPTR(gst_peautogain_setup); base_transform_class->transform_ip = GST_DEBUG_FUNCPTR(gst_peautogain_transform_ip); base_transform_class->transform_ip_on_passthrough = false; /* define properties */ g_object_class_install_property( gobject_class, PROP_TARGET, g_param_spec_float("target", "Target Level", "Target loudness level (in LUFS)", -100.0F, 0.0F, -23.0F, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_WEIGHT_M, g_param_spec_int("weight-m", "Weight 0", "Momentary loudness weight", 0, 100, 1, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_WEIGHT_S, g_param_spec_int("weight-s", "Weight 1", "Short term loudness weight", 0, 100, 1, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_WEIGHT_I, g_param_spec_int("weight-i", "Weight 2", "Integrated loudness weight", 0, 100, 1, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_M, g_param_spec_float("m", "Momentary Level", "Momentary loudness level (in LUFS)", -G_MAXFLOAT, G_MAXFLOAT, 0.0F, static_cast(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_S, g_param_spec_float("s", "Short Term Level", "Short term loudness level (in LUFS)", -G_MAXFLOAT, G_MAXFLOAT, 0.0F, static_cast(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_I, g_param_spec_float("i", "Integrated Level", "Integrated loudness level (in LUFS)", -G_MAXFLOAT, G_MAXFLOAT, 0.0F, static_cast(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_R, g_param_spec_float("r", "Relative Level", "Relative threshold level (in LUFS)", -G_MAXFLOAT, G_MAXFLOAT, 0.0F, static_cast(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_L, g_param_spec_float("l", "Loudness Level", "Estimated Loudness level (in LUFS)", -G_MAXFLOAT, G_MAXFLOAT, 0.0F, static_cast(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_G, g_param_spec_float("g", "Gain", "Correction gain", -G_MAXFLOAT, G_MAXFLOAT, 0.0F, static_cast(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_NOTIFY, g_param_spec_boolean("notify-host", "Notify Host", "Notify host of variable changes", true, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_LRA, g_param_spec_float("lra", "Loudness Range", "Loudness Range (in LUFS)", -G_MAXFLOAT, G_MAXFLOAT, 0.0F, static_cast(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_DETECT_SILENCE, g_param_spec_boolean("detect-silence", "Detect Silence", "Do not change gain if the momentary term is below the relative loudness", true, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_RESET, g_param_spec_boolean("reset", "Reset History", "Completely reset the library ebur128 state", false, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_USE_GEOMETRIC_MEAN, g_param_spec_boolean("use-geometric-mean", "Loudness Geometric Mean", "Estimated loudness is the geometric mean of the momentary, short-term and global values", true, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } static void gst_peautogain_init(GstPeautogain* peautogain) { peautogain->ready = false; peautogain->bpf = 0; peautogain->rate = 0; peautogain->target = -23.0F; // LUFS peautogain->weight_m = 1; peautogain->weight_s = 1; peautogain->weight_i = 1; peautogain->momentary = 0.0F; peautogain->shortterm = 0.0F; peautogain->global = 0.0F; peautogain->relative = 0.0F; peautogain->loudness = 0.0F; peautogain->gain = 1.0F; peautogain->range = 0.0F; peautogain->notify_samples = 0U; peautogain->sample_count = 0U; peautogain->notify = true; peautogain->detect_silence = true; peautogain->reset = false; peautogain->use_geometric_mean = true; peautogain->ebur_state = nullptr; gst_base_transform_set_in_place(GST_BASE_TRANSFORM(peautogain), true); } void gst_peautogain_set_property(GObject* object, guint property_id, const GValue* value, GParamSpec* pspec) { GstPeautogain* peautogain = GST_PEAUTOGAIN(object); GST_DEBUG_OBJECT(peautogain, "set_property"); switch (property_id) { case PROP_TARGET: peautogain->target = g_value_get_float(value); break; case PROP_WEIGHT_M: peautogain->weight_m = g_value_get_int(value); break; case PROP_WEIGHT_S: peautogain->weight_s = g_value_get_int(value); break; case PROP_WEIGHT_I: peautogain->weight_i = g_value_get_int(value); break; case PROP_NOTIFY: peautogain->notify = g_value_get_boolean(value); break; case PROP_DETECT_SILENCE: peautogain->detect_silence = g_value_get_boolean(value); break; case PROP_RESET: peautogain->reset = g_value_get_boolean(value); break; case PROP_USE_GEOMETRIC_MEAN: peautogain->use_geometric_mean = g_value_get_boolean(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; } } void gst_peautogain_get_property(GObject* object, guint property_id, GValue* value, GParamSpec* pspec) { GstPeautogain* peautogain = GST_PEAUTOGAIN(object); GST_DEBUG_OBJECT(peautogain, "get_property"); switch (property_id) { case PROP_TARGET: g_value_set_float(value, peautogain->target); break; case PROP_WEIGHT_M: g_value_set_int(value, peautogain->weight_m); break; case PROP_WEIGHT_S: g_value_set_int(value, peautogain->weight_s); break; case PROP_WEIGHT_I: g_value_set_int(value, peautogain->weight_i); break; case PROP_M: g_value_set_float(value, peautogain->momentary); break; case PROP_S: g_value_set_float(value, peautogain->shortterm); break; case PROP_I: g_value_set_float(value, peautogain->global); break; case PROP_R: g_value_set_float(value, peautogain->relative); break; case PROP_L: g_value_set_float(value, peautogain->loudness); break; case PROP_G: g_value_set_float(value, peautogain->gain); break; case PROP_LRA: g_value_set_float(value, peautogain->range); break; case PROP_NOTIFY: g_value_set_boolean(value, peautogain->notify); break; case PROP_DETECT_SILENCE: g_value_set_boolean(value, peautogain->detect_silence); break; case PROP_RESET: g_value_set_boolean(value, peautogain->reset); break; case PROP_USE_GEOMETRIC_MEAN: g_value_set_boolean(value, peautogain->use_geometric_mean); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; } } static auto gst_peautogain_setup(GstAudioFilter* filter, const GstAudioInfo* info) -> gboolean { GstPeautogain* peautogain = GST_PEAUTOGAIN(filter); GST_DEBUG_OBJECT(peautogain, "setup"); std::lock_guard lock(peautogain->lock_guard_ebu); peautogain->bpf = info->bpf; peautogain->rate = info->rate; peautogain->notify_samples = GST_CLOCK_TIME_TO_FRAMES(GST_SECOND / 10, info->rate); // notify every 0.1 seconds gst_peautogain_setup_ebur(peautogain); return true; } static auto gst_peautogain_transform_ip(GstBaseTransform* trans, GstBuffer* buffer) -> GstFlowReturn { GstPeautogain* peautogain = GST_PEAUTOGAIN(trans); GST_DEBUG_OBJECT(peautogain, "transform"); std::lock_guard lock(peautogain->lock_guard_ebu); if (peautogain->reset) { gst_peautogain_reset(peautogain); } if (peautogain->ready) { gst_peautogain_process(peautogain, buffer); } else { gst_peautogain_setup_ebur(peautogain); } return GST_FLOW_OK; } void gst_peautogain_finalize(GObject* object) { GstPeautogain* peautogain = GST_PEAUTOGAIN(object); GST_DEBUG_OBJECT(peautogain, "finalize"); std::lock_guard lock(peautogain->lock_guard_ebu); gst_peautogain_reset(peautogain); G_OBJECT_CLASS(gst_peautogain_parent_class)->finalize(object); } static void gst_peautogain_setup_ebur(GstPeautogain* peautogain) { if (!peautogain->ready) { peautogain->ebur_state = ebur128_init( 2U, peautogain->rate, EBUR128_MODE_S | EBUR128_MODE_I | EBUR128_MODE_LRA | EBUR128_MODE_SAMPLE_PEAK | EBUR128_MODE_HISTOGRAM); ebur128_set_channel(peautogain->ebur_state, 0U, EBUR128_LEFT); ebur128_set_channel(peautogain->ebur_state, 1U, EBUR128_RIGHT); peautogain->ready = true; } } static void gst_peautogain_reset(GstPeautogain* peautogain) { peautogain->ready = false; peautogain->reset = false; peautogain->gain = 1.0F; if (peautogain->ebur_state != nullptr) { ebur128_destroy(&peautogain->ebur_state); peautogain->ebur_state = nullptr; } } static void gst_peautogain_process(GstPeautogain* peautogain, GstBuffer* buffer) { GstMapInfo map; double momentary = 0.0; double shortterm = 0.0; double global = 0.0; double relative = 0.0; double range = 0.0; bool failed = false; gst_buffer_map(buffer, &map, GST_MAP_READWRITE); auto* data = reinterpret_cast(map.data); guint num_samples = map.size / peautogain->bpf; ebur128_add_frames_float(peautogain->ebur_state, data, num_samples); if (EBUR128_SUCCESS != ebur128_loudness_momentary(peautogain->ebur_state, &momentary)) { failed = true; } else { peautogain->momentary = static_cast(momentary); } if (EBUR128_SUCCESS != ebur128_loudness_shortterm(peautogain->ebur_state, &shortterm)) { failed = true; } else { peautogain->shortterm = static_cast(shortterm); } if (EBUR128_SUCCESS != ebur128_loudness_global(peautogain->ebur_state, &global)) { failed = true; } else { peautogain->global = static_cast(global); } if (EBUR128_SUCCESS != ebur128_relative_threshold(peautogain->ebur_state, &relative)) { failed = true; } else { peautogain->relative = static_cast(relative); } if (EBUR128_SUCCESS != ebur128_loudness_range(peautogain->ebur_state, &range)) { failed = true; } else { peautogain->range = static_cast(range); } bool playing_silence = (peautogain->momentary < peautogain->relative && peautogain->detect_silence) ? true : false; if (peautogain->relative > -70.0F && !failed && !playing_silence) { double peak_L = 0.0, peak_R = 0.0; if (EBUR128_SUCCESS != ebur128_prev_sample_peak(peautogain->ebur_state, 0U, &peak_L)) { failed = true; } if (EBUR128_SUCCESS != ebur128_prev_sample_peak(peautogain->ebur_state, 1U, &peak_R)) { failed = true; } if (!failed) { if (peautogain->use_geometric_mean) { peautogain->loudness = std::cbrt(peautogain->momentary * peautogain->shortterm * peautogain->global); } else { peautogain->loudness = (peautogain->weight_m * peautogain->momentary + peautogain->weight_s * peautogain->shortterm + peautogain->weight_i * peautogain->global) / (peautogain->weight_m + peautogain->weight_s + peautogain->weight_i); } float diff = peautogain->target - peautogain->loudness; // 10^(diff/20). The way below should be faster than using pow float gain = expf((diff / 20.0F) * logf(10.0F)); float peak = (peak_L > peak_R) ? peak_L : peak_R; float db_peak = util::linear_to_db(peak); if (db_peak > -99.0F) { if (gain * peak < 1.0F) { peautogain->gain = gain; } } } } for (unsigned int n = 0U; n < 2U * num_samples; n++) { data[n] = data[n] * peautogain->gain; } gst_buffer_unmap(buffer, &map); if (!failed && peautogain->notify) { peautogain->sample_count += num_samples; if (peautogain->sample_count >= peautogain->notify_samples) { peautogain->sample_count = 0U; g_object_notify(G_OBJECT(peautogain), "m"); g_object_notify(G_OBJECT(peautogain), "s"); g_object_notify(G_OBJECT(peautogain), "i"); g_object_notify(G_OBJECT(peautogain), "r"); g_object_notify(G_OBJECT(peautogain), "l"); g_object_notify(G_OBJECT(peautogain), "lra"); g_object_notify(G_OBJECT(peautogain), "g"); } } } static gboolean plugin_init(GstPlugin* plugin) { /* FIXME Remember to set the rank if it's an element that is meant to be autoplugged by decodebin. */ return gst_element_register(plugin, "peautogain", GST_RANK_NONE, GST_TYPE_PEAUTOGAIN); } GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, peautogain, "PulseEffects autogain based on libebur128", plugin_init, VERSION, "LGPL", PACKAGE, "https://github.com/wwmm/pulseeffects") easyeffects-4.8.7/src/autogain/gstpeautogain.hpp000066400000000000000000000045131424023573300220220ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef GST_PEAUTOGAIN_H #define GST_PEAUTOGAIN_H #include #include #include G_BEGIN_DECLS #define GST_TYPE_PEAUTOGAIN (gst_peautogain_get_type()) #define GST_PEAUTOGAIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_PEAUTOGAIN, GstPeautogain)) #define GST_PEAUTOGAIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_PEAUTOGAIN, GstPeautogainClass)) #define GST_IS_PEAUTOGAIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_PEAUTOGAIN)) #define GST_IS_PEAUTOGAIN_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_PEAUTOGAIN)) struct GstPeautogain { GstAudioFilter base_peautogain; /* properties */ float target; // target loudness level int weight_m; // momentary loudness weight int weight_s; // short term loudness weight int weight_i; // integrated loudness weight float momentary; // momentary value float shortterm; // short term value float global; // integrated value float relative; // relative threshold float loudness; // estimated loudness float gain; // correction gain float range; // loudness range bool detect_silence, reset, use_geometric_mean; /* < private > */ bool ready, notify; int bpf; // bytes per frame : channels * bps int rate; // sampling rate uint notify_samples; // number of samples to count before emit a notify uint sample_count; ebur128_state* ebur_state = nullptr; std::mutex lock_guard_ebu; }; struct GstPeautogainClass { GstAudioFilterClass base_peautogain_class; }; GType gst_peautogain_get_type(void); G_END_DECLS #endif easyeffects-4.8.7/src/autogain/meson.build000066400000000000000000000010401424023573300205710ustar00rootroot00000000000000plugin_sources = [ 'gstpeautogain.cpp', '../util.cpp' ] plugin_deps = [ dependency('gstreamer-1.0'), dependency('gstreamer-base-1.0'), dependency('gstreamer-controller-1.0'), dependency('gstreamer-audio-1.0'), dependency('libebur128',version: '>=1.2.0') ] plugins_install_dir = '@0@/gstreamer-1.0'.format(get_option('libdir')) library( 'gstpeautogain', plugin_sources, include_directories : [config_h_dir, include_dir], dependencies : plugin_deps, install: true, install_dir : plugins_install_dir, cpp_args: plugins_cxx_args ) easyeffects-4.8.7/src/autogain_preset.cpp000066400000000000000000000062761424023573300205350ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "autogain_preset.hpp" AutoGainPreset::AutoGainPreset() : output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.autogain", "/com/github/wwmm/pulseeffects/sinkinputs/autogain/")) {} void AutoGainPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".autogain.state", settings->get_boolean("state")); root.put(section + ".autogain.detect-silence", settings->get_boolean("detect-silence")); root.put(section + ".autogain.use-geometric-mean", settings->get_boolean("use-geometric-mean")); root.put(section + ".autogain.input-gain", settings->get_double("input-gain")); root.put(section + ".autogain.output-gain", settings->get_double("output-gain")); root.put(section + ".autogain.target", settings->get_double("target")); root.put(section + ".autogain.weight-m", settings->get_int("weight-m")); root.put(section + ".autogain.weight-s", settings->get_int("weight-s")); root.put(section + ".autogain.weight-i", settings->get_int("weight-i")); } void AutoGainPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".autogain.state"); update_key(root, settings, "detect-silence", section + ".autogain.detect-silence"); update_key(root, settings, "use-geometric-mean", section + ".autogain.use-geometric-mean"); update_key(root, settings, "input-gain", section + ".autogain.input-gain"); update_key(root, settings, "output-gain", section + ".autogain.output-gain"); update_key(root, settings, "target", section + ".autogain.target"); update_key(root, settings, "weight-m", section + ".autogain.weight-m"); update_key(root, settings, "weight-s", section + ".autogain.weight-s"); update_key(root, settings, "weight-i", section + ".autogain.weight-i"); } void AutoGainPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { save(root, "output", output_settings); } } void AutoGainPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { load(root, "output", output_settings); } } easyeffects-4.8.7/src/autogain_ui.cpp000066400000000000000000000123561424023573300176440ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "autogain_ui.hpp" AutoGainUi::AutoGainUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "autogain"; // loading glade widgets builder->get_widget("m_level", m_level); builder->get_widget("s_level", s_level); builder->get_widget("i_level", i_level); builder->get_widget("r_level", r_level); builder->get_widget("g_level", g_level); builder->get_widget("l_level", l_level); builder->get_widget("lra_level", lra_level); builder->get_widget("m_label", m_label); builder->get_widget("s_label", s_label); builder->get_widget("i_label", i_label); builder->get_widget("r_label", r_label); builder->get_widget("g_label", g_label); builder->get_widget("l_label", l_label); builder->get_widget("lra_label", lra_label); builder->get_widget("reset", reset_history); builder->get_widget("detect_silence", detect_silence); builder->get_widget("use_geometric_mean", use_geometric_mean); builder->get_widget("weight_m_grid", weight_m_grid); builder->get_widget("weight_s_grid", weight_s_grid); builder->get_widget("weight_i_grid", weight_i_grid); builder->get_widget("plugin_reset", reset_button); get_object(builder, "input_gain", input_gain); builder->get_widget("l_label", l_label); get_object(builder, "output_gain", output_gain); get_object(builder, "target", target); get_object(builder, "weight_m", weight_m); get_object(builder, "weight_s", weight_s); get_object(builder, "weight_i", weight_i); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); settings->bind("target", target.get(), "value", flag); settings->bind("weight-m", weight_m.get(), "value", flag); settings->bind("weight-s", weight_s.get(), "value", flag); settings->bind("weight-i", weight_i.get(), "value", flag); settings->bind("detect-silence", detect_silence, "active", flag); settings->bind("use-geometric-mean", use_geometric_mean, "active", flag); settings->bind("use-geometric-mean", weight_m_grid, "sensitive", Gio::SettingsBindFlags::SETTINGS_BIND_GET | Gio::SettingsBindFlags::SETTINGS_BIND_INVERT_BOOLEAN); settings->bind("use-geometric-mean", weight_s_grid, "sensitive", Gio::SettingsBindFlags::SETTINGS_BIND_GET | Gio::SettingsBindFlags::SETTINGS_BIND_INVERT_BOOLEAN); settings->bind("use-geometric-mean", weight_i_grid, "sensitive", Gio::SettingsBindFlags::SETTINGS_BIND_GET | Gio::SettingsBindFlags::SETTINGS_BIND_INVERT_BOOLEAN); reset_history->signal_clicked().connect([=]() { settings->set_boolean("reset", true); }); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } AutoGainUi::~AutoGainUi() { util::debug(name + " ui destroyed"); } void AutoGainUi::reset() { settings->reset("detect-silence"); settings->reset("use-geometric-mean"); settings->reset("input-gain"); settings->reset("output-gain"); settings->reset("target"); settings->reset("weight-m"); settings->reset("weight-s"); settings->reset("weight-i"); } void AutoGainUi::on_new_momentary(const float& value) { m_level->set_value(util::db_to_linear(value)); m_label->set_text(level_to_localized_string(value, 0)); } void AutoGainUi::on_new_shortterm(const float& value) { s_level->set_value(util::db_to_linear(value)); s_label->set_text(level_to_localized_string(value, 0)); } void AutoGainUi::on_new_integrated(const float& value) { i_level->set_value(util::db_to_linear(value)); i_label->set_text(level_to_localized_string(value, 0)); } void AutoGainUi::on_new_relative(const float& value) { r_level->set_value(util::db_to_linear(value)); r_label->set_text(level_to_localized_string(value, 0)); } void AutoGainUi::on_new_loudness(const float& value) { l_level->set_value(util::db_to_linear(value)); l_label->set_text(level_to_localized_string(value, 0)); } void AutoGainUi::on_new_range(const float& value) { lra_level->set_value(util::db_to_linear(value)); lra_label->set_text(level_to_localized_string(value, 0)); } void AutoGainUi::on_new_gain(const float& value) { g_level->set_value(value); g_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } easyeffects-4.8.7/src/bass_enhancer.cpp000066400000000000000000000113411424023573300201240ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "bass_enhancer.hpp" #include #include "util.hpp" namespace { void on_post_messages_changed(GSettings* settings, gchar* key, BassEnhancer* l) { const auto post = g_settings_get_boolean(settings, key); if (post) { if (!l->harmonics_connection.connected()) { l->harmonics_connection = Glib::signal_timeout().connect( [l]() { float harmonics = 0.0F; g_object_get(l->bass_enhancer, "meter-drive", &harmonics, nullptr); l->harmonics.emit(harmonics); return true; }, 100); } } else { l->harmonics_connection.disconnect(); } } } // namespace BassEnhancer::BassEnhancer(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "bass_enhancer", schema, schema_path) { bass_enhancer = gst_element_factory_make("calf-sourceforge-net-plugins-BassEnhancer", nullptr); if (is_installed(bass_enhancer)) { auto* in_level = gst_element_factory_make("level", "bass_enhancer_input_level"); auto* out_level = gst_element_factory_make("level", "bass_enhancer_output_level"); auto* audioconvert_in = gst_element_factory_make("audioconvert", "bass_enhancer_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "bass_enhancer_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), in_level, audioconvert_in, bass_enhancer, audioconvert_out, out_level, nullptr); gst_element_link_many(in_level, audioconvert_in, bass_enhancer, audioconvert_out, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(in_level, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(bass_enhancer, "bypass", 0, nullptr); bind_to_gsettings(); g_signal_connect(settings, "changed::post-messages", G_CALLBACK(on_post_messages_changed), this); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } BassEnhancer::~BassEnhancer() { util::debug(log_tag + name + " destroyed"); } void BassEnhancer::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "input-gain", bass_enhancer, "level-in", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", bass_enhancer, "level-out", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "amount", bass_enhancer, "amount", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "harmonics", bass_enhancer, "drive", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "scope", bass_enhancer, "freq", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "floor", bass_enhancer, "floor", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "blend", bass_enhancer, "blend", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind(settings, "floor-active", bass_enhancer, "floor-active", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "listen", bass_enhancer, "listen", G_SETTINGS_BIND_DEFAULT); } easyeffects-4.8.7/src/bass_enhancer_preset.cpp000066400000000000000000000066631424023573300215210ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "bass_enhancer_preset.hpp" BassEnhancerPreset::BassEnhancerPreset() : output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.bassenhancer", "/com/github/wwmm/pulseeffects/sinkinputs/bassenhancer/")) {} void BassEnhancerPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".bass_enhancer.state", settings->get_boolean("state")); root.put(section + ".bass_enhancer.input-gain", settings->get_double("input-gain")); root.put(section + ".bass_enhancer.output-gain", settings->get_double("output-gain")); root.put(section + ".bass_enhancer.amount", settings->get_double("amount")); root.put(section + ".bass_enhancer.harmonics", settings->get_double("harmonics")); root.put(section + ".bass_enhancer.scope", settings->get_double("scope")); root.put(section + ".bass_enhancer.floor", settings->get_double("floor")); root.put(section + ".bass_enhancer.blend", settings->get_double("blend")); root.put(section + ".bass_enhancer.floor-active", settings->get_boolean("floor-active")); root.put(section + ".bass_enhancer.listen", settings->get_boolean("listen")); } void BassEnhancerPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".bass_enhancer.state"); update_key(root, settings, "input-gain", section + ".bass_enhancer.input-gain"); update_key(root, settings, "output-gain", section + ".bass_enhancer.output-gain"); update_key(root, settings, "amount", section + ".bass_enhancer.amount"); update_key(root, settings, "harmonics", section + ".bass_enhancer.harmonics"); update_key(root, settings, "scope", section + ".bass_enhancer.scope"); update_key(root, settings, "floor", section + ".bass_enhancer.floor"); update_key(root, settings, "blend", section + ".bass_enhancer.blend"); update_key(root, settings, "floor-active", section + ".bass_enhancer.floor-active"); update_key(root, settings, "listen", section + ".bass_enhancer.listen"); } void BassEnhancerPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { save(root, "output", output_settings); } } void BassEnhancerPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { load(root, "output", output_settings); } } easyeffects-4.8.7/src/bass_enhancer_ui.cpp000066400000000000000000000063051424023573300206250ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "bass_enhancer_ui.hpp" BassEnhancerUi::BassEnhancerUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "bass_enhancer"; // loading glade widgets builder->get_widget("harmonics_levelbar", harmonics_levelbar); builder->get_widget("harmonics_levelbar_label", harmonics_levelbar_label); builder->get_widget("floor_active", floor_active); builder->get_widget("floor_freq", floor_freq); builder->get_widget("listen", listen); builder->get_widget("plugin_reset", reset_button); get_object(builder, "amount", amount); get_object(builder, "blend", blend); get_object(builder, "floor", floorv); get_object(builder, "harmonics", harmonics); get_object(builder, "scope", scope); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("amount", amount.get(), "value", flag); settings->bind("harmonics", harmonics.get(), "value", flag); settings->bind("scope", scope.get(), "value", flag); settings->bind("floor", floorv.get(), "value", flag); settings->bind("blend", blend.get(), "value", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); settings->bind("listen", listen, "active", flag); settings->bind("floor-active", floor_active, "active", flag); settings->bind("floor-active", floor_freq, "sensitive", Gio::SettingsBindFlags::SETTINGS_BIND_GET); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } BassEnhancerUi::~BassEnhancerUi() { util::debug(name + " ui destroyed"); } void BassEnhancerUi::reset() { settings->reset("input-gain"); settings->reset("output-gain"); settings->reset("amount"); settings->reset("harmonics"); settings->reset("scope"); settings->reset("floor"); settings->reset("blend"); settings->reset("floor-active"); settings->reset("listen"); } void BassEnhancerUi::on_new_harmonics_level(double value) { harmonics_levelbar->set_value(value); harmonics_levelbar_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } easyeffects-4.8.7/src/blocklist_settings_ui.cpp000066400000000000000000000212561424023573300217420ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "blocklist_settings_ui.hpp" // static attributes initialization BlocklistSettingsUi* BlocklistSettingsUi::thisPtr = nullptr; Gtk::ListBox* BlocklistSettingsUi::blocklist_in_listbox = nullptr; Gtk::ListBox* BlocklistSettingsUi::blocklist_out_listbox = nullptr; std::vector BlocklistSettingsUi::connections; // constructor BlocklistSettingsUi::BlocklistSettingsUi(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Grid(cobject), settings(Gio::Settings::create("com.github.wwmm.pulseeffects")) { if (thisPtr == nullptr) { thisPtr = this; } // loading glade widgets builder->get_widget("show_blocklisted_apps", show_blocklisted_apps); builder->get_widget("blocklist_in_scrolled_window", blocklist_in_scrolled_window); builder->get_widget("blocklist_out_scrolled_window", blocklist_out_scrolled_window); builder->get_widget("add_blocklist_in", add_blocklist_in); builder->get_widget("add_blocklist_out", add_blocklist_out); builder->get_widget("blocklist_in_listbox", blocklist_in_listbox); builder->get_widget("blocklist_out_listbox", blocklist_out_listbox); builder->get_widget("blocklist_in_name", blocklist_in_name); builder->get_widget("blocklist_out_name", blocklist_out_name); // signals connection blocklist_in_listbox->set_sort_func(sigc::ptr_fun(BlocklistSettingsUi::on_listbox_sort)); blocklist_out_listbox->set_sort_func(sigc::ptr_fun(BlocklistSettingsUi::on_listbox_sort)); add_blocklist_in->signal_clicked().connect([=]() { if (add_new_entry(blocklist_in_name->get_text(), PresetType::input)) { blocklist_in_name->set_text(""); } }); add_blocklist_out->signal_clicked().connect([=]() { if (add_new_entry(blocklist_out_name->get_text(), PresetType::output)) { blocklist_out_name->set_text(""); } }); auto settings = Gio::Settings::create("com.github.wwmm.pulseeffects"); settings->bind("show-blocklisted-apps", show_blocklisted_apps, "active", Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT); populate_blocklist_in_listbox(); populate_blocklist_out_listbox(); } BlocklistSettingsUi::~BlocklistSettingsUi() { for (auto& c : connections) { c.disconnect(); } thisPtr = nullptr; util::debug(log_tag + "destroyed"); } auto BlocklistSettingsUi::get_blocklisted_apps_visibility() -> bool { Glib::RefPtr settingsPtr; if (thisPtr == nullptr) { settingsPtr = Gio::Settings::create("com.github.wwmm.pulseeffects"); } else { settingsPtr = thisPtr->settings; } return settingsPtr->get_boolean("show-blocklisted-apps"); } auto BlocklistSettingsUi::add_new_entry(const std::string& name, PresetType preset_type) -> bool { if (name.empty()) { return false; } Glib::RefPtr settingsPtr; if (thisPtr == nullptr) { settingsPtr = Gio::Settings::create("com.github.wwmm.pulseeffects"); } else { settingsPtr = thisPtr->settings; } const auto* blocklist_preset_type = (preset_type == PresetType::output) ? "blocklist-out" : "blocklist-in"; std::vector bl = settingsPtr->get_string_array(blocklist_preset_type); // Check if the entry is already added for (const auto& str : bl) { if (name == str) { util::debug("blocklist_settings_ui: entry already present in the list"); return false; } } bl.emplace_back(name); settingsPtr->set_string_array(blocklist_preset_type, bl); switch (preset_type) { case PresetType::output: populate_blocklist_out_listbox(); break; case PresetType::input: populate_blocklist_in_listbox(); break; } util::debug("blocklist_settings_ui: new entry has been added to the blocklist"); return true; } void BlocklistSettingsUi::remove_entry(const std::string& name, PresetType preset_type) { Glib::RefPtr settingsPtr; if (thisPtr == nullptr) { settingsPtr = Gio::Settings::create("com.github.wwmm.pulseeffects"); } else { settingsPtr = thisPtr->settings; } const auto* blocklist_preset_type = (preset_type == PresetType::output) ? "blocklist-out" : "blocklist-in"; std::vector bl = settingsPtr->get_string_array(blocklist_preset_type); bl.erase(std::remove_if(bl.begin(), bl.end(), [=](auto& a) { return a == name; }), bl.end()); settingsPtr->set_string_array(blocklist_preset_type, bl); switch (preset_type) { case PresetType::output: populate_blocklist_out_listbox(); break; case PresetType::input: populate_blocklist_in_listbox(); break; } util::debug("blocklist_settings_ui: an entry has been removed from the blocklist"); } auto BlocklistSettingsUi::app_is_blocklisted(const std::string& name, PresetType preset_type) -> bool { Glib::RefPtr settingsPtr; if (thisPtr == nullptr) { settingsPtr = Gio::Settings::create("com.github.wwmm.pulseeffects"); } else { settingsPtr = thisPtr->settings; } const auto* blocklist_preset_type = (preset_type == PresetType::output) ? "blocklist-out" : "blocklist-in"; std::vector bl = settingsPtr->get_string_array(blocklist_preset_type); return std::find(std::begin(bl), std::end(bl), name) != std::end(bl); } void BlocklistSettingsUi::add_to_stack(Gtk::Stack* stack) { auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/blocklist_settings.glade"); BlocklistSettingsUi* ui = nullptr; builder->get_widget_derived("widgets_grid", ui); stack->add(*ui, "settings_blocklist", _("Blocklist")); } void BlocklistSettingsUi::populate_blocklist_in_listbox() { Glib::RefPtr settingsPtr; if (thisPtr == nullptr) { settingsPtr = Gio::Settings::create("com.github.wwmm.pulseeffects"); } else { settingsPtr = thisPtr->settings; } auto children = blocklist_in_listbox->get_children(); for (const auto& c : children) { blocklist_in_listbox->remove(*c); } std::vector names = settingsPtr->get_string_array("blocklist-in"); for (const auto& name : names) { auto b = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/blocklist_row.glade"); Gtk::ListBoxRow* row = nullptr; Gtk::Button* remove_btn = nullptr; Gtk::Label* label = nullptr; b->get_widget("blocklist_row", row); b->get_widget("remove", remove_btn); b->get_widget("name", label); row->set_name(name); label->set_text(name); connections.emplace_back(remove_btn->signal_clicked().connect([=]() { remove_entry(name, PresetType::input); })); blocklist_in_listbox->add(*row); blocklist_in_listbox->show_all(); } } void BlocklistSettingsUi::populate_blocklist_out_listbox() { Glib::RefPtr settingsPtr; if (thisPtr == nullptr) { settingsPtr = Gio::Settings::create("com.github.wwmm.pulseeffects"); } else { settingsPtr = thisPtr->settings; } auto children = blocklist_out_listbox->get_children(); for (const auto& c : children) { blocklist_out_listbox->remove(*c); } std::vector names = settingsPtr->get_string_array("blocklist-out"); for (const auto& name : names) { auto b = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/blocklist_row.glade"); Gtk::ListBoxRow* row; Gtk::Button* remove_btn; Gtk::Label* label; b->get_widget("blocklist_row", row); b->get_widget("remove", remove_btn); b->get_widget("name", label); row->set_name(name); label->set_text(name); connections.emplace_back(remove_btn->signal_clicked().connect([=]() { remove_entry(name, PresetType::output); })); blocklist_out_listbox->add(*row); blocklist_out_listbox->show_all(); } } auto BlocklistSettingsUi::on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int { auto name1 = row1->get_name(); auto name2 = row2->get_name(); std::vector names = {name1, name2}; std::sort(names.begin(), names.end()); if (name1 == names[0]) { return -1; } if (name2 == names[0]) { return 1; } return 0; } easyeffects-4.8.7/src/calibration_mic.cpp000066400000000000000000000125341424023573300204550ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "calibration_mic.hpp" #include #include #include "util.hpp" namespace { void on_message_state_changed(const GstBus* gst_bus, GstMessage* message, CalibrationMic* cs) { if (GST_OBJECT_NAME(message->src) == std::string("pipeline")) { GstState old_state; GstState new_state; gst_message_parse_state_changed(message, &old_state, &new_state, nullptr); util::debug(cs->log_tag + gst_element_state_get_name(new_state)); } } void on_message_element(const GstBus* gst_bus, GstMessage* message, CalibrationMic* cs) { if (GST_OBJECT_NAME(message->src) == std::string("spectrum")) { const GstStructure* s = gst_message_get_structure(message); const GValue* magnitudes; magnitudes = gst_structure_get_value(s, "magnitude"); for (uint n = 0U; n < cs->spectrum_freqs.size(); n++) { cs->spectrum_mag_tmp[n] = g_value_get_float(gst_value_list_get_value(magnitudes, n)); } boost::math::interpolators::cardinal_cubic_b_spline spline( cs->spectrum_mag_tmp.begin(), cs->spectrum_mag_tmp.end(), cs->spline_f0, cs->spline_df); for (uint n = 0U; n < cs->spectrum_mag.size(); n++) { cs->spectrum_mag[n] = spline(cs->spectrum_x_axis[n]); } if (cs->measure_noise) { cs->noise = cs->spectrum_mag; cs->measure_noise = false; cs->noise_measured.emit(); } if (cs->subtract_noise) { for (unsigned long int n = 0U; n < cs->spectrum_mag.size(); n++) { cs->spectrum_mag[n] -= cs->noise[n]; } } auto min_mag = *std::min_element(cs->spectrum_mag.begin(), cs->spectrum_mag.end()); auto max_mag = *std::max_element(cs->spectrum_mag.begin(), cs->spectrum_mag.end()); if (max_mag > min_mag) { for (float& v : cs->spectrum_mag) { v = (v - min_mag) / (max_mag - min_mag); } Glib::signal_idle().connect_once([=] { cs->new_spectrum.emit(cs->spectrum_mag); }); } } } } // namespace CalibrationMic::CalibrationMic() { gst_init(nullptr, nullptr); pipeline = gst_pipeline_new("pipeline"); bus = gst_element_get_bus(pipeline); gst_bus_add_signal_watch(bus); // bus callbacks g_signal_connect(bus, "message::state-changed", G_CALLBACK(on_message_state_changed), this); g_signal_connect(bus, "message::element", G_CALLBACK(on_message_element), this); // creating elements source = gst_element_factory_make("pulsesrc", "source"); sink = gst_element_factory_make("fakesink", "sink"); spectrum = gst_element_factory_make("spectrum", "spectrum"); auto capsfilter = gst_element_factory_make("capsfilter", nullptr); auto queue = gst_element_factory_make("queue", nullptr); // building the pipeline gst_bin_add_many(GST_BIN(pipeline), source, capsfilter, queue, spectrum, sink, nullptr); gst_element_link_many(source, capsfilter, queue, spectrum, sink, nullptr); // setting a few parameters auto props = gst_structure_from_string("props,application.name=PulseEffectsCalibration", nullptr); auto caps = gst_caps_from_string("audio/x-raw,format=F32LE,channels=1,rate=48000"); g_object_set(source, "volume", 1.0, nullptr); g_object_set(source, "mute", 0, nullptr); g_object_set(source, "stream-properties", props, nullptr); g_object_set(capsfilter, "caps", caps, nullptr); g_object_set(queue, "silent", 1, nullptr); g_object_set(spectrum, "bands", spectrum_nbands, nullptr); g_object_set(spectrum, "threshold", spectrum_threshold, nullptr); gst_structure_free(props); gst_caps_unref(caps); // init spectrum for (uint n = 0U; n < spectrum_nbands; n++) { auto f = 48000.0 * (0.5 * n + 0.25) / spectrum_nbands; if (f > max_spectrum_freq) { break; } if (f > min_spectrum_freq) { spectrum_freqs.emplace_back(f); } } spectrum_mag_tmp.resize(spectrum_freqs.size()); spectrum_x_axis = util::logspace(log10(static_cast(min_spectrum_freq)), log10(static_cast(max_spectrum_freq)), spectrum_npoints); spectrum_mag.resize(spectrum_npoints); spline_f0 = spectrum_freqs[0]; spline_df = spectrum_freqs[1] - spectrum_freqs[0]; gst_element_set_state(pipeline, GST_STATE_PLAYING); } CalibrationMic::~CalibrationMic() { gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(bus); gst_object_unref(pipeline); util::debug(log_tag + "destroyed"); } void CalibrationMic::set_source_monitor_name(const std::string& name) { g_object_set(source, "device", name.c_str(), nullptr); } void CalibrationMic::set_window(const double& value) { g_object_set(spectrum, "interval", (int64_t)(value * 1000000000), nullptr); } easyeffects-4.8.7/src/calibration_mic_ui.cpp000066400000000000000000000032721424023573300211510ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "calibration_mic_ui.hpp" #include "util.hpp" CalibrationMicUi::CalibrationMicUi(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Grid(cobject), cm(std::make_unique()) { // loading glade widgets builder->get_widget("measure_noise", measure_noise); builder->get_widget("subtract_noise", subtract_noise); builder->get_widget("time_window", time_window); builder->get_widget("spinner", spinner); measure_noise->signal_clicked().connect([=]() { cm->measure_noise = true; spinner->start(); }); subtract_noise->signal_toggled().connect([=]() { cm->subtract_noise = subtract_noise->get_active(); }); time_window->signal_value_changed().connect([=]() { cm->set_window(time_window->get_value()); }); cm->noise_measured.connect([=]() { spinner->stop(); }); time_window->set_value(default_time_window); } CalibrationMicUi::~CalibrationMicUi() { util::debug(log_tag + "destroyed"); } easyeffects-4.8.7/src/calibration_signals.cpp000066400000000000000000000122321424023573300213400ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "calibration_signals.hpp" #include #include #include "util.hpp" namespace { void on_message_state_changed(const GstBus* gst_bus, GstMessage* message, CalibrationSignals* cs) { if (GST_OBJECT_NAME(message->src) == std::string("pipeline")) { GstState old_state; GstState new_state; gst_message_parse_state_changed(message, &old_state, &new_state, nullptr); util::debug(cs->log_tag + gst_element_state_get_name(new_state)); } } void on_message_element(const GstBus* gst_bus, GstMessage* message, CalibrationSignals* cs) { if (GST_OBJECT_NAME(message->src) == std::string("spectrum")) { const GstStructure* s = gst_message_get_structure(message); const GValue* magnitudes = nullptr; magnitudes = gst_structure_get_value(s, "magnitude"); for (uint n = 0U; n < cs->spectrum_freqs.size(); n++) { cs->spectrum_mag_tmp[n] = g_value_get_float(gst_value_list_get_value(magnitudes, n)); } boost::math::interpolators::cardinal_cubic_b_spline spline( cs->spectrum_mag_tmp.begin(), cs->spectrum_mag_tmp.end(), cs->spline_f0, cs->spline_df); for (uint n = 0U; n < cs->spectrum_mag.size(); n++) { cs->spectrum_mag[n] = spline(cs->spectrum_x_axis[n]); } auto min_mag = *std::min_element(cs->spectrum_mag.begin(), cs->spectrum_mag.end()); auto max_mag = *std::max_element(cs->spectrum_mag.begin(), cs->spectrum_mag.end()); if (max_mag > min_mag) { for (float& v : cs->spectrum_mag) { v = (v - min_mag) / (max_mag - min_mag); } Glib::signal_idle().connect_once([=] { cs->new_spectrum.emit(cs->spectrum_mag); }); } } } } // namespace CalibrationSignals::CalibrationSignals() { gst_init(nullptr, nullptr); pipeline = gst_pipeline_new("pipeline"); bus = gst_element_get_bus(pipeline); gst_bus_add_signal_watch(bus); // bus callbacks g_signal_connect(bus, "message::state-changed", G_CALLBACK(on_message_state_changed), this); g_signal_connect(bus, "message::element", G_CALLBACK(on_message_element), this); // creating elements source = gst_element_factory_make("audiotestsrc", "source"); sink = gst_element_factory_make("pulsesink", "sink"); spectrum = gst_element_factory_make("spectrum", "spectrum"); auto* capsfilter = gst_element_factory_make("capsfilter", nullptr); auto* queue = gst_element_factory_make("queue", nullptr); // building the pipeline gst_bin_add_many(GST_BIN(pipeline), source, capsfilter, queue, spectrum, sink, nullptr); gst_element_link_many(source, capsfilter, queue, spectrum, sink, nullptr); // setting a few parameters auto* props = gst_structure_from_string("props,application.name=PulseEffectsCalibration", nullptr); auto* caps = gst_caps_from_string("audio/x-raw,format=F32LE,channels=2,rate=48000"); g_object_set(source, "wave", 0, nullptr); // sine g_object_set(capsfilter, "caps", caps, nullptr); g_object_set(queue, "silent", 1, nullptr); g_object_set(spectrum, "bands", spectrum_nbands, nullptr); g_object_set(spectrum, "threshold", spectrum_threshold, nullptr); g_object_set(sink, "stream-properties", props, nullptr); gst_structure_free(props); gst_caps_unref(caps); // init spectrum for (uint n = 0U; n < spectrum_nbands; n++) { auto f = 48000.0 * (0.5 * n + 0.25) / spectrum_nbands; if (f > max_spectrum_freq) { break; } if (f > min_spectrum_freq) { spectrum_freqs.emplace_back(f); } } spectrum_mag_tmp.resize(spectrum_freqs.size()); spectrum_x_axis = util::logspace(log10(static_cast(min_spectrum_freq)), log10(static_cast(max_spectrum_freq)), spectrum_npoints); spectrum_mag.resize(spectrum_npoints); spline_f0 = spectrum_freqs[0]; spline_df = spectrum_freqs[1] - spectrum_freqs[0]; } CalibrationSignals::~CalibrationSignals() { gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(bus); gst_object_unref(pipeline); util::debug(log_tag + "destroyed"); } void CalibrationSignals::start() const { gst_element_set_state(pipeline, GST_STATE_PLAYING); } void CalibrationSignals::stop() const { gst_element_set_state(pipeline, GST_STATE_NULL); } void CalibrationSignals::set_freq(const double& value) const { g_object_set(source, "freq", value, nullptr); } void CalibrationSignals::set_volume(const double& value) const { g_object_set(source, "volume", value, nullptr); } easyeffects-4.8.7/src/calibration_signals_ui.cpp000066400000000000000000000035221424023573300220370ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "calibration_signals_ui.hpp" #include "util.hpp" CalibrationSignalsUi::CalibrationSignalsUi(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Grid(cobject), cs(std::make_unique()) { // loading glade widgets builder->get_widget("enable", enable); builder->get_widget("volume", volume); builder->get_widget("frequency", frequency); builder->get_widget("wave", wave); enable->signal_state_set().connect( [=](bool status) { if (status) { cs->start(); } else { cs->stop(); } return false; }, false); g_object_bind_property(wave->gobj(), "active", cs->source, "wave", G_BINDING_DEFAULT); frequency->signal_value_changed().connect([=]() { cs->set_freq(frequency->get_value()); }); volume->signal_value_changed().connect([=]() { cs->set_volume(volume->get_value()); }); // default values wave->set_active(0); // sine frequency->set_value(1000.0); volume->set_value(1.0); } CalibrationSignalsUi::~CalibrationSignalsUi() { util::debug(log_tag + "destroyed"); } easyeffects-4.8.7/src/calibration_ui.cpp000066400000000000000000000145411424023573300203220ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "calibration_ui.hpp" CalibrationUi::CalibrationUi(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Window(cobject), global_locale(util::get_global_locale()) { // loading glade widgets builder->get_widget("stack", stack); builder->get_widget("spectrum", spectrum); builder->get_widget("headerbar", headerbar); spectrum->signal_draw().connect(sigc::mem_fun(*this, &CalibrationUi::on_spectrum_draw)); spectrum->signal_enter_notify_event().connect(sigc::mem_fun(*this, &CalibrationUi::on_spectrum_enter_notify_event)); spectrum->signal_leave_notify_event().connect(sigc::mem_fun(*this, &CalibrationUi::on_spectrum_leave_notify_event)); spectrum->signal_motion_notify_event().connect(sigc::mem_fun(*this, &CalibrationUi::on_spectrum_motion_notify_event)); stack->connect_property_changed("visible-child", sigc::mem_fun(*this, &CalibrationUi::on_stack_visible_child_changed)); auto builder_signals = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/calibration_signals.glade"); auto builder_mic = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/calibration_mic.glade"); builder_signals->get_widget_derived("widgets_grid", calibration_signals_ui); builder_mic->get_widget_derived("widgets_grid", calibration_mic_ui); stack->add(*calibration_signals_ui, "signals"); stack->child_property_icon_name(*calibration_signals_ui).set_value("pulseeffects-sine-symbolic"); stack->add(*calibration_mic_ui, "mic"); stack->child_property_icon_name(*calibration_mic_ui).set_value("audio-input-microphone-symbolic"); // default spectrum connection spectrum_connection = calibration_signals_ui->cs->new_spectrum.connect(sigc::mem_fun(*this, &CalibrationUi::on_new_spectrum)); headerbar->set_subtitle(_("Test Signals")); } CalibrationUi::~CalibrationUi() { util::debug(log_tag + "destroyed"); } auto CalibrationUi::create() -> CalibrationUi* { auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/calibration.glade"); CalibrationUi* window = nullptr; builder->get_widget_derived("window", window); return window; } void CalibrationUi::set_source_monitor_name(const std::string& name) { calibration_mic_ui->cm->set_source_monitor_name(name); } void CalibrationUi::on_new_spectrum(const std::vector& magnitudes) { spectrum_mag = magnitudes; min_mag = *std::min_element(spectrum_mag.begin(), spectrum_mag.end()); max_mag = *std::max_element(spectrum_mag.begin(), spectrum_mag.end()); spectrum->queue_draw(); } auto CalibrationUi::on_spectrum_draw(const Cairo::RefPtr& ctx) -> bool { ctx->paint(); auto n_bars = spectrum_mag.size(); if (n_bars > 0) { auto allocation = spectrum->get_allocation(); auto width = allocation.get_width(); auto height = allocation.get_height(); auto n_bars = spectrum_mag.size(); auto x = util::linspace(0.0F, static_cast(width), n_bars); for (uint n = 0U; n < n_bars - 1U; n++) { auto bar_height = spectrum_mag[n] * height; ctx->move_to(x[n], height - bar_height); bar_height = spectrum_mag[n + 1U] * height; ctx->line_to(x[n + 1U], height - bar_height); } auto color = Gdk::RGBA(); auto style_ctx = spectrum->get_style_context(); style_ctx->lookup_color("theme_selected_bg_color", color); ctx->set_source_rgba(color.get_red(), color.get_green(), color.get_blue(), 1.0); ctx->set_line_width(1.5); ctx->stroke(); if (mouse_inside) { std::ostringstream msg; msg.imbue(global_locale); msg.precision(0); msg << std::fixed << mouse_freq << " Hz, "; msg << std::fixed << mouse_intensity << " dB"; Pango::FontDescription font; font.set_family("Monospace"); font.set_weight(Pango::WEIGHT_BOLD); int text_width = 0; int text_height = 0; auto layout = create_pango_layout(msg.str()); layout->set_font_description(font); layout->get_pixel_size(text_width, text_height); ctx->move_to(width - text_width, 0); layout->show_in_cairo_context(ctx); } } return false; } auto CalibrationUi::on_spectrum_enter_notify_event(GdkEventCrossing* event) -> bool { mouse_inside = true; return false; } auto CalibrationUi::on_spectrum_leave_notify_event(GdkEventCrossing* event) -> bool { mouse_inside = false; return false; } auto CalibrationUi::on_spectrum_motion_notify_event(GdkEventMotion* event) -> bool { auto allocation = spectrum->get_allocation(); auto width = allocation.get_width(); auto height = allocation.get_height(); // frequency axis is logarithmic // 20 Hz = 10^(1.3), 20000 Hz = 10^(4.3) mouse_freq = pow(10, 1.3 + event->x * 3.0 / width); // intensity scale is in decibel // minimum intensity is -120 dB and maximum is 0 dB mouse_intensity = max_mag - event->y * (max_mag - min_mag) / height; spectrum->queue_draw(); return false; } void CalibrationUi::on_stack_visible_child_changed() { auto name = stack->get_visible_child_name(); if (name == std::string("signals")) { spectrum_connection.disconnect(); headerbar->set_subtitle(_("Test Signals")); spectrum_connection = calibration_signals_ui->cs->new_spectrum.connect(sigc::mem_fun(*this, &CalibrationUi::on_new_spectrum)); } else if (name == std::string("mic")) { spectrum_connection.disconnect(); headerbar->set_subtitle(_("Calibration Microphone")); spectrum_connection = calibration_mic_ui->cm->new_spectrum.connect(sigc::mem_fun(*this, &CalibrationUi::on_new_spectrum)); } spectrum_mag.clear(); spectrum->queue_draw(); } easyeffects-4.8.7/src/compressor.cpp000066400000000000000000000216331424023573300175320ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "compressor.hpp" #include #include #include #include "util.hpp" namespace { auto mode_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "Downward") == 0) { g_value_set_enum(value, 0); } else if (std::strcmp(v, "Upward") == 0) { g_value_set_enum(value, 1); } return 1; } auto int_to_mode_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("Downward"); case 1: return g_variant_new_string("Upward"); default: return g_variant_new_string("Downward"); } } void on_post_messages_changed(GSettings* settings, gchar* key, Compressor* l) { const auto post = g_settings_get_boolean(settings, key); if (post) { if (!l->input_level_connection.connected()) { l->input_level_connection = Glib::signal_timeout().connect( [l]() { float inL = 0.0F; float inR = 0.0F; g_object_get(l->compressor, "ilm-l", &inL, nullptr); g_object_get(l->compressor, "ilm-r", &inR, nullptr); std::array in_peak = {inL, inR}; l->input_level.emit(in_peak); return true; }, 100); } if (!l->output_level_connection.connected()) { l->output_level_connection = Glib::signal_timeout().connect( [l]() { float outL = 0.0F; float outR = 0.0F; g_object_get(l->compressor, "olm-l", &outL, nullptr); g_object_get(l->compressor, "olm-r", &outR, nullptr); std::array out_peak = {outL, outR}; l->output_level.emit(out_peak); return true; }, 100); } if (!l->reduction_connection.connected()) { l->reduction_connection = Glib::signal_timeout().connect( [l]() { float compression = 0.0F; g_object_get(l->compressor, "rlm", &compression, nullptr); l->reduction.emit(compression); return true; }, 100); } if (!l->sidechain_connection.connected()) { l->sidechain_connection = Glib::signal_timeout().connect( [l]() { float v = 0.0F; g_object_get(l->compressor, "slm", &v, nullptr); l->sidechain.emit(v); return true; }, 100); } if (!l->curve_connection.connected()) { l->curve_connection = Glib::signal_timeout().connect( [l]() { float v = 0.0F; g_object_get(l->compressor, "clm", &v, nullptr); l->curve.emit(v); return true; }, 100); } } else { l->input_level_connection.disconnect(); l->output_level_connection.disconnect(); l->reduction_connection.disconnect(); l->sidechain_connection.disconnect(); l->curve_connection.disconnect(); } } } // namespace Compressor::Compressor(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "compressor", schema, schema_path) { compressor = gst_element_factory_make("lsp-plug-in-plugins-lv2-compressor-stereo", nullptr); if (is_installed(compressor)) { auto* audioconvert_in = gst_element_factory_make("audioconvert", "compressor_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "compressor_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), audioconvert_in, compressor, audioconvert_out, nullptr); gst_element_link_many(audioconvert_in, compressor, audioconvert_out, nullptr); auto* pad_sink = gst_element_get_static_pad(audioconvert_in, "sink"); auto* pad_src = gst_element_get_static_pad(audioconvert_out, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(compressor, "enabled", 1, nullptr); g_object_set(compressor, "pause", 1, nullptr); // pause graph analysis g_object_set(compressor, "cdr", 0.0F, nullptr); // dry gain g_object_set(compressor, "cwt", 1.0F, nullptr); /// wet gain bind_to_gsettings(); g_signal_connect(settings, "changed::post-messages", G_CALLBACK(on_post_messages_changed), this); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Compressor::~Compressor() { util::debug(log_tag + name + " destroyed"); } void Compressor::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "mode", compressor, "cm", G_SETTINGS_BIND_DEFAULT, mode_enum_to_int, int_to_mode_enum, nullptr, nullptr); g_settings_bind(settings, "sidechain-listen", compressor, "scl", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "sidechain-type", compressor, "sct", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "sidechain-mode", compressor, "scm", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "sidechain-source", compressor, "scs", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "hpf-mode", compressor, "shpm", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "lpf-mode", compressor, "slpm", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "input-gain", compressor, "g-in", G_SETTINGS_BIND_GET, util::db20_gain_to_linear, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", compressor, "g-out", G_SETTINGS_BIND_GET, util::db20_gain_to_linear, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "attack", compressor, "at", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "release", compressor, "rt", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "release-threshold", compressor, "rrl", G_SETTINGS_BIND_GET, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "ratio", compressor, "cr", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "threshold", compressor, "al", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "knee", compressor, "kn", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "makeup", compressor, "mk", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "boost-threshold", compressor, "bth", G_SETTINGS_BIND_GET, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "sidechain-preamp", compressor, "scp", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "sidechain-reactivity", compressor, "scr", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "sidechain-lookahead", compressor, "sla", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "hpf-frequency", compressor, "shpf", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "lpf-frequency", compressor, "slpf", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); } easyeffects-4.8.7/src/compressor_preset.cpp000066400000000000000000000142271424023573300211150ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "compressor_preset.hpp" CompressorPreset::CompressorPreset() : input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.compressor", "/com/github/wwmm/pulseeffects/sourceoutputs/compressor/")), output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.compressor", "/com/github/wwmm/pulseeffects/sinkinputs/compressor/")) {} void CompressorPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".compressor.state", settings->get_boolean("state")); root.put(section + ".compressor.input-gain", settings->get_double("input-gain")); root.put(section + ".compressor.output-gain", settings->get_double("output-gain")); root.put(section + ".compressor.mode", settings->get_string("mode")); root.put(section + ".compressor.attack", settings->get_double("attack")); root.put(section + ".compressor.release", settings->get_double("release")); root.put(section + ".compressor.release-threshold", settings->get_double("release-threshold")); root.put(section + ".compressor.threshold", settings->get_double("threshold")); root.put(section + ".compressor.ratio", settings->get_double("ratio")); root.put(section + ".compressor.knee", settings->get_double("knee")); root.put(section + ".compressor.makeup", settings->get_double("makeup")); root.put(section + ".compressor.boost-threshold", settings->get_double("boost-threshold")); root.put(section + ".compressor.sidechain.listen", settings->get_boolean("sidechain-listen")); root.put(section + ".compressor.sidechain.type", settings->get_string("sidechain-type")); root.put(section + ".compressor.sidechain.mode", settings->get_string("sidechain-mode")); root.put(section + ".compressor.sidechain.source", settings->get_string("sidechain-source")); root.put(section + ".compressor.sidechain.preamp", settings->get_double("sidechain-preamp")); root.put(section + ".compressor.sidechain.reactivity", settings->get_double("sidechain-reactivity")); root.put(section + ".compressor.sidechain.lookahead", settings->get_double("sidechain-lookahead")); root.put(section + ".compressor.hpf-mode", settings->get_string("hpf-mode")); root.put(section + ".compressor.hpf-frequency", settings->get_double("hpf-frequency")); root.put(section + ".compressor.lpf-mode", settings->get_string("lpf-mode")); root.put(section + ".compressor.lpf-frequency", settings->get_double("lpf-frequency")); } void CompressorPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".compressor.state"); update_key(root, settings, "input-gain", section + ".compressor.input-gain"); update_key(root, settings, "output-gain", section + ".compressor.output-gain"); update_string_key(root, settings, "mode", section + ".compressor.mode"); update_key(root, settings, "attack", section + ".compressor.attack"); update_key(root, settings, "release", section + ".compressor.release"); update_key(root, settings, "release-threshold", section + ".compressor.release-threshold"); update_key(root, settings, "threshold", section + ".compressor.threshold"); update_key(root, settings, "ratio", section + ".compressor.ratio"); update_key(root, settings, "knee", section + ".compressor.knee"); update_key(root, settings, "makeup", section + ".compressor.makeup"); update_key(root, settings, "boost-threshold", section + ".compressor.boost-threshold"); update_key(root, settings, "sidechain-listen", section + ".compressor.sidechain.listen"); update_string_key(root, settings, "sidechain-type", section + ".compressor.sidechain.type"); update_string_key(root, settings, "sidechain-mode", section + ".compressor.sidechain.mode"); update_string_key(root, settings, "sidechain-source", section + ".compressor.sidechain.source"); update_key(root, settings, "sidechain-preamp", section + ".compressor.sidechain.preamp"); update_key(root, settings, "sidechain-reactivity", section + ".compressor.sidechain.reactivity"); update_key(root, settings, "sidechain-lookahead", section + ".compressor.sidechain.lookahead"); update_string_key(root, settings, "hpf-mode", section + ".compressor.hpf-mode"); update_key(root, settings, "hpf-frequency", section + ".compressor.hpf-frequency"); update_string_key(root, settings, "lpf-mode", section + ".compressor.lpf-mode"); update_key(root, settings, "lpf-frequency", section + ".compressor.lpf-frequency"); } void CompressorPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: save(root, "output", output_settings); break; case PresetType::input: save(root, "input", input_settings); break; } } void CompressorPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: load(root, "output", output_settings); break; case PresetType::input: load(root, "input", input_settings); break; } } easyeffects-4.8.7/src/compressor_ui.cpp000066400000000000000000000252771424023573300202370ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "compressor_ui.hpp" namespace { auto mode_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "Downward") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "Upward") == 0) { g_value_set_int(value, 1); } return 1; } auto int_to_mode_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("Downward"); case 1: return g_variant_new_string("Upward"); default: return g_variant_new_string("Downward"); } } auto sidechain_type_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "Feed-forward") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "Feed-back") == 0) { g_value_set_int(value, 1); } return 1; } auto int_to_sidechain_type_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("Feed-forward"); case 1: return g_variant_new_string("Feed-back"); default: return g_variant_new_string("Feed-forward"); } } auto sidechain_mode_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "Peak") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "RMS") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "Low-Pass") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "Uniform") == 0) { g_value_set_int(value, 3); } return 1; } auto int_to_sidechain_mode_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("Peak"); case 1: return g_variant_new_string("RMS"); case 2: return g_variant_new_string("Low-Pass"); case 3: return g_variant_new_string("Uniform"); default: return g_variant_new_string("RMS"); } } auto sidechain_source_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "Middle") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "Side") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "Left") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "Right") == 0) { g_value_set_int(value, 3); } return 1; } auto int_to_sidechain_source_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("Middle"); case 1: return g_variant_new_string("Side"); case 2: return g_variant_new_string("Left"); case 3: return g_variant_new_string("Right"); default: return g_variant_new_string("Middle"); } } auto filter_mode_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "off") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "12 dB/oct") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "24 dB/oct") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "36 dB/oct") == 0) { g_value_set_int(value, 3); } return 1; } auto int_to_filter_mode_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("off"); case 1: return g_variant_new_string("12 dB/oct"); case 2: return g_variant_new_string("24 dB/oct"); case 3: return g_variant_new_string("36 dB/oct"); default: return g_variant_new_string("off"); } } } // namespace CompressorUi::CompressorUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "compressor"; // loading glade widgets builder->get_widget("listen", listen); builder->get_widget("compression_mode", compression_mode); builder->get_widget("sidechain_type", sidechain_type); builder->get_widget("sidechain_mode", sidechain_mode); builder->get_widget("sidechain_source", sidechain_source); builder->get_widget("hpf_mode", hpf_mode); builder->get_widget("lpf_mode", lpf_mode); builder->get_widget("reduction", reduction); builder->get_widget("reduction_label", reduction_label); builder->get_widget("sidechain", sidechain); builder->get_widget("sidechain_label", sidechain_label); builder->get_widget("curve", curve); builder->get_widget("curve_label", curve_label); builder->get_widget("plugin_reset", reset_button); get_object(builder, "attack", attack); get_object(builder, "knee", knee); get_object(builder, "makeup", makeup); get_object(builder, "ratio", ratio); get_object(builder, "release", release); get_object(builder, "threshold", threshold); get_object(builder, "preamp", preamp); get_object(builder, "reactivity", reactivity); get_object(builder, "lookahead", lookahead); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); get_object(builder, "release_threshold", release_threshold); get_object(builder, "boost_threshold", boost_threshold); get_object(builder, "hpf_freq", hpf_freq); get_object(builder, "lpf_freq", lpf_freq); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("attack", attack.get(), "value", flag); settings->bind("knee", knee.get(), "value", flag); settings->bind("makeup", makeup.get(), "value", flag); settings->bind("ratio", ratio.get(), "value", flag); settings->bind("release", release.get(), "value", flag); settings->bind("threshold", threshold.get(), "value", flag); settings->bind("sidechain-listen", listen, "active", flag); settings->bind("sidechain-preamp", preamp.get(), "value", flag); settings->bind("sidechain-reactivity", reactivity.get(), "value", flag); settings->bind("sidechain-lookahead", lookahead.get(), "value", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); settings->bind("release-threshold", release_threshold.get(), "value", flag); settings->bind("boost-threshold", boost_threshold.get(), "value", flag); settings->bind("hpf-frequency", hpf_freq.get(), "value", flag); settings->bind("lpf-frequency", lpf_freq.get(), "value", flag); g_settings_bind_with_mapping(settings->gobj(), "mode", compression_mode->gobj(), "active", G_SETTINGS_BIND_DEFAULT, mode_enum_to_int, int_to_mode_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "sidechain-type", sidechain_type->gobj(), "active", G_SETTINGS_BIND_DEFAULT, sidechain_type_enum_to_int, int_to_sidechain_type_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "sidechain-mode", sidechain_mode->gobj(), "active", G_SETTINGS_BIND_DEFAULT, sidechain_mode_enum_to_int, int_to_sidechain_mode_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "sidechain-source", sidechain_source->gobj(), "active", G_SETTINGS_BIND_DEFAULT, sidechain_source_enum_to_int, int_to_sidechain_source_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "hpf-mode", hpf_mode->gobj(), "active", G_SETTINGS_BIND_DEFAULT, filter_mode_enum_to_int, int_to_filter_mode_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "lpf-mode", lpf_mode->gobj(), "active", G_SETTINGS_BIND_DEFAULT, filter_mode_enum_to_int, int_to_filter_mode_enum, nullptr, nullptr); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } CompressorUi::~CompressorUi() { util::debug(name + " ui destroyed"); } void CompressorUi::reset() { settings->reset("input-gain"); settings->reset("output-gain"); settings->reset("mode"); settings->reset("attack"); settings->reset("release"); settings->reset("release-threshold"); settings->reset("threshold"); settings->reset("ratio"); settings->reset("knee"); settings->reset("makeup"); settings->reset("boost-threshold"); settings->reset("sidechain-listen"); settings->reset("sidechain-type"); settings->reset("sidechain-mode"); settings->reset("sidechain-source"); settings->reset("sidechain-preamp"); settings->reset("sidechain-reactivity"); settings->reset("sidechain-lookahead"); settings->reset("hpf-mode"); settings->reset("hpf-frequency"); settings->reset("lpf-mode"); settings->reset("lpf-frequency"); } void CompressorUi::on_new_reduction(double value) { reduction->set_value(value); reduction_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void CompressorUi::on_new_sidechain(double value) { sidechain->set_value(value); sidechain_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void CompressorUi::on_new_curve(double value) { curve->set_value(value); curve_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } easyeffects-4.8.7/src/convolver.cpp000066400000000000000000000066121424023573300173530ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "convolver.hpp" #include #include "util.hpp" Convolver::Convolver(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "convolver", schema, schema_path) { convolver = gst_element_factory_make("peconvolver", "convolver"); if (is_installed(convolver)) { auto* input_gain = gst_element_factory_make("volume", nullptr); auto* in_level = gst_element_factory_make("level", "convolver_input_level"); auto* out_level = gst_element_factory_make("level", "convolver_output_level"); auto* output_gain = gst_element_factory_make("volume", nullptr); auto* audioconvert_in = gst_element_factory_make("audioconvert", "convolver_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "convolver_audioconvert_out"); adapter = gst_element_factory_make("peadapter", nullptr); gst_bin_add_many(GST_BIN(bin), input_gain, in_level, adapter, audioconvert_in, convolver, audioconvert_out, output_gain, out_level, nullptr); gst_element_link_many(input_gain, in_level, adapter, audioconvert_in, convolver, audioconvert_out, output_gain, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(input_gain, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(adapter, "blocksize", 512, nullptr); bind_to_gsettings(); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "input-gain", input_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", output_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Convolver::~Convolver() { util::debug(log_tag + name + " destroyed"); } void Convolver::bind_to_gsettings() { g_settings_bind(settings, "kernel-path", convolver, "kernel-path", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "ir-width", convolver, "ir-width", G_SETTINGS_BIND_DEFAULT); } easyeffects-4.8.7/src/convolver/000077500000000000000000000000001424023573300166425ustar00rootroot00000000000000easyeffects-4.8.7/src/convolver/README.md000066400000000000000000000010001424023573300201100ustar00rootroot00000000000000# PulseEffects Convolver Simple convolver plugin based on the library Zita-convolver and inspired in the convolvers [https://github.com/tomszilagyi/ir.lv2/](https://github.com/tomszilagyi/ir.lv2/) and [https://github.com/x42/convoLV2](https://github.com/x42/convoLV2). You can test it from command line executing: `gst-launch-1.0 -v audiotestsrc blocksize=512 ! peconvolver kernel-path=full_path_to_irs_file ! pulsesink` This plugin only works with a power of two blocksize [64,128,256,512,1024,2048,4096]. easyeffects-4.8.7/src/convolver/gstpeconvolver.cpp000066400000000000000000000353231424023573300224340ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ /** * SECTION:element-gstpeconvolver * * The peconvolver element does convolution with inpulse responses. * * * Example launch line * |[ * gst-launch-1.0 -v audiotestsrc blocksize=512 ! peconvolver ! pulsesink * ]| * The peconvolver element does convolution with inpulse responses. * */ #include "gstpeconvolver.hpp" #include #include #include "config.h" #include "read_kernel.hpp" GST_DEBUG_CATEGORY_STATIC(gst_peconvolver_debug_category); #define GST_CAT_DEFAULT gst_peconvolver_debug_category /* prototypes */ static void gst_peconvolver_set_property(GObject* object, guint property_id, const GValue* value, GParamSpec* pspec); static void gst_peconvolver_get_property(GObject* object, guint property_id, GValue* value, GParamSpec* pspec); static void gst_peconvolver_finalize(GObject* object); static gboolean gst_peconvolver_setup(GstAudioFilter* filter, const GstAudioInfo* info); static GstFlowReturn gst_peconvolver_transform_ip(GstBaseTransform* trans, GstBuffer* buffer); static gboolean gst_peconvolver_stop(GstBaseTransform* base); static void gst_peconvolver_set_kernel_path(GstPeconvolver* peconvolver, gchar* value); static void gst_peconvolver_set_ir_width(GstPeconvolver* peconvolver, const uint& value); static void gst_peconvolver_process(GstPeconvolver* peconvolver, GstBuffer* buffer); static void gst_peconvolver_setup_convolver(GstPeconvolver* peconvolver); static void gst_peconvolver_finish_convolver(GstPeconvolver* peconvolver); /*global variables and my defines*/ // taken from https://github.com/x42/convoLV2/blob/master/convolution.cc /* * Priority should match -P parameter passed to jackd. * Sched.class: either SCHED_FIFO or SCHED_RR (I think Jack uses SCHED_FIFO). * * THREAD_SYNC_MODE must be true if you want to use the plugin in Jack * freewheeling mode (eg. while exporting in Ardour). You may only use * false if you *only* run the plugin realtime. */ #define CONVPROC_SCHEDULER_PRIORITY 0 #define CONVPROC_SCHEDULER_CLASS SCHED_FIFO #define THREAD_SYNC_MODE true enum { PROP_KERNEL_PATH = 1, PROP_IR_WIDTH }; /* pad templates */ static GstStaticPadTemplate gst_peconvolver_src_template = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS("audio/x-raw,format=F32LE,rate=[1,max]," "channels=2,layout=interleaved")); static GstStaticPadTemplate gst_peconvolver_sink_template = GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS("audio/x-raw,format=F32LE,rate=[1,max]," "channels=2,layout=interleaved")); /* class initialization */ G_DEFINE_TYPE_WITH_CODE(GstPeconvolver, gst_peconvolver, GST_TYPE_AUDIO_FILTER, GST_DEBUG_CATEGORY_INIT(gst_peconvolver_debug_category, "peconvolver", 0, "debug category for peconvolver element")); static void gst_peconvolver_class_init(GstPeconvolverClass* klass) { GObjectClass* gobject_class = G_OBJECT_CLASS(klass); GstBaseTransformClass* base_transform_class = GST_BASE_TRANSFORM_CLASS(klass); GstAudioFilterClass* audio_filter_class = GST_AUDIO_FILTER_CLASS(klass); /* Setting up pads and setting metadata should be moved to base_class_init if you intend to subclass this class. */ gst_element_class_add_static_pad_template(GST_ELEMENT_CLASS(klass), &gst_peconvolver_src_template); gst_element_class_add_static_pad_template(GST_ELEMENT_CLASS(klass), &gst_peconvolver_sink_template); gst_element_class_set_static_metadata(GST_ELEMENT_CLASS(klass), "PulseEffects Convolver", "Generic", "PulseEffects Convolver", "Wellington "); /* define virtual function pointers */ gobject_class->set_property = gst_peconvolver_set_property; gobject_class->get_property = gst_peconvolver_get_property; gobject_class->finalize = gst_peconvolver_finalize; audio_filter_class->setup = GST_DEBUG_FUNCPTR(gst_peconvolver_setup); base_transform_class->transform_ip = GST_DEBUG_FUNCPTR(gst_peconvolver_transform_ip); base_transform_class->transform_ip_on_passthrough = false; base_transform_class->stop = GST_DEBUG_FUNCPTR(gst_peconvolver_stop); /* define properties */ g_object_class_install_property( gobject_class, PROP_KERNEL_PATH, g_param_spec_string("kernel-path", "Kernel Path", "Full path to kernel file", nullptr, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_IR_WIDTH, g_param_spec_int("ir-width", "IR Width", "Impulse Response Stereo Width", 0, 200, 100, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } static void gst_peconvolver_init(GstPeconvolver* peconvolver) { peconvolver->log_tag = "convolver: "; peconvolver->ready = false; peconvolver->irs_fail_count = 0; peconvolver->rate = 0; peconvolver->bpf = 0; peconvolver->kernel_path = nullptr; peconvolver->ir_width = 100U; peconvolver->num_samples = 0U; gst_base_transform_set_in_place(GST_BASE_TRANSFORM(peconvolver), true); } void gst_peconvolver_set_property(GObject* object, guint property_id, const GValue* value, GParamSpec* pspec) { GstPeconvolver* peconvolver = GST_PECONVOLVER(object); GST_DEBUG_OBJECT(peconvolver, "set_property"); switch (property_id) { case PROP_KERNEL_PATH: gst_peconvolver_set_kernel_path(peconvolver, g_value_dup_string(value)); break; case PROP_IR_WIDTH: gst_peconvolver_set_ir_width(peconvolver, g_value_get_int(value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; } } void gst_peconvolver_get_property(GObject* object, guint property_id, GValue* value, GParamSpec* pspec) { GstPeconvolver* peconvolver = GST_PECONVOLVER(object); GST_DEBUG_OBJECT(peconvolver, "get_property"); switch (property_id) { case PROP_KERNEL_PATH: g_value_set_string(value, peconvolver->kernel_path); break; case PROP_IR_WIDTH: g_value_set_int(value, peconvolver->ir_width); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; } } void gst_peconvolver_finalize(GObject* object) { GstPeconvolver* peconvolver = GST_PECONVOLVER(object); GST_DEBUG_OBJECT(peconvolver, "finalize"); std::lock_guard lock(peconvolver->lock_guard_zita); gst_peconvolver_finish_convolver(peconvolver); /* clean up object here */ G_OBJECT_CLASS(gst_peconvolver_parent_class)->finalize(object); } static gboolean gst_peconvolver_setup(GstAudioFilter* filter, const GstAudioInfo* info) { GstPeconvolver* peconvolver = GST_PECONVOLVER(filter); GST_DEBUG_OBJECT(peconvolver, "setup"); peconvolver->rate = info->rate; peconvolver->bpf = GST_AUDIO_INFO_BPF(info); /* this function is called whenever there is a format change. So we reset the zita convolver. Setup will reinitialize zita when necessary. */ std::lock_guard lock(peconvolver->lock_guard_zita); gst_peconvolver_finish_convolver(peconvolver); return true; } static GstFlowReturn gst_peconvolver_transform_ip(GstBaseTransform* trans, GstBuffer* buffer) { GstPeconvolver* peconvolver = GST_PECONVOLVER(trans); GST_DEBUG_OBJECT(peconvolver, "transform"); std::lock_guard lock(peconvolver->lock_guard_zita); GstMapInfo map; gst_buffer_map(buffer, &map, GST_MAP_READ); guint num_samples = map.size / peconvolver->bpf; gst_buffer_unmap(buffer, &map); if (peconvolver->ready) { if (peconvolver->num_samples == num_samples) { gst_peconvolver_process(peconvolver, buffer); } else { gst_peconvolver_finish_convolver(peconvolver); } } else if (peconvolver->irs_fail_count == 0) { peconvolver->num_samples = num_samples; auto f = [=]() { std::lock_guard lock(peconvolver->lock_guard_zita); gst_peconvolver_setup_convolver(peconvolver); }; auto future = std::async(std::launch::async, f); peconvolver->futures.emplace_back(std::move(future)); } return GST_FLOW_OK; } static gboolean gst_peconvolver_stop(GstBaseTransform* base) { GstPeconvolver* peconvolver = GST_PECONVOLVER(base); std::lock_guard lock(peconvolver->lock_guard_zita); gst_peconvolver_finish_convolver(peconvolver); return true; } static void gst_peconvolver_set_kernel_path(GstPeconvolver* peconvolver, gchar* value) { if (value != nullptr) { if (peconvolver->kernel_path != nullptr) { std::lock_guard lock(peconvolver->lock_guard_zita); std::string old_path = peconvolver->kernel_path; g_free(peconvolver->kernel_path); peconvolver->kernel_path = value; if (peconvolver->kernel_path != nullptr) { if (old_path != peconvolver->kernel_path) { // resetting zita gst_peconvolver_finish_convolver(peconvolver); } } } else { // plugin is being initialized peconvolver->kernel_path = value; } } } static void gst_peconvolver_set_ir_width(GstPeconvolver* peconvolver, const uint& value) { if (value != peconvolver->ir_width) { std::lock_guard lock(peconvolver->lock_guard_zita); peconvolver->ir_width = value; if (peconvolver->ready) { // resetting zita gst_peconvolver_finish_convolver(peconvolver); } } } static void gst_peconvolver_setup_convolver(GstPeconvolver* peconvolver) { if (!peconvolver->ready && peconvolver->rate != 0 && peconvolver->bpf != 0) { bool irs_ok = rk::read_file(peconvolver); if (irs_ok) { bool failed = false; float density = 0.0F; int max_size = peconvolver->kernel_n_frames, ret; peconvolver->irs_fail_count = 0; peconvolver->conv = new Convproc(); unsigned int options = 0U; // depending on buffer and kernel size OPT_FFTW_MEASURE may make us crash // options |= Convproc::OPT_FFTW_MEASURE; options |= Convproc::OPT_VECTOR_MODE; peconvolver->conv->set_options(options); #if ZITA_CONVOLVER_MAJOR_VERSION == 3 peconvolver->conv->set_density(density); ret = peconvolver->conv->configure(2, 2, max_size, peconvolver->num_samples, peconvolver->num_samples, Convproc::MAXPART); #endif #if ZITA_CONVOLVER_MAJOR_VERSION == 4 ret = peconvolver->conv->configure(2, 2, max_size, peconvolver->num_samples, peconvolver->num_samples, Convproc::MAXPART, density); #endif if (ret != 0) { failed = true; util::debug(peconvolver->log_tag + "can't initialise zita-convolver engine: " + std::to_string(ret)); } ret = peconvolver->conv->impdata_create(0, 0, 1, peconvolver->kernel_L.data(), 0, peconvolver->kernel_n_frames); if (ret != 0) { failed = true; util::debug(peconvolver->log_tag + "left impdata_create failed: " + std::to_string(ret)); } ret = peconvolver->conv->impdata_create(1, 1, 1, peconvolver->kernel_R.data(), 0, peconvolver->kernel_n_frames); if (ret != 0) { failed = true; util::debug(peconvolver->log_tag + "right impdata_create failed: " + std::to_string(ret)); } ret = peconvolver->conv->start_process(CONVPROC_SCHEDULER_PRIORITY, CONVPROC_SCHEDULER_CLASS); if (ret != 0) { failed = true; util::debug(peconvolver->log_tag + "start_process failed: " + std::to_string(ret)); } peconvolver->ready = (failed) ? false : true; } else { util::debug(peconvolver->log_tag + "we will just passthrough data."); peconvolver->ready = false; peconvolver->irs_fail_count++; } } } static void gst_peconvolver_process(GstPeconvolver* peconvolver, GstBuffer* buffer) { if (peconvolver->ready) { GstMapInfo map; gst_buffer_map(buffer, &map, GST_MAP_READWRITE); // deinterleave for (unsigned int n = 0U; n < peconvolver->num_samples; n++) { peconvolver->conv->inpdata(0)[n] = (reinterpret_cast(map.data))[2U * n]; peconvolver->conv->inpdata(1)[n] = (reinterpret_cast(map.data))[2U * n + 1U]; } int ret = peconvolver->conv->process(THREAD_SYNC_MODE); if (ret != 0) { util::debug(peconvolver->log_tag + "IR: process failed: " + std::to_string(ret)); } // interleave for (unsigned int n = 0U; n < peconvolver->num_samples; n++) { (reinterpret_cast(map.data))[2U * n] = peconvolver->conv->outdata(0)[n]; (reinterpret_cast(map.data))[2U * n + 1U] = peconvolver->conv->outdata(1)[n]; } gst_buffer_unmap(buffer, &map); } } static void gst_peconvolver_finish_convolver(GstPeconvolver* peconvolver) { peconvolver->irs_fail_count = 0; if (peconvolver->ready) { peconvolver->ready = false; if (peconvolver->conv != nullptr) { if (peconvolver->conv->state() != Convproc::ST_STOP) { peconvolver->conv->stop_process(); peconvolver->conv->cleanup(); delete peconvolver->conv; peconvolver->conv = nullptr; } } peconvolver->futures.clear(); } } static gboolean plugin_init(GstPlugin* plugin) { /* FIXME Remember to set the rank if it's an element that is meant to be autoplugged by decodebin. */ return gst_element_register(plugin, "peconvolver", GST_RANK_NONE, GST_TYPE_PECONVOLVER); } GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, peconvolver, "PulseEffects Convolver", plugin_init, VERSION, "LGPL", PACKAGE, "https://github.com/wwmm/pulseeffects") easyeffects-4.8.7/src/convolver/gstpeconvolver.hpp000066400000000000000000000040511424023573300224330ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef GST_PECONVOLVER_HPP #define GST_PECONVOLVER_HPP #include #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_PECONVOLVER (gst_peconvolver_get_type()) #define GST_PECONVOLVER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_PECONVOLVER, GstPeconvolver)) #define GST_PECONVOLVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_PECONVOLVER, GstPeconvolverClass)) #define GST_IS_PECONVOLVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_PECONVOLVER)) #define GST_IS_PECONVOLVER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_PECONVOLVER)) struct GstPeconvolver { GstAudioFilter base_peconvolver; /* properties */ gchar* kernel_path = nullptr; unsigned int ir_width, num_samples; /* < private > */ bool ready; int rate, kernel_n_frames, irs_fail_count; int bpf; // bytes per frame : channels * bps std::vector kernel_L; // left channel buffer std::vector kernel_R; // right channel buffer std::string log_tag; Convproc* conv = nullptr; std::mutex lock_guard_zita; std::vector> futures; }; struct GstPeconvolverClass { GstAudioFilterClass base_peconvolver_class; }; GType gst_peconvolver_get_type(void); G_END_DECLS #endif easyeffects-4.8.7/src/convolver/meson.build000066400000000000000000000020451424023573300210050ustar00rootroot00000000000000cxx = meson.get_compiler('cpp') zita_convolver = cxx.find_library('zita-convolver', required: false) if cxx.compiles( ''' #include #if ZITA_CONVOLVER_MAJOR_VERSION != 3 && ZITA_CONVOLVER_MAJOR_VERSION != 4 #error "This programs requires zita-convolver 3 or 4" #endif ''', dependencies: [zita_convolver]) plugin_sources = [ 'gstpeconvolver.cpp', '../util.cpp' ] plugin_deps = [ dependency('gstreamer-1.0'), dependency('gstreamer-base-1.0'), dependency('gstreamer-controller-1.0'), dependency('gstreamer-audio-1.0'), dependency('sndfile'), dependency('samplerate'), dependency('threads'), zita_convolver ] plugins_install_dir = '@0@/gstreamer-1.0'.format(get_option('libdir')) library( 'gstpeconvolver', plugin_sources, include_directories : [include_dir,config_h_dir], dependencies : plugin_deps, install: true, install_dir : plugins_install_dir, cpp_args: plugins_cxx_args ) else message('Missing dependency zita-convolver = 3.x.x or zita-convolver = 4.x.x') message('Convolver plugin will not be built') endif easyeffects-4.8.7/src/convolver/read_kernel.hpp000066400000000000000000000130611424023573300216270ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef READ_KERNEL_HPP #define READ_KERNEL_HPP #include #include #include #include #include #include #include "gstpeconvolver.hpp" #include "util.hpp" namespace rk { std::string log_tag = "convolver: "; void autogain(std::vector& left, std::vector& right) { float power = 0.0F, peak = 0.0F; for (uint n = 0U; n < left.size(); n++) { peak = (left[n] > peak) ? left[n] : peak; peak = (right[n] > peak) ? right[n] : peak; } // normalize for (uint n = 0U; n < left.size(); n++) { left[n] /= peak; right[n] /= peak; } // find average power for (uint n = 0U; n < left.size(); n++) { power += left[n] * left[n] + right[n] * right[n]; } power *= 0.5F; float autogain = std::min(1.0F, 1.0F / sqrtf(power)); util::debug(log_tag + "autogain factor: " + std::to_string(autogain)); for (uint n = 0U; n < left.size(); n++) { left[n] *= autogain; right[n] *= autogain; } } /* Mid-Side based Stereo width effect taken from https://github.com/tomszilagyi/ir.lv2/blob/automatable/ir.cc */ void ms_stereo(float width, std::vector& left, std::vector& right) { float w = width / 100.0F; float x = (1.0F - w) / (1.0F + w); /* M-S coeff.; L_out = L + x*R; R_out = x*L + R */ for (uint i = 0U; i < left.size(); i++) { float L = left[i], R = right[i]; left[i] = L + x * R; right[i] = R + x * L; } } bool read_file(GstPeconvolver* peconvolver) { if (peconvolver->kernel_path == nullptr) { util::debug(log_tag + "irs file path is null"); return false; } SndfileHandle file = SndfileHandle(peconvolver->kernel_path); if (file.channels() == 0 || file.frames() == 0) { util::debug(log_tag + "irs file does not exists or it is empty: " + peconvolver->kernel_path); return false; } util::debug(log_tag + "irs file: " + peconvolver->kernel_path); util::debug(log_tag + "irs rate: " + std::to_string(file.samplerate()) + " Hz"); util::debug(log_tag + "irs channels: " + std::to_string(file.channels())); util::debug(log_tag + "irs frames: " + std::to_string(file.frames())); // for now only stereo irs files are supported if (file.channels() == 2) { bool resample = false; float resample_ratio = 1.0F; uint total_frames_in, total_frames_out, frames_in, frames_out; frames_in = file.frames(); total_frames_in = file.channels() * frames_in; std::vector buffer(total_frames_in); file.readf(buffer.data(), frames_in); if (file.samplerate() != peconvolver->rate) { resample = true; resample_ratio = static_cast(peconvolver->rate) / file.samplerate(); frames_out = ceil(file.frames() * resample_ratio); total_frames_out = file.channels() * frames_out; } else { frames_out = frames_in; total_frames_out = file.channels() * frames_out; } // allocate arrays std::vector kernel(total_frames_out); peconvolver->kernel_L.resize(frames_out); peconvolver->kernel_R.resize(frames_out); peconvolver->kernel_n_frames = frames_out; // resample if necessary if (resample) { util::debug(log_tag + "resampling irs to " + std::to_string(peconvolver->rate) + " Hz"); SRC_STATE* src_state = src_new(SRC_SINC_BEST_QUALITY, file.channels(), nullptr); SRC_DATA src_data; /* code from * https://github.com/x42/convoLV2/blob/master/convolution.cc */ // The number of frames of data pointed to by data_in src_data.input_frames = frames_in; // A pointer to the input data samples src_data.data_in = buffer.data(); // Maximum number of frames pointer to by data_out src_data.output_frames = frames_out; // A pointer to the output data samples src_data.data_out = kernel.data(); // Equal to output_sample_rate / input_sample_rate src_data.src_ratio = resample_ratio; // Equal to 0 if more input data is available and 1 otherwise src_data.end_of_input = 1; src_process(src_state, &src_data); src_delete(src_state); util::debug(log_tag + "irs frames after resampling " + std::to_string(frames_out)); } else { util::debug(log_tag + "irs file does not need resampling"); std::memcpy(kernel.data(), buffer.data(), total_frames_in * sizeof(float)); } // deinterleave for (uint n = 0U; n < frames_out; n++) { peconvolver->kernel_L[n] = kernel[2U * n]; peconvolver->kernel_R[n] = kernel[2U * n + 1U]; } autogain(peconvolver->kernel_L, peconvolver->kernel_R); ms_stereo(peconvolver->ir_width, peconvolver->kernel_L, peconvolver->kernel_R); return true; } else { util::debug(log_tag + "only stereo impulse responses are supported." + "The impulse file was not loaded!"); return false; } } } // namespace rk #endif easyeffects-4.8.7/src/convolver_preset.cpp000066400000000000000000000050561424023573300207360ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "convolver_preset.hpp" ConvolverPreset::ConvolverPreset() : output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.convolver", "/com/github/wwmm/pulseeffects/sinkinputs/convolver/")) {} void ConvolverPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".convolver.state", settings->get_boolean("state")); root.put(section + ".convolver.input-gain", settings->get_double("input-gain")); root.put(section + ".convolver.output-gain", settings->get_double("output-gain")); root.put(section + ".convolver.kernel-path", settings->get_string("kernel-path")); root.put(section + ".convolver.ir-width", settings->get_int("ir-width")); } void ConvolverPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".convolver.state"); update_key(root, settings, "input-gain", section + ".convolver.input-gain"); update_key(root, settings, "output-gain", section + ".convolver.output-gain"); update_string_key(root, settings, "kernel-path", section + ".convolver.kernel-path"); update_key(root, settings, "ir-width", section + ".convolver.ir-width"); } void ConvolverPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { save(root, "output", output_settings); } } void ConvolverPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { load(root, "output", output_settings); } } easyeffects-4.8.7/src/convolver_ui.cpp000066400000000000000000000507221424023573300200510ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "convolver_ui.hpp" ConvolverUi::ConvolverUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path), irs_dir(Glib::get_user_config_dir() + "/PulseEffects/irs"), spectrum_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.spectrum")) { name = "convolver"; // loading glade widgets builder->get_widget("irs_listbox", irs_listbox); builder->get_widget("irs_menu_button", irs_menu_button); builder->get_widget("irs_scrolled_window", irs_scrolled_window); builder->get_widget("import_irs", import_irs); builder->get_widget("left_plot", left_plot); builder->get_widget("right_plot", right_plot); builder->get_widget("file_name", label_file_name); builder->get_widget("sampling_rate", label_sampling_rate); builder->get_widget("samples", label_samples); builder->get_widget("duration", label_duration); builder->get_widget("show_fft", show_fft); builder->get_widget("plugin_reset", reset_button); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); get_object(builder, "ir_width", ir_width); font.set_family("Monospace"); font.set_weight(Pango::WEIGHT_BOLD); // drawing area callbacks left_plot->signal_draw().connect(sigc::mem_fun(*this, &ConvolverUi::on_left_draw)); left_plot->signal_motion_notify_event().connect(sigc::mem_fun(*this, &ConvolverUi::on_left_motion_notify_event)); left_plot->signal_enter_notify_event().connect(sigc::mem_fun(*this, &ConvolverUi::on_mouse_enter_notify_event)); left_plot->signal_leave_notify_event().connect(sigc::mem_fun(*this, &ConvolverUi::on_mouse_leave_notify_event)); right_plot->signal_draw().connect(sigc::mem_fun(*this, &ConvolverUi::on_right_draw)); right_plot->signal_motion_notify_event().connect(sigc::mem_fun(*this, &ConvolverUi::on_right_motion_notify_event)); right_plot->signal_enter_notify_event().connect(sigc::mem_fun(*this, &ConvolverUi::on_mouse_enter_notify_event)); right_plot->signal_leave_notify_event().connect(sigc::mem_fun(*this, &ConvolverUi::on_mouse_leave_notify_event)); // impulse response import and selection callbacks irs_menu_button->signal_clicked().connect(sigc::mem_fun(*this, &ConvolverUi::on_irs_menu_button_clicked)); irs_listbox->set_sort_func(sigc::ptr_fun(&ConvolverUi::on_listbox_sort)); import_irs->signal_clicked().connect(sigc::mem_fun(*this, &ConvolverUi::on_import_irs_clicked)); // show fft toggle button callback show_fft->signal_toggled().connect([=]() { show_fft_spectrum = show_fft->get_active(); left_plot->queue_draw(); right_plot->queue_draw(); }); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); settings->bind("ir-width", ir_width.get(), "value", flag); settings->set_boolean("post-messages", true); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); // irs dir auto dir_exists = boost::filesystem::is_directory(irs_dir); if (!dir_exists) { if (boost::filesystem::create_directories(irs_dir)) { util::debug(log_tag + "irs directory created: " + irs_dir.string()); } else { util::warning(log_tag + "failed to create irs directory: " + irs_dir.string()); } } else { util::debug(log_tag + "irs directory already exists: " + irs_dir.string()); } // reading current configured irs file auto f = [=]() { std::lock_guard lock(lock_guard_irs_info); get_irs_info(); }; auto future = std::async(std::launch::async, f); futures.emplace_back(std::move(future)); /* this is necessary to update the interface with the irs info when a preset is loaded */ connections.emplace_back(settings->signal_changed("kernel-path").connect([=](auto key) { auto f = [=]() { std::lock_guard lock(lock_guard_irs_info); get_irs_info(); }; auto future = std::async(std::launch::async, f); futures.emplace_back(std::move(future)); })); } ConvolverUi::~ConvolverUi() { futures.clear(); util::debug(name + " ui destroyed"); } void ConvolverUi::reset() { settings->reset("state"); settings->reset("input-gain"); settings->reset("output-gain"); settings->reset("kernel-path"); settings->reset("ir-width"); } auto ConvolverUi::get_irs_names() -> std::vector { boost::filesystem::directory_iterator it{irs_dir}; std::vector names; while (it != boost::filesystem::directory_iterator{}) { if (boost::filesystem::is_regular_file(it->status())) { if (it->path().extension().string() == ".irs") { names.emplace_back(it->path().stem().string()); } } it++; } return names; } void ConvolverUi::import_irs_file(const std::string& file_path) { boost::filesystem::path p{file_path}; if (boost::filesystem::is_regular_file(p)) { SndfileHandle file = SndfileHandle(file_path); if (file.channels() != 2 || file.frames() == 0) { util::warning(log_tag + " Only stereo impulse files are supported!"); util::warning(log_tag + file_path + " loading failed"); return; } auto out_path = irs_dir / p.filename(); out_path.replace_extension(".irs"); boost::filesystem::copy_file(p, out_path, boost::filesystem::copy_option::overwrite_if_exists); util::debug(log_tag + "imported irs file to: " + out_path.string()); } else { util::warning(log_tag + p.string() + " is not a file!"); } } void ConvolverUi::remove_irs_file(const std::string& name) { auto irs_file = irs_dir / boost::filesystem::path{name + ".irs"}; if (boost::filesystem::exists(irs_file)) { boost::filesystem::remove(irs_file); util::debug(log_tag + "removed irs file: " + irs_file.string()); } } auto ConvolverUi::on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int { auto name1 = row1->get_name(); auto name2 = row2->get_name(); std::vector names = {name1, name2}; std::sort(names.begin(), names.end()); if (name1 == names[0]) { return -1; } if (name2 == names[0]) { return 1; } return 0; } void ConvolverUi::populate_irs_listbox() { auto children = irs_listbox->get_children(); for (const auto& c : children) { irs_listbox->remove(*c); } auto names = get_irs_names(); for (const auto& name : names) { auto b = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/irs_row.glade"); Gtk::ListBoxRow* row = nullptr; Gtk::Button* remove_btn = nullptr; Gtk::Button* apply_btn = nullptr; Gtk::Label* label = nullptr; b->get_widget("irs_row", row); b->get_widget("remove", remove_btn); b->get_widget("apply", apply_btn); b->get_widget("name", label); row->set_name(name); label->set_text(name); connections.emplace_back(remove_btn->signal_clicked().connect([=]() { remove_irs_file(name); populate_irs_listbox(); })); connections.emplace_back(apply_btn->signal_clicked().connect([=]() { auto irs_file = irs_dir / boost::filesystem::path{row->get_name() + ".irs"}; settings->set_string("kernel-path", irs_file.string()); })); irs_listbox->add(*row); irs_listbox->show_all(); } } void ConvolverUi::on_irs_menu_button_clicked() { const float scaling_factor = 0.7F; int height = static_cast(scaling_factor * static_cast(this->get_toplevel()->get_allocated_height())); irs_scrolled_window->set_max_content_height(height); populate_irs_listbox(); } void ConvolverUi::on_import_irs_clicked() { auto* main_window = dynamic_cast(this->get_toplevel()); auto dialog = Gtk::FileChooserNative::create( _("Import Impulse File"), *main_window, Gtk::FileChooserAction::FILE_CHOOSER_ACTION_OPEN, _("Open"), _("Cancel")); auto dialog_filter = Gtk::FileFilter::create(); dialog_filter->set_name(_("Impulse Response")); dialog_filter->add_pattern("*.irs"); dialog_filter->add_pattern("*.wav"); dialog->add_filter(dialog_filter); dialog->signal_response().connect([=](auto response_id) { switch (response_id) { case Gtk::ResponseType::RESPONSE_ACCEPT: { import_irs_file(dialog->get_file()->get_path()); populate_irs_listbox(); break; } default: break; } }); dialog->set_modal(true); dialog->show(); } void ConvolverUi::get_irs_info() { auto path = settings->get_string("kernel-path"); SndfileHandle file = SndfileHandle(path); if (file.channels() != 2 || file.frames() == 0) { // warning user that there is a problem Glib::signal_idle().connect_once([=]() { label_sampling_rate->set_text(_("Failed")); label_samples->set_text(_("Failed")); label_duration->set_text(_("Failed")); label_file_name->set_text(_("Could Not Load The Impulse File")); }); return; } uint frames_in = file.frames(); uint total_frames_in = file.channels() * frames_in; uint rate = file.samplerate(); std::vector kernel(total_frames_in); file.readf(kernel.data(), frames_in); // build plot time axis float dt = 1.0F / rate; float duration = (static_cast(frames_in) - 1.0F) * dt; uint max_points = (frames_in > max_plot_points) ? max_plot_points : frames_in; float plot_dt = duration / max_points; time_axis.resize(max_points); time_axis.shrink_to_fit(); for (uint n = 0U; n < max_points; n++) { time_axis[n] = n * plot_dt; } max_time = *std::max_element(time_axis.begin(), time_axis.end()); // deinterleaving channels left_mag.resize(frames_in); right_mag.resize(frames_in); // ensure that the fft can be computed if (left_mag.size() % 2U != 0U) { left_mag.emplace_back(0.0F); } if (right_mag.size() % 2U != 0U) { right_mag.emplace_back(0.0F); } left_mag.shrink_to_fit(); right_mag.shrink_to_fit(); for (uint n = 0U; n < frames_in; n++) { left_mag[n] = kernel[2U * n]; right_mag[n] = kernel[2U * n + 1U]; } get_irs_spectrum(rate); /*interpolating because we can not plot all the data in the irs file. It would be too slow */ try { boost::math::interpolators::cardinal_cubic_b_spline spline_L(left_mag.begin(), left_mag.end(), 0.0F, dt); boost::math::interpolators::cardinal_cubic_b_spline spline_R(right_mag.begin(), right_mag.end(), 0.0F, dt); left_mag.resize(max_points); right_mag.resize(max_points); left_mag.shrink_to_fit(); right_mag.shrink_to_fit(); for (uint n = 0U; n < max_points; n++) { left_mag[n] = spline_L(time_axis[n]); right_mag[n] = spline_R(time_axis[n]); } } catch (const std::exception& e) { util::debug(std::string("Message from thrown exception was: ") + e.what()); } // find min and max values min_left = *std::min_element(left_mag.begin(), left_mag.end()); max_left = *std::max_element(left_mag.begin(), left_mag.end()); min_right = *std::min_element(right_mag.begin(), right_mag.end()); max_right = *std::max_element(right_mag.begin(), right_mag.end()); // rescaling between 0 and 1 for (uint n = 0U; n < max_points; n++) { left_mag[n] = (left_mag[n] - min_left) / (max_left - min_left); right_mag[n] = (right_mag[n] - min_right) / (max_right - min_right); } // updating interface with ir file info Glib::signal_idle().connect_once([=]() { label_sampling_rate->set_text(std::to_string(rate) + " Hz"); label_samples->set_text(std::to_string(frames_in)); label_duration->set_text(level_to_localized_string(duration, 3) + " s"); auto fpath = boost::filesystem::path{path}; label_file_name->set_text(fpath.stem().string()); left_plot->queue_draw(); right_plot->queue_draw(); }); } void ConvolverUi::get_irs_spectrum(const int& rate) { uint nfft = left_mag.size(); // right_mag.size() should have the same value GstFFTF32* fft_ctx = gst_fft_f32_new(nfft, 0); auto* freqdata_l = g_new0(GstFFTF32Complex, nfft / 2U + 1U); auto* freqdata_r = g_new0(GstFFTF32Complex, nfft / 2U + 1U); std::vector tmp_l; std::vector tmp_r; tmp_l.resize(nfft); tmp_r.resize(nfft); tmp_l.shrink_to_fit(); tmp_r.shrink_to_fit(); std::copy(left_mag.begin(), left_mag.end(), tmp_l.begin()); std::copy(right_mag.begin(), right_mag.end(), tmp_r.begin()); gst_fft_f32_fft(fft_ctx, tmp_l.data(), freqdata_l); gst_fft_f32_fft(fft_ctx, tmp_r.data(), freqdata_r); left_spectrum.resize(nfft / 2U + 1U); right_spectrum.resize(nfft / 2U + 1U); for (uint i = 0U; i < nfft / 2U + 1U; i++) { float v_l = 0.0F; float v_r = 0.0F; // left v_l = freqdata_l[i].r * freqdata_l[i].r; v_l += freqdata_l[i].i * freqdata_l[i].i; v_l = std::sqrt(v_l); left_spectrum[i] = v_l; // right v_r = freqdata_r[i].r * freqdata_r[i].r; v_r += freqdata_r[i].i * freqdata_r[i].i; v_r = std::sqrt(v_r); right_spectrum[i] = v_r; } uint max_points = std::min(static_cast(left_spectrum.size()), max_plot_points); fft_min_freq = 1.0F; fft_max_freq = 0.5F * static_cast(rate); freq_axis = util::logspace(log10(fft_min_freq), log10(fft_max_freq), max_points); /*interpolating because we can not plot all the data in the irs file. It would be too slow */ try { float dF = 0.5F * static_cast(rate) / left_spectrum.size(); boost::math::interpolators::cardinal_cubic_b_spline spline_L(left_spectrum.begin(), left_spectrum.end(), 0.0F, dF); boost::math::interpolators::cardinal_cubic_b_spline spline_R(right_spectrum.begin(), right_spectrum.end(), 0.0F, dF); left_spectrum.resize(max_points); right_spectrum.resize(max_points); left_spectrum.shrink_to_fit(); right_spectrum.shrink_to_fit(); for (uint n = 0U; n < max_points; n++) { left_spectrum[n] = spline_L(freq_axis[n]); right_spectrum[n] = spline_R(freq_axis[n]); } } catch (const std::exception& e) { util::debug(std::string("Message from thrown exception was: ") + e.what()); } // find min and max values fft_min_left = *std::min_element(left_spectrum.begin(), left_spectrum.end()); fft_max_left = *std::max_element(left_spectrum.begin(), left_spectrum.end()); fft_min_right = *std::min_element(right_spectrum.begin(), right_spectrum.end()); fft_max_right = *std::max_element(right_spectrum.begin(), right_spectrum.end()); // rescaling between 0 and 1 for (unsigned int n = 0U; n < left_spectrum.size(); n++) { left_spectrum[n] = (left_spectrum[n] - fft_min_left) / (fft_max_left - fft_min_left); right_spectrum[n] = (right_spectrum[n] - fft_min_right) / (fft_max_right - fft_min_right); } gst_fft_f32_free(fft_ctx); g_free(freqdata_l); g_free(freqdata_r); } void ConvolverUi::draw_channel(Gtk::DrawingArea* da, const Cairo::RefPtr& ctx, const std::vector& magnitudes) { auto n_bars = magnitudes.size(); if (n_bars > 0U) { auto allocation = da->get_allocation(); auto width = allocation.get_width(); auto height = allocation.get_height(); auto n_bars = magnitudes.size(); auto x = util::linspace(0.0F, static_cast(width), n_bars); for (uint n = 0U; n < n_bars - 1U; n++) { auto bar_height = magnitudes[n] * height; ctx->move_to(x[n], height - bar_height); bar_height = magnitudes[n + 1U] * height; ctx->line_to(x[n + 1U], height - bar_height); } if (spectrum_settings->get_boolean("use-custom-color")) { Glib::Variant> v; spectrum_settings->get_value("color", v); auto rgba = v.get(); ctx->set_source_rgba(rgba[0], rgba[1], rgba[2], rgba[3]); } else { auto color = Gdk::RGBA(); auto style_ctx = da->get_style_context(); style_ctx->lookup_color("theme_selected_bg_color", color); ctx->set_source_rgba(color.get_red(), color.get_green(), color.get_blue(), 1.0); } ctx->set_line_width(2.0); ctx->stroke(); if (mouse_inside) { std::string msg; if (show_fft_spectrum) { msg.append(level_to_localized_string(mouse_freq, 0) + " Hz, "); msg.append(level_to_localized_string(mouse_intensity, 3)); } else { msg.append(level_to_localized_string(mouse_time, 3) + " s, "); msg.append(level_to_localized_string_showpos(mouse_intensity, 3)); } int text_width = 0; int text_height = 0; auto layout = create_pango_layout(msg); layout->set_font_description(font); layout->get_pixel_size(text_width, text_height); ctx->move_to(width - text_width, 0); layout->show_in_cairo_context(ctx); } } } void ConvolverUi::update_mouse_info_L(GdkEventMotion* event) { auto allocation = left_plot->get_allocation(); auto width = allocation.get_width(); auto height = allocation.get_height(); if (show_fft_spectrum) { float fft_min_freq_log = log10(fft_min_freq); float fft_max_freq_log = log10(fft_max_freq); float mouse_freq_log = static_cast(event->x) / width * (fft_max_freq_log - fft_min_freq_log) + fft_min_freq_log; mouse_freq = std::pow(10.0F, mouse_freq_log); // exp10 does not exist on FreeBSD mouse_intensity = (height - static_cast(event->y)) / height * (fft_max_left - fft_min_left) + fft_min_left; } else { mouse_time = static_cast(event->x) * max_time / width; mouse_intensity = (height - static_cast(event->y)) / height * (max_left - min_left) + min_left; } } void ConvolverUi::update_mouse_info_R(GdkEventMotion* event) { auto allocation = right_plot->get_allocation(); auto width = allocation.get_width(); auto height = allocation.get_height(); if (show_fft_spectrum) { float fft_min_freq_log = log10(fft_min_freq); float fft_max_freq_log = log10(fft_max_freq); float mouse_freq_log = static_cast(event->x) / width * (fft_max_freq_log - fft_min_freq_log) + fft_min_freq_log; mouse_freq = std::pow(10.0F, mouse_freq_log); // exp10 does not exist on FreeBSD mouse_intensity = (height - static_cast(event->y)) / height * (fft_max_right - fft_min_right) + fft_min_right; } else { mouse_time = static_cast(event->x) * max_time / width; mouse_intensity = static_cast(event->y) / height * (max_right - min_right) + min_right; } } auto ConvolverUi::on_left_draw(const Cairo::RefPtr& ctx) -> bool { std::lock_guard lock(lock_guard_irs_info); ctx->paint(); if (show_fft_spectrum) { draw_channel(left_plot, ctx, left_spectrum); } else { draw_channel(left_plot, ctx, left_mag); } return false; } auto ConvolverUi::on_left_motion_notify_event(GdkEventMotion* event) -> bool { update_mouse_info_L(event); left_plot->queue_draw(); return false; } auto ConvolverUi::on_right_draw(const Cairo::RefPtr& ctx) -> bool { std::lock_guard lock(lock_guard_irs_info); ctx->paint(); if (show_fft_spectrum) { draw_channel(right_plot, ctx, right_spectrum); } else { draw_channel(right_plot, ctx, right_mag); } return false; } auto ConvolverUi::on_right_motion_notify_event(GdkEventMotion* event) -> bool { update_mouse_info_R(event); right_plot->queue_draw(); return false; } auto ConvolverUi::on_mouse_enter_notify_event(GdkEventCrossing* event) -> bool { mouse_inside = true; return false; } auto ConvolverUi::on_mouse_leave_notify_event(GdkEventCrossing* event) -> bool { mouse_inside = false; return false; } easyeffects-4.8.7/src/crossfeed.cpp000066400000000000000000000052161424023573300173120ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "crossfeed.hpp" #include #include "util.hpp" Crossfeed::Crossfeed(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "crossfeed", schema, schema_path) { crossfeed = gst_element_factory_make("bs2b", nullptr); if (is_installed(crossfeed)) { auto* in_level = gst_element_factory_make("level", "crossfeed_input_level"); auto* out_level = gst_element_factory_make("level", "crossfeed_output_level"); auto* audioconvert_in = gst_element_factory_make("audioconvert", "crossfeed_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "crossfeed_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), in_level, audioconvert_in, crossfeed, audioconvert_out, out_level, nullptr); gst_element_link_many(in_level, audioconvert_in, crossfeed, audioconvert_out, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(in_level, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); bind_to_gsettings(); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Crossfeed::~Crossfeed() { util::debug(log_tag + name + " destroyed"); } void Crossfeed::bind_to_gsettings() { g_settings_bind(settings, "fcut", crossfeed, "fcut", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "feed", crossfeed, "feed", G_SETTINGS_BIND_GET, util::double_x10_to_int, nullptr, nullptr, nullptr); } easyeffects-4.8.7/src/crossfeed_preset.cpp000066400000000000000000000042471424023573300206770ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "crossfeed_preset.hpp" CrossfeedPreset::CrossfeedPreset() : output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.crossfeed", "/com/github/wwmm/pulseeffects/sinkinputs/crossfeed/")) {} void CrossfeedPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".crossfeed.state", settings->get_boolean("state")); root.put(section + ".crossfeed.fcut", settings->get_int("fcut")); root.put(section + ".crossfeed.feed", settings->get_double("feed")); } void CrossfeedPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".crossfeed.state"); update_key(root, settings, "fcut", section + ".crossfeed.fcut"); update_key(root, settings, "feed", section + ".crossfeed.feed"); } void CrossfeedPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { save(root, "output", output_settings); } } void CrossfeedPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { load(root, "output", output_settings); } } easyeffects-4.8.7/src/crossfeed_ui.cpp000066400000000000000000000044201424023573300200030ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "crossfeed_ui.hpp" CrossfeedUi::CrossfeedUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "crossfeed"; // loading glade widgets builder->get_widget("preset_cmoy", preset_cmoy); builder->get_widget("preset_default", preset_default); builder->get_widget("preset_jmeier", preset_jmeier); builder->get_widget("plugin_reset", reset_button); get_object(builder, "fcut", fcut); get_object(builder, "feed", feed); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("fcut", fcut.get(), "value", flag); settings->bind("feed", feed.get(), "value", flag); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); init_presets_buttons(); } CrossfeedUi::~CrossfeedUi() { util::debug(name + " ui destroyed"); } void CrossfeedUi::reset() { settings->reset("fcut"); settings->reset("feed"); } void CrossfeedUi::init_presets_buttons() { preset_cmoy->signal_clicked().connect([=]() { fcut->set_value(700.0); feed->set_value(6.0); }); preset_default->signal_clicked().connect([=]() { fcut->set_value(700.0); feed->set_value(4.5); }); preset_jmeier->signal_clicked().connect([=]() { fcut->set_value(650.0); feed->set_value(9.0); }); } easyeffects-4.8.7/src/crystalizer.cpp000066400000000000000000000123061424023573300177060ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "crystalizer.hpp" #include #include "util.hpp" namespace { void on_post_messages_changed(GSettings* settings, gchar* key, Crystalizer* l) { const auto post = g_settings_get_boolean(settings, key); if (post) { if (!l->range_before_connection.connected()) { l->range_before_connection = Glib::signal_timeout().connect( [l]() { float v = 0.0F; g_object_get(l->crystalizer, "lra-before", &v, nullptr); l->range_before.emit(v); return true; }, 100); } if (!l->range_after_connection.connected()) { l->range_after_connection = Glib::signal_timeout().connect( [l]() { float v = 0.0F; g_object_get(l->crystalizer, "lra-after", &v, nullptr); l->range_after.emit(v); return true; }, 100); } } else { l->range_before_connection.disconnect(); l->range_after_connection.disconnect(); } } } // namespace Crystalizer::Crystalizer(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "crystalizer", schema, schema_path) { crystalizer = gst_element_factory_make("pecrystalizer", nullptr); if (is_installed(crystalizer)) { auto* input_gain = gst_element_factory_make("volume", nullptr); auto* in_level = gst_element_factory_make("level", "crystalizer_input_level"); auto* output_gain = gst_element_factory_make("volume", nullptr); auto* out_level = gst_element_factory_make("level", "crystalizer_output_level"); auto* audioconvert_in = gst_element_factory_make("audioconvert", "crystalizer_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "crystalizer_audioconvert_out"); adapter = gst_element_factory_make("peadapter", nullptr); gst_bin_add_many(GST_BIN(bin), input_gain, in_level, adapter, audioconvert_in, crystalizer, audioconvert_out, output_gain, out_level, nullptr); gst_element_link_many(input_gain, in_level, adapter, audioconvert_in, crystalizer, audioconvert_out, output_gain, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(input_gain, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(adapter, "blocksize", 512, nullptr); bind_to_gsettings(); g_signal_connect(settings, "changed::post-messages", G_CALLBACK(on_post_messages_changed), this); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "input-gain", input_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", output_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Crystalizer::~Crystalizer() { util::debug(log_tag + name + " destroyed"); } void Crystalizer::bind_to_gsettings() { g_settings_bind(settings, "post-messages", crystalizer, "notify-host", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "aggressive", crystalizer, "aggressive", G_SETTINGS_BIND_DEFAULT); for (int n = 0; n < 13; n++) { g_settings_bind_with_mapping(settings, std::string("intensity-band" + std::to_string(n)).c_str(), crystalizer, std::string("intensity-band" + std::to_string(n)).c_str(), G_SETTINGS_BIND_GET, util::db20_gain_to_linear, nullptr, nullptr, nullptr); g_settings_bind(settings, std::string("mute-band" + std::to_string(n)).c_str(), crystalizer, std::string("mute-band" + std::to_string(n)).c_str(), G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, std::string("bypass-band" + std::to_string(n)).c_str(), crystalizer, std::string("bypass-band" + std::to_string(n)).c_str(), G_SETTINGS_BIND_DEFAULT); } } easyeffects-4.8.7/src/crystalizer/000077500000000000000000000000001424023573300172005ustar00rootroot00000000000000easyeffects-4.8.7/src/crystalizer/README.md000066400000000000000000000005631424023573300204630ustar00rootroot00000000000000# PulseEffects Crystalizer Simple plugin useful to add more dynamic range to songs that were overly compressed. It is based on the [FFMPEG Crystalizer plugin code](https://git.ffmpeg.org/gitweb/ffmpeg.git/blob_plain/HEAD:/libavfilter/af_crystalizer.c). You can test this plugin from command line executing: `gst-launch-1.0 -v audiotestsrc ! pecrystalizer ! pulsesink` easyeffects-4.8.7/src/crystalizer/filter.cpp000066400000000000000000000145101424023573300211720ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "filter.hpp" #include #include #define CONVPROC_SCHEDULER_PRIORITY 0 #define CONVPROC_SCHEDULER_CLASS SCHED_FIFO #define THREAD_SYNC_MODE true const float PI = boost::math::constants::pi(); Filter::Filter(const std::string& tag) : log_tag(tag) {} Filter::~Filter() { util::warning(log_tag + " destructed"); finish(); } void Filter::create_lowpass_kernel(const float& rate, const float& cutoff, const float& transition_band) { float b = transition_band / rate; kernel_size = std::ceil(4.0F / b); kernel_size = (kernel_size % 2 == 0) ? kernel_size + 1 : kernel_size; float fc = cutoff / rate; kernel.resize(kernel_size); float sum = 0.0F; for (int n = 0; n < kernel_size; n++) { kernel[n] = boost::math::sinc_pi(2.0F * fc * PI * (n - (kernel_size - 1) / 2)); auto w = 0.42F - 0.5F * cosf(2.0F * PI * n / (kernel_size - 1)) + 0.08F * cosf(4.0F * PI * n / (kernel_size - 1)); kernel[n] *= w; sum += kernel[n]; } for (int n = 0; n < kernel_size; n++) { kernel[n] /= sum; } } void Filter::create_highpass_kernel(const float& rate, const float& cutoff, const float& transition_band) { create_lowpass_kernel(rate, cutoff, transition_band); for (int n = 0; n < kernel_size; n++) { kernel[n] *= -1; } kernel[(kernel_size - 1) / 2] += 1; } void Filter::create_bandpass_kernel(const float& rate, const float& cutoff1, const float& cutoff2, const float& transition_band) { create_lowpass_kernel(rate, cutoff2, transition_band); std::vector lowpass_kernel(kernel_size); memcpy(lowpass_kernel.data(), kernel.data(), kernel_size * sizeof(float)); create_highpass_kernel(rate, cutoff1, transition_band); std::vector highpass_kernel(kernel_size); memcpy(highpass_kernel.data(), kernel.data(), kernel_size * sizeof(float)); kernel_size = 2 * kernel_size - 1; kernel.resize(kernel_size); direct_conv(lowpass_kernel, highpass_kernel, kernel); } void Filter::direct_conv(const std::vector& a, const std::vector& b, std::vector& c) { uint M = (c.size() + 1U) / 2U; for (uint n = 0U; n < c.size(); n++) { c[n] = 0.0F; for (uint m = 0U; m < M; m++) { if (n > m && n - m < M) { c[n] += a[n - m] * b[m]; } } } } void Filter::create_lowpass(const int& nsamples, const float& rate, const float& cutoff, const float& transition_band) { create_lowpass_kernel(rate, cutoff, transition_band); // util::debug(log_tag + " kernel size = " + std::to_string(kernel_size)); init_zita(nsamples); } void Filter::create_highpass(const int& nsamples, const float& rate, const float& cutoff, const float& transition_band) { create_highpass_kernel(rate, cutoff, transition_band); // util::debug(log_tag + " kernel size = " + std::to_string(kernel_size)); init_zita(nsamples); } void Filter::create_bandpass(const int& nsamples, const float& rate, const float& cutoff1, const float& cutoff2, const float& transition_band) { create_bandpass_kernel(rate, cutoff1, cutoff2, transition_band); // util::debug(log_tag + " kernel size = " + std::to_string(kernel_size)); init_zita(nsamples); } void Filter::init_zita(const int& num_samples) { bool failed = false; float density = 0.0F; int ret = 0; unsigned int options = 0U; nsamples = num_samples; // depending on buffer and kernel size OPT_FFTW_MEASURE may make us crash // options |= Convproc::OPT_FFTW_MEASURE; options |= Convproc::OPT_VECTOR_MODE; conv = new Convproc(); conv->set_options(options); #if ZITA_CONVOLVER_MAJOR_VERSION == 3 conv->set_density(density); ret = conv->configure(2, 2, kernel_size, nsamples, nsamples, Convproc::MAXPART); #endif #if ZITA_CONVOLVER_MAJOR_VERSION == 4 ret = conv->configure(2, 2, kernel_size, nsamples, nsamples, Convproc::MAXPART, density); #endif if (ret != 0) { failed = true; util::debug(log_tag + "can't initialise zita-convolver engine: " + std::to_string(ret)); } ret = conv->impdata_create(0, 0, 1, kernel.data(), 0, kernel_size); if (ret != 0) { failed = true; util::debug(log_tag + "left impdata_create failed: " + std::to_string(ret)); } ret = conv->impdata_create(1, 1, 1, kernel.data(), 0, kernel_size); if (ret != 0) { failed = true; util::debug(log_tag + "right impdata_create failed: " + std::to_string(ret)); } ret = conv->start_process(CONVPROC_SCHEDULER_PRIORITY, CONVPROC_SCHEDULER_CLASS); if (ret != 0) { failed = true; util::debug(log_tag + "start_process failed: " + std::to_string(ret)); } ready = !failed; } void Filter::process(float* data) { if (ready) { // deinterleave for (int n = 0; n < nsamples; n++) { conv->inpdata(0)[n] = data[2 * n]; conv->inpdata(1)[n] = data[2 * n + 1]; } int ret = conv->process(THREAD_SYNC_MODE); if (ret != 0) { util::debug(log_tag + "IR: process failed: " + std::to_string(ret)); } // interleave for (int n = 0; n < nsamples; n++) { data[2 * n] = conv->outdata(0)[n]; data[2 * n + 1] = conv->outdata(1)[n]; } } } void Filter::finish() { ready = false; if (conv != nullptr) { if (conv->state() != Convproc::ST_STOP) { conv->stop_process(); conv->cleanup(); delete conv; conv = nullptr; } } } easyeffects-4.8.7/src/crystalizer/filter.hpp000066400000000000000000000041511424023573300211770ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef FILTER_HPP #define FILTER_HPP #include #include "util.hpp" class Filter { public: Filter(const std::string& tag); ~Filter(); bool ready = false; void create_lowpass(const int& nsamples, const float& rate, const float& cutoff, const float& transition_band); void create_highpass(const int& nsamples, const float& rate, const float& cutoff, const float& transition_band); void create_bandpass(const int& nsamples, const float& rate, const float& cutoff1, const float& cutoff2, const float& transition_band); void process(float* data); void finish(); private: std::string log_tag; int kernel_size = 0, nsamples = 0; std::vector kernel; Convproc* conv = nullptr; void create_lowpass_kernel(const float& rate, const float& cutoff, const float& transition_band); void create_highpass_kernel(const float& rate, const float& cutoff, const float& transition_band); void create_bandpass_kernel(const float& rate, const float& cutoff1, const float& cutoff2, const float& transition_band); void init_zita(const int& num_samples); void direct_conv(const std::vector& a, const std::vector& b, std::vector& c); }; #endif easyeffects-4.8.7/src/crystalizer/gstpecrystalizer.cpp000066400000000000000000001074201424023573300233260ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ /** * SECTION:element-gstpecrystalizer * * The pecrystalizer element increases dynamic range. * * * Example launch line * |[ * gst-launch-1.0 -v audiotestsrc ! pecrystalizer ! pulsesink * ]| * The pecrystalizer element increases dynamic range. * */ #include "gstpecrystalizer.hpp" #include #include #include #include #include "config.h" GST_DEBUG_CATEGORY_STATIC(gst_pecrystalizer_debug_category); #define GST_CAT_DEFAULT gst_pecrystalizer_debug_category /* prototypes */ static void gst_pecrystalizer_set_property(GObject* object, guint property_id, const GValue* value, GParamSpec* pspec); static void gst_pecrystalizer_get_property(GObject* object, guint property_id, GValue* value, GParamSpec* pspec); static gboolean gst_pecrystalizer_setup(GstAudioFilter* filter, const GstAudioInfo* info); static GstFlowReturn gst_pecrystalizer_transform_ip(GstBaseTransform* trans, GstBuffer* buffer); static gboolean gst_pecrystalizer_stop(GstBaseTransform* base); static void gst_pecrystalizer_setup_filters(GstPecrystalizer* pecrystalizer); static void gst_pecrystalizer_process(GstPecrystalizer* pecrystalizer, GstBuffer* buffer); static gboolean gst_pecrystalizer_src_query(GstPad* pad, GstObject* parent, GstQuery* query); static void gst_pecrystalizer_finish_filters(GstPecrystalizer* pecrystalizer); static void gst_pecrystalizer_finalize(GObject* object); enum { PROP_INTENSITY_BAND0 = 1, PROP_INTENSITY_BAND1, PROP_INTENSITY_BAND2, PROP_INTENSITY_BAND3, PROP_INTENSITY_BAND4, PROP_INTENSITY_BAND5, PROP_INTENSITY_BAND6, PROP_INTENSITY_BAND7, PROP_INTENSITY_BAND8, PROP_INTENSITY_BAND9, PROP_INTENSITY_BAND10, PROP_INTENSITY_BAND11, PROP_INTENSITY_BAND12, PROP_MUTE_BAND0, PROP_MUTE_BAND1, PROP_MUTE_BAND2, PROP_MUTE_BAND3, PROP_MUTE_BAND4, PROP_MUTE_BAND5, PROP_MUTE_BAND6, PROP_MUTE_BAND7, PROP_MUTE_BAND8, PROP_MUTE_BAND9, PROP_MUTE_BAND10, PROP_MUTE_BAND11, PROP_MUTE_BAND12, PROP_BYPASS_BAND0, PROP_BYPASS_BAND1, PROP_BYPASS_BAND2, PROP_BYPASS_BAND3, PROP_BYPASS_BAND4, PROP_BYPASS_BAND5, PROP_BYPASS_BAND6, PROP_BYPASS_BAND7, PROP_BYPASS_BAND8, PROP_BYPASS_BAND9, PROP_BYPASS_BAND10, PROP_BYPASS_BAND11, PROP_BYPASS_BAND12, PROP_RANGE_BEFORE, PROP_RANGE_AFTER, PROP_AGGRESSIVE, PROP_NOTIFY }; /* pad templates */ static GstStaticPadTemplate gst_pecrystalizer_src_template = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS("audio/x-raw,format=F32LE,rate=[1,max]," "channels=2,layout=interleaved")); static GstStaticPadTemplate gst_pecrystalizer_sink_template = GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS("audio/x-raw,format=F32LE,rate=[1,max]," "channels=2,layout=interleaved")); /* class initialization */ G_DEFINE_TYPE_WITH_CODE(GstPecrystalizer, gst_pecrystalizer, GST_TYPE_AUDIO_FILTER, GST_DEBUG_CATEGORY_INIT(gst_pecrystalizer_debug_category, "pecrystalizer", 0, "debug category for pecrystalizer element")); static void gst_pecrystalizer_class_init(GstPecrystalizerClass* klass) { GObjectClass* gobject_class = G_OBJECT_CLASS(klass); GstBaseTransformClass* base_transform_class = GST_BASE_TRANSFORM_CLASS(klass); GstAudioFilterClass* audio_filter_class = GST_AUDIO_FILTER_CLASS(klass); /* Setting up pads and setting metadata should be moved to base_class_init if you intend to subclass this class. */ gst_element_class_add_static_pad_template(GST_ELEMENT_CLASS(klass), &gst_pecrystalizer_src_template); gst_element_class_add_static_pad_template(GST_ELEMENT_CLASS(klass), &gst_pecrystalizer_sink_template); gst_element_class_set_static_metadata(GST_ELEMENT_CLASS(klass), "PulseEffects Crystalizer", "Generic", "PulseEffects Crystalizer is a port of FFMPEG crystalizer", "Wellington "); /* define virtual function pointers */ gobject_class->set_property = gst_pecrystalizer_set_property; gobject_class->get_property = gst_pecrystalizer_get_property; audio_filter_class->setup = GST_DEBUG_FUNCPTR(gst_pecrystalizer_setup); base_transform_class->transform_ip = GST_DEBUG_FUNCPTR(gst_pecrystalizer_transform_ip); base_transform_class->transform_ip_on_passthrough = false; base_transform_class->stop = GST_DEBUG_FUNCPTR(gst_pecrystalizer_stop); gobject_class->finalize = gst_pecrystalizer_finalize; /* define properties */ std::string band_num; const std::string name_intensity = "intensity-band"; const std::string nick_band = "BAND "; const std::string nick_intensity = " INTENSITY"; const char* const param_expansion = strdup(std::string("Expansion intensity").c_str()); for (int n = 0; n < NBANDS; n++) { band_num.append(std::to_string(n)); char* name = strdup(std::string(name_intensity).append(band_num).c_str()); char* nick = strdup(std::string(nick_band).append(band_num).append(nick_intensity).c_str()); if (name != nullptr && nick != nullptr) { g_object_class_install_property( gobject_class, n + 1, g_param_spec_float(name, nick, param_expansion, 0.0F, 40.0F, 1.0F, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } else if (errno == ENOMEM) { util::error("crystalizer: band initialization: not enough memory!"); } band_num.clear(); } const std::string name_mute = "mute-band"; const std::string nick_mute = "MUTE "; const char* const param_mute = strdup(std::string("mute band").c_str()); for (int n = 0; n < NBANDS; n++) { band_num.append(std::to_string(n)); char* name = strdup(std::string(name_mute).append(band_num).c_str()); char* nick = strdup(std::string(nick_mute).append(nick_band).append(band_num).c_str()); if (name != nullptr && nick != nullptr) { g_object_class_install_property( gobject_class, NBANDS + 1 + n, g_param_spec_boolean(name, nick, param_mute, false, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } else if (errno == ENOMEM) { util::error("crystalizer: band initialization: not enough memory!"); } band_num.clear(); } const std::string name_bypass = "bypass-band"; const std::string nick_bypass = "BYPASS "; const char* const param_bypass = strdup(std::string("bypass band").c_str()); for (int n = 0; n < NBANDS; n++) { band_num.append(std::to_string(n)); char* name = strdup(std::string(name_bypass).append(band_num).c_str()); char* nick = strdup(std::string(nick_bypass).append(nick_band).append(band_num).c_str()); if (name != nullptr && nick != nullptr) { g_object_class_install_property( gobject_class, 2 * NBANDS + 1 + n, g_param_spec_boolean(name, nick, param_bypass, false, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } else if (errno == ENOMEM) { util::error("crystalizer: band initialization: not enough memory!"); } band_num.clear(); } g_object_class_install_property( gobject_class, PROP_RANGE_BEFORE, g_param_spec_float("lra-before", "Loudness Range", "Loudness Range (in LUFS)", -G_MAXFLOAT, G_MAXFLOAT, 0.0F, static_cast(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_RANGE_AFTER, g_param_spec_float("lra-after", "Loudness Range", "Loudness Range (in LUFS)", -G_MAXFLOAT, G_MAXFLOAT, 0.0F, static_cast(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_AGGRESSIVE, g_param_spec_boolean("aggressive", "Aggressive Mode", "Aggressive Mode", false, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property( gobject_class, PROP_NOTIFY, g_param_spec_boolean("notify-host", "Notify Host", "Notify host of variable changes", true, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } static void gst_pecrystalizer_init(GstPecrystalizer* pecrystalizer) { pecrystalizer->ready = false; pecrystalizer->bpf = 0; pecrystalizer->nsamples = 0; pecrystalizer->freqs[0] = 500.0F; pecrystalizer->freqs[1] = 1000.0F; pecrystalizer->freqs[2] = 2000.0F; pecrystalizer->freqs[3] = 3000.0F; pecrystalizer->freqs[4] = 4000.0F; pecrystalizer->freqs[5] = 5000.0F; pecrystalizer->freqs[6] = 6000.0F; pecrystalizer->freqs[7] = 7000.0F; pecrystalizer->freqs[8] = 8000.0F; pecrystalizer->freqs[9] = 9000.0F; pecrystalizer->freqs[10] = 10000.0F; pecrystalizer->freqs[11] = 15000.0F; for (int n = 0; n < NBANDS; n++) { pecrystalizer->filters[n] = new Filter("crystalizer band" + std::to_string(n)); pecrystalizer->intensities[n] = 1.0F; pecrystalizer->mute[n] = false; pecrystalizer->bypass[n] = false; pecrystalizer->last_L[n] = 0.0F; pecrystalizer->last_R[n] = 0.0F; } pecrystalizer->sample_count = 0; pecrystalizer->notify = false; pecrystalizer->range_before = 0.0F; pecrystalizer->range_after = 0.0F; pecrystalizer->ebur_state_before = nullptr; pecrystalizer->ebur_state_after = nullptr; pecrystalizer->ndivs = 1000U; pecrystalizer->dv = 1.0F / pecrystalizer->ndivs; pecrystalizer->aggressive = false; pecrystalizer->sinkpad = gst_element_get_static_pad(GST_ELEMENT(pecrystalizer), "sink"); pecrystalizer->srcpad = gst_element_get_static_pad(GST_ELEMENT(pecrystalizer), "src"); gst_pad_set_query_function(pecrystalizer->srcpad, gst_pecrystalizer_src_query); gst_base_transform_set_in_place(GST_BASE_TRANSFORM(pecrystalizer), true); } void gst_pecrystalizer_set_property(GObject* object, guint property_id, const GValue* value, GParamSpec* pspec) { GstPecrystalizer* pecrystalizer = GST_PECRYSTALIZER(object); GST_DEBUG_OBJECT(pecrystalizer, "set_property"); switch (property_id) { // Intensities case PROP_INTENSITY_BAND0: { pecrystalizer->intensities[0] = g_value_get_float(value); pecrystalizer->gain[0] = util::linspace(1.0F, pecrystalizer->intensities[0], pecrystalizer->ndivs); break; } case PROP_INTENSITY_BAND1: { pecrystalizer->intensities[1] = g_value_get_float(value); pecrystalizer->gain[1] = util::linspace(1.0F, pecrystalizer->intensities[1], pecrystalizer->ndivs); break; } case PROP_INTENSITY_BAND2: { pecrystalizer->intensities[2] = g_value_get_float(value); pecrystalizer->gain[2] = util::linspace(1.0F, pecrystalizer->intensities[2], pecrystalizer->ndivs); break; } case PROP_INTENSITY_BAND3: { pecrystalizer->intensities[3] = g_value_get_float(value); pecrystalizer->gain[3] = util::linspace(1.0F, pecrystalizer->intensities[3], pecrystalizer->ndivs); break; } case PROP_INTENSITY_BAND4: { pecrystalizer->intensities[4] = g_value_get_float(value); pecrystalizer->gain[4] = util::linspace(1.0F, pecrystalizer->intensities[4], pecrystalizer->ndivs); break; } case PROP_INTENSITY_BAND5: { pecrystalizer->intensities[5] = g_value_get_float(value); pecrystalizer->gain[5] = util::linspace(1.0F, pecrystalizer->intensities[5], pecrystalizer->ndivs); break; } case PROP_INTENSITY_BAND6: { pecrystalizer->intensities[6] = g_value_get_float(value); pecrystalizer->gain[6] = util::linspace(1.0F, pecrystalizer->intensities[6], pecrystalizer->ndivs); break; } case PROP_INTENSITY_BAND7: { pecrystalizer->intensities[7] = g_value_get_float(value); pecrystalizer->gain[7] = util::linspace(1.0F, pecrystalizer->intensities[7], pecrystalizer->ndivs); break; } case PROP_INTENSITY_BAND8: { pecrystalizer->intensities[8] = g_value_get_float(value); pecrystalizer->gain[8] = util::linspace(1.0F, pecrystalizer->intensities[8], pecrystalizer->ndivs); break; } case PROP_INTENSITY_BAND9: { pecrystalizer->intensities[9] = g_value_get_float(value); pecrystalizer->gain[9] = util::linspace(1.0F, pecrystalizer->intensities[9], pecrystalizer->ndivs); break; } case PROP_INTENSITY_BAND10: { pecrystalizer->intensities[10] = g_value_get_float(value); pecrystalizer->gain[10] = util::linspace(1.0F, pecrystalizer->intensities[10], pecrystalizer->ndivs); break; } case PROP_INTENSITY_BAND11: { pecrystalizer->intensities[11] = g_value_get_float(value); pecrystalizer->gain[11] = util::linspace(1.0F, pecrystalizer->intensities[11], pecrystalizer->ndivs); break; } case PROP_INTENSITY_BAND12: { pecrystalizer->intensities[12] = g_value_get_float(value); pecrystalizer->gain[12] = util::linspace(1.0F, pecrystalizer->intensities[12], pecrystalizer->ndivs); break; } // Mute case PROP_MUTE_BAND0: pecrystalizer->mute[0] = g_value_get_boolean(value); break; case PROP_MUTE_BAND1: pecrystalizer->mute[1] = g_value_get_boolean(value); break; case PROP_MUTE_BAND2: pecrystalizer->mute[2] = g_value_get_boolean(value); break; case PROP_MUTE_BAND3: pecrystalizer->mute[3] = g_value_get_boolean(value); break; case PROP_MUTE_BAND4: pecrystalizer->mute[4] = g_value_get_boolean(value); break; case PROP_MUTE_BAND5: pecrystalizer->mute[5] = g_value_get_boolean(value); break; case PROP_MUTE_BAND6: pecrystalizer->mute[6] = g_value_get_boolean(value); break; case PROP_MUTE_BAND7: pecrystalizer->mute[7] = g_value_get_boolean(value); break; case PROP_MUTE_BAND8: pecrystalizer->mute[8] = g_value_get_boolean(value); break; case PROP_MUTE_BAND9: pecrystalizer->mute[9] = g_value_get_boolean(value); break; case PROP_MUTE_BAND10: pecrystalizer->mute[10] = g_value_get_boolean(value); break; case PROP_MUTE_BAND11: pecrystalizer->mute[11] = g_value_get_boolean(value); break; case PROP_MUTE_BAND12: pecrystalizer->mute[12] = g_value_get_boolean(value); break; // Bypass case PROP_BYPASS_BAND0: pecrystalizer->bypass[0] = g_value_get_boolean(value); break; case PROP_BYPASS_BAND1: pecrystalizer->bypass[1] = g_value_get_boolean(value); break; case PROP_BYPASS_BAND2: pecrystalizer->bypass[2] = g_value_get_boolean(value); break; case PROP_BYPASS_BAND3: pecrystalizer->bypass[3] = g_value_get_boolean(value); break; case PROP_BYPASS_BAND4: pecrystalizer->bypass[4] = g_value_get_boolean(value); break; case PROP_BYPASS_BAND5: pecrystalizer->bypass[5] = g_value_get_boolean(value); break; case PROP_BYPASS_BAND6: pecrystalizer->bypass[6] = g_value_get_boolean(value); break; case PROP_BYPASS_BAND7: pecrystalizer->bypass[7] = g_value_get_boolean(value); break; case PROP_BYPASS_BAND8: pecrystalizer->bypass[8] = g_value_get_boolean(value); break; case PROP_BYPASS_BAND9: pecrystalizer->bypass[9] = g_value_get_boolean(value); break; case PROP_BYPASS_BAND10: pecrystalizer->bypass[10] = g_value_get_boolean(value); break; case PROP_BYPASS_BAND11: pecrystalizer->bypass[11] = g_value_get_boolean(value); break; case PROP_BYPASS_BAND12: pecrystalizer->bypass[12] = g_value_get_boolean(value); break; // Aggressive case PROP_AGGRESSIVE: pecrystalizer->aggressive = g_value_get_boolean(value); break; // Notify case PROP_NOTIFY: pecrystalizer->notify = g_value_get_boolean(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; } } void gst_pecrystalizer_get_property(GObject* object, guint property_id, GValue* value, GParamSpec* pspec) { GstPecrystalizer* pecrystalizer = GST_PECRYSTALIZER(object); GST_DEBUG_OBJECT(pecrystalizer, "get_property"); switch (property_id) { // Intensities case PROP_INTENSITY_BAND0: g_value_set_float(value, pecrystalizer->intensities[0]); break; case PROP_INTENSITY_BAND1: g_value_set_float(value, pecrystalizer->intensities[1]); break; case PROP_INTENSITY_BAND2: g_value_set_float(value, pecrystalizer->intensities[2]); break; case PROP_INTENSITY_BAND3: g_value_set_float(value, pecrystalizer->intensities[3]); break; case PROP_INTENSITY_BAND4: g_value_set_float(value, pecrystalizer->intensities[4]); break; case PROP_INTENSITY_BAND5: g_value_set_float(value, pecrystalizer->intensities[5]); break; case PROP_INTENSITY_BAND6: g_value_set_float(value, pecrystalizer->intensities[6]); break; case PROP_INTENSITY_BAND7: g_value_set_float(value, pecrystalizer->intensities[7]); break; case PROP_INTENSITY_BAND8: g_value_set_float(value, pecrystalizer->intensities[8]); break; case PROP_INTENSITY_BAND9: g_value_set_float(value, pecrystalizer->intensities[9]); break; case PROP_INTENSITY_BAND10: g_value_set_float(value, pecrystalizer->intensities[10]); break; case PROP_INTENSITY_BAND11: g_value_set_float(value, pecrystalizer->intensities[11]); break; case PROP_INTENSITY_BAND12: g_value_set_float(value, pecrystalizer->intensities[12]); break; // Mute case PROP_MUTE_BAND0: g_value_set_boolean(value, pecrystalizer->mute[0]); break; case PROP_MUTE_BAND1: g_value_set_boolean(value, pecrystalizer->mute[1]); break; case PROP_MUTE_BAND2: g_value_set_boolean(value, pecrystalizer->mute[2]); break; case PROP_MUTE_BAND3: g_value_set_boolean(value, pecrystalizer->mute[3]); break; case PROP_MUTE_BAND4: g_value_set_boolean(value, pecrystalizer->mute[4]); break; case PROP_MUTE_BAND5: g_value_set_boolean(value, pecrystalizer->mute[5]); break; case PROP_MUTE_BAND6: g_value_set_boolean(value, pecrystalizer->mute[6]); break; case PROP_MUTE_BAND7: g_value_set_boolean(value, pecrystalizer->mute[7]); break; case PROP_MUTE_BAND8: g_value_set_boolean(value, pecrystalizer->mute[8]); break; case PROP_MUTE_BAND9: g_value_set_boolean(value, pecrystalizer->mute[9]); break; case PROP_MUTE_BAND10: g_value_set_boolean(value, pecrystalizer->mute[10]); break; case PROP_MUTE_BAND11: g_value_set_boolean(value, pecrystalizer->mute[11]); break; case PROP_MUTE_BAND12: g_value_set_boolean(value, pecrystalizer->mute[12]); break; // Bypass case PROP_BYPASS_BAND0: g_value_set_boolean(value, pecrystalizer->bypass[0]); break; case PROP_BYPASS_BAND1: g_value_set_boolean(value, pecrystalizer->bypass[1]); break; case PROP_BYPASS_BAND2: g_value_set_boolean(value, pecrystalizer->bypass[2]); break; case PROP_BYPASS_BAND3: g_value_set_boolean(value, pecrystalizer->bypass[3]); break; case PROP_BYPASS_BAND4: g_value_set_boolean(value, pecrystalizer->bypass[4]); break; case PROP_BYPASS_BAND5: g_value_set_boolean(value, pecrystalizer->bypass[5]); break; case PROP_BYPASS_BAND6: g_value_set_boolean(value, pecrystalizer->bypass[6]); break; case PROP_BYPASS_BAND7: g_value_set_boolean(value, pecrystalizer->bypass[7]); break; case PROP_BYPASS_BAND8: g_value_set_boolean(value, pecrystalizer->bypass[8]); break; case PROP_BYPASS_BAND9: g_value_set_boolean(value, pecrystalizer->bypass[9]); break; case PROP_BYPASS_BAND10: g_value_set_boolean(value, pecrystalizer->bypass[10]); break; case PROP_BYPASS_BAND11: g_value_set_boolean(value, pecrystalizer->bypass[11]); break; case PROP_BYPASS_BAND12: g_value_set_boolean(value, pecrystalizer->bypass[12]); break; // Range case PROP_RANGE_BEFORE: g_value_set_float(value, pecrystalizer->range_before); break; case PROP_RANGE_AFTER: g_value_set_float(value, pecrystalizer->range_after); break; // Aggressive case PROP_AGGRESSIVE: g_value_set_boolean(value, pecrystalizer->aggressive); break; // Notify case PROP_NOTIFY: g_value_set_boolean(value, pecrystalizer->notify); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; } } static gboolean gst_pecrystalizer_setup(GstAudioFilter* filter, const GstAudioInfo* info) { GstPecrystalizer* pecrystalizer = GST_PECRYSTALIZER(filter); GST_DEBUG_OBJECT(pecrystalizer, "setup"); pecrystalizer->rate = info->rate; pecrystalizer->bpf = GST_AUDIO_INFO_BPF(info); std::lock_guard lock(pecrystalizer->mutex); gst_pecrystalizer_finish_filters(pecrystalizer); /*notify every 0.1 seconds*/ pecrystalizer->notify_samples = GST_CLOCK_TIME_TO_FRAMES(GST_SECOND / 10, info->rate); return true; } static GstFlowReturn gst_pecrystalizer_transform_ip(GstBaseTransform* trans, GstBuffer* buffer) { GstPecrystalizer* pecrystalizer = GST_PECRYSTALIZER(trans); GST_DEBUG_OBJECT(pecrystalizer, "transform"); std::lock_guard lock(pecrystalizer->mutex); GstMapInfo map; gst_buffer_map(buffer, &map, GST_MAP_READ); guint num_samples = map.size / pecrystalizer->bpf; gst_buffer_unmap(buffer, &map); bool filters_ready = true; for (int n = 0; n < NBANDS; n++) { filters_ready = filters_ready && pecrystalizer->filters[n]->ready; } if (filters_ready) { if (pecrystalizer->nsamples == num_samples) { gst_pecrystalizer_process(pecrystalizer, buffer); } else { gst_pecrystalizer_finish_filters(pecrystalizer); } } else { pecrystalizer->nsamples = num_samples; gst_pecrystalizer_finish_filters(pecrystalizer); gst_pecrystalizer_setup_filters(pecrystalizer); gst_element_post_message(GST_ELEMENT_CAST(pecrystalizer), gst_message_new_latency(GST_OBJECT_CAST(pecrystalizer))); } return GST_FLOW_OK; } static gboolean gst_pecrystalizer_stop(GstBaseTransform* base) { GstPecrystalizer* pecrystalizer = GST_PECRYSTALIZER(base); std::lock_guard lock(pecrystalizer->mutex); gst_pecrystalizer_finish_filters(pecrystalizer); return true; } static void gst_pecrystalizer_setup_filters(GstPecrystalizer* pecrystalizer) { if (pecrystalizer->rate != 0) { for (int n = 0; n < NBANDS; n++) { if (pecrystalizer->band_data[n].size() != 2U * pecrystalizer->nsamples) { pecrystalizer->band_data[n].resize(2U * pecrystalizer->nsamples); } } if (pecrystalizer->deriv2.size() != 2U * pecrystalizer->nsamples) { pecrystalizer->deriv2.resize(2U * pecrystalizer->nsamples); } /* Bandpass transition band has to be twice the value used for lowpass and highpass. This way all filters will have the same delay. */ float transition_band = 100.0F; // Hz for (uint n = 0U; n < NBANDS; n++) { if (n == 0U) { pecrystalizer->filters[0]->create_lowpass(pecrystalizer->nsamples, pecrystalizer->rate, pecrystalizer->freqs[0], transition_band); } else if (n == pecrystalizer->filters.size() - 1U) { pecrystalizer->filters[n]->create_highpass(pecrystalizer->nsamples, pecrystalizer->rate, pecrystalizer->freqs.back(), transition_band); } else { pecrystalizer->filters[n]->create_bandpass(pecrystalizer->nsamples, pecrystalizer->rate, pecrystalizer->freqs[n - 1U], pecrystalizer->freqs[n], 2.0F * transition_band); } } // before pecrystalizer->ebur_state_before = ebur128_init(2U, pecrystalizer->rate, EBUR128_MODE_LRA | EBUR128_MODE_HISTOGRAM); ebur128_set_channel(pecrystalizer->ebur_state_before, 0U, EBUR128_LEFT); ebur128_set_channel(pecrystalizer->ebur_state_before, 1U, EBUR128_RIGHT); ebur128_set_max_history(pecrystalizer->ebur_state_before, 30U * 1000U); // ms // after pecrystalizer->ebur_state_after = ebur128_init(2U, pecrystalizer->rate, EBUR128_MODE_LRA | EBUR128_MODE_HISTOGRAM); ebur128_set_channel(pecrystalizer->ebur_state_after, 0U, EBUR128_LEFT); ebur128_set_channel(pecrystalizer->ebur_state_after, 1U, EBUR128_RIGHT); ebur128_set_max_history(pecrystalizer->ebur_state_after, 30U * 1000U); // ms } } static void gst_pecrystalizer_process(GstPecrystalizer* pecrystalizer, GstBuffer* buffer) { bool ebur_failed = false; double range = 0.0; GstMapInfo map; gst_buffer_map(buffer, &map, GST_MAP_READWRITE); auto* data = reinterpret_cast(map.data); /* Measure loudness range before the processing. Rigorously speaking we should add the band_data arrays because we will delay output by 1 sample. But I think this sample will not affect the measruing that much. */ if (pecrystalizer->notify) { ebur128_add_frames_float(pecrystalizer->ebur_state_before, data, pecrystalizer->nsamples); if (EBUR128_SUCCESS != ebur128_loudness_range(pecrystalizer->ebur_state_before, &range)) { ebur_failed = true; } else { pecrystalizer->range_before = static_cast(range); } } for (int n = 0; n < NBANDS; n++) { memcpy(pecrystalizer->band_data[n].data(), data, map.size); pecrystalizer->filters[n]->process(pecrystalizer->band_data[n].data()); /* Later we will need to calculate the second derivative of each band. This is done through the central difference method. In order to calculate the derivative at the last elementsof the array we have to now the first element of the next buffer. As we do not have this information the only way to do this calculation is delaying the signal by 1 sample. */ // last (R,L) becomes the first std::rotate(pecrystalizer->band_data[n].rbegin(), pecrystalizer->band_data[n].rbegin() + 2, pecrystalizer->band_data[n].rend()); if (!pecrystalizer->ready) { /*pecrystalizer->band_data was rotated. Its first values are the last ones from the original array. Now we save the last (R,L) values for the next round */ pecrystalizer->delayed_L[n] = pecrystalizer->band_data[n][0]; pecrystalizer->delayed_R[n] = pecrystalizer->band_data[n][1]; // first elements becomes silence pecrystalizer->band_data[n][0] = 0.0F; pecrystalizer->band_data[n][1] = 0.0F; pecrystalizer->last_L[n] = 0.0F; pecrystalizer->last_R[n] = 0.0F; if (n == NBANDS - 1) { pecrystalizer->ready = true; } } else { /*pecrystalizer->band_data was rotated. Its first values are the last ones from the original array. we have to save them for the next round. */ float L = pecrystalizer->band_data[n][0]; float R = pecrystalizer->band_data[n][1]; /*the previously delayed (R,L) pair becomes the first element of this round. */ pecrystalizer->band_data[n][0] = pecrystalizer->delayed_L[n]; pecrystalizer->band_data[n][1] = pecrystalizer->delayed_R[n]; // saving the last (R,L) values for the next round pecrystalizer->delayed_L[n] = L; pecrystalizer->delayed_R[n] = R; } } for (int n = 0; n < NBANDS; n++) { if (!pecrystalizer->bypass[n]) { // Calculating second derivative for (uint m = 0U; m < pecrystalizer->nsamples; m++) { float L = pecrystalizer->band_data[n][2U * m]; float R = pecrystalizer->band_data[n][2U * m + 1U]; if (m > 0U && m < pecrystalizer->nsamples - 1U) { float L_lower = pecrystalizer->band_data[n][2U * (m - 1U)]; float R_lower = pecrystalizer->band_data[n][2U * (m - 1U) + 1U]; float L_upper = pecrystalizer->band_data[n][2U * (m + 1U)]; float R_upper = pecrystalizer->band_data[n][2U * (m + 1U) + 1U]; pecrystalizer->deriv2[2U * m] = L_upper - 2.0F * L + L_lower; pecrystalizer->deriv2[2U * m + 1U] = R_upper - 2.0F * R + R_lower; } else if (m == 0U) { float L_upper = pecrystalizer->band_data[n][2U * (m + 1U)]; float R_upper = pecrystalizer->band_data[n][2U * (m + 1U) + 1U]; pecrystalizer->deriv2[2U * m] = L_upper - 2.0F * L + pecrystalizer->last_L[n]; pecrystalizer->deriv2[2U * m + 1U] = R_upper - 2.0F * R + pecrystalizer->last_R[n]; } else if (m == pecrystalizer->nsamples - 1U) { float L_upper = pecrystalizer->delayed_L[n]; float R_upper = pecrystalizer->delayed_R[n]; float L_lower = pecrystalizer->band_data[n][2U * (m - 1U)]; float R_lower = pecrystalizer->band_data[n][2U * (m - 1U) + 1U]; pecrystalizer->deriv2[2U * m] = L_upper - 2.0F * L + L_lower; pecrystalizer->deriv2[2U * m + 1U] = R_upper - 2.0F * R + R_lower; } } // peak enhancing using second derivative for (uint m = 0U; m < pecrystalizer->nsamples; m++) { float L = pecrystalizer->band_data[n][2U * m]; float R = pecrystalizer->band_data[n][2U * m + 1]; float d2L = pecrystalizer->deriv2[2U * m]; float d2R = pecrystalizer->deriv2[2U * m + 1]; pecrystalizer->band_data[n][2U * m] = L - pecrystalizer->intensities[n] * d2L; pecrystalizer->band_data[n][2U * m + 1U] = R - pecrystalizer->intensities[n] * d2R; /* Aggressive mode applies a amplitude dependent gain to every sample in the signal */ if (pecrystalizer->aggressive && pecrystalizer->gain[n].size() != 0U) { uint idx_L = floorf(fabsf(L) / pecrystalizer->dv); uint idx_R = floorf(fabsf(R) / pecrystalizer->dv); if (idx_L < 0U) { idx_L = 0U; } else if (idx_L > pecrystalizer->gain[n].size()) { idx_L = pecrystalizer->gain[n].size() - 1U; } if (idx_R < 0U) { idx_R = 0U; } else if (idx_R > pecrystalizer->gain[n].size()) { idx_R = pecrystalizer->gain[n].size() - 1U; } float vL = pecrystalizer->band_data[n][2U * m]; float vR = pecrystalizer->band_data[n][2U * m + 1U]; pecrystalizer->band_data[n][2U * m] = vL * pecrystalizer->gain[n][idx_L]; pecrystalizer->band_data[n][2U * m + 1U] = vR * pecrystalizer->gain[n][idx_R]; } if (m == pecrystalizer->nsamples - 1U) { pecrystalizer->last_L[n] = L; pecrystalizer->last_R[n] = R; } } } else { pecrystalizer->last_L[n] = pecrystalizer->band_data[n][2U * pecrystalizer->nsamples - 2U]; pecrystalizer->last_R[n] = pecrystalizer->band_data[n][2U * pecrystalizer->nsamples - 1U]; } } // add bands for (uint n = 0U; n < 2U * pecrystalizer->nsamples; n++) { data[n] = 0.0F; for (uint m = 0U; m < pecrystalizer->filters.size(); m++) { if (!pecrystalizer->mute[m]) { data[n] += pecrystalizer->band_data[m][n]; } } } // Measure loudness range after the processing if (pecrystalizer->notify) { ebur128_add_frames_float(pecrystalizer->ebur_state_after, data, pecrystalizer->nsamples); if (EBUR128_SUCCESS != ebur128_loudness_range(pecrystalizer->ebur_state_after, &range)) { ebur_failed = true; } else { pecrystalizer->range_after = static_cast(range); } } gst_buffer_unmap(buffer, &map); if (!ebur_failed && pecrystalizer->notify) { pecrystalizer->sample_count += pecrystalizer->nsamples; if (pecrystalizer->sample_count >= pecrystalizer->notify_samples) { pecrystalizer->sample_count = 0; // std::cout << "range: " << pecrystalizer->range_before << "\t" // << pecrystalizer->range_after << std::endl; g_object_notify(G_OBJECT(pecrystalizer), "lra-before"); g_object_notify(G_OBJECT(pecrystalizer), "lra-after"); } } } static gboolean gst_pecrystalizer_src_query(GstPad* pad, GstObject* parent, GstQuery* query) { GstPecrystalizer* pecrystalizer = GST_PECRYSTALIZER(parent); bool ret = true; switch (GST_QUERY_TYPE(query)) { case GST_QUERY_LATENCY: { if (pecrystalizer->rate > 0) { ret = gst_pad_peer_query(pecrystalizer->sinkpad, query); if (ret) { GstClockTime min, max; gboolean live; guint64 latency; gst_query_parse_latency(query, &live, &min, &max); /* add our own latency */ latency = gst_util_uint64_scale_round(1UL, GST_SECOND, pecrystalizer->rate); // std::cout << "latency: " << latency << std::endl; // std::cout << "n: " << pecrystalizer->inbuf_n_samples // << std::endl; min += latency; if (max != GST_CLOCK_TIME_NONE) { max += latency; } // std::cout << min << "\t" << max << "\t" << live // << std::endl; gst_query_set_latency(query, live, min, max); } } else { ret = false; } break; } default: /* just call the default handler */ ret = gst_pad_query_default(pad, parent, query); break; } return ret; } static void gst_pecrystalizer_finish_filters(GstPecrystalizer* pecrystalizer) { pecrystalizer->ready = false; for (int m = 0; m < NBANDS; m++) { pecrystalizer->filters[m]->finish(); } if (pecrystalizer->ebur_state_before != nullptr) { ebur128_destroy(&pecrystalizer->ebur_state_before); pecrystalizer->ebur_state_before = nullptr; } if (pecrystalizer->ebur_state_after != nullptr) { ebur128_destroy(&pecrystalizer->ebur_state_after); pecrystalizer->ebur_state_after = nullptr; } } void gst_pecrystalizer_finalize(GObject* object) { GstPecrystalizer* pecrystalizer = GST_PECRYSTALIZER(object); GST_DEBUG_OBJECT(pecrystalizer, "finalize"); std::lock_guard lock(pecrystalizer->mutex); gst_pecrystalizer_finish_filters(pecrystalizer); /* clean up object here */ G_OBJECT_CLASS(gst_pecrystalizer_parent_class)->finalize(object); } static gboolean plugin_init(GstPlugin* plugin) { /* FIXME Remember to set the rank if it's an element that is meant to be autoplugged by decodebin. */ return gst_element_register(plugin, "pecrystalizer", GST_RANK_NONE, GST_TYPE_PECRYSTALIZER); } GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, pecrystalizer, "PulseEffects Crystalizer", plugin_init, VERSION, "LGPL", PACKAGE, "https://github.com/wwmm/pulseeffects") easyeffects-4.8.7/src/crystalizer/gstpecrystalizer.hpp000066400000000000000000000047771424023573300233460ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef GST_PECRYSTALIZER_HPP #define GST_PECRYSTALIZER_HPP #include #include #include #include #include "filter.hpp" G_BEGIN_DECLS #define GST_TYPE_PECRYSTALIZER (gst_pecrystalizer_get_type()) #define GST_PECRYSTALIZER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_PECRYSTALIZER, GstPecrystalizer)) #define GST_PECRYSTALIZER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_PECRYSTALIZER, GstPecrystalizerClass)) #define GST_IS_PECRYSTALIZER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_PECRYSTALIZER)) #define GST_IS_PECRYSTALIZER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_PECRYSTALIZER)) typedef struct _GstPecrystalizer GstPecrystalizer; typedef struct _GstPecrystalizerClass GstPecrystalizerClass; #define NBANDS 13 struct _GstPecrystalizer { GstAudioFilter base_pecrystalizer; /* properties */ std::array freqs; std::array intensities; std::array mute, bypass; float range_before, range_after; // loudness range /* < private > */ bool ready, notify, aggressive; int rate, bpf; // sampling rate, bytes per frame : channels * bps uint nsamples; int notify_samples; // number of samples to count before emit a notify int sample_count; uint ndivs; float dv; std::array filters; std::array, NBANDS> band_data, gain; std::array last_L, last_R, delayed_L, delayed_R; std::vector deriv2; ebur128_state *ebur_state_before, *ebur_state_after; std::mutex mutex; GstPad *srcpad = nullptr, *sinkpad = nullptr; }; struct _GstPecrystalizerClass { GstAudioFilterClass base_pecrystalizer_class; }; GType gst_pecrystalizer_get_type(void); G_END_DECLS #endif easyeffects-4.8.7/src/crystalizer/meson.build000066400000000000000000000017251424023573300213470ustar00rootroot00000000000000cxx = meson.get_compiler('cpp') zita_convolver = cxx.find_library('zita-convolver', required: false) if cxx.compiles( ''' #include #if ZITA_CONVOLVER_MAJOR_VERSION != 3 && ZITA_CONVOLVER_MAJOR_VERSION != 4 #error "This programs requires zita-convolver 3 or 4" #endif ''', dependencies: [zita_convolver]) plugin_sources = [ 'gstpecrystalizer.cpp', 'filter.cpp', '../util.cpp' ] plugin_deps = [ dependency('gstreamer-1.0'), dependency('gstreamer-base-1.0'), dependency('gstreamer-controller-1.0'), dependency('gstreamer-audio-1.0'), dependency('libebur128',version: '>=1.2.0'), zita_convolver ] library( 'gstpecrystalizer', plugin_sources, include_directories :[include_dir,config_h_dir], dependencies : plugin_deps, install: true, install_dir : plugins_install_dir, cpp_args: plugins_cxx_args ) else message('Missing dependency zita-convolver = 3.x.x or zita-convolver = 4.x.x') message('Crystalizer plugin will not be built') endif easyeffects-4.8.7/src/crystalizer_preset.cpp000066400000000000000000000066401424023573300212740ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "crystalizer_preset.hpp" CrystalizerPreset::CrystalizerPreset() : output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.crystalizer", "/com/github/wwmm/pulseeffects/sinkinputs/crystalizer/")) {} void CrystalizerPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".crystalizer.state", settings->get_boolean("state")); root.put(section + ".crystalizer.aggressive", settings->get_boolean("aggressive")); root.put(section + ".crystalizer.input-gain", settings->get_double("input-gain")); root.put(section + ".crystalizer.output-gain", settings->get_double("output-gain")); for (int n = 0; n < 13; n++) { root.put(section + ".crystalizer.band" + std::to_string(n) + ".intensity", settings->get_double("intensity-band" + std::to_string(n))); root.put(section + ".crystalizer.band" + std::to_string(n) + ".mute", settings->get_boolean("mute-band" + std::to_string(n))); root.put(section + ".crystalizer.band" + std::to_string(n) + ".bypass", settings->get_boolean("bypass-band" + std::to_string(n))); } } void CrystalizerPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".crystalizer.state"); update_key(root, settings, "aggressive", section + ".crystalizer.aggressive"); update_key(root, settings, "input-gain", section + ".crystalizer.input-gain"); update_key(root, settings, "output-gain", section + ".crystalizer.output-gain"); for (int n = 0; n < 13; n++) { update_key(root, settings, "intensity-band" + std::to_string(n), section + ".crystalizer.band" + std::to_string(n) + ".intensity"); update_key(root, settings, "mute-band" + std::to_string(n), section + ".crystalizer.band" + std::to_string(n) + ".mute"); update_key(root, settings, "bypass-band" + std::to_string(n), section + ".crystalizer.band" + std::to_string(n) + ".bypass"); } } void CrystalizerPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { save(root, "output", output_settings); } } void CrystalizerPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { load(root, "output", output_settings); } } easyeffects-4.8.7/src/crystalizer_ui.cpp000066400000000000000000000131641424023573300204060ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "crystalizer_ui.hpp" CrystalizerUi::CrystalizerUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "crystalizer"; // loading glade widgets builder->get_widget("bands_grid", bands_grid); builder->get_widget("range_before", range_before); builder->get_widget("range_after", range_after); builder->get_widget("range_before_label", range_before_label); builder->get_widget("range_after_label", range_after_label); builder->get_widget("aggressive", aggressive); builder->get_widget("plugin_reset", reset_button); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); settings->bind("aggressive", aggressive, "active", flag); build_bands(13); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } CrystalizerUi::~CrystalizerUi() { util::debug(name + " ui destroyed"); } void CrystalizerUi::reset() { settings->reset("aggressive"); settings->reset("input-gain"); settings->reset("output-gain"); for (int n = 0; n < 13; n++) { settings->reset("intensity-band" + std::to_string(n)); settings->reset("mute-band" + std::to_string(n)); settings->reset("bypass-band" + std::to_string(n)); } } void CrystalizerUi::build_bands(const int& nbands) { for (const auto& c : bands_grid->get_children()) { bands_grid->remove(*c); delete c; } auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; for (int n = 0; n < nbands; n++) { auto B = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/crystalizer_band.glade"); Gtk::Grid* band_grid; Gtk::Label* band_label; Gtk::Label* band_intensity_label; Gtk::ToggleButton* band_mute; Gtk::ToggleButton* band_bypass; Gtk::Scale* band_scale; B->get_widget("band_grid", band_grid); B->get_widget("band_label", band_label); B->get_widget("band_intensity_label", band_intensity_label); B->get_widget("band_mute", band_mute); B->get_widget("band_bypass", band_bypass); B->get_widget("band_scale", band_scale); auto band_intensity = Glib::RefPtr::cast_dynamic(B->get_object("band_intensity")); // set initial band intensity in relative label band_intensity_label->set_text(level_to_localized_string_showpos(band_intensity->get_value(), 0)); // connections connections.emplace_back(band_intensity->signal_value_changed().connect([=]() { auto bi = band_intensity->get_value(); band_intensity_label->set_text(level_to_localized_string_showpos(bi, 0)); })); connections.emplace_back(band_mute->signal_toggled().connect([=]() { if (band_mute->get_active()) { band_scale->set_sensitive(false); } else { band_scale->set_sensitive(true); } })); settings->bind(std::string("intensity-band" + std::to_string(n)), band_intensity.get(), "value", flag); settings->bind(std::string("mute-band" + std::to_string(n)), band_mute, "active", flag); settings->bind(std::string("bypass-band" + std::to_string(n)), band_bypass, "active", flag); bands_grid->add(*band_grid); switch (n) { case 0: band_label->set_text("250 Hz"); break; case 1: band_label->set_text("750 Hz"); break; case 2: band_label->set_text("1.5 kHz"); break; case 3: band_label->set_text("2.5 kHz"); break; case 4: band_label->set_text("3.5 kHz"); break; case 5: band_label->set_text("4.5 kHz"); break; case 6: band_label->set_text("5.5 kHz"); break; case 7: band_label->set_text("6.5 kHz"); break; case 8: band_label->set_text("7.5 kHz"); break; case 9: band_label->set_text("8.5 kHz"); break; case 10: band_label->set_text("9.5 kHz"); break; case 11: band_label->set_text("12.5 kHz"); break; case 12: band_label->set_text("17.5 kHz"); break; } } bands_grid->show_all(); } void CrystalizerUi::on_new_range_before(double value) { range_before->set_value(util::db_to_linear(value)); range_before_label->set_text(level_to_localized_string(value, 2)); } void CrystalizerUi::on_new_range_after(double value) { range_after->set_value(util::db_to_linear(value)); range_after_label->set_text(level_to_localized_string(value, 2)); } easyeffects-4.8.7/src/deesser.cpp000066400000000000000000000124661424023573300167740ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "deesser.hpp" #include #include "util.hpp" namespace { void on_post_messages_changed(GSettings* settings, gchar* key, Deesser* l) { const auto post = g_settings_get_boolean(settings, key); if (post) { if (!l->compression_connection.connected()) { l->compression_connection = Glib::signal_timeout().connect( [l]() { float compression = 0.0F; g_object_get(l->deesser, "compression", &compression, nullptr); l->compression.emit(compression); return true; }, 100); } if (!l->detected_connection.connected()) { l->detected_connection = Glib::signal_timeout().connect( [l]() { float detected = 0.0F; g_object_get(l->deesser, "detected", &detected, nullptr); l->detected.emit(detected); return true; }, 100); } } else { l->compression_connection.disconnect(); l->detected_connection.disconnect(); } } } // namespace Deesser::Deesser(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "deesser", schema, schema_path) { deesser = gst_element_factory_make("calf-sourceforge-net-plugins-Deesser", nullptr); if (is_installed(deesser)) { auto* in_level = gst_element_factory_make("level", "deesser_input_level"); auto* out_level = gst_element_factory_make("level", "deesser_output_level"); auto* audioconvert_in = gst_element_factory_make("audioconvert", "deesser_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "deesser_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), in_level, audioconvert_in, deesser, audioconvert_out, out_level, nullptr); gst_element_link_many(in_level, audioconvert_in, deesser, audioconvert_out, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(in_level, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(deesser, "bypass", 0, nullptr); bind_to_gsettings(); g_signal_connect(settings, "changed::post-messages", G_CALLBACK(on_post_messages_changed), this); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Deesser::~Deesser() { util::debug(log_tag + name + " destroyed"); } void Deesser::bind_to_gsettings() { g_settings_bind(settings, "detection", deesser, "detection", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "mode", deesser, "mode", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "ratio", deesser, "ratio", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "threshold", deesser, "threshold", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind(settings, "laxity", deesser, "laxity", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "makeup", deesser, "makeup", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "f1-freq", deesser, "f1-freq", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "f2-freq", deesser, "f2-freq", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "f1-level", deesser, "f1-level", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "f2-level", deesser, "f2-level", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "f2-q", deesser, "f2-q", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind(settings, "sc-listen", deesser, "sc-listen", G_SETTINGS_BIND_DEFAULT); } easyeffects-4.8.7/src/deesser_preset.cpp000066400000000000000000000100721424023573300203450ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "deesser_preset.hpp" DeesserPreset::DeesserPreset() : input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.deesser", "/com/github/wwmm/pulseeffects/sourceoutputs/deesser/")), output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.deesser", "/com/github/wwmm/pulseeffects/sinkinputs/deesser/")) {} void DeesserPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".deesser.state", settings->get_boolean("state")); root.put(section + ".deesser.detection", settings->get_string("detection")); root.put(section + ".deesser.mode", settings->get_string("mode")); root.put(section + ".deesser.threshold", settings->get_double("threshold")); root.put(section + ".deesser.ratio", settings->get_double("ratio")); root.put(section + ".deesser.laxity", settings->get_int("laxity")); root.put(section + ".deesser.makeup", settings->get_double("makeup")); root.put(section + ".deesser.f1-freq", settings->get_double("f1-freq")); root.put(section + ".deesser.f2-freq", settings->get_double("f2-freq")); root.put(section + ".deesser.f1-level", settings->get_double("f1-level")); root.put(section + ".deesser.f2-level", settings->get_double("f2-level")); root.put(section + ".deesser.f2-q", settings->get_double("f2-q")); root.put(section + ".deesser.sc-listen", settings->get_boolean("sc-listen")); } void DeesserPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".deesser.state"); update_string_key(root, settings, "detection", section + ".deesser.detection"); update_string_key(root, settings, "mode", section + ".deesser.mode"); update_key(root, settings, "threshold", section + ".deesser.threshold"); update_key(root, settings, "ratio", section + ".deesser.ratio"); update_key(root, settings, "laxity", section + ".deesser.laxity"); update_key(root, settings, "makeup", section + ".deesser.makeup"); update_key(root, settings, "f1-freq", section + ".deesser.f1-freq"); update_key(root, settings, "f2-freq", section + ".deesser.f2-freq"); update_key(root, settings, "f1-level", section + ".deesser.f1-level"); update_key(root, settings, "f2-level", section + ".deesser.f2-level"); update_key(root, settings, "f2-q", section + ".deesser.f2-q"); update_key(root, settings, "sc-listen", section + ".deesser.sc-listen"); } void DeesserPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: save(root, "output", output_settings); break; case PresetType::input: save(root, "input", input_settings); break; } } void DeesserPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: load(root, "output", output_settings); break; case PresetType::input: load(root, "input", input_settings); break; } } easyeffects-4.8.7/src/deesser_ui.cpp000066400000000000000000000122631424023573300174640ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "deesser_ui.hpp" #include namespace { auto detection_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "RMS") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "Peak") == 0) { g_value_set_int(value, 1); } return 1; } auto int_to_detection_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("RMS"); case 1: return g_variant_new_string("Peak"); default: return g_variant_new_string("RMS"); } } auto mode_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "Wide") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "Split") == 0) { g_value_set_int(value, 1); } return 1; } auto int_to_mode_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("Wide"); case 1: return g_variant_new_string("Split"); default: return g_variant_new_string("Wide"); } } } // namespace DeesserUi::DeesserUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "deesser"; // loading glade widgets builder->get_widget("detection", detection); builder->get_widget("mode", mode); builder->get_widget("compression", compression); builder->get_widget("compression_label", compression_label); builder->get_widget("detected", detected); builder->get_widget("detected_label", detected_label); builder->get_widget("sc_listen", sc_listen); builder->get_widget("plugin_reset", reset_button); get_object(builder, "makeup", makeup); get_object(builder, "ratio", ratio); get_object(builder, "threshold", threshold); get_object(builder, "f1_freq", f1_freq); get_object(builder, "f2_freq", f2_freq); get_object(builder, "f1_level", f1_level); get_object(builder, "f2_level", f2_level); get_object(builder, "f2_q", f2_q); get_object(builder, "laxity", laxity); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("sc-listen", sc_listen, "active", flag); settings->bind("makeup", makeup.get(), "value", flag); settings->bind("ratio", ratio.get(), "value", flag); settings->bind("threshold", threshold.get(), "value", flag); settings->bind("f1-freq", f1_freq.get(), "value", flag); settings->bind("f2-freq", f2_freq.get(), "value", flag); settings->bind("f1-level", f1_level.get(), "value", flag); settings->bind("f2-level", f2_level.get(), "value", flag); settings->bind("f2-q", f2_q.get(), "value", flag); settings->bind("laxity", laxity.get(), "value", flag); g_settings_bind_with_mapping(settings->gobj(), "detection", detection->gobj(), "active", G_SETTINGS_BIND_DEFAULT, detection_enum_to_int, int_to_detection_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "mode", mode->gobj(), "active", G_SETTINGS_BIND_DEFAULT, mode_enum_to_int, int_to_mode_enum, nullptr, nullptr); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } DeesserUi::~DeesserUi() { util::debug(name + " ui destroyed"); } void DeesserUi::reset() { settings->reset("detection"); settings->reset("mode"); settings->reset("threshold"); settings->reset("ratio"); settings->reset("laxity"); settings->reset("makeup"); settings->reset("f1-freq"); settings->reset("f2-freq"); settings->reset("f1-level"); settings->reset("f2-level"); settings->reset("f2-q"); settings->reset("sc-listen"); } void DeesserUi::on_new_compression(double value) { compression->set_value(1.0 - value); compression_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void DeesserUi::on_new_detected(double value) { detected->set_value(value); detected_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } easyeffects-4.8.7/src/delay.cpp000066400000000000000000000074061424023573300164360ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "delay.hpp" #include #include "util.hpp" Delay::Delay(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "delay", schema, schema_path) { delay = gst_element_factory_make("lsp-plug-in-plugins-lv2-comp-delay-x2-stereo", nullptr); if (is_installed(delay)) { auto* input_gain = gst_element_factory_make("volume", nullptr); auto* in_level = gst_element_factory_make("level", "delay_input_level"); auto* output_gain = gst_element_factory_make("volume", nullptr); auto* out_level = gst_element_factory_make("level", "delay_output_level"); auto* audioconvert_in = gst_element_factory_make("audioconvert", "delay_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "delay_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), input_gain, in_level, audioconvert_in, delay, audioconvert_out, output_gain, out_level, nullptr); gst_element_link_many(input_gain, in_level, audioconvert_in, delay, audioconvert_out, output_gain, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(input_gain, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(delay, "enabled", 1, nullptr); g_object_set(delay, "mode-l", 2, nullptr); g_object_set(delay, "mode-r", 2, nullptr); g_object_set(delay, "dry-l", 0.0F, nullptr); g_object_set(delay, "dry-r", 0.0F, nullptr); g_object_set(delay, "wet-l", 1.0F, nullptr); g_object_set(delay, "wet-r", 1.0F, nullptr); g_object_set(delay, "g-out", 1.0F, nullptr); bind_to_gsettings(); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "input-gain", input_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", output_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Delay::~Delay() { util::debug(log_tag + name + " destroyed"); } void Delay::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "time-l", delay, "time-l", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "time-r", delay, "time-r", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); } easyeffects-4.8.7/src/delay_preset.cpp000066400000000000000000000046741424023573300200240ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "delay_preset.hpp" DelayPreset::DelayPreset() : output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.delay", "/com/github/wwmm/pulseeffects/sinkinputs/delay/")) {} void DelayPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".delay.state", settings->get_boolean("state")); root.put(section + ".delay.input-gain", settings->get_double("input-gain")); root.put(section + ".delay.output-gain", settings->get_double("output-gain")); root.put(section + ".delay.time-l", settings->get_double("time-l")); root.put(section + ".delay.time-r", settings->get_double("time-r")); } void DelayPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".delay.state"); update_key(root, settings, "input-gain", section + ".delay.input-gain"); update_key(root, settings, "output-gain", section + ".delay.output-gain"); update_key(root, settings, "time-l", section + ".delay.time-l"); update_key(root, settings, "time-r", section + ".delay.time-r"); } void DelayPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { save(root, "output", output_settings); } } void DelayPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { load(root, "output", output_settings); } } easyeffects-4.8.7/src/delay_ui.cpp000066400000000000000000000037461424023573300171360ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "delay_ui.hpp" DelayUi::DelayUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "delay"; // loading glade widgets builder->get_widget("plugin_reset", reset_button); get_object(builder, "time_l", time_l); get_object(builder, "time_r", time_r); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); settings->bind("time-l", time_l.get(), "value", flag); settings->bind("time-r", time_r.get(), "value", flag); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } DelayUi::~DelayUi() { util::debug(name + " ui destroyed"); } void DelayUi::reset() { settings->reset("input-gain"); settings->reset("output-gain"); settings->reset("time-l"); settings->reset("time-r"); } easyeffects-4.8.7/src/effects_base_ui.cpp000066400000000000000000000113731424023573300204440ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "effects_base_ui.hpp" std::locale EffectsBaseUi::global_locale = util::get_global_locale(); EffectsBaseUi::EffectsBaseUi(const Glib::RefPtr& builder, Glib::RefPtr refSettings, PulseManager* pulse_manager) : settings(std::move(refSettings)), pm(pulse_manager) { // loading glade widgets builder->get_widget("stack", stack); builder->get_widget("listbox", listbox); builder->get_widget("apps_box", apps_box); builder->get_widget("placeholder_spectrum", placeholder_spectrum); auto b_app_button_row = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/app_button_row.glade"); b_app_button_row->get_widget("app_button_row", app_button_row); b_app_button_row->get_widget("app_input_icon", app_input_icon); b_app_button_row->get_widget("app_output_icon", app_output_icon); b_app_button_row->get_widget("global_level_meter_grid", global_level_meter_grid); b_app_button_row->get_widget("global_output_level_left", global_output_level_left); b_app_button_row->get_widget("global_output_level_right", global_output_level_right); b_app_button_row->get_widget("saturation_icon", saturation_icon); // spectrum spectrum_ui = SpectrumUi::add_to_box(placeholder_spectrum); // setting up plugin list box auto* row = Gtk::manage(new Gtk::ListBoxRow()); row->set_name("applications"); row->set_margin_top(6); row->set_margin_bottom(6); row->set_margin_right(6); row->set_margin_left(6); row->add(*app_button_row); listbox->add(*row); // plugin rows connections listbox->signal_row_activated().connect([&](auto row) { stack->set_visible_child(row->get_name()); }); listbox->set_sort_func(sigc::mem_fun(*this, &EffectsBaseUi::on_listbox_sort)); connections.emplace_back(settings->signal_changed("plugins").connect([=](auto key) { listbox->invalidate_sort(); })); } EffectsBaseUi::~EffectsBaseUi() { for (auto& c : connections) { c.disconnect(); } } void EffectsBaseUi::on_app_changed(const std::shared_ptr& app_info) { for (auto it = apps_list.begin(); it != apps_list.end(); it++) { auto n = it - apps_list.begin(); if (apps_list[n]->app_info->index == app_info->index) { apps_list[n]->update(app_info); } } } void EffectsBaseUi::on_app_removed(uint idx) { for (auto it = apps_list.begin(); it != apps_list.end(); it++) { auto n = it - apps_list.begin(); if (apps_list[n]->app_info->index == idx) { auto* appui = apps_list[n]; apps_box->remove(*appui); apps_list.erase(it); break; } } } auto EffectsBaseUi::on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int { auto name1 = row1->get_name(); auto name2 = row2->get_name(); auto order = Glib::Variant>(); settings->get_value("plugins", order); auto vorder = order.get(); auto r1 = std::find(std::begin(vorder), std::end(vorder), name1); auto r2 = std::find(std::begin(vorder), std::end(vorder), name2); auto idx1 = r1 - vorder.begin(); auto idx2 = r2 - vorder.begin(); // we do not want the applications row to be moved if (name1 == std::string("applications")) { return -1; } if (name2 == std::string("applications")) { return 1; } if (idx1 < idx2) { return -1; } if (idx1 > idx2) { return 1; } return 0; } void EffectsBaseUi::on_new_output_level_db(const std::array& peak) { auto left = peak[0]; auto right = peak[1]; // show the grid only if something is playing/recording if (left <= -100.0 && right <= -100.0) { global_level_meter_grid->set_visible(false); return; } global_level_meter_grid->set_visible(true); global_output_level_left->set_text(level_to_localized_string_showpos(left, 0)); global_output_level_right->set_text(level_to_localized_string_showpos(right, 0)); // saturation icon notification if (left > 0.0 || right > 0.0) { saturation_icon->set_visible(true); } else { saturation_icon->set_visible(false); } } easyeffects-4.8.7/src/equalizer.cpp000066400000000000000000000206761424023573300173450ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "equalizer.hpp" #include #include #include "util.hpp" namespace { void on_num_bands_changed(GSettings* settings, gchar* key, Equalizer* l) { l->update_equalizer(); } } // namespace Equalizer::Equalizer(const std::string& tag, const std::string& schema, const std::string& schema_path, const std::string& schema_channel, const std::string& schema_channel_left_path, const std::string& schema_channel_right_path) : PluginBase(tag, "equalizer", schema, schema_path), settings_left(g_settings_new_with_path(schema_channel.c_str(), schema_channel_left_path.c_str())), settings_right(g_settings_new_with_path(schema_channel.c_str(), schema_channel_right_path.c_str())) { equalizer = gst_element_factory_make("lsp-plug-in-plugins-lv2-para-equalizer-x32-lr", nullptr); if (is_installed(equalizer)) { auto* input_gain = gst_element_factory_make("volume", nullptr); auto* in_level = gst_element_factory_make("level", "equalizer_input_level"); auto* out_level = gst_element_factory_make("level", "equalizer_output_level"); auto* output_gain = gst_element_factory_make("volume", nullptr); auto* audioconvert_in = gst_element_factory_make("audioconvert", "eq_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "eq_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), input_gain, in_level, audioconvert_in, equalizer, audioconvert_out, output_gain, out_level, nullptr); gst_element_link_many(input_gain, in_level, audioconvert_in, equalizer, audioconvert_out, output_gain, out_level, nullptr); // setting bin ghost pads auto* pad_sink = gst_element_get_static_pad(input_gain, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); // init g_object_set(equalizer, "enabled", 1, nullptr); g_object_set(equalizer, "bal", 0.0F, nullptr); g_object_set(equalizer, "fft", 0, nullptr); // off for (int n = 0; n < 30; n++) { bind_band(equalizer, n); } // connect signals g_signal_connect(settings, "changed::num-bands", G_CALLBACK(on_num_bands_changed), this); // gsettings bindings g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "input-gain", input_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", output_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); g_settings_bind(settings, "mode", equalizer, "mode", G_SETTINGS_BIND_DEFAULT); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Equalizer::~Equalizer() { g_object_unref(settings_left); g_object_unref(settings_right); util::debug(log_tag + name + " destroyed"); } void Equalizer::bind_band(GstElement* equalizer, const int& index) { // left channel g_settings_bind(settings_left, std::string("band" + std::to_string(index) + "-type").c_str(), equalizer, std::string("ftl-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings_left, std::string("band" + std::to_string(index) + "-mode").c_str(), equalizer, std::string("fml-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings_left, std::string("band" + std::to_string(index) + "-slope").c_str(), equalizer, std::string("sl-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings_left, std::string("band" + std::to_string(index) + "-solo").c_str(), equalizer, std::string("xsl-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings_left, std::string("band" + std::to_string(index) + "-mute").c_str(), equalizer, std::string("xml-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings_left, std::string("band" + std::to_string(index) + "-frequency").c_str(), equalizer, std::string("fl-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings_left, std::string("band" + std::to_string(index) + "-q").c_str(), equalizer, std::string("ql-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings_left, std::string("band" + std::to_string(index) + "-gain").c_str(), equalizer, std::string("gl-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_GET, util::db20_gain_to_linear, nullptr, nullptr, nullptr); // right channel g_settings_bind(settings_right, std::string("band" + std::to_string(index) + "-type").c_str(), equalizer, std::string("ftr-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings_right, std::string("band" + std::to_string(index) + "-mode").c_str(), equalizer, std::string("fmr-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings_right, std::string("band" + std::to_string(index) + "-slope").c_str(), equalizer, std::string("sr-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings_right, std::string("band" + std::to_string(index) + "-solo").c_str(), equalizer, std::string("xsr-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings_right, std::string("band" + std::to_string(index) + "-mute").c_str(), equalizer, std::string("xmr-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings_right, std::string("band" + std::to_string(index) + "-frequency").c_str(), equalizer, std::string("fr-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings_right, std::string("band" + std::to_string(index) + "-q").c_str(), equalizer, std::string("qr-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings_right, std::string("band" + std::to_string(index) + "-gain").c_str(), equalizer, std::string("gr-" + std::to_string(index)).c_str(), G_SETTINGS_BIND_GET, util::db20_gain_to_linear, nullptr, nullptr, nullptr); } void Equalizer::update_equalizer() { int nbands = g_settings_get_int(settings, "num-bands"); for (int n = nbands; n < 30; n++) { // turn off unused band g_object_set(equalizer, std::string("ftl-" + std::to_string(n)).c_str(), 0, nullptr); g_object_set(equalizer, std::string("ftr-" + std::to_string(n)).c_str(), 0, nullptr); } } easyeffects-4.8.7/src/equalizer_preset.cpp000066400000000000000000000176361424023573300207310ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "equalizer_preset.hpp" #include "util.hpp" EqualizerPreset::EqualizerPreset() : input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.equalizer", "/com/github/wwmm/pulseeffects/sourceoutputs/equalizer/")), input_settings_left(Gio::Settings::create("com.github.wwmm.pulseeffects.equalizer.channel", "/com/github/wwmm/pulseeffects/sourceoutputs/equalizer/leftchannel/")), input_settings_right( Gio::Settings::create("com.github.wwmm.pulseeffects.equalizer.channel", "/com/github/wwmm/pulseeffects/sourceoutputs/equalizer/rightchannel/")), output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.equalizer", "/com/github/wwmm/pulseeffects/sinkinputs/equalizer/")), output_settings_left(Gio::Settings::create("com.github.wwmm.pulseeffects.equalizer.channel", "/com/github/wwmm/pulseeffects/sinkinputs/equalizer/leftchannel/")), output_settings_right(Gio::Settings::create("com.github.wwmm.pulseeffects.equalizer.channel", "/com/github/wwmm/pulseeffects/sinkinputs/equalizer/rightchannel/")) { } void EqualizerPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".equalizer.state", settings->get_boolean("state")); root.put(section + ".equalizer.mode", settings->get_string("mode")); const auto& nbands = settings->get_int("num-bands"); root.put(section + ".equalizer.num-bands", nbands); root.put(section + ".equalizer.input-gain", settings->get_double("input-gain")); root.put(section + ".equalizer.output-gain", settings->get_double("output-gain")); root.put(section + ".equalizer.split-channels", settings->get_boolean("split-channels")); if (section == "input") { save_channel(root, "input.equalizer.left", input_settings_left, nbands); save_channel(root, "input.equalizer.right", input_settings_right, nbands); } else if (section == "output") { save_channel(root, "output.equalizer.left", output_settings_left, nbands); save_channel(root, "output.equalizer.right", output_settings_right, nbands); } } void EqualizerPreset::save_channel(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings, const int& nbands) { for (int n = 0; n < nbands; n++) { root.put(section + ".band" + std::to_string(n) + ".type", settings->get_string(std::string("band" + std::to_string(n) + "-type"))); root.put(section + ".band" + std::to_string(n) + ".mode", settings->get_string(std::string("band" + std::to_string(n) + "-mode"))); root.put(section + ".band" + std::to_string(n) + ".slope", settings->get_string(std::string("band" + std::to_string(n) + "-slope"))); root.put(section + ".band" + std::to_string(n) + ".solo", settings->get_boolean(std::string("band" + std::to_string(n) + "-solo"))); root.put(section + ".band" + std::to_string(n) + ".mute", settings->get_boolean(std::string("band" + std::to_string(n) + "-mute"))); root.put(section + ".band" + std::to_string(n) + ".gain", settings->get_double(std::string("band" + std::to_string(n) + "-gain"))); root.put(section + ".band" + std::to_string(n) + ".frequency", settings->get_double(std::string("band" + std::to_string(n) + "-frequency"))); root.put(section + ".band" + std::to_string(n) + ".q", settings->get_double(std::string("band" + std::to_string(n) + "-q"))); } } void EqualizerPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".equalizer.state"); update_string_key(root, settings, "mode", section + ".equalizer.mode"); update_key(root, settings, "num-bands", section + ".equalizer.num-bands"); update_key(root, settings, "input-gain", section + ".equalizer.input-gain"); update_key(root, settings, "output-gain", section + ".equalizer.output-gain"); const auto& nbands = settings->get_int("num-bands"); update_key(root, settings, "split-channels", section + ".equalizer.split-channels"); if (section == std::string("input")) { load_channel(root, "input.equalizer.left", input_settings_left, nbands); load_channel(root, "input.equalizer.right", input_settings_right, nbands); } else if (section == std::string("output")) { load_channel(root, "output.equalizer.left", output_settings_left, nbands); load_channel(root, "output.equalizer.right", output_settings_right, nbands); } } void EqualizerPreset::load_channel(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings, const int& nbands) { for (int n = 0; n < nbands; n++) { update_string_key(root, settings, std::string("band" + std::to_string(n) + "-type"), section + ".band" + std::to_string(n) + ".type"); update_string_key(root, settings, std::string("band" + std::to_string(n) + "-mode"), section + ".band" + std::to_string(n) + ".mode"); update_string_key(root, settings, std::string("band" + std::to_string(n) + "-slope"), section + ".band" + std::to_string(n) + ".slope"); update_key(root, settings, std::string("band" + std::to_string(n) + "-solo"), section + ".band" + std::to_string(n) + ".solo"); update_key(root, settings, std::string("band" + std::to_string(n) + "-mute"), section + ".band" + std::to_string(n) + ".mute"); update_key(root, settings, std::string("band" + std::to_string(n) + "-gain"), section + ".band" + std::to_string(n) + ".gain"); update_key(root, settings, std::string("band" + std::to_string(n) + "-frequency"), section + ".band" + std::to_string(n) + ".frequency"); update_key(root, settings, std::string("band" + std::to_string(n) + "-q"), section + ".band" + std::to_string(n) + ".q"); } } void EqualizerPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: save(root, "output", output_settings); break; case PresetType::input: save(root, "input", input_settings); break; } } void EqualizerPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: load(root, "output", output_settings); break; case PresetType::input: load(root, "input", input_settings); break; } } easyeffects-4.8.7/src/equalizer_ui.cpp000066400000000000000000000722441424023573300200400ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "equalizer_ui.hpp" #include #include #include #include #include namespace { auto bandtype_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "Off") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "Bell") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "Hi-pass") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "Hi-shelf") == 0) { g_value_set_int(value, 3); } else if (std::strcmp(v, "Lo-pass") == 0) { g_value_set_int(value, 4); } else if (std::strcmp(v, "Lo-shelf") == 0) { g_value_set_int(value, 5); } else if (std::strcmp(v, "Notch") == 0) { g_value_set_int(value, 6); } else if (std::strcmp(v, "Resonance") == 0) { g_value_set_int(value, 7); } else if (std::strcmp(v, "Allpass") == 0) { g_value_set_int(value, 8); } return 1; } auto int_to_bandtype_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("Off"); case 1: return g_variant_new_string("Bell"); case 2: return g_variant_new_string("Hi-pass"); case 3: return g_variant_new_string("Hi-shelf"); case 4: return g_variant_new_string("Lo-pass"); case 5: return g_variant_new_string("Lo-shelf"); case 6: return g_variant_new_string("Notch"); case 7: return g_variant_new_string("Resonance"); case 8: return g_variant_new_string("Allpass"); default: return g_variant_new_string("Bell"); } } auto mode_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "IIR") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "FIR") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "FFT") == 0) { g_value_set_int(value, 2); } return 1; } auto int_to_mode_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("IIR"); case 1: return g_variant_new_string("FIR"); case 2: return g_variant_new_string("FFT"); default: return g_variant_new_string("IIR"); } } auto bandmode_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "RLC (BT)") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "RLC (MT)") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "BWC (BT)") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "BWC (MT)") == 0) { g_value_set_int(value, 3); } else if (std::strcmp(v, "LRX (BT)") == 0) { g_value_set_int(value, 4); } else if (std::strcmp(v, "LRX (MT)") == 0) { g_value_set_int(value, 5); } else if (std::strcmp(v, "APO (DR)") == 0) { g_value_set_int(value, 6); } return 1; } auto int_to_bandmode_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("RLC (BT)"); case 1: return g_variant_new_string("RLC (MT)"); case 2: return g_variant_new_string("BWC (BT)"); case 3: return g_variant_new_string("BWC (MT)"); case 4: return g_variant_new_string("LRX (BT)"); case 5: return g_variant_new_string("LRX (MT)"); case 6: return g_variant_new_string("APO (DR)"); default: return g_variant_new_string("RLC (BT)"); } } auto bandslope_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "x1") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "x2") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "x3") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "x4") == 0) { g_value_set_int(value, 3); } return 1; } auto int_to_bandslope_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("x1"); case 1: return g_variant_new_string("x2"); case 2: return g_variant_new_string("x3"); case 3: return g_variant_new_string("x4"); default: return g_variant_new_string("x1"); } } } // namespace EqualizerUi::EqualizerUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path, const std::string& schema_channel, const std::string& schema_channel_left_path, const std::string& schema_channel_right_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path), settings_left(Gio::Settings::create(schema_channel, schema_channel_left_path)), settings_right(Gio::Settings::create(schema_channel, schema_channel_right_path)) { name = "equalizer"; // loading glade widgets builder->get_widget("bands_grid_left", bands_grid_left); builder->get_widget("bands_grid_right", bands_grid_right); builder->get_widget("flat_response", flat_response); builder->get_widget("import_apo", import_apo); builder->get_widget("calculate_freqs", calculate_freqs); builder->get_widget("presets_listbox", presets_listbox); builder->get_widget("split_channels", split_channels); builder->get_widget("stack", stack); builder->get_widget("stack_switcher", stack_switcher); builder->get_widget("mode", mode); builder->get_widget("plugin_reset", reset_button); get_object(builder, "nbands", nbands); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); // signals connections nbands->signal_value_changed().connect(sigc::mem_fun(*this, &EqualizerUi::on_nbands_changed)); // reset equalizer reset_button->signal_clicked().connect(sigc::mem_fun(*this, &EqualizerUi::reset)); flat_response->signal_clicked().connect(sigc::mem_fun(*this, &EqualizerUi::on_flat_response)); calculate_freqs->signal_clicked().connect(sigc::mem_fun(*this, &EqualizerUi::on_calculate_frequencies)); presets_listbox->set_sort_func(sigc::ptr_fun(&EqualizerUi::on_listbox_sort)); import_apo->signal_clicked().connect(sigc::mem_fun(*this, &EqualizerUi::on_import_apo_preset_clicked)); connections.emplace_back(settings->signal_changed("split-channels").connect([=](const auto& sc) { stack->set_visible_child("left_channel"); on_nbands_changed(); })); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; auto flag_get = Gio::SettingsBindFlags::SETTINGS_BIND_GET; settings->bind("installed", this, "sensitive", flag); settings->bind("num-bands", nbands.get(), "value", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); settings->bind("split-channels", split_channels, "active", flag); settings->bind("split-channels", stack_switcher, "visible", flag_get); g_settings_bind_with_mapping(settings->gobj(), "mode", mode->gobj(), "active", G_SETTINGS_BIND_DEFAULT, mode_enum_to_int, int_to_mode_enum, nullptr, nullptr); // explicitly invoke the method to build equalizer bands (fixes #843) // if the preset num-bands value is equal to the default schema value // otherwise it's automatically invoked at startup by the functor on signal_value_changed Glib::Variant default_nbands; settings->get_default_value("num-bands", default_nbands); if (default_nbands.get() == settings->get_int("num-bands")) { on_nbands_changed(); } populate_presets_listbox(); } EqualizerUi::~EqualizerUi() { for (auto& c : connections_bands) { c.disconnect(); } util::debug(name + " ui destroyed"); } void EqualizerUi::on_nbands_changed() { for (auto& c : connections_bands) { c.disconnect(); } for (const auto& c : bands_grid_left->get_children()) { bands_grid_left->remove(*c); delete c; } for (const auto& c : bands_grid_right->get_children()) { bands_grid_right->remove(*c); delete c; } connections_bands.clear(); bool split = settings->get_boolean("split-channels"); const auto& nb = static_cast(nbands->get_value()); build_bands(bands_grid_left, settings_left, nb, split); if (split) { build_bands(bands_grid_right, settings_right, nb, split); } } void EqualizerUi::build_bands(Gtk::Grid* bands_grid, const Glib::RefPtr& cfg, const int& nbands, const bool& split_mode) { auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; for (int n = 0; n < nbands; n++) { auto B = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/equalizer_band.glade"); Gtk::Grid* band_grid = nullptr; Gtk::ComboBoxText* band_type = nullptr; Gtk::ComboBoxText* band_mode = nullptr; Gtk::ComboBoxText* band_slope = nullptr; Gtk::Label* band_width = nullptr; Gtk::Label* band_label = nullptr; Gtk::Label* band_quality_label = nullptr; Gtk::Label* band_gain_label = nullptr; Gtk::Button* reset_frequency = nullptr; Gtk::Button* reset_quality = nullptr; Gtk::ToggleButton* band_solo = nullptr; Gtk::ToggleButton* band_mute = nullptr; Gtk::Scale* band_scale = nullptr; B->get_widget("band_grid", band_grid); B->get_widget("band_type", band_type); B->get_widget("band_mode", band_mode); B->get_widget("band_slope", band_slope); B->get_widget("band_width", band_width); B->get_widget("band_label", band_label); B->get_widget("band_quality_label", band_quality_label); B->get_widget("band_gain_label", band_gain_label); B->get_widget("band_solo", band_solo); B->get_widget("band_mute", band_mute); B->get_widget("band_scale", band_scale); B->get_widget("reset_frequency", reset_frequency); B->get_widget("reset_quality", reset_quality); auto band_gain = Glib::RefPtr::cast_dynamic(B->get_object("band_gain")); auto band_frequency = Glib::RefPtr::cast_dynamic(B->get_object("band_frequency")); auto band_quality = Glib::RefPtr::cast_dynamic(B->get_object("band_quality")); auto update_quality_width = [=]() { const auto& q = band_quality->get_value(); band_quality_label->set_text("Q " + level_to_localized_string(q, 2)); if (q > 0.0) { const auto& f = band_frequency->get_value(); band_width->set_text(level_to_localized_string(f / q, 1) + " Hz"); } else { band_width->set_text(_("infinity")); } }; auto update_band_label = [=]() { const auto& f = band_frequency->get_value(); if (f > 1000.0) { band_label->set_text(level_to_localized_string(f / 1000.0, 1) + " kHz"); } else { band_label->set_text(level_to_localized_string(f, 0) + " Hz"); } }; auto update_gain = [=]() { const auto& g = band_gain->get_value(); band_gain_label->set_text(level_to_localized_string_showpos(g, 2)); }; // set initial band gain in relative label band_gain_label->set_text(level_to_localized_string_showpos(band_gain->get_value(), 2)); // connections connections_bands.emplace_back(band_frequency->signal_value_changed().connect(update_quality_width)); connections_bands.emplace_back(band_frequency->signal_value_changed().connect(update_band_label)); connections_bands.emplace_back(band_quality->signal_value_changed().connect(update_quality_width)); connections_bands.emplace_back(band_gain->signal_value_changed().connect(update_gain)); if (split_mode) { // split channels mode connections_bands.emplace_back(reset_frequency->signal_clicked().connect([=]() { cfg->reset(std::string("band" + std::to_string(n) + "-frequency")); })); connections_bands.emplace_back(reset_quality->signal_clicked().connect([=]() { cfg->reset(std::string("band" + std::to_string(n) + "-q")); })); } else { // unified mode /* Right channel We need the bindgins below for the right channel equalizer to be updated. They have to be done before the bindings for the left channel. */ connections_bands.emplace_back(band_gain->signal_value_changed().connect([=]() { settings_right->set_double( std::string("band" + std::to_string(n) + "-gain"), band_gain->get_value() ); })); connections_bands.emplace_back(band_frequency->signal_value_changed().connect([=]() { settings_right->set_double( std::string("band" + std::to_string(n) + "-frequency"), band_frequency->get_value() ); })); connections_bands.emplace_back(band_quality->signal_value_changed().connect([=]() { settings_right->set_double( std::string("band" + std::to_string(n) + "-q"), band_quality->get_value() ); })); connections_bands.emplace_back(band_type->signal_changed().connect([=]() { settings_right->set_enum( std::string("band" + std::to_string(n) + "-type"), band_type->get_active_row_number() ); })); connections_bands.emplace_back(band_mode->signal_changed().connect([=]() { settings_right->set_enum( std::string("band" + std::to_string(n) + "-mode"), band_mode->get_active_row_number() ); })); connections_bands.emplace_back(band_slope->signal_changed().connect([=]() { settings_right->set_enum( std::string("band" + std::to_string(n) + "-slope"), band_slope->get_active_row_number() ); })); connections_bands.emplace_back(band_solo->signal_toggled().connect([=]() { settings_right->set_boolean( std::string("band" + std::to_string(n) + "-solo"), band_solo->get_active() ); })); connections_bands.emplace_back(band_mute->signal_toggled().connect([=]() { settings_right->set_boolean( std::string("band" + std::to_string(n) + "-mute"), band_mute->get_active() ); })); // Left channel connections_bands.emplace_back(reset_frequency->signal_clicked().connect([=]() { settings_left->reset(std::string("band" + std::to_string(n) + "-frequency")); settings_right->reset(std::string("band" + std::to_string(n) + "-frequency")); })); connections_bands.emplace_back(reset_quality->signal_clicked().connect([=]() { settings_left->reset(std::string("band" + std::to_string(n) + "-q")); settings_right->reset(std::string("band" + std::to_string(n) + "-q")); })); } connections_bands.emplace_back(band_type->signal_changed().connect([=]() { const auto& row_num = band_type->get_active_row_number(); // disable gain scale if type is "Off", "Hi-pass" or "Lo-pass" if (row_num == 0 || row_num == 2 || row_num == 4) { band_scale->set_sensitive(false); } else { band_scale->set_sensitive(true); } })); cfg->bind(std::string("band" + std::to_string(n) + "-gain"), band_gain.get(), "value", flag); cfg->bind(std::string("band" + std::to_string(n) + "-frequency"), band_frequency.get(), "value", flag); cfg->bind(std::string("band" + std::to_string(n) + "-q"), band_quality.get(), "value", flag); cfg->bind(std::string("band" + std::to_string(n) + "-solo"), band_solo, "active", flag); cfg->bind(std::string("band" + std::to_string(n) + "-mute"), band_mute, "active", flag); g_settings_bind_with_mapping(cfg->gobj(), std::string("band" + std::to_string(n) + "-type").c_str(), band_type->gobj(), "active", G_SETTINGS_BIND_DEFAULT, bandtype_enum_to_int, int_to_bandtype_enum, nullptr, nullptr); g_settings_bind_with_mapping(cfg->gobj(), std::string("band" + std::to_string(n) + "-mode").c_str(), band_mode->gobj(), "active", G_SETTINGS_BIND_DEFAULT, bandmode_enum_to_int, int_to_bandmode_enum, nullptr, nullptr); g_settings_bind_with_mapping(cfg->gobj(), std::string("band" + std::to_string(n) + "-slope").c_str(), band_slope->gobj(), "active", G_SETTINGS_BIND_DEFAULT, bandslope_enum_to_int, int_to_bandslope_enum, nullptr, nullptr); bands_grid->add(*band_grid); } bands_grid->show_all(); } void EqualizerUi::on_flat_response() { for (int n = 0; n < max_bands; n++) { // left channel settings_left->reset(std::string("band" + std::to_string(n) + "-gain")); // right channel settings_right->reset(std::string("band" + std::to_string(n) + "-gain")); } } void EqualizerUi::on_calculate_frequencies() { const double min_freq = 20.0; const double max_freq = 20000.0; double freq0 = 0.0; double freq1 = 0.0; double step = 0.0; const auto& nbands = settings->get_int("num-bands"); // code taken from gstreamer equalizer sources: gstiirequalizer.c // function: gst_iir_equalizer_compute_frequencies step = pow(max_freq / min_freq, 1.0 / nbands); freq0 = min_freq; auto config_band = [&](const auto& cfg, const auto& n, const auto& freq, const auto& q) { cfg->set_double(std::string("band" + std::to_string(n) + "-frequency"), freq); cfg->set_double(std::string("band" + std::to_string(n) + "-q"), q); }; for (int n = 0; n < nbands; n++) { freq1 = freq0 * step; double freq = freq0 + 0.5 * (freq1 - freq0); double width = freq1 - freq0; double q = freq / width; // std::cout << n << "\t" << freq << "\t" << width << std::endl; config_band(settings_left, n, freq, q); config_band(settings_right, n, freq, q); freq0 = freq1; } } void EqualizerUi::load_preset(const std::string& file_name) { gsize dsize = 0; std::stringstream ss; boost::property_tree::ptree root; auto bytes = Gio::Resource::lookup_data_global(presets_path + file_name); const auto* rdata = static_cast(bytes->get_data(dsize)); auto file_contents = std::string(rdata); // std::cout << file_contents << std::endl; ss << file_contents; boost::property_tree::read_json(ss, root); const auto& nbands = root.get("equalizer.num-bands"); settings->set_int("num-bands", nbands); settings->set_string("mode", root.get("equalizer.mode")); settings->set_double("input-gain", root.get("equalizer.input-gain")); settings->set_double("output-gain", root.get("equalizer.output-gain")); auto config_band = [&](const auto& cfg, const auto& n) { double q = 0.0; const auto& f = root.get("equalizer.band" + std::to_string(n) + ".frequency"); try { q = root.get("equalizer.band" + std::to_string(n) + ".q"); } catch (const boost::property_tree::ptree_error& e) { try { const auto& w = root.get("equalizer.band" + std::to_string(n) + ".width"); q = f / w; } catch (const boost::property_tree::ptree_error& e) { } } cfg->set_double(std::string("band" + std::to_string(n) + "-gain"), root.get("equalizer.band" + std::to_string(n) + ".gain")); cfg->set_double(std::string("band" + std::to_string(n) + "-frequency"), f); cfg->set_double(std::string("band" + std::to_string(n) + "-q"), q); cfg->set_string(std::string("band" + std::to_string(n) + "-type"), root.get("equalizer.band" + std::to_string(n) + ".type")); cfg->set_string(std::string("band" + std::to_string(n) + "-mode"), root.get("equalizer.band" + std::to_string(n) + ".mode")); cfg->set_string(std::string("band" + std::to_string(n) + "-slope"), root.get("equalizer.band" + std::to_string(n) + ".slope")); cfg->set_boolean(std::string("band" + std::to_string(n) + "-solo"), root.get("equalizer.band" + std::to_string(n) + ".solo")); cfg->set_boolean(std::string("band" + std::to_string(n) + "-mute"), root.get("equalizer.band" + std::to_string(n) + ".mute")); }; for (int n = 0; n < nbands; n++) { config_band(settings_left, n); config_band(settings_right, n); } } auto EqualizerUi::on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int { auto name1 = row1->get_name(); auto name2 = row2->get_name(); std::vector names = {name1, name2}; std::sort(names.begin(), names.end()); if (name1 == names[0]) { return -1; } if (name2 == names[0]) { return 1; } return 0; } void EqualizerUi::populate_presets_listbox() { auto children = presets_listbox->get_children(); for (const auto& c : children) { presets_listbox->remove(*c); } auto names = Gio::Resource::enumerate_children_global(presets_path); for (const auto& file_name : names) { auto name = file_name.substr(0, file_name.find('.')); auto b = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/equalizer_preset_row.glade"); Gtk::ListBoxRow* row = nullptr; Gtk::Button* apply_btn = nullptr; Gtk::Label* label = nullptr; b->get_widget("preset_row", row); b->get_widget("apply", apply_btn); b->get_widget("name", label); row->set_name(name); label->set_text(name); connections.emplace_back(apply_btn->signal_clicked().connect([=]() { load_preset(row->get_name() + ".json"); })); presets_listbox->add(*row); presets_listbox->show_all(); } } void EqualizerUi::reset() { settings->reset("mode"); settings->reset("num-bands"); settings->reset("split-channels"); settings->reset("input-gain"); settings->reset("output-gain"); for (int n = 0; n < max_bands; n++) { // left channel settings_left->reset(std::string("band" + std::to_string(n) + "-gain")); settings_left->reset(std::string("band" + std::to_string(n) + "-frequency")); settings_left->reset(std::string("band" + std::to_string(n) + "-q")); settings_left->reset(std::string("band" + std::to_string(n) + "-type")); settings_left->reset(std::string("band" + std::to_string(n) + "-mode")); settings_left->reset(std::string("band" + std::to_string(n) + "-slope")); settings_left->reset(std::string("band" + std::to_string(n) + "-solo")); settings_left->reset(std::string("band" + std::to_string(n) + "-mute")); // right channel settings_right->reset(std::string("band" + std::to_string(n) + "-gain")); settings_right->reset(std::string("band" + std::to_string(n) + "-frequency")); settings_right->reset(std::string("band" + std::to_string(n) + "-q")); settings_right->reset(std::string("band" + std::to_string(n) + "-type")); settings_right->reset(std::string("band" + std::to_string(n) + "-mode")); settings_right->reset(std::string("band" + std::to_string(n) + "-slope")); settings_right->reset(std::string("band" + std::to_string(n) + "-solo")); settings_right->reset(std::string("band" + std::to_string(n) + "-mute")); } } void EqualizerUi::on_import_apo_preset_clicked() { auto* main_window = dynamic_cast(this->get_toplevel()); auto dialog = Gtk::FileChooserNative::create(_("Import APO Preset File"), *main_window, Gtk::FileChooserAction::FILE_CHOOSER_ACTION_OPEN, _("Open"), _("Cancel")); auto dialog_filter = Gtk::FileFilter::create(); dialog_filter->set_name(_("APO Presets")); dialog_filter->add_pattern("*.txt"); dialog->add_filter(dialog_filter); dialog->signal_response().connect([=](const auto& response_id) { switch (response_id) { case Gtk::ResponseType::RESPONSE_ACCEPT: { import_apo_preset(dialog->get_file()->get_path()); break; } default: break; } }); dialog->set_modal(true); dialog->show(); } // returns false if we cannot parse given line successfully auto EqualizerUi::parse_apo_filter(const std::string& line, struct ImportedBand& filter) -> bool { std::smatch matches; auto i = std::regex::icase; std::regex re_filter_type("filter\\s++\\d*+:\\s*+on\\s++([a-z]++)", i); std::regex re_freq("fc\\s++(\\d++\\.?+\\d*+)\\s*+hz", i); std::regex re_dB_per_octave("filter\\s++\\d*+:\\s*+on\\s++[a-z]++\\s++([\\+-]?+\\d++\\.?+\\d*+)\\s*+db", i); std::regex re_gain("gain\\s++([\\+-]?+\\d++\\.?+\\d*+)\\s*+db", i); std::regex re_quality_factor("q\\s++(\\d++\\.?+\\d*+)", i); // get filter type std::regex_search(line, matches, re_filter_type); if (matches.size() != 2U) { return false; } try { filter.type = EqualizerUi::FilterTypeMap.at(matches.str(1)); } catch (...) { return false; } // get center frequency std::regex_search(line, matches, re_freq); if (matches.size() != 2U) { return false; } filter.freq = string_to_float(matches.str(1)); // get slope if ((filter.type & (LOW_SHELF_xdB | HIGH_SHELF_xdB | LOW_SHELF | HIGH_SHELF)) != 0U) { std::regex_search(line, matches, re_dB_per_octave); // _xdB variants require the dB parameter if (((filter.type & (LOW_SHELF_xdB | HIGH_SHELF_xdB)) != 0U) && (matches.size() != 2U)) { return false; } if (matches.size() == 2U) { // we satisfied the condition, now assign the paramater if given filter.slope_dB = string_to_float(matches.str(1)); } } // get gain if ((filter.type & (PEAKING | LOW_SHELF_xdB | HIGH_SHELF_xdB | LOW_SHELF | HIGH_SHELF)) != 0U) { std::regex_search(line, matches, re_gain); // all Shelf types (i.e. all above except for Peaking) require the gain parameter if (((filter.type & PEAKING) == 0U) && (matches.size() != 2U)) { return false; } if (matches.size() == 2U) { filter.gain = string_to_float(matches.str(1)); } } // get quality factor if ((filter.type & (PEAKING | LOW_PASS_Q | HIGH_PASS_Q | LOW_SHELF_xdB | HIGH_SHELF_xdB | NOTCH | ALL_PASS)) != 0U) { std::regex_search(line, matches, re_quality_factor); // Peaking and All-Pass filter types require the quality factor parameter if (((filter.type & (PEAKING | ALL_PASS)) != 0U) && (matches.size() != 2U)) { return false; } if (matches.size() == 2U) { filter.quality_factor = string_to_float(matches.str(1)); } } return true; } void EqualizerUi::import_apo_preset(const std::string& file_path) { boost::filesystem::path p{file_path}; if (boost::filesystem::is_regular_file(p)) { std::ifstream eq_file; std::vector bands; eq_file.open(p.string()); if (eq_file.is_open()) { std::string line; while (getline(eq_file, line)) { struct ImportedBand filter {}; bool parsed = this->parse_apo_filter(line, filter); if (parsed) { bands.push_back(filter); } } } eq_file.close(); if (bands.empty()) { return; } settings->set_int("num-bands", bands.size()); for (int n = 0; n < max_bands; n++) { if (n < static_cast(bands.size())) { settings_left->set_string(std::string("band" + std::to_string(n) + "-mode"), "APO (DR)"); settings_left->set_string(std::string("band" + std::to_string(n) + "-type"), "Bell"); settings_left->set_double(std::string("band" + std::to_string(n) + "-gain"), bands[n].gain); settings_left->set_double(std::string("band" + std::to_string(n) + "-frequency"), bands[n].freq); settings_left->set_double(std::string("band" + std::to_string(n) + "-q"), bands[n].quality_factor); settings_right->set_string(std::string("band" + std::to_string(n) + "-type"), "Bell"); settings_right->set_double(std::string("band" + std::to_string(n) + "-gain"), bands[n].gain); settings_right->set_double(std::string("band" + std::to_string(n) + "-frequency"), bands[n].freq); settings_right->set_double(std::string("band" + std::to_string(n) + "-q"), bands[n].quality_factor); } else { settings_left->set_string(std::string("band" + std::to_string(n) + "-type"), "Off"); settings_right->set_string(std::string("band" + std::to_string(n) + "-type"), "Off"); } } } } easyeffects-4.8.7/src/exciter.cpp000066400000000000000000000110731424023573300167760ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "exciter.hpp" #include #include "util.hpp" namespace { void on_post_messages_changed(GSettings* settings, gchar* key, Exciter* l) { const auto post = g_settings_get_boolean(settings, key); if (post) { if (!l->harmonics_connection.connected()) { l->harmonics_connection = Glib::signal_timeout().connect( [l]() { float harmonics = 0.0F; g_object_get(l->exciter, "meter-drive", &harmonics, nullptr); l->harmonics.emit(harmonics); return true; }, 100); } } else { l->harmonics_connection.disconnect(); } } } // namespace Exciter::Exciter(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "exciter", schema, schema_path) { exciter = gst_element_factory_make("calf-sourceforge-net-plugins-Exciter", nullptr); if (is_installed(exciter)) { auto* in_level = gst_element_factory_make("level", "exciter_input_level"); auto* out_level = gst_element_factory_make("level", "exciter_output_level"); auto* audioconvert_in = gst_element_factory_make("audioconvert", "exciter_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "exciter_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), in_level, audioconvert_in, exciter, audioconvert_out, out_level, nullptr); gst_element_link_many(in_level, audioconvert_in, exciter, audioconvert_out, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(in_level, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(exciter, "bypass", 0, nullptr); bind_to_gsettings(); g_signal_connect(settings, "changed::post-messages", G_CALLBACK(on_post_messages_changed), this); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Exciter::~Exciter() { util::debug(log_tag + name + " destroyed"); } void Exciter::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "input-gain", exciter, "level-in", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", exciter, "level-out", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "amount", exciter, "amount", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "harmonics", exciter, "drive", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "scope", exciter, "freq", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "ceil", exciter, "ceil", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "blend", exciter, "blend", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind(settings, "ceil-active", exciter, "ceil-active", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "listen", exciter, "listen", G_SETTINGS_BIND_DEFAULT); } easyeffects-4.8.7/src/exciter_preset.cpp000066400000000000000000000063611424023573300203640ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "exciter_preset.hpp" ExciterPreset::ExciterPreset() : output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.exciter", "/com/github/wwmm/pulseeffects/sinkinputs/exciter/")) {} void ExciterPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".exciter.state", settings->get_boolean("state")); root.put(section + ".exciter.input-gain", settings->get_double("input-gain")); root.put(section + ".exciter.output-gain", settings->get_double("output-gain")); root.put(section + ".exciter.amount", settings->get_double("amount")); root.put(section + ".exciter.harmonics", settings->get_double("harmonics")); root.put(section + ".exciter.scope", settings->get_double("scope")); root.put(section + ".exciter.ceil", settings->get_double("ceil")); root.put(section + ".exciter.blend", settings->get_double("blend")); root.put(section + ".exciter.ceil-active", settings->get_boolean("ceil-active")); root.put(section + ".exciter.listen", settings->get_boolean("listen")); } void ExciterPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".exciter.state"); update_key(root, settings, "input-gain", section + ".exciter.input-gain"); update_key(root, settings, "output-gain", section + ".exciter.output-gain"); update_key(root, settings, "amount", section + ".exciter.amount"); update_key(root, settings, "harmonics", section + ".exciter.harmonics"); update_key(root, settings, "scope", section + ".exciter.scope"); update_key(root, settings, "ceil", section + ".exciter.ceil"); update_key(root, settings, "blend", section + ".exciter.blend"); update_key(root, settings, "ceil-active", section + ".exciter.ceil-active"); update_key(root, settings, "listen", section + ".exciter.listen"); } void ExciterPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { save(root, "output", output_settings); } } void ExciterPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { load(root, "output", output_settings); } } easyeffects-4.8.7/src/exciter_ui.cpp000066400000000000000000000061571424023573300175020ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "exciter_ui.hpp" ExciterUi::ExciterUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "exciter"; // loading glade widgets builder->get_widget("harmonics_levelbar", harmonics_levelbar); builder->get_widget("harmonics_levelbar_label", harmonics_levelbar_label); builder->get_widget("ceil_active", ceil_active); builder->get_widget("ceil_freq", ceil_freq); builder->get_widget("listen", listen); builder->get_widget("plugin_reset", reset_button); get_object(builder, "amount", amount); get_object(builder, "blend", blend); get_object(builder, "ceil", ceilv); get_object(builder, "harmonics", harmonics); get_object(builder, "scope", scope); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("amount", amount.get(), "value", flag); settings->bind("harmonics", harmonics.get(), "value", flag); settings->bind("scope", scope.get(), "value", flag); settings->bind("ceil", ceilv.get(), "value", flag); settings->bind("blend", blend.get(), "value", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); settings->bind("listen", listen, "active", flag); settings->bind("ceil-active", ceil_active, "active", flag); settings->bind("ceil-active", ceil_freq, "sensitive", Gio::SettingsBindFlags::SETTINGS_BIND_GET); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } ExciterUi::~ExciterUi() { util::debug(name + " ui destroyed"); } void ExciterUi::reset() { settings->reset("input-gain"); settings->reset("output-gain"); settings->reset("amount"); settings->reset("harmonics"); settings->reset("scope"); settings->reset("ceil"); settings->reset("blend"); settings->reset("ceil-active"); settings->reset("listen"); } void ExciterUi::on_new_harmonics_level(double value) { harmonics_levelbar->set_value(value); harmonics_levelbar_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } easyeffects-4.8.7/src/filter.cpp000066400000000000000000000106561424023573300166260ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "filter.hpp" #include #include #include "util.hpp" namespace { void on_post_messages_changed(GSettings* settings, gchar* key, Filter* l) { const auto post = g_settings_get_boolean(settings, key); if (post) { if (!l->input_level_connection.connected()) { l->input_level_connection = Glib::signal_timeout().connect( [l]() { float inL = 0.0F; float inR = 0.0F; g_object_get(l->filter, "meter-inL", &inL, nullptr); g_object_get(l->filter, "meter-inR", &inR, nullptr); std::array in_peak = {inL, inR}; l->input_level.emit(in_peak); return true; }, 100); } if (!l->output_level_connection.connected()) { l->output_level_connection = Glib::signal_timeout().connect( [l]() { float outL = 0.0F; float outR = 0.0F; g_object_get(l->filter, "meter-outL", &outL, nullptr); g_object_get(l->filter, "meter-outR", &outR, nullptr); std::array out_peak = {outL, outR}; l->output_level.emit(out_peak); return true; }, 100); } } else { l->input_level_connection.disconnect(); l->output_level_connection.disconnect(); } } } // namespace Filter::Filter(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "filter", schema, schema_path) { filter = gst_element_factory_make("calf-sourceforge-net-plugins-Filter", "filter"); if (is_installed(filter)) { auto* audioconvert_in = gst_element_factory_make("audioconvert", "filter_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "filter_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), audioconvert_in, filter, audioconvert_out, nullptr); gst_element_link_many(audioconvert_in, filter, audioconvert_out, nullptr); auto* pad_sink = gst_element_get_static_pad(audioconvert_in, "sink"); auto* pad_src = gst_element_get_static_pad(audioconvert_out, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(filter, "bypass", 0, nullptr); bind_to_gsettings(); g_signal_connect(settings, "changed::post-messages", G_CALLBACK(on_post_messages_changed), this); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Filter::~Filter() { util::debug(log_tag + name + " destroyed"); } void Filter::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "input-gain", filter, "level-in", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", filter, "level-out", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "frequency", filter, "freq", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "resonance", filter, "res", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind(settings, "mode", filter, "mode", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "inertia", filter, "inertia", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); } easyeffects-4.8.7/src/filter_preset.cpp000066400000000000000000000062451424023573300202070ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "filter_preset.hpp" FilterPreset::FilterPreset() : input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.filter", "/com/github/wwmm/pulseeffects/sourceoutputs/filter/")), output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.filter", "/com/github/wwmm/pulseeffects/sinkinputs/filter/")) {} void FilterPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".filter.state", settings->get_boolean("state")); root.put(section + ".filter.input-gain", settings->get_double("input-gain")); root.put(section + ".filter.output-gain", settings->get_double("output-gain")); root.put(section + ".filter.frequency", settings->get_double("frequency")); root.put(section + ".filter.resonance", settings->get_double("resonance")); root.put(section + ".filter.mode", settings->get_string("mode")); root.put(section + ".filter.inertia", settings->get_double("inertia")); } void FilterPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".filter.state"); update_key(root, settings, "input-gain", section + ".filter.input-gain"); update_key(root, settings, "output-gain", section + ".filter.output-gain"); update_key(root, settings, "frequency", section + ".filter.frequency"); update_key(root, settings, "resonance", section + ".filter.resonance"); update_string_key(root, settings, "mode", section + ".filter.mode"); update_key(root, settings, "inertia", section + ".filter.inertia"); } void FilterPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: save(root, "output", output_settings); break; case PresetType::input: save(root, "input", input_settings); break; } } void FilterPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: load(root, "output", output_settings); break; case PresetType::input: load(root, "input", input_settings); break; } } easyeffects-4.8.7/src/filter_ui.cpp000066400000000000000000000133531424023573300173200ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "filter_ui.hpp" #include namespace { auto filter_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "12dB/oct Lowpass") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "24dB/oct Lowpass") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "36dB/oct Lowpass") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "12dB/oct Highpass") == 0) { g_value_set_int(value, 3); } else if (std::strcmp(v, "24dB/oct Highpass") == 0) { g_value_set_int(value, 4); } else if (std::strcmp(v, "36dB/oct Highpass") == 0) { g_value_set_int(value, 5); } else if (std::strcmp(v, "6dB/oct Bandpass") == 0) { g_value_set_int(value, 6); } else if (std::strcmp(v, "12dB/oct Bandpass") == 0) { g_value_set_int(value, 7); } else if (std::strcmp(v, "18dB/oct Bandpass") == 0) { g_value_set_int(value, 8); } else if (std::strcmp(v, "6dB/oct Bandreject") == 0) { g_value_set_int(value, 9); } else if (std::strcmp(v, "12dB/oct Bandreject") == 0) { g_value_set_int(value, 10); } else if (std::strcmp(v, "18dB/oct Bandreject") == 0) { g_value_set_int(value, 11); } return 1; } auto int_to_filter_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("12dB/oct Lowpass"); case 1: return g_variant_new_string("24dB/oct Lowpass"); case 2: return g_variant_new_string("36dB/oct Lowpass"); case 3: return g_variant_new_string("12dB/oct Highpass"); case 4: return g_variant_new_string("24dB/oct Highpass"); case 5: return g_variant_new_string("36dB/oct Highpass"); case 6: return g_variant_new_string("6dB/oct Bandpass"); case 7: return g_variant_new_string("12dB/oct Bandpass"); case 8: return g_variant_new_string("18dB/oct Bandpass"); case 9: return g_variant_new_string("6dB/oct Bandreject"); case 10: return g_variant_new_string("12dB/oct Bandreject"); case 11: return g_variant_new_string("18dB/oct Bandreject"); default: return g_variant_new_string("12dB/oct Lowpass"); } } } // namespace FilterUi::FilterUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "filter"; // loading glade widgets builder->get_widget("mode", mode); builder->get_widget("preset_muted", preset_muted); builder->get_widget("preset_disco", preset_disco); builder->get_widget("preset_distant_headphones", preset_distant_headphones); builder->get_widget("preset_default", preset_default); builder->get_widget("plugin_reset", reset_button); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); get_object(builder, "frequency", frequency); get_object(builder, "resonance", resonance); get_object(builder, "inertia", inertia); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); settings->bind("frequency", frequency.get(), "value", flag); settings->bind("resonance", resonance.get(), "value", flag); settings->bind("inertia", inertia.get(), "value", flag); g_settings_bind_with_mapping(settings->gobj(), "mode", mode->gobj(), "active", G_SETTINGS_BIND_DEFAULT, filter_enum_to_int, int_to_filter_enum, nullptr, nullptr); init_presets_buttons(); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } FilterUi::~FilterUi() { util::debug(name + " ui destroyed"); } void FilterUi::reset() { settings->reset("input-gain"); settings->reset("output-gain"); settings->reset("frequency"); settings->reset("resonance"); settings->reset("mode"); settings->reset("inertia"); } void FilterUi::init_presets_buttons() { preset_muted->signal_clicked().connect([=]() { frequency->set_value(10.0); resonance->set_value(0.707); mode->set_active(2); inertia->set_value(20.0); }); preset_disco->signal_clicked().connect([=]() { frequency->set_value(193.821); resonance->set_value(1.37956); mode->set_active(0); inertia->set_value(74.0); }); preset_distant_headphones->signal_clicked().connect([=]() { frequency->set_value(305.818); resonance->set_value(0.707); mode->set_active(3); inertia->set_value(74.0); }); preset_default->signal_clicked().connect([=]() { settings->reset("frequency"); settings->reset("resonance"); settings->reset("mode"); settings->reset("inertia"); }); } easyeffects-4.8.7/src/gate.cpp000066400000000000000000000112241424023573300162510ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "gate.hpp" #include #include "util.hpp" namespace { void on_post_messages_changed(GSettings* settings, gchar* key, Gate* l) { const auto post = g_settings_get_boolean(settings, key); if (post) { if (!l->gating_connection.connected()) { l->gating_connection = Glib::signal_timeout().connect( [l]() { float gating = 0.0F; g_object_get(l->gate, "gating", &gating, nullptr); l->gating.emit(gating); return true; }, 100); } } else { l->gating_connection.disconnect(); } } } // namespace Gate::Gate(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "gate", schema, schema_path) { gate = gst_element_factory_make("calf-sourceforge-net-plugins-Gate", "gate"); if (is_installed(gate)) { auto* in_level = gst_element_factory_make("level", "gate_input_level"); auto* out_level = gst_element_factory_make("level", "gate_output_level"); auto* audioconvert_in = gst_element_factory_make("audioconvert", "gate_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "gate_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), in_level, audioconvert_in, gate, audioconvert_out, out_level, nullptr); gst_element_link_many(in_level, audioconvert_in, gate, audioconvert_out, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(in_level, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(gate, "bypass", 0, nullptr); bind_to_gsettings(); g_signal_connect(settings, "changed::post-messages", G_CALLBACK(on_post_messages_changed), this); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Gate::~Gate() { util::debug(log_tag + name + " destroyed"); } void Gate::bind_to_gsettings() { g_settings_bind(settings, "detection", gate, "detection", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "stereo-link", gate, "stereo-link", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "range", gate, "range", G_SETTINGS_BIND_GET, util::db20_gain_to_linear, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "attack", gate, "attack", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "release", gate, "release", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "ratio", gate, "ratio", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "threshold", gate, "threshold", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "input", gate, "level-in", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "makeup", gate, "makeup", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "knee", gate, "knee", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); } easyeffects-4.8.7/src/gate_preset.cpp000066400000000000000000000072261424023573300176420ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "gate_preset.hpp" GatePreset::GatePreset() : input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.gate", "/com/github/wwmm/pulseeffects/sourceoutputs/gate/")), output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.gate", "/com/github/wwmm/pulseeffects/sinkinputs/gate/")) {} void GatePreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".gate.state", settings->get_boolean("state")); root.put(section + ".gate.detection", settings->get_string("detection")); root.put(section + ".gate.stereo-link", settings->get_string("stereo-link")); root.put(section + ".gate.range", settings->get_double("range")); root.put(section + ".gate.attack", settings->get_double("attack")); root.put(section + ".gate.release", settings->get_double("release")); root.put(section + ".gate.threshold", settings->get_double("threshold")); root.put(section + ".gate.ratio", settings->get_double("ratio")); root.put(section + ".gate.knee", settings->get_double("knee")); root.put(section + ".gate.input", settings->get_double("input")); root.put(section + ".gate.makeup", settings->get_double("makeup")); } void GatePreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".gate.state"); update_string_key(root, settings, "detection", section + ".gate.detection"); update_string_key(root, settings, "stereo-link", section + ".gate.stereo-link"); update_key(root, settings, "range", section + ".gate.range"); update_key(root, settings, "attack", section + ".gate.attack"); update_key(root, settings, "release", section + ".gate.release"); update_key(root, settings, "threshold", section + ".gate.threshold"); update_key(root, settings, "ratio", section + ".gate.ratio"); update_key(root, settings, "knee", section + ".gate.knee"); update_key(root, settings, "input", section + ".gate.input"); update_key(root, settings, "makeup", section + ".gate.makeup"); } void GatePreset::write(PresetType preset_type, boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: save(root, "output", output_settings); break; case PresetType::input: save(root, "input", input_settings); break; } } void GatePreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: load(root, "output", output_settings); break; case PresetType::input: load(root, "input", input_settings); break; } } easyeffects-4.8.7/src/gate_ui.cpp000066400000000000000000000111701424023573300167460ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "gate_ui.hpp" #include namespace { auto detection_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "RMS") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "Peak") == 0) { g_value_set_int(value, 1); } return 1; } auto int_to_detection_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("RMS"); case 1: return g_variant_new_string("Peak"); default: return g_variant_new_string("RMS"); } } auto stereo_link_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "Average") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "Maximum") == 0) { g_value_set_int(value, 1); } return 1; } auto int_to_stereo_link_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("Average"); case 1: return g_variant_new_string("Maximum"); default: return g_variant_new_string("Average"); } } } // namespace GateUi::GateUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "gate"; // loading glade widgets builder->get_widget("detection", detection); builder->get_widget("stereo_link", stereo_link); builder->get_widget("gating", gating); builder->get_widget("gating_label", gating_label); builder->get_widget("plugin_reset", reset_button); get_object(builder, "attack", attack); get_object(builder, "knee", knee); get_object(builder, "input", input); get_object(builder, "makeup", makeup); get_object(builder, "range", range); get_object(builder, "ratio", ratio); get_object(builder, "release", release); get_object(builder, "threshold", threshold); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("attack", attack.get(), "value", flag); settings->bind("knee", knee.get(), "value", flag); settings->bind("input", input.get(), "value", flag); settings->bind("makeup", makeup.get(), "value", flag); settings->bind("range", range.get(), "value", flag); settings->bind("ratio", ratio.get(), "value", flag); settings->bind("release", release.get(), "value", flag); settings->bind("threshold", threshold.get(), "value", flag); g_settings_bind_with_mapping(settings->gobj(), "detection", detection->gobj(), "active", G_SETTINGS_BIND_DEFAULT, detection_enum_to_int, int_to_detection_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "stereo-link", stereo_link->gobj(), "active", G_SETTINGS_BIND_DEFAULT, stereo_link_enum_to_int, int_to_stereo_link_enum, nullptr, nullptr); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } GateUi::~GateUi() { util::debug(name + " ui destroyed"); } void GateUi::reset() { settings->reset("detection"); settings->reset("stereo-link"); settings->reset("range"); settings->reset("attack"); settings->reset("release"); settings->reset("threshold"); settings->reset("ratio"); settings->reset("knee"); settings->reset("input"); settings->reset("makeup"); } void GateUi::on_new_gating(double value) { gating->set_value(1.0 - value); gating_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } easyeffects-4.8.7/src/general_settings_ui.cpp000066400000000000000000000166211424023573300213710ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "general_settings_ui.hpp" #include #include #include #include #include "util.hpp" namespace { auto priority_type_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "Niceness") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "Real Time") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "None") == 0) { g_value_set_int(value, 2); } return 1; } auto int_to_priority_type_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("Niceness"); case 1: return g_variant_new_string("Real Time"); case 2: return g_variant_new_string("None"); default: return g_variant_new_string("None"); } } } // namespace GeneralSettingsUi::GeneralSettingsUi(BaseObjectType* cobject, const Glib::RefPtr& builder, Application* application) : Gtk::Grid(cobject), settings(Gio::Settings::create("com.github.wwmm.pulseeffects")), app(application) { // loading glade widgets builder->get_widget("theme_switch", theme_switch); builder->get_widget("enable_autostart", enable_autostart); builder->get_widget("enable_all_sinkinputs", enable_all_sinkinputs); builder->get_widget("enable_all_sourceoutputs", enable_all_sourceoutputs); builder->get_widget("reset_settings", reset_settings); builder->get_widget("about_button", about_button); builder->get_widget("realtime_priority", realtime_priority_control); builder->get_widget("niceness", niceness_control); builder->get_widget("priority_type", priority_type); get_object(builder, "adjustment_priority", adjustment_priority); get_object(builder, "adjustment_niceness", adjustment_niceness); get_object(builder, "adjustment_audio_activity_timeout", adjustment_audio_activity_timeout); // signals connection enable_autostart->signal_state_set().connect(sigc::mem_fun(*this, &GeneralSettingsUi::on_enable_autostart), false); reset_settings->signal_clicked().connect(sigc::mem_fun(*this, &GeneralSettingsUi::on_reset_settings)); about_button->signal_clicked().connect([=]() { app->activate_action("about"); }); connections.emplace_back(settings->signal_changed("priority-type").connect([&](auto key) { set_priority_controls_visibility(); app->sie->set_null_pipeline(); app->soe->set_null_pipeline(); app->sie->update_pipeline_state(); app->soe->update_pipeline_state(); })); connections.emplace_back(settings->signal_changed("realtime-priority").connect([&](auto key) { app->sie->set_null_pipeline(); app->soe->set_null_pipeline(); app->sie->update_pipeline_state(); app->soe->update_pipeline_state(); })); connections.emplace_back(settings->signal_changed("niceness").connect([&](auto key) { app->sie->set_null_pipeline(); app->soe->set_null_pipeline(); app->sie->update_pipeline_state(); app->soe->update_pipeline_state(); })); auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("use-dark-theme", theme_switch, "active", flag); settings->bind("enable-all-sinkinputs", enable_all_sinkinputs, "active", flag); settings->bind("enable-all-sourceoutputs", enable_all_sourceoutputs, "active", flag); settings->bind("realtime-priority", adjustment_priority.get(), "value", flag); settings->bind("niceness", adjustment_niceness.get(), "value", flag); settings->bind("audio-activity-timeout", adjustment_audio_activity_timeout.get(), "value", flag); g_settings_bind_with_mapping(settings->gobj(), "priority-type", priority_type->gobj(), "active", G_SETTINGS_BIND_DEFAULT, priority_type_enum_to_int, int_to_priority_type_enum, nullptr, nullptr); init_autostart_switch(); set_priority_controls_visibility(); } GeneralSettingsUi::~GeneralSettingsUi() { for (auto& c : connections) { c.disconnect(); } util::debug(log_tag + "destroyed"); } void GeneralSettingsUi::add_to_stack(Gtk::Stack* stack, Application* app) { auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/general_settings.glade"); GeneralSettingsUi* ui; builder->get_widget_derived("widgets_grid", ui, app); stack->add(*ui, "general_spectrum", _("General")); } void GeneralSettingsUi::init_autostart_switch() { auto path = Glib::get_user_config_dir() + "/autostart/pulseeffects-service.desktop"; try { auto file = Gio::File::create_for_path(path); if (file->query_exists()) { enable_autostart->set_active(true); } else { enable_autostart->set_active(false); } } catch (const Glib::Exception& ex) { util::warning(log_tag + ex.what()); } } auto GeneralSettingsUi::on_enable_autostart(bool state) -> bool { boost::filesystem::path autostart_dir{Glib::get_user_config_dir() + "/autostart"}; if (!boost::filesystem::is_directory(autostart_dir)) { boost::filesystem::create_directories(autostart_dir); } boost::filesystem::path autostart_file{Glib::get_user_config_dir() + "/autostart/pulseeffects-service.desktop"}; if (state) { if (!boost::filesystem::exists(autostart_file)) { boost::filesystem::ofstream ofs{autostart_file}; ofs << "[Desktop Entry]\n"; ofs << "Name=PulseEffects\n"; ofs << "Comment=PulseEffects Service\n"; ofs << "Exec=pulseeffects --gapplication-service\n"; ofs << "Icon=pulseeffects\n"; ofs << "StartupNotify=false\n"; ofs << "Terminal=false\n"; ofs << "Type=Application\n"; ofs.close(); util::debug(log_tag + "autostart file created"); } } else { if (boost::filesystem::exists(autostart_file)) { boost::filesystem::remove(autostart_file); util::debug(log_tag + "autostart file removed"); } } return false; } void GeneralSettingsUi::on_reset_settings() { settings->reset(""); } void GeneralSettingsUi::set_priority_controls_visibility() { auto priority_type = settings->get_enum("priority-type"); switch (priority_type) { case 0: { niceness_control->set_sensitive(true); realtime_priority_control->set_sensitive(false); break; } case 1: { niceness_control->set_sensitive(false); realtime_priority_control->set_sensitive(true); break; } case 2: { niceness_control->set_sensitive(false); realtime_priority_control->set_sensitive(false); break; } default: break; } } easyeffects-4.8.7/src/limiter.cpp000066400000000000000000000131641424023573300170030ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "limiter.hpp" #include #include #include "util.hpp" namespace { void on_post_messages_changed(GSettings* settings, gchar* key, Limiter* l) { const auto post = g_settings_get_boolean(settings, key); if (post) { if (!l->input_level_connection.connected()) { l->input_level_connection = Glib::signal_timeout().connect( [l]() { float inL = 0.0F; float inR = 0.0F; g_object_get(l->limiter, "meter-inL", &inL, nullptr); g_object_get(l->limiter, "meter-inR", &inR, nullptr); std::array in_peak = {inL, inR}; l->input_level.emit(in_peak); return true; }, 100); } if (!l->output_level_connection.connected()) { l->output_level_connection = Glib::signal_timeout().connect( [l]() { float outL = 0.0F; float outR = 0.0F; g_object_get(l->limiter, "meter-outL", &outL, nullptr); g_object_get(l->limiter, "meter-outR", &outR, nullptr); std::array out_peak = {outL, outR}; l->output_level.emit(out_peak); return true; }, 100); } if (!l->attenuation_connection.connected()) { l->attenuation_connection = Glib::signal_timeout().connect( [l]() { float att = 0.0F; g_object_get(l->limiter, "att", &att, nullptr); l->attenuation.emit(att); return true; }, 100); } } else { l->input_level_connection.disconnect(); l->output_level_connection.disconnect(); l->attenuation_connection.disconnect(); } } } // namespace Limiter::Limiter(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "limiter", schema, schema_path) { limiter = gst_element_factory_make("calf-sourceforge-net-plugins-Limiter", nullptr); if (is_installed(limiter)) { auto* audioconvert_in = gst_element_factory_make("audioconvert", "limiter_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "limiter_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), audioconvert_in, limiter, audioconvert_out, nullptr); gst_element_link_many(audioconvert_in, limiter, audioconvert_out, nullptr); auto* pad_sink = gst_element_get_static_pad(audioconvert_in, "sink"); auto* pad_src = gst_element_get_static_pad(audioconvert_out, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(limiter, "bypass", 0, nullptr); bind_to_gsettings(); g_signal_connect(settings, "changed::post-messages", G_CALLBACK(on_post_messages_changed), this); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Limiter::~Limiter() { util::debug(log_tag + name + " destroyed"); } void Limiter::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "input-gain", limiter, "level-in", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "limit", limiter, "limit", G_SETTINGS_BIND_GET, util::db20_gain_to_linear, nullptr, nullptr, nullptr); // Calf limiter did automatic makeup gain by the same amount given as limit. // See https://github.com/calf-studio-gear/calf/issues/162 // That is why we reduced the output level accordingly binding both limit and output-gain to the same, // gsettings key, but from 0.90.2 version the "auto-level" toggle was introduced, so we expose the // output gain as a separate parameter along with the automatic level button. // See changelog at https://freshcode.club/projects/calf g_settings_bind_with_mapping(settings, "output-gain", limiter, "level-out", G_SETTINGS_BIND_GET, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "lookahead", limiter, "attack", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "release", limiter, "release", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind(settings, "auto-level", limiter, "auto-level", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "asc", limiter, "asc", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "asc-level", limiter, "asc-coeff", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind(settings, "oversampling", limiter, "oversampling", G_SETTINGS_BIND_DEFAULT); } easyeffects-4.8.7/src/limiter_preset.cpp000066400000000000000000000072431424023573300203660ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "limiter_preset.hpp" LimiterPreset::LimiterPreset() : input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.limiter", "/com/github/wwmm/pulseeffects/sourceoutputs/limiter/")), output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.limiter", "/com/github/wwmm/pulseeffects/sinkinputs/limiter/")) {} void LimiterPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".limiter.state", settings->get_boolean("state")); root.put(section + ".limiter.input-gain", settings->get_double("input-gain")); root.put(section + ".limiter.limit", settings->get_double("limit")); root.put(section + ".limiter.lookahead", settings->get_double("lookahead")); root.put(section + ".limiter.release", settings->get_double("release")); root.put(section + ".limiter.auto-level", settings->get_boolean("auto-level")); root.put(section + ".limiter.asc", settings->get_boolean("asc")); root.put(section + ".limiter.asc-level", settings->get_double("asc-level")); root.put(section + ".limiter.oversampling", settings->get_int("oversampling")); root.put(section + ".limiter.output-gain", settings->get_double("output-gain")); } void LimiterPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".limiter.state"); update_key(root, settings, "input-gain", section + ".limiter.input-gain"); update_key(root, settings, "limit", section + ".limiter.limit"); update_key(root, settings, "lookahead", section + ".limiter.lookahead"); update_key(root, settings, "release", section + ".limiter.release"); update_key(root, settings, "auto-level", section + ".limiter.auto-level"); update_key(root, settings, "asc", section + ".limiter.asc"); update_key(root, settings, "asc-level", section + ".limiter.asc-level"); update_key(root, settings, "oversampling", section + ".limiter.oversampling"); update_key(root, settings, "output-gain", section + ".limiter.output-gain"); } void LimiterPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: save(root, "output", output_settings); break; case PresetType::input: save(root, "input", input_settings); break; } } void LimiterPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: load(root, "output", output_settings); break; case PresetType::input: load(root, "input", input_settings); break; } } easyeffects-4.8.7/src/limiter_ui.cpp000066400000000000000000000061501424023573300174750ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "limiter_ui.hpp" LimiterUi::LimiterUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "limiter"; // loading glade widgets builder->get_widget("auto-level", auto_level); builder->get_widget("asc", asc); builder->get_widget("asc_grid", asc_grid); builder->get_widget("attenuation", attenuation); builder->get_widget("attenuation_label", attenuation_label); builder->get_widget("plugin_reset", reset_button); get_object(builder, "input_gain", input_gain); get_object(builder, "limit", limit); get_object(builder, "lookahead", lookahead); get_object(builder, "release", release); get_object(builder, "oversampling", oversampling); get_object(builder, "asc_level", asc_level); get_object(builder, "output_gain", output_gain); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("limit", limit.get(), "value", flag); settings->bind("lookahead", lookahead.get(), "value", flag); settings->bind("release", release.get(), "value", flag); settings->bind("oversampling", oversampling.get(), "value", flag); settings->bind("auto-level", auto_level, "active", flag); settings->bind("asc", asc, "active", flag); settings->bind("asc", asc_grid, "sensitive", Gio::SettingsBindFlags::SETTINGS_BIND_GET); settings->bind("asc-level", asc_level.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } LimiterUi::~LimiterUi() { util::debug(name + " ui destroyed"); } void LimiterUi::reset() { settings->reset("input-gain"); settings->reset("limit"); settings->reset("lookahead"); settings->reset("release"); settings->reset("auto-level"); settings->reset("asc"); settings->reset("asc-level"); settings->reset("oversampling"); settings->reset("output-gain"); } void LimiterUi::on_new_attenuation(double value) { attenuation->set_value(1.0 - value); attenuation_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } easyeffects-4.8.7/src/loudness.cpp000066400000000000000000000060331424023573300171670ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "loudness.hpp" #include #include "util.hpp" Loudness::Loudness(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "loudness", schema, schema_path) { loudness = gst_element_factory_make("lsp-plug-in-plugins-lv2-loud-comp-stereo", nullptr); if (is_installed(loudness)) { auto* in_level = gst_element_factory_make("level", "loudness_input_level"); auto* out_level = gst_element_factory_make("level", "loudness_output_level"); auto* audioconvert_in = gst_element_factory_make("audioconvert", "loudness_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "loudness_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), in_level, audioconvert_in, loudness, audioconvert_out, out_level, nullptr); gst_element_link_many(in_level, audioconvert_in, loudness, audioconvert_out, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(in_level, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(loudness, "enabled", 1, nullptr); g_object_set(loudness, "hclip", 0, nullptr); bind_to_gsettings(); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Loudness::~Loudness() { util::debug(log_tag + name + " destroyed"); } void Loudness::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "input", loudness, "input", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "volume", loudness, "volume", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind(settings, "fft", loudness, "fft", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "std", loudness, "std", G_SETTINGS_BIND_DEFAULT); } easyeffects-4.8.7/src/loudness_preset.cpp000066400000000000000000000047001424023573300205500ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "loudness_preset.hpp" LoudnessPreset::LoudnessPreset() : output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.loudness", "/com/github/wwmm/pulseeffects/sinkinputs/loudness/")) {} void LoudnessPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".loudness.state", settings->get_boolean("state")); root.put(section + ".loudness.fft", settings->get_string("fft")); root.put(section + ".loudness.std", settings->get_string("std")); root.put(section + ".loudness.input", settings->get_double("input")); root.put(section + ".loudness.volume", settings->get_double("volume")); } void LoudnessPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".loudness.state"); update_string_key(root, settings, "fft", section + ".loudness.fft"); update_string_key(root, settings, "std", section + ".loudness.std"); update_key(root, settings, "input", section + ".loudness.input"); update_key(root, settings, "volume", section + ".loudness.volume"); } void LoudnessPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { save(root, "output", output_settings); } } void LoudnessPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { if (preset_type == PresetType::output) { load(root, "output", output_settings); } } easyeffects-4.8.7/src/loudness_ui.cpp000066400000000000000000000110471424023573300176650ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "loudness_ui.hpp" namespace { auto fft_size_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "256") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "512") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "1024") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "2048") == 0) { g_value_set_int(value, 3); } else if (std::strcmp(v, "4096") == 0) { g_value_set_int(value, 4); } else if (std::strcmp(v, "8192") == 0) { g_value_set_int(value, 5); } else if (std::strcmp(v, "16384") == 0) { g_value_set_int(value, 6); } return 1; } auto int_to_fft_size_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("256"); case 1: return g_variant_new_string("512"); case 2: return g_variant_new_string("1024"); case 3: return g_variant_new_string("2048"); case 4: return g_variant_new_string("4096"); case 5: return g_variant_new_string("8192"); case 6: return g_variant_new_string("16384"); default: return g_variant_new_string("4096"); } } auto standard_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "Flat") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "ISO226-2003") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "Fletcher-Munson") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "Robinson-Dadson") == 0) { g_value_set_int(value, 3); } return 1; } auto int_to_standard_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("Flat"); case 1: return g_variant_new_string("ISO226-2003"); case 2: return g_variant_new_string("Fletcher-Munson"); case 3: return g_variant_new_string("Robinson-Dadson"); default: return g_variant_new_string("ISO226-2003"); } } } // namespace LoudnessUi::LoudnessUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "loudness"; // loading glade widgets builder->get_widget("plugin_reset", reset_button); builder->get_widget("fft_size", fft_size); builder->get_widget("standard", standard); get_object(builder, "input", input); get_object(builder, "volume", volume); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("input", input.get(), "value", flag); settings->bind("volume", volume.get(), "value", flag); g_settings_bind_with_mapping(settings->gobj(), "fft", fft_size->gobj(), "active", G_SETTINGS_BIND_DEFAULT, fft_size_enum_to_int, int_to_fft_size_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "std", standard->gobj(), "active", G_SETTINGS_BIND_DEFAULT, standard_enum_to_int, int_to_standard_enum, nullptr, nullptr); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } LoudnessUi::~LoudnessUi() { util::debug(name + " ui destroyed"); } void LoudnessUi::reset() { settings->reset("fft"); settings->reset("std"); settings->reset("input"); settings->reset("volume"); } easyeffects-4.8.7/src/maximizer.cpp000066400000000000000000000072061424023573300173430ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "maximizer.hpp" #include #include "util.hpp" namespace { void on_post_messages_changed(GSettings* settings, gchar* key, Maximizer* l) { const auto post = g_settings_get_boolean(settings, key); if (post) { if (!l->reduction_connection.connected()) { l->reduction_connection = Glib::signal_timeout().connect( [l]() { float reduction = 0.0F; g_object_get(l->maximizer, "gain-reduction", &reduction, nullptr); l->reduction.emit(reduction); return true; }, 100); } } else { l->reduction_connection.disconnect(); } } } // namespace Maximizer::Maximizer(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "maximizer", schema, schema_path) { maximizer = gst_element_factory_make("ladspa-zamaximx2-ladspa-so-zamaximx2", nullptr); if (is_installed(maximizer)) { auto* in_level = gst_element_factory_make("level", "maximizer_input_level"); auto* out_level = gst_element_factory_make("level", "maximizer_output_level"); auto* audioconvert_in = gst_element_factory_make("audioconvert", "maximizer_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "maximizer_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), in_level, audioconvert_in, maximizer, audioconvert_out, out_level, nullptr); gst_element_link_many(in_level, audioconvert_in, maximizer, audioconvert_out, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(in_level, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); bind_to_gsettings(); g_signal_connect(settings, "changed::post-messages", G_CALLBACK(on_post_messages_changed), this); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Maximizer::~Maximizer() { util::debug(log_tag + name + " destroyed"); } void Maximizer::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "release", maximizer, "release", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "ceiling", maximizer, "output-ceiling", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "threshold", maximizer, "threshold", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); } easyeffects-4.8.7/src/maximizer_preset.cpp000066400000000000000000000054051424023573300207240ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "maximizer_preset.hpp" MaximizerPreset::MaximizerPreset() : output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.maximizer", "/com/github/wwmm/pulseeffects/sinkinputs/maximizer/")), input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.maximizer", "/com/github/wwmm/pulseeffects/sourceoutputs/maximizer/")) {} void MaximizerPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".maximizer.state", settings->get_boolean("state")); root.put(section + ".maximizer.release", settings->get_double("release")); root.put(section + ".maximizer.ceiling", settings->get_double("ceiling")); root.put(section + ".maximizer.threshold", settings->get_double("threshold")); } void MaximizerPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".maximizer.state"); update_key(root, settings, "release", section + ".maximizer.release"); update_key(root, settings, "ceiling", section + ".maximizer.ceiling"); update_key(root, settings, "threshold", section + ".maximizer.threshold"); } void MaximizerPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: save(root, "output", output_settings); break; case PresetType::input: save(root, "input", input_settings); break; } } void MaximizerPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: load(root, "output", output_settings); break; case PresetType::input: load(root, "input", input_settings); break; } } easyeffects-4.8.7/src/maximizer_ui.cpp000066400000000000000000000042101424023573300200300ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "maximizer_ui.hpp" MaximizerUi::MaximizerUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "maximizer"; // loading glade widgets builder->get_widget("reduction", reduction); builder->get_widget("reduction_label", reduction_label); builder->get_widget("plugin_reset", reset_button); get_object(builder, "ceiling", ceiling); get_object(builder, "release", release); get_object(builder, "threshold", threshold); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("ceiling", ceiling.get(), "value", flag); settings->bind("release", release.get(), "value", flag); settings->bind("threshold", threshold.get(), "value", flag); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } MaximizerUi::~MaximizerUi() { util::debug(name + " ui destroyed"); } void MaximizerUi::reset() { settings->reset("release"); settings->reset("ceiling"); settings->reset("threshold"); } void MaximizerUi::on_new_reduction(double value) { reduction->set_value(value); reduction_label->set_text(level_to_localized_string(value, 0)); } easyeffects-4.8.7/src/meson.build000066400000000000000000000057521424023573300170000ustar00rootroot00000000000000pulseeffects_sources = [ 'pulseeffects.cpp', 'application.cpp', 'application_ui.cpp', 'spectrum_ui.cpp', 'spectrum_preset.cpp', 'spectrum_settings_ui.cpp', 'pulse_settings_ui.cpp', 'blocklist_settings_ui.cpp', 'general_settings_ui.cpp', 'pulse_manager.cpp', 'effects_base_ui.cpp', 'app_info_ui.cpp', 'pulse_info_ui.cpp', 'sink_input_effects_ui.cpp', 'sink_input_effects.cpp', 'source_output_effects_ui.cpp', 'source_output_effects.cpp', 'pipeline_base.cpp', 'plugin_base.cpp', 'plugin_ui_base.cpp', 'autogain.cpp', 'autogain_ui.cpp', 'limiter.cpp', 'limiter_ui.cpp', 'compressor.cpp', 'compressor_ui.cpp', 'multiband_compressor.cpp', 'multiband_compressor_ui.cpp', 'filter.cpp', 'filter_ui.cpp', 'equalizer.cpp', 'equalizer_ui.cpp', 'reverb.cpp', 'reverb_ui.cpp', 'bass_enhancer.cpp', 'bass_enhancer_ui.cpp', 'exciter.cpp', 'exciter_ui.cpp', 'crossfeed.cpp', 'crossfeed_ui.cpp', 'loudness.cpp', 'loudness_ui.cpp', 'maximizer.cpp', 'maximizer_ui.cpp', 'gate.cpp', 'gate_ui.cpp', 'multiband_gate.cpp', 'multiband_gate_ui.cpp', 'stereo_tools.cpp', 'stereo_tools_ui.cpp', 'deesser.cpp', 'deesser_ui.cpp', 'convolver.cpp', 'convolver_ui.cpp', 'pitch.cpp', 'pitch_ui.cpp', 'webrtc.cpp', 'webrtc_ui.cpp', 'crystalizer.cpp', 'crystalizer_ui.cpp', 'delay.cpp', 'delay_ui.cpp', 'delay_preset.cpp', 'rnnoise.cpp', 'rnnoise_ui.cpp', 'presets_menu_ui.cpp', 'presets_manager.cpp', 'autogain_preset.cpp', 'limiter_preset.cpp', 'compressor_preset.cpp', 'multiband_compressor_preset.cpp', 'bass_enhancer_preset.cpp', 'crossfeed_preset.cpp', 'deesser_preset.cpp', 'equalizer_preset.cpp', 'exciter_preset.cpp', 'filter_preset.cpp', 'gate_preset.cpp', 'multiband_gate_preset.cpp', 'maximizer_preset.cpp', 'loudness_preset.cpp', 'convolver_preset.cpp', 'pitch_preset.cpp', 'reverb_preset.cpp', 'stereo_tools_preset.cpp', 'webrtc_preset.cpp', 'rnnoise_preset.cpp', 'crystalizer_preset.cpp', 'calibration_ui.cpp', 'calibration_signals_ui.cpp', 'calibration_signals.cpp', 'calibration_mic_ui.cpp', 'calibration_mic.cpp', 'realtime_kit.cpp', 'util.cpp', gresources ] pulseeffects_deps = [ dependency('libpulse'), dependency('glib-2.0', version: '>=2.56'), dependency('glibmm-2.4', version: '>=2.56'), dependency('gtk+-3.0', version: '>=3.20'), dependency('gtkmm-3.0', version: '>=3.24'), dependency('sigc++-2.0', version: ['>=2.10', '<3']), dependency('gstreamer-1.0', version: '>=1.12.5'), dependency('gstreamer-plugins-bad-1.0', version: '>=1.12.5'), dependency('gstreamer-fft-1.0'), dependency('lilv-0', version: '>=0.22', required: false), dependency('libbs2b', required: false), dependency('boost', version: '>=1.72', modules:['system','filesystem']), dependency('sndfile'), dependency('threads') ] executable( meson.project_name(), pulseeffects_sources, include_directories : [include_dir,config_h_dir], dependencies : pulseeffects_deps, install: true ) subdir('convolver') subdir('crystalizer') subdir('autogain') subdir('adapter') subdir('rnnoise') easyeffects-4.8.7/src/multiband_compressor.cpp000066400000000000000000000335121424023573300215700ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "multiband_compressor.hpp" #include #include #include "util.hpp" namespace { void on_post_messages_changed(GSettings* settings, gchar* key, MultibandCompressor* l) { const auto post = g_settings_get_boolean(settings, key); if (post) { if (!l->input_level_connection.connected()) { l->input_level_connection = Glib::signal_timeout().connect( [l]() { float inL = 0.0F; float inR = 0.0F; g_object_get(l->multiband_compressor, "meter-inL", &inL, nullptr); g_object_get(l->multiband_compressor, "meter-inR", &inR, nullptr); std::array in_peak = {inL, inR}; l->input_level.emit(in_peak); return true; }, 100); } if (!l->output_level_connection.connected()) { l->output_level_connection = Glib::signal_timeout().connect( [l]() { float outL = 0.0F; float outR = 0.0F; g_object_get(l->multiband_compressor, "meter-outL", &outL, nullptr); g_object_get(l->multiband_compressor, "meter-outR", &outR, nullptr); std::array out_peak = {outL, outR}; l->output_level.emit(out_peak); return true; }, 100); } if (!l->output0_connection.connected()) { l->output0_connection = Glib::signal_timeout().connect( [l]() { float output = 0.0F; g_object_get(l->multiband_compressor, "output0", &output, nullptr); l->output0.emit(output); return true; }, 100); } if (!l->output1_connection.connected()) { l->output1_connection = Glib::signal_timeout().connect( [l]() { float output = 0.0F; g_object_get(l->multiband_compressor, "output1", &output, nullptr); l->output1.emit(output); return true; }, 100); } if (!l->output2_connection.connected()) { l->output2_connection = Glib::signal_timeout().connect( [l]() { float output = 0.0F; g_object_get(l->multiband_compressor, "output2", &output, nullptr); l->output2.emit(output); return true; }, 100); } if (!l->output3_connection.connected()) { l->output3_connection = Glib::signal_timeout().connect( [l]() { float output = 0.0F; g_object_get(l->multiband_compressor, "output3", &output, nullptr); l->output3.emit(output); return true; }, 100); } if (!l->compression0_connection.connected()) { l->compression0_connection = Glib::signal_timeout().connect( [l]() { float compression = 0.0F; g_object_get(l->multiband_compressor, "compression0", &compression, nullptr); l->compression0.emit(compression); return true; }, 100); } if (!l->compression1_connection.connected()) { l->compression1_connection = Glib::signal_timeout().connect( [l]() { float compression = 0.0F; g_object_get(l->multiband_compressor, "compression1", &compression, nullptr); l->compression1.emit(compression); return true; }, 100); } if (!l->compression2_connection.connected()) { l->compression2_connection = Glib::signal_timeout().connect( [l]() { float compression = 0.0F; g_object_get(l->multiband_compressor, "compression2", &compression, nullptr); l->compression2.emit(compression); return true; }, 100); } if (!l->compression3_connection.connected()) { l->compression3_connection = Glib::signal_timeout().connect( [l]() { float compression = 0.0F; g_object_get(l->multiband_compressor, "compression3", &compression, nullptr); l->compression3.emit(compression); return true; }, 100); } } else { l->output0_connection.disconnect(); l->output1_connection.disconnect(); l->output2_connection.disconnect(); l->output3_connection.disconnect(); l->compression0_connection.disconnect(); l->compression1_connection.disconnect(); l->compression2_connection.disconnect(); l->compression3_connection.disconnect(); } } } // namespace MultibandCompressor::MultibandCompressor(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "multiband_compressor", schema, schema_path) { multiband_compressor = gst_element_factory_make("calf-sourceforge-net-plugins-MultibandCompressor", nullptr); if (is_installed(multiband_compressor)) { auto* audioconvert_in = gst_element_factory_make("audioconvert", "multiband_compressor_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "multiband_compressor_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), audioconvert_in, multiband_compressor, audioconvert_out, nullptr); gst_element_link_many(audioconvert_in, multiband_compressor, audioconvert_out, nullptr); auto* pad_sink = gst_element_get_static_pad(audioconvert_in, "sink"); auto* pad_src = gst_element_get_static_pad(audioconvert_out, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(multiband_compressor, "bypass", 0, nullptr); bind_to_gsettings(); g_signal_connect(settings, "changed::post-messages", G_CALLBACK(on_post_messages_changed), this); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } MultibandCompressor::~MultibandCompressor() { util::debug(log_tag + name + " destroyed"); } void MultibandCompressor::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "input-gain", multiband_compressor, "level-in", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", multiband_compressor, "level-out", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "freq0", multiband_compressor, "freq0", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "freq1", multiband_compressor, "freq1", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "freq2", multiband_compressor, "freq2", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind(settings, "mode", multiband_compressor, "mode", G_SETTINGS_BIND_DEFAULT); // sub band g_settings_bind_with_mapping(settings, "threshold0", multiband_compressor, "threshold0", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "ratio0", multiband_compressor, "ratio0", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "attack0", multiband_compressor, "attack0", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "release0", multiband_compressor, "release0", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "makeup0", multiband_compressor, "makeup0", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "knee0", multiband_compressor, "knee0", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind(settings, "detection0", multiband_compressor, "detection0", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "bypass0", multiband_compressor, "bypass0", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "solo0", multiband_compressor, "solo0", G_SETTINGS_BIND_DEFAULT); // low band g_settings_bind_with_mapping(settings, "threshold1", multiband_compressor, "threshold1", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "ratio1", multiband_compressor, "ratio1", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "attack1", multiband_compressor, "attack1", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "release1", multiband_compressor, "release1", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "makeup1", multiband_compressor, "makeup1", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "knee1", multiband_compressor, "knee1", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind(settings, "detection1", multiband_compressor, "detection1", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "bypass1", multiband_compressor, "bypass1", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "solo1", multiband_compressor, "solo1", G_SETTINGS_BIND_DEFAULT); // mid band g_settings_bind_with_mapping(settings, "threshold2", multiband_compressor, "threshold2", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "ratio2", multiband_compressor, "ratio2", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "attack2", multiband_compressor, "attack2", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "release2", multiband_compressor, "release2", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "makeup2", multiband_compressor, "makeup2", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "knee2", multiband_compressor, "knee2", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind(settings, "detection2", multiband_compressor, "detection2", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "bypass2", multiband_compressor, "bypass2", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "solo2", multiband_compressor, "solo2", G_SETTINGS_BIND_DEFAULT); // high band g_settings_bind_with_mapping(settings, "threshold3", multiband_compressor, "threshold3", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "ratio3", multiband_compressor, "ratio3", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "attack3", multiband_compressor, "attack3", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "release3", multiband_compressor, "release3", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "makeup3", multiband_compressor, "makeup3", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "knee3", multiband_compressor, "knee3", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind(settings, "detection3", multiband_compressor, "detection3", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "bypass3", multiband_compressor, "bypass3", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "solo3", multiband_compressor, "solo3", G_SETTINGS_BIND_DEFAULT); } easyeffects-4.8.7/src/multiband_compressor_preset.cpp000066400000000000000000000250651424023573300231560ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "multiband_compressor_preset.hpp" MultibandCompressorPreset::MultibandCompressorPreset() : input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.multibandcompressor", "/com/github/wwmm/pulseeffects/sourceoutputs/multibandcompressor/")), output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.multibandcompressor", "/com/github/wwmm/pulseeffects/sinkinputs/multibandcompressor/")) {} void MultibandCompressorPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".multiband_compressor.state", settings->get_boolean("state")); root.put(section + ".multiband_compressor.input-gain", settings->get_double("input-gain")); root.put(section + ".multiband_compressor.output-gain", settings->get_double("output-gain")); root.put(section + ".multiband_compressor.freq0", settings->get_double("freq0")); root.put(section + ".multiband_compressor.freq1", settings->get_double("freq1")); root.put(section + ".multiband_compressor.freq2", settings->get_double("freq2")); root.put(section + ".multiband_compressor.mode", settings->get_string("mode")); // sub band root.put(section + ".multiband_compressor.subband.threshold", settings->get_double("threshold0")); root.put(section + ".multiband_compressor.subband.ratio", settings->get_double("ratio0")); root.put(section + ".multiband_compressor.subband.attack", settings->get_double("attack0")); root.put(section + ".multiband_compressor.subband.release", settings->get_double("release0")); root.put(section + ".multiband_compressor.subband.makeup", settings->get_double("makeup0")); root.put(section + ".multiband_compressor.subband.knee", settings->get_double("knee0")); root.put(section + ".multiband_compressor.subband.detection", settings->get_string("detection0")); root.put(section + ".multiband_compressor.subband.bypass", settings->get_boolean("bypass0")); root.put(section + ".multiband_compressor.subband.solo", settings->get_boolean("solo0")); // low band root.put(section + ".multiband_compressor.lowband.threshold", settings->get_double("threshold1")); root.put(section + ".multiband_compressor.lowband.ratio", settings->get_double("ratio1")); root.put(section + ".multiband_compressor.lowband.attack", settings->get_double("attack1")); root.put(section + ".multiband_compressor.lowband.release", settings->get_double("release1")); root.put(section + ".multiband_compressor.lowband.makeup", settings->get_double("makeup1")); root.put(section + ".multiband_compressor.lowband.knee", settings->get_double("knee1")); root.put(section + ".multiband_compressor.lowband.detection", settings->get_string("detection1")); root.put(section + ".multiband_compressor.lowband.bypass", settings->get_boolean("bypass1")); root.put(section + ".multiband_compressor.lowband.solo", settings->get_boolean("solo1")); // mid band root.put(section + ".multiband_compressor.midband.threshold", settings->get_double("threshold2")); root.put(section + ".multiband_compressor.midband.ratio", settings->get_double("ratio2")); root.put(section + ".multiband_compressor.midband.attack", settings->get_double("attack2")); root.put(section + ".multiband_compressor.midband.release", settings->get_double("release2")); root.put(section + ".multiband_compressor.midband.makeup", settings->get_double("makeup2")); root.put(section + ".multiband_compressor.midband.knee", settings->get_double("knee2")); root.put(section + ".multiband_compressor.midband.detection", settings->get_string("detection2")); root.put(section + ".multiband_compressor.midband.bypass", settings->get_boolean("bypass2")); root.put(section + ".multiband_compressor.midband.solo", settings->get_boolean("solo2")); // high band root.put(section + ".multiband_compressor.highband.threshold", settings->get_double("threshold3")); root.put(section + ".multiband_compressor.highband.ratio", settings->get_double("ratio3")); root.put(section + ".multiband_compressor.highband.attack", settings->get_double("attack3")); root.put(section + ".multiband_compressor.highband.release", settings->get_double("release3")); root.put(section + ".multiband_compressor.highband.makeup", settings->get_double("makeup3")); root.put(section + ".multiband_compressor.highband.knee", settings->get_double("knee3")); root.put(section + ".multiband_compressor.highband.detection", settings->get_string("detection3")); root.put(section + ".multiband_compressor.highband.bypass", settings->get_boolean("bypass3")); root.put(section + ".multiband_compressor.highband.solo", settings->get_boolean("solo3")); } void MultibandCompressorPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".multiband_compressor.state"); update_key(root, settings, "input-gain", section + ".multiband_compressor.input-gain"); update_key(root, settings, "output-gain", section + ".multiband_compressor.output-gain"); update_key(root, settings, "freq0", section + ".multiband_compressor.freq0"); update_key(root, settings, "freq1", section + ".multiband_compressor.freq1"); update_key(root, settings, "freq2", section + ".multiband_compressor.freq2"); update_string_key(root, settings, "mode", section + ".multiband_compressor.mode"); // sub band update_key(root, settings, "threshold0", section + ".multiband_compressor.subband.threshold"); update_key(root, settings, "ratio0", section + ".multiband_compressor.subband.ratio"); update_key(root, settings, "attack0", section + ".multiband_compressor.subband.attack"); update_key(root, settings, "release0", section + ".multiband_compressor.subband.release"); update_key(root, settings, "makeup0", section + ".multiband_compressor.subband.makeup"); update_key(root, settings, "knee0", section + ".multiband_compressor.subband.knee"); update_string_key(root, settings, "detection0", section + ".multiband_compressor.subband.detection"); update_key(root, settings, "bypass0", section + ".multiband_compressor.subband.bypass"); update_key(root, settings, "solo0", section + ".multiband_compressor.subband.solo"); // low band update_key(root, settings, "threshold1", section + ".multiband_compressor.lowband.threshold"); update_key(root, settings, "ratio1", section + ".multiband_compressor.lowband.ratio"); update_key(root, settings, "attack1", section + ".multiband_compressor.lowband.attack"); update_key(root, settings, "release1", section + ".multiband_compressor.lowband.release"); update_key(root, settings, "makeup1", section + ".multiband_compressor.lowband.makeup"); update_key(root, settings, "knee1", section + ".multiband_compressor.lowband.knee"); update_string_key(root, settings, "detection1", section + ".multiband_compressor.lowband.detection"); update_key(root, settings, "bypass1", section + ".multiband_compressor.lowband.bypass"); update_key(root, settings, "solo1", section + ".multiband_compressor.lowband.solo"); // mid band update_key(root, settings, "threshold2", section + ".multiband_compressor.midband.threshold"); update_key(root, settings, "ratio2", section + ".multiband_compressor.midband.ratio"); update_key(root, settings, "attack2", section + ".multiband_compressor.midband.attack"); update_key(root, settings, "release2", section + ".multiband_compressor.midband.release"); update_key(root, settings, "makeup2", section + ".multiband_compressor.midband.makeup"); update_key(root, settings, "knee2", section + ".multiband_compressor.midband.knee"); update_string_key(root, settings, "detection2", section + ".multiband_compressor.midband.detection"); update_key(root, settings, "bypass2", section + ".multiband_compressor.midband.bypass"); update_key(root, settings, "solo2", section + ".multiband_compressor.midband.solo"); // high band update_key(root, settings, "threshold3", section + ".multiband_compressor.highband.threshold"); update_key(root, settings, "ratio3", section + ".multiband_compressor.highband.ratio"); update_key(root, settings, "attack3", section + ".multiband_compressor.highband.attack"); update_key(root, settings, "release3", section + ".multiband_compressor.highband.release"); update_key(root, settings, "makeup3", section + ".multiband_compressor.highband.makeup"); update_key(root, settings, "knee3", section + ".multiband_compressor.highband.knee"); update_string_key(root, settings, "detection3", section + ".multiband_compressor.highband.detection"); update_key(root, settings, "bypass3", section + ".multiband_compressor.highband.bypass"); update_key(root, settings, "solo3", section + ".multiband_compressor.highband.solo"); } void MultibandCompressorPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: save(root, "output", output_settings); break; case PresetType::input: save(root, "input", input_settings); break; } } void MultibandCompressorPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: load(root, "output", output_settings); break; case PresetType::input: load(root, "input", input_settings); break; } } easyeffects-4.8.7/src/multiband_compressor_ui.cpp000066400000000000000000000267451424023573300222770ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "multiband_compressor_ui.hpp" #include namespace { auto detection_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "RMS") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "Peak") == 0) { g_value_set_int(value, 1); } return 1; } auto int_to_detection_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("RMS"); case 1: return g_variant_new_string("Peak"); default: return g_variant_new_string("RMS"); } } auto mode_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "LR4") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "LR8") == 0) { g_value_set_int(value, 1); } return 1; } auto int_to_mode_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("LR4"); case 1: return g_variant_new_string("LR8"); default: return g_variant_new_string("LR8"); } } } // namespace MultibandCompressorUi::MultibandCompressorUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "multiband_compressor"; // loading glade widgets builder->get_widget("mode", mode); builder->get_widget("bypass0", bypass0); builder->get_widget("bypass1", bypass1); builder->get_widget("bypass2", bypass2); builder->get_widget("bypass3", bypass3); builder->get_widget("solo0", solo0); builder->get_widget("solo1", solo1); builder->get_widget("solo2", solo2); builder->get_widget("solo3", solo3); builder->get_widget("detection0", detection0); builder->get_widget("detection1", detection1); builder->get_widget("detection2", detection2); builder->get_widget("detection3", detection3); builder->get_widget("output0", output0); builder->get_widget("output0_label", output0_label); builder->get_widget("output1", output1); builder->get_widget("output1_label", output1_label); builder->get_widget("output2", output2); builder->get_widget("output2_label", output2_label); builder->get_widget("output3", output3); builder->get_widget("output3_label", output3_label); builder->get_widget("compression0", compression0); builder->get_widget("compression0_label", compression0_label); builder->get_widget("compression1", compression1); builder->get_widget("compression1_label", compression1_label); builder->get_widget("compression2", compression2); builder->get_widget("compression2_label", compression2_label); builder->get_widget("compression3", compression3); builder->get_widget("compression3_label", compression3_label); builder->get_widget("plugin_reset", reset_button); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); get_object(builder, "freq0", freq0); get_object(builder, "freq1", freq1); get_object(builder, "freq2", freq2); get_object(builder, "threshold0", threshold0); get_object(builder, "threshold1", threshold1); get_object(builder, "threshold2", threshold2); get_object(builder, "threshold3", threshold3); get_object(builder, "ratio0", ratio0); get_object(builder, "ratio1", ratio1); get_object(builder, "ratio2", ratio2); get_object(builder, "ratio3", ratio3); get_object(builder, "attack0", attack0); get_object(builder, "attack1", attack1); get_object(builder, "attack2", attack2); get_object(builder, "attack3", attack3); get_object(builder, "release0", release0); get_object(builder, "release1", release1); get_object(builder, "release2", release2); get_object(builder, "release3", release3); get_object(builder, "makeup0", makeup0); get_object(builder, "makeup1", makeup1); get_object(builder, "makeup2", makeup2); get_object(builder, "makeup3", makeup3); get_object(builder, "knee0", knee0); get_object(builder, "knee1", knee1); get_object(builder, "knee2", knee2); get_object(builder, "knee3", knee3); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); settings->bind("freq0", freq0.get(), "value", flag); settings->bind("freq1", freq1.get(), "value", flag); settings->bind("freq2", freq2.get(), "value", flag); settings->bind("threshold0", threshold0.get(), "value", flag); settings->bind("threshold1", threshold1.get(), "value", flag); settings->bind("threshold2", threshold2.get(), "value", flag); settings->bind("threshold3", threshold3.get(), "value", flag); settings->bind("ratio0", ratio0.get(), "value", flag); settings->bind("ratio1", ratio1.get(), "value", flag); settings->bind("ratio2", ratio2.get(), "value", flag); settings->bind("ratio3", ratio3.get(), "value", flag); settings->bind("attack0", attack0.get(), "value", flag); settings->bind("attack1", attack1.get(), "value", flag); settings->bind("attack2", attack2.get(), "value", flag); settings->bind("attack3", attack3.get(), "value", flag); settings->bind("release0", release0.get(), "value", flag); settings->bind("release1", release1.get(), "value", flag); settings->bind("release2", release2.get(), "value", flag); settings->bind("release3", release3.get(), "value", flag); settings->bind("makeup0", makeup0.get(), "value", flag); settings->bind("makeup1", makeup1.get(), "value", flag); settings->bind("makeup2", makeup2.get(), "value", flag); settings->bind("makeup3", makeup3.get(), "value", flag); settings->bind("knee0", knee0.get(), "value", flag); settings->bind("knee1", knee1.get(), "value", flag); settings->bind("knee2", knee2.get(), "value", flag); settings->bind("knee3", knee3.get(), "value", flag); settings->bind("bypass0", bypass0, "active", flag); settings->bind("bypass1", bypass1, "active", flag); settings->bind("bypass2", bypass2, "active", flag); settings->bind("bypass3", bypass3, "active", flag); settings->bind("solo0", solo0, "active", flag); settings->bind("solo1", solo1, "active", flag); settings->bind("solo2", solo2, "active", flag); settings->bind("solo3", solo3, "active", flag); g_settings_bind_with_mapping(settings->gobj(), "mode", mode->gobj(), "active", G_SETTINGS_BIND_DEFAULT, mode_enum_to_int, int_to_mode_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "detection0", detection0->gobj(), "active", G_SETTINGS_BIND_DEFAULT, detection_enum_to_int, int_to_detection_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "detection1", detection1->gobj(), "active", G_SETTINGS_BIND_DEFAULT, detection_enum_to_int, int_to_detection_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "detection2", detection2->gobj(), "active", G_SETTINGS_BIND_DEFAULT, detection_enum_to_int, int_to_detection_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "detection3", detection3->gobj(), "active", G_SETTINGS_BIND_DEFAULT, detection_enum_to_int, int_to_detection_enum, nullptr, nullptr); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } MultibandCompressorUi::~MultibandCompressorUi() { util::debug(name + " ui destroyed"); } void MultibandCompressorUi::reset() { settings->reset("input-gain"); settings->reset("output-gain"); settings->reset("freq0"); settings->reset("freq1"); settings->reset("freq2"); settings->reset("mode"); // sub band settings->reset("threshold0"); settings->reset("ratio0"); settings->reset("attack0"); settings->reset("release0"); settings->reset("makeup0"); settings->reset("knee0"); settings->reset("detection0"); settings->reset("bypass0"); settings->reset("solo0"); // low band settings->reset("threshold1"); settings->reset("ratio1"); settings->reset("attack1"); settings->reset("release1"); settings->reset("makeup1"); settings->reset("knee1"); settings->reset("detection1"); settings->reset("bypass1"); settings->reset("solo1"); // mid band settings->reset("threshold2"); settings->reset("ratio2"); settings->reset("attack2"); settings->reset("release2"); settings->reset("makeup2"); settings->reset("knee2"); settings->reset("detection2"); settings->reset("bypass2"); settings->reset("solo2"); // high band settings->reset("threshold3"); settings->reset("ratio3"); settings->reset("attack3"); settings->reset("release3"); settings->reset("makeup3"); settings->reset("knee3"); settings->reset("detection3"); settings->reset("bypass3"); settings->reset("solo3"); } void MultibandCompressorUi::on_new_output0(double value) { output0->set_value(value); output0_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandCompressorUi::on_new_output1(double value) { output1->set_value(value); output1_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandCompressorUi::on_new_output2(double value) { output2->set_value(value); output2_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandCompressorUi::on_new_output3(double value) { output3->set_value(value); output3_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandCompressorUi::on_new_compression0(double value) { compression0->set_value(1.0 - value); compression0_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandCompressorUi::on_new_compression1(double value) { compression1->set_value(1.0 - value); compression1_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandCompressorUi::on_new_compression2(double value) { compression2->set_value(1.0 - value); compression2_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandCompressorUi::on_new_compression3(double value) { compression3->set_value(1.0 - value); compression3_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } easyeffects-4.8.7/src/multiband_gate.cpp000066400000000000000000000337521424023573300203220ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "multiband_gate.hpp" #include #include #include "util.hpp" namespace { void on_post_messages_changed(GSettings* settings, gchar* key, MultibandGate* l) { const auto post = g_settings_get_boolean(settings, key); if (post) { if (!l->input_level_connection.connected()) { l->input_level_connection = Glib::signal_timeout().connect( [l]() { float inL = 0.0F; float inR = 0.0F; g_object_get(l->multiband_gate, "meter-inL", &inL, nullptr); g_object_get(l->multiband_gate, "meter-inR", &inR, nullptr); std::array in_peak = {inL, inR}; l->input_level.emit(in_peak); return true; }, 100); } if (!l->output_level_connection.connected()) { l->output_level_connection = Glib::signal_timeout().connect( [l]() { float outL = 0.0F; float outR = 0.0F; g_object_get(l->multiband_gate, "meter-outL", &outL, nullptr); g_object_get(l->multiband_gate, "meter-outR", &outR, nullptr); std::array out_peak = {outL, outR}; l->output_level.emit(out_peak); return true; }, 100); } if (!l->output0_connection.connected()) { l->output0_connection = Glib::signal_timeout().connect( [l]() { float output = 0.0F; g_object_get(l->multiband_gate, "output0", &output, nullptr); l->output0.emit(output); return true; }, 100); } if (!l->output1_connection.connected()) { l->output1_connection = Glib::signal_timeout().connect( [l]() { float output = 0.0F; g_object_get(l->multiband_gate, "output1", &output, nullptr); l->output1.emit(output); return true; }, 100); } if (!l->output2_connection.connected()) { l->output2_connection = Glib::signal_timeout().connect( [l]() { float output = 0.0F; g_object_get(l->multiband_gate, "output2", &output, nullptr); l->output2.emit(output); return true; }, 100); } if (!l->output3_connection.connected()) { l->output3_connection = Glib::signal_timeout().connect( [l]() { float output = 0.0F; g_object_get(l->multiband_gate, "output3", &output, nullptr); l->output3.emit(output); return true; }, 100); } if (!l->gating0_connection.connected()) { l->gating0_connection = Glib::signal_timeout().connect( [l]() { float gating = 0.0F; g_object_get(l->multiband_gate, "gating0", &gating, nullptr); l->gating0.emit(gating); return true; }, 100); } if (!l->gating1_connection.connected()) { l->gating1_connection = Glib::signal_timeout().connect( [l]() { float gating = 0.0F; g_object_get(l->multiband_gate, "gating1", &gating, nullptr); l->gating1.emit(gating); return true; }, 100); } if (!l->gating2_connection.connected()) { l->gating2_connection = Glib::signal_timeout().connect( [l]() { float gating = 0.0F; g_object_get(l->multiband_gate, "gating2", &gating, nullptr); l->gating2.emit(gating); return true; }, 100); } if (!l->gating3_connection.connected()) { l->gating3_connection = Glib::signal_timeout().connect( [l]() { float gating = 0.0F; g_object_get(l->multiband_gate, "gating3", &gating, nullptr); l->gating3.emit(gating); return true; }, 100); } } else { l->output0_connection.disconnect(); l->output1_connection.disconnect(); l->output2_connection.disconnect(); l->output3_connection.disconnect(); l->gating0_connection.disconnect(); l->gating1_connection.disconnect(); l->gating2_connection.disconnect(); l->gating3_connection.disconnect(); } } } // namespace MultibandGate::MultibandGate(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "multiband_gate", schema, schema_path) { multiband_gate = gst_element_factory_make("calf-sourceforge-net-plugins-MultibandGate", nullptr); if (is_installed(multiband_gate)) { auto* audioconvert_in = gst_element_factory_make("audioconvert", "multiband_gate_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "multiband_gate_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), audioconvert_in, multiband_gate, audioconvert_out, nullptr); gst_element_link_many(audioconvert_in, multiband_gate, audioconvert_out, nullptr); auto* pad_sink = gst_element_get_static_pad(audioconvert_in, "sink"); auto* pad_src = gst_element_get_static_pad(audioconvert_out, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(multiband_gate, "bypass", 0, nullptr); bind_to_gsettings(); g_signal_connect(settings, "changed::post-messages", G_CALLBACK(on_post_messages_changed), this); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } MultibandGate::~MultibandGate() { util::debug(log_tag + name + " destroyed"); } void MultibandGate::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "input-gain", multiband_gate, "level-in", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", multiband_gate, "level-out", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "freq0", multiband_gate, "freq0", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "freq1", multiband_gate, "freq1", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "freq2", multiband_gate, "freq2", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind(settings, "mode", multiband_gate, "mode", G_SETTINGS_BIND_DEFAULT); // sub band g_settings_bind_with_mapping(settings, "range0", multiband_gate, "range0", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "threshold0", multiband_gate, "threshold0", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "ratio0", multiband_gate, "ratio0", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "attack0", multiband_gate, "attack0", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "release0", multiband_gate, "release0", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "makeup0", multiband_gate, "makeup0", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "knee0", multiband_gate, "knee0", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind(settings, "detection0", multiband_gate, "detection0", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "bypass0", multiband_gate, "bypass0", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "solo0", multiband_gate, "solo0", G_SETTINGS_BIND_DEFAULT); // low band g_settings_bind_with_mapping(settings, "range1", multiband_gate, "range1", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "threshold1", multiband_gate, "threshold1", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "ratio1", multiband_gate, "ratio1", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "attack1", multiband_gate, "attack1", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "release1", multiband_gate, "release1", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "makeup1", multiband_gate, "makeup1", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "knee1", multiband_gate, "knee1", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind(settings, "detection1", multiband_gate, "detection1", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "bypass1", multiband_gate, "bypass1", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "solo1", multiband_gate, "solo1", G_SETTINGS_BIND_DEFAULT); // mid g_settings_bind_with_mapping(settings, "range2", multiband_gate, "range2", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "threshold2", multiband_gate, "threshold2", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "ratio2", multiband_gate, "ratio2", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "attack2", multiband_gate, "attack2", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "release2", multiband_gate, "release2", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "makeup2", multiband_gate, "makeup2", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "knee2", multiband_gate, "knee2", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind(settings, "detection2", multiband_gate, "detection2", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "bypass2", multiband_gate, "bypass2", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "solo2", multiband_gate, "solo2", G_SETTINGS_BIND_DEFAULT); // high band g_settings_bind_with_mapping(settings, "range3", multiband_gate, "range3", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "threshold3", multiband_gate, "threshold3", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "ratio3", multiband_gate, "ratio3", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "attack3", multiband_gate, "attack3", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "release3", multiband_gate, "release3", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "makeup3", multiband_gate, "makeup3", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "knee3", multiband_gate, "knee3", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind(settings, "detection3", multiband_gate, "detection3", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "bypass3", multiband_gate, "bypass3", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "solo3", multiband_gate, "solo3", G_SETTINGS_BIND_DEFAULT); } easyeffects-4.8.7/src/multiband_gate_preset.cpp000066400000000000000000000253111424023573300216740ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "multiband_gate_preset.hpp" MultibandGatePreset::MultibandGatePreset() : input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.multibandgate", "/com/github/wwmm/pulseeffects/sourceoutputs/multibandgate/")), output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.multibandgate", "/com/github/wwmm/pulseeffects/sinkinputs/multibandgate/")) {} void MultibandGatePreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".multiband_gate.state", settings->get_boolean("state")); root.put(section + ".multiband_gate.input-gain", settings->get_double("input-gain")); root.put(section + ".multiband_gate.output-gain", settings->get_double("output-gain")); root.put(section + ".multiband_gate.freq0", settings->get_double("freq0")); root.put(section + ".multiband_gate.freq1", settings->get_double("freq1")); root.put(section + ".multiband_gate.freq2", settings->get_double("freq2")); root.put(section + ".multiband_gate.mode", settings->get_string("mode")); // sub band root.put(section + ".multiband_gate.subband.reduction", settings->get_double("range0")); root.put(section + ".multiband_gate.subband.threshold", settings->get_double("threshold0")); root.put(section + ".multiband_gate.subband.ratio", settings->get_double("ratio0")); root.put(section + ".multiband_gate.subband.attack", settings->get_double("attack0")); root.put(section + ".multiband_gate.subband.release", settings->get_double("release0")); root.put(section + ".multiband_gate.subband.makeup", settings->get_double("makeup0")); root.put(section + ".multiband_gate.subband.knee", settings->get_double("knee0")); root.put(section + ".multiband_gate.subband.detection", settings->get_string("detection0")); root.put(section + ".multiband_gate.subband.bypass", settings->get_boolean("bypass0")); root.put(section + ".multiband_gate.subband.solo", settings->get_boolean("solo0")); // low band root.put(section + ".multiband_gate.lowband.reduction", settings->get_double("range1")); root.put(section + ".multiband_gate.lowband.threshold", settings->get_double("threshold1")); root.put(section + ".multiband_gate.lowband.ratio", settings->get_double("ratio1")); root.put(section + ".multiband_gate.lowband.attack", settings->get_double("attack1")); root.put(section + ".multiband_gate.lowband.release", settings->get_double("release1")); root.put(section + ".multiband_gate.lowband.makeup", settings->get_double("makeup1")); root.put(section + ".multiband_gate.lowband.knee", settings->get_double("knee1")); root.put(section + ".multiband_gate.lowband.detection", settings->get_string("detection1")); root.put(section + ".multiband_gate.lowband.bypass", settings->get_boolean("bypass1")); root.put(section + ".multiband_gate.lowband.solo", settings->get_boolean("solo1")); // mid band root.put(section + ".multiband_gate.midband.reduction", settings->get_double("range2")); root.put(section + ".multiband_gate.midband.threshold", settings->get_double("threshold2")); root.put(section + ".multiband_gate.midband.ratio", settings->get_double("ratio2")); root.put(section + ".multiband_gate.midband.attack", settings->get_double("attack2")); root.put(section + ".multiband_gate.midband.release", settings->get_double("release2")); root.put(section + ".multiband_gate.midband.makeup", settings->get_double("makeup2")); root.put(section + ".multiband_gate.midband.knee", settings->get_double("knee2")); root.put(section + ".multiband_gate.midband.detection", settings->get_string("detection2")); root.put(section + ".multiband_gate.midband.bypass", settings->get_boolean("bypass2")); root.put(section + ".multiband_gate.midband.solo", settings->get_boolean("solo2")); // high band root.put(section + ".multiband_gate.highband.reduction", settings->get_double("range3")); root.put(section + ".multiband_gate.highband.threshold", settings->get_double("threshold3")); root.put(section + ".multiband_gate.highband.ratio", settings->get_double("ratio3")); root.put(section + ".multiband_gate.highband.attack", settings->get_double("attack3")); root.put(section + ".multiband_gate.highband.release", settings->get_double("release3")); root.put(section + ".multiband_gate.highband.makeup", settings->get_double("makeup3")); root.put(section + ".multiband_gate.highband.knee", settings->get_double("knee3")); root.put(section + ".multiband_gate.highband.detection", settings->get_string("detection3")); root.put(section + ".multiband_gate.highband.bypass", settings->get_boolean("bypass3")); root.put(section + ".multiband_gate.highband.solo", settings->get_boolean("solo3")); } void MultibandGatePreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".multiband_gate.state"); update_key(root, settings, "input-gain", section + ".multiband_gate.input-gain"); update_key(root, settings, "output-gain", section + ".multiband_gate.output-gain"); update_key(root, settings, "freq0", section + ".multiband_gate.freq0"); update_key(root, settings, "freq1", section + ".multiband_gate.freq1"); update_key(root, settings, "freq2", section + ".multiband_gate.freq2"); update_string_key(root, settings, "mode", section + ".multiband_gate.mode"); // sub band update_key(root, settings, "range0", section + ".multiband_gate.subband.reduction"); update_key(root, settings, "threshold0", section + ".multiband_gate.subband.threshold"); update_key(root, settings, "ratio0", section + ".multiband_gate.subband.ratio"); update_key(root, settings, "attack0", section + ".multiband_gate.subband.attack"); update_key(root, settings, "release0", section + ".multiband_gate.subband.release"); update_key(root, settings, "makeup0", section + ".multiband_gate.subband.makeup"); update_key(root, settings, "knee0", section + ".multiband_gate.subband.knee"); update_string_key(root, settings, "detection0", section + ".multiband_gate.subband.detection"); update_key(root, settings, "bypass0", section + ".multiband_gate.subband.bypass"); update_key(root, settings, "solo0", section + ".multiband_gate.subband.solo"); // low band update_key(root, settings, "range1", section + ".multiband_gate.lowband.reduction"); update_key(root, settings, "threshold1", section + ".multiband_gate.lowband.threshold"); update_key(root, settings, "ratio1", section + ".multiband_gate.lowband.ratio"); update_key(root, settings, "attack1", section + ".multiband_gate.lowband.attack"); update_key(root, settings, "release1", section + ".multiband_gate.lowband.release"); update_key(root, settings, "makeup1", section + ".multiband_gate.lowband.makeup"); update_key(root, settings, "knee1", section + ".multiband_gate.lowband.knee"); update_string_key(root, settings, "detection1", section + ".multiband_gate.lowband.detection"); update_key(root, settings, "bypass1", section + ".multiband_gate.lowband.bypass"); update_key(root, settings, "solo1", section + ".multiband_gate.lowband.solo"); // mid band update_key(root, settings, "range2", section + ".multiband_gate.midband.reduction"); update_key(root, settings, "threshold2", section + ".multiband_gate.midband.threshold"); update_key(root, settings, "ratio2", section + ".multiband_gate.midband.ratio"); update_key(root, settings, "attack2", section + ".multiband_gate.midband.attack"); update_key(root, settings, "release2", section + ".multiband_gate.midband.release"); update_key(root, settings, "makeup2", section + ".multiband_gate.midband.makeup"); update_key(root, settings, "knee2", section + ".multiband_gate.midband.knee"); update_string_key(root, settings, "detection2", section + ".multiband_gate.midband.detection"); update_key(root, settings, "bypass2", section + ".multiband_gate.midband.bypass"); update_key(root, settings, "solo2", section + ".multiband_gate.midband.solo"); // high band update_key(root, settings, "range3", section + ".multiband_gate.highband.reduction"); update_key(root, settings, "threshold3", section + ".multiband_gate.highband.threshold"); update_key(root, settings, "ratio3", section + ".multiband_gate.highband.ratio"); update_key(root, settings, "attack3", section + ".multiband_gate.highband.attack"); update_key(root, settings, "release3", section + ".multiband_gate.highband.release"); update_key(root, settings, "makeup3", section + ".multiband_gate.highband.makeup"); update_key(root, settings, "knee3", section + ".multiband_gate.highband.knee"); update_string_key(root, settings, "detection3", section + ".multiband_gate.highband.detection"); update_key(root, settings, "bypass3", section + ".multiband_gate.highband.bypass"); update_key(root, settings, "solo3", section + ".multiband_gate.highband.solo"); } void MultibandGatePreset::write(PresetType preset_type, boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: save(root, "output", output_settings); break; case PresetType::input: save(root, "input", input_settings); break; } } void MultibandGatePreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: load(root, "output", output_settings); break; case PresetType::input: load(root, "input", input_settings); break; } } easyeffects-4.8.7/src/multiband_gate_ui.cpp000066400000000000000000000273331424023573300210150ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "multiband_gate_ui.hpp" #include namespace { auto detection_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "RMS") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "Peak") == 0) { g_value_set_int(value, 1); } return 1; } auto int_to_detection_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("RMS"); case 1: return g_variant_new_string("Peak"); default: return g_variant_new_string("RMS"); } } auto mode_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "LR4") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "LR8") == 0) { g_value_set_int(value, 1); } return 1; } auto int_to_mode_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("LR4"); case 1: return g_variant_new_string("LR8"); default: return g_variant_new_string("LR8"); } } } // namespace MultibandGateUi::MultibandGateUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "multiband_gate"; // loading glade widgets builder->get_widget("mode", mode); builder->get_widget("bypass0", bypass0); builder->get_widget("bypass1", bypass1); builder->get_widget("bypass2", bypass2); builder->get_widget("bypass3", bypass3); builder->get_widget("solo0", solo0); builder->get_widget("solo1", solo1); builder->get_widget("solo2", solo2); builder->get_widget("solo3", solo3); builder->get_widget("detection0", detection0); builder->get_widget("detection1", detection1); builder->get_widget("detection2", detection2); builder->get_widget("detection3", detection3); builder->get_widget("output0", output0); builder->get_widget("output0_label", output0_label); builder->get_widget("output1", output1); builder->get_widget("output1_label", output1_label); builder->get_widget("output2", output2); builder->get_widget("output2_label", output2_label); builder->get_widget("output3", output3); builder->get_widget("output3_label", output3_label); builder->get_widget("gating0", gating0); builder->get_widget("gating0_label", gating0_label); builder->get_widget("gating1", gating1); builder->get_widget("gating1_label", gating1_label); builder->get_widget("gating2", gating2); builder->get_widget("gating2_label", gating2_label); builder->get_widget("gating3", gating3); builder->get_widget("gating3_label", gating3_label); builder->get_widget("plugin_reset", reset_button); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); get_object(builder, "freq0", freq0); get_object(builder, "freq1", freq1); get_object(builder, "freq2", freq2); get_object(builder, "range0", range0); get_object(builder, "range1", range1); get_object(builder, "range2", range2); get_object(builder, "range3", range3); get_object(builder, "threshold0", threshold0); get_object(builder, "threshold1", threshold1); get_object(builder, "threshold2", threshold2); get_object(builder, "threshold3", threshold3); get_object(builder, "ratio0", ratio0); get_object(builder, "ratio1", ratio1); get_object(builder, "ratio2", ratio2); get_object(builder, "ratio3", ratio3); get_object(builder, "attack0", attack0); get_object(builder, "attack1", attack1); get_object(builder, "attack2", attack2); get_object(builder, "attack3", attack3); get_object(builder, "release0", release0); get_object(builder, "release1", release1); get_object(builder, "release2", release2); get_object(builder, "release3", release3); get_object(builder, "makeup0", makeup0); get_object(builder, "makeup1", makeup1); get_object(builder, "makeup2", makeup2); get_object(builder, "makeup3", makeup3); get_object(builder, "knee0", knee0); get_object(builder, "knee1", knee1); get_object(builder, "knee2", knee2); get_object(builder, "knee3", knee3); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); settings->bind("freq0", freq0.get(), "value", flag); settings->bind("freq1", freq1.get(), "value", flag); settings->bind("freq2", freq2.get(), "value", flag); settings->bind("range0", range0.get(), "value", flag); settings->bind("range1", range1.get(), "value", flag); settings->bind("range2", range2.get(), "value", flag); settings->bind("range3", range3.get(), "value", flag); settings->bind("threshold0", threshold0.get(), "value", flag); settings->bind("threshold1", threshold1.get(), "value", flag); settings->bind("threshold2", threshold2.get(), "value", flag); settings->bind("threshold3", threshold3.get(), "value", flag); settings->bind("ratio0", ratio0.get(), "value", flag); settings->bind("ratio1", ratio1.get(), "value", flag); settings->bind("ratio2", ratio2.get(), "value", flag); settings->bind("ratio3", ratio3.get(), "value", flag); settings->bind("attack0", attack0.get(), "value", flag); settings->bind("attack1", attack1.get(), "value", flag); settings->bind("attack2", attack2.get(), "value", flag); settings->bind("attack3", attack3.get(), "value", flag); settings->bind("release0", release0.get(), "value", flag); settings->bind("release1", release1.get(), "value", flag); settings->bind("release2", release2.get(), "value", flag); settings->bind("release3", release3.get(), "value", flag); settings->bind("makeup0", makeup0.get(), "value", flag); settings->bind("makeup1", makeup1.get(), "value", flag); settings->bind("makeup2", makeup2.get(), "value", flag); settings->bind("makeup3", makeup3.get(), "value", flag); settings->bind("knee0", knee0.get(), "value", flag); settings->bind("knee1", knee1.get(), "value", flag); settings->bind("knee2", knee2.get(), "value", flag); settings->bind("knee3", knee3.get(), "value", flag); settings->bind("bypass0", bypass0, "active", flag); settings->bind("bypass1", bypass1, "active", flag); settings->bind("bypass2", bypass2, "active", flag); settings->bind("bypass3", bypass3, "active", flag); settings->bind("solo0", solo0, "active", flag); settings->bind("solo1", solo1, "active", flag); settings->bind("solo2", solo2, "active", flag); settings->bind("solo3", solo3, "active", flag); g_settings_bind_with_mapping(settings->gobj(), "mode", mode->gobj(), "active", G_SETTINGS_BIND_DEFAULT, mode_enum_to_int, int_to_mode_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "detection0", detection0->gobj(), "active", G_SETTINGS_BIND_DEFAULT, detection_enum_to_int, int_to_detection_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "detection1", detection1->gobj(), "active", G_SETTINGS_BIND_DEFAULT, detection_enum_to_int, int_to_detection_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "detection2", detection2->gobj(), "active", G_SETTINGS_BIND_DEFAULT, detection_enum_to_int, int_to_detection_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "detection3", detection3->gobj(), "active", G_SETTINGS_BIND_DEFAULT, detection_enum_to_int, int_to_detection_enum, nullptr, nullptr); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } MultibandGateUi::~MultibandGateUi() { util::debug(name + " ui destroyed"); } void MultibandGateUi::reset() { settings->reset("input-gain"); settings->reset("output-gain"); settings->reset("freq0"); settings->reset("freq1"); settings->reset("freq2"); settings->reset("mode"); // sub band settings->reset("range0"); settings->reset("threshold0"); settings->reset("ratio0"); settings->reset("attack0"); settings->reset("release0"); settings->reset("makeup0"); settings->reset("knee0"); settings->reset("detection0"); settings->reset("bypass0"); settings->reset("solo0"); // low band settings->reset("range1"); settings->reset("threshold1"); settings->reset("ratio1"); settings->reset("attack1"); settings->reset("release1"); settings->reset("makeup1"); settings->reset("knee1"); settings->reset("detection1"); settings->reset("bypass1"); settings->reset("solo1"); // mid band settings->reset("range2"); settings->reset("threshold2"); settings->reset("ratio2"); settings->reset("attack2"); settings->reset("release2"); settings->reset("makeup2"); settings->reset("knee2"); settings->reset("detection2"); settings->reset("bypass2"); settings->reset("solo2"); // high band settings->reset("range3"); settings->reset("threshold3"); settings->reset("ratio3"); settings->reset("attack3"); settings->reset("release3"); settings->reset("makeup3"); settings->reset("knee3"); settings->reset("detection3"); settings->reset("bypass3"); settings->reset("solo3"); } void MultibandGateUi::on_new_output0(double value) { output0->set_value(value); output0_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandGateUi::on_new_output1(double value) { output1->set_value(value); output1_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandGateUi::on_new_output2(double value) { output2->set_value(value); output2_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandGateUi::on_new_output3(double value) { output3->set_value(value); output3_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandGateUi::on_new_gating0(double value) { gating0->set_value(1.0 - value); gating0_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandGateUi::on_new_gating1(double value) { gating1->set_value(1.0 - value); gating1_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandGateUi::on_new_gating2(double value) { gating2->set_value(1.0 - value); gating2_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } void MultibandGateUi::on_new_gating3(double value) { gating3->set_value(1.0 - value); gating3_label->set_text(level_to_localized_string(util::linear_to_db(value), 0)); } easyeffects-4.8.7/src/pipeline_base.cpp000066400000000000000000000642671424023573300201470ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "pipeline_base.hpp" #include #include #include #include #include "config.h" #include "gst/gstelement.h" #include "gst/gstmessage.h" #include "util.hpp" namespace { void on_message_error(const GstBus* gst_bus, GstMessage* message, PipelineBase* pb) { GError* err = nullptr; gchar* debug = nullptr; gst_message_parse_error(message, &err, &debug); util::critical(pb->log_tag + err->message); util::debug(pb->log_tag + debug); pb->set_null_pipeline(); g_error_free(err); g_free(debug); } void on_stream_status(GstBus* bus, GstMessage* message, PipelineBase* pb) { GstStreamStatusType type = GST_STREAM_STATUS_TYPE_DESTROY; GstElement* owner = nullptr; gchar* path = nullptr; std::string path_str; std::string source_name; std::size_t idx = 0; int priority = 4; int niceness = -10; int priority_type = 2; // None gst_message_parse_stream_status(message, &type, &owner); switch (type) { case GST_STREAM_STATUS_TYPE_ENTER: { path = gst_object_get_path_string(GST_OBJECT(owner)); path_str = path; idx = path_str.find_last_of('/'); source_name = path_str.substr(idx + 1); g_free(path); priority_type = g_settings_get_enum(pb->settings, "priority-type"); switch (priority_type) { case 0: { // Niceness (high priority in rtkit terms) niceness = g_settings_get_int(pb->settings, "niceness"); pb->rtkit->set_nice(source_name, niceness); break; } case 1: { // Real Time priority = g_settings_get_int(pb->settings, "realtime-priority"); pb->rtkit->set_priority(source_name, priority); } } } default: break; } } void on_message_state_changed(const GstBus* gst_bus, GstMessage* message, PipelineBase* pb) { if (std::strcmp(GST_OBJECT_NAME(message->src), "pipeline") == 0) { GstState old_state = GST_STATE_NULL; GstState new_state = GST_STATE_NULL; GstState pending = GST_STATE_NULL; gst_message_parse_state_changed(message, &old_state, &new_state, &pending); util::debug(pb->log_tag + gst_element_state_get_name(old_state) + " -> " + gst_element_state_get_name(new_state) + " -> " + gst_element_state_get_name(pending)); if (new_state == GST_STATE_PLAYING) { pb->playing = true; pb->get_latency(); } else { pb->playing = false; } } } void on_message_latency(const GstBus* gst_bus, GstMessage* message, PipelineBase* pb) { if (std::strcmp(GST_OBJECT_NAME(message->src), "source") == 0) { int latency = 0; int buffer = 0; g_object_get(pb->source, "latency-time", &latency, nullptr); g_object_get(pb->source, "buffer-time", &buffer, nullptr); util::debug(pb->log_tag + "pulsesrc latency [us]: " + std::to_string(latency)); util::debug(pb->log_tag + "pulsesrc buffer [us]: " + std::to_string(buffer)); } else if (std::strcmp(GST_OBJECT_NAME(message->src), "sink") == 0) { int latency = 0; int buffer = 0; g_object_get(pb->sink, "latency-time", &latency, nullptr); g_object_get(pb->sink, "buffer-time", &buffer, nullptr); util::debug(pb->log_tag + "pulsesink latency [us]: " + std::to_string(latency)); util::debug(pb->log_tag + "pulsesink buffer [us]: " + std::to_string(buffer)); } pb->get_latency(); } void on_message_element(const GstBus* gst_bus, GstMessage* message, PipelineBase* pb) { if (std::strcmp(GST_OBJECT_NAME(message->src), "spectrum") == 0 && !pb->resizing_spectrum) { const GstStructure* s = gst_message_get_structure(message); const GValue* magnitudes = nullptr; magnitudes = gst_structure_get_value(s, "magnitude"); for (uint n = 0U; n < pb->spectrum_freqs.size(); n++) { pb->spectrum_mag_tmp[n] = g_value_get_float(gst_value_list_get_value(magnitudes, n + pb->spectrum_start_index)); } try { boost::math::interpolators::cardinal_cubic_b_spline spline( pb->spectrum_mag_tmp.begin(), pb->spectrum_mag_tmp.end(), pb->spline_f0, pb->spline_df); for (uint n = 0U; n < pb->spectrum_mag.size(); n++) { pb->spectrum_mag[n] = spline(pb->spectrum_x_axis[n]); } } catch (const std::exception& e) { util::debug(std::string("Message from thrown exception was: ") + e.what()); } auto min_mag = pb->spectrum_threshold; auto max_mag = *std::max_element(pb->spectrum_mag.begin(), pb->spectrum_mag.end()); if (max_mag > min_mag) { for (float& v : pb->spectrum_mag) { if (min_mag < v) { v = (min_mag - v) / min_mag; } else { v = 0.0F; } } Glib::signal_idle().connect_once([=] { pb->new_spectrum.emit(pb->spectrum_mag); }); } } } void on_spectrum_n_points_changed(GSettings* settings, gchar* key, PipelineBase* pb) { unsigned long int npoints = g_settings_get_int(settings, "n-points"); if (npoints != pb->spectrum_mag.size()) { pb->resizing_spectrum = true; pb->spectrum_mag.resize(npoints); pb->spectrum_x_axis = util::logspace(log10(static_cast(pb->min_spectrum_freq)), log10(static_cast(pb->max_spectrum_freq)), npoints); pb->resizing_spectrum = false; } } void on_src_type_changed(GstElement* typefind, guint probability, GstCaps* caps, PipelineBase* pb) { GstStructure* structure = gst_caps_get_structure(caps, 0); int rate = 44100; gst_structure_get_int(structure, "rate", &rate); pb->sampling_rate = rate; pb->init_spectrum(); util::debug(pb->log_tag + "sampling rate: " + std::to_string(rate) + " Hz"); } void on_buffer_changed(GObject* gobject, GParamSpec* pspec, PipelineBase* pb) { GstState state = GST_STATE_NULL; GstState pending = GST_STATE_NULL; gst_element_get_state(pb->pipeline, &state, &pending, pb->state_check_timeout); if (state == GST_STATE_PLAYING || state == GST_STATE_PAUSED) { /* when we are playing it is necessary to reset the pipeline for the new * value to take effect */ gst_element_set_state(pb->pipeline, GST_STATE_READY); pb->update_pipeline_state(); } } void on_latency_changed(GObject* gobject, GParamSpec* pspec, PipelineBase* pb) { GstState state = GST_STATE_NULL; GstState pending = GST_STATE_NULL; gst_element_get_state(pb->pipeline, &state, &pending, pb->state_check_timeout); if (state == GST_STATE_PLAYING || state == GST_STATE_PAUSED) { /* when we are playing it is necessary to reset the pipeline for the new * value to take effect */ gst_element_set_state(pb->pipeline, GST_STATE_READY); pb->update_pipeline_state(); } } auto on_sink_event(GstPad* pad, GstPadProbeInfo* info, gpointer user_data) -> GstPadProbeReturn { GstEvent* event = GST_PAD_PROBE_INFO_EVENT(info); if (event->type == GST_EVENT_LATENCY) { auto* pb = static_cast(user_data); pb->get_latency(); } return GST_PAD_PROBE_PASS; } void on_bypass_on(gpointer user_data) { auto* pb = static_cast(user_data); auto* effects_bin = gst_bin_get_by_name(GST_BIN(pb->pipeline), "effects_bin"); if (effects_bin != nullptr) { gst_element_set_state(effects_bin, GST_STATE_READY); gst_element_unlink_many(pb->src_type, effects_bin, pb->spectrum_bin, pb->global_level_meter_bin, nullptr); gst_bin_remove(GST_BIN(pb->pipeline), effects_bin); gst_element_link_many(pb->src_type, pb->spectrum_bin, pb->global_level_meter_bin, nullptr); util::debug(pb->log_tag + " bypass enabled"); } else { util::debug(pb->log_tag + "bypass is already enabled"); } } void on_bypass_off(gpointer user_data) { auto* pb = static_cast(user_data); auto* bin = gst_bin_get_by_name(GST_BIN(pb->pipeline), "effects_bin"); if (bin == nullptr) { gst_element_set_state(pb->effects_bin, GST_STATE_NULL); gst_element_unlink_many(pb->src_type, pb->spectrum_bin, pb->global_level_meter_bin, nullptr); gst_bin_add(GST_BIN(pb->pipeline), pb->effects_bin); gst_element_link_many(pb->src_type, pb->effects_bin, pb->spectrum_bin, pb->global_level_meter_bin, nullptr); gst_element_sync_state_with_parent(pb->effects_bin); util::debug(pb->log_tag + " bypass disabled"); } else { util::debug(pb->log_tag + "bypass is already disabled"); } } auto bypass_event_probe_cb(GstPad* pad, GstPadProbeInfo* info, gpointer user_data) -> GstPadProbeReturn { if (GST_EVENT_TYPE(GST_PAD_PROBE_INFO_DATA(info)) != GST_EVENT_CUSTOM_DOWNSTREAM) { return GST_PAD_PROBE_PASS; } gst_pad_remove_probe(pad, GST_PAD_PROBE_INFO_ID(info)); on_bypass_on(user_data); return GST_PAD_PROBE_DROP; } auto bypass_on_pad_blocked(GstPad* pad, GstPadProbeInfo* info, gpointer user_data) -> GstPadProbeReturn { auto* pb = static_cast(user_data); gst_pad_remove_probe(pad, GST_PAD_PROBE_INFO_ID(info)); auto* srcpad = gst_element_get_static_pad(pb->spectrum_bin, "src"); gst_pad_add_probe(srcpad, static_cast(GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM), bypass_event_probe_cb, user_data, nullptr); auto* sinkpad = gst_element_get_static_pad(pb->effects_bin, "sink"); GstStructure* s = gst_structure_new_empty("enable_bypass"); GstEvent* event = gst_event_new_custom(GST_EVENT_CUSTOM_DOWNSTREAM, s); gst_pad_send_event(sinkpad, event); gst_object_unref(sinkpad); gst_object_unref(srcpad); return GST_PAD_PROBE_OK; } } // namespace PipelineBase::PipelineBase(const std::string& tag, PulseManager* pulse_manager) : log_tag(tag), pm(pulse_manager), settings(g_settings_new("com.github.wwmm.pulseeffects")), spectrum_settings(g_settings_new("com.github.wwmm.pulseeffects.spectrum")), rtkit(std::make_unique(tag)) { gst_init(nullptr, nullptr); pipeline = gst_pipeline_new("pipeline"); bus = gst_element_get_bus(pipeline); gst_bus_enable_sync_message_emission(bus); gst_bus_add_signal_watch(bus); // bus callbacks g_signal_connect(bus, "message::error", G_CALLBACK(on_message_error), this); g_signal_connect(bus, "sync-message::stream-status", GCallback(on_stream_status), this); g_signal_connect(bus, "message::state-changed", G_CALLBACK(on_message_state_changed), this); g_signal_connect(bus, "message::latency", G_CALLBACK(on_message_latency), this); g_signal_connect(bus, "message::element", G_CALLBACK(on_message_element), this); // creating elements common to all pipelines gst_registry_scan_path(gst_registry_get(), PLUGINS_INSTALL_DIR); source = get_required_plugin("pulsesrc", "source"); queue_src = get_required_plugin("queue", nullptr); capsfilter = get_required_plugin("capsfilter", nullptr); sink = get_required_plugin("pulsesink", "sink"); spectrum = get_required_plugin("spectrum", "spectrum"); global_level_meter = get_required_plugin("level", "global_level_meter"); src_type = get_required_plugin("typefind", nullptr); init_spectrum_bin(); init_effects_bin(); // building the pipeline gst_bin_add_many(GST_BIN(pipeline), source, queue_src, capsfilter, src_type, effects_bin, spectrum_bin, global_level_meter, sink, nullptr); gst_element_link_many(source, queue_src, capsfilter, src_type, effects_bin, spectrum_bin, global_level_meter, sink, nullptr); // initializing properties g_object_set(source, "volume", 1.0, nullptr); g_object_set(source, "mute", 0, nullptr); g_object_set(source, "provide-clock", 0, nullptr); g_object_set(source, "slave-method", 1, nullptr); // re-timestamp g_object_set(source, "do-timestamp", 1, nullptr); g_object_set(sink, "volume", 1.0, nullptr); g_object_set(sink, "mute", 0, nullptr); g_object_set(sink, "provide-clock", 1, nullptr); g_object_set(queue_src, "silent", 1, nullptr); g_object_set(queue_src, "flush-on-eos", 1, nullptr); g_object_set(queue_src, "max-size-buffers", 0, nullptr); g_object_set(queue_src, "max-size-bytes", 0, nullptr); g_object_set(queue_src, "max-size-time", 0, nullptr); g_object_set(spectrum, "bands", spectrum_nbands, nullptr); g_object_set(spectrum, "threshold", spectrum_threshold, nullptr); g_signal_connect(src_type, "have-type", G_CALLBACK(on_src_type_changed), this); g_signal_connect(source, "notify::buffer-time", G_CALLBACK(on_buffer_changed), this); g_signal_connect(source, "notify::latency-time", G_CALLBACK(on_latency_changed), this); g_signal_connect(sink, "notify::buffer-time", G_CALLBACK(on_buffer_changed), this); g_signal_connect(sink, "notify::latency-time", G_CALLBACK(on_latency_changed), this); auto* sinkpad = gst_element_get_static_pad(sink, "sink"); gst_pad_add_probe(sinkpad, GST_PAD_PROBE_TYPE_EVENT_UPSTREAM, on_sink_event, this, nullptr); g_object_unref(sinkpad); } PipelineBase::~PipelineBase() { timeout_connection.disconnect(); set_null_pipeline(); // Avoinding memory leak. If spectrum is not in a bin we have to unref it auto* s = gst_bin_get_by_name(GST_BIN(spectrum_bin), "spectrum"); if (s == nullptr) { gst_object_unref(spectrum); } gst_object_unref(bus); gst_object_unref(pipeline); g_object_unref(settings); g_object_unref(spectrum_settings); g_object_unref(child_settings); } void PipelineBase::set_caps(const uint& sampling_rate) { this->sampling_rate = sampling_rate; auto caps_str = "audio/x-raw,format=F32LE,channels=2,rate=" + std::to_string(sampling_rate); auto* caps = gst_caps_from_string(caps_str.c_str()); g_object_set(capsfilter, "caps", caps, nullptr); gst_caps_unref(caps); } void PipelineBase::init_spectrum_bin() { spectrum_bin = gst_bin_new("spectrum_bin"); spectrum_identity_in = gst_element_factory_make("identity", nullptr); spectrum_identity_out = gst_element_factory_make("identity", nullptr); gst_bin_add_many(GST_BIN(spectrum_bin), spectrum_identity_in, spectrum_identity_out, nullptr); gst_element_link(spectrum_identity_in, spectrum_identity_out); auto* sinkpad = gst_element_get_static_pad(spectrum_identity_in, "sink"); auto* srcpad = gst_element_get_static_pad(spectrum_identity_out, "src"); gst_element_add_pad(spectrum_bin, gst_ghost_pad_new("sink", sinkpad)); gst_element_add_pad(spectrum_bin, gst_ghost_pad_new("src", srcpad)); g_object_unref(sinkpad); g_object_unref(srcpad); } void PipelineBase::init_global_level_meter_bin() { global_level_meter_bin = gst_bin_new("global_level_meter_bin"); level_meter_identity_in = gst_element_factory_make("identity", nullptr); level_meter_identity_out = gst_element_factory_make("identity", nullptr); gst_bin_add_many(GST_BIN(global_level_meter_bin), level_meter_identity_in, level_meter_identity_out, nullptr); gst_element_link(level_meter_identity_in, level_meter_identity_out); auto* sinkpad = gst_element_get_static_pad(level_meter_identity_in, "sink"); auto* srcpad = gst_element_get_static_pad(level_meter_identity_out, "src"); gst_element_add_pad(global_level_meter_bin, gst_ghost_pad_new("sink", sinkpad)); gst_element_add_pad(global_level_meter_bin, gst_ghost_pad_new("src", srcpad)); g_object_unref(sinkpad); g_object_unref(srcpad); } void PipelineBase::init_effects_bin() { effects_bin = gst_bin_new("effects_bin"); identity_in = gst_element_factory_make("identity", nullptr); identity_out = gst_element_factory_make("identity", nullptr); gst_bin_add_many(GST_BIN(effects_bin), identity_in, identity_out, nullptr); gst_element_link(identity_in, identity_out); auto* sinkpad = gst_element_get_static_pad(identity_in, "sink"); auto* srcpad = gst_element_get_static_pad(identity_out, "src"); gst_element_add_pad(effects_bin, gst_ghost_pad_new("sink", sinkpad)); gst_element_add_pad(effects_bin, gst_ghost_pad_new("src", srcpad)); g_object_unref(sinkpad); g_object_unref(srcpad); } void PipelineBase::set_source_monitor_name(const std::string& name) { gchar* current_device = nullptr; g_object_get(source, "current-device", ¤t_device, nullptr); if (name != current_device) { if (playing) { set_null_pipeline(); g_object_set(source, "device", name.c_str(), nullptr); gst_element_set_state(pipeline, GST_STATE_PLAYING); } else { g_object_set(source, "device", name.c_str(), nullptr); } util::debug(log_tag + "using input device: " + name); } g_free(current_device); } void PipelineBase::set_output_sink_name(const std::string& name) const { g_object_set(sink, "device", name.c_str(), nullptr); util::debug(log_tag + "using output device: " + name); } void PipelineBase::set_pulseaudio_props(const std::string& props) const { auto str = "props," + props; auto* s = gst_structure_from_string(str.c_str(), nullptr); g_object_set(source, "stream-properties", s, nullptr); g_object_set(sink, "stream-properties", s, nullptr); gst_structure_free(s); } void PipelineBase::set_null_pipeline() { gst_element_set_state(pipeline, GST_STATE_NULL); GstState state = GST_STATE_NULL; GstState pending = GST_STATE_NULL; gst_element_get_state(pipeline, &state, &pending, state_check_timeout); /* on_message_state is not called when going to null. I don't know why. * so we have to update the variable manually after setting to null. */ if (state == GST_STATE_NULL) { playing = false; } util::debug(log_tag + gst_element_state_get_name(state) + " -> " + gst_element_state_get_name(pending)); } auto PipelineBase::apps_want_to_play() -> bool { bool wants_to_play = false; for (const auto& a : apps_list) { if (a->wants_to_play) { wants_to_play = true; break; } } return wants_to_play; } void PipelineBase::update_pipeline_state() { bool wants_to_play = apps_want_to_play(); GstState state = GST_STATE_NULL; GstState pending = GST_STATE_NULL; gst_element_get_state(pipeline, &state, &pending, state_check_timeout); if (state != GST_STATE_PLAYING && wants_to_play) { timeout_connection.disconnect(); gst_element_set_state(pipeline, GST_STATE_PLAYING); } else if (state == GST_STATE_PLAYING && !wants_to_play) { timeout_connection.disconnect(); auto seconds = g_settings_get_int(settings, "audio-activity-timeout"); timeout_connection = Glib::signal_timeout().connect_seconds( [=]() { GstState s = GST_STATE_NULL; GstState p = GST_STATE_NULL; gst_element_get_state(pipeline, &s, &p, state_check_timeout); if (s == GST_STATE_PLAYING && !apps_want_to_play()) { util::debug(log_tag + "No app wants to play audio. We will stop our pipeline."); gst_element_set_state(pipeline, GST_STATE_READY); } return false; }, seconds); } } void PipelineBase::get_latency() { GstQuery* q = gst_query_new_latency(); if (gst_element_query(pipeline, q) != 0) { gboolean live = 0; GstClockTime min = 0; GstClockTime max = 0; gst_query_parse_latency(q, &live, &min, &max); int latency = GST_TIME_AS_MSECONDS(min); util::debug(log_tag + "total latency: " + std::to_string(latency) + " ms"); Glib::signal_idle().connect_once([=] { new_latency.emit(latency); }); } gst_query_unref(q); } void PipelineBase::on_app_added(const std::shared_ptr& app_info) { for (const auto& a : apps_list) { if (a->index == app_info->index) { return; // do not add the same app two times } } apps_list.emplace_back(app_info); update_pipeline_state(); } void PipelineBase::on_app_changed(const std::shared_ptr& app_info) { std::replace_copy_if( apps_list.begin(), apps_list.end(), apps_list.begin(), [=](auto& a) { return a->index == app_info->index; }, app_info); update_pipeline_state(); } void PipelineBase::on_app_removed(uint idx) { apps_list.erase(std::remove_if(apps_list.begin(), apps_list.end(), [=](auto& a) { return a->index == idx; }), apps_list.end()); update_pipeline_state(); } void PipelineBase::on_sink_changed(const std::shared_ptr& sink_info) { if (sink_info->name == "PulseEffects_apps") { if (sink_info->rate != sampling_rate) { gst_element_set_state(pipeline, GST_STATE_READY); set_caps(sink_info->rate); update_pipeline_state(); } } } void PipelineBase::on_source_changed(const std::shared_ptr& source_info) { if (source_info->name == "PulseEffects_mic.monitor") { if (source_info->rate != sampling_rate) { gst_element_set_state(pipeline, GST_STATE_READY); set_caps(source_info->rate); update_pipeline_state(); } } } void PipelineBase::init_spectrum() { g_signal_connect(spectrum_settings, "changed::n-points", G_CALLBACK(on_spectrum_n_points_changed), this); spectrum_freqs.clear(); spectrum_start_index = 0U; for (uint n = 0U; n < spectrum_nbands; n++) { auto f = sampling_rate * (0.5 * n + 0.25) / spectrum_nbands; if (f > max_spectrum_freq) { break; } if (f > min_spectrum_freq) { spectrum_freqs.emplace_back(f); if (spectrum_start_index == 0U) { spectrum_start_index = n; } } } if (!spectrum_freqs.empty()) { spectrum_mag_tmp.resize(spectrum_freqs.size()); auto npoints = g_settings_get_int(spectrum_settings, "n-points"); spectrum_x_axis = util::logspace(log10(static_cast(min_spectrum_freq)), log10(static_cast(max_spectrum_freq)), npoints); spectrum_mag.resize(npoints); spline_f0 = spectrum_freqs[0]; spline_df = spectrum_freqs[1] - spectrum_freqs[0]; } } void PipelineBase::update_spectrum_interval(const double& value) const { const double one_second_in_ns = 1000000000.0; auto interval = static_cast(one_second_in_ns / value); g_object_set(spectrum, "interval", interval, nullptr); } void PipelineBase::enable_spectrum() { auto* srcpad = gst_element_get_static_pad(spectrum_identity_in, "src"); auto id = gst_pad_add_probe( srcpad, GST_PAD_PROBE_TYPE_IDLE, [](auto pad, auto info, auto d) { auto* l = static_cast(d); auto* plugin = gst_bin_get_by_name(GST_BIN(l->spectrum_bin), "spectrum"); if (!plugin) { gst_element_unlink(l->spectrum_identity_in, l->spectrum_identity_out); gst_bin_add(GST_BIN(l->spectrum_bin), l->spectrum); gst_element_link_many(l->spectrum_identity_in, l->spectrum, l->spectrum_identity_out, nullptr); gst_element_sync_state_with_parent(l->spectrum); util::debug(l->log_tag + "spectrum enabled"); } else { util::debug(l->log_tag + "spectrum is already enabled"); } return GST_PAD_PROBE_REMOVE; }, this, nullptr); if (id != 0) { util::debug(log_tag + " spectrum will be enabled in another thread"); } g_object_unref(srcpad); } void PipelineBase::disable_spectrum() { auto* srcpad = gst_element_get_static_pad(spectrum_identity_in, "src"); auto id = gst_pad_add_probe( srcpad, GST_PAD_PROBE_TYPE_IDLE, [](auto pad, auto info, auto d) { auto* l = static_cast(d); auto* plugin = gst_bin_get_by_name(GST_BIN(l->spectrum_bin), "spectrum"); if (plugin) { gst_element_set_state(l->spectrum, GST_STATE_NULL); gst_element_unlink_many(l->spectrum_identity_in, l->spectrum, l->spectrum_identity_out, nullptr); gst_bin_remove(GST_BIN(l->spectrum_bin), l->spectrum); gst_element_link(l->spectrum_identity_in, l->spectrum_identity_out); util::debug(l->log_tag + "spectrum disabled"); } else { util::debug(l->log_tag + "spectrum is already disabled"); } return GST_PAD_PROBE_REMOVE; }, this, nullptr); if (id != 0) { util::debug(log_tag + " spectrum will be disabled in another thread"); } g_object_unref(srcpad); } auto PipelineBase::get_peak(GstMessage* message) -> std::array { std::array peak{0, 0}; const GstStructure* s = gst_message_get_structure(message); auto* gpeak = (GValueArray*)g_value_get_boxed(gst_structure_get_value(s, "peak")); if (gpeak != nullptr) { if (gpeak->n_values == 2) { if (gpeak->values != nullptr) { peak[0] = g_value_get_double(gpeak->values); // left peak[1] = g_value_get_double(gpeak->values + 1); // right } } } return peak; } auto PipelineBase::get_required_plugin(const gchar* factoryname, const gchar* name) const -> GstElement* { GstElement* plugin = gst_element_factory_make(factoryname, name); if (plugin == nullptr) { throw std::runtime_error(log_tag + std::string("Failed to get required plugin: ") + factoryname); } return plugin; } void PipelineBase::do_bypass(const bool& value) { auto* srcpad = gst_element_get_static_pad(src_type, "src"); if (value) { GstState state = GST_STATE_NULL; GstState pending = GST_STATE_NULL; gst_element_get_state(pipeline, &state, &pending, 0); if (state != GST_STATE_PLAYING) { gst_pad_add_probe( srcpad, GST_PAD_PROBE_TYPE_IDLE, [](auto pad, auto info, auto d) { on_bypass_on(d); return GST_PAD_PROBE_REMOVE; }, this, nullptr); } else { gst_pad_add_probe(srcpad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM, bypass_on_pad_blocked, this, nullptr); } } else { gst_pad_add_probe( srcpad, GST_PAD_PROBE_TYPE_IDLE, [](auto pad, auto info, auto d) { on_bypass_off(d); return GST_PAD_PROBE_REMOVE; }, this, nullptr); } } auto PipelineBase::bypass_state() -> bool { auto* bin = gst_bin_get_by_name(GST_BIN(pipeline), "effects_bin"); return bin == nullptr; } easyeffects-4.8.7/src/pitch.cpp000066400000000000000000000070561424023573300164500ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "pitch.hpp" #include #include "util.hpp" Pitch::Pitch(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "pitch", schema, schema_path) { pitch = gst_element_factory_make("ladspa-ladspa-rubberband-so-rubberband-pitchshifter-stereo", "pitch"); if (is_installed(pitch)) { auto* input_gain = gst_element_factory_make("volume", nullptr); auto* in_level = gst_element_factory_make("level", "pitch_input_level"); auto* output_gain = gst_element_factory_make("volume", nullptr); auto* out_level = gst_element_factory_make("level", "pitch_output_level"); auto* audioconvert_in = gst_element_factory_make("audioconvert", nullptr); auto* audioconvert_out = gst_element_factory_make("audioconvert", nullptr); gst_bin_add_many(GST_BIN(bin), input_gain, in_level, audioconvert_in, pitch, audioconvert_out, output_gain, out_level, nullptr); gst_element_link_many(input_gain, in_level, audioconvert_in, pitch, audioconvert_out, output_gain, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(input_gain, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); bind_to_gsettings(); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "input-gain", input_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", output_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Pitch::~Pitch() { util::debug(log_tag + name + " destroyed"); } void Pitch::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "cents", pitch, "cents", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind(settings, "semitones", pitch, "semitones", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "octaves", pitch, "octaves", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "crispness", pitch, "crispness", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "formant-preserving", pitch, "formant-preserving", G_SETTINGS_BIND_DEFAULT); } easyeffects-4.8.7/src/pitch_preset.cpp000066400000000000000000000064761424023573300200370ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "pitch_preset.hpp" PitchPreset::PitchPreset() : input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.pitch", "/com/github/wwmm/pulseeffects/sourceoutputs/pitch/")), output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.pitch", "/com/github/wwmm/pulseeffects/sinkinputs/pitch/")) {} void PitchPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".pitch.state", settings->get_boolean("state")); root.put(section + ".pitch.input-gain", settings->get_double("input-gain")); root.put(section + ".pitch.output-gain", settings->get_double("output-gain")); root.put(section + ".pitch.cents", settings->get_double("cents")); root.put(section + ".pitch.semitones", settings->get_int("semitones")); root.put(section + ".pitch.octaves", settings->get_int("octaves")); root.put(section + ".pitch.crispness", settings->get_int("crispness")); root.put(section + ".pitch.formant-preserving", settings->get_boolean("formant-preserving")); } void PitchPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".pitch.state"); update_key(root, settings, "input-gain", section + ".pitch.input-gain"); update_key(root, settings, "output-gain", section + ".pitch.output-gain"); update_key(root, settings, "cents", section + ".pitch.cents"); update_key(root, settings, "semitones", section + ".pitch.semitones"); update_key(root, settings, "octaves", section + ".pitch.octaves"); update_key(root, settings, "crispness", section + ".pitch.crispness"); update_key(root, settings, "formant-preserving", section + ".pitch.formant-preserving"); } void PitchPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: save(root, "output", output_settings); break; case PresetType::input: save(root, "input", input_settings); break; } } void PitchPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: load(root, "output", output_settings); break; case PresetType::input: load(root, "input", input_settings); break; } } easyeffects-4.8.7/src/pitch_ui.cpp000066400000000000000000000047311424023573300171420ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "pitch_ui.hpp" PitchUi::PitchUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "pitch"; // loading glade widgets builder->get_widget("formant_preserving", formant_preserving); builder->get_widget("plugin_reset", reset_button); get_object(builder, "cents", cents); get_object(builder, "crispness", crispness); get_object(builder, "semitones", semitones); get_object(builder, "octaves", octaves); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("cents", cents.get(), "value", flag); settings->bind("crispness", crispness.get(), "value", flag); settings->bind("semitones", semitones.get(), "value", flag); settings->bind("octaves", octaves.get(), "value", flag); settings->bind("formant-preserving", formant_preserving, "active", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } PitchUi::~PitchUi() { util::debug(name + " ui destroyed"); } void PitchUi::reset() { settings->reset("input-gain"); settings->reset("output-gain"); settings->reset("cents"); settings->reset("semitones"); settings->reset("octaves"); settings->reset("crispness"); settings->reset("formant-preserving"); settings->reset("faster"); } easyeffects-4.8.7/src/plugin_base.cpp000066400000000000000000000140401424023573300176200ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "plugin_base.hpp" #include "gst/gstelement.h" #include "util.hpp" namespace { void on_state_changed(GSettings* settings, gchar* key, PluginBase* l) { if (l->plugin_is_installed) { int enable = g_settings_get_boolean(settings, key); if (enable == true) { l->enable(); } else { l->disable(); } } else { g_settings_set_boolean(settings, "installed", 0); } } void on_enable(gpointer user_data) { auto* l = static_cast(user_data); auto* b = gst_bin_get_by_name(GST_BIN(l->plugin), std::string(l->name + "_bin").c_str()); if (b == nullptr) { gst_element_set_state(l->bin, GST_STATE_NULL); gst_element_unlink(l->identity_in, l->identity_out); gst_bin_add(GST_BIN(l->plugin), l->bin); gst_element_link_many(l->identity_in, l->bin, l->identity_out, nullptr); gst_element_sync_state_with_parent(l->bin); util::debug(l->log_tag + l->name + " is enabled"); } else { util::debug(l->log_tag + l->name + " is already enabled"); } } void on_disable(gpointer user_data) { auto* l = static_cast(user_data); auto* b = gst_bin_get_by_name(GST_BIN(l->plugin), std::string(l->name + "_bin").c_str()); if (b != nullptr) { gst_element_set_state(l->bin, GST_STATE_NULL); gst_element_unlink_many(l->identity_in, l->bin, l->identity_out, nullptr); gst_bin_remove(GST_BIN(l->plugin), l->bin); gst_element_link(l->identity_in, l->identity_out); util::debug(l->log_tag + l->name + " is disabled"); } else { util::debug(l->log_tag + l->name + " is already disabled"); } } auto event_probe_cb(GstPad* pad, GstPadProbeInfo* info, gpointer user_data) -> GstPadProbeReturn { if (GST_EVENT_TYPE(GST_PAD_PROBE_INFO_DATA(info)) != GST_EVENT_CUSTOM_DOWNSTREAM) { return GST_PAD_PROBE_PASS; } gst_pad_remove_probe(pad, GST_PAD_PROBE_INFO_ID(info)); on_disable(user_data); return GST_PAD_PROBE_DROP; } auto on_pad_blocked(GstPad* pad, GstPadProbeInfo* info, gpointer user_data) -> GstPadProbeReturn { auto* l = static_cast(user_data); gst_pad_remove_probe(pad, GST_PAD_PROBE_INFO_ID(info)); auto* srcpad = gst_element_get_static_pad(l->identity_out, "src"); gst_pad_add_probe(srcpad, static_cast(GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM), event_probe_cb, user_data, nullptr); auto* sinkpad = gst_element_get_static_pad(l->bin, "sink"); GstStructure* s = gst_structure_new_empty("remove_plugin"); GstEvent* event = gst_event_new_custom(GST_EVENT_CUSTOM_DOWNSTREAM, s); gst_pad_send_event(sinkpad, event); gst_object_unref(sinkpad); gst_object_unref(srcpad); return GST_PAD_PROBE_OK; } } // namespace PluginBase::PluginBase(std::string tag, std::string plugin_name, const std::string& schema, const std::string& schema_path) : log_tag(std::move(tag)), name(std::move(plugin_name)), settings(g_settings_new_with_path(schema.c_str(), schema_path.c_str())) { plugin = gst_bin_new(std::string(name + "_plugin").c_str()); identity_in = gst_element_factory_make("identity", std::string(name + "_plugin_bin_identity_in").c_str()); identity_out = gst_element_factory_make("identity", std::string(name + "_plugin_bin_identity_out").c_str()); gst_bin_add_many(GST_BIN(plugin), identity_in, identity_out, nullptr); gst_element_link_many(identity_in, identity_out, nullptr); auto* sinkpad = gst_element_get_static_pad(identity_in, "sink"); auto* srcpad = gst_element_get_static_pad(identity_out, "src"); gst_element_add_pad(plugin, gst_ghost_pad_new("sink", sinkpad)); gst_element_add_pad(plugin, gst_ghost_pad_new("src", srcpad)); g_object_unref(sinkpad); g_object_unref(srcpad); bin = gst_bin_new((name + "_bin").c_str()); } PluginBase::~PluginBase() { auto enable = g_settings_get_boolean(settings, "state"); if (enable == false) { gst_object_unref(bin); } g_object_unref(settings); } auto PluginBase::is_installed(GstElement* e) -> bool { if (e != nullptr) { plugin_is_installed = true; g_settings_set_boolean(settings, "installed", 1); g_signal_connect(settings, "changed::state", G_CALLBACK(on_state_changed), this); return true; } plugin_is_installed = false; g_settings_set_boolean(settings, "installed", 0); util::warning(name + " plugin was not found!"); return false; } void PluginBase::enable() { auto* srcpad = gst_element_get_static_pad(identity_in, "src"); gst_pad_add_probe( srcpad, GST_PAD_PROBE_TYPE_IDLE, [](auto pad, auto info, auto d) { on_enable(d); return GST_PAD_PROBE_REMOVE; }, this, nullptr); g_object_unref(srcpad); } void PluginBase::disable() { auto* srcpad = gst_element_get_static_pad(identity_in, "src"); GstState state = GST_STATE_NULL; GstState pending = GST_STATE_NULL; gst_element_get_state(bin, &state, &pending, 0); if (state != GST_STATE_PLAYING) { gst_pad_add_probe( srcpad, GST_PAD_PROBE_TYPE_IDLE, [](auto pad, auto info, auto d) { on_disable(d); return GST_PAD_PROBE_REMOVE; }, this, nullptr); } else { gst_pad_add_probe(srcpad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM, on_pad_blocked, this, nullptr); } g_object_unref(srcpad); } easyeffects-4.8.7/src/plugin_ui_base.cpp000066400000000000000000000067601424023573300203270ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "plugin_ui_base.hpp" std::locale PluginUiBase::global_locale = util::get_global_locale(); std::locale PluginUiBase::c_locale = util::get_c_locale(); PluginUiBase::PluginUiBase(const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : settings(Gio::Settings::create(schema, schema_path)) { // get widgets builder->get_widget("enable", enable); builder->get_widget("listbox_control", listbox_control); builder->get_widget("controls", controls); builder->get_widget("plugin_up", plugin_up); builder->get_widget("plugin_down", plugin_down); builder->get_widget("input_level_left", input_level_left); builder->get_widget("input_level_right", input_level_right); builder->get_widget("input_level_left_label", input_level_left_label); builder->get_widget("input_level_right_label", input_level_right_label); builder->get_widget("output_level_left", output_level_left); builder->get_widget("output_level_right", output_level_right); builder->get_widget("output_level_left_label", output_level_left_label); builder->get_widget("output_level_right_label", output_level_right_label); // gsettings bindings connections.emplace_back(settings->signal_changed("state").connect( [=](auto key) { settings->set_boolean("post-messages", settings->get_boolean(key)); })); auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; auto flag_get = Gio::SettingsBindFlags::SETTINGS_BIND_GET; settings->bind("state", enable, "active", flag); settings->bind("state", controls, "sensitive", flag_get); settings->set_boolean("post-messages", settings->get_boolean("state")); } PluginUiBase::~PluginUiBase() { for (auto& c : connections) { c.disconnect(); } settings->set_boolean("post-messages", false); } auto PluginUiBase::string_to_float(const std::string& value) -> float { std::stringstream ss; ss.imbue(c_locale); float fv = 0.0F; ss << value; ss >> fv; return fv; } void PluginUiBase::on_new_input_level(const std::array& peak) { update_level(input_level_left, input_level_left_label, input_level_right, input_level_right_label, peak); } void PluginUiBase::on_new_output_level(const std::array& peak) { update_level(output_level_left, output_level_left_label, output_level_right, output_level_right_label, peak); } void PluginUiBase::on_new_input_level_db(const std::array& peak) { update_level_db(input_level_left, input_level_left_label, input_level_right, input_level_right_label, peak); } void PluginUiBase::on_new_output_level_db(const std::array& peak) { update_level_db(output_level_left, output_level_left_label, output_level_right, output_level_right_label, peak); } easyeffects-4.8.7/src/presets_manager.cpp000066400000000000000000000451561424023573300205230ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "presets_manager.hpp" #include #include #include #include #include #include "rnnoise_preset.hpp" #include "util.hpp" PresetsManager::PresetsManager() : user_presets_dir(Glib::get_user_config_dir() + "/PulseEffects"), user_input_dir(Glib::get_user_config_dir() + "/PulseEffects/input"), user_output_dir(Glib::get_user_config_dir() + "/PulseEffects/output"), autoload_dir(Glib::get_user_config_dir() + "/PulseEffects/autoload"), settings(Gio::Settings::create("com.github.wwmm.pulseeffects")), sie_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.sinkinputs")), soe_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.sourceoutputs")), limiter(std::make_unique()), bass_enhancer(std::make_unique()), compressor(std::make_unique()), crossfeed(std::make_unique()), deesser(std::make_unique()), equalizer(std::make_unique()), exciter(std::make_unique()), filter(std::make_unique()), gate(std::make_unique()), maximizer(std::make_unique()), pitch(std::make_unique()), reverb(std::make_unique()), webrtc(std::make_unique()), multiband_compressor(std::make_unique()), loudness(std::make_unique()), multiband_gate(std::make_unique()), stereo_tools(std::make_unique()), convolver(std::make_unique()), crystalizer(std::make_unique()), autogain(std::make_unique()), delay(std::make_unique()), rnnoise(std::make_unique()), spectrum(std::make_unique()) { // system presets directories provided by Glib for (const auto& scd : Glib::get_system_config_dirs()) { system_input_dir.emplace_back(scd + "/PulseEffects/input"); system_output_dir.emplace_back(scd + "/PulseEffects/output"); } // add "/etc" to system config folders array and remove duplicates system_input_dir.emplace_back("/etc/PulseEffects/input"); system_output_dir.emplace_back("/etc/PulseEffects/output"); std::sort(system_input_dir.begin(), system_input_dir.end()); std::sort(system_output_dir.begin(), system_output_dir.end()); system_input_dir.erase(std::unique(system_input_dir.begin(), system_input_dir.end()), system_input_dir.end()); system_output_dir.erase(std::unique(system_output_dir.begin(), system_output_dir.end()), system_output_dir.end()); for (const auto& scd : system_input_dir) { util::debug("presets_manager: system input presets directory: \"" + scd.string() + "\"; "); } for (const auto& scd : system_output_dir) { util::debug("presets_manager: system output presets directory: \"" + scd.string() + "\"; "); } // user presets directories create_user_directory(user_presets_dir); create_user_directory(user_input_dir); create_user_directory(user_output_dir); create_user_directory(autoload_dir); } PresetsManager::~PresetsManager() { util::debug(log_tag + "destroyed"); } void PresetsManager::create_user_directory(const boost::filesystem::path& path) { auto dir_exists = boost::filesystem::is_directory(path); if (!dir_exists) { if (boost::filesystem::create_directories(path)) { util::debug(log_tag + "user presets directory created: " + path.string()); } else { util::warning(log_tag + "failed to create user presets directory: " + path.string()); } } else { util::debug(log_tag + "user presets directory already exists: " + path.string()); } } auto PresetsManager::get_names(PresetType preset_type) -> std::vector { boost::filesystem::directory_iterator it; std::vector names; std::vector sys_dirs; // system directories search switch (preset_type) { case PresetType::output: sys_dirs.insert(sys_dirs.end(), system_output_dir.begin(), system_output_dir.end()); break; case PresetType::input: sys_dirs.insert(sys_dirs.end(), system_input_dir.begin(), system_input_dir.end()); break; } for (const auto& dir : sys_dirs) { if (boost::filesystem::exists(dir)) { it = boost::filesystem::directory_iterator{dir}; auto vn = search_names(it); names.insert(names.end(), vn.begin(), vn.end()); } } // user directory search auto& user_dir = (preset_type == PresetType::output) ? user_output_dir : user_input_dir; it = boost::filesystem::directory_iterator{user_dir}; auto vn = search_names(it); names.insert(names.end(), vn.begin(), vn.end()); // removing duplicates std::sort(names.begin(), names.end()); names.erase(std::unique(names.begin(), names.end()), names.end()); return names; } auto PresetsManager::search_names(boost::filesystem::directory_iterator& it) -> std::vector { std::vector names; try { while (it != boost::filesystem::directory_iterator{}) { if (boost::filesystem::is_regular_file(it->status())) { if (it->path().extension().string() == ".json") { names.emplace_back(it->path().stem().string()); } } it++; } } catch (std::exception& e) { } return names; } void PresetsManager::add(PresetType preset_type, const std::string& name) { for (const auto& p : get_names(preset_type)) { if (p == name) { return; } } save(preset_type, name); } void PresetsManager::save_blocklist(PresetType preset_type, boost::property_tree::ptree& root) { std::vector blocklist; boost::property_tree::ptree node_in; switch (preset_type) { case PresetType::output: { blocklist = settings->get_string_array("blocklist-out"); node_in.clear(); for (const auto& p : blocklist) { boost::property_tree::ptree node; node.put("", p); node_in.push_back(std::make_pair("", node)); } root.add_child("output.blocklist", node_in); break; } case PresetType::input: { blocklist = settings->get_string_array("blocklist-in"); node_in.clear(); for (const auto& p : blocklist) { boost::property_tree::ptree node; node.put("", p); node_in.push_back(std::make_pair("", node)); } root.add_child("input.blocklist", node_in); break; } } } void PresetsManager::load_blocklist(PresetType preset_type, const boost::property_tree::ptree& root) { std::vector blocklist; switch (preset_type) { case PresetType::output: { try { for (const auto& p : root.get_child("input.blocklist")) { blocklist.emplace_back(p.second.data()); } settings->set_string_array("blocklist-in", blocklist); } catch (const boost::property_tree::ptree_error& e) { settings->reset("blocklist-in"); } break; } case PresetType::input: { try { for (const auto& p : root.get_child("output.blocklist")) { blocklist.emplace_back(p.second.data()); } settings->set_string_array("blocklist-out", blocklist); } catch (const boost::property_tree::ptree_error& e) { settings->reset("blocklist-out"); } break; } } } void PresetsManager::save(PresetType preset_type, const std::string& name) { boost::property_tree::ptree root; boost::property_tree::ptree node_in; boost::property_tree::ptree node_out; boost::filesystem::path output_file; spectrum->write(preset_type, root); save_blocklist(preset_type, root); switch (preset_type) { case PresetType::output: { std::vector output_plugins = sie_settings->get_string_array("plugins"); for (const auto& p : output_plugins) { boost::property_tree::ptree node; node.put("", p); node_out.push_back(std::make_pair("", node)); } root.add_child("output.plugins_order", node_out); output_file = user_output_dir / boost::filesystem::path{name + ".json"}; break; } case PresetType::input: { std::vector input_plugins = soe_settings->get_string_array("plugins"); for (const auto& p : input_plugins) { boost::property_tree::ptree node; node.put("", p); node_in.push_back(std::make_pair("", node)); } root.add_child("input.plugins_order", node_in); output_file = user_input_dir / boost::filesystem::path{name + ".json"}; break; } } bass_enhancer->write(preset_type, root); compressor->write(preset_type, root); crossfeed->write(preset_type, root); deesser->write(preset_type, root); equalizer->write(preset_type, root); exciter->write(preset_type, root); filter->write(preset_type, root); gate->write(preset_type, root); limiter->write(preset_type, root); maximizer->write(preset_type, root); pitch->write(preset_type, root); reverb->write(preset_type, root); webrtc->write(preset_type, root); multiband_compressor->write(preset_type, root); loudness->write(preset_type, root); multiband_gate->write(preset_type, root); stereo_tools->write(preset_type, root); convolver->write(preset_type, root); crystalizer->write(preset_type, root); autogain->write(preset_type, root); delay->write(preset_type, root); rnnoise->write(preset_type, root); boost::property_tree::write_json(output_file.string(), root); util::debug(log_tag + "saved preset: " + output_file.string()); } void PresetsManager::remove(PresetType preset_type, const std::string& name) { boost::filesystem::path preset_file; auto& user_dir = (preset_type == PresetType::output) ? user_output_dir : user_input_dir; preset_file = user_dir / boost::filesystem::path{name + ".json"}; if (boost::filesystem::exists(preset_file)) { boost::filesystem::remove(preset_file); util::debug(log_tag + "removed preset: " + preset_file.string()); } } void PresetsManager::load(PresetType preset_type, const std::string& name) { boost::property_tree::ptree root; std::vector input_plugins; std::vector output_plugins; std::vector conf_dirs; boost::filesystem::path input_file; bool preset_found = false; switch (preset_type) { case PresetType::output: { conf_dirs.emplace_back(user_output_dir); conf_dirs.insert(conf_dirs.end(), system_output_dir.begin(), system_output_dir.end()); for (const auto& dir : conf_dirs) { input_file = dir / boost::filesystem::path{name + ".json"}; if (boost::filesystem::exists(input_file)) { preset_found = true; break; } } if (preset_found) { try { boost::property_tree::read_json(input_file.string(), root); Glib::Variant> aux; sie_settings->get_default_value("plugins", aux); for (const auto& p : root.get_child("output.plugins_order")) { const auto& value = p.second.data(); for (const auto& v : aux.get()) { if (v == value) { output_plugins.emplace_back(value); break; } } } for (const auto& v : aux.get()) { if (std::find(output_plugins.begin(), output_plugins.end(), v) == output_plugins.end()) { output_plugins.emplace_back(v); } } } catch (const boost::property_tree::ptree_error& e) { Glib::Variant> aux; sie_settings->get_default_value("plugins", aux); output_plugins = aux.get(); } sie_settings->set_string_array("plugins", output_plugins); } else { util::debug("can't found the preset " + name + " on the filesystem"); } break; } case PresetType::input: { conf_dirs.emplace_back(user_input_dir); conf_dirs.insert(conf_dirs.end(), system_input_dir.begin(), system_input_dir.end()); for (const auto& dir : conf_dirs) { input_file = dir / boost::filesystem::path{name + ".json"}; if (boost::filesystem::exists(input_file)) { preset_found = true; break; } } if (preset_found) { try { boost::property_tree::read_json(input_file.string(), root); Glib::Variant> aux; soe_settings->get_default_value("plugins", aux); for (const auto& p : root.get_child("input.plugins_order")) { const auto& value = p.second.data(); for (const auto& v : aux.get()) { if (v == value) { input_plugins.emplace_back(value); break; } } } for (const auto& v : aux.get()) { if (std::find(input_plugins.begin(), input_plugins.end(), v) == input_plugins.end()) { input_plugins.emplace_back(v); } } } catch (const boost::property_tree::ptree_error& e) { Glib::Variant> aux; soe_settings->get_default_value("plugins", aux); input_plugins = aux.get(); } soe_settings->set_string_array("plugins", input_plugins); } else { util::debug("can't found the preset " + name + " on the filesystem"); } break; } } load_blocklist(preset_type, root); spectrum->read(preset_type, root); bass_enhancer->read(preset_type, root); compressor->read(preset_type, root); crossfeed->read(preset_type, root); deesser->read(preset_type, root); equalizer->read(preset_type, root); exciter->read(preset_type, root); filter->read(preset_type, root); gate->read(preset_type, root); limiter->read(preset_type, root); maximizer->read(preset_type, root); pitch->read(preset_type, root); reverb->read(preset_type, root); webrtc->read(preset_type, root); multiband_compressor->read(preset_type, root); loudness->read(preset_type, root); multiband_gate->read(preset_type, root); stereo_tools->read(preset_type, root); convolver->read(preset_type, root); crystalizer->read(preset_type, root); autogain->read(preset_type, root); delay->read(preset_type, root); rnnoise->read(preset_type, root); util::debug(log_tag + "loaded preset: " + input_file.string()); } void PresetsManager::import(PresetType preset_type, const std::string& file_path) { boost::filesystem::path p{file_path}; if (boost::filesystem::is_regular_file(p)) { if (p.extension().string() == ".json") { boost::filesystem::path out_path; auto& user_dir = (preset_type == PresetType::output) ? user_output_dir : user_input_dir; out_path = user_dir / p.filename(); boost::filesystem::copy_file(p, out_path, boost::filesystem::copy_option::overwrite_if_exists); util::debug(log_tag + "imported preset to: " + out_path.string()); } } else { util::warning(log_tag + p.string() + " is not a file!"); } } void PresetsManager::add_autoload(const std::string& device, const std::string& name) { boost::property_tree::ptree root; boost::filesystem::path output_file; output_file = autoload_dir / boost::filesystem::path{device + ".json"}; root.put("name", name); boost::property_tree::write_json(output_file.string(), root); util::debug(log_tag + "added autoload preset file: " + output_file.string()); } void PresetsManager::remove_autoload(const std::string& device, const std::string& name) { auto input_file = autoload_dir / boost::filesystem::path{device + ".json"}; if (boost::filesystem::is_regular_file(input_file)) { boost::property_tree::ptree root; boost::property_tree::read_json(input_file.string(), root); auto current_autoload = root.get("name", ""); if (current_autoload == name) { boost::filesystem::remove(input_file); util::debug(log_tag + "removed autoload: " + input_file.string()); } } } auto PresetsManager::find_autoload(const std::string& device) -> std::string { auto input_file = autoload_dir / boost::filesystem::path{device + ".json"}; if (boost::filesystem::is_regular_file(input_file)) { boost::property_tree::ptree root; boost::property_tree::read_json(input_file.string(), root); return root.get("name", ""); } return ""; } void PresetsManager::autoload(PresetType preset_type, const std::string& device) { auto name = find_autoload(device); if (!name.empty()) { util::debug(log_tag + "autoloading preset " + name + " for device " + device); load(preset_type, name); switch (preset_type) { case PresetType::output: settings->set_string("last-used-output-preset", name); break; case PresetType::input: settings->set_string("last-used-input-preset", name); break; } } } auto PresetsManager::preset_file_exists(PresetType preset_type, const std::string& name) -> bool { boost::filesystem::path input_file; std::vector conf_dirs; switch (preset_type) { case PresetType::output: { conf_dirs.emplace_back(user_output_dir); conf_dirs.insert(conf_dirs.end(), system_output_dir.begin(), system_output_dir.end()); for (const auto& dir : conf_dirs) { input_file = dir / boost::filesystem::path{name + ".json"}; if (boost::filesystem::exists(input_file)) { return true; } } break; } case PresetType::input: { conf_dirs.emplace_back(user_input_dir); conf_dirs.insert(conf_dirs.end(), system_input_dir.begin(), system_input_dir.end()); for (const auto& dir : conf_dirs) { input_file = dir / boost::filesystem::path{name + ".json"}; if (boost::filesystem::exists(input_file)) { return true; } } break; } } return false; } easyeffects-4.8.7/src/presets_menu_ui.cpp000066400000000000000000000243551424023573300205500ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "presets_menu_ui.hpp" #include #include #include #include #include #include "preset_type.hpp" #include "util.hpp" PresetsMenuUi::PresetsMenuUi(BaseObjectType* cobject, const Glib::RefPtr& builder, Glib::RefPtr refSettings, Application* application) : Gtk::Grid(cobject), settings(std::move(refSettings)), app(application) { // loading glade widgets builder->get_widget("output_listbox", output_listbox); builder->get_widget("output_scrolled_window", output_scrolled_window); builder->get_widget("output_name", output_name); builder->get_widget("add_output", add_output); builder->get_widget("import_output", import_output); builder->get_widget("input_listbox", input_listbox); builder->get_widget("input_scrolled_window", input_scrolled_window); builder->get_widget("input_name", input_name); builder->get_widget("add_input", add_input); builder->get_widget("import_input", import_input); // signals connection output_listbox->set_sort_func(sigc::ptr_fun(&PresetsMenuUi::on_listbox_sort)); input_listbox->set_sort_func(sigc::ptr_fun(&PresetsMenuUi::on_listbox_sort)); add_output->signal_clicked().connect([=]() { create_preset(PresetType::output); }); add_input->signal_clicked().connect([=]() { create_preset(PresetType::input); }); import_output->signal_clicked().connect([=]() { import_preset(PresetType::output); }); import_input->signal_clicked().connect([=]() { import_preset(PresetType::input); }); reset_menu_button_label(); } PresetsMenuUi::~PresetsMenuUi() { for (auto& c : connections) { c.disconnect(); } util::debug(log_tag + "destroyed"); } auto PresetsMenuUi::add_to_popover(Gtk::Popover* popover, Application* app) -> PresetsMenuUi* { auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/presets_menu.glade"); auto settings = Gio::Settings::create("com.github.wwmm.pulseeffects"); PresetsMenuUi* ui = nullptr; builder->get_widget_derived("widgets_grid", ui, settings, app); popover->add(*ui); return ui; } void PresetsMenuUi::create_preset(PresetType preset_type) { std::string name = (preset_type == PresetType::output) ? output_name->get_text() : input_name->get_text(); if (!name.empty()) { std::string illegalChars = "\\/"; for (auto it = name.begin(); it < name.end(); ++it) { bool found = illegalChars.find(*it) != std::string::npos; if (found) { switch (preset_type) { case PresetType::output: output_name->set_text(""); break; case PresetType::input: input_name->set_text(""); break; } return; } } switch (preset_type) { case PresetType::output: output_name->set_text(""); break; case PresetType::input: // app->presets_manager->add(name); input_name->set_text(""); break; } app->presets_manager->add(preset_type, name); populate_listbox(preset_type); } } void PresetsMenuUi::import_preset(PresetType preset_type) { auto* main_window = dynamic_cast(this->get_toplevel()); auto dialog = Gtk::FileChooserNative::create( _("Import Presets"), *main_window, Gtk::FileChooserAction::FILE_CHOOSER_ACTION_OPEN, _("Open"), _("Cancel")); auto dialog_filter = Gtk::FileFilter::create(); dialog_filter->set_name(_("Presets")); dialog_filter->add_pattern("*.json"); dialog->add_filter(dialog_filter); dialog->signal_response().connect([=](auto response_id) { switch (response_id) { case Gtk::ResponseType::RESPONSE_ACCEPT: { for (const auto& file_path : dialog->get_filenames()) { app->presets_manager->import(preset_type, file_path); } populate_listbox(preset_type); break; } default: break; } }); dialog->set_modal(true); dialog->set_select_multiple(true); dialog->show(); } auto PresetsMenuUi::on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int { auto name1 = row1->get_name(); auto name2 = row2->get_name(); std::vector names = {name1, name2}; std::sort(names.begin(), names.end()); if (name1 == names[0]) { return -1; } if (name2 == names[0]) { return 1; } return 0; } void PresetsMenuUi::on_presets_menu_button_clicked() { auto* parent = dynamic_cast(this->get_toplevel()); const float scaling_factor = 0.7F; int height = static_cast(scaling_factor * static_cast(parent->get_allocated_height())); output_scrolled_window->set_max_content_height(height); populate_listbox(PresetType::input); populate_listbox(PresetType::output); } void PresetsMenuUi::populate_listbox(PresetType preset_type) { Gtk::ListBox* listbox = (preset_type == PresetType::output) ? output_listbox : input_listbox; auto children = listbox->get_children(); for (const auto& c : children) { listbox->remove(*c); } auto names = app->presets_manager->get_names(preset_type); for (const auto& name : names) { auto b = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/preset_row.glade"); Gtk::ListBoxRow* row = nullptr; Gtk::Button* apply_btn = nullptr; Gtk::Button* save_btn = nullptr; Gtk::Button* remove_btn = nullptr; Gtk::Label* label = nullptr; Gtk::ToggleButton* autoload_btn = nullptr; b->get_widget("preset_row", row); b->get_widget("apply", apply_btn); b->get_widget("save", save_btn); b->get_widget("remove", remove_btn); b->get_widget("name", label); b->get_widget("autoload", autoload_btn); row->set_name(name); label->set_text(name); if (is_autoloaded(preset_type, name)) { autoload_btn->set_active(true); } connections.emplace_back(apply_btn->signal_clicked().connect([=]() { switch (preset_type) { case PresetType::input: settings->set_string("last-used-input-preset", row->get_name()); break; case PresetType::output: settings->set_string("last-used-output-preset", row->get_name()); break; } app->presets_manager->load(preset_type, row->get_name()); })); connections.emplace_back( save_btn->signal_clicked().connect([=]() { app->presets_manager->save(preset_type, name); })); connections.emplace_back(autoload_btn->signal_toggled().connect([=]() { switch (preset_type) { case PresetType::output: { auto dev_name = build_device_name(preset_type, app->pm->server_info.default_sink_name); if (autoload_btn->get_active()) { app->presets_manager->add_autoload(dev_name, name); } else { app->presets_manager->remove_autoload(dev_name, name); } break; } case PresetType::input: { auto dev_name = build_device_name(preset_type, app->pm->server_info.default_source_name); if (autoload_btn->get_active()) { app->presets_manager->add_autoload(dev_name, name); } else { app->presets_manager->remove_autoload(dev_name, name); } break; } } populate_listbox(preset_type); })); connections.emplace_back(remove_btn->signal_clicked().connect([=]() { app->presets_manager->remove(preset_type, name); populate_listbox(preset_type); })); listbox->add(*row); listbox->show_all(); } } void PresetsMenuUi::reset_menu_button_label() { auto names_input = app->presets_manager->get_names(PresetType::input); auto names_output = app->presets_manager->get_names(PresetType::output); if (names_input.empty() && names_output.empty()) { settings->set_string("last-used-output-preset", _("Presets")); settings->set_string("last-used-input-preset", _("Presets")); return; } for (const auto& name : names_input) { if (name == settings->get_string("last-used-input-preset")) { return; } } for (const auto& name : names_output) { if (name == settings->get_string("last-used-output-preset")) { return; } } settings->set_string("last-used-output-preset", _("Presets")); settings->set_string("last-used-input-preset", _("Presets")); } auto PresetsMenuUi::build_device_name(PresetType preset_type, const std::string& device) -> std::string { std::string port; std::string dev_name; switch (preset_type) { case PresetType::output: { auto info = app->pm->get_sink_info(device); port = info->active_port; break; } case PresetType::input: { auto info = app->pm->get_source_info(device); port = info->active_port; break; } } if (port != "null") { dev_name = device + ":" + port; } else { dev_name = device; } return dev_name; } auto PresetsMenuUi::is_autoloaded(PresetType preset_type, const std::string& name) -> bool { std::string current_autoload; switch (preset_type) { case PresetType::output: { auto dev_name = build_device_name(preset_type, app->pm->server_info.default_sink_name); current_autoload = app->presets_manager->find_autoload(dev_name); break; } case PresetType::input: { auto dev_name = build_device_name(preset_type, app->pm->server_info.default_source_name); current_autoload = app->presets_manager->find_autoload(dev_name); break; } } return current_autoload == name; } easyeffects-4.8.7/src/pulse_info_ui.cpp000066400000000000000000000173451424023573300202030ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "pulse_info_ui.hpp" #include #include #include "util.hpp" PulseInfoUi::PulseInfoUi(BaseObjectType* cobject, const Glib::RefPtr& builder, PulseManager* pm_ptr) : Gtk::Box(cobject), pm(pm_ptr) { builder->get_widget("stack", stack); builder->get_widget("server_name", server_name); builder->get_widget("server_version", server_version); builder->get_widget("default_sink", default_sink); builder->get_widget("default_source", default_source); builder->get_widget("server_protocol", protocol); builder->get_widget("server_sample_format", server_sample_format); builder->get_widget("server_rate", server_rate); builder->get_widget("server_channels", server_channels); builder->get_widget("server_channel_mapping", server_channel_mapping); builder->get_widget("listbox_modules", listbox_modules); builder->get_widget("listbox_clients", listbox_clients); builder->get_widget("listbox_config", listbox_config); builder->get_widget("listbox_resamplers", listbox_resamplers); builder->get_widget("config_file", config_file); listbox_modules->set_sort_func(sigc::ptr_fun(&PulseInfoUi::on_listbox_sort)); listbox_clients->set_sort_func(sigc::ptr_fun(&PulseInfoUi::on_listbox_sort)); listbox_config->set_sort_func(sigc::ptr_fun(&PulseInfoUi::on_listbox_sort)); listbox_resamplers->set_sort_func(sigc::ptr_fun(&PulseInfoUi::on_listbox_sort)); stack->connect_property_changed("visible-child", sigc::mem_fun(*this, &PulseInfoUi::on_stack_visible_child_changed)); connections.emplace_back(pm->server_changed.connect([=]() { update_server_info(); })); connections.emplace_back(pm->module_info.connect([=](auto info) { auto b = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/module_info.glade"); Gtk::ListBoxRow* row; Gtk::Label* module_name; Gtk::Label* module_argument; b->get_widget("module_row", row); b->get_widget("module_name", module_name); b->get_widget("module_argument", module_argument); row->set_name(info->name); module_name->set_text(info->name); module_argument->set_text(info->argument); listbox_modules->add(*row); listbox_modules->show_all(); })); connections.emplace_back(pm->client_info.connect([=](auto info) { auto b = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/client_info.glade"); Gtk::ListBoxRow* row; Gtk::Label* client_name; Gtk::Label* client_binary; b->get_widget("client_row", row); b->get_widget("client_name", client_name); b->get_widget("client_binary", client_binary); row->set_name(info->name); client_name->set_text(info->name); client_binary->set_text(info->binary); listbox_clients->add(*row); listbox_clients->show_all(); })); update_server_info(); pm->get_modules_info(); pm->get_clients_info(); get_pulse_conf(); get_resamplers(); } PulseInfoUi::~PulseInfoUi() { for (auto& c : connections) { c.disconnect(); } util::debug(log_tag + "destroyed"); } auto PulseInfoUi::add_to_stack(Gtk::Stack* stack, PulseManager* pm) -> PulseInfoUi* { auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/pulse_info.glade"); PulseInfoUi* ui; builder->get_widget_derived("widgets_box", ui, pm); stack->add(*ui, "pulse_info"); stack->child_property_icon_name(*ui).set_value("network-server-symbolic"); return ui; } void PulseInfoUi::update_server_info() { server_name->set_text(pm->server_info.server_name); server_version->set_text(pm->server_info.server_version); default_sink->set_text(pm->server_info.default_sink_name); default_source->set_text(pm->server_info.default_source_name); protocol->set_text(pm->server_info.protocol); server_sample_format->set_text(pm->server_info.format); server_rate->set_text(std::to_string(pm->server_info.rate)); server_channels->set_text(std::to_string(pm->server_info.channels)); server_channel_mapping->set_text(pm->server_info.channel_map); } auto PulseInfoUi::on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int { auto name1 = row1->get_name(); auto name2 = row2->get_name(); std::vector names = {name1, name2}; std::sort(names.begin(), names.end()); if (name1 == names[0]) { return -1; } if (name2 == names[0]) { return 1; } return 0; } void PulseInfoUi::on_stack_visible_child_changed() { auto name = stack->get_visible_child_name(); if (name == std::string("page_server")) { update_server_info(); } else if (name == std::string("page_modules")) { auto children = listbox_modules->get_children(); for (const auto& c : children) { listbox_modules->remove(*c); } pm->get_modules_info(); } else if (name == std::string("page_clients")) { auto children = listbox_clients->get_children(); for (const auto& c : children) { listbox_clients->remove(*c); } pm->get_clients_info(); } } void PulseInfoUi::get_pulse_conf() { std::string command = "pulseaudio --dump-conf"; try { boost::process::ipstream pipe_stream; boost::process::child c(command, boost::process::std_out > pipe_stream); std::string line; while (pipe_stream && std::getline(pipe_stream, line) && !line.empty()) { std::vector aux; std::string key; std::string value; boost::split(aux, line, boost::is_any_of("=")); if (aux.size() > 1U) { auto b = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/pulse_conf_file_line.glade"); Gtk::ListBoxRow* row; Gtk::Label* conf_key; Gtk::Label* conf_value; b->get_widget("conf_row", row); b->get_widget("conf_key", conf_key); b->get_widget("conf_value", conf_value); row->set_name(aux[0]); conf_key->set_text(aux[0]); conf_value->set_text(aux[1]); listbox_config->add(*row); } else { boost::split(aux, line, boost::is_any_of(":")); if (aux.size() > 1U) { std::string tmp = aux[1]; boost::split(aux, tmp, boost::is_any_of("#")); config_file->set_text(aux[0]); } } } // c.wait(); listbox_config->show_all(); } catch (std::exception& e) { util::warning(log_tag + command + " : " + e.what()); } } void PulseInfoUi::get_resamplers() { std::string command = "pulseaudio --dump-resample-methods"; try { boost::process::ipstream pipe_stream; boost::process::child c(command, boost::process::std_out > pipe_stream); std::string line; while (pipe_stream && std::getline(pipe_stream, line) && !line.empty()) { auto row = Gtk::manage(new Gtk::ListBoxRow()); auto label = Gtk::manage(new Gtk::Label()); row->set_name(line); label->set_text(line); label->set_halign(Gtk::Align::ALIGN_START); row->add(*label); listbox_resamplers->add(*row); } listbox_resamplers->show_all(); } catch (std::exception& e) { util::warning(log_tag + command + " : " + e.what()); } } easyeffects-4.8.7/src/pulse_manager.cpp000066400000000000000000001321471424023573300201630ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "pulse_manager.hpp" #include #include #include "util.hpp" PulseManager::PulseManager() : main_loop(pa_threaded_mainloop_new()), main_loop_api(pa_threaded_mainloop_get_api(main_loop)) { pa_threaded_mainloop_lock(main_loop); pa_threaded_mainloop_start(main_loop); context = pa_context_new(main_loop_api, "PulseEffects"); pa_context_set_state_callback(context, &PulseManager::context_state_cb, this); pa_context_connect(context, nullptr, PA_CONTEXT_NOFAIL, nullptr); pa_threaded_mainloop_wait(main_loop); pa_threaded_mainloop_unlock(main_loop); if (context_ready) { get_server_info(); load_apps_sink(); load_mic_sink(); subscribe_to_events(); } else { util::error(log_tag + "context initialization failed"); } } PulseManager::~PulseManager() { unload_sinks(); drain_context(); pa_threaded_mainloop_lock(main_loop); util::debug(log_tag + "disconnecting Pulseaudio context..."); pa_context_disconnect(context); util::debug(log_tag + "Pulseaudio context was disconnected"); util::debug(log_tag + "unreferencing Pulseaudio context"); pa_context_unref(context); pa_threaded_mainloop_unlock(main_loop); util::debug(log_tag + "stopping pulseaudio threaded main loop"); pa_threaded_mainloop_stop(main_loop); util::debug(log_tag + "freeing Pulseaudio threaded main loop"); pa_threaded_mainloop_free(main_loop); } void PulseManager::context_state_cb(pa_context* ctx, void* data) { auto* pm = static_cast(data); auto state = pa_context_get_state(ctx); switch (state) { case PA_CONTEXT_UNCONNECTED: util::debug(pm->log_tag + "context is unconnected"); break; case PA_CONTEXT_CONNECTING: util::debug(pm->log_tag + "context is connecting"); break; case PA_CONTEXT_AUTHORIZING: util::debug(pm->log_tag + "context is authorizing"); break; case PA_CONTEXT_SETTING_NAME: util::debug(pm->log_tag + "context is setting name"); break; case PA_CONTEXT_READY: { util::debug(pm->log_tag + "context is ready"); util::debug(pm->log_tag + "connected to: " + pa_context_get_server(ctx)); auto protocol = std::to_string(pa_context_get_protocol_version(ctx)); pm->server_info.protocol = protocol; util::debug(pm->log_tag + "protocol version: " + protocol); pm->context_ready = true; pa_threaded_mainloop_signal(pm->main_loop, 0); break; } case PA_CONTEXT_FAILED: { util::debug(pm->log_tag + "failed to connect context"); pm->context_ready = false; pa_threaded_mainloop_signal(pm->main_loop, 0); break; } case PA_CONTEXT_TERMINATED: { util::debug(pm->log_tag + "context was terminated"); pm->context_ready = false; pa_threaded_mainloop_signal(pm->main_loop, 0); break; } default: break; } } void PulseManager::subscribe_to_events() { pa_context_set_subscribe_callback( context, [](auto c, auto t, auto idx, auto d) { auto f = t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK; auto* pm = static_cast(d); switch (f) { case PA_SUBSCRIPTION_EVENT_SINK_INPUT: { auto e = t & PA_SUBSCRIPTION_EVENT_TYPE_MASK; switch (e) { case PA_SUBSCRIPTION_EVENT_NEW: pa_context_get_sink_input_info( c, idx, [](auto cx, auto info, auto eol, auto d) { if (info != nullptr) { auto* pm = static_cast(d); pm->new_app(info); } }, pm); break; case PA_SUBSCRIPTION_EVENT_CHANGE: pa_context_get_sink_input_info( c, idx, [](auto cx, auto info, auto eol, auto d) { if (info != nullptr) { auto* pm = static_cast(d); pm->changed_app(info); } }, pm); break; case PA_SUBSCRIPTION_EVENT_REMOVE: Glib::signal_idle().connect_once([pm, idx]() { pm->sink_input_removed.emit(idx); }); } break; } case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT: { auto e = t & PA_SUBSCRIPTION_EVENT_TYPE_MASK; switch (e) { case PA_SUBSCRIPTION_EVENT_NEW: pa_context_get_source_output_info( c, idx, [](auto cx, auto info, auto eol, auto d) { if (info != nullptr) { auto* pm = static_cast(d); pm->new_app(info); } }, pm); break; case PA_SUBSCRIPTION_EVENT_CHANGE: pa_context_get_source_output_info( c, idx, [](auto cx, auto info, auto eol, auto d) { if (info != nullptr) { auto* pm = static_cast(d); pm->changed_app(info); } }, pm); break; case PA_SUBSCRIPTION_EVENT_REMOVE: Glib::signal_idle().connect_once([pm, idx]() { pm->source_output_removed.emit(idx); }); } break; } case PA_SUBSCRIPTION_EVENT_SOURCE: { auto e = t & PA_SUBSCRIPTION_EVENT_TYPE_MASK; switch (e) { case PA_SUBSCRIPTION_EVENT_NEW: pa_context_get_source_info_by_index( c, idx, [](auto cx, auto info, auto eol, auto d) { if (info != nullptr) { std::string s1 = "PulseEffects_apps.monitor"; std::string s2 = "PulseEffects_mic.monitor"; if (info->name != s1 && info->name != s2) { auto* pm = static_cast(d); auto si = std::make_shared(); si->name = info->name; si->index = info->index; si->description = info->description; si->rate = info->sample_spec.rate; si->format = pa_sample_format_to_string(info->sample_spec.format); if (info->active_port != nullptr) { si->active_port = info->active_port->name; } else { si->active_port = "null"; } Glib::signal_idle().connect_once([pm, si = move(si)] { pm->source_added.emit(si); }); } } }, pm); break; case PA_SUBSCRIPTION_EVENT_CHANGE: pa_context_get_source_info_by_index( c, idx, [](auto cx, auto info, auto eol, auto d) { if (info != nullptr) { auto* pm = static_cast(d); auto si = std::make_shared(); si->name = info->name; si->index = info->index; si->description = info->description; si->rate = info->sample_spec.rate; si->format = pa_sample_format_to_string(info->sample_spec.format); if (info->active_port != nullptr) { si->active_port = info->active_port->name; } else { si->active_port = "null"; } if (si->name == "PulseEffects_mic.monitor") { pm->mic_sink_info->rate = si->rate; pm->mic_sink_info->format = si->format; } Glib::signal_idle().connect_once([pm, si = move(si)] { pm->source_changed.emit(si); }); } }, pm); break; case PA_SUBSCRIPTION_EVENT_REMOVE: Glib::signal_idle().connect_once([pm, idx]() { pm->source_removed.emit(idx); }); } break; } case PA_SUBSCRIPTION_EVENT_SINK: { auto e = t & PA_SUBSCRIPTION_EVENT_TYPE_MASK; switch (e) { case PA_SUBSCRIPTION_EVENT_NEW: pa_context_get_sink_info_by_index( c, idx, [](auto cx, auto info, auto eol, auto d) { if (info != nullptr) { std::string s1 = "PulseEffects_apps"; std::string s2 = "PulseEffects_mic"; if (info->name != s1 && info->name != s2) { auto* pm = static_cast(d); auto si = std::make_shared(); si->name = info->name; si->index = info->index; si->description = info->description; si->rate = info->sample_spec.rate; si->format = pa_sample_format_to_string(info->sample_spec.format); if (info->active_port != nullptr) { si->active_port = info->active_port->name; } else { si->active_port = "null"; } Glib::signal_idle().connect_once([pm, si = move(si)] { pm->sink_added.emit(si); }); } } }, pm); break; case PA_SUBSCRIPTION_EVENT_CHANGE: pa_context_get_sink_info_by_index( c, idx, [](auto cx, auto info, auto eol, auto d) { if (info != nullptr) { auto* pm = static_cast(d); auto si = std::make_shared(); si->name = info->name; si->index = info->index; si->description = info->description; si->rate = info->sample_spec.rate; si->format = pa_sample_format_to_string(info->sample_spec.format); if (info->active_port != nullptr) { si->active_port = info->active_port->name; } else { si->active_port = "null"; } if (si->name == "PulseEffects_apps") { pm->apps_sink_info->rate = si->rate; pm->apps_sink_info->format = si->format; } Glib::signal_idle().connect_once([pm, si = move(si)] { pm->sink_changed.emit(si); }); } }, pm); break; case PA_SUBSCRIPTION_EVENT_REMOVE: Glib::signal_idle().connect_once([pm, idx]() { pm->sink_removed.emit(idx); }); } break; } case PA_SUBSCRIPTION_EVENT_SERVER: { auto e = t & PA_SUBSCRIPTION_EVENT_TYPE_MASK; if (e == PA_SUBSCRIPTION_EVENT_CHANGE) { pa_context_get_server_info( c, [](auto cx, auto info, auto d) { if (info != nullptr) { auto* pm = static_cast(d); pm->update_server_info(info); std::string sink = info->default_sink_name; std::string source = info->default_source_name; if (sink != std::string("PulseEffects_apps")) { Glib::signal_idle().connect_once([pm, sink]() { pm->new_default_sink.emit(sink); }); } if (source != std::string("PulseEffects_mic.monitor")) { Glib::signal_idle().connect_once([pm, source]() { pm->new_default_source.emit(source); }); } Glib::signal_idle().connect_once([pm]() { pm->server_changed.emit(); }); } }, pm); } } } }, this); auto mask = static_cast(PA_SUBSCRIPTION_MASK_SINK_INPUT | PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT | PA_SUBSCRIPTION_MASK_SOURCE | PA_SUBSCRIPTION_MASK_SINK | PA_SUBSCRIPTION_MASK_SERVER); pa_context_subscribe( context, mask, [](auto c, auto success, auto d) { auto* pm = static_cast(d); if (success == 0) { util::critical(pm->log_tag + "context event subscribe failed!"); } }, this); } void PulseManager::update_server_info(const pa_server_info* info) { server_info.server_name = info->server_name; server_info.server_version = info->server_version; server_info.default_sink_name = info->default_sink_name; server_info.default_source_name = info->default_source_name; server_info.format = pa_sample_format_to_string(info->sample_spec.format); server_info.rate = info->sample_spec.rate; server_info.channels = info->sample_spec.channels; if (pa_channel_map_to_pretty_name(&info->channel_map) != nullptr) { server_info.channel_map = pa_channel_map_to_pretty_name(&info->channel_map); } else { server_info.channel_map = "unknown"; } } void PulseManager::get_server_info() { pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_get_server_info( context, [](auto c, auto info, auto d) { auto* pm = static_cast(d); if (info != nullptr) { pm->update_server_info(info); util::debug(pm->log_tag + "Pulseaudio version: " + info->server_version); util::debug(pm->log_tag + "default pulseaudio source: " + info->default_source_name); util::debug(pm->log_tag + "default pulseaudio sink: " + info->default_sink_name); } pa_threaded_mainloop_signal(pm->main_loop, false); }, this); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } else { util::critical(log_tag + " failed to get server info"); } pa_threaded_mainloop_unlock(main_loop); } auto PulseManager::get_sink_info(const std::string& name) -> std::shared_ptr { auto si = std::make_shared(); struct Data { bool failed; PulseManager* pm; std::shared_ptr si; }; Data data = {false, this, si}; pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_get_sink_info_by_name( context, name.c_str(), [](auto c, auto info, auto eol, auto data) { auto* d = static_cast(data); if (eol < 0) { d->failed = true; pa_threaded_mainloop_signal(d->pm->main_loop, false); } else if (eol > 0) { pa_threaded_mainloop_signal(d->pm->main_loop, false); } else if (info != nullptr) { d->si->name = info->name; d->si->index = info->index; d->si->description = info->description; d->si->owner_module = info->owner_module; d->si->monitor_source = info->monitor_source; d->si->monitor_source_name = info->monitor_source_name; d->si->rate = info->sample_spec.rate; d->si->format = pa_sample_format_to_string(info->sample_spec.format); if (info->active_port != nullptr) { d->si->active_port = info->active_port->name; } else { d->si->active_port = "null"; } } }, &data); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } else { util::critical(log_tag + " failed to get sink info: " + name); } pa_threaded_mainloop_unlock(main_loop); if (!data.failed) { return si; } util::debug(log_tag + " failed to get sink info: " + name); return nullptr; } auto PulseManager::get_source_info(const std::string& name) -> std::shared_ptr { auto si = std::make_shared(); struct Data { bool failed; PulseManager* pm; std::shared_ptr si; }; Data data = {false, this, si}; pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_get_source_info_by_name( context, name.c_str(), [](auto c, auto info, auto eol, auto data) { auto* d = static_cast(data); if (eol < 0) { d->failed = true; pa_threaded_mainloop_signal(d->pm->main_loop, false); } else if (eol > 0) { pa_threaded_mainloop_signal(d->pm->main_loop, false); } else if (info != nullptr) { d->si->name = info->name; d->si->index = info->index; d->si->description = info->description; d->si->rate = info->sample_spec.rate; d->si->format = pa_sample_format_to_string(info->sample_spec.format); if (info->active_port != nullptr) { d->si->active_port = info->active_port->name; } else { d->si->active_port = "null"; } } }, &data); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } else { util::critical(log_tag + " failed to get source info:" + name); } pa_threaded_mainloop_unlock(main_loop); if (!data.failed) { return si; } util::debug(log_tag + " failed to get source info:" + name); return nullptr; } auto PulseManager::get_default_sink_info() -> std::shared_ptr { auto info = get_sink_info(server_info.default_sink_name); if (info != nullptr) { util::debug(log_tag + "default pulseaudio sink sampling rate: " + std::to_string(info->rate) + " Hz"); util::debug(log_tag + "default pulseaudio sink audio format: " + info->format); return info; } util::critical(log_tag + "could not get default sink info"); return nullptr; } auto PulseManager::get_default_source_info() -> std::shared_ptr { auto info = get_source_info(server_info.default_source_name); if (info != nullptr) { util::debug(log_tag + "default pulseaudio source sampling rate: " + std::to_string(info->rate) + " Hz"); util::debug(log_tag + "default pulseaudio source audio format: " + info->format); return info; } util::critical(log_tag + "could not get default source info"); return nullptr; } auto PulseManager::load_module(const std::string& name, const std::string& argument) -> bool { struct Data { bool status; PulseManager* pm; }; Data data = {false, this}; pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_load_module( context, name.c_str(), argument.c_str(), [](auto c, auto idx, auto data) { auto* d = static_cast(data); d->status = idx != PA_INVALID_INDEX; pa_threaded_mainloop_signal(d->pm->main_loop, false); }, &data); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } pa_threaded_mainloop_unlock(main_loop); return data.status; } auto PulseManager::load_sink(const std::string& name, const std::string& description, uint rate) -> std::shared_ptr { auto si = get_sink_info(name); if (si == nullptr) { // sink is not loaded std::string argument = "sink_name=" + name + " " + "sink_properties=" + description + "device.class=\"sound\"" + " " + "norewinds=1"; bool ok = load_module("module-null-sink", argument); if (ok) { util::debug(log_tag + "loaded module-null-sink: " + argument); set_sink_volume_by_name(name, 2, 100); si = get_sink_info(name); } else { util::warning( log_tag + "Pulseaudio " + server_info.server_version + " does not support norewinds. Loading the sink the old way. Changing apps volume will cause cracklings"); argument = "sink_name=" + name + " " + "sink_properties=" + description + "device.class=\"sound\"" + " " + "channels=2" + " " + "rate=" + std::to_string(rate); ok = load_module("module-null-sink", argument); if (ok) { util::debug(log_tag + "loaded module-null-sink: " + argument); set_sink_volume_by_name(name, 2, 100); si = get_sink_info(name); } else { util::critical(log_tag + "failed to load module-null-sink with argument: " + argument); } } } return si; } void PulseManager::load_apps_sink() { util::debug(log_tag + "loading Pulseeffects applications output sink..."); auto info = get_default_sink_info(); if (info != nullptr) { std::string name = "PulseEffects_apps"; std::string description = "device.description=\"PulseEffects(apps)\""; auto rate = info->rate; apps_sink_info = load_sink(name, description, rate); } } void PulseManager::load_mic_sink() { util::debug(log_tag + "loading Pulseeffects microphone output sink..."); auto info = get_default_source_info(); if (info != nullptr) { std::string name = "PulseEffects_mic"; std::string description = "device.description=\"PulseEffects(mic)\""; auto rate = info->rate; mic_sink_info = load_sink(name, description, rate); } } void PulseManager::find_sink_inputs() { pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_get_sink_input_info_list( context, [](auto c, auto info, auto eol, auto d) { auto* pm = static_cast(d); if (info != nullptr) { pm->new_app(info); } else { pa_threaded_mainloop_signal(pm->main_loop, false); } }, this); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } else { util::warning(log_tag + " failed to find sink inputs"); } pa_threaded_mainloop_unlock(main_loop); } void PulseManager::find_source_outputs() { pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_get_source_output_info_list( context, [](auto c, auto info, auto eol, auto d) { auto* pm = static_cast(d); if (info != nullptr) { pm->new_app(info); } else { pa_threaded_mainloop_signal(pm->main_loop, false); } }, this); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } else { util::warning(log_tag + " failed to find source outputs"); } pa_threaded_mainloop_unlock(main_loop); } void PulseManager::find_sinks() { pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_get_sink_info_list( context, [](auto c, auto info, auto eol, auto d) { auto* pm = static_cast(d); if (info != nullptr) { std::string s1 = "PulseEffects_apps"; std::string s2 = "PulseEffects_mic"; if (info->name != s1 && info->name != s2) { auto si = std::make_shared(); si->name = info->name; si->index = info->index; si->description = info->description; si->rate = info->sample_spec.rate; si->format = pa_sample_format_to_string(info->sample_spec.format); Glib::signal_idle().connect_once([pm, si = move(si)] { pm->sink_added.emit(si); }); } } else { pa_threaded_mainloop_signal(pm->main_loop, false); } }, this); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } else { util::warning(log_tag + " failed to find sinks"); } pa_threaded_mainloop_unlock(main_loop); } void PulseManager::find_sources() { pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_get_source_info_list( context, [](auto c, auto info, auto eol, auto d) { auto* pm = static_cast(d); if (info != nullptr) { std::string s1 = "PulseEffects_apps.monitor"; std::string s2 = "PulseEffects_mic.monitor"; if (info->name != s1 && info->name != s2) { auto si = std::make_shared(); si->name = info->name; si->index = info->index; si->description = info->description; si->rate = info->sample_spec.rate; si->format = pa_sample_format_to_string(info->sample_spec.format); Glib::signal_idle().connect_once([pm, si = move(si)] { pm->source_added.emit(si); }); } } else { pa_threaded_mainloop_signal(pm->main_loop, false); } }, this); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } else { util::warning(log_tag + " failed to find sources"); } pa_threaded_mainloop_unlock(main_loop); } auto PulseManager::move_sink_input_to_pulseeffects(const std::string& name, uint idx) -> bool { struct Data { std::string name; uint idx; PulseManager* pm; }; Data data = {name, idx, this}; bool added_successfully = false; pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_move_sink_input_by_index( context, idx, apps_sink_info->index, [](auto c, auto success, auto data) { auto* d = static_cast(data); if (success) { util::debug(d->pm->log_tag + "sink input: " + d->name + ", idx = " + std::to_string(d->idx) + " moved to PE"); } else { util::critical(d->pm->log_tag + "failed to move sink input: " + d->name + ", idx = " + std::to_string(d->idx) + " to PE"); } pa_threaded_mainloop_signal(d->pm->main_loop, false); }, &data); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); added_successfully = true; } else { util::critical(log_tag + "failed to move sink input: " + name + ", idx = " + std::to_string(idx) + " to PE"); } pa_threaded_mainloop_unlock(main_loop); return added_successfully; } auto PulseManager::remove_sink_input_from_pulseeffects(const std::string& name, uint idx) -> bool { struct Data { std::string name; uint idx; PulseManager* pm; }; Data data = {name, idx, this}; bool removed_successfully = false; pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_move_sink_input_by_name( context, idx, server_info.default_sink_name.c_str(), [](auto c, auto success, auto data) { auto* d = static_cast(data); if (success) { util::debug(d->pm->log_tag + "sink input: " + d->name + ", idx = " + std::to_string(d->idx) + " removed from PE"); } else { util::critical(d->pm->log_tag + "failed to remove sink input: " + d->name + ", idx = " + std::to_string(d->idx) + " from PE"); } pa_threaded_mainloop_signal(d->pm->main_loop, false); }, &data); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); removed_successfully = true; } else { util::critical(log_tag + "failed to remove sink input: " + name + ", idx = " + std::to_string(idx) + " from PE"); } pa_threaded_mainloop_unlock(main_loop); return removed_successfully; } auto PulseManager::move_source_output_to_pulseeffects(const std::string& name, uint idx) -> bool { struct Data { std::string name; uint idx; PulseManager* pm; }; Data data = {name, idx, this}; bool added_successfully = false; pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_move_source_output_by_index( context, idx, mic_sink_info->monitor_source, [](auto c, auto success, auto data) { auto* d = static_cast(data); if (success) { util::debug(d->pm->log_tag + "source output: " + d->name + ", idx = " + std::to_string(d->idx) + " moved to PE"); } else { util::critical(d->pm->log_tag + "failed to move source output " + d->name + ", idx = " + " to PE"); } pa_threaded_mainloop_signal(d->pm->main_loop, false); }, &data); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); added_successfully = true; } else { util::critical(log_tag + "failed to move source output: " + name + ", idx = " + std::to_string(idx) + " to PE"); } pa_threaded_mainloop_unlock(main_loop); return added_successfully; } auto PulseManager::remove_source_output_from_pulseeffects(const std::string& name, uint idx) -> bool { struct Data { std::string name; uint idx; PulseManager* pm; }; Data data = {name, idx, this}; bool removed_successfully = false; pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_move_source_output_by_name( context, idx, server_info.default_source_name.c_str(), [](auto c, auto success, auto data) { auto* d = static_cast(data); if (success) { util::debug(d->pm->log_tag + "source output: " + d->name + ", idx = " + " removed from PE"); } else { util::critical(d->pm->log_tag + "failed to remove source output: " + d->name + ", idx = " + " from PE"); } pa_threaded_mainloop_signal(d->pm->main_loop, false); }, &data); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); removed_successfully = true; } else { util::critical(log_tag + "failed to remove source output: " + name + ", idx = " + std::to_string(idx) + " from PE"); } pa_threaded_mainloop_unlock(main_loop); return removed_successfully; } void PulseManager::set_sink_input_volume(const std::string& name, uint idx, uint8_t channels, uint value) { pa_volume_t raw_value = PA_VOLUME_NORM * value / 100.0; auto cvol = pa_cvolume(); auto* cvol_ptr = pa_cvolume_set(&cvol, channels, raw_value); if (cvol_ptr != nullptr) { struct Data { std::string name; uint idx; PulseManager* pm; }; Data data = {name, idx, this}; pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_set_sink_input_volume( context, idx, cvol_ptr, [](auto c, auto success, auto data) { auto* d = static_cast(data); if (success) { util::debug(d->pm->log_tag + "changed volume of sink input: " + d->name + ", idx = " + std::to_string(d->idx)); } else { util::critical(d->pm->log_tag + "failed to change volume of sink input: " + d->name + ", idx = " + std::to_string(d->idx)); } pa_threaded_mainloop_signal(d->pm->main_loop, false); }, &data); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); pa_threaded_mainloop_unlock(main_loop); } else { util::warning(log_tag + "failed to change volume of sink input: " + name + ", idx = " + std::to_string(idx)); pa_threaded_mainloop_unlock(main_loop); } } } void PulseManager::set_sink_input_mute(const std::string& name, uint idx, bool state) { struct Data { std::string name; uint idx; PulseManager* pm; }; Data data = {name, idx, this}; pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_set_sink_input_mute( context, idx, static_cast(state), [](auto c, auto success, auto data) { auto* d = static_cast(data); if (success) { util::debug(d->pm->log_tag + "sink input: " + d->name + ", idx = " + std::to_string(d->idx) + " is muted"); } else { util::critical(d->pm->log_tag + "failed to mute sink input: " + d->name + ", idx = " + std::to_string(d->idx)); } pa_threaded_mainloop_signal(d->pm->main_loop, false); }, &data); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } else { util::warning(log_tag + "failed to mute set sink input: " + name + ", idx = " + std::to_string(idx) + " to PE"); } pa_threaded_mainloop_unlock(main_loop); } void PulseManager::set_source_output_volume(const std::string& name, uint idx, uint8_t channels, uint value) { pa_volume_t raw_value = PA_VOLUME_NORM * value / 100.0; auto cvol = pa_cvolume(); auto* cvol_ptr = pa_cvolume_set(&cvol, channels, raw_value); if (cvol_ptr != nullptr) { struct Data { std::string name; uint idx; PulseManager* pm; }; Data data = {name, idx, this}; pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_set_source_output_volume( context, idx, cvol_ptr, [](auto c, auto success, auto data) { auto* d = static_cast(data); if (success) { util::debug(d->pm->log_tag + "changed volume of source output: " + d->name + ", idx = " + std::to_string(d->idx)); } else { util::debug(d->pm->log_tag + "failed to change volume of source output: " + d->name + ", idx = " + std::to_string(d->idx)); } pa_threaded_mainloop_signal(d->pm->main_loop, false); }, &data); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); pa_threaded_mainloop_unlock(main_loop); } else { util::warning(log_tag + "failed to change volume of source output: " + name + ", idx = " + std::to_string(idx)); pa_threaded_mainloop_unlock(main_loop); } } } void PulseManager::set_sink_volume_by_name(const std::string& name, uint8_t channels, uint value) { pa_volume_t raw_value = PA_VOLUME_NORM * value / 100.0; auto cvol = pa_cvolume(); auto* cvol_ptr = pa_cvolume_set(&cvol, channels, raw_value); if (cvol_ptr != nullptr) { struct Data { std::string name; PulseManager* pm; }; Data data = {name, this}; pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_set_sink_volume_by_name( context, name.c_str(), cvol_ptr, [](auto c, auto success, auto data) { auto* d = static_cast(data); if (success) { util::debug(d->pm->log_tag + "changed volume of the sink: " + d->name); } else { util::debug(d->pm->log_tag + "failed to change volume of the sink: " + d->name); } pa_threaded_mainloop_signal(d->pm->main_loop, false); }, &data); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); pa_threaded_mainloop_unlock(main_loop); } else { util::warning(log_tag + "failed to change volume of the sink: " + name); pa_threaded_mainloop_unlock(main_loop); } } } void PulseManager::set_source_output_mute(const std::string& name, uint idx, bool state) { struct Data { std::string name; uint idx; PulseManager* pm; }; Data data = {name, idx, this}; pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_set_source_output_mute( context, idx, static_cast(state), [](auto c, auto success, auto data) { auto* d = static_cast(data); if (success) { util::debug(d->pm->log_tag + "source output: " + d->name + ", idx = " + std::to_string(d->idx) + " is muted"); } else { util::critical(d->pm->log_tag + "failed to mute source output: " + d->name + ", idx = " + std::to_string(d->idx)); } pa_threaded_mainloop_signal(d->pm->main_loop, false); }, &data); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } else { util::warning(log_tag + "failed to mute source output: " + name + ", idx = " + std::to_string(idx) + " to PE"); } pa_threaded_mainloop_unlock(main_loop); } void PulseManager::get_sink_input_info(uint idx) { pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_get_sink_input_info( context, idx, [](auto c, auto info, auto eol, auto d) { auto* pm = static_cast(d); if (info != nullptr) { pm->changed_app(info); } else { pa_threaded_mainloop_signal(pm->main_loop, false); } }, this); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } else { util::critical(log_tag + "failed to get sink input info: " + std::to_string(idx)); } pa_threaded_mainloop_unlock(main_loop); } void PulseManager::get_modules_info() { pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_get_module_info_list( context, [](auto c, auto info, auto eol, auto d) { auto* pm = static_cast(d); if (info != nullptr) { auto mi = std::make_shared(); if (info->name) { mi->name = info->name; mi->index = info->index; if (info->argument) { mi->argument = info->argument; } else { mi->argument = ""; } Glib::signal_idle().connect_once([pm, mi = move(mi)] { pm->module_info.emit(mi); }); } } else { pa_threaded_mainloop_signal(pm->main_loop, false); } }, this); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } else { util::critical(log_tag + "failed to get modules info"); } pa_threaded_mainloop_unlock(main_loop); } void PulseManager::get_clients_info() { pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_get_client_info_list( context, [](auto c, auto info, auto eol, auto d) { auto* pm = static_cast(d); if (info != nullptr) { auto mi = std::make_shared(); if (info->name) { mi->name = info->name; mi->index = info->index; if (pa_proplist_contains(info->proplist, "application.process.binary") == 1) { mi->binary = pa_proplist_gets(info->proplist, "application.process.binary"); } else { mi->binary = ""; } Glib::signal_idle().connect_once([pm, mi = move(mi)] { pm->client_info.emit(mi); }); } } else { pa_threaded_mainloop_signal(pm->main_loop, false); } }, this); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } else { util::critical(log_tag + "failed to get clients info"); } pa_threaded_mainloop_unlock(main_loop); } void PulseManager::unload_module(uint idx) { struct Data { uint idx; PulseManager* pm; }; Data data = {idx, this}; pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_unload_module( context, idx, [](auto c, auto success, auto data) { auto* d = static_cast(data); if (success) { util::debug(d->pm->log_tag + "module " + std::to_string(d->idx) + " unloaded"); } else { util::critical(d->pm->log_tag + "failed to unload module " + std::to_string(d->idx)); } pa_threaded_mainloop_signal(d->pm->main_loop, false); }, &data); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); } else { util::critical(log_tag + "failed to unload module: " + std::to_string(idx)); } pa_threaded_mainloop_unlock(main_loop); } void PulseManager::unload_sinks() { util::debug(log_tag + "unloading PulseEffects sinks..."); unload_module(apps_sink_info->owner_module); unload_module(mic_sink_info->owner_module); } void PulseManager::drain_context() { pa_threaded_mainloop_lock(main_loop); auto* o = pa_context_drain( context, [](auto c, auto d) { auto* pm = static_cast(d); if (pa_context_get_state(c) == PA_CONTEXT_READY) { pa_threaded_mainloop_signal(pm->main_loop, false); } }, this); if (o != nullptr) { while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(main_loop); } pa_operation_unref(o); pa_threaded_mainloop_unlock(main_loop); util::debug(log_tag + "Context was drained"); } else { pa_threaded_mainloop_unlock(main_loop); util::debug(log_tag + "Context did not need draining"); } } void PulseManager::new_app(const pa_sink_input_info* info) { auto app_info = parse_app_info(info); if (app_info != nullptr) { app_info->app_type = "sink_input"; Glib::signal_idle().connect_once([&, app_info = move(app_info)]() { sink_input_added.emit(app_info); }); } } void PulseManager::new_app(const pa_source_output_info* info) { auto app_info = parse_app_info(info); if (app_info != nullptr) { app_info->app_type = "source_output"; Glib::signal_idle().connect_once([&, app_info = move(app_info)]() { source_output_added.emit(app_info); }); } } void PulseManager::changed_app(const pa_sink_input_info* info) { auto app_info = parse_app_info(info); if (app_info != nullptr) { // checking if the user blocklisted this app auto forbidden_app = std::find(std::begin(blocklist_out), std::end(blocklist_out), app_info->name) != std::end(blocklist_out); if (!forbidden_app) { app_info->app_type = "sink_input"; Glib::signal_idle().connect_once([&, app_info = move(app_info)]() { sink_input_changed.emit(app_info); }); } } } void PulseManager::changed_app(const pa_source_output_info* info) { auto app_info = parse_app_info(info); if (app_info != nullptr) { // checking if the user blocklisted this app auto forbidden_app = std::find(std::begin(blocklist_in), std::end(blocklist_in), app_info->name) != std::end(blocklist_in); if (!forbidden_app) { app_info->app_type = "source_output"; Glib::signal_idle().connect_once([&, app_info = move(app_info)]() { source_output_changed.emit(app_info); }); } } } void PulseManager::print_app_info(const std::shared_ptr& info) { std::cout << "index: " << info->index << std::endl; std::cout << "name: " << info->name << std::endl; std::cout << "icon name: " << info->icon_name << std::endl; std::cout << "channels: " << info->channels << std::endl; std::cout << "volume: " << info->volume << std::endl; std::cout << "rate: " << info->rate << std::endl; std::cout << "resampler: " << info->resampler << std::endl; std::cout << "format: " << info->format << std::endl; std::cout << "wants to play: " << info->wants_to_play << std::endl; } auto PulseManager::app_is_connected(const pa_sink_input_info* info) -> bool { return info->sink == apps_sink_info->index; } auto PulseManager::app_is_connected(const pa_source_output_info* info) -> bool { return info->source == mic_sink_info->monitor_source; } easyeffects-4.8.7/src/pulse_settings_ui.cpp000066400000000000000000000253401424023573300211020ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "pulse_settings_ui.hpp" #include #include "util.hpp" namespace { auto blocksize_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "64") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "128") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "256") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "512") == 0) { g_value_set_int(value, 3); } else if (std::strcmp(v, "1024") == 0) { g_value_set_int(value, 4); } else if (std::strcmp(v, "2048") == 0) { g_value_set_int(value, 5); } else if (std::strcmp(v, "4096") == 0) { g_value_set_int(value, 6); } return 1; } auto int_to_blocksize_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("64"); case 1: return g_variant_new_string("128"); case 2: return g_variant_new_string("256"); case 3: return g_variant_new_string("512"); case 4: return g_variant_new_string("1024"); case 5: return g_variant_new_string("2048"); case 6: return g_variant_new_string("4096"); default: return g_variant_new_string("512"); } } } // namespace PulseSettingsUi::PulseSettingsUi(BaseObjectType* cobject, const Glib::RefPtr& builder, Application* application) : Gtk::Grid(cobject), settings(Gio::Settings::create("com.github.wwmm.pulseeffects")), sie_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.sinkinputs")), soe_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.sourceoutputs")), app(application) { // loading glade widgets builder->get_widget("use_default_sink", use_default_sink); builder->get_widget("use_default_source", use_default_source); builder->get_widget("input_device", input_device); builder->get_widget("output_device", output_device); builder->get_widget("blocksize_in", blocksize_in); builder->get_widget("blocksize_out", blocksize_out); get_object(builder, "sie_input_buffer", sie_input_buffer); get_object(builder, "sie_input_latency", sie_input_latency); get_object(builder, "sie_output_buffer", sie_output_buffer); get_object(builder, "sie_output_latency", sie_output_latency); get_object(builder, "soe_input_buffer", soe_input_buffer); get_object(builder, "soe_input_latency", soe_input_latency); get_object(builder, "soe_output_buffer", soe_output_buffer); get_object(builder, "soe_output_latency", soe_output_latency); get_object(builder, "sink_list", sink_list); get_object(builder, "source_list", source_list); // signals connection use_default_sink->signal_toggled().connect(sigc::mem_fun(*this, &PulseSettingsUi::on_use_default_sink_toggled)); use_default_source->signal_toggled().connect(sigc::mem_fun(*this, &PulseSettingsUi::on_use_default_source_toggled)); connections.emplace_back( input_device->signal_changed().connect(sigc::mem_fun(*this, &PulseSettingsUi::on_input_device_changed))); connections.emplace_back( output_device->signal_changed().connect(sigc::mem_fun(*this, &PulseSettingsUi::on_output_device_changed))); app->pm->sink_added.connect(sigc::mem_fun(*this, &PulseSettingsUi::on_sink_added)); app->pm->sink_removed.connect(sigc::mem_fun(*this, &PulseSettingsUi::on_sink_removed)); app->pm->source_added.connect(sigc::mem_fun(*this, &PulseSettingsUi::on_source_added)); app->pm->source_removed.connect(sigc::mem_fun(*this, &PulseSettingsUi::on_source_removed)); auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; auto flag_invert_boolean = Gio::SettingsBindFlags::SETTINGS_BIND_INVERT_BOOLEAN; settings->bind("use-default-sink", use_default_sink, "active", flag); settings->bind("use-default-sink", output_device, "sensitive", flag | flag_invert_boolean); settings->bind("use-default-source", use_default_source, "active", flag); settings->bind("use-default-source", input_device, "sensitive", flag | flag_invert_boolean); sie_settings->bind("buffer-pulsesrc", sie_input_buffer.get(), "value", flag); sie_settings->bind("latency-pulsesrc", sie_input_latency.get(), "value", flag); sie_settings->bind("buffer-pulsesink", sie_output_buffer.get(), "value", flag); sie_settings->bind("latency-pulsesink", sie_output_latency.get(), "value", flag); soe_settings->bind("buffer-pulsesrc", soe_input_buffer.get(), "value", flag); soe_settings->bind("latency-pulsesrc", soe_input_latency.get(), "value", flag); soe_settings->bind("buffer-pulsesink", soe_output_buffer.get(), "value", flag); soe_settings->bind("latency-pulsesink", soe_output_latency.get(), "value", flag); g_settings_bind_with_mapping(settings->gobj(), "blocksize-in", blocksize_in->gobj(), "active", G_SETTINGS_BIND_DEFAULT, blocksize_enum_to_int, int_to_blocksize_enum, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "blocksize-out", blocksize_out->gobj(), "active", G_SETTINGS_BIND_DEFAULT, blocksize_enum_to_int, int_to_blocksize_enum, nullptr, nullptr); } PulseSettingsUi::~PulseSettingsUi() { for (auto& c : connections) { c.disconnect(); } util::debug(log_tag + "destroyed"); } void PulseSettingsUi::add_to_stack(Gtk::Stack* stack, Application* app) { auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/pulse_settings.glade"); PulseSettingsUi* ui; builder->get_widget_derived("widgets_grid", ui, app); stack->add(*ui, "settings_pulse", _("Pulseaudio")); } void PulseSettingsUi::on_sink_added(const std::shared_ptr& info) { bool add_to_list = true; auto children = sink_list->children(); for (const auto& c : children) { uint i = 0U; std::string name; c.get_value(0, i); c.get_value(1, name); if (info->index == i) { add_to_list = false; break; } } if (add_to_list) { Gtk::TreeModel::Row row = *(sink_list->append()); row->set_value(0, info->index); row->set_value(1, info->name); if (use_default_sink->get_active()) { if (info->name == app->pm->server_info.default_sink_name) { output_device->set_active(row); } } else { auto custom_sink = settings->get_string("custom-sink"); if (info->name == custom_sink) { output_device->set_active(row); } } util::debug(log_tag + "added sink: " + info->name); } } void PulseSettingsUi::on_sink_removed(uint idx) { Gtk::TreeIter remove_iter; std::string remove_name; auto children = sink_list->children(); for (const auto& c : children) { uint i = 0U; std::string name; c.get_value(0, i); c.get_value(1, name); if (idx == i) { remove_iter = c; remove_name = name; sink_list->erase(remove_iter); util::debug(log_tag + "removed sink: " + remove_name); break; } } } void PulseSettingsUi::on_source_added(const std::shared_ptr& info) { bool add_to_list = true; auto children = source_list->children(); for (const auto& c : children) { uint i = 0U; std::string name; c.get_value(0, i); c.get_value(1, name); if (info->index == i) { add_to_list = false; break; } } if (add_to_list) { Gtk::TreeModel::Row row = *(source_list->append()); row->set_value(0, info->index); row->set_value(1, info->name); if (use_default_source->get_active()) { if (info->name == app->pm->server_info.default_source_name) { input_device->set_active(row); } } else { auto custom_source = settings->get_string("custom-source"); if (info->name == custom_source) { input_device->set_active(row); } } util::debug(log_tag + "added source: " + info->name); } } void PulseSettingsUi::on_source_removed(uint idx) { Gtk::TreeIter remove_iter; std::string remove_name; auto children = source_list->children(); for (const auto& c : children) { uint i = 0U; std::string name; c.get_value(0, i); c.get_value(1, name); if (idx == i) { remove_iter = c; remove_name = name; source_list->erase(remove_iter); util::debug(log_tag + "removed source: " + remove_name); break; } } } void PulseSettingsUi::on_use_default_sink_toggled() { if (use_default_sink->get_active()) { auto children = sink_list->children(); for (const auto& c : children) { std::string name; c.get_value(1, name); if (name == app->pm->server_info.default_sink_name) { output_device->set_active(c); } } } } void PulseSettingsUi::on_use_default_source_toggled() { if (use_default_source->get_active()) { auto children = source_list->children(); for (const auto& c : children) { std::string name; c.get_value(1, name); if (name == app->pm->server_info.default_source_name) { input_device->set_active(c); } } } } void PulseSettingsUi::on_input_device_changed() { Gtk::TreeModel::Row row = *(input_device->get_active()); if (row) { uint index = 0U; std::string name; row.get_value(0, index); row.get_value(1, name); app->soe->set_source_monitor_name(name); if (!use_default_source->get_active()) { settings->set_string("custom-source", name); } util::debug(log_tag + "input device changed: " + name); } } void PulseSettingsUi::on_output_device_changed() { Gtk::TreeModel::Row row = *(output_device->get_active()); if (row) { uint index = 0U; std::string name; row.get_value(0, index); row.get_value(1, name); app->sie->set_output_sink_name(name); app->soe->webrtc->set_probe_src_device(name + ".monitor"); if (!use_default_sink->get_active()) { settings->set_string("custom-sink", name); } util::debug(log_tag + "output device changed: " + name); } } easyeffects-4.8.7/src/pulseeffects.cpp000066400000000000000000000034311424023573300200220ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include #include #include "application_ui.hpp" #include "config.h" auto sigterm(void* data) -> bool { auto app = static_cast(data); for (const auto& w : app->get_windows()) { w->hide(); } app->quit(); return G_SOURCE_REMOVE; } auto main(int argc, char* argv[]) -> int { try { // Init internationalization support before anything else auto bindtext_output = bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); if (bindtext_output != nullptr) { util::debug("main: locale directory: " + std::string(bindtext_output)); } else if (errno == ENOMEM) { util::warning("main: bindtextdomain: Not enough memory available!"); return errno; } auto app = Application::create(); g_unix_signal_add(2, (GSourceFunc)sigterm, app.get()); return app->run(argc, argv); } catch (const std::exception& e) { std::cerr << e.what() << std::endl; return EXIT_FAILURE; } } easyeffects-4.8.7/src/realtime_kit.cpp000066400000000000000000000132711424023573300200060ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "realtime_kit.hpp" #include #include #include #include #include "util.hpp" RealtimeKit::RealtimeKit(const std::string& tag) { log_tag = tag + "rtkit: "; try { proxy = Gio::DBus::Proxy::create_for_bus_sync(Gio::DBus::BusType::BUS_TYPE_SYSTEM, RTKIT_SERVICE_NAME, RTKIT_OBJECT_PATH, "org.freedesktop.RealtimeKit1"); properties_proxy = Gio::DBus::Proxy::create_for_bus_sync(Gio::DBus::BusType::BUS_TYPE_SYSTEM, RTKIT_SERVICE_NAME, RTKIT_OBJECT_PATH, "org.freedesktop.DBus.Properties"); } catch (const Glib::Error& err) { util::warning(log_tag + "Failed to connect to system bus: " + err.what().c_str()); } } /* This method code was adapted from the one in Pulseaudio sources. File rtkit.c */ auto RealtimeKit::get_int_property(const char* propname) -> long long { Glib::VariantBase reply_body; long long propval = 0; const char* interfacestr = "org.freedesktop.RealtimeKit1"; Glib::VariantContainerBase args = Glib::VariantContainerBase::create_tuple(std::vector( {Glib::Variant::create(interfacestr), Glib::Variant::create(propname)})); try { reply_body = properties_proxy->call_sync("Get", args); // The rtkit reply is encoded as a tuple containing `@v <@x 123456>` instead // of just plain @x or @i if (reply_body.get_type_string() == "(v)") { auto child = Glib::VariantBase::cast_dynamic>>(reply_body) .get_child(0); if (child.get_type_string() == "i") { propval = *(const gint32*)Glib::VariantBase::cast_dynamic>(child).get_data(); } else if (child.get_type_string() == "x") { propval = *(const gint64*)Glib::VariantBase::cast_dynamic>(child).get_data(); } else { util::warning(log_tag + " Expected value of type i or x but received " + child.get_type_string()); } } else { util::warning(log_tag + " Expected value of type (v) but received " + reply_body.get_type_string()); } } catch (const Glib::Error& err) { util::warning(log_tag + err.what().c_str()); } return propval; } void RealtimeKit::make_realtime(const std::string& source_name, const int& priority) { #if defined(__linux__) auto thread = static_cast(syscall(SYS_gettid)); auto u64 = static_cast(thread); auto u32 = static_cast(priority); Glib::VariantContainerBase args = Glib::VariantContainerBase::create_tuple( std::vector({Glib::Variant::create(u64), Glib::Variant::create(u32)})); try { proxy->call_sync("MakeThreadRealtime", args); util::debug(log_tag + "changed " + source_name + " thread real-time priority value to " + std::to_string(priority)); } catch (const Glib::Error& err) { util::warning(log_tag + "MakeThreadRealtime: " + err.what().c_str()); } #endif } void RealtimeKit::make_high_priority(const std::string& source_name, const int& nice_value) { #if defined(__linux__) auto thread = static_cast(syscall(SYS_gettid)); auto u64 = static_cast(thread); auto i32 = static_cast(nice_value); Glib::VariantContainerBase args = Glib::VariantContainerBase::create_tuple( std::vector({Glib::Variant::create(u64), Glib::Variant::create(i32)})); try { proxy->call_sync("MakeThreadHighPriority", args); util::debug(log_tag + "changed " + source_name + " thread nice value to " + std::to_string(nice_value)); } catch (const Glib::Error& err) { util::warning(log_tag + "MakeThreadHighPriority: " + err.what().c_str()); } #endif } void RealtimeKit::set_priority(const std::string& source_name, const int& priority) { #ifdef SCHED_RESET_ON_FORK struct sched_param sp {}; if (pthread_setschedparam(pthread_self(), SCHED_RR | SCHED_RESET_ON_FORK, &sp) == 0) { util::debug("SCHED_RR|SCHED_RESET_ON_FORK worked."); return; } #endif #ifdef RLIMIT_RTTIME struct rlimit rl {}; long long rttime; rttime = get_int_property("RTTimeUSecMax"); if (getrlimit(RLIMIT_RTTIME, &rl) >= 0) { rl.rlim_cur = rl.rlim_max = rttime; if (setrlimit(RLIMIT_RTTIME, &rl) < 0) { util::warning(log_tag + "failed to set rlimit value for the " + source_name + " thread"); } } else { util::warning(log_tag + "failed to get rlimit value for the " + source_name + " thread"); } #endif #if defined(__linux__) make_realtime(source_name, priority); #endif } void RealtimeKit::set_nice(const std::string& source_name, const int& nice_value) { #ifdef HAVE_SYS_RESOURCE_H if (setpriority(PRIO_PROCESS, 0, nice_value) >= 0) { util::debug("setpriority() worked."); return; } #endif #if defined(__linux__) make_high_priority(source_name, nice_value); #endif } easyeffects-4.8.7/src/reverb.cpp000066400000000000000000000125061424023573300166220ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "reverb.hpp" #include #include #include "util.hpp" namespace { void on_post_messages_changed(GSettings* settings, gchar* key, Reverb* l) { const auto post = g_settings_get_boolean(settings, key); if (post) { if (!l->input_level_connection.connected()) { l->input_level_connection = Glib::signal_timeout().connect( [l]() { float inL = 0.0F; float inR = 0.0F; g_object_get(l->reverb, "meter-inL", &inL, nullptr); g_object_get(l->reverb, "meter-inR", &inR, nullptr); std::array in_peak = {inL, inR}; l->input_level.emit(in_peak); return true; }, 100); } if (!l->output_level_connection.connected()) { l->output_level_connection = Glib::signal_timeout().connect( [l]() { float outL = 0.0F; float outR = 0.0F; g_object_get(l->reverb, "meter-outL", &outL, nullptr); g_object_get(l->reverb, "meter-outR", &outR, nullptr); std::array out_peak = {outL, outR}; l->output_level.emit(out_peak); return true; }, 100); } } else { l->input_level_connection.disconnect(); l->output_level_connection.disconnect(); } } } // namespace Reverb::Reverb(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "reverb", schema, schema_path) { reverb = gst_element_factory_make("calf-sourceforge-net-plugins-Reverb", "reverb"); if (is_installed(reverb)) { auto* audioconvert_in = gst_element_factory_make("audioconvert", "reverb_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "reverb_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), audioconvert_in, reverb, audioconvert_out, nullptr); gst_element_link_many(audioconvert_in, reverb, audioconvert_out, nullptr); auto* pad_sink = gst_element_get_static_pad(audioconvert_in, "sink"); auto* pad_src = gst_element_get_static_pad(audioconvert_out, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(reverb, "on", 1, nullptr); bind_to_gsettings(); g_signal_connect(settings, "changed::post-messages", G_CALLBACK(on_post_messages_changed), this); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Reverb::~Reverb() { util::debug(log_tag + name + " destroyed"); } void Reverb::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "input-gain", reverb, "level-in", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", reverb, "level-out", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind(settings, "room-size", reverb, "room-size", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "decay-time", reverb, "decay-time", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "hf-damp", reverb, "hf-damp", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "diffusion", reverb, "diffusion", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "amount", reverb, "amount", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "dry", reverb, "dry", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "predelay", reverb, "predelay", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "bass-cut", reverb, "bass-cut", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "treble-cut", reverb, "treble-cut", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); } easyeffects-4.8.7/src/reverb_preset.cpp000066400000000000000000000076771424023573300202210ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "reverb_preset.hpp" ReverbPreset::ReverbPreset() : input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.reverb", "/com/github/wwmm/pulseeffects/sourceoutputs/reverb/")), output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.reverb", "/com/github/wwmm/pulseeffects/sinkinputs/reverb/")) {} void ReverbPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".reverb.state", settings->get_boolean("state")); root.put(section + ".reverb.input-gain", settings->get_double("input-gain")); root.put(section + ".reverb.output-gain", settings->get_double("output-gain")); root.put(section + ".reverb.room-size", settings->get_string("room-size")); root.put(section + ".reverb.decay-time", settings->get_double("decay-time")); root.put(section + ".reverb.hf-damp", settings->get_double("hf-damp")); root.put(section + ".reverb.diffusion", settings->get_double("diffusion")); root.put(section + ".reverb.amount", settings->get_double("amount")); root.put(section + ".reverb.dry", settings->get_double("dry")); root.put(section + ".reverb.predelay", settings->get_double("predelay")); root.put(section + ".reverb.bass-cut", settings->get_double("bass-cut")); root.put(section + ".reverb.treble-cut", settings->get_double("treble-cut")); } void ReverbPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".reverb.state"); update_key(root, settings, "input-gain", section + ".reverb.input-gain"); update_key(root, settings, "output-gain", section + ".reverb.output-gain"); update_string_key(root, settings, "room-size", section + ".reverb.room-size"); update_key(root, settings, "decay-time", section + ".reverb.decay-time"); update_key(root, settings, "hf-damp", section + ".reverb.hf-damp"); update_key(root, settings, "diffusion", section + ".reverb.diffusion"); update_key(root, settings, "amount", section + ".reverb.amount"); update_key(root, settings, "dry", section + ".reverb.dry"); update_key(root, settings, "predelay", section + ".reverb.predelay"); update_key(root, settings, "bass-cut", section + ".reverb.bass-cut"); update_key(root, settings, "treble-cut", section + ".reverb.treble-cut"); } void ReverbPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: save(root, "output", output_settings); break; case PresetType::input: save(root, "input", input_settings); break; } } void ReverbPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: load(root, "output", output_settings); break; case PresetType::input: load(root, "input", input_settings); break; } } easyeffects-4.8.7/src/reverb_ui.cpp000066400000000000000000000167171424023573300173270ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "reverb_ui.hpp" #include namespace { auto room_size_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "Small") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "Medium") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "Large") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "Tunnel-like") == 0) { g_value_set_int(value, 3); } else if (std::strcmp(v, "Large/smooth") == 0) { g_value_set_int(value, 4); } else if (std::strcmp(v, "Experimental") == 0) { g_value_set_int(value, 5); } return 1; } auto int_to_room_size_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("Small"); case 1: return g_variant_new_string("Medium"); case 2: return g_variant_new_string("Large"); case 3: return g_variant_new_string("Tunnel-like"); case 4: return g_variant_new_string("Large/smooth"); case 5: return g_variant_new_string("Experimental"); default: return g_variant_new_string("Large"); } } } // namespace ReverbUi::ReverbUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "reverb"; // loading glade widgets builder->get_widget("room_size", room_size); builder->get_widget("preset_room", preset_room); builder->get_widget("preset_empty_walls", preset_empty_walls); builder->get_widget("preset_ambience", preset_ambience); builder->get_widget("preset_large_empty_hall", preset_large_empty_hall); builder->get_widget("preset_disco", preset_disco); builder->get_widget("preset_large_occupied_hall", preset_large_occupied_hall); builder->get_widget("preset_default", preset_default); builder->get_widget("plugin_reset", reset_button); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); get_object(builder, "predelay", predelay); get_object(builder, "decay_time", decay_time); get_object(builder, "diffusion", diffusion); get_object(builder, "amount", amount); get_object(builder, "dry", dry); get_object(builder, "hf_damp", hf_damp); get_object(builder, "bass_cut", bass_cut); get_object(builder, "treble_cut", treble_cut); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); settings->bind("predelay", predelay.get(), "value", flag); settings->bind("decay-time", decay_time.get(), "value", flag); settings->bind("diffusion", diffusion.get(), "value", flag); settings->bind("amount", amount.get(), "value", flag); settings->bind("dry", dry.get(), "value", flag); settings->bind("hf-damp", hf_damp.get(), "value", flag); settings->bind("bass-cut", bass_cut.get(), "value", flag); settings->bind("treble-cut", treble_cut.get(), "value", flag); g_settings_bind_with_mapping(settings->gobj(), "room-size", room_size->gobj(), "active", G_SETTINGS_BIND_DEFAULT, room_size_enum_to_int, int_to_room_size_enum, nullptr, nullptr); init_presets_buttons(); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } ReverbUi::~ReverbUi() { util::debug(name + " ui destroyed"); } void ReverbUi::reset() { settings->reset("input-gain"); settings->reset("output-gain"); settings->reset("room-size"); settings->reset("decay-time"); settings->reset("hf-damp"); settings->reset("diffusion"); settings->reset("amount"); settings->reset("dry"); settings->reset("predelay"); settings->reset("bass-cut"); settings->reset("treble-cut"); } void ReverbUi::init_presets_buttons() { preset_room->signal_clicked().connect([=]() { decay_time->set_value(0.445945); hf_damp->set_value(5508.46); room_size->set_active(4); diffusion->set_value(0.54); amount->set_value(util::linear_to_db(0.469761)); dry->set_value(util::linear_to_db(1.0)); predelay->set_value(25.0); bass_cut->set_value(257.65); treble_cut->set_value(20000.0); }); preset_empty_walls->signal_clicked().connect([=]() { decay_time->set_value(0.505687); hf_damp->set_value(3971.64); room_size->set_active(4); diffusion->set_value(0.17); amount->set_value(util::linear_to_db(0.198884)); dry->set_value(util::linear_to_db(1.0)); predelay->set_value(13.0); bass_cut->set_value(240.453); treble_cut->set_value(3303.47); }); preset_ambience->signal_clicked().connect([=]() { decay_time->set_value(1.10354); hf_damp->set_value(2182.58); room_size->set_active(4); diffusion->set_value(0.69); amount->set_value(util::linear_to_db(0.291183)); dry->set_value(util::linear_to_db(1.0)); predelay->set_value(6.5); bass_cut->set_value(514.079); treble_cut->set_value(4064.15); }); preset_large_empty_hall->signal_clicked().connect([=]() { decay_time->set_value(2.00689); hf_damp->set_value(20000.0); amount->set_value(util::linear_to_db(0.366022)); settings->reset("room-size"); settings->reset("diffusion"); settings->reset("dry"); settings->reset("predelay"); settings->reset("bass-cut"); settings->reset("treble-cut"); }); preset_disco->signal_clicked().connect([=]() { decay_time->set_value(1.0); hf_damp->set_value(3396.49); amount->set_value(util::linear_to_db(0.269807)); settings->reset("room-size"); settings->reset("diffusion"); settings->reset("dry"); settings->reset("predelay"); settings->reset("bass-cut"); settings->reset("treble-cut"); }); preset_large_occupied_hall->signal_clicked().connect([=]() { decay_time->set_value(1.45397); hf_damp->set_value(9795.58); amount->set_value(util::linear_to_db(0.184284)); settings->reset("room-size"); settings->reset("diffusion"); settings->reset("dry"); settings->reset("predelay"); settings->reset("bass-cut"); settings->reset("treble-cut"); }); preset_default->signal_clicked().connect([=]() { settings->reset("decay-time"); settings->reset("hf-damp"); settings->reset("amount"); settings->reset("room-size"); settings->reset("diffusion"); settings->reset("dry"); settings->reset("predelay"); settings->reset("bass-cut"); settings->reset("treble-cut"); }); } easyeffects-4.8.7/src/rnnoise.cpp000066400000000000000000000100161424023573300170040ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "rnnoise.hpp" #include #include "util.hpp" RNNoise::RNNoise(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "rnnoise", schema, schema_path) { rnnoise = gst_element_factory_make("pernnoise", nullptr); if (is_installed(rnnoise)) { auto* input_gain = gst_element_factory_make("volume", nullptr); auto* in_level = gst_element_factory_make("level", "rnnoise_input_level"); auto* output_gain = gst_element_factory_make("volume", nullptr); auto* out_level = gst_element_factory_make("level", "rnnoise_output_level"); capsfilter_out = gst_element_factory_make("capsfilter", nullptr); capsfilter_in = gst_element_factory_make("capsfilter", nullptr); auto* audioresample_in = gst_element_factory_make("audioresample", "rnnoise_audioresample_in"); auto* audioresample_out = gst_element_factory_make("audioresample", "rnnoise_audioresample_out"); auto* adapter = gst_element_factory_make("peadapter", nullptr); gst_bin_add_many(GST_BIN(bin), input_gain, in_level, audioresample_in, capsfilter_in, adapter, rnnoise, audioresample_out, capsfilter_out, output_gain, out_level, nullptr); gst_element_link_many(input_gain, in_level, audioresample_in, capsfilter_in, adapter, rnnoise, audioresample_out, capsfilter_out, output_gain, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(input_gain, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(adapter, "blocksize", 480, nullptr); set_caps_in(); bind_to_gsettings(); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "input-gain", input_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", output_gain, "volume", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear_double, util::linear_double_gain_to_db20, nullptr, nullptr); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } RNNoise::~RNNoise() { util::debug(log_tag + name + " destroyed"); } void RNNoise::bind_to_gsettings() { g_settings_bind(settings, "model-path", rnnoise, "model-path", G_SETTINGS_BIND_DEFAULT); } void RNNoise::set_caps_out(const uint& sampling_rate) { if (capsfilter_out != nullptr) { auto caps_str = "audio/x-raw,format=F32LE,channels=2,rate=" + std::to_string(sampling_rate); auto* caps = gst_caps_from_string(caps_str.c_str()); g_object_set(capsfilter_out, "caps", caps, nullptr); gst_caps_unref(caps); } } void RNNoise::set_caps_in() { auto* caps = gst_caps_from_string("audio/x-raw,format=F32LE,channels=2,rate=48000"); g_object_set(capsfilter_in, "caps", caps, nullptr); gst_caps_unref(caps); }easyeffects-4.8.7/src/rnnoise/000077500000000000000000000000001424023573300163025ustar00rootroot00000000000000easyeffects-4.8.7/src/rnnoise/README.md000066400000000000000000000010001424023573300175500ustar00rootroot00000000000000# PulseEffects Convolver Simple convolver plugin based on the library Zita-convolver and inspired in the convolvers [https://github.com/tomszilagyi/ir.lv2/](https://github.com/tomszilagyi/ir.lv2/) and [https://github.com/x42/convoLV2](https://github.com/x42/convoLV2). You can test it from command line executing: `gst-launch-1.0 -v audiotestsrc blocksize=512 ! peconvolver kernel-path=full_path_to_irs_file ! pulsesink` This plugin only works with a power of two blocksize [64,128,256,512,1024,2048,4096]. easyeffects-4.8.7/src/rnnoise/gstpernnoise.cpp000066400000000000000000000243751424023573300215410ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ /** * SECTION:element-gstpernnoise * * The pernnoise uses the rnnoise library to remove background noise from audio. * * * Example launch line * |[ * gst-launch-1.0 -v audiotestsrc ! pernnoise ! pulsesink * ]| * The pernnoise uses the rnnoise library to remove background noise from audio. * */ #include "gstpernnoise.hpp" #include #include #include #include #include "config.h" #include "util.hpp" std::mutex rnnoise_mutex; GST_DEBUG_CATEGORY_STATIC(gst_pernnoise_debug_category); #define GST_CAT_DEFAULT gst_pernnoise_debug_category /* prototypes */ static void gst_pernnoise_set_property(GObject* object, guint property_id, const GValue* value, GParamSpec* pspec); static void gst_pernnoise_get_property(GObject* object, guint property_id, GValue* value, GParamSpec* pspec); static void gst_pernnoise_finalize(GObject* object); static auto gst_pernnoise_setup(GstAudioFilter* filter, const GstAudioInfo* info) -> gboolean; static auto gst_pernnoise_transform_ip(GstBaseTransform* trans, GstBuffer* buffer) -> GstFlowReturn; static auto gst_pernnoise_stop(GstBaseTransform* base) -> gboolean; static void gst_pernnoise_set_model_path(GstPernnoise* pernnoise, gchar* value); static void gst_pernnoise_process(GstPernnoise* pernnoise, GstBuffer* buffer); static void gst_pernnoise_setup_rnnoise(GstPernnoise* pernnoise); static void gst_pernnoise_finish_rnnoise(GstPernnoise* pernnoise); enum { PROP_MODEL_PATH = 1 }; /* pad templates */ static GstStaticPadTemplate gst_pernnoise_src_template = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS("audio/x-raw,format=F32LE,rate=[1,max]," "channels=2,layout=interleaved")); static GstStaticPadTemplate gst_pernnoise_sink_template = GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS("audio/x-raw,format=F32LE,rate=[1,max]," "channels=2,layout=interleaved")); /* class initialization */ G_DEFINE_TYPE_WITH_CODE( GstPernnoise, gst_pernnoise, GST_TYPE_AUDIO_FILTER, GST_DEBUG_CATEGORY_INIT(gst_pernnoise_debug_category, "pernnoise", 0, "debug category for pernnoise element")); static void gst_pernnoise_class_init(GstPernnoiseClass* klass) { GObjectClass* gobject_class = G_OBJECT_CLASS(klass); GstBaseTransformClass* base_transform_class = GST_BASE_TRANSFORM_CLASS(klass); GstAudioFilterClass* audio_filter_class = GST_AUDIO_FILTER_CLASS(klass); /* Setting up pads and setting metadata should be moved to base_class_init if you intend to subclass this class. */ gst_element_class_add_static_pad_template(GST_ELEMENT_CLASS(klass), &gst_pernnoise_src_template); gst_element_class_add_static_pad_template(GST_ELEMENT_CLASS(klass), &gst_pernnoise_sink_template); gst_element_class_set_static_metadata(GST_ELEMENT_CLASS(klass), "PulseEffects Convolver", "Generic", "PulseEffects Convolver", "Wellington "); /* define virtual function pointers */ gobject_class->set_property = gst_pernnoise_set_property; gobject_class->get_property = gst_pernnoise_get_property; gobject_class->finalize = gst_pernnoise_finalize; audio_filter_class->setup = GST_DEBUG_FUNCPTR(gst_pernnoise_setup); base_transform_class->transform_ip = GST_DEBUG_FUNCPTR(gst_pernnoise_transform_ip); base_transform_class->transform_ip_on_passthrough = 0; base_transform_class->stop = GST_DEBUG_FUNCPTR(gst_pernnoise_stop); /* define properties */ g_object_class_install_property( gobject_class, PROP_MODEL_PATH, g_param_spec_string("model-path", "Model Path", "Path of the model file", nullptr, static_cast(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } static void gst_pernnoise_init(GstPernnoise* pernnoise) { pernnoise->rate = -1; pernnoise->ready = false; pernnoise->bpf = -1; pernnoise->inbuf_n_samples = -1; pernnoise->blocksize = 480; // for some reason I do not know rnnoise has to process buffers of 480 elements pernnoise->data_L.resize(pernnoise->blocksize); pernnoise->data_R.resize(pernnoise->blocksize); gst_base_transform_set_in_place(GST_BASE_TRANSFORM(pernnoise), 1); } void gst_pernnoise_set_property(GObject* object, guint property_id, const GValue* value, GParamSpec* pspec) { GstPernnoise* pernnoise = GST_PERNNOISE(object); GST_DEBUG_OBJECT(pernnoise, "set_property"); switch (property_id) { case PROP_MODEL_PATH: { gst_pernnoise_set_model_path(pernnoise, g_value_dup_string(value)); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; } } void gst_pernnoise_get_property(GObject* object, guint property_id, GValue* value, GParamSpec* pspec) { GstPernnoise* pernnoise = GST_PERNNOISE(object); GST_DEBUG_OBJECT(pernnoise, "get_property"); switch (property_id) { case PROP_MODEL_PATH: g_value_set_string(value, pernnoise->model_path); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; } } void gst_pernnoise_finalize(GObject* object) { GstPernnoise* pernnoise = GST_PERNNOISE(object); GST_DEBUG_OBJECT(pernnoise, "finalize"); std::lock_guard guard(rnnoise_mutex); gst_pernnoise_finish_rnnoise(pernnoise); /* clean up object here */ G_OBJECT_CLASS(gst_pernnoise_parent_class)->finalize(object); } static auto gst_pernnoise_setup(GstAudioFilter* filter, const GstAudioInfo* info) -> gboolean { GstPernnoise* pernnoise = GST_PERNNOISE(filter); GST_DEBUG_OBJECT(pernnoise, "setup"); pernnoise->rate = info->rate; pernnoise->bpf = GST_AUDIO_INFO_BPF(info); /* this function is called whenever there is a format change. So we reinitialize rnnoise. */ std::lock_guard guard(rnnoise_mutex); gst_pernnoise_finish_rnnoise(pernnoise); return 1; } static auto gst_pernnoise_transform_ip(GstBaseTransform* trans, GstBuffer* buffer) -> GstFlowReturn { GstPernnoise* pernnoise = GST_PERNNOISE(trans); GST_DEBUG_OBJECT(pernnoise, "transform"); std::lock_guard guard(rnnoise_mutex); if (pernnoise->ready) { gst_pernnoise_process(pernnoise, buffer); } else { gst_pernnoise_setup_rnnoise(pernnoise); } return GST_FLOW_OK; } static auto gst_pernnoise_stop(GstBaseTransform* base) -> gboolean { GstPernnoise* pernnoise = GST_PERNNOISE(base); std::lock_guard guard(rnnoise_mutex); gst_pernnoise_finish_rnnoise(pernnoise); return 1; } static void gst_pernnoise_set_model_path(GstPernnoise* pernnoise, gchar* value) { if (value != nullptr) { if (pernnoise->model_path != nullptr) { if (std::strcmp(value, pernnoise->model_path) != 0) { g_free(pernnoise->model_path); pernnoise->model_path = value; std::lock_guard guard(rnnoise_mutex); gst_pernnoise_finish_rnnoise(pernnoise); } } else { // plugin is being initialized g_free(pernnoise->model_path); pernnoise->model_path = value; } } } static void gst_pernnoise_setup_rnnoise(GstPernnoise* pernnoise) { if (pernnoise->model_path != nullptr) { FILE* f = fopen(pernnoise->model_path, "r"); if (f != nullptr) { util::debug("rnnoise plugin: loading model from file: " + std::string(pernnoise->model_path)); pernnoise->model = rnnoise_model_from_file(f); fclose(f); } } pernnoise->state_left = rnnoise_create(pernnoise->model); pernnoise->state_right = rnnoise_create(pernnoise->model); pernnoise->ready = true; } static void gst_pernnoise_process(GstPernnoise* pernnoise, GstBuffer* buffer) { GstMapInfo map; gst_buffer_map(buffer, &map, GST_MAP_READWRITE); auto* data = reinterpret_cast(map.data); // deinterleave for (int n = 0U; n < pernnoise->blocksize; n++) { pernnoise->data_L[n] = data[2U * n] * (SHRT_MAX + 1); pernnoise->data_R[n] = data[2U * n + 1U] * (SHRT_MAX + 1); } rnnoise_process_frame(pernnoise->state_left, pernnoise->data_L.data(), pernnoise->data_L.data()); rnnoise_process_frame(pernnoise->state_right, pernnoise->data_R.data(), pernnoise->data_R.data()); // interleave for (int n = 0U; n < pernnoise->blocksize; n++) { data[2U * n] = pernnoise->data_L[n] / (SHRT_MAX + 1); data[2U * n + 1U] = pernnoise->data_R[n] / (SHRT_MAX + 1); } gst_buffer_unmap(buffer, &map); } static void gst_pernnoise_finish_rnnoise(GstPernnoise* pernnoise) { if (pernnoise->ready) { pernnoise->ready = false; rnnoise_destroy(pernnoise->state_left); rnnoise_destroy(pernnoise->state_right); rnnoise_model_free(pernnoise->model); pernnoise->state_left = nullptr; pernnoise->state_right = nullptr; pernnoise->model = nullptr; } } static auto plugin_init(GstPlugin* plugin) -> gboolean { /* FIXME Remember to set the rank if it's an element that is meant to be autoplugged by decodebin. */ return gst_element_register(plugin, "pernnoise", GST_RANK_NONE, GST_TYPE_PERNNOISE); } GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, pernnoise, "PulseEffects Noise Remover", plugin_init, VERSION, "LGPL", PACKAGE, "https://github.com/wwmm/pulseeffects") easyeffects-4.8.7/src/rnnoise/gstpernnoise.hpp000066400000000000000000000041711424023573300215360ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #ifndef GST_PERNNOISE_HPP #define GST_PERNNOISE_HPP #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_PERNNOISE (gst_pernnoise_get_type()) #define GST_PERNNOISE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_PERNNOISE, GstPernnoise)) #define GST_PERNNOISE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_PERNNOISE, GstPernnoiseClass)) #define GST_IS_PERNNOISE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_PERNNOISE)) #define GST_IS_PERNNOISE_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_PERNNOISE)) struct GstPernnoise { GstAudioFilter base_pernnoise; /* properties */ gchar* model_path = nullptr; /*< private >*/ int rate; // sampling rate int bpf; // bytes per frame : channels * bps int inbuf_n_samples; // number of samples in the input buffer int outbuf_n_samples; // number of samples in the input buffer int blocksize; // number of samples processed by the rnnoise library bool flag_discont; bool ready; RNNModel* model = nullptr; DenoiseState *state_left = nullptr, *state_right = nullptr; std::vector data_L; // left channel buffer std::vector data_R; // right channel buffer }; struct GstPernnoiseClass { GstAudioFilterClass base_pernnoise_class; }; GType gst_pernnoise_get_type(void); G_END_DECLS #endif easyeffects-4.8.7/src/rnnoise/meson.build000066400000000000000000000012411424023573300204420ustar00rootroot00000000000000dep_rnnoise = dependency('rnnoise', required: false) if dep_rnnoise.found() plugin_sources = [ 'gstpernnoise.cpp', '../util.cpp' ] plugin_deps = [ dependency('gstreamer-1.0'), dependency('gstreamer-base-1.0'), dependency('gstreamer-controller-1.0'), dependency('gstreamer-audio-1.0'), dep_rnnoise, dependency('threads') ] plugins_install_dir = '@0@/gstreamer-1.0'.format(get_option('libdir')) library( 'gstpernnoise', plugin_sources, include_directories : [include_dir,config_h_dir], dependencies : plugin_deps, install: true, install_dir : plugins_install_dir, cpp_args: plugins_cxx_args ) else message('could not find the RNNoise library') endif easyeffects-4.8.7/src/rnnoise_preset.cpp000066400000000000000000000053661424023573300204020ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "rnnoise_preset.hpp" RNNoisePreset::RNNoisePreset() : output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.rnnoise", "/com/github/wwmm/pulseeffects/sinkinputs/rnnoise/")), input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.rnnoise", "/com/github/wwmm/pulseeffects/sourceoutputs/rnnoise/")) {} void RNNoisePreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".rnnoise.state", settings->get_boolean("state")); root.put(section + ".rnnoise.input-gain", settings->get_double("input-gain")); root.put(section + ".rnnoise.output-gain", settings->get_double("output-gain")); root.put(section + ".rnnoise.model-path", settings->get_string("model-path")); } void RNNoisePreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".rnnoise.state"); update_key(root, settings, "input-gain", section + ".rnnoise.input-gain"); update_key(root, settings, "output-gain", section + ".rnnoise.output-gain"); update_string_key(root, settings, "model-path", section + ".rnnoise.model-path"); } void RNNoisePreset::write(PresetType preset_type, boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: save(root, "output", output_settings); break; case PresetType::input: save(root, "input", input_settings); break; } } void RNNoisePreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: load(root, "output", output_settings); break; case PresetType::input: load(root, "input", input_settings); break; } } easyeffects-4.8.7/src/rnnoise_ui.cpp000066400000000000000000000154551424023573300175150ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "rnnoise_ui.hpp" RNNoiseUi::RNNoiseUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path), model_dir(Glib::get_user_config_dir() + "/PulseEffects/rnnoise") { name = "rnnoise"; default_model_name = _("Standard RNNoise Model"); // loading glade widgets builder->get_widget("plugin_reset", reset_button); builder->get_widget("import_model", import_model); builder->get_widget("model_listbox", model_listbox); builder->get_widget("model_list_frame", model_list_frame); builder->get_widget("active_model_name", active_model_name); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); // signals connection model_listbox->set_sort_func(sigc::ptr_fun(&RNNoiseUi::on_listbox_sort)); import_model->signal_clicked().connect(sigc::mem_fun(*this, &RNNoiseUi::on_import_model_clicked)); reset_button->signal_clicked().connect([=]() { reset(); }); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); connections.emplace_back(settings->signal_changed("model-path").connect([=](auto key) { set_active_model_label(); })); // model dir if (!std::filesystem::is_directory(model_dir)) { if (std::filesystem::create_directories(model_dir)) { util::debug(log_tag + "model directory created: " + model_dir.string()); } else { util::warning(log_tag + "failed to create model directory: " + model_dir.string()); } } else { util::debug(log_tag + "model directory already exists: " + model_dir.string()); } populate_model_listbox(); set_active_model_label(); } RNNoiseUi::~RNNoiseUi() { util::debug(name + " ui destroyed"); } void RNNoiseUi::on_import_model_clicked() { auto* main_window = dynamic_cast(this->get_toplevel()); auto dialog = Gtk::FileChooserNative::create( _("Import Model File"), *main_window, Gtk::FileChooserAction::FILE_CHOOSER_ACTION_OPEN, _("Open"), _("Cancel")); auto dialog_filter = Gtk::FileFilter::create(); dialog_filter->set_name(_("RNNoise Models")); dialog_filter->add_pattern("*.rnnn"); dialog->add_filter(dialog_filter); dialog->signal_response().connect([=](auto response_id) { switch (response_id) { case Gtk::ResponseType::RESPONSE_ACCEPT: { import_model_file(dialog->get_file()->get_path()); populate_model_listbox(); break; } default: break; } }); dialog->set_modal(true); dialog->show(); } auto RNNoiseUi::on_listbox_sort(Gtk::ListBoxRow* row1, Gtk::ListBoxRow* row2) -> int { auto name1 = row1->get_name(); auto name2 = row2->get_name(); std::vector names = {name1, name2}; std::sort(names.begin(), names.end()); if (name1 == names[0]) { return -1; } if (name2 == names[0]) { return 1; } return 0; } void RNNoiseUi::import_model_file(const std::string& file_path) { std::filesystem::path p{file_path}; if (std::filesystem::is_regular_file(p)) { auto out_path = model_dir / p.filename(); out_path.replace_extension(".rnnn"); std::filesystem::copy_file(p, out_path, std::filesystem::copy_options::overwrite_existing); util::debug(log_tag + "imported model file to: " + out_path.string()); } else { util::warning(log_tag + p.string() + " is not a file!"); } } void RNNoiseUi::populate_model_listbox() { auto children = model_listbox->get_children(); for (const auto& c : children) { model_listbox->remove(*c); } auto names = get_model_names(); if (names.empty()) { settings->set_string("model-path", default_model_name); model_list_frame->set_visible(false); } else { model_list_frame->set_visible(true); } for (const auto& name : names) { auto b = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/irs_row.glade"); Gtk::ListBoxRow* row = nullptr; Gtk::Button* remove_btn = nullptr; Gtk::Button* apply_btn = nullptr; Gtk::Label* label = nullptr; b->get_widget("irs_row", row); b->get_widget("remove", remove_btn); b->get_widget("apply", apply_btn); b->get_widget("name", label); row->set_name(name); label->set_text(name); connections.emplace_back(remove_btn->signal_clicked().connect([=]() { remove_model_file(name); populate_model_listbox(); })); connections.emplace_back(apply_btn->signal_clicked().connect([=]() { auto model_file = model_dir / std::filesystem::path{row->get_name() + ".rnnn"}; settings->set_string("model-path", model_file.string()); })); model_listbox->add(*row); model_listbox->show_all(); } } auto RNNoiseUi::get_model_names() -> std::vector { std::filesystem::directory_iterator it{model_dir}; std::vector names; while (it != std::filesystem::directory_iterator{}) { if (std::filesystem::is_regular_file(it->status())) { if (it->path().extension().string() == ".rnnn") { names.emplace_back(it->path().stem().string()); } } it++; } return names; } void RNNoiseUi::remove_model_file(const std::string& name) { auto model_file = model_dir / std::filesystem::path{name + ".rnnn"}; if (std::filesystem::exists(model_file)) { std::filesystem::remove(model_file); util::debug(log_tag + "removed model file: " + model_file.string()); } } void RNNoiseUi::set_active_model_label() { auto path = std::filesystem::path{settings->get_string("model-path")}; if (settings->get_string("model-path").empty()) { active_model_name->set_text(default_model_name); } else { active_model_name->set_text(path.stem().string()); } } void RNNoiseUi::reset() { settings->reset("input-gain"); settings->reset("output-gain"); settings->reset("model-path"); } easyeffects-4.8.7/src/sink_input_effects.cpp000066400000000000000000000377141424023573300212270ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "sink_input_effects.hpp" #include #include "pipeline_common.hpp" #include "rnnoise.hpp" namespace { void on_message_element(const GstBus* gst_bus, GstMessage* message, SinkInputEffects* sie) { auto* src_name = GST_OBJECT_NAME(message->src); // To optimize this call we move at the top of the nested "if statements" the most used messages // which are 'global_level_meter' and the level meters for the most used plugins for sink inputs: // equalizer and autogain. The rest is sorted alphabetically. if (std::strcmp(src_name, "global_level_meter") == 0) { sie->global_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "equalizer_input_level") == 0) { sie->equalizer_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "equalizer_output_level") == 0) { sie->equalizer_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "autogain_input_level") == 0) { sie->autogain_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "autogain_output_level") == 0) { sie->autogain_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "bass_enhancer_input_level") == 0) { sie->bass_enhancer_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "bass_enhancer_output_level") == 0) { sie->bass_enhancer_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "convolver_input_level") == 0) { sie->convolver_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "convolver_output_level") == 0) { sie->convolver_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "crossfeed_input_level") == 0) { sie->crossfeed_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "crossfeed_output_level") == 0) { sie->crossfeed_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "crystalizer_input_level") == 0) { sie->crystalizer_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "crystalizer_output_level") == 0) { sie->crystalizer_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "deesser_input_level") == 0) { sie->deesser_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "deesser_output_level") == 0) { sie->deesser_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "delay_input_level") == 0) { sie->delay_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "delay_output_level") == 0) { sie->delay_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "exciter_input_level") == 0) { sie->exciter_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "exciter_output_level") == 0) { sie->exciter_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "gate_input_level") == 0) { sie->gate_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "gate_output_level") == 0) { sie->gate_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "loudness_input_level") == 0) { sie->loudness_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "loudness_output_level") == 0) { sie->loudness_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "maximizer_input_level") == 0) { sie->maximizer_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "maximizer_output_level") == 0) { sie->maximizer_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "pitch_input_level") == 0) { sie->pitch_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "pitch_output_level") == 0) { sie->pitch_output_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "rnnoise_input_level") == 0) { sie->rnnoise_input_level.emit(SinkInputEffects::get_peak(message)); } else if (std::strcmp(src_name, "rnnoise_output_level") == 0) { sie->rnnoise_output_level.emit(SinkInputEffects::get_peak(message)); } } } // namespace SinkInputEffects::SinkInputEffects(PulseManager* pulse_manager) : PipelineBase("sie: ", pulse_manager) { std::string pulse_props = "application.id=com.github.wwmm.pulseeffects.sinkinputs"; child_settings = g_settings_new("com.github.wwmm.pulseeffects.sinkinputs"); set_pulseaudio_props(pulse_props); set_source_monitor_name(pm->apps_sink_info->monitor_source_name); set_caps(pm->apps_sink_info->rate); auto* PULSE_SINK = std::getenv("PULSE_SINK"); if (PULSE_SINK != nullptr) { if (pm->get_sink_info(PULSE_SINK)) { set_output_sink_name(PULSE_SINK); } else { set_output_sink_name(pm->server_info.default_sink_name); } } else { bool use_default_sink = g_settings_get_boolean(settings, "use-default-sink") != 0; if (use_default_sink) { set_output_sink_name(pm->server_info.default_sink_name); } else { gchar* custom_sink = g_settings_get_string(settings, "custom-sink"); if (pm->get_sink_info(custom_sink)) { set_output_sink_name(custom_sink); } else { set_output_sink_name(pm->server_info.default_sink_name); } g_free(custom_sink); } } pm->sink_input_added.connect(sigc::mem_fun(*this, &SinkInputEffects::on_app_added)); pm->sink_input_changed.connect(sigc::mem_fun(*this, &SinkInputEffects::on_app_changed)); pm->sink_input_removed.connect(sigc::mem_fun(*this, &SinkInputEffects::on_app_removed)); pm->sink_changed.connect(sigc::mem_fun(*this, &SinkInputEffects::on_sink_changed)); g_settings_bind(child_settings, "buffer-pulsesrc", source, "buffer-time", G_SETTINGS_BIND_DEFAULT); g_settings_bind(child_settings, "latency-pulsesrc", source, "latency-time", G_SETTINGS_BIND_DEFAULT); g_settings_bind(child_settings, "buffer-pulsesink", sink, "buffer-time", G_SETTINGS_BIND_DEFAULT); g_settings_bind(child_settings, "latency-pulsesink", sink, "latency-time", G_SETTINGS_BIND_DEFAULT); // element message callback g_signal_connect(bus, "message::element", G_CALLBACK(on_message_element), this); limiter = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.limiter", "/com/github/wwmm/pulseeffects/sinkinputs/limiter/"); compressor = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.compressor", "/com/github/wwmm/pulseeffects/sinkinputs/compressor/"); filter = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.filter", "/com/github/wwmm/pulseeffects/sinkinputs/filter/"); equalizer = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.equalizer", "/com/github/wwmm/pulseeffects/sinkinputs/equalizer/", "com.github.wwmm.pulseeffects.equalizer.channel", "/com/github/wwmm/pulseeffects/sinkinputs/equalizer/leftchannel/", "/com/github/wwmm/pulseeffects/sinkinputs/equalizer/rightchannel/"); reverb = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.reverb", "/com/github/wwmm/pulseeffects/sinkinputs/reverb/"); bass_enhancer = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.bassenhancer", "/com/github/wwmm/pulseeffects/sinkinputs/bassenhancer/"); exciter = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.exciter", "/com/github/wwmm/pulseeffects/sinkinputs/exciter/"); crossfeed = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.crossfeed", "/com/github/wwmm/pulseeffects/sinkinputs/crossfeed/"); maximizer = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.maximizer", "/com/github/wwmm/pulseeffects/sinkinputs/maximizer/"); multiband_compressor = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.multibandcompressor", "/com/github/wwmm/pulseeffects/sinkinputs/multibandcompressor/"); loudness = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.loudness", "/com/github/wwmm/pulseeffects/sinkinputs/loudness/"); gate = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.gate", "/com/github/wwmm/pulseeffects/sinkinputs/gate/"); pitch = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.pitch", "/com/github/wwmm/pulseeffects/sinkinputs/pitch/"); multiband_gate = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.multibandgate", "/com/github/wwmm/pulseeffects/sinkinputs/multibandgate/"); deesser = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.deesser", "/com/github/wwmm/pulseeffects/sinkinputs/deesser/"); stereo_tools = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.stereotools", "/com/github/wwmm/pulseeffects/sinkinputs/stereotools/"); convolver = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.convolver", "/com/github/wwmm/pulseeffects/sinkinputs/convolver/"); crystalizer = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.crystalizer", "/com/github/wwmm/pulseeffects/sinkinputs/crystalizer/"); autogain = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.autogain", "/com/github/wwmm/pulseeffects/sinkinputs/autogain/"); delay = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.delay", "/com/github/wwmm/pulseeffects/sinkinputs/delay/"); rnnoise = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.rnnoise", "/com/github/wwmm/pulseeffects/sinkinputs/rnnoise/"); // doing some plugin configurations rnnoise->set_caps_out(sampling_rate); g_settings_bind(settings, "blocksize-out", crystalizer->adapter, "blocksize", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "blocksize-out", convolver->adapter, "blocksize", G_SETTINGS_BIND_DEFAULT); // inserting the plugins in the containers plugins.insert(std::make_pair(limiter->name, limiter->plugin)); plugins.insert(std::make_pair(compressor->name, compressor->plugin)); plugins.insert(std::make_pair(filter->name, filter->plugin)); plugins.insert(std::make_pair(equalizer->name, equalizer->plugin)); plugins.insert(std::make_pair(reverb->name, reverb->plugin)); plugins.insert(std::make_pair(bass_enhancer->name, bass_enhancer->plugin)); plugins.insert(std::make_pair(exciter->name, exciter->plugin)); plugins.insert(std::make_pair(crossfeed->name, crossfeed->plugin)); plugins.insert(std::make_pair(maximizer->name, maximizer->plugin)); plugins.insert(std::make_pair(multiband_compressor->name, multiband_compressor->plugin)); plugins.insert(std::make_pair(loudness->name, loudness->plugin)); plugins.insert(std::make_pair(gate->name, gate->plugin)); plugins.insert(std::make_pair(pitch->name, pitch->plugin)); plugins.insert(std::make_pair(multiband_gate->name, multiband_gate->plugin)); plugins.insert(std::make_pair(deesser->name, deesser->plugin)); plugins.insert(std::make_pair(stereo_tools->name, stereo_tools->plugin)); plugins.insert(std::make_pair(convolver->name, convolver->plugin)); plugins.insert(std::make_pair(crystalizer->name, crystalizer->plugin)); plugins.insert(std::make_pair(autogain->name, autogain->plugin)); plugins.insert(std::make_pair(delay->name, delay->plugin)); plugins.insert(std::make_pair(rnnoise->name, rnnoise->plugin)); add_plugins_to_pipeline(); g_signal_connect(child_settings, "changed::plugins", G_CALLBACK(on_plugins_order_changed), this); } SinkInputEffects::~SinkInputEffects() { util::debug(log_tag + "destroyed"); } void SinkInputEffects::on_app_added(const std::shared_ptr& app_info) { PipelineBase::on_app_added(app_info); bool forbidden_app = false; bool success = false; auto* blocklist = g_settings_get_strv(settings, "blocklist-out"); for (std::size_t i = 0; blocklist[i] != nullptr; i++) { if (app_info->name == blocklist[i]) { forbidden_app = true; } g_free(blocklist[i]); } if (app_info->connected) { if (forbidden_app) { success = pm->remove_sink_input_from_pulseeffects(app_info->name, app_info->index); if (success) { app_info->connected = false; } } } else { auto enable_all = g_settings_get_boolean(settings, "enable-all-sinkinputs"); if (!forbidden_app && enable_all != 0) { success = pm->move_sink_input_to_pulseeffects(app_info->name, app_info->index); if (success) { app_info->connected = true; } } } g_free(blocklist); } void SinkInputEffects::add_plugins_to_pipeline() { gchar* name = nullptr; GVariantIter* iter = nullptr; std::vector default_order; g_settings_get(child_settings, "plugins", "as", &iter); while (g_variant_iter_next(iter, "s", &name) != 0) { plugins_order.emplace_back(name); g_free(name); } auto* gvariant = g_settings_get_default_value(child_settings, "plugins"); g_variant_get(gvariant, "as", &iter); g_variant_unref(gvariant); while (g_variant_iter_next(iter, "s", &name) != 0) { default_order.emplace_back(name); g_free(name); } g_variant_iter_free(iter); // updating user list if there is any new plugin if (plugins_order.size() != default_order.size()) { plugins_order = default_order; g_settings_reset(child_settings, "plugins"); } for (const auto& v : plugins_order) { // checking if the plugin exists. If not we reset the list to default if (std::find(default_order.begin(), default_order.end(), v) == default_order.end()) { plugins_order = default_order; g_settings_reset(child_settings, "plugins"); break; } } // adding plugins to effects_bin for (const auto& p : plugins) { gst_bin_add(GST_BIN(effects_bin), p.second); } // linking plugins gst_element_unlink(identity_in, identity_out); gst_element_link(identity_in, plugins[plugins_order[0]]); for (unsigned long int n = 1U; n < plugins_order.size(); n++) { gst_element_link(plugins[plugins_order[n - 1U]], plugins[plugins_order[n]]); } gst_element_link(plugins[plugins_order[plugins_order.size() - 1U]], identity_out); } easyeffects-4.8.7/src/sink_input_effects_ui.cpp000066400000000000000000000707651424023573300217270ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "sink_input_effects_ui.hpp" #include "rnnoise_ui.hpp" SinkInputEffectsUi::SinkInputEffectsUi(BaseObjectType* cobject, const Glib::RefPtr& refBuilder, const Glib::RefPtr& refSettings, SinkInputEffects* sie_ptr) : Gtk::Box(cobject), EffectsBaseUi(refBuilder, refSettings, sie_ptr->pm), sie(sie_ptr) { // populate stack auto b_limiter = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/limiter.glade"); auto b_compressor = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/compressor.glade"); auto b_filter = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/filter.glade"); auto b_equalizer = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/equalizer.glade"); auto b_pitch = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/pitch.glade"); auto b_reverb = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/reverb.glade"); auto b_bass_enhancer = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/bass_enhancer.glade"); auto b_exciter = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/exciter.glade"); auto b_crossfeed = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/crossfeed.glade"); auto b_maximizer = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/maximizer.glade"); auto b_multiband_compressor = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/multiband_compressor.glade"); auto b_loudness = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/loudness.glade"); auto b_gate = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/gate.glade"); auto b_multiband_gate = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/multiband_gate.glade"); auto b_deesser = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/deesser.glade"); auto b_stereo_tools = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/stereo_tools.glade"); auto b_convolver = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/convolver.glade"); auto b_crystalizer = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/crystalizer.glade"); auto b_autogain = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/autogain.glade"); auto b_delay = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/delay.glade"); auto b_rnnoise = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/rnnoise.glade"); b_limiter->get_widget_derived("widgets_grid", limiter_ui, "com.github.wwmm.pulseeffects.limiter", "/com/github/wwmm/pulseeffects/sinkinputs/limiter/"); b_compressor->get_widget_derived("widgets_grid", compressor_ui, "com.github.wwmm.pulseeffects.compressor", "/com/github/wwmm/pulseeffects/sinkinputs/compressor/"); b_filter->get_widget_derived("widgets_grid", filter_ui, "com.github.wwmm.pulseeffects.filter", "/com/github/wwmm/pulseeffects/sinkinputs/filter/"); b_equalizer->get_widget_derived("widgets_grid", equalizer_ui, "com.github.wwmm.pulseeffects.equalizer", "/com/github/wwmm/pulseeffects/sinkinputs/equalizer/", "com.github.wwmm.pulseeffects.equalizer.channel", "/com/github/wwmm/pulseeffects/sinkinputs/equalizer/leftchannel/", "/com/github/wwmm/pulseeffects/sinkinputs/equalizer/rightchannel/"); b_pitch->get_widget_derived("widgets_grid", pitch_ui, "com.github.wwmm.pulseeffects.pitch", "/com/github/wwmm/pulseeffects/sinkinputs/pitch/"); b_reverb->get_widget_derived("widgets_grid", reverb_ui, "com.github.wwmm.pulseeffects.reverb", "/com/github/wwmm/pulseeffects/sinkinputs/reverb/"); b_bass_enhancer->get_widget_derived("widgets_grid", bass_enhancer_ui, "com.github.wwmm.pulseeffects.bassenhancer", "/com/github/wwmm/pulseeffects/sinkinputs/bassenhancer/"); b_exciter->get_widget_derived("widgets_grid", exciter_ui, "com.github.wwmm.pulseeffects.exciter", "/com/github/wwmm/pulseeffects/sinkinputs/exciter/"); b_crossfeed->get_widget_derived("widgets_grid", crossfeed_ui, "com.github.wwmm.pulseeffects.crossfeed", "/com/github/wwmm/pulseeffects/sinkinputs/crossfeed/"); b_maximizer->get_widget_derived("widgets_grid", maximizer_ui, "com.github.wwmm.pulseeffects.maximizer", "/com/github/wwmm/pulseeffects/sinkinputs/maximizer/"); b_multiband_compressor->get_widget_derived("widgets_grid", multiband_compressor_ui, "com.github.wwmm.pulseeffects.multibandcompressor", "/com/github/wwmm/pulseeffects/sinkinputs/multibandcompressor/"); b_loudness->get_widget_derived("widgets_grid", loudness_ui, "com.github.wwmm.pulseeffects.loudness", "/com/github/wwmm/pulseeffects/sinkinputs/loudness/"); b_gate->get_widget_derived("widgets_grid", gate_ui, "com.github.wwmm.pulseeffects.gate", "/com/github/wwmm/pulseeffects/sinkinputs/gate/"); b_multiband_gate->get_widget_derived("widgets_grid", multiband_gate_ui, "com.github.wwmm.pulseeffects.multibandgate", "/com/github/wwmm/pulseeffects/sinkinputs/multibandgate/"); b_deesser->get_widget_derived("widgets_grid", deesser_ui, "com.github.wwmm.pulseeffects.deesser", "/com/github/wwmm/pulseeffects/sinkinputs/deesser/"); b_stereo_tools->get_widget_derived("widgets_grid", stereo_tools_ui, "com.github.wwmm.pulseeffects.stereotools", "/com/github/wwmm/pulseeffects/sinkinputs/stereotools/"); b_convolver->get_widget_derived("widgets_grid", convolver_ui, "com.github.wwmm.pulseeffects.convolver", "/com/github/wwmm/pulseeffects/sinkinputs/convolver/"); b_crystalizer->get_widget_derived("widgets_grid", crystalizer_ui, "com.github.wwmm.pulseeffects.crystalizer", "/com/github/wwmm/pulseeffects/sinkinputs/crystalizer/"); b_autogain->get_widget_derived("widgets_grid", autogain_ui, "com.github.wwmm.pulseeffects.autogain", "/com/github/wwmm/pulseeffects/sinkinputs/autogain/"); b_delay->get_widget_derived("widgets_grid", delay_ui, "com.github.wwmm.pulseeffects.delay", "/com/github/wwmm/pulseeffects/sinkinputs/delay/"); b_rnnoise->get_widget_derived("widgets_grid", rnnoise_ui, "com.github.wwmm.pulseeffects.rnnoise", "/com/github/wwmm/pulseeffects/sinkinputs/rnnoise/"); // add to stack stack->add(*limiter_ui, limiter_ui->name); stack->add(*compressor_ui, compressor_ui->name); stack->add(*filter_ui, filter_ui->name); stack->add(*equalizer_ui, equalizer_ui->name); stack->add(*pitch_ui, pitch_ui->name); stack->add(*reverb_ui, reverb_ui->name); stack->add(*bass_enhancer_ui, bass_enhancer_ui->name); stack->add(*exciter_ui, exciter_ui->name); stack->add(*crossfeed_ui, crossfeed_ui->name); stack->add(*maximizer_ui, maximizer_ui->name); stack->add(*multiband_compressor_ui, multiband_compressor_ui->name); stack->add(*loudness_ui, loudness_ui->name); stack->add(*gate_ui, gate_ui->name); stack->add(*multiband_gate_ui, multiband_gate_ui->name); stack->add(*deesser_ui, deesser_ui->name); stack->add(*stereo_tools_ui, stereo_tools_ui->name); stack->add(*convolver_ui, convolver_ui->name); stack->add(*crystalizer_ui, crystalizer_ui->name); stack->add(*autogain_ui, autogain_ui->name); stack->add(*delay_ui, delay_ui->name); stack->add(*rnnoise_ui, rnnoise_ui->name); // populate_listbox add_to_listbox(limiter_ui); add_to_listbox(compressor_ui); add_to_listbox(filter_ui); add_to_listbox(equalizer_ui); add_to_listbox(pitch_ui); add_to_listbox(reverb_ui); add_to_listbox(bass_enhancer_ui); add_to_listbox(exciter_ui); add_to_listbox(crossfeed_ui); add_to_listbox(maximizer_ui); add_to_listbox(multiband_compressor_ui); add_to_listbox(loudness_ui); add_to_listbox(gate_ui); add_to_listbox(multiband_gate_ui); add_to_listbox(deesser_ui); add_to_listbox(stereo_tools_ui); add_to_listbox(convolver_ui); add_to_listbox(crystalizer_ui); add_to_listbox(autogain_ui); add_to_listbox(delay_ui); add_to_listbox(rnnoise_ui); // show only speaker icon before "Application" label app_output_icon->set_visible(true); level_meters_connections(); up_down_connections(); connections.emplace_back(sie->new_spectrum.connect(sigc::mem_fun(*spectrum_ui, &SpectrumUi::on_new_spectrum))); connections.emplace_back(sie->pm->sink_input_added.connect(sigc::mem_fun(this, &SinkInputEffectsUi::on_app_added))); connections.emplace_back( sie->pm->sink_input_changed.connect(sigc::mem_fun(this, &SinkInputEffectsUi::on_app_changed))); connections.emplace_back( sie->pm->sink_input_removed.connect(sigc::mem_fun(this, &SinkInputEffectsUi::on_app_removed))); } SinkInputEffectsUi::~SinkInputEffectsUi() { sie->disable_spectrum(); util::debug(log_tag + "destroyed"); } auto SinkInputEffectsUi::add_to_stack(Gtk::Stack* stack, SinkInputEffects* sie_ptr) -> SinkInputEffectsUi* { auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/effects_base.glade"); auto settings = Gio::Settings::create("com.github.wwmm.pulseeffects.sinkinputs"); SinkInputEffectsUi* ui = nullptr; builder->get_widget_derived("widgets_box", ui, settings, sie_ptr); stack->add(*ui, "sink_inputs"); stack->child_property_icon_name(*ui).set_value("audio-speakers-symbolic"); return ui; } void SinkInputEffectsUi::on_app_added(std::shared_ptr app_info) { // Blocklist check auto forbidden_app = BlocklistSettingsUi::app_is_blocklisted(app_info->name, PresetType::output); if (forbidden_app) { app_info->visible = BlocklistSettingsUi::get_blocklisted_apps_visibility(); if (!app_info->visible) { return; } } else { app_info->visible = true; } // Duplicate entry check for (const auto& a : apps_list) { if (a->app_info->index == app_info->index) { // do not add the same app two times in the interface return; } } auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/app_info.glade"); AppInfoUi* appui = nullptr; builder->get_widget_derived("widgets_grid", appui, app_info, pm); apps_box->add(*appui); apps_list.emplace_back(appui); } void SinkInputEffectsUi::level_meters_connections() { // global output level meter connection connections.emplace_back( sie->global_output_level.connect(sigc::mem_fun(this, &SinkInputEffectsUi::on_new_output_level_db))); // limiter level meters connections connections.emplace_back( sie->limiter->input_level.connect(sigc::mem_fun(*limiter_ui, &LimiterUi::on_new_input_level))); connections.emplace_back( sie->limiter->output_level.connect(sigc::mem_fun(*limiter_ui, &LimiterUi::on_new_output_level))); connections.emplace_back( sie->limiter->attenuation.connect(sigc::mem_fun(*limiter_ui, &LimiterUi::on_new_attenuation))); // compressor level meters connections connections.emplace_back( sie->compressor->input_level.connect(sigc::mem_fun(*compressor_ui, &CompressorUi::on_new_input_level))); connections.emplace_back( sie->compressor->output_level.connect(sigc::mem_fun(*compressor_ui, &CompressorUi::on_new_output_level))); connections.emplace_back( sie->compressor->reduction.connect(sigc::mem_fun(*compressor_ui, &CompressorUi::on_new_reduction))); connections.emplace_back( sie->compressor->sidechain.connect(sigc::mem_fun(*compressor_ui, &CompressorUi::on_new_sidechain))); connections.emplace_back(sie->compressor->curve.connect(sigc::mem_fun(*compressor_ui, &CompressorUi::on_new_curve))); // filter level meters connections connections.emplace_back(sie->filter->input_level.connect(sigc::mem_fun(*filter_ui, &FilterUi::on_new_input_level))); connections.emplace_back( sie->filter->output_level.connect(sigc::mem_fun(*filter_ui, &FilterUi::on_new_output_level))); // equalizer level meters connections connections.emplace_back( sie->equalizer_input_level.connect(sigc::mem_fun(*equalizer_ui, &EqualizerUi::on_new_input_level_db))); connections.emplace_back( sie->equalizer_output_level.connect(sigc::mem_fun(*equalizer_ui, &EqualizerUi::on_new_output_level_db))); // pitch level meters connections connections.emplace_back(sie->pitch_input_level.connect(sigc::mem_fun(*pitch_ui, &PitchUi::on_new_input_level_db))); connections.emplace_back(sie->pitch_output_level.connect(sigc::mem_fun(*pitch_ui, &PitchUi::on_new_output_level_db))); // reverb level meters connections connections.emplace_back(sie->reverb->input_level.connect(sigc::mem_fun(*reverb_ui, &ReverbUi::on_new_input_level))); connections.emplace_back( sie->reverb->output_level.connect(sigc::mem_fun(*reverb_ui, &ReverbUi::on_new_output_level))); // bass_enhancer level meters connections connections.emplace_back( sie->bass_enhancer_input_level.connect(sigc::mem_fun(*bass_enhancer_ui, &BassEnhancerUi::on_new_input_level_db))); connections.emplace_back(sie->bass_enhancer_output_level.connect( sigc::mem_fun(*bass_enhancer_ui, &BassEnhancerUi::on_new_output_level_db))); connections.emplace_back( sie->bass_enhancer->harmonics.connect(sigc::mem_fun(*bass_enhancer_ui, &BassEnhancerUi::on_new_harmonics_level))); // exciter level meters connections connections.emplace_back( sie->exciter_input_level.connect(sigc::mem_fun(*exciter_ui, &ExciterUi::on_new_input_level_db))); connections.emplace_back( sie->exciter_output_level.connect(sigc::mem_fun(*exciter_ui, &ExciterUi::on_new_output_level_db))); connections.emplace_back( sie->exciter->harmonics.connect(sigc::mem_fun(*exciter_ui, &ExciterUi::on_new_harmonics_level))); // crossfeed level meters connections connections.emplace_back( sie->crossfeed_input_level.connect(sigc::mem_fun(*crossfeed_ui, &CrossfeedUi::on_new_input_level_db))); connections.emplace_back( sie->crossfeed_output_level.connect(sigc::mem_fun(*crossfeed_ui, &CrossfeedUi::on_new_output_level_db))); // maximizer level meters connections connections.emplace_back( sie->maximizer_input_level.connect(sigc::mem_fun(*maximizer_ui, &MaximizerUi::on_new_input_level_db))); connections.emplace_back( sie->maximizer_output_level.connect(sigc::mem_fun(*maximizer_ui, &MaximizerUi::on_new_output_level_db))); connections.emplace_back( sie->maximizer->reduction.connect(sigc::mem_fun(*maximizer_ui, &MaximizerUi::on_new_reduction))); // multiband_compressor level meters connections connections.emplace_back(sie->multiband_compressor->input_level.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_input_level))); connections.emplace_back(sie->multiband_compressor->output_level.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_output_level))); connections.emplace_back(sie->multiband_compressor->output0.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_output0))); connections.emplace_back(sie->multiband_compressor->output1.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_output1))); connections.emplace_back(sie->multiband_compressor->output2.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_output2))); connections.emplace_back(sie->multiband_compressor->output3.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_output3))); connections.emplace_back(sie->multiband_compressor->compression0.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_compression0))); connections.emplace_back(sie->multiband_compressor->compression1.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_compression1))); connections.emplace_back(sie->multiband_compressor->compression2.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_compression2))); connections.emplace_back(sie->multiband_compressor->compression3.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_compression3))); // loudness level meters connections connections.emplace_back( sie->loudness_input_level.connect(sigc::mem_fun(*loudness_ui, &LoudnessUi::on_new_input_level_db))); connections.emplace_back( sie->loudness_output_level.connect(sigc::mem_fun(*loudness_ui, &LoudnessUi::on_new_output_level_db))); // gate level meters connections connections.emplace_back(sie->gate_input_level.connect(sigc::mem_fun(*gate_ui, &GateUi::on_new_input_level_db))); connections.emplace_back(sie->gate_output_level.connect(sigc::mem_fun(*gate_ui, &GateUi::on_new_output_level_db))); connections.emplace_back(sie->gate->gating.connect(sigc::mem_fun(*gate_ui, &GateUi::on_new_gating))); // multiband_gate level meters connections connections.emplace_back(sie->multiband_gate->input_level.connect( sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_input_level))); connections.emplace_back(sie->multiband_gate->output_level.connect( sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_output_level))); connections.emplace_back( sie->multiband_gate->output0.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_output0))); connections.emplace_back( sie->multiband_gate->output1.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_output1))); connections.emplace_back( sie->multiband_gate->output2.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_output2))); connections.emplace_back( sie->multiband_gate->output3.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_output3))); connections.emplace_back( sie->multiband_gate->gating0.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_gating0))); connections.emplace_back( sie->multiband_gate->gating1.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_gating1))); connections.emplace_back( sie->multiband_gate->gating2.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_gating2))); connections.emplace_back( sie->multiband_gate->gating3.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_gating3))); // deesser level meters connections connections.emplace_back( sie->deesser_input_level.connect(sigc::mem_fun(*deesser_ui, &DeesserUi::on_new_input_level_db))); connections.emplace_back( sie->deesser_output_level.connect(sigc::mem_fun(*deesser_ui, &DeesserUi::on_new_output_level_db))); connections.emplace_back( sie->deesser->compression.connect(sigc::mem_fun(*deesser_ui, &DeesserUi::on_new_compression))); connections.emplace_back(sie->deesser->detected.connect(sigc::mem_fun(*deesser_ui, &DeesserUi::on_new_detected))); // stereo_tools level meters connections connections.emplace_back( sie->stereo_tools->input_level.connect(sigc::mem_fun(*stereo_tools_ui, &StereoToolsUi::on_new_input_level))); connections.emplace_back( sie->stereo_tools->output_level.connect(sigc::mem_fun(*stereo_tools_ui, &StereoToolsUi::on_new_output_level))); // convolver level meters connections connections.emplace_back( sie->convolver_input_level.connect(sigc::mem_fun(*convolver_ui, &ConvolverUi::on_new_input_level_db))); connections.emplace_back( sie->convolver_output_level.connect(sigc::mem_fun(*convolver_ui, &ConvolverUi::on_new_output_level_db))); // crystalizer level meters connections connections.emplace_back( sie->crystalizer_input_level.connect(sigc::mem_fun(*crystalizer_ui, &CrystalizerUi::on_new_input_level_db))); connections.emplace_back( sie->crystalizer_output_level.connect(sigc::mem_fun(*crystalizer_ui, &CrystalizerUi::on_new_output_level_db))); connections.emplace_back( sie->crystalizer->range_before.connect(sigc::mem_fun(*crystalizer_ui, &CrystalizerUi::on_new_range_before))); connections.emplace_back( sie->crystalizer->range_after.connect(sigc::mem_fun(*crystalizer_ui, &CrystalizerUi::on_new_range_after))); // autogain level meters connections connections.emplace_back( sie->autogain_input_level.connect(sigc::mem_fun(*autogain_ui, &AutoGainUi::on_new_input_level_db))); connections.emplace_back( sie->autogain_output_level.connect(sigc::mem_fun(*autogain_ui, &AutoGainUi::on_new_output_level_db))); connections.emplace_back( sie->autogain->momentary.connect(sigc::mem_fun(*autogain_ui, &AutoGainUi::on_new_momentary))); connections.emplace_back( sie->autogain->shortterm.connect(sigc::mem_fun(*autogain_ui, &AutoGainUi::on_new_shortterm))); connections.emplace_back( sie->autogain->integrated.connect(sigc::mem_fun(*autogain_ui, &AutoGainUi::on_new_integrated))); connections.emplace_back(sie->autogain->relative.connect(sigc::mem_fun(*autogain_ui, &AutoGainUi::on_new_relative))); connections.emplace_back(sie->autogain->loudness.connect(sigc::mem_fun(*autogain_ui, &AutoGainUi::on_new_loudness))); connections.emplace_back(sie->autogain->range.connect(sigc::mem_fun(*autogain_ui, &AutoGainUi::on_new_range))); connections.emplace_back(sie->autogain->gain.connect(sigc::mem_fun(*autogain_ui, &AutoGainUi::on_new_gain))); // delay level meters connections connections.emplace_back(sie->delay_input_level.connect(sigc::mem_fun(*delay_ui, &DelayUi::on_new_input_level_db))); connections.emplace_back(sie->delay_output_level.connect(sigc::mem_fun(*delay_ui, &DelayUi::on_new_output_level_db))); // rnnoise level meters connections connections.emplace_back( sie->rnnoise_input_level.connect(sigc::mem_fun(*rnnoise_ui, &RNNoiseUi::on_new_input_level_db))); connections.emplace_back( sie->rnnoise_output_level.connect(sigc::mem_fun(*rnnoise_ui, &RNNoiseUi::on_new_output_level_db))); } void SinkInputEffectsUi::up_down_connections() { auto on_up = [=](auto p) { auto order = Glib::Variant>(); settings->get_value("plugins", order); auto vorder = order.get(); auto r = std::find(std::begin(vorder), std::end(vorder), p->name); if (r != std::begin(vorder)) { std::iter_swap(r, r - 1); settings->set_string_array("plugins", vorder); } }; auto on_down = [=](auto p) { auto order = Glib::Variant>(); settings->get_value("plugins", order); auto vorder = order.get(); auto r = std::find(std::begin(vorder), std::end(vorder), p->name); if (r != std::end(vorder) - 1) { std::iter_swap(r, r + 1); settings->set_string_array("plugins", vorder); } }; connections.emplace_back(limiter_ui->plugin_up->signal_clicked().connect([=]() { on_up(limiter_ui); })); connections.emplace_back(limiter_ui->plugin_down->signal_clicked().connect([=]() { on_down(limiter_ui); })); connections.emplace_back(compressor_ui->plugin_up->signal_clicked().connect([=]() { on_up(compressor_ui); })); connections.emplace_back(compressor_ui->plugin_down->signal_clicked().connect([=]() { on_down(compressor_ui); })); connections.emplace_back(filter_ui->plugin_up->signal_clicked().connect([=]() { on_up(filter_ui); })); connections.emplace_back(filter_ui->plugin_down->signal_clicked().connect([=]() { on_down(filter_ui); })); connections.emplace_back(pitch_ui->plugin_up->signal_clicked().connect([=]() { on_up(pitch_ui); })); connections.emplace_back(pitch_ui->plugin_down->signal_clicked().connect([=]() { on_down(pitch_ui); })); connections.emplace_back(equalizer_ui->plugin_up->signal_clicked().connect([=]() { on_up(equalizer_ui); })); connections.emplace_back(equalizer_ui->plugin_down->signal_clicked().connect([=]() { on_down(equalizer_ui); })); connections.emplace_back(reverb_ui->plugin_up->signal_clicked().connect([=]() { on_up(reverb_ui); })); connections.emplace_back(reverb_ui->plugin_down->signal_clicked().connect([=]() { on_down(reverb_ui); })); connections.emplace_back(bass_enhancer_ui->plugin_up->signal_clicked().connect([=]() { on_up(bass_enhancer_ui); })); connections.emplace_back( bass_enhancer_ui->plugin_down->signal_clicked().connect([=]() { on_down(bass_enhancer_ui); })); connections.emplace_back(exciter_ui->plugin_up->signal_clicked().connect([=]() { on_up(exciter_ui); })); connections.emplace_back(exciter_ui->plugin_down->signal_clicked().connect([=]() { on_down(exciter_ui); })); connections.emplace_back(crossfeed_ui->plugin_up->signal_clicked().connect([=]() { on_up(crossfeed_ui); })); connections.emplace_back(crossfeed_ui->plugin_down->signal_clicked().connect([=]() { on_down(crossfeed_ui); })); connections.emplace_back(maximizer_ui->plugin_up->signal_clicked().connect([=]() { on_up(maximizer_ui); })); connections.emplace_back(maximizer_ui->plugin_down->signal_clicked().connect([=]() { on_down(maximizer_ui); })); connections.emplace_back( multiband_compressor_ui->plugin_up->signal_clicked().connect([=]() { on_up(multiband_compressor_ui); })); connections.emplace_back( multiband_compressor_ui->plugin_down->signal_clicked().connect([=]() { on_down(multiband_compressor_ui); })); connections.emplace_back(loudness_ui->plugin_up->signal_clicked().connect([=]() { on_up(loudness_ui); })); connections.emplace_back(loudness_ui->plugin_down->signal_clicked().connect([=]() { on_down(loudness_ui); })); connections.emplace_back(gate_ui->plugin_up->signal_clicked().connect([=]() { on_up(gate_ui); })); connections.emplace_back(gate_ui->plugin_down->signal_clicked().connect([=]() { on_down(gate_ui); })); connections.emplace_back(multiband_gate_ui->plugin_up->signal_clicked().connect([=]() { on_up(multiband_gate_ui); })); connections.emplace_back( multiband_gate_ui->plugin_down->signal_clicked().connect([=]() { on_down(multiband_gate_ui); })); connections.emplace_back(deesser_ui->plugin_up->signal_clicked().connect([=]() { on_up(deesser_ui); })); connections.emplace_back(deesser_ui->plugin_down->signal_clicked().connect([=]() { on_down(deesser_ui); })); connections.emplace_back(stereo_tools_ui->plugin_up->signal_clicked().connect([=]() { on_up(stereo_tools_ui); })); connections.emplace_back(stereo_tools_ui->plugin_down->signal_clicked().connect([=]() { on_down(stereo_tools_ui); })); connections.emplace_back(convolver_ui->plugin_up->signal_clicked().connect([=]() { on_up(convolver_ui); })); connections.emplace_back(convolver_ui->plugin_down->signal_clicked().connect([=]() { on_down(convolver_ui); })); connections.emplace_back(crystalizer_ui->plugin_up->signal_clicked().connect([=]() { on_up(crystalizer_ui); })); connections.emplace_back(crystalizer_ui->plugin_down->signal_clicked().connect([=]() { on_down(crystalizer_ui); })); connections.emplace_back(autogain_ui->plugin_up->signal_clicked().connect([=]() { on_up(autogain_ui); })); connections.emplace_back(autogain_ui->plugin_down->signal_clicked().connect([=]() { on_down(autogain_ui); })); connections.emplace_back(delay_ui->plugin_up->signal_clicked().connect([=]() { on_up(delay_ui); })); connections.emplace_back(delay_ui->plugin_down->signal_clicked().connect([=]() { on_down(delay_ui); })); connections.emplace_back(rnnoise_ui->plugin_up->signal_clicked().connect([=]() { on_up(rnnoise_ui); })); connections.emplace_back(rnnoise_ui->plugin_down->signal_clicked().connect([=]() { on_down(rnnoise_ui); })); } easyeffects-4.8.7/src/source_output_effects.cpp000066400000000000000000000301631424023573300217530ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "source_output_effects.hpp" #include #include "pipeline_common.hpp" #include "rnnoise.hpp" namespace { void on_message_element(const GstBus* gst_bus, GstMessage* message, SourceOutputEffects* soe) { auto* src_name = GST_OBJECT_NAME(message->src); // To optimize this call we move at the top of the nested "if statements" the most used messages // which are 'global_level_meter' and the level meters for the most used plugins for source outputs: // equalizer and webrtc. The rest is sorted alphabetically. if (std::strcmp(src_name, "global_level_meter") == 0) { soe->global_output_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "equalizer_input_level") == 0) { soe->equalizer_input_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "equalizer_output_level") == 0) { soe->equalizer_output_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "webrtc_input_level") == 0) { soe->webrtc_input_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "webrtc_output_level") == 0) { soe->webrtc_output_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "deesser_input_level") == 0) { soe->deesser_input_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "deesser_output_level") == 0) { soe->deesser_output_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "gate_input_level") == 0) { soe->gate_input_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "gate_output_level") == 0) { soe->gate_output_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "maximizer_input_level") == 0) { soe->maximizer_input_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "maximizer_output_level") == 0) { soe->maximizer_output_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "pitch_input_level") == 0) { soe->pitch_input_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "pitch_output_level") == 0) { soe->pitch_output_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "rnnoise_input_level") == 0) { soe->rnnoise_input_level.emit(SourceOutputEffects::get_peak(message)); } else if (std::strcmp(src_name, "rnnoise_output_level") == 0) { soe->rnnoise_output_level.emit(SourceOutputEffects::get_peak(message)); } } } // namespace SourceOutputEffects::SourceOutputEffects(PulseManager* pulse_manager) : PipelineBase("soe: ", pulse_manager) { std::string pulse_props = "application.id=com.github.wwmm.pulseeffects.sourceoutputs"; child_settings = g_settings_new("com.github.wwmm.pulseeffects.sourceoutputs"); set_pulseaudio_props(pulse_props); set_output_sink_name("PulseEffects_mic"); set_caps(pm->mic_sink_info->rate); auto* PULSE_SOURCE = std::getenv("PULSE_SOURCE"); if (PULSE_SOURCE != nullptr) { if (pm->get_source_info(PULSE_SOURCE)) { set_source_monitor_name(PULSE_SOURCE); } else { set_source_monitor_name(pm->server_info.default_source_name); } } else { bool use_default_source = g_settings_get_boolean(settings, "use-default-source") != 0; if (use_default_source) { set_source_monitor_name(pm->server_info.default_source_name); } else { gchar* custom_source = g_settings_get_string(settings, "custom-source"); if (pm->get_source_info(custom_source)) { set_source_monitor_name(custom_source); } else { set_source_monitor_name(pm->server_info.default_source_name); } g_free(custom_source); } } pm->source_output_added.connect(sigc::mem_fun(*this, &SourceOutputEffects::on_app_added)); pm->source_output_changed.connect(sigc::mem_fun(*this, &SourceOutputEffects::on_app_changed)); pm->source_output_removed.connect(sigc::mem_fun(*this, &SourceOutputEffects::on_app_removed)); pm->source_changed.connect(sigc::mem_fun(*this, &SourceOutputEffects::on_source_changed)); g_settings_bind(child_settings, "buffer-pulsesrc", source, "buffer-time", G_SETTINGS_BIND_DEFAULT); g_settings_bind(child_settings, "latency-pulsesrc", source, "latency-time", G_SETTINGS_BIND_DEFAULT); g_settings_bind(child_settings, "buffer-pulsesink", sink, "buffer-time", G_SETTINGS_BIND_DEFAULT); g_settings_bind(child_settings, "latency-pulsesink", sink, "latency-time", G_SETTINGS_BIND_DEFAULT); // element message callback g_signal_connect(bus, "message::element", G_CALLBACK(on_message_element), this); limiter = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.limiter", "/com/github/wwmm/pulseeffects/sourceoutputs/limiter/"); compressor = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.compressor", "/com/github/wwmm/pulseeffects/sourceoutputs/compressor/"); filter = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.filter", "/com/github/wwmm/pulseeffects/sourceoutputs/filter/"); equalizer = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.equalizer", "/com/github/wwmm/pulseeffects/sourceoutputs/equalizer/", "com.github.wwmm.pulseeffects.equalizer.channel", "/com/github/wwmm/pulseeffects/sourceoutputs/equalizer/leftchannel/", "/com/github/wwmm/pulseeffects/sourceoutputs/equalizer/rightchannel/"); reverb = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.reverb", "/com/github/wwmm/pulseeffects/sourceoutputs/reverb/"); gate = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.gate", "/com/github/wwmm/pulseeffects/sourceoutputs/gate/"); deesser = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.deesser", "/com/github/wwmm/pulseeffects/sourceoutputs/deesser/"); pitch = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.pitch", "/com/github/wwmm/pulseeffects/sourceoutputs/pitch/"); webrtc = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.webrtc", "/com/github/wwmm/pulseeffects/sourceoutputs/webrtc/", pm->mic_sink_info->rate); multiband_compressor = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.multibandcompressor", "/com/github/wwmm/pulseeffects/sourceoutputs/multibandcompressor/"); multiband_gate = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.multibandgate", "/com/github/wwmm/pulseeffects/sourceoutputs/multibandgate/"); stereo_tools = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.stereotools", "/com/github/wwmm/pulseeffects/sourceoutputs/stereotools/"); maximizer = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.maximizer", "/com/github/wwmm/pulseeffects/sourceoutputs/maximizer/"); rnnoise = std::make_unique(log_tag, "com.github.wwmm.pulseeffects.rnnoise", "/com/github/wwmm/pulseeffects/sourceoutputs/rnnoise/"); rnnoise->set_caps_out(sampling_rate); plugins.insert(std::make_pair(limiter->name, limiter->plugin)); plugins.insert(std::make_pair(compressor->name, compressor->plugin)); plugins.insert(std::make_pair(filter->name, filter->plugin)); plugins.insert(std::make_pair(equalizer->name, equalizer->plugin)); plugins.insert(std::make_pair(reverb->name, reverb->plugin)); plugins.insert(std::make_pair(gate->name, gate->plugin)); plugins.insert(std::make_pair(deesser->name, deesser->plugin)); plugins.insert(std::make_pair(pitch->name, pitch->plugin)); plugins.insert(std::make_pair(webrtc->name, webrtc->plugin)); plugins.insert(std::make_pair(multiband_compressor->name, multiband_compressor->plugin)); plugins.insert(std::make_pair(multiband_gate->name, multiband_gate->plugin)); plugins.insert(std::make_pair(stereo_tools->name, stereo_tools->plugin)); plugins.insert(std::make_pair(maximizer->name, maximizer->plugin)); plugins.insert(std::make_pair(rnnoise->name, rnnoise->plugin)); add_plugins_to_pipeline(); g_signal_connect(child_settings, "changed::plugins", G_CALLBACK(on_plugins_order_changed), this); } SourceOutputEffects::~SourceOutputEffects() { util::debug(log_tag + "destroyed"); } void SourceOutputEffects::on_app_added(const std::shared_ptr& app_info) { PipelineBase::on_app_added(app_info); bool forbidden_app = false; bool success = false; auto* blocklist = g_settings_get_strv(settings, "blocklist-in"); for (std::size_t i = 0; blocklist[i] != nullptr; i++) { if (app_info->name == blocklist[i]) { forbidden_app = true; } g_free(blocklist[i]); } if (app_info->connected) { if (forbidden_app) { success = pm->remove_source_output_from_pulseeffects(app_info->name, app_info->index); if (success) { app_info->connected = false; } } } else { auto enable_all = g_settings_get_boolean(settings, "enable-all-sourceoutputs"); if (!forbidden_app && (enable_all != 0)) { success = pm->move_source_output_to_pulseeffects(app_info->name, app_info->index); if (success) { app_info->connected = true; } } } g_free(blocklist); } void SourceOutputEffects::add_plugins_to_pipeline() { gchar* name = nullptr; GVariantIter* iter = nullptr; std::vector default_order; g_settings_get(child_settings, "plugins", "as", &iter); while (g_variant_iter_next(iter, "s", &name) != 0) { plugins_order.emplace_back(name); g_free(name); } auto* gvariant = g_settings_get_default_value(child_settings, "plugins"); g_variant_get(gvariant, "as", &iter); g_variant_unref(gvariant); while (g_variant_iter_next(iter, "s", &name) != 0) { default_order.emplace_back(name); g_free(name); } g_variant_iter_free(iter); // updating user list if there is any new plugin if (plugins_order.size() != default_order.size()) { plugins_order = default_order; g_settings_reset(child_settings, "plugins"); } for (const auto& v : plugins_order) { // checking if the plugin exists. If not we reset the list to default if (std::find(default_order.begin(), default_order.end(), v) == default_order.end()) { plugins_order = default_order; g_settings_reset(child_settings, "plugins"); break; } } // adding plugins to effects_bin for (const auto& p : plugins) { gst_bin_add(GST_BIN(effects_bin), p.second); } // linking plugins gst_element_unlink(identity_in, identity_out); gst_element_link(identity_in, plugins[plugins_order[0]]); for (unsigned long int n = 1U; n < plugins_order.size(); n++) { gst_element_link(plugins[plugins_order[n - 1U]], plugins[plugins_order[n]]); } gst_element_link(plugins[plugins_order[plugins_order.size() - 1U]], identity_out); } easyeffects-4.8.7/src/source_output_effects_ui.cpp000066400000000000000000000515061424023573300224540ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "source_output_effects_ui.hpp" SourceOutputEffectsUi::SourceOutputEffectsUi(BaseObjectType* cobject, const Glib::RefPtr& refBuilder, const Glib::RefPtr& refSettings, SourceOutputEffects* soe_ptr) : Gtk::Box(cobject), EffectsBaseUi(refBuilder, refSettings, soe_ptr->pm), soe(soe_ptr) { // populate stack auto b_limiter = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/limiter.glade"); auto b_compressor = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/compressor.glade"); auto b_filter = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/filter.glade"); auto b_equalizer = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/equalizer.glade"); auto b_reverb = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/reverb.glade"); auto b_gate = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/gate.glade"); auto b_deesser = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/deesser.glade"); auto b_pitch = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/pitch.glade"); auto b_webrtc = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/webrtc.glade"); auto b_multiband_compressor = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/multiband_compressor.glade"); auto b_multiband_gate = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/multiband_gate.glade"); auto b_stereo_tools = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/stereo_tools.glade"); auto b_maximizer = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/maximizer.glade"); auto b_rnnoise = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/rnnoise.glade"); b_limiter->get_widget_derived("widgets_grid", limiter_ui, "com.github.wwmm.pulseeffects.limiter", "/com/github/wwmm/pulseeffects/sourceoutputs/limiter/"); b_compressor->get_widget_derived("widgets_grid", compressor_ui, "com.github.wwmm.pulseeffects.compressor", "/com/github/wwmm/pulseeffects/sourceoutputs/compressor/"); b_filter->get_widget_derived("widgets_grid", filter_ui, "com.github.wwmm.pulseeffects.filter", "/com/github/wwmm/pulseeffects/sourceoutputs/filter/"); b_equalizer->get_widget_derived("widgets_grid", equalizer_ui, "com.github.wwmm.pulseeffects.equalizer", "/com/github/wwmm/pulseeffects/sourceoutputs/equalizer/", "com.github.wwmm.pulseeffects.equalizer.channel", "/com/github/wwmm/pulseeffects/sourceoutputs/equalizer/leftchannel/", "/com/github/wwmm/pulseeffects/sourceoutputs/equalizer/rightchannel/"); b_reverb->get_widget_derived("widgets_grid", reverb_ui, "com.github.wwmm.pulseeffects.reverb", "/com/github/wwmm/pulseeffects/sourceoutputs/reverb/"); b_gate->get_widget_derived("widgets_grid", gate_ui, "com.github.wwmm.pulseeffects.gate", "/com/github/wwmm/pulseeffects/sourceoutputs/gate/"); b_deesser->get_widget_derived("widgets_grid", deesser_ui, "com.github.wwmm.pulseeffects.deesser", "/com/github/wwmm/pulseeffects/sourceoutputs/deesser/"); b_pitch->get_widget_derived("widgets_grid", pitch_ui, "com.github.wwmm.pulseeffects.pitch", "/com/github/wwmm/pulseeffects/sourceoutputs/pitch/"); b_webrtc->get_widget_derived("widgets_grid", webrtc_ui, "com.github.wwmm.pulseeffects.webrtc", "/com/github/wwmm/pulseeffects/sourceoutputs/webrtc/"); b_multiband_compressor->get_widget_derived("widgets_grid", multiband_compressor_ui, "com.github.wwmm.pulseeffects.multibandcompressor", "/com/github/wwmm/pulseeffects/sourceoutputs/multibandcompressor/"); b_multiband_gate->get_widget_derived("widgets_grid", multiband_gate_ui, "com.github.wwmm.pulseeffects.multibandgate", "/com/github/wwmm/pulseeffects/sourceoutputs/multibandgate/"); b_stereo_tools->get_widget_derived("widgets_grid", stereo_tools_ui, "com.github.wwmm.pulseeffects.stereotools", "/com/github/wwmm/pulseeffects/sourceoutputs/stereotools/"); b_maximizer->get_widget_derived("widgets_grid", maximizer_ui, "com.github.wwmm.pulseeffects.maximizer", "/com/github/wwmm/pulseeffects/sourceoutputs/maximizer/"); b_rnnoise->get_widget_derived("widgets_grid", rnnoise_ui, "com.github.wwmm.pulseeffects.rnnoise", "/com/github/wwmm/pulseeffects/sourceoutputs/rnnoise/"); // add to stack stack->add(*limiter_ui, limiter_ui->name); stack->add(*compressor_ui, compressor_ui->name); stack->add(*filter_ui, filter_ui->name); stack->add(*equalizer_ui, equalizer_ui->name); stack->add(*reverb_ui, reverb_ui->name); stack->add(*gate_ui, gate_ui->name); stack->add(*deesser_ui, deesser_ui->name); stack->add(*pitch_ui, pitch_ui->name); stack->add(*webrtc_ui, webrtc_ui->name); stack->add(*multiband_compressor_ui, multiband_compressor_ui->name); stack->add(*multiband_gate_ui, multiband_gate_ui->name); stack->add(*stereo_tools_ui, stereo_tools_ui->name); stack->add(*maximizer_ui, maximizer_ui->name); stack->add(*rnnoise_ui, rnnoise_ui->name); // populate listbox add_to_listbox(limiter_ui); add_to_listbox(compressor_ui); add_to_listbox(filter_ui); add_to_listbox(equalizer_ui); add_to_listbox(reverb_ui); add_to_listbox(gate_ui); add_to_listbox(deesser_ui); add_to_listbox(pitch_ui); add_to_listbox(webrtc_ui); add_to_listbox(multiband_compressor_ui); add_to_listbox(multiband_gate_ui); add_to_listbox(stereo_tools_ui); add_to_listbox(maximizer_ui); add_to_listbox(rnnoise_ui); // show only mic icon before "Application" label app_input_icon->set_visible(true); level_meters_connections(); up_down_connections(); connections.emplace_back(soe->new_spectrum.connect(sigc::mem_fun(*spectrum_ui, &SpectrumUi::on_new_spectrum))); connections.emplace_back( soe->pm->source_output_added.connect(sigc::mem_fun(this, &SourceOutputEffectsUi::on_app_added))); connections.emplace_back( soe->pm->source_output_changed.connect(sigc::mem_fun(this, &SourceOutputEffectsUi::on_app_changed))); connections.emplace_back( soe->pm->source_output_removed.connect(sigc::mem_fun(this, &SourceOutputEffectsUi::on_app_removed))); } SourceOutputEffectsUi::~SourceOutputEffectsUi() { soe->disable_spectrum(); util::debug(log_tag + "destroyed"); } auto SourceOutputEffectsUi::add_to_stack(Gtk::Stack* stack, SourceOutputEffects* soe_ptr) -> SourceOutputEffectsUi* { auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/effects_base.glade"); auto settings = Gio::Settings::create("com.github.wwmm.pulseeffects.sourceoutputs"); SourceOutputEffectsUi* ui = nullptr; builder->get_widget_derived("widgets_box", ui, settings, soe_ptr); stack->add(*ui, "source_outputs"); stack->child_property_icon_name(*ui).set_value("audio-input-microphone-symbolic"); return ui; } void SourceOutputEffectsUi::on_app_added(std::shared_ptr app_info) { // Blocklist check auto forbidden_app = BlocklistSettingsUi::app_is_blocklisted(app_info->name, PresetType::input); if (forbidden_app) { app_info->visible = BlocklistSettingsUi::get_blocklisted_apps_visibility(); if (!app_info->visible) { return; } } else { app_info->visible = true; } // Duplicate entry check for (const auto& a : apps_list) { if (a->app_info->index == app_info->index) { // do not add the same app two times in the interface return; } } auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/app_info.glade"); AppInfoUi* appui = nullptr; builder->get_widget_derived("widgets_grid", appui, app_info, pm); apps_box->add(*appui); apps_list.emplace_back(appui); } void SourceOutputEffectsUi::level_meters_connections() { // global output level meter connection connections.emplace_back( soe->global_output_level.connect(sigc::mem_fun(this, &SourceOutputEffectsUi::on_new_output_level_db))); // limiter level meters connections connections.emplace_back( soe->limiter->input_level.connect(sigc::mem_fun(*limiter_ui, &LimiterUi::on_new_input_level))); connections.emplace_back( soe->limiter->output_level.connect(sigc::mem_fun(*limiter_ui, &LimiterUi::on_new_output_level))); connections.emplace_back( soe->limiter->attenuation.connect(sigc::mem_fun(*limiter_ui, &LimiterUi::on_new_attenuation))); // compressor level meters connections connections.emplace_back( soe->compressor->input_level.connect(sigc::mem_fun(*compressor_ui, &CompressorUi::on_new_input_level))); connections.emplace_back( soe->compressor->output_level.connect(sigc::mem_fun(*compressor_ui, &CompressorUi::on_new_output_level))); connections.emplace_back( soe->compressor->reduction.connect(sigc::mem_fun(*compressor_ui, &CompressorUi::on_new_reduction))); connections.emplace_back( soe->compressor->sidechain.connect(sigc::mem_fun(*compressor_ui, &CompressorUi::on_new_sidechain))); connections.emplace_back(soe->compressor->curve.connect(sigc::mem_fun(*compressor_ui, &CompressorUi::on_new_curve))); // filter level meters connections connections.emplace_back(soe->filter->input_level.connect(sigc::mem_fun(*filter_ui, &FilterUi::on_new_input_level))); connections.emplace_back( soe->filter->output_level.connect(sigc::mem_fun(*filter_ui, &FilterUi::on_new_output_level))); // equalizer level meters connections connections.emplace_back( soe->equalizer_input_level.connect(sigc::mem_fun(*equalizer_ui, &EqualizerUi::on_new_input_level_db))); connections.emplace_back( soe->equalizer_output_level.connect(sigc::mem_fun(*equalizer_ui, &EqualizerUi::on_new_output_level_db))); // reverb level meters connections connections.emplace_back(soe->reverb->input_level.connect(sigc::mem_fun(*reverb_ui, &ReverbUi::on_new_input_level))); connections.emplace_back( soe->reverb->output_level.connect(sigc::mem_fun(*reverb_ui, &ReverbUi::on_new_output_level))); // gate level meters connections connections.emplace_back(soe->gate_input_level.connect(sigc::mem_fun(*gate_ui, &GateUi::on_new_input_level_db))); connections.emplace_back(soe->gate_output_level.connect(sigc::mem_fun(*gate_ui, &GateUi::on_new_output_level_db))); connections.emplace_back(soe->gate->gating.connect(sigc::mem_fun(*gate_ui, &GateUi::on_new_gating))); // deesser level meters connections connections.emplace_back( soe->deesser_input_level.connect(sigc::mem_fun(*deesser_ui, &DeesserUi::on_new_input_level_db))); connections.emplace_back( soe->deesser_output_level.connect(sigc::mem_fun(*deesser_ui, &DeesserUi::on_new_output_level_db))); connections.emplace_back( soe->deesser->compression.connect(sigc::mem_fun(*deesser_ui, &DeesserUi::on_new_compression))); connections.emplace_back(soe->deesser->detected.connect(sigc::mem_fun(*deesser_ui, &DeesserUi::on_new_detected))); // pitch level meters connections connections.emplace_back(soe->pitch_input_level.connect(sigc::mem_fun(*pitch_ui, &PitchUi::on_new_input_level_db))); connections.emplace_back(soe->pitch_output_level.connect(sigc::mem_fun(*pitch_ui, &PitchUi::on_new_output_level_db))); // webrtc level meters connections connections.emplace_back( soe->webrtc_input_level.connect(sigc::mem_fun(*webrtc_ui, &WebrtcUi::on_new_input_level_db))); connections.emplace_back( soe->webrtc_output_level.connect(sigc::mem_fun(*webrtc_ui, &WebrtcUi::on_new_output_level_db))); // multiband_compressor level meters connections connections.emplace_back(soe->multiband_compressor->input_level.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_input_level))); connections.emplace_back(soe->multiband_compressor->output_level.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_output_level))); connections.emplace_back(soe->multiband_compressor->output0.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_output0))); connections.emplace_back(soe->multiband_compressor->output1.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_output1))); connections.emplace_back(soe->multiband_compressor->output2.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_output2))); connections.emplace_back(soe->multiband_compressor->output3.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_output3))); connections.emplace_back(soe->multiband_compressor->compression0.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_compression0))); connections.emplace_back(soe->multiband_compressor->compression1.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_compression1))); connections.emplace_back(soe->multiband_compressor->compression2.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_compression2))); connections.emplace_back(soe->multiband_compressor->compression3.connect( sigc::mem_fun(*multiband_compressor_ui, &MultibandCompressorUi::on_new_compression3))); // multiband_gate level meters connections connections.emplace_back(soe->multiband_gate->input_level.connect( sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_input_level))); connections.emplace_back(soe->multiband_gate->output_level.connect( sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_output_level))); connections.emplace_back( soe->multiband_gate->output0.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_output0))); connections.emplace_back( soe->multiband_gate->output1.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_output1))); connections.emplace_back( soe->multiband_gate->output2.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_output2))); connections.emplace_back( soe->multiband_gate->output3.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_output3))); connections.emplace_back( soe->multiband_gate->gating0.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_gating0))); connections.emplace_back( soe->multiband_gate->gating1.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_gating1))); connections.emplace_back( soe->multiband_gate->gating2.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_gating2))); connections.emplace_back( soe->multiband_gate->gating3.connect(sigc::mem_fun(*multiband_gate_ui, &MultibandGateUi::on_new_gating3))); // stereo_tools level meters connections connections.emplace_back( soe->stereo_tools->input_level.connect(sigc::mem_fun(*stereo_tools_ui, &StereoToolsUi::on_new_input_level))); connections.emplace_back( soe->stereo_tools->output_level.connect(sigc::mem_fun(*stereo_tools_ui, &StereoToolsUi::on_new_output_level))); // maximizer level meters connections connections.emplace_back( soe->maximizer_input_level.connect(sigc::mem_fun(*maximizer_ui, &MaximizerUi::on_new_input_level_db))); connections.emplace_back( soe->maximizer_output_level.connect(sigc::mem_fun(*maximizer_ui, &MaximizerUi::on_new_output_level_db))); connections.emplace_back( soe->maximizer->reduction.connect(sigc::mem_fun(*maximizer_ui, &MaximizerUi::on_new_reduction))); // rnnoise level meters connections connections.emplace_back( soe->rnnoise_input_level.connect(sigc::mem_fun(*rnnoise_ui, &RNNoiseUi::on_new_input_level_db))); connections.emplace_back( soe->rnnoise_output_level.connect(sigc::mem_fun(*rnnoise_ui, &RNNoiseUi::on_new_output_level_db))); } void SourceOutputEffectsUi::up_down_connections() { auto on_up = [=](auto p) { auto order = Glib::Variant>(); settings->get_value("plugins", order); auto vorder = order.get(); auto r = std::find(std::begin(vorder), std::end(vorder), p->name); if (r != std::begin(vorder)) { std::iter_swap(r, r - 1); settings->set_string_array("plugins", vorder); } }; auto on_down = [=](auto p) { auto order = Glib::Variant>(); settings->get_value("plugins", order); auto vorder = order.get(); auto r = std::find(std::begin(vorder), std::end(vorder), p->name); if (r != std::end(vorder) - 1) { std::iter_swap(r, r + 1); settings->set_string_array("plugins", vorder); } }; connections.emplace_back(limiter_ui->plugin_up->signal_clicked().connect([=]() { on_up(limiter_ui); })); connections.emplace_back(limiter_ui->plugin_down->signal_clicked().connect([=]() { on_down(limiter_ui); })); connections.emplace_back(compressor_ui->plugin_up->signal_clicked().connect([=]() { on_up(compressor_ui); })); connections.emplace_back(compressor_ui->plugin_down->signal_clicked().connect([=]() { on_down(compressor_ui); })); connections.emplace_back(filter_ui->plugin_up->signal_clicked().connect([=]() { on_up(filter_ui); })); connections.emplace_back(filter_ui->plugin_down->signal_clicked().connect([=]() { on_down(filter_ui); })); connections.emplace_back(equalizer_ui->plugin_up->signal_clicked().connect([=]() { on_up(equalizer_ui); })); connections.emplace_back(equalizer_ui->plugin_down->signal_clicked().connect([=]() { on_down(equalizer_ui); })); connections.emplace_back(reverb_ui->plugin_up->signal_clicked().connect([=]() { on_up(reverb_ui); })); connections.emplace_back(reverb_ui->plugin_down->signal_clicked().connect([=]() { on_down(reverb_ui); })); connections.emplace_back(gate_ui->plugin_up->signal_clicked().connect([=]() { on_up(gate_ui); })); connections.emplace_back(gate_ui->plugin_down->signal_clicked().connect([=]() { on_down(gate_ui); })); connections.emplace_back(deesser_ui->plugin_up->signal_clicked().connect([=]() { on_up(deesser_ui); })); connections.emplace_back(deesser_ui->plugin_down->signal_clicked().connect([=]() { on_down(deesser_ui); })); connections.emplace_back(pitch_ui->plugin_up->signal_clicked().connect([=]() { on_up(pitch_ui); })); connections.emplace_back(pitch_ui->plugin_down->signal_clicked().connect([=]() { on_down(pitch_ui); })); connections.emplace_back(webrtc_ui->plugin_up->signal_clicked().connect([=]() { on_up(webrtc_ui); })); connections.emplace_back(webrtc_ui->plugin_down->signal_clicked().connect([=]() { on_down(webrtc_ui); })); connections.emplace_back( multiband_compressor_ui->plugin_up->signal_clicked().connect([=]() { on_up(multiband_compressor_ui); })); connections.emplace_back( multiband_compressor_ui->plugin_down->signal_clicked().connect([=]() { on_down(multiband_compressor_ui); })); connections.emplace_back(multiband_gate_ui->plugin_up->signal_clicked().connect([=]() { on_up(multiband_gate_ui); })); connections.emplace_back( multiband_gate_ui->plugin_down->signal_clicked().connect([=]() { on_down(multiband_gate_ui); })); connections.emplace_back(stereo_tools_ui->plugin_up->signal_clicked().connect([=]() { on_up(stereo_tools_ui); })); connections.emplace_back(stereo_tools_ui->plugin_down->signal_clicked().connect([=]() { on_down(stereo_tools_ui); })); connections.emplace_back(maximizer_ui->plugin_up->signal_clicked().connect([=]() { on_up(maximizer_ui); })); connections.emplace_back(maximizer_ui->plugin_down->signal_clicked().connect([=]() { on_down(maximizer_ui); })); connections.emplace_back(rnnoise_ui->plugin_up->signal_clicked().connect([=]() { on_up(rnnoise_ui); })); connections.emplace_back(rnnoise_ui->plugin_down->signal_clicked().connect([=]() { on_down(rnnoise_ui); })); } easyeffects-4.8.7/src/spectrum_preset.cpp000066400000000000000000000114361424023573300205620ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "spectrum_preset.hpp" SpectrumPreset::SpectrumPreset() : settings(Gio::Settings::create("com.github.wwmm.pulseeffects.spectrum")) {} void SpectrumPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { boost::property_tree::ptree node_in; Glib::Variant> aux; root.put("spectrum.show", settings->get_boolean("show")); root.put("spectrum.n-points", settings->get_int("n-points")); root.put("spectrum.height", settings->get_int("height")); root.put("spectrum.use-custom-color", settings->get_boolean("use-custom-color")); root.put("spectrum.fill", settings->get_boolean("fill")); root.put("spectrum.show-bar-border", settings->get_boolean("show-bar-border")); root.put("spectrum.sampling-freq", settings->get_int("sampling-freq")); root.put("spectrum.line-width", settings->get_double("line-width")); root.put("spectrum.type", settings->get_string("type")); // color settings->get_value("color", aux); for (const auto& p : aux.get()) { boost::property_tree::ptree node; node.put("", p); node_in.push_back(std::make_pair("", node)); } root.add_child("spectrum.color", node_in); // axis color node_in.clear(); settings->get_value("color-axis-labels", aux); for (const auto& p : aux.get()) { boost::property_tree::ptree node; node.put("", p); node_in.push_back(std::make_pair("", node)); } root.add_child("spectrum.color-axis-labels", node_in); // gradient color node_in.clear(); settings->get_value("gradient-color", aux); for (const auto& p : aux.get()) { boost::property_tree::ptree node; node.put("", p); node_in.push_back(std::make_pair("", node)); } root.add_child("spectrum.gradient-color", node_in); } void SpectrumPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "show", "spectrum.show"); update_key(root, settings, "n-points", "spectrum.n-points"); update_key(root, settings, "height", "spectrum.height"); update_key(root, settings, "use-custom-color", "spectrum.use-custom-color"); update_key(root, settings, "fill", "spectrum.fill"); update_key(root, settings, "show-bar-border", "spectrum.show-bar-border"); update_key(root, settings, "sampling-freq", "spectrum.sampling-freq"); update_key(root, settings, "line-width", "spectrum.line-width"); update_string_key(root, settings, "type", "spectrum.type"); // spectrum color try { std::vector color; for (const auto& p : root.get_child("spectrum.color")) { color.emplace_back(p.second.get("")); } auto v = Glib::Variant>::create(color); settings->set_value("color", v); } catch (const boost::property_tree::ptree_error& e) { settings->reset("color"); } // axis color try { std::vector color; for (const auto& p : root.get_child("spectrum.color-axis-labels")) { color.emplace_back(p.second.get("")); } auto v = Glib::Variant>::create(color); settings->set_value("color-axis-labels", v); } catch (const boost::property_tree::ptree_error& e) { settings->reset("color-axis-labels"); } // gradient color try { std::vector color; for (const auto& p : root.get_child("spectrum.gradient-color")) { color.emplace_back(p.second.get("")); } auto v = Glib::Variant>::create(color); settings->set_value("gradient-color", v); } catch (const boost::property_tree::ptree_error& e) { settings->reset("gradient-color"); } } void SpectrumPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { save(root, "", settings); } void SpectrumPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { load(root, "", settings); } easyeffects-4.8.7/src/spectrum_settings_ui.cpp000066400000000000000000000176741424023573300216270ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "spectrum_settings_ui.hpp" #include #include "util.hpp" namespace { auto spectrum_type_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "Bars") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "Lines") == 0) { g_value_set_int(value, 1); } return 1; } auto int_to_spectrum_type_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); if (v == 0) { return g_variant_new_string("Bars"); } return g_variant_new_string("Lines"); } } // namespace SpectrumSettingsUi::SpectrumSettingsUi(BaseObjectType* cobject, const Glib::RefPtr& builder, Application* application) : Gtk::Grid(cobject), settings(Gio::Settings::create("com.github.wwmm.pulseeffects.spectrum")), app(application) { // loading glade widgets builder->get_widget("show", show); builder->get_widget("fill", fill); builder->get_widget("show_bar_border", show_bar_border); builder->get_widget("spectrum_color_button", spectrum_color_button); builder->get_widget("axis_color_button", axis_color_button); builder->get_widget("gradient_color_button", gradient_color_button); builder->get_widget("use_custom_color", use_custom_color); builder->get_widget("use_gradient", use_gradient); builder->get_widget("spectrum_type", spectrum_type); get_object(builder, "n_points", n_points); get_object(builder, "height", height); get_object(builder, "sampling_freq", sampling_freq); get_object(builder, "line_width", line_width); get_object(builder, "maximum_frequency", maximum_frequency); get_object(builder, "minimum_frequency", minimum_frequency); // signals connection connections.emplace_back(settings->signal_changed("color").connect([&](auto key) { Glib::Variant> v; settings->get_value("color", v); auto rgba = v.get(); Gdk::RGBA color; color.set_rgba(rgba[0], rgba[1], rgba[2], rgba[3]); spectrum_color_button->set_rgba(color); })); connections.emplace_back(settings->signal_changed("gradient-color").connect([&](auto key) { Glib::Variant> v; settings->get_value("gradient-color", v); auto rgba = v.get(); Gdk::RGBA color; color.set_rgba(rgba[0], rgba[1], rgba[2], rgba[3]); gradient_color_button->set_rgba(color); })); show->signal_state_set().connect(sigc::mem_fun(*this, &SpectrumSettingsUi::on_show_spectrum), false); spectrum_color_button->signal_color_set().connect([&]() { auto spectrum_color = spectrum_color_button->get_rgba(); auto v = Glib::Variant>::create(std::vector{ spectrum_color.get_red(), spectrum_color.get_green(), spectrum_color.get_blue(), spectrum_color.get_alpha()}); settings->set_value("color", v); }); axis_color_button->signal_color_set().connect([&]() { auto axis_color = axis_color_button->get_rgba(); auto v = Glib::Variant>::create(std::vector{ axis_color.get_red(), axis_color.get_green(), axis_color.get_blue(), axis_color.get_alpha()}); settings->set_value("color-axis-labels", v); }); gradient_color_button->signal_color_set().connect([&]() { auto color = gradient_color_button->get_rgba(); auto v = Glib::Variant>::create( std::vector{color.get_red(), color.get_green(), color.get_blue(), color.get_alpha()}); settings->set_value("gradient-color", v); }); use_custom_color->signal_state_set().connect(sigc::mem_fun(*this, &SpectrumSettingsUi::on_use_custom_color), false); sampling_freq->signal_value_changed().connect( sigc::mem_fun(*this, &SpectrumSettingsUi::on_spectrum_sampling_freq_set), false); minimum_frequency->signal_value_changed().connect([&]() { if (minimum_frequency->get_value() < maximum_frequency->get_value()) { app->sie->min_spectrum_freq = minimum_frequency->get_value(); app->soe->min_spectrum_freq = minimum_frequency->get_value(); app->sie->init_spectrum(); app->soe->init_spectrum(); } }); maximum_frequency->signal_value_changed().connect([&]() { if (maximum_frequency->get_value() > minimum_frequency->get_value()) { app->sie->max_spectrum_freq = maximum_frequency->get_value(); app->soe->max_spectrum_freq = maximum_frequency->get_value(); app->sie->init_spectrum(); app->soe->init_spectrum(); } }); auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("show", show, "active", flag); settings->bind("fill", fill, "active", flag); settings->bind("show-bar-border", show_bar_border, "active", flag); settings->bind("n-points", n_points.get(), "value", flag); settings->bind("height", height.get(), "value", flag); settings->bind("sampling-freq", sampling_freq.get(), "value", flag); settings->bind("line-width", line_width.get(), "value", flag); settings->bind("use-gradient", use_gradient, "active", flag); settings->bind("use-custom-color", use_custom_color, "active", flag); settings->bind("use-custom-color", spectrum_color_button, "sensitive", flag); settings->bind("use-custom-color", gradient_color_button, "sensitive", flag); settings->bind("use-custom-color", axis_color_button, "sensitive", flag); settings->bind("minimum-frequency", minimum_frequency.get(), "value", flag); settings->bind("maximum-frequency", maximum_frequency.get(), "value", flag); g_settings_bind_with_mapping(settings->gobj(), "type", spectrum_type->gobj(), "active", G_SETTINGS_BIND_DEFAULT, spectrum_type_enum_to_int, int_to_spectrum_type_enum, nullptr, nullptr); } SpectrumSettingsUi::~SpectrumSettingsUi() { for (auto& c : connections) { c.disconnect(); } util::debug(log_tag + "destroyed"); } void SpectrumSettingsUi::add_to_stack(Gtk::Stack* stack, Application* app) { auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/spectrum_settings.glade"); SpectrumSettingsUi* ui = nullptr; builder->get_widget_derived("widgets_grid", ui, app); stack->add(*ui, "settings_spectrum", _("Spectrum")); } auto SpectrumSettingsUi::on_show_spectrum(bool state) -> bool { if (state) { app->sie->enable_spectrum(); app->soe->enable_spectrum(); } else { app->sie->disable_spectrum(); app->soe->disable_spectrum(); } return false; } auto SpectrumSettingsUi::on_use_custom_color(bool state) -> bool { if (state) { Glib::Variant> v; settings->get_value("color", v); auto rgba = v.get(); Gdk::RGBA color; color.set_rgba(rgba[0], rgba[1], rgba[2], rgba[3]); spectrum_color_button->set_rgba(color); // background color settings->get_value("gradient-color", v); rgba = v.get(); color.set_rgba(rgba[0], rgba[1], rgba[2], rgba[3]); gradient_color_button->set_rgba(color); } return false; } void SpectrumSettingsUi::on_spectrum_sampling_freq_set() { app->sie->update_spectrum_interval(sampling_freq->get_value()); app->soe->update_spectrum_interval(sampling_freq->get_value()); } easyeffects-4.8.7/src/spectrum_ui.cpp000066400000000000000000000245011424023573300176720ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "spectrum_ui.hpp" SpectrumUi::SpectrumUi(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::Grid(cobject), settings(Gio::Settings::create("com.github.wwmm.pulseeffects.spectrum")), global_locale(util::get_global_locale()) { // loading glade widgets builder->get_widget("spectrum", spectrum); // signals connection spectrum->signal_draw().connect(sigc::mem_fun(*this, &SpectrumUi::on_spectrum_draw)); spectrum->signal_enter_notify_event().connect(sigc::mem_fun(*this, &SpectrumUi::on_spectrum_enter_notify_event)); spectrum->signal_leave_notify_event().connect(sigc::mem_fun(*this, &SpectrumUi::on_spectrum_leave_notify_event)); spectrum->signal_motion_notify_event().connect(sigc::mem_fun(*this, &SpectrumUi::on_spectrum_motion_notify_event)); connections.emplace_back(settings->signal_changed("use-custom-color").connect([&](auto key) { init_color(); init_frequency_labels_color(); init_gradient_color(); })); connections.emplace_back(settings->signal_changed("color").connect([&](auto key) { init_color(); })); connections.emplace_back( settings->signal_changed("color-axis-labels").connect([&](auto key) { init_frequency_labels_color(); })); connections.emplace_back( settings->signal_changed("gradient-color").connect([&](auto key) { init_gradient_color(); })); connections.emplace_back(settings->signal_changed("height").connect([&](auto key) { auto v = settings->get_int("height"); spectrum->set_size_request(-1, v); })); auto flag_get = Gio::SettingsBindFlags::SETTINGS_BIND_GET; settings->bind("show", this, "visible", flag_get); init_color(); init_frequency_labels_color(); init_gradient_color(); spectrum->set_size_request(-1, settings->get_int("height")); } SpectrumUi::~SpectrumUi() { for (auto& c : connections) { c.disconnect(); } util::debug(log_tag + "destroyed"); } auto SpectrumUi::add_to_box(Gtk::Box* box) -> SpectrumUi* { auto builder = Gtk::Builder::create_from_resource("/com/github/wwmm/pulseeffects/ui/spectrum.glade"); SpectrumUi* ui = nullptr; builder->get_widget_derived("widgets_grid", ui); box->add(*ui); return ui; } void SpectrumUi::clear_spectrum() { spectrum_mag.resize(0); spectrum->queue_draw(); } void SpectrumUi::on_new_spectrum(const std::vector& magnitudes) { spectrum_mag = magnitudes; spectrum->queue_draw(); } auto SpectrumUi::on_spectrum_draw(const Cairo::RefPtr& ctx) -> bool { ctx->paint(); auto n_points = spectrum_mag.size(); if (n_points > 0U) { auto allocation = spectrum->get_allocation(); auto width = allocation.get_width(); auto height = allocation.get_height(); auto line_width = static_cast(settings->get_double("line-width")); auto objects_x = util::linspace(line_width, width - line_width, n_points); auto draw_border = settings->get_boolean("show-bar-border"); auto use_gradient = settings->get_boolean("use-gradient"); auto spectrum_type = settings->get_enum("type"); if (!settings->get_boolean("use-custom-color")) { auto style_ctx = spectrum->get_style_context(); style_ctx->lookup_color("theme_selected_bg_color", color); style_ctx->lookup_color("theme_selected_fg_color", color_frequency_axis_labels); if (use_gradient) { gradient_color = color; gradient_color.set_alpha(0.7); } } axis_height = draw_frequency_axis(ctx, width, height); int usable_height = height - axis_height; if (use_gradient) { float max_mag = *std::max_element(spectrum_mag.begin(), spectrum_mag.end()); double max_bar_height = static_cast(usable_height) * max_mag; auto gradient = Cairo::LinearGradient::create(0.0, usable_height - max_bar_height, 0, usable_height); gradient->add_color_stop_rgba(0.15, color.get_red(), color.get_green(), color.get_blue(), color.get_alpha()); gradient->add_color_stop_rgba(1.0, gradient_color.get_red(), gradient_color.get_green(), gradient_color.get_blue(), gradient_color.get_alpha()); ctx->set_source(gradient); } else { ctx->set_source_rgba(color.get_red(), color.get_green(), color.get_blue(), color.get_alpha()); } if (spectrum_type == 0) { // Bars for (uint n = 0U; n < n_points; n++) { double bar_height = static_cast(usable_height) * spectrum_mag[n]; if (draw_border) { ctx->rectangle(objects_x[n], static_cast(usable_height) - bar_height, static_cast(width) / n_points - line_width, bar_height); } else { ctx->rectangle(objects_x[n], static_cast(usable_height) - bar_height, static_cast(width) / n_points, bar_height); } } } else if (spectrum_type == 1) { // Lines ctx->move_to(0, usable_height); for (uint n = 0U; n < n_points - 1U; n++) { auto bar_height = spectrum_mag[n] * static_cast(usable_height); ctx->line_to(objects_x[n], static_cast(usable_height) - bar_height); } ctx->line_to(width, usable_height); ctx->move_to(width, usable_height); ctx->close_path(); } // ctx->set_antialias(Cairo::Antialias::ANTIALIAS_SUBPIXEL); ctx->set_line_width(line_width); if (settings->get_boolean("fill")) { ctx->fill(); } else { ctx->stroke(); } if (mouse_inside) { std::ostringstream msg; msg.imbue(global_locale); msg.precision(0); msg << std::fixed << mouse_freq << " Hz, "; msg << std::fixed << mouse_intensity << " dB"; Pango::FontDescription font; font.set_family("Monospace"); font.set_weight(Pango::WEIGHT_BOLD); int text_width = 0; int text_height = 0; auto layout = create_pango_layout(msg.str()); layout->set_font_description(font); layout->get_pixel_size(text_width, text_height); ctx->move_to(static_cast(width - static_cast(text_width)), 0); layout->show_in_cairo_context(ctx); } } return false; } auto SpectrumUi::on_spectrum_enter_notify_event(GdkEventCrossing* event) -> bool { mouse_inside = true; return false; } auto SpectrumUi::on_spectrum_leave_notify_event(GdkEventCrossing* event) -> bool { mouse_inside = false; return false; } auto SpectrumUi::on_spectrum_motion_notify_event(GdkEventMotion* event) -> bool { auto allocation = spectrum->get_allocation(); auto width = allocation.get_width(); auto height = allocation.get_height(); int usable_height = height - axis_height; if (event->y < usable_height) { double min_freq_log = log10(static_cast(settings->get_int("minimum-frequency"))); double max_freq_log = log10(static_cast(settings->get_int("maximum-frequency"))); double mouse_freq_log = event->x / static_cast(width) * (max_freq_log - min_freq_log) + min_freq_log; mouse_freq = std::pow(10.0, mouse_freq_log); // exp10 does not exist on FreeBSD // intensity scale is in decibel // minimum intensity is -120 dB and maximum is 0 dB mouse_intensity = -event->y * 120.0 / usable_height; spectrum->queue_draw(); } return false; } void SpectrumUi::init_color() { Glib::Variant> v; settings->get_value("color", v); auto rgba = v.get(); color.set_rgba(rgba[0], rgba[1], rgba[2], rgba[3]); } void SpectrumUi::init_frequency_labels_color() { Glib::Variant> v; settings->get_value("color-axis-labels", v); auto rgba = v.get(); color_frequency_axis_labels.set_rgba(rgba[0], rgba[1], rgba[2], rgba[3]); } void SpectrumUi::init_gradient_color() { Glib::Variant> v; settings->get_value("gradient-color", v); auto rgba = v.get(); gradient_color.set_rgba(rgba[0], rgba[1], rgba[2], rgba[3]); } auto SpectrumUi::draw_frequency_axis(const Cairo::RefPtr& ctx, const int& width, const int& height) -> int { int min_spectrum_freq = settings->get_int("minimum-frequency"); int max_spectrum_freq = settings->get_int("maximum-frequency"); int n_freq_labels = 10; double freq_labels_offset = width / static_cast(n_freq_labels); auto freq_labels = util::logspace(log10(static_cast(min_spectrum_freq)), log10(static_cast(max_spectrum_freq)), n_freq_labels); ctx->set_source_rgba(color_frequency_axis_labels.get_red(), color_frequency_axis_labels.get_green(), color_frequency_axis_labels.get_blue(), color_frequency_axis_labels.get_alpha()); /* we stop the loop at freq_labels.size() - 1 because there is no space left in the window to show the last label. It would start to be drawn at the border of the window. */ for (size_t n = 0U; n < freq_labels.size() - 1U; n++) { std::ostringstream msg; msg.imbue(global_locale); auto label = freq_labels[n]; if (label < 1000.0) { msg.precision(0); msg << std::fixed << label << "Hz"; } else if (label > 1000.0) { msg.precision(1); msg << std::fixed << label / 1000.0 << "kHz"; } Pango::FontDescription font; font.set_family("Monospace"); font.set_weight(Pango::WEIGHT_BOLD); int text_width = 0; int text_height = 0; auto layout = create_pango_layout(msg.str()); layout->set_font_description(font); layout->get_pixel_size(text_width, text_height); ctx->move_to(n * freq_labels_offset, static_cast(height - text_height)); layout->show_in_cairo_context(ctx); if (n == freq_labels.size() - 2U) { return text_height; } } return 0; } easyeffects-4.8.7/src/stereo_tools.cpp000066400000000000000000000144341424023573300200600ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "stereo_tools.hpp" #include #include #include "util.hpp" namespace { void on_post_messages_changed(GSettings* settings, gchar* key, StereoTools* l) { const auto post = g_settings_get_boolean(settings, key); if (post) { if (!l->input_level_connection.connected()) { l->input_level_connection = Glib::signal_timeout().connect( [l]() { float inL = 0.0F; float inR = 0.0F; g_object_get(l->stereo_tools, "meter-inL", &inL, nullptr); g_object_get(l->stereo_tools, "meter-inR", &inR, nullptr); std::array in_peak = {inL, inR}; l->input_level.emit(in_peak); return true; }, 100); } if (!l->output_level_connection.connected()) { l->output_level_connection = Glib::signal_timeout().connect( [l]() { float outL = 0.0F; float outR = 0.0F; g_object_get(l->stereo_tools, "meter-outL", &outL, nullptr); g_object_get(l->stereo_tools, "meter-outR", &outR, nullptr); std::array out_peak = {outL, outR}; l->output_level.emit(out_peak); return true; }, 100); } } else { l->input_level_connection.disconnect(); l->output_level_connection.disconnect(); } } } // namespace StereoTools::StereoTools(const std::string& tag, const std::string& schema, const std::string& schema_path) : PluginBase(tag, "stereo_tools", schema, schema_path) { stereo_tools = gst_element_factory_make("calf-sourceforge-net-plugins-StereoTools", "stereo_tools"); if (is_installed(stereo_tools)) { auto* audioconvert_in = gst_element_factory_make("audioconvert", "stereo_tools_audioconvert_in"); auto* audioconvert_out = gst_element_factory_make("audioconvert", "stereo_tools_audioconvert_out"); gst_bin_add_many(GST_BIN(bin), audioconvert_in, stereo_tools, audioconvert_out, nullptr); gst_element_link_many(audioconvert_in, stereo_tools, audioconvert_out, nullptr); auto* pad_sink = gst_element_get_static_pad(audioconvert_in, "sink"); auto* pad_src = gst_element_get_static_pad(audioconvert_out, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_object_set(stereo_tools, "bypass", 0, nullptr); bind_to_gsettings(); g_signal_connect(settings, "changed::post-messages", G_CALLBACK(on_post_messages_changed), this); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } StereoTools::~StereoTools() { util::debug(log_tag + name + " destroyed"); } void StereoTools::bind_to_gsettings() { g_settings_bind_with_mapping(settings, "input-gain", stereo_tools, "level-in", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "output-gain", stereo_tools, "level-out", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "balance-in", stereo_tools, "balance-in", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "balance-out", stereo_tools, "balance-out", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind(settings, "softclip", stereo_tools, "softclip", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "mutel", stereo_tools, "mutel", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "muter", stereo_tools, "muter", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "phasel", stereo_tools, "phasel", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "phaser", stereo_tools, "phaser", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "mode", stereo_tools, "mode", G_SETTINGS_BIND_DEFAULT); g_settings_bind_with_mapping(settings, "slev", stereo_tools, "slev", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "sbal", stereo_tools, "sbal", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "mlev", stereo_tools, "mlev", G_SETTINGS_BIND_DEFAULT, util::db20_gain_to_linear, util::linear_gain_to_db20, nullptr, nullptr); g_settings_bind_with_mapping(settings, "mpan", stereo_tools, "mpan", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "stereo-base", stereo_tools, "stereo-base", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "delay", stereo_tools, "delay", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "sc-level", stereo_tools, "sc-level", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); g_settings_bind_with_mapping(settings, "stereo-phase", stereo_tools, "stereo-phase", G_SETTINGS_BIND_GET, util::double_to_float, nullptr, nullptr, nullptr); } easyeffects-4.8.7/src/stereo_tools_preset.cpp000066400000000000000000000124621424023573300214410ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "stereo_tools_preset.hpp" StereoToolsPreset::StereoToolsPreset() : output_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.stereotools", "/com/github/wwmm/pulseeffects/sinkinputs/stereotools/")), input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.stereotools", "/com/github/wwmm/pulseeffects/sourceoutputs/stereotools/")) {} void StereoToolsPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".stereo_tools.state", settings->get_boolean("state")); root.put(section + ".stereo_tools.input-gain", settings->get_double("input-gain")); root.put(section + ".stereo_tools.output-gain", settings->get_double("output-gain")); root.put(section + ".stereo_tools.balance-in", settings->get_double("balance-in")); root.put(section + ".stereo_tools.balance-out", settings->get_double("balance-out")); root.put(section + ".stereo_tools.softclip", settings->get_boolean("softclip")); root.put(section + ".stereo_tools.mutel", settings->get_boolean("mutel")); root.put(section + ".stereo_tools.muter", settings->get_boolean("muter")); root.put(section + ".stereo_tools.phasel", settings->get_boolean("phasel")); root.put(section + ".stereo_tools.phaser", settings->get_boolean("phaser")); root.put(section + ".stereo_tools.mode", settings->get_string("mode")); root.put(section + ".stereo_tools.side-level", settings->get_double("slev")); root.put(section + ".stereo_tools.side-balance", settings->get_double("sbal")); root.put(section + ".stereo_tools.middle-level", settings->get_double("mlev")); root.put(section + ".stereo_tools.middle-panorama", settings->get_double("mpan")); root.put(section + ".stereo_tools.stereo-base", settings->get_double("stereo-base")); root.put(section + ".stereo_tools.delay", settings->get_double("delay")); root.put(section + ".stereo_tools.sc-level", settings->get_double("sc-level")); root.put(section + ".stereo_tools.stereo-phase", settings->get_double("stereo-phase")); } void StereoToolsPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".stereo_tools.state"); update_key(root, settings, "input-gain", section + ".stereo_tools.input-gain"); update_key(root, settings, "output-gain", section + ".stereo_tools.output-gain"); update_key(root, settings, "balance-in", section + ".stereo_tools.balance-in"); update_key(root, settings, "balance-out", section + ".stereo_tools.balance-out"); update_key(root, settings, "softclip", section + ".stereo_tools.softclip"); update_key(root, settings, "mutel", section + ".stereo_tools.mutel"); update_key(root, settings, "muter", section + ".stereo_tools.muter"); update_key(root, settings, "phasel", section + ".stereo_tools.phasel"); update_key(root, settings, "phaser", section + ".stereo_tools.phaser"); update_string_key(root, settings, "mode", section + ".stereo_tools.mode"); update_key(root, settings, "slev", section + ".stereo_tools.side-level"); update_key(root, settings, "sbal", section + ".stereo_tools.side-balance"); update_key(root, settings, "mlev", section + ".stereo_tools.middle-level"); update_key(root, settings, "mpan", section + ".stereo_tools.middle-panorama"); update_key(root, settings, "stereo-base", section + ".stereo_tools.stereo-base"); update_key(root, settings, "delay", section + ".stereo_tools.delay"); update_key(root, settings, "sc-level", section + ".stereo_tools.sc-level"); update_key(root, settings, "stereo-phase", section + ".stereo_tools.stereo-phase"); } void StereoToolsPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: save(root, "output", output_settings); break; case PresetType::input: save(root, "input", input_settings); break; } } void StereoToolsPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { switch (preset_type) { case PresetType::output: load(root, "output", output_settings); break; case PresetType::input: load(root, "input", input_settings); break; } } easyeffects-4.8.7/src/stereo_tools_ui.cpp000066400000000000000000000132461424023573300205550ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "stereo_tools_ui.hpp" #include namespace { auto stereo_tools_enum_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "LR > LR (Stereo Default)") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "LR > MS (Stereo to Mid-Side)") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "MS > LR (Mid-Side to Stereo)") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "LR > LL (Mono Left Channel)") == 0) { g_value_set_int(value, 3); } else if (std::strcmp(v, "LR > RR (Mono Right Channel)") == 0) { g_value_set_int(value, 4); } else if (std::strcmp(v, "LR > L+R (Mono Sum L+R)") == 0) { g_value_set_int(value, 5); } else if (std::strcmp(v, "LR > RL (Stereo Flip Channels)") == 0) { g_value_set_int(value, 6); } return 1; } auto int_to_stereo_tools_enum(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("LR > LR (Stereo Default)"); case 1: return g_variant_new_string("LR > MS (Stereo to Mid-Side)"); case 2: return g_variant_new_string("MS > LR (Mid-Side to Stereo)"); case 3: return g_variant_new_string("LR > LL (Mono Left Channel)"); case 4: return g_variant_new_string("LR > RR (Mono Right Channel)"); case 5: return g_variant_new_string("LR > L+R (Mono Sum L+R)"); case 6: return g_variant_new_string("LR > RL (Stereo Flip Channels)"); default: return g_variant_new_string("LR > LR (Stereo Default)"); } } } // namespace StereoToolsUi::StereoToolsUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "stereo_tools"; // loading glade widgets builder->get_widget("softclip", softclip); builder->get_widget("mutel", mutel); builder->get_widget("muter", muter); builder->get_widget("phasel", phasel); builder->get_widget("phaser", phaser); builder->get_widget("mode", mode); builder->get_widget("plugin_reset", reset_button); get_object(builder, "input_gain", input_gain); get_object(builder, "output_gain", output_gain); get_object(builder, "balance_in", balance_in); get_object(builder, "balance_out", balance_out); get_object(builder, "slev", slev); get_object(builder, "sbal", sbal); get_object(builder, "mlev", mlev); get_object(builder, "mpan", mpan); get_object(builder, "stereo_base", stereo_base); get_object(builder, "delay", delay); get_object(builder, "sc_level", sc_level); get_object(builder, "stereo_phase", stereo_phase); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("softclip", softclip, "active", flag); settings->bind("mutel", mutel, "active", flag); settings->bind("muter", muter, "active", flag); settings->bind("phasel", phasel, "active", flag); settings->bind("phaser", phaser, "active", flag); settings->bind("input-gain", input_gain.get(), "value", flag); settings->bind("output-gain", output_gain.get(), "value", flag); settings->bind("balance-in", balance_in.get(), "value", flag); settings->bind("balance-out", balance_out.get(), "value", flag); settings->bind("slev", slev.get(), "value", flag); settings->bind("sbal", sbal.get(), "value", flag); settings->bind("mlev", mlev.get(), "value", flag); settings->bind("mpan", mpan.get(), "value", flag); settings->bind("stereo-base", stereo_base.get(), "value", flag); settings->bind("delay", delay.get(), "value", flag); settings->bind("sc-level", sc_level.get(), "value", flag); settings->bind("stereo-phase", stereo_phase.get(), "value", flag); g_settings_bind_with_mapping(settings->gobj(), "mode", mode->gobj(), "active", G_SETTINGS_BIND_DEFAULT, stereo_tools_enum_to_int, int_to_stereo_tools_enum, nullptr, nullptr); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } StereoToolsUi::~StereoToolsUi() { util::debug(name + " ui destroyed"); } void StereoToolsUi::reset() { settings->reset("input-gain"); settings->reset("output-gain"); settings->reset("balance-in"); settings->reset("balance-out"); settings->reset("softclip"); settings->reset("mutel"); settings->reset("muter"); settings->reset("phasel"); settings->reset("phaser"); settings->reset("mode"); settings->reset("slev"); settings->reset("sbal"); settings->reset("mlev"); settings->reset("mpan"); settings->reset("stereo-base"); settings->reset("delay"); settings->reset("sc-level"); settings->reset("stereo-phase"); } easyeffects-4.8.7/src/util.cpp000066400000000000000000000077111424023573300163140ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "util.hpp" namespace util { void debug(const std::string& s) { g_debug(s.c_str(), "%s"); } void error(const std::string& s) { g_error(s.c_str(), "%s"); } void critical(const std::string& s) { g_critical(s.c_str(), "%s"); } void warning(const std::string& s) { g_warning(s.c_str(), "%s"); } void info(const std::string& s) { g_info(s.c_str(), "%s"); } void print_thread_id() { std::cout << "thread id: " << std::this_thread::get_id() << std::endl; } auto get_global_locale() -> std::locale { // set locale (workaround for #849) try { return std::locale(""); } catch (const std::exception& e) { return std::locale(); } } auto get_c_locale() -> std::locale { return std::locale(); } auto logspace(const float& start, const float& stop, const uint& npoints) -> std::vector { std::vector output; if (stop <= start) { return output; } float delta = (stop - start) / npoints; float v = start; while (v <= stop) { output.emplace_back(powf(10.0F, v)); v += delta; } return output; } auto linspace(const float& start, const float& stop, const uint& npoints) -> std::vector { std::vector output; if (stop <= start) { return output; } float delta = (stop - start) / npoints; float v = start; while (v <= stop) { output.emplace_back(v); v += delta; } return output; } auto db20_gain_to_linear(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { double v_db = g_variant_get_double(variant); float v_linear = powf(10.0F, static_cast(v_db) / 20.0F); g_value_set_float(value, v_linear); return 1; } auto linear_gain_to_db20(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { float v_linear = g_value_get_float(value); double v_db = 20.0 * log10f(static_cast(v_linear)); return g_variant_new_double(v_db); } auto db10_gain_to_linear(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { double v_db = g_variant_get_double(variant); float v_linear = powf(10.0F, static_cast(v_db) / 10.0F); g_value_set_float(value, v_linear); return 1; } auto double_to_float(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { float v_d = g_variant_get_double(variant); g_value_set_float(value, v_d); return 1; } auto db20_gain_to_linear_double(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { double v_db = g_variant_get_double(variant); double v_linear = pow(10.0, v_db / 20.0); g_value_set_double(value, v_linear); return 1; } auto linear_double_gain_to_db20(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { double v_linear = g_value_get_double(value); double v_db = 20.0 * log10(v_linear); return g_variant_new_double(v_db); } auto double_x10_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { double v_d = g_variant_get_double(variant); g_value_set_int(value, v_d * 10); return 1; } auto ms_to_ns(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { guint64 v_ns = g_variant_get_double(variant) * 1000000.0; g_value_set_uint64(value, v_ns); return 1; } } // namespace util easyeffects-4.8.7/src/webrtc.cpp000066400000000000000000000144331424023573300166240ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "webrtc.hpp" #include #include "util.hpp" Webrtc::Webrtc(const std::string& tag, const std::string& schema, const std::string& schema_path, const int& sampling_rate) : PluginBase(tag, "webrtc", schema, schema_path), rate(sampling_rate) { webrtc = gst_element_factory_make("webrtcdsp", nullptr); if (is_installed(webrtc)) { build_probe_bin(); build_dsp_bin(); bind_to_gsettings(); if (g_settings_get_boolean(settings, "state") != 0) { enable(); } } } Webrtc::~Webrtc() { util::debug(log_tag + name + " destroyed"); } void Webrtc::build_probe_bin() { probe_bin = gst_bin_new("probe_bin"); probe_src = gst_element_factory_make("pulsesrc", nullptr); auto* queue = gst_element_factory_make("queue", nullptr); auto* audioconvert = gst_element_factory_make("audioconvert", nullptr); auto* audioresample = gst_element_factory_make("audioresample", nullptr); auto* capsfilter = gst_element_factory_make("capsfilter", nullptr); auto* probe = gst_element_factory_make("webrtcechoprobe", nullptr); auto* sink = gst_element_factory_make("fakesink", nullptr); auto* props = gst_structure_from_string("props,application.name=PulseEffectsWebrtcProbe", nullptr); const auto* caps_str = "audio/x-raw,format=S16LE,channels=2,rate=48000"; auto* caps = gst_caps_from_string(caps_str); g_object_set(probe_src, "stream-properties", props, nullptr); g_object_set(probe_src, "buffer-time", 10000, nullptr); g_object_set(capsfilter, "caps", caps, nullptr); g_object_set(queue, "silent", 1, nullptr); gst_structure_free(props); gst_caps_unref(caps); gst_bin_add_many(GST_BIN(probe_bin), probe_src, queue, audioconvert, audioresample, capsfilter, probe, sink, nullptr); gst_element_link_many(probe_src, queue, audioconvert, audioresample, capsfilter, probe, sink, nullptr); } void Webrtc::build_dsp_bin() { auto* in_level = gst_element_factory_make("level", "webrtc_input_level"); auto* audioconvert_in = gst_element_factory_make("audioconvert", nullptr); auto* audioresample_in = gst_element_factory_make("audioresample", nullptr); auto* caps_in = gst_element_factory_make("capsfilter", nullptr); auto* audioconvert_out = gst_element_factory_make("audioconvert", nullptr); auto* audioresample_out = gst_element_factory_make("audioresample", nullptr); auto* caps_out = gst_element_factory_make("capsfilter", nullptr); auto* out_level = gst_element_factory_make("level", "webrtc_output_level"); auto* capsin = gst_caps_from_string("audio/x-raw,channels=2,format=S16LE,rate=48000"); auto* capsout = gst_caps_from_string(("audio/x-raw,channels=2,format=F32LE,rate=" + std::to_string(rate)).c_str()); g_object_set(caps_in, "caps", capsin, nullptr); g_object_set(caps_out, "caps", capsout, nullptr); gst_caps_unref(capsin); gst_caps_unref(capsout); gst_bin_add(GST_BIN(bin), probe_bin); gst_bin_add_many(GST_BIN(bin), in_level, audioconvert_in, audioresample_in, caps_in, webrtc, audioconvert_out, audioresample_out, caps_out, out_level, nullptr); gst_element_link_many(in_level, audioconvert_in, audioresample_in, caps_in, webrtc, audioconvert_out, audioresample_out, caps_out, out_level, nullptr); auto* pad_sink = gst_element_get_static_pad(in_level, "sink"); auto* pad_src = gst_element_get_static_pad(out_level, "src"); gst_element_add_pad(bin, gst_ghost_pad_new("sink", pad_sink)); gst_element_add_pad(bin, gst_ghost_pad_new("src", pad_src)); gst_object_unref(GST_OBJECT(pad_sink)); gst_object_unref(GST_OBJECT(pad_src)); g_settings_bind(settings, "post-messages", in_level, "post-messages", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "post-messages", out_level, "post-messages", G_SETTINGS_BIND_DEFAULT); } void Webrtc::set_probe_src_device(const std::string& name) { if (probe_src != nullptr) { g_object_set(probe_src, "device", name.c_str(), nullptr); } } void Webrtc::bind_to_gsettings() { g_settings_bind(settings, "high-pass-filter", webrtc, "high-pass-filter", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "echo-cancel", webrtc, "echo-cancel", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "echo-suppression-level", webrtc, "echo-suppression-level", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "noise-suppression", webrtc, "noise-suppression", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "noise-suppression-level", webrtc, "noise-suppression-level", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "gain-control", webrtc, "gain-control", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "extended-filter", webrtc, "extended-filter", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "delay-agnostic", webrtc, "delay-agnostic", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "target-level-dbfs", webrtc, "target-level-dbfs", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "compression-gain-db", webrtc, "compression-gain-db", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "limiter", webrtc, "limiter", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "voice-detection", webrtc, "voice-detection", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "gain-control-mode", webrtc, "gain-control-mode", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "voice-detection-frame-size-ms", webrtc, "voice-detection-frame-size-ms", G_SETTINGS_BIND_DEFAULT); g_settings_bind(settings, "voice-detection-likelihood", webrtc, "voice-detection-likelihood", G_SETTINGS_BIND_DEFAULT); } easyeffects-4.8.7/src/webrtc_preset.cpp000066400000000000000000000112471424023573300202060ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "webrtc_preset.hpp" WebrtcPreset::WebrtcPreset() : input_settings(Gio::Settings::create("com.github.wwmm.pulseeffects.webrtc", "/com/github/wwmm/pulseeffects/sourceoutputs/webrtc/")) {} void WebrtcPreset::save(boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { root.put(section + ".webrtc.state", settings->get_boolean("state")); root.put(section + ".webrtc.high-pass-filter", settings->get_boolean("high-pass-filter")); root.put(section + ".webrtc.echo-cancel", settings->get_boolean("echo-cancel")); root.put(section + ".webrtc.echo-suppression-level", settings->get_string("echo-suppression-level")); root.put(section + ".webrtc.noise-suppression", settings->get_boolean("noise-suppression")); root.put(section + ".webrtc.noise-suppression-level", settings->get_string("noise-suppression-level")); root.put(section + ".webrtc.gain-control", settings->get_boolean("gain-control")); root.put(section + ".webrtc.extended-filter", settings->get_boolean("extended-filter")); root.put(section + ".webrtc.delay-agnostic", settings->get_boolean("delay-agnostic")); root.put(section + ".webrtc.target-level-dbfs", settings->get_int("target-level-dbfs")); root.put(section + ".webrtc.compression-gain-db", settings->get_int("compression-gain-db")); root.put(section + ".webrtc.limiter", settings->get_boolean("limiter")); root.put(section + ".webrtc.gain-control-mode", settings->get_string("gain-control-mode")); root.put(section + ".webrtc.voice-detection", settings->get_boolean("voice-detection")); root.put(section + ".webrtc.voice-detection-frame-size-ms", settings->get_int("voice-detection-frame-size-ms")); root.put(section + ".webrtc.voice-detection-likelihood", settings->get_string("voice-detection-likelihood")); } void WebrtcPreset::load(const boost::property_tree::ptree& root, const std::string& section, const Glib::RefPtr& settings) { update_key(root, settings, "state", section + ".webrtc.state"); update_key(root, settings, "high-pass-filter", section + ".webrtc.high-pass-filter"); update_key(root, settings, "echo-cancel", section + ".webrtc.echo-cancel"); update_string_key(root, settings, "echo-suppression-level", section + ".webrtc.echo-suppression-level"); update_key(root, settings, "noise-suppression", section + ".webrtc.noise-suppression"); update_string_key(root, settings, "noise-suppression-level", section + ".webrtc.noise-suppression-level"); update_key(root, settings, "gain-control", section + ".webrtc.gain-control"); update_key(root, settings, "extended-filter", section + ".webrtc.extended-filter"); update_key(root, settings, "delay-agnostic", section + ".webrtc.delay-agnostic"); update_key(root, settings, "target-level-dbfs", section + ".webrtc.target-level-dbfs"); update_key(root, settings, "compression-gain-db", section + ".webrtc.compression-gain-db"); update_key(root, settings, "limiter", section + ".webrtc.limiter"); update_string_key(root, settings, "gain-control-mode", section + ".webrtc.gain-control-mode"); update_key(root, settings, "voice-detection", section + ".webrtc.voice-detection"); update_key(root, settings, "voice-detection-frame-size-ms", section + ".webrtc.voice-detection-frame-size-ms"); update_string_key(root, settings, "voice-detection-likelihood", section + ".webrtc.voice-detection-likelihood"); } void WebrtcPreset::write(PresetType preset_type, boost::property_tree::ptree& root) { if (preset_type == PresetType::input) { save(root, "input", input_settings); } } void WebrtcPreset::read(PresetType preset_type, const boost::property_tree::ptree& root) { if (preset_type == PresetType::input) { load(root, "input", input_settings); } } easyeffects-4.8.7/src/webrtc_ui.cpp000066400000000000000000000205251424023573300173200ustar00rootroot00000000000000/* * Copyright © 2017-2020 Wellington Wallace * * This file is part of PulseEffects. * * PulseEffects is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PulseEffects is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PulseEffects. If not, see . */ #include "webrtc_ui.hpp" #include namespace { auto echo_suppression_level_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "low") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "moderate") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "high") == 0) { g_value_set_int(value, 2); } return 1; } auto int_to_echo_suppression_level(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("low"); case 1: return g_variant_new_string("moderate"); case 2: return g_variant_new_string("high"); default: return g_variant_new_string("moderate"); } } auto noise_suppression_level_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "low") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "moderate") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "high") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "very-high") == 0) { g_value_set_int(value, 3); } return 1; } auto int_to_noise_suppression_level(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("low"); case 1: return g_variant_new_string("moderate"); case 2: return g_variant_new_string("high"); case 3: return g_variant_new_string("very-high"); default: return g_variant_new_string("moderate"); } } auto gain_control_mode_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "adaptive-digital") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "fixed-digital") == 0) { g_value_set_int(value, 1); } return 1; } auto int_to_gain_control_mode(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("adaptive-digital"); case 1: return g_variant_new_string("fixed-digital"); default: return g_variant_new_string("adaptive-digital"); } } auto voice_detection_likelihood_to_int(GValue* value, GVariant* variant, gpointer user_data) -> gboolean { const auto* v = g_variant_get_string(variant, nullptr); if (std::strcmp(v, "very-low") == 0) { g_value_set_int(value, 0); } else if (std::strcmp(v, "low") == 0) { g_value_set_int(value, 1); } else if (std::strcmp(v, "moderate") == 0) { g_value_set_int(value, 2); } else if (std::strcmp(v, "high") == 0) { g_value_set_int(value, 3); } return 1; } auto int_to_voice_detection_likelihood(const GValue* value, const GVariantType* expected_type, gpointer user_data) -> GVariant* { const auto v = g_value_get_int(value); switch (v) { case 0: return g_variant_new_string("very-low"); case 1: return g_variant_new_string("low"); case 2: return g_variant_new_string("moderate"); case 3: return g_variant_new_string("high"); default: return g_variant_new_string("low"); } } } // namespace WebrtcUi::WebrtcUi(BaseObjectType* cobject, const Glib::RefPtr& builder, const std::string& schema, const std::string& schema_path) : Gtk::Grid(cobject), PluginUiBase(builder, schema, schema_path) { name = "webrtc"; // loading glade widgets builder->get_widget("echo_cancel", echo_cancel); builder->get_widget("extended_filter", extended_filter); builder->get_widget("high_pass_filter", high_pass_filter); builder->get_widget("delay_agnostic", delay_agnostic); builder->get_widget("noise_suppression", noise_suppression); builder->get_widget("gain_control", gain_control); builder->get_widget("limiter", limiter); builder->get_widget("voice_detection", voice_detection); builder->get_widget("echo_suppression_level", echo_suppression_level); builder->get_widget("noise_suppression_level", noise_suppression_level); builder->get_widget("gain_control_mode", gain_control_mode); builder->get_widget("voice_detection_likelihood", voice_detection_likelihood); builder->get_widget("plugin_reset", reset_button); get_object(builder, "compression_gain_db", compression_gain_db); get_object(builder, "target_level_dbfs", target_level_dbfs); get_object(builder, "voice_detection_frame_size", voice_detection_frame_size); // gsettings bindings auto flag = Gio::SettingsBindFlags::SETTINGS_BIND_DEFAULT; settings->bind("installed", this, "sensitive", flag); settings->bind("compression-gain-db", compression_gain_db.get(), "value", flag); settings->bind("target-level-dbfs", target_level_dbfs.get(), "value", flag); settings->bind("voice-detection-frame-size-ms", voice_detection_frame_size.get(), "value", flag); settings->bind("echo-cancel", echo_cancel, "active", flag); settings->bind("extended-filter", extended_filter, "active", flag); settings->bind("high-pass-filter", high_pass_filter, "active", flag); settings->bind("delay-agnostic", delay_agnostic, "active", flag); settings->bind("noise-suppression", noise_suppression, "active", flag); settings->bind("gain-control", gain_control, "active", flag); settings->bind("limiter", limiter, "active", flag); settings->bind("voice-detection", voice_detection, "active", flag); g_settings_bind_with_mapping(settings->gobj(), "echo-suppression-level", echo_suppression_level->gobj(), "active", G_SETTINGS_BIND_DEFAULT, echo_suppression_level_to_int, int_to_echo_suppression_level, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "noise-suppression-level", noise_suppression_level->gobj(), "active", G_SETTINGS_BIND_DEFAULT, noise_suppression_level_to_int, int_to_noise_suppression_level, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "gain-control-mode", gain_control_mode->gobj(), "active", G_SETTINGS_BIND_DEFAULT, gain_control_mode_to_int, int_to_gain_control_mode, nullptr, nullptr); g_settings_bind_with_mapping(settings->gobj(), "voice-detection-likelihood", voice_detection_likelihood->gobj(), "active", G_SETTINGS_BIND_DEFAULT, voice_detection_likelihood_to_int, int_to_voice_detection_likelihood, nullptr, nullptr); // reset plugin reset_button->signal_clicked().connect([=]() { reset(); }); } WebrtcUi::~WebrtcUi() { util::debug(name + " ui destroyed"); } void WebrtcUi::reset() { settings->reset("high-pass-filter"); settings->reset("echo-cancel"); settings->reset("echo-suppression-level"); settings->reset("noise-suppression"); settings->reset("noise-suppression-level"); settings->reset("gain-control"); settings->reset("extended-filter"); settings->reset("delay-agnostic"); settings->reset("target-level-dbfs"); settings->reset("compression-gain-db"); settings->reset("limiter"); settings->reset("gain-control-mode"); settings->reset("voice-detection"); settings->reset("voice-detection-frame-size-ms"); settings->reset("voice-detection-likelihood"); } easyeffects-4.8.7/util/000077500000000000000000000000001424023573300150135ustar00rootroot00000000000000easyeffects-4.8.7/util/add-appdata-release.sh000077500000000000000000000060741424023573300211370ustar00rootroot00000000000000#!/usr/bin/env bash set -o nounset set -o noglob set -o noclobber #set -o xtrace #Debug # ----------------------------------------------------------------------------- # Constants # ----------------------------------------------------------------------------- readonly APP_ID='com.github.wwmm.pulseeffects' readonly SCRIPT_DEPS='date dirname realpath xmllint xsltproc' BASE_DIR='.' CMD_DIR='' REPO_DIR='' APPDATA_FILE='' # Configurable DATA_DIR='data' # ----------------------------------------------------------------------------- # Functions # ----------------------------------------------------------------------------- init() { local cmd="$1" readonly BASE_DIR="$(pwd -P)" readonly CMD_DIR="$(dirname "${cmd}")" readonly REPO_DIR="$(realpath "${CMD_DIR}"/..)" readonly DATA_DIR="${REPO_DIR}/${DATA_DIR}" readonly APPDATA_FILE="${DATA_DIR}/${APP_ID}.appdata.xml.in" if [[ "${BASE_DIR}" != "${REPO_DIR}" ]]; then log_info 'Changing current working directory to repo.' cd -P -- "${REPO_DIR}" || exit 1 fi } log_info() { printf "\e[1m[ \e[36mINFO\e[39m ]\e[0m $1\n" } log_err() { printf "\e[1m[ \e[31mERROR\e[39m ]\e[0m $1" >&2 } exit_err() { log_err "$1" exit 1 } check_deps() { local missing_deps='' for dep in ${SCRIPT_DEPS}; do if ! which "${dep}" > /dev/null 2>&1; then missing_deps="${missing_deps} ${dep}" fi done if [[ -n "${missing_deps}" ]]; then exit_err "Missing commands:${missing_deps}\n" fi } check_appdata_releases() { local new_version="$1" local old_version='' local xpath='string(//release[1]/@version)' old_version="$(xmllint --xpath "${xpath}" "${APPDATA_FILE}")" if [[ "$?" -ne 0 ]]; then exit_err "Failed to find any existing releases in ${APPDATA_FILE}." fi if [[ "${old_version}" == "${new_version}" ]]; then log_info 'Current app release is already in appdata. No action taken.' exit 0 fi } get_version() { local file='' local version='' # Read main project meson.build file file="${REPO_DIR}/$(< meson.build)" if [[ "$?" -ne 0 ]]; then exit_err 'Failed to read meson.build file.' fi # Extract version string # Works as long as "meson_version:" is defined bellow "version:" file="${file#*version:*\'}" version="${file%%\'*}" printf "${version}\n" } get_date() { local date='' date="$(date --utc +%F)" if [[ "$?" -ne 0 ]]; then exit_err 'Failed to get the current date.' fi printf "${date}\n" } add_new_release() { local xsl_file="${CMD_DIR}/add-appdata-release.xsl" local version='' local date='' version="$(get_version)" || exit 1 check_appdata_releases "${version}" date="$(get_date)" || exit 1 log_info "Adding release information for ${version} to appdata file." xsltproc \ --stringparam version "${version}" \ --stringparam date "${date}" \ -o "${APPDATA_FILE}" "${xsl_file}" "${APPDATA_FILE}" if [[ "$?" -ne 0 ]]; then exit_err "Failed to apply changes to ${APPDATA_FILE}." fi } main() { check_deps init "$0" add_new_release } main easyeffects-4.8.7/util/add-appdata-release.xsl000066400000000000000000000015151424023573300213230ustar00rootroot00000000000000 easyeffects-4.8.7/util/autobuild.sh000077500000000000000000000065261424023573300173530ustar00rootroot00000000000000#!/usr/bin/env bash # This ugly script helps to build a new version of PulseEffects # Currently for DEB package only # Author: Mikhail Novosyolov pkg_name="pulseeffects" git_upstream_url="https://github.com/wwmm/pulseeffects.git" stdate="$(date +%s)" day_name="$(env LANG=c date --date="@${stdate}" +%a)" month_name="$(env LANG=c date --date="@${stdate}" +%b)" year="$(env LANG=c date --date="@${stdate}" +%Y)" day_month="$(env LANG=c date --date="@${stdate}" +%d)" time="$(env LANG=c date --date="@${stdate}" +%H:%m:%S)" timezone="$(env LANG=c date --date="@${stdate}" +%z)" dir_start="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" if [ "$(basename "${dir_start}")" = 'util' ]; then cd .. fi dir0="$(pwd)" echo_help(){ echo "Usage: nv|nw|new_version, ppa, lc|local_test, check_fuzzy|check_fuzzy_po|cf, full" } git_sync_upstream(){ if ! git remote -v | grep -q "$git_upstream_url"; then git remote add upstream "$git_upstream_url" fi git fetch upstream # git merge returns 0 only if merge was successful if git merge upstream/master then : else echo "" echo "Merge conflicts! Cannot continue!" echo "" exit 1 fi } debian_changelog_new_entry(){ if [ ! -f debian/changelog.tpl ]; then echo "No debian/changelog.tpl, cannot continue!" exit 1 fi if [ -z "$new_version" ]; then echo "new_version is empty"; exit 1; fi cat debian/changelog.tpl | \ sed "s/%new_version%/${new_version}/g" | \ sed "s/%day_name%/${day_name}/g" | \ sed "s/%day_month%/${day_month}/g" | \ sed "s/%month_name%/${month_name}/g" | \ sed "s/%year%/${year}/g" | \ sed "s/%time%/${time}/g" | \ sed "s/%timezone%/${timezone}/g" | \ tee -a "${dir0}/debian/changelog.new" mv debian/changelog debian/changelog.old echo " " >> debian/changelog.new cat debian/changelog.new debian/changelog.old > debian/changelog rm -f debian/changelog.new debian/changelog.old } check_fuzzy_po(){ for lang in ru do if grep -q "^#, fuzzy" "po/${lang}.po" then read -p "Fuzzies FOUND in localization ${lang}" else echo "No fuzzies found in localization ${lang}" fi if grep -q "^#, fuzzy" "help/${lang}/${lang}.po" then read -p "Fuzzies FOUND in help ${lang}" echo "No fuzzies found in help ${lang}" else echo "No fuzzies found in help ${lang}" fi done } new_version(){ # env USCAN=0 util/autobuild.sh if [ ! "$USCAN" = '0' ] then if env LANG=c uscan | grep -qi 'Newer package available'; then new_version="$(env LANG=c uscan --no-download | grep 'Newest version of' | awk -F ', ' '{print $1}' | awk -F ' ' '{print $NF}')" fi else : fi git_sync_upstream git commit -m "Updated to ${new_version} (autobuild)" debian/changelog debian_changelog_new_entry check_fuzzy_po } ppa(){ pushd debian ./build-ppa.sh popd } git_push(){ git push } local_test(){ dpkg-buildpackage last_version="$(head -n 1 debian/changelog | tr -d "()" | awk -F ' ' '{print $2}')" sudo apt install ../*${pkg_name}*${last_version}*.deb -y && \ if pulseeffects then return 0 else return 1 fi debian/rules clean } case "$1" in nv|nw|new_version ) new_version ;; ppa ) ppa ;; full ) new_version if local_test; then ppa git_push fi ;; lc|local_test ) #new_version local_test ;; check_fuzzy|check_fuzzy_po|cf ) check_fuzzy_po ;; * ) echo "Current dir is: $(pwd) ." echo_help ;; esac easyeffects-4.8.7/util/crystalizer.py000077500000000000000000000027211424023573300177450ustar00rootroot00000000000000#!/usr/bin/env python3 import numpy as np import matplotlib.pyplot as plt import scipy.io.wavfile as wavefile rate, wave = wavefile.read('test.wav') wave_y = wave[14000:15000] wave_x = np.arange(wave_y.size) t = wave_x original = wave_y standard = np.copy(original) deriv2 = np.zeros(original.size) intensity = 2.0 # the boundaries are better handled in the plugin code for n in range(original.size): if n > 0 and n < original.size - 1: deriv2[n] = original[n + 1] - 2 * original[n] + original[n - 1] elif n == 0: deriv2[0] = original[n + 1] - 2 * original[n] + original[n] elif n == original.size - 1: deriv2[n] = original[n] - 2 * original[n] + original[n - 1] for n in range(standard.size): standard[n] -= intensity * deriv2[n] aggressive = np.copy(standard) if intensity >= 1: ndivs = 1000 gain = np.linspace(1, intensity, ndivs) dv = 0.5 / ndivs for n in range(standard.size): v = aggressive[n] idx = int(np.floor(np.fabs(v) / dv)) if idx < 0: idx = 0 elif idx > gain.size: idx = gain.size - 1 aggressive[n] = v * gain[idx] fig = plt.figure() plt.plot(t, original, 'bo-', markersize=4, label='original') plt.plot(t, standard, 'ro-', markersize=4, label='standard') plt.plot(t, aggressive, 'go-', markersize=4, label='aggressive') fig.legend() plt.xlabel('Arbitrary Time', fontsize=18) plt.ylabel('Waveform', fontsize=18) plt.grid() plt.show() easyeffects-4.8.7/util/environmental_variables.sh000077500000000000000000000003241424023573300222620ustar00rootroot00000000000000#!/bin/sh export GSETTINGS_SCHEMA_DIR=../../data/schemas/ export GST_PLUGIN_PATH_1_0=convolver:crystalizer:autogain:adapter:rnnoise export G_MESSAGES_DEBUG=pulseeffects export GST_DEBUG_FILE=/tmp/gst_pe_log.txt easyeffects-4.8.7/util/gst.supp000066400000000000000000000711521424023573300165270ustar00rootroot00000000000000### this file contains suppressions for valgrind when running ### the gstreamer unit tests ### it might be useful for wider use as well ### syscall suppressions { Memcheck:Param clone(parent_tidptr) fun:clone fun:clone } { Memcheck:Param clone(child_tidptr) fun:clone fun:clone } { Memcheck:Param clone(tlsinfo) fun:clone fun:clone } # a thread-related free problem in glibc from Edgard { __libc_freeres_rw_acess Memcheck:Addr4 obj:* obj:* obj:* obj:* obj:* fun:__libc_freeres } { Memcheck:Param futex(uaddr2) fun:pthread_once obj:/lib/libc-2.3.*.so obj:/lib/libc-2.3.*.so fun:mbsnrtowcs fun:vfprintf fun:vsprintf fun:sprintf obj:/lib/libc-2.3.*.so fun:tmpfile fun:setup_pipe fun:setup_messaging_with_key fun:setup_messaging } # suppression for a glibc bug: # http://valgrind.org/docs/manual/faq.html#faq.exit_errors> { Memcheck:Free fun:free obj:*libc-*.so fun:__libc_freeres fun:* fun:_Exit } # same as above, just so it works for tpm on gutsy/x86-64 { Memcheck:Free fun:free fun:free_mem fun:__libc_freeres } ### glib suppressions { Memcheck:Cond fun:g_parse_debug_string obj:/usr/lib*/libglib-2.0.so.* fun:g_slice_alloc fun:g_slice_alloc0 } { Memcheck:Leak fun:*alloc ... fun:g_type_init* fun:init_pre* } { Memcheck:Leak fun:*alloc ... fun:g_type_register_fundamental } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:type_node_any_new_W } { Memcheck:Leak fun:realloc fun:g_realloc fun:type_node_any_new_W } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:g_type_class_ref } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:type_add_flags_W } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:type_add_flags_W } #pthread memleaks { pthread_create Syscall param write(buf) points to uninitialised byte(s) Memcheck:Param write(buf) fun:pthread_create@@GLIBC_2.2.5 fun:g_thread_create* } # nss_parse_* memleak (used by g_option_context_parse) { nss_parse_* memleak Memcheck:Leak fun:malloc fun:nss_parse_service_list fun:__nss_database_lookup } # liboil suppressions { Memcheck:Value8 obj:/usr/lib/liboil-0.3.so.0.1.0 obj:/usr/lib/liboil-0.3.so.0.1.0 obj:/usr/lib/liboil-0.3.so.0.1.0 fun:oil_cpu_fault_check_try fun:oil_test_check_impl fun:oil_class_optimize fun:oil_optimize_all fun:oil_init } { Memcheck:Param futex(uaddr2) fun:pthread_once obj:/lib/libc-2.3.6.so obj:/lib/libc-2.3.6.so fun:setlocale fun:init_pre fun:g_option_context_parse fun:gst_init_check fun:gst_init fun:gst_check_init fun:main } { Memcheck:Leak fun:calloc obj:/usr/lib/libcdio.so.6.0.1 fun:cdio_open_am_linux obj:/usr/lib/libcdio.so.6.0.1 fun:cdio_open_am } { Memcheck:Cond fun:snd_pcm_direct_shm_create_or_connect fun:snd_pcm_dsnoop_open fun:_snd_pcm_dsnoop_open obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_plug_open obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_asym_open obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 } { Memcheck:Cond fun:snd*_pcm_hw_param_set_near } { Memcheck:Cond ... fun:snd*_pcm_hw_param_set_near } { Memcheck:Cond obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_close obj:/*lib/libasound.so.2.0.0 } { Memcheck:Cond fun:snd_pcm_direct_shm_create_or_connect fun:snd_pcm_dmix_open fun:_snd_pcm_dmix_open obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_softvol_open obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_plug_open obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_asym_open obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 } { Memcheck:Leak fun:malloc fun:strdup fun:snd_dlobj_cache_add obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:snd_pcm_dsnoop_open fun:_snd_pcm_dsnoop_open obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_plug_open obj:/*lib/libasound.so.2.0.0 fun:snd_pcm_open_slave fun:_snd_pcm_asym_open obj:/*lib/libasound.so.2.0.0 obj:/*lib/libasound.so.2.0.0 } # Catch about 15 variations on inserting info into an ALSA # internal cache { Memcheck:Leak fun:malloc ... fun:snd*_dlobj_cache_add obj:/*lib*/libasound.so.2.0.0 } { Memcheck:Leak fun:*alloc ... fun:snd_pcm_open_conf } { Memcheck:Leak fun:*alloc obj:/*lib*/libasound.so.2.0.0 ... fun:snd_config_hook_load } { Memcheck:Leak fun:*alloc obj:/*lib*/libasound.so.2.0.0 ... fun:snd_config_update_r fun:snd_config_update } { Memcheck:Leak fun:*alloc fun:strdup ... fun:snd_config_update_r fun:snd_config_update } { Memcheck:Leak fun:malloc obj:/lib/libc*.so fun:__nss_database_lookup obj:* obj:* fun:getgrnam_r fun:getgrnam fun:snd_pcm_direct_parse_open_conf } { Memcheck:Leak fun:calloc fun:_XCBInitDisplayLock fun:XOpenDisplay } # GConf internal initialisations related to getting the default client. { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_tcval obj:/usr/lib/libORBit-2.so.* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:CORBA_ORB_string_to_object obj:/usr/lib/libgconf-2.so.* fun:gconf_get_current_lock_holder fun:gconf_activate_server obj:/usr/lib/libgconf-2.so.* obj:/usr/lib/libgconf-2.so.* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_tcval obj:* fun:PortableServer_POA_servant_to_reference fun:* fun:* fun:* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_tcval obj:/usr/lib/libORBit-2.so.* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:CORBA_ORB_string_to_object obj:/usr/lib/libgconf-2.so.* fun:gconf_get_current_lock_holder fun:gconf_activate_server obj:/usr/lib/libgconf-2.so.* obj:/usr/lib/libgconf-2.so.* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:ORBit_demarshal_value fun:* fun:ORBit_small_invoke_stub fun:ConfigServer_get_default_database fun:* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:* fun:IOP_generate_profiles fun:ORBit_marshal_object fun:ORBit_marshal_value fun:* fun:ORBit_small_invoke_stub fun:ConfigServer_add_client fun:* fun:* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_by_tc fun:* fun:PortableServer_POA_servant_to_reference fun:* fun:* fun:* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_by_tc obj:/usr/lib/libORBit-2.so.* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:CORBA_ORB_string_to_object obj:/usr/lib/libgconf-2.so.* fun:gconf_get_current_lock_holder fun:gconf_activate_server obj:/usr/lib/libgconf-2.so.* obj:/usr/lib/libgconf-2.so.* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:* fun:* fun:gconf_activate_server } # Some libORBit/bonobo initialisation stuff { Memcheck:Leak fun:malloc fun:g_malloc fun:ORBit_alloc_string fun:CORBA_string_dup fun:Bonobo_ActivationEnvValue_set fun:bonobo_activation_init_activation_env fun:bonobo_activation_orb_init fun:bonobo_activation_init } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_alloc* obj:/usr/lib/libORBit-2.so* fun:PortableServer_POA_servant_to_reference obj:/usr/lib/libbonobo-2.so* } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_tcval fun:ORBit_small_allocbuf fun:ORBit_adaptor_setup obj:/usr/lib/libORBit-2.so* fun:ORBit_POA_setup_root fun:ORBit_init_internals fun:CORBA_ORB_init } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc_tcval fun:ORBit_adaptor_setup fun:* fun:ORBit_POA_setup_root fun:ORBit_init_internals fun:CORBA_ORB_init } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_allocbuf fun:bonobo_activation_init_activation_env fun:bonobo_activation_orb_init fun:bonobo_activation_init } # More GConf stuff from the FC5 buildbot, mostly variations on the # above stack traces { Memcheck:Param writev(vector[...]) fun:writev obj:/usr/lib/libORBit-2.so* fun:link_connection_writev fun:giop_send_buffer_write obj:/usr/lib/libORBit-2.so* fun:ORBit_small_invoke_stub fun:ORBit_small_invoke_stub_n fun:ORBit_c_stub_invoke fun:ConfigServer_ping fun:gconf_activate_server obj:/usr/lib/libgconf-2.so* obj:/usr/lib/libgconf-2.so* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_alloc* obj:/usr/lib/libORBit-2.so* fun:PortableServer_POA_servant_to_reference obj:/usr/lib/libgconf-2.so* obj:/usr/lib/libgconf-2.so* obj:/usr/lib/libgconf-2.so* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_alloc obj:/usr/lib/libORBit-2.so* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:CORBA_ORB_string_to_object obj:/usr/lib/libgconf-2.so* fun:gconf_get_current_lock_holder fun:gconf_activate_server obj:/usr/lib/libgconf-2.so* obj:/usr/lib/libgconf-2.so* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_alloc* obj:/usr/lib/libORBit-2.so* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:CORBA_ORB_string_to_object obj:/usr/lib/libgconf-2.so* fun:gconf_get_current_lock_holder fun:gconf_activate_server obj:/usr/lib/libgconf-2.so* obj:/usr/lib/libgconf-2.so* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_alloc* obj:/usr/lib/libORBit-2.so* fun:ORBit_demarshal_IOR fun:ORBit_demarshal_object fun:ORBit_demarshal_value obj:/usr/lib/libORBit-2.so* fun:ORBit_small_invoke_stub fun:ORBit_small_invoke_stub_n fun:ORBit_c_stub_invoke fun:ConfigServer_get_default_database obj:/usr/lib/libgconf-2.so* fun:gconf_engine_get_default } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:ORBit_alloc* fun:ORBit_small_alloc* obj:/usr/lib/libORBit-2.so* fun:ORBit_OAObject_object_to_objkey fun:IOP_generate_profiles fun:ORBit_marshal_object fun:ORBit_marshal_value obj:/usr/lib/libORBit-2.so* fun:ORBit_small_invoke_stub fun:ORBit_small_invoke_stub_n fun:ORBit_c_stub_invoke fun:ConfigServer_add_client obj:/usr/lib/libgconf-2.so* obj:/usr/lib/libgconf-2.so* fun:gconf_engine_get_default } { Memcheck:Leak fun:malloc obj:*libc-*.so fun:__nss_database_lookup obj:* obj:* fun:getpwnam_r obj:/usr/lib*/libglib-2.0.so.* fun:g_get_home_dir } { Memcheck:Leak fun:malloc obj:*libc-*.so fun:__nss_database_lookup obj:* obj:* fun:getpwnam_r obj:/usr/lib*/libglib-2.0.so.* fun:g_get_user_name } { Memcheck:Leak fun:malloc obj:*libc-*.so fun:__nss_database_lookup obj:* obj:* fun:getpwnam_r obj:/usr/lib*/libglib-2.0.so.* fun:g_get_tmp_dir } { Memcheck:Leak fun:malloc obj:*libc-*.so fun:__nss_database_lookup obj:* obj:* fun:getpwnam_r obj:/usr/lib*/libglib-2.0.so.0.* fun:g_get_host_name } ## Some Fontconfig errors. { Memcheck:Leak fun:malloc fun:FcPatternObjectInsertElt fun:FcPatternObjectAddWithBinding fun:FcPatternAppend fun:FcEndElement obj:/usr/lib/libexpat.so.* obj:/usr/lib/libexpat.so.* obj:/usr/lib/libexpat.so.* obj:/usr/lib/libexpat.so.* fun:XML_ParseBuffer fun:FcConfigParseAndLoad fun:FcConfigParseAndLoad fun:FcParseInclude fun:FcEndElement obj:/usr/lib/libexpat.so.* obj:/usr/lib/libexpat.so.* obj:/usr/lib/libexpat.so.* obj:/usr/lib/libexpat.so.* fun:XML_ParseBuffer fun:FcConfigParseAndLoad } { Memcheck:Leak fun:*alloc ... fun:FcInitLoadConfig } ## Leaks in ALSA (variations of leak from snd_config_load1) { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:calloc fun:_snd_config_make fun:_snd_config_make_add fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:malloc fun:snd1_dlobj_cache_add fun:snd_ctl_open_noupdate } { Memcheck:Leak fun:malloc fun:* fun:snd1_dlobj_cache_add fun:snd_ctl_open_noupdate } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } { Memcheck:Leak fun:*alloc fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:* fun:snd_config_load1 } # The following are leaks of caps that need to be created dynamically # in the type registration of the plugin (used for pad templates). { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_new_simple fun:* fun:g_type_class_ref fun:gst_element_register } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:* fun:* fun:g_type_class_ref fun:gst_element_register fun:gst_ogm_parse_plugin_init fun:plugin_init } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_copy fun:gst_video_test_src_base_init fun:g_type_class_ref fun:gst_element_register } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_copy fun:gst_video_test_src_getcaps fun:gst_video_test_src_base_init fun:g_type_class_ref fun:gst_element_register } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_ffmpegcsp_codectype_to_caps fun:gst_ffmpegcolorspace_register fun:plugin_init } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_copy fun:gst_ffmpegcolorspace_register fun:plugin_init } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_new_any fun:gst_ffmpegdemux_register fun:plugin_init } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_copy fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:realloc fun:g_realloc fun:g_ptr_array_maybe_expand fun:g_ptr_array_add fun:gst_caps_append fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:g_ptr_array_maybe_expand fun:g_ptr_array_add fun:gst_caps_append fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:g_ptr_array_maybe_expand fun:g_ptr_array_add fun:gst_caps_copy fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:g_ptr_array_sized_new fun:gst_caps_new_empty fun:gst_caps_copy fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:g_array_maybe_expand fun:g_array_sized_new fun:* fun:* fun:* fun:gst_value_init_and_copy fun:gst_structure_copy fun:gst_caps_copy fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:g_array_maybe_expand fun:g_array_sized_new fun:* fun:gst_structure_copy fun:gst_caps_copy fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:g_array_sized_new fun:* fun:gst_structure_copy fun:gst_caps_copy fun:gst_audio_filter_class_add_pad_templates } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_riff_create_*_template_caps } { Memcheck:Leak fun:malloc fun:realloc fun:g_realloc fun:* fun:* fun:* fun:gst_structure_copy fun:gst_caps_copy fun:gst_caps_append fun:gst_riff_create_*_template_caps } { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:g_array_sized_new fun:* fun:gst_structure_copy fun:gst_caps_copy fun:gst_caps_append fun:gst_riff_create_*_template_caps } ## Leaks in pango (bilboed: gentoo unstable amd64) { Memcheck:Leak fun:*alloc ... fun:pango_layout_get_pixel_extents } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:pango_language_from_string fun:pango_language_get_default fun:pango_context_init fun:g_type_create_instance fun:g_object_constructor fun:g_object_newv fun:g_object_new_valist fun:g_object_new fun:pango_font_map_create_context } { Memcheck:Leak fun:calloc fun:g_malloc0 fun:pango_language_from_string } ## Leak of everything allocated by gst-libav plugin init { Memcheck:Leak fun:*alloc ... fun:gst_ffmpeg_cfg_init } ## Leak of GIO module through gnomevfs { Memcheck:Leak fun:malloc fun:g_malloc fun:* fun:* fun:g_type_create_instance fun:* fun:* fun:* fun:* fun:g_io_module_new fun:g_io_modules_load_all_in_directory fun:* fun:get_default_vfs } ## Conditional jump in getaddrinfo (bilboed, gentoo ~amd64, Dec 13 2008) { Memcheck:Cond fun:gaih_inet fun:getaddrinfo } ## Dynamic pad templates in mxfmux { Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc fun:gst_caps_new_empty fun:gst_caps_from_string fun:mxf_*_init fun:plugin_init } ## We don't know if ffmpeg frees this or not and better pass a copy for safety { Memcheck:Leak fun:malloc fun:g_malloc fun:g_strdup fun:gst_ffmpeg_cfg_fill_context fun:gst_ffmpegenc_setcaps fun:gst_pad_set_caps } { Memcheck:Value8 obj:/lib*/libc-2.10.*.so obj:/lib*/libc-2.10.*.so fun:_vgnU_freeres } { Memcheck:Cond obj:/lib*/libc-2.10.*.so obj:/lib*/libc-2.10.*.so fun:_vgnU_freeres } { Memcheck:Free fun:free obj:/lib*/libc-2.10.*.so obj:/lib*/libc-2.10.*.so fun:_vgnU_freeres } # glibc-2.10 dl overreads { Memcheck:Cond fun:__tls* obj:* obj:* fun:_vgnU_freeres } { Memcheck:Param arch_prctl(arg2) fun:init_tls } # GModule issues with glibc-2.10 { Memcheck:Value8 fun:g_module_* fun:gst_plugin* } { Memcheck:Value8 fun:* fun:g_module_* fun:gst_plugin* } # Leak in GSlice { Memcheck:Value8 fun:g_parse_debug_string fun:slice_config_init fun:g_slice_init_nomessage fun:_g_slice_thread_init_nomessage fun:g_thread_init_glib } # 2.10 pthread issues { Memcheck:Value8 fun:__pthread_initialize_minimal } # glib type leaks { Memcheck:Leak fun:*alloc ... fun:g_type_register_static } # new registry system # all of this will only be created once when loading registry. { Memcheck:Leak fun:*alloc ... fun:_priv_gst_registry_chunks_load_plugin } # system-wide tags # these tags are registered once { Memcheck:Leak fun:*alloc fun:* fun:* fun:gst_tag_register fun:_gst_tag_initialize } # system-wide tags # these tags are registered once { Memcheck:Leak fun:*alloc ... fun:gst_tag_register_static } # system-wide type classes that we keep referenced { Memcheck:Leak fun:*alloc ... fun:g_type_class_ref } # leaking cached queries which are only initialized once { Memcheck:Leak fun:*alloc ... fun:_gst_query_initialize fun:init_post } # macosx (leopard) library loader leak { Memcheck:Leak fun:_Znwm fun:_ZNSs4_Rep9_S_createEmmRKSaIcE fun:_ZNSs12_S_constructIPKcEEPcT_S3_RKSaIcESt20forward_iterator_tag fun:_ZNSsC2EPKcRKSaIcE fun:_Z41__static_initialization_and_destruction_0ii fun:_ZN16ImageLoaderMachO18doModInitFunctionsERKN11ImageLoader11LinkContextE } # GObject type registration { Memcheck:Leak fun:*alloc ... fun:_g_atomic_array_copy } { Memcheck:Leak fun:*alloc fun:getdelim obj:*libselinux* } { Memcheck:Leak fun:*alloc ... obj:*/sed } { Memcheck:Addr8 ... obj:*/sed } # GLib 2.23 interface vtable { Memcheck:Leak fun:*alloc ... fun:g_type_add_interface_static } { Memcheck:Leak fun:*alloc obj:*/dash } # libtool/gentoo fake leak # it actually runs bash and valgrind complains { Memcheck:Leak fun:*alloc obj:/bin/bash } { Memcheck:Leak fun:*alloc ... fun:_gst_plugin_loader_client_run fun:main } { Memcheck:Cond fun:*strcasecmp* ... fun:__dcigettext } { Memcheck:Value8 fun:*strcasecmp* ... fun:__dcigettext } { Memcheck:Leak fun:malloc ... fun:gst_poll_new fun:gst_poll_new_timer fun:gst_system_clock_init } { Memcheck:Leak fun:calloc ... fun:gobject_init_ctor } { Memcheck:Leak fun:malloc ... fun:g_quark_from*_string } { Memcheck:Param timer_create(evp) fun:timer_create@@GLIBC_2.3.3 } { closures aren't valgrind friendly (bgo#739850) Memcheck:Leak fun:calloc ... fun:g_cclosure_new } { closures aren't valgrind friendly (bgo#739850) Memcheck:Leak fun:malloc ... fun:g_closure_add_invalidate_notifier } { closures aren't valgrind friendly (bgo#739850) Memcheck:Leak fun:calloc ... fun:g_closure_new_simple } { glib/giomodules2 (from libsoup.supp) Memcheck:Leak ... fun:_g_io_module_get_default } { Memcheck:Addr8 fun:__GI___strncasecmp_l fun:____strtod_l_internal fun:gst_value_deserialize_double } { Memcheck:Addr8 fun:do_lookup_x } { Memcheck:Leak fun:malloc ... fun:g_quark_init } { Leak of debug function list Memcheck:Leak fun:*alloc ... fun:g_slist_prepend fun:gst_debug_add_log_function } { Memcheck:Addr1 ... obj:*/ld-*.so ... } { Memcheck:Addr2 ... obj:*/ld-*.so ... } { Memcheck:Addr4 ... obj:*/ld-*.so ... } { Memcheck:Addr8 ... obj:*/ld-*.so ... } { Memcheck:Leak ... obj:*/ld-*.so ... } { Memcheck:Cond ... obj:*/ld-*.so ... } easyeffects-4.8.7/util/pulseaudio.supp000066400000000000000000000022721424023573300201010ustar00rootroot00000000000000# This file contains error suppression rules for Valgrind. These rules suppress # errors in alsa-lib that are caused by Valgrind not handling the # SNDRV_CTL_IOCTL_TLV_READ ioctl. More information about the Valgrind bug: # http://thread.gmane.org/gmane.comp.debugging.valgrind/11888 # # To use this file, pass the command line option --suppressions= to # Valgrind. # # If you find new false positives, and want to add new suppressions, the # --gen-suppression=all option can be very useful. It prints automatically # generated suppression rules that can be copy-pasted here. { alsa-lib/snd_tlv_get_dB_range Memcheck:Cond fun:snd_tlv_get_dB_range } { alsa-lib/snd_tlv_convert_to_dB Memcheck:Cond fun:snd_tlv_convert_to_dB } { alsa-lib/snd_tlv_convert_from_dB Memcheck:Cond fun:snd_tlv_convert_from_dB } { alsa-lib/set_volume_ops Memcheck:Cond fun:set_volume_ops } { alsa-lib/snd_ctl_hw_elem_write Memcheck:Param ioctl(generic) fun:ioctl fun:snd_ctl_hw_elem_write } { alsa-lib/selem_read Memcheck:Cond fun:bcmp fun:selem_read } easyeffects-4.8.7/util/test.wav000066400000000000000000025511021424023573300165170ustar00rootroot00000000000000RIFF: WAVEfmt D factdata ʪHAXd15=Pw=@={$`/CRL_-8NP0s(-u*XdC8=4)H( Ͻm\<8+ Ȯ|0U,L(PZPc{h&f`d~Jl-CdP`֧.(;&X=h=>lH>PNf>h>e>4x>[>x>̏a>,KM>~<>_>i=pc=3<_ٻ,7:3;8-E pVXPkNC SͼgcS>h >84>M>Y>8b>d.m>e>HH>+>p> >t]>>$`>(>T>>R>=>z>R>|;>R>lu>8o>JC>@{1>p]>>>> Xa>(>=HH=C='=<<@V==@h=V;hpֽ@–szz4 hnѽνD`:vMhOJCZ@?B:NXxOY/Bh V=ho=`>$>>y/>F>LQY>Do>.>>>J>p]>'>(,=Bi=BKXήx Ht 7 P"8 8wk@ʁ<<=]n=U=H=> >G><=3>lHE>D<>4>(>d^$>Dg8>=>o->k4>3>(=h=&>%x>젋>lmx> B>,>>l>@u>@D>>%>Lh>ޭ>4>愙>(>J>>=>(,=h==Q= 3'>Xf$>@[=@<| > >z=ѹ=h=@Z=И=h'=Ic=aN=`A=`=7<,<D#;o4<п=`=Q=>?'>H0>,>,>B5>B>3^>k>>>@>F!>ơ>$>>P>y>,\>C;>x >P\==Ņ=p==hJ=`/=P=s=ٖ=(r==hL==>`>o>%>2>J>`q>j>=0J=s==p=hG=]=+=l=Q=<@v< ^< ޼@kоģHޜrt/s|U@|>|:FT8S2XS.Qr[lؕtJpi[hTjk~fdU?N.9(y%>8>0!>3>F>4I>g;>z'>T>XF=P=@Oz=(=@<|a<@]<^<;԰ V <<|n=PƵ=(==Ϙ=P=yU=F<\ B <0P=P:9=:=`U=@I=<=)=0=h=/==<<8=>?>3>>}%>D;>2>\? >x= ̩==,|>C>==s܍ (ZphP[T@G=j=đ>e/>@>[W>Rp>[>>:>(>ߕ>ٝ>R>>Np>hV>l@> #>>W=K==щ=P=`=@F=<r:,<>P`==`=P=X=0i={=RN=R=p=` =;s< <j/L<۰==@mR=ػ@综Ϙ`Լ0wB\܏&>> >1>` >6>8w=0=(=R=x===M=<>ȃ=p=x=P=V==<<=(>@>Ĵ,>ȵ===0=< <żpP ==Hs=[T=@ = :<@\<;@?L@wҏN{ HּpDFo< 7=PV=`4=D0=` a=q=5/=<<<`*<e; "X |гhԽ ɽu!`ּ?'@'>e=>_M>p]>k>p>d.m>la>@H>(.>$>N> >8>}>W>T:m>J>I>X3>F>>_>`+>J>tŚ>&Ŝ>Lƛ>>d\>>-> >>4> >>N֔> >|>%>%>zJ>>B>*>6>>E>>۲>> ݶ>>>>z|>R}>]>Ԗ>>Xk><>X>p=H==x;==0'=h=@M=X=(=====P= =d=@=k=5=2= JG=<ü\i<";+<<\ G ^>Cu`pѼ ϼǼӼpPg>><">$>%>*>41>3>t:>(>G>[P>[>DI`>|P>>>47>\1,>D>Z=8=x=,=P= >p>*(>40>_;>dJ> R>vT>Q>T'M>t M>-O>L>eG>F>\H>NJ>TH>B>5>%> t>hH>v><: >$>j>Щ> >>>((>z9>tF>L>@P>hO>>J>E>VJ>TP> WT>,U>|9R>TO>M>SI>,>>2>,>p)>8$>4u>>c><>h=h=X=±=@===(=r=` T=4=+=@ == $=a =Pp =`=<<7<X<Ȟ<<@<ߊN43T@UQ`aKآF`AI:p4o4:H\[#>8-:>L>Z>4c>(i>@o>pu>d|>>h>F>>>>>>;>Ti>$>Hڔ>(~>֑>f>0ށ>0:{>s>n>̱m>Tq>y>>D>.>,>V#>U>nC>Fe>:>>>J>~>>L >>˭>a>/>⚬>T> >4>&M>,j>>>>o>>{>> >|>蓅>L"{>m>8d>W^>X>ķS>M>F>?>ȱ9>L4>80>+>?'>(m%>$>PM%>(>,>/>T/>,>@'>>>0>d>dK>]>|# >>.>i>R>h>>4 >i>2==X=4=]==0=x=إ= > >?>H > >$,>(===C=h(=b=}=`U=Ш,= =T<@(1f: 8NdZ_Z*QE8X. (%O#L P~,7ҽ%᝽᤽ h]˽8X$ 8OXJ8 K$Xtn|zB$a/p9@L?FJxMPOQLaRP I&<*%\O8뽸ؽ0Ͻ&ѽx۽8@LE|yN8؄HwpW彈q`$X lw#0*+H0&( pU˽d!NЖƠPIE@ՅjgWZrxz 0սZ<;9/DA"QG[`^b_8@Z(QE9t. u%Rk  ׽:~4 =c@ `@@;nXķ uٽ(- r` <8xŽ蹫h''sD %`}ļ@]@N@FؼvugGW_ ,<<5/=I=` T=P=?=&= =`p>P~>s&><0>\:>,:G>&U>d>s> B>˅>5>0>0>2T>!>1|>,q>,e>lZ>dO>XXE>T:>40->Ԃ > >` > >@=`=К==(:=5=Hw= =\ >S>,)>\B2>h6>[4>h->$q%>X4>X>p>\u> >'>p='==_=n=J="=z=@c=pB==@=`<`<1 =`@=0Y,= 1A=BN=@3M=0Z9=s=<<~;>( {ƼPO k@0>`Cr@2P8` @ռN@Y7. лƠA,\|Vy`? q%@DgxSІ,İ(p!hpR`栽Xte꿽pEҽ@=罈|,سL;0"ܽƽնSV08ҁ nmI#׭YOPμ0 4P}Ж8s` &`P:%< <<`=C1=pM=o=؉== =(= == k=?P=`:=pS1= 04===wI=NQ=K=P5= =<@\<e;ێ@!04` v:9(; @q]ټü࿊,7@P<<(` +`A QY]._agPq}x1LMhȽH׽'XTLD !lw#2?X$ O|8E?8>@DpG)D8P'S aH_ZFJSnh-ihຽ`ǽ CԽ1ܽݽpg޽H佐iHp@`hpC۽ȒԽѽyս ݽH5罠AX(ҽ@|ѫ@Єh&U)ppb S s?)V``}ļ@_zX;য়<<`b$=6<=0H=yU=g===ܩ==p=>D)>?>TU> m>>l>D>A>d:>J>>>>w}>`v>'s>tp>m>,i>e>Tb>c>l6f>li>m>pu>V߀>@>>>BF>hk>W>n">(>r>Z>>ֱ>h>V>’>x>t>ڟ>Bw>+e>aU>H>>>t`7>2>0>d0>2>L>9>F>Y>pyq>d>>>x>胦> >x§>D4>>B>.Т>>>V>>9> }>d>EK>2>D>$>=h=&=j=#=(=(==0== A>S>> >x>p>P]>C>>>> >>н==*==)c= s?= #= === "=B$=2$=0(=T0=P:9=I=ic=0w==E===xƧ==Юz=@5= t<#;1f`& $ N | | 0?`.FIUM+ Փl4޻`ЋaXPPиhpSȡ`ֽcS@=8lnUK<^'=s=}=9=8-= X= =j_^\]_g0r,:{D|DucG') ܽq(`mDD @g0@._4PQ%4G׼¿@мP:ptȏL`״`֧XxЕtlZb O`5| `&u+@<`=Y=N{=2=l=m6=<`𳼘ן >@[^d GC`,ӽ `@5gĂ'>Lt>>R>_>Rb>L\>R>l#F>6>^'>P>>() >( >X> >4B >̪>>0"> *>i3>?>gP>Bb>r>|M>>2 >T u>h>`>]>Y>R>A>&>>= ==H=@=`==` =X====0==>x]>P>P >#>PM%>%>&>'>(>$)>s&>d > >@6 >|y>="=,{> >>>>_ >">H">:!>h>t>І >m!>!>`">$>#>x!>>\>>$>|==W==؂=%=P =(=X=V===ri=`A= =p= << f=`` =X=;<P<``<@k8<;:*9;;6/<@we< $<Ι< <@X>'>L>> >,{>[=Hu=Ӝ=N=<;``f@I: ;<)">>+>9>F>W> _>7l>)>쏅>46{> i>s>>>,y>lS>taD>=\>|>w>,\S>W4>|W*>`)>>>>x)%>D;>O>`>Hgl>s>؅{>">+>8>>M>9>Z3>v>ޞ>> >Iq>d>}`>X\>pS>K>VC>8;>3>+>D#>i>d>>!>` >Ht >>>|X>>0>>W*>8>3I>\fX>`b>f>5c>[>R>J> B>_;>2>^'>>>==`=Xy=!j=>== =`<mO'`\żQ R+8iȺ00>0k@ |P〽lsy`jW=p(P.GW+})xx ǽpݽYXgֽpR0c7p@`@``k0Q0Eg@py 70\ -0.d xQ],W̽+[μu y`格 UP 2@Uȝ ̽#齘8<@<O;޻ Ѳh@<@B\L<[;ZnmΙ@``wջo;;@<=0d=`ԍ=p0=I=)==Xz= ɂ= lS=PuK=P]=@^=?=9<׺kԼ+k8zP8` mm=Ō=5==> >=y='=l=*==3=,===8s==`/==R=9q=8=B<JUPU=&8 »< v==='=h= >=>ܞ>z> >P* >>,>z=======3=\==(={=b= =0%u=Q=` &=J<7<`<ב<<u<@<< = =F<`<=Е=@=P= =Ϲ̼e=~C N:w;@!A<)<?<;żK;<8<<`T>Ќ=== x=<@<{=+;o^Ȟ`HQ8pb@PuKgHu˽rXfE޼ ;0=ѹ=x)=L=;;< < *< <d>=u=)< <0=R>Z=PO=<,<0gs=P=h=>=;`<Ј:=(==`Ç= - =8=h=h&>?>H>=^=$O>)>=ko=4B$^pS)H<轀T h@& 08v߽@:xp}۾T9Xkس̽{aֽϭ@AfpWe`߼`aW`&28m¤ B Hܔ :F: \WX܍ ãC@Ͻ}ٽ0;Ƅ0dRT ?нpج<L<\;t<=6=`=Q= 0<ha `<.Q=`K8=`<ug<n;VJ(K=`=~riuR>\Wl>C>=i;0x@@vf:A [RN(<=i>| >h>&>0=H >DGF>>p=@3M=}6=x-<@μ+*{aPW0"<য়< (ټ9ռ(=8->8=X9'L= =><>@=:@<к=(=;;'; <0}R=#\>+I>t> <@=` f>,>@=௘q=ܡ9>%>f>56>>v>8 >==^ >1>|O>dn>[>x>tד>Զ>>Z܍>>>>ߑ>XJf>P{>ij>JS>\۴>>v>4t>‚>u>Ĥ>fm>j>g>e>>R>}>>5q>v>~>R>>>>¸>nh> >>zK>hH>t`>>>B>>T>><;> ><>\>>Z>>>>>>^>T~>*>B>V>Z>>x>x>w>hi>.5>Dw>>&;>@|>>G>2>._>g->$">]>p\>X=>>@.==T=@ |=z==L>8>8s8>`H>> >$^>P [><+ >V>=P=l=x>H$=Ć=yG=`<@<@0>2>Mj>+>@y=@D >8=` 8G;@9,xn$.,@NДgh{# pY@I\|XT xx佽uU`:x:GSoP~bԍ2~p3 ƾ᯾젋 Tχ8tyjL皾ix8@B ,=piL+\3zpo[sxm([hXЫӾƾZS~{oDwj&Ӿ~ ēݾ*ºzTl鑾n:<)Tío 6 ~U2ؾ̾Dj4=1w;ģZBNd|GX5HLVd_e(,h4}X}?7J ڍJw ۂi{v:A6/H<<! &ѽЉ{ & hY콸ytAP9#5(t9vx@mR,p:>Hy=9=D >>==ZꈽM;= 7=z:xսf! LxH@8 P}Dw<`EY=MR΄ \h@py=`<ŽP⽰l 伀A%<Җ= A=<e<ƒ==І =a =@&<LY=@O> > >^u<((>Qu>E>>>=b@>s>s>>a>> >\>^O>X>@Y>ȀA>8`>>Ǧ>\>ܗ>t>R>L1g>\u><=g>ɑ>(>I>s>a> Q>(5>8=>E>`>T>d),>@>Hd> V>R>†>b>pfQ>̮F>ttd>e>ի>>>aq>F>r>T>>c>@=g> }>JQ>y>>Ԧ>pٓ>v>]>C*>Au>g>>5>>h>,B>"P>pyq>Xa>>ꓹ>O> >->P>7> ە==j>֞>Ɔ>.>:*>8.>N >/}>=`<"<>M>>>$A:>8r+>u@>L|>"b>@>f8>Ji>> =iU>C>>>^p><_?>Tn>Ҧ>`R_>hP=@=C= WM>>l>=z< 6<=`!>=@?Fʽ=h*m>t>}=|4v(o耳qN=8;= Oeqb8! 8Pc L<4Qedh hO΄=cqg~3"8bf̈[Ts ̩jp,E@3<0 L)xP8+ 4 Pp#lxd6.Hs+pPpaLCzB춾׾bqľ`NYnt׾v妾LԸ6Ѿ@ݾX| nؾ̾ؿZVXž!IJ瘾Okɭ_@lE2YXuM.H`a,h,zu' ,0¾5ӾվKԾؾ˾N\rL·>\jP~ꜾZpȾ^Ͼ_¾U׾W㾒羺ھxv뾾xo* }6aHrKPꋾ@jht|~wXnlsZ <`<C<Z\`aA<@m< ޼ G}<7e={F=ބ=p==>w>XV>d> >>t>->-=8=p=P=M6>?>1>\t7>y>.> E> >`O>,>W>Y>d G>J>:>{>(>>J >N>v>>o>t<>u>й>>:>>4>pa>tsW>r5>".>*>b >Vz>Nw> >LN>Ć>Wo> }>Ѳ>*>?)>>0(h>,)A>>80>(s>_>>>ŝ>&>ʬ>,>*>>> >>Ь`>Hw>H>]>>a>{>>:>ޝ>>>J>D)>E>b>.5> >>:>>>^>fj>z>dK>>>>>S>`>>X!>>>>f;>J>J>\>R>Ј>>,>\ >(\>I\>+>VY>ʰ>>n>` >%>(>ڴ> h>\>O>ן>>>>0>>\>^>>Ʌ>zX>8>>~#>6>Ԟ>2ͯ>Vz>⻑>P>X=> D4>@4> >P= =j>`[> V>s>}> 7>@D> >>(k>y@>H;>V>l{W>dV> #b>Uq>(B>K*>1=> >?=<= =jp=%8 0U,4I8=)= (=G`H= =<'<@X<`p!I>(E>$=a= =)== %>s> X@ҽoм=౲DH$B{$>=j<(0~L;kDHSE8 ⼠ϟ*+Xrt@yTVm3(мٽp꽼Nz:-DVN d@޽eG>v >p`=3P嚽Y+<)p =p=z==b=xȒԽ`ݼ~'= @=` >>(==(=O=X=0>X.>KT>Q>pI>DGF>>)===?=l>h>@:t>{>Qn>,>G=u;OT>x)>\ >h==0>{>X>l>>>̰`>VC>t;>C> GT> x>z>q>D*> ==,>%>I >4>s>L>o>.ߎ>y>ħZ>>>L_>v*>Lk>=tN$>` >>dL>>r>*U>^> c>0X>l}>>2>=1=1=XjT= )=Tg=ko=(r<ט=$=r黀Y&~>>lZ>NN>V'>q >o->H;>A>j>do>->80>~i>tH>h=)= }={$,d޽`^߼9=ܝ>==h߭=@ʁ<"̼,8;p:= )=d;֒༐ ,) @,ὴ&9HPu챑m]!PIսt$([P`0׽h{(x׽Z- Xi3Z X&4|jq@`nuD ,j2SPdG|h0p838i|&2fagjCpvJTu[JꧾKɾyvB^\ :Lk{@@:{x4D&_44a8WOH;pMIu ;bP߾d=پn8 ^"fzǾNԔ\"`d|o d=TVex@H xHTL 0¾ЄGc4K^3.yWom\pZXd.\Tcƒ".6؛rֆh\;. |i l&B2T:$"0bЈn0;0ҽ-6RRppj.J+ %0((<)0c?L@:@'<;w;@\̽`Mҽ`t0B=&=Y= 1=I=[<>== *><'>Ē >$*>k;>5D>Lb>sz>ln>`v>ضs> E>>8>p >:U>Yq>4v>x>>^>N>ؑ>4/><'>A > >8>G'>=0=̈>*<>x=R>^>"p>8> F== =>==@6t=V==L>i=Ņ=t=He=b >?>@W>80>\>x)>q3>X;>lO>eq>~>J>ց>pV>D>K>@v>~>Vb>X >^==$>>4c>lݓ>.>o>d {>(>nm>4!>hX > =&>-O>ư>{>/e>d<>%>$L>|n>d>A>=@O=`9< =@G=A=x_===h=pt=(===\.>`==#=X$=$>KT> >:>ؔg>P7>=@=@(=p==U!>(7>)>w->L>A>P A>8>9>DF9><>L[>`a>@/>N>)><>_>$cF>,>@>==>NQ>؄n>$r>dV>T[>->C>}>І>k>XjX>4D>T:9>1>(>>>x)>e>+>Ґ> Y>9>(o >P= ɂ=`*9=M=@< <=Ь=׹p`g< Ӻ A>h7 >=;Zp=l==2=a ==0>tAR>71>J=c< Q@ݼ+=0$=<Ph9

(_>Xf>0>ۤ>>@Л>D|>(PZ>P=7.iռ`(@<1D[Gj~}1=()@@w D->c>ʾ>Lv>>Q>԰>W>>}>i/>Sh>#>W>,U>l>I(>XT>#>Ȭ=l>*$>H=n<>>>c>4>^>>y >>H">$>>p(B .Cw=t >Hx=p @h==8= =PNpN=@.mF I/=PK>>;=dѽYtꞾ޳ c c14 9ܽ@F`{a=E>"ȏ>l>JC>M>ȴ=;K4#^@7pHA=xo#> =kjTམڽ #i `sľ8־þdǾb 7{W;ξ"ؾ 0J"0y;1}`p4=Hͨ=X(>0'=p}X5V[ɾ0)༞B ˾$ܾ|$, lHᄌ4 8 4EWվԄ:dHE>+c.~VTIѤ;%w<]\N!кnW\ᾺTJ,;[WM=藽Yqƽ v@$ H@j#= 8X/d6l7s>>Z>B>@>>0)u>2>>Bx>>$.>$>M>3>N>R>>27> >|>V>$>> d>Y:>؃a>R8>#>><?7!?O?>>и>>>R>H?U?#?u&? "?%?F!?i(?0#'?P#? ?B5?6?3?"?y"?Z3? V-?d0?H6?'1?d;?ψ-?@)?N-?i?%?Tj?J?* ?o ??#?~;?\H?!D?bB?_N?J?A7?#?P ?T?2??{?8?l?)?/?n ,?4"?j?v>>*>:>?*? ??j>2F>X>Ԅ>H>Z>N >>T5?s>h>2>*=Ҹ=>4 >`>jE>@>:>j>D>=pc=` =P:>>>>>pfQ>C>藟= /=>!>x:+>Ш,>g>t>`>8Sz>X>=0 =c< ݼK80h7ؼ,=ȓ={=F;Жk,KMnm(b. u,n:BIƾײ*]ƾKܾ$t ھHUپڵF˨lՃ}]WwZp/ 5qVFоľ:` $}> >B2neJ4z\Ѿa<L=L`=ڠ,`m(|8pN] \A%* 825B@lg7 /Ē-@("/8R.4)+L6GB=NXzQOZOm:u 34B0~$2HC)M@;cM8:=3)*m,/N6]5kH{NiI~AVB>A1Z/0K0 1+A$5Vh$B'rP$1x>8 }F zS ` Ke(~dP񾌴BIJ0ƾ{ھ;r龠+>Ͼ ˶xpClsIDf+.e_ Sͽk:ýhR'T(TxHT輀/l8v߽\;@@&@h>\d>zi>`/F>WB> >8=`y==``=01>Q>P [>Xh>^؍>Ŋ>9>֤>旹>>|>@Nm> ^>L>>x>.>r>ߟ>>6>7>3>t>>Њ>>,><.>m> ><>>` >K>1>0ߨ>h>>>B>\s?H?(?W-?Y0?(?? 2?$?Z/?5???8=?i;?g-?"b?<(?>?^@?e;L?>]Y?;Q?hU?,X?Y?J? D?jiD?T?Z?_?Oi?Z4`?[W?@?&?Y? c?Ԕ&?8?GO?W?dMR?rI?:?`U?M?gB?=?+"?b?n??A?]?f7?v?|5??0?->&>>!>>>l>z>u? >z>4>>>>&>X>O>!>>;?>>H>l{>V>$>A>>>>?>ng>:>2>D>L>>a>f>> > >z>p>h~>>(>n>t>>^>>j>>><>>.>>>>~>F>Ƿ>>S>Z>?>t>>tq>H>DyK>zC>>==>=6>|~C>D|>ڎ>f.>>=؞=@W= =~=p=0=S=D==hL=@J=8=$>`3> _>j>|Lr>$1u>T{>7I>T(&>0Zm>\TE>?> <> V=K=ɹýO^; 뼸TT'B6*~TON%x Hؕt\w^Ty /'@R 㼰|d Dxݽ dG*!Rt>=> >_=x.>8vTJƁUP"T Xȡ@;}C Ѿ׾侜s㾖_;'Nr쬾ơ.44d 2<(0:0=p22=u=X`0qP*潌|3S2DH`瓾q+|[<Ǽ-=pA>-D>^C>hO>p'=D=(ϽHX⽐4> 0@&=Ht >XA>8>d >УZ= "fzhPrn v@TL< Mn=0ێ='I=lLc8>^>xH>Lc>܎M>0(>(===(== >p)>9/>P!>>F>x>I>4>z>(>22>>m>rt>Jؔ>ۤ>4>j>>=???>$>>t>"d>s>^>H>P}?B?0?T>>K>>>_>Ъ>=P= >>'>S>}>ļ>+>8ǯ>>>pw>l#F> C=p.=F<<5 >0>b>nA>4q>y>pu>)K>,E>T>=ض===">(/[>>b*>>ZD>X> >>>>>>\>b > v>~>F>X>?T ???'?p-?6?6?8'?4*?V#?% ? ?>Q>e>h\>2>re>>D?;K?6> >>$>Xލ>̐>x>`3z>ž>L`>>R??\s?5?q?X>(>F>>Yu?]>h>>p>">z>">0z>*>v>8>>'>=>>h}=p/==Z<0!=0=`=x=e=S=ؐH=@Fhy bj&ӾM۾;ɾŘ|X7#1=6=pޠ== kF=@[Fh'`Hֽ@,`f"2t"&h%@><5 a3 x`+81>Y=P;=N`sh௘ =(=N==+=*r;ߊJ^6!=@ӎ=@=#>`&>F> >.!>y>=l|=\8PP[8.< SM=><>H=ܻQX44d(4SF8cپr.~fs+88oip꾄 %;H˜ $QgpexD%ԾK&-ߜ,yN,yI@ʽ 0%8q@[7~pɽ d}0Ͻr~5"===B=Z=<f$`I <>=P=`=P =A=N< dv@@b\:j<@'<'<;PpP!`7o< ==A=d>o->l6>0> k=Х=cM==`>E!>=0$=>5c>>Ax>$K>Ԅ:>3b>FC>X>G>>@>T=PD@<{=,*N>L>h=޼Er{w 1 P6ɽ*9\۶Bjžڲ^JhԽ03= P&=<r:1qս oz;+}=H==h_=X =\0>x)%>>W>$>.>`>⇌>>> >">Z3>(>@>(>R>X>>>0Z>M>J>>ཫ>^ڧ>>\#M>D>I>@>>| >L>L!>pP>l>n>Jw>tc>W>p=h=P= P&=0`=`U=ؐ===> >8a%> >= Q3= c #@olHyto3#pV< i,=\yxZˡؾXkZ:ʾzJphԂSɾnzLBjžܪ EЈ:t,eD6Y6$0lG'#X4؎ ZXF 4b8½P@Jh){@g`/z= =5>PP>N>n[>O> >=p܆=\< P8L,jϟ6< 6/@)dD#XVl^qzn/Xdk9|-m(/dpy=P(===3=== > $>Dy>==PV=9<<@֮<w ʼ[gE˽fʽpZ@ <\</5<!;P`+FZpqV<01`?νP|g Q@[$?;0VP,ڽ|H0O#Hֽ07@"<==0=P)=NQ=g< ? ¼==S>l̍>q>&>d;>lz>`>S>|>> D>>$>>>>>>\w>*> >$>". ? ?='?2)?ʝ&??C?v??O?0??3?+?6?S?_?z ?3?2>>|??.?'8?85?"?Z?>>>L>*>>C>0>@>b>>>j>~>S>pj>U>80->P >},>TV>,i>V>>\>>2>=m=<; kF=`/=\>k>>l@>x=pZ=榋x䙾L~H40Ͻt0%>;z0" ֽ؎L.@L= `GX}=%j>6>v>D>c>ā>j>z'>=6ʼM^>F>&>k>|5>?=c=~;&<"= y= Vt==b=x>=P[=Z=\q>">%q>XA>X8S>g>,v>Yg>I >!%=0pEҽ8򽐣x@~ؽhͽ k`\$1u:gfϘ*_  a\`qx$+Zh۾ʠ yn߾bþ:wqZ챾 EԾI{|ξ(¾B񚾐W yYdLEDE,x-x+?X:|5<[==6>`O>!>=t=I%6>Ac>y>\>u>$>> ʏ>>m>>,b>4">ˣ=`䆼8bc3Q0=`=>T >(q=f`N_󩽀PLO#x",s&|BDhNξ̾ndX7}kT䄾J d^.Xl(&ɞ=R=U==[h]vﹾRm˾ɾþ佾pZDw1),ܱfrùPV\ɾ pS==` =E/= xq f@?,9O=x==Ǧ= N =@mҼ$j^ +hPY==>>=H=f=I;@OD"3`&ǽݼ<=@:=(?=O=Pa=@b=` T===Hv=S=~>5>D<>P>l>`>,#>`=pˀ=X=BX@ Ľ@'aNL`ANjP嚾H7Mt,X47@5E1 ,T!h&_ Cx~f}.啾.F%lFž!ľ6þ<~ߦft0p(l}(<<0 ŽcY(ѽ^5d>6_>`)>B=08νF,60)@qr.k;,|`ɾ>ξƾ.yHɎ&:ܾng꾶IlHy|5ؽ!#Tz( `YXf$>p1%>> =`=-R=p<@8-5H`; ={===ؑ==8=7e<r;_4=x*=h=8=@+=y= =@<@u˼K?^ ¼o<%==H=>t:>%/>==Py=_9^{.>(/>>`=;%`UH%`@_hjf:̾R廾4 f󦾌}@`^Ȗ}s<.}ҾDkc@%M+.FPa*4`/ V_-R=fmDNGINJ"E7:' $FC,F/f)T hܾ|Ǿgmþؾdaj#i &)CF,j'.12Qj㾂VѾ2}N捾n8d&a``ƒҞpUTHLl&@G\.T[dtz wF+P wl `JwhLyX02 |84CĄu*Ңf'[RlpS̙ 0R8 _o0d<<&PK 4.+nT}r Ш0<(zil'zNGd@zk޻ <@<7<<=`R=J>m>>B|>>n>Q>O>>>ı>>~#>>Ⱥ>~к>f>>~>DN>lC>pa>r>>8P>^>> >m>|u>>D>9>>/?,??>A>>>h>أ>Z>>y>>>2F>J>JC> >z<>*>v>->p= =P=>=Ћ=>,B>$V>S>lN>[>Xke>\U>5/>0= 3[=Z; :+; G<=v==x >p'>Y >U=(V=@$= =`-=` :=[==8>/#>D!>.>@=@$~0 }s`{<=&=t=D>p>d(>a3>-=>L>xg>P>6َ>(;>$Q>P>d>pB>|>L>>f>xZ>}>,,h>@[>@Q>`<>*>t">02>>?>t,>7.>'>=v=,7`p8ԛp&@=d=^>6@>e>>HO> >==N>D4>\>>>f>X>>$c>zk>>}>ʞ>ܪ>hI><+>B>v=>;>1>^>#>(==X>7>E>[>|g>^>oB>L>h=%==胻\705 vfp;}=Z>κ>Z>|G>` =g< vf ܽh"6ý`＀NEU>tSe>I>>=y6->\S>rv>3R???k?v;??>6>BЛ>>`w>w>>>d,>\> ?!?j ?W?N>>ӟ>=>>l܆>|$>_>u>>x>&>>v>>>>>V>o>>$a> 3>8y>m>a>h> >>lC>TnX>D>>pc=-=pO=@~=S>>Z>y>n>LPL>#>ز=0@&=9<蕅=Dz$>\Xy>\>W>|z>XXE>`<>E>^'>==p!,>D{e>>s>>>>g=֋=,= ˜<@v<`:=M==;=0= TZ=<8޼X ;=w= >8 .>?>PB>4>> 6>+>8">>P>1>\d>>TZ>&ؼ>4ܵ>>e>,>>l>=p>KI>`e>h>ʗ>*>J>d-`>tO1>` >XG=h=|> > =S= i>~̆>hi>>0>c>F>E>V>4>%>E> D>>fm>>j$>x g>P>=@Oz= <@H=8=ܯ>%>=@c<v H6ɽzp(:P<=Q==;Jkx8;ԅ{ Rt&0TJQڒvO˾޾ྊqоr|b<\&X0tU+Xƾ"tnb8(4-Ҽ50̻ʼSbPЋa]+@#<]=02>HA>XHL>P]>=AHf߽#.03 402`/zb\C?$"Bz`NBp<7h @0)xT9 0нl@ʁi@ؼ?p3kH˭sǾ߾pEܾ*ʾf(6bӽpϾ(ݾ\V$߾Bʾ`ƾxϾ8۾BpھϘg=DV,JN;!s Doξ)ȾJ1;Lݾ0?l\gNn;z㦾~ߦHB{˾rԾb;xmjV|u$;`P$8`MɃ푾_MN|?X09rToɾ i^'־r?E)᤾$ʾH!Ծ̾#XZ h|pr@{(/8tv쐒hG(ӕ:p(; h߭W ļ d踞޽))$x!&7Uf^к? pmdP"=`4= ;{40ksfЪv*첞dOld&ǦȱPνH꽐=pXw5`0e%H%8@i`՚HﴽP_콤 #XȼC== ===X=?> B>D|>Z1> d>Ӧ>*>&_>>䩲> T>RI>>>³>>>>Z> 4>B>֣>b>8d>l>4>x>VЮ>O>>R>T_l>I>\t7>9>-O>̱m>B>Y>>>D>r>0>Jț> ">ɷ>>j>3>q>">=B=h=(=>8>X[>^>D>lE>=ؐ= 8=`<<0;= |=X= >8>pZ>ji>Y>>= ` ?;~`N>XG>t>P=< Ի5˼Zbro>З<T< =`W<;@I;<;W =`b=¸==MD=D<57eY>.#>˘>>^ >@> y>z>|V>.i>>2>l>2>==@_z0;U/PHܩ<<;K@Ѽ `d4;b<=>0D>z>N>TX>І>vÀ>>b>h9>tR>> >JQ>I>K>*>@.>(-A>XYR> yY>,>>a>(=@=;F;;< *<=A< rX->p >~=4=#;̼ics*5=`]=٫<0B@Ģ,你lf;n=9=\=0i= C:?ɽ4HglZl܆}\p=Hv$>H5g>>?>*҈>`Ň>ք>>N>8o>e>8h>>L>>b>n??Ja?b?A ?S?o>\>>> W>l<>`)>-(>bC>]g> >H>Z>qj>,>=NJ=p&=@F==x}=躸==F>0>^.>(>>>>U6>*>,>==7=x=؂=w=H=w==*=,<;]`X<@=xJ$>M>PT>8<>>0>Ы=I=% 8'<;P:=p=R=8_ >PP>M>>XH>0=@pٽ(ּfGP==@I=y=;P}EXuׂ'l3Q`q]{޽$.2܋&6ؽyu=9> >>>.>>xj>$I><4>X4>AA>5K>HdE>1>>@===h=L===Ȯ=`,S=;*= <<@}<@04<@$<`<Ш,=Z==8w=>>+>T">x>` ==`b=@ol=u==Z==8p=@<$}༰YKiν) 8PX3d&HBU7^m xxn+I0( -O֙$t̾"CT@06ǾЇaX3` ǽ8ؽ%p{pײ۷duVŽHۻ巾ཫPz* &pp"mt jEl%D8`@̛KT<<)@[(0F RY/EWlL‘2!ƺ$@Ǿ4vž$y\ Z|Tnb}j$92LNÓIJ١:_ ͤ肙|Lr eS} ە4wҾ8R|LоH2 6 ʭHJNL;@^ ½ BR8^ ھQn0ᄡ; "?LaRtaDh\/4l#xઋv(kh|oRcǾ߾ ̰ؾ Ҿ˾֦ƾT9ƾ"˾,ѾվؾTѾO<)@uxw @]5PŽȾ Ll9HD prLr$+$q%4 ;14Dyؾx,h۾пx<7>P0=|=e=TH>,>=`Ĕ=Ѕ=F wsX(㎽HT̽ ``pŚ\<:U==h=*=a=B>h]=NQ=;a (%8ů/5 nm==>н===(=PK >>,>=3=̻ ꁼ<=1>X> >X> > ?N ? ?n?T?>?? ???)?2)?ô?C?`d>~{>_>.м>>Z>>J>HU>+>x>?*> "\>̼> >>F>c=z=0===1>ko>͑>>>T{>>x>>F>>*>R>Y> >>`_>J><>^>M>X-> >>H><}>(>@mR>(O>2>wB>H]>r>f>c>\"t>:U>/>=P>m= ,<J0/=l><>>?>f>V>% >#=N=<`}< w= >|S> Hh>0Q>(:><=`Ӏ()z͉eE=\">T>hV>Q6>h=Ȍ=@O=(==8=0.>P-g>>k>0>Lq>ز>4Ft>S>(a`>R&>i>>HD>ȱ>>p9>====>T >>X" > >>C>Xq>0>f>x;>g> >X=`a>(=>Y>j>h>K>`-,>@">9>e>zX>>S>@>^{=ULd>`|>xn>N>= >p;=0'+⽨tP: <z`.>5>(*===HP(+4+)Ƚ%]=9>R>Dߡ>>ь>r>:i>.>=>D>>F>b>\>>P>s>$.>J >0[z>8C>` >ڿ=M=pS1= <3i`<*;Q<=<@ؼ 0vDDP~#(꽘@ aܽT VJ>M>#>`S=< Ѽ!pxd @>!=O==h==J=^PfY˂XH ֽP(Ϙ0H׽ڽJd ߽xϽUnm 7=<=hHE>H>D>>4}>\>h~J>oB>;>8>ܰ%>, >=X=8 =|=0>{=D==`<.;Җ?($ic##bN<`<9,;^'Xp !%Xڽ|P-6`  BK}8ֵЇ[f@hxdgB #ir_䞾$s$R`4NȵM```A FL_80OYn|ۃkx~C(+'@I,=<4ps#"h.DkHNƵp!ƾ(<ǾDľ 2Lm֑P.tMt-Rx j^b5H50"}%-DSlS ;pP'e~Ơ0g8֣;pa૘=0ɾܡӾ8ξ輾 <2foZ8 p錾k9{8!̽x:+4 oоn"Ӿ6(<=><>i=`ʽ(*d/P~8F|#fޒCVýɽP<ӽ޽ҏLX"u05P\Ž (:]6>PA>l4>1 >B= C:Xý!=]@}K$ȁνߑ=*>w>>a>>0=Z@+T!@뜼=>,,h>> w>d.m>y>f>V$>@>d>c#>_=0~_=L< 2XI> \>(bm>h>2S>>~ߦ>9>쀳>>J>X">>a>ʰ>D>g6 ?Zv?%?>(?/)?%? "?ф? >6>쐒>ؗ>ā>>d>!??4>>o>->==T=P=px= >+>F>H><>l3>H0&>>X> >>/> V>0">>">1>^>4S>C>\hr>Wh>z>>Ϧ>e>:>>lx>^?>f>(>H|>}`>"!>_=='>(J>zp>D݇>*>>>>ю>B>~>Z>hA>->>>=p?>87>|n~>2˕>g>b>"=xd<4 f,5ǽ>߼ \=.>b'>|!>ؓ=7<`nQb< BGD#Iս``ϴ< h=o<.;Lয়a ==p9>n> >>>>>˲>>P>.5>>/>n>>l>->>>l>$q>tH> >¿=Ȑ= ڈ=h=8o==h\=@=xq== = =@gp^Q-| iѼ K>Lo>f>\>ܝ> d>@>(>U>R>~>T'>h>L_>=`a=0=<<@< +=NJ=@=Xϻ==L|=n=@==ۜ=<2Ht@ U կ@==C>>|>|>>>===@!Z= >\M>u>tv~>._>H>8=`0< KԼ;Hʁ=p>4>O[>$o>m>\Z>^@>,$>/>h>z>1>|i>@k>[;>l>@=A=ܟ>TmK>s>>L >G>M=S=EKX-=к?TzpϽD>( yڼ)Ņhͽ 7F@H=DH썽`.<==2>H=>I>t\>nw>Jǎ>d;>^>ڥ>Ê>$U>|>}===>L>>ı>O=]=Ņ< :ǼA 8fJ8Xw޽ pýn 9ܽ$@X6xMKDNPD4/P9,38B5A(@⽠02d4QTdZw~34$1uЉG =X=,={< %=cv==hi>8,->7>;>$1A>^<>\!>>p=T>\>?>P>@>L> =(=<_8 (I,$JXwGv$EH0OI}iN׻eDw(|( O1#̈,{ؔ(ս( ݽ0ܽܝYx '*(`"@h gE Jl!.$%xl"V݀jmN{l0'[tN$̺ 3'LxVL(M3#Dp yƾ.ZӾ־IоBľ&ؼ8=,þƾ8ξھ

M㾺˾Z̮ᕾ贄C}bK0N^V XPDC( `qxH?<=}lm168t/s ׹\b9< ~- f `4H c0|] ׾LoH7#5D6@9087tFP@V4V`aK$H,k?Ȍ"|)Y{ 3DFJѾ;޾A޾̾ɷT'¾ؾ^#do޾t־jɾz~þQ ǾӾӾB^R7;R rlȾ6 s&ڴپt^ԄD ߾ Rʾ2(q^J=?=0F@><+T>x>_>$TZ>K>L> V@>F>0=@<Փ+j:І =y=!/>u>*> >>X>>P>>>X>h>X$=hΧ=0=̈> D>>Ɛ>X>X>b+>:>x>>Fޮ>(>z>>>>P~>Rӡ>>j%>&>T>>>|I>V>L~>T:>>= >Hk>>R>N?u?J ?>"D>>N>jX>E>>6>(>4>z>^A>C>lv>hw>CP>1>>L><#>4#>x>d>$>h=WW=f<¤<< =P*>8N>$>[>:>>>\>h>C>r@>rs>>`>H>P>8>>x>>>VZ> >>b>s>!>O>>0>LO>k>|5>M>>>m>ܵf>Z5> >0>8==[=(==(o >@!>|>P =[=OB=PW==!%>Hf_>l>05:>[=L&ig/1ҽ`Ç=\>fT>u>d|>PNf> V@>E>= =<`O= >tCl>F>V>ޯ>0>d>>fZ>.>bO>u>>X>c}>t'>8R=Y==d=@#=pwW={o=6X=$"=]<H9qj`mDtXǽ8pЌn31<q=> ;>/>,>h=q=<;`<@;==>d>XD> S>4>`.=m=m=>H=|=;޽>O,ʽ=&<>G> >>~>Fܔ>#>(v>]>\->p=?=4>]>">nR>-|>L a>XzQ>N>XA>PM%>V>=¸==@b==һpS1GeF@.9P=hy== x=@=@V@轤9 y <=0! >8(>@!>le> >>j=q=P=x֠=p=>l&>:>2> >n=@#ۼȴ཰;#*x S⦆ H i3E6 +̬,4O#0b`/=P>?>,dt>hp>;[>̾?>H)>,$>1> 6U>>L>vħ>b>ؗ>Dp>D">K=gp' /'F@<@ʁ<;n<"=pO=<@gs>Hba _:r@QH@Q==,pȽ߽8뷼P6=@==L>0=p==0C=@=;ؼ2,@¼;<`=@<6:@6<0y==&(>T>$k>f> I> C'> >=(+== 0==l=== =x ==Q\=x~ýL4 q^Oy(Pd",k 0t^T|7R7WpCc-?"@ЛZ_̯S0ֽT=6===`B2=@֮<;q3@μJLpQK*2$VPp<'<`J====J=; Ly4k쁾ؐ3(@뼘tTHc檾ǾͲ>h~ʽVNQ 'bĥ(Ѿ*d=پFTzl0 PXݚ^ʾiҺپysP&J=f=<Yi{nJ0,ҥu,hLAbVF~nǾkоӾϾ~jʾγ>\˻?jG_dl1j8~t_WL/$tuN 2<֒<@c?v ܽ`Hʽj~Ҽ~'\)ؽFJ"bOҾ@Kмپ{ |@|4TT \:Ā |g#I%c,]`lDE|'Ej@ Ƚ(IҽF{(4?ɾ<׾$ݾ5޾2оF⪾槲2¾0ѾD%ԾPȾ>,f|ML,\ {zhd+F( ܽ_޼`Y0>@6>$>t=Pp=y,XC *(16xNr犾(xL|&$^h#ƽ(䛽ŅfA\8V#,<V=И=x/=t>?>ķS>L]>4$h> q>P>m>Y>F>38>>P==>Lt>>h]>d>6>Ē>^>?>*>>h>3>Ɵ>J>x>}>^[>T>p>>>lC>>҅>T>8>2>><>p> >D>~>>V>tǴ>>4>>>FS>P>>ڿ=G=pu===,% >V>a>>@>c>D'>=H==L,&>>X>v>n>hl>P>6>R}>U>&>,>>>>23>d>1>O>= J=H8zڏ<0H=p==H==Ȑ=0;=7W=C==0>>j=hJ=}=hG= =[><u>R[>B>">P>y>>+>>r>Hf_>X>dV>yc>P}>x>U>d)>>r[>3> )>/>X">T> d=X6=>,;>Ē >xm==)<<<<e=@=t->45>=P)ڋR7+b=&>?v>>>W;>=::P3~hܽP9===g==0O=@c?<Փ2˼J<@=h= >(>4>.>R=| >lg*>R>t>P}>e>25>=p0=<`4̼P]VQܽ 4dh0wx˽`(``.$ BC8O* S@综O;`<@F=s=N>)> =H=e; 8@j/@x=== >x<>p3s>>V>x\> >ت>T>X>Y:>r<>0&N>_T>IA>x3> 8>C>peD> *>D>==_=W;0[Fp@iP pp9[`o=H=X>=p5=  #h5,q 2pMA< ΒL \S8E2pc:>x)%>pE=<%0*yIwd]%t =D0= Qd.m>ઋ>$->i>(>|=:| r2Md<@Nm===H=8A=7W=}<M螼P(!xI`U V B=R==D>=(=Ѝ=F>>h=@=x= =g'@K=n>B> E:> =pI=``]ƙC1=t;>E>]\>:5>p2=  L 4DQ8 ;彀ۼP(==,=ȃ<_UcI^l3f3W>=g߽x0@Iq;7==N>>*>o>@H=Ќnl=4OIHH)h~ʽPx,oH߽+PMY]>@XLd>lD>Hx>TK?>X= vf=@εbJ>l>x>*&>l>^`>>.h>> >"P>`>u>I>>>BϨ>8>>>]>> $>}>>|>tM>nR>>"@>>>0Y>> >*>">>X>e>M>&p>ƪ>XG>ܱ>>L>Ͷ>>(>Tu>Q>dM>,d>>V>(>-><ԛ>Ko>$>Y<_4 c8:=<N>V>[>B>{a>t>@{=z=O= >`>ӝ>>>(=>T(>'>\h> u%>=Hx=>TLL>~>h>>Uc>ā>8=W;P. @Z;щ= Q>Ls1>/>X7= C=p6ʽ$n<=Q> >ɫ>Ы>Fg>~#>(>0b>2J>KI>@r>,>Vލ>D>Ģ>y>>>H>[>R>P,Z>A>8P>I=3=@=Β=0=h>`/>>>t Z>Zp>X]>T>)=n`p'`G lV= =6><>>>=ǟ;X) ==E>+=d=P:(VʿPiq==Xk=2=9!`㽐{@\̽p xi=8>ȍ>d>M>d<>V%>^>4D>a >=(>s>v>o>g>: >pU>(= D>?>м%>`==^=(=X>>X>>> >>A>Po>r>=>n>[>>B>>U>{>:>Xw>ʿ> >Ъ>4>6>D>>A>k=b=<<0l=@=|G1>)O>H>3#> 5='==)==P>m=F<=`={=0\= <`мP)lx0e=>/#P׻gɽh"%6eL{t}/vVn <(=XA>D&{>>◅>Q>=hT>@h>K>:>@= <r/l!0w(կѽ@=罐ӽ)cC[<8=D>81>,>Z >==3i=I$>C*>0>$+>>0k=[<_< =j~=ϟ=ZG= <0y=л>\O>`bX>TP>MU>o>>lg>9>pP= q%=b=8A== <D .<؟=ئ=x> >xN=xV= ¼?Pl lʼ=H=C=^=:8Bt`@H/= >L>9> >p/ = h۽+<X=Pq=p3=-7;Pu G^h]|`r^ӝ@ᑾlDwQl.XpYȂ۽aս94h4_T*0|F$ pϼM<9==[=0 >z==;K5h3|'?p@ 6-h߭ Ie < <<żٽLV떾pNoҰmHt0PZ..TA_x7nRʾ˾㾾ʿvnUɾ辸D Hgcξ& ¾bǾ*־YG 'Fܾf|t猾LBmDzXH[,iVƖ檾 p릾8ph7?o|8Ep?t=ƾ|;.j̾A˾$Q;v=ҾD۾QZ XƲƾ,{旾HR>p>=С@=1߽  ն `p0eY`*909:`nQ 6;_x:+>8>7>2>1>9>Z[>f>ҙ>a>|><>2!>>ص>V>>>J>>>>$.>T>>>>:>p>:>">>T>>x>> >>>Ъ>I>U>*>F>>Ha>|4>/>C>=(>W>6>> S>~>f5>j=r=@A=aN=xY== >X5>4hL>lU>XH><0>d&>0y==0==d>hO>E>>>]>f>8h>lG8>(!>`r>%>D4>K>(d>X{>B> >w>$dS>L->X=a3=pP c#a<=4>G'>BJ>]>8[>NN>@>8 .>|>H >b= >lF+>O>k>sv> }>f{>> >(>[>2>`N>>G^>F>x9>?>6Q>e\>X>R>LQY>X{^>P>x*2>'> >G#>LU>%x>0{l>?>> 5=ذ==50;Җ`IE;Щ9=HO=Ҫ=Xf=>><>H=== >E> d>_>:>$ >(=<@A_d"2@:<6=t===௘=x=>>>f>>(~>>>1>ca>?>,0>$1>o;>R>d>l\>E6>`=;DЕ _׽E"Z<%=<@5g 8v(@U<=`<@+>D8Z>Nw>6>.>>O> >S>z>~>C>L>2h>H>>>ï>F>0g>>>>~>>(>x>>O>A6>d(>(>HV==>`>7>d>< >>o>h>S=E=@<@0D}XopVX~=4|u6\v9X]Ԃ @ɽKHؤཤ(n05"<ڪ=8x=0==ї8qҽAL;=#>@Q>_>d]>XJ>k>C=@]HE,=P=";PX̆qքHPpB.Z;=>W>D[s>_>+>@J=W<8O .<@==0F >2>PrX>$o>m> Y>PqK>O>_I>-/>|j>>/>[> @>>V>>H==<8:;@I,= =4 > >Ѥ=\8s@;.pǴ@F<>^>r>tF>=ȼLw4cΫzI愙sP/pp ǽguU}ĕ{X %ѽjTՓ ='P>mPI0뼀1<` &=c=;b=@==20*x-b.292lCP$E/S*~띾þ`R߾6D뾸׾2"ξX5ƾþҾ \Ծ0VPnXH|T2TT;zPn$0z J\'S#g±|$Q3WFbLT|B+j c;֒>=@< 3nxč=,&>$U>pF_>9>=<8绽\5UgB;0#[==(=Ph=<`TпEB=p=>PM%>h%,>1>0> .>p&>B> > > >@Q>$q>>}>A><_>>>>>>צ>±>> 5>&q>)>P>>>l{>>R>|}>X>>>>n޺>>&>v>v>>)>4>v>ق>0(h>OW>xH>+>>]===b=l>D>tV>W>|H>>`*>{o=};;e=pX=71> "U>p\>;I>`>=@ H=k=a==̝@>!>j>*>>J>sa>>06=>ܡ9>$ws>.6>41>>ʭ>/>=@[F8@mҼw-=>\Z><>>*>>d>+>=蹫=`.=(o=5=O>+>R>lt> @>:>>>>>8؛>~E>>>B>p>v>8b>P>TJ>xG>U>^>8tE>41>d->,.> =>̯S>hn>,>ƥ>6ʼ>Y>$y>pC= ]L W^⿼'=7=H >@[>~>|n~>`>0$4>\>H= =0==0>:i>D>\o>,>>=ܾ|nЊTIս.e/>>=hp( <8!=l:>.y>c>`>n>`s^>P6>.>|F>[>hJ_>SW>}@>> =@<H>ؽp(: j<*=g-=8>Tq>ִ>F>6T>„>>.}>z>Ls>x>>->Ƣ>J>a>d>>E>> >8x>^<>H. >\t>t4>x>x'>{>T=>L>-=M=<@]<Ⱥ<8=D=0;=%==@4h< Sux\a`  jP 佌MV<ԵtNe_4Eyǽ8ֽI;*B>0U,}(h\p,D EA>X:> >U=@ˆ<ƼyG W=X>6>P> j>r>z>(}>LRf>>E='<5<=>U=>>>X>t׭>b>H">@yü@횼@3ͼ3H$Ὤa/p#zv|8j ҽl`0mcʙ8N\5`,) .G l׽Zu` <0B=@+T==@Ch&8.C/5p?;@&l<1)`O=uʽڽ½,( \Fw8pL]ܟSAUWOPDP@d"ܲپ2T1e | v晾px}d$tg?&U$~Rʾ¥&ZҾ|ɾL @⪽@O`<<*+ fT򬞾,ТҖlT\LJG h̾GԾپ޾FR㾊ھԖ;DľJ B͎x+s@8Zf&:xg)(Ľ _+p<<@^<@\EpA𢿽8p 8`*!ѽ?^ؐ=x>X=Ć)9lU.U 041PIŅ<06=pɽS\2ӾҾΊL e,{F`ԍTWyN" )4RǓ/h~ R땾r?߯ĿD 1|`ϴռ S4oXM_PK=(=!>8H> X>,*N>@7>> >0= ===@4=P=ZEi=`p=膙={=@=A<d:D<<_^=\=8u=X >d :>Dd>z>Ux>b>D6@> >:>%>8Ƣ><,>>>(>>f>> >0>6>>>p>p>X>>z>>ʥ>>B[>@?#?+?@H?r=?>>7W>@' >==#>4Eg>>u>h>i>$`>@W=:ɲ=s=+>`@> )>=C1=%ٽTн!%0.=k= 0>;>>=ݻHAA=h#>tv>E>>">>DB>(>=ȱ==>dO>>u>r>k> >`<`o^(I =/P>,>Pn>>>l>^>>=Aj=GI===x,>a>(>bo>>S>Tχ>>$>E>>>LW>1>l!>x*2>4TS>,\>R<>#>(!>,>_M>0]>B>W*>?>y>n>|>l>V>pc>@|>|u>GI>8g=2=;jj:0=X=Է>_>A>l>7>=@'=+@ <(= 0>( >=&8xfZʔ(RpɽH;ȳ=d>@>=C>>>B>>>1>8==)=={=s= ە=~= =P.=`<<; <<4=L==@;=h=<=f=;=H/==81===a==Lq>9\>ʋ>X>r>6>>>_>>>>h>>g>>>J>>`>N>>T>>u>L0Z>P;>5A>q\> >>>>>x]>Ǔ>X<>=A6>,.>>=i=x==5=0====<0ټ:G<Q=Rw=f= i,=`=<!;@):pP\ U W E=k=+>4yR>+I>->==@)= &!=0=====(><^>~> x>YU>(6>6!>>0==:=>zi>t>$>4e>>>'>{><)>PT=SWΙe<<==>&>$,>9c= Y,g <~$ C'H߽`p%=@]<@9Pal**޾JR̾0h\T4cv0̈NKdyhMyU; ã< 4D;P|h0H޽}(0/9X:Ipǽ,I3|z־t۾& ~h(Ӿf6؛|gb p 447D2HbԾ߾Oվ Eeg@BȾ徆JྎmоJǾ8ľpžVǾR}aUP'LR䖒LT ӽhɽR#FtFȞ)qN=@=3>h>>ъ>>Ь`>DF9>Th >(ĩ==@[F<ٺj;Ƅ<R<=pT=Z=&=ZG< ּPi 4hK Ye)^b>>dԧ>` >>`0S>(>6==p >Y>>$ >1>>>~>Z%>*>c>ڤ>f>n>J>h> >y>v>>g>?$ ??b)?t/?w%?Ay ?&>Z >p>0B@=`j9<=\B2>q>>z>FQ>>@=@<. WI<=le>44>Z<>,0>a >Q=@aA>ݲ>>:>p>l\>>=~=>Ls1>J>̯S>S>XG?>>=L>(5>}>>x§>_>s>x(>pE=௘==h=>==>lu>f>Ϝ>v>Ğ>۝>ܰ>u>+>۲>+>$a>>ܡm>*>==*>E>=c>xa>^p>%>L>>>N^>B>|>.p>R>;*>>D>f|>>$>I>,> =XH 웽`T50; k=y=[>>5>{>HQ=@<bG X( ܽP4[<`i=4/>>>X&>,>~W>Ê>Z>,>0>===3==@'=Ϻ0Xx0˕P{p&$:@-<@]==&=8_ >&>Z@>DP>|ZQ>HD>(],>>3=0%=x~>,>> >> >>>>V>Nq>NŨ>I>jy>fӴ>b>>>U>F>Y>d >>G>>hLy>s>>B{>Q> 5|>0>X=0=@Xz<@'===`.=@&=1_=h;׊#xdLž|I˾ ^8;4'潸󾽸h`ϴ<=P>@O>g>_>?>>0=–==σ==S=`#M==@(<ܩn`$<`J=S=%={'.>2>j= x=w=x>PT><>-j>Co>0>E>>n>꒒>Bώ>⩘>Fu>Db>=iqXϻE콰h`w>g=`C< o @pԽ;<ϊ= =IU=̼t jҾr*^ݾ]ɾc`|@2Ӊ`p=Xydb[=`=З=@&zH\\{UUXd ɂ@q< <@εͽE41hɾ˾=0yL "q3v0lPǾ>ʾyT瑾hv^T8<@׻<<7.;`-6p@综鏽GɽXz@~<ߊ< 0ʈ+p.H{U 1žZbɾxm-,텾xϲϾN?ྰپ.¾{RlLPlȾ.޾R,8p3 4cבA]  ִ Q' ~D侸˾&hiR͌WI0ځ@n߽lAֶ9۾%nBl߾L y 3vd(2 lR2վ2yҾҾ~Ӿ2ؾ\g徸*侄ǾvKgBX4ӽVҽ)\oЙ4n T}xX]T2_da,OPLLh;sJƁWX۽;t==3^Cjsx>_$佽i?p "ڼ #ϾҾRM+pRN=5= g==`eK=@+ԼP]ҽ 2!71l&۽0k;۽r>Vy>B>>ĵ>>bp>ӂ>̿L>>PԔ=":ri (ʽк`@KF@d>P=====<`ˀ` p Ҽٻp=>=H ><]>L>D>y>Y>L>[T=Ѽ0 4( \= b>O>bK>4u>>N>>> >T:>>4g>R>.> >U>Z>v>T>>O>/>>= ?+??{>m>\>=u<@<=\3F>>>>>^>>~>8>,>`=Ԅ>0>w>{>Xke>+>=x=(;:"<>=(=b=h=`<=9`=( >>>[>G?l?ړ>^d>.>eq>0z+>@>6=`=P=`d=hX > V@>Ta>4o>v>D>c>l>Z>>T;z>v<> #>|&2>SP>ԉ{>i>v>:r> >>|>>?>|mq>d]>ȒT>#e>>ҁ>Fv>>\ܧ>j%>V>B> >\2>\>r>4w>>?=?.h ?>>tq>>_P>>@>=>>Vk>_>Pp>+>{a=#?0~0^=>:N>6>Ĭ>>v>Ĺm>$R>,>> =P׻=[=@R<H La@Z@< s?=+8=0.=p,=aN==>n>}>Jڮ>`>>nf>>N>xM>> >==@ =;K;4<`<om6ŅOl<}<==u/=_=N=<K<=¸==T=`<1#Rsh½:8=[>:>>TI>L>R>>\S>t>x> >\>b>@>r>>ic>>>e(>d >5>sP>K>)>=1򿽘>MXnhk^$"<௘===E=P=Z71%W#?&hV޽B5$=*K>ݾD|F%6d̾Ƭ2BpbD7x(½ 4h <<=PG=O=09:=2<`` 8殽R齴$ -v5X4'OҽXgP\=== u= .=0(=/5NC>)R>a>ȑG>H >=8=*>pA> \>h3>d=>9>xM>t> =d=80=>$- >7=XýH{hdlCK@hr=NJ>Hb>,=>x>ٖ=@LS@><+T>D>->^>X=H=H!>>D=k=%=M=`=`=,=p=j0L` -<@=1=<`0Uང.+K^ͅb.wV=8Ƽ=R= >P =@܎>=0DZ=ͼP<ӽ *[toDb@Q@F=L=p"d@<3.8Bt;Pp=ܵf>L>a>26>ؕ>m>>>>ɘ>2>Th>!>=((>2>`>t g>n>^`>M>_>N>> %|>->=l=D<¼od=p>p5>Y>Y>b>Tu>>R=D+愻@-n= =>4t>pX=0=Ơ;p<(8Y.C> T&>XU=o=D#[T<2\=@=h~J>>Ԟ>9>>>~#>Ĕn>,>x==h[=H2=8={==4'>Tn>>7>|m> ?bn?O?P>p>@o>DA>`t7>D>>\H>,V> y>>>W>"ٕ>.ϕ>o>@Ѩ> >b+>~y>ڋ>fj>Ղ>ƒ>4v>V>>z> /? A?F>/>6>L^??N>8.>l>q,>`r>L>[>e>y>>m ?pb?*?8?>le>>~XϽfP=6>>v>>X>k>&>fj>><9c@<==>>=P֮=pz~=09:=p-=p=(>\EY>!>0>ha>|'?>\ >ؑ > >X/>d[>Q>u>ɷ>>>%>D|>Ԕ3>g>`=$,>py=X=1=s=:~=(==XD><>\q>"@>ɟ>>tv>/>=P = 켐`? :`=|Z>=>4A3>:>h= r<`0]`p1%=9>Pw>hG>>` >̯>v>>>$>$>>>>>䆙>e>Y\>h>44a>~T>`>8ƈ>μ>.G>~>H>X"><=̼ݽ&$-<&=x>=Z= Ͷ潀N0XP45<'<,7: WHxJLN eƾ俾M`~d<vg-7IV< @] (phGBwɽƽO޽н鹽ҽ{;._bW;@8H=42> f9>0#>y=<0#'GR[4U6~PcrMĽdDI`\Pp80z+@<@b=z=B=xX= =K>ü@<w=Ep?;۽س`A%@ `,Sr=s&>@>+=ν_n٤엾bxg0!=P=8-;z,F (E&f8|Vl,:{,os oD0˾{リ !<ʾ$8fњµ6 TZt,~ϭJ١R@f d=u?xrsSξ̾ e3^,6 (<`O$)|%%hGrܪRm˾Jݾ7޾ھӾGBfޒt+ ¾ھJ޾$Q;򌬾@z0Y`dH8Ogt^Dw+_ 6:@Ģ<=(=(r=RpϽ)D6'&8 ټ=bT>l[e>p><T t(Nھվ$.2+QjȾN޾<>ھž|Р}3etzx"̾&߾%꾂|TȾ^?#8PhȽ`i`A%OB`0ȽM 21\`E6ܝ` ajbqν-*⁾iV%;cξ^r|;l$8nS<\;`W߽|i  $o9h; Om(>Q>a>P5>^=K<<=J> >=v=O=p#=F>4>m/>h>$>>$;>jT> >>0n=<pW@FPK ,$᤽Ddo>}>}=qǽRk+P嚽R<躸==@!=cEг;R&:5@5<`q=8==Ъ=]==g=@F===~=U= =`ǻ=zT=@ ɂȢͽٽh]˽ 3۽Pl to#l.X.DpDŽA@|<W=h====@ε<I@4*`PEJTA^5t=hl==<"H sƽŅ9=R>>,>>F>F>j>Z>}>2>G >PA>\>ܑt>Z>r>d>>R8>\>>> >4>q>$ȩ> > >c<0ʈp =4>'> >>>ۖ>,>m(=% uY <0=ly=><-n>&w>;b>>Sv=jhǑ4;t===80=<%<,=+=p >R><~>>o>D&{>AK>>H=@<@<4>K>;>>%>>AU>,>P=0 =( ∼W<=f>r'>@[>j>> ^>dL>`=<]===},>b>g>$><>D7> >:>f*><>Js>܉>>@[=pO= =+>lb>">α>|[>Ե ?~3?$?3> \>B=H̛0$4XH=*&>d>S? ?w?N>_>=^ =2=M=)>t>*>>>>>K>=@ҁ=p?==W>H> >>>> > >>d>j>۰>Z>\>B?w?C>>n>>Ŋ>P>)>W>D>t==N>trJ>`>f7>z8>֦>*>Z{>\>6>x'>5>=A=޻@Ip3s>I>P>W>h>">d>1>=pu=HW=4;>Җ>2>=>?,?>`>۰>γ>P>T??T>>2><>>b>>>>J><>>>>*C>=g;=.C8``:P(C=p}=@<"(bm+,BJ@{1@^밽餽DTnc2#(r0P<ҩӾ¶m{A/+4BA(*!DAHuj\hrНt>FPNxŽ@fP ̾Fy˾ѫ0ݎ0Ts$EMXza.9C3濾ݾ.9vƾ3Z[969mbá:ξV&ھ^0o!`սXݚ`/z^XϽ`O8#*lu 8PShj18ѽ"M6e=P6>܏&>=0Zmj$֪)˾Ծ-@O O< =9=VڽhADGƾZɾR>+K$=nTDVi˾F!Jf6(o竾Zuhb$.NYNDW[} 4o4=t44{B-c(bmdd(.H .;>@ڏ;J;~:p<eu Xa>0B>(=X=px=8>tp>r>RC>T=@ o=F=|=x7>0=ȱ9>^؍>B>h>43>0]>=P^$IIVQ3<O=~=üȪ^=Q྄ 8 R >H+Fdb(ʽ<=p=T=x= O=} =; Vy,`-ЬXۀ@j<'!>> >>=@nإ0Ͻ`l7= =]@z0X@ f<1=!<@r2@.<`= =ƙ=

_|_搾B$^p˽f=S#= Ltv~¾yǾd~Ni C'08$c5Hv6վ<2þz|$2~t`>2052w@` /0E~0x򶾄{Ǿ߲V`p2ێPQؾtྎ)Ҿ4}+hH$dg4ľ׾&Q羠̾xeqb(-޽1 h\r䒾]W9,X͡=L>>!>s->9><<&>X}=`< vs<=0=`=0Ft=D=/= >` :>pT>>Hܮ>h>>>"><(hT;P S8=sI>t>8_>>A>kF>S=XSM 开<`A=`< VPt;#a/8"$`X',7 @뽘U0!A=@=Y>0\>{}>>Ec>o4>=PX=\M>d0>lT >==h=W>|H>ଋ>1>W>>b>ߘ>86>U={=^ =H=4>,>>F>>*>I>Ƭ>>}>|;l>> >>>>> ?JQ%?R6?c6?hH+???! ?J2>T>> x>`u>s>>T??&?@}>?Q?@Q?D?e/?9?J>(0>w=h>>& >C?4)?ŀ4?P;?փ>,>$>L ?*?V??3?x >ٶ>H>1>>>B>N>(??P[???Ւ ?L?fk?$P&?H0?Lr1?,?Y"???>X>>>~>>F5>>䪿>>R>8>ܣ>U?0?v? ?? ?$>>z>m>H!:><(>>>bn>Q>J>z> ?V?? ?>ݰ>&>K>(N>>o>=} ??0?j?:?t ?$ ?u ?)9??P?t>u>c>Xϻ>|(>>>Ԩ>>?H?p>>~>L@S>= ˼ p3|EtȲ=7.>$1A>N>=@#ۼkl#F,~fπZg21j+Dz ޾後پz䳾K\.ֽx匽`s(n2,{8\WZ9@'r5 gM0osxžȐԾ¾l{Zil꒬FݡlH(9$$HchЧ_վVF`پ&OͅȾn1e { (ľ>юC$j !$\Df+0Y`.Xr䨥zG ɂ\"tP0鏽 j ȍ&"0)+!Y"HDSp2Ԉn4-"#5c%ҷ >{H 1C=FEP<.)@{$p cxt/پʾ¾Yɾ!㾘V#n,H3Y( Vʾ8rƙHAڎF精bꂳd8~\dQW68`ؾ|ZK d>I<(lk/׾|ѭ(ڰʾp_辚TG\Oy/g$}/#u<+p<㜽Pfd&@ 0=`t7>>P [>j=p9\1, ׾À PǾ 2N pRԽ B5x<㹾$þf9.dnQV.D7wv(ܾ]゙r޾|V5=E!>6>>xa=R=Ќ=XD=e= kF=@<ج<=P;F=D>=0'=_;`'#1D0f= lS= =6;;@<<0=O*>6p>>}>D>Lh><>=@5<0.(սhP0=F>T~>zJ>>rr>La>>==x:+>By>>H>%> >>}>fL>T>:>>>M>t>E>+>T>x>*8>c>G>'5>>f~>>>Bg>,$>P=b7IR!<==6>m>³>Nw>8N>p> B= 7S <==r=@.{=hּ6!bIq`5@==,>J>Ԫz>Պ>;>>S>pc*>O>h}= Ͷ<и%hHcB,k? 8L=(=腌=<8y<}3#>C> P>f>2>Ą>b>>B=N==AA>]n>1>H=R>,ѕ>̱>>8>>ŝ>Q>]>@Nm=XVzF.4DV$o {>> >|Lr>=4s}#񎾨Y` Խ8tŽٽ\P\SоOԾǾ~guU彐n~=`t=PK >T>@>=0 =@At#}ZdnjpeD@WsЋa=T>G>~==<0Ƚ?`=()>>>׊>xm=>= ּ(ݽ D.`EY=(L&> L>M=>= <о :8=r=ܟ>AK>q>P>-> h>|? ?S>>җ>D|>d>4Q>y>0==>|p>>䨥>zm>\D>'n ?I? ?ގ>>=PTt=N̚@=->Q8?ͫ?u_*?Է%? ?Z>#W>+=G|[>$}>*}>JƁ>b>0>` >\==>lM>>`>>>z<><>x>>M? ?D ? ?h?0>|>0ޛ>pyq>HH>X;>L>x>d)>~> > ">G>^>>>T>>\>>>>n>̉>8U>@6 >T= p=s=X=i=>Z>ؿ>>~?N? >D>.ߎ>Q>1H>">P>L>>L>$>>>D ?V ?B?8>?~??>~ϭ>B>y>R'>:>*<>\T>I>:@>&>:>>M>l>pkT]R>Q>u>o=؎9N倾2B.e ctd&xD䮾RL̾ھxɾZ2Dp MPGFT ,<' $Q*|0XS蹫wH<=Ah)ܰ%2 koIXc*ʾ^, ;оFfo0xЦq@k0!IH2T c @Mxjz\A\N-;T^ZԾxw`"hI(&C V`@w0г\Z~ 5u=X%==J==r>w>= 0=P6`4@<8> >Y>g>lb>>" >e>c>Ƞ3>;Pȍ"žr0澢Zf5Hһp >i>}>YU> >0=x;P8r>(>—>>T>>>TLL>> >>Ȥ= =Q=<95/Aq> >^>.>PaR>L">>>@/>WW>@u>p>NC>=PO =Լ0~_Ⱦ0W[0~= >`G>Jw>^>>>"ٕ>>ڏ>>>>>>>>l>&>>>Fp>$`>~>f>L >xO>38> P>Pw>Z>l>ܴY>R>i>x>v>P>[>|&>K=x88$5Pnؽh>r>>>4Q>=8d=@<:0 [q3f03Խt'QpblJb1Ͻ ã<˷=!>M>|[^>_>6J>x[*>>\ >=`.=,7P0!YƄيkc#@p=>%>G>=0=0KȔd<AսˣC`*:`>2<,->T>0=&r>xK>03>#1>>`h=X=)=<<=00>M> > ?<ɽLT'LǾ"0\b߃B=a>T5>>=PyTG?ޣhɾT־ ҾɾBt_ocۑ\ϾBL~($(Oz;X;,%Ľ`0 0CXw*x襾|}оi6lYP f5PݽHq $޽/8 I𽨩ǽJǽء(HT.L∳T6cGzjl<!pP" @M<=>\B>[>i\>A>8v={;(䛽Hu˽|D0C#p1%AP==,7 >)R>ό>~> >~>07T>cv<,0Ѳ"q徾ڞ˽= >Z>y?[?^d>ϑ>V= ּ@8@J+=='> >=Kf>j3>Z>L>ό>D">Զ>۷>>4U>>Dly>> B=`A=^<Mm>>>t+>ȍ>D>p>rr>>>>x>So>_>׃=Eh(p`=f>\> >=>>좥> >i>dV>f>Ɋ>>l>8>>V> >d>>>#>|>s>>j|>^>4>`N>к>>{>A>T:>r1>>?>`>l-><ýRjgO:M Po=:Q>~>T>~>L>x=:߽X)@'dٽ޽Z 07`Wv(llTNC7Y(޽6}`<=r>M>6Ȉ>Hu>p >`[>=?D#x0.F@7~Cl=p&>sF>0.>=@H= 8Ჽǽ@н|G`GMĽ 2LSsR`0e~PL7(> EApu=\&p3s@93>9(>0>(o >==E!=`<@<@x}(Й=E>{a>6!>=|=>RC>D>!6>O;>T|>4>>t>;Iսl4ɾí2=J>K>Ə>f>x @>΋=L8 ?|H>@4l(1ԧS_zZJ*쾲;˝HN8׽@gj;;W;xY>؅{>k>1>8=_=70!I ,@g պ|Sy&V#xl6<8pk0@ <(=W>أ>#>d >==>d>O'>XJ> j>Y>> >>R>>>t|>,>>>>r>>8b>>ʲ>6>,;>@;< :ԁLpꀙR"$ >6>>>jw>T >@$Tjl7s"C9@`pkdGEq0%uLaR,&fv.<=>Pp>>_P>Z[>+i>z>*~>iq>_>#>8=a_v>v> v>HDS>\-> >= p=p@=,E=N=a =G;X̔m6LSsl|0fH/=>>f>[>8>>^->ʐ>>ޭ>>J/>>HFm>>>p,>> D=`=)= =>X>d-`>#>==0)>Jb>>>[>R>>&P>f&>=ߟLtr@ھ "þ^ܻD>R\>B>>u>-=–T^Oxӓr>$*_̠;[ܾtȾܪ`5(`spA!UP{@ 2;λgXerҾ6zYzzL&QE/t=T=,G>O=@<^@2 &=;S[==1>,6>|)=`XW8 JþL/;ľ4ۨTkeݶn<0ͯ= =%=( C^ݾyDؾx[ϊUͷ7U'/pA+2FľȮ0\%̈(9pӽ(<ὐVT\xݾ#|ZXd;폾!l%>TV> %|>Ȁu>$P>@6 >x=0{8=ph=0/9v. X<=(>M> >'>|)Y>>P>A>h {>>{v>T9,>?=!6mIZ@ >,>V\>Ԃ??Y>ٹ>!q>R=^{<.6=>P>8r>f>x><@нDS`=e>>4A>>y>r>e>O>>3> X>>y>x_^>(,=>= >>´?}F?;L??i>J>S>Ȭ>H>N^>vÀ>S>` >a=`.m=P<

_=h='> $v>І>>>j>p>>:O>->>XW>>P>>6>>d>r=?&?B5?>'?A ?w?m?n?r=?>>> {>m>.>\V>N?Ϩ?? >>PC> -=ؗ7@oe9Iq=]>>>z:>pd>h>p!,>)q=p&ahຽ( QLϘо+S#e^{?TP=`@==a=>y>ۑ>\0>\A>ј> l>T >;<48uE7[XvhI֒;i=p1%>ĖT> f>0W>D4&>(=<[@x]Ľ P}伀B$@ jG׽\+?LH\eKLODH'ܽyP\E==D4>0F@>s&>>h0>0;>0$>h=Pq=ż ;ڪ >`q>[>qN>p>D>M> ]>G>0>06>ؓZ>dj>40>I=蕅|2wh¾$Ƕڟ8c`B=ĦM>^~> >%c>>@=_4c Ll|(~o( 2vϾ8J Ҿ#&稾$NXV_<@I,8ֽ0]`+%Xϻ8E@dŅvnK`]>؏= C>\ـ>[}>9>m=Pxi đ Ǧ.PI=>>(>@X>v>q>3b> V>4"N>4V>q>>$w>Ԃ >C#<h׾fp־ʾ wFPR2x=?> "\>pS1>Y=tFf7B }t|mhtx6t `֍`Z ȼpA=0H==X}=`==P=<֒;xd@ㇼi@d0h}= hSTB0 VʼP*=4O>>'>$BG>8=(;XۀNѽȤZǽ(9`޼d(|px9X|0VP6=$>*>?;>X7>6>4E>0V>H\>e>d_e>`@L>4D&>>=A=@=P"=|<<V>R'>p> U:>q==X>d>h>L>g#>Pq>ԥ>&>=ѽC`;徬ھzpvlL>,ѕ>N׻>z>B>0=(o?8<JٟJp\}ȞB@־4ؾȾʳLkkP A!SpR*U5kFdr pjݾe" ='==$xb ꁾ& jC(*T-~w;پ>վ:DA@^;^;P\v``vMh}ۜ`\J@<`ge=A=g4>X>\>HD>|Y>x=&=7=0[F==`= %>g>͉>ܶs>> <7޽ pv<ԵtX& r2|=@6 >B>C=`0DIWwЛnԾ::Lþ&R P!ejk޾~Qԑ 0z ll41:(rfnǾ,TF¾݊P=x>xQ=0{=I=`޼|zl )J0Y`il>pvPӡל|n~Ԃ ⏽Ie=@<=L >>45>pUK>QU>`[>PJ5>f>P=u=Z<@4h<>A>!>nf> ە>>,l>9>\P> >L'>tV>s>3>/^=@hs&Pp=`s*>hH>>v?8? ?>{>"> =|`:=>8>P6>>E=`콽[ͽHʁ@!A<@=XV+>Xd>>FS>+>$>LO>>>R>>ض>L>n>@b>z>H=2=]=p=`i>> ?&?2?J/?I ?E ?>]>Z>[o>x`>0r>z>2>>l>|'?>l>>>)>f>>4>i>>o> >ڿ>x>x}>j>!>4R>w>h>H>Fi>)?__ ?ܮ ?j?>??J ?+?g? ?)?b>A>p> >>>>>!?> >w->Y;(>r >>>Q>PY=O^L(>XPHݽЗ 0$r2LSs`+4ڛQc )ּ z=PC>~>B>g>s> =>p=`pF>P>h'>D=^ #*4{!L<50; 0\vQji|at?80< =x>K>H=0&=-=PQ%=7=<⿼S[@@6t 웼`"< X=W=$`>Q\>(Rt>s>U>q(>0w> 0>x8>@ >+=8=P|=͓== p=߽a=褋գ$ i3 =l$S>z>pz~>9\>8>=p4Eg^rJ 8nF޾Tξľ>~Һ2ȾҾZEپҾR ;Ⱥ`ռPhҽCLN2GQE9`qDl]p2fgPܯ8_^<=H->,k?> 3.>D>(V=@-x 4hJ(ʽgHdŽ) \@jixHxrdgxOeNb$P<~.ٹ@"@`|g>`>L0>=1Pmh~~8alD`` 4v_X3FL(^ppZ/#^*9;g=v= >> >= =PN=pA=P=h=X=P=>Q=@wpн%x<;>>>Vϡ>N>@>J=@<@ |0x_@9޽=E lT DpG80]@?=p=v.>,^>.y>:>$ǜ>~>>>>b>x3>M>==5=<`x<]=%==@4>>>>`i>>(d=K==p=hN=() >PA>X%g>sP>`=EUSM>vD] =Nn>rA>P>,>i>,=E c4ľ誾ٝ*⁾ċش[Ծu`ھ\F1ģZ0S}{g@whh2nL>ܾ)2ܾ щ$PU<g=Җ==Z@7`Hex}TKs,oႾHʛ ̾PѾ^¾H0(_F ӽνtl 0 (z齸ؽ(ܽd j95:>Dx >=@=л==P=<i8(sv@B^->b>:>Ȱ>z>o>h=`*9=@~=X=>->dJ> =>8W=ЪF=_ ;͌=%>Ē>p>PJ ?@ ?_?>>T->௘=M开Ơ;OB=(,=P]=<}`*-R@LS 9?P=H=H >R>$Vt>NՇ>>>vo>T>H>,[>>>N>`u>r5>=@=M=ԕ >8~>|>{?vo#?3? 6?fl*??>?>Z>}N>44>>>*_>̑{>q>у>g>ԅG> 8>P_8>?>XV> B>>P>>* >$>xL>t>4ێ>l>@>A>y>>˽>O> >p>7>> >pV>߼??F?T ? >>%>>>Vߚ> ˜>N>> ?6?\>8Q,>;P EX+踞hy=|v>>>>J>8d>=ͺ½*4&۷@' _4 [&~8NQ\:[=K^>\>&>S}> 5>h]= <@Ǽp`Z`GEQxZPc` a=>|@>tRX>=D> >rw=8dsx 8tŽ ̩`o^dދټ~Ľha2<Xֽp(v =ȃ=$>6>|5> )>ܿ>=v<=7HP:@K==>N5> !H>8d>1|>v>@V>\6>>H >'*>N> A=c=:>>x>2>|>Hw=pApZ㲾P,ھR侼۾NþS 5⥾6tžjVʾr%Doн)cehJ q/޽ A-Xw*CB"qjV=,\>T]>X}>y>@\L>H. > g=;p&x ƽa8w콘0 #38trJTT.UX _R* c5="=ر=觘=!%=7;08-@R; ==>3P>e>>>s>XY>&_>>}@>$>%>\ >̫>!=>>;>D>nb>0*=hh< ̾ g8ah=)>L>pu=>0>j=X߽00nx;lxO80[`!GdlF_8p?l@N<@{=I >>L>==x:=<=Pxr==h==wI=I0ݽqǽb_B=^>0o>>> j>8 !>"=n<-DP ν'K>4>x(> >J>f>6>c>T.>x>=Jp=v<ЅP:|a}6=@\=02>!K>~> >z{>h0>@O=hHP\h=PƵ====P9=<+:\OxpVVhf=|u>,>>m>>(겄ľP򭫾fW_Hľ v N۾̾밾:ĈtaDpvdm>H}:>=_B=`fؼb[};9`ܼ@|<Є=@5g<}$#RѾ ޾d;{ȑǽT4\>4e%>=:JP^žt۾jϾ餾x*f%A%S^旾N}h-{p==>8>, O>E>X'> >>>>4>0==l=m{===">lx0>`>>>|>>>u/>@=.Q=థ=`=>d:2>|U>ph>BQ>8>آ=D===Zp=X{=+>H>Z>g ????>>K>7>hH=;D$?:g<@Ƽ< 7== =+=0=`LE=&=PG=@=$ >D>F>+>>қ>>V#>Ъ>Z>6u>l>*>I>ט>:>T=> R>lU>|'?>Ԃ>>L?L?2?N:?5?3!?&^?>2>l>(j>h>J>h>Đ>^>)q>Z>L?F>05>\)>4e%>D=>pWe>>>>>A>>>2>>i>TV>9>3>$;>P]>>9>H>,>$ ???+? ?R>n>ȋ>n>V>L>FD>j>Ld>?>>>'>];Qc86P)5=7I>I>*>$>tǴ>ܝ>@>O90Zm`a\ &=.X4ӽ\QLP\bX6f`'c=>@' >h>hN=k=J&ǽO׽Ыӽ5ĽH#Խ` \3:`1Ƚ0}R=h=ȟ&>p'>`=M=@ ɹ{ Hֽ@V  04`,Hln0[zyU|P:@d>8>8>L>9>7I>7^>{h>S>%>=ߟ==`Ĕ=)q<0k0i"$<y=<s Xh>c9u,l|B@=*_>>b>P>@ >0 SڴپSȗ "U>TnX>8>p`>Xۀ=13nm?޽#&G*`;R jꑅ+Ŧ&c*!Еt`܍$=>v>>>r>>>2>8b2> =p3=i==(==0E>K>`>i> =psBZȾIx|,7< >hH>P>%>@=`H Uxd:2Ш, #0}ҽ'y(P0PcT0k= =h">l:>܏&>6=3=V<}( >( == 4ԥ9<)ʽh=мY>>°>>>O'>u=@0,D4\5OZZ=̰=hL=h8=e== k>>>>>>r>-(>k}= gXսA H@F=D>dh>:ŕ>}>>ٖ>O>pC=):p&[==0=0#[= <`d>==>`=ӻm 5fMuYBa7I=4">^>_> T-><=@a gzG䄾zi[bm("fax-u ]C& {轘Խ?׽h۽0mٽ |؅@N4SP##=G=,5>9>PPL> 6>^ >=k=Zb=8=Ԕ;`躼`+F=== :Ǽ `v~i2z߾Nh־ c0B A%p?l=XH= )Rx\"8?v=86(h1о ڑʾ~Ͼގ;nɾ,¾ᅾL;fܽѽĽXzFE4SlER\.bng˾:־KɾTxIh=X%3>$U>8P>m1k}=ȑ=V=h=pG=$>(\>hZ$>X">>I=X==e=@.=<`J>z>>>>Rӡ>Z>\w^>F.>7>z>F1>t>܀n>$tL>@h>.W>>r>ӂ>m>J>T>==,>ز>>1>? 2?V>.Z>H>l>$?:hHսlۻko= = >>Z=1<9@j<;==>D|>淑> >]>6t>>X> >Lȵ>m>Pn>4C>(>6=pb=_=R.>V͇>D>g??)?F)?@?R>>ӊ>R>->LP>\v>R<>W>_>[T>7>H >-> >Pq=z=E >]/>@b>f'>Dε>R>Z>>*>">Q>=(r=u==N>Hwe>Ʋ>l>p??>&>v>H>x<> f>l>J>>0>^>(->P>>b״>~E>?>w=x]Ľ(,=:>n>,> >'>Q!> ,<٫ 3.c=qPap6 X cy\\}ccv K>>N>q>"a>|{>I>Lcl>Ը%> B=[=<@׼Z<)Љ=J>pxd>p(>m=Hܔ|9R|^b)KTX4>>rں>$>m>pT>=|P¾~ԾnU˾X#៾ XسRǾʾ4ܵܯj,b@VzPo彀ͽ8WI< =H1=8N=<1FG|zV\VVPj0==,>I>ĦM>0$4>=s=1jXTv'V[v៾nTLD7M\L|=>`O8>*>@>(=x=t=j9<";I<@m<`!3==N=>9>d\>~>p>/>*>J>>& >>HeR>8 >=7>5=>:<>*J>4>Q>b>t>Xl=PWp(qpxqq,o>Pd>`,>H@>Ri>"!>=@x9HxtL(䁾Dd(;< (ʽ8愽0 P; <(=@ |==`====R>\R+>,]>z>x|>?>H2=;F>>h>lT>X=Y; 3۽`P)q8==ȵ= D=pΧ=`A==<`<@*==P >f> >>>w>>>n0>w>y/>=?^ pZ^<7=Y>>D>X̔>9c>ԃ->\ >4 >>{= i,=}`,o@{*<=@7=ȥ=i(>4O>F>=0=6X4P—P =L>>>m>(= 4o:<쾜վ ~ž"龒cG |ķMqB:ȠA/`$Pjxrq*~oƾPF4Ȉ<_?ѽ# k0뇽<*Lk:Vϡ40>|H>>`+> SM=>8@V KԼv<`<7X"n& T3оKԾZSP# ׾ijpսX޽8 !!/<4Ex@"PԾHw*Ȳƾ8-3P>Lv>>t^>x>S>B$>pX=c=&=|)<⺀B$<^=0>>q>Nn>zX>>>>^>b>,v>,KM>#>`==hz>(>>>$ ?,>>\DL>=Sƻx== >6>J?: ?o?L>q\>A=@W0D@ㇽ@ 8=r=\<|aP#`lT_l>D>.>>>F>>>l>->R> > =l =! ={=(>H>>F ?8`%?+?5#??Vl> ͽ>f7>@LS>Թ2>}(>0<>p!`>\Wl>Hc>X>%=>Ȯ>1=V=P==,)>{>5>H>? ?>?3>>->F> >;#>,+[>ԙ><>f>|><>_>r>> >.>Tn>*?W?>\">҆>>ӣ>2>{a>P>\}>b<>O>\T>=Xؽh$pڽ6=`>$N>>>>7>b=p|g£$ֈns(4(\cF`'p𯑽Ь`𗼠<_=f=ן={=`vʼ`elBl2VF+Ь`=>L:>E>0>@=XBhCh꽰8ֵŽh5 0S\ϽF`I@<=L!>\V>%>>:>0p>v<>_>(=x=D=x=p=,Z>h >8>@|>>]>dZ>L>k>y>T>>np>H=PU!;e==8=)>>х> >@C 7vZ.Vx=R𽀈;J>>ǟ>>T{*>@>8>0Y>>>> l>P= &pֽ-H@E5x<mЫS(=7 T>@p==(==PN==R=$=^=0=xǴ=A=1>#>X͡>1>> >&>>>Lp>sI>>0=>p&>*>2>F>X>x9>г=@;tx. "¾N*4^\N=.Q>s>>>h$>t >; ЇdL瀾M0H^ e8޻ߊ<<= `=`=(:>4>l:>l!,>>=j:9c۾Lp `>26DͽʝP9=\0>_>(@a>0<>ȕ=U=@XxtPk(r+<@|=== D=<9< m`==p&>x>6>F> >>$>Ь>B΁>>0˕=&1(>)>4> =k=|==>r>=Փ<0'Z=p=p=(=( >A\>e>> YHxr>eU>>:=- @ܾ1 ĸj&ʋXN-dK Bٽ!\P/R[z.p}ţȱľxξ"žn!C̽`A<=캐݅Ht KPP›¬&<Җܱfh5%hD K5-ozTze \(҈=Է>OI><4>0~==`0+L(l 9 ӽ`@=H== >T'>F>^>h*m>R>T=\.>5>p=woBt虾Jc4R#ej⽀֒f=*=ug= <@spvJ6<̻=*>H> T>:>X>궸>>Ně>>E>+>pǴ=@Õ=*=_=`=0>։>z>%>=>>ޥ>ڐ>B>Ǿ>>HV>8>pa>$q>>T8> >? ?x>h>ܴY>=P{*=H3=^5>Ȟ>>_??Y ?N?>4>ȡ@>x=<@N rػc<@<L<য়@;`A% 8;== >`]>p0>>>^>i>Һ>J>>#e>\->S=8=R=P=8 !>>߷>ʠ> ??w)? ?O?6>N>ج>>m> xL>q/>">s>#==`f='=~=>XE%>@N>{>>Z> >^>,>><>>>>D>>4>>L?>">>1>$u>z<>>>? !?~? ?+>֗>>0v>HI>lE>">(V>G>g>ljQ>(= ꁼ6< E(h)@=v>>>fl>>N> e=O^0r*,HaX-&9GIأS<]dhhhNh@(bm>LV>><жW` ( k݅к)NDj_>w>=q>ܴY>9>>t ><>y=pE==={= =c=p=P=>0>>a>>>t_>'P>=`(@< <;Pi=`=p=31<Ž&(tAt,L|9RDUd[1Hܔ y=>,> >=@@ 꿾8iᄎx^Ѿ'ľ&ؼjvNnþ4ʾ׾sЫӾM0HZ?ɽe`hr==p=H$== ∼xWЋǦ(0=L>0ߨ>z>q>R\>W>Z=BipBkR lC$r()8Rh尿Qp ===Z>=!>K'>t>`>Ȥ=( =H=>$6>|ZQ>S>d>Dr>jb>L> V>z>V>괞>Z܍>N>=¿==h<=%Y=ܻd0x<7ڱwLh$N>lu_p.=Y> >s>xl>X]>= կ0lz8 ;>R>/I>e6>t(>$=>X=(;;txQHt>XUa3xNؽ@p-==,~+>dO>`>O^>bG>>pv=͓=ބ=(r==X== `=%= =;8=P==̫>ZG>t>>>>Zp>$<>`,>|i >===8>`#>&>}(>b>=$<@LS<;'PW=V=/>M>TnX>2>=X= Q>&>hY>@=(===(r=Z:e2 6 䘬삾@-n=tbQ>Ø>}>I>=0?X[ƾodY#!Jr҃\rRؾ@ؾپ#оzJ#5hB`Z$qx."NbH)x}T4ytΘ޾ʠ\׾06!@k8|)=X=o= )H= PȽ$TmK ]IU4DlAL]d98b̾׾ξ}@P)< =%>>=0V=@HЦ!@0`/`ǻ@A%߼JP;5<==m>S>P9>ji>> K>c#=P& (P/i7Nold(P/x/$pʲr S 'kHlTo  !߾ʾ|I˾w쾢)Ѿ/`NXddAl hxM˽&ѽBPi(Gվ:> ] EN]Xh;ڿ=x=0?=uԸYh@DxQF+<r=ބ=0=`輰ӽH M@=pz=R>2e>>4>$>>2>,+[>XYR>\3F>\!>==H= >>> >>k>H>$>`>z]>>6D>6>j>&ֈ>r>c>&>>>o>]>P>*>~>l> > = ,( =>> ? ?` ?=?6>>0#>`0=@VH %0!dx:œ^x պPK=pU>Hۡ>>N>Po>ȱ>>>I>9|> wF><> /=`=E\B=+=Z>L>>S>>`?4#>>>4>B>A==Х==;==@==U=`=8=ɤ=P=] >LV>+>>>>O>(>ĵ>T>=>R>/>>q>$>9>>5>``>Ѷ>>>{>>A?l>">2>}>7>L!>}!>*>)>5(>hG>`.>=L<6J~wlTƽPU=PO?>:>vħ>.>lF_>=΋i\򾱾$P4Yn.x$V[򫑾v㹾P`)TH#=pz= p=@<9L_S現d]VǾ*ždXP½ ã<='>x">>虹=ph==<<ѻ cЈh  gP+`f(W>|> 2>*'>j>N^>$> >X=ܩ==F=PȺ I<=.> P>{Z>rt>>L >ăh> >z=<=0z=h=x=p= =H>X>W> >$=`N_Wi fkt|8`񲼰= >&>н=<@H -v>@{|Yhj1|ol R -҈Ծp<~<M=1>XyD>9>&>=<` ,Hpn1D%nd.P<=LV>>Ř>>K>f=?=@X0F$`,/K'lT (Z B`&zҸǽ`]'n> u>K>*>>R>@ҵ>J>>>>$>Q>>H>$">NC>tsW>z>bĔ>z8>H> >c>bM>L>4d>L>>0h=4;@@&)=8=0=`MR=-d&|;Dklp > >> >PN2>(-=w2LO?t:%Y()DlE|78xF!Ka3Q=4 >=>0]>]>tN>hA>T)>(= =(浽|((_FRE%8Cͽ@=2>d>Dly>0v>da>?>>H=8q=pN=@'=@4=ko=8a=Ȁ=P===(=0K=8===P=L>>xB>`d>9x>I>d>XKs>X>?>>C<寽X"p&#PTL=ȵ=|5>^t>$> p>5A>Q>>>i=P=¸==8 >H= R@=oD誾AܾlY徚ξ\)[@=gB>P>l >`x]Dþ0-fjb̏N־޾+ e /3dҾ`Έtb栾z\?luKP8hhB v4侢 R(Lʾns>QE;<6!ϭgBq~x~zZ̮ml料ĄPIQ 7@X:;X;@9C#<<:=X=/> >X= 0=~@>rT>M/>j=e |X7|.k Xս@+Tp'hսk8ʾ $l3dL8?0j  PᾞPT(=05#P`S¾̾LHzjcɾ`ݾ:  X! Cb ǾBdnYq2$F@^xTni젋G4ľܾ,Kp۾ ,iX[,.p Лڽ(F`<<=$E>l>>[> >>>6>Db>T[8>$ >=P]=`R=#>8Rm>> >>h>vt>8>U>T>>1>0>H>6P>8r> >f>>?>"ٕ>|9>觘=ZI@j>B9>i>>>N^>[;>=`MR=p= Q<@{*<9,;q0h轰?`g `+(Ԣ`,<0>Q>r=>y> >֣>;>>~>\>t >~>\C?>>ԩ=cM=k=`j=hm=>d>>A>J>>Hg>>">Hy>HQ>=>(-A>T>s>V>>Յ>0^>%>H$=:p=<xQ>쳫>p2>T>>>J>U>r>>>>>>/>j>H>b֧>>$>>*>>>6>D$>|>4>Xu>E>%/>P*@>;W>(v>[>Έ>t>>_>Z>=8=3p:>#I>'*>&=<@NpDŽ瘽Hˎӽ$̱m a;K־yj'V;JƼP/QjPH޼F`(t ˽'0H/eT|@^<@u)=='>|">=)=DV>>>h>ޏ>襘>Jț>h>y>Ej>LvX>(0>Q= )H=`mD==>Dh>(=j=w=@=_= 䢼#C=>[I>_>&~>L->n> >0">= 0U,o\վ<徨Ӿ`qeu@ Ug=8q=p>_=gXܽ(>?ePhi*D1Ej#.^RԾ$|LR>l܆>s>N>>ޡ>bs>>ts>d>>.>,b>>>->01>X=>G>E>hG>@i>hi>Z>_h>W>cv=ٻ̛),~>ˤ>.Т>o>H =8p&ѽ2`?>QX=0F@>>v>xS>= =@qP4=# ,]k`? h| *|䒾6x)Ylu 7=(=i=9 >$>X=؍=== >X.>8s8>d>p=3(=(EmlnQ$.Ȟ@;d*9>dp7>.>#> !>E(>0F@>h:f>$ł>4>>^>!>@=x< '` (⽀@ J<}==>A=>hj>^>>T\y>@>p=0i=<:<<`h<O U<(=<)>>@o==b[=0X=pM=p?==ȶ=\TE>xz>^p>> 2<'޽ cݝUθu\c"x-PkDyžEо8ξ2ž$ڼꓹܰ6ξ H@h  [ 2fM֦-оP =[v)tӽ* t̽<Lhþ$޾ݾ,i$hЧ0W0DB݊<]&M$NxJ9@3p22Jν "|)Yy6~/><=>P<>4>3>2>h >>S=X=ϑ=@)< 8䔽8ֵ|콌^Jnw6]G`&l3+jhͽ<(Nھ <$$*Mվp| NNǾhIҾ~̾BDͨ H$8ʾJd߾9\.h))޾ne.=z8<,jy FP:>(༐#8誾ž%˾SQG'BWI)<P<@h@Dx@`,Ӽ ===`>$O>D>ȶ=И=0)=L伐k@'s=+= >L>l>><>B>f>N >>b>>i>n>^>8@>>>҅>>>>R)>> >>>>Dw>v>Й>D8>?>|?8?^>">)>6>@>">.=:=E=>}>f>M>#>0Y`>0>=8=l=P0&=D=l==o=`<@? ֽ: H=| >0F@>X>8U>{B>S>!= =>1R>Ê>>j>@><>n>]>>">̐n>l>D|>~>>@Ѩ>>¤>>P-g>7>/#>xK1>L\>T$>p>>n>>ޥ><>XA>6>=ġ >.C>>>>ܽ>>y>>~>˃>>>|>>X>e?}?>7>|>d>>>>f>$r>ċ>>9>0w>RQ>+>\t> >80>`\>>t>h>>s>D>=@9,< #КMjd@>xT>K^>Xa>}U>pG>#8>#>>y%>+>_>8!= =`7ͼgNѼ@ʻ_<=0o==> 3.>Dc>Bp>8R9>=H C)XWYɾ{4@amn7˽h35ģӾezZXEトܾh¾=ͅK$N D8h{$a4 HuK@`y<&=8P>40>>=_޼,{lZJ_km"D ӕKijXZstb(gLL)=(= h=X̔=@x=`=;߻0/4Yc>">>"ۯ>W>׶>ù>f>8>4w>>(>8>$ȩ>.5>ޜ>쏅>hv>k>n>$v>h8L>=<`hraν8Sƽ({sh=>.$>l >Xh=VXн@'4dLPH!:. =x->LT>F>C>:U=Hݽ'$@^ =|=@?8]dO)Rɉ@;<|==x=<@yx,̽8绽Pp22=Ш==xo=H̛=@h<MHwн+2$=^=h\>>4r>>@>h n>dI>LQ%>X>h=><^2>T>Th>g>O>0> >p"=`=<)==2= y=S==y=>d#>1>:$>A==X=G==v=hL===='=8r=D>:>_>-H> >=$?0WF%ug<.=m= v>=`x>xQ==(҈=><>ü(㎽PȽH<8r+z֙Jڮjh"ľDF˜z;b;VyްپEpb Ry`0db՚09n/d J`(=.־:ݾ̾c,􂾘i$vfP}ZNTHo QFL< Uaxf7f|=\x&ͽ`Gsz`tHBhdо?˾г0HGՅ`l7`IAŽP`/X$v ={>$>>(=P=[=@#pJܼ\<{==>%/>}%>Ъ>Ї->'P>(a`>> > C>؁>'>*> >b_>l>>^>>?0?Z ?>X>:N><*>>Ө>>/>*\>>Q(?>)?B*?9?n ?>>פ>>^>n@>H/>|/>ܡ9>|,> >9=F=/=V<^;`{60U拽ؽ xK@.踞=P>*>E!>p >B= =)=@$@j>>|>и>N>>1>Dc>*>|>=>+>=>\C?>\.>>P====[=X=> ?>taD>(>W>H> >\R+>]>>>H>ƣ>>9>VU>g>vm>>X5>>c ??C"?$?y ?r?(?j'>xL>$>0y>>v,>W>>>S>X2>мY>P->X" >j==>TO>m>o>p@>P= <Z'`s^ka 6PJǃ=x,=%=<?'hн$!,JPh4}(Nt'^`B(1@|>WP6X _h@(a X(rf-qq$y@WqPҔ i~g< oz==%=  pB+-<}ɽؼP6==p><0>d'>>P=c#=<)==(=H4>7l>%>X݀>x>`u><.{>W}>Hu>Ta>nC>`N+>>=x~=F=X= =>F>>m>)>@0>Y:>\;>(M3>;>1>hM=o>=U==*"\y@ռ;h;v(1꽀uGLkA|4oR1̺ E˽HD=V|^޾ Мg߽Љǽ(#@* "([ƽx}@@40`o^= >P>X>>>K>HV=1;ٹ̉xpm<7==tNѽK;P{N^DjШ,@LS4=@h=x(==ft=`G=<<|<@ |= $=,Z9>b>Ij>b>H3M>k;>xB>V>s>H>t>0>g>>di>2> >=9c=H=>7B>|n>K>==`{ X&"ʽ @+T=\=2=`Ç=Ph="\=H===P>TP>f&>)>U>>Y>d">P:>h===@%>+#>5>*>k=5= {0cļ@5g<<]<`du8½{t˽@5g`& >>_>w>y>z>LM>>>>0> >>v>4DZ>p&>h=ٝ=HH=y== =x= (Mg%ܯ_愙ØhGN槾Jி6٨nD́|Wvm@Wl!h29=D=P=R==k@` <)=P=(=h_=ˣ=]=&X==%=4 >>'> "(>p>==]==3;+hƽH޽@Mk4@o\bѣؿ;(ݾK >+J254@ ڰ E 0 t6z;4þD(Ѿݾپ_о|Ծeܾvھlھ\Cپо\uľ"AŲЬԃpvʾ4ξ̾)ľU۫@jʥ~݌x^Q^ p(=0I=9===@𠥽} (P)l ೽` e==0]=== z==V=h=`=p> >(N=H=R=PÎ=h==X"===tM> D4>XN>LT>`G>i6>,>P)>&>(> T=x={=%/>(r>0>>I>~z>ӹ>>:>1>t>>6>>L>X]>">T7>$> J>܄>>>~>t>Hw>۫>Ղ>38>=xԆ=|n=hj=pw=hh>h>1>l3>0>P:>D>7>%>$>x=/=Ȱ=@)=p= !>2Q>}>lT> 0>>k>h(S>Q:>4U,> 3'>->2>t>#=Y>t<>9>x>U>3>>>o> > ˣ>z>,7>P>=E=X=h=`=a=-|=*=k<2P;<=g=Hr==h=<>\B2>L>,nf>4o>r>p>Hf_>R>DQ>ȑG>X(> >X7==8=,}>N>$>ѫ>P>>>>>`>>N>>>|> {>>V?>><>4>,>>{>Ri>}Y>ĕ{>4>TG>oz>0WF>$- >8ֵ=<`ͼ`d k0 4 @!<˺@塼@q׃s +*P:8)$:5&U|mqZ2B?V$\Fʛy\$0hD0cQ"S(9fܲspoKO8_Լ`xH0`?޽ȲƽXP0&==$>Y>h> >n޺>_>ĺ>ŭ>> >f>p >d>ę>W>B>T>f>~#>L"{>q>>2>>4>Yc>`>=gW=p@=8N>c>> >b >>$Ug>>=vPO~NJȃ&pP  t`7PV,^tS|@L"x<]ƾ^澦̾"CP"d"0xEإmH慨d9 엾v)< |rxgA8Ȼm==#>x>>1=P====%>LuK>4U>kI>X"><=V<@0|Ž Ž%0a%H;`EY==>x)>lW1>]/>+>'>>*!> 9>_>b*>`>rr>4>ԩ>ߘ>6>Xu>Ă[> V>Q>$I>M>$TZ>XT> <>->8p>=8=8b=X==d->p9>>=04=:Uj@\LnfQ!Зe<0y=X=Pa=2=<OEdX9=`=h=>pB+>M>X>|V> _>hc> K>)>>IJ>> u,>^@>oB>H'>h={=<1@{1+W>e>LRf>m>L>hX >P=0o=#1=ȍ=4 >`/F>e> "!>p=Y(E ˣ,Ѿ-龆T־2䒾IhѴ}ھ"cpmh4vž,'ᑾ\ZþþRž>ʾrȾ^Ǿޞƾt$굾^r?bLf&yDudL<]%>h >l>xغ=`k*=04μP|7(&ʽ8.2$4KDcnLu6~ Ҷyt`Ѿ'H P ̾LPlrƾlM; P ` Ծt|XJ Ѿ*վ$cƾ8XjXC6QIx@ʳV>┾HglҖD=ȯ=pXr=xtdk>Ԑ>>>Ή>֔>>H>z>>4>>D>y>>>_>d>Xke>|>É>nB>>#>:֛>No>.>R'>>.%>`O>>R>>¢>>7[>dA>6Q>^>>y>?.?*=>k>$ڼ>9> v> >(>¸>j>'>Զ>Ɩ>r>>>pA>Z>[>>l>>>~>N>&L>Z>B>=R=`f==+=8=~==x8=|=5=H!=j=8=m!>%=>h>Ȟ>v>>?>Zͻ>D#>L>)c>dW>|JX>]>`>@N>+1>Xf$>З&> *>Pp>>6i>(>[>&>v>>J>j̀>|]>=>8>>=><>?> >>>>=0F=>5==2== ݯ=4=Ȑ===pH=(>=&=[}=z<WH<&f=X=65>ln>챑>A>BϨ>*> ͣ>؀>>Zݚ>:>|>"R>^>$>;>>r>)>2>Z> 2>а>n>T>~b>mN>?> S>Ex> >`tk>?B>>*=_="0A3hhKٽԽVý,TW 4.l&mۊx⺄xovMLd>&ֈ>꒒>&>\h>P>F>=>?>tRX>|>o>M>3>r>.X>D>|H>P]>@b>U>8>>O>=ڸ=`״=x =pT==%=ٲ==z=N<?tuV[+``p^Q8ɽZI:<`>4>>e>(>=D= )`; ݽ1,=g= >;>( >@==@==P=Ax= =>h3>,LZ>\u>Q>F>Z>;>>>>f>Vލ><>>.z>>ǘ>(K>t>N>@>@>K><>4=f<=0D=<=z=@'>5>`/== c V4P@ B;(u=\6>ca>|>< |>܏Z>*$>8Ƽ=<~'< =X=T>|g>>fl>~>&>">=0%u=N5=`#M==L>6<>L-3> >i=N@">hmD>_>tuq>/>:<>No>ݦ>B>n> >`>V>4> >J>&f>8=>2>> ><<&>L7>`/>"> >=^ Kƾ2D7 ᕾlTи%v `Q*~hJ`! 张CR@TLݺX[4Ϙ<@^=з=X=h}=$=`<` ' |ϊF̽U0 ݯ"Q<-n|兾gh %`<̽UB`zl H'L?FE>w>n>ĥ>4e>\>}>w>3W>N>a>4>/>L=>}>zw>hB>$>4===1==>T5>4xE>pT>]>Lb_>X>@H>8>P4><>N>Xn>^LJ>֢>>)>>p>B[>'>>>$P>>գ>>֩>>$b>س>Fޮ>>F>> >DN>%>>>,>L@S>h>(^>T>]>pc>`bX>GT>x_^>T^_>K>XF2>/>D>$!>E>Pq>J>Jț>`>8>8ƈ>#>4x>w}>>>q>>D>Dkl>'>¿= <`šШ,P0Hd;<=<;ۻ +(rQp @?=>= =>ütp@hdJ>f5> >a==U=x=B$><[>]>H>>h}>P>~7>N>(>֨>_???}?)>'>>>̿>>> w>><>Β>}>؁G>hZ$>> %>;>pg^>dj>O>*>=0x= νL+9WItB}/d 0佸߽ad0HUY__W$Lx3\G71(V⩘.🲾LP|xBpfw3r@þӲԐn@@߻K@k8@뼰XH~q3``yc<X=`=<>dB> #b>p>Du>Lw>}>>Lp>~>O>p/>P\>By>ܙ>)>N>؋>v>X>(J>hC>$R@>E>I>C>4>->^5>4C>[>0r>s>_>@>>=H`= =ȃ<N;`PPXV06h;;D#:?P6ȭ0p@LKjf90ϯOdoľ4ľ(¾06H~*Ңl0wϜ"av匾qڰЋ8RP8>|(Ntx*fbhZR>@ypὰǟ@_C==>(*>`r> >H=4=Ϲ缠߼o;@*=p==">6>x,L>M>=>0>,>`">P;> @>h==o>tr>(!> >@<=@Oz=a; !U<@<@<t; ` T{ ꁽZ!@0=(=P=->C>8> >J==xj=v=0==G= 5=xr==h==V=a<!;;]; < =`l7=`=ռڽ(l;0$4ɽ[o>yB5@hx78늾C}UN=l<\ O 8Ux]6n;'I=Xh=0v=ұ4>la>L>G>F>촸>T>(O>`>ZD>(=>4g>,> >>>pt>E> >"=B=<@|z0:GٲXV߽x~2$54\fX",K*+>"԰āތJR(*Js4vNઋ+Bh{l|:nBாjϾ p%'M"a^P뾜-˾񰾐ା۾׾F1e Vwо'‹niX]zp[}iq\VX.x>߽+n9@|<Ȟ<H>px=k=_=d==u=v== ==Y=@D<h#_3}t@y$],нw;`A<`<`h<q>P〽ν(½Bfpdٽ4Re$. ]\KX(3caxlEؾ0*bо(ĩ2XxF87+Ƞ3Kch0ִ6*>d >h>( ==P?=L>&><> 4o>t>z>2 >x{>|h>Y>S>Y>O>}(>x =pXr=5=B=Z>>x>>>>t:TvYH<$=UU>lHy>h5>v>ꂳ>w>=1>T>N>>uj>t{>b>=Rc1>?6?r/>*=xQ!pI=vO>C ?T>Ѳφ.VϾW>j?@(?-?v!?p>Ժs>@O-2ځz{Pdw&∽ෑd<4>P>r>>4ʢ>k>L>T\>X>TH>$>06>y>>ZX>?T?`)?(?#?L?(?`?\?4?~ ?H>ܽ>J >r>"!>[>qU>=<>S>/?4?)!?xl?>L/>Է>xӓ>-D>@= k@N C=h>=-> p>h6>⛹>x>>z> >X݀>p>Bm>d>>d>3>Ls>N>>>>Ĥ>˃>>>6>4J>?>+>=>\A>> f==üTV:רrn@3:վR侮@侪j}aHfa }Ǿ㯾't<6b|Άghl-ppi[7+0@H`X|YD"X@hy h̍ߦ<\P>X2>jG>><>A? ??lH>">>Ho>7>%>T4>C>(V>4p>o>>n2>>Dz>b>H0>>Y>=H>Y>>̭>>K>*Լ>Z>,> $o>=@P<J(J(J X5'I$ (,{ڽ0~_`%g`أӽ0˕D!42G$ o#w L>@< >f[>>>>@I>>C>`ce>;*>&>]>]>>(>@n>r>i>>\TE>t1Y>8ց>.F>s>dB>+>`=H<;Z~N;@=;J=X=Y= =@x^;<`A%=bw= >6>2Q>$ >R>>>>ln>7>=R=]=PI=>VQ>f>(>k=  LV28oZE\Oо!#0c. 11,!5{88*x= ԘxxھѾ׾~¾ gBL觾FrcľɾZd@rU/ Փ< <ॅX>(K>B>O=j$lJp\;<@=TY>$>>(=`<2= f<'AAxgP=`=-<` ;`z@0"N=6=>5>*>[#> ==h(=`e=`@>8k> >׷>>.9>>J>>ؔ>h9>U>>@&>0)u>pX==0=yǽ0ս±Z8wH#Խx~C$=:*\wΩׅ`o*ozŽ~ hYKx̾Bʾ Ge ""𾞣ξW$72 BG|kW撾>]4Ͼ̯Ӿp۾+ȾıЪ6s֞hI(7F$y]\TorNbξ|׾jGҾTwy0iY`] q@ӜtpT-*P0H dRLo첞f[ҬJ.ΈbĔ%hp(&r濾ͫl(>L(;, B$E7}voپiɾ,9~־TᾚҾؾʾž.GD돾P("uTj$zt)$"оپ,޾\R8۽@@@eMĽ0/%. !ȽǽP9P/=>W >`b$> ,=((= i,c=-Ҽ&h8'WX\N\<@B=I=>>HT>(*=ج=(=1(>X69>>>\>F>N>Lh>;>>>:>{> >R>Gc?Z ?6@&??H?^a???~?j ?!?r ?}?Sk$?N"?6?~V?B'T?_J?PW?T?K?W?W?QQ?M?i9?o4?~4?7?.>?߯L?Y?%U?Y?`?RoX?9.G?9C?L?@I?I6?1?0?@7?]G?_@?,? 9?~(??$?>rǚ>|>u=p=h n>> >o>>:>ڥ>vi>3'>m!>>sz>v>Xp>>>I> A=@V漐+8ئT@?8=d'>tT>_>8b2>@=3ihpPWWpQ=E=8=l@>>T[>t:>O>g>z>>>3>l> >]> >X>> >XIY>4$h>>T>>|8>>>Pn>k>=X=q==1>()>KW>֞> f>~>X>z%>00>D> >qxOoҋLp0{l9 "e==l)==u/=ЉGpƽ4P> >P^_=;z)ž޾徆œCF.ἰZ=7; 8=(K" 0P/@hrZp==\>Q=f<0C@"f(>(ysb|(LV)D3+PNЮzσ|&`*,شYEf𽠐H|Le,NľоCIJ`5=@=@Wsl'˾[ᅠ޲hþﹾ|8b\FPT@4V^2p9x:ضgI8-H)/DHP8ǯp*(TGmPh8xP@KF<=$#>8V>\b>H@>,>d>ͅ>ġ>4y> X>>m> 5>S>>@>*>+>Pn=%>A>$>>J>ȵm> >WI>>8o>h>8>>@>8>Pq=x =H>@x=?=,C>UU> >>4> 2)j>8D>p >k=N s ?Ax"@o8-@<=0F=<=G (wTal22 vؽ0>{@=ༀ=:>W>¥>>j>PO>tc>>P?6??J?.?">;>M?f?8?v??BF?*q>6>2? ?׳?? w?i!?,?^3>>E>>DZ>vr>&b>>?"?41 ??,?f>N`>D>1>>XX=/> e3>d/>`>=,>x|>+>f>>>)>Z>~4>hϚ>-c>Pj=Q$$U,CHY:, 5ܿ$ݾ־Ƞ愾jx/)6^üHT=8;{ 0(5 0"νP)80|Hl{c(վ߫럾ҋTJԽ 9@k8pp R@0yXhXd xrxس̽tsW4þtgcB0Q <\ھ梾4!P ۽  ^(0½P9,d6 s 0:G8н E(Co:zjdR(BʾRǾz;h ׾þȱw>=(LJx@2`AHC:TV(ohHƾxJC8S ޾mɾv&F1ziH'4/ iy8W¾f׾6bҸ&"뾐n|&2EA.%4p'P0ܾҾgɾN.\@0$_` %8qhU\ :FhLybLwBR,j2C(:ǽQj@Ju= d>CW> >(>/>0H>>?z?>>ֶ>xl>\o>^>X>$)>=VQ>L>>N>o>>Hc>'>>^>?xN>V>Lٻ>Ҩ>>2>?>E>D">t@>>a>lE> >@Y===`U=J8BD\aX4:ݼk= V>$Ug>й>ܥ>B>$1A>#=H=D==p0=<ء=^=0ێ=&=8r=@<[=(==%>R<>j>Lh>M6>ʆ>>B>.>}>t>F>}?@>0>>ڴ>>J> >R>D>S?1>j>|>c>b>Q>>H?k?C$?[-?B;? 7?.?޾?{6?>?s?R ???F>>>Zh>w>2> >K>>4@>ʼn> r>S>Z>E>D6>\>>̭>5> >̱m>f>4o>؄n>*k>E>2=>|(>7*>=;ᖽ[-Ҽ hWW` 䄾pP=0!>=`9a+E҄Tl\b$t;yB|Đ:Lip2fyB͎Hod3Bvp=@~=Ģ>x>P>L>:>"؈>lZ>J>u>!=@6<[}û$v@Y%>tA>I>x>H%n>>&;>4>>>>ş>>$An>t,>=:y@H3H0}ĆHdP#w<x=Ш,=>l >>@>x>>@>Ō>p>t'>B=溈`Ff=h9h5HCk" 䩾Vþָ;f쥾xFȾT}޾:þQξ ەØLخƾ׾f*tu;!FvF F#~y#<1%# `'hF޾@ʾN H@pȍƱvоʾ z uY Vʮ$FS JxZ퓾B_}@) =="=<,<S[=<PսtO<>tDv$W#A@ o}``N_l@P@>sͼ;;`<>t9>|;l>fb>| >=@5g=\`p-6NGTT`^h=~EA1/½0@zPU`#X;U=0=8=8- `K8SpZࢿ<]  \}> w>>>t>F> >Ƌ>n>߃>ͅ>>u>t>x>*[>t,>B>Z>>*>O>>>>T5?~ ?Q ??.y?&*?i3?W3?1*?V?>> !>Tχ>S>L>M>JƁ>Hx>>%>c4>>=H=@= =>&>S>蓅>>Rn>l{>|>V>S>>BN=F;`4̼?z< 7=@=(=q >hj>\I>R>=Ѳ<V<' $ f9^<`!rpFj~/5;C=p=8>(==>T>=<<(=0W=Hˎ=@=_x X"@aj8}|A0%AAЉG@9gl{(F$tL_0Hݡ愽t~VIپn6āH02h{xH cXBqN?gi{xzW밽ЉG.xO({KP?B,9:pOt gp꙾jϴ褥ppU[4@7Rp0 *ռ3)K@ > =(>A>ضs>g>N>>f~>>>_>T:9>lZX>E\>d\ >(==:]=*=I>>Ć==D=O>>P7>g>>@>p=S=t>[=;=0>ز >0=Q=@~_< 5 㰽*=<[ >q,>2>=X=X==`x@'>8<>:ŕ>x>r>/#>h=>==h=>=31=>/>5==:~( >:>.X>:U>z9>4R>>>>>d]>0h>0>R>|>.U>i>N>>>>F>\>pܺ>굫>>x>4̼>N>d_>Bk>@>> ?i4 ?> #>>҅>Ѷ>F3><ļ>>]>3>Mj>^5>>Đ>:>`N+>M>0J=0==!>h)>">p7=p>h=`=d>i\>(c>ko>>B>G>8>p>P>M<#8-y#;׼L= w=0;=<~`np"8 ս8塽<@!Xw>v> <XYpyH0T؞/lxZ)ϽE(tP>D5 Etr;=`),=H====E=.Ƽ? D0``;ЫS>gB7`^$ء9+ýj&ʽ۽HWH;_Ƞ@KT16`AYSP$ 5,Cs늾_h0.Q[ ֽ&_4Wz۾ƣھ@ܾ#+}06~@:`'lvR@>p5@ ^\%!&|Y*"m  dkhAоW/f}$bbZ 6@ɾqǾxTj\~W4;qHɎM녾*&ehMU/`3PPx̼֒amGd[b Ǿ:ֵأڠdn2&<S VDU%_3}8vV10C ܽ'a ;b<@A%0t+ 4#L.@;0`Լ Y<`.=D=H/=O'=x=X=HV@=v;PO ==>'1>f>xOe>$_>ȳS> 4o>х>G>>8 >T>f>T>>>2>>&>>T>h>>_> >?8???6>#>^>J>?fL>^v>>>>4>>H1>~>q>>0>~>L>m>@]>->==`Q={=v=K= >K>L-3>`aK> %>`hr= T>Jǽoм0}R=@k==>`)>L<>_>8=PvX= =@Hv=x8=<:pXrp.ln@(-NR h @ݼC< lS=(=PZ=y=(=* 3[j<=|n>n>׷>>2w>q>rt>^>j>\O>H#T>$>ט>^->>Эm>h>I>41>>;>>=xz=C[=`<KT<0H=C=>A >(<->h8L>?> >H= )=X-x)"𐬽撽݌սߘ .4c P L8xK\|; ã<= <@&;@M`Xm!le r0ɽ`==xJ=@=<6&ЮiսfPA8<:=i;`=@R<b<`hUpu+EUW^X=*3P$d >Yx} `b\O99˼9B=P[=X2> >===&=a=@/< WQ20FC$$:`<41<= 9@I:m< 7>c>=$=@D<n;< f=P==Th>Xd>`0>2+>/>c#>< H>Hgl>7v>,v>@]>pc>GW>LH>d">0={=s=j=`=%>XG>|78>?b>͘>C}>DGF>2>l/>m`>Hܮ>j&>@>>r>!>F">Ԟ><>(P>2>*>0>K>tA>?>̿L>&J>p]>s>>>ۃ>jE>X#>>c> >Fg>vO>h>>> S>>">`>^`>>2>՘>L>>rd>V>m>>>0j> >{>Pm>=>~g>J>>>>R>>`a>l#>=07=U=0a%=0!,ov0ep&ȃ)T|<)(Ux@8Z0;$_ɽ_½xHn ػO'0ѽKI}p`P\'j兾< S`KWHW`u/f J[ͽ$_MPKZ 84(>p\b$p5@7"@`ya <)=@'=n;NQoep[=[=>N>=Ȕ=H==<Ƌ@Ͻܯvh7c(,XV+L08a\LJ,oP[ャ,Ш,0D& |:,9:hHEwMԶV%Ҿ/¾)q&olڞ, ɾ^zZT Bnd)?e*n/l|nBǾ4߾>վάƾTþ:_푾 AᅾcA׾¹( HZ]農! v8^0$޾R> `2v̽nc< ZA -Vx/z)پ6Sƾ"ʾz~̆<.ϕ":*XnþJt%Fs I^,i -QLVX"@x걽xt,BM(-(D^CT0@HF# ,8-@|<<= d=]=U<`0P==n==( >i!> L>>c>>(i>sP>d->,6> >L>x=jp=6f<`<;b=@<QA= =>x==ã=\=x>ZC>>X>2>>m>N>>T=l|=Ȑ= h==S>}>h`== == >>T)>Z>p\>sP>X]>:>쑟>o>TH>V>I>ؒ>t>Y>{B>F>@>`=(a=A=, >g>U>׾> >>0>s>m>Z>@>4D>=c>o>i>TH>D>S>k>P?z>|y>>t>u>T;>>̫>4W>r>nɀ>u> s>wP>U6>>c=z===\ >N>@r>Fp>L>I>>@I>|>*o>E>2>&>Z>ʮ>X>7>|{>C> >Xe>I6><-:>]U>Tk>HN>7>|H>>oM> $B>(.N>>>i> 2>6>z>@lE>6=yG=NJ=hJ=h===H?==>X>@|>b>>ȱ>.>t>2>XW8>8 =Y=h&9>PӇ> ΰ>>X>>b >>>>@>\>=W>L0>f>j>0Zm>>|g>=U=z=9==V=G=( =XD==I >>>>>ܝ>p5=X=|n=Y< @8;;<W=C[=p=Pn=ƻcx9.ʽWɽx7e`LE=z=F<=$<=@13<,:P;===0}=L= lSphֽxƽ v<'<ϘюxI 5` Hh`|h X" P:`/z(!j T,7<c;ॼ!A`:?@\E[P(H>>g>">=p=p==YU= =) >Ж>S>:Վ>)>ё>">s>]>X)>=藟=(r==l= ]=@{*<r:@;k=0l=i:<潀 Tyah4=m=V.=e=]= X=L<DC M@<@Nm=@W=H=m=E=[=0̢=q=L)>(5>SI>4}>m> >X=p=̆=H=M= >5>>>R>Hwe>xS>,)A>0O>Tc>\q>(>xT>=Ȏ=X5= 0>L>PN>x]>~>BW> u>b>C>QU>SB>&!>=~=!%=H̛==س=0=6=`[Ddp-h罨 D> t̼VpxY0.)H$L<@ˆ=|==|>b>(=-D)^@b 7`@d>ߑb۽`p%D# 8q8lsӽYν(սĽ0ϽP\,P+Mdlx ,>+>F><|>J>p>ڡ>>ԏ>8>>ֵ>D>P|>R>AA>7>x.>8ff>T>L>&N>Dh>Y>>>8o>K>=>:>R>d> ]>La>xZ>:>HB=`=0U=`<< =p>z>~>Tj>z>~>pxd>?>0> =`=@̛<`<@ =@]= `=О==PW=,<:< TZ= ]=x=0>2<>8>Z>p>==`w=3=ֻ`]<{;H_B<=4>|t>H>ꀙ>b>lI>.=< l<8=<>8^>_>V>->Z>,>4>bp>2>z>[;>@>>,(4>>>^a>6R>>d|>H>.C>$/'>=(=Po=a={=8=:p=pm=p?===XD><;>>>+>3>6>P:>=f==N=j=H=>=Z=<H9PGwݼ:B==\>pDE>2>/=X=ij>l$>#=O<ã; .J>o=i<ㇻBؽH5=6 `P؞ǽ9+tZZP_lo8>$P\di[v!snk~m6!ؽ𢿽RǽS轜XyDaUh:c-8s8Й@(`q |;bs*@lx-ٽ5/p-艽@6 `9<%=p4L=p5=P=`n=s=PR2= 4h=`==="=p4=4>`a>ȵm>h>#> >>9>*U>==`>^>Ј>D>>`> >¦>̬>݅>\O>4> ~=]==\>P(>7>/> =^=Xˇ=0V=s< P&=h=@}>\ >l=\=n> >=@g=@&t<@CT@ fX>==+=RN`PýfN+=ؒ=t>+>T>dc>(.N>4>L= <@EY<<9<@; [>%>,>~5>(/>&>>e >Z=P}=a==PH=6!= N =`<}`ѫ' L 5P_ ]<T*t{hO.uV^`# `4̼\P>4"$0+p22X=hz=YU==v=<@ĢPc8½ϑ<"=;<<<~hj` $8fxʽ8q`֧PozX4l/ A ѽPԽڽ 7@z$4 19so𥾄tzl:gZ 뎾h0z_,]`<趾hL¾~۾0龜r hϚvЪpǾf־N 6^ܾ0ʾ4ʾFtR&¾̝ξ0!x XD:& nI\ GE`bQܾ&aƾj2Svs^R,z`;"h[ed<0ʽ@սԽpt@I@PP݌<s=?=>P}>>b= =c===p=x==x==t^>V>lt>|y>>>Х>B>ȵm>\Q>q>9>>>D(>H[>?b>#W>n>Vh>؞><>>>>T(>۰>O>>>:>z>m>`d>Xa>m>TO>>=s=œ==h=b=>p?> $=8v===(=P]R=J=<0r@pWнXH0 @L9`4̼`M<O=L >:!>>=C==\= ,<@u+p<x==p=(=>ljQ>z>٘>>И>U>>>> > >>:> ݶ>>>>>h>m>v ><>>>">>9>>>C>>e>k>n>XZ_>H>8B>P-><>>8=e>> !>ps#>p->l6> B>GI>OP>L>\&>=x= <WPOg;Ι`Լ WI;9<@':(sF@gs<=8=|S=/=#=&>Y=x=@8&>PqK>g>>HB>>lޠ>>L"{>`>I>&C>S>Y>W>k>>jކ>x t>b>f>@D0>$ >0\=`= =xZ==c> >Lp >>">2>A> K> B>7'> >N>I==`==p`k= - =`a ¼@p4[=h==Ѝ{=`%g=a =:8dw``z *`j fPT 5u^@Ws@CJ~hͽ|XU0B\Ć<S<@C<*<0> p/89$Bv[t.&;rh|eDWQF1X0_IpId),Y(CpvJ!G׽f1x_O^\9;۽hȽ0 p!԰" | >> >0= =>==b=!==>p>I>&>E>#>͘>ߘ>>P>h/>X"><\>< >\>A>D|>>'>hu>e>4r>X{>w>F~>x>ő>{>.>Pn>v>>d>">=y=0= <<22<`/>^>\}>>у>>c>#>b>T7>A>& >W>&֢>t֠> >͹>҇>>ڲ>t,>k>\>p>>>>\>>t>Q> )>?>>Z= >0=xM= ޼=Ri=d;Ѽe <_4=0=x= p<养O3 N{Žxӽ`ȽtY(&0#&+@*$ )X6@ڿ( ܽٽ@HĽ (_(_0(;p& 8(`͚;Pǽs'L-DE,TX"1^;<=%/=0e=>=\">h'F>P>9>>.>C>m>>>y{>V߀>T> >`d>S;>h;>L>qG>2>,''>hj>HG=@=\>0>> u%>d:>Pse>ی>J>y>:>u>+b>D=>[ >|>XD>=6=F=ܩ=H@=З=h=0\S=<N:<==`c=X=>e!>L >@>>8=蘬==8=ұ=@c=~== e=hM=h=>ܐ3> O>ĦM>xV>j>l>\Ff>e>rt>^>xz> 4o>tt>*>ς>> @>H|> F{>o>.>T:m>^>|Z>`>,nf>GT>B>lP>xb>O[>H>=6>8">d >ȴ= ܢ=z="w=c= j= =@==X==H=0#==h=٤=:~==X3==n>>=8=bD>RQ>L>/1>>b'>,;>,Z9>->i/>mG> V>$E>H0>X!>>p>p>*>d G>Dc>o>pp>P}>>>T>z>>U>DW>>>r>J>>a>x\>>J>>j>J`>A>8>F > >`>?I>h|0>|>H >>(>|5>y >3>ء>@|=}===3=Ћa="=` =< h<*<@`~@hKPǽŽapt(િދ4QCrn`pk}u@x½(佈2r<;<8 =:= i==<`6<@ <^ ;<=hM=t>&>\29> 5>,8->->->$)>S>X>=x=g==b=h+=踞=x=X==`:=< r@@Oz@W8ԛVpT>@ y v.@%u\|7 9Yc+4Ž޽콐YdC X& S P0}p.0'8>ʽJ tȠ3h)P\Ⱦ 9xo׽kͽ>ؽQսX0@13H`Q`I4:`< =<+==-=@)==آ>}/>9/> >=>p>3>+1>~'>@4>'P>P^_> ^>0V>}Y>aq>ك>p>0j>"J>d0>p>b>> 1 >P]>T'>(>x/>r.> #>>> >о=A===&=8Q=PG=ߦ>>P]>lZX>dJ>D8Z>t>4w>rm>r>xQ>>21>>Hb>>RI>>ov>y>8>^>a>O>k>l><.{>V~>Au>o>0r>Lu>)j>(H>t &>>^> =x=l=P\=@_ =t<nm<@T<;GW#0p7sP^_09:`&`'`Y I: }Խ$ `)JY\0S|'?pA r`寽Vwɽн ޽`*x ڽ*@] ^䢽JǽXD̽0׽`˽݌iqh;`f< ==P#=<@<2=P=x ==8-=@u=0>=0=ج<Q;1k߼ м D:~p7snŽ9 )=ARmℾ6a9:放[f&lƾeоnվuܾu㾼G*ハ@ = t 4 /plξ꼾"r곾cjǾ+оӾqо@ʾ6þ迾I¾Wľľ,¾:nP)pɴ.󻾶'ľX ߶rL!F!^6`, “fKB4>hjй̙H"{ UnD}I("Ԗ.>қ?򾗾V#t>žF<"ٕ"qx]Wx[N8&+8PD ҽұ٤ɝX ={`P/K`y`Z` gجû<`? =)=ͽ=@=>$>0>>(>|I>>[>b> >$>h%,>&><">>q>?>X" >LO >>T>Pn$>$> d>>>R>0*>X4>X:>E>\DL>L>*J>fC>84>(>%>V'>X->Ԕ3>T4>6>7><.>>@> >x>{>l=@ >*$> 7>@>A>ZJ>hV>R>ĄA>x,>л>o>h">b.>Ԅ:>(`S>gh>_>S>R>+>^=() >x)>d&>t>XC > >@>PT>k>\u>+l>~b>,t`>g>^t>lY>>x>~p>)j>$b>p]>]>0j>s>yj>_>X>O>G>C><>1>8>AU>zw>>z8>>8>~F>ܟ>>J>`>2>t>>س>]>|>t>b>Y>^>Tk>n1>o>>>V>_>DV>>>>n>*>2>>`ǻ>U>B>F>>P>>>6c>ƀ>$s>҆>w>~>8ȼ>Է>M>[>v>ޞ>⼞>L>> 4>ɹ>t>F>I>,X>>\>0>ԋ>>d>>$>xax>d+F>n.> >2>L>Y==(=X=l===k>ܯ>T>h> >9===o=C=٫=h==3=+<@<<@H<`Uh>D > >p>H>>#>t=`= =X= =:=(N=J====Hy=S>e >h>w=`== 4=>0>%>`(>|%%>x>>H=@7=~m=PT=n=x==ޒ===pغ==8=D=aݾ2ؾܾj꾘\"~[8!~DP,龼yپr1پ0ܾxݾJݾrݾݾnݾؾ`;^䪿dþ:Ƽdorb¾"p dB$蛾Ꜿ f(ӕ81n`|\\]VwPX@h0vmKXGs=jeXxGhAKP]<hl@r<>t5jcWTG>2'HaX)pC8.5 %h 0xx8彰ƽ@01X`ǽýH0^m0HC@4!x`$>8>?>P A>x @>\A>D>I>,KM>iN>@V>g>Rw>}>`e>>,>{>s>dOl>f>ic>\>4U>R>$dS>X>Ta>,r>s>ԣ>>Hw>Aj>Dd>T[>ST>xNX>$^>$e>r>>L>B>"?>V߀>(r>e>`a> e>1q>w>,v>|z>H>p>> 0>f>pXr>ԇa>Xa>h>f>Dc>tm>T>Ӊ>ԏ>ra>2!>>\>p>8Ǖ>>m>>~>$y>@_s>|g>H$a>a>a>P]>Y>T>H>Hx>>0>>G>v[>s>K>>>">\ >B>R\>)>)>vo>g>0D>>6>6P>>w>uj>e>xp>R>@ю>>>y>J>*>H> >U>|>|>Έ>P~>+>t=>>P~>V>v>$> >xK>b<>l2>f>k>$>>>좥>Զ>Dx>`p>">6>Lu>|>>4>(>r>&Օ>pQ>֒>Ɋ>Ӄ> Z{>0r>X|k>Ta>Y>l$S>J>K>KT>d,S>p@>)>+>>x >= =?>$>X#> T->\0>X.>t>+>n > >8=4=>=8=x֠=p==c==sv=@LS=Q=jT=f=Bw=b[=E/=L=+<_ בr <<@<@ =B< `<f;K `-(⁽ ە[chIȮ趄i@U8V'I*[!}@})ּ&lhyՅP&>xx+0Z8[rPuKE@UYqppmȍ瑽Hp@.{r[O Xp_^HpBؒͽXg˽hPVycZh@ܽDt" (ֽ8d̽(0P֮8Zǽ H&ؓڽ`½⣽k0ځHˎ ?@YoOPpvJ R@B KT@p ^ü@@-<`` =@$=@=@= =<+~> >>, >=P=8===xk====>7#>L7>C>L.@>x 3>ps#>X> > >x' >>>> >r>!>!>̿>>=h)===XD=]=ld>\ >>==p=P9=s= =X=h=P=p=7=%=^=@==p==h=`=ɫ=|=@=z=I=d==`h<֒;6/;m;@_<<<<`<"= 7=r=hi= = =pd=@}=x_====!====X$Ʋƾ оvվ9׾۾ᾎe辈sJ.)A%c"f$re<\ 󾰷FjXN]i<t~T6꾤߾<ؾԾFѾHо|9ҾҾоҾپX{޾nܾҾkɾ^/ƾrƾǾTZžؿb鷾zdlL"lS겄ͅıمzlhk `P4CDW?l3?d;?@\CLGDyKxOTYT>p22>`B>,J>L/M>K>@H>lM>ЛZ>`>Ce>'i>c>,]>Z>|V>|N>OB>38>X%3>1>l3>4>P4>1>6>pA>lH>K>2X>|g>i>̏a>W>|(L>C>2<>=>J>:U>X[>HVf>P.t>D~>xax>3e>xoW>l{W> R>J>^G>|H>9H>J>X8S>`bX> V>T>V> V>8dL>Dx>>7>I=>$E>G>9D>B>@lE>K>8eY>|i>s>oo>da>`V>xN>K>U>ej>T|>a>>>e>x>PK>:>>>>>a>>> >Vϡ>r> >2C>>F>>Ћ>&>ʊ>(>܋>"/> >G>̙>><><>Ȫ>J>4>>κ>>G>G>v>X>ډ>%>>E>>@Y>>6P>t>ln>0)u>w>`t>x>:>xJ>j>B>;}>f><>p}>tTr>pu>$x>\}>> >P-g>'^>q>~>tn>M>4>x3>0C>:U>d\>gI>;.>L 4>Q>Y>:>>Ȅ=Y=8>Զ >>==>}> > =R=2=X ==H=R==`=ko=@h= 5=K=P7=`<J<nm<@QtC긽ͽ(׽ؽ{ƽxSptȒԽp 4db`y d4,AٽhԽ)ȽĽ`ȽYνP\Ž󰽠*;н(ѽ8½6y0˕hX{@ϊNPz@ $ >H;N<&< '.=iq=Z===B=0====Е=X=\=e=x(=8====H=E >H>L>2>pa>$>Ѕ>D >v>0=@=@=_=h=j=` ==>0 > >t >M > >d >(*>h{#>t-%>|>4 >(>=P?=>ԥ>> >>>>T>T>|>d>Щ>9=x`=ء>===>.>L!>4>؅=(=<=p===PŨ==v=S=pF=H==0o=r=0=j=0== ==>>3=(=I=x=P=x=H=_===`=4==i=P.=S=X===8=(=&=`p=-<Լ@ .@P@=< v<%=2=p&=Х=p=4"=p,=,=pR$= = = ]<z<d r (/^@W @u@N8'WQC𠥽m(hlj@Ľ8ȽPܽhK$=l %0()81>OLUJhl71t/?(H4D`Jx`yL8.5 (?~X\CXȾ о}վD־ھ뾨z0リ"2yj uFGL"(&,zg Xq Yz _[徤⾤N/:< :r߾t ߾ھپؾ`rѾ@IƾƾZȾ(򝲾q쐬ϫl3,> ŃzƄ^pYu؅{?vy^pq{rqtÀTZwMUKYhd`d@JmH ~ǃ|mqXP38' 4(sh!6$Q LhY,<KԽH ½X p@13}6@Ԕ@DZ<@k=^=t=N=0=k==I=[}= ~==='=x}=x=X7=~>%>*>}/>p22>,0>+>$>:>`>Ж>>>=>0x>>>0>>k>\/>$>&>F5>L>3W>k;>J>`.>L a>>>>s>d a>d>0y> >xt>e>8ff>l>k>In>-|>[o>lH>?>O>W>S>@*G>O>i>th>T> hZ>e>_>\fX>R>lM>*Q>1\> r> t>5>u>> > >JQ>R>">^@>$ >3>ӷ>z>>H>>>(>4B>Xݚ>>\>[>>>`>>Q>>E>r>¶>`>>>Hʛ><>u>4˯>>>@Y>҅>@7>>ڞ> >">p>$>0>>>s>F>i>ڐ>ʍ>h>H>—>0>P~>$>FS>> >Hڔ>jh>6>>*>܍>f>~>jx>>>>h> >>>A>:>(<>7>>6>H>>l>>X>n>pc>t><Õ> 3>;>z>Ԅ>H>>ҏ>Hq>hB>إ9>0B>K> R>l@> ">/>pc*>kB>xO> <>e!>1 >=8=/=u >>=p=Yc=@< *G{߼\;};Z@ b^ü`J<.0ܽPȐ@:HQ7Inm<pGSƻ' U=p=5=B=ȭ==@Q= '.= p=`=1=z>J==T >9K>K>8/ >>p> >>@_=6>$ >==>=ķ=8=`v==(= >(_==s=>41>D>\>*>H7>p9>lg*>`> !>x4>> >C>>(=2=>=ȣ=g=N== =E=(>=K=`i===`&<5ƠН =Ш,=pV=9=,;<p=%>Љ=OB=0=௘=8==@[=ȵ=04->3#> =<= =8=H==L=(=r=C=P<=|==a\=cv0 <+F<=pA=)<@olڪ:p;=hH=@-np{~X3ƽLa xՓӽټZ=5K=<0W<@]=*;閽p0PFh y6(%yUDWLp&L)i70ؒͽB.(6PnؽHBhG,54t|i  1K|Shāt/پҾ #)Ⱦ0%۾d Ծ&¾ƺþyپڵ &ܾѾPϾH F tFB o%x   qTCU|m 0>VݾپZ־Ǿp1پѾփǾv;Ͼa篾qƾپľVXD`HA>˓b$;+Fʁ2㑾(NtpvJU𭑾xP>m8vTk\Bf8~4ځZbCdHJƁ:KI DOFZRч@>/svmR(h/` >Y =?$(P νXx뽐tY`۽P|ynp<`,p?>X=?=T >pr= <調=>8=p=0==/> y>`>@=@p=ܴY>\r>BX>o>0w>8O>du>g->=>cP>z>Ex>d >xŚ==X>>L=>;^>&+>0>tSe>TД>>;}>i>y>>P>>$L>=@ >P>>U>2>y='>n>nx>~ޙ>q!>>x?l>7>>j4>D>{4>>>> >(\>,Mg>r؆>݌>>Ӥ>P~>V>U>>> >V>>~>l>>Ԇ>>X">⫲><>>z>ȯ>U>~>V>8>J>>>t>$ו>=>>,>P>“>>~>9>>>ơ>>>2>j>x>Vh>N>>>K>B>|m>>>>>R>„>>0>lf><><><<>9>6b>Ɵ>>1>>ï>d>Lׇ>>>!>P;>>>$>Ʊ>~W>[>>B><>lw>c>>ʬ>>L>>b֧>_>>>x[> >F!>Np>>V>sh>`q>>Ɛ>8v>H>=c;>8h>&>==>?>FX>(N@> v==>">`>xP=pU=蕅=x(=o=|>e>=%=g׼*< 7>LC>P=0\@`yh=л>=@!===0=˾=Q=<^ <=|.>U=@<='<^<,k >>Zp=7L=`,>8@&> =]=8=@=x8>X&@>> <:o=7>^>=@<@i <0F=0>>=?^)$>xo>(=";`f<=h=`.=@F>=;'<ƒ===`@=<;pQ=='=`U=@W<|=p=X= >@)> =,==4 >(>Z >X===`S==t=@<;<22Jbr@žWﰾPĵJ/j$̾ ɾ6þ4ʾ-оBZ̾xϾ\ݾ־ڳ̾Ѿ2ܾ&@B:rC> f&侞?!}Nevx>ڰ 5 < l'ҕ ||BϾʾHEЊо>ؾZwľ¾I¾8¾Ѿhqƾhʾǟ;Ҿe K~̋(Ȯ@w>Jwx0LOtjO2 ^XV?bx}Xvn>=௘=$=>h[1>#>=V=n=t,>m>Hy>$8>&>0}R>XP>\3F>>Q>z9>>8q>D=>6>$>>0E3>0b>\>\eK>ȏ->pc*>jE>ZT>Ҹ>=>D/>E>>>Z>|[*>>;e>%>E>_P>hO>P-g>F>>:>t/?> f9>lC>H>>ʼn>V>Ԃ>{>>ʆ>Ʊ>Xv>Lu>e>p[>Nb>g>T>0>x>8>(U>`>@>#>]>t>`P>(>> >۶>4>|~w>6>>>&>>>F>ܞ>DE>>>X>>>Ԗ>DΛ>>>`>z>`Ɣ>>8>ܳ>,m>>Ћ>j>V>ԥ> >>g>,>ٷ>z>G>n>}>|8>|> >s>m>z>(>>ڳ>+>~9>D>>>B>,>>j9>>44>>>ެ>8>x>>ċ>YN>F>$>୲> >J١>>>t>6>@k>^ٚ> `>ܰ%>,k>jX>>VG>*J>zi>q>Z>xJ>8h>(; >H*>4%u>h*m>>h=$>=@=T >x=$ >ȀA>">hz=/^=@%==,(>>p?l= j<^<<=F==3J̻VJ<<&<2\ ``6=S=m=mͻ=<o@x @p`=$>=C8;=׻0;Tp!ӽ`X<= tLjE! ׼=s=PWSo 0?B;TXU"$0ֽH0x:+vAhֽXS$ĢM0[z84ȥt2kPbЮ9Q|H0ܽR鼀?(xd !87ЉGpp̍= > e3(;l>?>>L<`c1=`j`}ļ8=g>Nb>t=>(q=@=`s^>6->=_ =|&>,>}`=ؐ< >z5>U=@i<ZG<ء>L^>> =8=m,>; =صf>=>H=J;)`< 5u>Pp>4=xԼE=J>x3>=/|!GW\H>@N>'>= =ڣ=\P>xnJ>C=P\E=xm====Ч=h=`=ߊDi>Pp=7;=H=p=<_=(>z>OP>*=tPO=|6+>>>H=ұ>>P=`0z8=< ¼`š<< i,=iHc"+P〽0$h nm߽h0ܽ^{ E`OOƠi:DU% "0]<,Y,d' ߽ ?XTM0˽03 ضZ NDpϼ[\dKȍ3P@( 齀Ij־Ӿ H:R򆾠Jry{:ķĶƎ؉4}|V |Ӿx[v0 d. J־zz+ݾXϾϾUv{Ͼ|ξ8#`# z%: wq F4gپ$wmXκ ݾ叾BӔ 8 ؾZܧ,r.pھV۾ʠ߾!Ҿ,׾Hh{8xĆZe @&>$4橾5%/ص:)ll YeЄd0 yx;lز(lTAhz<38,~ǟ0KQ56.M/đ *ռp1%02ǽ/b0VϘ VtA0[zp <X<*bC@%݌ @F=$>Ph=l7q>3^>D=E=@,=t=`&>HU>5>X>><^>=U==>ԏ>z>%>p==U=*}>V>+>@%> >7>M>0v>">x=$;>?>Y>D><>>iq>>w>dK>>d; c= >D>ß>Tj>,>>L>\>hG>A>L>ט>n>y>=ЪF>:>>>Vz>\>Z>->4>b?>B>>b>>[>T>M>`>L>~>j>p>$>>d>`R>^>b>j>>l>|>>ʎ>X>>>r>B> >">C>>>96>З>\>Ժ>L>3e>0$=b>>}>fL>ٜ>x[>j>Ř><ԛ>v>VH>2>|>@>,LZ>X6m>2>p>{>>fZ>>>$.>>x>,'>s>xN>o>ҷ>~>w>FT>(>>>m>.>Lȵ>e>r>n>>>>r>hF>P>_W>:>\2>ZW> 2>O> >3b>>L>m>`=G=40->0E>>˟>R=C=M>>>X>>>Z>*==@I=9<}(>0!=0`@`<>47> >`!V,mL=>>7'>6G[ px@ZG;@ٽOI `Y;uH!0;= S<XH@n_`l_B<H?<>E>> De=İ=Hͨ=xQ==#&=;$=>1=>Ȑ=zT=X><>xI=T9,>j>=~=P=,>PN2>Pb=p=>hi>H=0ځ= `="=H>R>8>0=<@N= f9>0WF>x=0%u=;b<,H&>>@:@>a=BwX?>pu>x> <@`?pax=u>ti>=X+>V=| =">d,S>H>;(㎽ < ӻ(p=}%>u>@=Ѻ8 3=hЍ>82{>40=ݽ^S==6N>pfQ>}=u@<W=;30K@k=%>F`Z;l7Z=05=L0Z *5P.h}2,'e!=X;o40"N@Wsͽ 6%==w<$H"ѽJ=a=06 ߾RӾVW,ezYO޾l~O.c:c` xl8+*+۾ 1 B |ԾXھ&f( KP0Fl c v\ɾF횾HXXž ܲپ:Džrʾq6e/^R8 {z* PtN̾l\51j潰/^>Ё߂bpP-4407^@k8ؽlp_gDؐkPI8OLt`J e@ol%$ 5dA(ҳ|{psl;1+Ih ;7׽hbKЗ&@,r;(lJ>ʽZ۽@#ۼk@| ȳ=8=ڏ;3@ռ^=HF=x-@`"@=؄=Y=qj=KJN5= =@=y>> X=OP]\>Z>= Q=p}=a>F>7B>ln=p==i=|l0>(> = > ݂>`>>C>=p>m>">_>3*>?*>44a>=>,>V>[>r>< H>bĔ>>-x>>X>F>>҉>P>z|><[>ED>e>Hݻ>v>E>Jۻ>,>L>8}> >By>ji>VH>v^>>>>> >J>>p> ?'>џ>Z>>Z>>~>xL>V>>H>>&>a>7>Ϝ>K>@K>G?x_>|i>A>>v>i>>>>NN>Jc>Vϡ>Է>F>`>q>\"t>Z>>>>4S>~">>^>T>K>B>|{>>>>[>Nա>^ >\ۚ>ό>n>>r> >ǭ>>@>`>p?>t>>(>0x>=>>80>x>4>$An>“>>>6>>׃>B>H>z>>>8]>@>Tb>1>>쀳>2T>pZ>|>X>(>x(>v>\>1>p7=pU=&=Dg>yN><h>>G=x]=j=`=p==Pk=[;@!<=(=hVQѽ02'x)$<_U6\R`N߽ e=N=P"8p]@<@ㇼ.0࿊= =p+L=`=d>(Bh̩q`ԃ-Rp>`½x|7Ƽ='<޽l=>=C#6X bƼ=`=`&=[*=](=7<`Ʈ=&$>4>`j>x.>S=x;b=>.>;*='> >A= 8<`o^C=y>p[>X&=t=`<0ff=$>"X>$>İ=n =@id> =qj<=/>W>y(> =a =,>>(>eg>Ȏ=`X{=>Fv>hu>0<>p= 0|=$R> >4>W>5>Hd>4.>,>`p=x=,;> r>2p>LV>C==_>JQ>+>t'>==]!> ۂ>y>d@>(=ʝ>_h>1c>@!>Q}>x@y>=@P(VJ>=;5/I SM=n5=`^߼20= <@V=8b= M/hϴ(ĩ= =Ԕ;@b S%Y=lRǽXy5/L4@ϼb<񲼠ۼȼ V jxx"`8P;F=+07@ ޽ ȼ Ӻ$ ~4Ple0"6 t?l`ǽdEl4NӾkH"@?xi V޾̎6վ%/䖒־"!tӾ+JƁþ* ׾ս`ri韾M۾sᄄǾhھR);DþU򌬾Ѿ0Z+zѭގ;XؾXe8ƢҾ: Ⱦ-(hǾ*ؾ*Լ84Eg\ٚ&->ʾ\B̾ѾX;u¾|$`Z@:t^sf亾||]c̮z~澲 ҾS 8.ǾrkCWdʾQlu40D y:>nžޟӾ l ̾ھ>վ\ꞾBΛnܿP8v}p?¾@㻾瘾aԆTUnbાjn3HPhU`~Lnd[,D"\/p) 84> 6$s?%˽`Eټ`ͼ9 "؞ rika H-Wܩm=˽h:\==pk%yc Pp =0>X͡= ¼@&===$,>T]R>u/>P=R== >s>4>{I>pt=0=K'>H@>ljQ>>$>s>Q>8wl>>dg> V>2>->>&>_>\O>j>>>$>*>K>>4>;>tr>LR>y>lj>~ޙ>\>H>L?u>">>vÚ>Z> 6>?C>^>li>Ĕ>>̍> >">r>>>t>&P>1>*>0>z >ZV>>|8>N>>>>x]>>h>_>Zg>l>$>>>x>@J>R>L>->>>>.> > >>}>z;>Z ?>V>֤><>B>+>>*>>>>>p>>>><> >v/>z>>>V>?>?}>ל>~i>R >">>>t>=>ba>L0>>:>ƒ>>>4>>>f8>:>|{>pA><-n>>>$A:>h>P>ȥ= >P->@7>| >==PƵ=Xi===hk=#=@04QЭmKTRDp>_hຽzP6Ps1߽̽@':=Ľ̚l;@ csͽT0#[n<0> ƽo](=h 78K$ǃP+ͽ(),lh8SĽEh `0`;X+djp۽˷0"S\G/  8^x$B(`MϽ,$ PR齸D(+۽H/Bx2_4XBܰ%bJ ɼ@&tY<Кͽ:7+=W>8=ii;`i=`]=%=0!=`E<@@&=P=0/$?:^=s=0[=u>=x>=()> #5>h_= ==8K>>}=(=pM==z>>=`B==m=@a<=>">>c=====4>=x=@_ <n;8=k=H1=<<@<==8p=\908:ž&ž̾nԾz; ־"FyƑǾPþ.׾hKXY쾬Ҿct>žJᾖwɾRK@ܾ<޾(_ƾĒJdž-Ⱦ;;`K¾h Ardxӓ:Ĉز(j@vJ᰾4c$b4َ6>Lāp:t6r[HktgljbTJfLd5xܙ-uDhL=h D́\3zbJI戾$愾vJa/}tr㫾٦LxӾٷþi(ȾzܾrϾ@8D*fL֔3XݚnTch@|v&胦$OJ/"ĥd W_h[(< .+Ih߽j@ϽȔlGɽ}%ͽbxÀ ޼; @'+*>?;>R>Z>Hj>L>*>P-g>">N>nm>Dc> k>k> >>>>^?>>>һ>/>">>:s>>>P> x>ĥ>%>>>L>->">>>x>">c>O>)>l>>H!>(+>>.>>:,>t>F>nD>*n>>2>Ņ>>>ԋ>>8>u>pDy>*>ތ>R>p>P\>@h>)q>L>~'>l>x>l>I6>TO>L>?>l<>2>0i%>H*>^5>9>6>=H>Vb>}>9>>|>>>Ξ>0>r>>>Lׇ>H>>0>V4>z>>>hX>Ȓ>ž>><>&>->6D>>$>M>>=>?>(?>P>>J>>lH>>͹>>*>>i> >Q>~>>v>n> %>T>l>>4>>5>Ǿ>2g>>z>r`>D|>P>Pse>,>8">>T><.>cI>8N>`'>>x ==T= >ܩ=f<=@n_= =P׻=h=PuK=̛;'׼ \xKXz*Idpkj`Z4C<5L^+I!\h/Jiꑅ @KA нNNllz~w؂Tf5d-+0<+#LPojiOĐ:L0#?=[Pн*Ͻ2@Z2>8>x==`W=S==>%>>؁>>V'> )>>4=@<)`Z=p=Pw=`== >L>@~=`>|:>L>Ԩ`>Y>:>{>>>>F>*>">_>n>$>J>t>z>>Ъ>*>>>>;>F>t>>w>>>>@> ?_?L?v?? ?V ? ???` ? >>F>1>9>⊳>>I>f~>ϟ>h>@u>DI`>tc> >>P>=pn=@{*<_½\00yRa(Xh/t]J` hT|6+,Ua\`ZOP=/<#d3_BH0`ܮ 0Dȯh{#\ p *}GLb_,Qh(0%HXz%7A>`,<f`*$̽h7\ P9,@\LЈn?v8k(O+8Df+t-8 !O;+}rm6}`O#X"%X4@0"8oHT̽սbl4'90jHrB dhF+(E Yduz߾Dn#lFž$/$Ⱦ0F`c|nʧο.ܾ澂i񾨌J@ ҷ N ۾ `ɾxվJ2"JZn.ZӾh¾ #U¾ǾtȾrQ˾$ʾPǾV,8Qݫv+LhV8%Xn t<0ܛc+Z yԽڽ6@<S[==Q> ><>=l=>3'>'>=5> >Li>!>>> e>f>Lٻ>p>>|>db>q>*X>w;>>>$>.>>O>:]> >-x>ȵm>dZ>WB>#>L=P_=к >[=Tx>=兽}߽@ |@=`"J,\0Dd\@bpxؽH׽(]< `; ͽ4paL.TCV5`c}p1%G ,">I>0q>>>>{>~y> >>?>L>>|>3>>}>>>?8???VF?JP?C?8 ? ?Q?n0 ?=?< ??h>B>V?^?E?>P>a>v>nd>t >H>H>ž>\d>w>>~5>>d`r>DU>d;>>Л=H=͌=< =;4k,7 Ip8Ƣ ξ G۾f׾^GnJԾĵӾj{׾P_ҾN[`򾼊Ro>p߾2Ѿ ˾޿,^`8}\2mL`E`8@Nm==L >h{#>xbi>|b>G>=>>H==K=,=F>R>j>>>>Hw>*>Fp> >z=d<@Cj9<_4=PuK=R=Pk=ЫS== =@A%<^<p8TӽꜽX@y<l;<@r2<@n mpa c(8X4!8=:ા t*҈L2b`ؾ=% L e6~K`cЉ>־/оlٜR2LR~%巾_'xֽ`0K=S=Pk=P={>HG=X=B=׭=#=<=!<@d>$>dV>p>|+s>m>Xa>80>=4=B=0 =pR$=0ێ=2=!=\ >آ>xH ><(>(">h= >(=$=8=Փs<׃=7I== >>>x=X=h==h==>C1>>H=`l<@+Լ2~߻PT=`y=Y3>O4>Tj$>h%,>$8> s >I=5=0˕=0v=<@< p(>R= =Y:==:=*>k>H>>ٷ>XE>>H>0W>T>ȸ>|{>Ȭ>(>>>9>>}>>M>y>n>><>d9>>a>>N>>>}>3>>>>??v:??h?+'?`p? S??l?x ?W?el?%?r.?&1?B4?^@2?5?4?-?-?*?&?Έ ?a ?|>l>">>B>??,(?X.?N'??n0 ?>0>.ϕ>[>0&N>2>?> C'>h]>6>ٝ>˦>>ȋ>t>lV>=:ֽdH h尿@8|X7:0$4,9:2J$1uAȆQ싾P〾ܡmx h0x>x t!c&Ʌya2XJh7 >==E=X=X==c=,>&> e,>5=>^>Xi>^>B>84>>M>0=0=>H7>S>,>0=b:Hܔ8ԛދjx8p;}𡲽8oҸFT rAҾB'  " +6f<#j<>4>(>%>X>&>,>3I>Q>x\7> =>wP>V>0jf>|i>HE`>e>}`>V>]>`Z>(U>dH>$>>8O>X|k>hu>>.>r >M>`>XP>/P>z[>,]>@o>:>r>!>> w>,>>^> >>>>( >|J>n>Q>䪿>>ʎ>+>ʮ>ޞ>ԏ>m><>8> y>d>f>L>+>=`A%=żl|_^;=S=`/=X~=?>a:>@:@>FC>h@>=P=x>.>>p=a== >HH>Gv>Tx>Y> >h==`״=J=LQ>f>2> X>y?ס?}?">>> G>J> v??B"?,?~3?0?%+?L#??r?a*?r- ? ?a?D>@>>κ> ̰><>>~>f>\W>|9R>F>p1%>x;=3<p = XHоxX(X 0qؐB־P^ݾξ C0tjBΛ0͕ڗ".2˕ aU0C + c0yl L@ t ̩VtfZH ̽ j'<q=>\ >*>PqK>,]`>R>+>,(>8c?>.>`">p > >H > >f>O4> Q>`>Xh>(P> 4;>$>>$>4>Iq>>r٭>>&> >46{>h= fh)Hꪽ@U=(==<@Gs /0^m(Nٽ:d{4RDооpƾ*\(}j[+8>{a wThv匾oxҦl(vlTgF(/g@B@C#< .<Ȟ5>yt>R>\>xm>:>d>|8E>]!>\==H>T'M>>S>>>nU>V>j>rT>Z>\yx>Lׇ>->^A>TJ>>> k>rC>Hv$>d>>=<)>%><>*>pVX>:>R>> 2>Z>h>8 >`_>ω>>`>w>>Lu> w>fb>`2m>.>W>>>H>U>&a>dp>=>8 >ĸ>Z?& ? ??g?2>Np>k>dB>C>lI>ljQ>4x>R>p>"C>,>>f>l=<4:<(q=*= 0>TO>l4><>@="LO*(Eh[sz"j$nW4g\ـPD[ #XAL}F Orj)bc޽ p@I>Q}|1 T<=@|==`=#==0]``g0eY]N=O;>xZ>|Ke>S>t-%>)= J=$<ߊ< ]=؁====0m=PO===i<[ &<@ =І =`<E;`7< =P<#iX/Ik<ݼgnfѾ$ T *07Ծ'ľ龾ĸv¾*:Ǿ̋Ǿ>ؾz´_}bP(J/E526>:3#Vd Ҿ#ɾ`ǻlN ¾hǾNp^ǡֳ( O& u,nCHḇmȴ`S:xp` ȼ ?LQ%> c>(=?=q;@< =;=H>̞M>r>Pw>xn>Dw>>jx>>J >n>胦>\R>Lȵ>>2>>> >2>? ?4?b??<) ? f?&? ? ?3 ?? !?v?Q?6>4>4>>>>Z>'>==`DL=*=إ=4B>ڟ>p>>6>Ʊ>r>>^;ν`<:rt0GM8)\ Ĥ3|Nl0ks,^@Hܝ9@x ڽA```,Ӽ˼V:PR2=Pm=q>oB>D>K >v=0@&= <`>:>Tk> >.W>>Pq>@i>@>n˚>Ͻ>$>E? ?W?* ?p>>R>x9>pg>t]> i>:>">֥>0G>b >>n>>>f>0X>V>ܿ>ϑ>|>>^>۷>|> >L>*>m>|A>%>,l>XC >c==x=R=pn=2=)=Ā > >>=s=13?нxnJD20.Jɨ@k: s?=<@[yU᝾D0hL,8tEsǓ@Ѩ@j`(ɑOvxm=Pݽ[! =G=t===Q'd㓾wO}4O/DuhG` @1Y=Ь=X" >,>>4#[>Dh>@Nm>#l>Jp>Ho>hb>8J>xJ$>,>9=>8a%>n>:p>:>B?҄?K?ز?:?Q?D>p>>>R>> i>n>Ω>>#>>ڎ>2>fl>$P>ت>ן>>@r>RJ> B>8==iq=[==P =V== G0Q0Dk@7Mh你8 fҽKuGCoX/ c$<(<-E p9 ,r|`65@^潐8r@13p;=p#=y >%>+>K'>`>7=v.=qjP-м |<(=k=>)>`G>[>xpd>ov>X>R&>P>Pd>Y>\w^> c>0\>`>~m> }>>>t>K[>B> u%> >P==Ǧ==4S>O>4R>(>z>攒>,|>W>j@>$/>X >:>= =m=`=C= =S=>A/>cI>R>D7M>0(>=pc= <:P`K8,+p@j+=&=(J >lx0>0>8=<1؁=@ =7@%:g0܁}Z6!hW dp3[BJ4W VXA(˽ b`(;@¼FJ@0 #1) &Z<=X=>`D=po= ?< p@H@DZ< P=0=>q3>,>x>0\==@e<;$><@'==`&>@;M>4p>Fˎ>r>>n> >>T)g>(I>->h>pY=8>`>X.>8?M>Di>!>>4v>ttd>|IK>">==TH> >̈>&===> 4;>'*> > >U>k=<ȲƽHcR'bbr4Hl; <Ⴝ p@Be'}uLd#L<C~6k0μ` 8wн<ż4=n=஋=l=v='s= *=Ņ<;<-<N=0=P=.>V>v>">>iq>L.@>\>$N >d6>Fp>ϑ>0>k>x?*|?(>>rȧ>DZf>P >`T=pf=>D]>>>.>VK>"???(>>ɷ>>?>@>n >>2>h>>>~>E>.>V>s>J><6>|M>k>n>y\>YN>oP>x g>b{> p> R>1>>P:>h=@( O>#*>z=^= hD2 d,{p G'(E4bHq[P0pyq@ h >=== =,=P^=J=H!= >\0>V>c>SP>>`=U;`.m=@塽 =C$;5=@=ԥ>tN$>:>>>G#>=A=F!@&YP8spO@@&(<בPNHǘH̛@(½@,L40-H'@$pL c 8;L)2hJ_: 1ꓹ˾Ծ˾^cv4WFQ80aRှFxYIf&~$̾z P~Wnо ʩDe/^Dj̍{|t@];PDORtbQiG9(0P[8Ux4@p6 N,)uI\"0P^߽ڽսw½8绽pL=l]*⁾ۖbZܧnԉytUU2+X c:$p"J &+C;#Wz ˊߜij8\"tYWWK#Э;~m==h= >V'>lh7>05:>*+>G>ͽ==Ιμ`Q@%<0==x+?>>>l>ி>ݾ>6ʼ>1>>>>>>D!>Bp>h>Tp> $v>:>Đ>>>b>>>&>r>rQ>>b>h>Lr>>J> >8>q>D{e>p>!>m>j>X>vխ>(=>8>T>u>Ht>I>}> >l|d>tC>n'>X >->pDE>ha>|n~>0>N>vT>s=L<Q`b`8R0X=x(>R>v>d>^{>3>=8=`躽,|R0==HT=@=#?=0!=(<Z>~>n>J@>>> >>>>>@> >>dn> "U>jC>C>\ge>dҍ>D>J/>f\>$>R> >F>І>4V>x:>l#F>(i>R>З>֙>(>V4>x>\V_>B>*(>p>>+>U(>ܰ%>h6>hO>$Da>xpd>̯S>L:>\c1>0>`#>q><>>x;>,k>=>,d>?>ps#>=X=?^=C[=pvJ=0*==@y< <<<.>3>=QY꽰NCs4`}(<0}R¿=HCF>|>j">>0#[=PJ $JgPNf ;y꽐z0DHۇsͽH7`] w)qCt > #>X#>==f<_ ˜߽0C:<P7@j9($>>X2>p=w= /=ȓ=ȍ>X.>,7>7>P֮=2<=&߽#hYcbrIn>j">J>`>5/>=pk<8۽HX0FȻ] 6U>P>r> i`>+>=0V= <@':`.9>H4>4>HR2>5>hY=@hr<jދ;@< ==Q=h&>hP>@[>hI>%>X&=P7=@<eʽɽz4p&==X=0=0>Q==٫<@LӼ*UPkxH[TpYp}`-@ .<F!*fpVXWD,Z9,U?b_T,08P􆽀<?=0o=q=@dd lfHD"0F^ (= =`v=<K>e>tu>{>$k>0&N> u%>=0$=eu<ʝ!NQ`K<@'===<I<$?:[:i:<< Y< F=H_=p=X=X= =8.==< િD!| Ȕ@jBi2 m#=H=p >w >=+8,j'\n0`qD\D@J9tHutӽT(ھ 쾄}ƾܐ8tET xF(XNܱ|ƾ̾8˾j~!TP 7ngWpA7޽ ( 3.4K'M!C*<WT0oav`@̾lɾľrXpT'HϽKļ!PƵi(ov~\Qfk<ïf d)<@LS=);L<u绐R@L RwI0U V_B0Z9N(,F ̩R𽼹84v.p`AؔpEu=l>8 H>`->xK=ؼ %j~~ϭ5^rv)b۽RTh0yp0.x>߽g<)?׽,< =`a=m= T=dl>>i==r==P==>9D>1j>p> >->>6>`>Jt>z>K>X݀>\yx> A>ߜ>(>{>> >>4><>8p>R>HD>T0>x>s4>m>q>V>n>XE>_>f>?B>\>@=؍=`=h=>J>4w> >V>>>n>t>d<>=0=ko=n5=>= (=pF=@ U=s=(ּ=>ZG>T> I>3>л>8T=-Q>V5>>6r>dMR>8="<d;1==8>`v>ꑅ>xj>t-%>H=A= j<;"<@6=>$>>e>1>:>f>Vϡ>R>Ǔ>vm>m>X6>=8=g=x==>>>3>>>؀:>2>$>>>P>3#>K>tt>t>Xݚ>x>ɟ>ڠ>l>>@=\Mh'"mo<@b==ȳ=R>===`E<]D< &<~< o =H=X==x_=` >}!>>=@X=\=<@(-=pS=؞=>t;>X>r>>>>>T>8>P=p=0=bi=09ZG ;`'=(=4>xm>5>>&>f>>~< 79Զ?0 Ž04鼀bqν *(/1%Ct:`j==a>P\>p >,===P=;=@u˼h(M罨ı1 Ѝ@{P Ι;<Ц= 8=D=P=`l<@s< << V; U<Ϙ<] `"@H `5XϽ⦆ǽp:iqwI>8> >j=_=yc=K;`` :g=P==J>d_1>H>U>z[>HH>%>xO=0X=x===HO=P =b;3;<396>0E>X&@>6>`(>[>D==j=>2>IU>p>X̔>Rk>΋>Vp>l:> %= =<8[l>>2>dH>(OM>E6> >Xή= Qj.>%>`=*;K4u80@뽨c@ؼ05=0i=(=;LPp@)PY|S` ;$=0I> 6>>X͡=p9=<\ͽ@~ؽŽh@½PZ@VfX-Ѽ` Ѽ`& ɂG:Q;;SR\R㚾TH7>]g>>>H>No> >>>?>(Ԉ>r>T>l>|>&>: >,>>1>O>>lu>ܐ3>>1==p=/#>N>q>j">~#>NՇ>D~>o>,\>$ O>X>ضs>>04>lv>*>B>>>b\>˃>C>>xNX>7>,/>*<>PT>Pd>\w^>TU>m`>o>(o>Lh>&X>(B>Q>߂>>>TG>= =@P̼;s=d>dO>ħZ>L#>===Ⱥ=8Ƽ=p=|>i(>$s?><>`a>=@=烼VPO ׼˺@_ ==$R>d~>`a>>>>D>>>m> >Xߴ=L=< <J:`j<r=x=D'>8K>dN_>e>Ld>Dd>Ij>P u>>T>L>>1>&>x>(B>=p9=W@hdp 8P=0= 8>4w>:>>|>\>†>m>J> 7>8>d :> />+>(o?>9K> f9><)>7*>,><(>Di>>@>t>$.>:r>*>0> >ZE>>lD>Hw>h'>=٫==t0n7e=t>31>.X>r>K>`> >*9>0]>@=4=&ؽ p 3۽拽P= )N(]5R,j2<;`p=_=P=@+=p=ug<ʪ8 d+Fzr~#e?P/1(9&=觘==6=x== = =M=#= =E=d=n'=!< PWP40~_P-h<?=p!>,]`>f>Ъ>ꓹ>>ׂ>C;>!>=<` :P[P>>Ғ>>$,>8o>>1=O=^= ==&>L>-=9{ڽK <4Qo4'8ʽh$ӽLAMĽP⿽P\pJ>˲>BR5X xpdFlGpVia4`u@Od5!(-A ܢXϽ趄K1ļ_<0DZ==P=8==Xާ=P{=s=8=P=p<`X<%/= /=8=0=Dh>F>Ժs> B>v>ni>lT>l->d>=D=t>L`>d>=p/==] <ؑ;6=y=$>(PZ>J>Đ>}>e>(;>8=`,< ,@mR`',S Gf:@5=௘=p=)=`[=L=s=`c1=ӻP{o}Nό ’)]xL>l 0݌5K@$8,-ȶ@ĽX@8,-}-]辬w4޾Jp 1ljT=@=&>=P=h= f=r@ѽ7#SB=2 =0yR|)YAA ciսBp`Ӽ9, O<^5=@=8=Y=`==@%=@<6(,d[1Yg8̄OW@nQ<==y=Ї-=f<0(⁽{|S!xb˽$pp뾽'콰1@ <===pz===!4'tL=JV4Rw,7ʬmoS8/0V-R`G4߃H?Zp ʾL> "QLx>3+, vb8`M9|~̆FԾ!Q GuF  R}nǾF@xO;(J "ԥ9S %|/.ymtׂ]4qc cd=Y,.ѽ[=r=đ>>;=Pp=\<ਥ,F ȳPz 9p3=%=>x @>^G>AA>>>D'>>x=|>C>K>~= 9=L:PO׽;0g@߻7!p&X88v߽ؽa OX !>|m=> hZ>z>І>0̈>>>>k>(U>`>l}>5>Y>2>>>> >^2>'>H>J>0>>$>@F>v>Q>3>4>>`>z>X>LV>tSe> y>h>Η>d>>t >K>>DH>o>?> >8>P== =,>H#>9>iN>(c>hp>l>4b>g>u>"w>mj>XO>a(>=8r=@DڼYD%<0ͯ=>ĦM>m>S>>=Pi==< =2=N= =pap۽03~ @X(p=,">pv>ٜ>H>>>F>>:>>\yx>G>ȏ=`j=ұ<=ߑ=?=L >`U>>:>&>أ>>.>Pl>,>b>r>2><>>m>0.>x;=@0<>x>b>p>z>Sh>F>t>`==+=C===к=[=4 >|>l>2>$>K>>`QR>w>r>D{e>Yx>&>s>>v=D==pM=8-;`-``EY7.;8=h=| >yj>:o>Ѷ><>hh>@m=;|n Da:\.qRHHēaF>$N| QO#XgSc<`|==Ч=Q =ټ֒8н_hͦ LQ `/ )==d>Ԧ>( ====@u<@o5K8\M@u`a0뇽]p訥`]$l>8>~>>pZ>L`>=;Ⱦl 0IeV= >ЊT>L|>(~>_>7>x> = =ؽh09*p($u h̼%Ha*tdUd.ȥJ1꼠I2ƾhIҾξx)k@Bs-PK?`zބȋ{3m{KWL>S>0I>05>0>`/=)>w>И>e>l>ɑ>Ȅ>f>;>)>R=p==$==`==x=g==3=S==x=>>؁>+>Ь`>4d>LQY>7>>f==p`k=<#?L~'f:@?r:`G<=0:=h=؏=\=@H=@\߽ IJP)PIXA@ۻ0=Y=p"=M ,xclo$/[\1,ŽѲ{<ۻ\@XNz҃q5f]<=7>h {>:>Z>N>F>m>$p>pg=֒}JX齨:<=W=>h>0==n===F=4>>W>=8ը=)<@=Az58^`drmCB`0D===pb=nC=`p,xֽ( -P8E0>w |H>L58뽀ƽP``>X>>I=`s===寽Pȓ὘,<[l2\4cI$$4RE"@ H===@= =LZ9Z!*POܞ(ئxXЛڽȑǽp½l0>]ļ@`<<@m<-R> >,l>>Js>̗>>(H>tL >ȑ==$>;>&>B>>> >>>>`_>>De>%x>p>z>Ņ>Xf> >FB>=q> c>Lk>7l>"_>WW>P [>i>̓>n>:=>>$>:>6>>\>@>ב>I>@>\a>0>U!><>t>꒒>>>>:Ƽ>P>>q>=>=&=q=Z=;==$>>>>%>=8=zT= < %== >4#[>>>>Q>>ϟ=`#M=z>L>$>J>d>?f?0?@>>ò>Z>Tx>=K>J> >>dH>,>p>V6>>ޥ>>d>>>r>y>,I>">\d>->H>>xb>>H2=Ō=<=J=ѝ=9=l6>u>e> >b>:_>t>ߘ>r>>Ɔ>Aq>@[>xU>(V>=D>\ >H= O=P=н=>Xd > )>\Gs>*>4ʢ>:M>0>0>K>>#>+>>>0#>F>h=0ځh4Lof؁=XV>v>w> {>"> g>z>l>@J9=##˽آ(], )@h}qÅg(OM (P`=`<跑=ұ==(=a=M==`܍9$9Khlkd&dH˽9:=j=>><> =Q=g;8   @G, >U6E>:X>(N@>t<>0=c<0Egz8$8B8Qj{@`=4== ><*>>?>&>{ >4=@><@⼀.N/02ǽ dmX<]"-RNӇu\P"н05?=`g=>h=#V$]|WHܮ$@Ǿ:`̾ xB4|Vi\vR8~Ln8d;[,Bp0@mR PT𲸽|X½e 028=3T7)ný[h=|8E>>rǚ>>l>5>=W<%@iз V`=>$>tB>`ce>xp>8[>@>X4>t/>8.>E=>L/M>I>8>|(> > w>=pݓ=PHA>`]>Pb> Q>:>!> >D=Ѥ=< U s;`=<\=p= >d]>=t;dh H"l)P½b`pk=ǟ==-$!>=>N>Lt>>l>hi=<`kνxVY`yȎZxѾn꾎 Xᾪ"ؾ@8ז X@7@/W: <`@=0=\:s I$^[._XVи%x<Ž`V{5=Xݚ=8=X=X>,>==`<@a<<< .ݽiX&,GoO۷=7>~>>l3>t=s[dAX}xDU䉾YxXhH8J SMEB5<U8@ < J=0W=0ܛ= = oz= *=` ;@;!7нPpt(Ǽ/==p:>=>^@>>>z>>><]>D>2===o>м%>q`>>>J>I>X>;>|{>>K>6>>>l>D>u>Ze>Ơ>m{>cI>!>>>+>A>lb>b>>>>>>:>">S>d>>d>|M>D>>lM>R>42G>lH>fb>>> S>3v>Y!>=`ǻ=X$=>4!>pDE>(w>fI>E>>8h>$>۷=8=%=g<`{<ɝ=Ԃ >|)Y>lh>h[e>4]>b[>_>Uc>j>Ԉn>ܐg>Mc>@o>j̀>W>{>R~>>x>nC>n>>>ly>ǭ>R>|ϓ>t>Ә>vL>$>>>>>">">o>2>h>@>(1>2_>>Dg>$r>j>{>t>T>j>\Q>,r>b>W>Q>S>g>nw>إm>@b>d>r>>„>u{>d>X>;e>!q>l>Mn>~>X2>~>ӂ>H>lT>?'>2>X>G^>z<>>,5>}>f>=>>j>&>.8>>>H ->='<̼p"Z 5==hKl>">>>̲z>j>D;>=U==:=z=-=xHL@$<๫<<<\@d|-7<=</m3i=P:N` a J,.ѽP0U@5<=h=y==p= =@=`š==r=W;=@'< ;f` 웽] m6<@7=:=Y3>g>)j>d;>!>41>;>P>Pj=:<@'0W?,~žxԾrQ˾~yZ/W0=>8>M> '.=н\5TH0΢6 p,6 ,ʾ۾پ˾,~̆p0LtH 3 ؼ]6 u?½lPd”d"wLdd±=1=>$Q3>L/M>`H>l3>&>He>>=`-`==`<w`)`G;|S=?=>D[>|ߌ>>j%>p>a>X> 0>Pd>8>(>Ko=4h0]`yhP[2w-=hϴ=P>|%%>85>#1>h3>%K>\O>L@>== <= ɂD>Ph>d>D>>=== <3i`ֽRੲX \XH@Y$@!A$?6f<;绀qjRμ ODѽ@-$E_LHD3h)ȽWȝ۷D!Dބ`Nx{lнf+P,{8 gMÉHAE\C¾ϾZG[X.I޾6|ܞ& R#VݾfnѾ(_ƾ$Ƕ¤HBƾӾھҪ྘1'hھXʾR:h$,džtԾؾDHӾ<Ⱦaܙ0|@]|OdNPb༄ݦ굫BWU&O|mt3罠ͅ80!A^hམ-| ft<~=ȥ=Q=@̛`>&>>^>>x =k==l<:@4p,%do^DЬ`P]=`>H7>\!>x:=?'<P䍽x vx,̽g Z[\tΪ 1q$ r2 G ==>>(>q=Q=="=\`״EĽpG콀&Co=!>9c> >>l>Tѡ><>s>z>6->,>>04>FV>z>y>!6>@>О=p=c=V=$J><>>>z??8??,i ?>7>>*9>_>2>5 >Н=>x;>`>y>,{>r>l>q>p>>A>>L>>>.>xm>b>>6>|`>lC>$(> B=.߽XhV`< =eN>Vz>n>>v>L>Q>_>=`<ދ%@8->~>z>6>&t>j>H>>:>|>VJ>=?=y<0U=p5=<;>.ߎ>RL>?6??V!?_ ??P[?I>>x>WW>2>`N+>liD>ؔg>r>Ta>-O>,:G>lh7>&>2>a\>4>>>>8>>w>>a>f>iN>r=`@=P2@=`<aAz>n>Y>>z>*>r>@>dw>t>|*f>WI>w&>F>\A%>KB>MU>S>F>dA>L>K>8 >Rq>>ķ>8P>F>X>ѻ`ݽ'.XAp&Hʽ+P9='>uG>lE>=ॅ瘽8*8%s#,oPGT04 cp?ssh58Ƚ`2᫽@_z<r=ز==hy=@)@ ==񫽈P 8 ȽZ0H= =f<>W>J><#>¿=@"X6r``rѾ8 Ⱦҹ|6+L|`'<;paL$VtMu(>6\ :s @Ӿ?㾚1L־+<q&PϽ0iZǼOw3d)s-'^Ǒp0y .<ɉ==>h=`/z=V= vf=yc=T=s=|{>E/>p)>>`=8= RX` TڽϽ!<>dd>x}>VY>&>>0>>Y>H>Ц=;ҼP`Z`Цe7<ʸ<%== =T6>k>===*==q=$<;`-]Iqy/˾$ɾF̵l&J(0`=t>>>#>0=@X`ԍ Q:~B@o8K%+,\F뀾(yO[LNE20\S $=ɲ== >$E>l{W>L>g4>Y>`U=@< bpFl+i@ԔM=4w>x>->&>P>->P>F>z=g=ʸ<<_<@"@ lSpph7@9==>b@>|H>8>> Q=9跑,8-_sk`[?Op4-@LS˻;<(;<&0ν\? A "bCKh:0V9l^ӾXݾȾxA$ǜDFھ1ܾؾϾƐ1V{˟Zّy0xHf_DHd3"0kt"dAlSKG+1pm38R;=0|=H@==p{=0[F=<` N{I!0~<=<>( 5>_>]>@> S<ѽ\(sF WT?Mn[h9%>XD> >Z > >==>Lt>>Pse>< b>U\>+l>j>DJ>+>>><+ >d'>v>@%>>%>, O>>⫲>*>r!>V}>_p??(>Zw> >Ҟ>n>Dk>(O>SP>DGF>9>@>wB>2>,<>n>Ʊ>y>hg>Sv>>^>V>>>m>x>&>llk>!>nN53,0½@Rxl=V>V>پ> >>t>h&9>`=]=P===A=X= Q=R< @H ʼݼ@SM<=,>=q>^>>6v>`>Λ>D>*>ܠ>4ܵ> >>9q>8>(>==;=PM%>gh>Pè>V>nR ?:<? ?)"???;?>>>6R>\>x>z>Y>,0>P;>` >,6>v'>4U>O>R(>>R;>>>v >>$>@[>>>w>?>>><>,>;1>2>jJ>w>Ҧ>ɤ> >1>3>A>e>>>du>(|>#>xm>hG>p6>peD>F>>Xh=u/1z@4{=0%=&ֈ>ʪ>,>2>8a> ~>=`N_=ƼH.$ȌzŽX܍kPaR>,=n>k>rm>f>>>̙ >h=j~==@J<`}ļ0ێ1㽰8,-`-,b۽='= =4>0}R>L>?1> > =[<ЪFؐhx}dBxqܽ۽G޽ýJjo;31<`@| >pg===x8=^=蕅== >@5>@b> >>v>S>:>">3=8=D;>f>-|>:Ĉ>,>o>BF>Hc>.5>=-6= ӽ$=07h! h8 < =0=f=(=þ=XX=<@FaGнd& pt0dB$ 5(> E,(T ݽUap@6ؕ( 8:wH ,b]$ƾ𾐛Rg@:ھ9tQ, @ptt"yމjZؾBfJ+#xJ$0DIbi΄&]YTzХp쳾K%ɾ\ξ Ѿ0j̾2|4뇾U%`@FSw`d(U{48XgaNG;=U!9@u˼`<k<1<=?=1= =u=n=Pm= =f=0ͯ=}=Q;yhP'I:@ Ͻ`ॽ^ =X=m=,=O= >l>H=@z+B>,!><*>==:===@.=;>Dq>@q>R>L>|V>Z@>n>,><.>Db>>B>K>>>Ҙ>v>>8i>E>Lt>>.\>hX>>>^>>|> >`>>>榋>a>hO>&J>P>RQ>@):>> d>Y6>6Q>e>,i>_>,]>Li>k> Q>w>r=ѻ@mҼb:< (;=X= >wP>:>&^>X>>=o=hY=ln===@j=(=5=`d=׻@ .ʻp`=8 >8B>/}> >+>Ѿ>>>>> >>w>q>h n>9c>l>^ >F>Ω>>23>>>>> >> ?Q???L?2?n>b>,Y>@+T>>`=f=T>8>0k> w>v>4>c>5>>>>>\>>r>K>>Y>m{>Dr>~>#>5c>K>P=`>\>r>^> >r>b>>“>>6>&f>5> >>v=K=E;D80Wݺw=>c>P>f~>\˻>\>E>4>G==<;@gs< = =ʻBHO<0ҽ$=a6>P>ܱ>f>u>>`>>0ݨ=@8-< QX5X[`vvDj_D4pԽk~==T>2$>\ > >=8=k= E<];`Etm ,pOdhe|FUUn90q==xJ==d=`&:>lN>c;>D >!=`<`wD¤;Py= =q >?>g>`>[I>=>$>=p|=Щ9=<=P=Ģp]྄A!%g; c@\jC} (}@_@oXuic7.I`Qug0rhǽ8v߽X%x-jXNJYĵmF8rM @@Vfʸ?W>L~>#>ҙ>>k>ؤ,>p5=@< Jmh K (J b=<<*=`u= =@=x={=#=d==<@B˽'1@1 ]ȴ`47HG*PGڣfýѽ4b2f^Oԥ@i`rc޾ [+~$蛾t|?TdNS:ޞƾ&վ׾3Ҿ–Ծ徸~>"~ c nZξr虾SHd;@ %=h x~C4r:%ɾЛھPOT #vӾB$Fʁ7PuP8"_콰l#F_tG eb8רXDLpҒdZ!% 㽠hV]᤼PWf TZp"P}lTjP嚽=ļc;Җ;`͚C=H=0x=z⼘J>Ȥ@ෑve<@-n=H=>q>>@'>X5,>LQ%>J>=;ɝ{%(I(a` #bK(4ux`ˣ@k8`X9< = )=y=@P'>DhE>E=>|>P> >= = =( >\(>D!>g>ز >G >\>==d >HV>s>B>R>>">>\Q>;}>Qq>̟Z>O>f>>9>>l>N >`>>P>> >"ڢ>\>΄>Fˎ>Ԕ>>pi>{F>`[>y>tt>VQ>l62>dA>t>>7>>*\>8;>^>(=>= <~E<=P=h >l!>8@&>pR$>>>p=:=P=pp=0H=P|7=##=<:ǟ C:2;)<`:=x=8=%>X>g>>>!>*>p>>跫>И>>(L>l>}>B>|ߌ>.>hi>>o>=>Z>ت>׹>>B>a??:^??g? ?n?`0>vO>x:>B>P~>(r>|Ke>_>p>>(>r>N>l>\>>8>I>x>>>>f~>> XZ>dqD>+>@ >D>j>=>+>S>Ho>w>&ď>>jf>l{> `>=>>X=Z=f=h'=`=:Fʽȳӽpd`Uj;@6t=t="<>q\>J>X6>H5>>0\= q=@$=%=< ϼP֮8x,(Apm`G< d=?>>o>s>nj>Ƅ>d>j.>h=ؗ= < ѼU8B5P:9*4h&>==[=WI<@GS06 "=6lBEU UgkX6D&ý>$>@' x`#MZ'- %ԢHF8Ƚ([׻ϼμ<)v5x&<0 q tԴ%d.#87@/*0$x ٽx 4ŽЉǽHȽ0ĽU艽XcoT;<RH_c(;˻;;p=0_z=u=`<O}i<=p>>I>>䅌>z>LH>\">b==ҏ=W<`OP>m0e-DnCp=Ro`T`ͼM9ql;(;+@ܽC1zYpUzne&ҸC O'vͽ\*Xq>T>m>2>>)>g>x@>w>=f<@ε 0H4'1x;kF\5x0\@0@<΄=p=Xk=z= <ۼU48K@X_ VU?}pb$ OL@ND==96a/X&xm`>ʽx½XXxݽxƽ꽨8뽐`)p/pL:@<@W<&>V=W=@=t< Oҿ '.=i=Pl >*>dH>pVX>x4>˾=j E>Hr>b>6>t>>`>J>@x>X>E>0WF>^C><4>#>>>l!>9>8h>0E>>d>b>??>>M>a>(>>z>XV>ĕG>c;>0>D">8->= #>Xke>}>>>L >>Rµ>>e>ޝ>>hg> $B>>xX=p֠  dJ>hG><>z>nR>_>0>|I>>=(==m=04=@<@j<:+ =X=TY>tN> >f>>L>>8>>m> >u>>dn>BE>e>d;?>c#>>@>6Ȉ>>TL>?LN?!?#?f"?e!???2 ?>>\>Ze>>O}>8uR>)>>ly=>Fb>dqx><:>>>ή>T>x>><>H">԰>0> 5u>̮F>J.><'>>pP >>(*>E>Pn>lmx>ؔg>Lh>>2>>1>̠g>W>$]>oM>t+ >0={==Ȳ=8=H=(=0H=@j==ͅ=e=2=0=>C>P]>`2m>:~>>s>T[8>=;jͽЭ ½`O9 N =m=xP=>e > =x=ȁ=A=2===q;1 [`Ç8_нt (`A8z<{==(=$=Z; 6ptPֽX6P+ͽzt04o4ѼG0`  S8@ɽ}z(@ٲpɽ(Ž06! P < JG=`Y<܍F<~m=Җ=C=5<<<@5g< ]xF$ TB>0*>='e=邼'!TH,^m2~yg̞MPGF8QW|(L1l xӽdŽj@zX"̾pȾ><[kv>{>|Y>6>`=pB=2:޼PA:\d&\'d`q=q>}`>>Dw>,>1|> j>3W>%>J=`b$=} `<̽(o󽸌 4QCZcv<`K<@T< = >1>>x=_;`A 0B$J~j̍*?$=W;@ﴼmבp#3tg\r1b乑!(U1`$<@ |=v== >>$>@p=O'='X<_?t/szZ R`Gs=4v+>>">`>>T>lHy>8 ;>8== Y<z8xY8ýdt.2XWȐnrܱflO(罰1x T2<j@Gᖽ8x+2Xh➾fjHurrƪ8Ƣ^ƔZt~␾ߝN皾\Zɇq4q?}f,%l1Ɛb2Ͼ˾)( @70͕tp LǨByrT29aj^dؾLz;+⺄Qo-z2FNatu߅͉CFt,ezkjޠ5n Xt}[}{tܲseg\3FH0T4`0X xQHO $Q3Y@c`=P=`Z<ʻ0=;0˕=>J>s>>P>>8>V~>_>4*>=r((h)8 h\r_}TN"ƽ0>g;;<<@ =П&=J=@k8=<|@D<4h,~ꉾRp}tz<=H$=>>>>P|>@=ޒ== <䢽򱽰9 @X<8=`>>N>ho>&>>>>B5>&>8>>=>D>>^Ȯ>>PaR>>Y=<Ѳp>`>>t>jx ?N* ?£ ?] ?>§>M>2>6q>N>@">h>@G> >3>>k>>>ȡ@>>>跫>J>5>r>/>>g>Ť>o}>iG>dJ+>\>=0e=<@<= ><{<2=pu=x>vT>|>`>#>ӣ>>>Vb>(>===Hݡ=Z=@F=pC=x==`==/>b>w}>>zҠ>F>b>D>N>l>>`S>B'>v,>>|O>l4>"<>'^>̛>>>p>%?hX??}?,7 ?=???f>>> !>>Hۡ>4R>'>,X>T>0D&><>pc*>ܲ?>[>&>ڎ>>x>>p>Κ>`N>>ac>t9>س>=8=y=(=e= >/>B>PD> J>(H>x4>2>9H> e>~>l>I=> 0>ĥ@>R<>d>X=[=ز=H. >6$>l!>І > ">x>E==p=X=H='=E>x>pQ>T>=@T<`.<s _>=&X=@%u3i<W;-@' `qxh}4-,:Ql|net-YJJJN.h尿Ņv ]ܻһc<i< =@V=D0=<6!= =԰-˽lw#JCWQ=l22=Z==>R>05>(K> >0F==`Ç< vf (_7X"zZFݻ੾&MxcPpӽ@8d0ʈ @ 8=(|֗q"¾;ؓھ.[ѾL鴾wd~JD#`yPx:]kɼpVXP ν2@oϊʞg 9 <<@s<=8p=К=H6= >x>>@=@=7p?PCTH ,CP=ࢿ(=u>h<>X>\n>k> X>0>.=`#=@_zPذ@0h %x[*l!,0>6<qpI==P:>|$>2>p=0v="< ؽg,`(X&ؑ@tTWd<_B=^=A<@IP 轜 DmcejI1=5H6:ԑ l TˣzY,>zC>8>>=<)Q8+*Yv֏TG|yfCܠ,3.L;HIijSuUHwe߅ZY뫾n ݜ"pڠ/b.P〾ToVT8SacȀuD/H@x6$ypZJJP+M\eKD[Ml@u_xVd" ̉:ցiTX-ǽ8iռ;`<<;:`EHl0X#T-o4Hhq\tr'>;>XO>$X>d-`>\V_><>\>=U;犽8Y&;8r=`=,~+>P`y>> > C>D>>>.G>`=>_>D>=c=׼(Xf$$b|ԩm3xPBi@TL| >y=p!=@[= <:pb =p1Y`<,aflF_E=2@ʽ Ow<(=h>pu=>V>T>8> >)= < +*>`<'e=X=>]!>`&>><>(d>~>jy>V>+>D>>~>\>r>p.>=L=G=:=P)>wa>nʍ>@Ѩ>5>>>p>>b>>>D>X$>`>>>>̬>x>kP>)>LP>>>,>0]>>>H>c>>hL>>>">J>@x>||]>R>8U>ЛZ>,}R>y@>+>$>04=z==8S=\>7>`"t>>N>>ʐ>|>tg>8J>*>>x=> >2>(>v> >>s;>h>n>>>L>LQ><>>D>>L> 0>I><>>Ө>p>䪿>>vP>̰>Q>x>a?!?q>v>*>O>)>>?> >8>>?>:o> `>s4>ܟ>0.>TJ>;^>4q>*>nv>>>4u>R>{>i>F>>>(=>j >5>4>@7>@>,D>[I>|N>TnX>xg>`>'P>Xd><>`Հ> i`>|A>[4>`.9>Xw*>Lp >0==x:=8=>1>\A>xA>L>}`>cW>06>< >U=g=`<-z9ΒRQ/5H߽  PJ2!= ,$31h3@8ʽ5dy=1=X>=>mU>F>[> =_B<@b۽|3p =5==X#=A=h'=P=(=-=W==8==PI` צнePl h-LL@[?LBdB*̼%ȿ !Ƚ޼`=T= !> E>0H>,> v==@PHXx`DL%;]=Py=`/=(=I={==h===@<===௘=x=p==*(ݽHݽXϻ`SƼ3#>=(=`DL=Y=E=@` <8hYfYbm6J<$^r<}bl1%䢽@ ^5lmh #\#817O;$BLUt`N19ЛڽP8)c96^᤽нP*^{뜼@]P9< n<<`{<+=_^=I==Ȼ0W`hhŽ0ؽ@ݽHW<>tbv$}c}xtkJbSF,By@DWPzT(OM@V|;굫$أ埾(> tH=qJ逾^`|D|<u\xk,nftmel6fĵmLh ɂ6PH%xZ{Xa A:d D<`$y/NOo``܏ZCa3 0;=l31<):Ksa~?dKкc󾾬ҾHb۾þ|hh7?0ıX `KxϽ^KкP3*)D V8Q`p[L,<+Ty@Lӽ80Y,@;ug<|JU%9XQ5R bǽİ|د0PH@O8A>3e>ؓZ>^C>Xf$>=@i A>I!>dW>f>j@>d>S>@">@>`M>0E3>^ >>>M >x=׊L* iz`-,6+ ѼΙ@뀼0*~C;'<xA>&~>6>϶>c>j>>Xd>#?>*>ȱ9> ^>;}>->E>>)>bN>> >$> >|{><\>?>>>~>=>H>d>p>>s>_>$I>F>$b>֋>l>>ZT>k>p>ʎ>>>ۑ>?>a>>s>~x>>dv>$k>@>><=05= =#>r9>8]>B>>nc>(L>y>_>xS>`>#s>O}>=q>Z>Y>l5Y>2>>6> >XB>tV>x> v>ѹ>Ы>@}>>4>>ଥ>İ>>&>>>R???Ps>Q?h?l[>x->8>>>>fm> i>>D>><^>R9>&> >F>>>y>@Y>\>9>< >->w>->Z̮>O>̞>܄>ԗZ>V>g>r>d>M>I>^>$y>蓅>>gv>0p> >\>Ì>8>rŀ>>܋>bԍ>b>l>86>hi>>8q>DD>:> >H'>pS>{a>I> #>h7 >c>ld>@=X=gI=P0=Ǒ=H#=8==@ o====5=xj=z==Z=@<P|lv-l;HpI=DF$H/eK}" wco:i9c`tΏC@ɾvݾDkBFʎԾ;_<`;l$RtL P9w07oD:趄|l9d"a6Q(=n}zK^`~M\w^lLBmܐgXke\J(CT(ZndqXprh̀ZdX>􍾆+fLG2&(d~W|l$ŽߘƒpǴ3pн(Ƚ!`HﴽqNHּļټv (Z  8뽰LJ <J=`#M=P=?'<@9,vʼѼ@pk<<<+p ] )ϽP|2cꂾ쁾P}@~X4dW p9Sx匽tu]riY0_ `Ç`W;}X(ѽXH.Y3#-8Ľ ];=);@4B$@<<7`@4$щ@y%=pE ====PT=B=1=^=~m=b[=`V=(== =0>##> >X=+=@== =x=hz=Xi=`U=I>p=h=< f@jr2̢ R| RP'SԽ߼ f<9=;`輠{靼ұdo4<0< |<_<P<<l<e</=$=H=h7 > >DD>`)>x:+>h@>f>>ǃ>*>6>>>tCl>4V>l]>y>Z>xu>e>g>v>ҏ>8>h>jC>\C?>|N>L>P4>t>dM>L>[>k}>8H>!>t>+>tS>6w>Tu>Q>|;>I>$U>@C>$$>l>$? >|78>`A>T7>A!>=X=0=y<=_=`@=ز=I>ܡ9>h>p>`bX>C>N>Bb>T^>DI>C>l%`>N~>x>_>O>V>f>9q>ԉ{>>g}>Dr>m>o>x>FB>8؛>>n>,>? ? ?n?:?_>?? ?N>U>> >>8>&>$>T> >>6 >>P>к><>>6t>@>U>(>Hc>xl>b>">*Z>||>H[>81>9>LO >|$>l$>>{===<>`<>>J=j=dn>@>yG>9><>tS>f>̏a>>C>>N> >b>)==q >\t7>V>Xd>`2m>p!`>9>>p3=`=*=pe=h=,#>tc^>,>x>h[>|F>ԕ@>=>3B>!D>~<>9> 1>%>>~=ã=a=@ U=p(=<~#ӽx`哽d=);ݻ@):;==;b<; V; W<׹V;4;#9W0 Ԥ,#y(H>Cgēa@PaD8 ;c;XU S4Pq\ ὐ'콀?BxQ( ȃ`& =x)==@j=H==Th=8=ڏ=pq=(==`~=p!=(O=h߭==p=d=w=?==U'#n' k@5԰H`<;](XԽ н4#5 U罐 #m/F&̩&q\̉<~䇦~dZvþ_оΫⒾ"2퇾ԙؒ긾j̋P22@oe$rꄾw:\w7xH 兽M;) D->(==L>.=؀>=0=p= C:;+=&=p=<v==|O>u>R>b*>~>$N>R8>N+>>T>>h5> kz>>c> >>ư>> 6>6>h>Ы>>V>>$ ?TW?>>><>2>*>j>R>*>>m>Z>W>===> 9>J5>ߖ>e>^i>i>b>@G>x?=a>T>R=>(>G>ԙt>>$i>v> >Y<@ 0P=q=8>0>22>Hy>j>9>|>$>K>h9Y>lo>pt>?>%>+>|]>40->4>/e>>>܁{>]>{4>W>h[>:>h>Vp>Ч>P>v>*>> w>pǀ>>>L.>h>0#>>fH>@*{>`d>~>|{>;>|>l>u>z(>Vg> >T8>@> ~>,}>#.>~̆>pٓ>+>||>>䗅>(K>޾>>`=>>\}>tg>#e>|&>=P= > =7=F@||)̌nۊ*'(Ŷ ˽hڽܽHvؽh>P h> }>H<>E\>T7> =@=Ї=U= E=ǘ==>==/==Ⱥ=>=~ >>4U,>Ȁ=B ˽ʽL:ug<==9=и= >>=;9q=8=WIt==<}]Қ羒 Ͼ81koܟ/޽X68b0Z98XXlx0gdw-c;Wp 3Xs3Vz۽4p7UPc#h&]n`!8Ľ@iX gPxF:hNѼ?¼X<`ü=9=∽w(m!() WQϻ?P==Wn5ddWVJᲽ@"<"!ExnfP:9@J<lɼ70yxν㕽HO "#؃ὈQ\` |)g׼@@&<)<F<`0& =x=hΧ=x=8=P(=W=(=NQr> 6> S >`'>*>x)%>8*><<&>!>>M >P=(=( ==p4=t:>H;>(>%>g=X-=^==`S|b 0Ћ><<s<@ ?=`R==p2=8=(;>8]>^>t>p]>Z>@A>x>l3>p)>$e>\EY>=>=8>DZf>h$>Щ>E>>>۟>2>^r>T>D́>Do>1c>n>̼>>>$>9>lC>N>>0=p#= = C=J=0V=0x=p>ҷ>]g>T>L >?>ni>W>`>ԖM>P>XW>L">+>0*>p>G>Y:>7>8>hX >Co>l>>pa>@=0Y,=A=L4>_>Tk>8s8>F>DO>9>>>"2>lX>>C>><ů>>覥>.ϕ>`p>>rs>Xb>9>)>f>>I>R>,>@^f>>8v_>TT>wP>>x,>O;>G>l'z>>nt>th> I>ܿ>=x=P]= =p=@ㇼ@<== PzVʼȽ@iD!4^Xfraս(@!"x½.ѽp:P9Ш,۽Pq兽$ pPJH==Ѕ=K>X"=4=d >pV>y%>h==u=L>9>>=0i=OOнX=`xZAB8 ィppWe@{6&!?P8qؽTZ+hIR4o,:LȎV?ýg?$.4*܍@oMȎTJ2@)>@;<=A= =>=` ቼ .h=@>$c>@e>p;>>fm>܄>ut>D{1>D2 > Q>4e%>>P==j >>\>P= =f=ش===7#>4 > >>0μ=La>1>>4D>e> yY>?>|F>(o>><>!D>8s8>?W>>v:>*>s>Au>}>JQ>Jb>1>K>xZ>d>vÚ>¥>K>rP>>"f>P*@>pA>> =<;p=ic=\== ;VP6pFwнڽ F(oS@׽BIf<@<`0p@QB;t<;ڸa |F4;@6= ==( =|=dl>+>9=>_>[o>P.>H==!>>q6>N>*>6u>d > >~>F>hG>:=='> >ؑ=l=;@F<௘<:+<:@;===>=`4<i:L;SHν $ R==0=pu=x|=X6== < G u upT>WWzѓ}LN2P;F Rᑾ츾4ȾᾎپrԾ*K Blf*Lоjܰnݾ8۾vĐ\LήྴվINpXþx5<ܾ徇 R{tDܾ:˾8ʾF$V&a47丄ުvM˾qξLXNAv0ݎYxœW}<.{Q}%zk# R`Xc />'wdTVr;lbqľ;iҗpBž;֓ȱzǾ׾=J%<$ؾ }# !jßt ;RϾxƾ&/Lyワt߾T۾ ɾh⺾0 3.5S`>Z>> >>F>Y>0>u>'i>Hgl>8 >:+>JP>2>*J>C>Չ>\-> >>=(===Xy=ؐ=E>T><>{>/>/>,k>Dž>@j+>=&=@>=ॼ(UL"%E=pH=L> =@A==`= Ӻ+l-|"(pf:R=\>K>`><>궸>g>h$>n>TJ>ʮ>A>Yc>so>f'>@>P>&M>л>R> ?h6?M?E?Ш?k>S>!>>??$,?~ ?Ҽ>r>߬??Ȓ>J> >D>: >>>?\?o??4*?q3?()?)?5?hI8?jE?!?]-?i)?Y-?~W7?\vD?F?;?04-?/(?UG%?!?.6 ?P??E?/?"?q?W"?2?@1?]&?I?#?4v8?L6?%??M!?@/?#?"?$?,?\??Ql?`?³?>fm>|7>Po>>$ȩ>>By> >>V5>f>l>hT>0P>\|>><`L>4V>du>> !>>*M>^>l>xMK>=6>=y=S=P=B=x=b>>~#>x g><<>8A>\"@>|(L>L"{>gh>g>[h> _> 1>X->HV>,B>>h=B>1>K>{4>lU>'8>> =@֮< f=P">T>yt>J>JQ>x>>0Jt>V߀>X>&>(=Ri=x===\=o`ǻ<`Ç=>7>^>>Нt>h=靼 QM$'\s*LlUѽŽ @x :`B<cM"$ȱmɃtHtՓֱ$¾Ծ4uܗ0 $ܾtЗ ʾ4VpݾپNܾB־Zm؉.ߎ苾5游8v:EɾFv(|F̒JO" <ㇾ\{잾><^Ӊ@Ug}V뽐UZzTPŨ`tu軀p;9(o󽰐 k`=Ј:=P=p7s=>p6>@0>$N >PJ=J@;Зd0>x=pQ=@gp5YD`r4h'j (]X#!7T%3( ܽ4,Hf gӅ~)о>~l4˾}ھ8dھ*Լsb˾r@ž:放DU(վ奄d}l[$XJbAнHQDkV5lE jYlpTrld4dL .Έ;v~UNЩ9\臦=0#[=3Ь`ȽXǽ 3ĽFo=[=8=*=V>#>`">8=@ <`N_==ؑ >P:>#>>d>8d= <@y"UW:+=#8>(=T=2>K>,J@>|>>>x(>x:+>~== ><}pY3R>HQ=^=>6==@< ;Zp,ǻ X=蹫=h=<`N_`.m1u;@=ЊT=⿼8= >'e= G =62tӽ>Q VY3找X%gD ־1Fx羊羮)Pm J)ĔݾFUjl9^ lվ2ݾhZ.B2HZveqȎT$E1@C|G1Ž,H]6 㽰Fu=$4)_<+PS?=@v=jp<vG=?>(>>$,>W>t>XC >xO>m><>tT>B>`@L>>[>Np>0|= w=8xy>$!|>==| >1>l:> Y>>$p>=W=0w=c==8q>C=@֮<^ =.>p:>=Z=8-E@Qj( ӽ|NQ<@)<{o= `ֽ(ֽ,@s1< `@@ջ_¼hϽS[ ;=g=9@g:<;P =<З< =L >=K=<1=>hZ>Ta>xG>,\>̌>6>)>44>yt>nu>ܢz>dj>g> f>|>>>>7>t>o? ?x?+?8>?+?*?d ?%? ?w[?XC ?K-? ????]c1?>?H2@?(?#`?p>. ??x"??H?t ?r&?8"??ۍ ?4c ?K ??c?&>@~>u ?h?(~?>K>Lc>x>U>`@>j>(^9>k>>_>>7>>pZ> ^>">>>I>XA>|S>LSs>a><>N{=}6=P=">,.>o>*=8=lu >lU>>_=Eu=@5g<=(=n=D)> f=eg`Ԕ<1>`Z>=@B==@J9>->p=2#?Q=zb |<=U>8=`+F=`š=>=r=ϟ==7t &>4>p=3=xA>ˊ>d3>`=>E> >| >=h^=n= T<]<=ЊTPYk=.$>؞=@ol< < 8^;:c<eg4ܾVk\f`'@ 5̮F9+(V犾υj0Ͼ~pxd㕾qt x6wǾe;g ݾپӾ̰? dǤd㾀i񾬹Z1ֵj(e2l{((eXF潐XUҽ3['ٽXc=@L>i=٫<&= g==@ol`g=?<#=Hx>]>0g=h=Db>8eY>B= <\=du>x> <=؎=pAx/ @TLxz C=@0d)>N >.>>= >>[;>=9=@>,k?>=8">>>>6>\? >$ł>V>З&> $r<>`q>X3>Ti>X>i{>R>lF+>4>6>d@>>=@L= }=P\=q>=pd==З<$<<Gs= >M=@O0.P<]W=ر=Ќn^@ͨH ɽ=h}`@"<@x4:`6< ʸt)4#[*Hۇ\s*E0%^∽\;@R<8ܽ4P0(,轌+l+#0.ܱ2d~5||ֽĶzT߀$8Lh @jȿ$xνĽ НZ0<}MpyD<3<ǭ Ąu0&@'TpwW?z.t<:PJt!h5ٽ|& VX kNT%en2~S:*䵾Ƴ"ƾ.>⫲Yɾ]. j̾."?ԹvŴPn쀳d'Λj~v䒾4|A7|.𔾠)K $OL |ӽp@'/н)꽠oɽhX@ +}(pF=VܼTҽ 66ʽ կ@̛<>U J =<@j :Ǽ`=Ž0*pF߽p(ý{ZKaN8424uR?bPx`ȶt gS;:0DP;sBN\t7 LD!vP<"=H뀽@&C` :Sx;1c<=քpڽ8>-><U>U6>q>G*>n>P h>D>Щ=>V>8>t M>7'>>d>Tm>dqx>&X>F>>r>TP>>Ȍ>dqx>R>A>?~?L/>ò>D>?E?>>t>X>>ϝ>>z>>e>h7>>>>L>>>̞>`>H>>>`=>:M>~>L>f>0Ig>,7>N>>ઋ>ő>">QD>o4>>]>T:9>>C>Lr$>b.> >P{=`mD= =H=p==8r==(=p\=i=8c?>x^=N==9=G=h==$v<`4̼=T>S>u>=(=?=x|=P?=2= ==\>DH>:>PW>==V>j>H=Rw=L7>I>xz=H=@\L>V>)=f;HB=M>=r=;=@;@<@==(o >wZ>K;>b<0;Ty;T>`fXѽ0ʈ 94;@O@0@VPa@ U<0C=y\(P{<߼8׽{d꽐529A̭99x4d>m@M==>z= E:>}>4>8wl> tF>==Ԩ,>F>P}>(rf>@>t>> >8> >@h<~`=LP>`b>V>rb>>N>x>ˊ>>>?>HB>/>2w>>`p>>>f>> C>>>pC>=1=>Dޔ>j4>m>|>m6>Y>GI>3B> "(>=,8;5=,7>4|>*> =&f=p5Y= >>T>mRJ=8=7=};<@<@K=(=h=dZ=H=p=.ѼHCƽ]d0=`O=pD"@ʁ< tL=0DP/=(=D#f =]=[=>j=w=>>=J<+=>X|k>υ> >X=r>>Dd>>M6>(v>r>2> )>H]>hG> I>%j>>>8]> >0Ft==7>ސ>@7>=c> >>>> W>q`>X>`/=q=Dv>>pZ>:>{>>Tk>^=g>;>l> W=0@Q>,#>@k=X>Z>@=ǘ@X">8=(ܽٽ%\=<`HνX5 \SԽPTG + @k8GɽT m`; > #bW HD뽐 `8^Z.4dL!-^ajQ0˕X:wɽ, T&{0!@BP&$cF؄nE`f<?*fQ8؅{<ӎYUЪF|%0Crܾ`rO\Ǿ޾pjDxҾ|;P*Zt`uF⾬Sо|ZѾFB0h~2Ѿj6#2  8۾Ӄ2"49_6~(-"PJtM,*Nॾ X @Iƾ9¾"U@<(ּ=hn14 ׾T`[\cP[=%LEH($JOp?ƽ`:\)x 4crpaa6`~8燾D̛(ÜnA}p4̌:;?=TI%1Й2$ #齸ν4=LTI ͽJ齜pz(Vx0~#lx}=/ 2*lZЛڽXO!rM0l̽н^P)3tp o;$xEnxYRjȭ&`OLjDXV+ `ai8;˽0 1P5ӜC[p}`Ͻ!@!A<_ (KͽHX=p'=I=06=-=`v= >@(a>4c>*>7'>>r>,>>>2>ܐg>|c>S>Du>䙹> >sI>PV>f:>2#>B>*>|G>>(>pg>>>X7>^>8>x >`>.>>h? E>R]>+?>8B>F>>>1>> ?j?'>9> ?:_2?,?nA?rc>`>}? ?`a>d>M> ??c>F5>un ??>d`r>>R> ?W>&>">>:>5>c> >$An>Z>L>B>%>c>->9q>>6>7>TLL>>z>6Ǖ>B>>=@}=y>`>\>(v>0F >w>><>K> B> >Ȅ>W>|ѭ>J>>X$Z>>T>> >0>Ԗ>߹>>|V>T>L>>kh>O=`??>>>H;>,>&^>>J>%>ѫ=<>3b>X>P==>k=Z=8g= I>8> > O=@d>@<$L=Y=; hj~L=0>H̛=< ˽ȠAԼ&Β kFoHѽ`<@< "xZ A=<@0,op;`>AE=X> => >$<c;DN>>4Q>y>d/>Ҽ)==p0>pI=:@>r>6؁>4 >TH>@'>`3z> =x>4>|v>@>>rȧ>|> 1>=2>5x>$!>Y>V>TH>V=`xb>[T=Vq=TX><;x<=====0k<ٽ@b?=y@>:cR>@> I(*=<Զ `fX=h=`<`= >=y;pc=>=þ>HH=З<(=X>hW>`<@!=: B==g =@N<=,>x>><*;2=R=X==5>=x=x=7< <`==?;@<8>޽>Y> =0=`H>UN>+>4 ><(j~@<̉>8q=8ch8ϑ=x=` #$@"@G<y@ pXyi`,Ӽ(HPx)%=@pFK _I|yXNE XUҽHt 𝘾1WfJL 7(;X܍ظm grd[p0|Ts_,ok؋ϟ~TptԾ6%PT hھ40ۖؗJľ6BھоpDZzk"CԾgþ:wѾ@?h⾲վ8eFw'xݾ˾>boܱ̾5׾ ^澼Zr0ʐpxI T{0Vb"h$\AѾV>ܝ9>Ɛ>r> <\;8=2<>C>>&>µ>%==<$ws>@?N?S>=">>>>Ht>s>0o>P>%>>>>XF>*>>s??J>|h>T&>Ǎ?P:?j)>>~5>>5 ?8> ?O?x?z>:>>~?º>>> ?$`?? ?mS ?V#?Q ?>>>*?0?b?ފ ?:?y?0??0 ?>U?'?"b?"3>o?$??L>>L>>?P ?}>a>>S>>f?)?^,?08>W>>?,>`|>lh>>>J>>*>Pè>N?8a>9>N^>>>*>Dg>>>>>>>Ή>>>l}q>ꤥ>>>B#> w?>>XE> S>8>0>%q><>$> J>X=x)>P~>Ix>U=>Xd>R>@_<ٻ,v>3>Th>h;=7><>0>/.>о=._= g=Rqμ@Wڪ׽vf=$?:ڽ =ph=7^>=@k0w>p4=P=d >*\>iG>s=%>֔>*~>>~Cf<8>4g?>=@w<50`R=R=Ι<к==`=U>–l(@j>`G=;*=`=<p1%؟=ؠ=`ʽdGڏJ(:ȱȃl=^_p=a=,0ʈd t.f8tE?' ,{96wн`<0= =ffz̼T0=@=` <˽(׽ h=H =P`0x@==y;Ц=pW=f>P >=)== =\< =h >H#=k=e== =<=a=>U>@<h;І=tP>ji><> KT==4>ܐ3>F>>c#>*>=h[1>iN>=C#P"#iHs= v>><_BY=%>/>$>7>b===y N =$I>>S[`b`=>Ɋ>(=yz#>,>佼xs=@==^=@ol==[}<@EYڸ=(Z#l(ýH.ƽ"@D<-napF߽AD퀾47<.{xRkxnJ4ON|f^ 7Ȓ\jXfؽ+܏ھrޛ Ѿ(J/NSJ `P,ھUޜ#徇ohϾ=up$ܾ^! Z4ӾʜJQR<Ӿd\!;( Ͼž ݾH~:,Ǿnwξפ﫾ƒԾ$0پdʾžbԾNԾ־쾾!ѾξD2Uƾܳ|㾼ۑR7̾Jr>:Hᾒ곑x6Ӿf`Wi$rFr_T |۾߾H,@]Y~dYHDӽ!߽d/Wx.;4S܌3 ݽ0@&0\l:Dp<ィVHu˽6WT-`Cx7Z0j,뼸9F㶾sZ0I߼ .;\.>>n= =0===1=,)>]>\C?>;< jm>:w>1>Q>6>nU>j>@_s>>X>`/>>@>e>>ž>>>D>>>0> > ">>?k?%>>ۖ>U>nT1?7!?~>t>*>?6P?l>ϟ>N>f}>>?Ҽ> >d?>c?A?5?<> ?X0??"?">d>>0J>?>?B?)[?S ?> >\ ?N? @?u>6>^?>?s>> >>4 ?G?~>4c>?>>;>\>j$>>X>B>U>R>Ld>ŝ>l>08a>/> ?>x*=`B>/>P> U>>^>dû>h>T]R>Vj> >(O>=`{>k>>^>=x?=*>T>݅>==xH>H>>>Aq>w==`!g>E\>PA>b> >ߟ=8=> >`A= T@l>pY=9Xq>=`鼀b;kұȻt gph>@=`D#:0b=m=xbP =HR2 -=>0=qPTt=~DXLz1-(3#0 ,4'C$;Ly`Hw^JxնY^ࠥ<39Kڐp1Yѽ4J"CThPly;tsy؀:@<L:@%x匽hS== >z']Y8=@!=F@%=<>=5<)= =$>?;>ɺ(½i<&<> W>|>== >K>HeR>x=K*)<0>>0=^;(Pu8>4v>`ǻ=>Q`G=;>ZG>訥= T;iq<$=> =ppX">%>&=CA > u,>@d><8 ;|C=%c>Y!>~&ѽp>2>@WhpR$>t&>ͼpyq'@ =xKp&>>(v>=`'p3= hS>K>= ꁼ ̩=T:9>P=X==п=p=^ٚ>Υ>h6>y=0[=괄>>?I>(M3>Lo>$>h=;.>З>n>l>v5>r>:N>q{>I= 0=T>RJ>L>>ꢋ>H>t>L>>>n>z>W `<>Ϧ>6>x= ˶>z>c>1>4O>b>>0z+>Q(>jy>=7>n> d>ʠ>8>>-=\>hA>Dd> >7>@9, Pw>`=<w=|;>v.=`=tC>h{#> =H<7.=8b=@]=]Hwe\P>hd=P;H0x=b$<`)e/̽==P轂Ȇ/ J=ļ ˜@Q(0|D嶽LPLxcƽ.S0eݽŌlFf g;xJ$8V"̽@n4|H>=6KTᚾ0v*举@X6a.OT%rdKԾ'iJer^ hk^L:ѾNspat޾D%Ծ̾~;:ֵ幾քԾ2$ξb׾B`۾Wodn` #\蓟H༾_j3 Ȳ־r>̊ K>>Z:`-=y>>ZG>r=>4˯>>~>bo>4x>,C>e>@>l><>>i>P>? >>f>t?.>>->$u>2>>Ǿ>J> ?hh?>>4>d>$>\>> ?8?>~}>?&?>i? ?>w~?)??ȴ>i? >b>n1?|k=?Z? >>ݾ? ?E ?L?[>>s?">̱> ??P^>>>T> T>>P> >>>?>>c>V>>a>\>ʆ>T>>G>@>> ˉ>“>~(><>x>ދ>0h>>E>:>ʰ>Ӥ>HN>5D>>>>,>>= =9>^>.=3=>Q>,>n5=@ >>$ >9=8=K>X%g><;>6<=p =PO>h&><=)>,v>6َ>=@vx>pix>=;<907 = ؼ$ (L=1=O8νp=p,=4+Ypr=R~=p=L '@<eI6ѽTZ+ "8 8U@)8 HTiw( ı|H. 7gLBm@&ؼ`6p,(Kؕ=Y=ü`nP;F==p>>0=P9,=v>>tN$>N<`*<@<[=rƍ>>}`A>xF>+5>8<>{P>v<T=ܿ>>`fؼ->>K>c=>(; =@&OK===>`A=`H`#=t1Y>qc>(=@N,i>>L=[=(^=@(->]>%>@=8=-D=P=>> ʏ> ==XD>g>Pa>ЊT>p>q=P=I>>Ph>aѻڋ>>>(>~=u=d.m>>{4>A >a>T;>E>:Վ>>>C>x=۷=> >=lڽx=~>>d+F> >>>R>'>a>x=V>ЪF>9(>`>G}>s>^>D\>>>B4>=D=<=HS >Z=|$>D2>(l>l;$<쏅>><` F>@u^*=Pa=0#',k?@@<44>#?=[ GW= Q ɂ&<"}VJ[x\PGI@_ج P]R,Vx@¼XA%XuxrPs1=fXp.h 𼸌8̼a386GW'߼`#M߽@Kƽ/케;P=t "S==J=`&<@hVMn=`=_=%>x=$=K>>1 = ">h6>Lq>=D0=\ >>>`B>ȑ==Hه>H>z>m>@>jw>p 3>T>>Zi>d~> j> C>>V>>d>H!>^>C>DΛ>H>wJ ?^a?T ?>>?+?#?5>F? /?^B>L ?NM%? ?8?:>>t? E?_N?>>8?͉ ? +?(>ؒ> ?4/?>>D>f?V>|>>&d>w>rB>>>,?H?>>>>=><>X>>t>> ><>\u>Xi>P>hW>H>ݲ>>.F>q>>l>,b>`>~>Nb>>>F>0Ig>\|>>P>0Q> >4>C>8q>0w><>t3>ز>җ>">=|k#>>T>=趄=>7>`q=x:=L > >`=(=>|5>Xy>hk*>|[^>0GM> =0;L>^>j@=0=@=`=d'>r=X=P5L.ݽ= I>ep>{?pz~m=`=Pս@P/=צ=F!;pP ص7xν<=pu=n] >E>0{8v[=xa=TaN9꽀A=zԽj*(t`=`(=xk#6 %|pϼ[X(+<<@*` :ٽP5=<8@ wtOX=22)8ЪF=< ЭJP(==ڣ>h;=@ ;=(N=1=@O`<>>#}>Apq =y>DB>(=>>^;&J>&> 0>l>`ԍ=>>L>H?=H=^>22>,=n>`q==e>>{>r>pT=|(> >l> >=|=)>^>>>=Ƅch=d>>tT><>`>PӇ>S=pJn>j%>>>pxXؓZ>>H>y=T0=<`|><.>SX>0>> D>(5>mB>>Ҽ>T> f>=Uv>Hy=y=PV=/=R>`>xO> >H=0=Z>)>==S^><>p>|kW>>_>>\T>->x>4>,*N>>:>>ׅ>>>>4>X5>B>*>L>85>0!>>'>8r>=`s=Qj>>EU>5=! F =p>#^>=ٽc=4C>V=xڽL"$LX=l=@z -5>>HN8Ǧ\29IqόP)оH>^Qfܾ4p,x t&־o8O*|r ;fξ>j4p` ˾lt Vھԥ潾 JDa b=˾fgt þھ|"3BξZBо7޾>վ $ܾ U;0VPTi þ?e*PD|L'6ajǾNþvŴ8o 1T psvy¾JaNNo;|Vy,H&@|78iq4hd4Ȣͽ8/tmhO=&<*<ӎ#Дg@T $ѽ:! 89h XV@IhU< e@<#;@&q꼸w:G=`pUA=\&>(J >k;H D0=8J>= :=4J> >B$_:0>|78>x=o4>X[> %=dM>f>~3>e>D>|Ke>W>Z>b>1>l2>}>@i>>>*>>5>Ճ>1>>?>->d>8?>u* ?xk ?S>e>V?\r?b ???>Vl>?l?~W*?Đ?fq>Ϩ?$?q"?>~?0"?M?@?>>h ?NL?V}>d>M>?>V>h;>%?>:a>6> ??>t>Ƶ>+?>hY>T>v>`c>̞>F4>F><>)R> ݜ>~w?(>,>&>>N>ؤ>ت>,>>>>Ȕ=`,>>lE><ˆ>`>x>6>Й>&`>`> <>z>m>ʐ>F> VG>n>{>q>l >Tz>j>E>IU=|S=\>~> ە=0H=c>|n~>09n>M=M R>TJ2>] >=h=XD= 0>>(=RN<L<`=d^$>`v=0a%b:=h=T=B<^ *N=>!b"===oh= >y,0V矼=@U=+=`p>L3>`<t`׽@-<ȥ0Xp 3 ` P^%O ?ЫS0;@q sIx=HVL$`筽 0ཤ6QoDM0{8XtXHppغ 8<0]`@7M-N<|=뽸 Ԕ<M/ 04==;ʼf1=l=&=@i=%=d<_B==pi=p5= =`&=H >x>;*=`>==Ю==`=4=`[>`=@&=ܟ>>>.=8a%>p!`>(>+>r5>=p܆=>z>u{>S>cv={ƼƄ=>p/>= <<=?>> Ͷ=Ѕ=&Օ>o>0 Vý Q=D3>*>>0 =Mt@E> =`<>\U>> $o>@"@R> >;K =0H>L>,!>*>@=l7=κ>>>n;(L=>f~>e>`x=>^>3=S4Ft>A==$E> =<`x=>>>Lo>=O^>>>6>*w> jt>0O>>pd7>E>ln>d>NQ>8>2B>>=} >hi>:>V>@7>1=8=>8>]>d} >ȱ== .=B=x'>=="+>@W=2=8_ >\>`fĦM>`O켐X@`eK==<8(g@<`=@< K2=G P۽dl˽v<=``>l'z؂TX@ D,]`8I\b$X ̉XC\(o?@<ڽ*Xdڳx)Yy<@|dͭHR>愾"+$lw̰ؓھp14HڔJq F{ضsw,\QmpҾLaҾpEc޾ba\g_@巾پƣھR9\Ծ ̌Ծ,-(4bԾtrʾȾ4TJSپ*0Wƾ(ʾl$ӾӾK s޾BXtXzھBϾRϾ*_GI2Ԃ$r2ʎԾjx2 @ 0f ־ܒl⾲'M&ҕbvy;KǾ2ؤƾ7 ePRӾ ɾNǾJL $ž.¾Bپ_۷4ȾjlϾq3Ƥ ! BF㾾т.]z[žz$`[\CsޏR$ f,|J~ķH'>N]pP`K8xA>H7P'WPTHĽ7La1⣽l lStv“c=xtjBpxPvX=0#[=l ˾*@ϼ>g;2@gN=@==@@&<:-R=<@x=D=@ <]M=>>#=0phϴ=>D>IA>їM>zY> >>>{>L=X5,>>8>.l>a>P>B>>>=X=T>l?z>>>H>">Ժ>??@?N<>W>H0?J?"?>~>0>ɞ&?Pm$?fH?d>f^>[>R??j>JT> ? ??>*?$???M>>~>*Z??EB?>\x>>I>`?.? ? >u>?3)?>6>L>`>?>zY>Na>@?>>!> T>>۰>P >k? >$O>X>2W>>>>>>6>>D"> >>Ή>,X>K>FU>Hhy>a=> jm>l>Ξ>v)>;P>)>2>x>ք>Xx7>H^>d> >@|:!>xo#>qg>b>U/=<<6!>\>=><\L>= Mn=觘=h=>4=(ֽ0==(҈=<55u=P P(=80=B %@$=0ͯ=$?_S== 4hp@(Ŷ@<RN-ܞF@qt'> ><8= >$=O==>p=^>>=P.=@!==>d9%>=`BQ>=<=8>E>H'>݅=p3?=0=lC>=`c=0=M >=P>C=Lu> v>W;XR=!>2B>`=,"/=>>> = Ш,=Xd>>N5>C;{=8>'I>7>0>~=@ o=>rq> L>Ѝ{=>y{>ߟ=8s=3=Hޮ=t>>>`?8v=l>m>T\E>o=i=>N>> >p2=L> =P*>D>S>y>B=a=䖒>L>Z>,>$;>>`> Q>=~>>ׅ>S>Щ>2> 0<؞=(>Z>X[>dK>>h&>nb>G>O>Z>=+=]>p>|8E>P=RN<>eu<=p >`=>>x|=И= <

6>X- SM= >,<>p@=.J1\> >`W=6`;>L 4>`'=i<=!<G xS8伸f=B@ݽ$>8POsw0 >7޽Ij/I@޽T}DPHho[;L2¾`)a" \84e5x V@,(䩾B۾blC\ 0 aLs˾` b<̎Vnn&Ͼ]羺_p~b&`x| nX&Rn` .xC 6վƾW:޾Lþ~pXgLJ_@kChݾzg ZwI䒾҆fƒ@᡾wD 6PPq?$J^+4|Lخ@ε޻\TкԈn`(lUK`pP`2,i o$0z_!A`=⽚HHVh7F0,;`G=iO½;f>0(>-<C)L>ω>4 >5<@d>< =pb==p >>4C>o> ]= I>~>iq>8=\v>>H>>n=pH>:>P>R>A>>>>0>(>\R>i>>xI ?~ ?Jw>>>^?*?.>ڳ>N>Z><>>?D?[>@>>j"?´?t> >Z>4>i?|? >>[>l>X)?%$?>>>@*>%?M/?0>>>ޱ>@>h><>h>x>> >K>ޯ>X>6v>/>d>>>G>>h>?> ˜>$s>>4V>S>>:o>]>Hx>>DH>>y>b?>>>K>:>@%>{>Z>L><(>(l>p>t/>^>#>>ؓZ>8[>,ѕ>$>7>(p>D<>A\>8d>Fi>6>x>_>@<]=E>9>=;^PT=K>8 !>y===8=@>ɲ=8=`-`===8O>?>;8׽Pq<`=;'>>P^߽< ҽ=x=Dck=$<\<0_ o4@v<]D<'W= < ؑ@{;@>;` U!H=^LJ |żĶF>ȡ=0P$>`憾ܽ`;R20kh(Ƚ:`a@hսH"ǽ PTG P@H 7=(((a`Pbû@謽JkP*tuI=@R<ֽ\cὰb򜽸vPP10@Lӽؐ@x`=8d= <%/=]> =,o<8c=d>=0l==r=R>l>le>I>$>=>\>2>`A=k>@r>=j;=;>,&>==Щ=`>=Yx=z>F>b=y<$>D>H>k@<ħZ>~>%> 5==C>b=es>>9P<\>>h=4/:x=0> xL>D6@>p,>>=P=8">">bp>E> #>0>h9Y>R5>">`>=c>^>j>(pL>#>t>HW>L>.h> D>X= =ܾ> >|>P.t>F>ȳ=@>=Z>˲>>?>|4>Y(>|>>xpd>c>y>s>h>>Td> gM>>(>=c>>>$q%>=Hr>W>L.>>j>X>)>(=Lq>%Y> Q>x(>A= T==0=XC >Qn>Tz>0k<%>i=`aK>\a>=@Ƽd>0.>@< ە"@;='=0=y=8=>L=Yq3<>F>s=Pm˽ʽP{=@ >@[=P-罘b<ϭ= fh pcP|(4Dh)GxK1DBtL$a,Ѿ$hB^,ᎾU0ݾdJ)O!$q6ネ־[hj.þt;mj\CpTؾ^;׾;($þPξk8 渞0|<־y1*;Ծդv+ϾcɾžJ뾘`_׾L\4az|6ξU 񾾼3sNݾ~澀i4ܾ,*Oվr>cKԇᾼvor x2!l  &ؼE2(̟JɾelNF%޾ L)4|Ӿ2#NӾR:a~htվ HJ꾼Xz N|ھ^Dj_t֩J煾p f~2Rʌu,eeLTpvJ]=P\E,(hRlV$t|<]܌3I/CE2:h Զ V@Z0 ˜pM@XG>pS1Kr&P<>@WH;(=<4ȡ@NQpr> >`G @OPL>t^>@=PO4=>4> Q>pF=`;==xb>>z>=U> > >\TE>8>0]> A>>jE>R>$r>2>n>*;> >>䖒>ڞ>ǽ>ޠ>>6>&Ʃ>;>W>q?! ?$>>L> ? ?/>N>?]?>R >n>?M?V?D??\>n">C>>H?nS?b)?X>!>> ? ?Rn>>H>h>6-??>x>>O>>?>R>S>@? ?G>>>>~>1>2>b> !>R>r">??$>>>q?>q>tb>>`.>H>>>˾>L>><>>)>>$>>xK>j>$>q>>>H>l>>X>Hi>[>(p> >y>>@'>~>=`=Y>>@>8ů==D">D>$>==yU=R; >lZ>{=t<x=@LӼ 8</5==pS=, `šv.< r2%I= yej@<I p<W=@N<o^C0A3=9`@v H"Ӝ߽ h]˽ ,p/̼Gp @p pݽgнx:P½H Pb[Ȭ)uɹ<r.9(=qIp_^82= @*G@88ؽ, ॽ ,PN rm5pȽ`` u࿑@XνXὰU@=9=긼 <\<@===+Փ +===Z= ½ *@.=w>c=E<``0=d>@93>"=ج=;=pG=8T=\b>P>=`$Z==,8->O>==>=6=(=i3>hKl>>iq=p=,>XW8>X=p=h:>PU>p$=@^=Y=>,> >>o>l==Y>L>@>|%%>>=](>fi>`i>0>Л=Н=kI>T>D'>P>a=S=X%3>T:>`3>a\>HU>d~>+>$;>,^m>@r>HA>f >>>7>{> f@>P=6=G=]>}>% >(=D>Z>P|>V{>z5>t>XN>pȍ>ם>>>ȢM>,>,o>Ə>W>ec>w>>\\>D>P>l3> f9>pw>P]>,>,>(O> >>T>@H>x== B>P>9>8R9>=a>@>=(=T>7> 1 >xj=P<C=P>>{==X= 8<}p=>0˕=/zJ==Y='Փ;@=d=K: <9x}pn@s^ ἈH.ȁνv`sXǽ ؏&(}ʪ߽l _`q1@,a򿽆N=DzXHdsze>()ꢥlxdhOTɣ#N$쀳0xwpɴގ;$/6rӾzԾ⸾h{ȾdϾ0'hᾤzd^ؾ l >ؾF⫲& ^ʰƾ$޾hI ϾҾbE&~s<<3 X龧! Z׾~}F ׾إzJvĥھ4־4f辘5 "Ѿ3˾]d=]:ʾhܾ.VnB= J^, s2־ھ&3ָs¾UգpǾXpeľڰ|)춾5޾gi d۾N侰K ׾XؾϾhz$HAξ 5N=ƾT|_ 7.Y^\j2lHyجFTT'嶽CXdYX4?40CA7\UTG 0JP޽ܡmTd09kkͽڣ31@:J`.޼[p=ұ<h:Ȁ= L>|JX>H>f>$*>\d>>0x>$>1/>A>d5>>(H>`>k>=x>`=>q>>|}>>æ>F>J.>>D>>>G>>H4>궸>j$>槲>>Z>>>>>>>VV?|5?j?>Y>jD? ?R?t>>L?'>z >?h? ?T>,>d?WD ??3>q?*|? !??D?X??l ??E? ??NL ?>s>?+? ??=?,??~[>:>4?Gt ?p>6?+?J?K>8>,>>q?u>FG>>Xj>̟>>•>:>t>3>>,>*>(>>>N>S>>ʥ>ʥ>BΛ>=u>\fX>z>ޞ>F">>D)n>l>L>>*[>X>mU>0;>Bw>> q><>(=;=$>{a>tM>W> ܢ=0^m==P>=k=E=A=v=$N >#>'=iU=p,={F== = p=@DZiL;@<@<< Pk/5Pxr=0=`;ƼX `<@<`G>ѽQ7@<+,Pƽ 08w'|ЉG⦆Nʽ [Ƽf:CPnHSm@h;XuK@ oy>ü㕽8 q\/5/5Xս (浽oێ瑽.H[4/,hp&P.H(]ȳS`ֽ@n_\N~Mnp'HT̽(M3xO(],;۽@Vf|>5 )5P]Ri$J)^ rp6 @mR@&t <`@v.P7=@ol=l)=1ϼ p;8=X=`=<=<`ݼ &!=/=+=0g== =}=><>s===>@>DI>p>P=X=,>I>XW> >I=P>d >H>ȡ@>%>=He=PM= =s==`ge= =8> =P^===A=@>)>$>4>=Ȍ> >He=(=t>=`===h=Ā >=X=@M= ><>=k=)>)>o>|">~T>g>7>%>l4>!D>rT>^.>x=h=>Ē >H13><6>>R=N>ր>XU>Hh>]>m>F>>Dߡ>t>·>Ȗ>ʿ>7>>|}j>OT>7>$> !>8)>>==H>i6>\4>=<=%K==)>>=@ֵ= ޼=w==J==D==@G<< =v: *ռ} þv 4Nb߾LξEվ|}꾬T羆sоH׾)꾬߾4f̾ٷzLؾKվh⺾B{lD袾X hXF(qDYپ˾(оn|-w}Ω\:6XBW 7tHx 6}jx޾"T -Ir (?L0*ؾ@ξ,(ξ`Ծ4־;žѾ z*<|:߾ܾ_׾Hоh[˾žl~~hWɃt.f y`yX]<:@jTsF~~|}&E.F̏ntyt4$W`aK(bmDeL< }9|riWm{h hZAc(i<}޼XV08eH޽hݓ`C@<C=u=`״=XD==`*>B>w>%>$>d_1>`=>peD>[>,k>k>Iq>>> 0> >@>t֠>d>>z>k>>~j>r>.H>>>>w>@;>}>(>ξ>n3>P>l>x^>{>ν>̳>L`>L>:Ƽ>>k>ޞ>Z>fm>*>֕>b>8>>>;>x>~>:p>2>Ԭ>\>A>>~>8>_>>"S>>,;>2&>>>F? ?&n ?&?N??? ??0?I??gX ?f?%? ?.F ?`?40?4??+??'?,?N(?~%?%?p'?W#&??nS??/?T% ?Y ?F ?>>2>>d> >ͫ>>>\>J>r>&>r=>tw>1c>HO>q3>`> 0>a>ض===8=h<=|==~X>x&>` >H=`= >>G>4 >= 0=>==&===P=L >>8=X=;=\> !>(>%>,)>Dx >X=ؓ==H=J=RN=Hۇ=_=@ < [Ƽ:_xӽȵpܽ\ p 콠ٽ$@H  t+.4EN<`(,6P9,ht,,'[g}T|k`WT"Q<=y!tH#Խ8䔽 _#1$f;`=4"= ,<ջ[`:U!3@Ԕ:bw<<<<0=X=0=œ=xƧ= =0;=P = c=y==∻<HH;`; -_,{0DXC JLDӽ=Ē 8$hݓ ozG )|5HrŻ ,== >$> >><>e>m>Ќn>t>-|>>>T>t >W>T>䅌>R>@x>(b>(d>[o> @>ޏ>4>>>֙> >t>>F>Ӝ>]>T>6> >u>B>Pp>6_>̯S><>>=n=l==r=&=<<ї;K`&п 04`A@mRl@KFWID"=<`H%pUKϻ;<ؠ=8E=> ,>|I>I>K>xb>>>">>>ta>q>h>@J>=>^>>]>4>b>؞>ܗ>H>|>4v>zӭ>h>M>V>Zݴ>(>>>!>@>u>ͤ>"s>`>c4>>=@7= =cv#?(d0X[eI_`ԽǦw½8wld A!<. ./*}%̋-D;LU2ێJt{4]DGFt)d0нo0:G70c?鼀I;?pZp^QumhlB+FW;pp Wz`躽EP HF`d),5c0},tLdDؾ[LtFGE2<';Nj/"0flWN#P} "2$d()L X2ibھ̾ʟ rؠ!T;\ˑ0՝$P #: VʾjH߾ގ~Y޾:PӾоѾҾʾľľP^ž𠿾ƺF4PȾž7ľ׾6pBV ?(!$Z#,NMx9hDqdPRG㾮۾L^ ھvO˾fl֡mxaOn.ɽxԆr_:<`xQAX|̽ |3;*l)`MLӽ좽2wW?xH>Q`GwIi@<(-5=07Tkhv7}Gd2ێB<|4^tdk>n>zI>\S>>T> >> > ?j??&?Y-?Hu1?t4?v6?7?K@9?H6?&.?T&?Z1?z?Z?? ?6 ? ?^?K ? ? ? ?\ ?7?*??Z??t* ??>&>>C>x>ؑ> >>k>R>L?F>L>$]>3b>,mY>@[>k>q>Pk>_>/e>s>tz>xz>x{>82{>.>u>*K>">8>Ō>dqx><>>>~>K>?H?^ ???k?(n%? (?Y)?T)?}&?R ?]/?{ ?b"? ?d:?P ??">R>>>>>>4>e>N>>B>l>>h>D>F>ۦ>VF> >Z>tp0>>!=`=Ǒ= =@gsf@ | 70W@N{T`` 28O+8塽 ` n@5F..L`a뾽H ,(;p@X29ҽ`b|; I~2>HI>X7F>e/>2>D3>@>=:=@=2 8`@H@KFV<<;=@LS== ?<@<$=l=0^m=/=@+<X;%(ý, f9$.N 3[\SQYW>(8 () h V|z8o>Z>>xJ$> 0>hJ+>4>>>ʿ=Z=<]`/~`Ƚ¿pax](`9Msͼ )zh$=C=x<"ϺL;|OX]80``ͽ J;p;M<8r=@<==|==,> >p1%>LA>?b>4y>Lā>d>Ǒ>>9>(|>Z[>N>`>>&>W>>`>6U>=>nF>>">|>j> >>N> V> >>*>>v>Np>L>L/>>>0=н=>.>dL>m>=`===Xۀ=Xx==8= &<f(ּ`"@=Ľ뽸hXὰ-Ľ0 ir}`<9=M=f=`=b=HU=@m==n >N.> *>Y=>o>ҕ>Ð>"P>n>V4>H>d/z>̫>o>@>h>>G>E??`>0??t?*&?>>>>E>>>Զ>@v>O>> 1=l=HH=0=D== =ڣ={=>=@}$ 3!hwJ fDn R &^)6/3B552$/)#^!r&q'j&!hjf7n sc辴6TB~C|ȒgBZz|lfЛ^C󾚇8ʱjݾT[Ҿ;ƾTIP䩲fP72Ǝx|bVJtþ4f̾Z4ӾξپܾھNѾRξ̾Z3ƾƾLN^U>[ol愾2q@ %|epZ(qY^G<$=H_=@=DC>K>Wo>Lp>(y>4ێ>1>}>~>>B}>Z> >>3?S?B*>D>R?7?: ?f? ?I ?j?????h?N!?%?B$?e??L?$?=(?8 ?> >>>>4>>>ئ>*_>>Z>>>f\>>b>I>z>Ћ>>@>>z>Na>O>ʬ>>N+>o>e>>`>Щ>ء>R>G>m>7[>^>@^f> w>c>>>^>|9>,>*>t>0>Z>>P`>>|>>6>>>*>">>D8>>@>0>n> >>?c?v?C?p?GB??޾?f?f?? ?3?(>J>>>>>FG>>>>g>ދ>Xi>`>0Ig>d {>rw>m>4~> >w>43T>H>kh>XO>x.>8>>=ܽ=+=OP<DOnP) R`֏ z }nni,q<`Ly(;.[4nCo½قz`šϽpJ+:0@;e< =|S=(=>B>l->`>Dz$>HN>tu>`>B>x:+>2>8O>H|>t>b[>l>xpd>hg>Y>l@>%>>t>ܞ><>(=;}=Ї-=N5=-==0CM=@O<L޺\pQ嶽Ȭ7.{A꽸Gr[dWEQݑHc"?dϫ^ǡ|Xŝ\r~am fT9`h)`1qkWhTh' XT8N9'@HȽ׽8ըNCƠF=iG=o=1=(=0>4!A>E>@93>`3>>8>hM>F>Xv>*>N*>F>.i>Ҹ>1>l>> >,ѕ>L>Ѧ>>>pe>>V>d>p>D>>Z>\/> >=p==`=&= 7޽zTP`k*=xY="=y=>:>@B>C1>B$>uN>>>y>V>+W>l>u{>l}>a>'}>v>ֵ>h>$@>>>J>:>y>H>~>>&s>>N>;>l>&>J>|>z>ڵ>4>>f>XX>+>ל>V{>ȡ@>.!>>x=ҏ=H_vHvMqf@\PO^0`,SpGsĽlsIXk_ڏĥ X ܩ03p̾"DbB= ʼph=F=1<mnZ~<13;.@X¾,ʾѾؾyξL6ꔾtcW Vp:00sh3Xe˽Tis󾽀C0=X<>,> c=`C艽5r`Q4vT,6Y$N 鲾Nr s-Y6n ;C1Au"!: .r,!<>ھ7bExXWҾ*BSX^M1" p&ڏ&{& uk $G.0.G Θ X)>T8, 0: .,b{ZOP u#d 6']#20ffbtΩ>>D~>DHS>HA,>>Q>h>H>r>g>>n?$>>>6>nS>dq>d>P>T(Z>>`>n޺>̳>ʌ>>~g>K>H>>:>'8>3l>nۓ>*>> >>->|78>Hh=>`=#> ]>_>Xv>פ><*>b>>V>>Z>>b >T~>6U>Je>5? ?S? ?"?&?J#?J#?$?N#?:=&?a0?,B?Y?l?Au?p?j}d?֖Z?hM?=?1?t'?$)?J-?94?2g??4UF?7AM?["M?%sL? R?6]?g?*k?bg?gW?'`F?E>?0?'?g,?8?JG?Q?`V?iP?G?E?@B?K?:U?7X?V?fP?:N?HTL?WzD?h:?e5?n!,?.?V6?1?,?-&'?T ?/?^v>>>x@>Y>b>>l>F>>܏>#><> >0>ϊ>>k>>>=>>6>,j>`,>@)=X=0=Y=>N>/>b״>>t><>b>Xj>$uY>k>0>>|F>:>,&>A>>44a>0F@>2>E>_v>n>>F>>]>ȗ>,k>*>H>&> >A>0=P.=0>->5>j>=:<8=L>4E>0>+>|5>z= g=`½T%3LI:t6FbܮCIվ۾D8p'.ݾо۾;後پb Ծ2FھF޾2WྊھؾƓDj߾ؾkᾮAh޾V־!޾龢mݾZy޾оNo^~/}\S8GLSsŊ>p rX}ބ~l}̌nf eD{ezHS(~2ͯ<QboR&?Ծо& ¾ҶTptbSvSBckYg0 푾/ľj6p Zmx>/nbL込z ͙ [n0r lrƾdľǾVYҾ뾇JF >I򾜧辒Ծ0z07g$*1dֽpp~\">8=S=`H=x==`=g;=r==3>`=X=Ƅ=4=T& >G>4v+>H/>=@<@DZ<= =}=o=`0==(==h=l< <P=t=`<`lu *8=3xFY|mqovr ljVp lJD"|&8=3S,̙ ЊԽm`MR8 =<:+L@v< R= D=P<#====~=(r==X3==o=x==5=p=8=>2>e>jg>D>>~p>HTL>>p!=@-=U=>:~>4>0~_>P6>>`==o=`ǻ= >lzJ>s>45n> 44>X܍=:p>z>ĥ>%>R>꣘>"p>S>LC>T7>8>T4>c->8 > =}=;@a$p@bSJPZ+pQhz̽PTL,-=8s=@=`=3=<&ؼG=ٽPν@ =(=W== >H= =08-=@!A<b@@ ==l>|3>Y>(>n>Z>>@k>ã>\1>w>>\Gs>,mY>ԻL>X4>= = /'=h=8ێ=x==L>XN>y>ȟ>l>>XIY>JQ>0K>,H>ؓZ>8]>|V>$k>>~>$i>0>9="=8O==Ȅ=PK=Ռ= < B9㼀!^{H@|C[WW#@%@=pNNU hy ã#ûo;`->,><><>`=(= =L?> >5/>|Z>m>%q>g>">>>>C>%>Lq>n>->i>> O>X=)==L=O<~C8>h㽰b`@130O=0>bn>>Җ>4d>,">HG== = >hmD>Y>+b>PN>n >8v={a= =`C?=pz==P(=Ϲl cY*Po1彐4>#p@,a}P8^ؽ`ڽZ>`.m@輀g;K===9=J=='= SM=0/9 ])Ͻnzb@'@Ѽ h<0$h=2=`K1= S=;[`6>uG>J>N>^>h>k>$vf>P>||)>0>D> zf>@_s>i>p;>.>ȣ=`t=g=<߼@)`04=K=X=ڸ==0W>u> "=<}Pi(H̛(VX?P0`]6zpP@ =p?>&w> ݯ>K>F>PO>T>w>N>>@Z>>ད>f>G>M>Β>$?>_>4>ݰ>K>3>FS>fi>?>p>=$ >P#><5>HB9>d">=tu=h< <@ <@X+}hksĆx ڽDKo r2= =LJ>tz>x>pb>#>>΄>V<> =R=(< R<]D<9;<`R=4=(=ʖ=Q; @:֙Sn<YHJ\eKHHWtp,5q IXf$p`HʽnHսD pc*v>=X=y=>8p>0V>=F= g=`A<6<`7<@e<8.=j>x\7>M>4Vm> >s>`n>$X>f5>8>6>t,>==hk=}== 꼘֒$@}˽K$+~ 4SM>ýຸ𑹽PO;=`">l[> >̋>&Â>(H>= =Hd= O=P=4==,>>, >>d>=PK=@=`B=@w< r<==, >XiK>:<>hH>>0U>lZ>\R+>,>>5><>n>>>x>f~>>l'>=]=Ȍ=~>4iY>Ɩ>Ƹ>B>m>~>>>>==@p<@<@x<(=+>>֪>& > >>Zۀ>G>=Ї=L=PƵ= ==T=<@H̛8%OQxAX'4ҽʽƽ( xk;K*=a=8>`>In>0Jt>8gs>m>^>D>n.>)>$P&>@H>ԗZ>?>r>=< ;T==L>q>">\v>XS>====ҿ=X܍=P)=Ȟ>&>r=q=p>9D>U> v2>=B=0===P==8E=$">,d>>̄>:>h[=| =o<@<趄==@">y>~V>ɣ>F>[v>b<>,>P~= =b=c==0[==A=腌=nC=l\> >ZD>&>j>V$>t+>K[>y(>6=ɹ<4Љǽ/ s ڽYYi;^>B>l>f>n>>c>>h>|H>'>~> hZ>@>ؒ>>JO> 0>rŀ>>H>DE>ɷ>̋>7>$r>h>c>Zp> b>*l>>Z>>b>0>7>(=\|=@=YU==`=TW>hk*>|'?>>Q>I>T > KT=¤&X 1ܽ ݽf >X^2Z r2PO=8r=>@0>`a>LSs>X>$(>> >ȥ=A= B='xU<7}`L<7=g=(=x(=t==>#W>`>>~F> U>>'>{>@>>S>>M>L|>J>`; >L>#>KB>]>Qq>p>,Mg>,]>W>_>^>t/?>~ >>>`/>Y>\i>F>Ԃ>N>> >@>>h== j== =X=~b>H>™> >p>0WF>9=e==FX8Xýf"̼;b&>(e>>S>>>>ʬ>4> 9> = <%oPhYG½ȗtuf.ʽp/?>T>>p> c>>,[F>.= ^<Y<@P<G@q𿊽hXﭽPJ{;2=`=,[><>=2w=0 =TX0򽜐 v27'5,9:t)/UN,Q`TYeG f9>U w{pbrtn TȾ~jl󾚘_ (Bl߾r۾֔;rVqϜE@ѨOzlP־BXXT\ "?*.:$վL烾sd^X(/>H2@>I>(H>MD>6<>#1>XU>=k=7<@z>ꀙ>*n>6>>N >TJ>Й>a>}>LǨ>ѷ>>>8N>f~>eq>a>(>/=0==X>5(>U\>N^>Ը>BJ>H??V?\ ?~>*]>(>>>sv>d>Vp>>1>>>X>ng>> >^0>>>Bx>4Ft>j>>s>2>,v><;>̬,>[;>sB>]=>^<>6J>4d>z>]>'>X>fњ>Ԕ>>,>8 >>r>Zv>T>o>>3>>7I>===%==+=M6=T=8 ={=$>z[>>>^>Z>t>*~>Jb>>">x>>f>$ǜ>R>,|>|kW>^ >R==Ă'>%O>[P> B>ԧS>(r> ~>N{>}>R&>Z>>rB>r>d>D%>~y>S>>=$=+=^= >d:>|O>`aK>9>d0> K>>f>q>>Y>x>Q\>D >=2;<]x禽 V๫~߻Qu ((Ƚ(=t| (ܽc:~<<)<a(;ؼF犽+ȽhԽh ` =n==y!>5>7>,>>NQ>1j>y>!j><;>>@]=HpӽԢXhxX`pͽ@@)8_ڼ`<=>&>X4>1>=@<< HBЦ(䛽`!R+p<<@*+ꪽxƽ# @Ģx3`YxҠxҠHrM;&־ӾvȾFݻ2ͯ좥R,0ڄov(c-Kd[1ԁ(6@H")\B2؀:L-3DE@=h=H@=#=ã=@n_=ph= K< =pn=4=(= =N='=@"=X;aH8%ټ)h>P>$/'>6>X>0}>Z>r>ׂ>UD>==3===0n= >s->J>FJ>P4>\ >_=x(="==@F>J.>3>>=pU=S= =a 040 0HνHýнHϽ!P^߽h C һ@4$ >\==P<1@"@<==>|3>x,>L>,>X>O>x&>0>>ȴ="=<bE/þ=HE= >Y=8==ߦ=.C=g<)<`<)=@]=`=J===F=8<`;[D'&P0~_`<z=||=t<E+@XQ8t Ad\ V|͹̋f,ѯ4˯FS*BS^`@)\P8 <")ШP]n`UBw(B@OQD() hKln/l<,=0)=౲<*$s-6L-@%Yս($p*)Hx=ҽ;y,r.6Лڽ\0HOL[dXjXDg8hǽx(׽`b5D06G]zĐdRk.5NVr곾gƾѾ.վ׾*UFXt:] B޾`Ǿ㯾񕾠^wADxH@h UgaY0]拽0긽ؑЕ  p7ؽ0T@x2> r@&t<<1=`pk=@;=<<=d=\|=P<0 Xjp? O==x>S>^>e>((>5c>9>7=Ѕ=(o=@=8=>@D> i>pn>DYY> 6>=N{=@G=k=Y=1>A\>f>P [>%O>H>6> >==@<Pؕ 0$r95`((ֽRi>;1=>>>@k>a>2>d|>o>LCz>.y>>.>+>>m>p>[>ЫS>J>P:>x(>t >Xf$>P0>G>b>p}>8>"ڢ>>Ϋ>׶>~>>>`{>j[>Ha> v>>>` > ̖>Ʊ>B>6>,k>0>(;>>Hw>N>T~>t>M>rN>(|>r>Ԙg>du>v>v>||>2$>9>S>Ⱥ>>樿>l>nf>ɲ>9>>q>⚬>J>i>N>;I>$N >=i=:+<@ܼePOhϽh⽐u罨u мPS?=Q>OW>M>g>>>>6>0D>>[>>V5>ց>>>~>>tz>( i>_>t\>`>|m>|>~̆>x>>Z>4>T>>>3>N?>>2>V>|>y>N>xL>>=HC=(>>`= >j>.>6>Zݴ>0>S>x>g>tt>N>ڄ>|z>:>.>~>6>>8>&q>p>"b>О>˟>>0#>>@Y>H>.>D]>L0>H=shLQY>0>>}>^>2> >-=6=0_z=pV=n=8==H=R=` <@?jdUK<`G=0U=8?==@>8> >==藟=Pu=@A<@;^;_upWeȎщ ּE;@<=l3 >?>OI>e6>>p=0;=;r`j<=`q=¸=(==(=P== Q>#i>c>F>4d>=w= /'=jK;x@3Q/P=P:98h V%=@==d">3>|}6>@0>Ȟ>C>=c=.6ӼƠ<`4=+pT:m>S>Nq>>X>>L>\>A=6<=0*=_=>G>FX>P>9>%>E>N>8_ >ȭ>=X= =M=`i% /PǤRҮ ީd(QD"vJ82{8bL<zdP4>tA>9>F$>= ==v<=o< tP ۽Wн^mR0J}(< =;`-`:廾cξ!оW;پގ 侦ԾHþlX!pl< o41^_ǾR¾RҮ6B͎Fʁl6$>l/>#>X=&X=?=`p===I >X5>\>tP>@>؎=ɝ02ǽ` n3#@wiռcx晽ʽ -Dz0DދN2Rp{k`TJ.uK 2<%=#>D>ĸ`>0q>]>B߇>>:>Bi>>>>=ڣ=PU= E<˻ĻM;>I/> C>D>ĕG>h(S>Lk>B#>؋>8>ҋ>y>TJ2>=F='s<c;(r!F<*Y._=(u=,6>̭9>P=`>>6>>x)>>Y>@r>dd>oM>T7>80>u@>(rf>Ȅ>B>a>J>>8w>h>dZ><A>,>l> >== Q=(r_uc>>*>>x}>fi>8O><>,.>̫>8>~>=c=xk=S=˾==|>>2>0F@>tN>_>r>`M>`>S>>>> >Bώ>`o>h:>>L >>==9 >= = ,<< Q=P=p=h=-(>"\>Zt> >>إ>>ʗ>>d”>D>h:f>lc>h;s>V>`Cs>R>=>> =X =@k8=@<;@`4Pսs9D$!|kBvO`gJ,E ٽ(}"@d>i:(>=P=@y<@k8`0H׽z$? =!\x 1"Q<[}%>HJ>(|>܄>2>> >'== == > >== b<7PN4#|X7>(_FJ@HI= 9Uܪ~Ⱦ#׾ϾnC>} @,Vx)%sh͚dڻ\3>t_*>@>tm>9>>1>rŀ>X{>[v>Nb>,9:>L>=A=>P*@>t M>?>]/>0F@>d_e>p#z>%>;>@8>>n>S>>>>rؠ>~V>>{>B>t >f[>>d>ӝ>%>pN> >F= ~=@N=0=q<< D=(=`.=,>x==|S= 4<@L6>D>Q>m>i>赑>n>ڒ>>>}>>6>>@h>\N>HJ>T~Q>U>DU> WM>4I>xU>d>la>]>p>>>Ȑ>>ޞ>Dͨ>h7>(*>3>>>W>ƒ>>>`u>`3z> >>s>D>E/>?B>tc^>$0h>%>b>>K>?I?܁>v> ݜ>Nw>@U>0>>إ9> @>PԔ>9>8 >xOe>3>=p5=} 3I`!3 ļnN<@<! >1== =%=<#<&ż wy;T<` = V=hy=Z=S==D"=/=<@<0@&=@ӎ=8O=L=7=~=p=@<y<@=<@y8ApF߽40V < ɂ=x=t>?>$X>M>;1>=`&=@6 r8e=o±H@,d:Վ>Ө.6DR>su{4씾:ΞX,H2T>l`όs,i!YSHB"(o_B0A3]wSȽPԽxֽŽАpxde? !y,$- >н==HV= T;0Vż邼eu @G @`=X=0><N>>`>>>pB>t >9\>L">>> %= =y=F=й=:<C[XG8 d;۽KRY@<<]<@F0.0뇽ƽPݽL(ܽ ֽ(ݽ0޽ԽʸEu0,7(>0>v=h=p=0=2w=k=h=p==.=`=0h=`w=Юz=X=%K=<0;gW=@=`<>:>\>$r>,^m>mc>\>p4>p= =M9HPt> ܢ; <ұ={>'>"C>8O>^>\i>`>w->x =c<! 0a%CxIWW^ `"ЌnSk轄>$LHkMP Ap! 0?޽`s`@@ U Խh@,5Tl "(.XW85ACP TZVhX>{ѽ@XT=pF= >==pz~=1< <@H<<=-=Ћa="= =]= tL=c=@ը=s=U;IZ<=0!A=c==B>>>h >'>=] (󕽘潐71aN'*(ȽtZ^ />'>=`4=`XS0P <=?$ (Tj$(;$d$}8jXާމthHQ8A|W*h$HdE=|hW`="Jž̾̾žbⱾ9D"D(浾XwBx7|:_8'޽࿑_Jbޒ0(5F5 5(^99j.@()X$Zndg\a_\tQK Лڽl2@P&~L_@aac<_s wf,V;.p8HDӽS ˼F!<>Z>s>{>O>K=`k=<P;ugP7@#>k>h>H%= V=8x===(rhdIp"]>>Ȅ>>~>xt>S^>$CT>X> 2N>T0>DC>@ >x>+>ء>=G=@='>>4>y>PA>(o>jV>8>Vϡ>œ>>c>8K>Ԅ:>>L>c>hV>:>PÎ>>~i>|Z> Y>0\>b> #i>)|>VΔ>ij>ʞ>v^>Tu>?>=M(>`0>w->Ш,>K'>j>=`:=H: v8⽸D75K\k\uP?z,vTi\URU/ R `ԽsX[=ȁ=̾ >>H>x>9>l=~=Q<@ *PM8ݽ߽ 4轰ǽS[:_===p> =^=[=+==΄== =Q=@==P=; + ڈýPo0ʽ&#iL:1=0J=$>>8>S>`>DV>.C>H!:>->o>>=>]=>8N>m(>P=G>x҆>~>>X>(An>_> F= C CA Q;0=l>n5>,J@>|H>T~Q>pH> )>>)>t/>2>vM>rt>>Џ>M>`O>_>&= 0<0j~_׽Pѽ((!Ad;>`c>.>>>$/>>>>[>>>>:o>I>Ԗ>%> >$>1>AA> X> q>1>k>e>>bš>*>N>୲>H><>>vħ>>,H>><><>4K>>(==@===$>84>)c>>fk>l>j>">H=0B=<j`?dm>X>>`!>5A>Bp>D!>'><>>3>>r>|>f=N=i:h`,"x:>(cz>>>P^> >+>>ï>X>ʠ>{>$>B=c ,0@POP"=X= >p!>M:>TN>hT>JN>`@L>Q>F>[#>4s>$>>>i=^=L=H=p=\<`~hPk[*`@<Ї-==O|8'h|dn}*8cX 佽@;ͽUĽ}{hBP&t0B Kȑ{<ԛ f:.ᾊJz>N` Ѿ^~,}bC*ֽ@hKِ;<0W= <E N k!jkV6ƈZ{DHSt.2$ D2 pixϽ4S8.(Ԣɤg` Biȁν(ܽ.߽x6m y8AgpRXwPF/lT 8p V5ko៾6Rpcľ;ľ᤾lp6ͽN@I t̽h@hpP0Ƞ,0ZmZܠƾnܾN뾸9 ,վvɾ@þŦ9X|Qc4ĽB$q\=@|=|=t+ > >n>=+=ἰ]`K2P ۽P Sͼ'< <`<8<`<=@<@d<¤GW>HH>>@>P> >:=`H= 0kpK\%<0i==<>`>2>r >0=V<XY༠z==`Z>>1>ˌ>ZS>,k>_W>`>>0>>>3>Q>rp>xJ$>=/=߸pt0АHxɽͽhiG O[01>X{^>(~>z>>ZD>>)>>>>>>xv>L[>:>T >0>@!>P>9>\eK>|`>pn>th>Y>PQ> #b>L>fH>>X>>n>>؂>r>*:>|z>d/z>|mq>81n>J>l>P==@=v=;=(==D >0#'>D)>Ģ>=k=l<<`<| =0>>#>>>Z> 5|>=A>>h>%>0$>)> EA>?^>Z>>i=ټ4$BXWl قlw^E1(ԒpD>p5==8_ >> >>g>=V<Б@|,OhTV@25$0lE`{>$;X.@B dӽ߼_B<`C<@x<aZ إ0C9(Dw1PKoAv C[ 0T $1M0圾֪ꗾ jr'[ <@%<`Լ3@'٫@0'lpWelNȴcB.ViµԾr <'>@.>8>=ҿ=@=h`A@l741uhl׽H0սd<)hȽxHpax TZ8-P^_@@u†>>g>Џ>>->x>y>~V>r>V~>xPr>dq>+e>2>=`<@P8fHxhݶn;`-=x= >HB> e>>?>Bj>t->V>~i>>> > }>!c>H2@>]>>>#>8>=6>,>)>|l0>K;>`O8>5>؁G>8k>p>>I>>>z>>>䗅>f<>X=ȑ=5=΄='<;^TMĽ0ܽޒ`vʼY}>>Rµ>d>>(^>E>ĥ>t`>i>>t>fр>y>$^>Ԃ >+=<SMSX`\uýhD4`@9,6f>>P6>hc>Z>p>Ҹ>r>_>@P>$a,>I==,=@=#=l=t=(=X=u=`a=@<b8@d> = =l>BX>uN>n9>$>>2=?FX0@ҁpp0 )Ͻ@9"p~fjiľP_ҾЛھپ zӾϾRξ؁Ǿܸx)JT[p&5нP'n@oPn@ p@k8 P>`罨ν̽(ֽO׽hɽxнxQE ȤHdy`޼=(=2>HA>t;>t.>>̾ >/=S={=#w` zp3?&\(Q,B81|(½@w~m=8=>d===x=>\->@*G>Fw>0>~5>x>>h>> >z>s>s>P>]!>TX>>,>3=}6=e`mX؞k+L<](=pt=f= >/>O>^>3l>(>*}>>j>>d>>->Hb>B>Tz>X{>s>fp>$l>K>2C>\b>>>|{>}>b=>i>q>?u>ă>>">>W>j>s>W>\>_>NG>> 1=2\=p=x<`l<@0{l>Ŋ>>^>N~>5x>h>i>H}> >R>>[>~> >t>2>Y>Au>q>Td>1>(=x{=0=1=Y<ۼpXV@{P޽ PmM R 3[@ `a=]==j>TH>>N>0==5=@i=0'=T; I#`q̽$7 <-|!p ``$<@c=J=l=Z<^C<~5`-L(QqNpBipXEþ̾hJžXþžཾz$hнp15@:< 꽘ὠ½Ǒ Ҽ=+===-=Z= ?9``3Un`K]CN9l7sϑ rB"*C|^r錾тtn0O8/*l, ý𠥽p@@(ɤhн( dH`]8"+\c1.<ԷLN7 }ʽgI~<@ol=Յ= ==p܆=g==03P5HQЋ gl<[ C;Lv H)~hd+@Ľ@ S==|=n=P-= <Ч=.Q=5==s4>.> >.>>d\>c> 5>k>hX >==*=`==h=Q= < S|b( p XP[<`k=ê=y=">%>~9> D> gF>B>9>(],>m!>9>0===#=見=x= )==b=` =Tz>F>Hj>p>ǫ>.>L>\>w>U>.7>t>>E>;}>F>\->;'>">H=@V<Юzɫ h']ļpS=>G>Hf_>dH>#>>4">?>O>zT>|>>>x >(>\>H> %|>ħZ>B>1>0>/>=>:>K=@N=, ,@`0ս`5T你N`}(< =Iq=P== >S>0>x>>l">@)>$>>>>\> >P_=@=(=v<=P|==d=`y= >1>!c>k>}>L]>>C>@<>H2@>@>/>H >=s==Q =Н =˺07(uGLdO_@]y/H<0gs=_= S<%</5;`9@?8F@1$i>D|>\p>l]>$cF>\>=8_=D="= B=`A<@*>P;F>L>[T> i>s>D>NJ>&^>9>fj>d>h>l>0O>|78>4'>>@">X.>J>hKl>>r>t>>O>>>Ԩ>>>>>%> S>΋>~̆>> y>fC>( >@=@}=@+=P=x=<>K>F>>И>g>̩>o>Fܔ>>Z>}>H>>K>PN>Y>T>ē>ͭ>X>p>4v>_>jC>X.>Hf+>$q%>>p= f<BN$̽B.70D" hս(pGy;`E>З&>2>(pL>e>e>hM>>.>{>@W >= =7=@8-o x' >h>>H>==M=#<@ˆ8Lt \H7 <@ShKU!û@W<@H<ܼ2NѼ@[$H >=H=`^<``"@p5YyhPս𱫽ZDu8@Z#}$TЮ8踾 dPǑ]B. j矼k<`=0v==XG=i=R=p)=`),= =;0_ ؉̽@%0Hɽe@f0=/=X>آ>>'> 0>>E==a=8=9`=hNJ㽔-a\fbZec7b7ٽ`͚U>|>> q>*_>dH>8 .>x>>0_==`=(s==h9=6=pI(2Xǽi=Lὐ4ޙRwP<_P=h=>*> VG> ]>iq>t>Hk>؄n>L"{>8ց>}>h>̟Z>]>Z>`H>,>đ>>}= T==p>&><>>ܤ`>>>6>>>W>>,>^> x>>6.>~>,2>@!>>=2=] |[^>J>>>m>Hf_> f>(> >}>ک>>>%>m>r.> >>>Au>p]>9>,>HR2>v.>n >`՚=z\">LH>c>gh>m>pu>}>z>TJf>xMK>6<>9>+>$N >H=8=и=H=k=`ԍ====> 0>Ǒ>>j>">w>@_s>lA>>pE=hd=RN<@-n<"$= <߼䩽P۽pݽ" O<{={=>> =P=G==0==>$@->a>~>>Qc>->h=[=H0p!K. <`dzጾ&+rQJL-ָV88r 1ĐMNWExie'<}<U<,R hGH@-H r"ǂ2GɾZhؾྌ+AQb5,뾜߾~ξ肾cvYUP)y!\4g4$/w-YH􉟾N0c8$ 꼀L@<Z<*;5hN߽*.P-|HpDǟ`Yp@tQn@;>|@>87>,8>pA>CI>87>>'>q(>#>p>N> >%>u=h=P>@>`)>h:>7W>涄>>>>|>: >1>>M>>Y>`W>'*>(.>C;>X&>8D={=@V|Ke>>Ԓ><Õ>̄>T]>X>y>Ǝ>>>p>br>> i>nV>í>>,> x>t>l$S>p)>t>0>^>pc=@<௘`0u`ͽ|3(m%9;'8 Bǽ ea;=d>B5> I>hd>>> >g>(/[>Rb>DW>5>>>=P=x9=P==?=@</5<<Y=(V=p3?=О= >&<>dZ> d>\b>`1`>4P>\/> >(=<@>` DҽD0_mT*tۃt@PաS#I08o8?[ټ*+=h=t>A >P=(ĩ=~=<ػ`ͼlhmĽ v8`J$ܣqi*KH0(Ü4lHTDE,ӽ@]1wB$=h=U=@N< DRȍF`h&p7sx{ٽ0$؀`哽(@hB0@&=P =>(:> s >>I== Ͷ<pXr|`νd} H#ԓ&`o^^&;<<;O λ`< %=xl=T8>F>L>?>?1>->]>===X=(===<ұ<@7<j >8>]>pU>>,_z>pER>H=>}/>D>X==ʪ==|=v==(=x-=h='=>6>$.>*>PV>Z><>$@>ӽ>>α>J> >>Ь`>*> >P#>D>8==xH= SM=`H=P<<~C=@=(-=m>*>Dg8>X->> >(.>9>E>LRf>hz>,}>||>>b >Ƹ>Ұ>><>0>>a>%D>+5>PM%>"=`=ѻ`LE᝽.ѽ 06 (ýt)c%=<0g=<>̛&>V<> ]>> u>>M>8|>?b>0O>^5>> >===@F>0>,>>TG ><>=T>>!><>e>މ>\ >42>HS>Rk>$> ɂ>L>$>$= N{=_=='I@4pSs 5@ `` = N{==@=@==l=s=@=h[=̰=HE=$Q3>m>>x>"p>8d>ܳL>>0w>P=pP==<9,e]  V\˷O>廾8P챾ۦuX~M$pi5ҽKp22@K8䖒DJOTlrHI40!dmk'8Bbd f@(_;=> r>Z>|Р>b֧>8>>tg> K>hC>@;>>=X=lU>m/>9>;>>> V@><>@>`O>LA`>s>>f>v>]>>Y>ù>>ʠ>B>82{>g>hd>$Ug>GW>`5>#>$> >>H=Hu>8D>d>s>8>>Mq> `>P>T(Z>z> A>`q>>T*>V[>i>l>>>>|>1>'>x>h>xl>`>x>_4>E=@/<ؼ`xνx۽5Lʝ@7<<w=`i==4!>S>>&>Fޮ>>>>ة>>1q> w?>>Ю=@==h=ƒ====x==XE=@j=8=82==> >4;>Pj>>jp>hC><>[=p=@<@мЧ@G_X3ƽhA@ ̛&lҽthΧyɽ,H'*h < \=0}R==7<,7<6/n`躼_ӼM eXy8͂ f>]پd龶^Ff6.׾H&_枾ۑLf2`ᖽ $<'==P;==0=} ݽ(*l#F&\Kv'E `0ݽؽ߽ܽ8Q 4h|S`->@<؟==(=0\=k<@"<3P޽8{4 6_MسLT@h igtaDx>߽bh(:ǽJTj$ b ݽr@mR=L=h=8="w=Ph=P|7=`<`</=06=`HeR>sa>f>,nf>mG>>=@v= D=@)>xNX>9> >>lHy>(P>N5>>x{=@O=yG=U!= <D{@&O@ ׻C=xL=`==Xk=g=<<0=x===DhE>>F>>`M>>L> b>~>t>ڒ> >>>fw>ȲF>> Ug=$2w{"(ATC8s8XV+ЦHQ `u邻=!=/=hj>p]>>b>9>>VG>>|i>>>=^=x'=P===9={=4>>>q==>P)><)>,>>d>>k>j>ؐ>>/l>R>>=Hc=X͡=0B= ã,$>@=U=@a%=w-= =*==X5=t?8>-q>:>>$>x>Xv>p>`Bf>l>Lw>u>Pk>W>A=>g> =ʸpT>r㑾2 \Kwh*m8d2Xt: (Ƚ@s<F===X==X=@%ԉ{>*Z>d~>u>w>H#T>M >x=2=%=>=1 =<(==?=9=>Hy=x=X4=@>=#>$L>(V>#l>F>>v>>>:>@py>Q>H4>80>?>=X= = e=`>0==>lF+>S>&X>g;>x">==`=H >>2>WW>/>Hv>f>o>0>l>P]>:>>g>z>V>~к>>槲>g>|>x>`.m=89?'5 0HνƽUP=i@<<<`<Q==[>$><4>Ej>ւ>^>>*;>Z>>f>_>%>==PWs=D=%Y= =蘬=$=P= >s>0=h^=PN=h>$>*>Q>`o>\n>Эm>0b>3>=@h=_<qXg1p 你Nʽ0ɽ@LӽHʽ#@W:<8`==A===/0w@C[`ԍx+(ؽxɽ1ܽ ʽ`Ш,;@ãhX 9(5IJ @d====k=,>`=ǃ=4=đ>4 4>d_1>>>V >=`,^m>T{>i>S>x:>d(>=pA=d;_@V ∼ 9<^'=0=8t=0=>t>==Xd >t)>6>xL>>H4Z> x>">>>0v>P>x9>->>>y=@-n==pT==@=>^.>PH>Y>ԆT>C1>0>=<<,7=a\=g=d:>>J.>u>J>ڱ>J>괞>>b>Ʋ>ƺ>: >V>3>> >ԅG>p=@(<𮄽XX )$14/tnho޽ѝSJe@|<`=p=F>0>pa>>5>|>I>b>.h>`>`>7>>`c=xY=P=O=>, >N>*>]=>HQ>yU>WP>tH>@>tP>@q>Z>8ց>j>>>>>Q> `>C>A>7>\u>HD=H===b==>>t9>.5>$#> >\>p=`< T<@ЛZ>Tb>pCl>LBm>h)`>:> >@5>x]>Xa>||]>H]>I>7>8=\D0܁ Vhc\$ppCl/b8<h` <֒=к=Y=@=@==5;2S ,B@2D't&H 󽨜<佀ƽpǴsu`fX ¼{@ HMHb8ɽ뽠 2_Xvg)K$EB"(ȽބҪdd:28]𜾪1w~L?F8ʸYսϽѽ 罐@ol05z0ЦPϽ 8Ԟ޾`Q@ݾ$ Ͼ˾ɾHľJӜ򊒾$vf(; ŽQF;G9pEҽ|/U\|Zu&ÂPh^_bTTA7*_hi0t s !$ ,;79Kj~J难d:~8y^X-h ֽY?^ZunwV@;P.!Xu&(86Cp.2dp2,7xȽ0yvÚbҾf羒 WbѾǾ켾&5e*Q1P ,>0=H=`[=<`;@ʁ= պ ">a6>$BG>a>5x>w>~i>Y\>BJ>D=>8;> F>ga>Ta>\S8>H>h'>'>D7>8>_>t>G>>>,>đ>F>P>J==\=@c=%/== c>0WF>7I>TG>HTL>M> 6>>%>0}R>xo>,y>>>>0#>tƧ>|6>tc^>+#>B=07 =2㕽pc[Ļ;@<0v=Hu==>x6>k>ޒ>U>>D>Fg>>>N>H>dpk>NJ>@J9>1=>Щ9>7'>(>Щ9>Hx>>D>L?F><>xF>;^>u>3>n>&=>&>1>>>j>)K>*> B>D6@> Y>9>L>Ȓ==(>=H=tr>(o?>\d>T}>pt>O>>=靼h팽$ȕ͓hJe0׽Z`ɽ@Fd0`м40==a `a۽L"hVH Ǒݟ^ A>R8[ f9l&$ q(>=ق=ٺhH*;kM$-Ah@  x `šPS?ü~;##=i=g=L)=_< kzP4 4L$0h(o] OLdHĵ9|PpXe˽R@ʁ0=8/=x=>,m%>,>d)> >====H=H=*p===y=z=8=0ʈ=P=C=p===>FJ>_>r>hπ>l> >>>=Ι=xi=Hʁ=`|=+=w==84=C>>>V<> p> >>졘>w>v>XG>>P^=ȯ=yU==xÀ=Z==x= 2N=q3==[</5<B==p==:>dV> k>:Q>,>4S>`>O=X=bJ>`2m>D>>>݊>>tv~> #i>8.G>>>`/F>DF9>A/>\.>V.>H6>8>#>x]>pQ>G'>:> P>`>u>L>D>d>Η>>$1u>9>h>>>==8ֵ=h>?>UN>K>,w>>l߭>J>`ٴ>>>$w>pH>|.>x>x=8=8q=Z====~<>X(KͽϘk`üI<==w=Y=V<ƻMn@pѽ xhǽp  H޽HF$̽9t;0!=ȿ= 0==觘==^'=@<xڼT0=6ɹ͚@B0@-nv@+ԼhP-@z+M;@{*<0< :<%<<О=`O< (9cȒԽ߽,"X)c\ &?н閽`֒;0Z9=蘬=@=X=z?lM³xMbr>T,X "⺀<ݻ`~L̻Pj5XXo-b$Xp.2fо侬B侈 ݾ{ξlVݝ-db=Vk˾LѾ(M;ƾhZ=ڍVaqQnwvTqLTD-0Ƚh팽*@ ޼6X׊9pӣP<2><> >@6>\>*<>>`>=<==h=7==@=#1=X#=> >1>0>@>9>:>>>>D> >~g>8ƈ>ʼn>4>`>^>p>>]>&>p3=<;Q<;41;c<5==@=-D=` <@TLB`H:@<0]==tM>$>a:>xMK>T>Z>tZ>|:_>h>X&t>>6>,ѕ>4>%>Xލ> S>Dk>OI>8>lV$> >8 >8>D4>vT>f>h n>>t>6>,>>W> U>C>I>x> 1>b><>e>g> =>>!>v'>\ >=ٲ===6><>^G> }>>D>>b*>ő>y>W> =>,>d>A>ȏ->6>e!>j=(={=0_ (ݽ`";(*NP-gozx2illf򜥾2f𽾊xS^؍-qLT. ཀS0.Q`h@¤P#*@ʽp4 P(\t7ؐ3dٽ  `mD`ļ`<ft====pa=5= =h8=;Pkh؍ ~N|zX&|Eǽ`pjBf==l=G=@=*;<<W;[<`LE=Pxr=}(= T;&GX8,>Sd5x0|vM`šh^; پ޾߾n۾Ѿڲ꥾~ԺsS&@_0bJ;P=8=S=8==8=G===0(=ї;(E=ZP`yvt\ S:<'=`n=x=)=l> >n > D>>i>@r>оs>bӀ>D|>`>M>HA>P>w=*p=Z=n5= t< 6`C@P@5>T>S>J>6>>xǴ=Ц===4 > 0>\a>~>xZ>q>L> ">=:=`d->R>tv~>>v>^>^>>>8>&^>`>8$>0=P8=@6=@= =(=v>>3>J>ԖM>L>8[>y>>?>ک>>O>tǴ>>.>Ҟ>fр> R>ԖM>X>A=> =@==@=J>@> 7>l>>쀳>r>8>>R>\ge>W^> hS>8>lx0>S>>>M>I>R>,c>0> =o=@Y=PԔ=X=@=:==@ |=V: q-=|n~R~a(V2HѽPx@Rn0+>hT>w>)|>c>4K>P->=H=< N50'޼N XH>xk;] <k<y=@=8= ==t >,F >==j=`nQ=&f=< r`B`pp6f@O:_;@F<=<4h lX(ϽxIT)! x  ^ѽ8ը qƠtq\@A<7 '.Pp _4`xѽ𰞽˽D-@[|(L\8s<@ȼs漈ZT'>N\dHa@>jH8:dOtRXǾ2`[QXU% j\ginھ[оc¾l]W4mؐІ `-,E*~x8x½Ǧ`dP p(hʸN开̛<`c1=Ȟ===Q=ܾ>8=q=\>6>f'>E>0>T:>n[>i>v> >ĝ>>>>J>s> 2>>0=D>\>4;>tc^>g>B>>(e>O>h5>ȝ >=-='>|H>U>e>l>Dc>lO>>p=w;ȍ😽mH߻wjPaHrQ\PW /'PJUXB>z>u>(>>p>E>ۃ>D)n>,c>Xke>c>,j>_}>>vÀ>[>4p>[>K>D=>6>9>l#F>W>sa>i>^w>Tv>pt>$>>X>(/>pd7>,]>o>bi>Nb>`>(cz>>Jb>8>">jy>>>>@>/>b=j==Z=`< <=8=>0=p2= `=]<`b +@BP<@"=`'==<#ٹ0 D6@`j|n~褋"̫,yċ0H@hPI04}p]\p9:ЊԽ`սm`*p{ڽpǴp|<+:o<@N<wp"Uupxypt`jpgtp<`格ͼ8r멽"06 ,p3?`*9šR=P=V=8=k>@0>E>x!>=<>;`?B,ҽkM<<X<[}<90c?`i9 5u@ Uw-J1p&`MR)Pm˽h 8R_9jG>4c >P>>03 >,''>S#>G>`">l&>>,|>">\u>=ұ=`=>=>h=(=Ы=%>W>c>t>l>>>X4>ڪ>>fj>[>$.>#>>>v.>إ9>KI>D8Z>lT>/>о=p=X=0G=h====]=h==(ӕ=,=O;` =+>zTC[%``@@` &@uRa <M;\@g<`I=0\==d=0v= q=P=pxd=06=@g< =_P= ==HF=>x*2>H>^>oo>q>*&>v~>*>>x>> >`> >d>>ߘ>bn>_>DV>di>Cv>إm>@N>,>n9>8j>2>P>B$>bš>B><>(>m>|&>8>b>E>Bg>t/s>ji>(k>0ށ>>2>J~>\H>>h=z=W==`R=8=8=>>4c >=p>#>p.>05>0>#>\>"= W= <@B:@/Ph_׽ 8Hx Ҽ<m=`o^=<e/Bc ME<@=`&<{Ƽ1p^`p7Z0WA0E V^]\,~_`}@̬@Ͼ\־<۾bJ*ݾzԾ ¾|z(؉p`~vp>ity@r._̾?$*4"&@=P]7vΗ<ïVjG\0b^pQu\c(I1(0ȽQx@ ݼ@O;<=`=@<F<^0wHݽ %X&lT}DhuLՇ@vT'M\3FR\Hֽ a~أl!,+,j2x9s;x^ѽȐeM?x匽g;Uxgh^j6ۃRF0Fľb׾޾pH3]0&Xi"ݾ[ξ@JȵN|~w0bTQiN,;T)`#7`D(XyDpVwcvp42V̱mIpd7hP C=H=x>T0>UU>X{>>~>ꓟ>Ze>>k> i>Yc>8/T>7>3=ȱ==> >$? >#>v5>b> >`>JƁ>Xn>`!g>,o>u>0x>>,>Ǧ> ">d>>>۹>>T>>c>|}j>P-g>pa>[>F>$> >=`N=,7` Լ@o; ܼ13=Z=h=>Tk1>P>dc>Wo>E>J>v> >9\>(0>g>[=x=v.=r<<J<<<_= = ==f=>+>DP>Hxr>^ >>4ʢ>ڳ>Ă>樿>`ǻ>.|>,>>\>>Ȇ>/>*>tŀ>X>X"> >+>8>>HB>>9>&Q>7P>w-> >o===h=P == >"> ;>^>8r>@n_>P4>>k=5==d=p==@"@<9c 8;pPvd ,X~POsdjVA(7k- :0~߽ `$ڼĢ+&`͚A7ɽl1((hF+CB)O 7% Th4&xЩY~ڼ `<.=p=<=`A=<~@' <L<@<<]ļbt;*+=pQ=<@4==ȕ=>=PR2=@%<$?;`ˀu缠1@<(==@==l=e!=f<g;@&|nL:@֮W;З8g#TYRa2vPAҏTW4o$H8a%DPppŚ0Vs S=(ʼz<(=P,= >G> >`>@l=`}=a<~bټ,@ V;9<<]|sh@A%@|`yp; <@)=`="=h=0= >> >~>t>*$>4;>y/> >>)> B>4V>LV>\#M>b[>,>c>"p>n@>*$>\ >=Ѳ=P=?=x>h">E>q`>8r>$i>bG>`N+>L >h>g>,>*>40>*(>&> %>V>=R=I0!AThͽe罠߽ bT0;TN7@X<&=bi==p=p==g==[ >P:>QN>pa>r><.{>Qn>DyK>&>> 0>X= =%==^=ܽ=h=b=h8==s=l=hh=:=`]=fJ==='>>0y>[B>pVX> K>I6>F> Yn>>>y>4r>>>S>:ר>>>P>(q>(>H>tO>1/> >(===~>F>+>K>PV>4;>8p>=؁= ޼==( =Ȥ=*= >o> > =@ ==]񤽸ؽ؅ܯ,0A9H28`1 (нb vXp<@! <-6=D=`<==uY޽z엾F*(Xy r<dt@usإmpnhL9kFVlT@~X|v{OυjzNfnST.7W< ȾȾ.ľ^sľƾB6 Y,r8*זTY_$HƽxifJDp$ӽ ȿ0(dI _Yclb d9\NJQ r @Xё职xzbJ!x'  H 8hi?;PPXIjh07Tx;XCH.p`D 4;@`(>>> >Ж>5(>(L&>](> D>_>`a>XjX> Q>0W>8d>44a>(b>p>t>*p>Lh>W> L>$TZ>^i>Toe>lYK>̍G>_>5\>cP>؄n>y>x>>^>^>`>b >>>t>I?d ?p?>Jv>FX>r>S>>4> }>hv>r>8e> "\>dN>T'>=Z==( =z=r=>> > >,Z>x=p>#=H=آ=7=щ=0k=L=S=(==g==`=8=Q==Ņ=`<nm#> %>A!>>ͽ=s=.=5=0==XF=@ >31>TN>lA>lv>pU=^=< <=@=hL= =L>> =X==ҏ===̛;,{$>X">;'>\O>>>>w>0;>>`=8=`n<?;꼸0ͯ,(d8ĽYW D A:acJe쾠{ o֨۾ E=< ϼNu>8c?>=P:8ĢpvJx==< 5D$E*Q˾`.Ӿ˾z⚬jоžj|(漾5GeҽHu?bx匽@<.F5p,Wɾ4OV3==^0(֡Ąu(=LP>%x>Zt>>қ>ܞ> >>>`>:?H?<[ ?>>Dp>#>K>` >>P>">*>>=>P>>l>m\>d(>s>^>= =9ѽ@%P_=&*>>>@dZ$1DHGDc>Q>i=`r[$0h cqy誾ԅǾN*\? 䆳⽾0lޠኾVbd4_ӽ⾧1x8I?Ox_^p\b$8 v~"؈:[¾ľά6~\ 0Eg:!=t&rkվԔ:Tz\|Y8_Gԩm7p>vՓ>\>ן>o>(>>?v]??h-?*]9?>?!>?+??(>]=>$N >8>tP>L>:>H>Zh>_ ?)?lV>?LsK?80T?R?G?le>>>^>>`>>5 >D>|> >܏&>Щ9>G>]>@>W>>x/>oB>J.>ā>ho=ߊ==\=>`R_>y%>B= =0w=c4>4>>b>>\>>>>>>>0#>Z0>(>>>$.>cM>+P>@>h3>lg*>`P>C>>>>? ?*?^>?(:? ? ? ??X"?t ?=??[ ?`?)?p> >1>t+>L>|{>4>c#>py=.=$0>x>؏>zj>>>ԧS>,>+>>a= <@k v罀[*1x=>%>P>o>ء>H=ld>>>/>d~>>|">H0>i3>N<>Ă'>a= F=`S8뽈h<,|E[V| p@OȞ . בPp*C(`Spn40oLtؾnھGܾo :$~t"00<=6J)"d" >>lݾHn%3 &}!r?+cpD5OXSaH@IRG Cd^KGESB8<<B$EZ;T4<(1ɾ0w 2ξ44Ӿľ;gT;zjw4ȈxLξHܾо2־^о3l!ZX t+R@U+iQxhO4Vヾ~njtޜp3st-Y6ܽPIAp½Ec)(],l`Ň:<ȖWM0"νxɼP<ɹp/>,F >(>D(>" >⪥>|>n >>d(>ȯ>\:>>þ="==h=pC=(r8Sƽ)MP0a;( 0w=|> =>gh>f> C'>*>pb>$04>y{>,>la>'*>I>0y=`<0i=Xߴ=a>:>ȴ`>Zb>/> >=?= lS=5=>Ь=1>9><>X=@X=; =@+=>=h~==L=PO=#=pi==#?=ߦ(o?>м%>L >>X>`">xl0>== S>XU>צ=== < -h9YbH/0 "ս0yb⽘;(>Ge(j S岾E~0L ax?콀*;0=@!<|)`r۽߽p&`܍<0w=>|T>l>P,Z>XS>@===`$Z=x:=Xߴ=P8=X=w><>L>N>>贄>b>bÇ>(X>vb><.{>d|>>c>d>^>>;>z>Pd>sB> >V=S=% >H=\== >l&>9(>!>X]>> W>>@>Ƃ> >d>2>c>\ڍ>좥>,>=>B>>6U>@>>ҳ>>:>2u>i/>0=RV:`<XF=>m>Xe>= =`fX=`A=`h<7<,=P=Y= %>AA>0>06G>Tj>&>>N>rb>(Ŷ>Xϻ>͌>0b> 1><>R>l&>>H>===b ;>ȿ׽3`dm*p==<<`<92==P>@6 >>=oP=@=pC=` n=@D<NNະ[==P/=m6=V;40|BE\0Chgp3sm{&ۦ`.a¾N] !kþxuDw10ý8bpAUPklix AӾ ̾߾pTؾX_h>0`o|OL4v^`B$󎽸=8d =\s*>݃>`,>б>*n>职>la>,lL>0V>_> E:>f[>r>T>8O>pC8>d'>@=Z=$>'> >Ć=d=>$ł><>.l>>>S?>>>X6>6>s>>hG>x>pZ>>>LO>$;> !>K== == <'ex]ĽD`+ɽcv`<@]=@4Z=>\&>TB>$}>>Λ>2H>zX??G?J?h>T>L>J>&>K>~>x>=>ޱ>>FY>x>Q>z'>>\}>N>>Hx>K>4>h>`R>^>>"#>J2>>7>>>JP>>~> >ڎ>J>p>J>nu>>o> >Β>@H>hK= <0>|==l">>p==r=|Y>|%%>=Y,4Zȋb哾02!&p ʾD\E澪ξhQxpL=PJxI&I0kͽHA,(bd`rLā>9ڽ`^:`47нH"`(:ֱ"S;b꾦{׾PL^.h|0$¤;, ڈHD44;$"`XߴBT=j=R= P kL@Sء2?vx<XA 2t^삾/l<*JνP\Žph GI+WxhpVϣf:̾žNʾI۾v 5ݾLP̾ ʾ8b̾ ɾ฾ײT8Z<1`/h`3x>߽+5K 4E>>>>y6> =P=pt0= vf=@%>y>->>>P'> V=J=+F,/ |5pľӽwɽVv=@_=I>̉>PN=@q0K*<߻@8=0X=BXt>_G~7?Y$sҦ (P槽P:Py0V^y|LrL2t[2Cz.T8j|c-閽0@.0b,X[t;R@H̓t g:<ȯpP ( Fv.05=ן=P==L=|!>(>P)=׭<4=<o=< j<ˣ=J=>0=/5; ǭ8 @&lpQ1-P pV·`LP8HE`pM.8;4s$dKK۽ֻ' 0C9FTΪ_Յ`憾搾|Bx;lj# yNpڽ@н 0y@i<=h:=/l<0pP:P =?>$k>[h>S>==h;="=D=m=z=@_z<Ć=@]==bo>> >&>>ڞ>>i>:>mG>pU>>R>Lcl> >~>,U>H>@^>>>LCz>@>X> *>Ԃ >@#>==@=]=1 >T>>>tc>0D>ޣ>>(K>XF>$Q>8>P>^>d>>ƕ>?N>?P ?>R~>r>ȁN>P=ȿ=k=d=='=I= =|<LBܩݼ0 4THv0B=,Z9>'>)>K>@ <05Y<(_=@=^>ڠ>0o>=N< T.6;ʸ=ps#>r>=ps=Dݼ0^m&f|O>`P>W>d9> >~g>>>>>>Ԑ>>\]>$">%>)=@I==>T>X=࿑=p&=?>:<>tO1>̍G>>+>< >@X@Dڼ;< >6C>X>^>k>>Ш,>N>= 2>`I>I>E>)>؀>}==A< ]< =ן=A =<= >E=`pk=@횼ƽWk<X ZJ>>b>=Ї-=$>c>̍G>>>>Fv>\a>P.t>W> A > ?>L;>>\ >p!=#=!= <^< \==">>Ԩ>BG>Պ>> )> =0y>@N>s>h]>*>.>h>R>>0>>2>{&>0^=<i:`?1<H=( =%>x]>;>@>@k8<@IY8*+=>l3>;><N>9>:>8c>>t>@>\P>t>p=0إ+I9 P$ B,)A K|F]~f_\yxʒDf}v:*$r2?BL`P@yֽ@`z ӻ0Ϧ_@[l(ȽBX/R< QlZ@LӽE"; ,0>>x_==$z<ʖ=u=4B >b@>b>R>E>p1=h<`bXlC}Pi$/[a(BhJ0 >=+*=`pXV߽'8ȞBz>ȾBl߾{A꾄⾤վ*ѾJ흾rԩm_)qJ{Ҩ\hw[4-`=8THL\W`Aq8 /|4|p3twꗾ)ཫ‚ZǾ\캾_g`~:Lj=ȍ=D>T> w>hLy> i>>&> >z'>>M>DO>)>w>\۴> >Q>`.=j9<0[}< s >.> s >41>>lޠ>S>z>la>M>PI>p>p=h7 >@><>@>N>9>c>&>3>>5>H=y=?^=e/s4lDE#PpTr+P0l7 lӼã TڽCe$p@+=r`>ެ>>m>Z>>P8=@=ڏ` Gї{o====(==( =h= i===<X'׼l) ܽx{1$>6v==f<$<;x=e>Xb>z>P=ax<@I,C#0\S H?8|g撾s¾f@4d!꿽dHvؽ3`<9<`b$=P9,=ۼ|$RQ/ @r@`J={=@<^ゾ@cmhh3vꪾ,[ƾݷ[4`ھؾPnʯն"dӾ<]%$l-*0 )Z1&A뾆ھ$þ]Zv뤾l43㶾 ¾BѾVyhY gM ەK6Ѿr۾i>8vP b۾xKT|`šX}x|Vv>%l̍{MU S x8 и%8 ½e׽ ct@)4I T&>`O>M>&+>`=;h<=e!>dO>, >Pj=<@<#?<^<`]=D=:M =٤=E>lg*>2=t>tbQ>^b>b>}>>fm>>|>>ʺ>>>H>w"?Й3?z/?o&?? ?? >>H> >^v>p>:>>T?|??\?Om ?G>b>@??%?@& ???%?l>_>>Z?U?(??|.?4?&1?d4?2?$???! ?p ?? ? ?8>d>??c?"?fY ??o?]'?'?Ʋ,?l'??(?+?:o?C?T ?q?6 ?{5?4??>.> ??M?>>>2μ>>D)>ص2>j>>>o>N ?h?X>4>>p>ƶ>j?P? C?G"?.?-?n,?%p?F>t>`>6>N,>0>$->Y>dC>D5>1(>$\>r>\H>>>P=A~:Hq=X=h >Hi>8>>d>m>zІ>0Jt>W>lI>q>Ɨ>J>F>ő>CW>t>+>`>>0[z>LO>>>t_*>Q>,E>+>0w>`q==A=p==>>0>zJ>Ǝ>I:> =,>p=h=< >e=`=XY=p<`\ż^07 pսPq(ĽPʽ˽νZ[B<"@[<=;ۻ¼@Ιp`!309}==P=P=HY=,8-ajҾN d ց-.4K, # 2%fg׾VϾʾd<̾6ИXvMо^¾fǾ6TӾj|ܾ⸾^= \5"Cf↾nHڔR7꒾P›žt賾̭`ĕZTkM k := d,.ݾ޾T;IpA*XNEQν(6CmU(U?4""8 EAe; 8 ^lHy@X@Yy(T:< 0``c1=A=` ->@J>tP>>&>>p>Z >|h>LdE>H'>UN>J>@o>HB>t=_;;@4=9>ܢz>>r>P{>>Ԕ>(>hn>a\>8A>5>16>G>0O>.<>\U>*>L>r=@Ģ< <Ȟ=<&,dV0Zmh==#=M>PӇ>t>G>̲z>*(>Js>>h~>J>P>da>.:>>>y>b>(>"D>@\>p?d?T>^P>(>a=p=x' >B>؂T>/P>lp>>>>T>4>2U>ʞ>,>->˲>3>lg>lj>q>`=>1==0K=p1%=vຸ:؁G|}j~oۦ8¾w(`|(sz\Ѿfb֧"A¾涄&fjNb tUN^/@2v|g֑ >2z߾ybOҾ׾6ξϾ4þ"w@h>>> #>^p>>O>>z>g>NŨ>Q>PL>F>p>>*>1>>޼>l>>>>.>f>p>>=>&?l!?m'?l&? 0?R)?/?M)?`'?*?t)?$?5???R? ??m>κ> > gF>0>ЊT>p>y>>H@>͉>Ґ>\>\T>>(7>DV2>#>Ge>X3>P>v>p>>> >:.>2>>L>ݤ>y>Lu>:>џ> %|>ԥ>m>8r>X6m> w>>|5>H>贄>ҕ>1>\?>>Ұ>X>>d>һ>&>>?2?v?hG?? ?o>_>L>E?b>_>>h>?N?`?$>z>b@>M>2>|>D6>>? ?5?x?pr ?fN>N ?? ?g??#?k ?>>(>>߃>x<>3= >R'>>M>Z==o<`yv<7.; y>0)> D=ж=Z==f=()===T=@3ͼ0iP n;`G Bu跑$o ܿT k- )8 JN| 罨@hޠ Ž黠<=Ȱ=@|=廾|lǾR̉돾|?v0̈jX }脾T[lXg1<^27޼ㇻ9EPDU%(XWJ齨%>pn')O^R`{{@=Ǻ @>=<>*>7>0(>'>s>JQ>0X>_>$#>X&=T >v>>P\>4>8>!%>=>!%>7*>HA>/P>n.>>$=Њ=XH>ps>^>>.(>\>ij>>,mY>O}>>DYY>T> ڈ>x> E>p>e>>` >$<>86>Q==r=&<=P-=ڏ< ջ =zT===`=@2@=K==>=d^$>>LǨ>X>j>VQ>,>vt=-=D= <@<<+=,7 >_>$B{>xK1>==ph=F=b>f=< =] >_>r> r>dt> >ʊ>e{>tM>lHE>,*>->0i%>͌=H/=>h>`= B>f>г=2w==e;"_3P.xHľ>Ͼ[վٹ쑹Ծ'Y"ܾ{ *m$%Ҿ оF,%Vk$\8j8!u'8Br[M]UBQFNK1OBPӇ.qaʠT|7>>|>@>.>0HZ>T:m>\{>>b>xr~>_>>,>> >⻑>{>>Xx>!>>"S>( >|(>>>?w?X? ?6? ?8>P > >@>>J >>>>C><ԛ>>I>V>|>N,>>C>6>@H>`=+=x>t<>*>`>>p>Vh> >lޠ>0p>3>C}>>H>>>\u>)|>@>pR>P>8>>>X>Ex> K>Y>hF>>r>fJ>p>>,>$>c>>>>\U>>~>?j?>:.>>$>>&>L>"2>z;>>@l>>>|ϓ>Ԃ>>m>>>>H?;?|>>b>>+>(Ŷ>>>,>l>,>>j(>>?>>z>ֿ>‹>Ȁu>Bi>g>Lx>>ɤ>j>g>$dS>X5,>c->b=`=@s<t;#=`#M=0=[==@~7e`J ҽhj Tڽ(㎽s_ Sͽ,0 pA`꼠B@9` ѽ 3۽1S\uD`&Zi2@g0~=@=U=_`b$`k*ѲH횽μ'=X= @)> j9= <`J+=<0x=@<񖽀wн(B+hȽE/5/r9mJ~/l1.4fZBFcUqPdxHDj4TSPiZ`d(w@@Klz~Bby(;< /'=ȳ==pR==Po=^=;>xQ==[>첄>Z>>>6>|>>~>T>y>Ñ>%>r>Z>>>0HZ>a>XN>S>&Q>A>лL>8V==>y==p@=`,7>DE,>l(>8>Q=X̔=== =8=D"=@===&>n>\v>96>@!>==x=4D&>h}=>5\>Ta>s>L~>\>X>&֢>V>(L>>bL>`O>n>j>L>>>>4>RJ>(->>a>w>>8e>` ->Y>Lh>9H>E>]U>bo>V>n> R>L:>^> 0>ɉ=h=> >n>>4xE>8 =E/=o`Ĕ0kR@e<'<@J*$>ZpP>m9iUAP|0޽.s&XpyqM G׼BF&>LRrƾ\d”pr馾pRPBT[{okX%g|JXYgdu9m H㽼 r5Yqc*dJaqJN8 HC,7xP%hG\R+Ȏ $-Am^{D~<#p"1hH-R(pBX0r`Db`"\0+,^mXc 0z+LPա(P̙ 𯑽v.@AN#>l>F>P>/*>:>K>$I>R>W>j>rɴ>>ܱ>>֣>>:>J>J?>=>8?+?%?-i? ?V?\?s?Ɍ?? ?8>>>5>>m?R{?w>l>"e>(>5>z*>v>>:>|>d->p>S> >>x>l>l>>c>>bq>d>+>س>>o>=\>e\>K>S>8ց>f>Tx>>ly>6>>6> x>ٖ>D#>Dߡ>VH>">z>n>? >$+?*>&>>f>|X>乑>pg>$>> >^>T>XW>>> >~>>>(>~> 4>>z6??h?S?U?li>>? ?>?>d>6>*>`>>?V>z>s>>>>>H>Xާ>>d>hw>c>\h>>b+>D">>j>L>,>}!> t>S>pI>Hx>>g>E>>T=9 >T=<>Y=»Y< <8-]H09pyq(UL<`0Z9=˜;@8;lR =<*=c=;=Pu=@'< V+j⽔,tv 0﻽X`{ ýXX`<'=U=;==5=Q(>C*>+>82==== 0>XT>i>h>I==2== ɂ=~C=ϺxUTK*9`=;< <@<@!A;@03i)p3?Bh((hXƽ8<&5/0cZf:ֵ p2̾wLV K3v+N,C4p5?LqK8tEP=`/W@0_zS<!(5?! jhr5|ZQ0Ud x]=%= 1==>=l>g>n>Q>x t>˝>Ԕ>&w>W>D>6>dB> R >==S=N==pc= j=h=Ї-=` n@y@F@W<;zGI=(=@=p6=}=`< n5l)='=( =;=;=)H=<@<8ptfHCT|Ť8Nlˀ^膾"w\BfIEZpOL*nj۽Ž ?P֮-D`J0Y,r: r2PŨW8,op@xp Xa<p𥽀_`O`>>6=2>h>>>>l>Pn>Ճ>u\>|JX>|@>=><;>(>=8=M==>>=<)WP\Ž(V_ GռVO;FļP/;b}Zg׾zԾƾSr#2pP<Ӿ rj 򾨾羊~;?} z `,qZ'@/g)A!"R8. U uvtXT)HeҾX幾Hξ.8ǾȀ۾D6XY쾆T…辜Ͼ ۜj͚@qzL9ذ@@<;<źx=|=`=w===z=50l70O>8H>=>8)>u===x>@~X>$`>(.>hj>>F>r>X>}>1q>PP>$>tH>|U> >b=>x>H"=#=`/hֽ(@n_гv;;L=v=h=J>7=4>>P>=~=%==ɤ=Hu>q>L`>Ե>亞>>>>Hc>g>=c>|O>Z>da>N^>Ǧ>G>>>l?J ??3?.?1??o??0?B!?H'?7"?L?/?p.?#?($?-)?x&?V!?n!??H#?.?N#?<]%?o'???/?|$ ??,i ?T?"?Xf????%?H.?p'?#???H?m?P ?\?|4?f>B>>>>Xk>FD>x>P|>4^> R>JN>z5>h62>L4>J>&>>I>>>>P>>P>(>$>p>F>߂>>˾>$s>>tO>,>L2t>P>> j>ho^>4v>,>\i>>~>Dޔ>ߖ>>hЧ> >>ɤ><>>z>>'>RM>>8>>@>D5>·>>º>t->lw>pix>X>s>>x:>م>v>|z>^> Z{>i>HA>^==\><>Y>/I>,)>l>r=>>~>hA> >ġ ><>>@W >8=G= <ugXԽZ۽hԽp]ҽ=%=H!:̭9lu2ľnB~x6 R}&Z2| @"?dImXμ: R∾2ݨ,JpCҾƁξն`tk&XWy69ADLx/նVnɀv:)\b$xx[*prZ'pc*P7Rȓ8y(pֽV" .x5ZVx{ D}.$4P-Кͽwpq `Y<`&t=k==H?=<#==?*>DW?>pV>R>$CT> R>x>z{>f>PN2><)>\1,>>| >p>8v=и=pf==X> =/^=X=, >=>` ->Z==&>P>Q>U>Xd>d]K><">+.>>K=>ƙ=8=P=@(= 0>>,_z>,>$>._>Pk>Mu>@>*C>>>pt0>P=->>X=x=~=<=E=+=`zXG>[ >l={=*@,e!=<`fX==x7=`ge=œ=-=@5g<8bpstӽ`P iq-t*:黾 Ѿؾܾ߾rܾžl@Y/\= R X :L*&2—,侐ھƾB۾*ӾxLؾ_׾ZxѾU¾& F﴾NOhþFо]¾,[}%6pPXQ=(0Y);` =i==I=ho=>D>E>k>((>1H> >2>N> 1>O>>>\h>Ȇ>N>Uq>>?>0>0>>T">%>>>X5,>b~>J>Đ>v*>>L>>>lj>9>*҈>U>hJ_>5>D> >f>@O=@===@ =`W==XX===h+=ϟ=E>P`y>k>t>l>r>Fˎ>y>e>q><>f>J>>>^>n">8>'>>>>> ˶>P>|>>D>>ξ>z> ?? ?r?i ?4?n??\> ??pt#?H-?Ā'?`?#? 3.?xK1? 6?R~7?p> >?9 ?'n ??l?? ??\r?>j?P ?l? >K>>I> >> >>>6>Ȑ>d9>h>> >q,>8>=`=V=@,=S;><> R>E>FC> >n=pS=ϭ=h=>=> >%>%>>Q=="=>=e=p=Pq=H= =p=t===c====XG=1=ȃ==臦=XG=TW>ca>?>,J>1c>Ce>?[>,)A>$>ij>G=0= f9>&>+=\>\6>#P>U>peD>(>==X=А=8V=E=Ҽ @<<<0X]z[lXjXA̋-E>ih{"⹑P*n!"1ݾ:Ӿ$0ξоޞƾtDþn;"6Q(n{UT69ۖ v2s HM(8)D08>C[N!yTPCd@pxZpԽZ;}zD>;@<:f`b$=x=]=M=p=}=0A3= S<B=7W=(=`=p=8>>@==D0>(>M=c=p9zTػ==p=p=`= s?=Z=Z;(;;< Z@7]n .1(od><>|ld>TW>`b>*Z>މ>Ąu>Pd>d,S>Zi>O>o>@>(> m>dn>y>>v>J>ם>>t >Hf>>rc>x>L>Q>H#T><>]>P`y>X>4}>Z>+P>N>Xn>X0>؁=^=t=0==3IcJ~ ; @횼5HdŽ˽sͽ>6 RJg V @F<<=`=P=` G=L@Lt^>Ы=;=8-=\=P>m=0=` G d{46@!A养K:@^C 8 | xl 2^ ! R :o4> +׾Ͼ\˻1,}F5H徒8Bþl wƐV qW}т6*<^Ň@93>[>h>Xlr>R7>>>H/>PK>b>>||>~>Zg>º> >> >>>>>>3>;>> %>>>+>0i>>>4>.>>.>}>>L>AF?6g>>i>Jʵ>I>8>LR>E>>> >j>f8>>đ>>@G>Нt>ޛ>v>F>Lw>tm>b>">>xn>>>{>/>.H>v>>>>m>>~>>FV>>>> 4>>>Rn>>ߤ>N>@(>>??Zi> ?? ???@>?" ??2?;?9_??#?,?8?20?!?|z?6??12?????|?@?w"?d(???^?(>4>6>b`>>L>>>U>f>>>7>^>0>B߇>>Tu>PV>x>JƁ>}>s>@6>8=p=Xϻ=E===!<@V Oe] +8m<j;0L0߼zb`-W&xptmhH@@8-;̚Ѥs(r]ļ4@#ۼl;/t>cP>fT>>h;=bi===p=`=(= <~<B=`=*= O=஋=8`=ս=Xϻ=<; JG.QƽH0ݽHֽ@@d4`}ļ >F>$>?>X->X5,>"C>1K>>h=g=>>(=D6@>a>_>c>pVX>\>=0=>(>>l>hh>1=h=TG>2w>>>DYY>K> V>##>>$>D#>i/>=0V=@=s=yU==`C< мJس̽0d"КMH逾8Q`P&P:νwɽмٽֽd(@0x8sƽq`f;=E=0=L=Pc=P[=A;>(@a<E<Y=0=1=ۜ=(_=7>x >h/>R>Z>tS>V>XJf>f>>Xϻ>,:>4>)>G>>>>⺄>dM>O[>D݇>>la> I>UD>Dh>pn>>@>`aK> >8=0>tTr>H>>X >@>>P>x>>0~>Ԩ`>2>@.=O=^=P}=P=H< <9U`eߖ𭑾4v^\!gl@*tG$b9h62h苾Inc>&rǚMڙl K^lM$>008O]@^H3M$x@(Ж(@jv@Nȁν˽SKLa_I#eRpW0JhN|\kXo$;8OhG8*Xt}ޏş~hKl]g텾[[p{8^L藾RǾfԾXGپ-㾒h֢$>"p4N701@.!0,1[-8([LQ}%سj{χ A ~6OǰZW!~DW\ ܌ Y(aG;޾,׾SԾ.ؾkܾ*վҾ ־nǾP~8R㚾6 Tţା&վ.ꣲ7lYxoP7x,Lv 4e%x,>8ID8$4_;|漽<s,H&EaGt<44}`bӀeS>NX{N~Pov)h)D)|ddLC!0ѽp ӽѝ`OQP>4)>=X=p={> ">t5>c>^>S>*X>Dh>>̫>~͓>\ >>J>>V>~ϭ>|>8/>U>L>g>0>Y?\?\x>>?I ??? A?R?n1?n!?$?|?g!?%? +?9)?4??-z?.??b?:!?r ?Ja?? ???-?H??o? ? ?l>>ű??7?Ƥ>L>">>>x>>4>p>.>ֶ> W>>F>>>g> >F>ȿ>>x*>ZE> >> >>7>fH?>K>X>N>~k>D>N>4>d>Y>>>F>*_>>^>P_>>>>}>>$R>>D&>8B>D&>^>N>>>X>̎>T>p4>>T>/>@>:>>N>0>>Ƣ>B>U>BY>.>ؔ>•>t >ܿ>ho>>ދ>4>>f>|a>L1g>[>h>@\L>y(>0">l >=l>=臦=`ԍ=@Ws=觘=0Y= =w;=@q< k7׽ P|pq ʽNJ@41t+#>\@>H]>H\>I>h/>,o>Џ>'> q>e>)R>IU>`V>0F@>pV>7>h>7>)6>l!>V>d(>>H%=>#>&>A(>pP >T>>>=>(:>!= ><>|4>T]R>HdE>\#> >k>=D=ǘ=8=`MR=Pw==@H==b=(N=@1<g;<)ѻn;:`.=e=`A=1=X!==ڣ=(=^{=<=y,=pg=8V== ޼==/P="=Ќn==8=Xj=P==v= /={== =E=`W=`<<\=`hr=0v=>$#>> >t> >1>~ >>D>_>ED>">>> >>> >8=x+=5==M=@I,=`MR=p!=P-=<` ;"=Z 0»`ݼļ ļzP~ѽ U0ѽȽ+⽨Xݽ @5S#KaW0Ubԍx+s,bsjl^}VVP1w4t}V] , |йh|` ZcCZj|4䢾FBbٰb躾F žd˾|&=)ƾ xN*r¾Ih\ؾnEҾR޾ؾRnؾؾzȾ0$ξ8t߾S2z߾x&ݾ&7,Z\H d iRp@<X*=J h;?g>' ,   <  Rj L+ mb:b澊ھ8d澞<タӾ;˾$|¾Ӿž404̼Fݻd趸~zþt@⮾,ұ&{2u^r~t@y|{l{a,(h\V_\0([<|i= ;TiX6Ⱥ3 @NFXl8 ap2jk:@p<;$=Pd=p=+*==C>@> > "(>'I>9>9/>|A>t1Y>m>l|d>X>&f>ec>,>{>-|>HV>ĶF>s>d>X&t>P-g>tU>=q>\>f>I>C> >>a>m>亸> f>> !>t>B>L0>->p>>&?>DI>x>>B>>s>G>l>>>>B:>!>>¸>Hf>h>>6>@>g>b>6?R?8>t>{i ?| ?V ?JO ?> ?&? ??ҕ ?m???A?6?b>> >d>>ޡ>Z>"V><?d9 ?> ? ??'?й ??@G? ?8?4? ?O) ?8?]??b??'??L>^>B>>J>>g>t>>R>d>|{>~>>>d>T>jH>>L>J.>^b> > >>>`>>$v>ܴY>RQ>hLy><ҁ> >>w>XG?> V@>A>x/>$>t)>8> 8>P A>"2>">`@>TH>4>lN>jp>H>/*>0#>2>/1>4U,>ĥ@>PH>x,L>u(>m,>{;>>=%=`=0ێ=}<a3= BDXLXdmG$7`O8&ChZXD V dy/==PUpZRMg pィA 6x{ZǽԽ텽葹׽I`p\  dn,НЉǽ`PWн o̽P e཰m(pX½yHwXP(꽀ϽPd?+8T:);T= J=<h@c<=9ݼIV;5<<;<`,<<(;<(='=o;::<d=0U=S=`? = >=< Ug=t=N5=8Ģ===ȶ=@=؃=>)>dl>0=0>L> >> >=>$>= >=P=>\>s=>,5>'>E>h>X=|>M:>8>>x}> ==y=|j>0>` =p=PM=Ъ=L===@=> >>xm >H>C1>1D>#>>t==x8=2=k=y =І= w=ѹ==6=_^=f< <Q==PQ%=9邻Už@9;˾`о޾Ծپ*oپʾ>;;ѾVYH¾˾~ϾPN̾ʾ0XӾa~$־}ھĤ;ɾHɾ LľԾҘ;vq׾`s޾h;s*뾢m߾[d۾2⾠܁{Lhf?`nCd.(o?> (,轠<L_CXpʽxp]D0!2"):;Ϙ<<=Pq=0|==|={=a3>g;>p>_B>!Y>m>>la>M(>(>rT>X>y\> e>th>P h>]>E>T]>>b\>&o>|>>S>c>>>ݷ>pܺ>z9>r>>F> 3>J>>>>>J>i>>\>2>0>A>>R>>p>`>(>,>&>1>b>J>>5> >T>E>R<>>>O>??G?}E ?&??l?? ?IP ?Z?k?;K?p? ?' ??T^>X>g>[??~?[ ? ?)????K-??K? ?W?ɮ?m ?%? ? ?. ?? ?Z??0>>>>\>2> >y>>m>>n>x>پ>V{>>->>V>{>(>ྸ>b>g>z>> ˜>λ>Ā><.{>l>>4v>W>4B>X>6Q>A>TA>#>:>d+F>ԥ9>>p >=>c;> f@>d>44a>81n>dPy>^>;P>0k>@&>><'>Й@>\->&>1>$>P* >D>5=0=x=_>p>x/====x=0=E==p= '.=@< <;j^p``b$ppʽ8콽 dӽHu˽UXֽ#|`νahڽ 1DdXF0#'=M``>X"> ە= i=P=(=h>,.>LP>s=z=,>t>>$>X!>L_>h!>>.>=H=:>%>` >>9>K=IJ>>>J<>07>@O>SW>L4>2>>x>2U>h>@;M>pj>>+I>=>d]>x=۰==P==O=0=b=s===ӣ=}= ʏ==)=hn==x^= >P>lu >X7=l>E== >o>Ѝ=>>D > =I==P =)=R<Ⱥ< x<D Ӻ5<\ p`1jPx0Q4A@AL0/@뀼fƼP^p;shxƽt`p ',''1D'z<ܐg4eYiGP=0C() w 8ٽ\.7и%h!^@+W6QStϾ̾ƿ\ApV$ijDu 2C2SN.!&Snwko0x;v(_HJIJ x:ν g8>5@6:4 >,=h=Ht >L/>|G1>4>>.>DF9>t?8>0GM>lI>4H>)x>/>2!>l>>>|{>d*>>f>>>>>#>x>o>>>>h>1>$ >f>>">Z̮>߹>~>">x>bo>N,>6>fm>ގ>H>b@>V>D>7>D?b? ?v?>Y?%?$>8?JE>>>^>>>6>j>X>">!>>p">|[>>7>4y>/>Q?j?$??r? ?{?F ?? ?0 ?n?j#? ??>?J?b ??*?H?>>?)?2>?,6?u?v?e?Sz?>w>x???>>>">*>>>>>>@>>J>x>>x>t>Ē>6> >>L>y>><>>>\xk>r>E>.X>ݑ>T>'>>م>ޒ>L>tw>d n>Z>T]R>Y>vM> 6>W;>>X >@>` >0o=0==,=(>>{=I=X=W=]=q=H=P=t===K=q\== *=Z= ]={ \ ")d 0\--<@Xx4$.0޽0%wv@%$@ o0 kap[xex0r^`2,X̔ڏ 1ADpd0\Sv&xȼ  :FX<߼`G »0p;=p?=w;{=p=S=h8=t=p=h=pD=(==0=== = 0>P>T>L`>>z>l>0=8T=0=>=8=b=س=H=P+=e=h߭=$= %= >>=>h=@>8>p&>1/>E>C;>:>>C>(^>V>0>r9> V>5>H/>">o>>>@=0=Y>`=xl=p#== X=(o==xp=B=b >>\? >H;>0Zm>cP>%>Ȱ,>TA>\N>X>7P>h">%>D)>dp7>9>>>Pq=x==k=(r=`===Ȟ=[o=9=u=P==0=<0!=L=ʝ<:@vf<9<,<Ѳeps8+_`cx/*X=XM((#@7@4@45b.|>|/(\8xle)p3Nh\ V c|gj|h.d啾޾x[Et,^ٴlzMɣxK THt&#ʍr׾پؾӾXF̾Zᾎ<򾒰N-d&d 68UP.Lfd=4 ű$6U0=b] ` d ~q r4b !b󾰧 |J  Ody:) hF|VY#PqPR,[ܾ.ܾƳӾ&¾7˾VѾxþ2 ۰n2[ꞾijvǾ]8ꞾݘR'|F8ҕp|T$tL8OF kd~"^ýx*vH.EĽNJdڼ?'<`͚<@O<`&<Lɞ;

XT>dO>t>r>hp>~>>$vf>yc> k>>>w>(:>zH>>>ڒ>,>y>>:>zY>>>n>^>h{>i>6>q>>t>>&R>.#?>Z{>><<>K>L>>>>D|>X??= ?K?l??E ?φ?^ ?`?>(a>>e?b: ?l?i? ? ?#???&?@]>>>>{??~>>\>_>>>>j[>R?7??L>\>>n>>V>>">Z>>>B>>h>"> >7>4>4>b>R>>4>r>6?0>,>>.>@> >z]>@:>>>H>ȿ>`> >R>h>>>T>>j>ij>t?>>>l>>P>ֱ> >S>M>r>~$>ۖ>\b>>6Ȣ>V>>V> >,Ј>)x>vC>(>>>>4>8N>= >$>Hd>,>= =I=lf>D><>>\v>>PZ=ؐ===*=P&==؞= =` =Pr$=`< <߽0KۻXZ@ V0}R@׼;(;:] ;bw<6/<;0=P#=P{*=|<O<+=<s

>>?>j.>DI>XG>>>D>hn>4i>T4>4!>H=/=< 5=P==@">M>HDS>j>T^_>hP>HH>pC>4"N>?>#>$">8>,\S>Zb>PT>D>=>,U>8o>d>E> t>>=%>,I3>A>4>8===~= 7=Rw==]n=0dL=X =X=`/=P==|= K=@g=ȏ=M=8@==,7=@W=YH<Jt賾f亾󰾺" $nuȞ֞6A|¾hԾ^Ⱦ5ľҾ־Lܾ&?, aLSuV sN T% u &쾔b4g󾑉~@)S2Ypg@0|,^a,뾸쾀H(`⾞q㾆c׾XP|t 侠M׾\ξľHϾ`$XV: E߾Re= ߾xFgҾܾ<޾~Ͼ˾p;JѾҾ+Ҿ^Ͼپ߾Ҿ@}˾Ҿ\;ǾS¾~ҙl폾6ꔾN:p2fXoe0\I`& $8/<=2%<hin潰۽ ޼耳V@OD0&XȻ`֮<<=`(<< A< r2=PI=P=h=F=8/==^=0= >t.>(;>4;>>>D!>($>Tl>>A>$X>0iY><^>|O>H5g>Y>e> > >Ɔ>1>H>0ޛ>>>f>@>|>D>|>>=>>>>A>>>>>F> >>j>>^>Q>/>Hg>>S>>F%>>>ȳ>v.>> >>x_> >e>>>Y>U>DI>>z>pU>d,>>2>> >>I>>> >P>=?j?>?s?.V?02?5 ?%?Z ??R>L?>N>,>?+?.?>>O>>Ҫ>ʠ>>8>`S>>Ԩ>z;>&>>#>0I>>J>>>>^B>&>> >>>>|>m>|>>?>Vi>>>>,H>d>v]>>hLy>&ď>zѓ>bԍ>>ي>֏>|W>d}>!>BW>|>d}>^>>.>M>b>Tn>eq>u>^>N>O>>C>@>E> 1>(/>2>%>1>h>X$=h=H"== = g=`==:= B=Hs==5=@ =j=X=_=G<<<_*a\p-ۺ`>>4U,>H><>|>/> ===XY===>W>k>)=-=H>] >{> >>,={=h>>U==(; >X#>=T=h==?=(=J=h=(==x/=X=P=q=>=l==-=P-=k=p=2=X =s==(==@;=@F< h<`<< U;^k;;*@ێ@AP0eWg-d@m4vxt@P Z0Vl f.{o@Q4ɝpϽȁνXvѽpH@,Ὠ%˽(Ľ^ج̽;x>߽0 0 b'8۽K`2*мٽx L  H( (սX,Ѳp]D Ej~4ʽT[8 "\_FQ_0XSH13RX5`hlkss vv$P\4N\^v䐾FuQH1RG¾Z`a˾I. 'v\Xu:tDY"̾VʾdʾA¾,[ƾ¾V*s¾ Xdn5|F﴾ ľDy˾վݾX $ؾlzʾ2Ͼvƾ;ɾyھ=ܾbP߾޾ʾžʾ|ӾҾYξ;׾Cܾ-޾& fNN׾ Ͼɾ҇ǾQξվx־,~žFľ;mξڣӾ ˾ž$ҾAվLǾh6RlĐ`~`/zvيs|`xt;:}\~@)n$Hcゾipyq2t/stP>\0{صxaؓڽ(Xߴ`PWp3?\2=p=|=X=X=>0>$=j=@=`7>F>aU>A>Ta>,q>tw>Mu>o>=>Ȑ>Rk>ɟ>6c>Xާ>>Ө>V>RJ>>>>v>W>>>H>4Ȉ>>Tk>T>T>T>4>4U,>d]K>vm>>*w>,>> }>`Ty><|>>: >i>8>x><>>V>P>>>ն>>> x>>> >e>L>>>>> >N>^ ??t?$!?nB?6?%?,?R-?(?E3&?"??r?d??M>>L>{>D>> >>>N>>p>l>\>Zy>>H>4>u>>>s>>>r>z>t>a>>`>[>>>F4>:>>|>g}>[>X->x>9>?W> Q>0%A>XC>MU>Q>tbQ>=>>$>`.9>]j>&>q>tdk>>>R>.%>ְ>>z~>|{>T[>PL>>*>>>N>D6>b>Fz>>X>z)>u>~>H/>>l>>>f®>2>p>>|>>VX> >>xpd>65>M/>@>< H>|L>h;> >>0>`=&=`<8=yc<`Q< ==\>0>E>Y\>HV>O^>k>Ժs>> >y>Pq>Xlr> gM>M><;>=ǟ=M=>=;`\< S<#2@ڼ8<YH<@ㇽH@<"w=p=9';P/=x=F= ?<,<ǟ<@#<=@D=@5\>@P>$0h>#>N>>8>^>>m{>(>>/>XE=0e=<`ռ鏽$- K[䩲^Ȯne Dl ܩ@n߽YսH0\ i,p P=˽kŽ̈DU%x5|ldP劾g̾Dl|4qy'eOS07/<,ѕ`F~=H!=~=@W=(=>aq> >>J>ƥ>>$R>*[>>D!>=\>F>{;>)> 0>`=pWe=31<@0P An6֙ǝHڔ8DQNԔL~GvlL-P0HBã@ 0=n)mмٽCsィsc#l!tHDPL̽>ýX񽰥7x,̽좽v "`` 3ؽʽ` KԼQx=>> >0=p==== 7=$=K>E>`,>>C>,P>@>PM%>A >(==xj=И==p9=0Н 1|ΆAľhX$%'p"PNbӾ~5-0$׾־>Ⱦ8.BாcΒhJ_/ T/HAjb„ ۖ|y ۜ榋s,E((!`߽r'$B?'$D!e>yx y 1 $Ž |+p<`=S#=뾽8۽0_ `) bY0O=2=(=`=PŨ==H=@td&ؾb; q)w;nVKVxZ[PWdzSi|J:O91(G *!3!^#%@Xe  6tt侠Ⱦ~dMP䍾V5pQz؏~͓THsЇpA`{@y(н Žu X@e;41>-O>#>=m 4hd콬 ?`f=Bi=(<"PA,S^؃a(P. |PI@ㇽ׻@v<^+؎?Ct)9K'e\>ws3о:Tz$ !X7&ؼAUЇ-t)% fPS?>Ԫ>>l>N >d>>>,>\]>>>h&9>q>w>W>?>6>P>tuq>rw>dg>tQK>^>>:>45n>==>8.>b@>Z>8wl>`u>r->r>n>>>n>>V~>:>3>>>>Ó>4x>87>`p>=P]=L=8==_4=(=p=2=Y=`>3>y\>r> Z{>rw>/b>:N>$>=tZ=>>l>$ ?*->> >x? ?> >&`>>K>>ض>Pջ>ѫ>dn>>2>߫>ڲ>>`>>> >>>d>L>~>L>>>>J>>d->Vl>>>(>E>Ҩ>> Z{>[M>+> 3'>>=ȃ<#гt<L5 W]ăhd@L@E==>.>Å>%>(o>">2>>n>ʟ>>a>j>>j>Dߡ>՜> C>>*>Vk>^>>dĮ>(> V>XY>?x ??*l%?%??(?($?*!?@?,?>D?C ?d?%>>>8>&u>>:>Fy>>>>t>ƒ>>>Y>*>Z>#>x>W>ޱ>>>s>R>t>>>*\>1><;>1=(=olLM%Bx\$cs[يd”菉Q%`ͽ<)<= >8>&=<Z:o4<ft<`H= =HC=`=q===4=#1=@.=@O= _=0Eg=T=2=k>8>u6>9\>Hhy>|m>pn>$v>*Q> (>8'>P4>)=`C<@ V>P>= =;aDʽ½tY>8>}>F> U=@=<Rμ:; =x=8/=H=P]=щ= =<@|2MxӽJ.vT&˾\ϾPȾoѷtȾhھ,ݾʾ,Z\GE w`+FɽPpuA 5,)@`Q0``罀Xld|Z8xr@uȮ====0Z9== 0 ܽXc|97Н@N!%&DNhݽ\a<@h=p|=0=1ϼ@CσiܽTY B<6đG\(ĽX29e lpK0nv҅ U>84&Mr٭2־ :] ' jbd;`T64y`}p@6 L`AJ1;˾hľ|'6 "\b5"xqpXpd.!KDv x*<^@ѨLģJȾؾھι䩲41^=(RL0" |<l}ھ$x6BھbSܾv*98O so`n~im<=LA``-,1l;DK]Tԕ@,VjQ|32Hm.F,@]CtčEݽH>ЉG;;zp=pv=>!c>8_> >X~>k>tTr>_>=> EA>M>\O>H[>ut> >x> >ز>A>}=X=0a%="=,E=k= r=<=_=`a=<@6~>>>>j>S>p>P)=pQ=בjF<@ =4">$U>tu>d>f>fC>*>ȝ >(>Ĵ,>hnQ>X%g>(>>0>>f>w>,J@>(>H>r<o@}˽Ѕ`9<`eK=|=#>Q>$k>f>_>!j>8v>$y>~U>&_>J>X>(>>h|>>r>r>->g>HR2>===D >>>|M>tq>>0>L> f>pa>8h>L>->j=F== VG>>8>">>s>f>>D&{>h>l>n>z>N+>`s>L>>>T>Z>(==9=ʒ>п>ڀ>l>>>8>>4>xK>Pp>@>@4>8><.>t>8=e!=0潐S.VI*|Ha0HZh5%ŽGWg=8D==6>H>>>fL>H">`>>^v>*>>>+>>ï>>>~>i>0G>\>օ>jZ>l#>!>>->F>\/>d>|>=@==n=9=>=7W=^<`I==0_z=7=Bw===T>xV>>">n>R>,/>X>=x=ʱ==x+?>I>H>̳>r>>r>s>J>6؁>S>%>0#'>lH>Y> W>)>(Ԣ=`<Uo8塽(ӕmp&;==h>t3>|g>F >b>&>ʪ>(>:ר>Ξ>=>|>Ux>̰`><@Z>h>4k>U\>e>>pS=ȳ= hZ>b>:>8?6?Z>M>:r> >.>,>M>Ȓ=p뻰 qڎ iR5 VG0<0C @ۻpM=8`>&_>T>==H==h==>T>j%>30??Dw?J ??>><>ly>j>[>J?إ>֪>ܵf>~=qpὐ'@AI0x(`,0iYxtbQB`=t> >l=*<@)==5>P]>H>>J>>O'>PqK> >0>.>К>~>.X>ؒ>3>=(=>m>,>>b>D>` ??R>`u>`p=Zr0hJ_Qc`n2+bپν̾d~ʪ𜋾Ud{vp dմb='+̾h࠾c`5@+ԽЧ 04Ľ2L}/HhO拾&_DGz^5ɾľ 8*)aоtܞ='(bZ3ƾ ( [2"~XѾ\e˾p־ĵӾپi%,S\RV]^NPf\5Iփ:۱2";xoJL NJP NE?">_-X6DYپ ݾҾl־ѾXhTDm`H ە뽤Yk}$玾^+ɾ^۾N龀 SY!̬^P+Oo1F72V9;"8hY1C(#\ cN[վ;.Ӝ~@T|7i нf.05=趄=ǟ=`T==\ &>4f2>l>r'>P=hI=T>mg>⻑>>>^>>@>= >,D>$SM>`>f=u@u̽+MiG *X `C< <4=Q>=\>Fʁ>6->|~w> >f>p>E>m>&>C>>߷>R>>>>>x>>>Ŋ>/}>T'>=P=P=`=^=)=A=K=L<@횼0%uT\C@r21\>~>>߫>`Ʈ>2>!>[>̩>/>9>>,[>4>.>>P>>Ǿ>~>f>T>>>to>d~>o>Xw> K>D>M=##= $<1 ZxK1n&\?I,萾Zƽ ꁼH<N{=x=`Gs=l==m{=p1=A >%>ԗZ> B>>r> >p1>#>b>s>܏&>x=%/=<@< @hR0нQ@#Sd-*U b_RXz`o~D>@]J<ȍ=xغ=>>0==y<@04<@<`=>X>S>~2>+>8=== ><`ǻ@ U2$O',;>=>e>>Hݡ=0]`=h==h>`=d>L>+>W;>e> `>Td>Th>2>>@==ȱ=M>j>@o>9>>K>D>ٹ>>>>ò>I>6>->d>>n@??>>>a>z\>j>><>۲>ޥ>赑>`>s>hK=P-=E<`I靽:@!3 ] ><>s}>>>;>>X>>>&a>>>>c???B>LC>>>@>>V>>*>k>>z>U>8w>Lcl>\Ff>4U>4Ft>~>d>r>q>4d> V>p S>p]>Np>>> >B>FD>>~'>>>?T ?K/?(6?Dy1??T ?N?d>>ʏ>?Y??.0?7?U/?X.?`)??^?V?tA>Xi>>b>>4>>F>>(.>n=J=@===@H>\ge>\r>~>>">>V>2i>VJ>V> ?h5 ?~" ?%?F??? ?xl#?!?@??V#?h ? >H>0>lf>{> 3b>S>,y> En>@B>TZ+>=M=I;!0>{`@M`zppRȌ0?=Xk=`=+=$=0==>4J>dqx>>>Z>^>f{>>z8>ב>W>>:֛>t<>M>渞>>>Jc>°>&>>ϲ>4>^A>|>B΁>$? >=8=P=h7=`pk=H:P/L]e@UCPx{!` <==>(v>to>ב>٘>dӚ>l>->v>Ѷ>:>l͚>>r>Aq>|F>E >آ=05=Q=S<`P]xNXF뀾xr~W4FxZDEB @(Bb`\3@&BJ~( =q=/==Ȁ=0=|>.>Q>>x===Є=f:+zyc<٫< >@Jm$uY tr@Z^ʽL`gI~@YZʾ2b+z9O<\:3D' 6?*V;?DH8Nz@Ʋ,H8 (G׾ 1|h,X}Y0;0Wh}P9c$?:` f 4hHܔp齀ڽP^ȾR q>FN۾&dzU_8⬿Ls˾)쾴 侈վL=صf(J<*=S={=H1=P= <@BP@ <6=V=l=d3>71> =.=:&(` 梾ڎ4;ND\ZʗݦS !L|xtJ f@Pa@Kz$y$Ľ D04А= =`w=(=ͽ=P=X >><: >== f=p',cpP 0 (Ľ *ռ@pQ>>>N>>>†>%?>q>@>&>̠>t>>>> >n$>*>VH>>Z>N>>P]>|%>Ǧ>2>P>>M>¥>>O>>Q>t>c>,>Z#>X> D>>d>>X{>>8>>N>>$>+? ?s?ȍ ?LO%?u &?:N,?HS2?3T,?(?T&?? ?)?i4 ?s>>>^>?)?\@ ?/?vr>@>X͡>x>8r>b>h%> >/>(>0>>>>>>*_>>Ә>I>:>d>>>^>? ??\x>>>.'>>h>ʬ>X>>>,8>>,>E>O^>;>'>>->6>2>_>V{>(e>z<>4B@>E>>^= 5=jp<I<>== >,>h&>z>@=`=`==@I=8d=l>W4>лL>Hd>@q>$1u>>=>j>Wo>$v>#>=訥==)>^>m>D}>lݓ>>Xb><_?>>@>x>l>l6>k>>jE>lh>t@E>! >݌=](=!<@.@3M=XX=`=C>(|>&>pɚ>>i>I>|}6>->7>f5>;>`aK>R>|}j>>>>>F>>\u>TV>9> >==(=>Ty>X=Ȭ=0X=@=>=po=!%=g;==Р3=A%; Ps`½H@d"=0_z==` >}(>0;>D>f>Xn>T*t>F>w>J>0>l>C[>FQ>b>O>>M>T>x>[>#>@==gk>4>v>쐒>X݀>Ȕn>k>݊>%>>>>`>>r>d>L>$>Hb><>8>=Hs=0Y,=@ʁ<O9W;$0hejcX&QtOЗ&_hx? ߽PաP]R@6Xt|罠߽Q;@ol)8$c "݌<~=Ѥ= =(=xj=V=ב=U=h=+b=@v<@&FؼX@<ڽZ.ZL^>N ľBʾfԾ H:/VB\!; \ Ĵn 8ZܧP;ѣR}+Rҽ^&=;4=A=<@TL c 5@h"ؠ,$Rx|\k,0܁,ojw" æ%Tξb $i],4V߾ξNǾ ݶ:H{ P!(콸$@?>H<>:>` >hd=`܍<# fx,% U\eO佾8ݾ^Ȯ l "aK6{aоvħ׊|VEy)@W X42T69(;gBjCL*0ϽK=(=>`=x=@]=Z=@04[ăh$O>^[>+e>>P>r>>i>,V>:>e >`՚=;;@мbw?@AhPPih9$AnPDiR e3z@ɽX솽9`d`pk{a0e<ǟ=,">ht>>t>f>{>^>&>ܡ9>Z>J{>X>f®>>e>ލ>>j>0&N>H=h(=F=p==>T'>8 >=NJ= G =p=<@`"@==|=w=c;)@^ĄA>b>Mx>V>>Z>(?\b ??wJ ?` ?@?-*?)5?TI??vC?$;?2?r)?(L?# ?7 ?0??|??M?$>6f>Z>h>v[>L>$d>G>>>)>O>>>V>Ȓ>F>ؙ> >N>>h>5> ?=} ?v??>>D>,>>&>% ???U ?\ ??>>>6~><<>>HA>=>+>=(>м%>Y=Ha= q=<``<}`@>LV>8r>>>7>>Z#>f)>ص>>1>>>lY>P_l>L >K=@<@[TbHD`Ԁ( ϽqpL(F=(r=`0b(& D (ʽ(l̽(+5FB^\uPuJNþfʾ3оӾx;Ҿtɾ\Z˻ d.EZvBvRH`.Dڽ`@z ½@8Sƽ0k Q=H߻=p><: > >L>=== F8&dw\睾]N;܄twz@.gD.ʪ4ʢ򜥾pv~J< dP׽@lŽ` ԽeK2ߑY%=Ż#<N= v=0y==[=Y:=@hMĽt^|'?Ph8Ha*DD6۫"쵾žb;X{޾r۾˾fоҾӾF־hlѾξQQ djhnXdlx0pc*6pЉǽ5rwpvJ07 @ㇼ.6<` G=b= F=E;S<^Px(^X<[ \-a9j,\t`8c(opZ%tŽ 0yH׽A6]h5<)p2%6f<+=pF=H=H?=S=L>>>GB>>>Z.>4K>D9g>o>g>z>W}>>>DZf>@>Lr$>D>p>'>=<=P==dƽٽ`l[(xlZ_BLM%(.(>x;8̜3 *,&`ǽH^@q $=P~=,>.>l>Đ>>NÎ>>.><Õ>d>ly>D>T>G>>t>$ٯ>Z>0>0ݎ>Hq>E> ">Ȍ>L>4 >=N>x==x׭=C=z>Ȥ=Ѥ=@=T>Ȕ=H@>kI>\>y>>e> 1>>8o>|u>$ >>γ>™>|>8^>T>%=>M>x' >p>ܐ3>f> {z>T>>F>V>p>)6>= 5=WA;HĽ.b'$84y!8 !(.97& /'dv. 2L(|6'WЗj H8@RJLXֽ<݅NhPc̰h0! <<0=s>=0%u=pݓ=(Ŷ=N{= =xĀA܌3x 4 ,Gv 𽀩ս矽 ( 04xȼUDyǽh߭lq3dãD#:i`ۼ 0Ϧ;*`#M==#>/.>Ls1> w?>e>C> %> t>8>T;F>p|>>&>nR>`dr>m>a>->>ӷ=u=n=8=(b=m=Pě=p$=>>=>$>p>0>4>z.>@{1>P'>W>to>L>G>x>>>X>N> >l>`/>ҥ>L>>Z>%>>|7>`O>2~>cI>t>0=(O=J=@O=

=5=N=o=ȑ=0>>,[>DB>=U=E=<*9<ļyx߽UHVfttdT8S8d~ѽ@;Y0=g=Xj=и=n= kF=0|E=p3=<~= >L->HD>8/>8)>p,>==`l<;p,@)+n9ch^52?q\d06CxɽԽ3X烼B$==0=*=%>@6>7>o> <[hl:3`"D/l 0zY`K8 Y@[P'i꽐~aX18O@výPw+pu=HE`rd {fЍFB\V {`|4c ؽ`pP =@c 7>TP>Xn>~i>X[l>D>h6>2B>h>h|>h^X>|5>() >蘬=8= <RP97I=5=;=`=ZG=H<Ȼ@Kބ1$ ĽNJО8Sƽ׽4lu DpxdK;PӇ=p=1>`0S>y>t>r>j>(>ʬ>̮>r>>>ܐ>[>>>;>t|>x[>Q>U>TH>f<>G>m>nt>GI>Ȏ >(>8=X<= =w> >0=ph=l=X= >>l>R>N>ֵ>>Ө>rں>R>>>~>`t>>=>>P>>8>z>H >>*K>>F>@>B>wh>Z>t[>dJ>(>A=?=Z i,ļ\i:<q;VJ@ypxdp@yK3ie?P==>>>}U>0j>r>>h6>]>Zݚ>ƪ>>>>>>$@>Ѥ>h>x>_>N>>:>@&>X===@=_=P=8=yc8NCFý( }8`Olp0ս>+0=Z=t;1=P==ЪF=pk<=`=T'>4>X7F>r>w>6 >>>*[>Tp>8>>>h=1=[=P=`P=`=-(ս("8(~TH|`]D7 ]\/Kʱ0ݨXmཀ4`\<=U!=Y=X=-=P->Hh>2f> >~>C>===TkLP8L:F>6p>vw>h\>8>@>!=`.m=.;ri邻b@@?8T<`X< <G;PR2hؽ\=|gS>>0>>z>>|>>>>l>Jc>>T>>>>u>赑>fp>L>n.>T >(=s=T=@==(=@==> >q>>>-(>(PZ>R>^>T|>|*f>*\>Z>>J >[>.$>>8 >Ԅ>c>"U>2>>>>w>L>2>P >8>ϫ>Bi>l>|>@r>JG>%>{ >x==]=s=`=7=x_=@=J:hνֽ8 YqxkG׼Pt>\pQ㼀t0t>z>\b>>z>8>0>B%>>Ɵ>>[B>x@=P=p=R=@<Ľ\TAw悾Đph{H@現hn ws^膾sDl3qNLwe@k8=+LdE>Yg>>Y>@Nm>W>4 >_=p,=@5g,c>kJ`.~;޾|y0޾ڑھžDþ(+ž2ULƛm u%b(P]9< =x:=(==|=`==ޙ=1=ؐ=ka= <`k*뷽(_\29XΘj𙾶⼸ ܼXh,ѾX־Uվ\3m%jվ*ʾX5ƾnv>Z职b\_\hrb[;#ɫЈ:YAPH==t>`T> k>&w>ǃ>H>ʞ>"@>Эm>Z>->{='X>$1u>|>ܢz>>.> y> Y>_>Di>\J>g;>%><=0l=2<@v|pS1$,0SrH'ȸG*n̾Vξ8ξ.&ξ旾06`ǻ&f0VT=;=T>P~>H>P>L>PL>>B>X>> W>T)>>U>p>dj>3>!=Ⱦ=@0Pν&cPLcl<~]SHH,O:% tux7Ⱥ@ܩHɽѽ`ruI;=~>t>hO>d9>vM>l>O> u>>.>4>d>>Ti>>XYR> ">Y==Y=X:`xICh)0Qn9=8^oI$? `apFؼ@X~<`ǻ<`<=ϊ=0̢=O=p>Q>p>y>> >>>v>d>>n>>@L>dM>zJ><ˆ>,=n>%>W=y=@ I>QU>PV>]>8ƈ>>">r> j>0=><>==<Q;@DZHP|G1l~€~ ejþ&ž7˾ξrԾzK徶羲߾ΉǾ4Ͼ0ľa0#bnRှ8dd\dj@c"|^ü@횼ِ;0]`=@)=x.=0">2>h@>L@S>wZ>0v>Hx>|YD>8>0=CѽpB+F>XC>(E>E>|{>hΧ== ã<[٫޽( d~L09'5X &IS{ἀDɼ<(ּ=k=X>|A>LN>i,>t>@">SI>]>ŭ>r>i>&>>&?|?Z?D ? ?$?Cy$?"?"?j#?o?q?'?<>>X>>X>d(>>}>f8>$>t>8N>}>b>:5>X/>;*>P >+>3>kM>$gz>hF>>Ԅ>^>ʋ>Q>5><>v>ZX>?g6 ?6?PK?H#?v'?,!?4'?+?*?/*?$?X?7-? ?`?>a>>)>x}>>g}>(cz>0)u>R>h@>6>x4>\4>XO>Qj>xN>1>$!>*>,LZ>`>,os>,>&>˦>2>6>.>Jǎ>to>P(>\>vp>⼸>F>X>P,>>$>>>>|>v >> T>e>Ń>dH>P->̛&>ܮ >x===ȯ==; ∼;Z<?'< ^S>O>j><>>>w>>0G>>>>>>S>3>>t>>z>l<>j=pM=ϺK1԰9@aP[PXYpj0CMl p@<= <:} (\𱫽<~<_=`0>Nw>>>>>g>>">&>m>k>@b>1>>h>-=@=ph=<Up4Y꽜)$ B0jrqN]omΩ$0 glGld4@&n`@\ż@TL< <e=N=P=)q=8Q=x==== ==]6=`$phALi\/0pp =Ҹ==,>p>=w=j=`? = j=?'=һJiGϭڽ)fȮL@Лv晾fDhžtPž|Jr<)xfw\)`xqhz(Ƽl=`===X=pw=+== 5=1=t=`==@<Bν{-`]|5⏾:xӭofk+(ĸz꒬>iZ><>8|>>>.i>6 >\d>ʮ>>r>O>G>1>L,&>@#><>B=@K=L>hG8>@:@>x*2>'>> >1>4w8>dpk>(w>R~>0><>,%>>>8eY> =<< 3[6ʽtfCh[ehXx\7S#>h fx  BPX%sFi6)d\>:p&*x:`DL`8;< KT=e=Py=@B<%>PP{* )x--'׼ c46|h B^40LDWڪP:hpCl5Z&ՕJb({,KM2@佰)@,<= >p===-= ==`==R=8=U=",Xxcvnƞr~6žϾoڍUxXDL,UxbXHL`L-(8*q@xg4QA6X:I$ O,,"Lͼ}g>w>ꓟ>HB>:>`>>h>B>tֆ>>(>>r؆><.{>dV>>>(>x>>p1%=r7P7.iռ`h@< =j<.6;`<0)>l(>\M>Z>>> v>>>>>>">>va>Z>t>4>Ɛ>Z0>?>;=p=r=@{*<޼\7+);`vʼK@LӼPQpUEuvx:@#ۼ @\@@뀼'<22컠_===L'>$\>$k>>t >f(>b>>>}>`_>t>`,>>x>>`g>V'>P=躸=`%g=<@3<06=<&=;d: h<;*<@뀼``ާػ愼:[=0/=`$`a>ij>ܐg>>>>R>" >>2>*>.H>%>s>w>bn>~>,>x> d>.>=0=+8<`8o>l>G>>W>m>lN>\U>k>^>g>9q>KT>>Ι=J>C>*>W>*>˫>t>Ι>Ϧ>h>7>>!>N>|X>p|>N'>=@[=0 =@ jwpg-`@KT@%^>@>8O>>hJ>n>T>>X>>&>c>>`>>><=g>lg*> >`r=2=pS=$<">1>E>#e>Th>^b>|>\A>,J>$>H0>p>f> h>>j>3>lU>T}>|,>q>'e=Ѳ`nQ(_(ýd} @ gl8tŽ7ɼλ`0;> Z{>> > >>z>ޣ>|>r>>\>rד>?>|>p2f> Q>X>J=~C=&Ѝ{@`8?&XXEuULHP47#@31й2y5RN 9, =p=S[=`= > ">x'>>(>c>/>h&9>Z[>|3>I>8`=<@KF`d)pThʮ TߖRlr-y藾:ٜ肾 v\{]Fwsx<2ܛExô*ƠtzV@_-(L&ZTh ,$`N+88<0%ANd~gf|(̾LA"Vf<-/.뾜쾞¸Ҿ|4ﲾ>' iS4E(G*@ṽ `๫ꁻ; =%=^=ɉ=ЉG=)<Fb>|y>p>(>q>@>xK>آ>{>:M>>l>U>k>(V>%>^=8=0"=X=ȭ==(==>1>@;>|3>##>.>`&>i/>Z>ȣZ>P>d>Ʌ>j#>jE>bM> >>>Z>D>R? ?R??? R ?#?Xg$? ? ??^??q?>&>j>(>sv>TV>P>p=>=Ht==<>(L&>56>/.>ȲF>H%n>> C>u>X>T~Q> Q>8[>S>Y>g>]>#I>lIR>b>Toe>m>r>϶>j>B>6>>>>c>>>J>H>P>T>;v>Юz>n@>L>>؃=P==J=` =<Lc8>ؓZ>lO>b>d>=>~ϭ>L>HT>>.> >>ķ>>>>l߭>0>l>h->==@ <@I0i`$d&ȶT`@pq xнpƧxnʽ)p9MNC 7½Gн0½8 nýk+|;Pա=j > >``>>0XS>dXiK>ԅG>:>W#>3===iG=@%=(;:`A_9`UmYn^\uz4[kqX5`tMT`drqxOL4((\ ꁽ@] X=T==do*>ȣZ>`>[W>w>0U>6Ȣ>>*>d>⫲>>ޜ>>y><>>0>`=R0mٽ н+%YQl F0w@g<@=`܍<~K/5<0B=8==7==-=m_޼Po<=k> >>|>>>>>~>4>ҥ>>Ex>H >>db>81>>=<<XMnȞpҽxܽ`d}  (ؽ(<8 "TJ2l xM˽> üܩ2>L> w>6P>.>䅌>ь>I>P>7>Է>>>>>|~w>|!>x ==v8۽'0 %C[ x\p@Ipj ּ,] /5KT<9<@v=@ҁ=`՚=>И3>)q>9>G>>)>Hܮ>>>v>ԗZ>U>4>>&>@>R= <ʼjݽ  |4l̽\ڽ/(= qPǽ&ýp۽:p ꁽy@w<05=xi=Ž=D >q(>dg> D>1>b+>P> #>l>>>~>¦>ba>h>v>ޞ>>7^>=`n< pS v9NQlmXuW`bPw;oYս; r;A8 Ľx-ٽ(H 1 pPȽpS䆻=A==z=p>`= == <CM8 b D&*SD"蓟:,綾ƾ"ȾPȾ оVǾjp0þ~%Z~γ&+vgh~~xzH!:"! pF;OL皾(*N$_P>hXS : $ .A PdHPʽ@"%Yҗy¾&b<Eun ޠCLC|l4̾p\v`>'+Xz|*Mq,]`@8Zh:fj$bvb;,i%8Z@ݨQc>Y>g>Wv>(Rt>^>U>T[>L4>>ؕ=.=Hu=(=NLa>tO>e>n1>إ>>>>"????i ?2$?#??N^?G ??"!?: !??}?6> F>>3e>>hq=> =px=>D>!>(>P#>">K>Df+>5>XO><`L>/>A>0|E>$H>fp>>f>,>Z>;>s>Y>b>Ɍ>> >> ?f8?4?? ?;?~> >8 >vֺ>^>@Y>c>`R_>̍G>X69>Q>>'=pS=zT=Ч=`G</=6!=0` >(=s=8=`/=M==(=!>>{F>j>>>0>>>Z>>D?b?ZS?X ?c ? ?1?k?Z?>9>.>x>p!>8d=vt=<@k<@<F;'< HDS>R&>>H>0>">b>>T>>Rl>)> V>HS?> #>L >=@U<p5ha!tAA|h0-6l#FhIXx73L0 " S$$ td6\-p/ @n߽0c?22<;=g>DO>e>`Sl>lHy>>x9>]>>>ւ>n>s>V>>\uD>)=g;;}Rh\&g$ "C#p"`T [@I, P:z S ۽^PJ==E>x>>~i>0}R>5>hmD>'>C=@D`>lv>8>H2@>H2@> J>Ԩ`>v>,R>_B>= <@Nm$N Xa:m F /L$~X ʿrLҒ4^$ |KeUX4p / LA\9(pvJ==Z >T>s>Z>م>(0h>|ZQ>@>>B==^=&'I>Y>k>>P)>к>Dy><>>h9>L>A>f8>H>?>[=L<(&(%?VRiG(HrC.\&tȯ``罈v <+k-pP @+ԽкE oȐS===>+b>&> >>|i>A6>>p=`&=U6<ȳ OIXSݕ 1[@~F{$j4LHv f0o£|Ά|X!%8L5`<=>z=P=6>MU>X>X[>Tk>\u>2>}>k> #5>@='=`콘BQt<\4VhP6.~Eoo8|;[ <,.d6L4   ,{P@*=L=М=@/>\fX>pn>t>t[>`&>(==<`?<| K*H/NG jNXv#K1^T:㤾t啾Bz䘬(M@Rz܈A\c4;xb`@!`<0b= =`|=s=&=x==Ⱥ==a; a/*⁾\P Ҿ쾔z8վ̾VѾ,ȾpATZݴ!♹hѴ$騾bETWRYTlr hZ]>U@;'8x(Y0!==/> Q>k><>B>s>|M>,>C>X=^=a4B>>>> >N>>8>f&? ?#? T?Pm?܌??(??T~>z>w>>>p>=x==Px=pm= R@==n=0===@A=S=%=<=Y==p/=8=pU=p==> >x>|8E>e>|>>n3>v><>:?`??Tz? ?? >"C>'>H>m>0%A>\-><)>=}=M=0^m=Z=@U > =P=B=x-=h= >D7>g>~>~>pܺ>^>վ>>S>L>r>!>?k?y???0?#?ئ>t>)>i>$>><>P=İ=0=p|= <<<;] ;ǺĻ7 ׼ ¼J >pH> x>>A>>>X&>vQ>W>R>Z>\>&.>>W>\i>*>hH>=P/=@< j$r| m`ķP@(΋f @3ͼ /'@ H0j 7 Ѽ;藟=8$=I>hC>*>k>_>Ұ>E>Z3>(`>>>&B>(>>l>>"B>> ~>E> >=<.6q@; :@@Dڼ`BwE`uѽhMҽĽp\`@'`e<@<`<= >|YD> ɂ>TI>`>Zh>>R>|>>>>>+>>r>(B> > Q== 1ҏ Ľ LlD7K8tEBC8ߟ#05'@D>Vw>>@G>>>Jɨ>;>`>@>H>>>ڏ>$؈>D>=-G^>4|>>>ם>^ڧ>>q>>>>]>t4>=!=AܼHH hv&>UP=`W^lJi@b8w{\yx\hBXUصfl| #iX WFs-T"pP:PT==>4>U>ڟ>ٌ>>>>/>>*>>`O>5>pVX=~üꣽtL Rb\FN:H짾ɤĠ۝8Pp ە׌8];:hG8-(,p ֽ}` ƣھmܾ]Xᾶྰ⾤rc޾\־Tݾxp ؾ?ɾlǾbþ򾱾TᚾnT]o= \ϼD`5>X0>/>( >= КͽĴ,vᘾžv;Ҿzݾbf꾮S>.循g徨F侴+޾ ྫྷ0Ѿ$ʾB.iGbnD|r(=:riʻw->>#><>0y=`<@s@88r򽊾Nޥ~^濾Zg˾4־n۾پT־<^̾þ1¾vpʾ(оǾ̾پB'ԾѾӾHʾXߴbӀl3? VXB0뇽%/Ơ@SM<=xX=H=D>1 >Z>T=`= <`"XHvԠ"ؾ50ؾwվ)龖4vフ r!,QTr0̾ƾrþrrڎ<}8Nѽ`$ڼK=X=> E>`h> w>y>]>WW>xO>f >0H=@5DCrCDyUelXrŃshOy@1-(bٽӽן>@¼=o=8 =( >@>Dk>8׎>N>`Ʈ>>`>Z>> ?l?9?Ǎ?:?*>0>>>F>p>HU>87>>==(>p=o==HQ=0==P֮=r=P =c<31<`J+==ã=l=[=H=!=H>>Lb+>0d>:>*>,>;? B ??o?t &?;*?:*?@'?9$??P? ?L>3>r>>C>7>((>x=h,=8=5= q%=`&=2=?'=@< < f= H-=&<`<8>l)>(W>z>k>Ně>q>Ƒ> z>>->l>.>$??b?@>¹>>& > >$U>$>h=d=#1=`<^C<` ;`Ff Ug464>)DaaH"G,\P^ DPȥ2Ȟy>>U>> >>]>>Ȣ>z^>k> >v>D>,>X>> =`<n(-~$ @z$V.2$B$PAS0OhM]< Uȱ9+8q8ԛжμk=}=>m6>w>F>8>>>>>>>Z>P>>L>82{>КM>Q>=b=;`p-dڽ\@d#8a%x),kBFXzQE+"o` T@Pֽ00;=|>ut>س>>l>W>> #>]>2>VZ>L>>>>M>T>|b>%>=q= =@)VJ>C 6ѽ(ɽ Tڽ'彸()]6,@y`8 (Xkgp5Y=4=>+>7>,>>ி>,>f>??J?t?@M>&>>T>֤>T9`>p(>(= = KT=~͓>>>><<> >j>2W>xM>:>T>Zܧ>>j>0">P=B= :>0jf>>S>xo>>v>z>>L>><>BW>L>=>>a=_<c;Լl`̪~2tvrÓE,!Ƭ` Z>c}>o>x>s>@>.>BF>pt>ބ>T9`>H2@>y/>= <,`GqhWlƾ ؾj龰ᾀ羜d~'jd! `\ԾSdFp!`d'b@P:9򼀘H<'=p>====#tECdlp?b S^nᾬ˾4BaEj8>l.xƽp .m< \===NJ=EK=ǻ 2N(YuڞnnP rȾTϾ.Ͼ־6侂}x( h`SdO9ܾ; zl6f iY==X>$#>@H>DU>@~X><[>,E>$>>o>==N=]`Gs(;Խ)0$4`0S0=>Q>{>{>>X4>,> >>?C ?t??>T>(>>\>(m>†>R>yt>p>HVf>M>:>->+>>+>=@\==YU=@<< ==ӷ=8ů=pa===>6>xb>"A>~j>>u?}h?:'?N/?M5?`;?4>?4>?xo=?c+9?q6?T5?.?P*&?#?B? ?3?<>%>N>^>>M>X݀>\>xV>gW>8N>D>2>5=>tO1>>==0>4>$/'> O>0j>6>>> >$>LR>ts> >X>b>U>I>"?v??HQ??P?o ? v?N@>v,>>o>,X>o>x`>x,L>D<>*>lU>==8B=8 =+*=0:``䆽0XȐѽ᝽hp!WPGOX=Pn=8/>y>>>0>V>F>><>=>{>>>>>4>>>>X>G*>X=r=j=p= ?90y`C?p;$AH0}ҽ@ H* % S ,Z۽h)I@{* r2=&=^=1=Dy>9>T>}>^q>PJ>4>\ >ݫ>Z> >Ux>]>D6> >,=A=p=*= X=@4>W>`3z>">/>ё>T>fj>t>0]>S>>>X>g=C= =a\=b0$4>07T>L>^>$r>ji>ţ>\>d>x->= j==;e;`?@ W08B \)Q<>t$Rt|t(¶2DȠt_\џI`憾ognO= !>h%,><\>z>">>8ց>@*{>n> ^>8>>H>J=F=pq=jp= =$><F`]p XCM8O8'TA3IZuFʁyiqjhO! #0!@No<[==^=H=\0>E>TP>bp>G> ۜ>N>fZ> >݊>.w>(6>\.>Ӿ=C=<9<&<89W e~ཬp/E{Z܏Zk@pqႾv_b$bI4Ľ༐{}=P* > !H>V{>V4>ڠ> >j>X>>0k>`bX> L>,)>D>>= }=R=0=xd<@\ECɲ0g yq Pl < "JpnX|k܁{>fpsbFCH#ԽHdŽ.Cp`< G = 5=~==| >*>K>`> zm>y>j>D>>>=0y=z`U)!xB@Ľ ȟ&3bJ] e䆙^N4P`Ⱦlھ֕ھ`Ͼ]ξȏǾֱpu?0Y, m =g=̆=`? = Ž<;*< vPPd(ؽ` %SfG"zC]HɎ`*<~慨۫j'|,'"揾t0WFPJ2g轨lr[3'¤<`` =pS=x=h=]=@u= <@A蕅(,Ч87(6T%3>trJLLLdV@dV{ľr0̾vξbݾjs4$쾀fV9 dwl:ϾH逾0뽀1z_4*8Pc{pֽ(彐4"DTdbBX^ ˉ"b|%eh%`q@dKz\þ06ǾR੾np]DA~P&tA&T<4=X=6==d]>h5>L\>4k>8Ag>L A>5/>>X=P=L=8=W= ===h,=E==n=PN='<`;m;ڼXϦ# ̩ ̽ȽĽڽٽh|`ෑPP==X)>d>ִ>>P>>>< >>,> >>>>Ť>ܒ>z8> >ۃ>8!u>~>Hx>X>L>J>%/>> w==>V>t>`=:=A=p}=@==5==@==D>L.> E>t>>>vՓ>I>M>V5>4T>>>>>0>,o>>p>>ʍ>~>>>䗅>>ƒ>~>ԥ>0:{>^>oF>$)>&>=p=`W=;b<1֒pXýxݽ@Hvؽ=`w޽xj케 T vT>3}>>>8>60>>B>>>Ч>8Sz>QN><=3>4>45>,>C#>X>@p= e=ʪ=NJ=g=`<;yc<0^`ԍP)Ƚν0Ľ ^d:`<<{=P=*>$+>2>h7?>d>f><>>d> e>h>f>>>>v>>R}>,>Pp>T>T0>:>t"> 7>0>`#> >l>= =@4Z=ܩ<ɺ4^l T/+.2#?#3#T6$6{+Q#id;j=\Q>]>߅>Fܔ>0E>4B> W>t`>>>>I> /><>D>S> x>lmx>2>h>{>x>_>4=>,.>PL>p===[=Hۇ=zp=<˺h^ýP ۽pHeҽHUٽx@ȃ`t޻@6<`C?=p=&=ؔ=B=XC >-><1>wZ>fZ>~>X>b>>>X$>а>&>2>d,S> F>x3>I:>L>DyK>8>+>D'>U>к=y=>0gs5Ľh ,*P7x:Dx>lMJRLaRh7?ȽKo@g<8==P5>c>>Rч>n>'>>>>Z> %O>,5> +>7>0>XF2>5><~$>|>=P]=Q;z;nm`d> cK`U0佬 4*S*>h:>fb>>>>¤>t>:>l>$ B>Xe>=@=؎=<=o==$v=PA=0=@K<@i(^(IpY:*3\7}J-UX@93 <=ܿ>@6>K>Mq>dN_>-O>2>">$>Z>h=X=Y=Х=o==:=R;laDHTDj֑Fܔ8/ľng޾T۾ȾY¾Ԃ1AÉ8X]!4c `ԽC=;=h==s=~>@[=S=@~=J<`Ȍ~̽ͽ@νf)(B rPmw̾Vke{҉ X DG~ƾ4dɲBP7@v<'I=<<nm< ļ0HdŽƽƽx+nlMthtŚN ܪafKľ׾4⾆pWNW 5о侔Ͼ<Ե+£00I` (Ƚ(=*P. 5`&=@D=._==2=o== +=@횼`0{80a% ]3>M>Dly>8>|%>p>j>D>U=q==.C=` <=9===h=f=p= .<+pT>`v0P8Sƽ`?HCƽ0Y P😽p/ ¿`<==#>f>>`s>1>x>p? ? ??ĕ>V>>V>>_>>.|>f>@>r/>0>Z0>f>(K>d->0>=X~=====R=@J9=`0S>jp>>X>ƪ>!>ؤ> >&>>>?7?~? ??n ??!>~>2y>><>>d>u>P`y>?e>_I>x\7>%>>k=8=/l=VJ<@.{P[J@&(K0\S~üV;=`=V>Lk>'>ݘ>l>&>J>F$> >j>JA>*>q>->^r>Y>>w>y>I>>=8Q=`V=<@DBjABȝĽZC1o;H6Ե23*ѫ9H;`4=0h===$7>`]>#}>4>ۘ>>أ>> >DF>Ž>>`>>G>th>l:>L?>=d==ɤ=:==p'=<˻`ˀ w- ɽtm 4(=:><:@d9%@pսЩ艽0_B==p,>k>>A>:>>>\>׽>@>>>P>to>r>@:t>T]R>/>>k=^=0=@!QF \W׊0` Ā $_?K8>@4eYfȱ9+該P]R<q=t>>5>8]>>>>BϨ>F>j>>>l>>$>6>K>3^>4.>=?=(=0r= E=pu===P=p|=7.= (m=<=Z>E>b>>>t@>x> >O>a>2>G>L>>>>t>q>\DL>->=0:G=`h< ɂ9r<`bhjѹ8ֽ"d0BL _XWlXR\0TW Ѽ@] 2!><5>>>la>w}>8|>ދ> ̖>N>>m><>>$,>m>?I>##>{=0%u=@hr<P`y,:&ؼP]@Ƚx۽<轀ͽP'EO^g2Blg}hmxԅGdpt0koؐ<=h=!>e>Ɍ>>@8>T>>>ر>좥>ș>>|>p>S>x+?>J>)=VT.VžʾFEƾ 3ΉǾtӾ hھܾ/ܾޠ@d4ヨW ޾v־ؾ~ӾľJ,rvpǀ|:\OĽ uY8-;<)=c=`<O;_;8 DBܱ2Orm̐LKhGLN"þ¿ľ;ӾQվSܾѾrƾž2^ا*H YcH0آƽ{o"o<=H=pb==Z=>5>\!3>A>X>S>Q:>|!>0=pB= X=<ټP4)qUYcЋag <P@0v*~ͼ7.^;@W<D;t;`S<==0=Y== =(p>?>x\>7>>8>>2>"2>P.>X>^>>>> X>>>F>>>:>.>(>p> >>Z0>TW>̆>0>:>x>i>DHS>I>Y:>4v+>>!==Ӝ=Hs=Ps=N=Z=> D4>:p>ܮ> u>>f>>8>>Pr>^e>?y? ?и ??c)?P? ? ?P?=>C>ʥ>/>u>T;z>v>@r>N>~>>pǀ>HGz>8v>(k>=H>A>YU>M>HTL>-D>,KM><`L>J>xS>Y>Y>>>P`E>`>In>>X̔>Zˡ>:p>>2$>>>N>>->>>=>O>6>آ>>(>>Ix>أS>L>\B2>x>pt=@-n=]=! `躼t"PVѻ@<`<D<`XYjR*B,~_^:U0CD(PO^5:+<1=A=8@&>7>h@>V>,o>f&>>~>^ >&o>>H}>8Rm>| g>0U>J>$>=xY=<|PcmȢͽH"ǽo멽#Reg0|E`Ih@`{@޽PϽ@h4m6t=8p===(>CP>(>(Օ>s>fl>w>,>j{>]>>nf>F>>>E>+> >=X =m=@X<)lq@ռ's=)/55D>(k> 5u>x>@py>|\k>ؒM>>==pS=R<c<@+<<:彼.$s?xF-RF,o-l!@X̪Mp uЊԽ鲽H`y0~5Lɹ`<=@p=/>8P>H6t>l~~> r>tex>a>L-> =@ӎ=0I=0C=\=<0=I<}`<P<@r2<#8u蹫0#۽(+۽(콀/@H(J $l-0P7X"@$<,Gh0`@Ģl>=py=c>>\>#>_I> ]>mU>`>Tj>(]>ܲ?>d > R>=R=k`ifx8>\'#^'`ܽgɽ^ý(50^m0kD ½ ֽHt@p22#?<1= =I=1>[>Dk> >s>_>@>>ӌ>>V>>+>dj>x)>9>`=u=[=8N=8ʈ====%K=<%漽zp&EfJ\h 숾e@(ol5Y4D:EB$h#() `-ཐHX޽h $AZt軀Ƽ5SB0:GB6tYR()]ȿ q!H佽qǽPHu˽ `:սw#1e5b45n V?IH;]6L-lu b0P ν0W0}R⿼Ngz`bs0 944a1ԴAGoY|иD}J PG\젾`pR\_vw}'}׊: ꁾy{*{z,kmr{f R$O xLxILC D(>G\Tj7eh\OR3^4v_:UGWl]l0%ul&9~װd{VHg矾vħ򶾦࿾; ޾",:HDӾƾd¾ľ h \ŅzSo` TE8>#׽@.{ż@J'I@(ֽP7[ D6`rQ.J0\p?c~sx g$xD|0orlb@oG}~̆򁾒FxZh{m`;%`<`Gl0C[`\<@={=@=h=&= ?==(= 1=?=L >>t >P|>0 >0g >X===c=8x= >H>d@>oF>0!> >V>l>p=К==@:= R=и=u=h=$=X|===>1>tRX>x>>m>N>t>b?,X?#?<.>d>ҫ>_>|>x>>v>P>޸>=>R>>>N>|>߯>L?>><Õ>>Vh>X݀>k>TKs>Np>H>,>t=xH=N=`=<$>L->D> `>go>8o>,>rؠ>o>>@>D>"d>%>jE>Ā>~>-x>0w>'>>3>>襘>T>Fv>dn>KB>x8>(L=E=К=x==4==0V=*+=;ЗpI7ɽX߽%p`*H@\<<z<+s<@=f > x>N^>>>y>̪?` ?WU??2>!>>/>0>W>4C>v>>Ҹ>->>>ܙ>>>@M`>0>p >X==p/ =iEh@Jءӽ Ͻٽ@#Xo P& >(;@=l==f==g>4.>h)`>4>>.>1>>>c>+>(Rt>Tn>pg^>tSe>&f>H>9>1>t">=థ= p=/l=@V==;Z0VNDH(3Z`I<0!=jp=8=`=O=>;#>K>>Ƞ><>>.K>F6> X>r>'>`>V>`>1>$>6>>>LŎ>T>̆>`dr>S>>>x9>ؤ,>0=ɫ=`T=Ņ<C;@ U8e|&DV2p@EgICexr~rŀq80a0<=`= >j'>p5>xO> k>P|>Ì>k>P;>X>e>V>&>>w>C>>}=X=0Ft=)=o`lBNH9KXiU@]YG['e+lfMcfo}v}Zts@v$\:\ L `< =0}=_>t>+>0C>$1>8=0}==H=h)=={= >->Xi=Ǧ=0[F= /'= *=U!=x仠YcHHeҽXh><^c$*J8社+'@(}&~`tkC(;Խسw k;Kƾ˾$ɾƾn驾◾ u{,VT:pB+ pغ-U;pr=ұ=@l===x=9==c=c===D=Ч==@I,=ѾnEҾ(˾ aTGxXvLdY:8`躼@<=8S==L >, >8 >>2==^=P7=0ff=p=@d<@cpgн@*X8N Ю+T4g;HXd|wL8NhQ-h܍h8>d-`>ޛ>9>>ւ>ɭ>>a>>>Ѝ{>Du>Q>'>X>T8>l >=PL=p=<Ѽdu"ؽܮ Wp<آ̫w-t MؕtN皾žR¾l Jꧾܐ,)uJ k I0>R>=u>R>PL>B>H>D>->6>b->͹>ر>t->j$>E>D[>L>==xl=Pk=`` T(  h&Khi~ԂN`֧qhX*2fE"Q0Y0; <+=(>T(>#>$>>| > >=Ȁ==o=E=@ ==[*=`y<RPWhx-W^&֏fԗ(VјnJɾ Vھh[N@$`trѾž"h؀:Ōy=)=2>*>,>̍>B>r>>>>>@¼>>N>| g>6>[==L=<:P[8̽!(\162=FHCt9H$VSTh'} }(e+g=>o>f>">>t>z> ?.??"?*?,?ւ-?ʮ,?'?i ?^?Z?O>@>0>Ή>n>>0(h>>>X3>=`ԍ=8=<Ϲ@Pֽ$x$.:5$d)Y!x )<`/x x <=4D>> >f>"g>L ???04 ?F'?(0?ّ3?3?ֵ2?A4?A4?#1?)?G?@%?>f><ҁ>#P>hO>%Y>r>q>f>lP>.> > >d>4>ئ=h= >{>|&2>T[>Z>`t>V>|>h>x>T>x>>2>?` ?l?x ?4?e?Dg?n?X ??w( ?k?>>8 >v>>ŝ>.>Gv>C>m=`sB>>f}>f>>>Ν>>t??B?4>T>8> f>>d>ķS>H2@> ">=0I==<&fP׻00La$1u<`瓾4,3@ԗ㑾5nj18bp9,;@$=@ b=ɉ=x= >>0><]%>1D>OB>@>x @>07>.>1>%>m=LV~MxqDU0!fʽ=GWl漀 ` R`-Hѽ8K4d+FtQKhNS3^gm[}f&xP$ֈzf YJ|jJDG 2NM8tE\S88<1pt+ ʽ8-/5k`b< /'=@7=ko=F=`=h>̛&>ԃ->x>>@==X=v='=x==x>=xm=@j==p@= R=0]= uY=(=P0=Pa=q3=p==M=P~Q=ka=Ȑ=>=(,=X=Hw=%=xÀ=`=&=Ic= =(= #=_> >$P&>l&>5(>|i >=М=d====3i=e=8`=pR===l; IRh7hC <ƙ=s=dK>=N=b;}ༀ,0k O $Z~: lĽI}཰ `ǻȮf.<J<@`ͽL@.h[eϊt78&NLT;vħz̾ؾ5޾IrDxRf@h׾LþZˡUy(xX}ཐEĽ̽-x-|׽ qXV<@0G;ЫS/¿6:%><౲<Su`Ƚ|B7bYcH!:$- j`> t̽dPU@B<`/z=0=0=5>s;>K>0HZ>l|>>>`>Y> y>P~>>4k>3b>e>X>H7><>Β=ͻ&H1Z~+kd >>d&>4E>e>B>>1>V>r2>>*>|>(>4>ƣ>D>Nq>8Q>Z>>>>^P>ţ>d”>M>O>1>$>>b=p=@,=h|=Pq=Pb=-= =HR=80= =>0>XH>8N>bp>>>R>t> >u ??`?YT? ?J"?#?%?R}*?Z/?Ʋ,?p ?'???Tz?2?n?V ?P?>d,>ŭ>> En>`5>>==H1=b=M>>>>>+>x3>d->9>oI>8V>W>W>^>`|>>>>>x=>8>>R>܀>pg>?Ed? ?O? t??<? ?@>>dM>$s>6ɯ>>|>\>>P>uc>C>|5>%>xJ$>>L_>(=p=A= < U<@V==U==hm=A==>>>v>T>̾>.9>Ԇ>">j>.>?O ?)( ?^ ?e ?>8 ?&??@?>6#>P>0J=x-<2> >I= ʏ=`<`.3^B@[,ʾƾ+Ͼ}پjY˾轾` xn8-:d48<`:=`=ڣ=?=>*> >pf=,> 6U>0p> ]>!>:$>l>>5>=ļ@;H/(L&~m6-&o쐒xҠ#^aP 2֬fᓾYh=4rʋ,ЈjG}Ԁ0B@=`H>HE`>P =O'ڪ>;>>(ĩ>h>c>J> >] <Պ V5;\Q>>*><(>p1X ʾjSξ"dLA^ꋾ>A(hR01(=漽yc>P>A=伀ZT"=׊=@!<`cpT4s˃|n,BLA0; L 'iG++Tfi 4վ^?"B(կM;pS=06=؝xqqBþ& ¾6뻾䥾P\uD|:iھ1`=T[0|G-*LQ?6A%9y% >>L7>t'>=HA=ٹ=K>?>PT>HQ>h>Hc>d>*(>&>&+>&Օ>>굫>¬>ĺ>һ>>:>tQ>>>2>>> >>f~>|(>Zx>ѽ>>u>œ>>:n>>·>!>t> k>8.>R>= >h$>Dq>ܬ>x;> >le>D>Tχ>,>Tw>x҆>>!>F>4v+>D# >->}%>D>,w>>}>V>f>>6a>;>t>K>DU>>C>j>*>Do>2>>`N>,8>Lb> >#>P>K>⼸>궸>>4D>Fg>Ƣ>z>l>ދ> >^O>Tu>h>\a>[>xNX>>=`=;@ @<[}==PO =0@&=p1==> >>0!>=k(=> /> >௘=R;@*>kX@@we˼X@ʽ] #K#GTv>(LǾ`O(xstaD$ 5N>2CGZmp<#1^uthHxr`.NľeξѾY¾L~FξӾ̾aξ.7Ծ>;;*þڸ&ʍqbάd:rP𮄾Vw-jjm{s}x"(~脾 = rpk+=`]=`< 좽(`R_d'㕾P~t,վ 澊`侶۾zȾ-W2l5Y𜾬̾ Rb; 0}R辺ؾT}ľ&赾t_D8`x;dgXjL_@<%K=>C=*:WƠ;W>`,>>tד>Ч>?b>2+>lT >h=Y=`=R=<7<rźP=Y=趄=)=c=0=`<E":+ڏ`"=Ko=y< 8殽CHP<&;; Ž<v= >L!n>$ >*>u>h>h>>٦>Q\> U===l>m!>->$(>9>L>%>=G=u=@h===#=p5=-=`G=K== <<===0>LPL>V{>>Jw>j>8Ag>k>Ӆ>6>D>}??q??,?? ???w?w ?>>W>>a>ξ>(>>^3>>ެ>U>$= <`Z<Ї=0>r>3>A=C= <<@<f@ Ur>=<@!A9C<=Hw>>>>?p??RI?*!?*?M'??lw? ?P.>>u>P> d>>e>>>>Q>>>i>]>m>L4>`=8=Hޮ== >z>$>,]>8!u>xn>oa>TN>TKs>_>Ğ>B7>ލ>>>>}?V? ? ?S?>V>>s>>J>p>>.><>r>0>>i>T'>x=b=X=6=}TW̛&4(P\|.E<(-pxO彘cƄp9Ӽ^<=>9>X>h>0E>>>>`>>"C>>,>0>>>^O>P>X>"P>Ӊ>(B{>pc>Y>dp7>n >Z=T=40pM|F;<< ;=)k<<`=I=='=}0ppZ <=x>?>tU>|m>8>>3>I>Ь>>">z<>B>>>>>#>l>~(>">>>>0v>>t.L;X`+e0bD[WRO fMJz~Cg5t"JaKTWo ^2ɾɤ0y7І /lp{EؽPpp0tA RKPO8 hq.&NξTJ*ݾ־ʾx)ܯ`Ð𜋾XˇrH aL~db蒾??}H[0!(pয়PV`ph`;|=lP>>!>Jb>XV>=U=@hN5ü@5 / t(Pi`N_.ʽh&97\ǾuܾоMx4T=|DP^N@hE>\B2>_>х>>.>>>o>Hf>>\>>VH>Ȱ>ԃ>j>G>Ԃ>a>$>H=A=/=\ >1(>Hw1>س>=`A>0>,>2>p/> >== >hJ+>'I>09n>Fd>i>ZU>>>>>\>$>0Y>X6> T>8٨> u>^>>ˊ>r> >Ԫ>>>J.>o>ئz>z>V>0#>>X>R>l>D~>lA>e=q< Bh܆`&l<`=K=Z={o=P`y= 3[=iU=%==ࠥ< Y<@ =<{< b<y==>T;>]>8r>$w>"p>g>\>%=>>>)>V'>I6>;>2>#>,#>,Y,>)/>.5>t >i==Ȭ=h=Th >P6>Y>h>|S> c> =(r<@#8PȽBP@.===|>(=*= fgyQԥT &žþľܠƾ8A; 6f}8վ42>8L瀾(qXL08P F H;<=D<|B\(V +0CMdj:qҾv۾ڣӾ˾+Ͼ2v[l|(#;!^ â *# :nTھ DǾTʱh`𛾤𞾈nr8=@hPƵhc#d,SoF~J_⋾.z ݜ^,SЉ{~戾`ךzҿȲƾľ E繾ΪpJ-ܡm(=#N@ϼ N<p=0=`/F>@G>>ru>>N.>v->>>>`>԰>N >d>>0W>D>6>m>ם>>>@&>lˀ>\h>ri>/}>>o>%>>V>*>~w>p؆>>榋>>>ڢ>4>x >6?n>>>T>>\A?-?|;?G?ЫS?]?e?A:g?\c?X? B?#1?wL$???%?f.?l3?̾2?'?? ?|>>8C>>>Y>>>ޣ>І>di>؂T><;>K'>&>ȟ&>t>=h=~==`=s->ħZ>u>Z>@'>>V>>??J '?1?(8?h'9?b4?أ,?G?X?D?u?> >8>r>L >.[>{>8>(+>Lخ>>Du>hP>lG8>t?8> *>|Z>0>7=ϟ=P'=8=@==h=@ >X->I>`>nA>>:->>ڳ>VG>?>>pٓ>|F><ˆ>>H>*o>J>>h>>n>@>ʝ>b>e>tq=>1>~ >6>=1=#8E^ No=,Jt|i丄џЙ2ݾ.ѾFw—&,>pֽ:"B\<<=`[=d=c=,>>?I>tu>>k>\hr>FC>X>0]==e===0= =O<):;e;^{<<`܍Hs?4"þ\vѾ8Ѿ^Ⱦ޸Nz'_.ڙv]\*ʾ@\3uའϟ`6ս ҽ;9 >T>=b=|;f pֽ71FtSP羴ھdLžT找c 0(JbqcL:L<膙=?>yc>>>P >>+>l|> 7>X=6==H->7I>!D>>+=Thҽ0z齨%˽0P~@>z`ݽ(M>>>>j>樿>۶>죲>>Pm>f>褋>>U>$o>)j>(Qg>$=>>Xk=`%g=($<(= >B>(o>FS>>>>>>d>ˊ>PLL>@k8>&$>>>==0Z9= <@# t C,W?1LRf6j$Hd0 xN_밾 Lj)6XGWͅMH)ȽӽHν @@"@j=#>8>pfQ>U>R>z<>=<VP*<]%>A>_>>|W>⩘>T>>}>7P>p4>ܯ>g>=`==h=u==ri=<4P>m 㽀zXhڽ0Ј@ν׽@ýx (ʽĽHý*/L؏&k=|S>j> >P>_>o> >N>>>?,?~>P>,>Ty?X? ??>3>`>E>d>ƞ>~>VJ>G#>b>>%> >8=ȁ== =R=9==@"<` RĽ|"̟Z,pr !O8ҁ%RQ>{>Y>>ݦ>>u>>>E>2>@J>>T>2>q>x>d=$=j<;2R S @ļ6r˽<| [< <`GN<G== >+>D>\d>q>8>0J=@<ռ@V0e==f>XH>Lu>>[}>q>j>[>p:>>P{=ټ[<4И3̩JP#=`+F= U;٤ E ڑQ-2Ͼܸ8NNӊXH>>!>Ώ>p)>p=J~9>A6>2> >>n[> p>dn>#^>`G>v.>> >8 >p=05=0 !a( S@7$ #E66JlaF餾\Xή<0"f|m4i/lZV.ҽ ޼@=C==@=Z== >T">>>F> C>C>ȟ&>=؉=`+F=g=m==Pա=@<-@½ P9,&P@:( 4P`y.ycQ}_YNQ0HZ~b-H8p<+==t>>W >d3>4V>}>ք>(y>C^>NQ>TK?>8)>hl7>T[>Di>@V>(=:>j > >!=PŨ=@=IPpt`GsPN:H'>4B>|h>>x> >u>b>~ߦ>l>g>>.>=hn==І=xY=`=nm<%鹽L `"p06Ȏ pGyh 0SW_iĢP5=F=D>,k?>llk>>:o>/>D2>y>p>t}>K>%>jϴ>P>`>9>>8ǯ>ȱ>+>ne>>Dly>V>`=8VL$ã V` qʽ@eTʾp⾪|߾:ξ?]\2+L =)gIxyPNQؼ; J=HE=+>e>%>p>L>$>pd=9ЅQ ; *d\ "9آfϾ+쾬(Ps/rQ˾n왾@olaif8dfLC>\>4r>di>=>X= Ž<0}\) /("0hDdtHc tTi35c(:TʾNxm62+׾,ȾҬ7X]\",P@h9\`Ç`!<= 2>Xu>>.{>d>> l> K> >@>D!>|>Tz>>< >@.=8Ģ=N<6XHaŽ(׽h% Ԁ  | 8 p` z`~>(>C>R>*>>> ?q ?+?:?$?k? >lH>t???pr ?T% ?K ??q?x>H>^>>T[>P:>T">8> >t>8w=0=9=ǟ;`{h$ӽh\ڽ@,a\;@=&=%/=0:G===r@>2>>LQ>,>Y>K>B5>q>y>G>>">>>L,>m>>>>`rQ>=)j>ي>>F>,>x`k>BX>pZ>-j> >@&>>ɲ>8s>r>>>8>ž> ʖ>|O>F>`=<;`7<<`H>ȏ>#>^g>( >v>^Ȕ>K>(>Z==$=U=(=@=L=`=p:=` :-閽Hͨ8Qڣ瘽HӽZ޽޽'`hЄ[;=)> x>@>h>2>6>:>>~>>L>>>>?h? ?M ? ?8?Z>v>>hЍ>S> `>^G>|ZQ>l>y>{>`ux>MU>>ӷ=E==@EY<@Oo#W¤@r2ڼQ 3[Oмg<_P=Hb=`-=='=0z==>3>8d>k>>>>>o>P>>R>旹>θ>vŴ>L>>&=>,>dZ> >==@y=Ч=X=H=!===Ƅ=j< htd hzddho޽྄>߼pMռ8<Ћa=0"=U>tZ>>>N>ȗ>r>>Ҙ>;> >?2 ?=?t]?^>؃>>>>>~>Lp>>"p> L>d_1>X>=8=r==0Q= ^p>(>4>>˂>d>>~>փ>E>TI>a>>T'M>U(>B.>=>>>>Ht=`<~pD>tC-/ i񽨜=6g拾h࠾HRe¾ž4,F>w>ڄ>e>">==`z: x<07 =v=8o=0\= =#;P[4)XmF4"ѾR7$'+'@7&%22 O G(TȾ2<ΪLŎd:x;lOn'P p`n)c R/PJb|I˾ྞҬt` ߛ6$<(-|3&>:6A wFFHϽLmPNI>?/," $|H akBҾz& RD$-pq 0ֽԽ-vлLƐڡ&޾|**8#(FXHVKᄆh,9BfIWQWUNE=hZ1 $(" ב;n<$پXWP4> c>>t>r>,n>=>>覿>2>o><>g#> "!>41>I>J> u%>=S=[ߟ ̼0Ig8)`ǻf==0k=`O>\>L*>?>Pi>>䗟> >>ş>r>g->=He=Hd==x8>LQ%>\1,>8?>`= /=P",9:o>puYg0$h ^膾l$E#|̽X솽P<=Щ9>VJ>(/>>X==@m=d&>i>LŎ>>>@>&>q- ?4?>> ݂>p->(<=Hε= ޼=j=>>>= k= E<|xm\4<0xEX:>=>XA>}N> i>\>">$b>\f>>k!?| ?'* ?%?H>q>|(>>>`|>_>Y>(P>4!A>,>p>==pt0= (<@&H ->YU>Lw>|]x>,Nt>>0>D>z>\h>- ?,????*l??c?R?j?< ?ޛ??k?H?[>>\ >\ʮ>>>Ȅ>Zt> e>CW>ЊT>gh>5q>l&m>q>q>di>a>O>hl7>,>h)>Z<>4k>>Ә>>ݝ>͘>X>|>>\>e>->2Y>?: ????#?$? ?^?R? ?\ ?sp ??4/?H?>>m>;>>Z>J>*l>O>j>>>7>p>K>L>|t>DW>(=>x,>0>>p>i>>o><+>>>|>>4/?8 ??>$ >>v?>D?? "?؀-?AY2?0?Vy*?>( ??w?>( >$>G>J>v> >5>ʸ>v>N>0(h><>t>f>Z>Z܍>}>@>=Xi=+=;_\qj8Hۇ$Ax i,֒;0]====>P>+>lM>}> g>̿>>>>>0>4>7>n$>ղ>`>>G>]>(Օ>>䘬>f>K>h>FC>j=`;=r׼Pq`. ջ@<?=>Q=A=PS?==E"; R`੹ ؒM>>к>O>&;>=>=*=.:] W;>MD>r5>L!>9 >Y=;<"\d)*t,ٽ {&,ky˲VGxϾؾؾݾ޾мپz)پ ؾپRܾtھx־ҾǾ2 zR ׾bj襾>𠿾Cоaܾ<5v {ݾ6ʾBȾf۾A^ r4g)#/,"* B 4w"h/7b,9@5s.z"Jjؾ/˾r?ܥ7P&T6\"Kiq,o Y+1׽G`H t/h5%?*_wpU攒&pt zӾC8꾈f׾ $¾豾4S~¾1ҾftоHqXcI pZ&<`h=h=>\M>|p> F{>hLy>p>KW>s;>+>2$>4> f>Z>'>>#>y>=j>?[> >><*>@k==愼N{h4 <4|LpbOnʧ2g<ؾҫ$$xӾD @d>Q3I ?HpF<= >3>X;>8-:>(B>}U> p>F>`>>>P|>g>q\>|I>y!>1=@p>fk>>ë>^t>2>.>\>>>p>^>(>6>>Ĭ>9>оs>A6>Y=З=P8=?<xT0ٲ0(n23t禾$PǾ̾ȾhjѝDfln,-˽ۼ>=(a==n>>;>>u>>>>\?b/>8>K>jX>jE>*>k>{}>Fˎ>9>e>}>t->ؠ=@u<`ͼ6!g;P =0=@ <`ϼpx\ן0y `<=C1>K}>>>>z>>8S>@>?ȝ ?? #?+?P]+?$??? ?̪??? 1?De? ?>>4x>g>4>><>p>.>V>@>T>-q>T;F>@)>?*>Z.>\c1>T:>6>E>==p==+>1j>r>>4>>6>>DI>x>(?p? V ?^)?f(,?#+?u_*?"*?T'?^ ??Y? ?0[>҉>><*>V>>> >z}>F>>r>Ls1>` =0j=l0r@-n B==((>H%=L=@p=>lf>XIY>)>h>> > ?_,?V#? ?s(?7/?j4? 5?*m2? 2?l42?9>3?:4?/?Z)? $?B$ ???3?>pB>> 3>dl>Vi>lV>ly=>>X=( ==þ<#XWLCD퀾"4tuqЩ9@g0XyE=`R== > >PM%>8>5j>>,I>(> >>>>J>(>?>O>f<>>|I>l>>\{>_>@H>X=`&=q ahͽ[콐8-8 \A%5680$4 'f`-<|= = =9=(= z=H=e>X>2>>>>H>°>p >>q>\]>hH> I>hi>Ʌ>X>G>@k>(>Ι= ]!R:w8yln0b_Qn˾IeQ(B"2C&%*Ȏ-- %h6ԗ߾:aپl$ӾžVFz|ЬM ݜ򽊾`u[ C@Dt g\Ξ@jϴþ־\U쾦vU B JB޾Pݾ`i6#U(4'Y#ZXT`1{r?+,/d/+!^ 9"fz ־6Ͼ2˾)ȾrRB$KܽGBPbhyӽE0wcɓ\ڎttpv~ `o 1|;پBIdھ3˾ŷ(4u*a༞T 뎾wT,1(Ӽ8<ЉG==>(1>,Mg>׌>>>.>Bp>hZ><>@>#>(K>Dz$>T)>*(>%>'>T->,>:$>8 >h=@<޼/lۜ;8ݽh(S$J[ԧs0,:{@H?S,vFt2:g[pX<=5=8>v >}>>5>,\S>$e`>_>N> $>X==P[=y==>1=7W=@εr- [ͽTHpԽ8$A P蹫p?l40]x10"pWx~'< =X69>>>J >\>ǹ>>>>>5j>`>0o>>&>w>Q>t>Ac>dI>+>< >h==0 4=@%=0= 7==#Tj$5x"r 8rJa@8SzmмYAA50$ ̈jଽ`,ӼpvJ=>P.t>>>l>>Q>>r>8v_>lI>F>Z>hp>Sh>LO>7>,>Y> =`=h=>$">D >pQ=׻`THy(p2:+<=%Y=}=)q=@G=w=н=<>(#>d :> FN>e>>t>*9>Z>"ܼ>c>dM>j>E>>⬿>>f~>$c>^>Zͻ> >D>tp>>bK>l>\6m>Yx> y>7l> S><;>$>H>>$ > >u==Zb=<8xpslZGu<;= X=p>_=x=H=P==W>K>ߊ>斬>>">>H>FW>>9?4 ???\?t>>>>&_>r.>w><>N>>@;M>Q >j~=-7 bҿ{C۽|E 9;}4-w- 5`a <O=w>v.>JN>p#z>ۖ>>>t >>C>Ĕ>>N?&?|?v? ?z? ??գ?>dO>>D5>ʙ>ȶz>\H>h4>Ă'>t>>>`=X=08-=Н ?hn*6ꔾ럾iᑾofCH@`hz,^`*<F=X=N<>&>$>P>>y>>>k> >o>7>.>">>VX>Z>X\y>Q=>8=h=@0w@j#8ƼP|ӷҿX#>CX3F81@W ȗ`XXv>1>(V>[>x>5>v`>,K>c><>>y>Κ> >>d>>>x>ތ>/>X>.>d=l7)c᫽兽p L;4rj"ۯR);pa0&K)|վNpV4j~NӇ^^|ER@֮[=X=p= j9=z@uHTk1DyK$Qg`*29綾6¾L/; վ߾T~뾨5he9 !u ,H t,оӽB˾#ҾJξN &Օt`-HR`H)@?|-pGe! lӼp@`ADtv펾\듾А☒*kVxn޾θP<ӾTru񾬈߾龎< &dx־Ǿ橾(e@.P*=p3?>>B>X>M>Hh>Lb+>pv=7W=y<v>J@>:>HS>>|>4>g>ĥ>}>2>&>L>=>>a>S>>N>*>I>7>c>V>q>ЪF>5=`,S=;03:(;>?>Ⱥ>@>>>RJ>C>H>> B> >>h%>>4O>T>x=@< @J9A\yG@٫&ؼ +"\0B@0TMm<~C=s=0~_= <mn`*%=rC>>h{>d]>~>>>>> >>>>>m>h>\A>ւ>+>t1Y>5>>p==@==`>|=8==Hܔ=p0=sv(ֽD2 #2? I_I$8g8p|Y(z.LϦ6:P=E> >`>r@>\><;>d>s>~i>d><-n>p>`>H>W>=G=p=>65>ȢM>\N>+>=8=`<[`6>LP>*Q>n@>4U,>T">$>~ >>>8.>,7 >(E>8p>>zY>|>M>9j>k;>`>2>Ĺm>ֵ>Х>&>~4>}>a> Q>[>m>(o>Lh>X[>K>hI>pP>8O>D>|}6>ȟ&>b >$*>>>\U>hb>` Z>P6>k>Z=@s<]ļ D E` xZ;`=p=~==u/$LJ𽸜̰@Ǽ ~=>L2t>>/>>ҷ>>>Z> ܢ>H>>Rl>Β>l>DJm> XZ>tV>Q>\<>$q%>L>p>0k=1j=p=<8;ƻ ߼`IH㽌:ddXh<'>3>xK1>Lr$>:!>?>Y>"b>L>\>r>,>i>>t>VЮ>ٝ>h>]j>4P><;>F.>)>Hw1>X<>``>>H)>@>ڪ= =@K!fpATzzXVq@dLEj~6Pાԩm.`@KF,<6J=࿑=== >.>P>z>>hj>>h{>s>q>8!u>tN>$#>*=*=]= = l_= D=a="=>E>L>ϣ>ʞ>n޺>>Ĭ>~>L>0>E=\=@a%= s?=྄=m=1x=)=eb'Yj\P嫾ľwվtJPP};)c`$ uH  jξ4sء9TY*ʽP' D*(t)!Hx^ѽ<^DN׾,v%<"`\g=~Lnh|nR ġ 9#P<a "j.[ྨ4Ѿ |Xg>8Oɽ @7OAUD1ld` |9,;b*bϾlھUܾ@׾BkҾtPؾ"2辂$~[B&(Pm ]"=$"jW jɾ̋L* @` O=ԧS>B>T>p>?>xr~>,_z>hLy>q> `>,H>p1%>===p=Ģ;̼`{ɽ EAm@~SҋԂ߾DIJ*߾ù<䔾puX[=HX:)DiN=(ӽ`!3Ь`=:C>̊>]>f>T>G>*q>4W>h><>>>">>z>>j>(>$>N>>$J>d>ȯ=pr= ;NQ0HϽ8-mcbKHꍾ&呾ۖ9@ҵ̾;۾F۾,Ѿ0¾Pm@k @z[N<> y`>~>>.>>|>L.>i>>fњ> 1>>x>NQ>0y>=yG=@0<P}D0˕⽈V >$47:f.gx7x(Й@`drRZ|O}Iॅp5=xO>Ȍ>Hڔ>[>> >̡t>Ld>:ԁ>c>Y>>(>D>Di>L>̭>*>p|>@q>d n>r>pp>DZf>X>8>=` a=ۻB<,KM8rP愾 $Əh<>C^>q>,os>pyq>POs>,>{> d>d>: >&^>>آ>g> ̖> U>i>g>A|>X7F>@>==w=p4=E<=p6=P=j=x> T->|&>L>==k=pax=pˀ=hH=B=w=(9>L->D>ĶF>L:>|>>@=m(>>k>6>t>>>J>T>B>>TY>Tj>^> > >>5>^>RK>>n>ZG>;.>(:>I=0}==x=^=(=U=x.==B>h>j= ==< bq\o Ҽ<`A=o=X$=0!>>>N>S> >>>Z>^>>k?>XY>ξ>(,>H>He>>>^P>|>R>%>=`$Z=(<@:@D,\S>`a>Th>s> >λ>ӹ>>8>>8?L? ?f?r?-?1?b>>>.k>>2>>[v>}>>\xk>sB>,|>@'=::`ÇLP `8h9pGμ<%YL 0Ij^LJ𜋾 tn C<X4ӽG`ǻ@8n5<8=8>^>6.>(>2w>l>Y>ݕ>g}>l'z>Dj>Q>:>>xP=x*= =P==J=P>`= =pI= 9*ֽݽXhޠH˽|p h˽p@y9%N;@X40 Q31=XE=0>>>>>f> >>~i>K> 5>&>x)%>&(>%>>q>ʿ=`<=`&lP5h4Z&曾MJzlʾZԾM޾r LUu+%^b$bh<0bOҾ@Ⱦjþ`JШhn8WL^lTJf<`L#7Nνv1KXV}`Yq*k8 r.6뻾D)\d d(9=Ҿ0vD3 V ݾ wʝPmJa8 Gr+Ͼ1 RPTdpkZ{ꋾ8NX40]<Wн`_B<<$v@x \(ӕ԰VᴾIꞾD韾 cㅾAD!ѾzDZ&6ؾ˾?ɾz;Ͼľe8뽀B=2>P[>(d>4#[>DN> 8> )>d9%>P=,>Й@>|[>n>La>2C>x>=M<(+P{ 0pQ>8Rm\XvY,.<"^<Q ],bܟS+{ڽ@=>06G>W>f>u>D[s>q`>Tj>>8>~>>D>>>h>\D>5>f>>>m>Bi>ր>k>cW>ĶF>#.>_>(=Py=?'<0 sv烽wh͚8L48~>ӨFfž̾b>̾Eɾ¾" xo@P8ѽý @P(=>\Z>^LJ>̚>>>>>b>R>>$>Y>m6>>(o > >t>@= >x(>@| >x= E=kM᝽-8x0.` nHѤΘJw0.(zԽિjM=:>|m>(Օ>nT>(o>9>L>,H>21>?>̜>>F>$>\h>H3>>D>K>= < ք(Ŷ5:̽@8;n[9juքB͑T`q_W`GXh>4 " ;L=p >,.>TC>4O>l5Y>\o>0U>Fw>>>Ƣ>P>0>إ>>>>>J>|6+>8>`>lw>\t>n>b>e\> ">=ѫ=@^=< _8襽064|$.E=߃T=((>|>>2>>l>Y>5q>>Ҹ> >->>?V?T??g??E?o?>9>@>>:>ӌ> Z{>y>f>@>,j>9>Xy=hX=/>U>&*>>FU>>$ٯ>O>w>r>,>K??J?E?$ ?>>H>:>ĕ{> R>8>0>8/> />D#>>h=22<~rsޒ9⿽Ph@hr[< ==}= >H7>e>w>X>&a>d>r_?J?y? ?Ԃ??>>R>T>d >n>s>? ?5?B>VG>( v>V'>=ߊ=̭9>p]>V>b֧>?>>փ>8>>@[>>] >>,7>GB>H>Tl>>lD>=`<¼pϘ`P靽@ܽ|&JtAp@Ћ8Rm$Q3xr0μh(*\[pnHTLx' ws(m> > >ܰ>ի> >8P>亞>F>0>kv>Pn>tdk>pT>d_1>>l=p22=0潜+DQldx돾|ΆցZϾxx(o%n-..)>' ?%C2J"h*X7.J3޾ƾԄ K=!x߽-ĽgpϽhy :lCpo(;5j:7(*o8 2|־Vi6!q8*~b "Ug} =[}=%=CX >dZmttmDd\DyK2!n.icl2~~G˾Ӿȡھ߾߾b@ dPRo|ᆴQоrkY n ^;<W=8=X=> ><">t=>k>=P=Р3=PO<?';q<'= =P=3=UӜPK 1>d[1T  V (/PVuD퀾}tmpUy,нॼM==(==ן=x=0=D>H4>.\>>>,>F4>>>> >l>Tj>*>,X>T;z>4x>[>">H >x>>>q=C1=@g 7L=˽ QN ZǾξξ0ȾBz:?d䠾N*~ɷa'0]X Thm;0k=-=d >]:>h)`>,_z>T>>2>V߀>dV>.5>\ &>@*>E=>lP>|ld>9x> x>V>>x[=౲<`h8pؽh(lw#%l&>0HZj8!u|~pnD(Kp>H"G>Ȍ>f>>rQ>>>$ǜ>2>tc^>xMK>0=>->t >=+}>"Q>Z>P>2V>J>>t>,L>~>>>h>>Xާ>g>j>> >t>>p >Ʊ>>h]>,>o=<=ɹWDU%@Hr'L3`ps#ҽ /<[= l==(=x}>pt0>/e>>>>I>>?R?p. ?E2 ?b ?() ? ?z?t?>>>o>8P>>>> B>p>==9== >>== =@hd@Xܽin'W&*6a>dm>p>b>> >1?;??]r?h>!>62>>0>μ> S>~>>v+> >s>d&>0μ=p=f@xX0WJft`TPDޔ>vֺ>*>>Lt>>2>E>|I>*>1>v? ?j?{??X? ?B>\C>&> >>>||>hG>>=` n=@=@<@HּjAս r[RCh$2,+@Nu!ئ7н8SƽX3ƽO@@!A<=0> O>ɉ>>>:>>>҇>>Ĵ>>[>̳>^Q>V>>-> I>(>=xj=a3=@H-K>4wl>(>j>x><>>$ٯ>>/>>p>`e>\v>|g>E>>跑=<*瘽ld)2+%N5 XΩJо&*-%O&"ȣl*Nw[ 6O'U޾ľɤ b@ܽƼgI==i==`{=`< ko@?๫ |_;Niվ&(fj((+4P<8>8N-Z $2%ワ|F0̾,ѯhꂾ-fxmT-AU>Dk>`dr>l>X>>>(0>ē->p&>>>0>X>J=ڿ=?=  ҽݽ0 L;h23 \ڽx*hy zU>>#>0k>x?^?Z$>5>8>P>>v>e>ܢz>r>o>hg>,]`>U>3>Dg>8/=o<Хept87>4P>e>w>3}>9q>^>E>)>3>x>4">hk*>h&9>*J>J>:5>0>@=5=ѝ=pb=pH=p`k=8=@M`=`9<@' Ȃ۽xK1YX\LPL$0R۽^(Ŷ PI@lE` ӕ^C< 8= = @>b@>Ax>b>>">ʝ>Ή>쳫>j>*>Lb>Dy>=P=P=p$=n=9=p==h=P6=; 웼ӼԼ`ۼ`C:Par-d0m3p&04 \ F$,XzQ>w{JY`}ļT=H >Y3>zC>P>+b>hmx>d9>hG>a> D>>>)>>D>>h'>ă>N>>*>>*>/>D>6>T;z>9/>>0μ=V=<@횼p@y0˽Xd h!u(d XF(Ԣ?^ |żsd]>V>m>>R >H>Rp>J>>*>>l$>t/>М>M>>H??q>[>F>>23>N>>\> >`>@>>*>X)>6>MD>L>`P>8D>>؍=@>t<0pz bb[NpM=P=>L>@I,>F>hu>>˽>*>>>]>|>ά>>B>&> >j>x>%>ؑ>>8B>">=@==@.=>\ >>=0=8=<@A<ż@<Є=Hy=?>Ќn>Hv>O^>,>h===0>H%n>v> i>$>H>(/>T> >x>\ʮ> >=>ꥲ>L>>^>.>0>x,L>,>P=hΧ=2=X=2=H;%= q!XA@ds񝾖0"꛾8+p|$r2ځTxkxcT#xs?'== B>F>>>?>p >Ĵ>ŝ>"ٕ>>:>>/>h|>do>tm>xh>Y>,.>x =` G= ͅѲĽ&ؽ[P& ؏&peDR`\dPyl]DhžZʾgƾ2vlIRwM,Pq`"=pt=(=L!>к?>G>F>S>p>#}>f>tF>p'> > E=X=t== F=\<2<x-<X;2ҽL_8ZA=ľrl И&p'+#ByzWiA{$ /?vIIIsA7)<;;,:0t^;`C<<<&< a6>84>K=<+hBDB`b~ ΰ||þϾHվ ؾ׾2վQ׾,mپ޾܀`c׾2g瘾X5`"ཨ0+>@4>D%:>?>PH>O>eN>S>^>"f>r>0}>q>TP>>=k<= ~PԽ@.XVsQ0}Fwy*<Hهh{X0T H0&4!P@4>2>>*>?>>>n>X>X>4e>>0>4>D>b>>Oo>">p=V.=@x<h:ýShU2 ʾ־\۾(ݾq<`|l(ܾھ߾0@*zG޾5_=`= >X<>Ic> y>&>,H>z>>U>w>>bo>ʮ>>>>7>Do>L>x>@=r=Z@PQcͽ@8e0"۹jǾ8ʮ6Bb>`N>F>>>f=>>̳>@6>p2f>,I>$8>H=>r>>`>ز>bp>,>h=lxܽ(J  /"Jchb~Dh\r\HuKJ`Ut]sF 䣾N$0;z= >+>Q>wo>V>g>x>>>7>y?l ?(?6-?Z>f>G>~z>>\2>VH>>~>l> >V>6>\S8>H=8ܽ}YJ>K}DkTD#:?:>m6>I6>7e>&p>.>>1T?????! ?F?ke?>>I??Y?a*?B?>~&> 1>K>%R>Pn$>t+ >==0Y=X=(ӕ= === =8r= k=` =u^>vp>G>> E>2>>r>h>>B>>>><;> >d>>>>8K> >=<=Th=థ==@M=( ==6=?==M==P==>Pn$>>J> $v>B>r>J >(V>(],>Ȟ> >hmD>>J>9>1?> ? ??|>b>>P)>>̞>8r>2޵>R:>FC>f>DO>@>NJ=?<f[`}ļ`@[hJ@80FHQ|(LPAS;-@hн(ܽEx*2OEcb[<;*nm@Ԕ<a=>h]>˂> >\>2e>p>f>M>H5>>>(> >K>З&>7>5>H0&>q >@=m=<PڏRټOR)@@I<##Whx㌾F`ՀM% 00#۽Pr$@(;>FC> !>q=T==`N_=p =<1<`-=T0==@=~= 8ILd : ۽ ,t; ===0=<@~@lŽ0T7K#P6ĶF`QR{awP$=uH=xH h὘p,zRܾJ@H愙mj5x2𽰀Ƚ( 8 ˜<=P>$>+>\->tp0> I>$j>>p>n>wP>M6>p>=؟==∻Լd@hr(:H;@` G׼!O%hAIս긽ؽh$k}2``<0=F>!c>I>x>Xx=J=@Y%>H>$b>c>>ɤ>>☒>$>J>>|g><>>H=0|=*=J=j8(MPkhv(qp{ڄ,Yx;Ҿ(?VV´'̰> ZʾP崾Hڔ`dH7 t H5PI`0==\->X>`u>pǀ>>>@7>&>v>U>>D>$>8v_>;>:>=0ݨ= r2==\G>lj>k>Xp>x>h>C>D'>7>LCz>d>>>>d?&> >F>v>|">= B=`<9c<@<_`MҼ{,@' _P׻y>e>Q???4????*?A? ?0?? ??M?">Ω>4x>He>8==]>lʹ>>Z>:t>>>>>X?o??BW????U?L?[??Zz>>>̐>Ec>6$>$,>=>#>D>>P> xL>L'>W=pm=z; UgŽ{0 t J P= 1>:>C>>>h(>P>>)>@>z>C>2>6>2>>&>$>t>>8>>wo>\v>\w>b>|@>H>h=8=ZG=wڄ>L>Ź>4>>>o>V>R>>׾>ޯ>>>8 >:>>ǹ>w>9>F>s>R>!%> =<RX:S`AY@mRIdBly=DAXG:NtV`lhkyn⚬R㴾)撾m@0@~ؽFJ=$>1K>pz~>>>>>.>b>BY>\>ʙ>>0]>K>R>qg>Bw>`{>,o>Z@>Hg= 7=zp`k?𢿽O½UP𽼨3JƁ̩PǾԾ̾˹t禾.$P}c*yܽЋaZ;`qx==J=t>K>Pv>" >Dk>J>t9>3>a/>1(>>d>3==@ >#>">X=4d2%yqrSl#ƾ إm%P*tZॼ@¼BJ<+@=H=H=(r== "=`PYZCݾk!;&H B1vLuy꾨j$ G(>. 0&+E# ?־ދc0G A!0/tp04 vP|мVaA<<L=!=Hͨ=,=Hۇ=<4ӽ S `AEUhhH|[,rƍr+#?_XV߽lA=4P=h0 hZ(0 ەҽؽ(98 :$= =+=0V==Hu=He>`>◅>L>Y>\? > +=Н x彬Mo7޽ķtK@XK}Y nmpn^Dn8x4@Kz%JrD|a fs=7= >P>=p= > ;>xz>A>\{>\V_>@O>7B>?>N>Hd>lw>d|>]j>4H>&>==;->A> #>,/>7>D>TW>@]>6N>\/> >)=Xd=Ѻ` Tz⼀<0=r->0> >>8>B= >k4>*p>>>p!> >$>">H>^>t>?>X >I=Z= x<j:;̷<0;==+===50-'lRvnBtDO@H%x8\ lڽ`0|E=0>~[>Fv>>ة>ڀ>>>)>JS>jY>>f?l?5s?@z ?\>>蕹>,7>>4>|y>}>8p> Xa>]>\Z> L>7>xn>F=bi= <F@D]Ri` a{F0~B> w>G>H0>^t>>O>+>>Ϩ? ??!?o?^ ? %?o&?c&?"?Z?,% ?֨>H>x>z>z>:>_>&>x;>>}>>V4>@[?>(==p0=W;9ȼU/pzA(ʽ00 k>DΛ>@8>H>>H>ţ>Z>`>b>x>^>>0>br>>t>9>2>P>>>t>ƀ>>*>`>P+M>طL>]\>̠g>gh>_>V>R><>>Х=j(~߽pWɽ Ug@ @93>ST>x>>x>T>8>Po>>|>(+>Xg>0%>,>> >&/>|>$>> >ҹ>l>K>@KF>=P0zd ݽ(Z`7ɽ UXLp L`\d0Qv9rɾ Xι8澬Sо֪&恾: ݽPq=<=Pt>=Pwe=p=M>TO>`p>$q>0ށ>\xk>Y>yU>q>>8r>~>hk>*(>>du>j>`>O>l)>8==e==;@@(o? ɟ\LȾھv2(fL߾&H\ý .<*; T;; =΄=Y= c=`-=HV===hM=P>$>\6>C>D>U/>|=p=Jsоs5꾰߾ʾטؒDW񾬥@(\:8JT0VZVR&HT=3S* ].XX߾^D"j?l&#$9ؽo^ ;*=4B >P0>@Z2>0>=Q꼄ijh̜6 *Լ⽾Kžƾ4vžJȾ_Ծi$ j1(d/5x<MAC=1$ڑ`>P h>3W>b5>>=@<05x:&(5DIA "Ƅ/O]U0͕/;G޾6 #㾄1Ҿj,>iFD':<T"d) p۽` :<=XIY>>&Ʃ><>>2>M=@<.`]<*+=^=Z=9<@{*ZܩX#ͽ( ܽKԽǽp5ٽnXINhFdTk`<̽)`H=-=@,=(>#*>8r+>|Y>`=$ >Ȑ:>e>8>(> >>N>W> @>8=`!3C0B@Vf2H%XE%TWقj ҾJݾ"f*=4}辨h־2VLVŝĴm,9y>pB_l"hЄ@g< =(==|>XO>c>>w>0>g>E>(>$>>؀>e==j=@%Qxq𠥽9@ oV Mt}݃l-=0ݽ̽`q@/i(` )0ܛ@<<p=`s=H=Ō=6==3>pa>`>۰>>>b><>JP>T>Zʔ>>~>Toe>rC>X>D==8j<= =X=/==3pa4= ky qgXW[Bp:|8EJ0g?!ƽ ܼ0==lU>2>8SF>^>Lu><>F1>F>e>>># ?x??>J>~>(>` >P>> ˣ>и>e> B>9>5A>xI>>> t>Ȅ=E=0V=0U=X-=@<YLtٽ'潸ŽpQP ==O'>(OM>pa>pU>:>1>lS>U>>> >u;?????2??????(n?:?SX?(>0>>,>Ŧ>Dy>^>8>(>>b>F>x>@[?>$>7=6=0|E=l>>P>T>>{>>4>X͡>0>>z>`>~>$>:b> >$>>>Ɠ> >D> t> v>Z>X>I\> zf><.{>>>Ԫz>X>*>z= c=~J`֧.ý좽0C[8A3>X>H>:>d>l!>$>]>p>n>p#z>GT>>7>*>e>J2>7> >>>>P|>XJ>8>=@:0)|clтXP|XpcXHȽX!3cuОb*l^̄WPl m``ּ`(8-;P!=%==Hu=p%=>̛&>I>x`>̐n>z> ɂ>*>>(>i>lޠ>>r>R<>`p>@'==L`j@' P0~8*|\Jvnվv~Wh86:pԽH` Ҽ`W@A%|)< \>]>` >><=<1\0Sb쑹kξʾ|{ >4u^h;7 (6)=$<834.TH%[L BѾǾE{& z6yVI60 Ž3=F=HU=0%=[̽0=du.V ꁾჾnゾ"?pf7Ǔ\D6ؾ)9Jay~3Uh a& Ͼnl/`|\ :mP_ҾtP2RZ۽QA=L(>(o>zІ>6> Q>\>=Lp==K;XB@4(~ΠKXhّtT󭾰hhPoT]/G(սqN <=\fX>>v>pٓ>ȵm>]!>Hܔ=0/9 PYב<0~=x=`?=>T>X=HR=8=#< P:pt(3|gLt> >>Wh>֣>`N>No>b>{>4V>>b= ===к===`=^=<:p ( [܎@ϾH>jվ޽zkkʆZ˾4վ.Jھ]Ծlgľșq9Oнnre;` :==>\(>(>l>^==n >(!>2>I/>o>h=0=ϭ==i=H=ߟ="<؝ x x9̽8q΄`哽@ɽ24>:/|Udd"= -==hJ= $=d} >ܮ >d>>>Y>i>(o>{>f{>,>1> >>>L>s>l>44a>iU>Q>M>8 ;>hz>=Y=֒;@ XQF7/WZLPA 5*Nxӽ{0@&@(=m=P >?>Tn>f>VV>a>FU>*©>\> >>\>T>f? B ??*??:s><>Q>>L >xK>l>r>8A> >a>>H>=X=P;$0!P9,](Ϧ2a;Z=P=*>I\>@)n>`V>_ >]=ȵ=l>Z>>>zp> ???U)?k.?.?-?Dg+?#?BW?k?}g ??(a>4>|>f>>v>>(>⬿>R>>w>NQ>6>XU>P.=0V=;e=ƽ4x*:;pT>==>Q=>8o>u>Ñ>n>><>|>>|> >d>1?]? ? ??+?|>s>>v->Tj>>3>@j>>\0>g>f®>$>>?>`q>X">g=`=dkԼpGǃж]|:=X=>E> r>4x>vi>$_>pg>h+z> %|>]>JJ>e>0>>Vj>^e>+??a>">>]>ʿ>q>%D>#>>'>x=`==ر=`=P(=#d'Z@H^HdY0&NVz'hHvpDt,hv`V4C ƽRk` =pR=b>G>>\>ɑ>>k>Hx>>>x]>>$>B<>< H>@I>Q=>H)> R>>p=l= (<^50dAh}ql&֢.6Gv,̾پJܾJȾإv9@]K<. 2!bS @a<(<`=}(=@U=t==X=}===8=N=0=9=&|i ݯ "zZ솾bMӾn1>"?)N,3q:2<~<<<.<^s71+>[%^`lǾ=ܮlTF<(-p?5@b`{Ƽ 2NϽW cBHP A0$4*<"+EXFf ~녾 5Ⱦ$D *@)$` yοT޾D۾Ѿְډa3P@]~ϑ慦λ,`iJT=L->@]Y>Pa>D>3>8=<@`Gϻ@]<`C?=X= >XU>>w=}=XV߽YNrtʾBо~jʾ$ǶYbnd {ÅOpt<:TrؠF1/нP=`@мϺ =w=c=|%%>8>0)>|>=& )>1>h)>T>(9>=`==׃ w?qzጾטcH?u-oнg '.050 L>^'>ȁN>D!>W>&Ŝ>e>V>N>Ni>4v+>h=`=P===== =f@\@9r2QHI,Ͼվ>*Ǿ֋⩾BGշnf,|ޛ[Tx$u=@u==0|=ȴ==@==x/=1=|>n'> hS>g}>$N>⇌>hu>X%3>=C= =tDp>ѽ0 d8 Iq5˼l;[oȡXuB5Զ?#x`IҖ;:U==>+>h)>8>=$ >9>Aq>߃>>&^>hπ>\o>$W><_?>T >>8=Y> >'8>XG>ȑG>1>=XyD>`>5>Պ>^>/>>S}>~p>H>FT>>>>~?;?>R>y>L>^>>>N>ڐ>nd>r>}c>\]>b>d>|[>=>$- >=<Ņ0(`VАL1jb<=@=,|>p)>>`O>=>0B>hu>D>&>tc>&>X>F>K?v:?8?f> >*>>Nb>v?r?N>|>>'>>]>b>h>a>ʯ>>bÇ>43T>.$>>="w=<O;ꁻb B@<{o=w=>bT>s>8!u>Mn>\i>C^>-K>@[?>lH> jm>~>.[>>"??0k>5>%>$>>‹>r><>c>@>s>>>,>$>n>*m>Ϝ>F>@%>jT>>0c?=Ml 7C;`=s> ?>R> R>G;>>(+=P,=>G>9(>P>>؞>>l>>^->>>v>t>6>R[> jm>>(=ҿ=h=@=D>>>H>_> >ز==9Jj 8tEh)` dZHDSL0ZZ~MdAL<C$?Ti@u\2m0HZ7޽Hڪ ||<>PO>8U>FC>#>R>$>&>O>8v>Kv>d>K>:>L0>,> >( =j;ͽ*J0 vpd$i̍{$=vmΪƙV܉z0'[H0Tiܽ` ǽH% ӕ`޼`C>*&:8:L t$,`>2T4<1-+*P)l&`)쾆ɾ,Y֏l> İ EU/`t,ltdҍodd pH%< ws==0H=!;0k|\kؒķNþXʾBо"߾W{K| B8s@ 澶Ծꤿ^hjs,|VDhE*ѽ~ü =%=H=>@}>&>E(>*> >>=L)=;i;=(=`><'>E>i=@` H̛P\@By\b`Z0iYJi26 \b ݶ'ɾHϾžŭ`i'1 ֽ O,)(;<^= > 0>0>Ht > .=90C> D>z9>0E3> 3'>\/>x=WW=ұ3L#@bQ4ЊTM?^ЈؽI08PӇ <2=(d=%>DO>^>>>ZS>4>>vw>fT>x @>$@-> >$=`=r=hm=9>l)>#>A= y=@uT ce|G@Fݻ򜥾X6mX&XXq{h|þɾ¾ܟQNvC,PC=Pl=[> > >=>====l>_#> 2>3><0>]3>p3?>M>T>xN>9>>@=@h=@C̼p;<0=s>M>2X>hO>0H>R>Qc>dpk>(r>tv~>%>i>L?F>DF9>?>PT>Lq>n>>U>C>P=%<%HݡpU˽aս׽߽ ܽ 3[ʝ@N<<V,VjXd8pOxH=2==7=;=>;>tO>PU>S>FX>hg>j> >>4V>>?K?Z??xa>>D>>6>:Ƣ>>ԩ>f9>>>t Z>&>n=8_=K<}`SB<D#;BPܽPo彸@JR<= 0>@8&> "!>> =>d>\ـ>>h>$آ>vֺ>>xM>>>|>h?|?I ?/?>??V ?.4?_?ܴ>7>>r>7>>> >f'>G>P>)>>Y>4'>%>p >pV=(_== 0b29q=]8==,''>d>>(>G>L>h>e>*>X>\R>>(>H>xm>>>,>^>Ϋ>b>nF>>`>>>D3>>}>5q>H]>[I>=>p4>*>($>&>*>p&>d>w= $=(;``\<0=>^@>np>>>⇌>B>\>É>W>#}>s>2>?>+>>P>^b>F>8P>> ><>u>Q>>=Х=`j<<=` G=`/=9<0xd/1>S>e>Xa>Q>9><>S= ==>H13>@[>y>y>hO>@=X@ KQck4\S8mcHrxml̾rRؾ;徦ؾ4]dmDL0x[*.L5l3Y!.޽,Ž ½Ԥ,C;p(=8`ҽ4pپƂ޾&վVi˾xþJþԾr #+\ 38փ:7_3N0뾦ξhR|o4 48Ž@Ͻu=!07?<(v 1Oe0P==z>x>=cM= 꼰qܽDw1 ^dw丄j@(;W緾f亾3ɾ2#۾hn뾎 ڎ +^ [ݾQ׾Ѿ¾N^>"8- x;W;=ТM=@w=x=o=T>7>C1>m6>= r=P=`=0ݨ==b>l(>5>>=3i0`КMp| rL4,GPmվO ĕfȾ 뎾tn ,s>!j>> \=E :%>A=[=7>>*>t.>ȴ==K >1>4H>p>8_>Dw> >Z1>8>^>2>>>w;=P ۽ Pwe*=x=e;Ⴝ3 Dڏe<>>=4o;i>??>o>!x>|>>D>U>~?(?$>>\>40>=;`EټQT/P<>@>>R=  +xK``8!lMHiTkeD' B=>ȭ=hн>@g0k=`p>&>Tk1>1>@>~>Ҭ>>HE>v>R=Jn,<0IqpF:hHB𽤍UZ8Ѿjjf ءf ,^ʿ 꾖d9IJrꂳ%>j>j>Ō>L|>_>M>y@>,Y,> >c=Zb=R: G 8I==8!>|&>$(>5>D> =pb=`.<` 8Ƽ%|V B݊d(:н߽hx?0=|:>PM>>>Z?6?g>>^>5?x"?p,?/.?"t2?8?C?TP?:\?pc?9]?L?n5?$?$"?,?.=?UIL?^RR?_M?^A??Ԅ-??W?W??$??+ ?O?f>>^>m>ϣ>j5>l>>>`>->1>Fi>>?ڰ ????)?e~0?\u7? >?0>?e)9?۱2?+?j'?&?i/?">?H?L?H?@?b;?8?M6?͛3?2/?#+?&"??> ? ?^ ?? ?>$>ۅ>p)>pY=+>,>Ό>|??b??F>r0>2>d>Z>dI?.F ?ր?h>ɫ>;>7>>N>0?A"??(~?~w?>>4>hT>%>Z==X$=ı>\)>?B>1>Po=<[0\d$rI\0/Є0o0r^nӾڱ1STHݽUdG =P =>TX>`=;=K=@=`ԍ=;@z4.8%?T$ Ɵ p"+13U9-C:K RTVw,YWR~L IJD6>91zZ* ~JfHo3N_ Rリeо>ҧ8F:Z 㾋lT ^O USjF"x)Q/48s:PHK EԄ:fl**Ⱦ>|4ž/׾@徔澖Ӿ{yp%HP'zX$ڽ(н*hDYn kv[P7IԅG`Uoz~xhGҪHžM׾fؕ jV8NYSHC྄ rMľȾ EΪ<LGpǽ޽$N '@([lz<>=.=Ȯ=@@J9> >К=0=ב(3;(=h=H >VJ>>̺>>`>>P>h>(i>Q>XU>t>,>{>f>P>M>|Ke>||>Xu>L>X >>Y=;=`+===P靼YH=< ~=)== b>2>$r>ܿ>>@]Y>`C>#l>>l>޲> ?:_2? 7?00?7?&?r ?J ?y&?:1?=?E?C?h9?*?BW?to ?o?>E?] ??L ??>>d>V>>>ta>>ڱ>>Toe>I><>R<>R>D>BW>n>>>>4W>?VE ?j?@?? $?@'?<(?m,? 6?D?N?PT?Y?2z_?Zd? d?X?F?c/?0?u?S>?1!?9?.K?R?M? ??F'?d?>>{>0>>T>B>4>e>P>|>>T>>fK>T>>n>Q>g>; ??%?L/?3?X#3?0? S-?T)?t=+?'p2?tz>>a>y>>о> y>]>J>n>>>z> #i>$? >u>F>>>h'>>>^>>L>p >xQ=f >X[l>\>>>,>?/??Fe??\0?b?,?B??????*J?f?;? ??J?r??J>~>N> = =8ů== >A>cI>9> >==`=L=S=<Ȼ@;Ҹ5 ἀ<\=8r=r[=x:=k=X=`>C>Tu>8>>Ē>_>e>y/>m>3> c>r؆>>`dr>>>5(>()>$`>>@=`*Ǿ~Ǿp2̾N޾DXvp2 <@p#NHQR}*Jb8?`a>LP2W s46@mҾ0Ͼؾ,뾼RD ֳ ;S꾾2ʾު# `־ XnV =(\ [!V"<!i"6)C5BMQUpvWruWSJ**AC6+vM$f"%l)`&i6ݾ)jqRRІJrȧ CZۚÌy7:Ѿ1wmykE dޟӾ:ѾN>ӾP۾@*:)# 57Z48)oM۾^`,<ˆ͑ҷH/dtED7==+#>r9> )>@=K}=&ЌnHa8ը%/ vf߾1$1۾ؑ߰`-f]˾侐ZS_!?ID&;ļjUl{|H> Pnؽӽ; 佐݅b;!=>b.>pu=>E6>+>І >0>Xߴ=7<๫ 60=nX@۽l6IxV(dnt yrrHa6 kȯneXȾ:QThȾ<~Bh; 7&D"^;=0= >I> >>>f>>P=#=`Gs=訥=x=v=Xˇ=<@\ͼ뜼@g<@Nm=h=K=@e<@iG; 5󽴾 R 콰J@ּ?';o<4 J>(~>T>>R>~>>>]>H>B'>u>>r>>>~>d-> >>X>"P>Q>G >hH>h >eG>Yg>d><>A>o=8=,E=@<@뀼 J;@a<+<q3<@WLI>U>>>8ƈ> Y> #5>(M3>Hd>Ҹ>j>4 ?z!?(?N ?c?3>>> >X>w>ͦ>>,I>tM>T=x}=0e==o<B/hݽpɽz@ɼPS%9HL& Bǽ`YV<=X>oh>I>w>2>l>ƥ>"ɜ>,j>>׽>>l?W ?{?r?M?j?>v>٘>ȴ`>>==h>@>8ց>q>>>>2>h > < `.=>_h>f>\>>d?s>R>>>?>P N>y>$r>d>4>.>n>X>6>>?L????~ ?^@%?9"?Q?? >>>o>X}x>a>]>g>ބ>V>ڳ>>h>~>@/>=PH=`<01>0C>oM>J>L<>:>=X=>.>g>>Sz??(L&?*?"??b>6>>>x>>>(,>>x)>渞>Z>;>>n>,>d>`>L>Ņ>!Y>($>8>A==>0K>Z~>>D> >Ґ>v>Ԫz>Jp>l>f>`bX>K>D>J>n>,>þ>j>^>>N>b>>}>T>"b>d>P>gW>!>H>6>>>)>.>$ o>Q>1>e>H=h=w=h>>>>== j=@<6@u8d=и=pc=XV==h=6=Q=2>`dr>֏>f>l>>T(> ><>>@c>>N=L=H=ԕ >N> B>@>k><+T>@}>=@J<{(k轌(7#03B`:~tčq].,{8侦v 2 6ݯLo` 𮄽Ǽ@gqջ@[o88p.XN N槾8 K( Ͼ|x<辂xݾ·Ӿh;hϾ ־ܾ 徐:T¢ f^.s"vZ~;pRiU(pL|kWk!5VF@MDʾξlϾϾpξ&ϾZxѾ]оzԾ)l t &nU>PnP֮p8սp}@>@/<0b==||)>d_e><ˆ>U>>΋>s>@]>~T>PNf>>D>6Ȉ> v>{>r>`v>Ӆ>@7>"@>a>4ۨ>X>p>+8>Ht >8 =$`>RQ>f>[>a>>>f>>>> X>><>>?h??t>6?, ? ?V ??' ???)?,1?2?@.?Yf$?f?7?l?"?"??I?b: ??1>7??21?{?,>>t>>>>\˻>>\>N>>>)?`??4?? ??>">Ҧ? ?&?8?WJ?ruW?,^?Ab?`a?ǢZ?(P?HB?1?$??O;?f ?,!?9$?E3&?ѹ%?"?{? ?f>F>A>u>&>> u>Y>Vߚ>h6>T>ܟ>>>☒>L>|>a>֩>_>>B>5??? ???r!?xm#?@)?r-?N^+?ޮ%?P"?!?$"?0"? ?? ?T% ?Z?rp ? ?:L?x(??e?f?'?>n4>U>d>" >vm>j>Dx>>H> =8=z=HQ==XV==3=(Ŷ=H==k=?=F=h=>,>l{W>Ex>É>X>8>t>H>~>T>O>B>Ė>`ce> S >C=5=h)=`==P =0Y=L=V` GXYܽt`O8Ԩ`脾q"꛾pt.p4HɎ~͓ dd3󕽰@@+Լ@[< ?=>`qD>O> J> L>wI>1>\P>؅=0n=^=3=>5=Ѳ<ࠥ<З</5BNwSH˾vO˾9fӴ ЏJDeD~˾޾꾞8۾ž$onjƒʆZ<ԛNw9Ti<!6nThl\!gYE,8-@h|XU;P³lf)ƾ旹ZALq8hVU^-ľto*ʟھ_;̾ؾP]D|6ξ"̞|t8 !ѫ@08Ϙ7޽Z<"r'pp0DK_Gh)쾼߾Ӿ8N\< $=9==H==H=`S=X=h=%=P=(=X=$>^=ܩ= <@@^߼ 꼐2؎8ѽҽ0ā䮾LrF¾T־&t澜~kT𾂚ݾV8Ӿ:˾B&Ǿx.lz~?ܮ HHϽز@<t=0=>Lׇ>E>>/>>|>$>>L>>*J>Ć>F>l>0>\>t>Q> \>*> >O>ش%>U>^w>~>h><;>(=i=d0+9 hػ5K==>4>LD>Q> Y>d>f>4>>>e>>"S>P>>>ƒ>p>X&>">>4?)?u?^?p?? ? ?! ?>&>>0>A>b>@>|&>)>XiK>t>:L>b>Dw>ٟ>4 >H>< H>=0}=˾= =Ō=s=跑=8=40>>>>T8>>B>o?o ??˛ ?f{ ?B#?)?\>2?>j????>>h>z>s>p>>đ>di>4CM>/I>xH>\G>H>A>+>z>(O=A<@w 5w0%uPC`=? @<v>>=>n3>(>`a>>>>v> >r?O ?l?:?%=? ?>T>N> >>> >*>>b>T~>|l>>2D>d>HTL>d(>f>i==(=> >t=Hb=Q== <@/e>t>>ל>ė><>C>>>:N>ڀ>T>>؞> >8o> ]>h&>j>=Y=|>>8>;>l>=<@VmĐ:gyrZF e, ޽ D߼(;;.=H=腌=Ǧ=(=D0>&X>ij>|>@>r>X>2>>t>tm>Fi>c>h> $v>l|>tn>ܳL>.!>=PƵ=(==ؓ==–=@5g<`TX@"@P½ld5Hwe,)uZ0(8P~ :;J<੹(o>ԥ>N>K>>>> >>>m>v>>`>{>dp>Rp>h>X>n@>>HV=X=8 =xԆ=q==F(X!O&_U(OM0\yrLՇH"{мYL 4dHHН0½`&`<=(>ȒT>>H>>[>>x>8>Ɩ>NL>F>X>у>l>L a>pg^>Ă[>_>C^>F>G >P==`yd ŽPm˽xϽpH(X"~ȄC3VV,xv@dt Dd@x?`c=D>>Lƛ>L>HR>>p/>>l>f>>f>d>>x >q>>@~X>B>w;=` :7.o>> =;8ĢLT)g46{8+ Әɓ׌czdP w<%=P=x>L">5=>_T>g>&*>>0>>>Ġ>x;>>>>XY>w>ѫ>Z>lo>`->H=P==8=U===@===(<Q\<޽qGl&mܲsd[sB$a,8p QPpax5=ݼ;P =$=H=>B>`>Qc>]>|F>d>8==(=뼨fTg;P\4}0e0`Ʈ˾ʠĕ1 yĂ۾Y֨D$!<}Μ;PضsX3F#-D&$$m/=LhPOPTY'^|[TODxMK` x(:FоXj"3F⾂ھ(߾"CR ʋvd/I> 侌ɾW@Ѩϟ6ꔾjL[6%@г<|==l4>X>J>’>k>:>H>(-=(==8>`&>>>p=xH=<.X2 r(X vF9ꜽtY6·myN:6j{Fv R艽r=`=>>h>D(>Ĥ3>1>V>><^2>do>K>h>Q>4C>LO>s>j>Hv>g>HH>Xd >(,=8P槽` $bX!peK@HV潜Q*~ܐEQ^2 lӽ:@O@3ͼ;==`=)>d;>W>g>x.f>T(Z>S>lZ>j>Lx>r>HeR>`&> >~>=8=0==`֮0X> >=z=pȽd&@,춽 l`0S⪽0UxLVƾ˾þ'!F* D|dhvb,oႾ`\8`O=ٹ===X >">8>g>05=@=`<ߊ)2h'IJ8 Ľ+ܮ 0@~X2~SȠ6ZBþ˾Lоʾ̜3h|޼ػY06OE":<`b$=@A=`=p/ =l=3=+>`r> ">$>">x>=G== l<|0ܽu/D'LpvJ@i_4pZ 9Ƚ\eKfjlݓNLcl2ֽ[:S<@v<`&<P<;2<=U= >J>>>Q>? ?J? !?@?(>d>>u>>h>ƥ>>lj>1>r>LA`>DD>l >=Щ9lWп}0\@(W%H;@I:4. ֽ?K@6<P>F.>T>r>d {>Xu>|]x>>c>Ti>8^>e>0p>z>Po>K>P(> >_=PvX=@)<@ p/ `I0<=@H=i:S>8,>f>|>? ?V ? ?v? > >z>8.>>>Lh>_T>tP>;W>W>dM>s4>@= =`E<I;XȼRnLYj0{:28OdO'J 68b>p>p}>>ܞ>>F> >R?x9? ?CV?a?9!? ???VI>>@>d~>6>:>,>>8>и>">l>0Zm> >`;= :Ǽ0g:p@"c7%Yný %7v<*ĐýHˎ0]=,5>g>dn>p >V>ڒ>d>>2˕>=y=<v: W0@&@zq,eGW@]Y QS8slO, ڏ0Fƾһ%PȢ,KD !h2pȽ8塽@g`o<2\=)q==Y=X=b==݅=`<`sGн(026\Thgf e`TaycHkzъ\t8Dyҹ|ѭYP `9= 6 1AoIMD8)(뽰oB <=J>>>N>.l>>B?tN?T ?Q"??K?C ?*>>s>>>*>$r>@>`>t>=5K=P/=`A= K=9H=<@!APX,E?^dhLPͽk7e<*=H=5=2=`O>>a(>t@> 5u>=>k>Z>

_>>>0>Ƃ>5>>??m? >z:>>4!A>*==8=p =P;=== =3;(q4H4t6=! ꁽ@mҼ^;l<@<&0( ߽X -7;H!=7>:+> >E>N>.>V>R>> >>E>e>g>7> )><>LQ>Xke>an>PO>ز >@u=dݽ4.F|;lbz[}L Z"4¾\dx:9L捾^ (r9(͌b<=ЉG>>.>dմ>>>؀>|F>Lcl>d>>>1>>>^>r>GP>d>=;b<`M6xeMKP|P`Hq;о¦;2ʾ;h9پtjLdr̋ǾVWH\pl@<(=H >B>g> ~> >s>la>R>|B>0>>>H3=щ=@=R<t軀ohze OHۻ*l4َ!/XU,ۦfi jN56^  㽸;p=>D>q> ɉ>>I>>>d>C>>s>Uc>D>$>з=>(쏅>Np>&>>>p">>j>>>>I>>_>>>2>pܺ>>> C>ha>>X =f'kJ`/5ܩ`ئ *(BJwB/\= px8hRὰ瑽Ri>4 > >>>>p>>>}>Z>vb> >`>NՇ>@u>yG>< >=@{<@ ռ`] >Ž&=Dbd| ziB)! S#bCowV3B5Йݼ =<8=@q==;=`=s>̝@>T{>>>B>>> 3>ܸ>`>>e>J>]>Z>">,>hj=@0Y>> ><<>>؄>>\V>R,>|>nW>>@>><> e>F>#>G> >>>>HVf>a3>8=U=w;}/@|%% b`I9 Q3=z=–=x+=Щ== =m6<C[@.xH)_BQUXq2.F^`ܝ,:{rJ lʾѾVԾ@ξL,*$ ﯾl54f̾x;̾>ξLоƾʿh࠾拾&UX2K*;@1<hԽ9>U|jJ D5A40d"*E(̼%H. Ea:.ž ־۾ؾjϾþh{fȾؾv^r.]6ݾ2žj߭D&QPnؽ ]@{*j>Xߴ><>x>E>JA>Κ>>+>li>P>,I>L>4O>?>`">܍ >, >e>N>k=`-=||p-ԣaR⢾3VrTO*X$d0T(ZbKӘɘiTὀz£>->⛹>F>ǽ>>>h>n>>#>>>p>Ҙ>:>> 3>I>,>=>[><=9_н*(?peD>!q>e>>o>hk> ܢ>Bi>>{>V>>>ƺ>>X6m> ">(=@5=@N<@0L* .\hNO־`ݾ 3۾f\ؾ07Ծ@Ⱦ:=Hɹ?,InԦЙ^@?׽Vʼ E=>P>,~>>=> >>H>4>P>>r>>V>>$> >Dk>.>H>>>D>*=l@![mOA!\? L D1Q941¾׾9澲Ҿ⼸p{D hJPzP9`d>= 3=З&>\>>w>Ͳ>>`>&q>h6>>t>(k>Tj>f>]>N>?>|&2>$>W> =`@V>RY>B>湫>R9>>j>W>F>>>v,>p1>x]>>~>tz>>"ڢ>>>p>N>>2>=Xh0W0e:* ɼ5 [9𰞽PǽBTatadLE<[ H4D=ؤ=8>h>>;>t?< ?N?]?8>?Ʊ?2 ? ?!Q ?g??B? ?>`.>>֒>tn>U>tRX>Ĩg>0{l>h[>3>=`?=`U<"@ռ0DZ ,߼+<=k<Ơ;y&LpOȼS=e=E>F>>C>>3>>O>dM>>`>>**>rں>j>:>≦>P>Ǔ>dqx>tA>X=<:p LX(8Z P^_KTƯZ)8(䛽hȽȺ>%Y0!@`XyD> >w>V>>p>>` >j>X>@KF>%>=X=_=X= h|vխξcԆvbܾɾ >|y>g>XjX>>>Ɩ>">Tχ>p2f><,->z>x~>TZ+>>> D>56>4> <`>r\{p^NHUh~~#RݾH5]#rh Etd~ᆭID~'߾Lþ*&( O@j+-@6 8$9R 0ܾ޾5r6$%%9(%`,.=.+)% PN۾hlѾ3о˾g¾PҸ𮞾0}\lP½pZ6fE;ʝ:pW`N"ؾ#RM>NHvӾl;<־1 FA%H<վ4þH2TȾbξѾѾl;ι̛RчКMfx付=u(>pǀ> >$>>>>h>>R>:Ĉ> ˉ>X>i> >z&>>q>1>=`b=Y<@OT&ʽ b )JЫӽʿW:Jdo^_Kؽ(⁽u=o=Lq>(;>ܤ`>v)>Ȫ>>N>VZ>>>>>i>>>NQ>(>G>ܪ>>>Q\>8>,7 >Ԧ>Hd>,>>>====A=п=г<ܻwɼ`\ż`@EY<\5>f>I>R>>"ڢ>>>L>$>3>x??޲>T>@>Q>I>t>ܴY>1D>L '>="w=ϻzfʽs@z$L4T[81I/D53X:QNl{xstuT u$_<;D۽;*3#=P|>HN>6>>[> >>>>6?F?L?4?C???qr??0?ˬ?Q?Z ?>3>>t>׊>!>؍=0= i=(=>0>I= =W;閽 2+`pxֽHT̽?׽aܽҽ ĽHdŽpHE<=` ->L!n>2>nu>跫>>ê>4 >>&>>>z>F>ܳ> V>A> >F>!>l>r`>4I>L>@=@=xH=0W=@!A<] ?;1@): !Ƚ(Lڽ0BL-3>$TZ>Eu>C}>>>:>>v???f>?>p>N >ض>>? ?uo?&? ?>>^>VG>`>Pa>G>q/>I!>L*>9>`)>p=pn=`04 TZ;S#=Q<9좽h@н@N@F=>}c> >r > 1>Z> >>G>>>L? ?"???!?Q"?q ?|z??K_?j>J>M>>)>>~>h6>̙>P>(i>H(>= 0= TF5>U>~i>r>|>t>>> >r> >W>ɣ>Ҹ>L>*>\>.>+>ġ>4e%>o=d8+I>4gs>Lp>\>>>>>r>D>pe>fl>>t]> >=OȌAo̽B\2݂t餾~Ⱦラ ,2Wþ䥾ր,KM@Gν閽pVXP4HI==(>S>Xˇ>ެ>̍>Ju> >߲>> >~>y> zm>HU>a3>h>h=8-;}`sƽHG0Cţ4ܾr46 6 Yg?!.!|XmVL:n/g Dd۾ ЪC0jWP+D()`ǻݽ  Qr.˾7J uݾ{x>=H@*[>[%()+049<*;[5&_, %8#((],*#VF5 F{پ^$V޽׽H齀UĽ뷽Лڽ g-y\(}Lb);\xI7tϾtN "f 6 ( pӾmƾʾ@վ߾t8uѾ`:*=q-ҽ?'_?>\v>bĔ>H>>>]>џ> >$>™>>l>kF>t>,> D=ê=+=oqLp^ dJf9q,OP-tѽpvʽBh #,i% Hf߽p|@>=-=!>>(<->A>dP>pZ>l>P>" >z[>I>B>M>">>H;>'=؎=[=^=>03 >">>`.= =5=*=TP"HcPx_޽Ӝ8VF`o֙P䍽c %HVD;;Gz ɂ.<%== C=#>DiR> y>젋>>ţ>^P>>*>>g>s>dA>\>0=g=@k=C=i:<;*K ? wX"@PnX0k+}Ȅ؟#P" zS||eU0½WIKW== >l->l<>E>`>Ć>(>>>v?&o ??=?:>0>>P>\>6>>>`,>>PJ>>`==*=@`C (:ǽݽоeN%lP*>`>t_>>>z>>ت>q>>t>VG>>Ȗ>>'e> e3>4 >p==PR2=`V==X=(=<@="(_.g0ĶF`H"i:<_P= =0gs=f==P=@>@.>Xb>>>~ߌ>l>>~>>>"D>>>>2&>>ĵ>Љ>#>>>X}>,d>_>0c>Y>x->6=T0= [*paO@` p9g½{ڽx.潀ɽ`Gs컀 <(`S>Z>>ָ>2E>& >>s>N? D ?d ? ?>?&>>:>B>G>>>>H>>w>>6>=W=@3<@<Z:XO;@{<3<$=s=X=@h=3==<g ,>~M>h n>6 >>R>к>ra>f> D>x>D&{>>h=T=H=pH=*>(D>C> >`=$ü Ь`H3/½6ؽhͽ@䔽 G ax ֻn5 Ҽ@輀N<=?>,p>^Q≯>8>>?>>Ҩ>&> >!c>?>>xP==N5=X;d"x e0 K'l@Vlnh 伾,|폾:~p#zQx3!xX(Iʼ@0< x={=%>S>>R>L->[>E>By>>E>8_>*9> >L>$y>e>`/F>>=Px=@</~ܽFch|.,8þϾ&徜A^ K V4ҥBHX羨4Ѿ<殾nچt @8oн߽hz8>`Z!VΔ <~B䂾rfPk:Ģ#ľ̾$Ҿ $ܾ$뾖#')n&] t,$j$,'N379,5,} bžã؉d`rDyK@|֒< <O;X-L-s;<\нt/` G˽?&`;,վlXؾT׾ҾоҾt?Ҿž#iֳOҸg¾XVžžžž E*(퟾xXT|+0X=.=->e>v>З>:>¤>9>S>Xg>>>->N>jϴ>`>>.>ؕt><-:>G=0> =3#hB8_ |z`Lt0}ҽr ExP:>rT>X[>h>}> >2>DV>ʜ>X>8>ic>8U>PW>8]>Ko>>h>g>m>DJm>X>l3>p=Pk=@< %=п@QM4>T~Q>}>&M>>f>A>>a>(>>> Da>`C>P->>= =@<@G<D`l C1pu#F3$yl"bi#2ݨ໑qHHD(X솽@}ǟ@>t>*(>>D>'> ?v?>>S>x,>"3>R>֖>4>FX>,>>,H>к >=T= ==S=3="=F<;8@d)̝@4P_a?:x*g6}{)Ƚ44 A F=U=8W=>L.@>d>>0>>>Q><>>>k>\B>x9>>l>U=>h>>>t> >|X>=Щ9=@ Nh$8 .X/7s;- pǴpZ<*@Ԕ<`<@&<: y<3=t=k=40->#^>xr~>D!>>U>Ƿ>>PO>h}>,K>:`>m>*>6> y>">te> > >|k>>>L>T>p=``<` @?8ɹ<=<=D<Ƅ<@֮#>C>po>r>w>ظ>80>M>>>j?>v>>>.{>>>й>>K>r>f>n>Z>:X>`> =2==c<בdڼuDa<0=`J+=J=Z<V@' ڏ Ľ⽠`ݽVPP:0w=P>|H>4gs>%x>l>'b>DW>0J>p4>> A >n > > >x>Z.>7>0V9>p/>U>0$=M=x{Yldp!^d.+ 5"]Hݽ(-Pq8ʽx賽$`'0==` :>Nw>>p> A>Z>I>P>$v>HO>l->س>P><[ >t>H5=@=.C=B$<Ӽu0H8 t 3lf亾ҾrNϾᲾ㘾di_ヾpǀDؔgHB9 P?zU<@1==Է>B>lc>x>ԋ>4>dt>|b>{h>l|>8q>.>@>dPy>0(h>@H>$#>d} >0L=h=_p3?PQNоs~6q˾*+۾뾊󾪊; b R|wE& * 4~6žani|'x \HX|otL $BD"HL* q6@ju SR䧾PHǾ,ݾSkCK_4 3 H )+*lf*g)%cT>.{ǾIlYlne(qY8{轐<>*>.C>R>$i>故>">G>j> >t@>>[>> >S>D߻>f>l>K*>&>x> > >c>p>$>> =5=F=@< <= ====<4s7e0e=x=V=/>2><>4>w;>1c>>~>K>[>ް>X>FV>8>–>>Z>F>> >>>$K>ڸ=;o4L@4Р3=H߻=c=*=3=bi=3=f ==&=hd=T=(p=@ԛ=p7s=๫< KԼ`Olb7ɼF<f= =\/> d>">C>h">h@>`h>~D> C>xK>̜>">>>>T|>aj>d T>j5>9 >81=`b$=tP?z< 7XNS<]8dP N3,((!=>`!g>R>o>>>>k>H>H!>M>)> >y>>v>l>>Z>&> F{>X>L/M>D>u/> >ؒ=`p=;0;TPk"˽X7t1fCp| (<-[M+ehgQ\}N0V9]~md(>t>+>E>Z>X>1>d>S>>Tk>*Q>D> E>I>K>8H>P4>d>Y=W0ʈ2𽜠 B彘ȯ``愽 (_p!(˽X,X1ܽ˽~ »=@ H=0y=5=8>HU>r>>>H>>Ni>\5`><>q>>2y>>d>>`>A>H>>\=>=< պX@|U`0D>n>^>FU>:>8>”>g>8`>0>>B%>>>;>P`>\>4D>פ>4~>+>=d=<<@<<= =Hs=8 =@<¼(&'88N'8n+λ <@=;=PM=x=8==P=&=D===(>h8>X>$- >>XE%>E(>_> >=Pp=+<u;;X: h, =5P@횼; ":HOpMS*@6tl%>x;8>"<>t.> >,>>ܞ>\>=<7=XHX0$N \.] Lr$t M|y/cbv|Р8=^~3nB~F;y$d#WQ$RT}D HrhnQ>`A><>=w=Ӝ== >l;>ph>D>|F>.>0w>;>Y=>=@=gXvѽ`ýH`ν c @ 1=ľؾ꾚CT % &^2$0+m-,8-](ʌ T,Xa&.ξL<*Dw&ÂkHE`$_f!qH|vʒ~ȠZ~\߾ Y *7 z5y%"(.*>)#[Z )h>B>N>Lׇ>>Bj>>\>S>!><>>>> e>Ơ> >)>Xh>V>C>.>D >C=<@_P7`,Ӽ;Z=pi=>= 5u=f@`J(⣽.z<@B==)>DyK>u>I>"@>>֤>>T{>V>>%x>.>¥> X>Z>b>H >ܑt> d>=X=H >\>p1%>.>y(><\>{> >>P>f>'>==t=Й==S#=B>t& ~*<>>>p>T>>@}>\>>\>t3>&>%>l)>`)>؁>8v=8=Pd=D< hm8ֽ 4CgBx:+̪@x ͽX q@GXֽh㽨۽H` PQ%=== >/>Q>n>p>>V>>>{>X>[>>/>.>>ί>h>>S>\1>Ĥ>j>6/>XU>Z>Dv>8>@=<%K@*"j;@a<@H<x; +Pԁ]l佘꿽謽@;<=d>2>0O>R>ЊT>\>ԩm>>,>j>>>r>V>(>>U>N֔>>>s>n.>=`O<ZҖ;I= uY==ն=|=X1=` &= SЋa8ȽpW彈ーs|F 90.===I=;= >(N@>>>ݲ>>XD>Է>‚>>n>Nt>a?ُ ?s, ?φ?>g>j>>f>h> >p@=<B$n5; =!=&=`=1=S=`K8=<*_ɽ  Ȣͽp3F!<0=g= =Ȭ=w=`r=D==Di>ȳS>v\>T%>b >h>t>Zh>>pV>.>>Ld>>^>>>Z>2z>2>Ơ>8>R>&>L > v>c>>=,=p=[_PsɉPԔFȳӽ>>`tk>sz>u>x>j">8+>l> VG>%>A>=0\==>S=(N=`<ѻz0B@Х`?wI`jP[POi$g#tPϽߊI<7P;FKT lS C @d>XXB>`a>0o>v>.w>Dc> e,>n=3;ʖ(+8`?? /s@pH?HCfπ᝾Q&T!:"tl􉟾TДf.U<ҁ>X@Y%8H 7`I<@<<0=0U=05=<Ш,=@=">JN>4b>m>k>E>= 3[=g;Ppw8@wٲ8;v@p>J1;Zھh"psEj :#B#)"$M)P-2]6`5/\A%iR۾ƾ6٨&j}{dZ$D82< Pe(ouӂ;FҺپ|<C@Hx6TM$*m%N"3d ĐCtAB|ؾZVž$~f~T\EG'׽H?0#[jb`x@F@@#e>/>>>ū>pt>"d>">V>y>>R>>pe>>>9u>\d>>8>===`q====>>^=h=L=V<_ ڼl½Hhldڽb:=\>0>==>@)>8O>=>> /> C>s>>>>L>rs>>>>->>3>>H>l[>L@S>%j>Hw>|n>ȣZ>@;>h>>H>\P>$.>$>2>7>U(>0>="=@T̼8p80[F@ol==m=n=`#M=1=P=`<";+p>A>>>>>(*>fw>|G>,>(=m=7=@O<_ X<<,<2,H Y(`LaQj ݽ%[<==P >=>>>>pA>2>]>&>^@>`>H>P.>?_p?7>Ą>>T>z> >:s>B>>> >b>0>dJ>/e>X> S=@(-޽Ͻ8= J*p0!AL8䔽ƽT&CjqtbQ0Cpi=0k=T>D">T'>F>n>(>n>>>>.'>>Z>Pջ>>>> >h> "\>(>9=h&=`a=l=؁==X= =%=RXH(½ pQP8~m@>;7.;௘/x8 kao4=8=~T>>s>>ؓ>">(>g>(>>tc>>>>A>>;>2̢>do>f>` a=;sD"I!>t.2>>>/^>D">|'>(>l'>?(?? ?0?>81>r>#>~>>z>0E3>:>@N=;= c=7=;='I== =ǻs 齈*+b[]qdb)>Hy=ן=<p۽(PȽ@ghiq8ݽ\(u6<I/><'> >==@xZR%d51%(8PWp2Xﭾ@󴾶᫾.sĆȿ8RT8ԙtP]|M BL43#h78塽rG9@ 's@6@|8o>e=~$#&; b,\۾l"(>{xG/ .T4D>_TL{™򍹾p¾ƾbqľ,羾jǾf*Ӿ16 8 @6"?u" D+ ~L뾨ҾdX.VdLC}/ ˽8>=@ ＀;@<<8=Ko= (=O; pTj˽XD"|&2 B(B+ (⦆/̽2P:9/8$">.>KXHY=7, R`۽)ܩ@D<<"=9= `=pv=(> w>j>2>(>>Q>2z>J>>>P>>(>d>PK> }>8i>Y>P>>C>(> >7=8D=(=ӷ=س=="=aABjC1]<@d<<:ieл3úqN>P>$->x>,>>>p>/e>nm>>(\>B>>S>{>ڲ>j>:+>1>f>R>>ȁ=ؐ=a= \==`=`==R=ߊ<C$`)š;ûƼ| g鲽d@Eu <41>Mq>u>7>>D4>lw>|)Y>@.>>$>2<>n9>*!>pz=e=v=@KF=<ѻ@Xhܽ2, l$!+O;|<8;P-kL@þ<=3>e>g>>*>JT>F>lZ>L>Z>>>>z>ޮ>b >V>>J>%>b>>@[?>pb=뷼`X7ԽhKڏL:Y @iҽ0F V.^e̼00$fd>>>x>Z?F>e>{>>N֮>Ȫ>Jb>>> >>>`u>8^>P>pT>>`<>=pt0=|𮄽בXxdY0|p@y"G<=6==] <@ ҽxɽȭ;P?=pv>x)>>&>>&.>X5>R>>rb>>V> ?r?`?F>z>\q>=>|@>Y>{>>!>>B>-=Z~<`TAؼٺWd>M>>>l?w?K?>?ڞ?A?O?C>J> z>,>(>9>>~>>DV>s>X5>==@d<@^\;jT==@==+=@&ȭ6ý RpM`fؼ 8z {@(-3J<\=_==P=>$D>lzJ>X4> =P=6J=}6= =PO==0\==P==`=]=A<swɽ< mt|Hc|i ( x@޽O <,o<~8L [ͽPX{t04P-=@=P=4s>M>P>=0}=ء==4=;P8+4ィZ%ҽXݚv/@ *Mf@xH:pSe0d% k> >\i>9>צ=T!Pnؽ Vt7<R 8нL:SnP,^qJ &rVUỷ5"$p'\)P(O(%1wR,ZEپbz$czXnbdl g~Vh<x}Pq*҈o0ϾX7ozLhP( vYB GbϾ¾$žLѾK۾Hݾl۾ھ^־ ʾBݰȥNB {%RpT` T@~ڏ<@-<"@;5K½޽((y_`-`j@ɽ(J : P#vM DL^`n1(KHh=| EuBNL"Q B) %,#K==8== >eU>;>R>y>> >~k>*>>J>>*>^>>>@>R>D.>0">س> >;=p=`==`==m=yG=0gs=0&=x:= ==@&=Pz=U;ҼyUp͓0}R`H;=8=>=m=lU>XU>>>Bi>L>;> 6>/B>t Z>D|>{>J>4ێ>~>Js>˦>ā>Lȵ>܍>5>tc>8> >xm >=0v=`\d>>,KM>xB>0>p>(>>=X=8Q===H=Է> >tq >(=<UHѽ( gE:+ࢿ0'@Uf`{[;;==P= >\> >0==[=8>h">U>nۓ>ƀ>0Y>֖>">>>,i>hc>$]>y>>d>$ȩ>z8>> >w>%>F= ^҄>b>F>B>>n>ZR>j">>>W>>>>Ɵ>>>>>O^>6>o= 00ؽ4PݽՌ`ȽPnؽܩ0xL]>q>y>r>d>r>#>B>>TJ>>>[>„>F>>N>41>7>_>j>.>Х>D>~>5\>dp7>X >X===PW=@gd>ԥ>">~5>> x>~>`>z>>d`>5>xO>h>ئ>Y>|>%>b>D>"ٕ>p>q6>>>,=`Gs==`==x=(=x=^Q=p#ϽAh]˽ `@q<+1Z_#$0p`ދ;`.m==0w>> =8=`"@=1=D=0gs=þ=x>9>8>ij>`` >>(^>>=/=p1=Pi=q<ػ` &˽d-x>_ЭmK[|Ay(LXߴp:q;8=@=e<7VL-:0h(ͽ@ּPz=H=`~=0)=ڏ<;<=@ = ^<軰x^ȐIC8hڽ@)aq`^zT;z\J0 7K czk4tE$ʽptz_K`!% / 꿽| `U= >q6>*>=\=7=`񫽘N!D轐o@뼀M@8 L682{d"TھB _A'x ޾nZ .""K#Bz$*#96ZGlhѾNorN΄.ϕjʾ^SҾ"BǾ,|D݇8Px[*9H|,  ޾¾ff,kd䘬$vӟBP-[Pjp֒ <\k@A+<@ =0|E=&=`<xp]D(Hֽhͽ 8 pgp@꽐&lTtt~LqWuGH&JL.@9@&G`0iXF5`p ˜_B< I:==0=hX >H->A>O>._>4o>I>@|>>>^>(~?v?R >$>>>&>X>B5>v>7>8=؎=@n_=== P&=<>|>4= = <K MD3` 3@[0Bh=x >'W>j>yc>X\>R>4>L>n'>P>{>x>&>B>> 3>~>V>H>2>d>s>L>8A3>S>=臦=04=B:Zb@սӽPna&J= ===0A3=-7;pŚ8% X>ؽ80@&==(M=LO >k>=p4L=?<<E=X=(=x(>pV>D|>d9>ޛ>DXL>E=׻>leЛڽ`)` @aZG&j;p=@A=:U= w==i=x=ķ===p܆=U==P> >>>>Ա>~>>H">>>>go>`P>(;>*C>Ԩ`>>lT>ʾ>σ>_>&>=!=@>v>f>>|>4k>G>N.>!>G'>E>z>T>>>T7>>&>}Y>t(>`=#=`pXؐԩh{`}ļ@<=F=pt=Ȯ=P>Ąu>>>}>f>R>lU>>w>J>z>e>>0>0>>B>>P›>D>8>>q>>Fޮ>L`>J>>8>X=P{=;rwL-h|00!J@P=X=s=8 =@z+t>O>>M>&>>.>>R>>B'>:>IP ?A??n ??`A>6>>.>>4S>|>`tk>$\>_>p]>hG>>d=<@_X܍0W>|V>(>G>L.@>D6@>=>2>I!> >=6=f=`S=@ U=4c?^D{eHH0 Eu:P.=跑==^==PO w,!d/r9QD>k>>>c>l>>G>|><>\>>c>>@>:>;>>R>/>5c>&>`=`{=[<%J~5PN%_@H<"2=iG=Ц=ͺ9(LQYeRJʱ ؓ&>?>d a>q>Td>43T>yc>f>L->>6b>ę>䨥>>v>>L>>F> >>̈>_>`'>l=`=@\E<@μ(ؼC#<@ H= q==w;гPG($?-K`MPRdGu/{߹@D=h{=`Ʈ=Ȑ=@=-<<P4=0==N>A>g>Ąu>j>L>>xM=p:+=׻P@H@N h J]0O@＀ǹ`< ==0=^=[== Ug=П&=< 2<0Z9===h>_>>r >>>BW>><Ģ>fH>^ >8>ӌ>>d>Y>LBm> >>$.>><>f>Ќ=_BA>d]>g>^>IA>X->X:>`>N*>,> >:>rR>䩲>\>DΛ>>hLy>yU>7>1>0w>=X=2=J$a` Ts <=b< < sp:1OgG <%=0= = >DV>J.>í>>\f>>5>d>>R>?9o?և>>h> >)>>>>pv>8@>>R&>7l>'8>h=YH<|-( 6-/vЙVJ+8=0̢==@LSld>V4>>?>ʿ>Λ>P>>%>b>21? ?w\?? ?{z?L>\>>z>>Ĥ>8>=>!>ec>n>X=@<3;X;aKދ1꼐`Ľ %T0) hս!pw_ lSHH`ge0 h2%8<(=>>\0>R>4j>W>>2=E=x==w=\!>lP>pv>B>l>D53>(=EܞV|n~ԪzKd<^< =ȃ<@ɼX`^$d&+ 0;JJl6lFؽp(0,.91v0@<3=X==P. =<żPnPk G ^VpVpͽpO@:t"* ȋN(厾䒾޽!CXݚ"lu !H޽Pнhg:nVy3ֽD>ɻA%<;b@WЊԽ<؄Hɽ\(4uRfpoTm4xȾs%+[  dT'V3 6,1(s!v!"Q"" d&)T(#XRg³88e̟tݾp@T|&26eG YlhLk yYtaD;hX>CED_M_lv0l4,vխȸþ@9;׾ ݾX־hǾDRtLnw(|³ܯ=l޺ʾhȾm+ܞFnD>pf==D>4 >=>= i==2=T==m<4<`(<k<<" c ٽ|p,Q旾䞾q9|sF d bhPϽ*սf4 0޽(op#==V>,>xM>t>乑>8O>f)>>>V>>@>>>*`>^T>>>~>?>ZE>ʍ>>0I>z>腌=@D<ûC@\ż`@)¤5˼zν`'Xg1^5l:<+<7=/=r>+>+>D5>\>>ز>u>>pɚ>]>R}>D>ќ>`> B>>t>p>>ra>;>W>"p>ܠ,>={o=*=0<=PWs= w=k=< |xZXg1ܝ9G@]ZiT9`.J3,!d8,7 E н߃п4h'<;B<@=x==ʪ===t!>ЉG>Hh> F{>Mq><>>==@eټ㜽ЊԽͽ좽`Ol+u0 _ c@8F Ѽ5:K>Eu>f>`=>J>x>f}>:>6?>^b>G>>4˯>>@8>> >J>c> $B>><>=X== oz=<4 GZEuxԆޙM@+ԽЫӽǭ0$J(@ɼ|4Ņ@< 7= p=@==(=(=+>z>>8@>>К>">|>l>J>8 >v>>>8 >>>>s>j>n>-x>Ji>xK1> ޼=$c>7>>L >%>>>>k><>@~>@*>>4>>a>J>xO>>2>!> >$->]>:N>>m6=qPJŽ񫽀/l T:<==Hd=pVX=TL9|_v)%Ҹ=xH>>>|&> >>v>p>>:s>9>>>>^?o ??EC?h?f??$?>B>^c>j>t>R>!>==Q=<04;K@H,Ž([̋-7z<BBP=`0^ 8 @& 1 P&ý_cvft<@I,=@=l#>"J>E>0#>h>4> "(>->n9>0]>8>T> z>=j>\b>0hL>P(>8>±=0X=`$ڼ^hϽ`ͽҽXϽ`qિ`U([I_4r#>T>=p@=Y<D#@upzxM˽-63Tk1|zC~i8No4ά汾hH6@b"6aslgj@ |찄Lv?(㎽Hp/ ^:i:< eU>Lb>R>A>9>&>4>=xi=Ƅ====H= ==ߘ=e=a<޻Gx۽ JSBsFA$0h,9:tئx۽}@LS#ixXr:j~=a >2U>`>>߷>.>S>4E>>c?# ??[ ??Z? ?g??C?P?>`><>첞> j>>PƵ==v/l`Cp22;𡲽ݶ0hEd :QJaH?*0pax s>r>>>>J>L>Ně>>&>Hb>L:>1>x^Q>!>D>N>A>>"@>>̛>!>(c>>h=X 7(D&Pֽͽyս0| dOpwCRjܢzU\Dش%Y0ܛ ¿<Щ9==8c=P>=>==r=P=ߦ=h=> P>lt>P> B>L^><">#=`< pȽ4dй22,7 D߽0}ҽX½$P嚽'eW_;;NQ-8J;==!>G*>4>`B>^>~>>.$>f>4>R>7>8>X>>>>3>h>>C>>A=`=x?=h=ɹ=P{=}c>t>h>R>D5>!>+>$X>"P>lg>>R>8> >>>*>~Y>P>B%>ЉG>A=Teؽ㾼=Y>>=@Q= -)G ݼ>;kL>>>>Z5>:.>r>p>u>z>z>>f>&>>.ϕ>z>\>M>tG>(V>e>`>pO>4>IJ>0=J=L<YkPٺR==f<>d>k>\N>0>sv=@KȢͽf:Rw==8.>f>^`>zҠ>6 >>@><>'>P>x>>[>O>2W>DH>X?g ?"?\c??E?>>T>">\u>$D>k>8T=@4=hRN8b;+#)0 Xὠ$ 4&\V@[sR{$Rtp1YP0 ƽhT`A<|n==>>>X=(+=X==g=h==x}>l>>4w8>h>>`v>Ĥ3>=+ Hglkeh(b,[FR55tOz"2 P(d$tLS%xo\ Bj~4x<; ̽XP!< XuĽPP <0=>QP|mq;D,ZhDf41cuN5Ad[1c`IHg^ $ h;PPVC4ud($"T1Hdq34jЬpH>km VD۾̾B7;LܾSX6z=\!  Ir ׾fp/ݤ⪾^f8⻫ԙy{d5(%ƽ@=!K A!$`.9lGl`-vz:6tž.ZӾ4徠=angܾ˾T';<+ԾվѾžٲъo4d|ƙe?=H=b@=!x=U=`=PL==x="=P =XW=Ȃ==0y=NP&ts($x.P֮;bǽpif,{8DID"x}໠=j~==(=l=._=І=o>OT>f>g>A>(>>>?d'?U ??2C??R|?(?M?w ?& ?b?8!>>07>t>l>L>$>@D>=#?=mnI9<=@= >> d=<@VdS0T)X\>!q>:>,>4>|>A>^>'>8>:>P>4>q>Lr>6>*N>>d[ ? ??>4v>j>f&>IU>L@>=@o<@Ơ@~_<92WBP} ShY;ۼ):^P:9ҪҽMĽt;`A=5>E>XIY>LW>,B>|6+>0>T~Q>'>>j>P>>ԉ>i?v\?>V>̛>p>>=p=R=ЫS=R=` G=%=`<ॼPvpI D(5Z[wǃhE^{QU=(\hͽʖP8<%Y==@ ==X >|G1>e>N;>HT>R>>l>d>>ٲ> 0>.>l>>>l>Z!>惌>.J>d>a====*=`A%=N愽ѽX P㽨$N B*>E><07 =>>> ?z ?>4̼>Qu>k=x; ½!%{FbKpڠWcǾneľ$r ʖO}|\4TSشY0i$ 4x|N0l̽ଽXVi=()=H0&>Xn>ɘ>P>6>>^>A> 44> d>ù>6>y>Ƞ3>h)`>¥>&P>B>c;> = <*~=L=8x=5=νQx;`H@)xUpz~`fX^<== R=w;2=R>X>=J?|?>|>>0>>D>$>>]?.;?I?@?$?;?`>^Ȕ>9>>>$q>>ʸ=H=>,>N> = < ׼Q==!>ē->臦=m<@ U=1=|=`dvݾ pr Zg˾8j8ԛ=L>6>>S>~>g> y>0>fC>PO= B1"8Ƚ;c=u>?=X=ݻp(&.D$-+3A\̏\ʮgDHx' ,,4#R,%`j.Ι |(վؾ8Sr!0 F&A${󾸰羨16|)=&J=h(1JSپ 4 8kΪࢾ`魾6@2־tu񾗕 *~li޾`>xL^,$pܟSQjȋ\ >>>f}>\ɡ>>!>s>>$TZ>E>|F>DA>,>D>ԁ>܎>b=0%u=D$XXuWHN}%LS\b$@ < i=S==Pk=`$Z=h=>b>8v_> >@<@.k}`ּ'W=>>D>3>;>d>>>>d>4/>oF>\)>D6@>Ȁu>͟>.Z>B7><>>:U>T8> S==?'= <0.=hX=X=8>>9>淑>̐n> L>0B>84>>` =0޵=s=S<@J(Z6=a>Ff>>w?b ?>6>L>X3>&_>P)3>n5>5c>s>*>$`>tM>>w>h!>.C=1@IP:8 l+8cX轐4K|:+7D 00W@h8Sƽ0hLcxm=H0%=8D>(>M>>~>Jb>N>dW>~>u>"d>rA>B>>J>>>>ˌ>>j>Ê>R>Y>- >pu==@LӼk(Dx>;1d<c|V^p%RhG[`ux \xk&UT_ Da^pac]K!/ ;b d==#>8 ;>T/>=OB=`@[IHIã6V4<kaPƾ$WL6!۾;;vq׾澀t>,վ|۾LR澲ྜ.ؾhھ+066ݾڽ@Л{$W<N/PģZep\l:,@4&U@i(j\PLN`AYL瀾vԠz⽾H1`q׾𾨭ľ^sa<7ȲF|z$O Fľپ#?⾨VþACoX29hX k*!0%lu ֽ"2ॼL7e<Ь`=ka=X<`<==r[=KpPěHeҽ+#|&fXv$1uR9=?$VT*t͂ x̰`0WF::KB8\L]󕾮>rb!6h٤piq(z<%===N=Ї=(>\UR>>>J>f>n>&>P\E=L(ؽL w;=>=5=` =@1>|O>_>^>c>\>$A:>h>|$>&>X%3>(OM>>ZW>k? "?f?m>r>$>n>@mR>ST>\>XjX>F>3>%>p >B=@[==d>> |=Ht=Th >U(>|>p=p = <_?>9c>>>>j5>б>l>\>>>>R??\?,?=?E? zF?aB?T5?*?h?b >>~g>Pb>pDy>8->z~>t>n>@8>>>a>ݑ>th><>@>*>>4">47>̞M>m`>e>R>D\>Rj>&>7>H>L0>\>1>Cf? ?#?T?#?Z &?(?+?,?+?+?x,?sP1?T0?U'?2??"!?`"?o????d>>`>>,>W>Ȑ:>hH> j>>>"ǂ> c>$7>k4>W>Ω>a>s>d-`>>Q= =i:< Q3=v>V>^>>̿>L>ܐ>>J>>>>PO>j>v>>~{>^>ҩ>0U>&>tֆ>$l>F5>L >z=/===h==<8>Zb;g ⼰uLHV<< <<`'=K=(=`=$P&>z<>Y\>M>x9>*>b>`b>n>~l>"?>>>D>>w>L>H>$B{>Li>]> C>>=@.HeҽB"CԾᾐ|־ʽE˽T# RP|^\ cL?ƾL־Jd߾,^x/ ͙ ^ c W _l7@쾪\R\Ѿ`?ƗP{QXC |)==Hޮ=h= =t>x>(==l=G=W=gK@| <+<[<| =2=X:(N$;4ڛN,⩘`R{2SVx𜾀kfH0c̋-RZЅ(xOp`,6;@ol<+=8R=d >,>8B> wF><;>|&>`=H=p5Y=8r====NC=ʝ;༰s`Ƚ(`?`v.Ѽ<`š=ȏ= _= <<@;4೽ɫp7s0=`<` G=p= >?>"p>P>jb>i/>1>9q>>>x>g>Z><;>hH>p=w=S*>_W>Px>x>8[>#>=PE r2IK*@W<<%=0DZ=`0= &<ۺ <=T>hG>d>u>ׂ>&>>tDy>h@>ȝ >'=j= >H"G>6>b>>>>>̫>F>><>>Lc>6>>56>=EK=^C=x=8o=I=@k<d; <<`E<< <=p&=pxd=|=x=p=B=3=b;8@A%n5\hr>>r>6>$>=?6??w>>>>>l>>>>]>H">n>B>0>Hه>S>H>cM=@㼠Z@py@T̼/l<+=(={==8ԛ=l;`}и@,ag󻀡\==<>>s==J=t=-=>;>0c>q>M> >}=(= >(0h> >k> >>>>Ј>2>|F>`>!>= K=Җ<>(<`<@=<$?0) 40&CLA<4&0d( v:~~5Hͨ`躽خ@ =0μ=>H6>dA>x^Q>Ąu>ʊ>>s>J>a>>H>>~к>(=>>>D>> >]>>Xv>+>,8->8O>=/=: Pn>A>>*>h>ޭ>>1>1>ҕ>>>8p>'>@>o>E>|>ؒ>BG>&ď>Db>F>^G>H>==>p4>(=:>(>>+>XC >8=s=O>x5>,mY>s>d>,>hL=b<ƻ 92==8O> >B>n>>>>l>Z>^Q>Y>$>B>F>kI>%>><[ >`>h&>>=h͚=/5=@_ <`ռ@=d|>f>ps>]>>= ==(^=`U=07 =b@=@Y==>=ב=@c?X؄JC߽zᖽHqhFV~DlOAݖ瑾:XQܽyK=sv==Q=<@@A%G<|S=ɤ===>>=x*=؎=W=O׽5SnmʾBꞾ텾 \ ꥾.P)|A¾R\ži¾;þϾwܾݾо"1J,,bpFdqt АX ɂ<@𲸽7Hȁԃ40@ |7D(-/l|2eȾUQ %_lt _\*LھcǾzm! ƾLȾ6뻾꽾ƾ˾ؿǦ"uf<uL5`nQ-7͌Q@ohý׽$ |xp22=X=$=@J<L_8둾&ҾTݾpv侜@(PNa쾬"U羐ڣFJfyΘ ,XI@]h׾gɾǷߟ͉8ty`hVQ: Ƽ6 ەh`ܽ@s-H0'ܰ%S> >̊> >>J>>:>>>i>hX>v>)>=4==@#<S*0`,Ӽቻ<#=nmj<>*>>===">c>d)>&>~i>>O>>,? ?K?`!??P( ?"?>j>y>??"?*?^(?L??>>x>Dž>Hۡ>ݹ>Ē>5>,Y>>n[>:>2>C>a>@Oz>D!>Hb>:o>1>>s>>\>v>> >\> #>x>>5??N*?v!?+?57?G?NW?`?^]?rBR?E?vp=?P;?t@?II?DQ?ɏT?qP?pG?42:?-?&?c]$?_&?b-?4?_;?+B?E?G?L?.Q? R?dM?ݟF?,>?&8?2?+?Z!&?&?+? g3?p;?B?E?@(G?rF?C?v@?8?1?1?V7?c=?%.A?E?J?(H?Dz>? V-??D??p?$?(*?"+?~"?S?>2F>M>>Dε>Lȵ>^>H>>l%>:>>>2g>Ռ>pw><-n> x>j>|6><>>L?>>z'>(L>>L >r>s>r>>>Ȱ>`>ȟ>,>r>@>X%>>>z>>>R>X>=| = <ǻ Z;<M=m{=d=0=<@<;9ȼP8\.A߽8@ xO6n@&<`<@A=@== /'=݌==0=@=5/=@"@'#yBӦ$,+1K4p3?}1.*V#yZky  ?Y B#d\9оS2@iʬ /@ώz,󤾼˘P&(mZttQtÀ惌YzȾLb  T %H`,6:9fb6޾ &L Z1y'2L<_s|H; =EKN(OMPdz혾>оRݾZݾҾD\.X}É}\zȺȡtaľC¾r\8ꮾpP[$i V !H06D3۽c@p0ځ`hr0\PLx`??>R5>0 >=Ƅ=<2`&: WX"\eNXާ.x.qKlhѾT۾z\۾( ¾}R0ؽ*BB ݽh(PJ(D7XԽ(V`=\>s>$>>>(>j>>8k>-> ە=`f<:;܍;0k< F==(==w= B=Ѳp0-HX|ZH[^XQ^}Gމ)e`3aN:@<<]@r2< =/l==E>zY>~g>&> t>>2ͯ>H>>>$dS>>`"@=c\ 3H@ U!xsPݽ\1,ohݑkh7ľS xS7hڽІf ˽,n'~ xxč =Y >0>6>l)>0">Tj$>$>>>]>=U=T= ?9}{4D(jf{<򌬾퟾*DOxZ(!3}GdnQLqK>pt0H(#*p&h׽CP&t+@)@U˼g;h=|H >Tj$>`6>@>>=PpTZ@z+<1 =K*=<X:_o$E`Vpgv$ oVl33+7E6Dv$Q `N߽Й+%lh7$8HĽQj']=*=>p:>lS>DzX>N>9> d&>ij>'#>|l0>K>x>">\>m>0>`= R=@{*<ѻVM1>8>\A%><)>@==b=h=@=>(V>>>>Ƹ>f9>D>7>>:>>]>>4>Z>t@>>> >>>,>4>ʥ>>p3s>lG>t_*>D">[#>(M3>DV>y>:>_>46>> >) >>]:>q>>vL>4>B~>>8cs>܏Z>'W>#}>Ğ>ٹ>!>j&>H>6>>n>>)>J>$>6? ??$?h)?B'?;$?~?:?q??̉??ƶ>V>j>s>>>>z>آ>>P>`>>>x>|j>R>>>l>9>">bԍ>>>`>j6>>i>rB>> >ז>1>>W>f=>D???N* ?A>c>>H>B>>:>`>*>`>2>f>c>|>`=4>=`#M=#=0==P=j==T=<=J=_=jp=8;=== i,=@ H= m`=Hq=P=H>,;>oF>L>Y>Wh>(bm> q>(|>։>.>@Ѩ>İ>o>ƀ>Ĥ> >>_>h>n>;B>0>hy > > 1 > >>U>Ȅ=0=PW=;eC@k@W@3`a`!J;<@6<ǑѽHν]`<= >$.>!>>0!>$7>C>T>u>e>RJ>f>&>@> >r>@>JC>!>Y>>N>d :>Y>شY>->@=԰<0xXg14s>7V#<ӎO$ֈŅut ^TR7% Xֽkƽٽ8'lSz40e|G18ѽ`l<>=%>صf>⺄>>>$!|>wh>H>ȏ->i,>D=>lG>@j+>(=9= <` :}`5`@m`PY0ݽP Dtz4뇾 ɂ>i,X%e<ػ`00ێP|HPizЄ===K>)H>@\L>d+F>^>>^>&ď>~p>8>u>h7=S< 3>&>x=溨RljgeĒThZ B5_ esvDHT|7.Z'\A%<P[pyyνL|֒0P=(=g>D%:>a>߃>ԃ>rr>>L> >۷=ڏ===h>">=躸=7=|aXާB<)O,}R?L"X&?P>p>@=Jp=Pwe===X=m>xm >=^=R=hz=ʖ=0^=&<@<];Ǽ(8 45 Ug4.\]XEٽӾ e3XjndN~,,osd B @n=;t0 PeT輀B<M===y=.=W==>v.>ܟ>x= =@μʸ8I xo׽C,f5X4h6i_NG5/h&8 .߽X@l(½([Fԙt{‘Dܑtj,U#̽=P;pg==[>HW=hz=C=: (㎽ȲƽƽU@pw׽۽ȑǽ\l LgD2 о2`Ҿ迾7ľb`ؾ쾼%GN ޾D۾LݾӾ;,b^ dvΈm ~J dh?^y!Ou b5pVeqgԩm[vKb᫾ƾHrET N #>~$Ӿ4H!;j `^h,jԾHu06G#Lp dH4$?Tk`\A 1k;]UĒT>.V {xh\p>9@izҺkܾi:b>ޛvؠvJa5/:g[>\;1jy#RMYS&L ݿ6?XPCxݽPý0|ŽႽ@b`<2\=l|=B= Q< V;@8@8`?sıUTχv*g᯾*)⪥".DT[THeɾ $ܾFݾPϾ ,]E` ;T=(*=w>DE,>P N>r>>>lΧ>b>(>?x?< >I>~> x>>@%>X{> y>F>4ێ>lV>Ί>4x>>c>F>=R/*>5R>` >v>փ>

??)?C(?W ?N? ?Hy>>rd>z>¿>7>>y>d>NL>Ąu>h[1>=ٲ=Hޮ==>D>>F>9>4">(>(=-= k=<7=@[==4="=ă4>[>lo>ln>ăh>pi>Jp>dt>tz>O>>x>$>>p> ??p?>D%>>T>F>( v>pix>T;z>(rf>I>G>5\>^>D6@>>>$ >=\|=@5<+>ѝ@d><(==[>\s>P>6>t>#e>`&>v==|=>B.>[>~>{>0>>?)?8p?P?Ǝ?r!>>e>̬>y>Hwe>J>LN>\"t>XT>jϚ>"a>y>G>x>p=H=HP=p=PvX= 5u=Ϙ=K===n= B=ug== >1>jJ>\a>L"{>h> >()>`>^>$}>->nB>>R>t/>i>>O>̟>>t>T>L>S>>fl>J@>>tex> c>(r>>6>Ǒ> r> v2>>=P=i= =m=:+<08`Լȟ;@Y<Q<@!D0蹫0 @,,>*=7=`=b=t&>r>B>˹>.>>:=>>>Pl>>*>>”>,>(>pS>x}>sv>}(>(=aN=<#?=X ==R=>===L;P 0A ֻ`<=`<@XJp8AL`fX <؉==|!>6N>>>.>T>>æ>tד>tdk>?><.>X->*>\R+>9>(E>p3?>*>>T>A==fhJpfѽ>)TC^hLy^ 'q1cHDS\0 潸ҽ(ܽԀ$o ,&*$q@hz=xm > (>'1>0$>5> @>>!>D=>44a>}>>>#s>GB> >:=hl=@I=P=@[={LlW1&PP '󷽐U&3HS?>_>i>P]>XO>d\>8>f>\˻>D>h>X>B>(>` >^>>D>⩘><>H>1>F>ȥ>[>T>M>=H=+=4=O==/=(===L_>4>p.>aG>`T>ic>8v>>d>J>>>+>>H>">s?A5 ? ?@?,>>>>@>D?&M ?j?j4 ?f?><>j>:>u>4> !>FU><>>؋>w>\@>>>0p>Ha>qG>0>D">4c >H=XE==4 >ED>Qu>>:>\ʮ>@l>^>><>rD>???_O?3!?h{#?&!?M?1?!b? ?>v>j>\>>҆>>Ȑ>2>P>X>>Eq>_>V>0j>H>|W>N>^i> 7>>?=X=>bG>P.t>J >z>a>\ڍ>Κ>B>Rn>>~> E>N>">">>>?hz ?ET ? ?3 ?v:?>[> >E>Y>hk>>F>ߝ>J>$O>P>ȯ=& 4h>Đ>e>*)>$>d>o>>4>JD> >@??zY?B?>>>K>z>0o>BC>`=P=p9==< {xp!H'O4kFa\hrg8.G @6-6$<]====>t >>>P6>g>~>lC>Đ>&> >>>>>h}>h>|>r>h><[>M>0(>J=İ=`4=@<;:`꽀5R⺞ Butl[@N|A1|h6h]˽Hޮ8_vPÎ"Y@<Ц=0A3=jT=@v==>RJ>>>>3>ޮ>,j>>{>J>>&==h=԰==ka=s<&,;>e>}>c>\>b=r:w'< ȼ,7Hjs`@x $@aԾپ,l̾EdL6NGc4,*=Rbﹾ(ŶLƛf0e%\/ W4=At@E1T㰽 R@,[тtv@@13<\7=Aj=P[8=š;T@>54ff>}.iZt\=( 04XV }`FhiJ`nA@HFm+pvʽNJlnѝvý"ͽŽ@Vr0̾R.¾#پOJd孾܏Z~Є q; =T=L==`=PM=8=0CM=X;*FHdŽ⿽K%Y: @RtQ"Q~z e~Fܔ TДV4jh’$=T14 npڽ'нٽ׽h\h(QA;=$>Rb>F>>`>%>hn=A=&=`l:>ض?>@H>|M>9>=pr=n<(_LOg62w=D >t3>8> ,>h>\=8==>8>S;>> ==0x> $B>Mq>X>>>0>>>#??A?Š ?$?`,?$?A?]?E? ?*>]>>l>> >>]>8q>쀙>J>J@>nܠ>jW><~>,Q>LH>$b>ꑅ>z>;>d>8t>2>>v>h)>>tƧ>&>ʯ>4 >H>"3>?9#?.?Js1?)?0?(~?'n ??1?.~>>,>:b>->>? ?,?M?>X7>>6َ>3B>T==p<` :@W<=)>D>>!>W>Ȣ=س=X=X==XV== <<r4m<:=>Xa>>˹>@>>ܸ>z>(>;>6>,>>%>>>>=>60>>]>䈳>6>e>pwW>5=]=8 <D=8=(s==(>x>C>x=H=6X=;& ;[<0k<9<@<`o=P:>ؒM>z>>ʮ>j>x@y>L>,5>;>@H>L@S>0HZ> ]>(@a>`>@(a>o>l>{>D&{>I>>= 5=@跑@Ͻ@_|D x' i؝@DZ-<@=<UhHhOwŽj<=Xާ=c=8A=Q==S<ac>T>V>>>5>`>J>9>2C>l>2><> i=C1=a <ӼJm:-T6u/4d޽TtRν`E== <>Z>%R>:>->P)>Xv>>'=N>L>`ux>t>D(a> K>Y3>9>,=`=lC8`"? ܰ% d&ȀN0=`0==0=X$= =-=hh=h==0[=`===Xh=B=x== t/?>l]>d>;[> L>]3>D>E=+= <y<׹`U˼J-688)EtlѷƾbʾȾR ۖ瑾xrֆbzG:Ģ,t g0H5뾽% sE˽pxd㼀Z`=*<`d`؞;}ߊi @8ZX$˾ZDվU´dt\G[QqszМg\M2P(ȑǽ0}ҽ)oa b8u>8@==@=] ;:05=Xݚ==W >s4>p3?>4B>+> >0]=*=J<`1Rhu@Z:Jcfƞ-*)t􂾄{߂иU(nݕN]Ķz^U3Nl <`O=h=q=9=p= S<`¼PZ+@oh`C=c;<"=0w=M;;X0P& Z@`aK<20#z(]04l&D'@{1L?FКMcI|jJNJ?% 꽘X" wЄȓ@P< =C=&>sI> $o>8+>0>+>pp>tB_>$W> K>P4>@>h=x==41>3>@V>?b>8I>">L>8T=j==H%=>P.>QU>Go>c>@H><^2>L>ȕ==== >>O >\.>)H>tp>>>4T>>>V> >4?v\?F>>6>2>R? >>t>:>1>_>L>{>|i>Lk>To>>fI>h>P4>>,>><>3W>8b>ljQ>07>.>0>ps#> >l>p>X>@;M>P~>U>V>:>>h>#>> }>h|>>$?>)>> ??t?(?B?E?~>2h>D><>> 2>6>L>P>s>*>3= <<@<ұ<@Ƽ<` =R=(=DB>(> =YU=s;Ahv8>HB>XB>TA>pA>Q6>ԧ>>`>4c >,>$>_>>l>˭>"ٕ>,mY>H&=E=$">ؔ=8;=`@}(` h 㾽h۽d(; >.+(1 |żnCEzb06= 3=#>TH>"Q>^C>>>sF>&J>tV>ri>x>fI>T>c>/>Q= ==;*@W22;<`p<`<@<mn<* hHˎ`#MC1 2NL`@8-@N (<;`?=x =x>P >I >0=8=&==y=Ѕ= E=`?=X5=f> ">U/>5>w->->= =/=[=`^_<R<< <ב<Kj== >h&>$>p >=C1= W0!>f>=L 5|>.>(>9>w>HI>U=>">=j:PO ¼d\ἠ\)ȗ8v.trJdzd㓾J>zp|ZRL@D`/FG8>@=Tl>90-XV+&h$U!x*28N9d-,"`^$êf B=]>m>Pp>p > 7=-(taD>|3>t>h== <<`<=<@eټ @z5h9P〾|@򍾎6TXg2V͇ SN(rjdxoWt@+*v t]&!to#(8^ ` T==a6>Ac>"p>Sh> Y>`G>,> >=X=X=`(=&:$ >8p>`O$paDUK*F썾$r𭑾'舾r虾>̾v-پ?վ"1ZdV".Έľba޲ALŎxMK@ XAMx7xNؽJAսȟ+@O|`"8HMĽpY<' $5=ԕ@>,>l@/g``/;<<7S<d;kwv R`? PYH<?=g=<`= 꽀K'QޛV@6zs[}$^zHTjb ەx<$q <<<;ã`<؏=e>DA>P>`aK> I>< b>0>>i> >|>>y>>>>'>&;>>>wz>l|>>7v>Fi>DI`> Q>@> <> K>uj>e>$`>\>X&t>[>+>=h==(*=0(>ԩm>>L->f9>>>p>>{>$L>D*> D4>V[>8>>'>>e>S>*>R~>JQ>DGF>j<>@">$>C>=c=>D>>>=0H=P=` =:<@a+ 鼀<==Dg>K>~>8>u>Ha>G>N5>c4>PC>@]>u>>Ԅ>V>̲z>e>R>iU>c>V{>a>B>c>>">u>t>Yc>D6>M:>_W>Hu>>\xk>G>,}>/=xn=(=L>x== }=r@=z==>====>x >B=蹫=&===+=e=<: >C==R= ∼` ;>4i>>v>x >$>>{>P:>!>>d}>1>B>>>⪋>R>Y>t,>P=`Ff=8=?'r2&$,4ȿ5ҽr[ F< FXiGڼOм1P-y,',7< N == ==>$>X>ӊ>>>>n>>b>J0><Ģ>U>|A>&>40->C>i>z>8|>1=>=P=@ U<@s`6漀l7u/<<|&>Ĥ3>HA,>Ƞ3>W>Ԫz>³>l>>>r>,E>+>3>4C>0H>=>h9%> >}=н===2=@=`(d m`5`GQZXK >(mٽ0l;T߀ZXt9rZ== =.=`I FsM@ <ބ=@ >Z>>p>ά>>pb>F>a>D.>==(=`W<@}<`͚P@;ͽ@Mxb۽P紽.X퓽PnF.1 A½KelK^Md; X`\ [() ٽϊN@hr>'>4(>4>'>p= >La>'>d>===,E=P{=@u==^=g=H=ph===p3=H=8>>>H==S7ЕtЍ{i$l:+(`2 B0U;b~fxnToL [<<h轐+ ?X3뽰v>dL>=׊=P<~'xeP1ϼ <`[=Х=h7=ph=P=&;@ o]q`+.B,,vHwe \HvX%O8 H6QnT8NtF4tCd)ЫSAx$=] NUZ@ J@AB5#X lHL 4_rד靾b栾vL\ Jt`ID0&NS^T)grJǎ_'8ֵHdŽFC^QU\=8P/ < Vt==@=p= ==)HV,mY_es@Ūy6ȾξؾVklw( qa һ̾4ʾ~j NƳӾJ㶾ͷ¾оؾP+;P\ PK?fyP =pZ=<t;@ OEĽ(ѽ($ ($`|V)6,{82X7@@hü@H=$v=0=C=H=ѹ==d >pUK>s>~>ט>H>$\>=<見(M8$L=D"> <>ĵ9>p>P<=Ҽ+b@q< =U/>$]>f>ut>>Ɨ>z>Rm>t>b>^>f>>,>,;>n>K>6C>>\? ?T?V?#>?}?f{ ?5?>>~>ޱ>4>y>v>"> R>Q>=@ԛ=8=見=X=py=>` >t>\!>> =:=::;bRxG>*>˾>V>P >>5>B>b>>ܳ>? ?:???C?b>>d>}>Ԇ>>>">>> ۜ>v>;> > =F= =xr=p=0Z=31=b(҈04X2=1>X>lzJ> *> >t>\>O>`> >8>!>:Q>>>}>L>b ?<??8 ?f?"??>v>S>>>F>>H>lV>?>%H>Pa>0v>>"~>`h> EA>>p=x֠==/=D>;>S>Z>,Q>47>$>V=p9=N=`a=ɤ= ʏ=|=8=8= >zC>j>蓅> >~D>>l>4>f>X>ĝ>@>L"{>Dd>B>>=X==Q=(=^=!=X=PuK=@ <#x匽 HApZ$V`@s-`K*@wv>t>ޗ>>g> Z{>@J9>=p=Hε=P=8b2>tj>{>Z>p(>P-=H=%=<І ۽`ɽ C=8dL>\w>XIY>=:<<$.`as4} h{[5&. 64%ԁ(NT4*{4X'Y Xν@@м`<`W=H2=p>Z> >>ޒ>t>{&>=0w=PN=k=x=D"> >H$=щ=@!=< S¼~㽘21c؃aEd&p꽈qd2̽X&$?T'o>\C?$p4l h6+ 你֒]=,/>Ь`>V>~#>z>,ѕ> >0Zm>Nw>l >.>lw>tex>X>y>R>HQ%>܍ >=@<ؗ(}a곑C ž˾žʪRѡҷ~:N:-d2l6fYU$PZp~|0Jt Ep} ;t<:=`v==!R>#>>>r>~>m\><>G>== Upm)ȽT 8Ld=YtU)H8/TRwB5ޢ8-\/}3e`c`R_P A,6߽Lr x;=,>H=3=[;@< E=P|7==a=h>@*=<矼`ݼ`̼rhOW U0׾U Y߽.\7$$0n_ v'-]/*~+!#>u゙߾d*V~$X`iZL 6/;"<`<X:p팽`ýX t̽>PݽBu%4fw[ CU A 6&@M? ?kK#%@|$v #\ y!\ ؐG˾fW4TH` 0=h|dJ:ԁtsWpD$-D`~43Ծ{oL׾ g;ʍǾ\ξVݾR׾dþ.8ǾvݾOtS<I6tžP6 Bҽc== >d >->== =P&=)=p=#= <(=*=H$=t>=p9=y10nSv05:G!%\GxS@A|`_ ;r۾PݽٽB=`> >v>> ??!?S?% ?&>3>b>^>n>#?\?$?u?>I??&?Y'?? ?> >e>G>=@;==?=x>l>3>HA>W>`h>(_>`I>x9>ē->h"> >`5>uj>%>=>$.>X>>~>>*o>z>>?J ?j?% ?8- ?N ?=?X? ? ?4?Y?6?B?B?Z?f?U?B#?`>>X>Dͨ>f>R>"ǂ>>>ʜ> >p>`>l܆>*&>>V>|><~>>ς>>>H>t>6x>I?f ?X?s?~???????J?A ?(?2?z>8>`/>Jۻ>!>>>w>>tN>lf>>P>@_=e=8d==<<L|pFŽ(뽀e P] <@=)>K>PV>Ce>i{>>6Q>4f>X>: ?f?5?+? ?Ps>>>NP>i>>>><>7>&= <P>Q;@K'>K>tg>v>ʋ>ڏ>>촸>>R>6>L>0x>f>b[>p!`>q> 5|>s>S>>`J=fy%ds$wlFŽ`xֽ/h*mB4Џ4Vml3 @\<྄=H =m=:~=D=HC=HG=L*>/b>vԆ>T>>ӑ>T&>>V>>l>t>w>f>><>܈>e(><=yx*&]\wl|`{!(n@W,%4&玾vKߕfC%Tb[ - =@= B>s>vm>44>==p0>( (>l3>'P>>~>|G>̭>~>lZ>_ >a=x==l >)>lw#>8=s=CxȽԽWнֽaDW?"LخϾDVkHվ)d9DPX{AchH/T (ݽm*'s<<=r[= =ؑ==^>0h>> >>oI>P u>^>'>J=@ێQܽ +;.tn a(l&$N ؽH2׽j齸jT`_1\ Z0yL\.VH020gP{1jhy >0!>EK>vT>Lc8>̾ >=x`==X=1=0=I<*h842G( (>}(>Ȏ >x&>^.>W#>>>2>` >=Ч=0$=:*p! dk*,|EZ@:t≾@H쑹P<ӾljD}2lھIǝ>H*~6ľ׾վDþJX2ꢋlRIlx0hֽC[`A=0}R=@I< tL tttP><WDШ,`H!n `gtNTnc:?;v`+f  Yܾdd;pB+;8?MOW c_oDi2 P9ko== >O>o=г<98ҁ\p8Ͻ1ܽ@8&Ug_T\`{Йbھ澆8$=J iY$.yv ھ8ǯhQxXkRЦ=)w=*>`AY>8ց>>>ۖ>l>_>$>8c=pr=;;R===\ >Hf=L)=PW@׽q/Poer g؋h񌾖ڠ巾xϾJtH߾׾Ѿ#ɾPꞾ{dI5pg=8=>?>ji>]>_>ê>>D>V3? ? ?n ??t> F>b>X>^>0>N>> e>ƺ>N>G>pb> D>h= 4h=<<=Pq==$=F=8b=P=h=@=>+> V@>)j>> >.8>zM> ?\ ?: ?t?|?: ?(K ?O ?j?F ?1?$/4?1)??oR??p. ?+?4> >>\/>m> B> />0h>o=p!=\<Փ;%=@C1pGO^+ >𯑽`{[ ʽ1ܽ⪽L;q=\ >ST>DU>跫>V>.>F>? ?o ?? ??P???d??-?? ?>~>>N>42>>$/>lD>J>=>h=sv=pA=ic=$=~'8BPDE`N߽`I㽠YڽWIm=p>Z>>H>>>e>H>#>R?pD>ֆ>x>r`??*>*+> >n>j>|>0v>,k>F>L>=u=R<31=@= >)>1>>0y= 弈 ͽ˽XGش%Ib{},5ЛZVȺ9=(<=>`0>a>21>>41>N,>X>>:b>>.>>>>)>b >J>h8>>[>>`=4<05f ½8Ep8߽B0PAlMSEKT7-X4hA >&ʽkoЗ=:>y!>0>A>&J>4DZ>>F2>>Ls>}>\>޸>ڠ><>P>>>R>>{>B>=< h4x|zdZ$/H=da2޾rYD4p,举BHN_bS7 L"w^ =`f==>T|>x>>ȳ>>t=> >L>>Y>|n>x]>dJ>:<>m/>\>`P=ȳ=G=!=G>>>> >m>~>ܟ>4B>w>>==N5=<<07 =,=@|<Ц(9=`Vz%"먾п^Rž)Ҿj۾2bU :@Xvq`5V[{ƾڟzY=M ШP=/>|Lr>rq>>͜>\>,>>>>>>k>΋=3x8FѽʽBfxl TmKs̬𣾨Cɾ@mҾܾ .#:ݾ2þ*GN¾gվ|}оY0^;š;Bi=,5>K>q>h]>ꑅ>2>׫>"S>զ>>G>ص=x=K=_=<cDmr٘()\uD>|>Ԥ>P)>/>M>wo>I>X3>ބ=@Ԕ˽1zB ؾ".ݾA׾߾: e>:g!v!@ARݾ.{}cŌV< m`==Q<R@=<._===C>->8`>> > >J=@==Ȃ=X=0Z9=j;$½t-xDft^ʾѾ ؾ +fHsv`bPJP f?ԅNwvaN 𲸽N{0W+22`;`lTT>܍>P>>p>#>bn>pn>ljQ>8>0$4>p3?>>>2>%>>b=0w0%h6E10~`=@'<`彌3xS@OTl>2p@Ƚҽ@@*\@H:(>>>X>j&>nU>x>q>U? ? #??(?'?"?#?'?H>@<>h>,>i>zM>tc>Ƣ>n>2>f>E/>x =bw=`<@9S .(=V=hϴ=T=Pw=@"= =Y= B=>L4>̭9>/>|l0>N> z>d>R[>z> >>>>S>>-? ? ?<>xô>t>@G>>>8>丄>t>v>b>2>0o>$V>(1> 0>=׭<V<@< =p:=?=P{*=2= =@)=`A=@B=,=`<<^ ==<;>f> >a?N?w??T>>`>R^>>>> >>d>>l>Ϊ>>z>k>t`>8>@=P:9=@{<$<@04<NQн:83*D,:G2h1Nthqǽce=x >sP> >̗>n>>s>0>c>^>~>P>X>R>>/>$><>N>h>m>~>5>ԋ>W>8>p=V.=< J@!%><@j+=<@֮HS;*RѾԾt;kllvS8m2>pٓ>^>O}>1q>D>>>Q>B>.??Ro>p>HGz>">==B>>>@V>d\>$L>C1>!>=0=P9,=9,y 5ag$!|iLA4@&*BN)=0%=0==J>@C>]g>n>g>'l>`{>>>>/>B~>>T> >ʳ> ݜ>>&_>0>=\{ÃHWsT'Ml 0h"<(s=|'>4Wz>ɤ>6>0i>>n>,X>tm>@^f>H> >>>>>&p>H5>@,=p]=@< fn꽸 V. C` TPn>j5ƾپ WPB׾:~ޙOoD-𽐍0Vf%=ļ~ї@P<<6=p=>@lE>HDS>;>\/>К=hG=&= |<#wI>>n>ɽ>,>j> c>~>~5>٫= ˽|x-ٽ߽!h( L* ,0+Wh]Џ&Օ~P8z7pS*¾Ƞ;FϾpþjdH6Wн` <p=s=d=`u=N=2=`+F=ؗ=X=?>|>N^>|>X4>d>x>C>= UH>> ==0=h=T>} >>H!=@<_¼PiPJ 6|n.־ JH׾L׾龞-t(0&辂̾Xx]°\ps=Ϥb`<@ֽPw@<(=&<=$tZ , *` @V漐)1O–[ͽpC[ž־JT5Hg쾮 7+7=:,:1t"!r^:`o- 꾠4H@mҽeh;Z=A==5>|>P#>`+>( =J=+=\t>>-==&=l;zԽO,៾{8Q1;/@o) 4ԾZݾ ־žLdPᕾeRwC1=U(>|5>>S>3>j>>T>>C>pA>rQ>N_>z>|><>*l>5>z> y>oa>L.@>+>> >=i< PěP'`UG<+=:+=;E_-Ľp賽)bXu>L>TZ> >D>?,?|%%?j3?:?9? 2?&?Dx?RH ?X ?"r ? ? ???b->Է>:L>\C>>===0==@<u<<C<`Vh600 `$Z9=>pWe>> >T>y>dv>P~>S>>>?& ??E ??x ?>81>~>>w>ڤ>J>??z> >z> >م>8>=@O=;Zx`qxXiĽ((L r۽@cM;'I= =8=P=4=X&=>CW>֑>^> >>>>>>|K>?Ѕ?:?>{>'>N>xԠ>B>>ұ>>}>><=>r>x>>Py=T(нXxF=*p=0e=`b$=<5< =0=Z>l >$>>]> k>Ej>u>k>U>̾>>>?fj?G>>>|>پ>H>#>8b>BX>٦>->z>|.>O=@< ӕ<=PS?= =`nB>0G>>[>>>3b>XJ> ^>|5>8>Nn>>K>,>>`3z>Hr>,;T>]!>=G=X;0wP]kYqpz~t@2@0gH XW8fD \|^Tl>Xd Xݚ~'*=X=?=س=&=>2>,>>\TE>K>0>>(>e=S=e=h|=ȴ=8D==j=F<@!A:(mٽ\ X4xLx(%*/@AcZt銾zi:N@HWJLƾTǾ4悾 VJ(=lI>>e>>q>*>\0>/>@>p>@I>( 5>(=>U>Bi>,=n>p>Ĺm>_I><>C=^':C zmJH.j?\ٚaѾ쾙4szݾ淑Hw,ku\}|`31H#Խ@ێH=>i>z8>.>*> >0U>2>K'>m,>|A> `>J>|W>З>A>Ė>>` >Q=4(ӕ 9DI@N`[`Sl zmjbЭm*j{׾8 ;np.lD׾rb Pi&p3==g>\>d> >>h>S=@+=(=(=P=0^m==F==>(>p`> >=h=@,N>H0&>m(>\@>==IH>="=`q=z;]GO}H'౾࿾<о2ݾH  `\Ϩj4 BV]S%s""!Ͼ,dҍWa( 8AU=uκ"؈ni+ A13;(=P >>>( = (=@4 `ދJ\뾾FʛʼnwSh`"_t^ v &ľaξV|ѾҾʾê $x2C@Fӣ&`9< S=x=D>(<>l>o>>HS>j>y>`T>L 4>>H> >`q>>8>t=>>=d=ж=P}=]=<[b@j ଽx}\A%M=Kl@нuPG f= =9>>>>\>>^>&>D>h>r>>>N;?tN?ޮ%?Ԧ,?,?F'?D?P ?@\>>|>8 >+>>a>>h>ڴ>>>jΧ>>Ni>x3>Й=@0۾HHޮC=>0$>`; >= =ȺDq>t>>9>d ???']??B>lH>O>l>FY>?v??+?H??H> e>f>x{>tdk>W}>젋>t<>^>>5x>/}>F~>m>p4L>,G> =FX= =/< =p=Э=L >l@>'l>>&=>(Ü>8p>$>>vm> >>>.?,?N?=???*>ځ>Ȓ>o?)?uL ??6>>~>C>p >i=8o=`$< <#<<(;@ݼpvJKݽEtUtSSR>U!{x78:ν0;Te; =3= kF==H=pS1>n>z>g>tQ>B>$q ?W?5?j??e?DT ?>S>`>(>6>w>PW>80->@>1=~=u=P=.C=Լȑǽ(B]ctdkxmpDyZڍ.2̼@سLWM>!> >Pl >>%>H$a>8]>S>h]>D}>%>꣘>A>\>^>><:>g}>a>DC>>=d=== =s>"ȏ>>@9>:>ַ>b>>T[> >@>Z>.6>C>[>#> >H> 4==ʪ=NQ=ދrHE*{4`]tÀhzL∳*oپGKC8YоB$zጾ<>tD$aDT"ȥq:J=i=>k;>xH>L>HO>|T>ca>z>>n>r >!x>'>=@<P<+:P0==hN=,>xp=H =x<c͓P佸" KhmxebvTX@hW\up 1*la:岾oy,PŨ Žї; <<Җ<tB>j>{h>ly=>=i=<E$<`p<7>I(>t+ >=xl=0h=P~Q= << O<f:ؼMa.Q0O`+F/5 tLh FbdN_e3eaܾY1IJ] wᾀ־վؾ+׾@ξ<ʾӾ޾?Bݾ&ʾ"c@Nȯ=t>+>l>x>N> y>fC>L>'==0=%> Q>t>^t>8dL>\>hZ=ѾrCLʭT𾾻Ӿݯ?e\B2$Lлt< << M< </5;@Wȿr(aAXݚ[ NXȾ0Vw^ƂB|8dt ׾nھ~農oCDF1a 0=p/ = =צ=\ >L:>YU>Pp>&>~>Ш>6>\fX>h:>%>h&9>ij>6>~>RY> 8>pݓ=@$ԆTz^D0 + ]4^վɾ 0h+zLhf{>}> >>.>R>>e>T> >7?ih? ?t=?V?.# ?X?p??E?D>T)>$>ѣ>>~>F>.>T0>L:>BN>'e>k>X>L;><'>h8>`=X=0ff="=ɫ=t=B.>pxd>>VV>x>~5>>"0>r>z>t>F>5??? ?l?fH?*7?%?>Ҭ>0>d,>ԇ>*>>4d>h|>dW>[B>/>t >==$0=`<b@;О=Ј:=&7|n >#>%> 8>b>>~> >>??CU ?ET ?ݜ?0>>>K>(>?=>j>B>ġ>Vi>D>D'>>ز=J=K=`J=g=k=`{=Y:=<b ,=ã8Ͻ@彘潘جZG )==k>>> 4;>l:>hd>6a>f>(ss>G>GI>pa>|n>֣>2>^A>J>l$>>n˚>h> (>p===$=(==4>Hu>Y(>h/>W >>i=0==(=E<}6`ݽ"$XlJ𼠞<8r==x=TG >0>%>>@>|&>L>u>ʭ>N>g>|+s>h~>ȋ>&>& >>>>E>>g=~}W@XlfT⽨|X7x[P\{Tp6.x"Lm(`< ==Hf=H==h=h}=8*>p|>>>>>6>M>&֢>r>^>C>*l>jf>V>%> >e>>0 >> == ˜<W 7fTj[Q|G[8T鷾XE'z7(҈W](7μ <<n:CU(xH=:=DA>j>R>F>c>І><>Pn>4yR>7>^>X=`==ڸ=ߊ=0.==`=j; q˽p" V!|SCtG ׽Pz@./>dP>n>`Ň>T>ʍ>>>v>>> >*>X= Sv>fZ>ь>>L`>~>(>:>>R>>rc>>D>HGz>,E>pH=r@=jp Y8Ot@!(~+QD)|<] ľо_վ4־>оV wsP0$@@ݽ`۽½(0iҖ}0`<л=P">?>vT>dPy>.>>F~>T[> />=!=)=8=`{=ĻPJL,&xm2{|90hX[|&2XI$2θBjžȾI¾,o?ڐNXwvtpl I/ؽ-FVx싾.ߎ܈yb\a@l%ླ[d$P.261^-&<4d4d0iپ\ǾتVV)T]0. gãPs1@[LE 4:<|n=P=X==ؐ=3#=q<`gn #M=[PЛZj8燾j^¾Ѿ(ܾ뾾W!. H辶'ľ^8顾T|c t%.($ XX߾@YX$ZAܽL==lU>44>$J>G>n9>7>t9>2>>f>xN=1== 3=s>O>XT>м=2w=?'<`)oɽ QRĞӾ|xھ þXgj:<þf⾤˾Nj8.Խ0sϽw½h=<>̭9>PC>$>t>>`> >t>( >>>=*= = =W;0duDpbve[o[( OKU\p|赑HStžrsT7|kv~M!`Ͻ I ?=$7>w>">.>>>⪥>Ϙ>6>؋>;>>>>>>8>>->PB> =>=; Gr;+< <07 =/< G @1DNSW49hH0ȑǽ(ѽ`=,7>Xlr>>>L>L~>d?s>m{>쳑>z>,;>>:/>>,>8P>:>>>x|>w>0~>>D>> z>X|k>pZ>ЉG>lx0>>8B=v<={<;O;k;;0k V>:֛>T>W>z?\???bn?O? ??h6?մ ?X>>?{? ??x? ?>fm>>/P>`>a >4T>E>,v>tč>: >U>R>>x=x=@==H=)>>>>$>;>>>$>>`>1>.~>k?W??P??B?" ?i ?u?!?!.? >4?O?H>>>T>>>W>l<>$E>f>X{>6>>l7s>R.>'=@= N %XpTH̛{ὀxݽ0x:g=*>a>>>>T)>>I>->\>ZG>,>̱>w> >" ?v??D?B?K?f >>^>I>c=@=bw=x=+=>(!>( >h`===ӕ;` I@%}U >$>(E>0'[>Li>TW>Ԅ>D>n> V>>j>,8>>>f>2$>n">`>+>ʿ>l>>ҏ=;prr8o p[L'z~젋t|D}ӌlvԾ(: 0h۾x⇦x I>|@>B>(=+p<`fؼ/l;+<*=p=H#=(=;Gɽg:@޾ U;Z"8ntغr0̾߾"*8 CcTϾ9ά E~gޥ t݂3W`]䢽b`01uڽhj0#[2wFl U=ʽ$C+lAƾ߾4x<߾H־Ͼ ˾>^̾Ӿ?r&򾮗ܾӾbоbξvpʾxTPա"= > <>N>x)>0=t;0P^41`<Эm=`A=E==D>>7>ȶ=0g=^ P>x> %>P*>Щ=<^CԽ(]YνXpeĽXl 9jtE r)RʽW;] ב<<j;Z;45n>*k>>F>D>0]>4A3>>s>*>V>Z>>֩>b>>L> > c=PG Ug@ <P<ucXΆFl F{(>>c>eq>0q>f>Ь`>Ι>hj>l>E>z>@>|>ʥ>>J>L=@Ƽ</ ەsv`ˀ====`ĵm@'>^>F >0>~>?Zd ?Q?Ҽ>>G>u>\!g><,a>|;l>*&>hy>>>hn>F>Щ>XW=`<`:^ü`fؼJ<E%>(+>/>Q>>pS>>l>>>?M?e? ??>}>"R>c>ӫ>>_><>v\>8[>87> >==#=pb=B=<=kF>Ȇ>>6>Ԅ>dӚ><;>DE>>>^??K???J?rT>2z>"2>>>>b>>ל>,i>>Z=8>N5>X>4]>,k?>>C=<22@Jy;@(==P=A=d<@q @T̼$:I= >R>y>)q>_>LV>,d> >>2>>v>>`Q>'>F>>>?:? &>,>>>zІ>4$h> C>!> =Щ=z= i,=`<@Ģ<@=`<`<1<;<@B< @.{x`Y(|MhgPqziݖԷLx`i3R>h~J>>>/>آ>=(Q==C=< I@T̼@9,ZߜX}𮄾`N)3yQ[Th( b𲸽@ >P=XE= =!=8_=](=xȽRUN8 hG`2QEKܼW#@U☒"ྡྷFd֢,t?Ҿ,ѯPӡZˡ*ľ,Ѿn!ƾn׌`s^H0{FH ؤ0(@sM`ϽpF+ڽhHXdJRlݯ_ܾvϾ; B*aX$p K_s~̿LЮ=>v=^=b>y>֖>dOl>{F>|>>Jڮ>>>|*f>@!>pe=`;=(;;P::LaU! xQ,B~þ?6>9(hBg841:EA(0Ft}=p=@S2T~0ff6>$0>h=05$8A1N調=> ??>\.>+>~=^'=P>m( ,9H-|~wpR*ž~I徘2"ܾ4ľƠs6:7.^"MD{%V&&p2Uj1& (K}"߾)d;2(^,LоF1~b["=/Z4Ͼi׾.ʾ\uľNԾ"꾊BZ̾;ľV}޾ڃ=o ]vQV V#J{ : K\5TWP`0;.WD/`IB>>>?>e>>>B>>@>$>>R>: >>>g>.>>@>E>(qY>]>R > ?H? ?H>>֏>>w>>J>8s>>8>*[>>>n>J>l$>&b>>щ>,J@>5=>>>^?5?jYK?dU?4gY?_?e?d?_?$V?jP?+Q? gS?R?O?I???H:?<;?(_9?3?-?x&?0?VE ?>Ls>΋>>>.>>>>|h>xc>2>P >t;>w>>>>>l#>>Nb> ?F1 ? ?x ?V ?8?>F?Bg??{?0??fH?8_?@?6?@>b>>d>l>>Y>B>>T>p>>r>x>ބ>Tz>J >>>8 >D>l=tcԽPu@ݨ~f>Dp>8W>L/>8Q,>M>}>s>ti>`B>T>>ؽ>>R>>" >4>XDu`o66o(d,Y, \rgaH*n̾lGkޏ^޾>ξǾnɾžuZ 7rq+^70>f<ҁi,Y,pS$v<0>9c>ʄ>s>E>`>=@_z<+8@Y@ӎxƽ Đ,:GBG?6$Q;׾^ ھ̾ ݰ:ܾE V"(1/h'=" H 9Ѿl-zH0PDdrY`W@@&<f; 6ֽt0ȓPM;P=Π=Pz=8pB_XHȾ߾PX8[羦澘ھ.Jھ,쾕z Q 󾺝b\2{ᄐUɾ༞q7ԁ B<|pT6s"<DGF@ fs >hTFcվ۾*ؾQվ~־d Ծ\!;oǾΛ̾UBI <` ؅ Z< $ܾ˾銾1R% e;o4=h=P=s=>t3>C>܏Z>h> >>̰`>/> =PG=}P>>>۶>`ך>h+z>LP>*>d">\:>L a>>>0\>t>== = F= R >0m=/P=@P<@<`<]D<p,Nн(@W ؁ǽP p< 5u==W=d=8=7= <<Y=K=|:>€>xӭ>>>~>> b>#e>=>(= =2` tLN<=">D5>">Ȕ=ϑ==ɞyUs`}ļ@< <pM᝽`"xvPͽY@i=>#>ē->DB>6X>/W>&!>=#=|>9>d:2>,c>>8=>K>TN>@>=$=@<;軠 P]RlCP{(0x@olbN5l 8; YnT$phϴ48x_4@J>j>"v>)>$?3A ?q??X?n??_#?d/?*7?b6?V-?w ?Z?=?9 ??:>/>|(>>FG>>43>>Lb>$>)>̟>>>Z1>贄>">>>q>4>*>4ځ>>>Z>*>f ?/?d?j??;?k?#?8.?Q5?&8?n4?W$3?u5?>7?R=?F?F???>[2?s(?k&?LO%?#??Wf ?*>jߓ>FX><[>t<>t`>ގ>K>>Zݴ>c>>`>xP>I6>*>.!>>*>Ji>\ɇ>z>>>f>D>>N>R>;>>y?>?[/? A ?m??&?b*?\?Z? ?a?B?zk#???>L>=*=\<>H!:>xB>(_F>+P>,~_>,:G>F>>00>->>>1>^>$> >>>==5=pM=;*=H;9`09X) p`lT %/ QʱӾP 辺쾤 ־ROh*rɾ$ؾiܾp;UD寽,Pr$=X=`=`p]dz♾$O޾0QE 0'8 xFLMEv<8AY2t`*^ cx. bTn~۾HΩnA ܩ*BF zlh7<08B$>қ䋾:)zw< btZ@Vutɦ*6Tz*H X"ĐO}5.s68(5V5,V܁#ɾꄾ(k@H. $NQ~üX; <``<`z<2==;= 5=NP t瑾zv<|6+Arb≾&njԾ޾fI."H"Ҿ]׾F2z I  (iƾ*̩KIXV$(p`fxȼ`G< r2=pa=p6=0=X3=X= =(M='=ln=E! |VD]XTeLogBXԖM$]nSiྫྷ#$ # : |SjPᾦ࿾~D{eEh`PJ=Q>N^>x>b>~{>>b>>j>s>>>h}>B>{>W#> ==:=)q<9cpؼ8 J=ج=Hˎ=PQ%=?텽 wɝ .>:>>H>B>4d>q{>$>P ===T)>)>p><>DF>>>Vi>>,o>{B>P:>p!=ߟ=]>80a>Q>Pw>vÀ>w>L>L>`<= @F =/>TJ2>f>u>m>J>Hc>0ʈ=P<c;04;pR8>P>>/>Ê>k>H=>4>x==H><1> FG>f>ft>W>.>:=i=#?P{ܝCX{^lGđ@⽈/\OQ(B%\ fxјj"`t<,/Snmq`8H s?@!=%===>S====h=l>0|E>g}>r>ڲ>>ZB>`3z>@0>=@̛<`'h+N;>>0?]?H'?-?.(?C# ?B?7?E>h>>L_>؉>L>>>T>>>0>p>(b>ȶ=pR=P=x>4>D>IA>>5>T/>:>$V>`>K;>(N=؞=@N=`|==[>>F>??n?7?Z? ?6U>8u>u> ??6$?6)?!?ʭ??f_>\y>>(>>z>ʸ>>>^>,>">1/>)>@=wI=@<;I;;9,;軰l ەhZe@*GЬ``h&==d > Q>$~>*>VX>`>Fz><> ?Ж ??>4>>L>9>Z>>f>8R>ڽ>P~>}>LJ>r>h=LYX-O;l"1x~ý@7HpSe̋aЬ`t\t ZvbSNl\(N@0k9<= >x'>hZ$>>,&>,|>8N>T>i=P=H >X>">O>䈳>NO>ލ> >t> X>7>8)>h>x=X= 5=@l)>:$>p">(>09=;*=-7v &0(?Rx,̽lQt^)$"cP냾l/zN.ھDCDzؾv.6/$L`j,`g;\@3<<=Z==r==H=X͡==|&2>X%g>^׀>>l~~>t>X>#>`=Py=@P<S#oĒ5jaUa R 9@*{Ť;{T$"fkc߾̾>$>x@>Й@>96>h/>>J<@[s4\R>C|FKoFh%,W#38ЫSdqxR ~*繾 о後辸Ծ胦$W޼L==0=@=pv=>(;C[B;0=Xz=>s>Ϊ>O>>>dp>b>V>h=o=M6=@<@V<`Z<@1<'`ؓڽ~@.\&KPLl5`&#؀:`b@%㖾դ`8hZ\/ =k=}= c=0==U>& >b>?>D>?>?z>G>`>H>>i>Q>NQ>;e>d@>PL>H#=Pc=:p,(^l3 p4DD0006G-RY|t\x]н5 <̆==1=(Q=Dg8>$>2>>$1><>:>>> ?U?"?v ?Y ?%?M,&? ?d ? ? ?N? >BJ>>><*>j3>s>Lh>7[>%O>K>sP>0E3>t=i>'>l>>@Z>覿>N>>"c>$>>(Ԉ>o>>^>(>(.N>:>@[=PvX=@<`` 8ҁWh$&ؽXm{|XWRL8cپ$_PO澾Do-K]3dK8L,Bȯ`밽-; I:=PM=ē->0P>K^>Y>|F>2>u!>|>8=y=P*=X=;<T@k8T\y(ed\>8W GjVj¾ZYp ྊ,ž_kdqxYE00ڽXp <`.=Xn> ">Ɓ>>?30?q?K>P+>ı>Z>>p>\>Jb>нf>J>\>=X=Ч==@=X=(==>=p0=鹽+L@YPpQrɞ;@=9=P>%=>tj>Po>܏Z>N>E>\eK>e>v> >>? ?2?x?>>l>bš>x>G>5> >8=0G=p܆=`0=hǽ&8.Up\xkR(]̓:#VWgJ{+8 8v߽.ý0DڽX0y4 p;1=h=Q>4A>>>> >X?ؕ>&>dM>2>ȲF>XD= /'=`U˼ǽ@ʽl|K* >m>>&>N>>0΢>r->>Lb>0>>@= >>h7 >=ȝ= `<(҈ $5j׃Wh~~l*9hR,k(|Gzѭ♟p`4Wz@eXiK()`F3`<=pUK>B΁>ܮ>=x>$U>`V>Z>?>>F>=Ha=W;=0 =q}wTɾLǾ EtaľLȾ(žFԺs0ځؼ07=px==8#=C= > +>n<>cM>8~>>6>%>@>D>D>>a>vi>@c>pC8>=8/:(|%dWDj_X,\jbЬ`6XpARoҗ+ľXW`ǻ^xӭ$q.%zڥ*p/-◅f<̽! =O> ^>܉>n>0>Ԭ>X>P,Z>|S>|9>;.>5=> P> 4;> =E!=@LSұ0HADx :5lOᾚp2̾]̋a`3<l6.h$0P0xy, I8QPk(` <Эm==4!>5>DB>P=>Ԃ >`=P6=):"`~@k @R rw$VB~xu ־jܾ0|߾tо? ݖ5@8设X@8&yսB32;}< =W;=M=N=p=!>I>f>Ko>m\>,9:>>=`nQ=l=c=`Ʈ==>=P=\)=zf žƾ6/ڸ̾׾~Hؾ ׾<ؾԺnU˾~ϭR`ce Ž@H/\|=(>>|>x*>>y>>>X>ȡ>>:>#>X>,>J>>a>>dĮ>vp>r>^<>=@]<:X0pýƽ pὤ!|@7}X2y$þҸp0k*|yXyhO׽щ:g=>l4>`aK>Z>T]>%D>#>,Z>(=訥=Ǧ=ք=ft<8/н8pFh"CIa ӾrCK𾨾羺ؾ$uپvf( پ̾ľvխ蔬 F뀾8(佈X8 2μpS1=p=3=p ><'>>P=Hr=hϴ=8=4=#=<=D>= <C<Ϙ;f,( fQ½`MyZ퓾I&t,4Q,ЈylT8q ˽h½x@4<D==pe=Y=$">t]>?>e>>>>>? ??A? R?&o?? t?>@[>L >\w>s>>B>>zw>[I>V<>/>>D=PH=@<̷0ێӾhl@0k@w<>=@Oz=X2=5 >pwW>>h>̿>v>>6f>V9>|[>8>Ю>?6$?2?J:?8?0.?N '?'?p(?(*'?6!??F? > >Lٻ>ל>0">sZ>@k8>>=V<.:,7]X (PÎ=03 >i>>Tn>4Vm>:~>N{>l>x`k>P>>nf>_>`>z^>҉>n?^?/# ??vb>5>> >>Ϧ>x>|>th>Pp>>|>h==\;ZpAG*@>\t78'P)Z@D#P%LzGh|I|9x=Hd>> t>L:>@c>~>>:>>>0>2 ??V ?@ ?Z ?.?T? ?m?.>b?>z>pg>a>>$> j>t>P=0ǘ` a7?@%'`A%,7PvyHý0H۽kl/<"潰*=0i= >D=>Pse> c>,I>D>lN>f>x[>DF>k>>?l?b>j6>>m6>x[=m<< 0<`O<<$><<^2>/> J>0[z>0U>b>ڲ>>>:>:@>V>M>$> z>Tm>`>>R>;'> >=u=W =t=0=,=(a=Y=`躼彸8L`E4PJ28;DB><=(*N+iG}oFIս)= U==0=jPqhU<(=2>q>߲>`0>>g>-??8u> >ƀ>>>1>>̄>g>PP>3> >f=@g<fhz8l$L uH<&rԽK`ڽP]JL]SB.ҽ==`-,>tRX>co>e>4iY>tuq>B>>ݾ>z\>>g>

>\>޳>H>0:{>D=> >h>x== =~=pv==h=2>>>05>E>ĖT>Li>s>wv>u>.~>B>>J>6>N>hi>Hv= y=`=F@]藽Xн9̽2@&GXqp,osxmhdmž۾4#۾ľ˦^b5/ ıtL oнϊ"$ <=/>0(h>>8>> >?>t>> 1>X\y>U> WM>L>2>x}>=08=(==B=σ=<>@dOފžݾ[꾂.z6&  S%j32+"L nx侨2b<`澔Ⱦ춾N=lZ@ҵЇG[z92\OpwlH뚾N Ǿ *.5=uBBkEdB>K96G:S:8)7^s7?;]Bt?EEC=x4(+Kr$xm#&.=%P@:0Mb.Ӿ ̜ZV֏N\ԥ Ծ侲lV8ڴپҾZ׾ؾkоEľ;UZ#6S=V5,(,Ǟ X$ (PR澘ž \.Έ}\G{v R^=&=@>= >n=d=@b=xÀ=hy=f=0w=P9Rμk;8Ľɽ|ӽ8tu˜jz<+ ɾnھ)4վ6A;~ȾڱV2!6 } y\0c?Pc==<>>>Z3>B>>>>1v??v.>I>>`N>t>Z>й>nA>8eY> >p=(=V=RN=HϽhy ("4=`aKxMЪF@C4\ rxp!`,>Pئz>쐒>>>l3>ū>> >ʝ>><ԛ>C>Th> !>d=< y{"(6{2>m>>w>:>>>#>>f>> >>+>>:?z?l?>P^>?>:>Y>Q=< A&*7(] kIt9>`=>6C>UU>_>d>>ij>rɴ>z:>Xi>Q>T>8>S>%>>>B>>Q>40>!><;>> >>H >(==J0 b OpMA y<`f>22>ɝ>֩>ӷ>Z>3>>F{> ?,?Hb?*???/ ?`>>>ܢ> #>4E>H4>\>>hZ>U>80a>>J=L:>z>v;>x M>8=@%<-@rLS(@a>>>e>>F>>>f>*>> >*>>p>>#>o?b??=m?c???g?8_ ?z<>@:>l5>< >2>m>Tu> FN>X7F>$H>LuK>D> B>R>X>[I>l4>X>=`P=@̭>‚>>.>[>Zh>~[>?T?G ?'?.W?? >>>n>k>t>L? ? ?$?v ?X?>i>P|>p(>=9=R=L>0Jt>l7s>dZ>25>d>>`==p4=;=={==pe=Hr=`b$=_<=>ԃ->pH>x>>{> >TҮ>> >>>>fH??j?9?R>*>Ͷ>f>`AY>>h=`x<f `W开;<xԽ KB BrhYx)%pQT?l|j$jo=o>=>G>X{^>>)>:o>ڣ>>.>Vѻ>T>G>0J>>?>Ju>V>>>R>|4>D# >pG= nm=@H<;@%P\EHT2ܛȏǾ@徂ྲ;rȾSξw+j  UfYi(9F"ǾķԃYBxhtRpzMt-%3D pT>IcFXT9`DhY¾,޾*@քԾ1оVE :"60)< XG*ID=,>Xu> >>dU>p=R=7HJ~g;zpӽ(0>]te@dOlTWQ\muxƾz)پ޾(ݾx ;삾Ns;"2=ԩ=c=>|>d#>pER>̓>z>>Ζ>>|\k>P [>!Y>x>8>>x>^0>>b`>3>l>G>Y=6=Ϙ<EĽBCh#8HHz.'н0\Sޙ(6Bw-j&@~۾$q$+js 6@=I<=>A >y >>$>Ȱ,>1>z >k>2>Z>Ą>>)>N>u!>>ps=@=Q>ht>(i>Lk>>>d>D>>>>T???>>)>>ri>>sM=05=l==h~=- > >%=<`$Z\ lej 8' د0Y:4jvC@ ~ ¼@-<#==`ԍ=07=j=ϭ=X==2>#>y>v>>D6>>D>h]K>p;>PT>,\>d>Tx>i>8>L >,$>(҈=@<b~߻S;@<;` a$8Ͻҽ8ս@6ti-7<`N_=2=o<`<= >@~X>ִ>Ně>&>>`ǻ>>>+><>B~>">~>敟>R>>@>t>V>M>6َ> z>Dkl>tn>h]>l;>>==ͅ=O=ԩ=0=0><_?>hM>7.>>>(0>8 ;>V5> R>>v>v>Ѿ>d>"?r??YB ? ?Ձ?v>>Z>:>.>n>z&>>>vp>a>$\>K>@lE>d@>40->p>`=?P=P='=p6=Pt>=07 ====hY= =p1%>k>l>ş>Zݚ>.>d>>3>`>>,>L?>,>p>4>i>%>L>>>>x>\R>i>d>.>$o>>2>>L>h(S>d} >08=Z=@w<@\<@<":l@$<4<]<-<`*P`y.C@a<=<*JO>>bn>Ec>S> c>gv>Ix>ꑅ>>pɚ>˝>6>>׫>P>Z>җ> >,O>\>>(*=l=ãD}G}/@h+PW#9c0 ̽{\s*hTAVYh~=B>,i>>>Պ>T>~4>F>x>s>T>>>FG>>>>t?>ĵ> ̰>@7>Y>x[>;>8=Z=09PYTAo쬾\Ǿپ hSR꾆Ӿ8rž{Ǿ'˾DվYa2꾚A޾4[ݾ&.ξfɾvM8f潐Z)t0<j ֽ̯SY`vԠ떾"-̋:MdDZ= Ѿ`CZuWWN\)(8 xF_N UMMB0L۾ɾžVʾҾ9о$P Cl&mRTVp:~؀p@\MLqTRH (-uw4<(0H^VwrƍVϻNZ@\׾пd䠾$։yG<塾ž˾(d[h8L\&hK?'v<=ϑ=`=\1,>"<>D%:>S>>>p>(I>j<>>N=)=L; `nPY`^ؽh3 rJ08,Onɀ.%qoTB0gнӜz׺l`V:@==v>F<>d`r>>>Ш>`>މ>>Y>,y>e>,;>?>\q>`N>~>W>pg^>PC>'>"=7=:pS*U8 |rڙd\棾:D>$b>d>\V_>H>ؓ&>0! >>>H4>P0>(K>@=@Y=?=:+pmlHP`\ڍ2쏅4뇾 bGVyPuH|̈˃H0y`\T8ݽXw޽P\E=6=hJ+>0i>䨋>>B>e>B>>x>±>>b״>o>>lO>t>== >7>/l>g>t/> == $$ gFR`.900(߽`79)*<]нfr NÎɓ PULռ4@ @Ƽ< $=<@%</= >pq >( >9>eU>8U>vb>lk^>7>>H===6=@b<`sͼ`MҼ`J01Х4'a3~'+H40s~@o콰ս8@g09:邻p==X>ݕ>ն>>H>>N>Ȯ>C>$;>_>< |>hX>0x>>ԓ>*>x>9=>1>ܽ==== i>ݟ>:>*^>>>Zw>j>T>>)> >><>N^>R&>Pd>0%A>31>@~$> >J=X=xƧ=pZ=e<.Ѽ@䔽);b WWpͽuP?zٻ=H=O >PN>4ێ>jW>>>l>m>f>Ч>n>>v>^0>">v>>¨> >>|> >j>N>pb> v=j~=<-6> i>ϑ>F>槲>Zf>*Լ>vħ>Ģ>">>fJ>И>>>Tl>LQ>$?>%>t>F>0:{>H"G>V=}6$ (S\ Jd;K=_=<* ]hXʽ!Uj<8殽`<=@&>0k?>L^>r>|>tč>>S>>\˻>>0>>BV ?nu??i??;>ZF>.>Xϻ>$>ܳL>d>|z>x=]= $=HcAWDiRLt`~h8ȼrȾ 侣&Ҿ˾Ѿ׾ 8>[ފ \yӾ^s$R0DZIaP|7ͽ.s|58bfؒM+,2\q,[F@<վ&+p㾪#Jl(3<^@@B&=/@M.Ѿľ̾ DǾP]#bn3t^4WF:XdMR%aH>0pd ƽT\i2`ƮlwFtx`k_ jpvhJ0žӾjTᾄtþ0΢6 `nd,S`0lO,:Ǿ`HȠLdy@Gft<'> l>˅>Pq>z>e>4f2>>s>%Y>х>J>(>8>i>hA>=p=:l7pFpɽX}ٽPA$;8OhxPjVΔml qpC P}D@<G R=8 = ɂ=@=4=8=B>XyD>]>>vħ>>>h>>J>>>°>|>4|>u>kv>`>XA>"2>~.>\/>=ΙP $@9Lt<k P'(@%4sj8нpU˽ҽ٫ < =k<7c>#>W>?6?6D> x>:>7P>m>H= =L=8=$5>pN>>B̊ >Z>Bi>>HU>H>(>>> >z>m>?>+>6>M>Ro>$><*>>h>hp>7#>@_=M> w?>t>x=_==c`哽0Br/½ЊԽc#@) $|im(EH "=0Y`>'>,Y,>(==h=+>@P> `>D&{> >H>2>$Vt>>X>DH>طL>JC>LR2> =>?>>= P&=F!< I:ԩ=@ ݼ ɂ<0(YѼ@8@'L 'I>T{>>e>>Z>**>>0>J>>q>>4ɕ>J>N֔>B>׫>_>@&>.6>|mq>ԇa>6Q>e!>7=[=}<8d@Q;h=݅=rYt(8Y`eK P(8H`L;ॅ<@g<= La=`=i@ʼ;9=h=\5>H> > $>>Xy>>>>Ͳ>L>f>L>I>H>T>f>>_> 8>>H=ft=J<@[zW̋-T{* HPX4 s$ 1̍{}({׻|S=X=H&=X=O== >x^Q>y>M>΋>>"@>A>>du>]n>ri>l>|>v> X>>=@=` VQ'IpR$=(=0;T=`$<<'޽;\xkkH[L Ah`+FH`#M=0=o=@!'sD>;4=8Ģ= c>`V>n1>ʝ>>>>L>>,j>_> K>01>\0>|5>5>SB>DV>9H>5 > V=a3x t H ldL0Zt&{ uٽѽP/DHI:X-_4@4prѽ 6==J>d>2!>>>ë>>>>0X>>r>.>>T>`>Y>h~>p>{>)>(=L=p=8LFzuB8޾t  ʡlB['QZ<-n(݌VX Kx vyW%Ā p848pAXTD[\h[`R߾\5 h%r(21S*b(N 49($(ھ þF,o⏾ qe!0@D Hw0!p@}˽0Ͻcͽ\P+4J}E6" HJqNԔё֢ԙ.i4~۾ؾѾN֮fkÌ*fDly?45hC@7G;6J=l=L<>mg>\u>Xlr>Y>D53>M(>Ժ?>H>>>x 3>̋->\H>\fX>?>,>=0=ҏC!x0iYBJ2ٽiqءE f&< t[4 pPTѺ<֒V>T>jy>R>PK>>->R>>g>>>>˟> >`>Hy=8o=Pb={= *ռ@$a=ԗZnC}՝ -:)<̳SFw:2]6 +=@]=0'=F<==<@N9cyc>(d>JN>$ O>k>=|>V{>x|>F>>Ɔ>8C>8== 1A=ؿVýYսhͽh71n~vþ2ʾX־/˾; 鑾4|0Jtsy:i'@]>=$Q3>f~>>6>܎>>>|>u>>>>\? ?)?>>>>h+z>r>z>^?>(>x>peD>t">=PTL=;בQ< = B>%x>~w>q>$b>$O>*>@F>i=I=8>$>&>,>P?=س=P/=<3=#=4= 04=Ι;>߼\a+P:\CtbQn@A|S\(2c058@ik`׭<(=K>L>> >`Ʈ>>>>BF>X>c>$>v>>P>Ґ>82{>d>d=Y>X;>>x>(=f=4=9=Юz=`H=e< ¼(@H`{4H 5(p ȁνO0 VTh=1=\u>$>pfQ>̐n>(_>4'>= >;>rM>g}>">(p>8A>Dz>Hv>W>^A>06>+>>p>>^{>r>s>l]>gI>=>@)>0x>=t=G<Dc(.5T69UdHD=+>_=>&>t>G>P>pZ>x>>$->v:>Z>(^>>>4>c>\>>:>ӟ>Ȗ>>bK>>W>(!><>F=09:=f=@<)\%1g@0%u`7<`Ӏ=ȏ==8>P>i>%>@>>>>>>lf>Ъ> >>.8>x >6>n>>Pc>R>3>(>> >:>}\>ЊT>L>4T>0y=n  Ƞg.#ϑc} gFgؽpSW:@$ Vt08-0==`>==8P>P~>^>LP>ǹ>+>z]>;>6>b>l|>~>>X>|)>BZ>~к>>}>>tq>0>p S>h>@=< cwižZϾ;jjѾaܾ¹~FjlվBi"ڢ|В S@&ȾzZTbLشY@gX9n;p=RN'iEĽ 9`~p2ʾоBE L,o⩘Zuȿ$о,վ Ҿ3ɾkPWx`ɹ >+=9===,m%>JQ>t><>ȶz>K>t>Ȍ>>hZ$>>+><^2>P>x===8e$8hytp(>{eBŽ0z l&++ iЕ |)1<=$>%H>T>r@>$- >0==U>S>>F>>*>ȗ>£>"ȏ>v>Ї>>>پ>I>>A>J=xH=P#=@n> c>y>r'>>>L>x>8>q>\.>^p>zT>I>fJ>)K>Tl>>7>gW>Hp>G>>`=`===U#>4CM>>>8؛>v>ȟ>>D>Xw>D>̛>j>>x>>Ξ>nb>p6>-><'> w?>ȵm>C>~>%j>=>>Ȍ=u!fpx-ٽ!$Wth͚ N2PnXֽܩ<<=M>!>J>>v>\>N>ȀA>xI>Й@>>9=0̢=P"=@{*<;;B$=`=y=xZ=@T<0@ﴼX! XXT(!dH cj[XEDεq30}R[<<+= ^=Aj=$>=(<5< >< =#>d|>>> >ܰ>f>p>7>2p>d>q>Hr>g>\U>L>\O>XXE>$;>0> >+=d>x==IצiL 4Hjf>H `ap Bǽpp" <==P~>[>M>W>>Đ>L~>Ta>X> l>>I>>H>N]>Y>\>H>>` >X> >B>Zݴ>ֵ>,><h>8> >@=z=P=s==M=J= <;⿽"-(˽u#1= x)X@$<=|,>f>p؆>l>@w>@h>r>'>*>j>(>> >s>G>3>ٌ>Pq>e>?e> w>k>>>w>C>=@=p= կ<q3@ ` :8==ɉ= S4>>>>>>bM>m>ė>ј>fI>`>x*>z'>>%> u>C>>צ>|>z> >}>J>>=M=d=p5Y= ><< << $H` X:bKhqԶ 8-̼e兼SM=p=(=:=@{=>̟Z>,{>|n~>v> >ؗ>.><>䘬>8?> T>y>>v>O>hѴ>>>Z>>0h>>L\>,/>r>L>q=`-`=?< z>0>>=6>)D>@*G>t<>>L>>=P=g=p=$o >\ &>>="1+,HrO,򔾐hwVsL1gI2t9>D70 06_<{=@ >D'>z[>>t>w>c>Y>+e>$ws>q>bp>?>2>(>>(>>>>DhE>.C>C^>l>v>Lh>D)>==(9`ֽkl h7ȁνp^7#й2-6hHPXV+ U̽ 你ܽPxr=v>&<>:o>趞>>>l>k}>8p>$>Df>v>Ώ>~>x+?>X6=ݶ=&=,H&> xL>_>@>VE>i>\ &> =<@vh70TWX X ꁾⒾn%'&+0O2*Rh ½$A=>>TLL>>X>\hr>LSs>r>{>h>"S>Po>~5>>Bi>B>^>ʰ>:>j>x>ʗ>{v>` :>V> >A=HQ=P~=4===H=n=<΋ p@P$tLJR5 νb@H`Ȱ`׼ȭ=U>lU>O>1>bC>N>B===8g= />yG><>؀:>D;>D'>8 >,% >H>$>&>W4>l&>==Rý#8AVfJģ&3y>淑>ꤥ>>>>>Q>\uD>F>t>`==k>,I3>X>.>>j>Y>>>> r= rֆ꥾ R`\@ѽF ýɽ0Cͽx\Xh@mҼP5=X7=v.>TN>l>Yj>T8S>*>D>0l=8N=z= V=M>^> z>ji>f>4O>H>(_>h>bw>>N>Mc>^>gI>(>@=(կ=|n=S=Px=^05h$ӽ0 P-ȁνŽ(&@J9ڏhl<@3M=Y=o>^>ĕ{>Lh>D[>>>:>ٜ>F>H>4q>p22>k==@>(>:>S>\u>މ>^>>~f>,}>x9=$<  @<+=@d5>Dh> >fЍ>>ԃ>">rt><>> >7>>\e> e>>>hO>L>х>4>>x9>J.>s>(H>@'>D>Ь=G=x;`eK0*սm0A3]ܽ9V:iucH-撽Pp=>E>hA>,>J.>E>`Bf>>*>>ص>l>J>>ض>վ>t>~>|>&Ƕ>.>p>ʐ> >>`>>>(B>%>,{>4>@>t>= D=@F<1 XK pA WľJоZվZݾپ`  /p{[8I,PET5,Cd|i ]H2@=Dy ,ЈsKF;P0,H썽0G֑ 2̾̾žTȾɾTȾvq׾L0 p0%F*R(&$&z,R.&)v&U"jV &4#۾v+"?&Юz`]D 6(}x"lHkkZ41:2=`x87'P9Hk}@/x>_Z0\e˾澔{[ .C׾DͨX!זTX<L{sv˅F~x\7િ@<=Э= >X>T==8=(L==HU=>A><>.>o=ȥ=*=D#(0dL=>Ї->O >x=YH!>N >¤>L>>\R>R>v> >s>D(a>j>d(>lj>Th>9>Hv$>N>h=0x=Yq===`,<3Slxj( v9]2n왾ҕF!Ґ f`&px.潤vGiUXTpڽ@]=,j>"/>o>>B>C>>>=7==,><>=hy >ص2>T->H>l#>\1,>J>@D>H>8b= <ǘ3BBRYv%jtVDM l&Ǿξ$@ǾLi̬,<"0<` <=(o?> w>@%>$>H>ș>젋>|V>ʆ>Ћ>T>>o>jW>v>>>>k>!>`A=`|5>T]> ]><,->h`=J= >r5>|M>hT>pM>T>T>S>f>tU>>p0>,x>x.>=n"tZHH@zhຽ @`Rl˚T%`bbJ>tF$;ɽPC]C$H?> I>`Z>_>x 3> B>2>kv>=>4><~>Z>t>>R>8.>ҹ>zZ>>*X>>=L>\@>>> >l>T">8=`=,@@9P޽xh*HUٽj~`^߼%=`V 3;=P=n>g>"@>Ɩ>>aU>>=8==X=!%>Dh>lw>B>T>o>>b״> >~D>0d>ĕG>XN>d>M>T{>8$>I= &!=<ݻY0^`A rPV`* ؑ~@'@ ?=Љ=&!>fb>d>ӑ>>:>M>>@Л>Z>R>v>>>X>>F>X> 0>'>Η>N;>h>an>">== = CV1;p=@ b=@Q< j>ǟ :@(-=Ȍ=`qx=@b=<=<<@[F<g;(=L>,>,>>*>> ?P\??v>^B>:ص>r>>⼞>>ZT>>.>>Rn> >>>֣>,~_>9=!A;I*p񹽠~Z:s\vW831 ܼҖ;V=H =X=>4;> w>>P>d> #>n4>h>t>&A>p>>>ν>Xy>d->T>:Q>">>t>>\>`d>=>>=4 >N.>i,>dl>z=!0kT&`j:nľӾPо;վվf;JǾm¾:D;^f^{DD<Ē 9 8 ]e,Q,tp22:UDh0_zr۽E̾ξtԾϾ`-ƾ˾I۾2|4\u<M.6=ACAjG8^)3S rᄚǾ(tlM@VލTJfN<;M\PWx ½xhVhὐFp{~ !ʾ¾6-=^ Ģt^jx zҕw *-Ҿ:Ჾ$ Lm)ІHZAp/?8Ͻ|,)=FX=D=f=p=^=x:=((==>K>0b>l>,w>@ |>Ho>pg>Q>\">=C===H=З|b>Dr>X|k>>s>>#>>>()>0>>(L>d/z>@}K>@W >z=<}=P==xq=z= =@_ =/Խe=DD7l.{I{tUn9TW<z400!=p=><}>p}>YN>>==~=hY>bC>li>^>n>]>0F@>(!>4>'1>?>4>>`= 웼nC0,7 <_xI~.XW~wگ蒾p?lJG%落XS=З=؃=>T>r><>>v>>֑>">b~>"P>Z>0>X>>6>^> E>n==`` =[}=;=8=X =(s= ==a ؼOP̷ߟ*Z섾ɓP\hE(((Ƚ(娽пZ<=ն=~=h\=t> >x->n9>$K>lb>v>³>ء>Xu>m>i{>I>>D{e>G>m(>9 >0= nm=4=8@vx>cgLl(%P[}8^qfjvl|h,v@J9/:ν2սݽ,=b==X=*>@r>zI>~F>^ٚ>> ~>Th>X|>>>H>i>胦>>u> V>U>H6t>VU>hu>_P>8">p=<خP`0mٽ@5缠wI== =(:L?F`/}h$◅zG 5:>==_=+`3s:>X>졘>^>b֧>V>ȟ>|>m>N>b >>؋>1>˅>an>Ь`> D>L>=h7==H=0=/5==P`y=0sὈ@ ݽ8U`?` d9%0O\Vh/-ҽpҖ;X=z'>_>b> WT>NG>4>q(>+#> ]>2>M>x>nS>jX>!>>.>$> >@^>>@6=`4<=<)=`e>>>">Dy>v>З>ȍ>>x|>c>c>z>?>> >> U>И>pR>hz>5q>L6>D>4=tZ=}<`<` <B$`( yGP<N,p"PNnY h.__p5==D>Xx7>@h>̫>R> >О>t>>5>>>v>t>F>>>8>F>!>>Ѳ>ݦ>~>z2>tp0>d)>X=$> N0B@cv뷼=|pg޽,P_lVľ9޾bdAlv P˾#˾Tݾ| 0׾xƾHcԗDMclh7g@ S <,E=U=PuK=@=<1x)%$yptaDLX#Mz|p0w>:,վzNbP}{И&>l+3e2&8|5Ka+rC쾎l羖_2־j:VX"vL8Ľ TZv`:070~0XνH뽸T #`䆽kxQ\M0jF,\ӾضԺ4ݾNɾ綾 ˣőf$lx`xL찄\T1KqNX<;jw|4>>Y> d>dp>>>>>*>>;e>Tu>X>D[s>/>=d=:= =!rȠ1ܽ iȯ)XAq\P}@ȭTUp"v и%xC[@ KP>e>Yq>>>>8O>F>b>T6>U>~'>8>T->|I>0|>8>Z2>u>$">0=N=`yb[Fؼ@<)q=8=pg=< *QbN(浾,^m>lUq(0ؽXԽ߽@- ȬD0fc=>4>>T[>^>Pd>w>`~>s>vm>_>2>(>H=`!=9Om;6=@J9=<+X\fH".PH[U3FŽH?TKsV#'l`-D=Х==hz=Ј=>X4><>>f>R>P]>>j>>N>>n4>&>”>@Y>J>*_>?>Z[> >D~>]>ئF>O;>Y(>(v=E== <\Y>,7>܄>da>8ց>L,>̉>> >vħ>R>B>>Pk>]j>qG>==PO< H-=5=kC>X>|n>>s>j>j>L>|[>D>z:>w>™>:>y>̫>>.>V>y>M>Q>0>=H.=@g=E=@=l=X==oPPlDrN8NpS`#$6!Pxc8j`qD'/lI$@->H->hA>>4>b >>{ ?FS ??C> > F>9>f>Щ>n>أ>X>Np>|&>ݟ>y>i>~>_>H >R=<I;`;Җ Po1Y@½`ڽ䢽h8 4 <<=#=ն=(^>dH>H%n>>>>>d>>x>nt>p>$b>x/s>Y>>>&>p>T>|M>04->(=+>$>>>=>I>du>ʭ>< o>L6> >x=h=`= =.=x=P =@<nm<w==2>4>I=d=`ϴ<݌<==?==A>v>>:>*>i>^>>q>Z>`>[W>]>Tx> s>,U>yN>S>P;>x>h=ԙt>>\>$k>Xk>M>z|>J>>4>"B>j>(>e>p/>l>7>H >p,>%>(><>D>=\) R cJqf:f9)(¾+ȾhϾk `\< K<"$n((#!FB#ľq؃a#8+@.ȍG}c6pႾNohJ_&|y꽸߽ `(9#DzXp;_ 3Rͼ9Ϊ x%<XC ܿ+q43+.$.'I vr"a#}1\<;9@A6,6@,8- yǽ{} GT@6<KT<$v4b2w`n@z8=,j"Tᚾ⪾6AR쪾LO*8ꮾW: í[ ӷ8Z fd.s=;L==踞=Ȑ=0e=`T=(=.>u@>)K>d>r>8>2>(>x>(N@>=|PL̽ӽ% =2=<9D|Άɦ&W&,q?GG'Ȱ,X4{IHQx-41>H=M=hy=(==2> >Ѧ>ϫ>>'>>r>X>oM>sF>_>e>R>W>|y>m>|y>W#>D=QA=@ < D0˽(9d(8-: 7 0|Ž@H8p@ꄾ<( s\n@Q0~:`W= G =DaAe> zf>tO>TG>~T>LT>H>65>\ >0k=S Q3 B-< =R={}=p@=22<@'Xd"(8 [@LӽX(P^P(ͼ q3PYi9==U>o>K>Z>\>ұ>ʌ>ʭ>³>6ɕ>>"P>F>*>a>ڐ>r>l>J>>v[>\uD>L.@>T}D>)K> >>xJ$>>؏=:А(}ƒ RQ ϑhǽѹh&?@|佽oԖ><>>I(>p > >d!>P [>*>>W>>>>pچ>h;s>?> >0=*p= =Z<=K=`= 7====`Q<\K_hnbiTa,D8 Sv@Uʝ;{=\/>2J>a>^>wI>X>̫>6>y>(>R>_>n>>6/>i><ҁ>o>م>>>>e>K;>>==YЩĽ@&H g+8;hA(+[$d' v漀IЈ:>< U>0> >>NŨ>j>F>>[>F>>!>->/>r> g>]>C>>Y> 1>M=> 6> =[r>>>Ơ>\ɡ>Ї>"u>]>8>(y>V> %O>@k>ӑ>>ѹ>>U>>b_>;>\b> v9>t===#?=^=@|= @>8>Hy==(,=Zh佘d hnz<)q<d;˜;j9 漼 S%< =0k==H;>a>̏a>a>tSe>$fm>@>Ń>`>j>XN>*>0=0=t=`U==H===H=0==!j= c=;=`ǻ=`=@b=`==6=<<$=-=<<`<9=Uu=Qx=q=u=\=P~Q= _=u= =r==> =>W>7^>,mY>I>>.= <s<ِ v ټp;8(н8 ɂ㘾`dm8صɾ26~E@v+%r2@i"澼˾`1оc&R, <˾Nþ,ѯMG00,)h49xF&g*ޏ̚2ʾBl߾@Ѿf;^ھ\xn, eo/ ;쾸ԾV£hN,оjǾ|jJx]p3x7n=x@^ hiPϽ¿)=0=HH$),*SذB8$,J@0Igb ⇌2B8Q,Yo0F M`pGH썽]^νȥĽ0=T >4g?>L0Z>$c>f>0>>Xi=`A=<Nc<]=H >6>E>8)>5=0>{=MR j, 5Ľބ[P#=r<ǼX퓽۽4a@\ż0{#P؞P 8=x=4=>z5>6X>Oo>.>ܣ>`>$>渞>X4>؏>wI>7=s=< 0< C=V=>44>XC >Q= h80|S9c>Jp@ۻm6s{pB齬O4*(;,Bt'нP[5zH:zm`>r>o>m>O4>0K=9=<J<;g<@$=a=8=P=H3='==@]=l>>x>D >(>->k;>)O>(|>>&,>NN>p>J>S>^>>xPr>X>LP><7>t>f==z=><ټp&2:=@]=Hd=M=9<89`i;==hl=d=VJ=p&=<@TL<'=X=F=t>p=`i= 8=&=H;ZƠ)<=M=>=lu >x9>>X}=-=@=->x=R>PN>`=%>hK= SKhHV0' G[>z>db>\">`==#>)>>T><>W==ȁ=@,=!==l= 3[= <+p($>>0Z=`n=05=<Q;@0<====4f2>0O>T>@N> C>

p]>Ь`>`>7^>D8Z>Ĺm>Hhy> p>DV>+> >\/>`>s==0==ҿ=±=X=<`0yh|(ܽ0μ@#;1=K=?= =v:@c?<@Nm= /=8Ģ=yG=9<; F==Bw>^>Pջ>d>.>l>8>>>>j7>j>׽> >>&>>Y>>(L>U>(_>c><d; <$#;=(>=`=T0@YxֽHνRc9!LphH썽hx99@we<1= TZ=@F=@EY`PGs@#<`T=38>Qx>´>Fw>l>ȶz> W>(X>>`>(>H>pA>۟>՘>m>0.>p0>8>===@=hZ=Ƅ=<=4:z8 C#+L/4),)d /ɽֽ̙ $|06k*к?PWAjn-R8qpXpֽHE཈DSL_uL|ė"B¤DE`p!Y>ξb㾬1޾HL BE~3(-yJ1jA꾚4#NsoMܾ̾f®Ftx҆ttj0xBI8˜qP]VXVn.HPBl穾\ɡ~qA򬄾^}\兾ʮHξ@ѾPȾ/Ⱦ Cf|6@jވ{ZP7$(! b <(|8ʽ᤼<&<C$;^=xQ=T>ȥ==h=PH=Փ<׺q3l7<;b<"<i<ݼXXD#1`igp[x uٽ@Ƚ`ȗNý =KfT\@X02Yս 2ν90̢ǃ`#<O=i>x)>P`E>U>R>2>&>^> >h}=7ԧS>:>hy >`= = ==h=\ &>\A>\0>h====Zb=/5;2\p N-(n'~P/мp [h6$[@6.%P)rH멽^3>`6%(սy<=)>x>>ދ>>r>x>>>)>җ>>>((>X}>tz>̼>j4>>2>_>>pU=3=@=@;$ٽP-@F<D=D=P5=a<@o~_T; <>n<>DF9>c>ҋ>*>g>h(S>t->t.2>tP>d>3}>ΐ>DV>ߖ>>r>`>v>>6>l>r<>5 >Й=D==>TA><>%>=PG=+ѽ0ɽܽh(Ͻ8hqd!(<-#*N`&X`ݼo;Х===d(>?I>p>Tѡ>C> >޸> >F>b>s>p>>}>h>D7> >=>1/>d_1>%>܍ >=7e=:Ƽ` l`,"& +H@=Ҹ-.ؽpq Pzt==h=8=y>p22>8;>0O>p}>[>4 >.h><>Fd>)>4̼>6e>>>v/>:>@Ѩ>>S>O#>s=X==ķ===J=P:=@J9=@>>E>>u>>>#>>6.>~>z>>e>Hb>8!u>.>w>\UR>@*>$>W=hH=з=@ӎ=ЪF=y,< .S F<q=P=P =WI<;;*=p=8>$5>8P>Z>FX>$vf>>;>>:>&>>*n>*>>>r>$i>_>7v>PԔ>F>>>Z>z>p >o$> >U> >T)>>f>>>v>>P=>?>4>6>H>\4>m=`=(:ԼlPkFʽ0}TT%3PntuۦVᴾ8ɾb۾b 2X\񾚖־FEƾ.iVkRx.<~sP0*$p P,ڽ@^+Gov;}z ڋᑾ^GAFpP D    =j=(£ dQվ6!۾0';bо +Ž`WPVft &pAp%E>߼/%X轐OwrlȏǾؾ2侨J0þ"|6TJ̾yվԾ|̾þ߲f|@qd:`ڽ V`w=@L=>D>==| >L.>M=>;P>|g>x>|>0:{>X7z>Xw>B> >>y>7>T7>` >==<[:νh'^0y8-Rl]J١r虾0U6a@*{R\?L7>@h>>ׂ>pc>Y>xPr>>T>>>r`>JƁ>8wl>P+M>1>d>] >==6== <@ ռ2!OHŽĽh@jUh,;9| 2Ls >h@8 R<1===oB>q>W>>>$p>Y>?>x:>z2>^.>@5>,k?>pP>W>L>l/>H>C== [P>,p>6>!>n>>rr>Կ>>v>L>>R>Z >b>L>:>>=;=C<}< 0<MR! d<԰<|pT؃ A:\6$ XֽxmM@Ǽ =L=<@=Ы=+>f>V5>l߭>R>06>b>^ >L>,>"e>(>˲>R>>|>>j8>j>w>ڰ>>@<+t:h7½8 d6H]b,oǟbfP!%.$,<=HN>>2>L>>D>J>䨥>>䨥>\>"A>l>>d>{>l$>x>b>s>A>@==`Y< K`ý8H. x𯑽p"5]ʼn~~#T8S( V>8x>Vϡ>D>T> ?2?>g>X&>>K>bq>tb>Nb>N>2G>V'>>T>>=>= tL=2=Qx=0=D2 >>~>=Po=y,<^߽>v #i8=3`Rয়A>ڞ>$>:>>Vz>^B>Z>:@>>n> >>ி> >P>Wv>d;?>>$>8U=pc=E=<E==t=T=?=q=>h=`=<*`= }@0P ;ȥ= >=>@]Y>@u>(9>A>Dd> T-><>t>X7>4X>~V>>->2z>>v>>>`=>?e>D7M>_>VU>j>l>x;8> >=P==R@HS?>2<>+>T'>Yj>2̢>>B>>B>>æ>Y>̜3>=R=0=M= d=@=$ ȼP`ƮXܽXL-Xk Tᾄ$`,#g'K# qr'B:$龆/Ҿ,LRy*C!G#,1<.Y(#\GK*7؁GHaXˇ$@ǾѾqо&վSԾHξTξҾV](m 9< Nk"0 m$ 7Hi.9ĵӾd]4t<\] 22!x&>=ܽ= ޼=8=<K: `q8w9,prN`o2^i>󀾖Ɍb۷f\lȾپj⾬پ𠿾ٟ:`g4!AͽQPaAx c@h)c ӕh=<*>H=>8>HB>y{>k>bM>>>Tk> f>H>$I>m=` :=<!A;f̻ෑ< <@"9ĽXf$'lfxZJ.6Ȏjyɾ$Ⱦşډrк?Ѳ`k* `_`pH5g>c>>∙>>X>>r>>>fj> p>dq>@k>XJ>:>x>=0%=l<+biʸ@we< =`@@H   ~ෑ/5;zhj>,:G>g>y>>>><.{>E>P?=`=p{6߽xȌK܍ <x ˾wܾ**ξ g o`~v-cEDd(@yQ\ ]k=X=l">`3>x>z>y>4>> ><>X>Ӥ> 3>>~>pg>h>ք>>>A>$b>\0>舳= ]=2==<%=`ϼPUYؽpQ) {F.m@ƼhI51-pXΙH`=*>M>m{>H>T6>h>>D3>(Օ>>^>8>d >>?G?>>Ҙ>B>~>>z>~w>e>إ9>P>= =zw-DTh ,BpN[4`; Ѝ*&+P-(<-`p7L4D ɽv @uPO ;<Β=<)>E>|~w>xJ>&>>쳫>ο>>zo><>m>DX>>D{>.&>Ӝ>>tz>S>b >=xn> >=du=Z;X48@8OF>P0 Bq꽸ؽ0X8df< =$>>+>2>cP>b~>,Ј>r>Ze>> >h>Z>#>~>><?n>>>>>f>>> ̖>3^>f<>4C>a>^׀>>>{P>Ē >J>x=P0ս|&2qt6,佀ؽֽ؄n4`G;`G<=x=|8E>Y>> w>v>*>w>^>l>6>l&>—>>H>Ͼ>֓>0~>D4>|>3== >_T>B>6>х>4H>>=@¼^ѝ@@G ;P=== > >G>\==0=K=e==@=H#>{4>>=ܟ>Y>,> >d>x> >V>|H> >X=p-=!==:>8[>T>T:9>T>I= MP>*}>u>Ơ>1>6q>:>=+=<w x:@Ff U;l7*+wɽzJQØnDž$Jj }#  c" x' (9꾊ԾLtƧ϶0xtŚ윾x(3v8OF$5-?4pz늾qߝ:_5þ0־:ξiؗòrȧꪾ]ڣӾ,4Q(N v`jミ[-Ⱦ%ʾپxԾYB4tS ph<Y=8;=`=f>U>xg>dt>΄>f'>>˝>>|>'> = pۜp<=dK>hI>(>` >؍=t;`@PWl\2mT&@[N:#s>j>>A>Hp>:w>)>G>>͌>Dޔ> T>m>8;>==Х=*=Q= }==Y=m=-=pgL)|Om^xDx>(P~Q X`hZ`&qꁻ<0P=~C= <0=<@@<@k< <== =И3>lA> <>8>X=( >=zb<`<Px@ b`0pw$e@(--Ҽ tLس̽le9t`ipȍkT|7dh@ !/1h{W%Kp۽`=$v<x&>`e>|ϓ>t`>ր>f>J.>>$>>>?>'>pZ>(:>+>0<><)>Pu=>W>>!=<=J=pŚ=<`d>^mн00x=ҽ)<,7= ==)4`a ==>̎T>TO>$e`>< b>O>Xd>ԃ>xÚ>>\>h>d>46{>>>L>8>rq>x>;>|y>==>>|>=` <ȃ<9)أS`ֽZ۽(½T` 8Ľ`o^j,Xӽ(rG }&P[8=%>t>(a=ɝ=X=9>XzQ>G>X>a>@i>z8>\>dԧ>>>lN>8*>>PH>,E>d} >>=0=@l==`K`z` ;fU<;0@jq x Bǽhpo`䆽;===>d>U>x>_>\DL>Zw>>>> >2>a>*>>F>߯>Գ>&>>P>r> >>h$>DO> >x> >`mD=F=i=>̾?>%>X==i=1=Qj==@j+=([>6>`P>pt>$=>T}>8P>lf>lZ>D}>ka>۟>h>>Z>>D3>r>>>>`>q>Ho>a>===pG=p>h->x> >\6>9>|=Y=>8= =(=PŨ= =@*==d;>U=>+>Pj>q>J>B>@Л>Ӄ>Y>Ph>J>rT>DW>b5>(>%>Hr>\ge>$\>PC>=||)>>==4@9/9CHN<=g=PH=ꁻ00eAs0D`֍[;*h;C`A ==07=y== >;=>Wh>PG>ܟ>l>p>F>~>tŚ>.>.>0>H=8N=F<=< 5=y;`%gxP۽}\X6UZf*< վžXWKľ&N`pRHu¾=~ 乑ZB%KH=(pLؽI|-8Nj~L~fҩNMJb哾㹾<_پFZzX Jh z:R"`A8SH;׾PԮTd?dux $_E:Xi6(Ƚ,tVs-" DVC+ $@b>~ЊTqdZt~WľN$6v߾B׾TY&PJhZHpڽ@~ؽ`½*9<6=9='=s=(=a3>lV>]>0e>q>}t>(,4>a!>8>6>XO>>F>>>W>TG>E>|# >X#="<708l c4n'#x?t\,`_վ:ʝҥDj> /h [=Ҹ=.>s> ܏>G> >h=7==&=`=ĥ@>"_>ؒM>pN>^>g>^>|@>>===!= ==S^`9xtyXj@WL<j齸⸽`Ƚ'׽#7WTPڼ==,>p>>Jه>g}>x?l>D><]>>M>V[>=> > =2=$,>X=X=p=_= <@TLЮzý8AP XAXd@_P:jHžqs>p`S޾m]n}NhWsc$0le==j=*>S>Z>xw>p>B>>n>r>>@>h9>L->>s>`"><>/===w=薒=`>`=@7(½b9stTp?%pCأSoo/##=ӷ==|z>>J>>қ>Z > ~>Jؔ>>>> >t>r? ?#?$>T> #> E>>JP>>">F>>s>RQ><>=*=@~<::ƠpHA8!`tF`0O>9>T$>r/>⻫>>N>>,>>>ɲ>&>>^r>3>y>s>hq>4v>\>,V>Aj>Pk>25>=pt?彈%HvXDDؙ K܁{R_l %hνȾP[HX=9>,>E>)>|mq>(ĩ>ֶ>>?>?$?޽?d?f ??K? ?fH?I?`>>>]>>|mq>`>`N+>==8e=>=z=ِg{?8>@>`r>>L>\>Q>x+>>>m>0>B\>~I>>߯>N>0y>>S>J>tb>>>^c>n>>l/>=`<=HxDHS"@(;-7@(W==Xl=Hu>_>p>n>3b>w>t>r>Vj>v>>N>>0'>>:r>h&>>(>>H>i>^.>(_F>J>m>:>h>x>ķ=0k=@<׽X&Ha bz@~\A&k2F5 ]r?Vh"-?P @Z@=4>sP>)>Щ>^>dn>`_>>+>H>_>dg>hπ>>]>>'>.>_>E>F>(:>Y=x=P-!L $(k X|k敟Vоb PEd :ؾtb뾢X׾$Ͼ)Ⱦ*阾tvlp`w!6̩\P T-h`;T 8񽈦q\SԽ+0O,lc䣾ʬ䪾X辛! ()`3AԸ?r;0xju$(x)%". HƾםfphT^J 70B ^ýnxK<"XyPXhx(彴5 0<qS\DL ΋.%TѾZ9f0Fپ((,徸l޾ޥpNQ78Jp 1 ==8==@>*>>>.>P]>Fw>,\S>2>8>!/>-D>^C>)>b>o>>i>)>L>|A>/>HU=m;O4æ޾fw.p׃(=nJP]h%_P[Y@]L\B$ (LWI<0"=ЊT=`=Q<= =O'>!>H>>r>8>>@=L===1>]>]>8O>>>2>x==Mز ` 4hx_޽8-s ޽TxBE/P)F!∽ 3۽˽0]@$b9>?> yY><-n>?>+>AK>G>~>L>8=>|>m=p-=:<ڣ=[=&=P=< xBν$>JULN,lfqZb,(O2-Ľࢿ@/@<=b= === ӕI<`O>`M>> ˣ>h>>m>R>&<>` >&=z=<Q<P@@## ` pSJhHOPG`ּ@d><C+>l:>|:_>`>Ld>`]>E>L>̐n>>.>>>R>>>L >>/>Pse> Da>s>z[>K>l:>3>r>=@<@[З HV𡲽閽Xh B*:_^=@J=;PW==T >n5>4;>L>;v>2v>q>%>Ԃ >2>-R>xn>Ь`>>>4>@^f>x>\U>>&>0$4>^G>HV>,>>0=p0=`=xq====@=J=@BHDӽij$xxL]]<;f=== k=o=(;;\;H1= 6>LSs>Ӊ>̲z>eN> ><=D>N{>Ģ>Y>>>>%>̟>S>> %>`>Ѥ>!>=>>0=F<-pp?lq\ã; 4<ѻ3#藽;PW=(t=l.>Z<>o4>da>iq>?b>a>5>н=Hݡ=x׭=k=|5>>R>x>>x]>J>>>>/>>>ht>71>H=`=g= >SB>B>\I>Ȥg>F>=P[=x}=Ι=H̛=05=f=@3M=݌=jp=0\==p=`=$>o>e>Rp>s}>X}>> >L>oz>fр>>@}K>@)>7>M=><[>>f'>|>4>>m>HU>9>`d==v= ===`=7.=\[P #F\Z ?p `>(x=|:>XO>F>$*>0 >=F. n=h= =܍ >9>m{>(>@u>H>X5,> =`@=}=@=\<ʻ'<O'=#=N<-Ҽ_0ս}Ц %lP̍{Z$\}ٽo½@i!Hs1XkQm!Դ%H7*-8aY">7>OB>Ȍ>pp=+<̼XX%4 `н`ǻL;YHlg*>8>$uY>#W>\>pA=@H<` =S;Җ@=;<jq"2`o8B>sF>i/>(#>&$>L?>؀>T& >DE,>\<>M>0">H?=U!=(;;+fOPx>>hn>?> \=LW B$ LýJGK*=7=P=o4r>̠>>>&O>'>>*'>3}>\i>f>oP>=A>HA,>آ>>l">`>1>=H>T>@H>mU>di>a\>9>h>>= T lv+⽈撽H.p4FýX̔M<=%>z>>>~͓>p>4>t>>>>>P>c>l>r>>l>>>S>:>>@o>$c>@%>%>J>e>H5> >QA=BP:@Hyp"Q6]U\!iXP?z@j`<< D=@b2=@h2J>~>d>>A>>m>>0>.>|l0>PN2> O>/>җ>>>b>w}>h<>%==@0>zT>(a`>(q>0>3>l><: >="2= D>fр>fњ>> u>"S>f>>>,>>=>lj>r>D>VG>T>X>Ԑ>xZ>7>>K>j>(L>4>Pջ>4>|'> >(=Y`OxLEkh'F8Nrٝf$< =4=@h=Ȍ>T:>hl7>`6>L>ދ>s>2̢> B>&>5>>:>B><>><>,>N>u>ڣ>`>>>>D!>E>H>?>\29>tq=>@>\\>Q>*>=@ <@7`e84xy܀nܾDphVԂ ॽ0e@]<ۻ%ټmJ==`>L>]>>6>,>o>>>m>fJ>>XjX>?>TW>`=6==!>̿L>]>Ќn>&~>k>s4>4u>`+>-=yսԅGpV8jކct4c\5fXaTG?ɽ@u˼^<@7=k=( >=<|)<}=;p>_ȐER U;\<$nǽH򽸇H" D$} 6ˑVLq]>*ǾFd (f-/)N+&$ j# ҇ᾤ)H޾FZ۾,䵾&*(|$@TLHbЈ:v]$xfJlbTA.+4"P]d`+dުǾ|R [ 2*PL%آT#)$TKrB߾ľ[~3kaX29ǽ肽,7)>h=<==V.=w==j==f`bich"A&ؾ< $҅䅌0vaG%0V9YZ@#T$&`<˽mY кU=Ȑ:>ȥt>Ԗ>>v>X>$V>LJ>3>=0'=C=P}=0Y,=8= =(d=(=8D=:~=1޽7@`&t<`qPJ2_6 T(8zr kc4x@6Pw@u˼"==0/>!Y>>j>ǘ>f>TH>>H>==Y>d>{>2>8=PTL= R0B=K==\>=0D=`8Ƽ?1p<ը|B8.0"ʥX#s¾fоlݾJCfKҾlyRZr.H횽@,`eK=Z=t.>>@>h=+= =\|=%Y=σ=PK=8w=H=X>&>{I>{>>>(d>t@E><>T=Ƅս SȽ8,0'#@W䈾&ŜV\j_[xG4xp3?@Oz=0V>I>$}>{>>>M>pg>$r2>hK8>M>\u>$>W>o> >ĥ>$>A>f>T>D>> >ր>pa> E>8>le>l>T4>O>Ϧ=J=8-; 愽`½01u! @(ʽOHݡ6/<=>?[>J >P>n>>j>}>س>Dx>v>>J0>^>>>b>.>ă>& >(>x>h>J>l͚>,> _>?>=>>Xv>"$>@=?`>Eq>()>ɣ>x>0>}> y>4v>wh>x>x>s>L<>6>l>z>tb>ی>8b>T>T>x>\C>$>I=70o>>V>̛>ؒ>ʰ>[>>>@>8>.><_><>$>j{>:>p>>M>pZ>K>V>/I>tP>>DV>d>+e>0$4>0ʈ=tS;(~^^؍8x 7H`]===Hv=>0H>Pn>80a>M:>,[F>r>Җ>>Xy>ͫ>>0>>?>>Э>>t>9>>X>Ѧ>l>X>> B>h>>+^>\Q>0^=x=X=`μGW8p̽ "\Å^`8N<wX]h(`躽`@<`!3="w=ɤ=J==@=L=pB=4>}Y>X>>>^>d>`Հ>xH>>81=M=邻@]<л=/>)>#W>z> WT>=@5}P}80804X02ǽpнxؽ\&U=hlᆰE~'pCd Ծ2VޞZNF?#)p_}=Pn==&=ЦH%P|`<0i=3i=<0_z=@=c>T>@93>M>E>h=p j\Vt&~ Θ撾g`H9DTl: 0~߽u1ӣx{ڽ@mҼ(==,>8]>$\>eN>{B>>= =0X===X=`=8==~==P==@&+LP`<(ni䐾 H[ Bt-% ~pPZ08BqNF < 7=#=D >]:>TP>x+?>2>]:>e>>+=L>3>Y>=< )yǼ<=Hx>>}>f>>=`==,ko䗾v*Jl-TH:设ЇRl㫾Z{\b$`. Ⱥܞ>Dx > %>PB>4!A>X:>sB>!>Ō=@e<==m= =;;89`Ç_밽n|78t ZJC(<- ܩ  ˼1<0i===>]3>T[>5x>tt>ܲs>u>\\> R>|u> >ʰ>`>>>~g>/>>D>6A>α>hI>hZ>e>>¶>`>D>ij>_B>$>n=Ш,=0J9a*pgɽRǽP 轜Q`Ç<=pm== >:5> 9>F>LU>>0y>>\>J>`>P>O>>>֙>>&>>x> >b>`.>^c>޿>P>.>C>>~M>=D>,;>@=g><ҁ>&M>a>>>ƙ>>pg>T>w>[>>Ը>>/>(?>>Q>>>d/z>0P>#>V=,m>D>>A>)>6>w> >r>:>\T>?>@>D4>W>%>\@>i>>>R>>>:>>{>Ơ>xU>X=ܼ SvTi ^h0vJU<<<Dh=E=<<*== i,=_=8ځ=b=>=>0e>"ȏ>24>ɲ>ު>2>[>ڲ>跫>>Lb>N`>•>t>>^>>4>xo>>4>>>LA`>C1>o=U;ٽx)X郾*pDy8v@o~fe 3b(+[VJM("4|-%~ 4 ;E i===>.J>xZ>@>> q=-Ľxݽ0j8.=lB>">m>>>V>)>Lq>Tk1>ȶ=xy=@!`pL)d;Y nj4@A!ꪾӲ}Fܔyt;4đXx7J̊ proDg80GMa6LHcPHϽP{@뀼`TX{U/hjQXEY^ QR);5۾8B$|& 1.0@*(1" X] 'x,/(*8ڱ?ejRB BKhGY/xp)i`z<צ! <=ȶ=̉>(>=8<x'hK(~L@ɾd,ӾʎԾE׾ecRYU*Z7J*V6վ־žH&XOXt`䆽@ k<` =Җ*ս'޽ n5 r=8=J>,>J>->$>Z>>C>>>bš>Qc>>==Aܼmિl0){a=4j¾4ξ$־D%ԾӾ#ҾFȾ|I˾;@kd3nb0F᤼ <@|=8">l@>0V>2X>,> A>>G>@>,Z9>>F!>>>$>:>B>>Dε>>xF>ؠ= 00ȽM +,/d{ ,j2h&D# Oɤl3~+빾>ξʾB͎S3ꈽ߼ =藟=@=>2>H> 3.>x>2> ====(> i>Z >,>R*>j>*ӕ>>sv> 6>i>4=.6;Hʁѽh&fh(Ӿ ݾTB޾ѾǾ4jxžǾ Yt`"I==p܆=o=xl=z==@8=$>}`>.>Ă>@>#>^>ž>>I>_>U>f>~>:$>HB=p=<:Pm˽L +t.@n 0^rj*&8P,ڽ SM <=>pA>r>d(>>l>v;>>.>\e>#>n>_>?%??6.?F ??hK> >>>l3>8>\N>;>|I>>>0y=5K>m>n>̪>>A>"c>> >"S>n>??l???Ι??R??= ?V>d>x>4.>=d?s>&p>>zK>>_>D>v>8>> ? ?RZ? ??>>K>>>>Ġ>Fۇ>`>Dg>=`=<Ѕ見0v :<0_ < H6-ݾ0y(()60ѽV<=`>߫>(>>B>\">:>>>\V>@>%>z>?N>P>> f ?2??Z?^?ҷ ?I>K>>E6>8=@s1< ؀o^ZG@|W*P A<]h}qgR =x:ET r=X=(==0z+>`s^>ϑ>L>>V>r>>>y>x>^?r ?@?J?2?:?>>~>ņ>>4yR>x>Ȟ>p7=,=0=ˣŽ 51\BWrjFhþМ뾂# )쾔ܾZf"aY |@N=`->q>^>$$>K= R= կ<=j'>Du>ϟ>>>>/>*>>s>Z>L,>hV>>Y=r=n= =o8 ⽀.l]|n6-,Isg W 侸ϑ늾[lnġ Zri~8gG @):@13<0=` S>Lh>,><>(=HE^TPQ^`| HþپHh].z$m&['e d'.f8SvDYU:2`=H:><J=u>U>z>I>>Q>> >h(>a>~>> >4t>iU>ġ >7=H=P&==N;]~my\Ԕ:¾5˾$˾,\Ӿ:P {^ Ѿ2x}@ = S>\"@>@>$1A>S>-K>sF>fj>2T>>;>\>|%>>K>`>pt>>i> >U=-Ҽp` ^M< =ؐ=A=@5g<(㎽xJ$z̾D־ݾ߾hJ߾۾^;*t?8H#@1<=`=X>>_>~=p='==X>h]>݅>>p>W>_>8>|F>X}x>hl7>D">H=<4"XRý$iV+4慦~@k2/ɾ:۾4&6wxྲž R`۽0Hze<^<<L<@F<=L>䇦>pf>n>\V>><>~j>">>>|>ދ>La>41>x=`+F=x:=k>>`=a=I;48(Ƚ4(=m>x.>ij>->0>h>l>>>HF>>Ω?tM ? ?i?>G>>>t>]>r>o>>`?>:+>8s8>=J=,>,B>;B>3I>Xa>p#z>*Z>8>f> >P,>>f,>>? ?y ?X?d?>g>x>2>O>>pwW>5>)= q=N<$<0y(x7^b{*{ͅ4@xHht 3tݶ@ U๫,V>J>L->|Y>>J>P>>t>N>D{>@Z>>>>>>4>D>bo>>f> 2N>+>>=>`0>]>X3= ;P\ŽM"r߫s`R,z+<(,)qy,=7'>+*>8>oF>ly=>x@>dc>6~>>X>>>">'>f~>ԕ>I>;>??ҷ ?.?D>>p>>>4>=]=r[=H= f= 1 >$>>` > =@0=j<ã0!ᲽRhOXV+DPEKї;=0]= => />MD>Ѝ{>>>v> >>B>M>B?D? >V>>Tm>h|>>n>8h>T}D>,> >j=x=І=Hʁ=e!=2<ِAx 作M 0poڗY,,Z&ϑR~[B뽠A^0XL`E=1 /<@=LV>s>װ>쐬>v>>Ճ>>Zt>m>4~>V>;>0">R=Pq=Z=KTýPֽL:5t6U/<(-L)1I=2kB{JȵžᾐJB>׾a¾V†`s^NԅG8EdTnP hx+? }ෑ{I>< b>P:>J>DW>>h>s>s>|>>pH>X'>5 >=H=X=Ц=gL%6,)ALIx|(DƾɾV%dXl` ɽPա !P9,@I+h۽ȿH񽐯X퓽*9@ =C=8> >PaR> >j>z>|>j=;И;\ =щ=='*>hj>L>d>=pغ<~$kFS4PPWtd|P 2!4.ٽ(hIuP:HN4v0{lؓZ\V F@!;P;=(=+>8j> >q>{>$tL>h=y`[2ϻ;13; Q3𰞽 ڽH`$" #bㅾnۓ@fjpb)p8ѽ|ӽ뽰(xj K<u0jf3j Q?I>$W>s>>故>_>!> ='=8R=`/= Ͷ=$>pS>xMK>V>%Y>7>@>=@ =<@!<dPu`{+XJ:=P>+>|>= <@8Ƽ4S!|'Wf= >^@>nm>Ӊ>:Վ>"a>>|>>e>|>'>t>>湫>>q>P>>\ >ȗ>4>~>>Dž>>$y>@)>@,a=Ȼ[ͽd8=>uc> >8xy>m>^>H>.<>T>`l7= ;I>D7>8d>_>K>\V_>>{>^/>y>J>ȴ`>]=>N>IJ>>3*>d0>S>ȡ@>/>G >= >= <`Ԕ<=pUK=D=8=pD==B=.=pr==F=8p=!=`=P=pa=8=؟= ە=`b=(====`==x>h)>S>\>vi>D>>>pw>x>„>>ʐ>ʯ>> >vՓ>@U>@>=<; <` :=i=`S="= >E/>L> k>>x\>>L>8>L>>R>>8=bw={F=@R<3=h=+b=8=0=.>;1>l]>pp>T*t>>?>l>H=Ȍ=W=]== >8dL>故>̉> >d>֒>>> j>06G>|> 3===$>>> D> V>Pc>;W>A>>>4g?>$0>(=ʱ=ǘ===tu===d6>R>\V>d>]>@;M>!>b=h=Ѳ=A=x'=HS= 2>T(Z>L>J>>6J>>˾=D0=`j=0.=@i>@+=P= 2N ^,j^Sl3?T{*f xj9GW<@#< ]༠#1p=R&٫ދpÀVHxJ4jԽ˾vko<F@(o`ɽL ",0CF 7fH{'X%g8bfRpH?<70xEdqxNŨ᾵iL: F6T9ɾlݭ8r:ů,:>ľS֏b),r8VX7zQ<4 Bx罰ؽ RQ舾ܪ8ξ ޾ؾB-`O8h\0ȽRd ,t!dA4|N皾B;$վeVȠgTH(;1jx71(`: ȾӾFXPܾF׾˾ڲJX8=3IܽSإ}0(REU4TS4V7`'нH>9@d><<=<}(p3йҽȤ t'h)H4@>7|S`@}О=PԔ=n=> =0=Z`@3ͼ5vd;=@g<` `¼X(>d>>p >0k=`J+= <;@㰽x0o½xY4)6 c`K;|p.F26ChhP 5u=p==l)=@0`Xe뷼 < SM==*=.Q=9=<[==/>[T>9>>=P `,^X+0B &Do8a0B8 ؒMڄǑn&rq(^E4c?4Z'H<)HHRPF@s1@-nX͡Ȍ=x=x=!=;>Є>(=A=`=`7MF.[ٻ B=Ơ="=(=M >6=Pk=[<&001y␾nɀE ̩a @`070[Fp^QI;a=k=T >X > ==07=蕅=!=P>B5>\> $>>>.>ޭ>l>>P==s=,}>=>dT>`c>(ss>ʄ>Ĩg> $>=c#=J<h;N;F<@c<` =P{=@G=c=`=(==U=؄=,> ]>ͅ>>~>HC>>'===KT>_>>^>|>U>>>>dq>f>^>@>Ϊ>M>P:>~E> >>>4o>`M>00>*>>0=P=9='=6/< @轌{P ;pb=<>">V>z=$=X=s>> B>n>p>*Ԣ>$P>2>޿>>>k>>>^ >Bz>pʧ>>>p>t/s>c> x>La>h)>[=4=`;Ƽ@ּ2=Pٽ ƽ 웽 Q3޻9<.>Q>6p>;>&`>P>rC>? ??q?>pS>>>L>֣>v>>Zt>}c>U>p&>>5=>!>`==6=< ټ;bٽ8a%aUuy̲z 2U&$\.#;@=C>b>8v>v>p>i(>0=p>@{1>n>RҔ>>DX>2>)>~j>I>>~>T>*>V>7>XE>dJ>T>9>D>8+>>{>>>=l7T0PȽ`P@ε:<@"<(`P'(ȑǽ7ȝ@U?B; = )>>F>r>6> >H>=@Pξ|klþĬn0ڋHcĽRB"@;`&= v=8===ƒ=ͽ==`==0|=^=u>Z5>xLO>ZC>2>>0z== ȿpAZ0]`(KͽP``>XT8tEt-XMAcܯL3RpHt b$ d/P/мT=<>I>P>>~>>>ڠ>>YU>-6>f>==[}<@;===@== A==SDeb^޾;$t̾sG[.C'L-YoPD*󇾄Uk;Px`8>(<O;<<==>(O>e>,}R>/*>>=<@<]D=` =<==d>h3>HQ>`#>= Ux0~ԾҾʾ DǾ촸<|^r{dbȏ- A A`M9l"9~-[;l=t>,B>%Y>pwW>X$Z> B>2>8=[}==a=>L>>nj>>>>p"m>.>(=ȭ<1x~C8|:NQj[(Dl"І &<,PFQ]YqD4Xߴ𯑽xps#b<=D>+>a>.ߎ>: >/>\>ڱ>ܞ>@b>@lE>@Q>P>>ǣ>>> >>P<>#>ٟ>F>Vb>%>l>q=dQ><=&<=k"=C=`<>>a>>l>4>+>>t>d>>>Қ>H>|>q>$>>`/>Vѻ>><><)>k>>I>_h>)>=Y=O;Ϙ=K` l靽Xز+h't` Te/c1R>u>>p>>H>a>ϣ>d>գ>>v>`>m>z>@8>%>,(>⪥>xm>d>ˊ>dN_>|=@*=;p ;[};)qt}>\A>>Ɛ>>`>>>>3>>^>T(>?>>d_>y>Rӻ>x>>E>ʒ>I> >>>L >>^w>,>=?0ィ @'y,߽ܾzl X佀r9A=Y= =]I@/=X=h>\M>W>Z>ȑ{>@z>RZ>>ߖ>fk>>I>>=>>P>n">\e>>v >><=>>x=dmk＀A%(ڽj:l=^ >T;>0$4>X-> >=8d< >PI; =4>+>:>H5=====0>%>>`=]= ][쐾Ğz4Yh7Tξ~;;þ޿):ohx(,f\*pv\KT,pкн|3B#5 ƽ`𬽜'J*wξ>վ+о.8Ǿ˾n"Ӿپyܾ:־uǾؐXGsKW+t>_+>䮾dԾ|ھʾ5[T==>p=PG= Ҽ0Y,Xudwξ, 5H jھ2e4ƾGl&ʋDx>ӽPko4 S;@ `&< KT PPԔɼ@ʁx]>v>Ԉn>Hq>o>4H>>(==pS=#<ٝзDH$pzXZ0(0h½`ǻPYpb]jpLzZ.\aڽSP\E==ߘ=c= _= =@\8>B>.>PJ=7.P xS4QjG"9 x!)R~ۑr둾M4vXn܀nW5(Y;d.ٽhˀ¼q`͚4w>>2ݎ> e>P =Z;@To<~ڱƾ^ݾ6ʾײN>.y>j>Td>X">=[= <IߑPIH``ʽH8K8%WB1xк8}F>>N> Q> FG>b>ȶz>po>8>0=x =Dx >+>=>|`>t|>ʊ>,>j>v>^>>5> >x@y>>t>[>`)>f>`=E=p3=P<J>> Yg>03 >8==@j==/>L>}>N>ܰ>j>좥>[>L>6>%>'>\>|I>$q>=>d>>>>M>Rk>By> >W>h>>6>0Y`>%>x >p==>z=}=u= U<>߼%ټ(l3 >`>4C> \>x>*>^>\R>>2!>8^>2>\'>Dy>L>+>,KM>^p>v>>K>|>>b>>>>"X>=0x=<֒e>L>H >x'>,m%>'>|$>=ps=H=؟=Ȯ=i= d&>XN>\%g>>B> >z><]>\V_>HE`>O>S>u\>E>\t7>1>``>>XzQ>4O>`T>cM>h:>>̙>>dn>ڸ>J>ri>L> =Pu$ BǽT<l;Ƅ`IP"> >=W=v=y=>e!>؀:>P><>@>h$>==>>X4>$04>(pL>to>tbQ>d->t->؀:>(,h>>>[>0>ŭ>H>q>> f=< .=x=`w=*=@=p&=1j@,𞋽@`ݽ@Nͽ\ae;`?<`<∻~@ H $o4CMH-8SƽƼ":<`=?5h:d/xp|`fXa\+* R0`=)q=3#="<+X!3(y엾ZʔFx7 ._4 0_ dUʞLT|[¾aվ^s2RMzӾ{h1|4\I X\dXNASv0k<< _=H=eg=ЊT==@.h`2- r@\̛Ԕi`]) c;[}\N t e0"0씽03:`bX@lUK 2UP!N@ =R= =:Ц8r$0RYPnV#2>s>8>>>۝>>~>lZX>P >>p5>+>X>ȣ=1j=}4B>?>^>z= V=6!=l== B>>Z>>u> >>|I>rQ>>Ӄ>O>>J>pC>Zz>LC><>>>޲>|>(կ> > c>s>Rb>ؤ`>ēa>Lb_>%Y>V> P>J>(H>a>a\=ZHý8׽ppA@RP9,=7==6J=g=iU=׊==>^>lT>r>>J>>v[>,[F>M>l>z>(cz>\ɇ>?>ܽ>RK>Ʒ>|>죲> >>XKs>2>r> E=x^=q= v=D>h%,>\S8> U3>}@>F>a>t=@F((ý޽xǻ0U==` ->^>>$آ>>X>L>>r>(:>xӓ>v>*>G>->>4>Z>>>f>><>t>}>Ȅ>xz>+l> >>>v>,KM>d >X=8d<%=&@x<^<l;@N0t@{|jJ4 }pu=@;== A >S>,}>R>>~>>>&>@[>>t>x9>>4>Ɋ>le>x>>y>>.>i>Z>m>l>XJ>P*>>Է>T->8>*>S>԰=<@ؼX4ӽ@I,0UN'J<@c<Ti:W;5<`P=(V=`=P~=B==G= >|z>4t> >{=D>*>+>7>P;>w->P>ԩ=/^==0 =hIUO(Kͽ@佰\" IaKԴjxi{oPvɾ'ɾ$¾lv<h)`(+[iHhl*\i6@ HY^`兼⿼u(k L ԖMZ[xm\"t\00Pա0dJe ,iW̾R޾8很\ TB#`^ ǟ =¾Ϧ䉾(o?Hu˽ =@8= =p=P=;@X<ڻ@{* ^`e@Ws9㼀x;Y=b=2=La>4>hl7>$>(>@N=izpP䍽e=p;J= v=._=Ơ<O'(17!%|9tc^l9jjY4KpGd<(>@4$@FS!>P~>=@=p'{@P0=r=>l->2>>8==PV=Z=@A%< 2μ*U靽( oX(Re&]nv) I(Ñ#e72$@ĢZbX* *ycd\>>X!>=<13OP8.m< {@^0p S4SF t!  V[ҹ̾j&ӾJ׾abc*b.**ξ d<(hdCbpϽmq!<0Z=T>,B>HN>(^9>tN$>c>2=>=p=@=0=P = =8=q=>,Y,>`6>=| =p!4t;/^ .ľuоXݾBݾ8 վUľкWv`aþft<<=`'=+< <(=O>t@E>`t>p> B>/><;>Y>">u>><>2˕>> }>x>03> >>>>>~>\UR>,>">Ⱦ='ptb%tPx:=m=!O=0B=(=<`LE==pG>Q>>>>)>P>N>>8>$>^>g>>?P?"?P?hh?f >/>FF>|>~>*>xo>r>>>> >`> hS>0|E>h> =s4 $D ^`ug1+A꽰n(Ƚ`d@ o $=l=q=D>8<>Mc>tTr> w>Ha>81>`+>'>|kW>@Oz>6.> ̩>> D>T>[>@>W>P>_>}>2><>_>n9>M!> >h`==xO=8?=r=`]=;< .lH !R.x@ꁻұ=43T>>Է>Ӷ>>>*>>Y>J>}>>>ؤ>6>>>>(>>>8b>S>6s> >>,>d<>>b>>Dly>&>= <AA$i<](=¤X½TJv͟*ѕ,WH"ǽ@):C$;< =P=(= =Q=\>wZ>>l>b>&>n>>tp>E>؏>K>03>]>É>> >*>`=>ν>܍>\>x>4>ko>/W>8?M>7>8)>X >Z=PH=@ X2E\l@w`e=3K;`hi>y> d>k;>l>2>h;==藟==_=`x=R>>H4=`ϴ^'>H'>===83=Xϻ=>==2=@]=P~Q==oP槽H?{4XHdzІ8*ɾپ&o M 0!侤;⻫舾tlcDbrm/l(DP_,o$0(;dZ=8=8d=PK=P==#N>t>:==o=t=` G= <@!AtKkƽȓD3,]4 XX꾦߾8ؾiɾp/e$_H6P[3QܽFTpu=Q`,ӽPIr@[:|a<;n5l܍;<_==`=h=p=a===d=oм X(:սXx0iH̛@Ͻ0(삾S=jMɾ8۾ҩӾ!>>X=8 =)=K>M>|:_>`=>x=[NrܱfM+H -DN>󀾰ؗtPhpt0 ߼ l`Ͻ؅hǽ@n_;H=D>@&> >>4><;>U>wz>ʮ>>>r>l>s>>\ >٘>̏>@i>\a>x @>*>.>`r=?P=@j+=<@,<@g<@O=x=:p=|=v=(Ŷ=.==@=s>&>@J>>>d> >l>H>N~>`Հ>>J>DW>>n>>$>4>>A?? ? ?U?xO>>>>n>>l7s> v2>l>>@=P==`&= x 9p y<@)<;:J<=ĆU\>|>> >ڏ>(>>>զ>b*>>1><[>H=;*=$yǼ@)B;=y= >\>hu>xa>l5%>(= y<ټ*U*`h<=2>]j>Ì>f>`>&ֈ>4>=m=k<E=>o>p@>G>Ҹ>z>>[>>>>>T|>jH>>R[>%>H>C}>W4>)==j= 0=!O=z=j=P R==p= y=?===̉>=8e==XE=>x>T)>,>P4> !O>Lw>>>ϫ>n޺> !>>>g>0~>qN>,>d)>f5>@N>=\>|S>tP>>r=i=;2w@ʽ C@)<ؗ=ؒ='==Ѕ=4=` =%>H > =Y=͌=`=@=p=$==e>h=X=J=@ PnؽeN~y:U"(`<7DdXu@dhzp#P<0,:`P+ܲsꀙʍ~$.ΈʄmFv<=b5s4I6#*`,56NQYtMhW1ٹXڱZ1,oscd:ʾn\CپH&<$^ 0Dwꪾ¿*ϾľxZuujLL/s(k߽tH_>UX.PPS=~=þ=Z=gW=w=X==8D=e= ==qN='t RB̥5 `šJ Z솾~.plidO},_Ѝ . Ӽ@<¤;؝Βe <@=B;SМ罘 N܍  |ż`<-=Ш,=>Dsͽ 1x r2 ļVJ<0B=0== B=<V`P_lȳ!ͽNhi3*xJꣽ]PyBp22-<D= ʏ====8Õ=о =@ڸX0T04)^~̆2<殾\Hf_7HーKo`<==C|y>puB[p&(Vpr^#1cM{g0i(@W=@Y=d=`<V13W\@ E͌/Jh3/^"Q\pd GD0뇽`t@LS̬,QcT丄 8kͽP#@-<@=f.=w=U=f<=?<  H0I=h;=>K#>1>#1>\;>X5>%>P>=`h{_/b3 pӽ۾` @9ν䩽@xr@&ڏ(>h/>$<>@>x@>XB>e>>R>6>>;>X>=&==`j=`֮<^;@@b=>|M>+b>xpd>e>K>>Dg>$>H>t>+>G^>p>{>Ȓ>> U>k>v_>0>$ł>P>1=>?>t>ҥ> >#>bP>>4>>li>>$>*>1>>42>>:>t>X>q6> >'=H=zp=B= = oz=~=8=>8">PK >=۰=ט=(=0v=0?=N=9=X>$>/>g>=!=!x w@kr@z=>pN>t>^>&>>z>и>4s>|B>@= =@@<( /'PxO>_>,\>ĄA>8P>P`= u=x= ==j>H>JƁ> >|>r>Hu>\T> >=PG=P6=@6=8/== 6>j>>8+>>><> >H>[>D͎>>.>淑>l>[>===;һ9U<=P >85=E=mѽ`ZV<=0~=>xoW>@py>P>Bg>x/s>Q>>˷=0}R=@mR=`==4t>n>`=J=P==>>&>'.>Щ9>Ĩg>V>f>>>,>>0o> I><;>H=薒=p=P>`O8>,Z9>>Ь=ߊ=<ۻ[euQ"==;>~m>>(cz>Mj>0]>AA>'=C[Ȱ:,RNXg1)Xx7JbP|D2DT},\H.0!8pOdux0i8DT 8bl|>@H8/-X*<݌JH$@Ahb4^:<j@quxK6 `l7!<7W==ܟ> f@>>= =`<#<3pM(JXX@[@5gл߼r޽_-h ӻ&=`K8=p&=6< 䆻߼jCPPOI,HlBd+F@q0*V։i{D(P{*$v<ǟ=H>p== m`=@D<؝лLwoh}j'\P6pYx,̽es`䆼;+<0`TI\ s`]\M=1#*8XzQ}NHAȍGHaTOH*<\8R@<ʝ< Pk ʏWý@ D#>2C>D6@>D >=`'8iQ精xyXvѽ(p7s觘@p@/%;X==p=Ǒ==h=;=6aЈBAKV2>T;>9>*>x[*>6>\ge>>f>M>“>& >r<> >W= lS=u<˻Dر`/z ˜<,=X]>>+>?}>`>\B>>>T:>{h>R>.>>VI>>>V>>`t>F>l">0g>w>x> w>>bp>v>\>9>М>~}>*>>y>d<>v>&>w>蕹> >8k>h">Xߴ=cȝ+;O=> $>6>o>;=h=>>d>J> =t;> >H>h>>E>i=r=<@ ؼ;N@->(<>[>@d>x?l>PNf>_I>@/>>=>=`*<@x<f8 P/XdJ`<`r=H&= #>tI> 4;>6>@==xm=X=>8'>xO>,}>>|>쳫>Y>c= Ž<[ѲT>$/>4g?>D>L[>z>>|>>q>>FQ>;>L '>4D&>`>2>H">h=p=pM愽`IgMR<}< 1 4!XYMз=|">lb>`Ty>J> >z> F>8 >=T=2=hd=P = >06>xT>tV>(>`=^=]=0=>1=>,q>"ɜ>(>p>>r->r>5A>r>=xƧ=H=آ>(">\v>@=#=-< `CxzX퓽{Lp=Po>.X>s>>04>D݇>Z>F$>&=Z)>@6 >=n =C;04 ջWӕ;07=0y=p= >=ã=/<㷽1DhiL2܁{,r [!cWH"н@ bp@XؽV$k,p,ochk81n dz[LHh; 0,.\x;*PA=E=h>>P^=fJ=<ڼdX{b(X솽2e;05=<]l%`P]6R< =Xۀ==@ PJp`aH)Qov⺄@tJQϾ4ʾ֬|1܁{Ե2ଽP`@=e<@n5P~Q(½t'a^t`Slg{; N<<`ܼ?^3i]@c`\A%>V<>8O>_>4%u>r>\h>Y>h)>=(r<8A?,X&luY>  04Bt`7Jѽvpt0мgE<1<`<[=<qü >6<@j0U=h=T>7>k>6>Y>Dx>^~>>nc>>>>> >tp>X|k>@A>*>s=0\=A<_޼P?z1x(=2>Юz>o>ij>>ƙ====> >-> >B{>o>nU>:>>X>t>E>ɾ>R>>Z>V>>>DG>0>>B>V[>R>?N>V>,>o>d >շ>(K>d`r>4V9>=pr=Tj0w~<0== =r=7?¼zb;;*= k=m=}=xI=0====p=P=o=p|=$=@g<<`!3=HQ=ȭ>XU>q/>5A>R>oo>>O>L|>Yc>C>>=<@PP>u> >>>Hh>T.>H=Ǒ==t==`)>S>>>*>y>*~>,k>>T>>Th>X>L>@>*>@>4t>B>X"=x=2\=z=ȝ=<9$_s-S?v,J@ҽŅV.=U=`a>>P?=P =舳=Ć==06=}=(b=1>3}>V>4ێ>p\>)=:=>e>.$>:>.>>d> >q>j>K[>'>)> hZ>Du>p>z>Pn>0;>2=Pk=Ǽx}pG ` 132< ==(N@>|y>T>Ԅ>I>P=dDdh@_ =>,)A>Q>F>%>H=n=Յ=PI= =3=ϟ=O>d^$>n >&== t<@XνdZ$IPTXTZ4hXvϾ)Ҿ(ľ6ısHiTufpqуoq $oL\NwBS;Dw1*|/h$x qL)/ʻ'wɽXP8FʽM+ppk愽Pݽ( |)YbpxǾ\;x־vݾ"eƾ渞Q"ԥ㟾֑Dh$a,+⽐ޒB`geν R@=6>d>pD= =p`=(=< =Aj===6=@>=8==HT>3>>> =?=OмJ8,􊬾*l򋟾&厾煾XdK8վRb龶;lԾeξK¾LD358ցu\TI%tӽ Z@&00P[pǽ̚2P[ vf9=jb=3<`,Ӽ;bBt޽6(,hXaKLqKec9" L n_¼B$e7&靽(ʽG½X̔ѝ0$ꈽ7ɼrilQ 㝾◅G%H~d~xhX k >>̙ >p/ >t>ı>R>1>M>S>`V>W>DiR>>>3>,=>%c>z>P\>z>~h>x>>S=ýh62,.t^8˽x ڽpwIe &f'Qn(0CP9,Լ#9H⿼=H=hH>D)>;>dO>)q>><~>t}>wz>@i>>>" >>2i>n>ƿ>X>>aq>D)>r=S==#===t>XXE>I>%>H==B߽ʸ`[=p>/8>Bi>1>pa>>|>V>9>> >Z>R>>E>> f>>P<>]>l{>,>¹>l>,>?3 ?h?l3?P?.#?>٫>ׅ>J>>=p=L>L>K>P(=R<&.vJf<Pʽ@<<<<Ⱥ<M=>̿>!> "(>pa>=Ѕ==$=>>>@]>qU>|Z>r>r> j>f> WT> B>^<>*+>>T >.>k>=i=(=Qj=<͚-1[ B@Ǽ ͶyǼ4 Z@ b=8>oF>|O>?>p@>=p=x=f=̬,>Y>Bw>|v>>>v>߲>ǫ>?>j>:ԁ>LBm>^>xh>R>^>V>l>R>0ks>X[> "U>Q>U=>>Љ=40<ĽD橾ٟFܡmhAP. e; v<=p=R<`< kF==x6>]>>ɑ>9x>d,S>WB>4>FQ><|>w>ڞ>d>L?> >$ >B{>>z>>b>+>>>⼸>ߤ>}>+>hΧ=ͻn 0] 6b@<)'8޽G½@]&܍$`>T>S=Y==P=\=ȓ=;=====h==O=(== K=`<Vo[ F@xh@hNf¾ ž0j̾Ծپ߾+㾸b ݾTϾ<9{$dN_xMK(.e ,#?|ОpٝU ,((P:pc; <xS>(N@>,>= Q<9ȼGټ`< ʏ= =>,> ;>TJ>T^>H[>5>_><=50=8ٹH4ڽ ȟ&5A举Ahw @I Tþi\"͚|=8=H>=y,ӽA2|ЛZk.x]Dl%`jf舾ׅVdqxHIPMd4 8$$` n <@+<<)<B\Q\ʽ8dHʽ@NXR=<=!j=p=@=pWe=`=)L* 7Xf~?*)iq_h ˉgvE0I@֮<@d==p=== =5=D2 >F>)>L4>->(!>$_>!===V'>D>u> >>Df>!c>lT >0=@6ȬL|b: uY=Xh=j=\髽 IV݀$,v2wI@j+p/D~9t< Ͷ13;t=f=8)>dH>8[>hc>e>'W>G>DGF><[> {s>z>y>(>T> >Յ>}>r>Dd>GW>P N>(B>D>>8> >=Y=>-D>8 H>:>l'>^=+= f)@<==0>\Gs> >>N>4>>J>$>>J? ? ?W?f>ǣ>B>>Lٻ>>r>nc?n?/ ?> ?+? h>>d>N>n>κ>u>W>l>rq>E>4v>^>h62>x=7=zb]n ɽ@WWIxŽ'@]>X> >x >T >(==ā>G>N>3>L>=0K==?= =>|>T>= =Ƞ=`{=t=Ō=^=h=>XS>0=v="= ==@OyUTd캠<௘=T>`0>8cs>>>>z>r>Pq>n>D>v>>ï>>$>>~>9c>Z>W> P>?>?> V>i>ta> c>̰`>(5>x]>8>=9=Ȼ`` G:e=pI._P@Fq@mƽM`p=\ >6>XW8>%>l >l>>>8>e>n>Z>C>>>>"/>,r> V>R>h>>ra>PԔ>6>L{>_>2>=該==D0=@m<`<0ff== ʏ=q=0!=@B<˽{8ý{a@H<`<=k=X=@<41;?<`}<< oz=`=>=ȵ=Hy==h=#=^=C1=E== =:M`(HP]@7.@p W,5;vdt=qMXux ýBb%R՜[q`UHdE@gB`//lDm3>@}K>L>L4>L`>p=}=<ۼcL$ϑ?YX܍Žl -/Bd[~𝘾ISվ6@`۾Ǿ&^hsp]]VI|M1qZ2ݨkxg(OM0о@@<@<p==m=@a< >8bD'<pVX` @?8ҁКͽ]Ȱ,7B5"ͽ8Sƽ@齰 *L0Z ľ'оƾkP8ʋ޽BD¾LǾhjmU(kVPD|i=7w5_hXxlf\t70*ШPiHp@lЪFpA?ĽX"@4;lT ,i%]!#F"HC@&;*<<0FtSp<8=@!>aj>9>Y>2ݎ>J>=Pt>=)<[>( O>B>/>>H>l >hX >>>x)>4">>)=M=p=[= 4 @ȱjΠ %@|<=@!=@<@d>">$;>8b>L"{>>z>~>ld>׃>,Y>>>ޭ>n>2Q>t>>`=>vM>V{>4>>8q>{F>ȟ&>Dy>>A/>pV>~>7>>0>ȍ>>ޒ>>>>x>>~>4>`@>d>n>>Ķ>>>R8>4>M>h>==P==D">sP>0">>ܒ>>8 ;>=@@<`;w==>x>b>(=h=7==0=n=`S=P:=@0ѽpR$D؀:lz@==P= S=\==<<<`0=/=pvJ>z|>>>zӭ>Hd>أ>>>%>L>ͦ>8>L>m>(o>p >oB=`?0=`),f:=`=8`>!6>%=>ā>Ҹ=v=@VgIu$۰8'< i=0O=P)=e=Ї=8.>h>>>\>g>E>L>u6><^2>A/>P:9>D>dO>tn>nR>->⼸>$1>ދ>x=<=h= W>P>P:>F>x>>؃a>>= ==[*=`-``"K^ku\HTednswbb7$_`AH7Xu(r#H P&=Ơ=2=.= C>>\>>̟>|(>X>>>"3>n>T>>l>l4>8=@}=3>\;>`Ň>}>к>>`Ɣ>ء>t>:`,id4}6:=K|>p2f>ݶ=f&ׯþl1xy0=0>e>`>>Zi>D">}<ǟ~潄 q 8%PN ,V|41ȣڽ@d=('=x=h&>w >x=:>`>4Wz>"J>=N&o#$p|(qYXbʛ3ʾڽÐPꣲ۾ Y\)Ȯ;Zۚ`{xؒ.:ʾNǾT ȎHپ쾘3:ξþXо뾊mm1  VFdR cbZ' rbѾ@ڗ|{J$P&@)wZf|ӾBѾ$^t<@J9 $==\H>>>d>亞>0͕>l>k><>$>==>XyD>9x>r>ޏ>>{>R>>8=0=== >\)> )>X=:r>s>>g>rt>ܿ>>L>~>(r>?5s?>?^??e'?] ?+????nc?|>%>b<>Vߚ>D>>ܢz>l>Pk>q>o>(9>V>Vj>>$>)c>Hg=9<r z'>>>>>a>w>0Y>@> w>L>L>>>>܍>tz>,>j=(=>#>X$&>9>|>8_ >1>f>>\\>l=B\D>X>>Ɓ>>o>ۦ>">>>@ >05==@==XV=`{<l;;@h<@p;P^ڪy/?8D;W\hrиhMԾپ2վӾ\׾ZGPo˾|Y:@J du99<@Q`"XTŽ C'EG6+=_B>ܵf>J>$>(,={; f0bcP]Oмd`:^5@Ox ~(olbPcIxWtŚʌ۲6׾Nsw )J ^e@Ⱦl#JOJP.}@z X,$l4LgkT^==/>tAHeR\CFk`^&=ǾxӾξhZ߫>b՚ 2H짾޿XE2B )rTP.8>վx^ѾFξLǾ"Ⱦ ׾p2lnξHejd+F~.Hiq!x)c;Xekƽdؽ&pݽY@?9#оD-d,SVC ջ=r==`h3.Hb+p`Y@Jc~>І>>~h>H1>*>VЮ>J>t>|Ke><,a>Ь`> K> 7> D>sh>H>*8>V>|}j>O#>==`4=PuK=s==D!>>k=f===@=pA=`@=ko`Xؽ@뽨SPXJj>|&>x>>B9>܏>>KI>LP>(>= =#=p=W==`=`=@=l=&=@@<JEṽX" ?`н'ur09S<Y`0g 8!x T;pM=(=4= l=P;F=H=xa=$@->0d>0>[>>>x>>]>d^>Fg>>,k>>>.Έ>V>PO>rb>I>R> c>_>Ԅ:>==$=8r===` a== >`#>ܣS>]g>CI>|,> >>[>p4>;I>h)`>=c>J>7> >>0> I>>#>n1>V>>Lp><> >h>2>4>?U ??I#??&"??A??,8 ?*?.?*?z|??_?^>hK>>X>4>d`>t>R?T??? ?>>6َ>&^>p>}>ġ>>>i>>X>k>ض>r>>0>b>4??">Rp>jf?E?I?><,>ڸ>\A>`>^>6>:>α>Ĥ>d> x>>9>rB>>r>0>Z>p>>RM>>>rr>ѫ>v>&>2><>XW>RJ> >>>>>J>>dPy>F>}`>m/>s=={= 3=02>`=@=Є=8==x=@=>0=j=1߽_== >X=y;pH~H>&>C#>>Xݚ={}=`Hݽ=,U0 y=ȓ=Ƞ3> v>E>s>=`üGWVޜ8jߓ4씾Dr|[ u_ 򮸾^ξ0%D%Ծ\ H><۾BϾ樿&曾ᖾhʾ=JP e G5 !w( Z] 7 t %vؾž̾-JѾfɾWɾ긾hi˘1n10EڐqǾB&ǾM¾˾gξmɾPо~B/ZBݾز uTǾb>I *#h"fHxpw`pe˾;Dg󰾐۾\뾊rf&Dz㦾<:(^HهIjl^P$ǜbw}JO 6?l˚fЍ("t8վpe޾bq޾*p澄TѾT۾@Ȳ־rdѾ<~վ>վxȾ;Xp̰`'8 d570Y`f;K`L)\/#˜;W;@~Ō9Ƚ{u0|Ž򪽀xq= k=X==Ph@n߽lV8t^P?B01/1 E4P;F`^<` ==9H=@):)< }==X>==X=O'=<] V.=` :=p==0h>p,>x>j">\>9j>o;>h>(^=Pt>= 3[=X = X>tw>>@q>ڄ>υ>p>">> >˓>z>>z>Y>hH>r`>>>@k>|V>HFm>D>>L>>V>Xu>dLE>>hY=Q=h=<`O=>#=5/=$=4/:滀;΋=8g=lf>E>w->0= < EcM/=_=4>@)=>=j=@c<q3<=$#>Dz$>>=X>H ->(>>Xާ=<@Y<#=+=38X-4.T%3\:` \` p pfH:<I==6=ދ<`< ߽6`h=4>0V>L>*[> >D&{>8H>n > =wɼxͽXνbۼu!<Ģ@<[ XH0Dڽ[oٻ@<?==r==(= <];}0kx=P=i==@k=`fX=h;~C!L< \= @>>`qD>[W>ԸY>FS>:>tM>p= R<AA:*~Nʸ =L>=>f>8X>?>ս=@`=T0 Cv\<`= c=(= >d>sF>:N>AA>e>2>$r>qc>LdE>0g >=邼寽艽p0=T6>\V>>k>,>3>p7=|S=p!=]<ɞ;`K0(@. >߼;P=8 =x8=@=` =@hнWPK?Moadu\UR$ wƼi:0=o=<W== >G#>== >0>P>L>5j>+>ӝ>җ>8>0b> ]><*G> f9>|>(==U; =0 =@<z;@5dWIս0Y% `Bк @|>XW8$7|'? 0E .:} =y,t->K#>ȥ=̻7I= >y>>Dh>>>K>:>P>6>|>lO>C>$5>pS>T>D>(>H>=>xN>L>=T0=H#<=X=*==>x=|=ǭ=@<7.;O+$ 7>+>={> 0>|b>y>v>(k>X>f>@^> c>q>>†>m>|G>>=Ht=qN=@%=`==*J>xOe>A>p">t &>>>t={=u!=h=06=Y:>Z>0U>P>>>@>>P>W>>>;m?(>>s> e>;>X}x>|>4J>R>>>ߘ>蓟>>ޜ>pP>X> =@Ws=`=b=6=Pp=<ϘI;;<=t >=<Hѽ Eug@G> l>1j>{Z>P> >>,$>> )>AK>j>> >">>>.>>:>s>L>$>==V==G=B==w;=@Xp3?e47 @- 4د HpMpV#`a8ヾ*ҢqY>TN>T:9>l>x=@;=h=x=@>lZ><>G>d]>f>>ʰ>@>>b5>`B=p@=п=y==h=u=g=PT=;@B@)T#daӅF]g_MPHpH<4^"h T`?޼V<[h{x8m9XJPDk~\pu.:s18پ ɾɾ촸EԱF4fܾ<M)L0>l+ ,ɾ Rvr^6nuX^(WH0ݽ@Ѻ@<0c?=pi=Ļ0ܽEsaؠ\s|'sdZWhdDh۾߾>۾⾮߾Ⱦ*P~XEԄžپlG߾.|ž(pf3 Zǽ'׽ }{K THH"ǽRHQ=4)>>>)>t`> >0o=y;J``Ռ齘R";Q= JG=F=P=<`I<@vfD>h\>>8>#*>*> >=8W==Њ= ==p=0ͯ====<$=Ps1=u!=0V=<yPLSȮ좽 *( ᤽pXr@м

0h= <@@塼 :(=F>>> >>p>05>5>dn>$0>XG=8N= K==>8Sz>!>n>P>=qN=ͼ佈p) Bg;5<] \ɡ0ܑt7PL.x?˻`<0ff=@LS=8N=h=(==i>(d>Ӆ>$=>">pP>>p>dp>NG>8'> >(==HW=X=<ؐ< =U=Yc=<Z1`I'׽tLqHl 5hYx.=8˽_ Dd7>@>-D>04->c=xN=<;>j>ɽ>>.> >^>(,> >Bh>>>,n>G>>վ>>I>\ɡ>"> U:> = =(=Hx=z=y=W=A=>(;z=ļ`nѼR<<`C<@x<;0=P=W>l&>P">> ==@=|H>Hx>Bw>>h5>В>o}>$\>\N>XA>tAR>S>vL>#>+>l>H >=0=&=Щ9==9>z>{>V~>Hr>P*>0=K>U_׽`#M >,>#>+>0>t=V>k>>P9>>]>->}t>c>C>X>r>0V><>t>x>V>$>p==>}=!===ؗ== պQpM>ئz>S>>`N>>$X>A/> >k=8=H4=0=>Q>DH>Ю=8= $(Ō,< *=C=&>q>ov>\Ff>0> >0>m>ϣ><>n>:>b>04>HWs>K>L >=$- >`">h->7>ij>>Еt=LXv ݽT7|!UHbb} ȍ hPx^QC>`a|f;4 >lO>@i>">t>u>9q>wI>Tj$>`=b<H@w@Ǽ =n=&>(Qg>0|>!K>0)> >@=m`" )>@k^aHv'PdX<=>>,w>>}>"Q>x>=<$ f`Eټpϼؼ TZP嚽(MP'0f<87܎0w"JrUɾtv9܁r־TЮ+(dI:  h5||]H Dk|3߽+}(;:`Ĕ=^==i=Ҹ=|<"弐P]8ƻ@cp ,߫^꺾r NTДb՚~4"r1оD⾊ܾh־ҾĐs*8գL~xز?0!DDU%`_1lЦG;p=>8=H=ؐ<}(pt&)XݽJǽ'ɽhǽVPx/XׅrNMrbþn;Ѿ*ʾ̾;ʾZǾT';V^ٴɷ>@~!Y* /L#Q/@o콀󰽠d tQThJb(PZ4"Np0؁ǽ!𠥽6h%vξIBlG$޾6uҾξ̾1ɾ8þbϾ;Ͼf:̾ݹΈ!쪾̾B* ܀ K'X5@<6;{7@ݽ$$ 5,=|@2+] $)$1(Hv y.j؞̾; B Ah뾼ᄒFKHjx9jy–H\Uxo׽{yc<+==0i%>5=>31>7>e=>~2> >؁==p=Y=p{=d=ѝ== >&>\0>0>>/> >>>=@,a=MR<`*5<Ģ;}ͻ0BeE@ItȽ_ɽ켠ǟ<`I<] <=z=:=(>^>NO>j>>x>>>>.>->??u^?RI? ?,?p.?3?T|7?34?5(?X"??=?p?y??H>=>p>/>d>L>9> >tz>x> {s>F>l:>D>>2>pc*>DU%>(6>R>>I>>M>܀>>(>0>U>z>>>>d>0>n#>FX>$C>G>g??!?'>">>v>f>N?Ձ?h?;? ?X> >>V>d]>榥>[>L>>>>Ԕ>>>i>|>z>$>N >y> >>tغ>6>>xO> ?n>Z>2>">>>j|>>>^>>>U>>>F><>>,>r>><>'l> L>,>H >>\? >=H==xl=0;T=U=8=sv=V=` G=p5Y==(=0=@==X>5>\V_>|>n>>>>A>۶>z>H|>P[>,+[>|>>\><>Zb>x\>4CM>T|7> />8>=0%=%=p?=]6=PW=<1 5u>Rb>b<>)>7>:~>M>n>>>>6>D>HH>E>HI>fb>Sv>N> >D[>)>8=`=)݌[*t@=`F.hHL|vMHS %PIսU߼ =P\=3>Au>Ҧ>0>_>9>pA>R==p= =P=hN==

@u>,k>J>hA>Hf+>>X4= =`<2=n; T>u>؄>\h>@>W>x=h> />>(կ=8=08-=<== $=,>'>D)>PQ>>>h>XS> =@=R #b>n>B~>j>dl>>>\.>}>>.>N>B>Q>r> =(=PӇ=M >~M>h%,>>$>%/=@He/pE> X>L>H>[4> >=P=h==Pv=Bw=ϊ=}6=@4Z=+==pu=!<2U콘[X|Vl3P4|ӽy݊y8\Zp@LVh<2 DMWI;G;xYh܆##5lw򁽀/x^Q,os:X 0żHֽx[xoѫ܍8ר"s`žǾ ž43ԾӾ!оHT0\ 5?\%ʌ-M,J(KsXzQ䕅(ʾޏھJ\rVOվ"ѾnfѾ`ܾVZ߾:ݾپ 6rH"45H=V;J0!S&0 pmx22_x|4 /ؾ \/V|\ktsWHwe^؍4 踾̾P𾖛׾Vʾ~Fvþ̾tþ|&ދt^;J0Ⱦ.ܾyھ꾾a%2ؾ0ʾr¾Jž {ЭU$&r?پ}dx`(@hԽ(]ae1D#0k@7`<`a=n=J>45>_><>Bi=$>r% z<;:a;LZP 6 N̼e1;P^$pqT`{}\f h½rЩ9=l=`=<@&J>^>[v>D7M>>Xd=亨((뷽r;C= <<<@6P A> gF>.~>V>@V>a>>˂> G[>d>.C>">p>>>$a,>)>e>Ы==h'=@=0K= C==x=&=:=`d=<;+8@,a>^ @N<@J9=Ht= >=h:==¿==x~> >(>`A>d>\>D>>@u>`>>j%>HC>,>q>e>/I> />>=|>->>P =0=8O>=I= 0==|5>>p@=`j<ozU!0C .#"0Ͻx[5=@<<z=X=`V=Hd=<: >o>%>8p>hG>Ӝ>F>r>j>|'>)>ta>䈳>y>>f(>l>淑>>^q>t>>$ >>b>ji>ԙ>:w>tz>go>0H>2>@8&>p>@J=N==}=@==D=@ ==p=@pN>gv>hLy>z{>Յ>Rч>>>@>?>>m>`M>A>>$,>Ģ>h)>,V>k>T>hp>>Ճ>Y>h@>JN>P)3> !>TX>8q> 5>>>~9>!>P>$> >x>= c=lؿ Tڽpx f8_j<>Mc>m>z>>jV><>J>`G>6>h>H==p5=h==/>ؓ&>L]>؄>8ց>nu>r>c>RG>W>=N5=@mҼٽhO_(&ýL0v=X&=j>8=`d>=``<J4YC>M>w>\@>l>>{>ӽ>jΧ>k><>Ѝ{> r>\>zT>2>I>`^>d #5>>0===w=;`nؽ lŻC;`4< e><>`dr>LvX>+P>T>%>x(>>=>Tq>>>Ԃ>M>r>f>Q>/*>G><>[>Ж>P4>>=8=XF=P== +}0⽰ J@%˾߾^62Ҿ>¼5Ԩ`mbXag}L1gXaa9$q%落 PY`==ph==@4=p =ǻ`k*ӽ^ `۽wsڽt @X<+<"}6`躽 !spX˽ 웽1bZuN^$蛾wOh&H X@p \==[>X=>|;l>>0|>lM>L >T=g=p߭=J>YN>>}>>>>%>e>e>Dk>j>{>^>D>૘>6>̆>k>(pL>>E===Щ=="=+иʸ0z0b2NQ ã`n>U>f>>w>dN_>B>lZ>Td>fi>0HZ>LA>Xh>>eG>\V_>h>Y>8O>\c>ttd>80->9= J=p=h]=peD>I>.>br>,>V>Ƿ>X>9>m{=8<<`<=I=x =L`>h>>x=~m=#=*=<<<w<ͺ.<:U=8=܏&>Y>d}>()>J>0>0q>~>>Յ>o>bC>,|>`U=ڿ=h=m=.==RN==`=|y> >=X==8=sLH`5#Xy[0b .<Dh=0ځ=&==ȳ=d=Yc=P\E= C=F=D >8>}!>Lo>h>>>Do>Y>P->P>2>{}=`=<\r=== =B$< hǽYq@gs<$=Z;þ DZҾܾrRؾ8QƾBX0XX_;kԼa /'"<V`"@=X=>h9%>ED>,b>:~>phk>8B> #>==>,>&J>]>6_>S>M>@=>>==_=Pp =Bw=(=pS=߹᫽@Wf0˕CPO&ؼPÎP:==>0>(H>/e>Oo>s>d>p!`>uc>d&>=0=P= =H=0=@ H= q=}=hX====>t> 2>P>`Ol=3< /L<@@&=8/`09DgB~K&Ây4ffX'7#=h>@j+>,LZ>e>`]>Q>>h=(V=%걽ۼ)=ڪ=R>+b>ԉ{>(e>=>(=>=8d<)cT'N`žijl1 S;< NJ𰞽9`cJ~iP` `<(`=O=h>t.2>l>I>趞>>tb>>> > "!> =yU=](=b=E== >Dz$>B$>>>;=HF=P=@gshU>yt>pN> >d=@TL< K@{1>AD>ЫS>,\>|9R>T)>>>c===>=8@==Ic=[@kX 8tE0oK[\b$# EȌ% 1A8PS $_rP= P|P NJ!hXݚ`你{ xkXt9h;& O#46 VH]x\p|ys} .`ؐ퟾Vi`Ǿ ޾t?AKM^ , : վDly@q8ZUپ6޾6޾׾ϾHϾhǾ2ɾ׾$AԾ̾XԸYG(|0<۷===ȁ=И=q=<ܼep=a3>>h>>t=>e>%=>0= =>=h\={=l3>W>`tk>\ɇ>Z>gP>>= p="= »Q9L<@:ttz4!AJ=gW=m{=ȟ=x=P/=u!=Q=b>> >B$>->%>a(>h >8==>7>Dd>v>|>n[>t=>=%=3#=@c= F=$;>Թf>8>t<>>>V>h$>P=w=`C<zš@<0=X|={>=====@\=Ѳ=8=Y= ջ! z>Vz>>d>>]>>6<> >Hx=v=p[=x֠=Љ=>W> =d==6>=A=d>{=p=!< 0PH o<@<p&=G=b=h9=p==T>%/>8(>L->l&><#>КM>r>8]><4>b'> )>8>>@|>h&>k>">a>y>_>H> >L+>7>V>m>hJ_>O>'=p=L="= Ug= )= =u>)=E=PC'~ios;=(=x >k>>H>1>$= >>\A%>h62>H>l>LO>૘>ڥ>>4>lzJ>7> >">)R>>FC>2S>|%> p>$V>rb>P>@=>H4>>|# >>7>$E>,>=>%=`=n; G<=p9=–====`U˼hh@<@P_>ܝ>{>+I>dA>1>U(>xG>R>A>9>>>\vQ>Мg>D\>TP>8>[=h==0=>$>l)>L.@>\>|H>-/>g4>t^>=Pu=0ێ=@|=k=hp==> >={=w-=dm>궸>|>M>S>̿>b>M>h>0>s=,= <`=+8>z>P>}>2C>g}>h0>L>=Py==Ō=@\SpH[3B4c R@`>>R> Q>>и=v=ѫ=P =T>xH>$1u>=>Ԗ>œ> >N>>> >h>>ǟ>z>:U>UN>\>w>Gv>lGl>d>d=Y>D>?>:J>P:>$>j=Ռ=);0=nxd} B⽈矽PGW;Y===y== =s==H@=X= Ͷ=== >4!A>j>>a>z>> r>$>x~=@==f=@=ij>V> >\>>>y>]6>+>ȯ>H>X2>=H=< m`̽4 ĽpS @N;k`ݼ(+۽,8-a/`GLiXU?0ĽxÀ` _۽xO彀bbm0l0|i H+(V#}3vyU%h \U3YjE,*ӯ ĺTѻָpoFzȾuھhmd[߾ӾDϾd^ؾPqb(վʾRluxR{n32Ⱦ@־80ᾎξsǾҾپDBݾj{׾̾Dվ,n! d,0P!Hil>&-ĔԾc,4վ]¾N{_2m6 V{r-ωRx`?J.@Z2d02?0HZkl}r@΁ R?8eGU̚˾8ݾѾ˾NǾͲxΉpNO wپ`@x&Ҿ<5fj%/ ޽(㽈oнͽH[}<5<Ѳ<7=0;T=@C=(=P8=3< !`@N>>>h)>>=h=oB='< <@d>< %/>|kW>FS>>hn>F>= I<&V8޽8Ƚ k#<<=Y==#i=#З"|(p Q`;=t=>>P=p=3=M(=&:pϼ@HG8=yG>>b>>ΐ>`>8 > =0 =yc<@<,>#>h=@LS=P==p=K>> ">ȡ@>J>|mq>F>=>>L>(>Y>G*>A>>x~>I>l6>L>/>$>X> q=@a<L@A耳սʝ|<&=,<ҏ QXj_྄3==P#>,>2>jJ>N> Y>@b>o>phk>(_> 4h>4|>>>S>>>8u>^>J>f>1>8 = =h=0^>o> ܢ>س>\>r?>TV> >8u==GW=0e=`š==|i >0#'>j.> >_>9 >L==$>l:>%>̾ >>8= E=d"==x >;[>1>9>>>Np>@>_>>Ɍ>^O>|ϓ>Ξ> >>ʞ>>>0b>&(>P==@=@>l:>*>6!>">\@>L >x(>>l >>-==H>?;>hG>>(n>D>n>xm>n.>>=0== %=TN>>(>F>??l?G>(b>>>dg>2+> >h=k->tB_>B߇>pd>>R>tŚ>'l>ps#>==xO=q=0Z=Aj=켼BcMo;<\z<Ȍ=(>|)Y>0>>>P=`>`/F>?>l]>g>_>u>jg>r>.>|>ڸ>q>c>e>}?6 ?? ?n?`A>ji>m>rƍ>F>>H>Ћ>t>pg>DU>->=Β=p3=e=.=`4̼ X@,@}˽`.mP#==h==>#8>.$> >>l6>$s?>8>\o>#>R|>2!>B>;>NN>.Y>>F~>dLE>7>XV>P>9K>j>u>>(>,>&p>d}>>&w>e>d\>t >ԩ=0eY=c<+8*xغ)Ͻ=XC8-|)(Kͽxs(o9ܽhཨӽ`oaN@lڽNyM3;%=@>I>.>v>K>>>>j>r>8e>?1> "(>HDS>u>>6>(>V#>tt>K>0(>4!>>H==(===?= >$><>_>a>+>>>`C>Y>Q><6>*>> >LJ>>v>̬>2V>>N>X>|~w>ق>U>d>t >>6>>K>> >dOl>'>R=h ==T> E>}>ͅ> q>-R>m3>d~>q==pA=E==D>4Vm>>>>,q>HE`>2>C>4R><> >BC> i>2>>@k>R>">">Xi>7>>仫>Ɍ>\{> l>T>6>>,''>8U>rN>Xg>ΐ>^>ȢM>4>%=׃=Rw==0w=@P'=5P( pZ֒<(=\>7>F>@B>>>8>LI>(a`>>>>>@>ҋ>6>v>>Vz>0>ڒ>l ?4?ړ>U>> >D>2w>&>.U>hmD>9>F>8=x= =j= <`<<;Pc,K<0ʽ޻Ȯ=>,5>r'>>p>==Z>>>$>0>*C>\>p?>RҔ>8>>p>d>R>8>4.> U3>A>Z>pu>Hr>f>Un>q{>>f>\o>J>2>>8=( =_=p=@X`ռp0PKt"˽4`'l3tp "սkL\02Ш,`O^ ꁽבѾž%1(-uIDh:uNݾJQ -qѾX6Ӿ :Oƾr馾p4Q,01"|,ڽ@mRH! q˼PԔ V p s ٤Pb0{8 ;p@=@ӎ=p\=`=ج=|)=L)+X(>{D]H=Pm>Z=Xi= <(󇽈鹽@ vj#==Ȕ=0=f >.>a>"+>ؤ,>,!>=@.= ><>z>D> >H>>>>>l&m> =>>==:\`&=t==`/= 0>>,>>=B<\@olG@I<==\ >b>*>FX>t>d>џ>T>>k>$k>]>U6>>&U>,>ά>43>>|)>>>>>'>j>݌>0>A>>>lg>2>>x?=ؐ=9=~=ͅ=ؗ==`>9>ȍ>ܮ >X=FX!8rd;܎>J>>C>>.>>%>ȳS>Pw>&>=>>k>2">9>>>j[>O>>>>>B%> >y>0>N>>Q>>>>>F2>(>"> $o>k>Qc>>w>r>>h>d=>7>[> ڈ>x>>:>>ל>/>s>(@a>ȓa>Wh>l{>b>Lp>>m>~>V>Z>9>T> >̓>b>r>˟>f>m>\>>Q> =@[= <Ι<`p= >A/> )>q,>P A>6N>`Bf>\u>Lc>X)>==4d>F>lv>>>6 >4]>V<>{&>y>+>C>(`S> hS>X>y>4>Jɨ>,> >p>Җ>>职>N>4>pu>\W>->>>d]>$> 7>O>71>,>(=x=4=>=ѹ= c= ¼?޽%/{F`aK*9M=H= >=B=5==>?>\vQ>e>D%n>~b>L>A>E>N>X>{>|7>E>U>2>̯> >>s>ZS>b>K>C>P5>'>= JG=z<@'@mҼ +@[@M`pF@ XaGTLxid0=n |<09=[ >|8E>\:>%>Ȯ>===0%=z=>=`h=i=H >@[>>B>>y> 5>;=!=%=`Ʈ=\>)>p0>л>HS >|X>@ > >=0μ=|=e==p=(=o<`2n t )lfVPۜxӽ~!@0l`-,T69hO`'ln߾Jضپ̾ǾXvl#D*^Ӿ ׾O޾ھBܾ2ݾ8վ;hԾѾtԾھCܾҪ*NھXHP޾BhK쾤m  Ua^Pc,K@9>j%9k-VWo5lݾ]վU¾.x妾\H=x=J=H:P0(<ʸ=$>#>,)>pR$>н=P\E=@^<ڼ6JW `b` ѽEs==== 0=@):<e<@c<=`G=o=P=H'>>>9K>C>=>k>Z>*\>З&>hh>=` G=F<=PI=d>P;>*p>&>7>">0$>"t>$a>>:>81>H="ϽP\^8=ƒ===P;=N=x ==x=;=0y=P-= =;=H/=8.==>K>>>.>h>B>>ԕ>>O>8">>b>\">TmK>>"A>N>|>8c>>>@>>j> R>@>v=XH=`]==ͽ=====`q=@#=@8-<+L>*>V>0>>¢>2>dh>J>0HZ>k>y>9>`>>>f>>(կ>>A>R>>x>8>س>h:>8|>:*>Dͨ>>&^>~>`>@[?>(],>>.>0= > #.>8X>f>N;>Ց>c>>L>(7>K>sh>N>>α>Х><ӎ>o>=>W>##>HC>0F@>42G>m>||>`n>la>PO>Xf$> =Ha=ӣ= ==M= I:=<Ǻ8 \˽콼sHϽ@[eu =X=X>&>>\==^'=]=Hc>N>:w>X>$ו>z>$R@>=֒=@v==$ >H>">8@&>t:>=D>l5Y>i{>)>6w>$cF>2>pc*>={==`<Փ<@\E< =pu==@B< 0c?S<@PüEMD|Uzጾ6bܩ[=8=c=> >h;>_I>XIY>j>^>W>Y:>x>` ===p >B>O>>> >T>(}>HH>+>#=f==9=];BriT(½P ۽ )K;If5DV2(04!Ash܀nY` `{= c====X=d=y=0?>@V>X>Q>$R@>>q==C=<;dƠ0<6< =:=2=#=P#=<`d<@h=@O< ׼gXާ 㽠@|xm)Ѳƽ`x }Fý@ F.t6<;LrXؓZXHD"(^4]x}lhھ  vheZ0DeܾѾ̾NP̾ ѾؾV7vھpþV%A)x߃>Ԭ<\l4x9(wξ.վ`۾׾Ӿ ƾ Ffžվ;8vφi%^) u%   $x,+(7PBhGl龖Cľʳ4dԧ<:O}h;s4J܎8۽p"xȟ&V }\:ՎFpI.'mKȝ (a`ÐPĢ"ȩ V">юMr ♹;4о w@D|*9ٲbqľ:ξľa=Hȡ ꁼy=k= ><=pV=w=u=8S=|>>$=j~=(҈==(+=p=(==ߦ=$=8;=`<kԼZǼ;l;W< X====آ== =ߑ== =(==`=HQ==΄== =5>k>E>|y>=y=0V>A>.>S>`>>Җ>>(_>|'>h==@'===x=!>->(0>1>:>|'>=0=@A=<@<_:@ RxнB` n0\S==a=h==e=s=0k=.= >K>5q>t>x}>>>R>4f>>>챑>l>D&G>\)>M=>|\k>"~>>͌>\>$->>>><>L>P6>`=;@!Z=xƧ=p`>`4>DJ>5/>4C>H=h=&=U=0!=p>_==j=#i=L===p>T[>>>>B>>>@>!><ԛ>TW>L2t>D^>05:>8>4p>>>>>]>l>8 >j>>8A>!>X> >pQ> >ȝ >x&>,>X>D=8B=#=0j=P=)c= 5=@ݨ<ʻ4h@:@[=l3>x>t>G> >r>\>淑>/b>>dm>'>H>>7>p>>>>T>Vi>ֿ>>n>>lp>X69>Xh>>H>`Z>> >y>0>T>>@>pt>0W>i>||>^>l@>7>D>R>S>2U>`>3P>L>ha>Ȑn>>Ӝ>>8>>ٝ>^P>$vf>@>=>pC8>tN$>@>@(->pO>J>Ѕ>H=к==]=p=@*G=๫&>`,> >X=0o=={= >E>}>\>7>c>> >->:>)R>g>F>4>ˊ>0>n1>s>O>1>a!>d">Hd>@ ===x=PK=&X=`fX=廾m1žʾRǾ˾ ɾO~;y3}fЍ`8@޾XiR^߾xڄ4`Y<<VHVk@_`2=(==&=>MA>x]>Q>$">,==@<@ <;<<;:7'gK@{*<`X5>,]>4o>4d>Q>>x=,=@X=@= f=s>?#>|H>dn>r>>>t>vM>ȸ>Ї>t>>~f>;>le>4> +>U>bӀ>V>ު>\>t>>.>ٹ>M>:5>"=G;=y,=P[=H$=e(>d">p >p>x =D=P. =+<9| KT\:<<< <0=3==TX>k>Ti>>O>*<>/>:>`d>@k8>>==p'> E>X>Sh>)>ן>@&>ݷ>>rP>]g> >O=0w=h̍==0̢=p"=Y>h=`f=p=й=)= x=@< ,;>S>=c>S>>>Y>9>طL>~T> 7>@0>T4>$>t>7>W>46{>>D>b >L>j>j|>>ȥ>y>:>9>k>">>>^>>>y>;>Pc>TV>D9g>Iu>$j>_>Ĺm>_v>u>|mq>*U>]/>4A3>L/M>$d>g>*>)>q>4P>($>V>> >Z>%/>|'>o>Hw=y=<]<2=C=&=⺠漀"0@&p(*</5=4=+=n5=ri<*küg;?>Hx>>4w8>&>]!>@/>7>h~J>6_> s>0b>)>H>===|,>`Z>hu>< |>F>:>y{>Ԫz>,^>9H>8>>3>>>X0>sF>Yj>r>K>p>H=@LS=@g<L`^;3;@jL7"PTýR(ҽHʁټ~8@/<q=&==2=>l:>E>Ԅ:>2>$1A>L>L>E>C>trJ>@P>pO>>>$ 5>$>'>ȀA>PQ>g>kv>h>sF>%>x-=g-=@'ͅ `vѽX*ܽIJ+P)((^k t̽%ս0씽P{*`<1=H=>X">8tE>%H>h:><>I/>N> c>pQ>T)>1>2>!O>p"m>x>>>}t>$\>HR2>=<`\<%===>4!>p >S>>=.(=;񖼀~üD"0$轠zI\@0-V(0Y8d @\<R@y0、X)7lJЄr~Xم}Np4씾T񊾨ʒ<PջVǾ0ϾоHξľZ˻dξNPx ֓& Zg׽+R̭)ȾEоH׾ $߾yξ D8]\dӚHRrtʾ+zR(ݾlϾd^~Π(6٨V FξlG쾨0 ."y''!NbӾиgrӾLݾ׾rӾh;|HZ'N$_,$ 5uG^`N߹իьD[& X xD-=H7eR̙pﹾľRľl4ŝz\"tql}6T pS˾lȾ02ێ3-˽ T Sz`Dh`h*==8=D=@<<<Ц="$=>==H=Q==t=o=hi=N==`= Mn=7=;0@&H(h&AXH>ܰ%><;>|:_>ga> R><7>>8=eH20:GF.m<%=`I=(,=8 =*=<nm<6<`j$ЧfU;[޻ 0Ӿ0ځD#:0#[=Q=8>>r> >^>`>>>ȏ->E>t>d”>8>ܐ>>:X>D>=l=t=Ь=`=\>t)>^<>d>T>~>i>'>2>=9= E= =O>E>ha>`N>$>8T=>=<V<D={=pI= =m===ӣ= 4<^< oz=L=t'>l>6?>8ǯ>:=>>j">5\>_#>p/ >T'>>X/>4V>cM>r.>D>F>,m%>LQY>w>>^>o}>X>'>$ >_=m=r=j=%=`p===>=藟== >\0>+>y >=`6<@f~<=@>#l>v>TI>(>{>h>Tk>4hL>j<>L:>u6>(>\">`a>Y== >`;>S>Ћa> >y>>>w>.>>؄n>AK>N>S>(i>i>b;>B>>>D>t>ra>O>>h> ڈ> >~>Z0>bӀ>O>L>l!>[>ց>> #b>NN>ST>i=>|>=r>>DJ>,]>ZC> >8q=z9= R@=d=Hۇ=05=+=:Aj-@#ۼ<@=$>>` ==Z=R;ǻ`(xO>`ux>P~>|>v>p>8N>J>>$>x>HH>+>|>L>H4>O>dd>t{>O>)>0o>M\>`H>|(>y >4>=0)==p=,5>x.>DI>,H>]/>H=@ b= 8ů$ p@LӼ[C;~?E=09:0= =S==[> >>d:2>84>?;>8R9>_#> >'> >>`>{>,os>Xn>y>u>]:>pF=0W=2=> />ri>ʼn>>to>v>A=>=uDYY>sI>-=>P*@>tO1>5> $B>+>TZ+>!>TH> !>@X>">9>,j>xm>7b>RC>M>l=` <(=T=^==== ==˷=x}=U=@J9=F<@qY:`<@5 G+@q?޼\ἀ|`J kýp` #Idnt^VU(yx‹Ԓtb栾5 vt+,'>Ե.$:^bƾȾJ1;nw׾fBl߾ 澒&4QF8O :fϾj҄V~^> C&LѾT"f۾f;RN X `@dqx2¾X%羪FigOڣ&Ͼ| :&þ(о:v\w 2S ."BX24)2˾T8qؽnȾ3ɾX0cQqEK꽐X8+dOlZrRZ᜾bn,ȞHT$FSQnh62D H0 ;b,f}n*)~Ͼ|ʾG|9q`$^gv㊾XݚP*h(\Tih`ĔiGe`uP T-v=<E<4<@X<u4::<"=@#< bЄh9OBl<=;@w4 xJ$*p/ 6!.S<@I,=@ U=<-=c==X%=c=` =@ U=@<0\S=xK==k>|6+>XN>@i>r>#l>Lc8>¸=g;@ o(ɽlp6潐=6"<< =0c?=@ <JIldPJK |dҖ(+> >pi=`=;=S=8=>T8>\>˂>Ԑ>vL>N>2>L}>*>= =c== >1/>4{l>B>n>Y>h]>M >=HR=== 7>J>$>=pP =@13<\:]<@=8Q====` =>,8>>=m=J=@= >\#M>>N>6>>¢>>s>'>\h>ܑt>a>n>>><\>*>H >`= f= ">vM> {s>nR>@i>,>{>s>L/M>v'>>=΄=pVX=0= h=X=P==|$>/.>7>@>sI>y(>h>=d==`՚==j >7>ؤ`>Du>>9x>@c>@ol>>F>Ȏ>">/>|t>$s?>k>= =>B>y>ԙ> F>^>>?>M>>D%:> > >$>TV>4r>>>>X>>Ϲ>>ج>ã>>->s>Yj>Xu>>*>>jކ>zY>v>9>r->>}>Ћa>|JX>S>h>d>8ƈ>z><>@>% >=@KF==P=X=` =`W弨ދƽ֒@ ＀<= >4 4>|>`= oz=is>2">>>ë>@k>L >H\>uN>8>%>q>h> >7>l[>l>4>X>>8O>>4Ft>iU>H6>PK >== r=$==>0>*>>>u="=ӕ2Bν9漀*9<~5=P|7=[<b;ڪ0]ෑPb=ph=4>|6+>J>W>E>7.>D>P>{&>$>,>\5>/>8A>~>>>J>>>`.>h=A= H-= =8=.>y>v֠>ư>O>\0>P=sM؏&F,W,nf8.Gt\x禽 ƻ T;] %YHb[$?: - =@U=8=;<lFEu=V>m(>XV>tU>>8}>Tk> V>E/>!>j.>l->/>?>Dg>1>wZ>zb> e>P>Y!>=P={=0]`=щ=(==p=Ƅ=Pu=t= ==]=9=a;{ἀa N*+L|p_^yU1 Dy`, &T:eE~$ƏA|s~pޭ2̢˾۾X㾾VЭپ1оVݿErtʾ襾pPp؆鷾&оپP:`\uľq\O` SͽJp,D}dϾ|lXᄊn4B'ԾJǾ*¾Vþ<˾߾t0 hY}Ǎ[ 7r"-.O7'0]KJľ3TG`P]ZʾaվTо4ξdXwTG @ $_Jo7`@\xkQAx0 ˉ}X 2UbDL^".|걾܎j&ʾ Ҿľrں(;4F睾dDT1~6NL. 4|# Hݽ8ֵ@ bf0%===P=@~===t=<H;ݼ`+FPݽ޽@ HxQ< ~=`=y4RDd.VJ0`J<7e=֒=Aj=P:=(=#==`<X<<o;M=>84>L>?=<>P}ĽEKR< =`h04->z<>6!>=8=0=,===>80> w>֞>"c>Ƭ>>>v<>hn={=`===t>+>!>%>>>{>m>ЛZ>xO>O[>X%g>5K>S>0=T0= ɼ@+Լ;= Q=s===PN=:>|Z>X&>">=0=0=ڸ=I>I>< b>b>|G>->B>>?> y`> ~>hЍ>d>>P>l3>e>$)>Љ=$>=_4==f5>x>g>>ra>Z{>̞M>=Y=@"<z{;WIU>'P>4<>L>@=<@LuK> r>|n~>Qx>_h>08a>ln>U>b>ţ>3>:>Q>+P>>=Л=<[ >=K>R>n!>\>.>G>[>>(j>TK?>2+> u,>_P>_>ŝ>a>>*>>p>Z>՘>Bώ>x>ܮ>>h>[T>uG>L>y@>Z>H>`֍> >b>Z>p>t`7>d]>@ >\>>h)>pC> J>@>pS1>7#>T>=<0`ٽp2S[d@):==>>>@==4hr(;<̆= >z><>&>>;>b\>a>/>>&=X==|%%>Hp>zj>T>$ǜ>zY>>s>z[>8>h'>A>Y=H =xč=R=(=~<>$gz>J>}> E>=`eK= ֻ)Hb` <`<;:03:0](J8Ƽ|Sۼ#<0=H>2>8U>=>xn>H==g=0= =>8>Y>xz>>8s>ķ>Jb>lU>i>$>`>M >>p>X>>>@>B>>h9Y>Ը%>h=@%<H ٽ_9/*8sg@)<^C<ݻ\ i`.m@J9#<<.;%>L==$>\4S>Mn>{> ݂>8N>>R>(:>f>>0|>g>\5`>p>>>*©>>V> R>4>>=j=8==P=p===H== ==x=T0=< TBжs(ýh0ýJ_h;Nw;z۽`\<^6V6,HזSvG4 d&8ajd~ޙ8BȾd;Ӿ^׾E׾ZоϾpv Ln s^Ͼn<殾䗾ɽPϾ< SRdþ_`bXp9->ln",ľ\"ھ=޾%޾><ھNϾtȏǾ֔;Vk˾gǾXϾ8۾.?3Hݾd ;9dnS$y[*j"i 뾊ĺ$=`˾R>lrPDwPpКM=kB<NiUpS\hbɾľol@4?cS-O2<`b==_=؏=pP=`-`=e=%=@c?<@Aj@M``{I>LH>=P13=pH޽⽰Mж@O =09:=p&=ӕ;y,9D@.1@p"Y0@XpR8U4$ܝpǽZ>xp==̷<< <@Ģ<=h===>0>>6>>>$~>ZJ>{=R=*=P=P=z<>ʭ>♟>nv>9>(L>)>>>O>>(==(=(= >G#>Y:>">d]>V> >04->|A>6>d>x=>==1=n>(\>,> > R>;=`==$_>(7>k>х>4>֗>.ߎ> w>4B>@ >(r=P8=o=Hf=K>>>>Hu>,>> 5>=<üڼ`;@=D">L>&p>Ltr>fi>T8S>\>Q=@=ԼyFY;NJ=>A> ]>tuq>p}>|i>07T>0d>

p#z>_>o>X{>p>>>N>R>>覥>n˚>>Y>>2ݨ>>h>&>>\q>4o>y>P>r>>g>2F>>*>>G>"A>^>i>DI>W>fT>\5`>9>^`>> >3>>6r>xt>`6>X=x=M=+=X!>$dS>( v>4>}> U:>h= =v:"5=p=m<@P>JO>(>l>9q>A>s>3==Y:==(=0! >lX>>R>lk^>HE`>LO>hA>8D><>>i6>d6>>=5=h==i=h3>dg>F>xQ>Z>+>g>=FJ=)>p5>Q>\i>>>&>5c>@'>j=`pk=1=`=`=>\Wl>)>$ڼ>>'>bL>PG>=\=Ht.40z+p0]̛;50;N;@ @!B齀W޽c'znyc;=T>0>P>$^>R>+>>hI>->h>*>,>*>#?>`>,Ј>@k>><ˆ>@v>>>|>=8=rw=Aj=0ܛ=8=L> >F>>`P=԰=Z=<(;޻:޼`Çнhݽ ƽP嚽*32;뀻t46hi( Jd),𝘾\ꆾh|9xfdg(䁾 ̖<ըҖ?N& ¾"10ɾھfNIfFѾt`t+ɘ tž:PӾ:LF?꾒پ@þ2!YBp$ oF⬾Ҿ`r޾۾JѾ3b8\F׾>U 侚۾׾@޾ !c(BZ̾f8R*Ktغxô(浾vLJ{Ԩ`,J܎MJtp0Y6|H>W)x`J)RhNRԩml|~̆t^H|rfCesC۝.x丄Hc~̆8fIjΧP~|Fxhh HSξ;BFC> _>T >H> D==>2>$>p>đ>>`U>>2E>>>->B>V>8=xH=|)=M=H=!>\5`>\ڍ>F>y>6c>dӚ>Lu>&$>S=P==N>0#'>/1>Ї->g>>0]=h]=p6=>8r+>K>a>1R>xS>Xw>=x>wP>(,4>x>8o>f=(=P>>g->\O>t> >d>m>>N>p=0b2=`᤼@I@;W=G>n>xn> yY> e3> = )=Cσppp7s0> = =,>|T>Fi> Y>#I>:5>=PJ=<}@KZ5>8>8>3>5><1>d:>]c>s}>~>h>(K>d0>g>X>,=d>8>X:>U>>>>>`>{>\> 1>TG>,m%>`>2>@>Թf>B>n!>&>\>f>\>>D>>>>u>ΐ>>Xv> >&o>>ю>(>>9|>l>_>P>e>>,X>>&> >s>>(=p뻠,*~|=0=8E==Ō=0=`c==8=pa> S>#>8;>0E3>C>q >=@=p7=0> c>^>>>#>>A=>`=0w=9==L=&==t>l">h>D!> >0=Ic=<^ ;@ܼ݅h&dS[޼:)<=@=J>8>>&=$L= f<4"=஋=H>>C>0]>HeR>8>;.>00>l->T>><_?>лL>/B>K>e>b>L>Xg1>8=(=`<ʻ`;}>~ޙ>l>#>>G>(Ŷ=fBo=`>>>>:>_> r>#.>a=c#=:P8B${; ==M=P=j=\7=7ܞ>#>T]>0&N>x3>$q%>02>?>=81=E=p=x== >,5>K= =P=D=CϾpS˾"wپ龜Q*@:ھf6xtx RpZWľDǝضskP