投稿

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で自作

イメージ
先週はディレイを作ったので、その応用となるコーラスでもプログラミングしようかと思う。コーラスは名前の通り、多重演奏的な音響効果が得られるもの。個人的には使いそうもないけど、モジュレーション系のエフェクトの勉強はしておきたいので、設計的興味ということで、チャレンジしてみようと思う。 ブロック図 LFOから3つの初期角度を取り出して利用するが、それぞれの値を変えられるようにしようと思う。また左右独立LFOとした。問題は変調方法。たぶんいろいろな方法があるのだろうけど、単純にサンプルレートに応じて、サイン波を出すことにした。そのY軸の値がディレイタイムの変調となる。0の場合は、設定したディレイタイムとなり、1の場合はドライと同一ポイントとなる。値は、ほとんどの場合、サンプルとサンプルの間を示すことになるので、前後のサンプルの値を抜き出して補間する必要がある。とりあえず前後2点のサンプルを直線で結んで関数を導き、そこから算出した。もう少し凝った補間でもいいのだけど、音を聴いたら、これで十分な気がした。フランジャーもコーラスと同じような内容なので、今回同居させてみた。違いは設定範囲とフィードバックがあることぐらいかな? ということでフィードバックをつけた。もはやコーラスとフランジャーの融合なので、名前はモジュレーターへ変更。 自分で使うレベルなら、プログラムの中身はあっさり完成。やっぱり時間のかかっているのはインターフェイスまわり。面倒だったので安全性はあまり考慮していない。おかしな値を入れても、強引に計算してしまう。まぁ実験用なら、その方が限界が見えてきて理解が深まるというもの。作ってみた感想は、設定項目が意外と多いなぁ・・・。 Download NamagiMod32bitF.jar 29KB 簡単な説明 スタンドアローンでwavファイルを加工するエフェクト。ダウンロードしたjarファイルをダブルクリックで上記ウィンドウが開く(要Java)。そして32bit floatのwavファイルをドラッグ&ドロップして認識させる。32bit float以外は使えない。そして各パラメータの設定をして、Modulationボタンを押すと、ファイルと同じ階層に新たに..._mod.wavが作られる。これがエフェクトが適用されたwavファイルとなる。オ

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でテストし