Wizard Notes

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

Python

フォルマント強調フィルタの設計に関する備忘録

フォルマントの強調っぽい処理で"いい声"に加工する自作フィルタのプロトタイプ(前半:元の歌声、後半:フィルタリング後) pic.twitter.com/deOz1DJjIv— Kurene (@_kurene) 2020年7月7日 先日作ったフォルマント強調フィルタ、実は低ビットレート音声符号…

matplotlibを使ったインタラクティブなプロット(サンプルコード付き)

gui programming with matplotlib pic.twitter.com/kEI863X14U— Kurene (@_kurene) May 11, 2020 何番煎じか分かりませんが、matplotlibでインタラクティブなプロットをする機会があったので、 メモ代わりにサンプルコードを作ってみました。 Event handling…

PythonでTwitter Search APIを叩く - 特定期間の100件以上のツイートを検索

概要 Twitter search APIを叩いて、ある期間の2hDTMを検索できないか試してました pic.twitter.com/cs8XagzAJz— Kurene (@_kurene) 2020年4月29日 Twitter上のツイートやメディアを手元で一気に検索したいと思い、Twitter Search API を叩き、キーワードと期…

Pythonにおける辞書型の結合 dict(d1, **d2) の注意点

ある2つの辞書型のデータd1,d2を結合したいとき、Python3では以下のように書くことができます。 new_d = dict(d1, **d2)# (1) この記法は特定のキーを記述せずに結合できるので便利なのですが、十分に注意しないといけない処理仕様があります。 以下の例をご…

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

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

Python で iTunes Search API を叩いて iTunes Storeの音楽を検索する

はじめに iTunes の Search API を使うと、iTunes Storeで販売されているコンテンツを検索することができます。 iTunes Search API – Partner Resources 検索用のAPI自体は、デベロッパーとしての登録やAPIトークンが必要ないため、手軽に利用できます。 こ…

レーベンシュタイン距離で似た曲名・アーティスト名を検索(Python実装)

はじめに 表記に一部誤りを含む曲名・アーティスト名を入力として、正しい名前を出力 or マッチ度を計算する関数を作る必要があったため、調査・実装など検討してみました。 はじめに レーベンシュタイン距離 使ってみた 付録・実装 レーベンシュタイン距離 …

Python:Pathクラスのリストをファイル名でソート

ソートされていないpathlibモジュールのPathクラスのリストをソートしたかったので、作ってみました。 トイデータ生成 順番がバラバラなPathクラスのリストがある*1状況を想定します。 from pathlib import Path filelist = ["./dir/abb.ext", "./dir/aaa.ex…

matplotlibでcolormapを逆にする方法

matplotlibでは多数のカラーマップが用意されています。 Choosing Colormaps in Matplotlib — Matplotlib 3.1.0 documentation データに手を加えずカラーマップを逆にしてプロットするのは、<span style="color: #d32f2f">カラーマップを指定する引数 cmap に与えるカラーマップ名の後ろに</span>…

Pythonで邦楽アーティスト名一覧をスクレイピング

日本の音楽アーティスト名に関するを調査するために、Pythonを使ってアーティスト名一覧をWeb上からスクレイピングしました。 情報を抽出するWebサイト 実装 結果 まとめ 情報を抽出するWebサイト HTMLのパースしやすさを考え、今回はRockin'on.comの邦楽ア…

全オーディオファイルとオーディオファイルを含む全ディレクトリを取得

概要 タイトル通り、あるディレクトリ以下にある、全てのオーディオファイルと、オーディオファイルを含む全ディレクトリを取得するスクリプトになります。 深いディレクトリ構造でも、 オーディオファイルが含まれるディレクトリを列挙したり、全オーディオ…

librosa.core.magphaseで振幅スペクトルと位相スペクトルを複素信号から抽出

LibROSAの便利な関数として、librosa.core.magphaseがあります。 この関数を使うことで、短時間フーリエ変換librosa.stftや定Q変換librosa.cqtで出力される複素信号から、振幅スペクトルと位相スペクトルを抽出することができます。 それでは、librosa.core.…

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) テンプレートマッチング

音楽の三大要素、メロディ・ハーモニー・リズムの内、ハーモニーの根幹を担っているのが和音です。 そのため、計算機を使った楽曲分析でも和音分析は非常に重要な処理です。 ただ、楽譜データ*1は簡単ですが、オーディオファイルのような楽曲データからの和…

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

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

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

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で作るリアルタイム音高アナライザ

デモ・概要 https://github.com/Kurene/pyaudio_spectrum_analyzer/blob/master/libmir/rasp_audio_stream.py PyAudioとmatplotlib で、リアルタイムで音高を表示するプログラムを作ってみました。 このプログラムは、前回のリアルタイムスペクトルアナライ…

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

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

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

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