Wizard Notes

音楽信号解析の技術録、作曲活動に関する雑記

Python

Python: PyQt5とPyAudioで作るBPM計測アプリ

www.youtube.com PyQt5の習作として、PyQt5とPyAudioを使ったBPM計測アプリを作ってみました。 よくあるBPM計測器の仕様となっていて、ユーザが拍位置でボタンクリックやキータイピングをすることで、BPMを計測をすることができます。 インターフェースもア…

Python+Mutagenで、複数の楽曲から情報(楽曲の長さなど)を高速に抽出

Pythonで複数の楽曲データの長さを調べる時、真面目に楽曲ファイルを読み込んでNumpy配列のshapeを調べて…とすると、かなり時間がかかってしまいます。数百曲以上になると、それだけで時間の無駄です。 そこで、Mutagenを利用して、メタタグ情報から長さを得…

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

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

Python: PyQt5のQPushButtonで作る簡易ピアノ鍵盤

PyQt5の練習がてら、ピアノ鍵盤(もどき)を作ってみました。 タプル型の引数keysetで鍵盤の数を変えられます。 ハマったところ: 参考にしたドキュメント:Qt 5.15 buttonClicked に引数を渡すなら、partial()が便利 PythonはQtの情報が少ないので、他の言…

np.fft.fftとnp.fft.rfftの処理速度の比較

np.fft.fft v.s. np.fft.rfft 以下の記事を読んで、np.fft.fftとnp.fft.rfftの実行速度の比較に興味がわいたので、やってみました。 pman0214.github.io 音信号処理の場合、短時間フーリエ変換などでFFTをかなりの回数実行する機会が多いと思います。 時は金…

Matplotlibで主成分分析の寄与率・累積寄与率を左右2軸プロット

多変量解析の一般的な手法である主成分分析を使っていると、寄与率と累積寄与率を確認することが多いです。 それぞれを別にプロットしてもよいのですが、 1つのプロットで確認できたほうが便利だと思い、matplotlibで実装してみました。 一つのプロットで左…

Numpyで多変量正規分布を算出&プロット

numpy では、N次元の正規分布を出力するnumpy.random.normal() がありますが、こちらでは共分散を設定できません。 共分散を指定する場合、N次元の多変量正規分布を 出力できる、numpy.random.multivariate_normal () を使う必要があります。 numpy.random.m…

マルコフ連鎖で定常分布を固有値問題として算出するときの注意点

マルコフ連鎖でコード進行を自動生成 において、定常分布を求めるのに少し分かりにくい箇所ががあったので説明します。 マルコフ連鎖の定常分布は、遷移行列の固有値1に対応する固有ベクトルを確率密度関数として正規化することで算出することができます。 …

マルコフ連鎖でコード進行を自動生成(Python実装)

伝統的な自動作曲・文章生成システムで使われている代表的アルゴリズムとして、マルコフ連鎖があります。 アカデミックな研究やアプリケーションとしては常套手段なのですが、Web上には音楽での 利用例・実装例があまりないようです。 そこで、マルコフ連鎖…

Python + LibROSAでクロマ特徴(クロマグラム)を使って和音推定:(1) テンプレートマッチング

音楽の三大要素、メロディ・ハーモニー・リズムの内、ハーモニーの根幹を担っているのが和音です。 おそらく、楽器を演奏したり、曲の耳コピをしたことがある人は、一度は計算機で和音(進行)を自動で分析できたらいいな、と思ったことがあるはずです。 一…

逆関数法で一様分布・指数分布と算出(Python実装)

ゲームやCGの実装をしていると,「いい感じに偏った乱数が欲しい」と思うことが多々あります*1。 よく知られている方法として、rand関数などで算出した一様乱数を元に逆関数法で乱数を作ることができます。 ただ、数式の意味が分かりにくいところもあります。…

LibROSA:Pythonで手軽に始める音楽データ分析

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

MS処理のためのMid/Side変換の実装解説(Pythonスクリプト付き)

MS処理(Mid/Side変換)とは? MS処理のイメージ 音響機器やマスタリングプラグインでMS処理という表記を見かけたことはありませんか? MS処理は、通常左右に分かれているステレオの信号を、 中央(ミッド)成分と非中央(サイド)成分に変換し、それぞれに…

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

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

matplotlib: 各ラベルごとに色分けされた散布図をプロット

プロット ラベリングされた2次元のデータを、各ラベルごとに色を分けてプロットします。 今回はCSV/TSVを想定したトイデータとして、各サンプルごとにラベル文字列が入ったデータを扱っています。numpy.uniqueを使うことで、ラベル文字列のリストを生成して…

Python+PyAudioで作るリアルタイム音高アナライザ

デモ・概要 前回のリアルタイムスペクトルアナライザ を応用して、リアルタイムで音高を表示するプログラムをPyAudioとmatplotlib を使って作ってみました。 www.wizard-notes.com デモ・概要 実装 main.py AudioInputStream: PC上の音の取得 SpectrumAnalyz…

