第4回 データ処理・micro:bit 連携
Pd でデータを処理する方法を学び、micro:bit のセンサデータを Pd で受信して音に変換する方法をマスターします。
今回のゴール
- 閾値処理・分岐処理でデータを判定できるようになる
- micro:bit とPd をシリアル通信(OSC)で接続できるようになる
- センサデータのマッピング・スムージングができるようになる
Part 1: データ処理
センサから受け取ったデータを「どう判定するか」がインタラクティブ作品の鍵です。ここでは、値の判定に使う基本的なテクニックを学びます。
閾値処理 1: sel, else/above
閾値(しきいち) とは、「ある値を超えたかどうか」を判定する境界値のことです。
sel(select)
sel は入力が指定した値と 一致したとき に bang を出力します。
sel 100- 左アウトレット: 値が 100 のとき bang を出力
- 右アウトレット: 100 以外のとき、その値をそのまま出力
else/above
else/above は入力が指定した値を 超えたとき に bang を出力します。
else/above 50値が 50 を超えた瞬間に bang が出力されます。

閾値処理 2: 範囲内の判定
値が 特定の範囲内にあるかどうか を判定するには、2つの比較演算を組み合わせます。
>= 30 (30以上か?)
<= 70 (70以下か?)両方の条件を &&(AND)で組み合わせると、「30〜70 の範囲内」を判定できます。

閾値処理 3: change
change は入力値が 変化したとき だけ出力します。同じ値が連続して入力されても、出力しません。
changeセンサデータは同じ値が連続することが多いため、change を使って「値が変わったときだけ処理する」ことで、不要な処理を減らせます。

分岐処理 1: sel による分岐
sel に複数の値を指定すると、値に応じた 分岐 ができます。
sel 1 2 3- 1番目のアウトレット: 値が 1 のとき bang
- 2番目のアウトレット: 値が 2 のとき bang
- 3番目のアウトレット: 値が 3 のとき bang
- 最後のアウトレット: どれにも一致しないとき、値をそのまま出力

分岐処理 2: 値の範囲による分岐
値の範囲に応じて異なる処理をする場合は、複数の比較演算を組み合わせます。
例: センサの値を3段階に分ける
- 0〜30: 「弱い」
- 31〜70: 「中くらい」
- 71〜100: 「強い」

分岐処理 3: change + 分岐
change と分岐を組み合わせると、「状態が変わったときだけ処理する」パターンが作れます。
例: センサ値が閾値を超えた瞬間に音を鳴らし、下回った瞬間に音を止める。

データ処理 練習問題
問題1
ナンバーボックスの値が 50 以上 のとき「bang」を出力するパッチを作ってください。
ヒント
>= 50 オブジェクトと sel 1 を組み合わせます。>= 50 は条件が真なら 1、偽なら 0 を出力します。
問題2
ナンバーボックスの値が 20〜80 の範囲 にあるとき、ナンバーボックスに値を表示するパッチを作ってください。
ヒント
>= 20 と <= 80 の両方が 1 のとき、&& の結果が 1 になります。sel 1 で bang を出し、spigot や条件分岐で値を通過させます。
問題3
入力値が 変化したとき だけ、コンソールに値を表示するパッチを作ってください。
ヒント
change → print と接続します。print オブジェクトは入力された値を Pd コンソールに表示します。
問題4
入力値に応じて3種類の音(低い音・中くらいの音・高い音)を鳴らし分けるパッチを作ってください。
ヒント
値の範囲で分岐し、各分岐先で異なる周波数のメッセージを osc~ に送ります。
Part 2: micro:bit との連携
micro:bit のセンサデータを Pd に送信し、リアルタイムに音を制御する方法を学びます。
シリアル通信の仕組み
micro:bit と PC は USB ケーブル を通じてシリアル通信でデータをやり取りできます。この授業では、シリアルデータを OSC(Open Sound Control) というプロトコルに変換して Pd に送ります。
データの流れ:
micro:bit → USB(シリアル通信)→ SerialOSCConverter → OSC → PdOSC とは
OSC(Open Sound Control) は、音楽・メディアアート用に設計された通信プロトコルです。
- ネットワーク(UDP)を使ってデータを送受信する
- アドレスパターン(例:
/microbit/accelerometer/x)でデータを識別する - 数値、文字列などのデータを送れる
SerialOSCConverter の使い方
SerialOSCConverter は、micro:bit のシリアルデータを OSC に変換するアプリケーションです。
起動手順
- SerialOSCConverter を起動する
- micro:bit を USB ケーブルで PC に接続する
- SerialOSCConverter の画面で:
- Serial Port: micro:bit が接続されているポートを選択する
- Baud Rate:
115200を選択する(micro:bit のデフォルト) - OSC Port:
8000(デフォルト)を確認する
- Connect ボタンをクリックする
- micro:bit からデータが届くと、画面にデータが表示される
ポートが見つからない場合
- micro:bit が正しく USB 接続されているか確認する
- USB ケーブルがデータ転送対応か確認する(充電専用ケーブルではデータ転送できません)
- ドライバが必要な場合はインストールする
MakeCode 側の設定
micro:bit のプログラムで シリアル通信 を使ってデータを送信する必要があります。MakeCode の「シリアル通信」カテゴリから「シリアル通信で値を送る」ブロックを使います。
OSC データの受信
Pd で OSC データを受信するには、else ライブラリの osc.receive と osc.route を使います。
手順
else/osc.receive 8000を配置する(ポート 8000 で受信)else/osc.route /microbit/accelerometerを配置するosc.receive→osc.routeと接続するosc.routeの各アウトレットからセンサデータが出力される

トリガーメッセージの送受信
ボタンが押されたときなどの トリガー(瞬間的なイベント) も OSC で送受信できます。
- micro:bit 側: ボタンが押されたとき
"button_a"とシリアル送信する - Pd 側:
osc.routeで/microbit/button_aをルーティングして bang として受け取る
センサデータのマッピング
micro:bit のセンサ値(例: 加速度 -1024〜1024)を、Pd で使いたい範囲(例: 周波数 200〜2000 Hz)に変換する必要があります。
cyclone/scale
cyclone/scale は値の範囲を別の範囲にマッピング(変換)します。
cyclone/scale -1024 1024 200 2000- 入力範囲: -1024 〜 1024
- 出力範囲: 200 〜 2000
入力値 0 → 出力値 1100(中間値)

クリップ(値の制限)
センサデータは想定外の値が出ることがあります。clip、max、min を使って値の範囲を制限します。
| オブジェクト | 機能 |
|---|---|
clip 0 100 | 値を 0〜100 の範囲に制限する |
max 0 | 値が 0 未満なら 0 にする(下限) |
min 100 | 値が 100 を超えたら 100 にする(上限) |
max / min の名前に注意
Pd の max は「最小値を制限する」(下限を設定する)オブジェクトで、min は「最大値を制限する」(上限を設定する)オブジェクトです。一般的な意味と逆に感じるかもしれませんが、「出力の最大値は少なくともこの値」(max)、「出力の最小値は多くともこの値」(min)と覚えましょう。

平滑化処理(スムージング)
センサデータは ノイズ(細かな揺れ)を含むため、そのまま使うとガタガタした制御になります。平滑化(スムージング) で値の変化を滑らかにします。
方法1: lop~ でシグナルを平滑化
lop~(ローパスフィルタ)はシグナルの高周波成分を除去するため、結果的に値が滑らかになります。
sig~ → lop~ 5 → snapshot~カットオフ周波数を低くするほど(例: lop~ 1)滑らかになりますが、反応が遅くなります。

方法2: else/smooth~
else/smooth~ は平滑化に特化したオブジェクトです。
else/smooth~ 50引数の値が大きいほど滑らかになります。

