KAGAN A1: DSP エフェクト付き EL34 真空管アンプペダル、KiCad ファイルとファームウェア
MOSFET で組んだ 2 段の真空管プリアンプ、EL34 パワーアンプと 4x12 キャビネットのシミュレーション、その後ろに STM32G473 と ES8388 による 8 つの DSP エフェクト。JLCPCB 向け 6 層 SMD 基板。KiCad プロジェクト、Gerber/BOM/CPL、ファームウェアのソースをダウンロードできます。

KAGAN A1 は、2 段のハイゲイン真空管プリアンプ、EL34 パワーアンプ、4×12 キャビネットをひとつのペダルケースに収めたアナログのアンプ・イン・ア・ボックスです。パソコンは要りません。オーディオインターフェース、パワードスピーカー、ヘッドホン、本物のアンプの入力にそのまま挿せます。この記事で扱うのは基板の SMD 版で、アナログアンプの後ろに STM32G473 と ES8388 コーデックによる DSP ブロックを追加しています。ノイズゲート、フェイザー、ヴァイブ、フランジャー、コーラス、ディレイ、リバーブ、トレモロです。
KiCad ファイル、Gerber/BOM/CPL、ファームウェアのソースは記事の最後からダウンロードできます。


シグナルパス
INPUT (1 MΩ) → バッファ
→ V1a 2N7002, ソース 680 Ω + 1k‖2.2µ [BOOST: +8 dB]
→ GAIN + 100 pF ブライト
→ V1b コールドクリッパー (低バイアス, ソースはバイパスなし)
→ V2a ×5 → V2b ソースフォロワー
→ パッシブトーンスタック: TREBLE / BASS / MIDDLE
→ MASTER
→ EL34 パワーアンプ: ×2 (中域) / ×4 (低域, ~100 Hz 共振), PRESENCE,
対称ダイオードクリップ (プッシュプルのような奇数次倍音)
→ LEVEL → DSP (gate, phaser, vibe, flanger, chorus, delay, reverb, tremolo)
├─ AMP OUT (キャビネットシミュなし, 本物のアンプへ)
└─ キャビネットシミュ: 93 Hz HPF Q1.8 + 5 次 LPF (6 kHz で −19 dB)
→ LINE OUT, PHONES
三極管段は MOSFET で組んでいます。各段のドレイン抵抗、ソース抵抗、バイパスコンデンサは、それぞれが受け持つ真空管段のように振る舞うよう選びました。V1a のソースの 1k‖2.2µ は最低域を少し削り、V1b はバイアスが低くバイパスコンデンサのない「コールド」段で、このアンプらしい歪みはここで生まれます。トーンスタックは定番の 3 ノブのパッシブ型です (33k, 470p, 22n, 22n、TREBLE と BASS は 250k、MIDDLE は 25k)。
BOOST フットスイッチはオーディオ経路を通りません。切り替えるのは DC の制御線だけで、その線が MOSFET 経由で V1a のソースに 220 Ω + 22 µF をつなぎます。50 ms の RC ランプがあるのでポップノイズは出ません。
シミュレーション
アナログ回路は全体を ngspice でシミュレーションしています (sim/kagan.py)。220 Hz、200 mV 入力での結果:
| 設定 | LINE OUT | THD |
|---|---|---|
| GAIN 1 / MASTER 2 | 65 mVrms | 0.7% (クリーン) |
| GAIN 5 / MASTER 5 | 166 mVrms | 15% (クランチ) |
| GAIN 10 / MASTER 8 | 240 mVrms | 35% |
| GAIN 10 / MASTER 10 / BOOST, 1 V 入力 | 430 mVrms | 39% |

