0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Raspberry Pi 4でProcessingをつかって音声再生しようとしてハマったメモ

Posted at

そもそもラズパイで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を動かす需要が少ないので、別の方法を試すべきなのではというのは言わないお約束。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?