Generative Oscillator with Language-Embedded Mind — ローカルLLMを完全統合した世界初のAI搭載ユーロラックモジュラーシンセサイザー
GOLEMは、大規模言語モデル(LLM)をユーロラック規格内に完全統合した革新的なシンセサイザーモジュールです。音声コマンドによるパラメータ制御、対話的な音響生成、そして「考える」モジュラーシンセサイザーという新しいパラダイムを提案します。
外部PC不要で、モジュール単体でLLM推論と音声認識が動作。「もっと暗く」「カオスにして」といった自然言語で、グラニュラーシンセシスのパラメータをリアルタイムに制御できます。
外部PC不要。Raspberry Pi CM4上でTinyLlama 1.1Bがローカル推論。プライバシーを保護しながらリアルタイム応答。
内蔵PDMマイクとfaster-whisperによる音声認識。Silero VADで音声区間を検出し、自然言語で複数パラメータを同時に制御。
STM32H750による決定的レイテンシのDSPエンジン。60秒バッファ、最大8同時グレイン、24bit/48kHzステレオ処理。
ハードウェア設計(CERN-OHL-P v2)、ファームウェア(MIT)共にオープン。コミュニティによる拡張・改良が可能。
GOLEMはデュアルプロセッサ構成を採用。Linuxはリアルタイム保証ができないため、LLM推論・音声認識をCM4に、オーディオDSP・CV制御をSTM32に分離し、SPI/UARTで通信します。
GOLEM Module
─────────────────────────────────────────────────────────────────
┌─────────────────────┐ ┌─────────────────────┐
│ Raspberry Pi │ SPI / │ STM32H750 │
│ Compute Module 4 │ UART │ │
│ │◄──────────►│ Real-time DSP │
│ TinyLlama 1.1B │ │ │
│ Whisper.cpp │ │ Granular Engine │
│ Command Parser │ │ CV Interface │
│ │ │ Audio Codec Ctrl │
└─────────┬───────────┘ └──────────┬──────────┘
│ │
│ ┌──────────┼──────────┐
▼ ▼ ▼ ▼
┌─────────┐ ┌────────┐ ┌─────────┐ ┌────────┐
│ PDM Mic │ │MCP3208 │ │PCM5102A │ │MCP4728 │
│SPH0645 │ │ CV ADC │ │PCM1863 │ │ CV DAC │
└─────────┘ └───┬────┘ └────┬────┘ └───┬────┘
│ │ │
CV Input Audio I/O CV Output
4ch ±5V Stereo 24b 2ch 0-5V
3段パイプライン: Silero VAD(音声検出) → faster-whisper(音声認識) → Qwen2.5-0.5B(意図解釈)。ルールベースの高速パスとLLMディープ解釈のハイブリッド方式で、低レイテンシと高い表現力を両立。
頻出コマンドは正規表現パターンマッチで即座に応答。日本語・英語のバイリンガル対応。LLMを経由しないため、ミリ秒単位の高速レスポンス。
patterns = {
r'(暗く|ダーク|dark)':
{'pitch': -0.2, 'density': -5},
r'(カオス|chaos|crazy)':
{'spread': 0.3, 'density': 10},
r'(フリーズ|freeze|hold)':
{'freeze': True},
}
抽象的・詩的なコマンドはTinyLlama 1.1B(Q4_K_M量子化)で解釈。音楽的文脈を理解し、複数パラメータを同時に最適な値へ変更。
prompt = f"""You are GOLEM, an AI
embedded in a Eurorack granular
synthesizer module.
Available parameters:
- position, grain_size, density
- pitch, spread, mix, freeze
User: "{text}"
Output JSON:"""
| Parameter | Value | Note |
|---|---|---|
| Width | 28HP (142mm) | Eurorack standard |
| Height | 128.5mm (3U) | Eurorack standard |
| Depth | < 50mm | Skiff-compatible target |
| Power +12V | 500mA | CM4 LLM推論時 peak |
| Power -12V | 50mA | Op-amp negative rail |
| CV Input | 4ch ±5V | 12bit resolution |
| CV Output | 2ch 0-5V / ±5V | 12bit resolution |
| Audio I/O | Stereo, AC-coupled | 24bit / 48kHz |
| Microphone | Built-in PDM | Voice command input |
| Display | OLED 128×64 | SSD1306 |
| Controls | 2 encoders + 3 buttons | + 2 RGB LEDs |
| Parameter | Range | CV Input | Description |
|---|---|---|---|
| Position | 0.0 – 1.0 | CV1 | バッファ内再生位置 |
| Grain Size | 10 – 500ms | CV2 | グレインの長さ |
| Density | 0.1 – 50Hz | CV3 | グレイン発生頻度 |
| Pitch | 0.25 – 4.0 | CV4 | 再生速度 / ピッチ |
| Spread | 0.0 – 1.0 | — | ランダム幅 |
| Feedback | 0.0 – 1.0 | — | フィードバック量 |
| Mix | 0.0 – 1.0 | — | Dry/Wet ミックス |
CM4-STM32間はバイナリプロトコルで通信。SYNC + LENGTH + CMD + PAYLOAD + CRC16の固定フォーマット。パラメータID指定でfloat値を送信。
Message Format (Binary):
┌──────┬────────┬──────────┬──────────┬────────┐
│ SYNC │ LENGTH │ CMD_TYPE │ PAYLOAD │ CRC16 │
│ 0xAA │ 1 byte │ 1 byte │ N bytes │ 2 bytes│
└──────┴────────┴──────────┴──────────┴────────┘
SET_PARAM Payload:
┌──────────┬──────────┐
│ PARAM_ID │ VALUE │
│ 1 byte │ float LE │
└──────────┴──────────┘
Param IDs: 0x00=position 0x01=grain_size
0x02=density 0x03=pitch
0x04=spread 0x05=feedback
0x06=freeze 0x07=reverse
libDaisy + DaisySPベースのリアルタイムグラニュラーシンセシス。Hanning窓によるグレインエンベロープ、ステレオパン、バッファフィードバックを実装。
void AudioCallback(AudioHandle::InputBuffer in,
AudioHandle::OutputBuffer out,
size_t size) {
// Record to buffer (unless frozen)
if (!params.freeze) {
for (size_t i = 0; i < size; i++) {
float inputMix = (in[0][i] + in[1][i]) * 0.5f;
audioBuffer[writePos] =
inputMix + (audioBuffer[writePos] * params.feedback);
writePos = (writePos + 1) % BUFFER_SIZE;
}
}
// Process grains
for (size_t i = 0; i < size; i++) {
float sumL = 0.0f, sumR = 0.0f;
for (int g = 0; g < MAX_GRAINS; g++) {
if (grains[g].active) {
float phase = grains[g].playhead / grains[g].size;
if (phase < 1.0f) {
size_t idx = (size_t)grains[g].position
% BUFFER_SIZE;
float sample =
audioBuffer[idx] * GrainEnvelope(phase);
sumL += sample * (1.0f - grains[g].pan);
sumR += sample * grains[g].pan;
// advance playhead ...
}
}
}
out[0][i] = in[0][i] * (1.f - params.mix)
+ sumL * params.mix / 4.f;
out[1][i] = in[1][i] * (1.f - params.mix)
+ sumR * params.mix / 4.f;
}
}
Python製のコマンドインタープリタ。ルールベース高速パス + LLMフォールバックのハイブリッドアーキテクチャ。パラメータ変更はシリアル通信でSTM32に送信。
class GolemBrain:
def __init__(self):
self.params = SynthParams()
self.llm = LLMEngine()
self.asr = ASREngine()
self.comm = SerialComm()
def process_voice_command(self, text):
changes = self.llm.interpret_command(
text, self.params
)
if changes:
self.apply_changes(changes)
def apply_changes(self, changes):
for key, value in changes.items():
current = getattr(self.params, key)
if isinstance(current, bool):
new_value = value
else:
new_value = current + value
# Clamp to valid range
lo, hi = LIMITS[key]
new_value = max(lo, min(hi, new_value))
setattr(self.params, key, new_value)
self.comm.send_param(key, new_value)
4層基板構成。アナログ/デジタルGNDの単点接続によるノイズ分離。SDRAM配線長マッチング ±5mm。オーディオ回路とデジタル回路の物理的分離。
| Layer | Function |
|---|---|
| L1 (Top) | Signal — Analog priority |
| L2 (Inner) | GND Plane (AGND/DGND split) |
| L3 (Inner) | Power Plane (+3.3V / +5V split) |
| L4 (Bottom) | Signal — Digital priority |
| Net | Width | Note |
|---|---|---|
| Power | 0.3mm+ | — |
| Signal | 0.15mm | Min clearance 0.15mm |
| SDRAM | 0.15mm | Length matched ±5mm |
| USB | Controlled | 90Ω differential |
Board Layout (Top View) ┌───────────────────────────────┐ │ [CV1][CV2][CV3][CV4][IN][OUT]│ ├───────────────────────────────┤ │ │ │ ┌─────────┐ ┌─────────┐ │ │ │ Audio │ │ CV I/O │ │ │ │ WM8731 │ │ MCP3208 │ │ │ │ │ │ MCP4728 │ │ │ └─────────┘ └─────────┘ │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ STM32H750│ │ CM4 │ │ │ │ + SDRAM │ │ Module │ │ │ │ + Flash │ │ │ │ │ └──────────┘ └──────────┘ │ │ │ │ ┌───────────────────────────┐│ │ │ Power Supply ││ │ │ TPS54335 AP2112 LM7905 ││ │ └───────────────────────────┘│ │ [══════ Euro Power ════════] │ └───────────────────────────────┘
| Category | Count | Prototype Cost |
|---|---|---|
| 主要IC | 8 | $115 |
| 電源部品 | ~10 | $6 |
| アナログ部品 | ~8 | $4 |
| 受動部品 | ~100 | $8 |
| コネクタ | 15 | $18 |
| UI部品 | 10 | $11 |
| 機構部品 | 5 | $21 |
| PCB (4-layer, 5pcs) | 1 | $30 |
| Total | ~130 parts | ~$213 |