else/s2f~ — シグナルを値に戻す
平滑化した結果はシグナル(~)のままなので、値(メッセージ)を受け取るオブジェクトに渡すには再び値に変換する必要があります。else/s2f~ を使うと、snapshot~ + metro の組み合わせよりシンプルに値化できます。
平滑化の度合い
平滑化が強すぎると反応が鈍くなり、弱すぎるとノイズが残ります。作品の特性に合わせて調整してください。
【発展】変化量の検出
値そのものではなく、値の 変化量(どれだけ急に変わったか)を検出すると、「素早く動かした」「ゆっくり動かした」といった動きの質を判定できます。
方法
- 現在の値と1つ前の値の差分を計算する
- 差分の絶対値が閾値を超えたら「急な変化」と判定する

応用例
- 加速度の変化量が大きい → 打楽器のように短い音を鳴らす
- 変化量が小さい → 弦楽器のように持続音を出す
- 変化の方向(正/負)で異なる効果を与える
micro:bit 連携 練習問題
問題1
micro:bit の 加速度センサ(X軸) の値を Pd で受信し、ナンバーボックスに表示するパッチを作ってください。
ヒント
else/osc.receive 8000 → else/osc.route /microbit/accelerometer/x → ナンバーボックス と接続します。
問題2
加速度センサ(X軸)の値を 200〜2000 Hz にマッピングし、osc~ の周波数を制御するパッチを作ってください。
ヒント
cyclone/scale -1024 1024 200 2000 を使ってマッピングし、osc~ に接続します。
問題3
問題2のパッチに 平滑化処理 を追加して、音の変化を滑らかにしてください。
ヒント
マッピング後の値を sig~ → lop~ 5 → snapshot~ → osc~ の順で処理します。または else/smooth~ を使います。
問題4
micro:bit の ボタンA が押されたとき、正弦波の音を 1秒間だけ 鳴らすパッチを作ってください。
ヒント
osc.route でボタンの OSC メッセージを受け取り、bang → vline~ のエンベロープ → *~ → output~ の流れで音を制御します。
問題5
加速度の Z軸 の値に応じて音量を変化させるパッチを作ってください(micro:bit を傾けると音量が変わる)。
ヒント
Z軸の値を cyclone/scale で 0〜1 にマッピングし、clip 0 1 で範囲を制限してから *~ で音量を制御します。
問題6
明るさセンサの値に応じて フィルタのカットオフ周波数 を変化させるパッチを作ってください。明るいときは高い周波数まで通し、暗いときはこもった音になるようにします。
ヒント
ノイズ(noise~)→ lop~ → output~ と接続し、明るさセンサの値を cyclone/scale 0 255 100 5000 でマッピングして lop~ の右インレットに接続します。
問題7
micro:bit を 振ったとき にだけ音を鳴らすパッチを作ってください(加速度の変化量を利用)。
ヒント
加速度の変化量を検出し、変化量が閾値を超えたときに bang → エンベロープ → 音を鳴らす仕組みを作ります。
【発展】練習問題
発展1
3軸の加速度データ(X, Y, Z)を使って、3つのオシレータの周波数をそれぞれ独立に制御 するパッチを作ってください。
ヒント
X → osc~ 1(低音域 100〜500 Hz)、Y → osc~ 2(中音域 500〜2000 Hz)、Z → osc~ 3(高音域 2000〜5000 Hz)のように、各軸を異なる周波数帯にマッピングして +~ でミックスします。
発展2
micro:bit を傾けた角度に応じて ディレイタイム が変化するパッチを作ってください。
ヒント
cyclone/delay~ または else/delay.m~ を使い、加速度センサの値をディレイタイム(例: 50〜500 ms)にマッピングします。
発展3
タッチセンサ で音の種類を切り替え、加速度センサ で音の高さを制御する楽器を作ってください。
ヒント
sel でタッチセンサの値に応じて波形を切り替え(正弦波 / のこぎり波 / 矩形波)、加速度で周波数を制御します。
発展4
自分のオリジナルな インタラクティブサウンドアート のアイデアをスケッチし、プロトタイプを作ってみましょう。
考えるポイント
- どのセンサを使うか(加速度、明るさ、コンパス、タッチ)
- センサの値を何にマッピングするか(周波数、音量、フィルタ、エフェクト)
- どんな「体験」を作りたいか(楽器?環境音?インスタレーション?)
- 演奏方法はどうするか(振る、傾ける、回す、触れる)