View on GitHub

cat-oscillator-sync

cat-oscillator-sync

Cat Oscillator Sync - TypeScript/Node.js CLI版(Windows専用)

🎵 TypeScript (Node.js) で実装したマウス制御ハードシンク・オシレータ(Windows環境向け)

概要

このディレクトリには、Node.js ランタイムを使用した TypeScript 実装が含まれています。 speaker パッケージを使用してオーディオ出力を実現し、robotjs を使用してマウス位置を取得します。

特徴

動作環境

インストール

1. Node.js のインストール

Windows用のNode.jsをインストールします:

  1. Node.js公式サイトにアクセス
  2. LTS版(推奨版)をダウンロード
  3. インストーラーを実行してインストール

インストール後、コマンドプロンプトまたはPowerShellで確認:

node --version
npm --version

2. リポジトリのクローン

git clone https://github.com/cat2151/cat-oscillator-sync.git
cd cat-oscillator-sync\src\typescript\cli

3. 依存パッケージのインストール

npm install

注意: speakerrobotjs はネイティブモジュールです。 初回インストール時にコンパイルが行われます。 以下のツールが必要になる場合があります:

4. TypeScriptのコンパイル

npm run build

使用方法

シンプル版(8msごとに階段状に周波数が変化)

npm start

または

node dist/main.js

スムーズ版(1サンプルごとに滑らかに周波数が変化)

node dist/main.js smooth

操作方法

  1. プログラムを実行するとオーディオストリームが開始されます
  2. マウスを画面上で動かして音を制御してください
    • X軸 (横): マスター周波数 (40Hz - 600Hz)
    • Y軸 (縦): スレーブ周波数 (100Hz - 2000Hz)
  3. Ctrl + C で終了

プロジェクト構造

cli/
├── package.json           # npm設定
├── tsconfig.json          # TypeScript設定
├── README.md             # このファイル
├── src/
│   ├── main.ts           # エントリポイント
│   ├── audio/
│   │   └── output.ts     # speaker を使用したオーディオ出力
│   ├── mouse/
│   │   └── position.ts   # robotjs を使用したマウス位置取得
│   └── synth/
│       ├── simple.ts     # シンプル版シンセサイザー
│       └── smooth.ts     # スムーズ版シンセサイザー
└── dist/                 # ビルド出力

技術詳細

オーディオ出力 (speaker パッケージ)

speaker パッケージを使用して、Node.jsからリアルタイムでオーディオを出力します。 このパッケージはネイティブモジュールとして実装されており、低レイテンシな音声出力が可能です。

const speaker = new Speaker({
    channels: 1,          // モノラル
    bitDepth: 16,         // 16ビット
    sampleRate: 48000,    // 48kHz
    signed: true          // 符号付き整数
});

マウス位置取得 (robotjs パッケージ)

robotjs パッケージを使用して、マウスカーソル位置を取得します。

const pos = robot.getMousePos();
console.log(`Mouse position: ${pos.x}, ${pos.y}`);

ハードシンク・オシレータ

マスターオシレータの位相がリセットされるタイミングで、スレーブオシレータの位相も強制的にリセットします。 これにより、豊かな倍音を持つ音色が生成されます。

// マスター位相のラップアラウンドを検出
if (phaseMaster >= 1.0) {
    phaseMaster -= 1.0;
    // スレーブもリセット (HARD SYNC)
    phaseSlave = 0.0;
}

シンプル版 vs スムーズ版

シンプル版

スムーズ版

パフォーマンス

トラブルシューティング

インストールエラー: node-gyp のビルドに失敗

原因: C++コンパイラやビルドツールが不足しています

解決方法:

方法1: winget を使用(推奨) PowerShellを管理者権限で開き、以下を実行:

winget install --id Microsoft.VisualStudio.2022.BuildTools --override "--wait --passive --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"

インストール完了後、コマンドプロンプトまたはPowerShellを再起動し、再度 npm install を実行

方法2: Visual Studio Build Tools を手動インストール

  1. Visual Studio Downloads にアクセス
  2. “Build Tools for Visual Studio 2022” をダウンロード
  3. インストーラーを実行し、「C++ によるデスクトップ開発」ワークロードを選択
  4. インストール完了後、コマンドプロンプトまたはPowerShellを再起動
  5. 再度 npm install を実行

エラー: “Cannot find module ‘speaker’”

原因: 依存パッケージがインストールされていません

解決方法:

npm install
npm run build

エラー: “Failed to initialize audio”

原因: オーディオデバイスが見つからないか、使用中です

解決方法:

  1. オーディオデバイスが接続されているか確認
  2. 他のアプリケーションでオーディオデバイスを使用していないか確認
  3. PCを再起動してみる

エラー: “robotjs が動作しない”

原因: ネイティブモジュールのビルドに失敗した可能性があります

解決方法:

npm uninstall robotjs
npm install robotjs --build-from-source

音が出ない

解決方法:

  1. ボリュームが適切に設定されているか確認
  2. 既定のオーディオデバイスが正しく設定されているか確認
  3. コマンドプロンプトまたはPowerShellを管理者権限で実行してみる

開発

開発モード

TypeScriptファイルを編集した後、以下のコマンドでビルドと実行を一度に行えます:

npm run dev

コードの変更

  1. src/ ディレクトリ内のTypeScriptファイルを編集
  2. npm run build でコンパイル
  3. npm start で実行

Node.js CLI版の特徴

利点

注意点

パフォーマンスチューニング

バッファサイズの調整

src/main.tsPOLLING_INTERVAL_MS を変更することで、レイテンシとCPU使用率のバランスを調整できます:

const POLLING_INTERVAL_MS = 8;  // デフォルト: 8ms

時定数の調整(スムーズ版)

src/main.tsTIME_CONSTANT_MS を変更することで、周波数変化の滑らかさを調整できます:

const TIME_CONSTANT_MS = 16;  // デフォルト: 16ms

ライセンス

MIT License - 詳細は LICENSE を参照

関連ドキュメント