2015年1月31日土曜日

Web MIDI Browser 1.0.1


Web MIDI Browser has been updated to 1.0.1. This new version includes an “Action Extension”. The Action Extension will let you launch the app from Action Menu in Mobile Safari. And then, Web MIDI Browser will automatically open the URL which is being opened in Safari at the time. The app’s functionalities are not enough for usual web browsing. So, I suggest
  • Use Safari in usual
  • Use Web MIDI Browser for web sites using Web MIDI API (You can smoothly launch the app from Action Menu)
And a small bug was fixed. Enjoy!

Web MIDI Browser のバージョン 1.0.1 をリリースしました。このバージョンには、”Action Extension” が同梱されています。Action Extension を使うと、iOS 標準のブラウザ Safari のアクションメニューから、このアプリを起動することができます。この時、Safari が開いている URL を自動的に開いてくれます。Web MIDI Browser のブラウザとしての機能は貧弱です。そのため、
  • 普段のウェブブラウズはもちろん Safari で
  • Web MIDI API を使ったサイトを開くときだけアクションメニューから Web MIDI Browser にスイッチする
という使い方が良いと思います。

また、このバージョンで、小さなバグを直しました。
ご要望などあればぜひお知らせください。



2015年1月8日木曜日

iOS 8 Safari Action Extension でハマる - 解決編

iOS 8 Safari Action Extension でハマる - 解決編

先日の記事で、iOS 8 Safari Action Extension から、URL Scheme を使ったアプリ起動に失敗した件、結局解決できたので追記。

non-UI Extension 用に用意されている JavaScript アダプタ内で location.href を書き換え

Action Extension には、UIを提供するタイプ("Presents User Interface") のものと、UIを提供しないもの("No User Interface") の 2 種類がある。後者の場合、Safari から Extension が
起動されたときに、Extension にバンドルされた JavaScript がロードされるようになっている。この JavaScript では、Pre 処理と Post 処理を記述できるようになっている。Pre 処理 (ExtensionPreprocessingJS.run 関数)で、DOM から必要な要素をピックアップし、Native 側に渡す。で、Native 側で必要な処理を行い、Post 処理(ExtensionPreprocessingJS.finalize)に渡して DOM へ変更を反映するという設計思想。
この Post 処理の中で、location.href を変更すれば、Safari が URL scheme をキックしてくれるので、マッチした URL scheme が登録されているアプリを起動できる。

実装方法

JavaScript を Action.js として Extension にバンドルする。

Safari の Action Menu を開き、作成した Extension のアイコンをタップすると、-(void)beginRequestWithExtensionContext: が呼びだされる。Native 側では特になにもせず、completion handler を呼びだすだけ。ただ、completeRequestReturningItems に、適当なパラメータを渡してやらないと、なぜか、ExtensionPreprocessingJS.finalize() が呼ばれなかった。

もうちょっとシンプルな方法がありそうだけど、ひとまず目的は達成。あとで内容を整理して、Qiita に投稿する。→投稿した


2015年1月1日木曜日

iOS 8 Safari Action Extension でハマる

Safari Action Extension でハマる

iOS 8 から、Safari Action Extension という、Mobile Safari のアクションメニューからプラグインのようにサードパーティアプリのコンポーネントを呼び出す拡張機能を提供できるようになった。早速これを使ってみようと思っていろいろ試したが結局使えなかった、という話。  →結局解決

Language: Swift を選択して生成した Action Extension のテンプレートが動かない

まず最初にハマったのが、Action Extension のテンプレートを生成するところで、Language: Swift を選んだところ、これが思うように動かない。具体的には、NSItemProvider の loadItemForTypeIdentifier の completionHandler が呼ばれない。結果、生成されるサンプルコード(DOM を操作して、背景色を赤にする)もちゃんと動いていない。

この問題は、テンプレート生成時に Language: Objective-C にすることで解決。Xcode 6.2 beta 3 でも再現するので Apple へバグレポートするかな...

Safari Action Extension からは Open URL できない

Extension のテンプレートは動くようになったので、本当にやりたかった、Extension から他のアプリの起動を試す。しかし、うまくいかない。まず、openURL: を使うために、UIApplication.sharedApplication が必要になるが、これにアクセスできない。まぁ、これは Extension のアーキテクチャから考えてもなんとなく想像できた。

Extension が起動されるときには、NSExtensionContext のインスタンスが渡されてきて、このインスタンスメソッドに openURL: がある。これだ!と思いきや、うまくいかない。NSExtensionContext の openURL: は、Today Extension からでないと使えないように制限がかけられている。
→ http://stackoverflow.com/questions/24297273/openurl-not-work-in-action-extension

で、この記事でも紹介されていた hack、UIWebView を経由して URL scheme をキックする方法を試したが、iOS 8.1.2 では弾かれてしまう。まぁ、仮に上手く動いたとしても、そもそも前述の openURL: の振舞いから想像するに、明確な設計思想による制約のようなので、App Review をパスできるかどうか微妙。

まとめ

結局、Action Extension から外部アプリを起動することはできなかった。
→解決しました

2014年11月1日土曜日

if then...

IFTTT や Zapier を使い始めた。

20 年くらい前は、サーバで cron 回したり、Procmail にレシピ仕込んだりして実現していたことが、今は Web ブラウザで簡単な質問に答えていくだけ。とても便利。

Dropbox の特定のディレクトリに mp3 を置いておくと、Podcast 用の RSS を生成してくれるレシピを使ってる。技術系セッションのビデオのオーディオトラックを mp3 にして Dropbox に放り込んでおくと、自動的に iPhone の Podcast に登録されるので、それを通勤中に聴いてる。参考にしたのはこの辺のレシピ。mp3 をそのまま「ミュージック」で同期すればいいような気もするけど、あえて Over The Air で。

