Python OSC (python-osc)


OSC (OpenSound Control) は、MIDI の代替となる電子楽器用の通信プロトコルです。

python-osc
前回は pyOSC を試した ので、今回は python-osc を試します。

インストールする

$ pip3 install python-osc

ソースとサンプルは github にあります。

動作確認
サンプルを試します。

(1) サーバー(受信)側を起動する

$ python3 simple_server.py

Serving on ('127.0.0.1', 5005)

(3) 別のターミナルで、クライアント(送信)側を起動する

$ python3 simple_client.py

Sending b'/filter\x00,f\x00\x00;2N\xfd'
... 

(3) 受信側のターミナルで、下記のような表示が出れば、OKです。

/filter 0.002720772521570325
/filter 0.31352025270462036
...

Python OSC (pyOSC)


OSC (OpenSound Control) は、MIDI (Musical Instrument Digital Interface) の代替となる電子楽器用の通信プロトコルです。
ちなみに、メッセージを送信する側を OSC クライアント、受信する側を OSC サーバーと言います。

Python などの多くの言語でサポートされています。
また、Pure Data などの音楽アプリや、Android や iPhone などの電子機器でもサポートされています。
電子楽器に限らず、汎用的な通信プロトコルとしても利用されています。

Python の OSC 対応には、Python 2 用の pyOSC と、Python 3 用の python-osc があります。

pyOSC
まずは、pyOSC を試します。
PyPI からソースをダウンロードする。
インストールする

$ python setup.py install

ドキュメントは pyOSC wiki にあります
サンプルは pyOSC examples にあります

動作確認
サンプルを試します。

(1)受信側を起動する

$ python basic_receive.py
 
Registered Callback-functions are :
default
/info
/arduino/analog
/error
/print
Starting OSCServer. Use ctrl-C to quit.

(2) 別のターミナルで、送信側を起動する

$ python basic_send.py 

(3) 受信側のターミナルで、下記のような表示が出れば、OKです。

OSCServer: OSCMessage '/print' from localhost:64300: [1234]
---
received new osc msg from localhost:60478
with addr : /arduino/analog
typetags i
data [4321]
---
OSCServer: OSCMessage '/print' from localhost:59731: [44, 4.5233001708984375, 'the white cliffs of dover']
...

micro:bit 互換機の不良対策


Maker Faire で購入したスイッチサイエンスの micro:bit 互換機に、Bボタンが動作しないという不良があります。
スイッチサイエンスから 修正案 が提示されています。
黄色のように、2箇所カットしてジャンパーする。

しかし、水色のように、長めにカットするの方が簡単ではないかと思う。
ミニドリルでパッド面をゴシゴシ削ってみた。
無事、直ったようです。
20160818_chibi_bit_pattern 20160818_chibi_bit_correction

対策後の動作確認。
Bボタンを押したときだけ、Bと表示するようになった。
対策前は、Bボタンを押さなくとも、Bと表示されていた。
20160818_chibi_bit_test


ラズパイを音楽プレイヤーにする


ラズパイを音楽プレイヤーにするには、
MPD (Music Player Daemon) を使用します。

MPD (Music Player Daemon) は、その名の通りデーモンで、操作画面はありません。
その代わりに、多くのクライアント・ソフトが存在します。
Android や iPhone などの機器からも操作できます。

インストール

$ sudo apt-get install mpd mpc
$ sudo apt-get install chkconfig

設定ファイル

$ sudo nano /etc/mpd.conf

共通の設定

# ディレクトリを変更する
music_directory "/home/pi/music"
playlist_directory "/home/pi/playlists"

# エラーが出ることがあるので、回避策
#bind_to_address "localhost"

# データベースの自動更新
auto_update "yes"

ラスパイのオーディオ端子に出力する場合

# デフォルトの設定です
audio_output {
        type            "alsa"
        name            "My ALSA Device"
}

ストリーム配信する場合

# alsa をコメントにして
#audio_output {
#        type            "alsa"
#        name            "My ALSA Device"
#}

# httpd を有効にする
audio_output {
       type            "httpd"
       name            "My HTTP Stream"
       encoder         "vorbis"  
       port            "8000"
       bind_to_address "0.0.0.0" 
       bitrate         "128" 
       format          "44100:16:1"
}

ディレクトリを作成する

$ mkdir /home/pi/music
$ mkdir /home/pi/playlists
$ chmod 755 /home/pi/music
$ chmod 755 /home/pi/playlists/

