优化自定义交叉反馈
This commit is contained in:
@@ -408,6 +408,20 @@ export default function EffectsPage() {
|
||||
const sceneDisplay = sceneLabels[sceneIdx] ?? "";
|
||||
const crossIdx = clampPickIndex(crossfeedVal, crossfeedLabels.length);
|
||||
const crossfeedDisplay = crossfeedLabels[crossIdx] ?? "";
|
||||
// Custom crossfeed values: fc in Hz, gain stored as dB×10
|
||||
const crossfeedCustomFc = ds?.crossfeed_custom_fc ?? 700;
|
||||
const crossfeedCustomGain = (ds?.crossfeed_custom_gain ?? 45) / 10;
|
||||
|
||||
const [localCrossfeedFc, setLocalCrossfeedFc] = useState(() => crossfeedCustomFc);
|
||||
const [localCrossfeedGain, setLocalCrossfeedGain] = useState(() => crossfeedCustomGain);
|
||||
const isDraggingCrossfeedFc = useRef(false);
|
||||
const isDraggingCrossfeedGain = useRef(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (!isDraggingCrossfeedFc.current) setLocalCrossfeedFc(crossfeedCustomFc);
|
||||
if (!isDraggingCrossfeedGain.current) setLocalCrossfeedGain(crossfeedCustomGain);
|
||||
}, [crossfeedCustomFc, crossfeedCustomGain]);
|
||||
|
||||
const hearingIdx = clampPickIndex(hearingSelect, hearingLabels.length);
|
||||
const hearingDisplay =
|
||||
hearingLabels[hearingIdx] ?? effectText.hearing?.emptyProfile ?? "—";
|
||||
@@ -527,6 +541,69 @@ export default function EffectsPage() {
|
||||
<span className="text-[14px] text-white/45">{crossfeedDisplay}</span>
|
||||
<ChevronRight size={16} className="ios-chevron" />
|
||||
</button>
|
||||
|
||||
{/* ── Custom crossfeed sub-module (shown when Custom / index 3 selected) ── */}
|
||||
{crossfeedOn && crossIdx === 3 && (
|
||||
<div className="mt-4 border-t border-white/10 pt-4 space-y-4">
|
||||
<div className="text-[13px] font-medium text-white/70 tracking-wide uppercase">
|
||||
{effectText.crossfeed?.customTitle ?? "自定义设置"}
|
||||
</div>
|
||||
|
||||
{/* Frequence — cut-off frequency 500–1000 Hz */}
|
||||
<div>
|
||||
<div className="flex items-center justify-between mb-2">
|
||||
<span className="text-[14px] text-white/60">
|
||||
{effectText.crossfeed?.freqLabel ?? "Frequence"}
|
||||
</span>
|
||||
<span className="text-[14px] font-bold" style={{ color: "#00FFF6" }}>
|
||||
{Math.round(localCrossfeedFc)} Hz
|
||||
</span>
|
||||
</div>
|
||||
<CyanSlider
|
||||
value={localCrossfeedFc}
|
||||
min={500}
|
||||
max={1000}
|
||||
step={1}
|
||||
onChange={(v) => {
|
||||
isDraggingCrossfeedFc.current = true;
|
||||
setLocalCrossfeedFc(Math.round(v));
|
||||
}}
|
||||
onRelease={(v) => {
|
||||
isDraggingCrossfeedFc.current = false;
|
||||
const fc = Math.round(v);
|
||||
setLocalCrossfeedFc(fc);
|
||||
updateSetting({ crossfeed_custom_fc: fc });
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Attenuation — 1.0–15.0 dB, sent as value×10 */}
|
||||
<div>
|
||||
<div className="flex items-center justify-between mb-2">
|
||||
<span className="text-[14px] text-white/60">
|
||||
{effectText.crossfeed?.attenuationLabel ?? "Attenuation"}
|
||||
</span>
|
||||
<span className="text-[14px] font-bold" style={{ color: "#00FFF6" }}>
|
||||
{localCrossfeedGain.toFixed(1)} dB
|
||||
</span>
|
||||
</div>
|
||||
<CyanSlider
|
||||
value={localCrossfeedGain}
|
||||
min={1}
|
||||
max={15}
|
||||
step={0.1}
|
||||
onChange={(v) => {
|
||||
isDraggingCrossfeedGain.current = true;
|
||||
setLocalCrossfeedGain(v);
|
||||
}}
|
||||
onRelease={(v) => {
|
||||
isDraggingCrossfeedGain.current = false;
|
||||
updateSetting({ crossfeed_custom_gain: Math.round(v * 10) });
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* ── 音调 ── */}
|
||||
|
||||
Reference in New Issue
Block a user