2017年12月7日木曜日

Raspberry Pi で自動演奏システムを作ってみた話

この記事は 2017 年雑スラ Advent Calendar 7 日目の記事です。

去年の話ですが、ギターのエフェクタとして BOSS SY-300 を買いました。
かなりでかい
これは本来ギターシンセというやつで、その中でもピックアップ(弦の振動を拾うコイル)を特殊なものにしなくても使えるもので、且つ(たぶん処理によるけど)デジタル信号処理に頼らないので FFT など周波数変換に起因するディレイも(ほとんど)ないというものです。
入力波形に対してアナログシンセっぽいパラメータを設定しいろんな音を鳴らせるらしいです。

詳しいことはこちらをどうぞ

そしてこれは素朴なマルチエフェクタとしても利用できます。
マルチとして見ると、エフェクタとパッチの内部の結線(微妙に嘘・大げさ・まぎらわしい書き方でした。詳細は追記)をスイッチひとつで劇的に換えられるベリー賢いマルチエフェクタであります。

複数のエフェクタをまとめて制御するのはもちろん、ループの有無、出力のチャンネル (Main/Sub) まで選択できるわけです。
ディストーションのループを切って後段の空間系を入れて……、と 2 アクションで済むとしても既存システムでやろうとしたら足元は意外と忙しいことになり、歌まで歌っているともう「本番で気が回らなかったら諦めよう」と諦観さえ抱くことになりますよ。
これを買ってループセレクタは完全に捨てました。
下の図は同じバンクの設定の入力と出力で、 OSC1 とスルーを Comp+Dist から Main に出していますが、これを EXP ペダル一つで OSC3 -> OD -> CHO -> REV -> Sub 出力へ切り替えることができます。

入力系:OSCがオシレータ(OSC1 のみが有効な状態)
出力系: OSC1とTHRU以外SUB出力

 ……ちょっとこいつで一席遊んでみようという気になったので、所属軽音部のライブに混ぜてもらって、珍しくソロで出演することにしたのですがやっぱりソロでは音が薄い。
残念ながら当方、テクニックで 20 分間を持たせるタイプのギターは弾けない。ずっとバッキングだけしていたい。そんな気持ち。
そんなこんなで、リズム隊をラズパイ君にサポートしてもらうことにしました。

ラズパイ is



言わずと知れた Raspberry Pi は Linux がうごく ARM ボードです。
Linux で動く ALSA を筆頭に、サウンドアプリケーションは大体動くはずです。
音自体は USB オーディオで出すつもりでいたので、ぶっちゃけ USB のドライバがあるコンピュータならなんでもよかったのですが、今回ラズパイにこだわった理由は簡単に MIDI で制御できることです。
SY-300 は(というか大体の MIDI がついているマルチエフェクタならば)操作を信号として MIDI 出力に出すことができます。 MIDI は、決して高速大容量の規格ではないけれど、距離やノイズによるトラブルが少なく、この分野では大人気の制御信号であります。

電源入れたら余分な操作を一切せず起動し、あとは足元で操作が完結するプレイアビリティ。今回はそこに全振りすることにしました。

要するにこっちのタイミングでラグ無しにスタートできて、スイッチ入れてからマイクの前まで戻る必要がないとかそういうことです。
 他にも、プレイ中に「あー、スリープしちゃった。ログインしなきゃ」みたいな事故はもちろん、システムがよぶんな音を出さないことや、目立つ画面がないことも重要なポイントであります。
人によってはノート PC をステージに持ち込んで、音作りやプレイに活用しているのですが、当方一人でステージ中央にいる都合上、ノート PC に向かって操作するのもパフォーマンス的に居心地の悪いものがあります。画面のバックライトで顔が照らされるのも勘弁して欲しい感じであります。

その点では今回組み上げたシステムは最高のチョイスとなりました。

MIDI 制御

SY-300 ではプログラムバンクの切り替えの信号を並列して MIDI に出力できます。
これをラズパイ側は USB の MIDI インターフェイス、 Roland UM-ONE で受けます(UM-ONE でもいいですが、不要でした。追記参照)。
曲ごとにバンクを作っておけば、対応するトラック(wav ファイル)をラズパイ側でシークできます。

