2021年8月16日月曜日

Unityアセット「MIDI Plugin for Mobile devices」をリリースしました

Unity向けプラグインをアセットストアにてリリースしました。 
この記事ではプラグインの機能について紹介します。

機能

このプラグインはMIDIイベントの送受信機能をUnityのモバイル(iOS/Android)プロジェクトに追加します。
  • MIDIイベントの受信と送信
    • MIDI 1.0に定義されている、全ての種類のMIDIメッセージを扱うことができます。
  • USB MIDI
    • Android のみ
  • Bluetooth MIDI (BLE MIDI)
    • iOS と Android
  • Apple Network MIDI (RTP-MIDI)
    • iOS のみ

Android ベースの VRデバイスにも対応

プラグインはOculus Quest 2のような、AndroidベースのVRデバイスでも動作します。実世界のMIDI機器と呼応するVRオブジェクトを簡単に作成できます。VR世界のキューブを指したときにMIDIモジュールから音を出したり、その逆に実世界のMIDIキーボードを演奏したときにVR上のオブジェクトに反応させることができます。

サンプルシーンを試す

プラグインのインストール

  • Unity Asset Storeからプラグインをインストールします。
  • iOS または Androidのプラットフォームを選択し、サンプルシーンを含めてビルドします。
    • サンプルシーン 「MidiSampleScene.unity」は Assets/MIDI/Samples/Scenes ディレクトリにあります。
    • プラグインはUnity Editorでは動かないので、アプリバイナリをビルドして、実際のデバイスにインストールする必要があります。

MidiSampleScene

アプリでサンプルシーンを開くと、いくつかのGUIが現われます。
左のウィンドウではMIDIデバイスを選択し、いくつかのMIDIメッセージを送信できます。
右のウィンドウでは受信したMIDIメッセージが確認できます。

MIDIデバイスとの接続

  • Android
    • USB / Bluetooth MIDIデバイスは自動的に発見、接続されてGUIの「Device」のリストに表示されます。
  • iOS
    • Apple Network MIDIデバイスは自動的に接続され、GUIの「Device」のリストに表示されます。
    • アプリが起動したときにBluetooth MIDIデバイスを選択します。
これらの初期化処理は MidiManager クラスの InitializeMidi メソッドに実装されています。

新しい機器の接続 / 切断 のイベントは IMidiDeviceEventHandler インタフェースを実装することで受信できます。
デバイス名はMidiManager クラスの GetDeviceName メソッドで取得できます。デバイス名をまだ受信できていない場合、空(null)になっている場合があります。

MIDI イベントの送信

MIDIイベントの送信処理のコードはこのように記述します。 

MIDI イベントの受信

MIDIイベントの受信処理のコードはこのように記述します。

オープンソース

パッケージ内のいくつかの部分はオープンソースプロジェクトです。以下のリストはパッケ0ージの依存ライブラリです。
全てのリポジトリは自作のものです。機能のリクエストや不具合報告など、githubにてお気軽にご連絡ください。

2021年8月14日土曜日

Published Unity asset: MIDI Plugin for Mobile devices

I published a new plugin asset for Unity at the Store. 
This article explains about this plugin's features.

Features

This plugin enables MIDI event transceive functions to mobile Unity project(iOS/Android)
  • MIDI Event Receiving and Sending
    • The plugin can treat the all kind of MIDI events defined in MIDI 1.0.
  • USB MIDI
    • Android only
  • Bluetooth MIDI (BLE MIDI)
    • both of iOS and Android
  • Apple Network MIDI (RTP-MIDI)
    • iOS only

Works with Android-based VR devices

This plugin also work with Android-based VR devices, such as Oculus Quest 2. It can easily create app that VR objects interact with real MIDI instruments. When I pointed an cube in the VR world, the real-world MIDI module plays a sound. And vice versa, When I play real-world keyboard, the VR objects will be interacted with playing MIDI note.

How to try with a sample scene

