Skip to content

JavaScript/TypeScript 型と列挙型 ​

型定義 ​

AnalysisResult ​

typescript
interface AnalysisResult {
  bpm: number;
  bpmConfidence: number;
  bpmCandidates: BpmHypothesis[];           // 上位から順に並んだ候補
  key: Key;
  timeSignature: TimeSignature;
  timeSignatureCandidates: TimeSignature[]; // 上位から順に並んだ候補
  beatTimes: Float32Array;  // beats[].time のコピー。librosa 互換コードで便利
  beats: Beat[];            // 各拍の強度を含むオブジェクト配列
  downbeatIndices: number[];        // 小節頭にあたる beats[] の添字
  downbeatPhase: number;            // 最初の小節が始まるビート番号
  beatObservations: BeatObservations;  // beats[] と並行する拍ごとの根拠
  beatLocalBpm: number[];           // 拍ごとの平滑化された局所テンポ。オプトイン
  chords: AnalysisChord[];
  sections: Section[];
  timbre: Timbre;
  dynamics: Dynamics;
  rhythm: RhythmFeatures;
  melody: MelodyContour;
  form: string;  // 例: "IABABCO"
  tuning: number; // クロマグラムに使用した半音単位の偏差(指定値または測定値)
}

interface BpmHypothesis {
  value: number;
  confidence: number;
  /** 報告された `bpm` との関係 */
  relation: 'primary' | 'half' | 'double' | 'other';
}

// 小節頭と拍子の判断の根拠となる拍レベルの観測値。
// 3 本の並行した系列を持つ 1 つのオブジェクトで、各系列は beats の各要素に 1 値を持つ。
interface BeatObservations {
  onsetStrength: number[];       // 拍近傍で窓集約したオンセット強度
  lowFrequencyEnergy: number[];  // 拍近傍の低域エネルギー
  chordChange: number[];         // 拍ごとのコード変化の根拠
}

downbeatIndices は beats と要素が 1 対 1 に対応するのではなく、beats を添字で参照します。beats より短く、beats[downbeatIndices[k]] が k 番目の小節頭です。ある拍が小節頭かどうかは、拍ごとのフラグを読むのではなく、このリストに含まれるかどうかで判定してください。downbeatPhase は拍子推定器が出した位相、つまり最初の小節が始まるビート番号で、値域は [0, timeSignature.numerator) です。したがって downbeatIndices は通常この値から始まります。コードや低域の根拠に基づいて小節頭が精緻化されたあとに再計算されるわけではないため、両者が食い違うことがありますが、不具合ではありません。リストが結果、位相は出発点の推測です。

アクセントの根拠は beatObservations にあり、3 本の系列はいずれも beats と要素が 1 対 1 に対応します。系列が空であることは、解析がそれを生成できなかったという意味であり、全拍のスコアが 0 だったという意味ではありません。lowFrequencyEnergy はオーディオなしで解析を走らせた場合に空になり、chordChange はコード解析が済むまで空です。添字でアクセスする前に長さを確認してください。

beatLocalBpm は拍ごとの平滑化された局所テンポで、beats と要素が 1 対 1 に対応し、単位は BPM です。computeTempoCurve で明示的に要求しない限り空であり、検出された拍が 2 未満の場合は指定の有無にかかわらず空になります。最後の要素は、最終拍へ至る区間のテンポを繰り返した値です。これは bpm をリサンプルしたものではなく本物の局所テンポです。ただし、固定されたビートグリッドからデコードされたカーブはそのグリッドを記述するので、実際に動くテンポを測りたい場合は adaptiveTempo も併せて指定してください。値は固定されたテンポ格子に量子化されず、連続値になります。各値は隣接する拍間隔を対数テンポ空間で重み付き平均した局所値なので、テンポが変化すると数拍遅れて追従することがあります。

bpm と timeSignature は最終的に選ばれた値で、2 つの *Candidates 配列はその背後にある順位付きの候補群です。テンポは本質的に曖昧で、ハーフタイム感とその倍テンポは同じ曲のどちらも妥当な読み方になり得ます。1 つの数字だけを見せるのではなく、ほかの候補も提示できます。

typescript
const { bpm, bpmCandidates } = analyze({ samples, sampleRate });
const halfTime = bpmCandidates.find((c) => c.relation === 'half');
if (halfTime && halfTime.confidence > 0.4) {
  offerAlternative(halfTime.value);   // 「84 BPM かもしれません」
}

同じ配列は C ABI・Node・Python にもあります。

Beat ​

typescript
interface Beat {
  time: number;      // 秒
  strength: number;  // その拍のフレームにおけるオンセット包絡の生値。上限なし
}

strength はサリエンススコアではない

strength は、その拍のフレームで取り出したオンセット包絡の生の 1 フレームです。正規化されておらず、相対値でもなく、0..1 に収まる保証もありません。スケールは素材に依存するため、同じ数値でも曲が違えば意味が違います。また窓ではなく 1 フレームであるため、拍位置のわずかな揺れにも追随して動きます。