2N7002 のしきい値電圧は 1.0 V から 2.5 V までばらつきます。この範囲全体をシミュレーションし、調整なしでドレイン電圧が動作範囲に収まることを確認しました。基板に半固定抵抗はありません。
DSP ブロック
LEVEL バッファの後の信号は半分に分圧されて ES8388 の左 ADC チャンネルに入ります。右チャンネルには入力のクリーンな DI 信号がつながっていて、ノイズゲートは歪んだ信号ではなくこちらで判定します。クリップして圧縮された信号のエンベロープではなく、ギターを実際にどれだけ弾いているかを見るためです。
- MCU: STM32G473CEU6、150 MHz の Cortex-M4F。128 KB の RAM の大半はディレイライン用です。
- コーデック: ES8388、I2S、24 ビット、Fs = 48.828 kHz (12 MHz 水晶 → PLL → 150 MHz → SAI MCLK 12.5 MHz)。
- DMA による 32 サンプルのピンポンバッファ。
- ディレイは fs/4 で動き、BBD のように振る舞います。リピートごとに少しずつ暗く (2.8 kHz ローパス)、細く (120 Hz) なり、柔らかく飽和します。D.TIME を回すと時間が 0.25 秒かけて移り、テープのようなピッチの揺れが出ます。
- リバーブは fs/2 で動く 8 ラインの FDN です。T60 はノブで 1.5 秒から 3 秒まで。
- どのエフェクトもノブひとつで、左いっぱいでオフです。ノブの最初の 10% でエフェクトがなめらかに入り、フェイザー、フランジャー、コーラス、ヴァイブはレベル補正付きなので、オンオフしても音量の変化は ±0.7 dB 以内です。
いちばん気に入っているのはヴァイブです。オリジナルの Uni-Vibe では 4 つの移相段のコンデンサがそれぞれ違い、1 個の電球と LDR がそれらをまとめて動かします。電球は速く温まってゆっくり冷えるので、変調はサイン波ではなく偏った脈動になります。ファームウェアはそれをそのままモデル化しています:
float drive = 0.5f + 0.5f * sinf(6.2831853f * vb_lfo);
vb_lamp += (drive > vb_lamp ? vb_up : vb_dn) * (drive - vb_lamp); /* 温まり 5 ms, 冷え 25 ms */
/* LDR: コンダクタンス ~ 光^0.6, 最大深さで約 2.5 オクターブのスイープ */
float m = exp2f(depth * 2.5f * (powf(vb_lamp, 0.6f) - 0.66f));
for (int i = 0; i < 4; i++) { /* 90, 240, 1100, 3600 Hz */
float t = tanf(3.14159265f * VB_F[i] * m / fs_main);
vb_a[i] = (t - 1.f) / (t + 1.f);
}
アナログバイパス
すべてのエフェクトが 300 ms オフのままだと、MCU は DSP を経路から外し、信号はアナログの経路を通ります。電源投入時や MCU が未書き込みのときも同じで、DSP_EN ピンは 100k でグラウンドに落ちています。つまりファームウェアを一度も書き込んでいなくても、コーデックが応答しなくても、ペダルはアナログアンプとして動きます。シミュレーションでは 2 つの経路のゲインは同じで、使っていない経路からの漏れは −57 dB から −75 dB です。
ノブの LED
DSP の各ノブの上に 3 mm LED があります。レベル系のノブは値に応じて光り (ガンマ 2.2)、D.TIME の LED はエコーごとに 40 ms 点滅し、TREMOLO の LED はトレモロに合わせて、VIBE の LED は仮想の電球に合わせて明滅します。LED は PWM で駆動していて、PWM 周波数はちょうど 2·Fs、150 MHz / 1536 = 97.66 kHz です。PWM がグラウンド経由でコーデックに漏れても、サンプリングで DC に折り返されるので、聞こえる音にはなりません。
基板