Python + PyAudio で作る、リアルタイムスペクトルアナライザ(ループバック録音対応)

デモ+概要 Python のPyAudio と matplotlib を使って、PC上で流れている音をリアルタイムで表示・分析できるスペクトルアナライザを作りました。以下の実装では VB-Audio社の仮想ミキサ "Voice Meeter" 向けの設定となっていますが、PortAudio 対応かつルー…

matplotlibのウィンドウを透明化してプロット

やりたいこと matplotlib の背景を透明化してプロットしたいと思います。 savefig() による図の保存の場合は、こちらの例のように ax.patch.set_alpha(float) を使うことで実現できます。 以下の実装では、plt.show() でディスプレイ表示する場合の透明度設…

PyAudio でリアルタイム再生録音・音加工(モノラル録音⇒ステレオ再生)の実装テンプレート

概要 Python を使って音声や音楽をリアルタイム再生・録音するモジュールとしては、PyAudio が良く使われています。 今回は、PyAudio を使って、再生と録音を同時に行うような実装を紹介します。 この実装を使うことで、ディレイやリバーブ、声質変換といっ…

Perfume The Best "P Cubed" の全52曲をテンポ特徴でクラスタ分析

事始め Perfume のベストアルバム Perfume The Best “P Cubed” を購入しました。 これまで(~2018年)の楽曲の中から全50曲 + 新曲2曲が収録されています。 全52曲。なかなかのデータ数です。 そういえば、最近のPerfumeの楽曲ってFuture BassやDub系が増え…

matplotlibでタイムラインチャートをプロット

やりたいこと 時系列信号・データを扱っていると、その信号に対する各種イベント・ラベル(例:どんな音が鳴っているか)を時間とともに表示したいと思うことが多々あります。 そこで、Pythonの matplotlib で時間波形に対するイベント(ラベル)のタイムラ…

matplotlib: 棒グラフでハッチパターンを使う

やりたいこと 論文など、白黒印刷が想定される紙媒体や、色の見え方の個人差に考慮したメディアでの棒グラフの作り方として、ハッチパターンを使ったものがよく使われています。 今回は、matplotlib でハッチパターンの棒グラフを描画してみます。 解決方法 …

adjustText: matplotlib の散布図でラベルの重なりを自動調整

問題点 matplotlib の散布図などのプロットの際に、各点にラベルを付けてプロットしたい場合、下の図のようにラベルが重なってしまうため、ラベル付きプロットを諦めることが多々ありました。 図1: 散布図 (Before) 解決方法 ラベルの配置を制御する方法を探…

Python (LibROSA) で音高 ・クロマ特徴を算出する方法

はじめに 音楽の分析では、メロディー、ハーモニー、リズムの3つ要素から特徴を捉えるのが重要です。 特にハーモニーに関しては、音楽理論による体系化(例:コード、コード進行)が出来ています。そのため、 分析した結果の意味付けがしやすいので、計算機…

matplotlib: 棒グラフの色を階級ごとに度数に応じてグラデーション

やりたいこと シンプルで綺麗なグラフは、得なことが多いです。 見た人の思考や感性に訴えかけ、新たな発見や次のステップへの道筋を示してくれます。または、相手によってはグラフ自体に価値がある場面もあります。 しかし、そんなグラフを人手で作りこむの…

Mutagenチートシート: MP3, AAC (.m4a), FLACのタグ・メタデータ抽出

Mutagen チートシート オーディオデータのタグ・メタデータ抽出に便利なPythonモジュール Mutagen。 この記事では、よく使う3つのコーデックでのメタデータ抽出でよく使いそうな、 mutagen オブジェクトのキーおよびインスタンス変数をまとめました。 https…

Python: Mutagenで複数のAAC (.m4a) 音源からタグ・メタ情報を抽出

はじめに 音楽分析をやる際、大量の音源のメタデータの抽出・編集・読込/書込が必要となることが多々あります。手動で出来る簡易だと Mp3tag のようなソフトウェアを使うのが楽ですが、大量の音源のメタデータを処理しようとすると効率がよくありません。 …

Python: オブジェクトフィールドを辞書型に変換

やりたいこと class Data(): def __init__(self, a, b, c): self.a = a self.b = b self.c = c data = Data() Python上でデータをいじることになると、オブジェクトフィールド(クラス変数/インスタンス変数)から辞書型にパパっと変換したいと思うことが多…

matplotlib: xticks/yticksで設定した軸ラベルの重なりを整える

やりたいこと python のmatplotlib を用いて時系列データをプロットするとき、時系列のラベルが大量にあるせいで、 xticks, yticks で設定した軸ラベルが重なってしまうことがあります。plt.xticks の rotation オプションでラベルを回転させれば多少マシに…

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

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