Processing
1 // 一度に送れるデータ(1byte)に変換
2 map(val, 0, 1023, 0, 255);
の部分は
Processing
1 // 一度に送れるデータ(1byte)に変換
2 val = map(val, 0, 1023, 0, 255);
の間違いじゃないでしょうか?(Arduinoが手元にないので確認できませんが)
201~300=Cと割り当てたとして
送受信処理を簡略化させるため、データを1バイト(0~255)に圧縮(センサーの値が0だったら0 1023だったら255 512だったら127に)している(ちょうど↑のコードのところ)ので、256以上は来ません。
arduinoのシリアルモニターでは0~350位は値が動きました
これがセンサーの値なら、Processing側は0~87くらいしか変動しないことになります(数段階の音を出すなら十分すぎですが)
気になった点は以上です。
参考コード
Arduinoがないのでセンサーの代わりに、マウスX座標にさせていただきました(画面内でマウスを左右に動かすと曲が変わります)
データ受信のところをコメント化しましたが、元に戻せばおそらく動くと思います。
素直に書いてみた場合
Processing
1import ddf.minim.Minim;
2import ddf.minim.AudioPlayer;
3import processing.serial.Serial;
4
5Serial port;
6Minim minim;
7AudioPlayer sound0; // 曲 いっこ目
8AudioPlayer sound1; // 曲 にこ目
9AudioPlayer sound2; // 曲 さんこ目
10
11void setup() {
12 size(480, 240);
13 // ↓コメント解除
14 //port = new Serial(this, "COM3", 9600);
15 minim = new Minim(this);
16 sound0 = minim.loadFile("groove.mp3");
17 sound1 = minim.loadFile("jingle.mp3");
18 sound2 = minim.loadFile("groove.mp3");
19}
20
21void draw() {
22 // ↓コメント解除
23 //if (port.available() > 0 ) {
24 // // シリアルデータ受信
25 // int in_data = port.read();
26 int in_data = int(map(mouseX, 0, width, 0, 255)); // これは削除
27
28 if (in_data < 100) { // sound0の範囲だったら...
29 if (!sound0.isPlaying()) { // sound0を再生中でなかったら...(再生中ならそのまま何もしない)
30 sound1.pause(); // 他をポーズ(再生していなくてもポーズを呼ぶこと自体は問題ない)
31 sound2.pause();
32 sound0.loop(); // ポーズ位置から再度ループ再生
33 }
34 } else if (in_data < 200) { // 以下同じように
35 if (!sound1.isPlaying()) {
36 sound0.pause();
37 sound2.pause();
38 sound1.loop();
39 }
40 } else {
41 if (!sound2.isPlaying()) {
42 sound0.pause();
43 sound1.pause();
44 sound2.loop();
45 }
46 }
47 //} // ここもコメント解除
48}
配列と関数を使ってみた場合
Processing
1import ddf.minim.Minim;
2import ddf.minim.AudioPlayer;
3import processing.serial.Serial;
4
5Serial port;
6Minim minim;
7AudioPlayer[] sounds; // 曲の配列
8AudioPlayer playing; // 再生中の曲(最初はnull)
9
10void setup() {
11 size(480, 240);
12 // ↓コメント解除
13 //port = new Serial(this, "COM3", 9600);
14 minim = new Minim(this);
15 sounds = new AudioPlayer[]{
16 minim.loadFile("groove.mp3"), // 曲 いっこ目(配列の番号は0)
17 minim.loadFile("jingle.mp3"), // 曲 にこ目(1)
18 minim.loadFile("groove.mp3"), // 曲 さんこ目(2)
19 };
20}
21
22void draw() {
23 // ↓コメント解除
24 //if (port.available() > 0 ) {
25 // // シリアルデータ受信
26 // int in_data = port.read();
27 int in_data = int(map(mouseX, 0, width, 0, 255)); // これは削除
28
29 if (in_data < 100) { // sounds[0]の範囲だったら...
30 changeSound(sounds[0]); // changeSound関数にsounds[0]を渡して呼ぶ
31 } else if (in_data < 200) { // 以下同じように
32 changeSound(sounds[1]);
33 } else {
34 changeSound(sounds[2]);
35 }
36 //} // ここもコメント解除
37}
38
39void changeSound(AudioPlayer sound) {
40 if (playing == sound) return; // 再生中の曲と同じならそのまま何もしない
41
42 if (playing != null) playing.pause(); // 再生中の曲がnullでない(何か再生している)ならポーズ
43 playing = sound; // 再生中の曲を引数で渡された曲に変更
44 if (playing != null) playing.loop(); // その曲がnullでないならポーズ位置から再度ループ再生(changeSound(null);とすれば何も再生されないようになる)
45}
微妙にやっている内容が違うのがなんですが^^; 2,3曲ならどちらでもいい気がします。