Install the plugin

  • Install the plugin from Unity Asset Store.
  • Select the app's platform; iOS or Android, and build the app with sample scene.
    • The sample scene 'MidiSampleScene.unity' is found at Assets/MIDI/Samples/Scenes directory.
    • The plugin doesn't work with Unity Editor, so you should build the app binary and install it into the real devices.

MidiSampleScene

Start app with Sample scene, some GUI will be appeared.
The left window is for selecting MIDI device, and sending some MIDI messages.
The right window is for viewing received MIDI messages.

Connect with MIDI devices

  • Android
    • USB / Bluetooth MIDI devices will be automatically detected, connected, and displayed on GUI 'Device' list.
  • iOS
    • Apple Network MIDI devices are automatically connected and displayed on GUI 'Device' list.
    • Select Bluetooth MIDI devices at the first time the app launched.
These initializations are implemented at InitializeMidi method in MidiManager class.

New connection / disconnection events can be received by implementing IMidiDeviceEventHandler interface.
The device's name can be got from GetDeviceName method in MidiManager class. The device's name may sometimes empty(null) if the name has not noticed yet.

Sending MIDI events

The implementation for sending MIDI events will be like this. 

Receiving MIDI events

The implementation for receiving MIDI events will be like this.

Open Source

Some parts of this package are Open Source project. The below list are dependency libraries in the package.
All repositories below are owned by me, feel free to feature request or issue reporting.

2016年4月13日水曜日

BLE MIDIの仕様でハマりそうなところ集

MIDI公式サイトでBLE MIDIの仕様書が公開されていたので、ハマりそうな部分について書いておきます。主にタイムスタンプについてです。
BLE MIDIのデバイスやライブラリを自前で実装してみようかな、という方にとって参考になるかもしれません。

BLE MIDIのタイムスタンプの仕様

BLE MIDIのデータの形式はこんな感じです(仕様書より)。従来のMIDI 1.0なメッセージにタイムスタンプ情報が付いた形です。BLEの1パケットに収まらない場合は分割することもできます。
上図はSysExというデータで、システムエクスクルーシブメッセージといい、機器の設定情報などをバイナリで送受信するためのものです。
  • SysEx開始は 0xF0 (最初の緑色背景のデータ) 
  • SysEx終端は 0xF7 (最後の緑色背景のデータ)
  • SysEx終端が来るまでが、データです。データの内容・長さは自由です。
  • SysEx終端もMIDIメッセージなので、「直前1バイト」に、タイムスタンプ下位7bitと0x80を論理和(OR)したデータが入ります (水色背景のデータ)
  • タイムスタンプは、下位7ビットと、ヘッダ内にある上位の6ビット分と組み合わせて13ビット(0〜8191、ミリ秒)の値になります。この値で通信のレイテンシを吸収します。

ハマりポイント1: タイムスタンプの精度

タイムスタンプは送信側デバイスのクロック精度に依存するので、送信側のタイムスタンプの値が1000増えたからといって、受信側の時計でも正確に1000ミリ秒が経過しているとは限りません。
単体のキーボードや音源など、マイコンで処理しているデバイスでは精度がわりと怪しくなります。あくまで前回のイベントからの間隔として扱うのが良さそうです。8192ミリ秒までの間隔しか測れないので気をつけます。

ハマりポイント2: タイムスタンプの上限値跨ぎ処理

1パケットで複数のMIDIメッセージを受信することがあり、それらのタイムスタンプ下位が0xFFを跨いだ場合(図の例だと、SysEx開始時が0xFFで、SysEx終端が0x00のとき)や、タイムスタンプ全体の値が8191を跨いだ場合も、デバッグしていて微妙にハマります。8秒遅れてイベントが発火したり…。
こちらは、前回のイベントのタイムスタンプとの差がマイナスなら8192を足す、みたいな対処で回避できるでしょう。

ハマりポイント3: SysExデータの末尾に現れるタイムスタンプ情報

SysEx終端の直前にタイムスタンプ下位が入るので、その1バイトだけを除いたデータをSysExデータとする必要があります。先頭の0xF0と末尾の0xF7を含めたデータを返却することを前提としたAPIであれば、ちょっとだけ面倒な実装になりそうです。