ラズパイ上では、 MIDI 信号を解釈して対応 PCM を読み込んで ALSA (Linux のサウンド API)に出力するプログラムを常時動かしています。
これはイチから作りました。
midiplay という名称ですが MIDI は play しません。 MIDI で PCM を play します。
アンプで増幅した音をそれなりのスピーカーで鳴らすので、まかりまちがっても変な PCM が出ることだけは絶対に避けなければいけません。ですので音周りではあまり冒険せず、結果を完全にコントロールできる技術でのみ構成される必要があります。

サーバーとして必要な fork などは行っていませんのでデフォルトでログインするユーザーの起動スクリプトに書いておくという無精をしております。
MIDI 信号のパースも素朴な FSM を作ってでっち上げております。
その気になれば SY-300 からのテンポの入力、ラズパイからの音色制御も可能ですが、今回はそこまでしませんでした。


サウンド部

出力側 API は ALSA なので対応するドライバをロードした USB オーディオを利用します。
ここでは Cakewalk(ROLAND) UA-25EX を使いました。 MIDI と Balanced 出力が L/R あり、 Linux で動作するもので選びました。
CS3 の箱でいい子にしているラズパイと渦中のCakewalk
ASIO の対応がいまいち不明だったので標準的な PCM 48KHz 16bit を利用します。
ひとつ注意が必要なのは、ラズパイの標準 AC アダプタです。これではバスパワー駆動の USB オーディオを維持できなかったので、強い AC アダプタに替えてあります。
標準のはせいぜいマウスとキーボードでおしまいの電力量ですんで、ラズパイ使いの人は大容量のものを持っておいて損はないと思います。
ラズパイはとても小さく, AC アダプタと一緒にしても BOSS ペダルの箱にすっぽり収まってしまう良い子です。

ラグ無しで、とは申しましたが残念ながらラグはございます。
スイッチを踏むとロードを開始し、ある程度サンプルを読んだところで READY になります。足を離すと再生を開始するようにしたことで予想しにくい IO のディレイをなくしましたが、 PCM のバッファが潤沢にありましてこの分はどうしてもディレイになります。
これを十ミリオーダーまで削ろうとしたら初期化でエラーになってうまく行かなかったので、 150ms のラグを受け入れるという形で乗り切りました。
150ms くらい……と思ったのですが、実際試してみると微妙に間が悪い。 若干不安があったのでカウントを入れるなどしたのですが、あまりかっこよくありませんね。

まぁそんなわけで、コレを使うと以下の動画のように超カッコいい感じになります。

できあがり


<ここに超かっこいい動画を貼る>

すいません。動画なんか間に合いませんでした。ごめんなさい。
ここで尊敬してやまない偉大なベーシスト, J.K.Freaks 様の華麗なプレイ動画を貼ろうと思ったのですが、アドベントカレンダーの性質上、職場などでご覧の方も多いかと思って思いとどまりました。
想像力で補ってください。

本番ではやっぱとにかくドラムが聞こえなくってダメでした。
PCM と L/R にドラムとベースをそれぞれ寄せていたのでバランスで調整可能なはずでしたが、 PA もおらんイベントなのでぶっつけ本番で調整したらうまくいきませんでした。
スタジオでは適当にやっても聞こえてたんだけどなー。

PA 卓をいじっていたらバランス調整に手間取りすぎてセッティングも完全じゃなかったので、せっかくクリーンを JC に、歪み系をマーシャルに出し分けるように設定していたのも本番では使いませんでした。

宿題を残す結果になったので、そのうちリベンジの機会を待つことにします。

Coming Up Next...

明日 8 日目の担当は enpel さんです。
ビシっと決めてくれるはずと思ってます。


追記:
久々に起動して試してみたら、ちょっと違ってました。

パッチ間の接続は、ペダルで制御できますが、接続の種類自体まで変えられませんでした。ミキサーの A, B 入力ゲインを変えるという形か、 OSC1-3 の入力を ON/OFF するかという方法で実現していました。
ペダルの動きは多義的にできるので、OSC1 を OFF, OSC2 を ON を同時に行ってスイッチするわけです。

midiplay は MIDI インターフェイス UM-ONE があればそれを使用しますが、なくても UA-25EX の MIDI インターフェイスを利用できるようにしていたのを忘れてました。 SY-300 の MIDI OUT を UA-25EX の MIDI IN に繋いでおけばオールオッケーです。

0 件のコメント:

コメントを投稿