Raspbedrry PiのオーディオとMIDIをいじっていて、ハマってしまったことがいくつかありましたので記載しておきます。
ALSAにはMIDIインターフェースが2つあります。全然別物と書いてあるページもあります。一つは、amidi -l で見ることのできるhw:で始まるMIDIインターフェースです。hw:はハードウェアを意味しています。
>amidi -l Dir Device Name IO hw:2,0,0 UM-ONE MIDI 1 IO hw:3,0,0 nanoKEY2 MIDI 1
fluidsynthでは-oオプションでMIDIの受け口を設定することができます。MIDIキーボードを直接fluidsynthに接続することができます。下の例では、MIDIキーボード、nanoKEY2でfluidsynthを鳴らすことができます。
>fluidsynth -o midi.alsa.device=hw:2,0,0
もう一つはMIDIシーケンサーで、aconnectで見ることができます。-i は送信側のポートです。-o は受信側のポートです。ややこしいですが、-i からMIDIが来ます。-o へMIDIを出力することができます。'Midi Through Port-0'は仮想ポートと呼ばれるソフトウェアで、アプリケーション間でMIDIをやり取りするためのモノです。pmidiもこちらのインターフェースを使っています。
>aconnect -i client 0: 'System' [type=kernel] 0 'Timer ' 1 'Announce ' client 14: 'Midi Through' [type=kernel] 0 'Midi Through Port-0' client 24: 'UM-ONE' [type=kernel,card=2] 0 'UM-ONE MIDI 1 ' client 28: 'nanoKEY2' [type=kernel,card=3] 0 'nanoKEY2 MIDI 1 '
>aconnect -o client 14: 'Midi Through' [type=kernel] 0 'Midi Through Port-0' client 24: 'UM-ONE' [type=kernel,card=2] 0 'UM-ONE MIDI 1 ' client 28: 'nanoKEY2' [type=kernel,card=3] 0 'nanoKEY2 MIDI 1 '
MIDIシーケンサーはソフトで接続することができます。例えば以下のように書くとnanoKEY2を叩くと、UM-ONEにMIDIが出力されます。
>aconnect 24:0 28:0
以下のように-dコマンドを使うと接続を切ることができます。
aconnect -d 28:0 24:0
あまり実用的ではありませんが、'Midi Through Port-0'を介してとnanoKEY2とUM-ONEをつなぐことができます。
>aconnect 28:0 14:0 >aconnect 14:0 24:0
aplayは、ALSAドライバーでオーディオファイルの再生するときに使うアプリケーションです。
オーディオファイルを再生するには、まず、Raspberry Piに接続しているオーディオデバイスを調べます。私の場合は以下のように3つのデバイスが接続されている、と表示されました。
>aplay -l **** ハードウェアデバイス PLAYBACK のリスト **** カード 0: Headphones [bcm2835 Headphones], デバイス 0: bcm2835 Headphones [bcm2835 Headphones] サブデバイス: 8/8 サブデバイス #0: subdevice #0 サブデバイス #1: subdevice #1 サブデバイス #2: subdevice #2 サブデバイス #3: subdevice #3 サブデバイス #4: subdevice #4 サブデバイス #5: subdevice #5 サブデバイス #6: subdevice #6 サブデバイス #7: subdevice #7 カード 2: CI2 [Steinberg CI2], デバイス 0: USB Audio [USB Audio] サブデバイス: 1/1 サブデバイス #0: subdevice #0 カード 3: Device [USB Audio Device], デバイス 0: USB Audio [USB Audio] サブデバイス: 1/1 サブデバイス #0: subdevice #0
カード 0, デバイス 0にヘッドフォン、カード 2, デバイス 0にスタインバーグCI2、カード 3, デバイス 0にUSBオーディオデバイスが接続されています。
まず。ヘッドフォンからオーディオを再生します。
>aplay -D "hw:0,0" filename.wav 再生中 WAVE 'filename.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ
hwの後に、カード番号、デバイス番号の順番で記載します。ヘッドフォンからは問題なく再生できました。
>aplay -D "hw:3,0" filename.wav 再生中 WAVE 'filename.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ
同様に、USBオーディオデバイスからも問題なく再生できます。
>aplay -D "hw:2,0" filename.wav 再生中 WAVE 'filename.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ aplay: set_params:1339: サンプルフォーマットが使用不可能 Available formats: - S24_3LE
「サンプルフォーマットが使用不可能」というエラーメッセージが表示され、オーディオは再生されません。
>aplay -f "S24_3LE" -D "hw:2,0" filename.wav Warning: format is changed to S16_LE 再生中 WAVE 'filename.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ aplay: set_params:1339: サンプルフォーマットが使用不可能 Available formats: - S24_3LE
フォーマットS24_3LEを指定してみます。しかし同様のエラーとなります。
> aplay -D "plughw:2,0" filename.wav 再生中 WAVE 'filename.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ OK
デバイスを"plughw:2,0"、のように設定すると再生することができました。
pmidiはSMF (Standard MIDI File)を再生するためのアプリです。SMFには、MIDIのイベントと、そのイベントを”何時”再生するかが記録されています。SMFはMIDIで作成された音楽を再現するためのファイルです。
pi@raspi:~ $ pmidi -l Port Client name Port name 14:0 Midi Through Midi Through Port-0 16:0 f_midi f_midi 28:0 eVY1 MIDI eVY1 MIDI MIDI 1 32:0 nanoKEY2 nanoKEY2 MIDI 1
Raspberry Piに接続されているMIDIデバイスのリストを表示します。
>pmidi -p 28:0 filename.mid
eVY1で鳴らすためには、上記のようにコマンドを記載します。
fluidsynthには数々のオプションを設定することができます。詳細はFluidSynth Settingsに記載があります。私の試したモノだけを以下に記載しておきます。
> fluidsynth -s -a alsa //オーディオドライバー -m alsa_raw //MIDIドライバー -g 0.4 //出力ゲイン -o synth.polyphony=256 //ポリ数を設定 -o midi.alsa.device=hw:1,0,0 //MIDIの受け口を設定 -o audio.alsa.device="plughw:2,0" //オーディオの出力先 /usr/share/sounds/sf2/FluidR3_GM.sf2 //サウンドフォントの選択
synth.polyphonyはRaspberry Pi2などで音が途切れるような場合に、数字を小さくする、例えばsynth.polyphony=128, もしくはsynth.polyphony=64と設定してみて下さい。音数(同時に鳴らす音の数)が減って音切れが緩和される可能性があります。
synth.polyphony=64のようなオプションを設定する場合は -o の後にブランクを空けて記載します。
RAW MIDIでは無く MIDI Sequencer を使いたい場合は以下のように記載します。
> fluidsynth -s -a alsa -m alsa_seq /usr/share/sounds/sf2/FluidR3_GM.sf2
マイクやラインなど音の入力デバイスをリストアップするコマンド
$ arecord -l **** List of CAPTURE Hardware Devices **** card 3: Device [USB Audio Device], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0
/proc/asound/pcmを中身を見ることでPCMのデバイス設定がわかります。私の環境では"hw:0,0"と"hw:1,0"にPCMの再生デバイスが、"hw:3,0"に再生デバイスと録音デバイスが接続されています。
$ cat /proc/asound/pcm 00-00: bcm2835 Headphones : bcm2835 Headphones : playback 8 01-00: MAI PCM i2s-hifi-0 : MAI PCM i2s-hifi-0 : playback 1 03-00: USB Audio : USB Audio : playback 1 : capture 1
/proc/asound/devicesを見る事でもデバイス構成を確認できます。"hw:2,0"にはMIDIのデバイスが接続されています。
$ cat /proc/asound/devices 0: [ 0] : control 16: [ 0- 0]: digital audio playback 32: [ 1] : control 33: : timer 48: [ 1- 0]: digital audio playback 64: [ 2] : control 72: [ 2- 0]: raw midi 96: [ 3] : control 112: [ 3- 0]: digital audio playback 120: [ 3- 0]: digital audio capture