レガートをどうするか

(2008/02/13)

 現時点 (2008/02/13) で、LinuxSampler にはレガート機能が実装されていない。モノモードは実装されているので代用できるかと思ったのだが、あまりうまくいかない。

モノモードの動作

 2つ目のノートがオンになった瞬間、前の音が強制的に切られて、同時に新しい音が立ち上がる。通常のノートオフでは、音が切れたあともリリースタイム分だけ音が残るのだが、モノモードではリリースを残さないようになっているので、そこで音がぷつっと切れてしまう。この実装では2つの音の間にどうしても切れ目が残ってしまう。どうもモノモードって多くの音源でこういう実装がされているような気がするんだけど、どういう使い道が想定されているんでしょうかね。

 昔の音源でよく使った技は、レガートの2つ目以降の音はアタックタイムを大きくとって立ち上がりのアタック音を消し、さらに直前の音と少し重ねて切れ目をなくすという手だった。もちろん音を重ねるわけだから、モノモードではなくてポリモードを使う。LinuxSampler ではアタックタイムを変更する MIDI メッセージは無いので、gig フォーマットの特徴であるディメンジョンを使って代用することになる。具体的には、何か適当なコントローラ(CC #4 = Foot controller など)で制御されるディメンジョンを1つ作って、CC #4 >= 64 の時に選択される音ではアタックタイムを長くする。gig フォーマットではさらに、サンプル再生の開始点を指定できる(0-2000 の範囲だが)ので、アタック音が終わったあたりから再生するようにしてもよい。

古典的レガートテクニック

 このテクニックの問題点は、どうしても2つの音が重なって聞こえること(重ねているのだから当然だが)と、音の継ぎ目で少しふくらんでしまうこと。アタックタイムとリリースタイムをうまく設定して、重ねる長さを最適化してやればよいのだが、MIDI 側でそれを調整するのは意外に大変な作業になる。もちろんリアルタイム演奏ではほぼ不可能だし、シーケンサを使っていても、重なりの長さを調整するのは意外に難しい。シーケンサは通常拍を単位に MIDI イベントの時刻を管理していて、絶対時間での扱いはあまり考えられていないためである。まあ、うちではシーケンサも自作しておりますのでシーケンサ側で解決することも一応は可能なのでありますが、どうもこの問題は音源側で解決するのが本筋のような気がする。

 そこで、LinuxSampler 本体のモノモード処理部分に手を加えて、前の音を強制的に切る代わりに、決まった時間でクロスフェードをかけるようにしてみた。 クロスフェードを使ったモノモード

 クロスフェードの時間をいろいろ変えて実験してみたところ、50 ミリ秒前後ならまあまあレガートらしく聞こえる。声楽的な完全なレガートではないが、モノモードや古典的テクニックよりはかなりマシになった。もちろん徹底的にリアリスティックな音を追求したい場合はこれでは不満だろうから、そのうち VSL の「パフォーマンスツール」のクローンを作る人が出てくるだろうけど(すでに LinuxSampler ML ではそういう話題が出てはいる)、それはたぶん僕ではないと思う。だってねえ、全部の音程のレガート演奏をサンプリングして、音の切れ目ごとにその音程のレガート音を挿入するんでしょ。なんかあまりにも力技過ぎてなじめないんだな。

 一応今回作ったパッチを公開しておきます。(linuxsampler_legato.patch, 16 kB)。2008/2/13 現在の CVS HEAD 用です。もしかしたら本体に採用してもらえるかも知れないしそうならないかも知れない。