【micro:bit】micro:bit入門


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

2020/08/08追記しました。
本の作者さんの@mathrax-sさんが解決策教えて下さいました。以下に訂正するようです。

【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_Ch09-2-1)

osc
//  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)

osc
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」