Wizard Notes

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

Programming

PyQtGraph:3Dプロット (GLSurfacePlotItem, GLMeshItem) の高さ(z軸)で色を変える方法

PyQtGraph の3Dサーフェス/メッシュプロットでは,高さに応じて色を変えることができます。 具体的には,GLSurfacePlotItem もしくは GLMeshItem のコンストラクタのキーワード引数 としてshader='heightColor'を指定します. n_x, n_y = 128, 128 xy_init …

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

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

Python:PyQtGraphで散布図グラフをリアルタイムプロット

matplotlibよりも滑らかなリアルタイムプロットができる PyQtGraph で散布図をリアルタイムプロットしてみました。 PyQtGraphで散布図リアルタイムプロット、1000点でも60fps程度で動いてくれたので良き pic.twitter.com/R6ntYYMIQF— Kurene (@_kurene) 2021…

PyQtGraph:プロットの基礎と、GraphicsWindowをGraphicsLayoutWidget に置き換える際の注意点

PyQtGraph の公式実装例*1やWeb上にあるソースコードを見ると、例えば PyQtGraph でのリアルタイムプロットのコードは以下のように実装されています。 # -*- coding: utf-8 -*- from pyqtgraph.Qt import QtGui, QtCore import numpy as np import pyqtgraph…

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

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

PyQtGraph:MKLライブラリに関するエラー対処(mkl_blas_dgem2vu.dll)

Pythonで本格的なリアルタイムプロット向けのライブラリである PyQtGraph 。 このPyQtGraph を導入・サンプル実行する際にエラーが発生したので、その内容と対処方法をメモしたいと思います。 環境 Win10 64-bit Python 3.6.5 conda 4.6.14 導入の流れとエラ…

matplotlib: 折れ線グラフのリアルタイムプロットでラベルやカラーなどの属性を変える(音声信号でのデモ付き)

前回の記事では、matplotlibでの折れ線グラフのプロット画像のラベルや属性を変更しました。 www.wizard-notes.com 今回は、折れ線グラフのリアルタイムプロットでラベルやカラーなどの属性を変えるコードを実装をしました。 import numpy as np import matp…

matplotlib: 折れ線グラフで複数の配列・ラベル・カラーなどの属性をまとめてセットする

