投稿

2月, 2012の投稿を表示しています

Meadow 多機能エディタを試す

イメージ
Windows版 Emacsである超多機能エディタMeadowを使ってみることにした。インストールから環境設定までのメモ。ちなみに、この素晴らしい環境はすべて無料です。 以前Linuxを使っていたときにEmacsをいじったことはあるのだが、GUIに慣れた身としては、とっつきにくい印象だった。独特のコマンドによる操作と、独特のショートカットがそれで、MacやWindowsとは随分違う。慣れが必要。また見た目があまりにもシンプルで何をしていいのか分からないぐらい。スクロールバーもメニューも非表示にできる。でも機能はありえないぐらい詰め込める。シンプルな初期状態から、自分の好みで機能をトッピングすればいい。はじめから重装備ではないので、動作はキビキビしている。また、ちょっとした機能を追加したい場合は、自分でスクリプトを書いてしまえばいい。かゆいところに手がいくらでも届くエディタではあるが、それなりの知識が必要とされる。マニアックなエディタなので、誰にでも勧められるものではないが。 導入理由 C、C++のエディタ、コンパイラー、実行までをシームレスで行いたかったから。ちょっとした小さいプログラムの実験なので、巨大なIDEは不釣合いだし、エディタとコマンドプロンプトの組合わせも煩雑に感じたので、コンパクトにサクサクやるにはMeadowが適当に思えたのだ。 Javaを書くのもMeadowを使ってみようかと思う。最終的にはEclipseを使うが、ちょろちょろコンソールで実験するときはMeadowで十分。 あとLaTeXをMeadowから使うという目的もある。今まではWinShellを使っていたが、せっかくなので、Meadowに移行しようと思う。数式を書くのはやっぱりLaTeXがいい。 導入の理由はこんなところ。あとはカスタマイズが半端なくできる魅力は大きい。 Meadowのインストール http://www.meadowy.org/meadow/ Meadow 2.10 (ASAGAO) -- リリース版 一通り必要なものがセットになって、設定までしてくれるので、随分楽できる。ありがたいことだ。 インストーラー(348KB)をダウンロードして、必要なパッケージにチェックしてインストールする。今回はネットインスト

LaTeX

イメージ
インストール LaTeXは数式などをきれいに表示することができる組版処理ソフト。理数系の大学では論文用としてポピュラーなはず。 http://www.math.sci.hokudai.ac.jp/~abenori/soft/index.html TeXインストーラ3 0.81r7 インストーラーは上記のものを使わせてもらった。手動であれこれやっていたら、かなり時間がかかりそうなことを自動でやってくれるのでありがたい。それでもインストールはADSL環境で30分以上かかると思ったほうがいい。とにかくDLされる数が多く、容量がデカイのだ。 インストールはいくつかの箇所に行われる。GhostscriptとGSview以外はC:\w32texの中だと思われる。そのW32texのフォルダ容量は1.278GBにもなる。このデカさは、なんとかならないものか・・・。その中のフォルダは bin 88MB download 325MB dviout 6.2MB share 960MB という構成。downloadは削除しても問題ないが、しばらくは環境をいじくりまくるので、そのままにしておこう。インストールされたソフトは大きく分けて以下の通り。 W32Tex(LaTeX)  C:\w32tex\bin 87MB Path自動(C:\w32tex\bin;) 本体 主にtexで書かれたファイルをdviファイルに変換する。この中にある platexやdvipdfmxなど複数のプログラムを使う。コンパイルのときにC:\w32tex\shareの中も使う。また作られたdviファイルを元にPDFファイルにも変換する。texファイルからいきなりPDFファイルは作れない。 dviout  C:\w32tex\dviout 6.2MB dviファイルのビューア。これはMeadow上でtexファイルを編集しつつ、最終的なレイアウトや数式などを確認するのに必須のソフト。プレビューの質はアドビのPDFに比べて落ちるが、Meadow上でtexを編集しつつコンパイルするたびに、dvioutに表示されているその書類が自動更新される。使い勝手が抜群によく、texファイルを編集するときにはMeadowとセットで使うイメージ。 このプログラムは手動でPat

MusiXTeX

イメージ
Wiki を見ているとLaTeXのよさが見えてきて感心していたら、 MusiXTeX という楽譜作成を目的としたTeXを発見。どんなものかなとサンプルをコンパイルしたら、あれれ、出来てしまったよ。MusiXTeXの環境がすでに出来ていたのか?てっきりエラーが出ると思ったのに。出力結果は下のようなもので素晴らしい。でも上の文章を打つのと違って、これを打つのはかなり大変そうだな。それでも数式と楽譜を混在した文書を作るときには便利そうだ。すでに環境は出来ているのだから使うべきでしょう。覚えることが多すぎる・・・ サンプルのtexファイルと同じ階層にあったプラグインのstyファイルを移動する。 multicol.sty musixjdc.sty これを以下のディレクトリに入れることで、texファイルと同じ階層になくてもMusiXTeXを利用できるようになった。 C:\w32tex\share\texmf-local\tex\platex

高精度HPFをJavaで作る

イメージ
HPF(ハイパスフィルター)は何かと必須だと思えて、AudacityのHPFやらEQやらVSTを試してみる。HPFは違いが音として分かりにくい側面があるのだけど、ミックスなどでは確かに質が変化してくる。目立たないけどめちゃくちゃ重要じゃないか?HPFって。 AudacityのHPFはIIRのButterworthタイプで高速に処理できるのはよいのだが、位相が変化してしまう欠点があるのと、効き方がどうしてもゆるくなってしまう。 次にVSTのHPFもいくつか試してみるがAudacityとの相性の問題も出てしまう。VSTのFIRタイプだと音が遅れてしまうのが普通なので、使えないという判断。 Audacity標準のEqualizationをHPFとして使う手もあると思って試してみる。フィルタータイプはおそらくFrequency Sampling MethodでFFTを使って高速処理しているようだ。直線位相なので、位相問題もなく、かなり高精度という印象。タップ数は選択可能で最大で8191使える。これで効き方なども調整できる。なかなか素晴らしいHPFという結論。ただ微妙な誤差が出ているように思うのは設定値の誤差なのか、FFTの計算上のものなのか分からない。量子化ノイズ程度なので、測定しないと分からない範囲ではあるが。 ということで、勉強も含めて精度優先でDFTを使ったHPFを作ってみた。速度を無視すれば楽に精度を上げられる。はっきり言って実用性はあまりない。リアルタイム処理なんて絶対無理。ただ試したかっただけ。処理時間は数分の入力信号でも、数十秒から分単位で計算する・・・。FFTで高速処理させないと実用にはならないと判断。FFTは原理のところからちゃんと勉強して誤差を最小にしたいところ。実現するには、それなりに勉強が必要そう。 現状では遅いのだが、floatの音声ファイルの処理なら、バイナリーレベルでチェックしても誤差0となった。またFIRの遅れもリアルタイムではないので、レイテンシー0に細工した。あと窓関数の種類でHPFのかかり方が大きく変化するので、その辺りもいろいろ試した方がよさそう。hammingはカットがあまくなるのでHPFには向いてない。hanningは結構鋭くかかるという印象でHPFには適していると思う。自分でHPFに最適な窓関数

Phaser Javaで自作

