Raspberry PiのオーディオとMIDI

Raspbedrry PiのオーディオとMIDIをいじっていて、ハマってしまったことがいくつかありましたので記載しておきます。



ALSA 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

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

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には数々のオプションを設定することができます。詳細は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

マイクやラインなど音の入力デバイスをリストアップするコマンド

$ 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