Wizard Notes

音楽信号解析の技術録、音楽のレビューおよび分析、作曲活動に関する雑記です

Python

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

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

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

LibROSA とは? 出典:https://librosa.github.io/ 「自分の好きな音楽をPCで分析したり、音楽データで機械学習やディープラーニングをやってみたい。でも、音データの信号処理やデータの扱いに困っている」と、悩んでいるエンジニアの方は多いと思います。 …

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

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

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

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

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

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

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: 複数の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大要素から特徴を捉えるのが大事です。 ハーモニーに関しては、音楽理論による体系化(コード、コード進行など)が出来ていることもあり、計算機による分析も他の要素よりも普及しています。 一方…

Numpy: 1次元配列から、特定の値の範囲のみを抽出した1次元配列を作る

やりたいこと numpyの1次元配列 x の内、v_min 以上 v_max以下の要素だけを抽出した1次元配列 y と、対応するインデックスの1次元配列 indices を得たいとします。 >>> x array([0.20204346, 0.71742434, 0.05195665, 0.50794105, 0.08809835, 0.80818671, 0…

Pythonで楽曲のリズム・テンポ分析: Novelty Function

はじめに この記事では、Onset 検出や局所/大域のテンポ分析などリズム分析においてよく使われる、Novelty Function についてPythonのコードとともに紹介します。実装と理解の助けになれば幸いです。 はじめに Novelty Curve/Function (Onset_envelope) 実…

librosa.core.load() のバックエンドが audioread から PySoundFile に代わった件

PySoundFile vs audioread ? LibROSAを最新版 (0.7.1) に更新したら、LibROSAの音楽信号の読込を担う load()のバックエンドが、audioreadからPySoundFileに代わったとのこと。 ただし、LibROSA 0.7.1では、PySoundFileがインストールされていない場合は代わ…

Jupyter notebooksで音楽信号処理の基礎を学べるフレームワーク:FMP Notebooks

AudioLabs @ FAU の、音楽信号処理の権威、Meinard Müller 先生が、ご自身の著書 "Fundamentals of Music Processing (FMP)."に沿った教材として、Jupyter notebooks で音楽信号処理の基礎を学べるフレームワーク:FMP Notebooks を公開しています。 音楽信…

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

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

Python: LibROSAによるBPM自動算出の詳細 

はじめに この記事では、Pythonの音楽分析モジュールである LibROSAで 実装されているBPM算出手法について、コードをベースに 解説をします。 BPM自動算出の概要・設計方針については、以下の記事をご参考ください。 www.wizard-notes.com はじめに LibROSA…

Python で楽曲のBPMを自動算出する方法

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

Flask:オーディオファイルをjQuery.ajaxでアップロードしながら、クライアント側でローカルのファイルを再生

スクリーンショット 背景 実装戦略・参考ページ サーバへの複数オーディオファイルのアップロード(ドラッグアンドドロップ) サーバ側でのファイルアップロード処理・ファイル保存 クライアント側で、ローカルにあるオーディオファイルを再生 実装 ディレク…

Flask:Webアプリでサーバ上のオーディオファイルを再生・ダウンロード(Blueprint版、デモ付き)

概要 ディレクトリ構成 ソースコード views.py ポイント1:index.htmlの配置とディレクトリ構成 ポイント2:サーバから送るファイルの配置 run.py(一部掲載) index.html デモ 概要 前回ご紹介した、ブラウザ上でサーバ上の音源を再生するFlask実装を、Bl…

Flask:Webアプリでサーバ上のオーディオファイルを再生・ダウンロード

概要 ブラウザ上でサーバ上の音源を再生するWebアプリを、Flaskで実現するための実装例です。 ディレクトリ構成 flask_play_audio/ ├ music/ │ └ audio.mp3 ├ templates/ │ └ index.html └ app.py ソースコード app.py # -*- coding: utf-8 -*- from flask i…