C#でチップチューンサウンドを鳴らそう!サウンドプログラミング入門
ブラウザで動く8bit音楽作曲アプリ「PICOM」の実装を通じて、C# と Blazor WebAssembly を使った音響プログラミングを掘り下げる連載シリーズです。リニアPCMの基礎、矩形波・三角波・ノイズなど波形の合成、自作OSS SoundMaker を中核とした楽譜→WAV変換パイプライン、Web Audio API でのスケジューリング、IndexedDB を使ったブラウザ完結の永続化、MessagePack による独自バイナリフォーマットの設計、Command パターンによる Undo/Redo の実装、マルチスレッド化による UI フリーズ解消などを一通り扱います。「個人開発で音が鳴るアプリを作りたい」「Blazor WebAssembly の限界を試したい」エンジニア向けの実装メモです。
シリーズの記事一覧(公開順)
- 第1回

ObservableObjectとDiffDetectableObjectで「変更された?」を自動判定する
Blazor WebAssemblyで「保存ボタンを押すべきか」を自動判定する仕組みを、ObservableObjectとDiffDetectableObjectという2つのシンプルなクラスで実装しました。MVVM ToolkitのObservableObjectとの違いや、イベント駆動で状態フラグを同期させる設計のコツを解説します。
- 第2回

MessagePackで独自バイナリファイル形式(PIM)をバージョン管理対応で設計する
音楽作成アプリPICOMで独自のバイナリファイル形式「PIM」をMessagePackで実装しました。なぜJSONでなくMessagePackを選んだのか、`[Key]`番号の運用ルール、将来のフォーマット進化に備えるVersionフィールド戦略について解説します。
- 第3回

StackベースのUndo/RedoをC#で実装する|CompositeCommandで複数操作も一括取り消し
楽譜エディタのUndo/RedoをCommandパターンで実装した実例を紹介します。2本のStackで履歴を管理し、CompositeCommandで複数操作を1手としてまとめ、TrimHistoryで履歴上限を設ける方法を解説します。
- 第4回

Blazor WebAssemblyでマルチスレッドを有効化してUIフリーズを解消する
Blazor WebAssemblyでWasmEnableThreadsを有効化し、音楽生成をバックグラウンドスレッドにオフロードしてUIフリーズを解消した実例です。COOP/COEPの必要性、Channel<T>によるストリーミング再生、PeriodicTimerへの移行で踏んだ不具合も紹介します。
- 第5回

C#オブジェクトがIndexedDBに着くまで|Blazor WASM永続化のデータ形式の旅
Blazor WebAssembly で C# のオブジェクトを IndexedDB に保存する際、データは MessagePack バイナリや Uint8Array と形を変えながら各レイヤーを通過します。PICOMでの実装を例に、境界ごとの責務分担と keyPath なしストア設計を解説します。
- 第6回

SoundMakerでチップチューン音声パイプラインの作り方
自作OSSライブラリSoundMakerを使って、楽譜データからWAVバイナリを生成する音声合成パイプラインを解説します。サンプリングレートとテンポからサンプル位置を算出する基礎、バッファリング生成でBlazor WebAssemblyを固めない工夫、プレビュー音のキャッシュ戦略を紹介します。