real-time midi, real-time audioを試す。
目次:
- virtual keyboarを使ってrealtime-audio。
- 実際の楽器を使ってrealtime-audio。
virtual keyboarを使ってrealtime-audio
リアルな楽器をつなぐ前にvirtualKeyboardを使ってみる。virtualKeyboardありでコンパイルしたので使えるはずである。real-time MIDI, real-time audio*1を試すのにもちょうどいい。csoundを走らせたときに以下のようにvitual keyboardの表記があれば使えると思う。
[a9a9@localhost]$ csound Localisation of messages is disabled, using default language. PortMIDI real time MIDI plugin for Csound PortAudio real-time audio module for Csound virtual_keyboard real time MIDI plugin for Csound <-此 0dBFS level = 32768.0 Csound version 5.06 (double samples) Aug 25 2007 . .
サンプルとなるようなCSDがpostがここにあった。これを参考にして以下のようなものを作ってみた。
- "-d"でvirtual keyboardの表示は抑制せず、その他のグラフなどの出力を抑制できた。
- -M0でリアルタイムがなぜか動かなかった。(むしろabcでも何でもそれ以外だと動いた)。ここでは、カレントディレクトリに保存してあるmidi_keyboard.mapというBANK定義ファイルを参照。
- -+raudio=alsa -odac:hw0,0としてusb外付けオーディオからalsaで出力デバイスの番号などはここ。
- -Bや-bは適当に。`WARNING: Buffer underrun in real-time audio output"の警告が出力された場合にはBの値を大きく。
- -m0 出力メッセージを抑制(デバッグするときには出したほうがいいです -m231とか)
- 楽器はpluckを使って定義してみたが、リアルタイムの楽器の本質はxtratim 1やreleaseにある。このcsdが正常に動いていた場合には、(f0の3600秒間だけ)無限ループに入ってvirtual keyボードから楽器を鳴らせる。
<CsoundSynthesizer> <CsOptions> -d --sched -+rtaudio=alsa -odac:hw:0,0 -m0 -+rtmidi=virtual -Mmidi_keyboard.map ; -d supress all displays(virtual keyboard is not supressed) ; -M0 did not work for me. BANK definition file named as "midi_keyboard.map" for the virtual keyboard, stored in the current directory ; "-+rtaudio=alsa -odac:hw:0,0" for realtime audio to use usb device ; -B N samples per hardware sound I/O buffer, 8192, 16384, ... ; -b N sample frames (or -kprds) per software sound I/O buffer </CsOptions> <CsInstruments> ;mainly from the post of mark jamerson, 2007/06/03 ;http://www.nabble.com/Re%3A-does-anyone-have-a-virtual-keyboard-example--p10933717.html sr = 44100 kr = 4410 ksmps = 10 nchnls = 2 massign 1,1 prealloc 1,10 massign 2,2 prealloc 2,10 instr 1 ;Midi FM synth inote cpsmidi iveloc ampmidi 10000 idur = 2 xtratim 1 kgate oscil 1,10,2 anoise noise 100*inote,.99 acps samphold anoise,kgate aosc oscili 1000,acps,1 aout = aosc outs aout,aout endin ; ;made it after xtratim in csound5.06 manual ; instr 2 inum notnum icps cpsmidi iamp ampmidi 10000 idur = 2 xtratim 1 ; extend the duration of real-time generated events krel init 0 krel release if (krel == 1) kgoto releaseStage kampEnv1 linseg 0, 0.03, 1, 0.05, 1, 0.07, 0, 0.08, 0.5, 4, 1, 50, 1 kamp = kampEnv1*iamp kgoto done releaseStage: kampEnv2 linseg 1, 0.3, 0.2, 0.7, 0 kamp = kampEnv1*kampEnv2*iamp done: kcps = icps+icps*0.4 a1 pluck kamp, kcps, icps, 1, 1 kcps = icps-icps*0.4 a2 pluck kamp, kcps, icps, 1, 1 k_rnd=rnd(9) if (k_rnd%2 == 1 ) then outs a1, a2 ;printks "1 krnd=%i\n", 0.9, k_rnd else outs a2, a1 ;printf "2 krnd=%i\n", 0.9, k_rnd endif endin </CsInstruments> <CsScore> f0 3600 f1 0 1024 10 1 f2 0 16 7 1 8 0 8 f3 0 1024 10 1 .5 .6 .3 .2 .5 e </CsScore> </CsoundSynthesizer> 2
virtual keyboardにBANKの定義は見たとおり、ここに一応詳しい説明がある。上半分はMIDI制御信号(むしろこれをファイルで変更できないのか?)、下半分で(MIDI)Channel、BANK(名)、プログラム(名というか楽器名)がありBANK(名)、プログラム(名)が設定ファイルで変更できる。プログラムをinstrument to testに変更すると音がかわりinstr2の楽器の音がする。ちなみに、マウスでキーボードを叩いてもいいし、キーボードを叩いても鍵盤を叩いたのと同じ状態を作り出せる。
# 2007/8/26 midi_keyboard.map [1=BANK to test] 1=instrment from net 2=instrment to try 3=not defined 4=not defined [2=BANK not defined yet] 1=not defined 2=not defined 3=not defined 4=not defined
実際の楽器を使ってrealtime-audio。
次に本物のキーボードを接続してみる。Oxygen8を使ってみる。前のCSDファイルをのオプションを変更する。たったそれだけでOK。
-d --sched -+rtaudio=alsa -odac:hw:0,0 -m0 -+rtmidi=virtual -Mmidi_keyboard.map
を
-d --sched -+rtaudio=alsa -odac:hw:0,0 -m0 -M1
にする。
- -M1で、デバイス名を1としているが、これはたとえば99という指定範囲外の値を指定するとなにを指定すればいいか教えてくれる。
The available MIDI in devices are: 0: Midi Through Port-0 (ALSA) 1: YAMAHA UW500 MIDI 1 (ALSA) 2: YAMAHA UW500 MIDI 2 (ALSA)のようにcsoundが表示してくれるのでそれに従って値を入れて、楽器をつなげばいい。これはエラー表示のようにPortMIDIが教えてくれている*2。PortMIDIはOSS,Alsaの一枚上に被さった抽象インタフェースなので直接alsaからMIDIを使う場合には以下のようにオプションを変更する。PortMIDI: error: device number is out of range
-d --sched -+rtaudio=alsa -odac:hw:0,0 -m0 -+rtmidi=alsa -M hw:0/proc/asound/cardsを見ればよい*3 ひとつ不明なのは、いろんなところに -M/dev/snd/midiC0D0で動くと書いてあるのだけどこれじゃ動かなかった。古いバージョンだけの話なのかもしれない。-d --sched -+rtaudio=alsa -odac:hw:0,0 -m0 -+rtmidi=alsa -M/dev/snd/midiC0D0だと、「ALSA lib rawmidi.c:282:(snd_rawmidi_open_noupdate) Unknown RawMidi /dev/snd/midiC0D0」と怒られる。-d --sched -+rtaudio=alsa -odac:hw:0,0 -m0 -M/dev/snd/midiC0D0だと、「 *** PortMIDI: error: must specify a device number (>=0), not a name」と怒られる。 ま、いっか。音程もフォロー
引数で、midiのノートの音程とベロシティーをスコア引数に対応させるように書くと、キーボードの音程や打鍵の強さを伝えられる。これでやっとリアルタイムで基本的な楽器。--midi-velocity-amp=4 --midi-key-cps=5が楽器からスコアの引数への紐付け。このcsdを動かすとスコアもかかれているので、起動後1秒後に1秒間ラの音が鳴る。その後キーボードのとおりに鳴る。 ほんと手がかかるよな。ここまでくるのに。-d --sched -+rtaudio=alsa -odac:hw:0,0 -m0 -M1 --midi-velocity-amp=4 --midi-key-cps=5 sr=44100 kr=44100 nchnls = 2 massign 1,1 ; ch1 to instr1 prealloc 1,10 ; allocate instr1 x 10 instr 1 mididefault 3,p3 ;when MIDI activated, p3 is set to be 3 ifn = 1 aout oscil p4, p5, ifn outs aout, aout endin f0 3600 f1 0 16384 10 1 i1 1 1 30000 440