Wizard Notes

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

Python

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) が最も単純な方法です。 しかし、 非圧縮であるため、ファイルサイズが大きくなりがち 単一の配列オブジェクトのみ保存 であるため、大量の配列を保存する場合や、配列サイズ…

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.…

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

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

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

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

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

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

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

PyQt5の練習がてら、ピアノ鍵盤(もどき)を作ってみました。 タプル型の引数keysetで鍵盤の数を変えられます。 ハマったところ: 参考にしたドキュメント:https://doc.qt.io/qt-5/ 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…