QA@IT

Processing loop() 長いオーディオデータのループ

11842 PV

追記(参考動画)

ご参考になるかわかりませんが参考動画を用意してみました。
00:19〜音量にご注意ください。
http://youtu.be/Jpq3ii5CQ30
よろしくお願いします。

ーー追記ここまで

お世話になります。
processingをいじってみようと、ドラムパターンをループさせてキーボードでコードを鳴らすという簡単なプログラムを書きました。
すると、

  loopSound = minim.loadFile("loopSound.mp3");

で指定した3秒程あるloopSound.mp3が最後まで再生される前にループされるためにバスドラムを連打したようなサウンドに鳴ってしまいます。
loopSound.mp3を完全に再生しきってから途切れること無く同じloopSound.mp3をループさせ続けるにはどのようにすれば良いでしょうか?

また、実行すると以下のようなエラーが出力されます。

==== JavaSound Minim Error ====
==== Don't know the ID3 code TSS

==== JavaSound Minim Error ====
==== Error parsing ID3v2: String index out of range: -131

http://www.openprocessing.org/sketch/12451
こちらのサイトによると、オーディオデータが10秒近くあるとエラーになるということですが、今回使用しているデータは3秒なのでこれが原因ではないのではないかと考えています。
この意味についておわかりになる方がいらっしゃればこちらも教えて頂きたいです。

どうぞよろしくお願いします。

以下プログラム全文

import ddf.minim.*;
import ddf.minim.ugens.*;

AudioPlayer loopSound;
AudioOutput out;
   Minim minim;
void setup(){
  minim = new Minim( this );
  loopSound = minim.loadFile("loopSound.mp3");
  out = minim.getLineOut();
}
void draw(){
  loopSound.loop();
}
void keyPressed() {
    if (key == 'd') {    // D  D  F#  A
        out.playNote( 0, 1, "D4" );
        out.playNote( 0, 1, "F#4" );
        out.playNote( 0, 1, "A3" );
      }
    if (key == 'g') {    // G  G  B  D

        out.playNote( 0, 1, "G3" );
        out.playNote( 0, 1, "B4" );
        out.playNote( 0, 1, "D4" );
      }
  }

回答

draw() の中で loopSound.loop() を呼んでいるのが原因です。

draw() は毎フレーム (デフォルトだと毎秒 60 フレーム) 実行され、そのつど loop() が呼ばれるため、質問文にあるような状態になっているのだと思います。

実際には loop() は一度だけ呼べばよいので、setup() の中に書けば期待通りに動作します。

void setup(){
  minim = new Minim( this );
  loopSound = minim.loadFile("loopSound.mp3");
  out = minim.getLineOut();
  loopSound.loop();
}
void draw(){
}

エラーメッセージについては、MP3 ファイルの ID3 タグ (https://ja.wikipedia.org/wiki/ID3%E3%82%BF%E3%82%B0) の読み込みに失敗したために出力されているもののように見えます。

動作に問題がなければ無視しても良さそうですが、気になるのであれば、何らかのツールで ID3 タグを編集するか、wav など別のフォーマットに変換してもいいかもしれません。

編集 履歴 (1)
  • labochoさんご回答ありがとうございました。
    お陰様で正しく動作させることができました。
    使っている関数などの性質を使う前にしっかりと把握する必要がありますね、今後は気を付けます。本当にありがとうございました!
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。