Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Androidだって音楽アプリが作りたい(M5Stackによる実演付き)
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kenta Harada
April 09, 2020
Programming
240
0
Share
Androidだって音楽アプリが作りたい(M5Stackによる実演付き)
Kenta Harada
April 09, 2020
More Decks by Kenta Harada
See All by Kenta Harada
元組み込みエンジニアがKotlinのビット演算を使ってみた
kharada_bt
0
73
ATOM Matrixで作る BLE MIDIコントローラー
kharada_bt
0
200
M5Stackで作るBLE MIDIコントローラー
kharada_bt
0
850
Other Decks in Programming
See All in Programming
The free-lunch guide to idea circularity
hollycummins
0
400
Java 21/25 Virtual Threads 소개
debop
0
320
へんな働き方
yusukebe
6
2.9k
生成 AI 時代のスナップショットテストってやつを見せてあげますよ(α版)
ojun9
0
330
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
8
4k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
1.3k
Claude Codeログ基盤の構築
giginet
PRO
7
3.8k
Coding at the Speed of Thought: The New Era of Symfony Docker
dunglas
0
4.1k
Smarter Angular mit Transformers.js & Prompt API
christianliebel
PRO
1
110
ローカルで稼働するAI エージェントを超えて / beyond-local-ai-agents
gawa
1
230
Symfony + NelmioApiDocBundle を使った スキーマ駆動開発 / Schema Driven Development with NelmioApiDocBundle
okashoi
0
250
Codexに役割を持たせる 他のAIエージェントと組み合わせる実務Tips
o8n
4
1.5k
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
40
2.3k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
64
53k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
340
Scaling GitHub
holman
464
140k
Unsuck your backbone
ammeep
672
58k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.8k
Six Lessons from altMBA
skipperchong
29
4.2k
The Language of Interfaces
destraynor
162
26k
From π to Pie charts
rasagy
0
160
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
250
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
210
Darren the Foodie - Storyboard
khoart
PRO
3
3.1k
Transcript
Proprietary and Confidential ©2014 Schawk, Inc. All Rights Reserved 原⽥
賢太 Kenta Harada Androidだって ⾳楽アプリが作りたい (M5Stackによる実演付き) Droidkaigi 2020
⾃⼰紹介 ・Android アプリ ・組み込み ・株式会社Mobility Technologies ・Bluetoothエンジニア
本⽇お伝えしたいこと Androidって ⾳が出るんです
iOSには⾳楽アプリが いっぱいあるのに Androidは少ないなぁ・・・
iOS⽤⾳楽アプリ
GarageBand(iOS)
KORG Gadget(iOS)
iOS⽤⾳楽アプリ • シンセサイザーで⾳作り • シーケンサーでの曲作り • MIDI機器との連携 • SoundCloudへのアップロード
どうして私の⼤好きな Androidには無いんだ
⾳楽アプリを作ってみる
⽬標(理想) iMPC Pro 2
こんなアプリ(現実) M5Stack Gray BLE MIDI
BLE-MIDI(ミディ)とは MIDI over Bluetooth Low Energy Musical Instrument Digital Interface
電⼦楽器の演奏データを機器間で転送・共有するための共通規格 1981年にMIDI 規格化開始。38年後の2019年にMIDI 2.0が策定開始。 接続にはMIDIケーブル、USBケーブルが使われることが多い。 BLEを使い無線でMIDIデータを送信する
BLE-MIDI MIDI over Bluetooth Low Energy
BLE MIDI MIDI over Bluetooth Low Energy 0x9n:ノートオン 0xXX:ノートナンバー(⾳の⾼低) 0xYY:ベロシティ(⾳の強弱)
何かがおかしい。。
⾳が遅れて聞こえる ・・・ような気がする
やっぱり⾳が遅れて聞こえる ボタンを押してから ⾳が聞こえるまでに時間がかかる BLE-MIDI
レイテンシ(遅延)
レイテンシ(遅延) レイテンシとは、信号がシステムを移動 する際にかかる時間を指します。 https://developer.android.com/ndk/guides/audio/audio-latency?hl=ja から引⽤
Android端末から⾳が出るまで Androidでは⾳が出るとき どんなルートを通るのか?
App Android Framework Driver JNI/HAL Hardware
App Android Framework Driver JNI/HAL Hardware Java C/C++(Native)
App Android Framework Driver JNI/HAL Hardware Java Native おそい! はやい!
C/C++(Native)
機種依存問題 "OESPJE04WFSTJPO %SJWFS )BSEXBSF x x
レイテンシの原因は複雑 • Java(仮想マシン) • 機種依存 • OSバージョンによる違い • 低レイヤーのバッファ •
BLE MIDI(無線通信) • その他
Androidに⾳楽アプリが少ない原因 レイテンシ(遅延) が⼤きな要因の1つ
Android Compatibility Definition Document(CDD) https://developer.android.com/ndk/guides/audio/audio-latency?hl=ja から引⽤ CDD では、ラウンドトリップ レイテンシを 20
ms 以下と指定しています。 (ただし、⾳楽家は通常 10 ms を要求します) 20 ms であれば、さまざまな重要なユースケースを 実現することができます。 ※Android 互換デバイスに関するハードウェア要件とソフトウェア要件が記された⽂書
実際のレイテンシ https://superpowered.com/latency から引⽤ iPhone 6(12.4.2) 8 ms Pixel 3(Android 10)
12 ms Pixel 3a(Android 10) 12 ms Nexus 5X(Android 6.0.1) 17 ms Zenfone 5(Android 9) 39 ms Huawei P20 Lite(Android 9) 132 ms
どうすれば低レイテンシな アプリを作れるのか?
解決策 1. ハイエンド端末を使う 2. BLE MIDIの通信を早くする 3. Javaで重い処理をしない 4. 低レイテンシオーディオ
解決策 1. ハイエンド端末を使う 2. BLE MIDIの通信を早くする 3. Javaで重い処理をしない 4. 低レイテンシオーディオ
解決策 BLE MIDIの通信を早くする
BLE MIDI BLE MIDI おそい!
BLE MIDIの通信速度 BLEの1パケットで送信できる データ量 たったの 20バイト
BLE MIDIの通信速度 MIDI規格: Bluetooth 4.0: 31.25Kbps 10~50 kbps
BLE MIDIの通信速度 ぎりぎり間に合うけど・・・
MTU更新 Bluetooth 4.0: 27 byte Maximum Transmission Unit Bluetooth 4.2:
247 byte
BLE MIDIの通信速度 Bluetooth 4.2:267 kbps
解決策 1. ハイエンド端末を使う 2. BLE-MIDIの通信を早くする 3. Javaで重い処理をしない 4. 低レイテンシオーディオ
解決策 Javaで重い処理をしない
Javaでやっている処理 M5Stack Gray BLE MIDI
Javaで重い処理をしない Android 9までのMIDIは JavaでMIDIデータを扱う必要があった。
Javaで重い処理をしない Android 10で追加された Native MIDI API(AMidi) ではNativeでMIDIデータを扱えるようになった。 Java Native
C/C++でMIDIデータの受信が可能 https://developer.android.com/ndk/guides/audio/midi?hl=ja から引⽤
解決策 1. ハイエンド端末を使う 2. BLE-MIDIの通信を早くする 3. Javaで重い処理をしない 4. 低レイテンシオーディオ
解決策 低レイテンシオーディオ
2つのオーディオライブラリ OpenSL ES(Gingerbread) AAudio(Oreo)
Oboe
Oboe • C++のオーディオライブラリ。 • 低レイテンシ、99%のAndroid端末で動作する。 • Oreo以降ではAAudio、それ以前ではOpenSL ES。 • OpenSLに⽐べてシンプルなコードで記述できる。
• Googleのエンジニアがメンテナンスしている。 • オープンソース。
解決策 1. ハイエンド端末を使う 2. BLE-MIDIの通信を早くする 3. Javaで重い処理をしない 4. 低レイテンシオーディオ
実演1 M5Stack Gray BLE-MIDI
実演2 M5Stackでシンセをコントロール
まとめ
·ͱΊ 1. ミッドレンジ〜ハイエンド端末 2. Bluetooth 4.2以上 3. MIDIと重い処理はNativeで 4. Oboe(AAudio)を使う
ソースコード • Androidアプリ • M5Stack Gray⽤BLE MIDIコントローラー https://github.com/kenta-bt/oboe https://github.com/kenta-bt/m5stack-midi-controller
͓·͚ Native MIDI API 応⽤編 MIDIデータは楽器のデータ専⽤という わけではありません。 IoT機器のセンサーデータをMIDIプロト コルを通すことでNatie MIDI
APIの恩恵 を受ける活⽤も可能です。
ご清聴ありがとうございましました。