アクセントのスコア付け、つまりどの拍が強いかの判定には AnalysisResult.beatObservations.onsetStrength を使ってください。これはライブラリ自身の小節頭推定が評価している窓集約値です。Beat.strength を使うのは、その瞬間の包絡値そのものが本当に欲しいときだけにしてください。

Chord ​

typescript
interface Chord {
  root: PitchClass;
  bass: PitchClass;     // 転回形のベース音
  rootName: string;     // コアの正規表記。全バインディングで共通
  bassName: string;     // コアの正規表記。全バインディングで共通
  quality: ChordQuality;
  start: number;       // 秒
  end: number;         // 秒
  duration: number;    // 秒。end - start から導出
  confidence: number;
  name: string;        // "C", "Am", "G7"
}

interface AnalysisChord extends Chord {
  romanNumeral: string; // AnalysisResult.key に対するローマ数字。N.C. は空文字列
}

duration は end - start から求めます。コアは 2 つの端点だけを保持します。

Section ​

typescript
interface Section {
  type: SectionType;
  start: number;
  end: number;
  energyLevel: number;
  confidence: number;
  name: string;  // "Intro", "Verse 1", "Chorus"
}

TimeSignature ​

typescript
interface TimeSignature {
  numerator: number;    // 例: 4
  denominator: number;  // 例: 4
  confidence: number;   // MeterEstimate.timeSignature では次点との差、
                        // MeterEstimate.candidates[] では支持総和に占める割合
}

Timbre ​

typescript
interface Timbre {
  brightness: number;   // 0.0 〜 1.0
  warmth: number;
  density: number;
  roughness: number;
  complexity: number;
}

interface TimbreFrame {
  brightness: number;
  warmth: number;
  density: number;
  roughness: number;
  complexity: number;
}

interface TimbreAnalysisResult extends TimbreFrame {
  spectralCentroid: Float32Array;
  spectralFlatness: Float32Array;
  spectralRolloff: Float32Array;
  timbreOverTime: TimbreFrame[];
}

Dynamics ​

typescript
interface Dynamics {
  dynamicRangeDb: number;
  peakDb: number;
  rmsDb: number;
  loudnessRangeDb: number;
  crestFactor: number;
  isCompressed: boolean;
}

RhythmFeatures ​

typescript
interface RhythmFeatures {
  syncopation: number;
  grooveType: string;  // "straight", "shuffle", "swing"
  patternRegularity: number;
  tempoStability: number;
  timeSignature: TimeSignature;
}

MelodyContour ​

typescript
interface MelodyContour {
  pitchRangeOctaves: number;
  pitchStability: number;
  meanFrequency: number;
  vibratoRate: number;     // Hz
  pitches: MelodyPoint[];  // フレームごとのピッチ軌跡
}

MelodyPoint ​

typescript
interface MelodyPoint {
  time: number;        // フレーム時刻(秒)
  frequency: number;   // 推定 f0(Hz、無声音のときは 0)
  confidence: number;  // 有声らしさ、0.0〜1.0
}

個別解析の結果 ​

個別の analyze* ヘルパーはこれらを返します。いずれも、対応する analyze() のサブオブジェクトに、表のフィールドを加えたものです。

ヘルパー結果の型analyze() のサブオブジェクトに加わるフィールド
analyzeBpmBpmAnalysisResultbpm、confidence、candidates: BpmCandidate[]({ bpm, confidence }。candidates[0] が選ばれたテンポで、残りは得票率順)、autocorrelation、tempogram
analyzeRhythmRhythmAnalysisResultRhythmFeatures に、bpm(ビートトラッカーが補正したテンポ)と beatIntervals を加えたもの
analyzeDynamicsDynamicsResult(別名 DynamicsAnalysisResult は非推奨)Dynamics に、loudnessTimes と loudnessRmsDb(並行する Float32Array)を加えたもの
analyzeTimbreTimbreAnalysisResultTimbre に、spectralCentroid、spectralFlatness、spectralRolloff、timbreOverTime を加えたもの
analyzeMelodyMelodyResultMelodyContour の要約フィールドと、軌跡を持つ points: MelodyPoint[](analyze() では melody.pitches)

RoomMorphResult ​

roomMorph(...) は、モーフ後の音声と、目標ルームの合成がそれを作るために何を変更したかをあわせて返します。

typescript
interface RoomMorphResult {
  audio: Float32Array;           // 入力の長さ + 目標ルームの残響テイル
  sampleRate: number;
  diagnostics: RirDiagnostic[];  // 合成が報告した診断情報すべて、報告順
}

interface RirDiagnostic {
  code: string;       // 安定した ID。例: 'acoustic.rir_length_clamped'
  message: string;
  severity: 'info' | 'warning' | 'error';
}