- 110 × 132 mm、6 層、ケースは Hammond 1590XX。下側に 2 つのフットスイッチ用の切り欠きがあります。
- パネル側に WH148 ポットが 17 個。上の 2 列がアナログアンプ (GAIN, BASS, MIDDLE, TREBLE, PRESENCE, MASTER, LEVEL)、下の 2 列が DSP (GATE, REVERB, D.TIME, D.REPEATS, D.MIX, VIBE, PHASER, CHORUS, FLANGER, TREMOLO) です。
- フットスイッチは 2 つ、BOOST と 3PDT のトゥルーバイパス。トゥルーバイパスは AMP OUT だけが対象です。LINE OUT とヘッドホン出力はバイパス時に無音になります。加工していないギター信号はヘッドホンではいい音にならないからです。
- SMD 部品はすべて上面にあり、JLCPCB の片面実装にそのまま出せます。部品は 75 種類、実装点数は 251。手はんだの部品は 36 個です (ポット、LED、配線パッド、SWD ヘッダー)。
- コンデンサ: トーンスタック、キャビネットシミュ、presence、resonance の経路は C0G、カップリングとデカップリングは X7R/X5R。
回路図は手で描いていません。部品とネットは Python ファイル (tools/parts.py) にあり、tools/mksch.py がそこから KiCad の回路図を生成します。tools/mkpcb.py が信号の順に部品を並べ、そのあとシミュレーテッドアニーリングで配置を改善します。高インピーダンスのノードは重く、グラウンドと電源は軽く重み付けしています。配線は自作のオートルーター fastroute です。結果は KiCad の DRC で違反 0、未接続パッド 0、回路図との整合も完全です。
注意点がひとつあります。pcbnew から基板を保存すると、KiCad はプロジェクトのデザインルールをデフォルト (0.2 mm) に戻してしまい、DRC が数百件の違反を出します。この基板のルールは Default クラスが 0.15/0.15 mm、電源ネットが 0.3 mm です。DRC の前に python3 tools/rules.py を実行すると書き戻されます。ダウンロードのプロジェクトファイルには正しいルールがすでに入っています。
ファームウェア
C で書いていて、HAL も CubeMX も使っていません。レジスタは CMSIS ヘッダーで直接設定しています。フラッシュ約 19 KB、RAM 約 103 KB です。
make TOOLCHAIN=/path/arm-gnu-toolchain/bin/ # build/kagan_dsp.bin
make host-test # DSP のテストをパソコン上で
st-flash write build/kagan_dsp.bin 0x08000000 # ST-Link で, SWD ヘッダー J6
make host-test は DSP のコードをパソコンでビルドしてテストします。エフェクトがすべてオフのとき出力が入力とビット単位で一致するか、リバーブの T60、ディレイのタイミングとリピートの比率、最大フィードバックでの安定性、レベル補正などです。テストは WAV ファイルも書き出します。入力は本物のギター録音ではなく合成信号 (強くクリップした 2 音にプリアンプのヒスを足したもの) ですが、エフェクトの振る舞いを聞くには十分です:
- ドライ信号
- フルチェーン: gate + chorus + delay + reverb
- ヴァイブ、フェイザー、フランジャー、コーラス、トレモロ
- 演奏中に D.TIME を回したディレイ、リバーブのインパルス応答
現状
回路はシミュレーション済み、基板はレイアウトして DRC を通過、ファームウェアはビルドでき、DSP のテストはパソコン上で通っています。基板はまだ製作していません。 発注の前に:
- WH148 の軸の中心からピン列までの距離をノギスで測る (フットプリントは 7.5 mm を仮定)。
- JLCPCB の実装プレビューで、すべての IC、トランジスタ、ダイオード、電解コンデンサの向きを確認する。
- 初回の電源投入時: 基板上の LED が 1 Hz で点滅すること (速い点滅はコーデックが I2C で応答していない)、エフェクトがすべてオフのとき DSP 経路とアナログ経路のレベルが同じであること。
作った方がいたら、結果をぜひ聞かせてください。
ダウンロード
| ファイル | 内容 | サイズ |
|---|---|---|
| kagan-a1-smd-kicad.zip | KiCad 10 プロジェクト: 回路図、PCB、フットプリント、回路図と実装図の PDF、レイヤー出力、製造ファイル、生成スクリプト、設計メモ | 4.2 MB |
| kagan-a1-smd-gerber.zip | Gerber + Excellon のみ。JLCPCB にそのままアップロードできます | 0.9 MB |
| kagan-a1-firmware.zip | ファームウェアのソース、Makefile、CMSIS ヘッダー、テスト、ビルド済みの kagan_dsp.bin | 0.6 MB |
JLCPCB 用の BOM と CPL (kagan_smd_bom_jlc.csv, kagan_smd_cpl_jlc.csv) は KiCad パッケージの fab/ フォルダにあります。パッケージ内の設計メモ (NOTLAR.md) はトルコ語です。