この手のサービスでは、位置情報をトリガにしたレシピが面白そうなんだけど、位置推定精度がイマイチ。会社に着いたら、Evernote に出社時刻を記録するレシピを動かしていると、同じ時刻に数回レシピが実行されることがある。トリガするエリアの位置や範囲を少しずつ変えながら、いいポイントを見つけているところ。

2014年10月16日木曜日

Web MIDI API 対応

久しぶりに Web FM Synthesizer を更新しました。

変更点は、

  • Web MIDI API 対応
  • ポリフォニック化(発音数制限無し)
  • 軽量化
です。

Web MIDI API、簡単なブラウザの設定は要るものの、一般向けリリースの Chrome でもちゃんと動く。実装がはじまって 1 年ちょっとでここまでとは驚き。中の人、Good Job!

ポリフォニック対応は、発音があるたびに Script Processor Node を生成していくという富豪っぷり。今のところ発音数の制限もしてないので、発音数が増えてくるとおかしくなるかも。近いうちにモバイル対応を考えているので、その時に発音数リミットをつける予定。

ソースコードは GitHub でも公開しています。

2012年12月23日日曜日

三つ子の魂百まで? Webシンセを作りたい!

三つ子の魂百まで? HTML5 + JavaScript でWebシンセを作りたい!

今年(2012 年)の初夏ごろから、WebAudioSynth や、WebModular など、HTML5 + JavaScript で作られたソフトシンセが次々と登場してびっくりさせられました。Web ブラウザ上でさくさく動く手軽さと、それでもしっかりした音が出る実用性に二度びっくり。その後すぐに発表された、WebMidiLink で Web シンセ達が連携して動く!と、三度もびっくりさせられました。

そんな勢いに触発されて、私も Web Audio API を使ったシンセを作り始めました。最初はスライダーと、鍵盤代わりの四角い画像が一つだけという、シンプルな UI の 4 オペレータ FM シンセサイザーでした。

初期のプロトタイプ。4オペレータ分の ADSR + Ratioと、鍵盤代わりの四角い画像が一つだけ。

しかしながら、早い段階で WebMidiLink に対応させていたため、g200kg さんの WebMidiLink テストページからこのプロトタイプをロードすると、あっという間に鍵盤で音階を鳴らせ、MML でシーケンスを組むことまでできました。WebMidiLink はとてもシンプルなアイデアですが、実際に動くのを目にすると本当に感動。それはまるで、MIDI 黎明期の出来事を追体験しているような気持ちでした。

JavaScript も Web Audio API も初めての挑戦でした。開発初期の頃は、『パーフェクト JavaScript』や、正弦波を Web Audio API を使って生成するコード が参考になりました。JavaScript は利用者の多い言語ということもあって、情報を得るのに苦労はありません。言語やライブラリの使い勝手は、情報の収集し易さにも大きく左右されます。その観点で、HTML5 + JavaScript はさすが文句無し!(ただし玉石混淆) Web Audio API の情報はこれから充実してくるかな?という印象でした。私もいつかは JavaScript らしい洗練されたコーディングができるようになりたいものです。

自由なコーディングのひとときは、プログラマにとってプラモデルを組み立てているように楽しい時間です。いつまでも未完成のまま、ひっそりと組み立てを楽しむのも良いですが、WebAudioSynth や WebMidiLink から受けた衝撃を、さらにまた別の人に伝播させたいと思い立ち、Web FM synthesizer として公開することにしました。私がそうだったように、この Web シンセに興味を持った誰かが、また新しい Web シンセを登場させてくれると良いな、と思っています。

Web FM synthesizer

拙作の iOS アプリ、DXi FM synthesizer をお手本に、オペレータ式 FM シンセシスの一部のパラメータをエディットして遊べるお試し版としました。せっかくの Web シンセなので、作った音色のパラメータを URLに変換し、Twitter で気軽にシェアできる機能をつけました。
また、Web Audio API の ConvolverNode と、Impulse responses で公開されているフリーの IR サンプリングデータを利用して、FM シンセサイザーが盛んに使われた時代のデジタルリバーブを再現し、少しだけ出音にお化粧を施しています。雰囲気、出てますか?
ポリフォニック化やレイテンシ(バッファサイズ)のチューニングなど、まだいくつかやり残したことがあるので、引き続き JavaScript のコーディングを楽しみながら、Web MIDI API の到来を待ちたいと思います。

少し話題は変わって。この記事を書こうと考えたのは、今から 15 年前にも、私はWeb ブラウザで動く「Web 楽器」を作っていたことを思い出したからです。当時は Java(アプレット)として開発し、鍵盤をクリックすると、ulaw 8kHz のサンプリング音が鳴る、という単純なものでした。

"Internet Archive" から、当時私が公開していた Web ページの一部

当時作った Web 楽器 Java アプレットは、Internet Archive にも手元にも残っておらず、もはや動かせないのが残念です。これを作ったのは、インターネットと出会ってちょうど 1 年くらい経った頃でした。その頃に見つけた楽しいおもちゃは、やっぱり今でも楽しいものに変わりありません。三つ子の魂百まで。前述の Web Audio API を使ったシンセを見つけた時に、心の奥底に眠っていた魂が目覚めたのかもれませんね。

ところで、Internet Archive には、このページ以外にも、私がかつて公開していたコンテンツがいくつか残っているようです。しかし、当時高校生だった私が書いた文章を読み返していたところ、重度の中二病を発症していることがはっきりと確認されたため、非公開とさせて頂きます。あしからず。