加速度センサを利用したサンプル
- 加速度センサと画面上のトラックパッドと呼ばれる領域を使ったサンプル。
- androidスマホを振ると音がする。
- このCSDファイルをDropBoxなど経由で本体に転送し、Openメニュでファイルを読み込み、Startボタンで動作開始させる。
動作環境
- Android4.0.4
- GALAXY Tab SC-01E
コード
; ; use acceleration sensor and TrackPad ; ; ; description: ; when sqrt(ax*ax+ay*ay+az*az) > threshhold, try to make sound which ; is reverberated. Reverberation parameter is controled through ; trackpad.x and trackpad.y. ; freeverb is used. ; look up the URL http://www.csounds.com/manual/html/freeverb.html ; for the parameter details. ; ; the chain of the instrument is described below. ; inst GetAccel ; -duration is controld. as ; ; (maxdur) 1.0 ********* ; * ; * ; 0.1 ****** ; ----------+-----+---(click) ; 500 5000 ; ->inst MixSignal ; -sends the signal to the mix ; ->inst SignalOut ; -reberbation and sends the signal to the outputs ; ->inst ClearMix ; - necessary for the mixing. ; <CsoundSynthesizer> <CsOptions>
- odac -d ; -+rtaudio=null
ボタンを利用したサンプル
android上で動作する、ボタンを利用したcsoundのサンプルを以下に示す。
各ボタンに個別の波形を割り当てて、各ボタンが一度押されると、
発音される音にその波形を加えたものを利用して1秒間音を出す。
もう一度押されると状態が反転してその波形を加えずに発音する。
; ; AndroidButton.csd ; -use 5 buttons ; ; description: ; assume that the buttons as 'on/off' button. A touch changes ; its status from BUTTON to ~BUTTON. ; assume that the different waveforms is assigned on each ; buttons, like ; button1 ->SIN ; button2 ->complex SIN ; button3 ->Chebyshev ; button4 ->SQUARE ; button5 ->SAW2 ; ; summasion of waveforms which is flagged and weighted is sent to ; outputs <CsoundSynthesizer> <CsOptions>
- odac
csound6.00から導入された配列を使う
サンプルではボタンを扱うときにver.6.00から導入された配列を利用した。配列の限界についても以下に述べる
バグかも
- triggerと配列を同時に利用した場合に正常動作しないことが判明。triggerを利用した部分はインデックスで扱わずにすべて書き出すことによって問題を回避。本来は
until kIndx == lenarray(kbtrg) do kbtrg[kIndx] trigger kb[kIndx],0.5,0 kbst[kIndx] = (kbtrg[kIndx]==1 ) ? ~ kbst[kIndx] : kbst[kIndx] kIndx +=1 od
で済むところが、triggerが正常動作しないので展開する必要がある。
kbtrg[0] trigger kb[0], 0.5, 0 kbtrg[1] trigger kb[1], 0.5, 0 kbtrg[2] trigger kb[2], 0.5, 0 kbtrg[3] trigger kb[3], 0.5, 0 kbtrg[4] trigger kb[4], 0.5, 0 until kIndx == lenarray(kbtrg) do kbst[kIndx] = (kbtrg[kIndx]==1 ) ? ~ kbst[kIndx] : kbst[kIndx] kIndx +=1 od
配列に対する課題
csound配列の限界--ボタン自身が配列でないためボタンを扱うときに配列のよさが十分に生かせない。
- 楽器の呼び出すときに引数に配列を渡したい
- a-rateへの拡張
- スコアのパラメータもいっそのこと配列に
UIエレメントへの拡張
kb[0] chnget "butt1" kb[1] chnget "butt2" kb[2] chnget "butt3" kb[3] chnget "butt4" kb[4] chnget "butt5"
この部分はたとえば
until kIndx == lenarray(kb) do kb[kIndx] = chnget button[xIndx] kIndx +=1 od
のようにできないのだろうか
スコア呼び出し時の拡張
配列を直接スコアの引数に呼び出したい。
i1 0 10 #expand{gkparam[0]) i1 + 10 #expand(gkparam[1]) i1 + 10 #expand(gkparam[2]) i1 + 10 #expand(gkparam[3])
a-rateへの拡張
現在k-rateのみで配列は使えるようである
asig1 oscil p4*0dbfs, 440, 1 asig2 oscil p4*0dbfs, 440, 2 asig3 oscil p4*0dbfs, 440, 3 asig4 oscil p4*0dbfs, 440, 4 asig5 oscil p4*0dbfs, 440, 5
これを
until kIndx == lenarray(kb) do asig[kIndx] oscil p4*0dbfs, 440, kIndx kIndx +=1 od
応用
このケースの場合は本当にいいのかどうか分からない(行数が増えている、可読性があがっているか疑問)
asig=(asig1*p5+asig2*p6+asig3*p7+asig4*p8+asig5*p9)/(p5+p6+p7+p8+p9)
この一行を、繰り返しを使って以下のように書き換え
until kIndx == lenarray(kb) do asum = asum + asig[kIndx] * p[kIndex+5] inum = inum + p[kIndx+5] kIndx +=1 od asig= asum/inum
android上で使えるセンサとUI
現時点でAndroid端末から取れる値は限られている。しかも、スワイプやピンチイン/アウト、2点以上のタッチはサポートされていない。
ktx chnget "trackpad.x" kty chnget "trackpad.y" ks1 chnget "slider1" ks2 chnget "slider2" ks3 chnget "slider3" ks4 chnget "slider4" ks5 chnget "slider5" kax chnget "butt1" kay chnget "butt1" kaz chnget "butt1" kax chnget "accelerometerX"kay chnget "accelerometerY" kaz chnget "accelerometerZ" kb1 chnget "butt1" kb2 chnget "butt2" kb3 chnget "butt3" kb4 chnget "butt4" kb5 chnget "butt5"
- トラックパッドはうまく使えばx,yの両方が取れるのでカオスパッドっぽく使うこともできる。つまり、発音中にダイナミックに二つのパラメータを変更できる。
- スライダーは比較的使いやすい。ただし、同時にスライドさせることができない。発音前に調整して発音中はスタティックなパラメータと考えるのが妥当だろう。
- XYZの加速度センサは瞬間値なので、時系列データを保持してこの変化からトリガを得るようにこれらの値ををうまく処理しないと使えない。その一例を(サンプル)として示した。
- ボタンは使いづらい。同時押しができないなら、手を話した後も状態を保持するタイプのボタンとして考えたくなる。しかし押したあとの状態が視覚的に変化しないのでこのボタンを使う気にならない。triggerオプコードを利用することによって若干ボタンの押下を捕らえやすくはなる。(サンプル)しかし、普通のJavaやVBのUIの取り扱いからは遥か彼方。きわめて原始的である。
なぜか6.00.1ではトラックパッドの領域が狭くなったのでトラックパッドのY軸値はあまり役に立たない。そもそもcsoundがFLKを取り込もうとしたように、すべてを自己完結させようとするこれまでの思想を捨てないとUI部分はついていけないだろう。危惧してしまう。今後csound+andriodの環境に必要なUIの要件を以下のようにまとめる。
- そもそもUI自身をcsoundから切り離すこと。Androidの操作に対応すること。(UI MUST be separated from csound itself, or sufficient flexiblity which is provided by Android cannot be obtained.)
- ボタン、スライダーなどの個数とラベル、名称、位置、領域、色といった属性はユーザが指定できること(The number of the sliders, buttons and other UI elements MUST be set by the user. The attributes of elemetns, like label, position, color, size and its name MUST be set by the user also.)
- ボタンは押下後、視覚的な変化を保持すること(The buttons MUST keep its UI if its status is changed.)
androidでcsound6.00.1を動かす
csoundはandroid上で動作させて、リアルタイムで発音させたり、wavファイルをレンダリングすることができる。いくつかの制約や注意事項があるようだ。実際にandroidを振ると音が出るサンプルを作ってみた。
インストール
- csoundのバージョンは6.00.1のAndroid版を利用。
- http://sourceforge.net/projects/csound/files/csound6/Csound6.00.1/」の Csound6.apkからapkをchrome経由でダウンロード。
- /mnt/sdcard/DownloadにダウンロードしたCsound6.apkファイルをファイエキスパート(https://play.google.com/store/apps/details?id=xcxin.filexpert&hl=ja)から、パッケージインストーラー経由でインストール
- マニュアルを見ると5.19になっている。。(単にサーバ上のマニュアルが古いだけだと思います)
セッティング
- メニューボタンから、通常だと環境変数で設定する項目が設定できるようになる。
- Output directory
- 出力ファイルを指定するディレクトリ。最初この設定をせずに動かすと動かなくて悩み、引数のファイル名には「-W -o /mnt/sdcard/sample.wav」のようにファイルのフルパス指定をしてしまっていた。
- まずこれを設定しないとちゃんとファイルが生成されないので注意。/mnt/sdcard/csound/samplesのような指定をする
- Sample directory
- Plugins directory
- Include directory
- Analysis directory
- これらは必要に応じて
- 実際にファイルエキスパートなどで、/mnt/sdcard/csound, /mnt/sdcard/csound/analysis, /mnt/sdcard/csound/include, /mnt/sdcard/csound/plug-insのディレクトリを作っておくのがいいだろう
リアルタイム発音
- 原因は分からないがオプションを-odac -d -+rtaudio=nullだと動かない。-+rtaudio=nullをとると動いた。
- 5.19では動くのだからよりデグレードしているのか?
その他
- -dのログ表示をサプレスするオプションはなくてもいい。これがもっとも優れた箇所か。ちゃんとデバッグできる。
- オプコード
重要なcsound用語
- opcode(オプコード)
- スコア(score)
- オーケストラ(orc)
- 楽器(instrument)
- CSDファイル
- k-rate
- ファンクションテーブル
- ファンクションテーブルはfステイトメントによって作られる。
- fステイトメントは第4引数にGENルーチンを示す数をパラメータに取るので、ファンクションテーブル、fステイトメント、GENルーチンはまとめて理解されるべきものである。
- 言い換えると、fステイトメントの第一引数によって数字で名前付けされ、第四引数のGENルーチンによって決まるデータ生成規則と、第三引数のデータ数、第二引数の生成タイミングで構成される数列表がファンクションテーブルである。(わ、分かりにくい)。
- ファンクションテーブルはシンセサイザーの波形に相当する
- ちなみにfステイトメントはスコアの位置に記載されるのでスコアステイトメントの一種である。
- 波形は”関数”によって生成された、数列表(テーブル)であるから、ファンクションテーブルと呼ぶのだろう
- GENルーチン