生成できないモーフは例外になり、使えない synthesizeRir(...) の呼び出しも同様に例外になるため、どちらの結果にもエラーフラグはなく、diagnostics に入るのはすべて「結果は得られたが注意が要る」警告です。分岐は code で行ってください。acoustic.ism_order_clamped(鏡像音源の次数が安全上限まで下げられた)、acoustic.rir_length_clamped(テイルが maxSeconds か資源上限で切られた)、acoustic.rir_length_floored(maxSeconds が直接音の到達時間より短い)、acoustic.rir_tail_truncated(maxSeconds が最も長いバンドを 60 dB 減衰する前に切った)、acoustic.no_late_tail(拡散テイルが生成されなかった)はいずれも「指定したのとは別の部屋を通った」ことを意味しますが、音声そのものからは分かりません。synthesizeRir(...) も同じ形を RirResult.diagnostics で報告します。C ABI も同じ項目を構造化して公開しており(sonare_last_diagnostic_count()、sonare_last_diagnostic_code(i)、sonare_last_diagnostic_message(i)、sonare_last_diagnostic_severity(i))、そちらでも、連結済みの sonare_last_warning_message() 文字列を解析するのではなくコードで分岐できます。

RoomMorphStereoResult ​

roomMorphStereo({ left, right, sampleRate?, receiverSpacingM?, ... }) は roomMorph(...) と同じルームオプションを取り、入力チャンネルごとにモーフ済みのチャンネルを 1 本返します。目的の部屋は、リスナーを挟んで receiverSpacingM(メートル、(0, 4] の範囲、既定 0.5)だけ離れた 2 本の無指向性レシーバーで聴かれ、各チャンネルは自分のレシーバーの応答と畳み込まれます。RoomMorphStereoResult は { left, right, sampleRate, diagnostics } で、2 つの Float32Array はどちらも入力長にリバーブテイルを足した長さ、diagnostics は RoomMorphResult.diagnostics と同じコードを持ちます。長さの異なるチャンネルや、有限でない、または (0, 4] の外にある receiverSpacingM は RangeError になります。sampleRate の既定は 48000 です。

ルーム推定と RIR の型 ​

typescript
interface RoomEstimateResult {
  volume: number;                // m^3。減衰を計測できなければ NaN(confidence は 0)
  lengthM: number;               // synthesizeRir が受け取る名前と同じ
  widthM: number;
  heightM: number;
  drrDb: number;
  confidence: number;
  bandAbsorption: Float32Array;
  rt60Bands: Float32Array;
}

interface RirResult {
  rir: Float32Array;
  sampleRate: number;
  diagnostics: RirDiagnostic[];  // 警告のみ。使えない合成は例外になる
}

type MaterialPresetName = 'none' | 'concrete' | 'wood' | 'curtain' | 'carpet' | 'glass';
type AcousticModeName = 'auto' | 'blind' | 'impulse_response';
interface RoomPlacement { x: number; y: number; z: number }  // メートル

materialPreset と推定の mode は、これらの名前だけを受け付けます。数値は TypeError です。roomGeometryFromEstimate(...) は RoomEstimateResult を synthesizeRir(...) 用の RoomGeometryOptions に変換します。結果には source と listener(既定の配置を軸ごとに推定したルームの寸法へ拡縮したもので、7 × 5 × 3 では既定と一致します)と、有限なバンドの平均であるスカラーの absorption も含まれ、渡した位置は拡縮した配置より優先されます(ルーム音響を参照)。

MasteringChainConfig ​

masteringChain* と StreamingMasteringChain は下のネスト構造の設定スキーマを使います。各キーは任意で、指定されたステージだけが下の固定順で有効になります。加えて、下に挙げる各ステージオブジェクト(denoise のオブジェクト形式、tilt、compressor、loudness など)はいずれも enabled?: boolean を受け付け、そのステージを明示的に切り替えられます。一覧では繰り返しを避けるため省いています。"dynamics.compressor.thresholdDb" のようなフラットなドット記法のキーも同じオブジェクトで受け付けられ、そのままコアへ渡されます。

マスタリングチェーンの順序
リペアEQダイナミクスサチュレーションスペクトルステレオマキシマイザーラウドネス
有効化したステージだけが処理されますが、有効なステージは常にこの順で実行されます。

masterAudio* はプリセットから開始し、同じキー名を "dynamics.compressor.thresholdDb" のようなフラットなドット記法の overrides(上書き値)として受け取ります。

maximizer.truePeakLimiter.releaseMs はポストリミッターのリリース時間です。省略するとプリセット/設定の既定値 50 ms を保ちます。フラットな上書き値として渡した場合、その値がそのまま適用されます。maximizer.truePeakLimiter.applyGainAtInputRate を有効にすると、静的なラウドネスゲインをオーバーサンプリング前の入力サンプルレートで適用します。ホスト間でゲイン段の位置を揃えたい場合に使います。