イメージ
All-passフィルタを組み合わせて実際にエフェクタを作ってみようと思う。参考にしたエフェクタはAudacity標準のPhaserとVSTのClassic Phaserの2つ。一通り試してみたが、パラメータに不明な部分がある。StagesやLFOの速度、Feedbackなどはよいのだが、Depthの考え方にバラツキがあるように思えた。PhaserのDepthは一般的にLFOの揺れ幅を示すと思う。実際に加工してもそのように動作しているものが多そうだ。しかし、基準値が不明なのだ。Audacity標準Phaserでは、Depthが255だと0~約11kHzの間を回っているようだが、浅くしていくと、上限の周波数が低くなっていくようだ。Classic Phaserは動きが違っていて、常に0~21kHzまで効くようだ。DepthはノッチフィルターとしてのQの幅が変化、もしくはミックスの割合が変化。LFOの周期は一定。高域の特性はローパスフィルタで調整している。他のVSTのPhaserのパラメータを見ても、いろいろな表現があるようだし、それぞれの解釈で動作している。 wiki ではDepthはWetレベルを指している。自作は、いろいろな解釈があるDepthはやめて、LFOの範囲を周波数で設定することにした。例えば0~12kHzの間をLFOの周期で回るというイメージ。なるべく明確な設定が出来るようにしようと思う。 資料に関して 今まで作ってきたエフェクタの多くは、英語版Wikiなどに、それなりにまとまった情報があって、それを元に作ることが出来たりしたけど、今回は数式からそのまま作るようなことが出来なかった。原理の説明もほとんどなくて、ネットで見つけた情報にも明らかな間違いがあったり・・・ 特に自ら製作していない人の説明は当てにならない。結局、自分でプログラムを組みながら、様子を見るという方法をとった。原理的に大きな間違いはないと思うけども、解釈にズレはあるかもしれない。 Stagesの実験 ステージはAll-passフィルタのタップ数を指している。基本的には2タップ一組になっている。これらを共通のパラメーターのまま直列につなぐだけで、落ち込む周波数の谷の数が変化する。まずは各ステージにチャープ信号通して、原音とミックスしてみた。 2stages DryとWetを

All-pass filterの実験 Java

イメージ
オールパスフィルター(All-pass filter)ってちょっと不思議。振幅をいじらず、特定の周波数を中心に位相だけを反転するフィルター。何に使うの?という感じだが、フェイザーというエフェクトを調べていたら、オールパスフィルターを使っていたので、まずはこの原理を理解することから始めたいと思う。 AudacityのNyquistにもオールパスのコマンドはあった。 (allpass2 signal hz [q]) というもので、具体的には (allpass2 s 1000 1) こんな感じで使う。Effect メニューの Nyquist Prompt に以下のように入力するだけで実行できる。 sは選択範囲のサウンドで、1000は反転したい周波数。単位はHz。1はその影響する範囲。とりあえず、これを使って加工してみる。100Hzから15000Hzのチャープ信号を作る。拡大すると下のような波形で、低いサイン波から始まって、段々と周波数が上がっていくもの。 この信号に (allpass2 s 1000 1) コマンドを通す。出来たサウンドは何の変化も感じられない。聴いても同じようにしか聴こえない。でも拡大してみると、ちゃんと1000Hzで位相が反転しているのが分かる。 さらにオリジナルのチャープ信号と合成すると明らかになる。1000Hzは位相が反転しているので、打ち消しあって、振幅は0になる。他の周波数は位相が揃っているので、2倍の振幅になっている。 ということで、オールパスフィルタのイメージがつかめたところで、数式から追ってみることにする。最終的にはIIRの2次で実現してみようかと思う。ブロック図はこれを採用する。 オールパスの数式を探してみる。WIKIだと、アナログに関して書かれているが、ちょっとこれからの変換はイメージできない。もう少し調べると、Robert Bristow-Johnsonという人が書いた 「Cookbook formulae for audio EQ biquad filter coefficients」 を利用している人が多いようだ。確かに2次のbiquadが一通り書かれているので、そのまま使えば簡単に実現できるようだ。そのままコピーも面白くないので、自分で計算することにした。でも下記の式だけは参考にさせてもらっ

Modulator (Chorus&Flanger) をJavaで自作

