そもそもラズパイでP5を動かすというマニアックな話なのですが、
ちょっとハマったので備忘録として。
ハマったこと
① minimの限界
当初、minimで実装をしていたのですが、AudioPlayerを2つ以上持つと、3つ目以降の音声ファイルが再生されなくなりました。
② Sound library on RPi4 動かず
その後、P5純正のSoundライブラリにreplaceを試みたのですが、音声再生がそもそもされず。
調べてみると、下記のissueで「pulseaudio, gstreamer1.0-pulseaudio」をaptで入れたらいいよ〜と書かれていてインストールしてみたのですが、動かず。
③ そうだ、nativeのaplayを使えばいいのでは?
P5ではProcessBuilderを使えば外部プログラムを実行できるので、試してみたところ、複数ファイルでも動くように!
実装
1. 簡単に音声再生したい(音声ファイルが2つまでであれば問題なく動きます)
minimSample.pde
import ddf.minim.*;
final String AUDIO_FILES_PATH[] = {
"/home/pi/soundPlaySample/data/se_01_2022.wav",
"/home/pi/soundPlaySample/data/se_02_2022.wav",
};
Minim minim;
AudioPlayer players[];
void settings() {
size(160, 120);
}
void setup() {
minim = new Minim(this);
players = new AudioPlayer[AUDIO_FILES_PATH.length];
for (int i=0;i<players.length;i++) {
players[i] = minim.loadFile(AUDIO_FILES_PATH[i]);
}
}
void draw() {
}
void mouseClicked() {
int soundIndex = (int)random(100) % AUDIO_FILES_PATH.length;
soundPlay(soundIndex);
}
void soundPlay(int _soundIndex) {
println("soundPlay: " + _soundIndex);
players[_soundIndex].rewind();
players[_soundIndex].play();
}
2. ProcessBuilde経由でaplayをつかって音声再生をする
soundPlaySample.pde
import java.lang.ProcessBuilder;
final String AUDIO_FILES_PATH[] = {
"/home/pi/soundPlaySample/data/se_01_2022.wav",
"/home/pi/soundPlaySample/data/se_02_2022.wav",
"/home/pi/soundPlaySample/data/se_03_2022.wav",
"/home/pi/soundPlaySample/data/se_04_2022.wav",
};
ProcessBuilder pb = null;
Process p = null;
void settings() {
size(160, 120);
}
void setup() {
}
void draw() {
}
void mouseClicked() {
int soundIndex = (int)random(100) % AUDIO_FILES_PATH.length;
soundPlay(AUDIO_FILES_PATH[soundIndex]);
}
void soundPlay(String _filePath) {
println("soundPlay: " + _filePath);
ArrayList<String>args = new ArrayList<String>();
args.add("aplay");
args.add("--device=sysdefault:CARD=Headphones");
args.add(_filePath);
// ここでpb,pが生きてたら殺す処理入れないといけない?かも?
pb = new ProcessBuilder(args);
try {
p = pb.start();
}
catch(Exception e) {
println(e);
}
}
良かったこと
nativeで音声再生をすることになったので、minim経由で動かすより多少負荷が下がった印象がある。
※ ベンチマーク取ってるわけじゃないので、体感ですが。。
複数の音声再生してもちゃんと動く!
※ そもそも、RPi4でP5を動かす需要が少ないので、別の方法を試すべきなのではというのは言わないお約束。