coding, photo, plant and demo

*JSでヴァイオリンを鳴らす

synthesizer 20130414 011410
前回、 三味線 ぽいものや ブラス をJSで作ってみたので、
今回は 擦弦楽器 をやってみよう。

いや、やってみようと言っても、単にSTKのコードを持ってくるだけで、
大したことをするわけじゃないんだけど。

http://cygx.mydns.jp/tracker/?id=Bowed
鍵盤をクリックで音が鳴ります。
Y方向にドラッグするとビブラート、X方向にドラッグすると弾く弦の位置が変わります。
多分、現実にはありえないくらいキーやパラメータが変えれてしまうため、
おかしな音がなるかと思いますがご愛嬌ということで。

擦弦楽器のシミュレーションについては、
https://ccrma.stanford.edu/~jos/pasp/Bowed_Strings.html
に書いてあります。
その前に、そもそもバイオリンとかの仕組みを知らない方は楽器解体全書をどうぞ。

で、仕組みについて自分なりに分かったことを簡単にメモ。

バイオリンを見てみると、まず弦(String)があります。
そこの適当な位置を弓で擦ります。すると弦が振動します。
弦の両端は先端のナット(Nut)あるいは指と、駒(Bridge)で固定されており、そこで反射が起きます。
さらに駒から本体に音が伝わり、そこで共振した音が外に主に出てきます。

これが大雑把な構造です。次にシミュレートの方法を具体的に書きます。

弦は前回前々回と同様にDelayLineでシミュレートしますが、
ナットへ向かって反射する部分と、駒へ向かう部分があるので2つ必要です。

それぞれ反射で減衰等があるわけですが、ナットは単なる反射に近似して問題なし。
指による反射はようわかりませんので、ナットと同じ扱いにしています。

駒の反射による損失はほぼ1次で近似できます。
(正確には本体と繋がるための駆動点インピーダンスがあるから、追加の損失が云々あるみたいだけど、よく分かりません)

擦るので、弦への力の与え方も弾くよりも面倒になります。
弦に与える力は、弦の振動と弓の速度の差で決まるわけですが、伝わる力に上限と下限があるらしく、つまり速さに比例して力が伝わるわけではないようです。
上限はともかく、下限の物理的な理由が僕にはよく分かりませんでしたが、コード上は単に上限下限を与えるだけになっています。

このあたり、JSで書いてあるので簡単にパラメータを変えて試せるところが素敵です。
(例えば、BowTableのminOutputが下限なので、そこを変えてApplyを押せば変更後の音になります。変えるとディストーションギターみたいな音も出せます。バイオリンのつもりなのに!)

最後に、本体がどのように共振するかが楽器の質を大きく決めるようです。
このコードでは6個の双二次フィルタを使って、本体の特性を定めています。これがないと、素の弦楽器ですのでノコギリ波に毛が生えたような波形になってしまいます。(これも最終段のoutの部分を書き換えればすぐ試せます)

例えばギターだとこんな風に本体が共振している、ってことも分かっているようです。良い楽器を作るのは職人芸ということが物理モデルを通して分かりますね。


この本、欲しすぎるけど興味本位で買うにはちょっと高い気もするなー、
うーん、と迷いつつも翻訳の単行本なら1万切ってるし買ってみる事にしました。
しばらくは池波正太郎を我慢して、これを読みつつ会社に行くことになりそう。


13.12.08 10:29 Y.F.
初めまして。
私は、FMシンセ講座のY.F.と申します。
FM音源を学ぶの項では、私のサイトを紹介していただきありがとうございます。
物理モデル音源で検索して、このページにたどり着きました。
素晴らしい研究をなさっていますね。JS Synthesizerの音源部分の完成度はかなりの物があると思います。
私のページでもJS Synthesizerを紹介したいのですが、許可をしていただけませんか?
http://fmsynth.music.coocan.jp/column/column9.html
適切なパラメーターを与えれば、大変身すると思いますよ。
では、失礼いたします。
コメントする