Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

Python

新着順 人気順

信号処理に欠かせないオールパスフィルタ―の概要・使い方・利用例

※2022/9/28: λの算出式の符号が間違っていたためプロットとともに修正 信号処理におけるフィルタとしては、ローパス/ハイパスフィルタのような振幅特性を活用するフィルタが良く知られています。 しかし、一方で位相特性のみに影響を与えるオールパスフィル…

Python-sounddevice で音声や歌声をリアルタイム収音・再生・録音

Pythonで音声や歌声、楽器音などの収音・再生・録音を行うためのライブラリとしてはPyAudioが知られていますが、 低遅延であるASIO規格が利用できない Python 3.7 以上には非対応 というデメリットがあります*1。 Python 3.7 以上でASIO対応デバイスを利用可…

マルチバンド(オーディオクロスオーバー)処理を実現するフィルタ(Butterworth, Linkwitz-Riley)のPython実装(2バンド)

低域・高域のような周波数帯域別に信号処理する場合、いい感じに帯域を分割するフィルタが必要になります。 ソフトウェア/プラグインの具体例としてはマルチバンドコンプレッサが挙げられます。 このような回路の特性としては、音質に影響を与えるような振…

LibROSA:音楽のBPM・テンポ分析に便利なテンポグラムを数行で実装

音楽の分析方法としてBPM・テンポの分析は非常に重要です。 BPM・テンポの分析を行うことで、楽曲の雰囲気、ノリ、音楽ジャンルといった全体的な特徴を捉えることができます。 BPM・テンポの分析方法としては、テンポグラムという便利な手法があります。 テ…

音の広がりや位相差を可視化するリサージュメーター(ゴニオメーター)のPython実装

DTMなどで音の広がり感を可視化するには,リサージュ図形に基づく方法があります. リサージュ リサジュー:Lissajousとは | 偏ったDTM用語辞典 - DTM / MIDI 用語の意味・解説 | g200kg Music & Software 2つの信号を元に作られるリサージュ図形を利用し,2…

ボイスチェンジャー向けフィルタ設計:周波数ワープによるフィルタ係数の修正と実装方法

リアルタイム声質加工プラグインの開発進捗。声を太くしたり子供っぽくしたりできる処理のデモです。 pic.twitter.com/JcfwPJ2OCc— Kurene (@_kurene) July 18, 2020 線形予測分析+周波数ワープでリアルタイムで声質を加工する処理を作りました。 ボイスチ…

Python LibROSA で音楽・歌声(ボーカル)をピッチシフト librosa.effects.pitch_shift()

まえがき librosa.effects.pitch_shift() の使い方 引数について 半音単位のピッチシフト 周波数を指定するピッチシフト 使い方のサンプル プロット コード 注意 補足:ピッチシフトはタイムストレッチ? まえがき ボーカルや楽器の録音データに対して、 「…

手を動かして学べる、音のプログラミング・信号処理の教科書(入門/中級者/上級者向けの本)

はじめに 音の信号処理の世界には、理論書や数式重視の教科書が数多く存在します。しかし、実際に手を動かしてプログラムを書きながら学べる本は意外に少ないのが現状です。 そこで本記事では「実際に手を動かしてこそ理解が深まる」ことを重視し、音プログ…

移動平均と指数平滑移動平均の周波数特性(振幅,位相,群遅延)

はじめに 定義 移動平均(Moving Average)とは 計算方法 特徴と用途 指数平滑移動平均(Exponential Moving Average)とは 計算方法 特徴と用途 移動平均と指数平滑移動平均の使い分け 周波数特性 移動平均 (MA) 指数平滑移動平均 (EMA) Pythonコード まと…

Pythonでゲーム音楽(チップチューン)の基本波形を生成(サイン波,矩形波,のこぎり波,三角波,白色雑音)

シンセサイザ(オシレータ)の基本波形として一般的なサイン波,矩形波,のこぎり波,三角波,白色雑音は,ファミコンのBGMのようなゲーム音楽(チップチューン)の作成や音信号処理のテストでよく利用されます. サイン波は基本周波数(音高)をとすると, …

numpy.savez_compressed:複数のNumPy配列を圧縮&バイナリ保存

Numpy で配列をバイナリで保存する方法としては、 numpy.save(npy_filepath, arr) が最も単純な方法です。 しかし、 非圧縮であるため、ファイルサイズが大きくなりがち 単一の配列オブジェクトのみ保存 であるため、大量の配列を保存する場合や、配列サイズ…

Notepad++のプラグインによるMarkdownプレビュー

概要 Notepad++でMarkdown記法で書かれたファイルをプレビューできたら…と思って探したところ、簡単に導入できるプラグインを見つけたので紹介します。 概要 MarkdownViewerPlusPlus 導入方法 (1) プラグインをダウンロード (2) プラグインをNotepad++のプラ…

ステレオ楽曲の位相差を確認できるフェーズメーターの作り方(極座標ベース)

前回の記事では,ステレオのL, R チャネルの信号を,リサージュ図形の として与えることで音の広がりを可視化しました. www.wizard-notes.com この記事では,直交座標 を極座標(絶対値と偏角) 表記にしたバージョンを紹介します. 参考: Goniometer Algo…

Overlap-Add法・Overlap-Save法(重畳加算法,重畳保留法)のPython実装

音信号処理の代表例として、コンボリューションリバーブ*1のような入力信号にインパルス応答を畳み込む処理が挙げられます。 この畳み込み演算をリアルタイムのブロック処理で実現する*2実用的な方法としては、 Overlap-Add法とOverlap-Save法が有名です。 …

楽曲のBPMを自動算出するプログラムの作り方(Pythonサンプルコード付き)

はじめに 音楽分析では,楽曲のテンポを表す BPM (Beats Per Minute) は重要な情報です。 例えば、音楽ジャンルごとに典型的なBPM/テンポがあるので、BPM/テンポはその楽曲がどんな音楽ジャンルに属するかを知る手がかりとなります。 一般的ないくつかのジ…

LibROSA:Pythonで手軽に始める音楽信号・データ分析 [2022年20月更新]

LibROSA とは? 出典:https://librosa.github.io/ 「自分の好きな音楽をパソコンで分析したい!」 「音楽データで機械学習・ディープラーニングをやってみたい!」 「でも、音データの信号処理やデータの扱い方がよく分からない…」 と悩んでいるエンジニア…

Python:PyQtGraphで2次元波動方程式の数値シミュレーションをリアルタイムプロット(有限差分法)

PyQtGraphで美しいリアルタイムプロットができることを最近知ったので、実装例として2次元波動方程式の数値シミュレーション(有限差分法)をリアルタイム実行・プロットしてみました。 実装のための数式導出と、PyQtGraphを使ったソースコードを合わせて紹…

Pythonでゼロ位相フィルタリング (scipy.filter.filtfilt)

はじめに ゼロ位相フィルタリングの実装方法 scipy.signal.filtfiltを使ったゼロ位相フィルタ lfilter x 2 でのゼロ位相フィルタリング 参考Webサイト はじめに 双2次フィルタ (SOS) やバターワース/チェビシェフフィルタなどといったIIRフィルタは,FIRフ…

Python:soundfile を使ったオーディオファイル (.wav, .flac, .aiff, .raw, etc.) の読み書き

Python でオーディオファイルを読み込むライブラリは複数あります。 wave scipy.io.wavfile scipy.io.wavfile.read scipy.io.wavfile.write audiofile soundfile audioread librosa.load ぱっと見、どれを使えばよいか迷ってしまいますが、 様々なOSで動いて…

シュレーダーリバーブ(人工残響エフェクタ)のPython実装と試聴デモ

今回は,以下の記事で紹介したオールパスフィルタによる残響生成を用いて、実用的な残響エフェクタとして有名なシュレーダーリバーブをPythonで実装してみました。 www.wizard-notes.com シュレーダーリバーブの概要 フィードバック型コムフィルタの回路につ…

