いらないモノ、ひつようなモノ

書籍、音楽、そして若干のテクノロジー

加速度センサを利用したサンプル

←csoundメモ 目次へ戻る

  • 加速度センサと画面上のトラックパッドと呼ばれる領域を使ったサンプル。
  • 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
</CsOptions> <CsScore> f1 0 65536 10 1 ;SIN i1 0 36000 i2 0 36000 i3 0 36000 i100 0 36000 e </CsScore> <CsInstruments> sr = 44100 ksmps = 10 nchnls = 2 ; 2 channnel ; ; sense the timing of signal using acceleration sensor ; instr 1, GetAccel k_cur_value init 0 k_last_value init 0 k_old_value init 0 k_click init 0 k_maxsig init 0.6 k_maxdur init 1.0 k_thresh init 4.2 k_maxval init 21 ; needs to be observed in each env k_minval init 12 ; needs to be observed in each env k_old_value = k_last_value k_last_value = k_cur_value kax chnget "accelerometerX" kay chnget "accelerometerY" kaz chnget "accelerometerZ" k_cur_value=sqrt(kax*kax+kay*kay+kaz*kaz) kdif1 = k_last_value - k_old_value kdif2 = k_cur_value - k_last_value kdur = (k_click>5000 ? k_maxdur : .1+(k_maxdur-.1)*(k_click-500)/4500) if kdif1>k_thresh && kdif2<0.01 then kval=sqrt(kax*kax+kay*kay+kaz*kaz) kamp = (kval>k_maxval) ? k_maxsig : abs(kval-k_minval)/(k_maxval-k_minval)*k_maxsig event "i",2,0,kdur,kamp k_click=0 else k_click = k_click + 1 ; k_click minimum almost equals to 500 endif endin ; ; sends the signal to the mix channel ; instr 2, MixSignal asig oscil p4*0dbfs, 440, 1 ;printf_i "%f(sec) -- %f\n",1,p3,p4 chnmix asig, "mix" endin ; ; reverbation and send the signal to the outputs ; instr 3, SigalOut asig chnget "mix" kRoomSize chnget "trackpad.x" kHFDamp chnget "trackpad.y" aLin, aRin freeverb asig, asig, kRoomSize, kHFDamp aL clip aLin,2,0dbfs aR clip aRin,2,0dbfs outs aL, aR ; when babo is used ;kx chnget "trackpad.x" ;ky chnget "trackpad.y" ;kxp = 14.39 * kx ;kyp = 11.86 * ky ;aLin, aRin babo asig, kxp, kyp, 3, 14.39, 11.86, 10 ;outs aLin, aRin endin ; ; for mixing ; instr 100, ClearMix chnclear "mix" endin <//CsInstruments> </CsoundSynthesizer>

←csoundメモ 目次へ戻る

ボタンを利用したサンプル

←csoundメモ 目次へ戻る

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
</CsOptions> <CsScore> f1 0 65536 10 1 ;SIN f2 0 65536 10 1 0.5 0.1 ;SIN+0.5*octave+0.1*octave2 f3 0 65536 13 1 1 0 0 0 0 0 0 0 -1 0 1 0 0 -.1 0 .1 0 -.2 .3 0 -.7 0 .2 0 -.1; Chebyshev f4 0 65536 7 1 512 1 0 -1 512 -1 ;SQUARE f5 0 65536 10 0 1 0 .5 0 .25 0 .125 0 .0625 0 .03125 0 .015625 ; SAW2 t 0 180 i1 0 36000 e </CsScore> <CsInstruments> sr = 44100 ksmps = 10 nchnls = 2 ; 2 channnel ; ; sense the button ; instr 1, GetButtonState kbst fillarray 0,0,0,0,0 kb fillarray 0,0,0,0,0 kbtrg[] fillarray 0,0,0,0,0 kb[0] chnget "butt1" kb[1] chnget "butt2" kb[2] chnget "butt3" kb[3] chnget "butt4" kb[4] chnget "butt5" kIndx = 0 ; ; trigger opcode does not work with until ; 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 ; kbtrg[kIndx] trigger kb[kIndx],0.5,0 kbst[kIndx] = (kbtrg[kIndx]==1 ) ? ~ kbst[kIndx] : kbst[kIndx] kIndx +=1 od kamp=0.7 kdur=1.0 ksum sumarray kbtrg if ksum>0 then event "i",2,0,kdur,kamp,kbst[0],kbst[1],kbst[2],kbst[3],kbst[4] endif endin ; ; sends the signal to outputs ; instr 2, SendSignal printf_i "on/off=%d/%d/%d/%d/%d\n",1,p5,p6,p7,p8,p9 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 asig=(asig1*p5+asig2*p6+asig3*p7+asig4*p8+asig5*p9)/(p5+p6+p7+p8+p9) outs asig, asig endin </CsInstruments> </CsoundSynthesizer>

←csoundメモ 目次へ戻る

csound6.00から導入された配列を使う

←csoundメモ 目次へ戻る

サンプルではボタンを扱うときに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

←csoundメモ 目次へ戻る

android上で使えるセンサとUI

←csoundメモ 目次へ戻る

現時点で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オプコードを利用することによって若干ボタンの押下を捕らえやすくはなる。(サンプル)しかし、普通のJavaVBの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.)