repair.denoise.reductionDb(フラットな repair.reductionDb エイリアスでも同じフィールドを指定できます)は、ゲインマスクが各ビンに適用できる最大の減衰量を dB で指定するもので、既定値は 26 です。以前の gainFloor(dB の深さではなく線形の下限値)という表記も引き続き受け付けられ、変換されます(dB = -20*log10(gainFloor))。この変換は旧来の有効範囲も引き継ぐため、1 を超える下限値は負の深さになり、同様に拒否されます。

インターフェース全文(クリックで展開)
typescript
interface MasteringChainConfig {
  repair?: {
    denoise?: boolean | { mode?: number | 'logMmse' | 'mmseStsa' | 'spectralSubtraction';
                          noiseEstimator?: number | 'quantile' | 'mcra' | 'imcra' | 'spp'; nFft?: number;
                          hopLength?: number; ddAlpha?: number; reductionDb?: number;
                          gainFloor?: number; overSubtraction?: number;
                          spectralFloor?: number; noiseEstimationQuantile?: number;
                          speechPresenceGain?: boolean; gainSmoothing?: boolean; };
    nFft?: number; hopLength?: number; ddAlpha?: number; reductionDb?: number;
    /** @deprecated `denoise.reductionDb` を使用してください(`dB = -20*log10(gainFloor)` で変換) */
    gainFloor?: number;
    declip?: { clipThreshold?: number; lpcOrder?: number; iterations?: number; lpcBlend?: number; };
    decrackle?: { threshold?: number; levels?: number;
                  mode?: number | 'median' | 'waveletShrinkage'; };
    dehum?: { fundamentalHz?: number; harmonics?: number; q?: number; adaptive?: boolean;
              searchRangeHz?: number; adaptation?: number; frameSize?: number;
              pllBandwidth?: number;
              mode?: number | 'subtract' | 'notch'; };
    declick?: { threshold?: number; neighborRatio?: number; maxClickSamples?: number;
                lpcOrder?: number; residualRatio?: number; };
    dereverb?: { threshold?: number; attenuation?: number; nFft?: number; hopLength?: number;
                 t60Sec?: number; lateDelayMs?: number; overSubtraction?: number;
                 spectralFloor?: number; wpeEnabled?: boolean; wpeIterations?: number;
                 wpeTaps?: number; wpeStrength?: number; };
  };
  eq?: {
    /** 正規のネストされた tilt ステージ */
    tilt?: { tiltDb?: number; pivotHz?: number };
    /** @deprecated `eq.tilt.tiltDb` を使用してください */
    tiltDb?: number;
    /** @deprecated `eq.tilt.pivotHz` を使用してください */
    pivotHz?: number;
  };
  dynamics?: {
    compressor?: { thresholdDb?: number; ratio?: number; attackMs?: number; releaseMs?: number;
                   kneeDb?: number; makeupGainDb?: number; autoMakeup?: boolean; };
    deesser?: { frequencyHz?: number; thresholdDb?: number; ratio?: number; attackMs?: number;
                releaseMs?: number; rangeDb?: number; bandpassQ?: number; };
    transientShaper?: { attackGainDb?: number; sustainGainDb?: number; fastAttackMs?: number;
                        fastReleaseMs?: number; slowAttackMs?: number; slowReleaseMs?: number;
                        sensitivity?: number; maxGainDb?: number; gainSmoothingMs?: number;
                        lookaheadMs?: number; };
    multibandComp?: { lowCutoffHz?: number; highCutoffHz?: number;
                      lowThresholdDb?: number;  lowRatio?: number;
                      lowAttackMs?: number;     lowReleaseMs?: number;
                      midThresholdDb?: number;  midRatio?: number;
                      midAttackMs?: number;     midReleaseMs?: number;
                      highThresholdDb?: number; highRatio?: number;
                      highAttackMs?: number;    highReleaseMs?: number;
                      /** 任意のバンド数(2〜64)。`cutoffsHz` で length + 1 になる。 */
                      crossover?: { cutoffsHz?: number[]; slope?: 'lr2' | 'lr4' | 'lr8' | number;
                                    mode?: 'linkwitzRiley' | 'butterworth' | 'bessel' | 'firLinearPhase' | number;
                                    firKernelSize?: number; };
                      /** バンドのインデックスごとのコンプレッサー設定。 */
                      bands?: MultibandCompressorBand[]; };
  };
  saturation?: {
    tape?: { driveDb?: number; saturation?: number; hysteresis?: number; outputGainDb?: number;
             speedIps?: number; headBumpDb?: number; bias?: number; gapLoss?: number;
             oversampleFactor?: number; };
    exciter?: { frequencyHz?: number; driveDb?: number; amount?: number; q?: number;
                evenOddMix?: number; aliasing?: number; };
  };
  spectral?: {
    airBand?: { amount?: number; shelfFrequencyHz?: number;
                dynamicThresholdDb?: number; dynamicRangeDb?: number; };
  };
  stereo?: {
    imager?: { width?: number; outputGainDb?: number; decorrelationAmount?: number;
               preserveEnergy?: boolean; };
    monoMaker?: { amount?: number; frequencyHz?: number };
  };
  maximizer?: {
    truePeakLimiter?: { ceilingDb?: number; lookaheadMs?: number; releaseMs?: number;
                        oversampleFactor?: number; applyGainAtInputRate?: boolean; };
  };
  loudness?: { targetLufs?: number; ceilingDb?: number; truePeakOversample?: number;
               releaseMs?: number; applyGainAtInputRate?: boolean;
               maxLimiterGainReductionDb?: number; };
  /** ネスト形式と並行して、フラットなドット記法のキーも受け付ける */
  [flatKey: `${string}.${string}`]: number | boolean | undefined;
}

