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

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

real-time midi, real-time audioを試す。

目次:

  1. virtual keyboarを使ってrealtime-audio。
  2. 実際の楽器を使って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) 
PortMIDI: error: device number is out of range
のようにcsoundが表示してくれるのでそれに従って値を入れて、楽器をつなげばいい。これはエラー表示のようにPortMIDIが教えてくれている*2。PortMIDIはOSS,Alsaの一枚上に被さった抽象インタフェースなので直接alsaからMIDIを使う場合には以下のようにオプションを変更する。
 -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のノートの音程とベロシティーをスコア引数に対応させるように書くと、キーボードの音程や打鍵の強さを伝えられる。これでやっとリアルタイムで基本的な楽器。


 -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


--midi-velocity-amp=4 --midi-key-cps=5が楽器からスコアの引数への紐付け。このcsdを動かすとスコアもかかれているので、起動後1秒後に1秒間ラの音が鳴る。その後キーボードのとおりに鳴る。 ほんと手がかかるよな。ここまでくるのに。

*1:[http://d.hatena.ne.jp/A9A9/20051029/1130570851:title=まえ]にも書いたがinstr 1、使えるじゃん。-+Oオプションってなんだったんだ?csoundAVかな?

*2:PortMIDIがcsoundではデフォルト値だそうだ。マニュアルより

*3:マニュアルでは、hw:? と書いてあったが、hw0,0でも動いた。audioの時と同じように/proc/asound/devicesや/dev/snd/midiC?D?の?の部分を見て当てはまる値だろう。複数あったら、こう書くのが正しいんじゃないかという気がする