chevron_left

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

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

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

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

2014/02/23

arrow_drop_down
  • ChatGPT で J-POP 楽曲の歌詞の感情分析

    音楽の特徴分析について、当ブログでは音響信号からテンポや音色のような音楽的特徴を分析する手法を紹介してきました。 一方で、音楽は音響的な要素だけでないので映像や自然言語(歌詞)からのアプローチや、ソーシャルデータを用いた手法も数多くあります。 そこで今回は、昨今流行っている 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 の使い方・実装…

  • 素早く手軽に楽曲構造をタグ付けする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 実装の流れ …

arrow_drop_down

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

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

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

商用