Python
python3
SuperCollider
OSC
foxdot

FoxDotを使ってライブコーディングでセッションをする

※Troopという便利なツールがございましたのでぜひこちらの記事をご参照ください。(2017/12/27 追記)
https://qiita.com/Hulc_0418/items/0509ed0521f7309b29d7

ライブコーディングでセッションする

FoxDotを見つけてから、日夜楽しませていただいております。

ライブコーディングといえばプログラマが一人でパソコンだけおいてゴリゴリ書いて...
というのがかっこよさだったりもすると思いますが、
音楽なんだからだれかとセッションしたいと思うのは当然かとも思います。

以前Tidal Cyclesで複数人でセッションできないかといろんな方法を考えたんですが、
テンポの同期の部分がネックで、いまいちいい方法に考え至らず諦めていました。
今回、FoxDotならpythonなので行けるんじゃないかと思ってやってみました。

仕組みとしては
FoxDotのエディタ上でoscサーバーを立ち上げる
(送られてきた文字列をそのまま実行するサーバー)

コマンドを文字列としてoscで送る。

サーバー側で送られてきた文字列を実行。

というものです。
セッションというよりは指揮者が複数人いるイメージのほうが正しいかもしれません。

ちなみに現状だとFoxDotエディタは固まっていて、さらに全員コンソール上でコマンドを書くという、なんとも不細工な状態でのセッションになってしまいますが、ご了承ください。

FoxDot側の準備

まず準備としてpython-oscをpipでインストールしておきます。
pip install python-osc

次にSuperColliderとFoxDotを立ち上げて普段通り準備を済ませたら、
FoxDotエディタ上で次のコードを実行します。
ipアドレスとポート番号は適宜設定してください。

session_osc_server.py
from pythonosc import dispatcher
from pythonosc import osc_server

def processing(unused_addr, command):
    exec(command)
dispatcher = dispatcher.Dispatcher()
dispatcher.map("/command", processing)

server = osc_server.ThreadingOSCUDPServer(("127.0.0.1", 8000), dispatcher)
server.serve_forever()

これを実行するとFoxDotエディタが固まりますが、裏ではコードが動いているはずなので気にしないでください。

クライアント側の準備

ここまで来たら新しくコンソールを立ち上げて次のコードを実行します。
実行時にFoxDotが起動しているパソコンのipアドレスとoscのポート番号を指定します。

python session_osc_client.py --ip 127.0.0.1 --port 8000

みたいな感じになると思います。

session_osc_client.py
import argparse
from pythonosc import osc_message_builder
from pythonosc import udp_client

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--ip", default="127.0.0.1")
    parser.add_argument("--port", type=int, default=8000)
    args = parser.parse_args()

    client = udp_client.SimpleUDPClient(args.ip, args.port)
    while True:
        client.send_message("/command", input())

このコードでは標準入力の文字列がエンターキーを押す度、FoxDotに送られてFoxDot側で実行されます。

最後に

今回のやり方は思いつくなりすぐやってみた感じなのでかなり不細工ですが、ちゃんと動いてくれて妙に感動しました。
他にももっといいやり方があるよという方がいらっしゃいましたら是非教えてください!