interface MasteringResult {              // masteringProcess、masteringPairProcess
  samples: Float32Array;
  sampleRate: number;
  inputLufs: number;
  outputLufs: number;
  appliedGainDb: number;
  loudnessTargetLimited?: boolean;
  latencySamples?: number;
  nonFiniteSubstitutionCount: number;    // リミッターが有限値に置き換えたサンプル数
}
interface MasteringChainResult {         // masteringChain / masterAudio(および WithProgress)
  samples: Float32Array;                 // レイテンシ補正済み。latencySamples はない
  sampleRate: number;
  inputLufs: number;
  outputLufs: number;
  appliedGainDb: number;
  stages: string[];
  outputTruePeakDbtp: number;
  outputLra: number;
  loudnessTargetLimited: boolean;
  nonFiniteSubstitutionCount: number;
  stageGainReductions: StageGainReduction[];
  report: MasteringReport;
}
interface MasteringStereoResult {        // masteringProcessStereo
  left: Float32Array;
  right: Float32Array;
  sampleRate: number;
  inputLufs: number;
  outputLufs: number;
  appliedGainDb: number;
  latencySamples: number;
  loudnessTargetLimited: boolean;
  nonFiniteSubstitutionCount: number;
}
// masteringChainStereo / masterAudioStereo(および WithProgress)の戻り値。
// MasteringChainResult の samples を left/right に置き換えた形。MasteringStereoChainResult は
// Node/Python バインディングとのソース互換性のために残された @deprecated エイリアス。

列挙型のリペアキーは、序数と名前のどちらでも受け付けます。序数は列挙順に 0 から振られます: denoise.mode('logMmse'、'mmseStsa'、'spectralSubtraction')、denoise.noiseEstimator('quantile'、'mcra'、'imcra'、'spp')、decrackle.mode('median'、'waveletShrinkage')、dehum.mode('subtract'、'notch')。

マルチバンドコンプレッサーは、バージョン 2 のチェーンドキュメントだけでなく、どのチェーン呼び出しからでも設定できます。crossover.cutoffsHz はカットオフのリストを置き換えてバンド数(最大 64)を決め、bands は MultibandCompressorBand でバンドをインデックスごとに指定します。フィールドは thresholdDb、ratio、attackMs、releaseMs、kneeDb、makeupGainDb、autoMakeup、detector('peak'、'rms'、'logRms'、または序数)、sidechainHpfEnabled、sidechainHpfHz、pdrTimeMs、pdrReleaseScale で、すべて省略可能です(省略したフィールドはベースの値のままです)。フラットキーでは dynamics.multibandComp.crossover.cutoffsHz.<i> と dynamics.multibandComp.bands.<i>.<field> で、インプレース形式の cutoff<i>Hz / band<i>.<field> や low/mid/high の短縮形と併用できます。キーの順序は問いません。同じフィールドを 1 回の呼び出しで 2 通りの綴りで渡すと拒否され、バンドが 1 つだけのステージも拒否されます(multiband stage needs at least two bands; one band is the compressor stage)。dynamics.compressor.detector とマルチバンドのスロープ、モード、バンドごとのディテクタのキーでは、enum の名前が解決されます。比率を 1 にしたとき、Linkwitz-Riley のバンドはカットオフで平坦に足し合わさります(lr2・lr4 とも 0.00 dB)。Butterworth と Bessel はカットオフで打ち消し合わず、むしろ持ち上がります。カットオフ 1 kHz に 1 kHz の音を通すと、Butterworth は lr2・lr4 とも +3.01 dB、Bessel は lr2 で +2.68 dB、lr4 で +1.69 dB です。

各ステージの使いどころは用語集の各ページに対応しています: リペア、トーンと Air、ダイナミクス、ステレオ・リミッター・ラウドネス。

列挙型 ​

PitchClass ​

typescript
const PitchClass = {
  C: 0, Cs: 1, D: 2, Ds: 3, E: 4, F: 5,
  Fs: 6, G: 7, Gs: 8, A: 9, As: 10, B: 11
} as const;

Mode ​

