ReaperのルーティングでMS処理 (Mid/Side processing) を実現する方法
はじめに MS処理 (Mid/Sideプロセッシング) はステレオ信号を中央定位成分(Mid: センター)と非中央定位成分(Side: センター以外)に空間的に分けてエフェクトをかける処理です。音場を精密にデザインしたい時に強力な手段となります。 DAWでMS処理を行う場合、通常は、Mid/Sideに分割するプラグインを変えて個別にプラグインをインサートするか、もしくはMid/Side処理を内蔵したプラグインを使用するかと思います。 しかし、原理的にはプラグインを導入せずともルーティングだけでMS処理することもできます。そこで、原理の学習・説明を兼ねて、ルーティングのみでMS処理を実現する方法…
手を動かして学べる音のプログラミング教科書まとめ(入門/中級者/上級者)
はじめに 音の信号処理の世界には、理論書や数式重視の教科書が数多く存在します。しかし、実際に手を動かしてプログラムを書きながら学べる本は意外に少ないのが現状です。 そこで本記事では「実際に手を動かしてこそ理解が深まる」ことを重視し、音プログラミング実装を中心に据えた日本語の書籍だけをレベル別にピックアップしました。C/Python/MATLAB、専用DSPボード、さらには数理モデルや機械/深層学習ベースの手法まで、順を追ってステップアップできる構成です。これから音のプログラミングを始めたい方も、すでに基礎を押さえた中級者・上級者も、それぞれのフェーズややりたいことにあった一冊が見つかるかと思い…
ReaperのMedia Itemをより見やすく:文字の大きさやフォントを変える方法
Reaperでオーディオ編集をする際に、各オーディオファイル・データ、オートメーションなどのMedia Itemのフォントサイズが小さく見づらいので、フォントサイズを大きくしたいことがありました。 しかし、Media Itemのプロパティからは直接変更できないので少し不便です。 ただ、Themeの設定から変更できることが分かったため、その方法を記録しておきたいと思います。 検証環境 Reaper v7.29/win64 設定方法 Action > Show Action List を選択します。 Filter に "theme" と入力するとActionの絞り込みができます。 表示された中の、…
WebAudioAPIのHRTF (PannerNode) を使った、3次元立体音響の体験ツール:SpatialEar
dev.wizard-notes.com 頭部伝達関数(HRTF: Head-Related Transfer Function) 技術は、イヤホンやヘッドホンで、まるで本当に頭の外から音が鳴っているように3次元立体音響再生することができます。最近は、ゲームでも音楽コンテンツでも普及し始めています。 このHRTFを使った立体音響再生は WebAudio API の PannerNode によって簡単にWebアプリに実装できますが、ユーザがその効果を体験できるWebアプリはあまり見かけませんでした。 そこで、ユーザーが直感的に音の空間配置をコントロールし、PannerNodeによるHRTFを効果…
ChatGPT o3-mini-high と Web Audio API アプリ(音質検証用オシレータ)を作る
開発したWebアプリ: dev.wizard-notes.com Open AI の Reasoning AI の最新モデル o3-mini, o3-mini-high が発表され、コーディング性能が素晴らしいと話題になっています。 ちょうど、イヤホン・ヘッドホンの音質や音量バランスなどの動作検証用に、PCやスマホから利用できるWebオシレータアプリを作りたいと考えていましたが、まとまった作業時間が取れず放置状態になっていました。 そこで、早速試してみたところ、仕様策定、実装、実環境での動作確認まで2時間強くらいで開発できてしまい非常に驚きました。 せっかくなので、開発したアプリの紹介も兼ねて…
gpuRIR:Python+GPUで室内残響を鏡像法で高速生成【インストール方法・利用例】
はじめに 1. 鏡像法とは 1.1 計算のイメージ 1.2 CPUでのシミュレーションの限界と、GPUの利点 2. gpuRIRとは 3. 環境構築 3.1 必要なソフトウェア 3.2 Windows11での利用方法 4. gpuRIRの基本的な使い方 4.1 ライブラリのインポート、初期設定 4.2 シミュレーションのパラメータ設定 4.3 室内音響特性の設定 4.4 反射係数とシミュレーションパラメータの計算 4.5 インパルス応答の生成 4.6 結果のプロット まとめ 関連記事:PythonでCPUを使った鏡像法によるRIR生成 はじめに この記事では、Python用ライブラリ「gpuR…
Windows11にWSL2(Linux)をインストールしてCUDA,Python開発環境を構築
はじめに 構築環境 インストールのマニュアル 1. NVIDIAドライバーのインストール 2. WSLのインストール 3. CUDAツールキットのインストール 4. Python環境の構築 【任意】 pyenvによるPythonのバージョン管理 pipのインストール matplotlibの対応 まとめ はじめに 最近のWindows 11環境では、Pythonのインストールだけで基礎的な数値計算が可能です。しかし、GPUによる高速な数値計算や機械学習のためには、CUDAを利用する必要があります。特に、GPUで鏡像法を実行して室内インパルス応答を求めるgpuRIRのようなライブラリを使う場合、W…
PythonでOctave (MATLAB) の関数を使える oct2py 【インストール方法・利用例】
はじめに インストール方法 検証環境 Octave, oct2pyの概要 octaveのインストール方法 oct2pyの導入 パッケージの導入 動作確認 利用例 基本操作 パッケージの利用 関数の返り値の数の指定:nout Octave独自の関数を使う例:invfreqz Octaveでの invfreqz() の利用 Python (oct2py) で Octaveのinvfreqz() の呼び出し まとめ はじめに 数値計算用のプログラミング言語としては Pythonの利用が増えています. 一方で,MATLABや,MATLABに似たオープンソースの数値計算ツールである Octave も選択…
はじめに 直列移動平均フィルタ (Cascaded moving average) N 次 CIC フィルタ リサンプリングでの利用 まとめ 参考文献 はじめに www.wizard-notes.com 上記の記事で紹介した移動平均フィルタですが、こちらを応用したフィルタとして直列移動平均フィルタとCIC (Cascaded Integrator Comb) フィルタがあります。 こちらはAD-DA変換のような実用的なディジタル信号処理技術として重要なので、簡単に紹介したいと思います。 直列移動平均フィルタ (Cascaded moving average) 前回の記事の通り、移動平均フィルタ…
scipy.signal.minimum_phase による最小位相フィルタの算出
はじめに どんな時に必要か 最小位相フィルタの算出方法 scipy.signal.minimum_phaseの紹介 利用例 算出の流れ ヒルベルト変換とホモモルフィック処理 まとめ 参考文献 関連記事 はじめに 信号処理の分野では「最小位相フィルタ」というキーワードがでてきます。 その名の通り、フィルタのインパルス応答が時間的にできるだけ早く立ち上がり、最小限の遅延を持つように設計されたフィルタです。 Pythonのscipyライブラリには、便利な関数 scipy.signal.minimum_phase があり、これを使用することで簡単に最小位相フィルタを算出することができます。本記事では、…
移動平均と指数平滑移動平均の周波数特性(振幅,位相,群遅延)
はじめに 定義 移動平均(Moving Average)とは 計算方法 特徴と用途 指数平滑移動平均(Exponential Moving Average)とは 計算方法 特徴と用途 移動平均と指数平滑移動平均の使い分け 周波数特性 移動平均 (MA) 指数平滑移動平均 (EMA) Pythonコード まとめ 関連 はじめに 時系列信号の高周波成分を除去し低周波成分を抽出したり、時系列のトレンドをつかんだりするために、「移動平均」と「指数平滑移動平均」はよく使われる手法です。 音信号処理だけでなく、身近なところでは株価チャートでよく利用されます。 これらはローパスフィルタの一種ですが、具体的に…
オクターブバンドの中心・下限・上限周波数のPythonでの算出と、基底に関する備忘録
オクターブバンドについて 中心周波数や下限・上限周波数の算出 基底について オクターブバンドについて 騒音のような音信号の周波数分析では,オクターブバンドフィルタがよく使われています。 www.wizard-notes.com 周波数分析といえばフーリエ変換が思い浮かびますが、1オクターブ内(例えば、250 Hz~500Hz, 500Hz~1000Hz)では周波数解像度が異なるという性質があります。 そこで、人間の聴覚の周波数特性は等比的であることから、定周波数比でフィルタバンクを構成するオクターブバンド分析が利用されます*1。 www.onosokki.co.jp 具体的には、音信号をFIR…
音楽の特徴分析について、当ブログでは音響信号からテンポや音色のような音楽的特徴を分析する手法を紹介してきました。 一方で、音楽は音響的な要素だけでないので映像や自然言語(歌詞)からのアプローチや、ソーシャルデータを用いた手法も数多くあります。 そこで今回は、昨今流行っている ChatGPT4を歌詞から感情特徴へのエンコーダとみなし、ChatGPT で J-POP 楽曲の歌詞の感情分析を試してみました。 プロンプト 例 Ado - うっせぇわ 米津玄師 - Lemon supercell feat.初音ミク - メルト 藤井風 - 死ぬのがいいわ 椎名林檎 - 丸の内サディスティック 平沢進 -…
ChatGPT4にピアノ曲の演奏難易度・演奏の注意点を聞いてみる(ブルグミュラー25/18の練習曲)
ChatGPT Plus (有料版) を契約したのでいろいろ試しています。 その中でも、ピアノの練習曲の演奏難易度・演奏の注意点に関する回答が興味深かったので紹介したいと思います。 題材 プロンプトのポイント ChatGPT4の場合 ChatGPT3.5の場合 所感 おまけ (GTP4) 関連Webサイト 題材 ピアノの練習曲としてよく利用されているブルグミュラー25の練習曲*1/18の練習曲*2を題材としています。 25の練習曲はバイエル終了程度、18の練習曲は25の練習曲が終了後(ツェルニー30番程度)のレベルであり、メロディや展開が美しい練習曲となっています。 どちらも基本的に後半になる…
VST3 Project Generator を使ったエフェクタ (VSTe) の実装メモ
前回の記事でWindows11での VST3 開発環境構築が整ったので、試しに簡単なエフェクタを実装してみました。 VST3 SDK 3.7.0 から追加された VST3 Project Generator を使うことでプロジェクトを簡単に作ることができましたので、参考にしたWebページやメモを残したいと思います。 検証環境 開発環境の準備 プロジェクトの準備 パスの設定 プロジェクトの設定入力 簡単なエフェクタの実装 GUIの実装 関連Webページ 検証環境 Windows 11 Pro Microsoft Visual Studio Community 2022 (64 ビット) Visu…
VST3開発環境の構築 (Windows11, Visual Studio 2022, VST SDK ver. 3.7)
[2023/5/2: Twitterで頂いたすずむし様からのご指摘を元に,VST SDK ver. 3.7.7での動作確認ができたため修正。ご情報ありがとうございました。] 前々からやろうと思っていたWin11,VS2022,VST3.7 でのVST開発環境の構築にトライしてみたところ、とりあえず VST SDK ver. 3.7.7(もしくは ver. 3.7.3)を導入して VSTe を作成・正常動作するところまで確認できました。 基本的には、うつぼかずら様のWebサイトの記事「VST3プラグイン開発01 – VST3開発環境の準備」の手順に従うことで環境構築できました。 VST3プラグイ…
振幅パンニング:サイン則(sine law)とタンジェント則(Tangent Law)の分配係数プロット
2台のスピーカを用いたステレオ再生において、左右のスピーカに振幅差をつけて再生することで両耳間位相差と両耳間強度差を実音源に近づくようにする手法を振幅パンニングといいます。 この振幅パンニングの代表的な手法としてサイン則とタンジェント則が知られています。 サイン則は頭を正面位置に固定した場合のパンニング則,タンジェント則は頭を仮想音像の方向に向けた場合のパンニン グ則と言われています*1。 本記事では、それぞれの分配係数(左右のゲイン)のプロットを紹介したいと思います。 プロットの条件 サイン則 振幅和を一定として分配 二乗和を一定として分配 タンジェント則 振幅和を一定として分配 二乗和を一…
Overlap-Add法・Overlap-Save法(重畳加算法,重畳保留法)のPython実装
音信号処理の代表例として、コンボリューションリバーブ*1のような入力信号にインパルス応答を畳み込む処理が挙げられます。 この畳み込み演算をリアルタイムのブロック処理で実現する*2実用的な方法としては、 Overlap-Add法とOverlap-Save法が有名です。 特に Overlap-Save 法はちゃんと実装したことがなかったため、勉強も兼ねてOverlap-Add法とOverlap-Save法の実装例を紹介します。 Overlap-Add法 Overlap-Save 法 まとめ 参考文献 Overlap-Add法 Overlap-Add法 では、ブロックごとの直線畳み込みを効率的に行う…
Pythonで空間音響(バイノーラル)用ファイル形式 SOFA を処理(pysofaconventions)
需要が高まってきているバイノーラル処理にチャレンジする場合、まずはWeb上のSOFA形式のHRTFデータで試すことが多いかと思います。 Pythonであれば、SOFA形式のデータ読み込んで Numpy配列にさえ変換すればバイノーラル処理やプロットは容易です。 そこで、今回はPythonでSOFA形式のデータを扱う方法をサンプルコードとともに紹介します。 SOFA 形式について SOFAを処理するためのPython用API pysofaconventions を使ってみる インストール方法 利用するデータベース サンプルコードについて 関連リンク SOFA 形式について VRや360°映像におけ…
Webアプリ試作:Lofi hiphop風の揺らぎのあるリズムを奏でるドラムマシン
lofi hiphop 風のビートをさくっと作れるリズムマシンの試作。前半がヨレたビートの生成,後半がランダムパターンのデモ #reactjs #webaudioapi #webapp #lofi #lofibeats #lofihiphophttps://t.co/L7qrtNEEmM pic.twitter.com/h0JvMf654O— Kurene (@_kurene) February 25, 2023 去年から積んでいた Lofi風ドラムマシンの開発をようやく消化できたので紹介を細かい話を書きたいと思います。 モチベーション 機能について 基本機能 Fluctuation mode…
シュレーダーリバーブ(人工残響エフェクタ)のPython実装と試聴デモ
今回は,以下の記事で紹介したオールパスフィルタによる残響生成を用いて、実用的な残響エフェクタとして有名なシュレーダーリバーブをPythonで実装してみました。 www.wizard-notes.com シュレーダーリバーブの概要 フィードバック型コムフィルタの回路について フィルタ応答の観察 直列オールパスフィルタのみ 並列コムフィルタ+直接音 並列コムフィルタ+直列オールパスフィルタ+直接音 シュレーダーリバーブのデモ(ピアノ) Python実装 参考文献 シュレーダーリバーブの概要 シュレーダーリバーブは直列オールパスフィルタによる残響生成に加えて、並列フィードバック型コムフィルタを用いて…
Windows10/11でMelodyne 4 が起動しない事象への対処
音質と操作性に非常に優れていることから、ピッチ編集ソフトMELODYNE (Celemony Software)を長年愛用しています。 最近、新PCでの作曲環境再構築の際に、Melodyne 4 64-bit 版が起動しないということがありました。 結論としては、Intel CPU の第10・11世代は64-bit版を利用できない可能性が高いようです。 miwele.com https://helpcenter.celemony.com/M5/faqs/?qOpen=299 ということで、私の環境でも Melodyne 4 64-bit 版はダメでしたが、32-bit 版は起動しました。 C:…
Python:直列オールパスフィルタによる人工残響の生成と試聴
「信号処理に欠かせないオールパスフィルタ―」で紹介したオールパスフィルタの利用例として、人工残響フィルタを実装してみました。 設計方法 フィルタ応答の比較 試聴 Python実装 参考文献 設計方法 直列オールパスフィルタによる人工残響生成はシュレーダリバーブ の一部として知られています。 具体的には、多段のオールパスフィルタで構成します. 実装は簡単ですが,オールパスフィルタの性質により振幅は指数関数的に減衰し、出力信号の音色に変な色付けがされない*1となっていることから、残響にとって都合よい特性となっています。 なお、よりよい残響生成のために、各オールパスフィルタの遅延は互いに素で、遅延の…
Python:ヒルベルト変換で様々な信号の包絡線,瞬時位相,瞬時周波数を抽出
音の時間波形の包絡線を抽出や振幅変調(AM)の復調などで利用されるヒルベルト変換をPythonで実装し、いくつかの簡単な信号に対して適用してみました。 ヒルベルト変換の概要 ヒルベルト変換の仕組みや実装方法については、以下のWebページがわかりやすいです。 小野測器 基礎からの周波数分析(29)-「ヒルベルト変換と解析信号」 この記事に従い, フーリエ変換を用いて解析信号を算出 解析信号から包絡線,瞬時位相,瞬時周波数を抽出 する処理を実装します. Python実装 入力信号→解析信号の算出 def hilbert_transform(x): n = x.shape[0] x_f = np.f…
リアルタイム雑音抑圧処理:適応線スペクトル強調器 (ALE) のPython実装と適用例
音信号向けの簡単かつ実用的なリアルタイム向け雑音抑圧処理として,以下の書籍で適応線スペクトル強調器 (ALE) が紹介されていました. 上記の書籍を参考にしつつ,Pythonでの適応線スペクトル強調器 (ALE)の実装と,様々な信号への適用例を紹介します。 適応線スペクトル強調器 (ALE) の概要 適応線スペクトル強調器 (ALE) は雑音が含まれた観測信号から目的信号を強調/予測する処理です. 目的信号は音声や楽音のような周期性信号であり,周波数が未知でも抽出できることがこの手法の長所です. 以下がブロック図です。 遅延素子数Dは相関分離パラメタ (de-correlation param…
xlsxやcsvのデータをExcelで間引く方法(INDIRECT, SUBSTITUTE, ADDRESS, ROW, COLUMN関数)
サンプル数が大きい時系列データや周波数応答が格納されたxlsxやcsvファイルをExcelで開くと、かなり動作が重くなることがあります。 そのようファイルでグラフをプロットのような操作をするのは動作が遅いため苦行ですし、Excelが突然落ちるリスクも高くなります。 基本はプログラムやバッチファイルで間引き(デシメーション)するのがよいですが、どうしてもExcelでなんとかしたい場面があります。 そこで、ファイルサイズの大きい xlsxやcsvのデータをExcelで間引く方法を示します。 元データの形式例 例として、時系列データを考えます。 今回は、rawシートにA列に時系列のインデックス,B-…
オーディオテクニカは ATH-EW9 のような耳掛けヘッドホンを販売しています。 www.wizard-notes.com これらの機種の共通の特長として、耳にフィットしやすいイヤハンガーがあります。 この独特なイヤハンガーは、耳への締め付けを向上させるだけでなく、ヘッドホン部の高さを変えることができます。 そのため、結果として密着感を向上させることができているように思います。 左:イヤハンガーを閉じた状態,右:イヤハンガーを開いた状態 左:イヤハンガーの高さ最小,右:イヤハンガーの高さ最大 実は、このイヤハンガー部はオーディオテクニカが特許をとっており、ちょうど今年の9月末に20年経って期限…
和音のモダリティ(明るいー暗い/嬉しいー悲しい)を算出するモダリティ曲線 (Modality Curve) のPython実装
不協和度、緊張度に引き続き、“The Psychophysics of Harmony Perception: Harmony is a Three-Tone Phenomenon” より和音の明るさー暗さや嬉しさー悲しさを表すとされる和音のモダリティの算出モデルについて紹介します。 また、モダリティ曲線を算出するPythonのプログラムを紹介します。 www.wizard-notes.com www.wizard-notes.com モダリティの概要 純音のモダリティ曲線 倍音を考慮したモダリティ算出 プロット用コード まとめ 参考文献 モダリティの概要 モダリティは和音の緊張度と密接に結び…
和音の緊張度を算出する緊張度曲線 (Tension Curve) のPython実装
前回に引き続き、“The Psychophysics of Harmony Perception: Harmony is a Three-Tone Phenomenon” より和音の心理数理モデルのPython実装を行います。 今回は、和音の緊張度を分析する数理モデルを扱います。 用途としては、減3和音や増3和音のような緊張感のある和音・ヴォイシングを分析・検出したり、コード進行を分析するのに利用できる可能性があります。 www.wizard-notes.com 和音の緊張度 参考文献では、和音の緊張度を音程の等しさに基づいて算出しています。 緊張度の高い和音としては、減3和音や増3和音などが…
和音の協和度を算出する不協和度曲線 (Dissonance Curve) のPython実装
和音の響きはその音楽の雰囲気を分析する重要な要素です。 長/短3和音のような明るい/悲しいといった響きから、ジャジーな和音の複雑で豊かな響きまで様々です。 このような和音の響きを計算機で分析する方法はいくつかあります。 今回は、和音がどのくらい協和的かを示すモデルとして知られている不協和度曲線を紹介します。 2つの純音の不協和度 倍音を考慮した不協和度曲線 3つ以上の音の不協和度の算出 まとめ 参考文献 2つの純音の不協和度 参考文献では、基本周波数がそれぞれ f1, f2 (f1<f2)である2つの純音の不協和度曲線は以下のように定義されています*1。 v12は2つの純音の音量 v1, v2…
FL Studio で Miroslav Philharmonik 2 のクラッシュを防ぐ方法
IK Multimedia の高品質なオーケストラ音源 Miroslav Philharmonik 2 (CE) は、セール時だとCEで5~6千円、完全版でも1万円台で買えるコスパの良いオーケストラ音源です。 しかし、FL StudioではプラグインがDAWを巻き込んで頻繁にクラッシュするという問題がありました。 今回、その対処方法を実施してからクラッシュしなくなったため、情報を残したいと思います。 症状 Miroslav Philharmonik 2 を使っていると、突然音割れが発生し、その後すぐに情報表示部に「"Philharmonik 2" crashed while processin…
1次IIRオールパスフィルタでローパス/ハイパスフィルタを作る(Python実装)
「信号処理に欠かせないオールパスフィルタ―の概要・使い方・利用例」では、オールパスフィルタによって低演算量で様々な周波数特性のフィルタを作成できることを紹介しました。 www.wizard-notes.com この記事では、その具体例として1次IIRオールパスフィルタの並列回路でローパス/ハイパスフィルタを作成します。 1次IIRオールパスフィルタ 1次IIRオールパスフィルタの詳細はこちらの記事を参考にしてください。 今回は位相が90度遅れる周波数 fc を4つ用意し、それぞれのフィルタ係数用パラメタ λを算出しました。 sr = 44100 worN = 4096 # 0.3, 2.8, …
様々な周波数特性を実現するオールパスフィルタ―の概要・使い方・利用例
信号処理におけるフィルタとしては、ローパス/ハイパスフィルタのような振幅特性を活用するフィルタが良く知られています。 しかし、一方で位相特性のみに影響を与えるオールパスフィルタという種類のフィルタがあります。 実は、オールパスフィルタは並列回路で利用することで様々な周波数特性を低演算量で実現できる非常に便利なフィルタです。 そこで本記事では、オールパスフィルタ―の概要・使い方・利用例を紹介したいと思います。 オールパスフィルタ―とは どんな利用用途があるか? オールパスフィルタのフィルタ構成 単純な遅延 (FIRフィルタ) 1次IIRオールパスフィルタ 2次IIRオールパスフィルタ N次IIR…
Python:VSTプラグインのようなエフェクター(音響効果処理)を簡単に実装・リアルタイム再生できるクラスの作成
入出力の管理リアルタイム音響信号処理を使った身近な機器としては、ボーカルやギターなどの楽器で利用されているエフェクターが挙げられます。 エフェクターは信号処理としては簡単なのですが、実際にPCでプログラミングをして音を出力するのは準備が割と大変です。 そこで本記事では、Pythonでエフェクターをリアルタイム音響信号処理として簡単に実装可能&音としてすぐに聞けるクラスを作りました。 VSTなどのフレームワークのように audio_process(x, y)のような信号処理の関数を書くだけでエフェクターが実装・試聴できます。 使い方 Playerクラス実装の参考記事 使い方 以下のGithub上…
Pythonでボーカルやギターなどのエフェクターを簡単に実装・リアルタイム再生処理できるクラスの作成
入出力の管理リアルタイム音響信号処理を使った身近な機器としては、ボーカルやギターなどの楽器で利用されているエフェクターが挙げられます。 エフェクターは信号処理としては簡単なのですが、実際にPCでプログラミングをして音を出力するのは準備が割と大変です。 そこで本記事では、Pythonでエフェクターをリアルタイム音響信号処理として簡単に実装可能&音としてすぐに聞けるクラスを作りました。 VSTなどのフレームワークのように audio_process(x, y)のような信号処理の関数を書くだけでエフェクターが実装・試聴できます。 使い方 Playerクラス実装の参考記事 使い方 以下のGithub上…
Python:numba (jit)で音響信号処理の高速化 - 2次IIRフィルタの処理時間計測
数値計算でよく利用されている Python (CPython) ですが、for文の処理が遅いという問題点があります。 音響信号処理ではC/C++風に配列の各要素にアクセスが必要な処理を for文を使って実装することが多いため、これは致命的です。 そこで、Python用のjitコンパイラ numba で(リアルタイム)音響信号処理をどれくらい高速化できるか、音響信号処理でよく使われる2次IIRフィルタを使って計測・比較してみました。 numbaについて 概要 型指定 処理時間比較用スクリプト 測定環境 計測結果 関連文献 numbaについて 概要 A ~5 minute guide to Num…
オーディオテクニカの耳かけヘッドホン ATH-EM700 の分解と音質比較
[:w500px] オーディオテクニカの耳かけヘッドホン ATH-EM700 ですが、故障により1台を分解することにしました。 修理の際に役立つと思い、 ATH-EM700 の内部構造をメモとして記録しておきたいと思います。 また、せっかくなので ATH-EM700 と他のオーディオテクニカの耳かけヘッドフォンの音質を比較します。 www.phileweb.com ATH-EM700 の分解 音質比較 まとめ ATH-EM700 の分解 分解前にATH-EM9Dと比較。 ATH-EW9などと比べても、ATH-EM700 は薄い筐体となっています。 耳掛けは EM700 のほうがよく開き、筐体に…
適応逆ノッチフィルタによるサイン波/調波成分の抽出(Python実装)
前回紹介した適応ノッチフィルタ は、正弦波信号を除去するアルゴリズムでした。 www.wizard-notes.com www.wizard-notes.com しかし、音楽信号処理でよくある楽音を抽出したいという要求には適応ノッチフィルタは利用しにくいです。 そこで今回は、正弦波信号を抽出する適応逆ノッチフィルタを紹介します。 適応逆ノッチフィルタの構成 直列適応逆ノッチフィルタ 実装 実行結果 まとめ 参考文献 適応逆ノッチフィルタの構成 逆ノッチフィルタの周波数応答(振幅特性)は下図のようになります。 ちょうどノッチフィルタの振幅特性を反転したような特性です。 そのため、ノッチフィルタの…
多段適応ノッチフィルタで複数の正弦波を除去/ドラム・打楽器音の抽出(Python実装)
前回の記事では、適応ノッチフィルタを使って音高が未知の正弦波を除去しました. www.wizard-notes.com しかし、正弦波が複数ある区間ではうまく動作しませんでした。 そこで、今回は複数の正弦波を除去できる、多段適応ノッチフィルタを紹介します。 また、多段適応ノッチフィルタの活用方法としてドラム・打楽器音を抽出してみます。 多段適応ノッチフィルタの構成 実装 適用結果 まとめ 多段適応ノッチフィルタの構成 [px] 構成方法としては、任意の数の適応ノッチフィルタを直列で接続すればOKです。 基本的には、接続した適応ノッチフィルタの数だけパワーの大きいサイン波を除去できます。 しかし…
Python:sounddeviceを使った音声ファイルの再生・リアルタイム処理の実装方法
以下の記事では,Pythonで音の再生・録音を行うためのライブラリ sounddevice を紹介しました。 Python-sounddevice で音声や歌声をリアルタイム収音・再生・録音 - Wizard Notes この記事では、音の信号処理/アプリ開発でよく使う、音声ファイルの再生をsounddeviceを使ってどのように実装するかを紹介します。 方法1: オーディオをそのまま再生する 方法2: オーディオをリアルタイム処理して再生 方法2.1 マルチスレッド処理 方法3: オーディオをリアルタイム処理して再生(同期処理) まとめ 方法1: オーディオをそのまま再生する soundde…
Python:適応ノッチフィルタで正弦波(周期性雑音)を除去
音響信号処理の良い参考書である プログラム101付き 音声信号処理 では、適応信号処理の一例として適応ノッチフィルタが紹介されています。 ただし、プログラムがC言語のみであり、また、数学的な説明が僅かであるため仕組みが分かりにくいです。 そこで、適応ノッチフィルタのPythonにおけるリアルタイム実装とアルゴリズムの詳細を説明したいと思います。 適応ノッチフィルタについて 信号処理における雑音除去の一つのユースケースについて、未知の狭帯域雑音(正弦波信号)を除去が挙げられます。 具体的な対象としては、交流電源由来のノイズやモーター/エンジンなどの回転音、音楽信号であれば調波楽器の基音・倍音成分…
グラフィックイコライザの周波数特性を補正するための最小二乗法による利得最適化
前回は、単純なグラフィックイコライザとして、1/Nオクターブバンドごとに双二次フィルタを用意し直列接続した実装を解説しました。 www.wizard-notes.com しかし、この手法だと、グラフィックイコライザ全体の周波数特性として各中心周波数での振幅値が指定値から大きくズレてしまうという問題がありました。 この問題の解決方法として、最小二乗法での利得最適化によってグラフィックイコライザの振幅特性を補正する手法を紹介します。 なお、元論文は下記になります。 Abel, Jonathan S., and David P. Berners. "Filter design using secon…
Python:1/1, 1/3オクターブバンド グラフィックイコライザの実装
音源制作の現場で最も利用されているプラグインの一つとして、ある周波数帯域を増幅/減衰させるイコライザがあります。 その一種であるグラフィックイコライザをPythonで実装してみます*1。 グラフィックイコライザについて オクターブバンド分割(中心周波数と帯域幅の決定) 実装 周波数特性のプロット まとめ、単純なグラフィックイコライザの問題点 参考文献 グラフィックイコライザについて イコライザにおいて重要なパラメタは、 中心周波数 帯域幅(Q値) 増幅/減衰させる量 の3つになります。 フィルタの構成方法はいくつがありますが、特に双2次フィルタ(Biquad filter)を使う方法がよく知ら…
エレクトロニカ風の音楽を自動作曲・自動演奏し続けるリズムマシンWebアプリ
エレクトロニカっぽい曲を自動生成&展開し続けるリズムマシンのWebアプリ試作 #javascript #webaudioapi #React Electronica Machine v0.1https://t.co/HiqdWvGV7d pic.twitter.com/zjsJosajte— Kurene (@_kurene) 2022年8月21日 当初は単純なドラムマシンを作っていましたが、いろいろ触っているうちに自動作曲と人による入力制御が共存するような自動演奏/作曲支援アプリの方が面白いと感じたため今回のようなアプリになりました。 音楽系Webアプリ開発の参考になるように、工夫した点や参…
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 の使い方・実装…
以下のような楽曲構造の分析を行うには、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を算出しました。 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 を分解してみました。 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 を試聴・分解する
www.wizard-notes.com
オーディオテクニカの耳掛けイヤホン 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配列かどうか判別したいことがあります. 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変換くらいの計算速度となるのか試してみました。 実装方法 リ…
「ブログリーダー」を活用して、Kureneさんをフォローしませんか?