Wizard Notes

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

音楽プログラミング

新着順 人気順

信号処理に欠かせないオールパスフィルタ―の概要・使い方・利用例

※2022/9/28: λの算出式の符号が間違っていたためプロットとともに修正 信号処理におけるフィルタとしては、ローパス/ハイパスフィルタのような振幅特性を活用するフィルタが良く知られています。 しかし、一方で位相特性のみに影響を与えるオールパスフィル…

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

Pythonで音声や歌声、楽器音などの収音・再生・録音を行うためのライブラリとしてはPyAudioが知られていますが、 低遅延であるASIO規格が利用できない Python 3.7 以上には非対応 というデメリットがあります*1。 Python 3.7 以上でASIO対応デバイスを利用可…

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

低域・高域のような周波数帯域別に信号処理する場合、いい感じに帯域を分割するフィルタが必要になります。 ソフトウェア/プラグインの具体例としてはマルチバンドコンプレッサが挙げられます。 このような回路の特性としては、音質に影響を与えるような振…

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

音楽の分析方法としてBPM・テンポの分析は非常に重要です。 BPM・テンポの分析を行うことで、楽曲の雰囲気、ノリ、音楽ジャンルといった全体的な特徴を捉えることができます。 BPM・テンポの分析方法としては、テンポグラムという便利な手法があります。 テ…

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

DTMなどで音の広がり感を可視化するには,リサージュ図形に基づく方法があります. リサージュ リサジュー:Lissajousとは | 偏ったDTM用語辞典 - DTM / MIDI 用語の意味・解説 | g200kg Music & Software 2つの信号を元に作られるリサージュ図形を利用し,2…

Python LibROSA で音楽・歌声(ボーカル)をピッチシフト librosa.effects.pitch_shift()

まえがき librosa.effects.pitch_shift() の使い方 引数について 半音単位のピッチシフト 周波数を指定するピッチシフト 使い方のサンプル プロット コード 注意 補足:ピッチシフトはタイムストレッチ? まえがき ボーカルや楽器の録音データに対して、 「…

手を動かして学べる、音のプログラミング・信号処理の教科書(入門/中級者/上級者向けの本)

はじめに 音の信号処理の世界には、理論書や数式重視の教科書が数多く存在します。しかし、実際に手を動かしてプログラムを書きながら学べる本は意外に少ないのが現状です。 そこで本記事では「実際に手を動かしてこそ理解が深まる」ことを重視し、音プログ…

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

シンセサイザ(オシレータ)の基本波形として一般的なサイン波,矩形波,のこぎり波,三角波,白色雑音は,ファミコンのBGMのようなゲーム音楽(チップチューン)の作成や音信号処理のテストでよく利用されます. サイン波は基本周波数(音高)をとすると, …

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

前回の記事では,ステレオのL, R チャネルの信号を,リサージュ図形の として与えることで音の広がりを可視化しました. www.wizard-notes.com この記事では,直交座標 を極座標(絶対値と偏角) 表記にしたバージョンを紹介します. 参考: Goniometer Algo…

Overlap-Add法・Overlap-Save法(重畳加算法,重畳保留法)のPython実装

音信号処理の代表例として、コンボリューションリバーブ*1のような入力信号にインパルス応答を畳み込む処理が挙げられます。 この畳み込み演算をリアルタイムのブロック処理で実現する*2実用的な方法としては、 Overlap-Add法とOverlap-Save法が有名です。 …

楽曲のBPMを自動算出するプログラムの作り方(Pythonサンプルコード付き)

はじめに 音楽分析では,楽曲のテンポを表す BPM (Beats Per Minute) は重要な情報です。 例えば、音楽ジャンルごとに典型的なBPM/テンポがあるので、BPM/テンポはその楽曲がどんな音楽ジャンルに属するかを知る手がかりとなります。 一般的ないくつかのジ…

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

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

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

はじめに ゼロ位相フィルタリングの実装方法 scipy.signal.filtfiltを使ったゼロ位相フィルタ lfilter x 2 でのゼロ位相フィルタリング 参考Webサイト はじめに 双2次フィルタ (SOS) やバターワース/チェビシェフフィルタなどといったIIRフィルタは,FIRフ…

Python:soundfile を使ったオーディオファイル (.wav, .flac, .aiff, .raw, etc.) の読み書き

Python でオーディオファイルを読み込むライブラリは複数あります。 wave scipy.io.wavfile scipy.io.wavfile.read scipy.io.wavfile.write audiofile soundfile audioread librosa.load ぱっと見、どれを使えばよいか迷ってしまいますが、 様々なOSで動いて…

シュレーダーリバーブ(人工残響エフェクタ)のPython実装と試聴デモ

今回は,以下の記事で紹介したオールパスフィルタによる残響生成を用いて、実用的な残響エフェクタとして有名なシュレーダーリバーブをPythonで実装してみました。 www.wizard-notes.com シュレーダーリバーブの概要 フィードバック型コムフィルタの回路につ…

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

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

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

