ゆれると音が変わって、さえずるようなイメージ。
机に置いてちょんちょんとゆらすと音が変わる。
たまに鳥の声がする。
アイデアをスケッチし、ゆれやすい形を考えました。
スチレンボードで作りながら、micro:bitがグラグラしないように固定できる構造を考えています。
スチレンボードで、micro:bitがちょうど入る幅の溝をつくり、差し込むことにしました。
micro:bitの加速度センサをつかっているので、ねらったように「ゆらゆら」で音や絵を変えるには、グラグラしないように固定するのがポイントです。
クランプで固定して接着。乾燥待ちです。
micro:bitでは、Bluetoothで加速度センサXYZの値を、コンマ区切りの文字列に整えて、送ります。
micro:bitから送られてきた加速度センサXYZの数から、音と絵のパラメータを変えています。
// Web Bluetooth API
// micro:bit program
// https://makecode.microbit.org/_awv6hADDWCM3
//一定時間おきに
//音を鳴らす
//画像をもとに色をつくる
//ランダムに図形を描く
let timestamp = 0;
let mySound=[];
let img;
let i_x = 0;
let i_y = 0;
let i_w = 0;
let i_h = 0;
let r = 0;
let c;
let count = 0;
let latestData = []; // デバイスから送信した数だけデータが入る
function preload() {
//https://taira-komori.jpn.org/playing01.html
mySound[0] = loadSound("sound/guitar3.mp3");
mySound[1] = loadSound("sound/guitar4.mp3");
mySound[2] = loadSound("sound/river_bird.mp3");
mySound[3] = loadSound("sound/bulbul.mp3");
//画像の大きさは、canvasのサイズと同じにすると考えやすい
img = loadImage("grass.jpg");
}
function setup() {
createCanvas(500, 500);
//背景を塗る
background(210, 240, 220);
//通信接続ボタン
const connectButton = createButton("Connect");
connectButton.mousePressed(connectButtonPressed);
const disconnectButton = createButton("Disconnect");
disconnectButton.mousePressed(disconnectButtonPressed);
}
function draw() {
//データが3つ以上あるとき
if (latestData.length>=3) {
let data1 = int(latestData[0]);
let data2 = int(latestData[1]);
let data3 = int(latestData[2]);
let xx1 = map(data1, -1023, 1023, 1, 10);
let xx2 = map(data2, -1023, 1023, 0, 100);
let xx3 = map(data3, -1023, 1023, 0, 100);
//150ミリ秒おきに
if (millis() - timestamp > 150) {
timestamp = millis();
if (count%4==0) {
// 音をならす
mySound[0].amp(0.2); //音の大きさ
mySound[0].rate(int(xx1)*0.25); //音の速さ
mySound[0].play();
}
if (count%4==2) {
// 音をならす
mySound[1].amp(0.2); //音の大きさ
mySound[1].rate(int(xx1)*0.25); //音の速さ
mySound[1].play();
}
//値によって音をならす
// print(xx3);
if (xx3>80) {
// 音をならす
mySound[2].amp(0.3); //音の大きさ
mySound[2].rate(int(xx1)*0.25); //音の速さ
mySound[2].play();
}
// print(xx2);
if (xx2<50) {
// 音をならす
mySound[3].amp(0.3); //音の大きさ
mySound[3].rate(int(xx1)*0.25); //音の速さ
mySound[3].play();
}
//画像の座標とサイズと回転
i_x = random(0, 50)*10;
i_y = random(0, 50)*10;
i_w = xx1*10; //random(10, 500);
i_h = xx1*10; //random(50, 10);
r = random(0, 360);
count++;
}
//座標を画面の外に
push();
//移動と回転
translate(i_x, i_y);
angleMode(DEGREES);
rotate(r);
//線の色と太さ
noStroke();
// strokeWeight(0.5);
// stroke(255, 50);
//画像をもとに色をしらべる
//(画像は表示してない)
c = img.get(i_x, i_y);
//塗り色をしらべた色に
fill(red(c), green(c), blue(c), 10);
//四角を描く
rectMode(CENTER);
rect(0, 0, i_w, i_h);
//座標を画面にもどす
pop();
}
}
あまりイメージを固定しないよう、楽器に近いの音を選んでみました。
音は自分で編集できればそれがよいのですが、フリー素材のサイトで探してみました。
https://maou.audio/category/se/se-inst/
https://taira-komori.jpn.org/playing01.html
最初は「ド」「レ」「ミ」のような音を組み合わせて音を鳴らしてみたのですが、シンプルすぎて寂しく感じたので、次のプログラムで工夫しています。
センサで再生速度を変えて、音の高さを変える
工夫したところは、サウンドファイルの再生速度を変えて音階を変えているところです。
再生速度を速くすると高い音に聞こえ、遅くすると低く聞こえます。めちゃくちゃに速度を変えると、不協和音が多くなってしまうので、「整数倍」で変化するようにしています。
たとえば、2倍速になると1オクターブ上の音階になり、1/2倍速すると1オクターブ下の音階になります。このことを利用して、micro:bitのセンサに応じて再生速度を変え、不協和音になりにくい音に変えています。
let data1 = int(latestData[0]);
変数「data1」に、micro:bitの加速度センサXの値を、「int」で整数にして、小数点以下をカットして設定しています。
let xx1 = map(data1, -1023, 1023, 1, 10);
さらに変数「xx1」では、「data1」の-1023〜1023の範囲を、1〜10に整えています。
// 音をならす
mySound[0].amp(0.2); //音の大きさ
mySound[0].rate(int(xx1)*0.25); //音の速さ
mySound[0].play();
「mySound[0].rate()」の、カッコ内に、再生速度を入れます。
ここでは、1〜10の範囲になった「xx1」を、整数にした、0.25を掛け算しています。
その結果、0.25〜2.5の範囲になるので、再生速度は、0.25刻みとなり、
0.25・0.5・0.75・1.0・1.25...2.5、
という感じで変化します。
センサがしきい値を超えたら、音を鳴らす
センサの値の「ある値を超えたら」というプログラムで、音を鳴らしています。
このとき「鳥のさえずり」の音を鳴らしているので、たまに鳥が鳴くように聞こえます。
この「ある値」は、境目になる値で「しきい値」といいます。
実際にどんな値がきているのか、「print」で確認しながらつくるとよいでしょう。
let data3 = int(latestData[2]);
変数「data3」に、micro:bitの加速度センサZの値を、「int」で整数にして、小数点以下をカットして設定しています。
let xx3 = map(data3, -1023, 1023, 0, 100);
さらに変数「xx3」では、「data3」の-1023〜1023の範囲を、0〜100に整えています。
//値によって音をならす
// print(xx3);
if (xx3>80) {
// 音をならす
mySound[2].amp(0.3); //音の大きさ
mySound[2].rate(int(xx1)*0.25); //音の速さ
mySound[2].play();
}
xx3が「80を超えたら」というプログラムで、音を鳴らしています。
このとき「鳥のさえずり」の音を鳴らしているので、たまに鳥が鳴くように聞こえます。
この「80」は、境目になる値で「しきい値」といいます。
実際にどんな値がきているのか、「print」を有効にして、コンソールで確認しながらつくるとよいでしょう。
print(xx3);
「print」の「//」を削除すると有効になります。これでコンソールに「xx3」の値を表示することができます。
本番では、「print」のまえに「//」を追加し、無効にしたほうが、サクサク動きます。