自動起動にする

$ sudo chkconfig mpd on

音楽ファイルの設定
/home/pi/music に音楽ファイルを入れる

mpd からアクセスできるようにする

$ chmod -R 755 /home/pi/music

クライアントの設定と操作
プレイリストを登録する

$ mpc ls  | mpc add 

プレイリストを再生する

$ mpc play

プレイリストを終了する

$ mpc stop

無線LANアクセスポイント化する
Android や iPhone などの外部機器から操作できるようにします。
具体的には 無線LANアクセスポイント化する をご覧ください。
SSIDを raspi-music にする。
無線LANのIPアドレスを 192.68.42.1 にする。

Android から操作する
MPDroid をインストールします。
無線LANのアクセスポイントに raspi-music を選択する。
Host に無線LANのIPアドレス 192.68.42.1 を設定する
Password は不要です。

こんな風に、音楽プレイヤーを操作します
20160801_mpdroid

iPhone から操作する
MPoD をインストールする

参考
Music Player Daemon – arch wiki
Raspberry Pi 2 Model Bでミュージックサーバを構築してみた
Music Player Daemon (MPD) を使ってみる
MPDroid の使い方
MPDroid – google play


Sumobot を Scratch から制御する


20160801_sumobot_scrach

Scratch と Python の連携 の応用として、
Sumobot を Scratch から制御します。

作成したプログラムは Github で公開しました。

主な作成手順
(1) MAC にて、Scratch プロジェクトを作成します。
画像をクリックすると、broadcast メッセージを送信する。
画像とメッセージの対応
– 上向き (forward) : “f”
– 下向き (backward) : “b”
– 左回り (left) : “l”
– 右回り (right) : “r”
– 停止 (stop) : “s”

(2) MAC にて、Python プログラムを作成します。
broadcast メッセージを受信して、Sumobot を移動する。
3秒後に停止する。

(3) Rapberry Pi (Sumobot) に転送します。

操作
(1) MAC から Rapberry Pi に VNC で接続します。
(2) Scratch プロジェクトを起動します。
(3) Python プログラムを起動します。
(4) Scratch の画像をクリックすると、Sumobot が移動します。


Scrach と Python の連携


Scrach は、初心者向けのプログラミング言語学習環境です。
ブロックを組み合わせてプログラムを作る ビジュアルプログラミング言語 の代表格です。

注意
Scrach の最新版は バージョン 2.0 ですが。
この記事は バージョン 1.4 について述べています。
Scratch のサイト からダウンロードできます。

遠隔センサー
Scrach 1.4 には、遠隔センサー (Remote Sensors) という機能があります。
仕様は Scratch Wiki に記述されています。
Remote Sensors Protocol

日本語で解説している記事もあります。
Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する

簡単に説明すると。
ポート 42001 を使ったソケット通信です。
メッセージの形式は、本文のサイズ (4バイト)+本文 (nバイト) です。
メッセージは2種類あり、broadcast と sensor-update です。

Python との連携
Python では、遠隔センサーを使うための py-scratch というモジュールが公開されています。
今回は、これを使用しますが。
プログラム本体は、150行とコンパクトなので、自分なりに改版して使うのも良さそうです。

py-scratch のインストール
(1) サイト からモジュールをダウンロードする

(2) インストールする

$ sudo python setup.py install
...
Finished processing dependencies for scratch==0.0.1a

動作確認1 : Python から Scratch へ
Python から broadcast メッセージを送信し、Scratch の猫を移動させる。
メッセージは、アルファベット1文字です。
c : 中心に移動する
l : 左に移動する
r : 右に移動する
u : 上に移動する
d : 下に移動する
20160801_python_to_scrach

動作確認2 : Scratch から Python へ
Scratch の画像をクリックすると、broadcast メッセージを送信し、Python にてメッセージを表示する。
画像とメッセージの対応。
ねこ : cat
いぬ : dog
うま : horse
20160801_scrach_to_python

プログラム
作成したプログラムは Github で公開しました。


PokemonGo Android RE を試す


ポケモンGO は、スマホ・アプリです。
Android 版がリバース・エンジニアリングされて、Github で公開されています。
PokemonGo_Android_RE

Android アプリは、簡単にリバース・エンジニアリングできます。
そのためのツールも公開されています。
しかし、それで再生したコードを公開するのは、どうなんでしょうね。