Mode は序数の enum です。結果ではモードが名前(KeyMode)で報告されるので、detectKey、detectKeyCandidates、analyze、autoTune は mode: 'major'、'minor'、'dorian' のように返します。Mode.Major との比較には使わないでください。入力はどちらでも受け付けます。detectChords、chordFunctionalAnalysis、Audio.chordFunctionalAnalysis(リクエスト形式と位置引数形式)の keyRoot / keyMode、chordFunctions の key、autoTune の key は、ピッチクラス名('C#'、PitchClassName)または数値と、モード名または Mode 序数を取るので、検出したキーをそのまま渡せます。未知の名前は、フィールド名を挙げた RangeError になります。

KeyMode は 'major' | 'minor' | 'dorian' | 'phrygian' | 'lydian' | 'mixolydian' | 'locrian'、PitchClassName は 'C' | 'C#' | ... | 'B'(シャープ表記のみ)です。

typescript
const Mode = {
  Major: 0,
  Minor: 1,
  Dorian: 2,
  Phrygian: 3,
  Lydian: 4,
  Mixolydian: 5,
  Locrian: 6
} as const;

ChordQuality ​

typescript
const ChordQuality = {
  Major: 0, Minor: 1, Diminished: 2, Augmented: 3,
  Dominant7: 4, Major7: 5, Minor7: 6, Sus2: 7, Sus4: 8,
  Unknown: 9, Add9: 10, MinorAdd9: 11, Dim7: 12,
  HalfDim7: 13, Major9: 14, Dominant9: 15, Sus2Add4: 16,
  Major6: 17, Minor6: 18, MinorMajor7: 19, Dominant7Sus4: 20,
  Dominant11: 21, Dominant13: 22,
  Dominant7Flat9: 23, Dominant7Sharp9: 24
} as const;

6th・m7b5・7sus4 は既存のコードと構成音が同じ

このうち 3 つは、すでに enum にあるコードを移調したものと、構成音の集合が完全に一致します。

  • maj6 は短 3 度下の m7 と同じ構成音(C6 = Am7)
  • min6 は短 3 度下の m7b5 と同じ構成音(Cm6 = Am7b5)
  • 7sus4 は完全 4 度上の sus2add4 と同じ構成音(C7sus4 = Fsus2add4)

クロマグラムにはこれらを区別する材料がありません。2 つの読み方は同一の 12 次元ベクトルだからです。そのため検出器は既存の読み方を既定として維持し、ベースが裏付けたときにだけ 6th へ昇格させます。演奏者が C6 と書くような箇所は、ベースが C にない限りたいてい Am7 として報告されます。Major6 と Minor6 は、和声だけから検出器が行う訂正ではなく、ベースについての根拠として扱ってください。

SectionType ​

typescript
const SectionType = {
  Intro: 0, Verse: 1, PreChorus: 2, Chorus: 3,
  Bridge: 4, Instrumental: 5, Outro: 6, Unknown: 7
} as const;

型エクスポート索引 ​

WASM パッケージは、関数やクラスに加えて TypeScript の補助型もエクスポートしています。オプション、リアルタイムバッファ、コールバックのペイロードを型付けするときは、アプリ側で再定義せずこれらを使えます。

分野エクスポートされる型/定数
環境とエンジンEXPECTED_ABI_VERSION, EXPECTED_ENGINE_ABI_VERSION, EXPECTED_PROJECT_ABI_VERSION, EngineCapabilities, ProgressCallback
エンジンのレーンミキサー、マーカー、MIDI クリップMAX_TRACK_LANES(32)、EngineTrackLane, EngineTrackSend, EngineBus, EngineMarker, EngineMidiClipSchedule, EngineMidiEvent, ExternalMidiEvent, MarkerKind, ProjectMarker
キー/コード/リズム/音色解析ChordDetectionOptions, KeyMode, PitchClassName, KeyProfileName, BpmAnalysisResult, BpmCandidate, RhythmAnalysisResult, TimbreAnalysisResult, TimbreFrame, DynamicsResult, DynamicsAnalysisResult, MelodyResult
WorkerOfflineWorkerClient, OfflineWorkerClientOptions, OfflineWorkerCallOptions, OfflineWorkerProgress, OfflineWorkerTask, OfflineWorker。Web Worker の使用を参照
スペクトル/ピッチ/特徴量変換MelPowerResult, StftMagnitudeResult, PitchCorrectOptions, VoicedFlags, SpectralRegionOp, SpectralEditOptions, TempogramMode, HarmonicRequest, HpssRequest, PercussiveRequest, AutoTuneRequest, PitchShiftRequest, TimeStretchRequest
ページ式クリップストリーミングClipPageStreamerEngine, ClipPageStreamerOptions, ClipPageStreamSource, OpfsClipStream, OpfsClipStreamOptions, OpfsClipPageProviderOptions
マスタリングと機能カタログMasteringProcessorParams、MasteringProcessorCatalogEntry、MasteringInsertParamInfo、MasteringInsertParamChoice、MasteringInsertSlot、MasteringInsertTiming、CapabilityCatalog、CapabilityCatalogParameter、CapabilityCatalogProcessor、CapabilityCatalogPresets、CapabilityCatalogMasteringPreset、CapabilityCatalogChain、CapabilityCatalogChainStage、CapabilityCatalogChainList、CapabilityCatalogChainAlias、MultibandCompressorBand、MasteringInsertParamDependency、MasteringChannelPolicy、MasteringChainStereoResult、MasteringStereoParamsRequest、MasteringStreamingPreviewStereoRequest、MeteringStereoRequest、MeteringStereoDecimatedRequest
ストリーミングリチューンと EQStreamingRetuneConfig, StreamingEqualizerConfig, EqBandType, EqBandPhase, EqCoeffMode, EqMatchOptions, EqStereoPlacement
リアルタイム音声VoicePresetId, RealtimeVoiceChangerConfigInput, RealtimeVoiceChangerPodConfig, RealtimeVoiceChangerMonoBuffer, RealtimeVoiceChangerInterleavedBuffer, RealtimeVoiceChangerPlanarBuffer
ミキシング/Worklet 用リアルタイムバッファMixerRealtimeBuffer, SonareScopeRingBuffer, SonareScopeRingReadResult, SonareWorkletScopeSnapshot
プロジェクト/エンジンのオートメーションProjectAssistSidecar, ProjectAssistSidecarInput, ProjectAutomationTargetKind, EngineTrackMonitorMode, TrackMonitorMode
パン則の入力PanLaw, PanLawName, PanLawInput
コントローラーと発音方式の値テーブルCONTROLLER_INPUTS、CONTROLLER_AXES、ARTICULATIONS
プロジェクト自動化の対象を表す別名定数PROJECT_AUTOMATION_TARGET_OPAQUE (0)、PROJECT_AUTOMATION_TARGET_TRACK_FADER_DB (1)、PROJECT_AUTOMATION_TARGET_TRACK_PAN (2)、AutomationTargetKind
ボーカル編集ハンドルVocalEditDraft、VocalRenderJob、VocalRenderSnapshot。ボーカル編集を参照

