chevron_left

メインカテゴリーを選択しなおす

cancel
Wizard Notes https://www.wizard-notes.com/

音専門のエンジニアが書く、音響音楽解析の技術録、音楽のレビューおよび分析、作曲活動に関する雑記です。

Kurene
フォロー
住所
未設定
出身
未設定
ブログ村参加

2014/02/23

1件〜100件

  • Python:PyQtでQMainWindowに非依存な複数のQWidgetを同時に表示する

    www.wizard-notes.com 上記の例の派生版です。 やりたいこととしては、 複数ある QWidget (個々のGUI)を表示 ここのQWidget はQMainWindowと結合していない QMainWindowは与えられた複数の QWidget を表示する となります。 なお、下記の例ではQMainWindow自体はGUIとしての役割を持たないため表示させない、という場合を想定しています。 sub_windowにリストの要素として与えるオブジェクトはQWidgetを継承していれば何でもよいため、個々に作ったQWidgetを一気に複数表示できます。 具体的には、異なる種類のグラフ…

  • BelkinのMagSafe対応 2-in-1 ワイヤレス充電器のレビュー(Ankerの2-in-1製品との比較付き)

    iPhone13 pro max を導入した後にワイヤレス充電器を導入してみたいと思い始め、洗練されたデザインの充電スタンドを探していました。 そして先日のPrime Dayで第1候補だったBelkinのBOOST↑CHARGE PRO MagSafe 2-in-1 が8991円だったのでついに導入することができました。 ケーブルの抜き差しの手間がなくなり、また、充電中の操作も楽なので非常に快適です。 似た大きさの2-in-1ワイヤレス充電器の購入候補製品として、Anker社の3つの製品がありました。 以下は比較表になります。 Belkin Anker Anker Anker BOOST↑CH…

  • pyrirtool: Pythonで手軽にインパルス応答を測定・録音できるツール

    音響分野において指数チャープ信号などを使ったインパルス応答の測定は非常に重要ですが、測定条件に対して柔軟に対応できる測定用ソフトウェアを自前で用意するのは結構手間です。 そこで、Pythonで手軽に利用できるインパルス応答測定ツール pyrirtool を紹介します。 pyrirtoolは再生・録音処理にsounddeviceを利用しているため,最新のバージョンのPythonでも動作します. 利用方法 準備 コード修正 利用方法 初期設定 入出力デバイスの確認 測定の実行 測定結果の例 利用方法 準備 github.com こちらの pyrirtoolのファイル一式をダウンロードしてきます。 …

  • フィードバックキャンセラによるハウリング除去のPython実装・評価

    カラオケや補聴器のような音響システムでは、スピーカから出力した音が再びマイクへの入力としてフィードバックされることによる発振ハウリングが問題となります. このハウリングを信号処理(適応フィルタ)によって除去する方法として、フィードバックキャンセラ(ハウリングキャンセラ)が知られています。 例えば、以下の書籍ではフィードバックキャンセラのC言語実装が掲載されています。 上記の書籍を参考に原理を整理しフィードバックキャンセラをPythonで実装してみましたので紹介します。 問題設定 数理モデル・変数 最適化 Python 実装 評価 まとめ 参考文献 問題設定 フィードバックキャンセラの系は以下の…

  • Python:Pyroomacousticsを使ってインパルス応答を作成

    Pyroomacoustics はPython向けの音響アレイ信号処理のラピッドプロトタイピングプラットフォームです。 github.com Pyroomacoustics の便利な機能の一つとして、僅かな行数のスクリプトで多面体の部屋の室内インパルス応答を生成することができます。 インパルス応答の生成スクリプト import numpy as np import soundfile as sf import matplotlib.pyplot as plt import pyroomacoustics as pra # パラメタ fs = 44100 # サンプリング周波数 absorpti…

  • OpenAir:様々な空間で収録されたインパルス応答 (IR) の無料データセット

    https://www.openair.hosted.york.ac.uk/ 動画やゲーム,AR/MRコンテンツで利用する音源にリアルな残響音を付加する手法として、コンボリューション(畳み込み)リバーブがあります。 これは、インパルス応答と呼ばれる実測で収録した残響音データを使って、実際に存在する空間の反響・残響を生み出すことができます。 コンボリューション リバーブ | Unreal Engine ドキュメント コンボリューションリバーブ自体の実装は非常に簡単です。 しかし、個人で高品質なインパルス応答を収録するのは技術や機材的に難しいです。 そこで、様々な空間のインパルス応答のライブラリを…

  • オーディオテクニカの耳掛けイヤホン ATH-EM9R のノイズ(ビビり音)を修理する

    ATH-EM9Rで音楽を聞いていると、両耳とも少しノイズ(ビビり音)があるように聴こえたので、分解して修理してみました。 結論としては、イヤーパッドの劣化が原因でした。 構造的に、ATH-EM9Rだけでなく ATH-EW9, ATH-EM9D, ATH-EM7, ATH-EM700 などでも同じ事象が起こる可能性があると考えられます。 以前に分解/修理したATH-EW9やATH-EM7と違い、ATH-EM9R/Dは耳側からネジ止めされています。 www.wizard-notes.com www.wizard-notes.com 今回はイヤーパッドも交換するため、遠慮なく古いイヤーパッドが剥がし…

  • Python:Spleeter にNumpy配列を与え、ボーカル・ベース・調波楽器を抽出してクロマベクトルを算出する

    https://github.com/deezer/spleeter より 前回の記事では、Python向け楽器分離ライブラリ Spleeter の使い方を紹介しました。 具体的には、2-mixの楽曲ファイルを、ボーカルやベース、ドラムといったオーディオファイルに分離する方法を紹介しました。 Pythonでボーカル・ドラム・ベース・伴奏を抽出できる楽器分離ライブラリ Spleeter の使い方・デモ - Wizard Notes 今回は、和音・リズムの分析のような音楽信号分析処理での利用を想定したサンプルコードを紹介します。 1. Numpy配列の信号をSpleeterで処理 2. 分離信号を…

  • Pythonでボーカル・ドラム・ベース・伴奏を抽出できる楽器分離ライブラリ Spleeter の使い方・デモ

    https://github.com/deezer/spleeter より 楽曲のメロディ・和音・リズムといった音楽的分析を行うには、個々の構成楽器ごとの分析が重要です。 楽譜・MIDIファイルは情報が各トラックごとに分かれているため メロディ・和音・リズムといった音楽的要素・文脈の分析に取り組みやすいです。 一方で、楽曲ファイル(音響信号)を入力とする音楽分析では全てのトラックがミックスされているという点が音楽的分析の障壁となります。 ミックスダウンされたファイルから複数の楽器のメロディ・和音・リズム分析処理は実装が難しく、また、計算コストや精度、汎用性が十分でないことが長年の課題でした。 …

  • 楽曲構造をタグ付けする自作WebアプリSongTagの機能追加・修正1

    楽曲構成タグ付けWebアプリ - SongTag SongTagを開く 以前、楽曲構造の分析を行う支援ツールとして楽曲構成タグ付けWebアプリを実装しました。 www.wizard-notes.com www.wizard-notes.com さっそくアプリを使って自身で楽曲構造タグ付けの作業をするうちに、分析の効率化のために機能を追加したくなりました。 3か所ほど機能を追加・修正したので、追加・修正内容を紹介します。 修正点 jsonフォーマットの変更 json アップロード 楽曲構成の候補の追加 まとめ 修正点 jsonフォーマットの変更 以前は楽曲構成情報オブジェクトの配列データとしてい…

  • LibROSAの音響特徴量を使って楽曲のサビを自動で検出する (librosa.feature.rms, librosa.feature.spectral_centroid)

    ポピュラー音楽では、楽曲の聞かせどころであるサビは楽曲の最も盛り上がる部分であり、その楽曲の印象に深くかかわります。 サビ検出には様々な手法がありますが、今回は実装が簡単な手法として音響特徴量を使ったサビ検出手法を実装・検証してみました。 サビ検出アルゴリズムの方針・実装 検証準備 動作検証結果 まとめ サビ検出アルゴリズムの方針・実装 邦楽におけるサビは、楽曲で最も盛り上がる区間です。 また、1番、2番というように曲の中で何度も繰り返されます。 従って、以下のような仮説を立てることができます。 曲の冒頭や最後に存在する可能性が高い 音の短時間エネルギーが最も高い値となる 音色が煌びやかになる…

  • LibROSA付属の音声・オーディオデータ一覧と使い方 (librosa.ex, librosa.example) [v0.9.1]

    https://librosa.org/doc/latest/recordings.html より Pythonの音楽分析用モジュール LibROSA には、いくつかのサンプルデータが付属しています。 そのため、オーディオデータを自分で用意しなくても音楽データ分析をすぐに試すことができます。 そこで、この記事ではLibROSA付属の音声・オーディオデータ一覧と使い方を説明します。 利用方法・データ一覧 付属オーディオデータについて 音声 "libri1", "libri2", "libri3" 音楽 "brahms" - Brahms - Hungarian Dance #5 ”nutcrac…

  • scipy.signal.oaconvolve:FIRフィルタの畳み込み演算を効率的に行うオーバーラップ加算法の使い方と計算速度について

    はじめに 音信号処理では音を加工する1つの方法としてFIRフィルタがよく使われます。 具体的な計算としては、元の信号とFIRフィルタ信号の畳み込み演算を行います。 この畳み込み演算を時間領域で素直に行うと、元の信号長×FIRフィルタ長の計算が必要です。 従って、例えばコンボリューションリバーブのようなFIRフィルタ長が比較的大きい場合では、計算量が多くなってしまう問題があります。 そこで、この畳み込みを効率的に行う方法としてオーバーラップ加算法(オーバーラップアド、重畳加算法)が知られています。 この手法は SciPyで scipy.signal.oaconvolve として実装されているため…

  • wavesurfer.js:簡単に音声ファイルの再生と波形描画が実装できるJavaScriptライブラリ

    https://wavesurfer-js.org より ユーザが音楽を再生する Web アプリでは、音の出力するだけでなく、 波形描画などで音を可視化したり、操作が分かりやすいGUIを設計する必要があります。 原理的には、Web Audio API において音波形の信号値が格納されている Audio Buffer を利用して、canvas やWebGLなどで波形を描画するという手順になります。 しかし、各ライブラリを理解する必要がある上に、実装するコードが多くなります。 今回は音再生と波形描画、波形上での操作を手軽に実現できる非常に便利なライブラリ wavesurfer.js の使い方・実装…

  • 素早く手軽に楽曲構造をタグ付けするWebアプリの試作

    以下のような楽曲構造の分析を行うには、Aメロ、Bメロ、サビといった区間の情報が重要になってきます。 www.wizard-notes.com 特に複数楽曲を分析するには、特定のフォーマットに従う区間情報データを書く楽曲について用意する必要があるため、曲数が多いほど用意が大変です。 そこで、手軽に楽曲構成をタグ付けし保存するWebアプリの試作してみました。 アプリのページ 現状の機能 動作デモ 追加したい機能 アプリのページ Songtag 現状の機能 開始/終了時刻とセクション名を投稿・編集・削除・可視化 Web上でローカルのオーディオファイルを再生 タグデータのダウンロード(csv, jso…

  • JavaScript:React+wavesurfer.jsでローカルの音声ファイルの再生・波形表示

    JavaScriptで音声を再生・波形表示するのに便利なライブラリとして wavesurfer.js があります。 wavesurfer-js.org 今回はこのwavesurfer.jsを使って、ローカルの音声ファイルを再生・表示するWebアプリを作ります。 JavasScript Chrome向け デモ 参考 Web サイト JavasScript wavesurfer.js はオーディオファイルを読み込むたびに波形を描画します。 ここは参考にしたWebサイトより、以下のように実装になっています。 波形等の再描画は wavesurfer.js 側の実装であるため、React側では再描画しな…

  • JavaScript:React+Audioオブジェクトで音声ファイルをアップロード&再生

    Webアプリで音声の再生を実現する方法としては、 HTMLの<audio> 要素の利用 JSのWebAudioAPIでAudioBufferを読み込み がよく知られています。 遅延が許されない効果音や、信号処理をして再生するような用途ではAudioBufferを読み込みますが、Javascriptでの実装が少しだけ多くなります。 一方、用途によっては<audio> 要素のインターフェースであるHTMLAudioElement オブジェクト (Audio オブジェクト) を操作する方が簡単書くことができます。 そこで、この記事では ReactとAudio オブジェクトを使ってローカルの音声ファイ…

  • Notepad++でHTML/XMLを自動フォーマット/インデントする方法

    HTML/XMLファイルの編集においてインデントはコードの保守管理を考えると非常に重要です。 Webサイトが大規模化した時や改修が必要になってHTML/XMLを見返した時に、インデントが綺麗にそろっていると構成を把握しやすいです。 また、ケアレスミスを減らすことにもつながります。複数人でコードをいじっている際はなおさらです。 ただ、HTMLタグや要素を継ぎ足したり部分的に切り貼りしていくうちに、だんたんとインデントに気を使っていちいち整えるのは面倒になってきます。 そんな面倒から解放されるために、自動フォーマットが実装されているエディタがあります。 自動フォーマットを使えば、一瞬でインデントが…

  • 歌声/楽曲分析・音源分離に使えるデータセット MUSDB18

    https://sigsep.github.io/datasets/musdb.html#musdb18-compressed-stems より 以前の記事では、様々な音楽ジャンルのステムデータ付き楽曲データセット DSD100 を紹介しました。 www.wizard-notes.com DSD100 は全100曲とそれなりの楽曲数がありますが、大規模データ分析や深層学習のような処理ではなるべく多くの楽曲データが必要となります。 本記事では、この DSD100 を1つのソースとして利用した、よりデータ数の多い楽曲データセット MUSDB18 を紹介します。 MUSDB18 の概要 ダウンロード…

  • 歌声/楽曲分析・音源分離に使えるデータセット DSD100 について

    https://sigsep.github.io/datasets/dsd100.html より 楽曲分析や音源分離のアルゴリズムを開発・動作検証する際には、何らかの楽曲データセットが必要になります。 市販の楽曲データを利用する手もありますが、2Mix・マスタリングされた音源だけでは動作検証や改良が難しいことが多々あります。 従って、各パートだけの音源:ステムデータ(パラデータ)が含まれているデータセットがあると効率的に開発・動作検証ができます。 今回は、音源分離分野でよく利用される公開データセット DSD100 を紹介します。 DSD100 概要 権利関係について 試聴Webページ ダウンロ…

  • Ado のアルバム収録曲の BPM 一覧(狂言)

    Adoの楽曲のBPMを算出しました。 BPMはWaveTone を使って手動+自動解析しています。 小数点以下がある場合は小数第一位を四捨五入して整数にしています。 各アルバム楽曲のBPM 狂言 (2022年) Track Title Length BPM 1 レディメイド 4:03 195 2 踊 3:30 128 3 ドメスティックでバイオレンス 2:38 116 4 FREEDOM 3:06 178 5 花火 3:32 100 6 会いたくて 4:55 80 7 ラッキー・ブルート 3:30 99 8 ギラギラ 4:36 96 9 阿修羅ちゃん 3:15 156 10 心という名の不可解…

  • Python (Anaconda) の再インストール後に起動しないエラーへの対処(環境変数の設定)

    エラー内容 解決策 エラー内容 環境:Win10 Visual Studio でインストールしたPython (Anaconda) をアンインストールし、Python.orgのインストーラを使ってPythonを再導入した際に発生したエラーです。 なお、Python.orgのインストーラだけでなくMiniconda でも同じエラーが発生しました。 具体的には、コマンドプロンプト / Anaconda Prompt でpythonのスクリプトやインタプリタを実行しようとしても実行できませんでした。 その際には下記のメッセージが表示されました。 Python path configuration: …

  • Python:PyQtで複数の画面/ウィンドウ (Widget) を表示する

    元ネタ: www.pythonguis.com PyQtを使って実用的なアプリを作ろうとすると、描画や設定などの画面を個別に表示するために複数ウィンドウを実装したいことがあります。 まず、素直に以下のようなコードを実装・実行してみます。 import sys from PyQt5.QtWidgets import ( QApplication, QMainWindow, QWidget, QPushButton, QLabel, QVBoxLayout, ) class AnotherWindow(QWidget): def __init__(self): super().__init__()…

  • 耳かけイヤホン ATH-EM7 の修理・改造

    はじめに 前の記事では、中古で入手したオーディオテクニカの耳掛けイヤホンの ATH-EM7 を分解してみました。 www.wizard-notes.com イヤホンの状態をみたところ、 イヤパッドの交換が必要である 背面に吸音材がない(ATH-EW9は有り) 耳かけ部のラバーサポートが劣化している U字ケーブルが使われている、ケーブルが劣化している の4点が修理・改造すべき箇所であることが分かりました。 そこで今回は 1, 2, 3 の修理・改造にトライしてみました。 なお、4 に対して修理しなかった理由については後述します。 www.wizard-notes.com はじめに 修理・改造内容…

  • iPhone 13 Pro Max のおすすめアクセサリー:手帳型ケース・クリアケース・スタンド(MOFT Snap-On)

    はじめに 2015年から iPhone 6s Plus を6年ほど使っていましたが、スペック的な面で度々ストレスを感じていたので、2021年9月に iPhone 13 Pro Max を購入しました。 iPhone 6s Plus と比べると若干大きく、また、重さも192 g ⇒ 238 gとなっているため最初は使い勝手に戸惑いましたが、アクセサリーを上手く選ぶことでいい感じに運用できています。 iPhone関連のアクセサリーは山ほど種類あり選定に悩みましたが、最終的に良さげなものを選定できました。 もしかしたらアクセサリー選びの参考となるかもしれないので、私が購入した iPhone 13 P…

  • 秋月電子のNJM4580DD使用ヘッドホンアンプキットの組み立て

    アナログ回路・電子工作の勉強と、オペアンプによる音質の違いを検証するため、 秋月電子のNJM4580DD使用ヘッドホンアンプキットを組み立ててみました。 akizukidenshi.com 2回路入りのオペアンプ、NJM4580DDを使ったヘッドホンアンプキットです、45mm×45mmサイズの基板に収めました。相互接続性を考慮し入出力および電源のGNDが共通になっております。オペアンプの入門用、学習用に最適です。 お値段は 1個 ¥540(税込)。 キットとして含まれているパーツは以下になります。 少なくとも電源・電池やステレオミニプラグのオス-オスのケーブルなどは購入しておくほうが良いと思い…

  • オーディオテクニカの耳掛けイヤホン ATH-EM7 を試聴・分解する

    オーディオテクニカの耳掛けイヤホン ATH-EM7を中古で入手しました。 kakaku.com ハウジングは鍛造アルミ合金ハウジング搭載*1であり、高級感があるカッコいいデザインとなっています。 少し試聴した後、改造を検討するために分解してみました。 基本的な設計はATH-EW9に似ています。 www.wizard-notes.com ただし、EM7ではU字ケーブルが採用されており、L ch 側はR chに信号を送るケーブルが出ています。 そのため、L ch側のケーブルを出すための開口穴は R chより広くなっています。 以下は、イヤーハンガーとハウジングの写真です。 ハウジングは思ったよりも…

  • マイコドリの不思議な音

    日本音響学会誌に「鳥類の非発声音コミュニケーションの機能と進化 ―求愛信号の多様性からの考察―」という解説論文が掲載されていました。 相馬 雅代 鳥類の非発声音コミュニケーションの機能と進化 鳥の音と言えば鳴き声が真っ先に思い浮かびますが、この論文では鳥たちが自身の体を使って音を出す”非発声音”について紹介しています。 冒頭でキツツキのドラミング音が挙げられており、確かにキツツキはそうだなと思いつつも「他にそんな鳥いるの?」と興味が湧いてきて読み進めました。 そこで紹介されていたのがマイコドリ。 キガタヒメマイコドリ、スズムシみたいな発音機構で音を鳴らすって書いてあって気になって調べたらなにこ…

  • 余ったU型ケーブルをMMCXケーブルに改造(イヤホン・ヘッドホンリケーブル)

    www.wizard-notes.com 先日ATH-EW9のMMCXリケーブル をしたことで、元々ATH-EW9についていたU型ケーブルを持て余していました。 品質的にも良いケーブルであり、また絡まりにくいU型ケーブルなので再利用したいと思い、MMCXケーブルに改造することを思いついたので早速やってみました。 MMCXオス端子は以下の製品を購入しました。 もっと安い製品もありましたが、コネクタカバーがついていないのでこちらにしました。 MG-M MMCX コネクタ リケーブル バランス ハンダ式 自作用 金メッキ A オス ブラック 2個セット JEITA基準に則り、Lチャネルを青色、Rチャ…

  • 耳掛けイヤホン ATH-EW9 をワイヤレスイヤホンに改造する (MMCX,無線化,Bluetoothヘッドセット,リケーブル)

    諸注意 はじめに 改造のメリット 利用した工具・パーツ 手順 1. ハウジングを外す 2. MMCXメス端子を出す穴を作る 3. MMCXメス端子のハンダ付け・マウント 4. ハウジングを取り付ける まとめ 参考Webサイト 諸注意 本記事で紹介する内容は著者個人の改造事例であり、改造を推奨するものではありません。万が一、本記事を参考にしたことに起因する直接的又は間接的な損害に関して一切の責任を負いかねますのであらかじめご了承ください. はじめに オーディオテクニカの耳掛けイヤホン ATH-EW9 は、今*1でもまだ新規購入可能な数少ない耳掛け型イヤホンの一つです。 北海道産アサダ桜のムク削り…

  • 高次のバターワースフィルタ(ハイパス)の不安定性について scipy.signal.butterworth

    マルチバンド処理用のフィルタバンク実装でバターワースフィルタによるハイパスフィルタを使おうとすると,7次くらいから周波数応答が不安定になりました. ハイパスフィルタ 周波数応答をプロット してみると,scipy.signal.butterworthのハイパスフィルタは7次くらいから低域の位相が不安定になっています. おそらくフィルタ係数の量子化誤差などが関係していると考えられます。 カットオフ周波数を低くしても,それでも9次くらいから位相が歪んでいます. ローパスフィルタ 一方、ローパスフィルタのほうが比較的高次でも振幅・位相に歪みは目視では確認できません. 補完フィルタ(7次,8バンド) 高…

  • Python:変数がNumPy配列かどうか判別する方法

    Pythonで数値計算や信号処理をしていると,NumPy配列かどうか判別したいことがあります. import numpy as np np_array = np.array([0, 1, 2]) type(np_array) #=> <class 'numpy.ndarray'> type(python_list) #=> <class 'list'> 以上の例から NumPy配列とPythonのリストオブジェクトは異なるため,if type(np_array) is listでは判別できません. NumPy配列の判別の方法としては、例えば以下の3つの方法が使えます. type(np_arra…

  • Python:マルチバンド処理用フィルタバンクのクラス設計・実装・動作検証

    以前の記事では,木構造のような信号処理フローのマルチバンド処理を紹介しました. この記事では、実装・利用しやすさに着目して信号処理フローを再設計・実装します。 設計 以前の記事では木構造の処理フローでしたが,今回は低域のカットオフ周波数から徐々に算出するような構造とします。 オールパスフィルタの伝達関数をまとめると以下のようになり,各帯域の信号はそれぞれの最後のオールパスフィルタで位相が同期されることで、回路全体が元信号の振幅成分を変化させないオールパスフィルタ回路となります。 なお、各オールパスフィルタのフィルタ係数はこちらの記事にあるようにローパス・ハイパスフィルタのフィルタ係数から簡単に…

  • オーディオクロスオーバー向け補完フィルタ(バターワース)でのオールパスフィルタのフィルタ係数算出と検証

    以前の記事で,低域・高域を別々に処理するようなマルチバンド処理(オーディオクロスオーバー)の実装方法を紹介しました. www.wizard-notes.com www.wizard-notes.com 上記の記事では,補完フィルタのローパス・ハイパスフィルタの並列接続したことで生成できるオールパスフィルタの伝達関数の振幅特性がフラットになることを確認しました。 実用では,フィルタリングの際にこのオールパスフィルタのフィルタ係数を求める必要があります. 2つのIIRフィルタの伝達関数の積を取るのは手間ですが,補完フィルタの場合は多少計算が楽になることが検証できたため,メモとして残します バターワ…

  • 複数の2帯域分割(補完)フィルタを使ったマルチバンド処理のPython実装(3バンド以上)

    以前の記事では,低域・高域を別々に処理するようなマルチバンド処理(オーディオクロスオーバー)を実現するフィルタバンクの例として、2バンドの場合の実装方法を紹介しました. www.wizard-notes.com ただ,より実用的なプラグイン/ソフトウェアを作ることを考えると,3バンド以上に分割できることが望ましいです. しかし,3バンド以上のフィルタバンクは2バンドの構成方法のみで作ろうとすると非常に計算効率・使い勝手が悪いです. そこで,二分木構造の回路によるマルチバンドフィルタバンクの設計方法を紹介します. 元論文:Complementary N-Band IIR Filterbank B…

  • Python:FIR/IIRフィルタの直列/並列接続の周波数応答(伝達関数)プロット (scipy.signal.freqz)

    複雑な信号処理プラグインを開発する場合、複数のFIR/IIRフィルタを組み合わせることがよくあります。 そこで,FIR/IIRフィルタの直列/並列接続時の周波数応答をプロットするサンプルコードを作成しました。 回路全体の伝達関数を確認するだけでなく、フィルタ単体や部分的な回路の伝達関数も確認できるように、複数の伝達関数を入力として与えられるように設計しました。 また、カットオフ周波数を周波数応答とともに確認できるように垂直線プロットしています。 なお、直列回路全体の伝達関数は各フィルタの伝達関数の積,並列回路全体の伝達関数は各フィルタの伝達関数の和として計算することができます。 import …

  • Pythonでゲーム音楽(チップチューン)の基本波形を生成(サイン波,矩形波,のこぎり波,三角波,白色雑音)

    シンセサイザ(オシレータ)の基本波形として一般的なサイン波,矩形波,のこぎり波,三角波,白色雑音は,ファミコンのBGMのようなゲーム音楽(チップチューン)の作成や音信号処理のテストでよく利用されます. サイン波は基本周波数(音高)をとすると, として簡単に書けますが,矩形波・ のこぎり波・三角波は若干面倒です. ただ,Pythonだと scipy.signal.sawtooth, scipy.signal.square を使えばサイン波と同様の形式でプログラミングできるので非常に楽です. この記事では,Pythonでnumpy や scipy を使って基本波形5種を生成する方法を紹介します. …

  • マルチバンド(オーディオクロスオーバー)処理を実現するフィルタ(Butterworth, Linkwitz-Riley)のPython実装(2バンド)

    低域・高域のような周波数帯域別に信号処理する場合、いい感じに帯域を分割するフィルタが必要になります。 ソフトウェア/プラグインの具体例としてはマルチバンドコンプレッサが挙げられます。 このような回路の特性としては、音質に影響を与えるような振幅/位相歪みが小さいと嬉しいです。 具体的には,低域/高域通過フィルタの並列接続(加算)した際の伝達関数が以下のような特性を持つように設計します。 振幅特性: 特定の帯域を強調しない(フラットな特性を持つ) 位相特性: 直線位相に近い、遅れが小さい この記事ではオーディオクロスオーバーを実現するフィルタ(回路)としてバターワースフィルタとリンクウィッツライリ…

  • Pythonでゼロ位相フィルタリング (scipy.filter.filtfilt)

    はじめに ゼロ位相フィルタリングの実装方法 scipy.signal.filtfiltを使ったゼロ位相フィルタ lfilter x 2 でのゼロ位相フィルタリング 参考Webサイト はじめに 双2次フィルタ (SOS) やバターワース/チェビシェフフィルタなどといったIIRフィルタは,FIRフィルタと比べると少ない計算量で急峻な周波数特性を実現できる便利なフィルタです。 しかし,基本的に位相特性は非線形であり直線位相ではありません。出力波形が大きく崩れてしまう問題があります。 そこで、位相の遅れが発生しないフィルタリング方法としてゼロ位相フィルタリングという手法があります。 この記事では、ゼロ…

  • Python:半音ごとに音高を抽出するIIRフィルタバンクの作成と使い方 (librosa.filters.semitone_filterbank)

    はじめに 音の高さの分析は,メロディや和音の推定に使われる重要な前処理です. 本ブログではこれまで,音の高さの分析手法として一般的である,定Q変換やフーリエ変換を使う手法を紹介してきました. www.wizard-notes.com これらの手法は周波数領域で信号を処理する手法ですが,時間領域で各音高を抽出する手法としてIIRフィルタによる半音フィルタバンク (semitone filterbank)があります. この手法は Pythonの音楽信号分析ライブラリ LibROSA に実装されているため,手軽に利用することができます. そこで本記事では,LibROSAのIIRフィルタによる半音フィ…

  • Python: 高品質フェーズボコーダ pyrubberband でタイムストレッチ・ピッチシフト

    オーディオ信号の再生速度・音高の変更はよく利用される処理です。 そのアルゴリズムはいくつかありますが、リアルタイム処理向けの手法としてはフェーズボコーダという手法があります。 Pythonでは、音楽信号分析ライブラリLibROSAにおいてフェーズボコーダが用意されていますが、ナイーブな実装のため音質があまりよくないという問題があります。 ところで、高品質な再生速度・音高の変更が可能なフェーズボコーダ(タイムストレッチ・ピッチシフト)のライブラリとしてRubberBandが知られています。 このライブラリ自体はC++用ですが、実はPythonラッパーpyrubberbandがあるためPython…

  • Python-sounddeviceで音声や歌声をリアルタイム収音・再生・録音

    Pythonで音声や歌声、楽器音などの収音・再生・録音を行うためのライブラリとしてはPyAudioが知られていますが、 低遅延であるASIO規格が利用できない Python 3.7 以上には非対応 というデメリットがあります*1。 Python 3.7 以上でASIO対応デバイスを利用可能なライブラリとしては、python-sounddeviceがあります。 しかも PyAudio よりも使いやすい設計となっています。 以下では、このpython-sounddeviceの使い方と、リアルタイム収音・再生・録音のサンプルコードを紹介したいと思います。 Python-sounddeviceの特徴 …

  • Chromeで Web Audio API の音が鳴らない現象への対処 (Warning: The AudioContext was not allowed to start)

    久しぶりに Web Audio API を使ったコードを書いていたら、音を読み込んで再生するだけの簡単なサンプルコードでも音が鳴らないという現象に遭遇しました。 class AudioPlayer { constructor() { this.isPlaying = false; } init = () => { window.AudioContext = window.AudioContext || window.webkitAudioContext; this.context = new AudioContext(); } setBuffer = async () => { const r…

  • React+Python Flask:数値入力フォームのデータをPOSTで送信するWebアプリ例

    Flask と React でWebアプリを設計する練習として、フォームからPOSTでデータを送信/受信する簡単なWebアプリを作成してみました。 フォルダ/ディレクトリ構成 実行方法(ローカル) 実行例 プログラム Python Flask (app.py) JavaScript (main.jsx) HTML (index.html) フォルダ/ディレクトリ構成 (アプリ用フォルダ) ├─ static │ └─ main.jsx ├─ templates │ └─ index.html └─ app.py 実行方法(ローカル) まず、アプリ用フォルダをカレントディレクトリとして、Pyth…

  • Python:数値で色をグラデーションさせて16進数カラーコードとして取得&HTML 表の自動生成 (matplotlib)

    1次元の数値→16進数カラーコード HTML 表の自動生成 まとめ 1次元の数値→16進数カラーコード データ分析をするアプリ/プログラムでは、数値に基づいて色をグラデーションさせたいということが多々あります。 例えばPythonでは、matplotlib を使ったプロットであれば Colormapを使えば、 入力: (1次元の数値, Colormap指定) 出力: RGBD の4次元タプル が簡単に取得できます。 さらに、matplotlib.colors.rgb2hex() を使えば、RGBD の4次元タプルから16進数カラーコードを取得することができます。 import numpy as…

  • 「米津玄師の似た曲データベース」作成のための類似曲検索システム設計

    www.wizard-notes.com 2021年7月に、開発中であるテンポ分析に基づく類似曲分析システムの設計・実装を一から見直し、米津玄師の似た曲データベースを作りました。 この類似曲分析システムの全体像と、各処理で使われている技術の紹介、そしてシステム設計・実装上のノウハウ・注意点を紹介します。 構成・処理フロー ① 分析する楽曲リスト作成+メタデータ抽出・タグ付け ② テンポ特徴量抽出 ③ 類似度の算出・可視化 ④ サブスクサービス での楽曲URL・情報取得 ⑤ 似た曲データベース作成 実装・ファイル管理の諸注意 文字コードはUTF-8推奨 CSV ではなくて TSVやJSONを使う…

  • テンポ分析に基づく米津玄師の似た曲データベース(diorama, YANKEE, Bremen, BOOTLEG, STRAY SHEEP)

    テンポ分析に基づく類似曲検索AIを使って、 米津玄師の似た曲データベースを作ってみました。 分析曲は、以下の5つのアルバムの収録曲全74曲としました。 diorama YANKEE Bremen BOOTLEG STRAY SHEEP 類似曲検索AI は、表中の「類似度」が 1.0 に近いほど基準曲に似ていると判断しています。 テンポ分析がベースなので、コード進行は基本的に考慮されていません。 リズムやノリ、グルーブ感が似ているかどうか、是非聞き比べてみてください。 類似曲検索AIはまだまだ開発途中ですが、技術の詳細が気になる方は以下の記事をご覧ください。 www.wizard-notes.c…

  • python の ローカルwebサーバ で React のサンプルコードを動かす

    最近新しい Web 音楽アプリを作ろうと考えています。 音楽関係の信号/情報処理はPythonを使いたいため、 サーバサイド: flask クライアントサイド: React という構成を検討しています。 React の勉強と理解のためにサンプルコードを走らせたり、実装した各コンポーネントのテストをローカルでする際に、なるべく自分が慣れているPython環境で動作させたいと思い、第一歩としてpython の ローカルwebサーバ でReactのサンプルコードを動かしてみました。 以下の記事を参考にしています。 正真正銘のReactだけの不純物なしでReact入門 Hello World – Re…

  • Python:あるディレクトリの複数の特定拡張子ファイルをまとめて削除

    Pythonでファイル処理をしていると、例えば、 「あるディレクトリ(フォルダ)の中にある、 ".png"と".wav"と".txt"という拡張子のファイルを全て削除したい」 というような状況がよくあります。 このような、あるディレクトリの複数の特定拡張子ファイルをまとめて削除するスクリプトを作成しました。 なるべく依存するライブラリを少なくしたかったため、globを利用しています。 import os import glob def remove_files(dirpath, exts): if type(exts) is not list: exts = [exts] for ext in…

  • Python:Spotify Web API であるアーティストの全てのアルバムの全楽曲情報を取得する

    市販楽曲の情報を入手する手軽な手段として、Spotify Web APIがあります。 以前の記事では、キーワードを入力して楽曲を検索していました。 www.wizard-notes.com しかし、この方法だとあるアーティストの名前をキーワードとして与えても、そのアーティストの楽曲の情報を全ての取得することはできないようです。 また、他のアーティストの楽曲やカバー曲も引っかかってしまうため、検索効率がよくないです。 そこで、Spotify Web API の search() 以外のAPIを使って、あるアーティストの全てのアルバムの全楽曲情報を確実に取得する方法を探してみました。 方針 以下の…

  • Python用 Spotify Web API "spotipy" の楽曲・アーティストを検索(インストール方法,サンプルコード,API仕様)

    楽曲の検索やメタ情報に関する Web API を提供しているサブスクリプション型音楽サービスはいくつかあります。 中でも Spotify Web API は様々な機能が提供されています。手軽に使えますし楽曲数も多いため、オススメの API です。 github.com 今回は、Spotify Web API の導入方法と、それを使って楽曲やアーティストを検索する方法を紹介します。 参考ページ Python用ライブラリの導入方法 Web API 利用のためのアクセストークン発行 Spotify Web API 使い方 (検索) サンプルコード search()の使い方 返り値の形式 (type=…

  • Python:audioread で mp3, aac, m4a 形式のオーディオファイルをNumPy配列として読み込む

    以下の記事にありますように、Python ではオーディオファイルの読み込むライブラリが複数あります。 しかし,.mp3, .aac, .m4a といった圧縮コーデックを読み込むものは多くありません。 www.wizard-notes.com 今回紹介する audioread では ffmpeg のようなバックエンドを呼び出すことで.mp3, .aac, .m4a といった圧縮コーデックもPython上で読み込むことができます*1。 合わせて、.mp3, .aac, .m4a などのオーディオファイルをNumPy配列として読み込むサンプルコードもご紹介します pypi.org audioread…

  • LibROSA:音楽のBPM・テンポ分析に便利なテンポグラムを数行で実装

    音楽の分析方法としてBPM・テンポの分析は非常に重要です。 BPM・テンポの分析を行うことで、楽曲の雰囲気、ノリ、音楽ジャンルといった全体的な特徴を捉えることができます。 BPM・テンポの分析方法としては、テンポグラムという便利な手法があります。 テンポグラムの実装は結構難しいですが、Pythonであれば音楽分析ライブラリ LibROSA を使うことで数行で算出することができます。 そこで、この記事では LibROSAを使ったテンポグラムの算出方法を紹介します。 LibROSAでのテンポグラム算出方法 LibROSA テンポグラム サンプルコード プロット例 Lemon (BPM=87) パプ…

  • Python:様々な拡張子&複数の楽曲ファイルを読み込んでNumPy配列として格納(wav, flac, mp3, aac, m4a, alac, etc.)

    表題のとおり,様々な拡張子に対応し,複数の楽曲ファイルを一括でNumpy配列に変換する関数です。 大量の音楽ファイルを分析する場合にオススメです。 ファイルの読み込みは librosa.load() を使っています。 librosa.load()は引数にサンプリング周波数を与えることで,楽曲ファイルのサンプリング周波数と引数にサンプリング周波数が異なる場合,resampy でリサンプリングしてくれます。 ただし、リサンプリングは割と処理時間がかかるので注意が必要です*1。 librosa.load()が扱いにくい場合は、PySoundFileを直接使うのがよいと思います。 # -*- codi…

  • 定Q変換のPython 実装:バッチ処理向けの実装方法の紹介と計算速度の比較

    前回の記事では,音楽信号の音高分析に便利な定Q変換 (CQT)のアルゴリズムや実装方法による計算速度の比較を行いました。 www.wizard-notes.com 結果として,再帰的ダウンサンプリング法による定Q変換がリアルタイム処理で実用的な計算速度であることが分かりました。 しかし、アルゴリズムは同じでもバッチ処理向けの実装である librosa.cqt が圧倒的に速い結果になりました。 そこで、今までリアルタイム処理用に実装してきた再帰的ダウンサンプリング法による定Q変換で、バッチ処理用の実装をすることで、LibROSA の定Q変換くらいの計算速度となるのか試してみました。 実装方法 リ…

  • 米津玄師のアルバム収録曲の BPM 一覧(diorama, YANKEE, Bremen, BOOTLEG, STRAY SHEEP)

    米津玄師のアルバム収録曲のテンポ分析に興味があったので、まずは楽曲を聞いてBPMを算出してみました。 BPMはWaveTone を使って手動+自動解析しています。 小数点以下がある場合は小数第一位を四捨五入して整数にしています。 各アルバム楽曲のBPM diorama YANKEE Bremen BOOTLEG STRAY SHEEP ヒストグラムなど 所感 各アルバム楽曲のBPM diorama Year Album Track Title Length BPM 2012 diorama 1 街 340 165 2012 diorama 2 ゴーゴー幽霊船 230 180 2012 dior…

  • 定Q変換のPython 実装のアルゴリズム/実装方法による計算速度の比較

    音楽信号の音高分析に便利な定Q変換 (CQT)。 これまでにいくつか計算アルゴリズムや実装方法の種類を紹介してきました。 おそらく再帰的ダウンサンプリング法が速いと思っていたのですが、条件によっては疎行列計算と変わらないことがあったりと、実環境での処理速度の違いが気になっていました。 そこで、3つのリアルタイム向け定Q変換の Python 実装と、オフライン向けであるLibROSA の定Q変換とSTFTの処理速度を比較してみました 比較環境 比較する手法と条件 比較1: 基本設定 比較2: 1オクターブあたりの周波数ビン数を増やす 比較3: 低周波数を分析しない場合 まとめ 関連ページ 比較環…

  • 再帰的ダウンサンプリング法による定Q変換 (CQT) のPython 実装とアルゴリズム解説

    定Q変換 (CQT)は歌声・音楽の音高/メロディ/和音を分析するのに便利な周波数分析方法です。 例えば,CQTスペクトログラムを算出すれば各音高(ドレミファ…)がどのくらいの強さで鳴っているかを時系列で観察することができます。 以下の記事では、定Q変換のリアルタイム向け実装としてパーセバル定理と疎行列計算を使った定Q変換の仕組みと実装方法を紹介しました。 www.wizard-notes.com www.wizard-notes.com しかし、この方法は疎行列計算ライブラリが使えないような環境では非常に低速になってしまいます。 そこで、以下の論文で紹介されている、疎行列計算を利用しなくても高…

  • Python LibROSA で音楽・歌声をタイムストレッチ(時間伸縮) librosa.effects.time_stretch()

    YouTubeやニコニコ動画のような動画サービスで0.5倍・2倍速再生が使えるのが一般的になっています。 また、サンプリングされた波形素材の時間伸縮がDAWの基本機能として搭載されていて、曲のタイミングやテンポに上手く合わせて波形素材をいい感じの長さで鳴らすことができます。 さらに、ピッチシフト(カラオケの転調)はタイムストレッチ+リサンプリングで実現できます。 www.wizard-notes.com このように、音楽や歌声のタイムストレッチ(時間伸縮)は実用的で非常に重要です。 タイムストレッチをゼロからプログラミングするのはなかなか大変ですが、 Pythonの音楽分析モジュール LibR…

  • LibROSA:音高分析のための定Q変換(CQT)と、逆定Q変換の性能評価

    はじめに 音信号を分析する時間周波数分析手法としてはSTFT(短時間フーリエ変換)が良く使われますが,特に音楽を対象にして音高、コード、メロディなどを分析する場合は定Q変換(CQT)という手法が便利です。 www.wizard-notes.com www.wizard-notes.com 定Q変換を自分で実装するのは結構大変ですが,Pythonでは音楽信号分析モジュール LibROSA を使うことで、さくっと定Q変換を試すことができます。 はじめに LibROSAでの定Q変換 逆定Q変換 LibROSAでの定Q変換 librosa.cqt を呼び出すことで、数行で定Q変換を実装できます。 im…

  • 定Q変換のリアルタイム向けPython実装の解説(音高・コード・メロディの分析向け)

    www.youtube.com 定Q変換は音楽信号の音高・コード・メロディ分析に相性の良い周波数分析手法です. この記事では,前回の定Q変換 (CQT: Constant-Q Transform) の 解説 の内容をPythonで実装する方法を解説します. Pythonの実装ですが,C++やJavascriptなど,様々な言語での実装の参考になるように解説したいと思います. なお、定Q変換の仕組みやパラメタについては以下の記事を参照してください。 www.wizard-notes.com ソースコードはGithubにおきました。 github.com 定Q変換の実装解説 要件定義とサブルーチン…

  • 定Q変換 (CQT: Constant-Q Transform) の 解説(音高・コード・メロディの分析向け)

    はじめに 音信号の時間周波数分析にはFFT (高速フーリエ変換) /STFT(短時間フーリエ変換)がよく使われます. しかし,FFTの性質上,音高に関わる分析をしようとすると実装や分析精度の向上に手間がかかります。 そこで,この記事では音楽信号の分析によく利用される定Q変換 (CQT: Constant-Q Transform) と呼ばれる時間周波数分析の手法の仕組みを紹介します. なお、本記事をベースにしたPython実装の解説がありますので、もしよろしければご覧ください。 www.wizard-notes.com はじめに FFT / STFTでの音高分析の問題 定Q変換のアイディア 定Q…

  • Python:信号長に近い2の累乗(2**n)のFFTフレームサイズを求める

    FFTを使う時,なるべく高速に計算するためにフレームサイズを2の累乗に設定するのが一般的ですが、入力する信号の長さが2の累乗でない時があります。 そういう時は,フレームサイズが2の累乗になるように、ゼロパディング or カットします。 その際には、信号長 N に近い2の累乗のフレームサイズを求める必要があります。 Pythonでの手っ取り早い方法としては、bin()で2進数化し、その文字列の長さを利用して信号長に近い2の累乗の指数部を求めることができます。 ・ゼロパディングの例 >>> N = 1000 >>> x = np.random.random(N) >>> bin(N) '0b111…

  • チェンバロ(ハープシコード)音源 Italian Harpsichord Bundle (REALSAMPLES) のインストール・導入方法

    AudioPlugin Deals Audio Plugin DealsでREALSAMPLES社の3種類のチェンバロ(ハープシコード)音源 Italian Harpsichord Bundle がセールで$39.95でした. 値段も魅力的ですが,何よりデモ音源が好みのチェンバロの音色だったので購入しました. せっかくなので、導入方法をメモとして残したいと思います. 注意:この音源を利用するには,Kontakt™/HAlion™/EXS24™ の有料版が必要です."light"/free版はサポートしていないことが明記されています. requirements - realsamples Sof…

  • 音声・オーディオ版MNIST "FSDD (Free Spoken Digit Dataset)" の紹介と,メルスペクトログラム算出

    7万枚の手書き数字の画像+ラベルのデータセットである MNIST は,今では機械学習・深層学習のHello Worldとして非常に多くの人に利用されていて有名です. MNISTの1つのデータは 白黒画像・28x28ピクセル,全体でも7万件なので大規模データですがデータセットのデータサイズは小さいので使いやすいです.また,内容も手書き数字10種類の画像というシンプルである程度パターンが抽出できそうなデータであるため,データ分析や機械学習の練習によく利用されているのだと思います. そんな MNIST の音・オーディオ版のようなデータセットがないか調べたところ,このFSDD を見つけたので紹介します…

  • 球面 (Spherical) K-means のクラスタリングのデモと実装例(Python,PyQtGraph)

    データをクラスタリングするアルゴリズムの代表的な手法の一つとして,K-means (k平均法)が知られています. シンプルな動作原理でクラスタリングできるので取っつきやすく,また,新たな仮定や制約を追加することで様々な派生アルゴリズムが提案されてきました. 今回は,「原点からの方向(角度)でクラスタリングする」という制約でクラスタリングする Spherical K-means を紹介します. K-meansの実装 使うデータ クラスタリングするデータ:x.shape==(サンプル数, 特徴量次元数) ↑の各サンプルがどのクラスタに属すか:labels.shape==(サンプル数, ラベル数) …

  • Pythonで12音平均律の各音高をカラフルにライブプロット

    PyQtGraphの複数の線グラフプロットを利用して,12音平均律で音高ごとに色を変えてライブプロットしたら綺麗&役立つかなと思い作ってみました. もう少しブラッシュアップしようと思ったのですが,後述の理由でお蔵入りになったので,供養としてソースコードと実装方法を公開します. デモ動画・ソースコード 実装の流れ PyQtGraphにおける複数のカーブプロット 12音平均律のエネルギー抽出 お蔵入り理由 デモ動画・ソースコード github.com https://github.com/Kurene/pyqtgraph-app/blob/main/pqg_pitchlines.py 実装の流れ …

  • 日本学生支援機構 貸与型奨学金の繰上返還による機関保証料の返金額について

    私は大学・大学院時代に,日本学生支援機構の​貸与型奨学金(第1種 x 2と第2種)を機関保証で利用していました. 返済金額がそれなりに大きいので,少しでも返済負担を減らすべく,社会人になってから第1種と第2種をそれぞれ繰上返還することで,機関保証料の一部が返金となりました. ちょうど今日,昔の家計簿や通帳を見直していたら,過去2回分の奨学金の繰上返還で戻ってきた機関保証料の返金額を確認できました. 貸与金額や機関保証料の金額などの条件によって変わると思いますが,機関保証を利用&繰上返還を検討している人の参考になる情報だと思うので,参考金額として公開したいと思います. 第2種(大学4年間) 貸与…

  • Python:PyQtGraphでメルスペクトログラムをリアルタイム描画

    音楽再生ソフトやプラグインでよく見かける,スペクトログラムのリアルタイムプロット. どの周波数帯域で音が鳴っているのかをリアルタイムで可視化できるので非常に便利です. Pythonでスペクトログラムのリアルタイムプロットをやろうとすると,やはりリアルタイム性が問題になってきます. Pythonの代表的なグラフプロットライブラリである matplotlibですが,表示するデータの大きさにもよりますが,仕様上,FPSだと10Hz(1秒に10回)程度の描画が限界です. なので,リアルタイム描画にmatplotlibを使うと,どうしてもカクついた描画になってしまいます. www.wizard-note…

  • PyQtGraph エラー対処(ImportError: cannot import name 'sip', Exception: pyqtgraph requires Qt version >= 5.12)

    PyQtGraph example Python をver. 3.8にアップデートして PyQtGraphをインストール後,PyQtGraphを使ったスクリプトを実行した際に以下の2つのエラーが発生しました. ImportError: cannot import name 'sip' from 'PyQt5' Exception: pyqtgraph requires Qt version >= 5.12 (your version is 5.9.7) この2つのエラー対処後,PyQtGraphを使ったスクリプトが正常起動したので,その方法をメモとして残します. バージョン情報 Python=…

  • Windows+Python 3.7, 3.8, 3.9, 3.10 でのPyAudioのインストール方法・エラー対処

    PyAudio Pythonのバージョンを3.5からアップデートしたところ,PyAudioのインストールで引っかかったのでメモ. 調べてみると,PyPIのPyAudio wheel は Python 2.7, 3.4, 3.5, 3.6 以外には非対応となっています. pip will fetch and install PyAudio wheels (prepackaged binaries). Currently, there are wheels compatible with the official distributions of Python 2.7, 3.4, 3.5, and…

  • Python:音の広がりや位相を見るフェーズスコープをPyQtGraphとPyAudioで実装

    Pythonにおけるリアルタイム音楽信号処理アプリのデモ/教材として,音の広がりや位相を見るフェーズスコープをPyQtGraphとPyAudioで実装してみました. 起動すると,PC上で音楽を再生しながらフェーズスコープを描画することができます. 全ソースコードは以下にあります. github.com 少し複雑なソースコードなので,この記事ではソースコード理解の助けとなる実装方法の要点とノウハウを書きたいと思います. 実装方法の要点・ノウハウ Pythonにおけるリアルタイム音楽再生・分析方法 ループバック機能を利用した,PC上の音のリアルタイム取得 データのプロット方法 フェーズスコープの計…

  • matplotlib の散布図の色・アルファ値(透明度)を滑らかにグラデーションさせる(cmap利用)

    データの分析や可視化で散布図を使う時には,プロットしたデータの座標や,そのデータが示すラベルや値に応じて色を変えることが多々あります. matplotlibでRGBA値を変える方法は、以下のようになっています。 # 全て同じ色・透明度を設定する場合 plt.scatter(x, y, c="red", alpha=0.3) # 各要素の色・透明度を個別に設定する場合 c = [(0,0,0,1), (0.5,0.5,0.3,0.5)] # RGBA値のタプルを格納した配列 plt.scatter(x, y, c=c) ここで,各要素の色・透明度を個別に設定する場合,色・アルファ値(透明度)をデ…

  • ステレオ楽曲の位相差を確認できるフェーズメーターの作り方(極座標ベース)

    前回の記事では,ステレオのL, R チャネルの信号を,リサージュ図形の として与えることで音の広がりを可視化しました. www.wizard-notes.com この記事では,直交座標 を極座標(絶対値と偏角) 表記にしたバージョンを紹介します. 参考: Goniometer Algorithm - DSP and Plug-in Development Forum - KVR Audio ただの座標変換であるため,最終的なプロットは直交座標系のものと変わりません。 しかし,絶対値と偏角は振幅の大きさと位相差に対応しているため,振幅の大きさと位相差に応じて色を変える等の高度な描画がやりやすくな…

  • 音の広がりや位相差を可視化するリサージュメーター(ゴニオメーター)のPython実装

    DTMなどで音の広がり感を可視化するには,リサージュ図形に基づく方法があります. リサージュ リサジュー:Lissajousとは | 偏ったDTM用語辞典 - DTM / MIDI 用語の意味・解説 | g200kg Music & Software 2つの信号を元に作られるリサージュ図形を利用し,2次元平面上にプロットした点群の形状を見ることで音の広がり感を確認することができます. 例えば,iZotopeの無料プラグインである Ozone Imager V2 でも "Lissajous" をクリックすると確認できます. Ozone Imager V2 なお,この方法により音の広がりを確認する…

  • Python:SymPyでTeX記法の数式を画像(PNG)として保存する

    Pythonを使って TeX の数式を画像として保存する方法がないか調べたところ、SymPy という Welcome to SymPy’s documentation! — SymPy 1.0.1.dev documentation SymPyは数式による処理を行うライブラリであり,独自の記法もありますが TeX 記法を扱うこともできます。 インストール方法 Anaconda などのディストリビューションでPythonをインストールした場合は、インストール済みとなっていると思います。 もしインストールされていない場合は、以下のようにpipを使って導入してください。 pip install sy…

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

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

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

    PyQtGraphで美しいリアルタイムプロットができることを最近知ったので、実装例として2次元波動方程式の数値シミュレーション(有限差分法)をリアルタイム実行・プロットしてみました。 実装のための数式導出と、PyQtGraphを使ったソースコードを合わせて紹介します。 2次元波動方程式の有限差分法の更新式導出 以下の2次元波動方程式の初期値・境界​値問題の解を有限差分法によって近似的に解くことを考えます。 この を 平面上の格子点での値として求めていきます。ただし、 平面のそれぞれの方向の格子間隔(微小​変化)を )とします. 右辺,左辺の項をそれぞれテイラー展開し2階中心差分を導出します。詳…

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

    matplotlibよりも滑らかなリアルタイムプロットができる PyQtGraph で散布図をリアルタイムプロットしてみました。 PyQtGraphで散布図リアルタイムプロット、1000点でも60fps程度で動いてくれたので良き pic.twitter.com/R6ntYYMIQF— Kurene (@_kurene) 2021年6月10日 1000点でアルファ値(透明度)を設定していますが、約60fpsでリアルタイムプロットできていることを確認しました。 こちらの散布図の実装方法とソースコードを紹介したいと思います。 PyQtGraphにおける散布図リアルタイムプロットの流れ 散布図の属性 …

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

    PyQtGraph の公式実装例*1やWeb上にあるソースコードを見ると、例えば PyQtGraph でのリアルタイムプロットのコードは以下のように実装されています。 # -*- coding: utf-8 -*- from pyqtgraph.Qt import QtGui, QtCore import numpy as np import pyqtgraph as pg app = QtGui.QApplication([])# PyQtのアプリ生成 win = pg.GraphicsWindow() # GraphicsWindow() オブジェクト生成 win.resize(500, …

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

    PyQtGraph の導入理由 matplotlib ではダメなのか? PyQtGraph のメリット・デメリット PyQtGraph の導入方法 PyQtGraphのエラー対処 リアルタイムプロット/アニメーションの実装例 1次元プロット(折れ線グラフ) 複数の折れ線・カーブプロット 2D散布図プロット(2D点群) 2Dイメージプロット(スペクトログラム) 3D サーフェスプロット(波のシミュレーション) 公式サンプルコード・描画デモ まとめ 参考文献 PyQtGraph の導入理由 matplotlib ではダメなのか? Pythonにおけるグラフプロットライブラリとしては matplot…

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

    Pythonで本格的なリアルタイムプロット向けのライブラリである PyQtGraph 。 このPyQtGraph を導入・サンプル実行する際にエラーが発生したので、その内容と対処方法をメモしたいと思います。 環境 Win10 64-bit Python 3.6.5 conda 4.6.14 導入の流れとエラー発生 PyQtGraph の Webページに従い、 pip install pyqtgraph として PyQtGraph を導入しました。この時点で特にエラーはありませんでした。 次に、サンプルコードを実行するため、Pythonインタプリタを起動し、 import pyqtgraph.e…

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

    前回の記事では、matplotlibでの折れ線グラフのプロット画像のラベルや属性を変更しました。 www.wizard-notes.com 今回は、折れ線グラフのリアルタイムプロットでラベルやカラーなどの属性を変えるコードを実装をしました。 import numpy as np import matplotlib.pyplot as plt length = 100 x = np.arange(0, length) y = np.array([ np.random.normal(0, 5.0, length), np.random.normal(0, 1.0, length), np.rand…

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

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

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

    音響信号ソフトウェアでは、録音している音信号の大きさやピッチ(基本周波数)といった情報をリアルタイムで表示したいことが多々あります。 ところで、Pythonではグラフを表示するようなGUIのライブラリの選択肢はあまり多くありません。 そこで、今回はグラフライブラリとして最もメジャーであるmatplotlibを使ってリアルタイムで折れ線グラフをプロットしてみました、 matplotlib でリアルタイムプロットのポイント 方針としては、 信号データが更新されるたびに、グラフ全体を新たに描画しなおす 信号データが更新されるたびに、プロットするデータのみ入れ替える という2つがあります。 今回は、よ…

  • Silent night (きよしこの夜)アレンジで学ぶジャズギターのコード/コードソロ無料教材の紹介

    ジャズギターの教材を探していたら、非常に取っつきやすく、効率的にジャズギターのコード/コードソロを学べる無料教材があったので紹介します。 Silent Night Chord Melody - JamieHolroydGuitar.com - Jamie Holroyd Guitar Silent Night Chord Melody - JamieHolroydGuitar.com - Jamie Holroyd Guitar この教材(タブ譜)では、ジャズ系のギターで使われているコードを使い、コード・ソロ(コードメロディ)としてSilent night (きよしこの夜)のメロディを演奏しま…

  • Python: A特性や他の特性を使った周波数重み付けの実装 (聴感補正,騒音測定)

    ある音に対して、人間が感じるうるささと音圧レベルの大きさは必ずしも一致していません。 以下の等ラウドネス曲線のように、音圧レベルと周波数によって人間の聴覚の感度は異なっています。 https://ja.wikipedia.org/wiki/音の大きさ そのため、音信号の分析、特に騒音の分析では、A特性、B特性、C特性といった周波数重み付けがよく利用されます。 すなわち、人間の聴覚の感度に合うように、対象となる音信号の音圧レベルを補正して分析を行います。 Wikipedia の A-weighting の記事では、以下の4つの特性とその算出方法が記載されています。 A特性: 等ラウドネス曲線*1…

  • Acousticsamples 4-in-1 Guitar Bundle のインストール方法メモ

    まえがき 0. iLokアカウント作成 1. AcousticSamples のアカウント作成 2. オーソライズ 2A 方法1 2A 方法2 3 iLokライセンスマネージャーでのアクティベート 4. 音源ファイルのダウンロード 4A. 方法1 4A. 方法2 まえがき 2021年4月現在、2020年のBlack Fridayに引き続き、AudioPluginDealsでAcousticsamples 4-in-1 Guitar Bundle が83% Offセール中です。 $576 ⇒ $99.99 83% off AcousticSamples 4-in-1 Guitar Bundle!…

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

    問題 解決方法 waveモジュールのWav_readクラスをハック 検証 問題 www.wizard-notes.com 上記の実装の拡張として、Python の waveモジュールを使って32-bit or 64-bit float形式のwavファイル読込を追加しようとして試してみたところ、以下のようなエラーがでました。 >wave.Error: unknown format: 3 てっきりwaveモジュールはfloat形式にも対応しているかと思いきや、そうではないようです。 CPythonのWaveモジュールのソースコードを確認してみました。 github.com 87行目には、 WAVE…

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

    前置き Python wave モジュール 実装/テスト 最後に 前置き 音楽プレイヤーのような音楽ソフトウェアの開発では、まずオーディオファイルから時間信号を読み込む処理が第一歩となります。 オーディオファイルは数多くの種類のフォーマットがあり、音楽ソフトウェアにおけるユーザの利便性を考えると、なるべく多くのフォーマットに対応することが望ましいです。しかしながら、それら全てのフォーマットのデコード処理をプログラミングするのは困難です。そのため、なるべく誰かが開発した外部ライブラリを利用することになります。 Python においては、例えば ``Pysoundfile```モジュールなどを使う…

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

    今日の進捗:・複数コーデック対応・信号分析部(ラウドネスレベル算出以外)・wx.lib.plotで信号プロット・分析結果テーブル追加・ステータスバー追加あとトータル/短時間ラウドネスレベル (LUFS) の算出部を実装すれば最低限完成 pic.twitter.com/5PziG56BZg— Kurene (@_kurene) 2021年4月11日 今日の進捗、・ドラッグアンドドロップで複数ファイルを読込・読み込んだ各楽曲ファイルごとに信号をmatplitplotでプロットができるGUIのモックアップの開発(信号はダミー) pic.twitter.com/hvcEGEVaaJ— Kurene (…

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

    はじめに 実装 Python HTML / Javascript PyInstaller による実行ファイル作成 ファイルサイズについて python -m eel --onefile --noconsole はじめに smoothiecharts.jsよき…なおpyinstallerは仮想環境切らないと実行ファイル化できなかった pic.twitter.com/mvSDNkNzDQ— Kurene (@_kurene) 2021年4月8日 ライセンスとGUIの拡張性の観点から,EelでGUIアプリを開発することにしたので,以下の記事を参考に取り組んでみました。 タイトル通り、PyInstal…

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

    様々な拡張子のファイルが格納されたフォルダをコピーするときに、動画や非圧縮楽曲ファイルのようなファイルサイズが大きいファイル以外をコピーしたい という場面はよくあります。 そこで、タイトル通り、特定の拡張子以外のファイルをまとめてコピーする方法を調べたところ、Windowsの場合は コマンドプロンプトで"Robocopy"というコマンドを使えば実現できることが分かりました。 docs.microsoft.com 例えば、楽曲がたくさん格納されているフォルダ ./Sourceがある時,.wav, .flac以外をコピーしたい場合は、以下のようなコマンドとなります。 (コピー先のフォルダ名・パスは…

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

    (トラック数,最短音符数,音高数) のnumpy配列になってしまえば煮るなり焼くなりこっちのもの🤩 pic.twitter.com/7WfjuAQujI— Kurene (@_kurene) 2021年3月28日 MIDI形式のデータは演奏の操作・記録方式として優れていますが、データ分析やプログラム上での編集は割と面倒です。 音響信号のようにN次元配列にデータを格納できれば非常に楽なのですが、MIDIの仕様を理解して、ノートの発音タイミングを時間解像度で補正したりしつつ集計するのはなかなか大変です。 今回ご紹介する Pypianoroll は、MIDIのようなマルチトラックピアノロールデータを…

  • クロマベクトルから音程に基づく特徴量:調性中心を算出(和音分析,拍検出)

    Detecting harmonic change in musical audio https://t.co/wwxJf1s5oq2006年の論文だけど不勉強なもので最近ようやく知りました…。クロマベクトルのピッチクラス12音の各強度を音程調和知覚に基づく2次元空間×3に飛ばして、それぞれの空間でのcentroidを特徴量にする pic.twitter.com/KWbsmuLQGI— Kurene (@_kurene) 2021年3月5日 音楽信号分析に使える良さげ特徴量を探していたところ、LibROSAにも実装されている tonal centroid features (調性中心特徴) と…

  • PyQt: QScrollAreaを使ってスクロールバーを追加する

    PyQt でスクロールバーを追加する方法としては、QScrollAreaがあります。 QScrollAreaの利用シーンとしては、以下の2パターンに分けることができます。 QWidget/QMainWindow 上の特定の領域でスクロールしたい QWidgetを継承・カスタマイズしたオブジェクト自体にスクロールを追加したい 特に 1 のパターンでは、以下の参考ページの方法が参考になります。 dungeonneko.hatenablog.com ここで、widgetとlayoutの包含関係において、 QScrollArea > QWidget > (任意のlaytout) > (任意のQWidg…

  • アンティークな雰囲気のお洒落&多機能な電源タップ Fargo TAPKING DARKWOOD

    mng...?電源タップとしては高価だけど、しっかり木の質感してるし、機能はめちゃ充実 pic.twitter.com/FNvRE15t5Q— Kurene (@_kurene) 2021年2月16日 Fargo エレガントなデザイン、魅惑的な木目調ダークウッド 電源タップ 回転 延長コード ケーブル 国内サポート対応 1年保証付 3.4A USB 急速充電 AC6個口 1.8m アンティーク風の家具が多い為、なるべく木の質感に近いような電源タップを探していた時に、見つけて一目惚れした電源タップです。 6口で値段は約4,000円と電源タップとしては高めですが、デザイン/機能ともに優れています。…

  • Python: PyTagLibで音楽ファイル (wav, flac, mp3, m4a, aac) のタグ情報抽出

    Pythonで音楽ファイルのタグ情報を抽出するライブラリの一つとして、mutagenがあります。 www.wizard-notes.com www.wizard-notes.com mutagenは個々の拡張ファイルに特化したタグ抽出が可能ですが、様々な拡張子をまとめて扱う際には条件分岐が多くなってしまいます。 そこで、様々な拡張子をまとめて扱うのに優れたタグ抽出ライブラリであるPyTagLibを紹介します。 PyTagLib インストール方法 1. C++ライブラリをビルド 2. ver. 1.4.1をインストール 使い方 デモ デモ ソースコード 注意点 PyTagLib PyTagLib…

  • PythonとOpenCVでスペクトログラムを画像データ(jpeg, png)として保存

    オーディオ信号のスペクトログラムをプロット/保存する方法としては、matplotlibのimshow()を使う方法がありますが、今回はスペクトログラムを純粋な画像データとして保存する方法を試してみました。 実装 import librosa import numpy as np import cv2 bitdepth = 8 quality = 95 # jpegの品質, [0, 100], デフォルトは95 filepath = "your_audiofile.wav" y, sr = librosa.load(filepath, sr=None, mono=True) #spec_mag …

ブログリーダー」を活用して、Kureneさんをフォローしませんか?

ハンドル名
Kureneさん
ブログタイトル
Wizard Notes
フォロー
Wizard Notes

にほんブログ村 カテゴリー一覧

商用