とは言いながら、せっかく公開されているので、ビルドしてみました。

ビルド
(1) Android プロジェクトをダウンロードする。
(2) Android Studio の環境を合わせる。
– Android SDK : 24
– Android Build Tools : 23.0.3
(3) Unity をインストールする
特に問題なくビルドできた。

インストール
エミュレータにインストールする。
メニュ画面にアイコンが表示された。
20160728_pokemon_go_android

実行
しかし、実行すると、エラーになります。

Failed to register non-native method UnitySendMessage as native

PokemonGo Map を試す


ポケモンGO は、ナイアンティック社のサーバーと通信しながら、ゲームが進行します。
この通信部分がハックされて、Github で公開されています。
その1つ PokemonGo Map を試してみました。

インストール
ソースをダウンロードする

$ sudo -H pip install -r requirements.txt

Google Maps API キーを取得して、
config/credentials.json に書き込みます。

起動

$ python runserver.py -a AUTH_SERVICE -u USERNAME -p PASSWORD -l LOCATION -st STEP_LIMIT

AUTH_SERVICE は、google か ptc
USERNAME は、gmail アドレス (googleの場合)
PASSWORD は、gmail アドレスのパスワード (googleの場合)
LOCATION は、例えば “Yokohama, Japan”
STEP_LIMIT は、例えば 10

確認
WEBブラウザでアクセスする

http://localhost:5000

こんな風に、ポケモンがいる場所が表示される。
20160726_okemon_go;_map


ポケモンGOの非公式APIを試す


ポケモンGO は、ナイアンティック社のサーバーと通信しながら、ゲームが進行します。
この通信部分がハックされて、Github で公開されています。

その1つ pgoapi – a python pokemon go api lib/demo を試してみました。
下記の注意書きがあります。
・これは非公式です。自分の責任で使用してね。
・私は ポケモンGO をやらないよ。
・ボットや金稼ぎのコードは入ってないよ。

インストール
ソースをダウンロードする

$ python setup.py install
Finished processing dependencies for pgoapi==1.1.0

起動

$ python pokecli.py -a AUTH_SERVICE -u USERNAME -p PASSWORD -l LOCATION

AUTH_SERVICE は、google か ptc
USERNAME は、gmail アドレス (googleの場合)
PASSWORD は、gmail アドレスのパスワード (googleの場合)
LOCATION は、例えば “Yokohama, Japan”

レスポンス
下記のようなレスポンスが返ってきます

{ 'api_url': ***,
'auth_ticket': {***},
'request_id': ***,
'responses': {
	'GET_PLAYER': {***},
	'GET_INVENTORY': {***}
}

GET_PLAYER には、プレイヤーのプロファイルが、
GET_INVENTORY には、捕獲したポケモンの情報が入っています。

例えば

'pokemon_data': {  
  'pokemon_id': 25,  
  'captured_cell_id': 6924438341447319552L,
  'cp': 11,
  'creation_time_ms': 1469193683258L,
  'height_m': 0.5040460228919983,
  'weight_kg': 10.100167274475098
  'id': 6317937124603386989L,
  'individual_attack': 10,
  'individual_defense': 10,
  'individual_stamina': 10,
  'move_1': 219,
  'move_2': 78,
  'stamina': 10,
  'stamina_max': 10
}

examples の中に、ポケモン(pokemon) と 攻撃技(moves) の一覧があります。
pokemon_id 25 は、ピカチュウ(Pikachu)
move 78 は、かみなり(Thunder)
move 219 は、でんこうせっか(Quick Attack)

20160725_pikachu


Python ローカルのIPアドレスを取得する


Python コード
ローカルのIPアドレスを取得する

import socket
list = []
print "socket name" 
for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]:
	s.connect(('8.8.8.8', 80))
	nlist = s.getsockname()
	for n in nlist:
		print n,
	print
	name = nlist[0]
	list.append( name )
	s.close()
print
print "IP Address"
print list[0]

socket.socket(family, type)
AF_INET は、IPv4 インターネットプロトコルのこと。
SOCK_DGRAM は、IPパケットのこと。

s.connect((host, port))
8.8.8.8 は、Google の DNS サービスだと思うが。これを使う理由はよくわからない。

s.getsockname()
ソケットのIPアドレスとソケット番号を取得する。

参考
ローカルIPアドレスをプログラムで取得するには
python socket — 低レベルネットワークインターフェース
linux SOCKET