Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

楽しいロリコン

1,230 views

Published on

ウェブでロリコン

Published in: Technology
  • Be the first to comment

楽しいロリコン

  1. 1. 楽しいロリコン @toyoshim
  2. 2. ロリコン BLOCKS: ROLIのコントローラ(略し てロリコン)
  3. 3. 特徴 ● 素はControl Changeを送るMIDIコントローラ ● 四角いパネルを任意に組み合わせてカスタマイズ ● LittleFootと呼ばれる言語でファームも書き換え可能 ○ 任意操作に反応して任意メッセージを投げる ○ LEDも自由にプログラムで点灯 ○ サンプルにはブロック崩しなどのゲームもある
  4. 4. 開発環境 ● The BLOCKS SDK w/the JUCE framework ○ C++ library for native (mobiles/desktop) ○ ホスト側アプリ+LittleFootコンパイル・転送 ● Cycling ‘74 Max 7 ○ visual programming ● BLOCKS Dashboard (macOS / Windows) ○ IDE & simple programming language/model ○ LittleFoot管理・コンパイル・転送
  5. 5. BLOCKS Dashboard Arduino的なノリでLittleFootで 作ったファームウェアをBLOCKS に転送するアプリ
  6. 6. Web MIDIから使う方針 ● LittleFootはBLOCKS Dashboardから書き込む ● Web MIDIからLittleFootにメッセージを送り制御
  7. 7. プロトコル調査 ● SYSEX ○ 基本的な部分はSDKなどから窺い知ることができるが詳細が未公開で辛い ○ プロトコルは秘密ではないが将来変わるかもしれないとの事だが …… ○ Web MIDIから使うためにSYSEXの詳細を調べてみた ● 調査方法 ○ macOSからBLE MIDIをアドバタイズ ■ Lightpad Block TESTという名前を仕様(本家の末尾 4Bはシリアル末尾) ○ iPhoneアプリ(NOISE)を騙してBLOCKSだと思わせて接続 ○ iPhoneからmacOSに流れてくるMIDIメッセージをWeb MIDIでモニタ・解析
  8. 8. 基本的な流れ 1. 接続 ○ この時点ではBLOCKSはタッチ操作に合わせた CCしか投げてこない 2. ホスト→デバイス:トポロジー報告依頼 ○ SYSEXを使った低レベル通信のトリガーになるようだ 3. デバイス→ホスト ○ トポロジー報告 4. デバイス→ホスト ○ 定期的なハートビート報告の開始( 1秒程度の間隔) 5. (ホスト→デバイス:LittleFootプログラム転送) 6. (ホスト→デバイス:カスタムメッセージ) 7. デバイス(w/LittleFootプログラム)
  9. 9. SYSEXの詳細 0xf0, 0x00, 0x21, 0x10, 0x77, <header>, <data>, <checksum>, 0xf7
  10. 10. SYSEXの詳細: header 注意:header等はSYSEXの制約により7bit(0~127) 7 6 5 4 3 2 1 0 常時0 方向 0: ホスト→デバイス 1: デバイス→ホスト デバイスアドレス(Topology Index) トポロジー報告依頼時には0を指定
  11. 11. SYSEXの詳細: data 32-bits: 機器起動からのtimestamp [msec] (デバイス→ホストのみ) 7-bits: メッセージタイプ(メッセージ方向ごとに違うID) ● 以下、タイプ毎に異なるデータが並ぶ ● メッセージ長のような、未知のメッセージがあっても読み飛ばせるような 仕組みは存在せず、全てがデバイス・ホスト間で既知である事を想定し ている ● bit長は7の倍数でも8の倍数でも縛られておらず完全に任意 ● 合計で7の倍数bit長にならなかった場合は0パディングされる ● メッセージは複数続く事もあるようだ(まだ見たことはない)
  12. 12. SYSEXの詳細: dataにおけるbitの詰め方 ● リトルエンディアン ● 単一バイトに収まらない場合、下位ビットから順に格納する ● 上位ビットが余ったら、次のデータが詰め込まれる 例:8-bitsのデータが2つ(A[7:0]、B[7:0])続く場合 Byte N Byte N+1 Byte N+2 0 A6 A5 A4 A3 A2 A1 A0 0 B5 B4 B3 B2 B1 B0 A7 0 B7 B6
  13. 13. SYSEXの詳細: checksum <data>に対して以下の計算を実施 let sum = data.length; for (let byte of data) sum = (sum * 3 + byte) & 0x7f; <header>が壊れても気づけない
  14. 14. 最低限のメッセージ処理 ● トポロジー報告依頼 ○ デバイス接続状況取得 ○ 低レベル通信の開通 ● トポロジー報告 ○ 最低限ターゲットデバイスのアドレスを調べるために必須 ● カスタムイベント送信 ○ LittleFootとの通信ができれば最低限なんとかなる
  15. 15. デモ
  16. 16. 課題 LittleFootのコンパイルと転送ができれば完璧 ・LittleFootのコンパイラはSDKの公開部分に含まれてそう→Emscriptenでいける? ・転送はSDKでテストアプリを書いて転送データをダンプすれば解析可能か? 現状のソースは時間みつけて整理して公開

×