Tech Racho エンジニアの「?」を「!」に。
  • 開発

python-oscを使ってみる:前編

清々しい初夏を迎え

木々の緑も日増しに深く、脇汗も止まらなくなってまいりました。読者の皆様に於かれましては、なお一層お健やかにお過ごしのことと存じます。

用務員バイトの片山です。全然清々しくないし夏バテであまり健やかとは言えません。ラップトップもファンがファンファン回っていて暑苦しいです。

ネタ切れ具合が著しいので今回は苦し紛れのネタでイキます。

以前にも取り上げましたがPythonでOSC(Open Sound Control)を扱う方法について今回もやっていきたいと思います。前回は公式のサンプルコードをコピペしただけのイマイチな記事になっていますが、PythonでOSCを扱う際の単純なサンプルって案外転がってないなというのもあるので今回は多少真面目にやってみます。

PythonでOSCを扱う

python-oscを導入する。

導入についてはpython-oscの公式ページとか前回の記事を参考にします。

公式のサンプルコードが以前とちょっと違うなと思ったらpython-oscのバージョンが上がっているみたいです。2017年7月6日現在ではバージョン1.6.3らしいです。僕のはバージョン1.6.0らしいですが、さほど変わるわけではなさそうなので1.6.0のままで行こうと思います。

ちなみにいつも通りpython3でいきます。

python-oscを使ってみる

標準入力に入れた0~9までの数字がそれぞれ何個あるのかカウントしてOSCメッセージにしてくれるような感じのコードを書いてみました。
動くには動くので、ちょっと野暮ったい書き方になってるのは許してください。

pyosc.py


import argparse from pythonosc import osc_message_builder from pythonosc import udp_client port_num = 8002 # セットアップ parser = argparse.ArgumentParser() parser.add_argument("--ip", default="127.0.0.1", help="The ip of th OSC Server") parser.add_argument("--port", type=int, default=port_num, help="The port the OSC server is listening on") args = parser.parse_args() client = udp_client.UDPClient(args.ip, args.port) print("ip:127.0.0.1, port:" + str(port_num) + ", address:/filter") def main(): print("type int:") input_str = input() li = [] msg = osc_message_builder.OscMessageBuilder(address="/filter") for i in range (10): li.append(int(input_str.count(str(i)))) msg.add_arg(li[i]) print(li) msg = msg.build() client.send(msg) if __name__ == "__main__": while True: main()

受信側(サーバー側)をPythonで書くのはちょっと面倒臭いのでPuredataを使います。

こちらはとっても簡単で、

puredata

こんな感じのパッチを作ればオッケーです。

先程のpythonのコードを走らせて適当な数字を入力します。


$ python3 pyosc.py ip:127.0.0.1, port:8002, address:/filter type int: 12345 [0, 1, 1, 1, 1, 1, 0, 0, 0, 0] type int:

するとPuredataのコンソールにも

puredata

という感じでメッセージが送られます。

イマイチ使え無さそうなコードです。

閑話休題1

この前ザギンの日産ギャラリーに行ってきました。

skyline

四代目スカイライン、ケンメリです。写真のものは4ドアなのでヨンメリとも言うらしいです。

python-osc続き

我ながら上のコードはクソ使え無さそうなので、ちょっと弄って入力した数字を一文字ずつにわけて送ってくれるものを作ることにしました。

pyosc.py


import argparse from pythonosc import osc_message_builder from pythonosc import udp_client port_num = 8002 # セットアップ parser = argparse.ArgumentParser() parser.add_argument("--ip", default="127.0.0.1", help="The ip of th OSC Server") parser.add_argument("--port", type=int, default=port_num, help="The port the OSC server is listening on") args = parser.parse_args() client = udp_client.UDPClient(args.ip, args.port) print("ip:127.0.0.1, port:" + str(port_num) + ", address:/filter") def main(): print("type int:") input_str = input() osc_msg, osc_list = make_osc(input_str) print(osc_list) client.send(osc_msg) def make_osc(input_str): msg = osc_message_builder.OscMessageBuilder(address= "/filter") input_list = list(input_str) output_list = [] for i in range(len(input_list)): output_list.append(int(input_list[i])) msg.add_arg(output_list[i]) msg = msg.build() return msg, output_list if __name__ == "__main__": while True: main()

こちらも


$ python3 pyosc.py ip:127.0.0.1, port:8002, address:/filter type int: 12345 [1, 2, 3, 4, 5] type int:

で、Pdのコンソールに

puredata

という感じで表示されます。

野暮ったさに拍車がかかりましたが(とりあえず動くし)面倒なので書き直しません。

こちらは多少使えそうです。折角なのでこれで簡単な音が変わるものを作ってみたいと思います。

が、面倒臭いので次回にしたいと思います。

閑話休題2

先週健康診断に行ってきたのですが、血圧が高すぎてびっくりしました。まだ22歳なのに……

一言もラーメン好きとは言ってないのに、診察の時には「ラーメンのスープ飲まないでね」と見抜かれていたので、医師ってすごいなって思いました。

塩分とアルコール、カフェインが燃料という僕のようなタイプの人は血圧に気をつけましょう。

以上

血圧の話で終わってしまってイマイチ締まりがありませんが今回はここまでにします。

関連記事


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。