折れ線グラフで複数の配列・ラベル・カラーなどの属性をまとめてセットする場合、単純な方法としては以下のように一つの信号 (y_arr) ずつplt.plot()するコードが考えられます。 length = 100 x = np.arange(0, length) y = np.array([ np.random.normal(0, …

matplotlibを使ってリアルタイムで折れ線グラフをプロット

音響信号ソフトウェアでは、録音している音信号の大きさやピッチ(基本周波数)といった情報をリアルタイムで表示したいことが多々あります。 ところで、Pythonではグラフを表示するようなGUIのライブラリの選択肢はあまり多くありません。 そこで、今回はグ…

Python: waveモジュールをハックしてfloat形式のwavファイルを読み込みnumpy配列に変換する

問題 解決方法 waveモジュールのWav_readクラスをハック 検証 問題 www.wizard-notes.com 上記の実装の拡張として、Python の waveモジュールを使って32-bit or 64-bit float形式のwavファイル読込を追加しようとして試してみたところ、以下のようなエラーが…

Python: waveモジュールを使ったWAVファイル読み込みとNumPy化 (8-bit, 16-bit, 24-bit, 32-bit int)

前置き Python wave モジュール 実装/テスト 最後に Float形式のWAVファイルについて 前置き 音楽プレイヤーのような音楽ソフトウェアの開発では、まずオーディオファイルから時間信号を読み込む処理が第一歩となります。 オーディオファイルは数多くの種類…

2021.4.11 制作音源分析ソフト"Sophiear"開発記録(wxPython, Numpy, PyInstaller)

今日の進捗:・複数コーデック対応・信号分析部(ラウドネスレベル算出以外)・wx.lib.plotで信号プロット・分析結果テーブル追加・ステータスバー追加あとトータル/短時間ラウドネスレベル (LUFS) の算出部を実装すれば最低限完成 pic.twitter.com/5PziG56…

Python: PyInstaller + Eel + Numpy でGUIアプリの実行ファイルを作成

はじめに 実装 Python HTML / Javascript PyInstaller による実行ファイル作成 ファイルサイズについて python -m eel --onefile --noconsole はじめに smoothiecharts.jsよき…なおpyinstallerは仮想環境切らないと実行ファイル化できなかった pic.twitter.c…

Windowsで特定の拡張子以外のファイルをまとめてコピー

様々な拡張子のファイルが格納されたフォルダをコピーするときに、動画や非圧縮楽曲ファイルのようなファイルサイズが大きいファイル以外をコピーしたい という場面はよくあります。 そこで、タイトル通り、特定の拡張子以外のファイルをまとめてコピーする…

Python: pypianorollを使ってMIDIデータをNumpy配列に変換し、マルチトラックをプロット

(トラック数,最短音符数,音高数) のnumpy配列になってしまえば煮るなり焼くなりこっちのもの pic.twitter.com/7WfjuAQujI— Kurene (@_kurene) 2021年3月28日 MIDI形式のデータは演奏の操作・記録方式として優れていますが、データ分析やプログラム上での編…

PyQt: シグナル/スロットを使ってスレッド中・終了時にウィジェットを描画

別スレッドで走っている計算処理の終了後、計算終了を通知するメッセージボックスを表示する 別スレッドでオーディオファイルを再生し、再生終了時にQWidgetを操作する というような、サブスレッド終了後にウィジェットを非同期的に操作する処理を書いてみま…

PyQt: 複数のQPushButtonに単一スロット(値の受け取り関数)を割り当てる

PyQt で複数のQPushButton Widget を使う場合、愚直に書くと以下のようになります。 class MainWindow(QWidget): def __init__(self, n_buttons): super().__init__() layout = QVBoxLayout() self.setLayout(layout) button = QPushButton(f"Button 0") but…

PyQt: setStyleでWidgetのデザインを変更する

PyQt ではapp.setStyle(style_str)によってWidgetのデザインを変更することができます。 デフォルトスタイルはstyle_str="Fusion"ですが、環境によって"Windows"や"QtCurve"などを使うことができます。 この記事では、Win10で利用可能なPyQtのスタイルを確認…

Python: matplotlibを使ったリアルタイムプロットのフレームレート(FPS) に関する調査

matplotlibを使って、どのくらいのフレームレートでリアルタイムプロットできそうか検証 pic.twitter.com/X2mjgYiaWy— Kurene (@_kurene) 2021年1月29日 Pythonで安定的にリアルタイムプロットを実現するライブラリとしては PyQtGraph がありますが、手軽にm…

Python:matplotlibで双2次フィルタの極・零点をプロット

自作の双2次フィルタ (Biquad Filter)のPythonライブラリ PyQuadFilter に極と零点をプロットする関数を実装しました。 exmamples/04_plot_pole_zero.pyがサンプルコードとなっています。 プロット例 オールパスフィルタの極/零点プロットです。 q = 1.5 fc…

Pythonとresample_polyでオーバーサンプリング

scipy.signal.resample_polyを使ってオーバーサンプリングを実装してみました。 resample_polyのデフォルトの設定では、パラメタβ=5.0のカイザー窓によるFIRローパスフィルタが使われています。 注意すべき箇所として、フィルタ長はresample_polyの引数では…

PythonのMDCT(修正離散コサイン変換)ライブラリ: mdct

MP3などで使われている周波数変換方法であるMDCT (Modified Discrete Cosine Transform)。 現状、Scipy等の準標準的なライブラリに関数はありませんが、以下のライブラリがありました。 GitHub - nils-werner/mdct: A fast MDCT implementation using SciPy …

双2次フィルタの自作Pythonライブラリ PyQuadFilter 更新 - フレームベース処理対応

双2次フィルタの自作Pythonライブラリである PyQuadFilterを更新しました。 PyAudioやPySoundDeviceと組み合わせることで、Pythonでも双2次フィルタを使った簡単なリアルタイム音響信号処理ができます。 GitHub - Kurene/pyquadfilter: Implementation of di…

Pythonの心理音響評価モジュール"MoSQITo"でオーディオデータからラウドネスを算出

前回の記事で紹介したPythonの心理音響評価モジュールMoSQIToでラウドネスを算出してみました。 基本的に以下のドキュメント・ソースコードを参考にしています。 MoSQITo/tuto3_Loudness-zwicker-time-varying.ipynb at master · Eomys/MoSQITo · GitHub ソ…

Pythonの心理音響評価モジュール/開発フレームワーク"MoSQITo"の紹介

https://github.com/Eomys/MoSQITo 心理音響学について調べていたら、興味深いPythonライブラリがあったので紹介します。 github.com 心理音響学に基づく音質評価ソフトウェアの多くは市販製品であり、オープンソースでさくっと使えるものはほとんどないのが…

pyloudnormで学ぶ平均ラウドネス値 (LKFS/LUFS) の算出・実装方法

※ISO 532 (Zwicker method) による推定ラウドネスおよびラウドネスレベルの算出は以下の記事をご覧ください。 www.wizard-notes.com 先日、下記の記事で統合ラウドネス値(Integrated loudness) LKFS/LUFS のPython実装 pyloudnorm をご紹介しました。 pylo…

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

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

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

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

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

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

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

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