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
Kenta Harada
April 09, 2020
Programming
0
240
Androidだって音楽アプリが作りたい(M5Stackによる実演付き)
Kenta Harada
April 09, 2020
Tweet
Share
More Decks by Kenta Harada
See All by Kenta Harada
元組み込みエンジニアがKotlinのビット演算を使ってみた
kharada_bt
0
67
ATOM Matrixで作る BLE MIDIコントローラー
kharada_bt
0
180
M5Stackで作るBLE MIDIコントローラー
kharada_bt
0
830
Other Decks in Programming
See All in Programming
Temporal Knowledge Graphで作る! 時間変化するナレッジを扱うAI Agentの世界
po3rin
4
870
Claude CodeによるAI駆動開発の実践 〜そこから見えてきたこれからのプログラミング〜
iriikeita
0
360
SODA - FACT BOOK(JP)
sodainc
1
8.9k
TFLintカスタムプラグインで始める Terraformコード品質管理
bells17
2
470
フロントエンド開発のためのブラウザ組み込みAI入門
masashi
7
3.6k
あなたとKaigi on Rails / Kaigi on Rails + You
shimoju
0
210
AIのバカさ加減に怒る前にやっておくこと
blueeventhorizon
0
110
kiroとCodexで最高のSpec駆動開発を!!数時間で web3ネイティブなミニゲームを作ってみたよ!
mashharuki
0
960
CSC509 Lecture 08
javiergs
PRO
0
260
釣り地図SNSにおける有料機能の実装
nokonoko1203
0
200
他言語経験者が Golangci-lint を最初のコーディングメンターにした話 / How Golangci-lint Became My First Coding Mentor: A Story from a Polyglot Programmer
uma31
0
460
Webサーバーサイド言語としてのRustについて
kouyuume
1
5k
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
225
10k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.6k
A better future with KSS
kneath
239
18k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
A designer walks into a library…
pauljervisheath
209
24k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Optimizing for Happiness
mojombo
379
70k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.2k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.7k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
658
61k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6k
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の恩恵 を受ける活⽤も可能です。
ご清聴ありがとうございましました。