Wizard Notes

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

Python

双2次フィルタのPythonライブラリ"PyQuadFilter"を作ってみました

K-weighting filter の実装の記事 を書いている時に、Python向けの双2次フィルタのライブラリがあったらいいなーと思ったので、年末年始の自由研究開発として作ってみました。 プロトタイプ版ですが、とりあえず公開します。 githubにあまり慣れていなかった…

numpy.errstateで対数をとった時のwarningを無視する

音信号処理のプログラムを書いていると、 import numpy as np y_array = np.log10(x_array) のように対数をとることがよくあります。 ここで、x_array には 0 が含まれていることが多々あり、その場合には RuntimeWarning: divide by zero encountered in lo…

pyloudnormで平均ラウドネス値 (LUFS) 算出/ラウドネス正規化

Pythonで平均ラウドネス値 (LUFS) を算出したりラウドネス正規化をすることができるモジュール pyloudnorm を試してみました。 https://github.com/csteinmetz1/pyloudnorm オフラインでの分析/加工を想定したような設計となっており、ラウドネスメータープ…

様々なサンプリング周波数に対応した K-weighting フィルタの設計

2021/1/3: alphaの算出方法がsin(w0)/Qとなっていたため、sin(w0)/(2Q)に修正 導入 ラウドネスメーターで使われるLKFSやLUFSの算出における信号処理の流れは、以下のブロック図のように、 K周波数重み付け(K-weighting) 各チャネルでエネルギーを計算し集…

Python PyFilterBankで環境音をオクターブバンド分析

はじめに 音信号の分析では、時間波形を直接分析するのではなく、様々な周波数分析手法を利用します。 比較的細かい周波数成分を見る方法としては、 STFT (短時間フーリエ変換) CQT (定Q変換) メルフィルタバンク がよく使われています。これらのライブラリ…

PyQtで作るdB単位の音量フェーダー

dB単位の音量フェーダー pic.twitter.com/mJK2E6RmnJ— Kurene (@_kurene) 2020年12月22日 PyQtで作るdB単位の音量フェーダーを作ってみました。 信号に乗算するゲイン係数は、音量フェーダーのdB値 x から、 として算出しています。 ソースコード GUI クリッ…

PyQt Qsound でオーディオファイルを再生/停止

PyQt 5 / PySide 2 には、オーディオファイルの再生/停止ができるモジュール QSound があります。 使い方は非常に簡単で、play(),stop()といった関数でオーディオの再生/停止を操作できます。 from PyQt5.QtMultimedia import QSound audiofilepath = ...…

メロディ分析/抽出のための、librosa.salience() によるSalience (顕著性) スペクトログラムの算出

はじめに Python の音楽信号分析モジュールである LibROSAには、楽曲の音高/メロディ/和音情報をより精度よく抽出するためのツールとして、Salience (顕著性)スペクトログラムを抽出する関数 librosa.salience が実装されています。 今回は、librosa.sal…

LibROSAにおける Salience (顕著性)スペクトログラムの算出方法の解説

はじめに この記事では、 以下の記事で紹介 LibROSAのSalience スペクトログラムの算出方法を解説します。 www.wizard-notes.com 実際の計算方法、プログラムはlibrosa.salience() をご参照ください。 Salience スペクトログラムとは Salience スペクトログ…

RxPY での並行処理(ThreadPoolScheduler,subscribe_on() と observe_on() の比較)

RxPY でのrx.scheduler.ThreadPoolSchedulerを使った並行処理の書き方です。 注意として、rx.scheduler.ThreadPoolSchedulerは from concurrent.futures import ThreadPoolExecutor を利用しています。 Pythonでは GIL (Global Interpreter Lock, GIL) によ…

RxPY 3 入門メモ(簡単なサンプルコード、用語、使用例)

Python 用の Reactive Extensions ライブラリである RxPY を勉強し始めました。 RxPY を使えば、非同期的に流れてくるデータのシーケンス/ストリームに対する処理を簡単に記述できます。 https://www.atmarkit.co.jp/fdotnet/introrx/introrx_01/introrx_01…

PyQt でアプリの背景色やテキスト文字の色などの属性を設定する方法

PyQtを使っていると、背景色やテキスト文字をサクッと設定したいことが多々あります。 各QWidgetオブジェクトごとに設定してもいいのですが、面倒なので、まとめて設定する方法を紹介します。 方法1:QPallete QPaletteクラスを使うことで、コンポーネントご…