ある音に対して、人間が感じるうるささと音圧レベルの大きさは必ずしも一致していません。 以下の等ラウドネス曲線のように、音圧レベルと周波数によって人間の聴覚の感度は異なっています。 https://ja.wikipedia.org/wiki/音の大きさ そのため、音信号の分…

PythonでSSM(自己類似度行列)を使って楽曲構成(Aメロ,サビなど)を分析

計算機を使った音楽分析技術の一つとして、楽曲構成(Aメロ、Bメロ、サビ)を分析する方法があります。 しかし、日本語で技術の具体的な実現方法や実装について説明のある文献はあまり多くありません。また、Pythonの音楽分析ライブラリ LibROSA にはまだ実…

適応逆ノッチフィルタによるサイン波/調波成分の抽出(Python実装)

前回紹介した適応ノッチフィルタ は、正弦波信号を除去するアルゴリズムでした。 www.wizard-notes.com www.wizard-notes.com しかし、音楽信号処理でよくある楽音を抽出したいという要求には適応ノッチフィルタは利用しにくいです。 そこで今回は、正弦波信…

多段適応ノッチフィルタで複数の正弦波を除去/ドラム・打楽器音の抽出(Python実装)

前回の記事では、適応ノッチフィルタを使って音高が未知の正弦波を除去しました. www.wizard-notes.com しかし、正弦波が複数ある区間ではうまく動作しませんでした。 そこで、今回は複数の正弦波を除去できる、多段適応ノッチフィルタを紹介します。 また…

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

7万枚の手書き数字の画像+ラベルのデータセットである MNIST は,今では機械学習・深層学習のHello Worldとして非常に多くの人に利用されていて有名です. MNISTの1つのデータは 白黒画像・28x28ピクセル,全体でも7万件なので大規模データですがデータセッ…

Python:1/1, 1/3オクターブバンド グラフィックイコライザの実装

音源制作の現場で最も利用されているプラグインの一つとして、ある周波数帯域を増幅/減衰させるイコライザがあります。 その一種であるグラフィックイコライザをPythonで実装してみます*1。 グラフィックイコライザについて オクターブバンド分割(中心周波…

FL Studioでvst3sdkのサンプルプラグインが認識されない・UIが表示されないときの対処法

サンプルプラグインが認識されない 久々にvst3sdkに触れて、 GitHub の readme 通り cmakeでビルド Windowsなのでシンボリックリンク生成を避けるためcmake.exe -G "Visual Studio 17 2022" -A x64 ..\vst3sdk -DSMTG_CREATE_PLUGIN_LINK=0 サンプルコード (…

Lofi hiphop風の揺らぎのあるビートを作るドラムマシンのWebアプリ試作

lofi hiphop 風のビートをさくっと作れるリズムマシンの試作。前半がヨレたビートの生成,後半がランダムパターンのデモ #reactjs #webaudioapi #webapp #lofi #lofibeats #lofihiphophttps://t.co/L7qrtNEEmM pic.twitter.com/h0JvMf654O— Kurene (@_kurene…

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

https://wavesurfer-js.org より ユーザが音楽を再生する Web アプリでは、音の出力するだけでなく、 波形描画などで音を可視化したり、操作が分かりやすいGUIを設計する必要があります。 原理的には、Web Audio API において音波形の信号値が格納されている…

Spotify Web API で取得できる音響・楽曲特徴量の一覧

はじめに Spotify の Web APIを調べていたら、APIを叩いて取得できる音響・楽曲特徴量のドキュメントを発見しました。 developer.spotify.com 非常に興味深い特徴量がいくつかあったので、紹介したいと思います 各特徴量の説明 duration_ms: int 楽曲の時間…

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

音楽再生ソフトやプラグインでよく見かける,スペクトログラムのリアルタイムプロット. どの周波数帯域で音が鳴っているのかをリアルタイムで可視化できるので非常に便利です. Pythonでスペクトログラムのリアルタイムプロットをやろうとすると,やはりリ…

グラフィックイコライザの周波数特性を補正するための最小二乗法による利得最適化

前回は、単純なグラフィックイコライザとして、1/Nオクターブバンドごとに双二次フィルタを用意し直列接続した実装を解説しました。 www.wizard-notes.com しかし、この手法だと、グラフィックイコライザ全体の周波数特性として各中心周波数での振幅値が指定…

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

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

双2次フィルタ (Biquad Filter) の周波数特性(振幅・位相)の一覧

以下の記事で作成した双2次フィルタのプログラムで出力した、双2次フィルタの周波数特性(振幅・位相)の一覧ページです。 www.wizard-notes.com カットオフ周波数 (fc) とQ値 (q) を動かしてプロットしています。 双2次フィルタ作成の参考等にご利用くださ…