SurroundPan(Mixer.setSurroundPan のパラメータ型)はパッケージの公開エクスポート一覧に含まれていません。インポートせず、インラインまたはローカルなエイリアスとして型付けしてください。

リテラルユニオン型と enum 相当のテーブル ​

以下のエクスポートされた文字列リテラルのユニオン型は、フィールドや呼び出しが受け付ける値を列挙したものです。シンセ系の各語彙は序数も受け付けます。synthEnumTables() は SynthEnumTables に含まれるランタイムテーブルを string[] として返します。retriggers、lfoShapes、sampleLoopModes、sampleKeyTracks、partRigModes、sampleDescLoopModes のテーブルが以下の対応するユニオン型にあたり、リトリガーの値は SYNTH_RETRIGGERS としてもエクスポートされます。

型値現れる場所
SynthEngineMode'default', 'subtractive', 'fm', 'karplus-strong', 'modal', 'additive', 'percussion', 'piano', 'pipe-organ', 'bowed-string', 'reed', 'brass', 'flute', 'plucked-string', 'vocal', 'free-reed', 'harpsichord', 'sample'SynthPatch.engineMode。エンジンモードだけを設定したパッチは、そのエンジンのベースプリセットで発音する。'sample' はバンクを渡すまで無音
SynthOscWaveform'default', 'sine', 'saw', 'square', 'triangle', 'noise'SynthPatch.waveform
SynthFilterModel'default', 'svf', 'transistor-ladder', 'diode-ladder', 'sallen-key', 'svf-4-pole'SynthPatch.filterModel。'svf-4-pole' は 2 段のステートバリアブルセクションによる、飽和しない 24 dB/オクターブのローパス
SynthLfoShape'default', 'triangle', 'sine', 'random'SynthPatch.lfoShape。すべての行き先でのビブラートとトレモロの LFO 波形。SYNTH_LFO_SHAPES と一緒にエクスポート。'random' はボイスごとに種を決める平滑化サンプル&ホールドなので、バウンスを繰り返しても同じになります
SynthFilterOutput'default', 'lowpass', 'bandpass', 'highpass'SynthPatch.filterOutput(SVF のみ)
SynthBodyType'default', 'none', 'guitar', 'violin', 'wood-tube', 'brass-bell', 'vocal'SynthPatch.body
SynthRetrigger'default', 'free', 'note'SynthPatch.retrigger。Node/WASM では SynthRetrigger と SYNTH_RETRIGGERS としてエクスポート
SynthModSource'none', 'amp-env', 'filter-env', 'lfo1', 'lfo2', 'velocity', 'key-track', 'mod-wheel', 'random', 'breath', 'aftertouch', 'expression-cc', 'pitch-bend'SynthModRouting.source
SynthModDestination'none', 'pitch-cents', 'cutoff-cents', 'amp-gain', 'pan-units', 'resonance-q', 'vibrato-depth-cents', 'filter-env-depth', 'lfo1-rate-scale', 'excitation-force', 'excitation-position', 'excitation-brightness', 'spectrum-morph'SynthModRouting.destination
SampleLoopMode / SampleKeyTrack'default', 'none', 'continuous', 'key-down' / 'default', 'on', 'off'SynthPatch.sampleLoop / SynthPatch.sampleKeyTrack
SampleDescLoopMode'none', 'continuous', 'key-down'SampleDesc.loopMode。録音自体のループモードで、SampleLoopMode とは別の集合
BuiltinSynthWaveform'sine', 'saw', 'sawtooth', 'square', 'triangle', または 0〜3BuiltinSynthConfig.waveform
ControllerInput / ControllerAxis'control-change', 'channel-pressure', 'poly-pressure', 'pitch-bend', 'velocity' / 'none', 'excitation', 'position', 'brightness', 'morph', 'loudness', 'pitch-cents', 'vibrato-depth'RealtimeEngine.bindController に渡す ControllerBinding.input / .axis
Articulation'poly', 'mono-retrigger', 'mono-legato'RealtimeEngine.setArticulation
MpeDimension / NoteTracking'bend', 'pressure', 'timbre' / 'last', 'lowest', 'highest', 'all'RealtimeEngine.setControllerNoteTracking
SourceBackend'sf2', 'synth'Project.soundFontManifest が返す Sf2ProgramStatus.backend
EngineCaptureSource'output', 'input', または序数RealtimeEngine.setCaptureSource
ProjectTrackKind'audio', 'midi', 'aux', または 0〜2Project.addTrack、Project.setTrackKind
ProjectLoopMode'off', 'loop', または 0〜1Project.setClipLoop
ProjectFadeCurve'linear', 'equal-power'('equal_power'・'equalPower'・'equalpower' も可), 'exponential'/'exp', 'logarithmic'/'log', または 0〜2Project.setClipFade に渡す ProjectClipFade.curve
MasteringProcessorCategory'dynamics', 'effects', 'eq', 'final', 'maximizer', 'multiband', 'other', 'reference', 'repair', 'saturation', 'spectral', 'stereo'masteringProcessorCatalog() が返す MasteringProcessorCatalogEntry.category
MasteringRealtimeCost'low', 'moderate', 'high'MasteringProcessorCatalogEntry.realtimeCost(未評価のときは null)
PairProcessor'match.applyMatchEq', 'match.alignReferenceToSource', 'match.abSwitch', 'match.abCrossfade'masteringPairProcess の processorName。masteringPairProcessorNames() で一覧できる
PairAnalysis'match.referenceLoudness', 'match.tonalBalance', 'match.tonalBalanceLogBands', 'match.matchEqCurve', 'match.estimateReferenceDelaySamples'masteringPairAnalyze の analysisName。masteringPairAnalysisNames() で一覧できる
StereoAnalysis'stereo.monoCompatCheck', 'stereo.monoCompatCheckLogBands'masteringStereoAnalyze の analysisName。masteringStereoAnalysisNames() で一覧できる
DehumMode'subtract', 'notch'masteringRepairDehum の mode
MixAnalysisBand'sub', 'low', 'lowMid', 'mid', 'highMid', 'high', 'air'MixBandOccupancy のキー。ミックスアシスタントの解析における MixCrowdedBand.band
SpectralEditMode / SpectralEditWindow'gain', 'attenuate', 'mute', 'heal' / 'hann', 'hamming', 'blackman', 'rectangular', 'rect'spectralEdit に渡す SpectralRegionOp.mode / SpectralEditOptions.window
NoteTargetUnmatchedPolicy'leave'(既定), 'mute', 'nearest'assignNoteTargets の unmatchedPolicy

