     ## <img src="https://mojiemoji.jozo.beer/emoji/%E6%A6%82%E8%A6%81?font=toge&color=f43f5e&animation=kage_neon&background=transparent&outline=5ef43f&outline_width=2" alt="概要" height="20" align="absmiddle"> <img src="https://mojiemoji.jozo.beer/emoji/PR?font=hachimaru&color=ef4444&animation=bure&background=transparent&outline=44ef44&outline_width=2" alt="PR" height="20" align="absmiddle"> #298 のレビュー(Copilot / CodeRabbit)で挙がったスペクトラム DSP のハードウェア依存 2 件を<img src="https://mojiemoji.jozo.beer/emoji/%E5%88%86%E9%9B%A2?font=gothic&color=f87171&animation=chirichiri&background=transparent&outline=26dc26&outline_width=2" alt="分離" height="20" align="absmiddle"><img src="https://mojiemoji.jozo.beer/emoji/%E5%AF%BE%E5%BF%9C?font=pixel&color=fbbf24&animation=tatemoya&background=transparent&outline=06d977&outline_width=2" alt="対応" height="20" align="absmiddle">する。どちらも本物の指摘だが、#298(見た目<img src="https://mojiemoji.jozo.beer/emoji/%E8%A8%AD%E5%AE%9A?font=maru-bold&color=f472b6&animation=mochimochi&background=transparent&outline=b6f472&outline_width=2" alt="設定" height="20" align="absmiddle">の<img src="https://mojiemoji.jozo.beer/emoji/%E8%BF%BD%E5%8A%A0?font=gothic&color=ec4899&animation=zanzo&background=transparent&outline=99ec48&outline_width=2" alt="追加" height="20" align="absmiddle">)とは性質が異なり、特に 2 は<img src="https://mojiemoji.jozo.beer/emoji/%E6%97%A2%E5%AD%98?font=dela&color=f472b6&animation=kira&background=transparent&outline_width=0" alt="既存" height="20" align="absmiddle">の調整済みの見た目を変えるため独立した<img src="https://mojiemoji.jozo.beer/emoji/%E6%A4%9C%E8%A8%BC?font=tamanegi&color=06b6d4&animation=yoko_scroll&background=transparent&outline=d406b6&outline_width=2" alt="検証" height="20" align="absmiddle">が要る。 ## <img src="https://mojiemoji.jozo.beer/emoji/%E8%AA%B2%E9%A1%8C?font=kurobara&color=f97316&animation=nami&background=transparent&outline=16f973&outline_width=2" alt="課題" height="20" align="absmiddle"> ### 1. サンプルレートが 48kHz 固定 `FrequencyAnalyzer` は `sampleRate` の既定を 48000 とし、`SpectrumUseCaseImpl` もこの既定に頼っている。CoreAudio の process tap は<img src="https://mojiemoji.jozo.beer/emoji/%E5%87%BA%E5%8A%9B?font=akzk&color=f87171&animation=nami&background=transparent&outline=26dc26&outline_width=2" alt="出力" height="20" align="absmiddle">デバイスの実レートに追従するため、44.1kHz の環境では Hz→FFT bin のマッピングと帯域カットオフ(`min_freq` / `max_freq`)がズレる。タップの実サンプルレートを capture 経路から<img src="https://mojiemoji.jozo.beer/emoji/%E8%A7%A3%E6%9E%90?font=gothic-bold&color=d946ef&animation=chirichiri&background=transparent&outline=efd946&outline_width=2" alt="解析" height="20" align="absmiddle">器まで伝搬する<img src="https://mojiemoji.jozo.beer/emoji/%E5%BF%85%E8%A6%81?font=gothic-bold&color=60a5fa&animation=zairu&background=transparent&outline=eb2563&outline_width=2" alt="必要" height="20" align="absmiddle">がある。 ### 2. 平滑化定数が 60fps <img src="https://mojiemoji.jozo.beer/emoji/%E5%89%8D?font=chikara&color=ec4899&animation=poyoon&background=transparent&outline=99ec48&outline_width=2" alt="前" height="20" align="absmiddle">提 `SpectrumPresenter` の cava 由来の定数(`framerate_mod = 66 / 60` 等)が固定 60Hz を仮定している。`DisplayLinkDriver` は `CADisplayLink` なので `tick()` はディスプレイの実リフレッシュに追従し、120Hz ProMotion や可変リフレッシュでは落下速度が基準の 2 倍速にズレる。frame duration から定数を導出するか、tick ごとにスケールする<img src="https://mojiemoji.jozo.beer/emoji/%E5%AF%BE%E5%BF%9C?font=zero&color=a78bfa&animation=yatta&background=transparent&outline=ed7c3a&outline_width=2" alt="対応" height="20" align="absmiddle">が要る。 **<img src="https://mojiemoji.jozo.beer/emoji/%E6%B3%A8%E6%84%8F?font=mincho&color=10b981&animation=yurayura&background=transparent&outline=8110b9&outline_width=2" alt="注意" height="20" align="absmiddle">**: 現在の見た目は実機の 120Hz で詰めたものなので、フレームレート非依存化すると落下が遅くなり体感が変わる。<img src="https://mojiemoji.jozo.beer/emoji/%E4%BF%AE%E6%AD%A3?font=noto&color=c084fc&animation=tatemoya&background=transparent&outline=fcc084&outline_width=2" alt="修正" height="20" align="absmiddle">時は再チューニング+実機<img src="https://mojiemoji.jozo.beer/emoji/%E7%A2%BA%E8%AA%8D?font=toge&color=f59e0b&animation=zanzo&background=transparent&outline=0bf59e&outline_width=2" alt="確認" height="20" align="absmiddle">が<img src="https://mojiemoji.jozo.beer/emoji/%E5%BF%85%E9%A0%88?font=gothic&color=ec4899&animation=zanzo&background=transparent&outline=99ec48&outline_width=2" alt="必須" height="20" align="absmiddle">。 ## スコープ - #298 は見た目<img src="https://mojiemoji.jozo.beer/emoji/%E8%A8%AD%E5%AE%9A?font=maru&color=60a5fa&animation=yurayura&background=transparent&outline=eb2563&outline_width=2" alt="設定" height="20" align="absmiddle">の<img src="https://mojiemoji.jozo.beer/emoji/%E8%BF%BD%E5%8A%A0?font=gothic&color=ec4899&animation=zanzo&background=transparent&outline=99ec48&outline_width=2" alt="追加" height="20" align="absmiddle">とデフォルト調整に限定し、本 HW 非依存化はここで<img src="https://mojiemoji.jozo.beer/emoji/%E5%88%86%E9%9B%A2?font=rampart&color=fbbf24&animation=zanzo&background=transparent&outline=06d977&outline_width=2" alt="分離" height="20" align="absmiddle"><img src="https://mojiemoji.jozo.beer/emoji/%E5%AF%BE%E5%BF%9C?font=maru&color=fdba74&animation=chirichiri&background=transparent&outline=74fdba&outline_width=2" alt="対応" height="20" align="absmiddle">する。 - <img src="https://mojiemoji.jozo.beer/emoji/%E5%8F%82%E7%85%A7?font=toge&color=a855f7&animation=yokomoya&background=transparent&outline=f7a855&outline_width=2" alt="参照" height="20" align="absmiddle">: #298 のレビューコメント(CodeRabbit の R1 / R2)。
1. サンプルレートが 48kHz 固定
FrequencyAnalyzerはsampleRateの既定を 48000 とし、SpectrumUseCaseImplもこの既定に頼っている。CoreAudio の process tap はmin_freq/max_freq)がズレる。タップの実サンプルレートを capture 経路から2. 平滑化定数が 60fps
提
SpectrumPresenterの cava 由来の定数(framerate_mod = 66 / 60等)が固定 60Hz を仮定している。DisplayLinkDriverはCADisplayLinkなのでtick()はディスプレイの実リフレッシュに追従し、120Hz ProMotion や可変リフレッシュでは落下速度が基準の 2 倍速にズレる。frame duration から定数を導出するか、tick ごとにスケールするスコープ