EG/plugins/user/audio_reverb_effects/effects/reverb_processor.py
2025-10-30 11:46:41 +08:00

1039 lines
34 KiB
Python

"""
混响效果处理器
实现专业的音频混响效果处理
"""
import uuid
import math
import numpy as np
from typing import Dict, List, Any, Optional
from scipy import signal
class ReverbProcessor:
"""
混响效果处理器
实现专业的音频混响效果处理
"""
def __init__(self, plugin):
"""
初始化混响效果处理器
Args:
plugin: 音频效果插件实例
"""
self.plugin = plugin
self.effects: Dict[str, Dict[str, Any]] = {}
self.comb_filters = {} # 梳状滤波器
self.allpass_filters = {} # 全通滤波器
self.stats = {
'total_effects': 0,
'active_effects': 0,
'effects_processed': 0,
'processing_time': 0.0,
'memory_usage': 0
}
self.buffer_size = plugin.buffer_size if plugin else 4096
self.sample_rate = 44100 # 默认采样率
# 初始化混响参数
self._initialize_reverb_parameters()
def _initialize_reverb_parameters(self):
"""初始化混响参数"""
# 梳状滤波器延迟时间(毫秒)
self.comb_delays = [1116, 1188, 1277, 1356, 1422, 1491, 1557, 1617]
# 全通滤波器延迟时间(毫秒)
self.allpass_delays = [556, 441, 341, 225]
# 混响衰减系数
self.comb_decay_factors = [0.8, 0.75, 0.7, 0.65, 0.6, 0.55, 0.5, 0.45]
# 全通滤波器系数
self.allpass_feedback = 0.7
def create_effect(self, parameters: Dict[str, Any]) -> str:
"""
创建混响效果
Args:
parameters: 混响参数
Returns:
效果ID
"""
try:
# 生成唯一ID
effect_id = str(uuid.uuid4())
# 默认参数
default_params = {
'room_size': 0.5, # 房间大小 (0.0-1.0)
'damping': 0.5, # 阻尼 (0.0-1.0)
'wet_level': 0.33, # 湿信号电平 (0.0-1.0)
'dry_level': 0.4, # 干信号电平 (0.0-1.0)
'width': 1.0, # 宽度 (0.0-1.0)
'freeze_mode': 0.0, # 冻结模式 (0.0-1.0)
'early_reflections': 0.5, # 早期反射 (0.0-1.0)
'late_reverb': 0.5, # 晚期混响 (0.0-1.0)
'diffusion': 0.7, # 扩散 (0.0-1.0)
'density': 0.5, # 密度 (0.0-1.0)
'predelay': 0.0, # 预延迟 (秒)
'high_freq_damping': 0.5, # 高频阻尼 (0.0-1.0)
'low_freq_damping': 0.3, # 低频阻尼 (0.0-1.0)
'stereo_spread': 0.5, # 立体声扩散 (0.0-1.0)
'reverb_time': 2.0, # 混响时间 (秒)
'tail_density': 0.8, # 尾部密度 (0.0-1.0)
'modulation_rate': 0.1, # 调制速率 (Hz)
'modulation_depth': 0.02 # 调制深度 (0.0-1.0)
}
# 合并参数
effect_params = default_params.copy()
effect_params.update(parameters)
# 创建效果对象
effect = {
'id': effect_id,
'type': 'reverb',
'parameters': effect_params,
'active': True,
'buffers': {}, # 各种缓冲区
'comb_filters': [], # 梳状滤波器数组
'allpass_filters': [], # 全通滤波器数组
'modulation_phase': 0.0, # 调制相位
'created_time': self._get_current_time(),
'process_count': 0
}
# 初始化滤波器
self._initialize_filters(effect)
# 初始化缓冲区
self._initialize_buffers(effect)
# 存储效果
self.effects[effect_id] = effect
# 更新统计信息
self.stats['total_effects'] += 1
self.stats['active_effects'] += 1
# 在插件中注册效果
if self.plugin:
self.plugin.effects[effect_id] = effect.copy()
print(f"✓ 混响效果创建成功: {effect_id}")
return effect_id
except Exception as e:
print(f"✗ 创建混响效果失败: {e}")
import traceback
traceback.print_exc()
return ""
def _initialize_filters(self, effect: Dict[str, Any]):
"""
初始化混响滤波器
Args:
effect: 效果对象
"""
parameters = effect['parameters']
room_size = parameters.get('room_size', 0.5)
damping = parameters.get('damping', 0.5)
diffusion = parameters.get('diffusion', 0.7)
density = parameters.get('density', 0.5)
# 创建梳状滤波器
comb_filters = []
for i, (delay_ms, decay_factor) in enumerate(zip(self.comb_delays, self.comb_decay_factors)):
# 根据房间大小调整延迟时间
adjusted_delay = delay_ms * (0.5 + room_size * 0.5)
# 根据密度调整延迟时间
adjusted_delay *= (0.8 + density * 0.4)
# 计算延迟样本数
delay_samples = int(adjusted_delay * self.sample_rate / 1000)
# 根据扩散调整反馈系数
feedback = decay_factor * (0.7 + diffusion * 0.3)
# 根据阻尼调整高频衰减
damp_factor = 0.3 + damping * 0.5
comb_filter = {
'buffer': np.zeros(max(1, delay_samples)),
'index': 0,
'feedback': feedback,
'damp1': damp_factor,
'damp2': 0.0,
'filter_store': 0.0
}
comb_filters.append(comb_filter)
effect['comb_filters'] = comb_filters
# 创建全通滤波器
allpass_filters = []
for i, delay_ms in enumerate(self.allpass_delays):
# 根据房间大小调整延迟时间
adjusted_delay = delay_ms * (0.5 + room_size * 0.5)
# 计算延迟样本数
delay_samples = int(adjusted_delay * self.sample_rate / 1000)
allpass_filter = {
'buffer': np.zeros(max(1, delay_samples)),
'index': 0,
'feedback': self.allpass_feedback
}
allpass_filters.append(allpass_filter)
effect['allpass_filters'] = allpass_filters
def _initialize_buffers(self, effect: Dict[str, Any]):
"""
初始化混响缓冲区
Args:
effect: 效果对象
"""
effect_id = effect['id']
buffers = {}
# 输入和输出缓冲区
buffers['input'] = np.zeros(self.buffer_size)
buffers['output_left'] = np.zeros(self.buffer_size)
buffers['output_right'] = np.zeros(self.buffer_size)
buffers['mono_input'] = np.zeros(self.buffer_size)
# 预延迟缓冲区
predelay = effect['parameters'].get('predelay', 0.0)
predelay_samples = int(predelay * self.sample_rate)
buffers['predelay_buffer'] = np.zeros(max(1, predelay_samples))
buffers['predelay_index'] = 0
effect['buffers'] = buffers
def delete_effect(self, effect_id: str) -> bool:
"""
删除混响效果
Args:
effect_id: 效果ID
Returns:
是否删除成功
"""
if effect_id not in self.effects:
print(f"✗ 混响效果不存在: {effect_id}")
return False
try:
# 删除效果
del self.effects[effect_id]
# 更新统计信息
self.stats['active_effects'] -= 1
# 从插件中移除效果
if self.plugin and effect_id in self.plugin.effects:
del self.plugin.effects[effect_id]
print(f"✓ 混响效果已删除: {effect_id}")
return True
except Exception as e:
print(f"✗ 删除混响效果失败: {e}")
return False
def process(self, audio_data: Any, parameters: Dict[str, Any]) -> Any:
"""
处理混响效果
Args:
audio_data: 输入音频数据
parameters: 效果参数
Returns:
处理后的音频数据
"""
try:
import time
process_start = time.time()
# 如果输入是NumPy数组
if isinstance(audio_data, np.ndarray):
processed_data = self._process_numpy_array(audio_data, parameters)
else:
# 对于其他类型的数据,返回原始数据
processed_data = audio_data
# 更新统计信息
self.stats['effects_processed'] += 1
self.stats['processing_time'] += (time.time() - process_start)
return processed_data
except Exception as e:
print(f"✗ 混响效果处理失败: {e}")
return audio_data
def _process_numpy_array(self, audio_data: np.ndarray, parameters: Dict[str, Any]) -> np.ndarray:
"""
处理NumPy数组音频数据
Args:
audio_data: 输入音频数据
parameters: 效果参数
Returns:
处理后的音频数据
"""
# 获取参数
room_size = parameters.get('room_size', 0.5)
damping = parameters.get('damping', 0.5)
wet_level = parameters.get('wet_level', 0.33)
dry_level = parameters.get('dry_level', 0.4)
width = parameters.get('width', 1.0)
freeze_mode = parameters.get('freeze_mode', 0.0)
early_reflections = parameters.get('early_reflections', 0.5)
late_reverb = parameters.get('late_reverb', 0.5)
diffusion = parameters.get('diffusion', 0.7)
density = parameters.get('density', 0.5)
predelay = parameters.get('predelay', 0.0)
high_freq_damping = parameters.get('high_freq_damping', 0.5)
low_freq_damping = parameters.get('low_freq_damping', 0.3)
stereo_spread = parameters.get('stereo_spread', 0.5)
reverb_time = parameters.get('reverb_time', 2.0)
tail_density = parameters.get('tail_density', 0.8)
modulation_rate = parameters.get('modulation_rate', 0.1)
modulation_depth = parameters.get('modulation_depth', 0.02)
# 如果是冻结模式,增加反馈
if freeze_mode > 0.5:
room_size = min(1.0, room_size + 0.2)
# 创建输出数组
if audio_data.ndim == 1:
# 单声道输入,生成立体声输出
output_left = np.zeros_like(audio_data)
output_right = np.zeros_like(audio_data)
# 处理每个样本
for i in range(len(audio_data)):
input_sample = audio_data[i]
# 预延迟处理
delayed_sample = self._apply_predelay(input_sample, predelay)
# 混响处理
reverb_left, reverb_right = self._apply_reverb(
delayed_sample, room_size, damping, diffusion, density,
stereo_spread, modulation_rate, modulation_depth)
# 应用早期反射和晚期混响权重
reverb_left *= (early_reflections * 0.3 + late_reverb * 0.7)
reverb_right *= (early_reflections * 0.3 + late_reverb * 0.7)
# 混合干湿信号
output_left[i] = input_sample * dry_level + reverb_left * wet_level
output_right[i] = input_sample * dry_level + reverb_right * wet_level
# 合并为立体声数组
output_data = np.array([output_left, output_right])
else:
# 多声道处理(假设已经是立体声)
if audio_data.shape[0] >= 2:
output_left = np.zeros_like(audio_data[0])
output_right = np.zeros_like(audio_data[1])
for i in range(audio_data.shape[1]):
# 将左右声道混合为单声道输入
mono_input = (audio_data[0, i] + audio_data[1, i]) * 0.5
# 预延迟处理
delayed_sample = self._apply_predelay(mono_input, predelay)
# 混响处理
reverb_left, reverb_right = self._apply_reverb(
delayed_sample, room_size, damping, diffusion, density,
stereo_spread, modulation_rate, modulation_depth)
# 应用早期反射和晚期混响权重
reverb_left *= (early_reflections * 0.3 + late_reverb * 0.7)
reverb_right *= (early_reflections * 0.3 + late_reverb * 0.7)
# 混合干湿信号
output_left[i] = audio_data[0, i] * dry_level + reverb_left * wet_level
output_right[i] = audio_data[1, i] * dry_level + reverb_right * wet_level
output_data = np.array([output_left, output_right])
else:
# 其他多声道情况,返回原始数据
output_data = audio_data
# 确保输出在有效范围内
processed_data = np.clip(output_data, -1.0, 1.0)
return processed_data
def _apply_predelay(self, sample: float, predelay: float) -> float:
"""
应用预延迟
Args:
sample: 输入样本
predelay: 预延迟时间 (秒)
Returns:
延迟后的样本
"""
# 简化的预延迟实现
# 实际应用中会使用延迟线
return sample # 简化实现
def _apply_reverb(self, sample: float, room_size: float, damping: float,
diffusion: float, density: float, stereo_spread: float,
modulation_rate: float, modulation_depth: float) -> tuple:
"""
应用混响处理
Args:
sample: 输入样本
room_size: 房间大小
damping: 阻尼
diffusion: 扩散
density: 密度
stereo_spread: 立体声扩散
modulation_rate: 调制速率
modulation_depth: 调制深度
Returns:
(左声道混响, 右声道混响)
"""
# 简化的混响实现
# 实际应用中会使用梳状滤波器和全通滤波器链
# 生成基于参数的混响效果
reverb_amount = 0.2 + room_size * 0.5
damp_factor = 0.2 + damping * 0.6
diffuse_factor = 0.5 + diffusion * 0.3
# 左声道混响
left_reverb = sample * reverb_amount * (1.0 - damp_factor)
left_reverb *= (0.7 + diffuse_factor * 0.3)
# 右声道混响(添加立体声扩散)
stereo_offset = stereo_spread * 0.3
right_reverb = sample * (reverb_amount + stereo_offset) * (1.0 - damp_factor * 0.8)
right_reverb *= (0.7 + diffuse_factor * 0.3)
return left_reverb, right_reverb
def set_parameter(self, effect_id: str, parameter: str, value: Any) -> bool:
"""
设置效果参数
Args:
effect_id: 效果ID
parameter: 参数名
value: 参数值
Returns:
是否设置成功
"""
if effect_id not in self.effects:
print(f"✗ 混响效果不存在: {effect_id}")
return False
try:
self.effects[effect_id]['parameters'][parameter] = value
# 如果是影响滤波器的参数,重新初始化滤波器
filter_params = ['room_size', 'damping', 'diffusion', 'density']
if parameter in filter_params:
self._initialize_filters(self.effects[effect_id])
# 如果是插件中的效果,也更新插件中的副本
if self.plugin and effect_id in self.plugin.effects:
self.plugin.effects[effect_id]['parameters'][parameter] = value
if parameter in filter_params:
self.plugin.effects[effect_id]['comb_filters'] = \
self.effects[effect_id]['comb_filters'].copy()
self.plugin.effects[effect_id]['allpass_filters'] = \
self.effects[effect_id]['allpass_filters'].copy()
print(f"✓ 混响效果参数已设置: {effect_id}.{parameter} = {value}")
return True
except Exception as e:
print(f"✗ 设置混响效果参数失败: {e}")
return False
def get_parameters(self, effect_id: str) -> Dict[str, Any]:
"""
获取效果参数
Args:
effect_id: 效果ID
Returns:
参数字典
"""
if effect_id not in self.effects:
return {}
return self.effects[effect_id]['parameters'].copy()
def enable_effect(self, effect_id: str) -> bool:
"""
启用混响效果
Args:
effect_id: 效果ID
Returns:
是否启用成功
"""
if effect_id not in self.effects:
print(f"✗ 混响效果不存在: {effect_id}")
return False
try:
self.effects[effect_id]['active'] = True
self.stats['active_effects'] += 1
# 如果是插件中的效果,也更新插件中的副本
if self.plugin and effect_id in self.plugin.effects:
self.plugin.effects[effect_id]['active'] = True
print(f"✓ 混响效果已启用: {effect_id}")
return True
except Exception as e:
print(f"✗ 启用混响效果失败: {e}")
return False
def disable_effect(self, effect_id: str) -> bool:
"""
禁用混响效果
Args:
effect_id: 效果ID
Returns:
是否禁用成功
"""
if effect_id not in self.effects:
print(f"✗ 混响效果不存在: {effect_id}")
return False
try:
self.effects[effect_id]['active'] = False
self.stats['active_effects'] -= 1
# 如果是插件中的效果,也更新插件中的副本
if self.plugin and effect_id in self.plugin.effects:
self.plugin.effects[effect_id]['active'] = False
print(f"✓ 混响效果已禁用: {effect_id}")
return True
except Exception as e:
print(f"✗ 禁用混响效果失败: {e}")
return False
def cleanup(self):
"""清理所有资源"""
self.effects.clear()
self.comb_filters.clear()
self.allpass_filters.clear()
self.stats = {
'total_effects': 0,
'active_effects': 0,
'effects_processed': 0,
'processing_time': 0.0,
'memory_usage': 0
}
print("✓ 混响效果处理器资源已清理")
def get_stats(self) -> Dict[str, int]:
"""
获取统计信息
Returns:
统计信息字典
"""
return self.stats.copy()
def _get_current_time(self) -> float:
"""
获取当前时间(秒)
Returns:
当前时间
"""
if self.plugin and self.plugin.plugin_manager and self.plugin.plugin_manager.world:
return self.plugin.plugin_manager.world.globalClock.getFrameTime()
import time
return time.time()
def update(self, dt: float):
"""
更新处理器状态
Args:
dt: 时间增量
"""
# 更新调制相位
for effect_id, effect in self.effects.items():
modulation_rate = effect['parameters'].get('modulation_rate', 0.1)
effect['modulation_phase'] += 2.0 * math.pi * modulation_rate * dt
if effect['modulation_phase'] >= 2.0 * math.pi:
effect['modulation_phase'] -= 2.0 * math.pi
def set_sample_rate(self, sample_rate: int):
"""
设置采样率
Args:
sample_rate: 采样率 (Hz)
"""
old_sample_rate = self.sample_rate
self.sample_rate = sample_rate
print(f"✓ 混响处理器采样率已从 {old_sample_rate} 更新为: {sample_rate} Hz")
# 重新初始化所有滤波器以适应新的采样率
for effect_id, effect in self.effects.items():
self._initialize_filters(effect)
self._initialize_buffers(effect)
def set_room_size(self, effect_id: str, room_size: float) -> bool:
"""
设置房间大小
Args:
effect_id: 效果ID
room_size: 房间大小 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'room_size', max(0.0, min(1.0, room_size)))
def set_damping(self, effect_id: str, damping: float) -> bool:
"""
设置阻尼
Args:
effect_id: 效果ID
damping: 阻尼 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'damping', max(0.0, min(1.0, damping)))
def set_wet_level(self, effect_id: str, wet_level: float) -> bool:
"""
设置湿信号电平
Args:
effect_id: 效果ID
wet_level: 湿信号电平 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'wet_level', max(0.0, min(1.0, wet_level)))
def set_dry_level(self, effect_id: str, dry_level: float) -> bool:
"""
设置干信号电平
Args:
effect_id: 效果ID
dry_level: 干信号电平 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'dry_level', max(0.0, min(1.0, dry_level)))
def set_width(self, effect_id: str, width: float) -> bool:
"""
设置宽度
Args:
effect_id: 效果ID
width: 宽度 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'width', max(0.0, min(1.0, width)))
def set_freeze_mode(self, effect_id: str, freeze_mode: float) -> bool:
"""
设置冻结模式
Args:
effect_id: 效果ID
freeze_mode: 冻结模式 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'freeze_mode', max(0.0, min(1.0, freeze_mode)))
def set_early_reflections(self, effect_id: str, reflections: float) -> bool:
"""
设置早期反射
Args:
effect_id: 效果ID
reflections: 早期反射 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'early_reflections', max(0.0, min(1.0, reflections)))
def set_late_reverb(self, effect_id: str, reverb: float) -> bool:
"""
设置晚期混响
Args:
effect_id: 效果ID
reverb: 晚期混响 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'late_reverb', max(0.0, min(1.0, reverb)))
def set_diffusion(self, effect_id: str, diffusion: float) -> bool:
"""
设置扩散参数
Args:
effect_id: 效果ID
diffusion: 扩散值 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'diffusion', max(0.0, min(1.0, diffusion)))
def set_density(self, effect_id: str, density: float) -> bool:
"""
设置密度参数
Args:
effect_id: 效果ID
density: 密度值 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'density', max(0.0, min(1.0, density)))
def set_predelay(self, effect_id: str, predelay: float) -> bool:
"""
设置预延迟
Args:
effect_id: 效果ID
predelay: 预延迟 (秒)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'predelay', max(0.0, min(0.5, predelay)))
def set_high_freq_damping(self, effect_id: str, damping: float) -> bool:
"""
设置高频阻尼
Args:
effect_id: 效果ID
damping: 高频阻尼 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'high_freq_damping', max(0.0, min(1.0, damping)))
def set_low_freq_damping(self, effect_id: str, damping: float) -> bool:
"""
设置低频阻尼
Args:
effect_id: 效果ID
damping: 低频阻尼 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'low_freq_damping', max(0.0, min(1.0, damping)))
def set_stereo_spread(self, effect_id: str, spread: float) -> bool:
"""
设置立体声扩散
Args:
effect_id: 效果ID
spread: 立体声扩散 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'stereo_spread', max(0.0, min(1.0, spread)))
def set_reverb_time(self, effect_id: str, time: float) -> bool:
"""
设置混响时间
Args:
effect_id: 效果ID
time: 混响时间 (秒)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'reverb_time', max(0.1, min(30.0, time)))
def set_tail_density(self, effect_id: str, density: float) -> bool:
"""
设置尾部密度
Args:
effect_id: 效果ID
density: 尾部密度 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'tail_density', max(0.0, min(1.0, density)))
def set_modulation_rate(self, effect_id: str, rate: float) -> bool:
"""
设置调制速率
Args:
effect_id: 效果ID
rate: 调制速率 (Hz)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'modulation_rate', max(0.01, min(10.0, rate)))
def set_modulation_depth(self, effect_id: str, depth: float) -> bool:
"""
设置调制深度
Args:
effect_id: 效果ID
depth: 调制深度 (0.0-1.0)
Returns:
是否设置成功
"""
return self.set_parameter(effect_id, 'modulation_depth', max(0.0, min(1.0, depth)))
def get_reverb_time(self, effect_id: str) -> float:
"""
获取混响时间表
Args:
effect_id: 效果ID
Returns:
当前混响时间 (秒)
"""
if effect_id not in self.effects:
return 0.0
return self.effects[effect_id]['parameters'].get('reverb_time', 2.0)
def get_room_size_meter(self, effect_id: str) -> float:
"""
获取房间大小表
Args:
effect_id: 效果ID
Returns:
当前房间大小 (0.0-1.0)
"""
if effect_id not in self.effects:
return 0.0
return self.effects[effect_id]['parameters'].get('room_size', 0.5)
def create_preset(self, preset_name: str, parameters: Dict[str, Any]) -> Dict[str, Any]:
"""
创建混响预设
Args:
preset_name: 预设名称
parameters: 参数
Returns:
预设参数字典
"""
presets = {
'small_room': {
'room_size': 0.2,
'damping': 0.7,
'wet_level': 0.2,
'dry_level': 0.8,
'width': 0.8,
'early_reflections': 0.6,
'late_reverb': 0.4,
'diffusion': 0.6,
'density': 0.3,
'reverb_time': 1.0
},
'medium_room': {
'room_size': 0.5,
'damping': 0.5,
'wet_level': 0.3,
'dry_level': 0.7,
'width': 0.9,
'early_reflections': 0.7,
'late_reverb': 0.5,
'diffusion': 0.7,
'density': 0.5,
'reverb_time': 1.5
},
'large_room': {
'room_size': 0.7,
'damping': 0.4,
'wet_level': 0.4,
'dry_level': 0.6,
'width': 1.0,
'early_reflections': 0.8,
'late_reverb': 0.6,
'diffusion': 0.8,
'density': 0.7,
'reverb_time': 2.0
},
'large_hall': {
'room_size': 0.9,
'damping': 0.3,
'wet_level': 0.5,
'dry_level': 0.5,
'width': 1.0,
'early_reflections': 0.9,
'late_reverb': 0.7,
'diffusion': 0.9,
'density': 0.8,
'reverb_time': 3.0
},
'cathedral': {
'room_size': 1.0,
'damping': 0.2,
'wet_level': 0.7,
'dry_level': 0.3,
'width': 1.0,
'early_reflections': 1.0,
'late_reverb': 0.8,
'diffusion': 1.0,
'density': 1.0,
'reverb_time': 5.0
},
'bathroom': {
'room_size': 0.2,
'damping': 0.1,
'wet_level': 0.8,
'dry_level': 0.2,
'width': 0.9,
'early_reflections': 0.5,
'late_reverb': 0.9,
'diffusion': 0.5,
'density': 0.2,
'reverb_time': 0.8
},
'tunnel': {
'room_size': 0.8,
'damping': 0.6,
'wet_level': 0.6,
'dry_level': 0.4,
'width': 0.7,
'early_reflections': 0.7,
'late_reverb': 0.7,
'diffusion': 0.6,
'density': 0.6,
'reverb_time': 2.5
},
'arena': {
'room_size': 0.95,
'damping': 0.25,
'wet_level': 0.6,
'dry_level': 0.4,
'width': 1.0,
'early_reflections': 0.95,
'late_reverb': 0.75,
'diffusion': 0.95,
'density': 0.9,
'reverb_time': 4.0
}
}
if preset_name in presets:
preset_params = presets[preset_name].copy()
preset_params.update(parameters)
return preset_params
else:
return parameters.copy()
def get_frequency_response(self, effect_id: str) -> Dict[str, Any]:
"""
获取频率响应
Args:
effect_id: 效果ID
Returns:
频率响应数据
"""
if effect_id not in self.effects:
return {}
parameters = self.effects[effect_id]['parameters']
# 生成简化的频率响应数据
frequencies = np.logspace(np.log10(20), np.log10(20000), 100)
response = []
room_size = parameters.get('room_size', 0.5)
damping = parameters.get('damping', 0.5)
high_freq_damping = parameters.get('high_freq_damping', 0.5)
low_freq_damping = parameters.get('low_freq_damping', 0.3)
for freq in frequencies:
# 计算基于参数的频率响应
if freq < 200: # 低频
gain = 1.0 - low_freq_damping * 0.3
elif freq > 5000: # 高频
gain = 1.0 - high_freq_damping * 0.5
else: # 中频
gain = 1.0 - damping * 0.2
# 房间大小影响
gain *= (0.8 + room_size * 0.4)
response.append(gain)
return {
'frequencies': frequencies.tolist(),
'response': response
}