2016年8月29日月曜日

Ubuntu16.04でprocessingのsoundを使う方法


processingにはオーディオ関係のプログラムが書けるsoundというライブラリがあります。
しかし、利用できるまで詰まりどころがあったので、soundに関するプログラムを実行する方法を共有します。

全体像

下記の流れでsoundライブラリを動かします。
  1. 利用したコードの紹介
  2. サウンドライブラリの読み込み
  3. alsaの設定変更
  4. soundのプログラム実行成功

利用したプログラムの紹介

動作確認にはprocessingのsoundチュートリアルで使われているシンセサイザーのプログラムを利用しました。
https://processing.org/tutorials/sound/

/**
 * Processing Sound Library, Example 1
 *
 * Five sine waves are layered to construct a cluster of frequencies.
 * This method is called additive synthesis. Use the mouse position
 * inside the display window to detune the cluster.
 */

import processing.sound.*;

SinOsc[] sineWaves; // Array of sines
float[] sineFreq; // Array of frequencies
int numSines = 5; // Number of oscillators to use

void setup() { 
  size(640, 360);
  background(255);

  sineWaves = new SinOsc[numSines]; // Initialize the oscillators
  sineFreq = new float[numSines]; // Initialize array for Frequencies

  for (int i = 0; i < numSines; i++) {
    // Calculate the amplitude for each oscillator
    float sineVolume = (1.0 / numSines) / (i + 1);
    // Create the oscillators
    sineWaves[i] = new SinOsc(this);
    // Start Oscillators
    sineWaves[i].play();
    // Set the amplitudes for all oscillators
    sineWaves[i].amp(sineVolume);
  }
}

void draw() {
  //Map mouseY from 0 to 1
  float yoffset = map(mouseY, 0, height, 0, 1);
  //Map mouseY logarithmically to 150 - 1150 to create a base frequency range
  float frequency = pow(1000, yoffset) + 150;
  //Use mouseX mapped from -0.5 to 0.5 as a detune argument
  float detune = map(mouseX, 0, width, -0.5, 0.5);

  for (int i = 0; i < numSines; i++) {
    sineFreq[i] = frequency * (i + 1 * detune);
    // Set the frequencies for all oscillators
    sineWaves[i].freq(sineFreq[i]);
  }
}

サウンドライブラリの読み込み

processing3ではsoundに関するライブラリはcoreに入っていないため、プログラムを実行すると下記のようなエラーが出ます。

The package "processing.sound" does not exist. You might be missing a library.
No library found for processing.sound
Libraries must be installed in a folder named 'libraries' inside the 'sketchbook' folder.
クラス "AudioDevice" は存在しません。

soundを利用するにはsoundライブラリの追加が必要です。
ライブラリの追加は、下記の流れで行えます。

「スケッチ」->「ライブラリをインポート」->「ライブラリを追加」を選択します。


contribution managerが開くので、Filterに「sound」と入力してsoundライブラリを検索し、「インストール」をクリックしてライブラリを読み込みます。


ダウンロードとjarファイルの作成が行われるため、10分位かかります。

soundの設定が終わったら、プログラムを実行してみてください。
macの場合はこれでうまくいくと思います。
ubuntuの場合はalsaに関するエラーが出ることがあるので、その場合は次の「alsaの設定変更」をご参考ください。

参考: How to install the “sound” library for Processing in a simple way?

alsaの設定変更

ubuntuの場合は下記のエラーが出て動きませんでした。

terminate called after throwing an instance of 'std::runtime_error'
  what(): RtApiAlsa::probeDeviceOpen: pcm device (hw:0,3) won't open for input.
Could not run the sketch (Target VM failed to initialize).
For more information, read revisions.txt and Help → Troubleshooting.

このエラーは下記の方法でalsaの設定を変更することで回避できました。

alsaの設定ファイルをsudo権限で開きます。
sudo gedit /etc/modprobe.d/alsa-base.conf

下記の行を末尾に追加します。
/etc/modprobe.d/alsa-base.conf
options snd-hda-intel index=-2

再起動します。
sudo reboot

参考:
How can I solve a conflict between openFrameworks and other audio applications?
https://github.com/processing/processing-sound/issues/81

soundのプログラム実行成功

soundライブラリの読み込みとalsaの設定ができたら、soundのシンセサイザープログラムが動きました。

右上にマウスカーソルを置くと「ボー」という音が鳴ります。


左下にマウスカーソルを置くと「チョー」という音が鳴ります。

以上の方法で自分の環境では動作しました。
alsaに関する設定方法など、他の解決方法があれば共有していただけると嬉しいです。

0 件のコメント :