Help us understand the problem. What is going on with this article?

【micro:bit】micro:bit入門

記事一旦全削除しました。

【micro:bit】micro:bit入門

参考書籍のサンプルコードを打ってみたのですが…音が鳴りません。OSCで連携が出来ないので困っています…。いつか「あっ!」とわかる日がくるかもしれないのでアウトプットしておきます。

環境構築

パソコンとUSBケーブルとmicro:bitを用意しmakecodeエディターを使ってマイコンボードを動かしました。また、ProcessingSonicPiをインストールしました。

疑問点

micro:bit + Processing + SonicPi の連携に挑戦してみましたが挫折しています。参考文献の「プログラム×工作でつくるmicro:bit」のサンプルコードを引用しました。
1. ProcessingのContributionManagerからにOscP5ライブラリをインストールしました。
2. sonicPiの MSI Installerをインストールしました。バージョンはSonic Pi v3.2.2の現時点では最新です。(sonic3.0以降でOSCに対応しています)
3. Processingのバージョンも最新の3.5.4 (17 January 2020)です。
4. SonicPiのOSCサーバの有効もチェックされています。
5. SonicPi側でOSCを受けて音を生成するプログラムを実行しました(次項参照)
6. SonicPiにOSCを送出するProcessingのプログラムを実行しました(次項参照)
7. ピアノの鍵盤の画面が表示されキーボードから入力しました。
8. あれSonicPiから楽器のような音が聞こえてくるはずなのに聞こえてきません。
9. 音が鳴らない…しょんぼり

サンプルコード(Processing01)

//  micro:bit+Processing+SonicPiの連携
//  micro:bitをつかわず、ProcessingとSonicPiの連携(OSCのみ)

int[]   key_x    = {0, 50, 100, 150, 200, 300, 350, 400, 450, 500, 550, 600, 700};
int[]   key_order = {0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0};
float[] bright   = new float[13];


void setup() {
  //画面サイズを800x400にする
  size(800, 400);
  //OSC通信を始める
  oscOpen();
}

void draw() {
  drawMain();
}


//画面を描画するプログラム
void drawMain() {
  //背景を黒に
  background(0, 0, 0);

  //白い鍵盤の表示
  for (int i=0; i<13; i++) {
    if (key_order[i]==0) {
      fill(255*(1.0-bright[i]));
      rect(key_x[i], 0, 95, 400, 4);
    }
  }
  //黒い鍵盤の表示
  for (int i=0; i<13; i++) {
    if (key_order[i]==1) {
      fill(55+200*bright[i]);
      rect(key_x[i], 0, 75, 240, 4);
    }
  }
  //すべての鍵盤の判定
  for (int i=0; i<13; i++) {
    bright[i] *= 0.9;
  }

  //文字表示
  textSize(24);
  textAlign(RIGHT, CENTER);
  fill(50);
  rect(720, 330, 70, 45, 4);
  fill(255);
  text("OSC", 780, 350);
}


//キーボードでSonicPiへOSC送信
void keyPressed() {
  if (key=='z') {
    bright[0]=1.0;
    sendOscSonicPi(72);  //SonicPiへOSC送信(oscタブ内)
  }
  if (key=='s') {
    bright[1]=1.0;
    sendOscSonicPi(73);  //SonicPiへOSC送信(oscタブ内)
  }
  if (key=='x') {
    bright[2]=1.0;
    sendOscSonicPi(74);  //SonicPiへOSC送信(oscタブ内)
  }
  if (key=='d') {
    bright[3]=1.0;
    sendOscSonicPi(75);  //SonicPiへOSC送信(oscタブ内)
  }
  if (key=='c') {
    bright[4]=1.0;
    sendOscSonicPi(76);  //SonicPiへOSC送信(oscタブ内)
  }
  if (key=='v') {
    bright[5]=1.0;
    sendOscSonicPi(77);  //SonicPiへOSC送信(oscタブ内)
  }  
  if (key=='g') {
    bright[6]=1.0;
    sendOscSonicPi(78);  //SonicPiへOSC送信(oscタブ内)
  }  
  if (key=='b') {
    bright[7]=1.0;
    sendOscSonicPi(79);  //SonicPiへOSC送信(oscタブ内)
  }
  if (key=='h') {
    bright[8]=1.0;
    sendOscSonicPi(80);  //SonicPiへOSC送信(oscタブ内)
  }
  if (key=='n') {
    bright[9]=1.0;
    sendOscSonicPi(81);  //SonicPiへOSC送信(oscタブ内)
  }
  if (key=='j') {
    bright[10]=1.0;
    sendOscSonicPi(82);  //SonicPiへOSC送信(oscタブ内)
  }
  if (key=='m') {
    bright[11]=1.0;
    sendOscSonicPi(83);  //SonicPiへOSC送信(oscタブ内)
  }
  if (key==',') {
    bright[12]=1.0;
    sendOscSonicPi(84);  //SonicPiへOSC送信(oscタブ内)
  }
}

サンプルコード(Processing02)

osc
import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;

//OSC通信を始める
void oscOpen() {
  //ProcessingのOSC受信ポート(今回はOSC受信しないがこのプログラムでは必要になる)
  oscP5 = new OscP5(this, 50000);

  //ProcessingからOSC送信,SonicPiがOSC受信するポート
  //SonicPiの受信ポートは、4559と決まっている
  myRemoteLocation = new NetAddress("localhost", 4560);
}


//SonicPiへOSC送信する
void sendOscSonicPi(int nt) {
  //OSCメッセージを作る
  OscMessage myMessage = new OscMessage("/fromP5");
  //このメッセージにntを追加する
  myMessage.add(nt); 
  //OSCメッセージを、myRemoteLocation宛てに送る
  oscP5.send(myMessage, myRemoteLocation);
}


//以下のコードをSonicPiにコピーする
/*
##ここから
 live_loop :synth do
 use_real_time
 x, = sync "/osc/fromP5"
 synth :beep, note: x
 end
##ここまで 
 */

サンプルコード(SonicPi)

live_loop :microbit do
  use_real_time
  x, = sync "/osc/fromP5"
  if(x!=nil)
    synth :beep, note: x
  end
end

参考文献

この記事は以下の情報を参考にして執筆しました。1.fms_sound171220.pdf  2.「プログラム×工作でつくるmicro:bit」

ne230025
Twitter始めました。https://twitter.com/ne230025
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした