{"id":20168297,"url":"https://github.com/kshoji/usb-midi-driver","last_synced_at":"2025-04-05T10:09:06.687Z","repository":{"id":2995718,"uuid":"4012450","full_name":"kshoji/USB-MIDI-Driver","owner":"kshoji","description":"USB MIDI Driver for Android 3.1 or later","archived":false,"fork":false,"pushed_at":"2024-05-06T06:04:24.000Z","size":3711,"stargazers_count":294,"open_issues_count":17,"forks_count":105,"subscribers_count":35,"default_branch":"develop","last_synced_at":"2025-03-29T09:09:26.914Z","etag":null,"topics":["android","midi","midi-api","music","usb","usb-midi"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kshoji.png","metadata":{"files":{"readme":"README.ja.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2012-04-13T05:03:35.000Z","updated_at":"2025-03-23T07:49:54.000Z","dependencies_parsed_at":"2024-12-28T23:51:36.757Z","dependency_job_id":"46db85e5-c41c-4e9a-875c-ec0f8e8c6b2e","html_url":"https://github.com/kshoji/USB-MIDI-Driver","commit_stats":{"total_commits":230,"total_committers":12,"mean_commits":"19.166666666666668","dds":0.05652173913043479,"last_synced_commit":"5a65b268a15440734f72d9ac2c0ce253a1f383fa"},"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kshoji%2FUSB-MIDI-Driver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kshoji%2FUSB-MIDI-Driver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kshoji%2FUSB-MIDI-Driver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kshoji%2FUSB-MIDI-Driver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kshoji","download_url":"https://codeload.github.com/kshoji/USB-MIDI-Driver/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247318745,"owners_count":20919484,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","midi","midi-api","music","usb","usb-midi"],"created_at":"2024-11-14T01:07:14.103Z","updated_at":"2025-04-05T10:09:06.668Z","avatar_url":"https://github.com/kshoji.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"Android USB MIDI ドライバ\n====\n\nAndroid USBホストAPIを使った、USB MIDIのドライバです。\n\n- root不要\n- 標準的なUSB MIDIデバイス(シーケンサや楽器など)をサポート\n- プロトコルがUSB MIDIな、非標準なUSB MIDI機器をサポート\n    - YAMAHA, Roland, MOTUのデバイスが接続できます(が、充分にテストされていません)。\n- 複数のデバイスを接続できます。\n- `javax.sound.midi` 互換のクラスをサポート\n    - 詳細は [javax.sound.midi ドキュメント(英語)](https://github.com/kshoji/USB-MIDI-Driver/wiki/javax.sound.midi-porting-for-Android) に記載があります。\n\n必要なもの\n----\n- Android : OSバージョン3.1以降(API Level 12)で、USBホストのポートがあること。\n- USB MIDI(互換な)デバイス\n\nオプション\n\n- セルフパワーのUSBハブ(複数のUSB MIDIデバイスを接続したい場合)\n- USB OTGケーブル(Android端末がUSB Aポートを持っていない場合)\n- USB MIDI←→レガシーMIDI(MIDI 1.0)変換ケーブル(レガシーMIDIの楽器と接続したい場合)\n\nデバイスの接続\n----\n\n一つのデバイスの場合\n```\nAndroid [USB Aポート / USB OTGケーブル]--- USB MIDI デバイス\n```\n\n複数のデバイスの場合\n```\nAndroid [USB Aポート / USB OTGケーブル]---(USBハブ) --┬--[USB Bポート] USB MIDI デバイス\n                                                   ├-- [USB Bポート] USB MIDI デバイス\n                                                   └   ...\n```\n\nリポジトリの概要\n==============\n\n- ライブラリプロジェクト : `MIDIDriver`\n    - USB MIDIデバイスを接続するためのドライバ\n\n- サンプルプロジェクト : `MIDIDriverSample`\n    - ライブラリを使って実装した、シンセサイザ・MIDIイベントロガーの例\n    - コンパイル済のサンプルプロジェクトを[Google Play Market](https://play.google.com/store/apps/details?id=jp.kshoji.driver.midi.sample)で公開しています。\n\nライブラリプロジェクトの使い方\n==========================\n\nプロジェクトの設定\n----------------\n\n- ライブラリプロジェクトをgit cloneします。\n- Eclipseのワークスペースにライブラリプロジェクトをインポートし、ビルドします。\n- 新しいAndroid Projectを作成し、プロジェクトのライブラリにライブラリプロジェクトを 追加します。\n- `jp.kshoji.driver.midi.activity.AbstractMidiActivity` をオーバーライドしたActivityを作ります。\n- `AbstractSingleMidiActivity` もしくは `AbstractMultipleMidiActivity` をオーバーライドしたActivityを作ります。\n    - `AbstractSingleMidiActivity` は **一つだけ** MIDIデバイスを接続できます.\n    - `AbstractMultipleMidiActivity` は **複数の** MIDIデバイスを接続できます.\n        - メモ：たくさんのデバイスを接続すると、パフォーマンスが下がることがあります(具体的にはレイテンシが大きくなったり、高いCPU使用率になる)。\n- AndroidManifest.xml ファイルの activity タグを変更します。\n    - Activityの **launchMode** を \"singleTask\" にします。\n\n```xml\n\u003cuses-feature android:name=\"android.hardware.usb.host\" /\u003e \n\n\u003capplication\u003e\n    \u003cactivity\n        android:name=\".MyMidiMainActivity\"\n        android:label=\"@string/app_name\"\n        android:launchMode=\"singleTask\" \u003e\n        \u003cintent-filter\u003e\n            \u003ccategory android:name=\"android.intent.category.LAUNCHER\" /\u003e\n            \u003caction android:name=\"android.intent.action.MAIN\" /\u003e\n        \u003c/intent-filter\u003e\n    \u003c/activity\u003e\n    :\n```\n\nAbstractSingleMidiActivity を用いた MIDI イベント処理\n--------------------------------------------------\n\nMIDI イベントの受信\n\n- MIDIイベントを処理するメソッド (`\"onMidi...\"` という名前)を実装します。\n- 注意: `\"onMidi...\"` メソッドは(UIスレッドではない)別のスレッドから呼ばれるので、UIスレッド内の`Handler`と`Callback`を用いてビューを操作する必要があります。下のコードのような感じです。\n\n\u003ca name=\"ui_thread\"\u003e\u003c/a\u003e\n```java\npublic class SampleActivity extends AbstractSingleMidiActivity {\n\n    // this field belongs to the UI thread\n    final Handler uiThreadEventHandler = new Handler(new Callback() {\n        @Override\n        public boolean handleMessage(Message msg) {\n            if (\"note on\".equals(msg.obj)) {\n                textView.setText(\"note on event received.\");\n            }\n\n            // message handled successfully\n            return true;\n        }\n    });\n\n    // this method will be called from the another thread, so it can't change View's state.\n    @Override\n    public void onMidiNoteOn(final MidiInputDevice sender, int cable, int channel, int note, int velocity) {\n        // Send a message to the UI thread\n        String message = \"note on\";\n        uiThreadEventHandler.sendMessage(Message.obtain(uiThreadEventHandler, 0, message));\n    }\n```\n\nMIDI イベントの送信 TODO\n\n- AbstractSingleMidiActivity の`getMidiOutputDevices()`メソッドを呼び出すと、`MIDIOutputDevice`のインスタンスを取得できます。\n    - そのインスタンスの`\"sendMidi...\"` という名前のメソッドを呼ぶとMIDIイベントが送信できます。\n        - 接続されている、最初に見つかったUSB MIDIデバイスを取得します。\n        - USB MIDIデバイスが接続されていない場合、メソッド`getMidiOutputDevices()`はnullを返します。\n\n\nAbstractMultipleMidiActivity を用いた MIDI イベント処理\n----------------------------------------------------\n\nMIDI イベントの受信\n\n- MIDIイベントを処理するメソッド (`\"onMidi...\"` という名前)を実装します。\n    - イベントを送信したデバイスの情報(`MIDIInputDevice`のインスタンス)が最初の引数に設定されて呼ばれます。\n- 注意: `\"onMidi...\"` メソッドは(UIスレッドではない)別のスレッドから呼ばれるので、UIスレッド内の`Handler`と`Callback`を用いてビューを操作する必要があります。[前述のコード](#ui_thread)のような感じです。\n\nMIDI イベントの送信\n\n- `Set\u003cMIDIOutputDevice\u003e`のインスタンスを取得するために、AbstractMidiActivity の`getMidiOutputDevices()`メソッドを呼びます。\n- 接続したいMIDIOutputDeviceインスタンスを`Set\u003cMIDIOutputDevice\u003e`から選びます。\n    - そのインスタンスの`\"sendMidi...\"` という名前のメソッドを呼ぶとMIDIイベントが送信できます。\n\n\nサポートしているMIDIイベントの一覧\n----\n\nいくつかの種類のメッセージはそんなに頻繁に送信されません。なので、そのような頻度の低いメッセージあまりテストされていません。\nもしトラブルなどありましたら [issue](https://github.com/kshoji/USB-MIDI-Driver/issues/new) に追加してください。\n\n| メソッド名の終端                  | 意味                                                               | 充分なテストがされている?  |\n|:----                            |:----                                                              |:----                    |\n| MidiMiscellaneousFunctionCodes  | その他の機能。将来の拡張のために予約されています。                       | NO                      |\n| MidiCableEvents                 | Cableに対するイベント。将来の拡張のために予約されています。               | NO                      |\n| MidiSystemCommonMessage         | システム共通のメッセージ、もしくは1バイトから成るSysEx                   | NO                      |\n| MidiSystemExclusive             | SysEx                                                             | YES                     |\n| MidiNoteOff                     | ノート・オフ                                                        | YES                     |\n| MidiNoteOn                      | ノート・オン                                                        | YES                     |\n| MidiPolyphonicAftertouch        | ノート単位のアフタータッチ                                            | NO                      |\n| MidiControlChange               | コントロール・チェンジ                                                | YES                     |\n| MidiProgramChange               | 音色の変更                                                          | YES                     |\n| MidiChannelAftertouch           | チャンネル単位のアフタータッチ                                         | NO                      |\n| MidiPitchWheel                  | ピッチベンド                                                        | YES                     |\n| MidiSingleByte                  | 1バイトのメッセージ                                                  | NO                      |\n\n\nFAQ\n----\n- メソッド`\"onMidi...\"` や `\"sendMidi...\"`の引数 'cable' とはなんですか。\n    - 一つのUSB MIDIデバイスには複数の仮想MIDIケーブルを持つことができます。 \n    これはMIDIチャンネルを拡張するのに使われています。cable番号は、0から15が指定できます。\n- USBデバイスを接続したのに、アプリがデバイスを認識しません。\n    - [Trouble shooting(英語)](https://github.com/kshoji/USB-MIDI-Driver/wiki/TroubleShooting-on-connecting-an-USB-MIDI-device) を参考にしてみてください。\n\nライセンス\n----\n[Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkshoji%2Fusb-midi-driver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkshoji%2Fusb-midi-driver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkshoji%2Fusb-midi-driver/lists"}