Python: PyAudioとPyQtで作る簡易シンセサイザー

生成した音信号を気軽に鳴らせるシステムが欲しくなり、結果的にシンセサイザもどきを作ってみました。 MIDIを扱うと面倒なので、Numpy/Scipyで生成した音信号を直接オーディオ出力できるような構造になっています。 また、一応シンセサイザっぽい見た目なの…

定Q変換 (CQT: Constant-Q Transform) の 解説(音高・コード・メロディの分析向け)

はじめに 音信号の時間周波数分析にはFFT (高速フーリエ変換) /STFT(短時間フーリエ変換)がよく使われます. しかし,FFTの性質上,音高に関わる分析をしようとすると実装や分析精度の向上に手間がかかります。 そこで,この記事では音楽信号の分析によく…

LibROSA で MFCC(メル周波数ケプストラム係数)を算出して楽器の音色を分析

MFCC 算出の流れ この記事では、 音に関するデータ分析や機械学習・深層学習で良く使われている MFCC*1 (メル周波数ケプストラム係数)という特徴量を使って、楽器の音色を分析できるかどうかを検証します。 MFCC とは? LibROSAを使ったMFCCの算出方法 1. …

Pythonで楽曲のリズム・テンポ分析: テンポグラム (Tempogram)

はじめに 楽曲分析では、メロディー、ハーモニー、リズムの3大要素から特徴を捉えるのが大事です。 ハーモニーに関しては、音楽理論による体系化(コード、コード進行など)が出来ていることもあり、計算機による分析も他の要素よりも普及しています。 一方…

Python: PyQtGraphでリアルタイムプロット/アニメーション(サンプルコード・実装デモ付き)

PyQtGraph の導入理由 matplotlib ではダメなのか? PyQtGraph のメリット・デメリット PyQtGraph の導入方法 PyQtGraphのエラー対処 リアルタイムプロット/アニメーションの実装例 1次元プロット(折れ線グラフ) 複数の折れ線・カーブプロット 2D散布図プ…

Python:ヒルベルト変換で様々な信号の包絡線,瞬時位相,瞬時周波数を抽出

音の時間波形の包絡線を抽出や振幅変調(AM)の復調などで利用されるヒルベルト変換をPythonで実装し、いくつかの簡単な信号に対して適用してみました。 ヒルベルト変換の概要 ヒルベルト変換の仕組みや実装方法については、以下のWebページがわかりやすいで…

オクターブバンドの中心・下限・上限周波数のPythonでの算出と、基底に関する備忘録

オクターブバンドについて 中心周波数や下限・上限周波数の算出 基底について オクターブバンドについて 騒音のような音信号の周波数分析では,オクターブバンドフィルタがよく使われています。 www.wizard-notes.com 周波数分析といえばフーリエ変換が思い…

Python: A特性や他の特性を使った周波数重み付けの実装 (聴感補正,騒音測定)

ある音に対して、人間が感じるうるささと音圧レベルの大きさは必ずしも一致していません。 以下の等ラウドネス曲線のように、音圧レベルと周波数によって人間の聴覚の感度は異なっています。 https://ja.wikipedia.org/wiki/音の大きさ そのため、音信号の分…

Python: LibROSA で調波打楽器音分離 (HPSS)

調波打楽器音分離とは? 一般的な楽曲では、様々な楽器音が含まれています。 そのため、元の楽曲信号から直接、音楽的な情報(例:コード進行)を分析するのは 計算機ではなかなか難しいです*1。 そこで、分析の前処理として、 打楽器の音と非打楽器(調波楽…

PythonでSSM(自己類似度行列)を使って楽曲構成(Aメロ,サビなど)を分析

計算機を使った音楽分析技術の一つとして、楽曲構成(Aメロ、Bメロ、サビ)を分析する方法があります。 しかし、日本語で技術の具体的な実現方法や実装について説明のある文献はあまり多くありません。また、Pythonの音楽分析ライブラリ LibROSA にはまだ実…