【micro:bit】micro:bit入門
記事一旦全削除しました。
2020/08/08追記しました。
本の作者さんの@mathrax-sさんが解決策教えて下さいました。以下に訂正するようです。
【micro:bit】micro:bit入門
参考書籍のサンプルコードを打ってみたのですが…音が鳴りません。OSCで連携が出来ないので困っています…。いつか「あっ!」とわかる日がくるかもしれないのでアウトプットしておきます。
環境構築
パソコンとUSBケーブルとmicro:bitを用意しmakecodeエディターを使ってマイコンボードを動かしました。また、ProcessingとSonicPiをインストールしました。
疑問点
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)
// 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)
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」
Author And Source
この問題について(【micro:bit】micro:bit入門), 我々は、より多くの情報をここで見つけました https://qiita.com/ne230025/items/a9f096f574a5af9c7dd5著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .