投稿

1月, 2013の投稿を表示しています

振幅ピークを計測するプラグイン Nyquist

引っ越し sound programming 目次

LADSPA Delay

イメージ
LADSPAのプラグインを実験的に作ってみる。今回はシンプルなディレイで、msecでディレイタイムを設定し、dBでDry,Wetのレベル調整を行い、フィードバックは-1から1というオーソドックスなもの。LADSPAにあったサンプルのディレイはフィードバックもなくsec単位、パラメータはリニア単位だったので、その辺を改造してみた。DryのON/OFFも追加。実験用に使うので、パラメータは少なくして基本的にモノラル用とした。LADSPAは初期設定値が細かくコントロールできないので、パラメーターが多いと面倒になる。3つぐらいの入力であればストレスはないので実用になる。 VSTもそうだが、この手のプラグインは、パラメーター含めてfloatで管理していたりして、個人的には窮屈に感じる。やっぱりフルオリジナルの方が面白いわ。ただ0から作る必要がないので、ちょろっと試すには手軽かもしれない。LADSPAはシンプルな仕様なので、ladspa.hを眺めていれば、何となく出来てしまうよさはある。 ブロック図は極めてシンプル。 Delayの自作は何度もやっていた Audacity標準のEchoやNyquistで作られたDelayは使い勝手が悪かったので、何度かいろいろなプログラム言語で作ってきた。はじめにAudacityとの親和性が高いNyquistでささっと 作ってみた が、これはfeedbackの概念がちょっと違ったり、Dryをうまくコントロールできず、個人的にはしっくりこなかった。その後Javaで思い通りコントロールする Delayを作った のだが、Audacity内でちょこっと使うという用途ではない。LADSPAはC言語&floatを使ってローレベルの制御が出来るので、そこそこの自由度があり、この程度のエフェクトであれば好都合に思えた。 ソースはビット演算を使ったディレイ。バッファは構造体に設置しないとうまく動作しなかった。LADSPAの仕様がよく分かっていないのだが、いろいろ制約があるようだ。 LADSPA Delay /* Namagi delay.c 2013.01.29 windows compile gcc -shared -o namagi_delay.dll namagi_delay.c -I

Reverbの自作5 Schroederのアルゴリズム

イメージ
なんとかリバーブらしいものまでこぎつけた。約2日使ってしまった。プログラミングだけなら1日かからないで出来たのだろうけど、Blogにまとめておく作業が半分以上という感じ。まとめる作業って馬鹿に出来ないぐらい時間がかかる。でもこの作業をしておくことが大事。 Schroederによるリバーブアルゴリズム 1960年代の初期デジタルリバーブである Manfred Robert Schroeder(シュレーダー) のアルゴリズムをなぞってみる。内部的にはcomb fileterを4つ並列でつないで、その後にall-pass fileterを2個直列でつないでいる構造が、もっとも基本的なパターンらしい。comb fileterで長めの残響を作り出し、all-pass fileterで密度を上げ補間するような構造になっている。パラーメータを工夫することでリバーブの後部残響を生成することができる。リバーブの初期反射は別の構造なので、そのうち取り上げたいと思う。 上図はリバーブで作り出した音を色分けしたもの。大雑把に青が直接音で、赤が初期反響音、水色が後部残響音となる。 ブロック図 ブロック図の作図手段が悩みどころ。毎回違うソフトを使っているのだが、今回フリーの汎用CADソフトjwwで描いてみた。この手の作業はCADが一番ストレスないわ。簡単に出来そうなソフトほど苦労するので、はじめから本格的なものを使った方が早かったというオチ。 設定値は残響時間を基本に遅延時間、フィードバックゲインを下記計算式を使って調整していく。combの遅延時間は30から45msec程度で、最小値と最大値の比率は約1.5がよいらしい。また遅延時間は相互に重ならないように、サンプル数が素数になるように、うまく組合わせる必要がある。手計算だとパラメーターの設定だけでも面倒なことになる。今回は基本的なしくみを知りたいだけなので、自動計算などはさせずに、ダイレクトに設定できるように作ってみた。設定値でどう音が変化するかを知るのが大きな目的。allpassは遅延時間が短めで、5msec、1.7msecとあったので、ほぼそのまま採用することにした。allpassのフィードバックゲインも推奨値があり0.7。 Tr: 残響時間 60dB減衰する時間 g: フィードバ

Reverbの自作4 comb filter の並列処理

イメージ
まずは古典的デジタルリバーブであるManfred R. Schroederのアルゴリズムをなぞるという意味でリバーブの実験をしている。そのメインの部分がこのcomb filterの並列処理。4つのcomb filterをつないで、遅延時間、ゲインを調整することで、リバーブの基本となる後部残響をつくり出す。プログラムはダラダラと長くなってしまったが、そこそこ実現できたと思う。 ブロック図 DIAを使って描いてみたのだが、細かな調整ができない・・・ 次回はinkscapeを使おうかな・・ LADSPA プラグイン Audacityで表示させたところ。毎回入力する面倒はあるが、あれこれ実験するには悪くはない。 デルタ関数を使って実験 デルタ関数に上記設定を適用してみる。 実験的にゲインをマイナスにしてみた。下の上段がgainプラスで、下段がgainマイナス。 次は、今まで作ったパーツ使って実際の音処理をしてみようと思う。 C LADSPA comb filter 並列処理 ソースコード /* namagi_comb_parallel.c 2013.01.26 compile gcc -shared -o namagi_comb_parallel.dll namagi_comb_parallel.c -ID */ /***********************************************************/ #include &ltstdlib.h&gt #include &ltstring.h&gt #include &ltmath.h&gt #include "ladspa.h" #define MAX_DELAY 100 #define COMB_CHECKBOX1 0 #define COMB_DELAY1 1 #define COMB_FEEDBACK1 2 #define COMB_CHECKBOX2 3 #define COMB_DELAY2 4 #define COMB_FEEDBACK2 5 #define COMB_CHECKBOX3

Reverbの自作3 all-pass filter 直列

イメージ
今回はリバーブ用のall-pass filterを直列につないでみる。ブロック図はこんな感じ。 LADSPAのインターフェイスの扱いが不慣れで、何ができるのかがよく分かっていない。いろいろやってみてチェックボックスができることが判明したので、それを採用してみた。2つのAPF(all-pass filter)をON/OFFするのに便利だからだ。ただ初期設定の方法が不明。狙い通りの数値をあらかじめ入れておくことは出来ないのか? アバウトならできるのだが・・・ 他のプラグインを見ても1/4単位ぐらいでしか設定できていないから無理なのかな。 LADSPAの拡張規格であるLV2では初期設定ファイルの読込みなどができるようなので、柔軟性はあるのだが、学習負荷が高そうだな。使い勝手で良い方法が見つからなければLV2も考えるとするか。むしろ完全自作へさっさと移行した方が幸せかもしれない。 とりあえず、立ち上げるたびに数値を入力するというスタイル。これぐらいなら入力項目数が少ないので我慢できるが、10を超えるとやってられないよね。 実際このall-pass filterはリバーブの残響密度を上げるために利用するという。そのため5msec以下の短い遅延で使う。実際にホワイトノイズに上記絵の設定を適用してみると、遅延の短さゆえにくし形的な特徴が出てしまっている。combを使うことに比べたら、かなり平坦ではあるのだが、それでも音色としてキンキンした感じは否めない。 ソースは以下の通り。 LADSPA all-pass filter 直列 /* namagi_allpass_w.c 2013.01.26 compile gcc -shared -o namagi_allpass_w.dll namagi_allpass_w.c -ID */ /***********************************************************/ #include &ltstdlib.h&gt #include &ltstring.h&gt #include &ltmath.h&gt #include "ladspa.h" #define MAX_DELAY

Reverbの自作2 all-pass filter

イメージ
やや謎のall-pass filterにトライ。以前Phaserを作ったときにall-pass filterは作っているのだが、名前は同じでも構造も効果も違う。あまり名前にこだわらずにARIの解説の通りに作ることにする。前回のcomb filterと同じ遅延によるフィルターなのだが、all-pass filetrは周波数特性がフラットというのが特徴となっている。このフラットがどれぐらいを意味するのか不明だが、原理的には完全フラットということはあり得ないような気がする。まぁ作って判断するのが早い。 all-pass filter ブロック図 まずは、この通りプログラムをLADSPAで組んでみる。前回のcomb filterを修正するだけなので、数分で完成。むしろこのBlogを書いている時間が長い。 デルタ関数に適用すると、以下のようになった。1回目は反転して0.7がかけられている。2回目以降はプラスのままで、x1.0,x0.7,0.7 ・・・という具合になっている。 ホワイトノイズに適用してみた。確かにcombに比べれば平坦でフラットに近いかもしれないが、遅延時間を短くするとやはりくし形に近くなってくる。多少はマシという程度で考えるといいかもしれない。 これで下準備はできたので、次回から、これらを組合わせてリバーブとして機能させていく。 ソースは以下の通り。 LADSPA all-pass filter /* namagi_allpass.c 2013.01.25 compile gcc -shared -o namagi_allpass.dll namagi_allpass.c -ID */ /***********************************************************/ #include &ltstdlib.h&gt #include &ltstring.h&gt #include &ltmath.h&gt #include "ladspa.h" #define MAX_DELAY 1000 #define SDL_DELAY 0 #define SDL_FEEDBAC

Reverbの自作1 comb filter

イメージ
リバーブを作ってみようかな 今までJavaやCなどでいくつかエフェクターを作っているが、リバーブはまだ作ったことがない。その理由はリバーブは複数のエフェクトで構成されていて、作る人によって実現方法はいくらでもあり得るから。こういうつかみ所がないエフェクターは狙いが明確でないと作る意味が分からなくなってしまう。複合的な要素が多いので、実験的に遊ぶには規模が大きくなってしまう問題もある。今回作ってみようかと思ったのは、やはり録音にはリバーブは欠かせないと思えたから。どうせなら基礎的なところから積み上げてみようかと思っている。まずは原点ともいえる Manfred Robert Schroeder が1962年に発表したアルゴリズムからスタート。そこから数ヶ月ぐらいかけてオリジナルをノロノロ作っていこうと思う。初期の実験段階ではLADSPAを使うが、最終的にはC言語による完全オリジナルにしようかと思っている。現在参考にしているのはARIのサイト。日本語でリバーブの原理について丁寧に書かれている。 http://www.ari-web.com comb filter (コムフィルタ) まずは基礎の基礎であるcomb filterの確認からしてみる。comb filterもいくつかタイプがあり、それぞれブロック図や効果も違うのだが、まずはARIにあるブロック図を採用してみる。中身はフィードバックが永久に巡回するIIR型で、ドライなし、フィードバック(gainあり)付きの単純なディレイ。 適用すると周波数特性がくし形になるので、comb filterと呼ばれている。LADSPAで作ったディレイを改造してARIと同じ仕様にしてAudacityで使えるプラグインにしてみる。 設定はディレイ100msecにして、フィードバック0.87にしてみた。デルタ関数にcomb filterをかけてインパルス応答を確認。パラメーターは上と同じ。Dryはなく、Wetだけが出力されるので、オリジナルのデルタ関数が100msec後にそのまま出力され、その後は100msecごとに0.87倍になって出力されている。 ホワイトノイズにcomb filterをかけてみるとギザギザの特性になるのを確認。ディレイタイムが短いとはっきりと出てくるので、設定はデ