csoundとRosegardenを使って
結局目的を再度明らかにする、でも今のところできないのが結論。。。
------------- (1)record ------------- |MIDI keyboad | ---------> | Rosegarden | ------------- ------------- ------------- | | note,pichbend,CC# | | | | (2) edit&play file | (3) export | v | score file | (1)realtime ------------- | -----------------> | csound | <------------ ------------- | ------> (4) audio file
- 最初に外部の楽器で弾きそれをRosegardenでその内容を記録しながらcsoundで音を出しながら確認する(ただし、あまり重い楽器だとここで音が出ないかもしれないな。。)
- Rosegardenで記録したものを編集してそれをcsoundに食わせて発音させる。
- スコアファイルをイクスポートしてcsoundでレンダリングしファイナライズ。
で、問題点を後述
実際これを目指して色々試した。現時点での到達点と問題点を記載しておく(2008/12/31)
(2)realtime
ここからが問題。realtimeでcsoundにMIDIを食わせると書いてあるが、実際やりたいことは「各チャネルのNOTEON、ピッチベンド、CC#を別々の楽器にアサインしたい」ということである。そうしないと発音用の楽器を外部楽器からグローバル変数を使って制御することができない。
要点はmassignで特定のチャネルを特定の楽器にアサインできるが、特定チャネルのNoteONだけを特定楽器に、特定チャネルのピッチベンドだけを特定楽器に、特定チャネルのCC#だけを特定楽器にアサイン、というのができない。mpbassignとかmccassign、mnoteassignというOPCODEを作ればいいんだろうか?ちょっと判断ロジックを入れるだけなのでハックは出来そうな気がするが。もう一度悩むとこれは問題ではないのだろうか?(そういうことがよくある)
問題解決案を整理すると
- msbassign,mccasign, mnoteassignのOPCODEを開発する
- 利点:一番やりたいことに近い
- 問題:そんなOPCODEを作る意味が本当にあるのか?
- 一つの楽器で特定MIDI信号を受けた後に、if文でひたすら分岐させて((csoundにはcase文がないので..)チャネル内部に発音用楽器、制御用楽器のロジックを入れてしまう。でもやっぱり、OOps/midiopt.cを見るとかなり難しい感じがする。
- 利点:オーケストラ、スコアの領域で済ませられる
- 問題:センスが悪辣な感じがする。
- 一つの楽器で特定チャネルのMIDI信号を受けた後に、noteイベントを発生させて信号分配を行う中間楽器をチャネル毎に作る
- 利点:オーケストラ、スコアの領域で済ませられる
- 問題:いちいちそんな楽器を作るのは、スマートじゃない。でも、CC#を取得するOPCODEを並べてみても、どのCC#が反応したのか分からない。
- 複数の楽器(発音用、制御用など)で特定チャネルのMIDI信号を受信する。各楽器の先頭で自分はノートオンを使うのか、ピッチベンドを使うのかなど判断する。
- 利点:比較的シンプル。MIDI信号の判断ロジックも再利用できそう
- 問題:massignは一つの楽器しか許さない。massignの文法的にもNGだし、同じチャネルに対して2行で異なる楽器を指定すると、エラーは出ないが後勝ちで上書きされてしまう。だめだ。
今はできない。。。。