FLAGS

MENU

NOTICE

2018年1月12日金曜日

アフタータッチでソフトシンセ Yoshimi のエフェクトをコントロールする (oka01-pgbykiposvhoeegt)

Linux用の高性能シンセサイザー YOSHIMI は、MIDIでエフェクトのパラメーターをコントロールするという素晴らしい機能がある。もしも貴方が NRPN ( Non Registered Parameter Number )を出力するコントローラー(Novation のImpulse など)を持っていたら、それを使ってYOSHIMIの音声をダイナミックに操作することができる。これを使えば、MOOG並の迫力のシンセサウンドをLinuxで再現することができる。

だが机上の面積を大きく専有するつまみのたくさんついたキーボードを使わなくても、ピッチベンドやアフタータッチなどを使ってこれを操作できる筈だ。そのためにはひと工夫必要だ。ちょっと作ってみた。



普通、Novationなどが発売しているツマミのたくさんついたキーボードは、NRPNというMIDIの信号を使って、エフェクトのパラメーターをセットしているらしい。

NRPNというのは、ピッチベンドやノートオン・ノートオフなどの標準的なMIDIの信号以外の信号のことをいう。 MIDIは1980年代からあるとても古い規格だが、当時から将来の拡張性を考え、信号に色々な拡張コマンドが作りこまれている。そのひとつが NRPNだ。

Yoshimi には、NRPNを決まった順番で受け取ると、それをYoshimiのエフェクト値にセットするような仕様がある。

これを何らかの方法でYoshimiに送り込んでやればよいのだが、。一番簡単な方法は、恐らく、つまみのついたキーボードをPCにつないで、それを回すことだ。これをシーケンサーに録音すれば、自動化することもできる筈だ。

だがつまみのついたキーボードを持っていない場合、シーケンサー上でそれを送り出すようにプログラミングしてやらなければならない。だが、Linuxには柔軟にNRPNを送り出すようにプログラムできる機能を持ったシーケンサーがない。

Linuxは、自由に使えて、とても堅牢で柔軟なOSだが、商用OSに比べるとどうしてもソフトウェアが貧弱で苦労することが多い。

先日僕は実に10年ぶりにWindowsを触ってみたのだが、動いているのか動いていないのかはっきりしないふにゃふにゃした使用感は、10年前と何も変わらず、Windowsにはもう戻れない体になってしまったことを思った。

AppImage や Snappy の普及でLinuxのソフトウェア充実にはずみがついてくれれば嬉しいのだが、それはしばらくは難しそうだ。

そこで考えたのは、MIDIパッチベイをつかって、既存の信号(ピッチベンドなど)を NRPNに置き換えて送り出してやればよいだろう…ということだ。

これは簡単にできそうな気がしたが、2018年現在、Ubuntuにはこれを簡単に実現する パッチベイ・ソフトがなかった。かなりの時間をかけて探したが、手軽なパッチベイ・ソフトは全く見つからななかった。

そんななか mididings というソフトを見つけた。これはパッチベイではあるのだが、どちらかというと python をつかった パッチベイを実現するスクリプティング・フレームワークとでもいうべきシステムで、お手軽とは全くの対極に位置するようなシステムだった。

調べてみると、これを使うことで、受け取ったMIDI信号を、リアルタイムでとても柔軟に変更できることがわかった。若干面倒くさいが、これをつかってプログラムを組んでみた。

以下のプログラムを使うと、アフタータッチで yoshimi のインサートエフェクトの1番目のエフェクタのパラメータを操作することができる。

アフタータッチは、ポリフォニック(和音の時、押されている全てのキーの圧力をMIDI信号として送り出す)なので、それをEQなどの単一の値に割り当てるときは、ちょっと工夫が必要だ。今回は、押された全てのキーの圧力を平均して送り出すようにコーディングしてみた。

from mididings import *
import mididings.event as _event

class NRPNModifier(object):
    def __init__( self ):
        self.notes = {}

    def __call__(self, ev):
        print ev
        print ev.type

        if ev.type == NOTEON :
            self.notes[ ev.note ] = 0
            return ev

        elif ev.type == NOTEOFF :
            del self.notes[ ev.note ]
            return ev

        elif ev.type == POLY_AFTERTOUCH :
            # print 'note' + str( ev.note )
            self.notes[ ev.note ] = ev.value

            avg = int( sum( self.notes.values() ) / len( self.notes ) )
            print avg

            return [
                _event.CtrlEvent(ev.port, ev.channel, 0x63, 8),
                _event.CtrlEvent(ev.port, ev.channel, 0x62, 0),
                _event.CtrlEvent(ev.port, ev.channel, 0x06, 11),
                _event.CtrlEvent(ev.port, ev.channel, 0x26, avg )
            ]
        else:
            return ev

if __name__ == '__main__':
    import sys
    run( Process( NRPNModifier() ) )

これは基本的に、ただの python で書かれたプログラムなので、このテキストを何らかのファイルに保存した後で
> python [ファイル名]
と実行すればよい。 実行には mididing が必要だ。もしubuntuを利用なら
sudo apt update
sudo apt install mididings
を実行して、インストールしておく。

実行すると midiポートが作成されるので、これを patchage などで 必要なデバイスに接続する。


うまくいかなかったら、midisnoop などをつかってデバッグする。


このプログラムの著者は、このプログラムの再配布をライセンス条項 WTFPL v1 によって許可する。

WTFPL




参照:
https://groups.google.com/forum/#!topic/mididings/t8V5MItcfoc

著者オカアツシについて


小学生の頃からプログラミングが趣味。都内でジャズギタリストからプログラマに転身。プログラマをやめて、ラオス国境周辺で語学武者修行。12年に渡る辺境での放浪生活から生還し、都内でジャズギタリストとしてリベンジ中 ─── そういう僕が気付いた『言語と音楽』の不思議な関係についてご紹介します。

特技は、即興演奏・作曲家・エッセイスト・言語研究者・コンピュータープログラマ・話せる言語・ラオ語・タイ語(東北イサーン方言)・中国語・英語/使えるシステム/PostgreSQL 15 / React.js / Node.js 等々




おかあつ日記メニューバーをリセット


©2022 オカアツシ ALL RIGHT RESERVED