Path: blob/master/servers/audio/effects/audio_effect_chorus.h
10278 views
/**************************************************************************/1/* audio_effect_chorus.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "servers/audio/audio_effect.h"3334class AudioEffectChorus;3536class AudioEffectChorusInstance : public AudioEffectInstance {37GDCLASS(AudioEffectChorusInstance, AudioEffectInstance);38friend class AudioEffectChorus;39Ref<AudioEffectChorus> base;4041Vector<AudioFrame> audio_buffer;42unsigned int buffer_pos;43unsigned int buffer_mask;4445AudioFrame filter_h[4];46uint64_t cycles[4];4748void _process_chunk(const AudioFrame *p_src_frames, AudioFrame *p_dst_frames, int p_frame_count);4950public:51virtual void process(const AudioFrame *p_src_frames, AudioFrame *p_dst_frames, int p_frame_count) override;52};5354class AudioEffectChorus : public AudioEffect {55GDCLASS(AudioEffectChorus, AudioEffect);5657friend class AudioEffectChorusInstance;5859public:60static constexpr int32_t MAX_DELAY_MS = 50;61static constexpr int32_t MAX_DEPTH_MS = 20;62static constexpr int32_t MAX_WIDTH_MS = 50;63static constexpr int32_t MAX_VOICES = 4;64static constexpr int32_t CYCLES_FRAC = 16;65static constexpr int32_t CYCLES_MASK = (1 << CYCLES_FRAC) - 1;66static constexpr int32_t MAX_CHANNELS = 4;67static constexpr int32_t MS_CUTOFF_MAX = 16000;6869private:70struct Voice {71float delay;72float rate;73float depth;74float level;75float cutoff;76float pan;7778Voice() {79delay = 12.0;80rate = 1;81depth = 0;82level = 0;83cutoff = MS_CUTOFF_MAX;84pan = 0;85}8687} voice[MAX_VOICES];8889int voice_count;9091float wet;92float dry;9394protected:95void _validate_property(PropertyInfo &p_property) const;9697static void _bind_methods();9899public:100void set_voice_count(int p_voices);101int get_voice_count() const;102103void set_voice_delay_ms(int p_voice, float p_delay_ms);104float get_voice_delay_ms(int p_voice) const;105106void set_voice_rate_hz(int p_voice, float p_rate_hz);107float get_voice_rate_hz(int p_voice) const;108109void set_voice_depth_ms(int p_voice, float p_depth_ms);110float get_voice_depth_ms(int p_voice) const;111112void set_voice_level_db(int p_voice, float p_level_db);113float get_voice_level_db(int p_voice) const;114115void set_voice_cutoff_hz(int p_voice, float p_cutoff_hz);116float get_voice_cutoff_hz(int p_voice) const;117118void set_voice_pan(int p_voice, float p_pan);119float get_voice_pan(int p_voice) const;120121void set_wet(float amount);122float get_wet() const;123124void set_dry(float amount);125float get_dry() const;126127Ref<AudioEffectInstance> instantiate() override;128129AudioEffectChorus();130};131132133