ハマりポイント4: たまにSysExデータが欠ける

これが一番デカい罠だと思います。
SysExとタイムスタンプの仕様を見て、素直に「SysEx終端:0xF7が来るまでデータを読んだら、その直前の1バイトをタイムスタンプとして扱う」という解析処理を書いていると、仕様の罠にハマります。
そういう風に実装すると、イベントの発火タイミングが最大で127ミリ秒ズレて、その際にデータが欠損します。これはSysEx送受信の128回に1度の確率で発生します。

何故こんなことになるかというと…
タイムスタンプ下位7bitが0x77だった場合、送信されるバイト値は0xF7になります。0xF7を受信したからといって、この時点ではSysExをイベントキュー等に入れてはいけません。
正しくは「0xF7を受信したら次のデータ1バイトをチェックし、次も0xF7なら次のデータまでがSysEx、それ以外ならこのデータまでがSysEx」という風に実装する必要があります。

BLE MIDIは様々なデバイス間で使われる通信プロトコルのため、送受信の実装が拙いデバイスについても、異常動作しないように対応する必要があります。
具体的にはこの2つです。
  • SysEx受信のときは、0xF7の2回受信を考慮して解析する。
  • SysEx送信のときは、タイムスタンプの値として0xF7を送信しない。
以上、BLE MIDIを実装する際のハマりポイントでした。

2015年6月20日土曜日

フリューを退職しました

2015年7月20日をもちまして、派遣時代から含めて13年間在籍していたフリューを退職いたしました。
今後のことはまだ決まっていません。のんびりやります。

2015年4月17日金曜日

超音波でカレーを熟成してみた

最近、超音波にハマっています。超音波で出来ることをググってみると色々なワクワクする用途が見つかるのです。
例えば…
  • 超音波による成分抽出
    • 数十kHzの音波を当てることで水や油やアルコールや溶剤などに成分を抽出します。
    • 混合液の乳化などにも使われています。
  • 超音波を変調して、指向性のあるスピーカー(パラメトリックスピーカー)
    • 超音波自体に指向性があるので、それを干渉させることで元の音波をビーム状に復元させる仕組みのようです。
  • 数MHzの超音波を水に掛けることで霧化することを利用した、超音波式加湿器
    • 水に含まれる雑菌やミネラル分まで霧化して部屋中にバラ撒くので、あまりよろしくないようです…。
    • この霧化器にも他の利用法がありそうなので後日実験します。
  • 超音波による化学反応の促進
    • 局所的にエネルギーを集中させることで化学反応が促進されるようです。
  • 洗浄
    • 眼鏡屋さんによく置いてあるやつです。細かな泡が割れるときのエネルギーを利用しています。複数の周波数を出し分けることで洗浄効果が増すようです。
だいたいこういった感じに使われているようです。論文とか特許を検索すると興味深いものが見つかります。

今回は「超音波による成分抽出」を利用して調理をしてみました。

2015年1月28日水曜日

Android用のBLE MIDIライブラリのご紹介

去年から、Android端末上でBLE MIDI通信を使えるようにするライブラリを作っていました。(→前回の記事を参照)
AppleがBluetooth Low Energy MIDI Specification(PDF)を公開していたのを先日見つけたので、その仕様に合うよう実装してみました。

このライブラリを使って出来ること:
  • AndroidアプリとBLE MIDIなデバイスとが接続でき、演奏やイベントの記録などをすることができます。
  • iOSやOS X上で動くBLE MIDIなアプリとも接続できます。
  • Android LollipopかつPeripheral機能がサポートされている端末では、端末をBLE MIDIデバイスとして振る舞わせることができます。
注意:
このAppleの仕様は、まだMIDI公式から承認されていません。以前問い合わせをしたところ、「ドラフトの仕様はあるが絶賛議論中だよ。議論を見たかったら会員になってね」とのことでした。公式としてリリースされる仕様ではAppleのものとの食い違いが出てくるかもしれません。頑張って追従します。

ライブラリの機能

