
1. はじめに
GoodBrain Web担当の吉川です。本コラムでは、GoodBrain Focus アプリ(GB Focus)の UDP計測 で出力されるEEGデータを、Python でリアルタイム受信・可視化する方法を解説します。
- 対象読者:Python 初中級者/脳波デバイスに興味のある開発者
- 所要時間:環境構築含めて 20〜30 分
最終的な成果物は、下記のようなリアルタイムプロットになります。

目次
2. 用意するもの
ツール | 備考 |
PC | 筆者は Mac M1, 2020, Seequoia 15.5 |
Python | 筆者は Python 3.11 |
Python ライブラリ | python-osc, matplotlib |
FocusCalm™ | 脳波デバイス |
GoodBrain Focus | UDP 配信元 |
UDP と OSC の関係
GB Focus の UDP計測から送られてくるデータはOSC形式になっています。UDPとOSCの関係は、ざっくり言えば 「輸送トラック = UDP」と「荷札の形式 = OSC」みたいな感じです。
- UDP (User Datagram Protocol): IPネットワーク層の軽量な通信プロトコル。TCPよりも遅延が少ない(接続確立や再送管理が無いため)。
- OSC (Open Sound Control): UDP/TCP 上で動くメッセージフォーマット+アドレス規約。/Attention のようなアドレスに 32bit/64bit 値を添付して送れる。
今回は python-osc というライブラリで、OSCメッセージのパース(解読)を行います。
3. ライブラリのインストール
まずは、以下の 1 行を実行して、今回使うライブラリをインストールします
pip install matplotlib python-osc
4. OSCの送受信を試す
OSCの送信と受信を行うプログラムを作成してみましょう。
まずは、osc_receiver.py と osc_sender.py を作成します。

osc_receiver.py (受信用プログラム)に以下のコードを記載します。
from pythonosc import dispatcher, osc_server
# 受信するポート番号
PORT = 9000
# 受信したデータを処理する関数
def handler(address, *args):
print(f"{address} → {args}")
# ディスパッチャ(アドレスと関数を紐付ける)を作成
disp = dispatcher.Dispatcher()
# アドレスと関数を紐付ける
disp.map("/test", handler)
# サーバーを起動
print(f"> OSC 受信 (UDP:{PORT}) … Ctrl‑C で終了")
server = osc_server.ThreadingOSCUDPServer(("", PORT), disp) # サーバーを作成
server.serve_forever() # サーバーを起動(Ctrl+Cで終了)
大まかな処理は下記の通り。
- 受信するポート番号の設定
- 関数とアドレスの紐付け
- サーバーの起動
次に、osc_sender.py (送信用プログラム)に以下のコードを記載します。
from pythonosc import udp_client
import time, random
# 送信先の設定
IP = "127.0.0.1" # 受信側のIPアドレス(127.0.0.1は自分自身を指す)
PORT = 9000 # 受信側のポート番号
ADDRESS = "/test" # 送信するアドレス
# 送信クライアントを作成
client = udp_client.SimpleUDPClient(IP, PORT)
# 送信開始
print("> OSC 送信開始 (Ctrl‑C で終了)")
# ターミナルでCtrl+Cを押すまでループ
try:
while True:
val = random.random() # 0.0から1.0のランダムな値を生成
client.send_message(ADDRESS, val) # アドレスと値を送信
time.sleep(1) # 1秒待つ
except KeyboardInterrupt:
print("送信終了")
大まかな処理は下記の通り。
- 送信先の設定
- 送信クライアントの設定
- 送信開始
ターミナル(コマンドプロンプト)を2つ起動し、それぞれのプログラムを実行してみます。
ターミナル1:python osc_receiver.py
ターミナル2:python osc_sender.py

まずは osc_receiver.py を実行


5. 集中度・リラックス度のデータを受信する
osc_receiver.py を拡張して、脳波デバイスのデータを受信できるようにしてみましょう。
まずは、osc_receiver.py を複製して、gbfocus_osc_receiver.py を作成します。


GB Focus から送信されるアドレスは下記の通りです。
- /Attention:集中度
- /Meditation:リラックス度
- /EEG :生波形
- /Bandpower :δ, θ, α, β, γ
- /Acc:加速度
- /Gyro:ジャイロ
- /EulerAngle:デバイスの角度
詳しい情報はこちらのセミナー資料にも記載されているので、合わせてご参照ください。
まずは、/Attention と /Meditation を受信してみます。
13行目以降の「アドレスと関数を紐付ける」処理を、下記の通りに編集しましょう。
# アドレスと関数を紐付ける
addresses = ["/Attention", "/Meditation"]
for address in addresses:
disp.map(address, handler)

GB Focus アプリを開いて、UDP計測を選択します。利用する脳波デバイス(今回は FocusCalm™)を選択すると、ポートの設定画面に遷移します。


ネットワークの「ホスト」は、PCのWiFiの設定等から確認できます。
Macの場合

「送信ポート」は Python のプログラムですでに9000に設定しています。
ポート1(Attention)とポート2(Meditation)を設定します。



ターミナルで gbfocus_osc_receiver.py を実行します。
python gbfocus_osc_receiver.py

GB Focus でデバイスを選択し、計測を開始します。


すると、ターミナルに受信したデータが表示されます。

出力をみてみると、受信できたデータは、(計測値, タイムスタンプ) という形式になっていることがわかります。
/Attention → (40.81196594238281, '2025-07-31 21:26:06.193')
/Meditation → (10.469873428344727, '2025-07-31 21:26:06.195')
これを念頭に、次章からは計測値をリアルタイムでプロットしてみましょう。
ここまでのコードを下記に示します。
from pythonosc import dispatcher, osc_server
# 受信するポート番号
PORT = 9000
# 受信したデータを処理する関数
def handler(address, *args):
print(f"{address} → {args}")
# ディスパッチャ(アドレスと関数を紐付ける)を作成
disp = dispatcher.Dispatcher()
# アドレスと関数を紐付ける
addresses = ["/Attention", "/Meditation"]
for address in addresses:
disp.map(address, handler)
# サーバーを起動
print(f"> OSC 受信 (UDP:{PORT}) … Ctrl-C で終了")
server = osc_server.ThreadingOSCUDPServer(("", PORT), disp) # サーバーを作成
server.serve_forever() # サーバーを起動(Ctrl+Cで終了)
次のページでは、集中度とリラックス度をリアルタイム描画します。