イメージ
先週はディレイを作ったので、その応用となるコーラスでもプログラミングしようかと思う。コーラスは名前の通り、多重演奏的な音響効果が得られるもの。個人的には使いそうもないけど、モジュレーション系のエフェクトの勉強はしておきたいので、設計的興味ということで、チャレンジしてみようと思う。 予備知識もあまりないので、 ARI のホームページを参考に考えてみる。原理の説明は少しあるのだが、具体的な部分はないので、後は適当に作ろうかと思う。分かったことは複数のディレイを作って、ディレイタイムを共通の5~30msec程度に設定。そして取り出し位置を変調により変化させる。ディレイが3つであれば、開始位置を2pi/3ラジアンずらして合成するとよい。またフィードバックはない。これ以上の情報は調べていないので、以下のことは間違っているかもしれない。勝手な想像でプログラムを組んでます。 変調と言われても、あまりピンとこないので、下図のようにイメージしてみた。最近あまり見かけないがカセットテープが分かりやすいと思えた。まず2つの再生ヘッドがある。DrySoundという再生ヘッドは通常の音を再生する。もうひとつのDelayTimeの再生ヘッドはDrySoundよりも少し遅れて再生する。このヘッドが-1~1の間を滑らかに行ったり来たりする。+1をどこにするのか不明だが、最大でもDryの再生ヘッド位置より進むことはあり得ないので、この位置を限界として+1とした。その移動スピードは0.1~10Hzの範囲で往復。動きはサイン波を使い、振幅値が移動地点になる。 この再生ヘッドの移動で、音はどう変化するのだろうか。テープの進行方向にDelayTime再生ヘッドが移動するときはテープ本来のスピードよりも、ゆっくりになるので、音程は下がる。逆方向に移動するときはスピードが速くなるので、音程が上がる。Dry音と同じピッチは+1と、-1のときで、サイン波を微分して0の位置になったとき。つまり再生ヘッドが一時的に停止した状態のとき。こういう仕掛けで、音程が微妙に上がったり下がったりする。このDelayTime再生ヘッドが3つあって、それぞれがDelayTime位置を0として、0、2pi/3、4pi/3ラジアンの位置からスタートする。フリーの数理処理ソフトMaximaでグラフにすると、こんな感じになる

DelayをJavaで自作

イメージ
以前AudacityのNyquistでもディレイを作ったけど、あれはスクリプトで、あらかじめ用意された命令を組合わせたに過ぎない。今回はJavaでローレベルのディレイを作って、原理を体感しようと思う。ディレイの基本については こちらのページ 。 個人的に必要と思っている主な仕様 音声ファイルをバイナリーで読み込んで、リングバッファに貯めて、原音と任意の遅延タップをミックスして、Wavファイルとして出力するだけ。 ステレオ処理 左右独立のディレイタイムとディケイの設定 ディレイタイムは2秒あれば十分 サンプル単位とmsecとの切替 LPF&HPF IIR 2pole カットオフ周波数の調整 先週作ったIIRを実装する フィードバック -1.0~1.0 位相の反転可能 32bit floatのみ対応(個人的に他は必要ないので) サンプリング周波数44.1kHz(48kHz,96kHzも可) 左右の信号が混じる処理もしてみたい。これを発展させれば左右に飛び交う効果も作れるので。 上記を実現するためのブロック図を描いてみた。今回のディレイ規模なら、いきなりプログラムでも問題ないのだけど、今後、機能を追加したり、差し替えたりすることを考慮すると、ブロック図にした方が確実。これを元にプログラミングをしてみる。 HPFはWETに入ってきたら1回だけ通過させる。LPFは出力のたびに通過するので、FBがあれば、通るたびに音はこもっていく仕掛け。 プログラミング開始 悪い癖で、オブジェクト指向を無視して、いきなり作ってしまった・・・。小さいプログラムなので、さらっと出来てしまう。後々改造しやすいように作りたいところだが、まだ経験不足。同じような計算式があちこちにある・・・  ついでにマルチタップ化を試してみたら、これは必要なさそうだ。マルチタップは設定が微妙で使い方が難しい。リバーブの初期反射などを作るときには良いかもしれないけど、手動で設定するには向いていない。 フォーマットは個人用ということで、あれこれ対応させる必要もなく、ステレオのwavファイル32bit-float専用。モノラルの場合は、左右同じ設定であれば処理される。左右の設定を変えると、でたらめになる。サンプリング周波数は基本的に44.1kHzでテストし