このライブラリを使うことで、AndroidはBLE MIDI CentralとPeripheralの機能を使えるようになります。

BLE MIDI Central機能とは

AndroidアプリがBLE MIDIデバイスを探して、接続します。アプリはデバイスとMIDIメッセージを送受信できます。
この機能にはAndroid JellyBean MR2(4.3 / API Level 18)以降が必要です。ペアリング機能を使うにはAndroid KitKat(4.4 / API Level 19)以降が必要です。

BLE MIDI Peripheral機能とは

AndroidアプリがBLE MIDIデバイスとして振舞います。アプリは他の端末上(Android, iOS, OS X)のCentralなアプリから接続して使用されます。


2015年1月21日水曜日

MIDI over Bluetooth LE library for Android

I've been developing the library to enable BLE MIDI feature on the Android devices from last year. The Apple Bluetooth Low Energy MIDI Specification(PDF) had revealed at December 2014. And finally, I implemented all of features on the specification.

Using this library, the app can connect with BLE MIDI devices, and BLE MIDI compatible iOS/Android/OS X apps. On the Android Lollipop, the app can act as BLE MIDI device.

Note:
This Apple's specification has not been approved by MIDI Manufacturers Association(MMA). I've asked about the specification to MMA at the past, but it was under discussion with MMA members.
The MMA's official release version's specification might be different from Apple's one.

The library's features

With this library, the Android can provide BLE MIDI Central / Peripheral features.

BLE MIDI Central feature

The Android app can host BLE MIDI devices. The app can receive MIDI messages from BLE MIDI devices, and send MIDI messages to them.
This feature requires Android KitKat(4.4 / API Level 19) or later.

BLE MIDI Peripheral feature

The Android app can pretend as BLE MIDI device. The application on the another machine(Android / iOS / OS X) can connect with the Android app.

2014年11月10日月曜日

BLE MIDIのAndroid向けライブラリを作っています

iOS 8での新機能、MIDI over Bluetooth LEの最初のデバイス「mi.1」がindiegogoにて発表されていたので、早速投資して3つポチりました。


その後、ブツが届いたのはいいのですがファームウェアが導入されておらず、実際に使えるようになるまでにしばらく掛かりました。
製品版ではファームウェア書き込み済の状態で出荷しないとユーザが混乱しそうです。

まだmi.1が届いていないうちから、Android 4.3にて追加されたBluetooth LEのAPIを使ってMIDIっぽい通信をするライブラリを書いていました。
Appleが仕様を作るとして、極力既存のMIDIと互換を持たせたシンプルな形に実装するだろう、おそらくBluetooth LEにレガシMIDIのデータをそのまま垂れ流す程度のものだろう、などと想像しつつ先行して実装していました。
mi.1のファームウェアを更新した後、受信したデータをログに出したりしつつプロトコルを調整して、受信までは動作確認できました。

というわけで、まだ道半ばですが現状報告な感じで。

2013年6月24日月曜日

ニューファミコンでプレゼンするためのツール集を作ってみた

「ファミコン用の自作ソフトを作って遊ぼう」の記事の続きです。社内の勉強会でプレゼンする機会があったので、ファミコンソフトを作って発表してみました。

参考:社内勉強会の発表資料
(Chrome推奨。枠内をクリックしてから、左右キーでページ送りします)

2013年5月7日火曜日

ファミコン用の自作ソフトを作って遊ぼう

昨年、初めてニューファミコンというゲーム機を入手したのですが、MSXで育ったせいか遊び方を知りません。本体やコントローラの改造ばかりして遊んでいたのですが、どうもこの遊び方は普通とは違うようです。

というわけで今回は、本体やコントローラじゃなくてカートリッジで遊んでみることにします。
通常は固定データであるカートリッジ内のEPROMを、何度も書き換えが可能なFlashROMで置き換えて自作ソフトを動かすことができる、いわゆるFlashROMカートリッジを作ってみました。

(FlashROMの書き込みについてあまりネットに情報がなさげなので、仕様のメモ代わりにもなっています。適当に読み飛ばしてください)。

FlashROMの入手

秋月にて安価に購入可能な、256kBのPLCC FlashROM(EN29F002T)を選びました。256kBもあれば大抵のものは動かせるでしょう。

PLCC→DIP変換基板はaitendoのものを入手しました。
このaitendoのPLCC→DIP変換基板なのですが、届いてみたら曲者で、ピンの並びが全然違いました。最近傍のピンに繋げているようで、PLCCの1番ピンがDIPの32番ピンに繋がっていたりします…。混乱するので、変換表を作りました(誰得データなので省略)。

2013年4月25日木曜日

Javaにおける例外とエラーの扱いについて


例外・エラーの種類

大まかに二種類

チェックされる例外と、されない例外・エラー
・チェックされる例外は、実装時にコンパイラがチェックするので、catchしていないとEclipse上で赤くなります///
・チェックされない例外・エラーは、コンパイラはチェックしません(文字通りですが...)。なので、catchを書く必要はありません。

分類表

typeチェックされる?意味
Exceptionされるシステムの設計の範囲内の異常なイベント
Errorされないシステムの設計の範囲外の異常なイベント
RuntimeExceptionされないバグ、プログラムの誤り

クラス階層

Throwable ← Error
  ↑
  └ Exception ← RuntimeException
こんな感じ。

チェックされない例外・エラーについて

チェックされない例外・エラー(RuntimeError/Error)は、メソッド定義の「throws」で明示的に示す必要がありません。
たとえthrowsで指定していたとしても呼び出し側でcatchする必要はありません。
つまり、 「チェックされない例外」はどのメソッド呼び出しからでも投げられる可能性があるし、どの種類の例外が投げられるかもわかりません。
メソッド側にthrowsがついていればそれを見てはじめてわかりますが、 それ以外が投げられる場合もある でしょう。

例外・エラーの使い方

上記を踏まえて...
一般的には、
・外部の環境によって生ずるもの:チェックされる例外
・正常なプログラムでは発生しないもの:チェックされない例外
という指針が使われるようです。

例外を投げる

例外をメソッドが上位で対応する必要がある場合(そのメソッドをふつうに使用するうえで、起こりうるエラーの状態)は、「チェックされる例外」を投げます。
チェックされる例外は、状況に応じて複数の種類を用意するとよいでしょう。
上位で対応する必要がない場合(インスタンスやクラスの初期化漏れ、範囲外の引数など、明らかに上位側の過失)は、「チェックされない例外」を投げます。

例外を受ける

「チェックされる例外」のみをcatchします。
外部ライブラリなどのメソッドで、「想定内のエラー処理」でも「チェックされない例外」が発生するときは、
その例外もcatchするか、「チェックする例外」で投げなおすようなラッパーを用意します。
「チェックされない例外・エラー」が発生している時点で異常な状況で、発生すると基本的に処理を続行出来ません。
RuntimeExceptionが出るならメソッド呼び出し側の実装を、Errorなら内容に応じてJVMの設定等を見直します。

禁則事項

複数種の例外・エラーを、ExceptionやThrowableで受けて一緒くたに処理する/もみ消すというのは、
何が起こっているか把握していないことに対応している、という意味で悪い書き方です。
なるべく避けて、個別の例外に対して処理を書きましょう。
例外を分岐・制御構造の代わりに使ってはいけません。ループを抜けたりとかifとして使うとかアリエナス

2013年4月22日月曜日

XubuntuでKiCadをビルドしてみた

XubuntuのSoftware Centerから入るKiCadが相当古かったので、KiCadをソースからビルドしてみたときのメモ。ちなみに64bit版のXubuntu 12.10 desktopです。

必要なパッケージのインストール

それぞれ、入ってなければ入れる感じで。パッケージ別に分けてますが、パッケージ名のところを列挙すれば一括でインストール出来ます。
  1. sudo apt-get install bzr
  2. sudo apt-get install cmake
  3. sudo apt-get install libglu1-mesa-dev freeglut3-dev mesa-common-dev
  4. sudo apt-get install libwxgtk2.8
  5. sudo apt-get install doxygen
  6. sudo apt-get install g++

KiCadのソースコード入手とコンパイル

太字の部分がターミナルで入力するコマンドです。4/21夜時点のコードでは、いくつかコンパイルエラーがあったので修正が必要でした。
  1. bzr branch lp:kicad/stable を実行すると、ソースコードをダウンロードします。
  2. cd stable を実行して、cmake . -DKICAD_STABLE_VERSION=ON とすると、ビルド設定を出力します。
  3. pcb_calculator/transline/transline.cpp の 「bool isinf(double)」というインライン関数を「int isinf(double)」に変更します。
  4. pcb_calculator/dialogs/pcb_calculator_frame_base.cpp の regul_3pins.xpmのある行を検索して、「#include "../bitmaps/regul_3pins.xpm"」と変更します。
  5. make して(スペックによりますが)2時間ほど待つとコンパイルが通っているはずです。(以降のコードの修正によって、ビルドが通らなくなっている可能性もありますが…。)
  6. sudo make install して、インストール完了です。
  7. 新しいターミナルを開いて kicad とやれば、起動します。

2013年4月5日金曜日

仮想化環境で動くAndroid「AndroVM」を使ってみた

過去記事「仮想マシン上のAndroidでUSBホストを使う」で載せてたAndroid-x86なVMイメージが「AndroVM」として公開されていたので使ってみました。

仮想ディスクイメージのダウンロード

上記の「ダウンロード」のページから「vbox86tp version with gapps & houdini & flash」などといったファイルをダウンロードします。
「vbox86tp」「vbox86t」「vbox86p」の三種類がありますが、「t」がTablet、「p」がPhoneを指すようです。Google Playからアプリをダウンロードしたい場合は「with gapps & 〜〜」のバージョンをダウンロードします。

VirtualBoxにインポートして、設定を変更

VirtualBoxを開きファイル→仮想アプライアンスのインポート」から、ダウンロードした「ova」形式のファイルを指定してインポートします。
VirtualBox Managerから、仮想マシン「androVM……」の設定を開き、下記のように設定を変更します。
  • ディスプレイ→ビデオメモリ を 適量 (64MBに変更しました)
  • ディスプレイ→3Dアクセラレーションを有効化 をオン (効くかどうかはわかりませんが…)
  • ネットワーク→アダプター1にホストオンリーアダプターを指定。無い場合はVirtualBoxの設定から作成できます。アダプター2はそのままにします(Wi-Fi用として認識されるようです)
あとは普通にVMを実行すれば起動します。

IPアドレスは「androVM Configuration」というアプリで確認できます。
上記画像の場合、コマンドラインから adb connect 192.168.56.101 とやると、デバッグ接続ができます。(もちろん、デバッグ機能を有効にする必要があります)。

ざっくり使ってみた感想

  • OSのバージョンは4.1.1
  • 起動まで10秒くらい。速い。
  • 動作も普通にサクサクしてる。
  • メモリは1GBとけっこう消費します。
  • rootが使えたり、busyboxがインストールされていたり。アレなファイルを探したりするのが楽です。
  • USBデバイスもつながります。
  • センサーとかNFCとかのデバイス系が絡まないアプリであれば、けっこう快適に開発できる環境だと思います。

2012年12月26日水曜日

[Android Advent Calendar] 自作のUSBデバイスを、Androidで動かす

Android Advent Calendar 2012/12/26(表) 向けの記事です。裏は@l_b__さんです。

今年の後半にかけてAndroidのUSBホスト周りに少し詳しくなってきた、@kshojiです。Android USB MIDI Driverなどというものを作って公開しております。

USBデバイスを自分で作って、Android側でドライバを書いたら、好きなデバイスを作ってAndroidで自由に動かせて、楽しいんじゃないかなー。ということで、今回この記事を書いてみます。
TwitterのTLで尋ねてみると、USB HIDなデバイスが今時の流行っぽいので、それに乗ってみることにします。USBデバイスの自作と、そのデバイスに対応するアプリ作成の参考になれば嬉しいです。

