Skip to content

はじめに ​

libsonare は、音楽情報検索(MIR)、マスタリング、ミキシング、編集、クリエイティブ FX、ブラウザネイティブな音楽ツールのための、外部依存のない C++17 オーディオエンジンです。このページでは、何もインストールしていない状態から、普段使っている実行環境で BPM、キー、コード列を表示するところまで進みます。

先に機能を選ぶ必要はありません。このページは何も決まっていない状態から読めます。結果が画面に出たら、学習順ガイド が自分のプロジェクトに合う分野のガイドを選びます。

このページで身につくこと ​

このページを読むと、次のことを判断・実行できるようになります。

  • すべての API で使うサンプル、サンプルレート、モノラル、ステレオの基本語彙を説明できる。
  • 自分のプロジェクトに合う実行環境を選べる。
  • ブラウザ、Node.js、Python、ターミナルのいずれかで libsonare をインストールし、最初の解析結果を表示できる。
  • 次に開くべきリファレンスを判断できる。

実行環境を選ぶ前に ​

多くの例は同じ流れです。音声を読み込むかデコードし、Float32Array のサンプルとサンプルレートを渡し、結果を受け取ります。

用語意味
サンプル音声波形の 1 点の振幅値
サンプルレート1 秒あたりのサンプル数。44,100 や 48,000 など
モノラル1 チャンネルの音声
ステレオ左右 2 チャンネルの音声
WASMWebAssembly。npm パッケージのコンパイル先で、ブラウザでも Node.js でも動く

これらの用語は オーディオ基礎 でさらに詳しく説明しています。

初めてなら「ファイル」と「サンプル」を分けて考える

MP3 や WAV は音声を保存するファイル形式です。libsonare の多くの API が受け取る Float32Array や Python の配列は、ファイルを読み込んだ後の PCM サンプル(圧縮を解いた素のサンプル値の列)です。下のどの実行環境でも WAV と MP3 はデコードできます。それ以外の形式は、ブラウザでは先にブラウザ側でデコードし、Python では FFmpeg 有効のビルドが必要です。

どこで動かすか ​

実行環境インストールファイルを直接読めるかリファレンス
ブラウザnpm install @libraz/libsonare、または CDN 版WAV/MP3 のバイト列をデコードする。ほかの形式はブラウザのデコーダーを使うWebAssembly ガイド
Node.js(WASM)npm install @libraz/libsonare(Node.js 22.12 以上)node:fs で読んだ WAV/MP3 のバイト列をデコードするJavaScript API
Pythonpip install libsonare(Python 3.11 以上)読める。WAV と MP3、FFmpeg 有効ならさらに多くの形式Python API
CLIpip install libsonare(sonare コマンドも入る)読める。Python パッケージと同じ形式CLI リファレンス

npm パッケージでは sonare コマンドはインストールされません。Node.js ネイティブアドオンと C++ ライブラリはソースからビルドします。ネイティブバインディング と C++ API を参照してください。

最初の結果 ​

どのタブも、インストール行、プログラム、表示される出力までそろっています。例で解析する demo.mp3 は 楽曲解析スタジオ が読み込むのと同じ曲なので、自分の出力をデモと見比べられます。

html
<!-- first.html — フォルダを任意の静的サーバー(たとえば `npx serve`)で配信し、
     https://libsonare.libraz.net/demo.mp3 から入手した demo.mp3 を選ぶ -->
<input type="file" id="file" accept=".mp3,.wav" />
<pre id="out"></pre>
<script type="module">
  import { init, Audio } from 'https://unpkg.com/@libraz/libsonare';

  await init();
  document.getElementById('file').addEventListener('change', async (event) => {
    const bytes = new Uint8Array(await event.target.files[0].arrayBuffer());
    const result = Audio.fromMemory(bytes).analyze();
    document.getElementById('out').textContent = [
      `BPM: ${result.bpm.toFixed(1)}`,
      `Key: ${result.key.name}`,
      `First chords: ${result.chords.slice(0, 8).map((c) => c.name).join(' ')}`,
    ].join('\n');
  });
</script>

<!-- 表示:
BPM: 160.4
Key: C major
First chords: C Am C Bm G G#m Em C
-->
js
// npm install @libraz/libsonare
// curl -O https://libsonare.libraz.net/demo.mp3
// node first.mjs
import { readFileSync } from 'node:fs';
import { init, Audio } from '@libraz/libsonare';

await init();
const audio = Audio.fromMemory(new Uint8Array(readFileSync('demo.mp3')));
const result = audio.analyze();

console.log('BPM:', result.bpm.toFixed(1));
console.log('Key:', result.key.name);
console.log('First chords:', result.chords.slice(0, 8).map((c) => c.name).join(' '));

// BPM: 160.4
// Key: C major
// First chords: C Am C Bm G G#m Em C
python
# pip install libsonare
# curl -O https://libsonare.libraz.net/demo.mp3
# python first.py
from libsonare import Audio

audio = Audio.from_file("demo.mp3")
result = audio.analyze()

print(f"BPM: {result.bpm:.1f}")
print(f"Key: {result.key.name}")
print("First chords:", " ".join(c.name for c in result.chords[:8]))

# BPM: 160.4
# Key: C major
# First chords: C Am C Bm G G#m Em C
bash
pip install libsonare
curl -O https://libsonare.libraz.net/demo.mp3
sonare analyze demo.mp3