MasteringInsertParamInfo と CapabilityCatalogParameter の id は number | null、choices は MasteringInsertParamChoice[] | null、slot は string | null です。CapabilityCatalogProcessor.slots は MasteringInsertSlot で表す条件付きキー群を列挙します。CapabilityCatalog.masteringPresets は name、kind、targetLufs、truePeakCeilingDb、maxLimiterGainReductionDb を持つ要素を返し、修復プリセットでは後ろ 3 つが null です。SynthParamInfo(synthEngineParamInfo(engineMode) と synthPatchParamInfo() が返す)は name、type('number' または 'boolean')、省略可能な integer、min、max、default(number | boolean。スイッチでは真偽値)、unit に加え、省略可能な activeWhen(SynthParamCondition[][]。key、scope('engine' または 'patch')、relation('eq'、'ne'、'gt'、'ge'、'lt'、'le' のいずれか)、value)を持ちます。内側の配列のどれか 1 つで条件がすべて成り立てば、そのフィールドはボイスに届きます。activeWhen は無条件のフィールドでは存在しません。activeWhen のないフィールドでも、演奏(ベロシティ、コントローラー、重なったノート)があるときだけ効く場合や、ある値を超えると飽和する場合があります。synthEngineParamInfo はセクションを持たないモードでは [] を返します。SynthPatch.retrigger のボイス開始時の挙動は内蔵シンセサイザーを参照してください。