AndroidがUSBホストに対応

Android OS 3.1からUSBホスト機能に対応して、アプリで、JavaのAPIを使ってUSBデバイスのドライバが書けるようになりました。LinuxのデバイスドライバといえばC(libusb)で書く、もしくはカーネル側をいじるという印象があるので、これはすごく画期的なことだと思います。なんといっても、Javaはとっつきやすいですから。

Android SDKにもUSBミサイルランチャを操作するサンプルが付いています。USBミサイルランチャは色々な環境でサンプルとして使われているようです。

注:必ずしもUSBデバイスであればなんでも認識する、というわけではないようです。HTC J ButterflyではUSB HIDなデバイスは認識しましたが、USB MIDIなデバイスは認識しませんでした。

AndroidでのUSBホストの使いかた

Android の USBホストの公式ドキュメントはこちらからどうぞ。

githubのリポジトリにこの記事用のコード一式を置いてみました。
いちおう、見通しがよくなるようにしているつもりです。
…と言っても、AbstractDeviceActivityクラスあたりから見ていくと、なんとなくわかるかな、程度ですが。WTFPLにしてあるので、煮るなり焼くなりお好きにどうぞ。

2012年12月23日日曜日

[変態Advent Calendar] 実機TAS-codingコントローラを作る

ファミコン用実機TASコントローラとかも作っているkshojiです。
変態Advent Calendarへは初参戦となります。やらしくお願いします。

TASとは?

→ 詳しくはニコニコ大百科のTASの項目あたりがオススメです。

大雑把に言えば「最速でゲームをクリアする」ために必要な再現用データを作る、という競技です。
RAM書き換えなどのズルをしていないので「実機で再現できる」というのがポイントです。
実機で再現できるので、つまり、実際に実機で再生させるプロジェクトというのもいくつか存在します。

実機TASコントローラを作ろう

以前、ファミコン実機でTASるコントローラを作ったこともあり、その連想でなにか出来ないか模索してみました。

今回はエンジニア向けっぽい変態ネタということで、Tool Assisted Speed-codingのコントローラを作ってみます。codingでもあり、typingでもありますが。
「自動キー入力するUSBキーボード」を自作する感じになります。

ちなみに今回のTASのルールとしては、プログラムのソースコードを入力し終わるまで、としています。

まずは、完成したものがこちらにあるので、動画を観てみましょう。
ご覧の通り、エディタの表示が追いつかないほどの変態高速入力となっております。

2012年12月21日金曜日

In-App Billing version 3を使ってみた


先日、既存の有料アプリを無料化→アプリ内課金を追加しよう、という流れで実装をしてみました。
たまたま新しいバージョンのライブラリが出たタイミングだったようで、折角だからこのライブラリを使って実装してみたときのメモです。

In-App Billing version3との遭遇

いつも通りに、「In-App Billingのサンプルが載っているブログ・サイトを探して、それを参考にしながら実装を進めていこう!」 と思っていたところ、IInAppBillingService.aidlを使ったサンプルがさっぱり見つからず、見つかるのはIMarketBillingService.aidlを使うものばかり…。
記事がないとか、そんなバカな…とか思っていたら、Android Developer Blogの記事を見つけました。つい最近バージョンアップしてたんですね。

先の記事によると、向上した点はこんな感じのようです。

  • 設計を改善して、アプリが完結に書けてデバッグ・メンテナンスしやすくなった。以前だと数100行書かないといけなかったコードが、50行くらいでできるように。
  • 堅牢なアーキテクチャにより、決済のロストが少なくなった。
  • ローカルへのキャッシュによって、API 呼び出しが高速になった。
  • 待望されていた、「一度だけ購入できるアイテム」の購入や、アイテム情報の問合せができるようになった。

SDKのサンプルを試そう

というわけで、SDKのサンプルを見ていくことにしました。まずは、SDK Managerから「Google Play Billing Library」をインストールします。
サンプルプロジェクトはSDKをインストールしたディレクトリ内の「extras/google/play_billing/in-app-billing-v03」にあります。Eclipseに取り込んでビルドします。