←csoundメモ 目次へ戻る

androidでcsound6.00.1を動かす

←csoundメモ 目次へ戻る

csoundandroid上で動作させて、リアルタイムで発音させたり、wavファイルをレンダリングすることができる。いくつかの制約や注意事項があるようだ。実際にandroidを振ると音が出るサンプルを作ってみた。

インストール
セッティング
  • メニューボタンから、通常だと環境変数で設定する項目が設定できるようになる。
  • Output directory
    • 出力ファイルを指定するディレクトリ。最初この設定をせずに動かすと動かなくて悩み、引数のファイル名には「-W -o /mnt/sdcard/sample.wav」のようにファイルのフルパス指定をしてしまっていた。
    • まずこれを設定しないとちゃんとファイルが生成されないので注意。/mnt/sdcard/csound/samplesのような指定をする
  • Sample directory
    • csoundで音源ファイルを元にモーフィングなどをする元サンプルファイルを入れて置くディレクトリを指定。/mnt/sdcard/csound/samplesでとりあえずいいか
  • 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をとると動いた。
その他
  • -dのログ表示をサプレスするオプションはなくてもいい。これがもっとも優れた箇所か。ちゃんとデバッグできる。
  • オプコード
    • csound6とあるが、いくつかのサンプルファイルを試してみるとすべてのオプコードが利用できるわけではないみたい。マニュアルには以下のオプコードは含まれていると記述あり
      • signal flow opcodes
      • fluid synth opcodes
      • libstdutil library
      • Lua opcodes
        • 信号処理でも、スコア生成だろうが、Luaのコードを普通に使えるようです。Androidが許しているすべてのシェアードライブラリの機能が使えるのだとりますが、その実体が何であるか。今の時点では私には分かりません。。。

←csoundメモ 目次へ戻る

重要なcsound用語

←csoundメモ 目次へ戻る

  • opcode(オプコード)
    • csoundの言語の持っているコマンドを特にそう呼んでいる。マニュアルに従えば分類できる。信号生成、信号入出力、信号修飾、楽器(instrument)制御、ファンクションテーブル制御、算術演算子、ピッチ変換、リアルタイムMIDI、スペクトル処理、文字列処理、ベクトル処理、ZAKパッチング処理、各種プラグインホスティング、OSC(Open Sound Control)とネットワーク処理、ミキサー処理、信号フローグラフ、擬似Jackポート操作*1Luaブリッジ、pythonブリッジ、イメージ処理、STKオプコード群*2、その他オプコード群(実際systemコールなど少数)に分類されている。
  • スコア(score)
  • オーケストラ(orc)
  • 楽器(instrument)
  • CSDファイル
  • k-rate
  • ファンクションテーブル
    • ファンクションテーブルはfステイトメントによって作られる。
    • fステイトメントは第4引数にGENルーチンを示す数をパラメータに取るので、ファンクションテーブル、fステイトメント、GENルーチンはまとめて理解されるべきものである。
    • 言い換えると、fステイトメントの第一引数によって数字で名前付けされ、第四引数のGENルーチンによって決まるデータ生成規則と、第三引数のデータ数、第二引数の生成タイミングで構成される数列表がファンクションテーブルである。(わ、分かりにくい)。
    • ファンクションテーブルはシンセサイザーの波形に相当する
    • ちなみにfステイトメントはスコアの位置に記載されるのでスコアステイトメントの一種である。
    • 波形は”関数”によって生成された、数列表(テーブル)であるから、ファンクションテーブルと呼ぶのだろう
  • GENルーチン
    • GENルーチンがファンクションテーブルの実体。
    • 根っこは関数の数だけあるのだから、これまたいろいろなタイプのGENルーチンがある
    • サイン/コサインの波形生成、線分と指数関数、各種音声ファイルからの読み込み、数値指定によるグラフ・ステップ関数など、各種窓関数、乱数、フェーズボコーダ解析結果、n次多項式、チェビシェフ多項式、第二種チェビシェフ多項式、ほかファンクションテーブルを正規化、第二種ベッセル関数、ファンクションテーブルの合成、wavelet変換、Fareyシーケンス、sone関数、tanh関数、などなど

←csoundメモ 目次へ戻る

*1:Jackと協調して動作するものではなく、"Jacko"オプコード群と呼ばれている。

*2:STKとは、Synthesis Toolkit in C++という、音響処理のためのライブラリ群。これを使用してBrassや瓶、クラリネットシタールをモデリングした音源をcsoundでは利用可能。ただし、STKは基本的にオプションなのでcsound -zのコマンドでサポートしているモジュールに入っていなければ別途導入が必要

主たる動作環境

←csoundメモ 目次へ戻る

  1. MS-DOS+Windows(NT,XP,Vista,7,8....)
  2. (多分すべての)GNU/Linuxディストリビューション
  3. Mac(細かいOSとか知らない)
  4. Android(2012年より)
  5. iOS(未確認)

派生物と関連するシステム

csoundはOSによる違いの他メンテナーが異なっていくつかのブランチが存在するここでは、Linux上でコンパイル可能なものだけを対象にする。

    • Blue
    • Cellia
    • Bol Processor
    • Rosegarden
    • csounds.com

←csoundメモ 目次へ戻る