iOSでWeb MIDI APIが使える唯一のブラウザ「Web MIDI Browser」がバージョンアップした。
新機能は以下の2つ。
- フルスクリーンブラウズが可能に
- SysExの使用可否の設定が可能に
1つめのフルスクリーンブラウズはけっこううれしい。画面が広く使えるしぱっと見普通のアプリみたいに見える。後者のSysExの使用可否は、MIDIデバイス内部のデータを抜き取られる可能性を心配してのことだろうか? (Web MIDI API関連のフォーラムとかで議論になってたかと思う)。まあ、こちらは、ユーザーが設定できるので、問題ないと思われ。
で、気づいた点をいくつかメモ。Web MIDI Browserが必要とするiOS 8がぎりぎり動くiPad 2で使用。環境依存の問題かもしれないし、検証不足なところも多いのだけど、作成中のプログラムの現状の記録という意味も込めて記録。
フルスクリーンブラウズで、上にあるURLの入力欄とか、下に出る設定関連が表示できない場合がある。画面を上下にスワイプ(?)すれば出る仕様だと思うんだけど、これが出ない。同じページを開いても、出たり、出なかったり。画面がスクロールせずに全体が見えるページで、画面上のいくつかの要素にpreventDefaultとかstopPropagationが設定してあると、そうなる頻度が高い気配。画面の外側からスワイプしてもだめ。リロードもできなくなるので、いろいろ困る。仕方ないので左右のスワイプで前のページに戻って、なんとかしたりしている状態。なんか別の方法があるんでしょうか?
これと関連して、preventDefaultの挙動も時々謎。これは前のバージョンからある現象。WebAudio-Controlsのknobは最初からpreventDefaultが設定されており、つまみをいじった際にはスワイプによる画面スクロールはキャンセルされるはず。だけど、これがなんらかのタイミングで機能せず、値を変更しようとすると、画面が上下することがある(同時につまみもちゃんと動く)。これもタイミングとかが不明。リロードすればうまくいったりする。タッチ対応のプログラミングを把握できてないので、JavaScriptのコードでなんかを見逃してるかもだけど。
それから、なぜかSysExが送れない。上記の2つと違って、操作でなんとかできないのがつらい。
SysExの使用可否のオプションがSettingsで出せるのだけど、これを変更してもだめ(緑になったONだと思うんだけど、ON/OFFどっちもダメ)。すべてのWebアプリでだめなんじゃなくて、問題なく送れるものもある。その違いがわからない。
現在作成中のWebアプリで昨日から発生。たぶんWeb MIDI Browserバージョンアップの後。バージョンアップ前は普通に動いてた。ここ数日、自作WebアプリのプログラムでSysExまわり以外の部分に手を付けていて、それがようやく問題解決。で、SysExの送信を数日ぶりに試すと、これがダメ。むー。前に動いてた時から、いろいろ付け足す段階で余計なところに手を付けたか? ちゃんと記録してなかったので、わからない。
で、SysExを送れるWebアプリと、送れないWebアプリはまったく規模(というかプログラムの行数)も違っている。送れないやつはかなりでかくなっていて、回避策を探すのも一苦労になりそう。
SysEx送信処理をしても、エラーメッセージは出てない模様(window.onerrorを拾って、画面上に出すことで確認)。iPad 2の処理速度が足りてないとか、そういう問題だったりして。
あと、もう1つ。こちらのプログラムがまずいのか、Shadow DOMへのアクセスができてない(この表現が合ってるかどうか、わからない。Shadow DOMなんてつい最近知ったばかりだ)。これはPolymerエレメントのx-webmidiを使っていて気づいたところ。
「$(“#midiOutput /deep/ option”)」みたいに、MIDI INデバイスを選択するドロップダウンメニューの中身にjQueryでアクセス。デスクトップ版のChromeでは、これでうまくいってたのだけど、Web MIDI BrowserではこれがScript Errorになる(もちろん、値は拾えない)。このエラーメッセージは該当する行が表示されないので、探すのに骨が折れた(エラーが出ても、それ以降、そこ以外の機能の中核部分は動いてたから、というのも探すのに時間がかかった原因でもある)。(追記:jQueryのバージョン変えたらエラー出てた。15日)
ドロップダウンメニューに出てくるデバイスを自動で選択するようにしたかったのだけど、こんなわけでiOSではうまくいっていない。まあ、Androidではデバイス名自体が表示できないので、それに比べればぜんぜんましなのだけども。(追記:これ書いたあと、別の方法に気づいた。あとで試す。14日 →さらに追記:やっぱりだめだった15日)
以上、4月14日の記録。例によって、勘違いも多分にあると思われるので、あくまでも個人の記録ということで。
なんか気づいたら、また書きます。
それにしても、デスクトップのブラウザで書いたプログラムがそのままiOSで動くのは楽しい。特にMIDI関連アプリだと、iOSにおけるタッチならではの利便性は、マウス操作がメインのデスクトップPC以上。マウスポインターの移動ってけっこうストレスなんだなあ、と改めて思ったりもした。画面上につまみがいっぱいあったりすると、それが実感できる。しばらくはまた手がつけられないと思うけど、早いうちになんとかしたいなあ。
(追記:4月15日)
いくつか本文中に追記。あと、Windowsでは出ないエラーがWeb MIDI Browserで出てる。ちゃんと動いてた当時は気にしてなかったけど、一応、記録。
ReferemceError: Can’t find variable: _callback_receiveMIDIMessage
というやつ。これが関係あんのかな? 「WebMIDIAPIShimForiOS」。変数名はまさにこれだ。
自分のプログラムでは、該当するエラーがどこで発生してるかがつかめてないんだけども。後でなんか気付けるように手がかりを残しておく。これはバージョンアップ前から出てて、特に動作には問題なかった。たぶん、関係ないと思うだけども。
コメント
いつも情報ありがとうございます m(_ _)m
バグや使いづらい点、少しずつ直していきますので、ぜひぜひ、引き続きいろいろ教えてください。
・ナビゲーションが出なくなってしまう問題
iOS の API で、画面が上または下へスクロールしたことを検知してナビゲーションを再表示しているのですが、上手くいかないケースがあるのですね… 対策を考えてみます。
・SysEx を送信できない問題
こちらの確認では、1.0.3 で SysEx の送信処理に問題ありませんでした。もしよろしければ、SysEx を送信できない Web アプリを教えて頂けないでしょうか? こちらでも引き続き調べてみます。
SysExの送信については推察の通りで、セキュリティの観点から 1.0.3 から制御を入れました。その過程で、なにかエンバグしてしまったかもしれません。。。
・ナビゲーションが出なくなってしまう問題
ちょっと裏技っぽいですが、preventDefault() でスクロール制限したWebページを表示させた状態でナビゲーションを出す方法があります。文章だと説明しづらいので、ビデオにしてみました。これで回避できないでしょうか?
https://www.youtube.com/watch?v=_UF805uP-0A&feature=youtu.be
こちらこそ、いろいろ対応ありがとうございます。
ナビゲーションについては、教えていただいた方法(画面外側の上からスワイプ?)でもだめな場合があるようです。タッチ対応のプログラミングがまだわかってないので、もう少し、こちらでも検証してみます。
あと、SysExの許可については、わかったところを別記事にまとめました。
http://pointofviewpoint.air-nifty.com/blog/2015/04/web-midi-brow-1.html
こちらも見ていただければと思います。お手数かけますが、よろしくお願いします。
> あと、SysExの許可については、わかったところを別記事にまとめました。
おかげで原因わかりました。
x-webmidi が、requestMIDIAccess の時に、”sysex” のパラメータ値を文字列型で渡してくるようで、これを、Wrapper 側で無効値と判定していました。次のバージョン(1.0.4)が今リリース待機中で、次の次のバージョン(1.0.5)で修正される予定です。情報ありがとうございました m(_ _)m
> 次の次のバージョン(1.0.5)で修正される予定です。
楽しみにしてます!
あと、preventDefaultなどの挙動について、おかしいと書いたのですが、こちらのプログラムの問題だったようです。すみません!
現在、こちらのWebプログラムを見直し中。イベント制御まわりをいまいちど一から書き直しています(ごちゃごちゃになってわからなくなってしまったので)。すると、前書いたような現象は発生していません。その後、ナビゲーションも問題なく出ています。濡れ衣着せてしまってすみません!!!
こんな感じであれですが、今後もよろしくお願いします。