2012年11月2日金曜日

複数PCの楽器アプリ同士を繋ぐUSB MIDIケーブルを作ってみた

AndroidタブレットとMacを接続して演奏してみたかったので、USB MIDIクライアントを2つ結合したものを作ってみました。
近い将来、これを使ってAndroidタブレット用のPCDJコントローラでも作れたらいいな、という感じです。

方針

今回は、AVRのV-USBを使って、USB MIDIを扱います。ソースコードはMICO-MOCOを参考にしました。

MICO-MOCOではUSB MIDI→レガシーMIDIに変換する必要があったので、送受信を含めるとATtiny2313のメモリには収まらなかったのですが、今回のものは「USB MIDIのプロトコルをそのままブリッジする」という作りになっているため、プロトコル変換処理をばっさり省略できています。
MIDIを介さない利点として「31250baudでシリアル通信する必要がない」という点が挙げられます。クロックが最速20MHzのものを選択できるので、取りこぼしが少なくなることが期待できます(今回の試作では、16MHz/125000baudで通信しています)。送受信用のバッファは短かいですし、USB MIDIのプロトコルそのままなので、MIDIのパケット長はレガシーMIDIよりも長くなっていますが…。

Android USB MIDI Driverのご紹介

Android USB MIDI Driverって?

「Android 3.1 (API Level 12)以降向けの、USB MIDIを使うためのライブラリ」です。
Android 3系のタブレットや、Android4系のスマートフォンを使って、特に改造やroot化することなしに、USB MIDI対応の楽器や機器を繋げることができるようになります。

注意:端末がUSB Host機能に対応している必要があります。USB Host対応端末であっても、USB MIDI機器が認識しない場合があります。

USB MIDI対応デバイスの例:キーボード、電子ピアノ、シンセサイザー、音源モジュールなどの楽器・コントローラ、変換ケーブルなどのPC用MIDIインタフェースなど。

ライブラリのソースコードは、こちらのgithubリポジトリからダウンロードできます。Apache ライセンス バージョン 2.0です。
https://github.com/kshoji/USB-MIDI-Driver

応用アプリの例

  • (楽器のほうの)キーボードを使ってプレゼンを操作
  • 演奏をディスプレイ上にリアルタイムで可視化
  • TENORI-ON/monomeのようなインタラクティブなシーケンサー
  • 加速度やジャイロなどのセンサーを使用したコントローラ
などなど…

2012年10月17日水曜日

仮想マシン上のAndroidでUSBホストを使う

Android SDKに含まれるエミュレータはUSBデバイスの接続に対応していません。
「android-x86」のLiveCDイメージを使うことで、USBホストのテストがPC上で可能になります。
今回はVMWare FusionとVirtualBoxで動かしてみました。


  • ISOイメージをこちらからダウンロードします。「new version here」というリンクのもの(android-x86-vm-20120130.iso.gz)を使用しました。→ http://www.buildroid.org/blog/?p=86 
  • 新しい仮想マシンをセットアップし、CDドライブにLiveCDを指定してVMを開始します。
  • 「Live CD - Run Android-x86 without installation」を選択して、Androidを起動します。
  • VirtualBoxの場合、「Machine」メニューから「Disable Mouse Integration」をチェックします。
  • VMware/VirtualBoxの「ネットワークアダプタ」のモードを「ブリッジ(自動設定)」「Bridged Adapter」に変更します。
  • Android側の「Terminal Emulator」アプリを開き、以下のコマンドを実行します。固定IPを設定するので、LAN内で空いているIPアドレスを確認しておいてください。(今回は192.168.1.111とします)。
$ su
# ifconfig eth0 192.168.1.111 up



  • ホストOS上から、下記のコマンドを実行します。
$ adb connect 192.168.1.111

これで、仮想マシンのAndroidとadbが接続され、Eclipseなどからアプリが流しこめます。
仮想マシン側にUSBデバイスを接続することで、そのデバイスをAndroidで使用することができます。