removestar: Pythonでワイルドカードインポートを明示的インポートに自動で置換

pypi.org Pythonのワイルドカードインポートimport * は便利ですが、どの変数・関数を利用しているか分かりにくいです。 そんな場合、このremovestarを使うと、ワイルドカードインポートを明示的インポートに置き換えてくれます。 import文周りがスッキリす…

NumPyのビュー(view)がどのndarrayオブジェクトを参照しているか確認する方法

はじめに 少しハマってしまったところなのでメモ。 NumPyでは、あるndarrayオブジェクトを明示的に参照する手段としてviewがあります。 numpy.ndarray.view — NumPy v1.19 Manual 使用例: >>> x = np.arange(0,5) >>> x array([0, 1, 2, 3, 4]) >>> y = x.v…

Python:LibROSA のフェーズボコーダで時間伸縮・ピッチシフト librosa.phase_vocoder

まえがき 使い方 関数の仕様 サンプルコードとプロット librosa.phase_vocoderの中身について 重要な中間変数を抜粋 メイン処理 補足:フェーズボコーダを使ったピッチシフトの実現方法 librosa.phase_vocoderの音質について 参考文献 まえがき オーディオ編…

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

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

Pythonでのパスワード用ランダム文字列の作成メモ

Python インタプリタを起動してパスワード用のランダムな文字列をさくっと生成する方法を調べていたら、以下の記事を見つけました。 Pythonで複雑なパスワードを簡単に生成する | ガンマソフト株式会社 単純なやり方としては、random.choice()を使う方法があ…

LibROSA ver. 0.8.0 で基本周波数推定(YIN, pYIN)

Python の楽曲解析モジュール LibROSA が 2020年7月22日に ver. 0.8.0 に更新されていました。 Changelog — librosa 0.8.0 documentation インストール方法 python -m pip install librosa=0.8.0 気になる変更点として、基本周波数推定アルゴリズムとして有…

librosaにおける16-bitでのWAV書き出し

問題 最近のバージョンの librosa では、信号を保存する時、16-bit 整数(int)型のWAVファイルで書き出そうとすると、以下のようなエラーが出てしまい、ファイル出力できません。 >>> import numpy as np >>> import librosa >>> y = np.sin(2.0*np.pi*440*…

Pythonで作る音楽プレイヤー:PyQt5 で簡易GUI作成

Pythonで作る音楽プレイヤー:PyQt5 で簡易GUI作成 Pythonで作る、信号処理開発プラットフォーム用の音楽プレイヤー - Wizard Notes で作った音楽プレイヤーモジュールですが、CUIでは使いにくいので、PyQt5を使って簡単なGUIを作ってみました。 実装 クリッ…

Pythonで作る、信号処理開発プラットフォーム用の音楽プレイヤー

今更感がありますが、Pythonで自作のエフェクトをすぐ試せる環境があると開発が捗るので、音楽プレイヤーモジュールを実装 pic.twitter.com/4yEN2wQ07X— Kurene (@_kurene) August 10, 2020 リアルタイム音響信号処理プラグインの開発において、開発言語がC+…

チェビシェフ多項式のナイーブな実装

線スペクトル対 (LSP) を実装するにあたり、第1チェビシェフ多項式を利用するため実装してみました。 実装・検証したコードはPythonですが、VSTプラグイン化を見据えてC++を想定したナイーブ実装となっています。 概要 チェビシェフ多項式 - Wikipedia Cheb…

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

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

SciPyを使ったデジタルフィルタの周波数応答プロット

実装したIIR/FIRフィルタが正しく動作しているかどうか検証する必要があったため、 デジタルフィルタの周波数応答(周波数特性)をプロットするスクリプトを作りました。 基本的には scipy.signal.freqz() の example とほぼ同じで、 プロット部分を少し整理…

線形畳み込みのforループでのナイーブな実装 (Python)

VSTプラグインで線形畳み込みを実装する必要が出てきたので、 事前にPythonでC++ライクな実装を検証しました。 とりあえず、2つの入力信号の配列サイズ不明で、最適化していない実装です。 import numpy as np from numba import jit @jit def conv_linear(…

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

フォルマントの強調っぽい処理で"いい声"に加工する自作フィルタのプロトタイプ(前半:元の歌声、後半:フィルタリング後) 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) が最も単純な方法です。 しかし、 非圧縮であるため、ファイルサイズが大きくなりがち 単一の配列オブジェクトのみ保存 であるため、大量の配列を保存する場合や、配列サイズ…