# warning: 2-channel input is downmixed to mono by this CLI command; use the stereo library API for channel-preserving processing
#
#   > Estimated BPM : 160.42 BPM  (conf 80.7%)
#   > Estimated Key : C major  (conf 98.3%)
#   > Time Signature: 4/4
#   > Beats: 192

analyze() は 1 回の呼び出しで結果全体を返します。BPM とキーに加えて、ビート、コード、セクションと楽曲形式、さらに音色、ダイナミクス、リズム、メロディも含まれます。各フィールドの意味と、個別の推定器を呼ぶべき場面は 楽曲解析 で説明しています。

ハ長調の曲なのに、上のコード列には Bm や G#m が含まれています。これは正常です。analyze() は既定でトライアド(メジャー、マイナー、ディミニッシュ、オーグメント)だけを報告し、借用和音や読み違いのコードが混じるのはコード推定の性質の一部だからです。語彙を広げる・絞る方法は FAQ にあります。

Audio.fromMemory と Audio.from_file はステレオファイルをモノラルに畳み込みます。解析が想定しているのはモノラル入力です。ブラウザで AAC、OGG、FLAC をデコードするには Audio.fromMemoryWithBrowserFallback を使います(ファイル入力)。バンドラーを使うアプリでは、CDN の URL ではなく '@libraz/libsonare' からインポートします。

Node.js ネイティブアドオン

N-API アドオン @libraz/libsonare-native は、libsonare を WebAssembly ではなくコンパイル済みのネイティブコードとして動かし、パスからファイルを読み込みます。npm には公開していないので、チェックアウトからビルドします。

bash
git clone https://github.com/libraz/libsonare.git
cd libsonare/bindings/node
yarn install
yarn build
typescript
import { Audio } from '@libraz/libsonare-native';

const result = Audio.fromFile('demo.mp3').analyze();
console.log('BPM:', result.bpm, 'Key:', result.key.name);

Node.js / ネイティブバインディング を参照してください。

できること ​

分野例最初に読むページ
解析BPM、キー、コード、ビートとダウンビート、セクション、メロディ楽曲解析
編集とリペアピッチ補正、タイムストレッチ、ノート編集、ノイズとハムの低減編集 DSP、オーディオリペアの流れ
ミキシングとマスタリングチャンネルストリップ、センドとバス。LUFS ターゲットと True Peak リミッターを備えたマスタリングチェーンミキシングエンジン、マスタリングアシスタント
楽器と MIDI17 種のエンジンを持つシンセサイザー、GM/GS フォールバックバンク、SoundFont 2 プレイヤー音源方式、内蔵シンセサイザー
プロジェクトとリアルタイムオフラインバウンスを備えたヘッドレス DAW のプロジェクト、ストリーミング解析、リアルタイムエンジンプロジェクト編集、リアルタイムとストリーミング
ルーム音響RT60 と明瞭度、音声からの部屋推定、インパルス応答の合成ルーム音響解析

すべての分野と、目的ごとに書かれたページの一覧は 学習順ガイド にあります。

この表に出る略語
  • BPM: 1 分あたりの拍数。曲の速さです。
  • LUFS / True Peak: マスタリング指標です。LUFS(Loudness Units relative to Full Scale)は聴感上のラウドネス、True Peak(トゥルーピーク)はサンプル間のピークまで含めたピーク安全性を測ります。
  • RT60: 部屋の残響が 60 dB 減衰するまでの時間です。

今すぐ試す ​

いま表示したコードは、クロマ(12 の音名がそれぞれどれだけ鳴っているか)のフレームをコードテンプレートと照合して得たものです。下のデモは同じコード認識を C–Am–F–G の短いクリップに対して実行します。計算しているのは、いまインストールしたのと同じ WASM ビルドです。

CHORD TRACK · DETECT CHORDSIDLE
コードトラック — 認識が返す区間

ブロック 1 つが検出されたコード区間です。拍同期を使わないフレーム単位の STFT クロマと最小長 0.3 秒では、どちらのテンプレート集合でもこのクリップを C–Am–F–G と読みます。最小長を下げるとコードの切り替わり付近にある短い拡張コードの読みが残り、「全コード種」と「三和音のみ」を切り替えてテンプレート集合の違いを比べられます。

テンプレート
最小長
0.3 s

ブラウザで使える完全なツールは デモ にあります。どのデモにも音声ファイルをドロップでき、何もアップロードされません。

次のステップ ​

サンプルが 1 つ動きました。ここから先は、目的によって読むページが 2 つに分かれます。

何かを作りたい ​

  • 使用例 — 作りたいものに一番近い動作パターンを、実行環境ごとに
  • 学習順ガイド — 解析から再生まで、10 の分野を目的別に辿る道案内
  • 実践ユースケース — 素材から成果物まで 1 つの仕事を通しで、実行できるスクリプトの形で
  • インストール — 既定の構成で足りなくなったときの FFmpeg デコード、ソースビルド、Node ネイティブアドオン

エンジンを理解したい ​

  • イントロダクション — 波形からコードまでの解析パイプラインと、他のすべてのページが前提にする用語
  • 楽曲解析 — いま表示した結果の意味と、analyze() では粗すぎるときに選ぶ呼び出し
  • 音源方式 — エンジンがサンプルを同梱しない理由と、代わりに楽器の音がどこから来るか
  • DSP 実装解説 — プロセッサの構造。パラメータを UI に出すときや、レンダリング結果を説明するときに