投稿

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

IIR デジタルフィルタ Javaで自作

イメージ
少ないタップ数で実現できる IIR (Infinite impulse response 無限インパルス応答)デジタルフィルタ。LPF/HPF(ローパス/ハイパスフィルタ)でも試しに作ってみようかと思う。図書館で借りた本を頼りにプログラムまで作ることにしてみた。 これまでに作ったFIRはタップ数が多く計算量が増えてしまうのに対して、IIRは極端にタップ数が少なく1~8程度。無限のフィードバックを利用することで少ないタップを実現している。欠点は位相のズレが出てしまうことと、条件によっては不安定になりやすいことなど。AudacityのLPF/HPFはIIRのButterworthを使っているので、いろいろ試したら欠点はやはり位相だと思えた。元の波形が結構大きく変化してしまう。FIRで同じようにLPF/HPFを作ると、波形の乱れはなかった。その差は歴然。ただIIRは計算量が少ないので、ディレイやリバーブ内のLPFとして使う場合には都合がよい。 IIRは元々アナログ回路用のフィルタなので、アナログ回路設計を雛形にしてデジタルに変換するという設計が基本のようだ。IIRで作れる有名なフィルタは Butterworth、Chebyshev、楕円フィルタなどがある。実際使いそうなフィルタは平坦な特性のButterworthぐらいなので、これだけ試すことにした。基本となるブロック図は以下のようなもの。図は4次のブロック図。このan、bnに係数を入れることでフィルタになる。anはフィードバックになる。さらにカスケードするなどの改良型もある。 内容を理解しようとしたら、結構難しいかも。まずは下の式から次数ごとのバターワースのプロトタイプというものを作る。 とりあえず1次から4次までのプロトタイプは数式でこのようになった。 1次 2次 3次 4次 次に求めたい特性に応じて、どの次数のButterworthを使えばよいかを計算する。Butterworthはカットオフ周波数が-3dBになるように計算されている。単純に次数が増えれば急な傾斜を実現できる。軽く高域を削る程度なら1次でよいこともあるし、完全なカットをしたいなら4次でも不十分になる。ちなみにAudacityでは1次、2次、4次、6次、8次のButterworth HPF/LPFが用意されている。

周波数から音名とcent表示する JavaScript

周波数から音程をチェックするためのJavaScriptを書いてみた。個人的にたまにやりたくなる計算。以前は関数電卓にプログラムを書いて実行していた。でも、たまにしか使わないので、実行方法とか忘れてしまうのが、たまにきず。そこでJavaScriptの出番。この手の関数電卓規模の計算ってJavaScriptと相性いいかも。簡単に書けて実用的。 周波数を入力すると、その音がABCDEFGの音名で表示される。 Calib. A Hz Frequency Hz Interval Note Cent 簡単な説明 Calib. A は基準となる周波数。普通は440Hz。 Frequency ここに音名を知りたい周波数を入力。 calculate ボタン。これを押すと計算される。 Interval 基準周波数からの音程差を表示。半音が1となる。1オクターブは12となる。 Note 音名を表示。 Cent セントは半音を1/100にした単位。上の音名に対してプラスマイナス50セントの範囲でズレを表示。0に近ければジャストに近い。 下は参考までに、基準音440Hzのときのギターの開放弦の周波数。 1弦開放 E 329.627Hz 2弦開放 B 246.941Hz 3弦開放 G 195.997Hz 4弦開放 D 146.832Hz 5弦開放 A 110.000Hz 6弦開放 E 82.406Hz 中学生ぐらいから学ぶフーリエ変換 目次

FFT 基礎実験 Java

イメージ
FFT(Fast Fourier Transform)高速フーリエ変換も作ってみる。昨日の 音声ファイル用DFT の一部を改造してFFTを組み込む。機能ごとにクラスをきれいに分けて作ると簡単に組み込むことができることを実感。 FFTのアルゴリズムはコンピュータ処理に適した巧妙なしくみになっている。バタフライ演算で計算を減らす工夫がされている。データが多くなればなるほど、DFTとの差が出てくる。DFTだとデータ数Nとすると、N^2の乗算が必要なのに対して、FFTはN log 2 N/2で済むようだ。少ないサンプル数で乗算を数えてみたら、計算式通りではないが、まぁ近い数かな。同じ計算で符号違いも多いので、うまく最適化すれば、より高速になる。実際の実用レベルのFFTではそのように作られているようだ。とりあえず理屈どおりに組み込んで試してみると、DFTに比べて、圧倒的な処理スピードは体感できた。これなら1万サンプル以上でも苦ではない。 音声ファイルにおけるフーリエ変換の細々したことは こっちのDFTページ を見てください。とりあえず結果だけは下のようになった。 sin波1000, 5000, 10000,15000,20000Hzを合成した波形をFFTにかけてみる。出力ファイルをLibreOfficeのCalcでグラフ化。出力を確認。ピンクはdB表示でグリーンはリニア表示。 sound programming 目次はこちら