2017/02/17

音楽畑のジャケットを二度見した話

E-Onkyo

 私はハイレゾ音源配信サイトのE-Onkyoをよく利用しています。
 もっともハイレゾだからと云うよりは、ロスレス音源の配信サイトという意味合いが強いです。

 そこで新譜を眺めていたときです。
 ジャンルをクラシックを選んだとき、思わず目が留まったのがこれ

音楽畑 String Quartet Collection
音楽畑のリンク

ジャンルを間違えたかと二度見しましたが、ちゃんとクラシックです。
制服姿の女の子4人が弦楽器を手にしたこのゲームのサントラや同人CDに見えるジャケットは、服部克久さんの音楽畑を弦楽4重奏にアレンジしたものです。ちゃんとオフィシャルなものです。

音楽畑というとテレビなどから流れ聞こえてきた曲が多く収められたシリーズです。
このアルバムに収められている「自由の大地」や「ル・ローヌ」あたりは聞いたことある人多いのではないでしょうか。私は「自由の大地」は学生の時、奏楽部でよく演奏したものです。

そうかぁ。このジャンルもこう言うジャケットで攻めるようになったかぁと感慨深くなった物です。

イラストなジャケットや表紙

いわゆる古典な小説の表紙にイラストが使われるようになった、という話を聞いたのはつい数年前です。
その結果、表紙で登場人物や内容を提示できて、これまでアタッチできなかった層が気になって手に取るようになったという話を聞いたことがあります。

いわゆる「クラシック」や「イージーリスニング」などとくくられる音楽界隈も同じく、なんというか地味な印象をまといがちなジャンルだと思います。

ジャケットといえば大抵、演奏者がキリッとした写真か、風光明媚な風景や静物が多いです。
「そういうジャケットならクラシック」という目印にはなりますですが、縁がない人にはコンテンツの中身がわかりやすいかといえば、ちょっと首が傾きます。

ジャケットからの先入観などではなく楽曲を聴いて各々個人がそれぞれのイメージを育ててほしいというのはわかるのですが、あくまで初心者というか、それまで触れたことのない裾野の端の人々にはハードルが高い気がします。
先入観云々を言い出したら勝手につけた副題ととかはどうなの、と思いますし。

業界的にも、テーマを絞ってコンピレーションCDを作ったり、それこそ全曲放送に拘らず聞きやすいところだけを抜粋することも良しとするOTTAVAのようなラジオ曲があり、もっとライトな感じにクラシックを楽しめるように努力されているところがあります。
ちなみに私はTBS時代からOTTAVAは愛聴していました。特に月一の企画会議好きでしたよ。

個人的には、こういうジャケットもありだと思うのです。
現に私のように思わず二度見して、わざわざブログに書こうという人が現れたのですから、ある意味成功じゃないでしょうか。

もちろん全部こうするべきとは思いません。棚に並べたくない、とかいう人もいるでしょう。さもありなんです。
ただ、こういうアタッチも悪くないと思います。
せっかく、いい曲が沢山あるんですから、こういうジャケットも入り口には良いと思います、という雑感でした。

無料で使えるPC VRプレイヤー「Go Pro VR Player」

意外と無い、無料で使えるVR PCプレイヤー

ローカルに保存された全球型3D 映像映像いわゆるVR動画を再生するPCソフトウェアを探したら思いのほかに見つかりません。
スマホアプリなら沢山あるのですがことPCになるとぱったりです。
そんな中で見つけたのがgoPro VR Playerというプレイヤーです。

GoPro VR Player

元々はGoProで撮影した全球映像を再生するために配布されているwindowsおよびMacのソフトウェアですが、他で作られた映像も問題無く再生できます。

対応デバイスもOculusやVIVE(steamVR)と必要どころを抑えています。
デコーダーはVLCのライブラリ、Media Foundation(MacならAV Foundation)、DirectShowなど必要どころを抑えています。

3D方式はサイドバイサイド、上下とそれぞれ逆と必要十分を抑えています。
コントロール系はキーボードショートカットのほかGazeUI、入力インターフェースはHMD デバイスのコントローラの他LeapMotionやrealSense対応のカメラが使えます。

コマンドラインでファイルを渡しての起動やHTTPストリームからの再生、ついでにPremireProでVR動画を編集する際の確認用ビュアーとしても動作します。

json形式でのプレイリストにも対応しています。

ぶっちゃけ正直、VR動画プレイヤーとして必要十分です。

操作とショートカット

操作デバイスとして対応しているのは以下の機器です。
  • Oculus Remote
  • Oculus Touch
  • XBox One controller
  • HTC Vive controll

ショートカットはHキーを押すことで画面に表示されます。
※ V2.2以降はDキーに変わった模様。

後で出てくるスマホをHMDの代わりにするvridgeを使っている場合、コントロールに困ります。理由は単純にキーボードが見えないので。
なのでゲームパッドを繋いで、joytokeyなどで操作すると良い思います。

LOGICOOL ワイヤレスゲームパッド F710r
マイクロソフト ゲームコントローラー Bluetooth/有線接続/xbox one/Windows対応 PC用USBケーブル同梱 4N6-00003

プレイリストはUTF-8

プレイリストの書き方はここに説明が書いてあります。jsonという形式です。 
説明は英語ですが、例を見れば大体分かると思います。
気にする点は次の通りです。

- 文字コードはURF-8
- \などのパスの区切り文字は2つにする

プレイリストで書かれたファイルはalt+left/rightで再生順を制御出来ます。サムネイルを付加することも出来ます。

サムネイルを付加していてGaze UIを選択している場合は、画面上に表示されたサムネイルを注視することでも選択可能です。

vridge使いの場合

スマホをVIVEなどのHMD代わりにするvridgeというソフトウェアがあります。
vridgeはPCでレンダリングされた映像を一旦エンコードしてスマホに送るのですが、そのエンコードにGPUやCPUのエンコーダを使います。

この時にAPIがGoPro VR Player側と被るとあまりパフォーマンスが良くない事が多いですので、例えばvridgeがMedia Foundationでエンコードするなら、映像デコーダはVLCを使うなど分けた方が経験上良かったです。
このあたりは組み合わせもあると思いますので、試行錯誤すると良いと思います。

音声は今のところPCにヘッドホンなどを繋いでになります。
無線化したい場合はSoundWireアプリなどを使ってPCの音声をスマホに飛ばすことも出来ます。
ちなみにVridgeは音声込みのストリーミングを実装予定だそうで、早ければ5月くらいにはリリースされるのだとか。

格安スマホでのVR動画再生にも

VR動画を販売配信するサービスが増えましたが、格安スマホなどでは専用アプリで再生できないパターンがあります。
その理由は大きく分けて「ジャイロが無い」と「再生能力が足りない」の2つに分かれると思います。

販売されている動画は1920x2160というフルHDを縦に詰んだサイズのものが多く、1080p以上の再生が出来ないスマホだと再生時にエラーが出たり音だけになったりするわけです。
 
そんなときはPCの再生能力が十分ならGoPro Player+vridgeを使うことで回避することが出来ます。
もっとも販売サービスがPC用の試聴ソフトを用意していて、それがVIVE対応だったりするならば、Vridgeで一発です。
ただ某サービスではPC用ファイルよりもスマホ用ファイルのほうが画質が良かったりしますが、公式アプリはファイル形式で絞り込んでいるのか、スマホ用ファイルだとVR動画だと認識しなかったりします。こういうときはGoPro Playerの出番ですね。

GoPro Playerが使えるのは動画ファイルにDRMが掛かっていない場合に限ります。DMMとかはDRMが掛かっているので専用プレイヤーが必要になります。

vridgeはスマホだけではポジショントラッキングができませんが、この手のVR動画はポジショントラッキングは必要ないので十分でしょう。

youtubeなどのVR動画を見ようとして、スマホの再生能力以上のデータを受信するすることができないため、HMDゴーグルをつけても解像度が足りないがっかり映像になったりしますが、それも例えば「YouTube VR 360/3D Streaming Player for Vive」などを使うと4K映像で視聴できたりします。(もっとも4K 60fpsのストリーミングはかなりの回線速度が必要でしょうけども)


まとめ

無料という手軽さと、豊富な設定と機能を持ったGoPro VR Playerはローカル環境でのVR再生に持って来いだと思います。
 強いての懸念は、オープンソース等では無く、企業が一種の自社製品のためにある種サービスとして配布しているソフトなのでいつまでも配布されているかは分からないところ。仕方のないの無い話ですが。

最後に素敵なソフトウェアを配布してくれているGoProに感謝を込めて、せめてAAだけでも貼っておきます。


【国内正規品】 GoPro ウェアラブルカメラ HERO5 Black
ゴープロ (2016-10-03)
売り上げランキング: 155

2017/02/16

iPadの外付けキーボードはUSとJISを同時にペアリングしない方が良い

iPadでUS配列とJIS配列

iPadProはペンをメインで使うときと、膝の上で文章入力などラフに使うときのために2種類のBluetoothキーボードを用意しています。 
 ノートPCのような形になるキーボードはUS配列、ペンを多用するときに使う本体から独立しているMagic KeyboardはJIS配列です。
 
 これを同時にペアリングしていたときです。Magickeyboard側で英数字の=の入力出来ず、ふと隣のキーを叩くと=が入力されたじゃないですか。
 JIS配列なMagic keyboardがどうやらUS認識をしているっぽい。
 とりあえずUS配列のキーボードのペアリングを削除をしてアプリを再起動したところ、ちゃんとJIS配列として認識するようになりました。

キーボードの配列は混ぜるなキケン

キケンとまでは言いませんが、予期しない挙動をするためいくつもkeyboardをペアリングする場合は配列を揃えた方が良さそうです。
 もっとも、キーボードを二個も三個もペアリングするという使い方はマイナーでしょうけども。

おまけ

amazonでiPadのキーボードを見ていたら、ロジのIk1200が発売当初からなんか半値くらいになっているじゃないですか。
 2017年2月16日現在で9,944円です。
 Ik1200はiPad Pro用でちゃんとしたライセンスを受けたもので、BluetoothではなくiPadの横にあるSmart Connectorを使って接続をするものです。おまけにバックライトも付いています。その分、ちょっと重さに来るみたいですが。
 たしかこれ、しばらく2万円くらいの価格だったはず。9.7インチより安くなっていて、不思議な感じがします。
 

2017/02/13

[Unity] TouchScriptの覚え書き



TouchScriptって

Unityで個人的な物を作るとき、入力周りにはTouchScriptというアセットをよく使います。
TouchScriptというのは、マルチプラットフォームに対応したタッチ入力やジェスチャ入力を簡単に扱えるようになるアセットです。現在絶讃Asset Storeにて配布中です。無料です。
なんでもPokemonをGOするアプリにも使われていたとかなんとか。
簡単に使えるようになる、はずなのですが、よくセットアップ時に何か1つ抜けてたりするので備忘録ついでにブログに残してみます。

セットアップ

この記事はUnity5.4f3+Touchscript 8.2基準で書いています。

アセットをインポートしたら空のGameObjectを作り適当に「TouchManager」とか名前をつけます。
それにTouchScript/TouchManagerとTouchScript/InputSouces/Standard Inputのコンポーネントを追加します。Standard Inputは無くても自動で追加されるんですが、あった方が後々便利かなと思います。
ついでにプロジェクトから「TouchScript/Prefabs/Touch Visualizer」をhierarchyに放り込むとタッチの状態が視覚化できて便利です。

ジェスチャの計画

ゲームの種類や用途に応じてコンポーネントを追加していきます。
2DゲームならカメラにTouchScript/Layers/CameraLayer2Dを割りあてます。
3DならCameraLayerをカメラに割り当てます。
 
fullscreen Layerは全画面で反応するようにするもので、UI LayerはUI要素に反応するもの。こちらは後ほど説明します。

オブジェクトにジェスチャを割り当て

入力に反応して欲しいオブジェクトに対してジェスチャのコンポーネントを追加していきます。
TouchScriptにあるジェスチャコンポーネントで主要なものは以下の通り。
  • タップに反応する「TapGesture」
  • フリックに反応する「FlickGesture」
  • 長押しに反応する「LongPressGesture」
  • ドラッグ、ピンチ(拡大縮小)や回転に反応する「TransformGesture」
  • TransformGestureと基本同じだけどスクリーン座標を返す「ScreenTransformGesture」
オブジェクトを中心として一本指で回転やピンチをする「PinnedTransFormGesutre」
Transform系のGestureはpositionのみとかscaleのみとか振る舞いを絞り込むことが出来ます。

他にも指を離したときに特化したRelease Gestureとかありますが割愛です。
ちなみにScreen Transform Gestureは使ったことがないのでよく分かりません。FullscreenLayerと組み合わせてカメラ移動とかに使うのでしょうか?
これらから欲しい挙動のコンポーネントを反応させたいGameObjectに割り当ててます。
Colliderを追加するのも忘れずに。

特定のオブジェクトのタップを得る場合

反応させたいGameObjectにTap Gestureを割り当てます。
そして次のようなコードを書きます。
usingは必要に応じてTouchScript.Gesturesなどを追加して下さい。
void OnEnable()
{
    // TapGestureのdelegateに登録
    GetComponent<TapGesture>().Tapped += tappedHandle;
}

void OnDisable()
{
    UnsubscribeEvent();
}

void OnDestroy()
{
    UnsubscribeEvent();
}

void UnsubscribeEvent()
{
    // 登録を解除
    GetComponent<TapGesture>().Tapped -= tappedHandle;
}

void tappedHandle(object sender, System.EventArgs e)
{
    //処理したい内容
}

特定のオブジェクトのフリックを得る場合


反応させたいGameObjectにFlick Gestureを割り当てます。
そして次のようなコードを書きます。
usingは必要に応じてTouchScript.Gesturesなどを追加して下さい。

void OnEnable()
{
    // FlickGestureのdelegateに登録
    GetComponent<FlickGesture>().Tapped += FlickedHandle;
}

void OnDisable()
{
    UnsubscribeEvent();
}

void OnDestroy()
{
    UnsubscribeEvent();
}

void UnsubscribeEvent()
{
    // 登録を解除
    GetComponent<FlickGesture>().Tapped -= FlickedHandle;
}

void FlickedHandle(object sender, System.EventArgs e)
{

    var gesture = sender as FlickGesture;
    // ジェスチャが適切かチェック
    if (gesture.State != FlickGesture.GestureState.Recognized)
    return;
    // 処理したい内容
    // gesture.ScreenFlickVectorにフリック方向が入るので
    // if (gesture.ScreenFlickVector.y < 0)としたら下方向へのフリックを検知できる
}

ScreenFlickVectorを使ってフリック方向を得る事が出来ます。
その他に、反応する方向、距離や時間なども設定出来ます。インスペクタからも設定出来ますが、コードで設定する場合は こちらを確認すると良いです。

ドラッグ、拡大や回転を得る場合

反応させたいGameObjectにTransform Gestureを割り当てます。
TransformGestureについてはTransformerというコンポーネントを加えると、コードを書かずに移動や拡大を実現出来ます。もちろんイベントハンドラを使って自分でtransformを設定すればtransformerは使わないでもいいですが、回転や拡大縮小を使う場合は、ぐっと楽になります。

今回はTransformerを使う方法で書きます。
コンポーネント追加後はTransform GestureでPositionやScaleなど有効にしたいtransformを指定したら、これでとりあえずドラッグに合わせてオブジェクトが動きます。

あとはイベントハンドラを使って必要な処理を追加していきます。
usingは必要に応じてTouchScript.Gesturesなどを追加して下さい。

void OnEnable()
{
    // Transform Gestureのdelegateに登録
    GetComponent<TransformGesture>().TransformStarted+= TransformStartedHandle; // 変形開始
    GetComponent<TransformGesture>().StateChanged+= StateChangedHandle; // 状態変化
    GetComponent<TransformGesture>().TransformCompleted+= TransformCompletedHandle; // 変形終了
    GetComponent<TransformGesture>().Cancelled+= CancelledHandle; // キャンセル
}

void OnDisable()
{
    UnsubscribeEvent();
}

void OnDestroy()
{
    UnsubscribeEvent();
}

void UnsubscribeEvent()
{
    // 登録を解除
    GetComponent<TransformGesture>().TransformStarted -= TransformStartedHandle;
    GetComponent<TransformGesture>().StateChanged -= StateChangedHandle;
    GetComponent<TransformGesture>().TransformCompleted -= TransformCompletedHandle;
    GetComponent<TransformGesture>().Cancelled -= CancelledHandle;
}

void TransformStartedHandle(object sender, System.EventArgs e)
{
// 変形開始のタッチ時の処理
}

void StateChangedHandle(object sender, System.EventArgs e)
{
// 変形中のタッチ時の処理
}

void TransformCompletedHandle(object sender, System.EventArgs e)
{
// 変形終了のタッチ時の処理
}
void CancelledHandle(object sender, System.EventArgs e)
{
// 変形終了のタッチ時の処理
}
transfromerコンポーネントを使うとこれだけで2本指での拡大、移動、回転が可能になります。

PC上でマウスを使う場合は二本指ジェスチャは出来ないので、そのときはaltキーを押してクリックすると、そのクリックは「押しっぱなし」と見なされマルチタッチジェスチャを入力することが出来ます。

transformGestureのインスペクタ上にある「transform Type」の項目は以下のようにするとスクリプトで設定することが出来ます。
// using TouchScript.Gestures.Base;がある前提で
// 値には以下の値を入れる
// 回転ならTransformGestureBase.TransformType.Rotation
// 移動ならTransformGestureBase.TransformType.Translation
// 拡大ならTransformGestureBase.TransformType.Scaling
// 例
GetComponent<TransformGesture>().Type = TransformGestureBase.TransformType.Rotation | TransformGestureBase.TransformType.Scaling; 

画面全体のタッチを取得する場合

画面全体つまりオブジェクトが無いところで起きたタッチイベントを取得することが出来ます。

カメラの移動などに使ったり、画面を切り替えるとき、とにかく画面をタップしてほしい時などに使うのだと思います。

使い方はまずHierarchyに空のgameObjectを作り、touchManagerとfullScreenLayerコンポーネントをセットします。すると、TouchManagerコンポーネントに「FullScreen」レイヤーが認識された旨追加されます。

 後は作成したgameObjectにタップなどのジェスチャを割り当てていきます。内容は上のタップやフリックなどと同じです。

uGUIにジェスチャを割り当てる

やり方はFullScreenLayerとほぼ同じです。
FullScreenLayerの代わりにUILayerをGameObjectに割り当てます。
割り当てるのはべつにCanvasなどで無くともTouchManagerをセットしたGameObjectでも良いみたいです。

標準のuGUIとTouchScriptを混在させる

標準のuGUIとTouchscriptを混在して使う場合、例えばキャラクターの移動にはTouchScriptを使ってアイテムの選択にはuGUIを使う場合は、EventSystemにあるStandaloneInputModuleをTouchScriptInputModuleに置き換えます。
これをしないとuGUI側が無効になります。

タッチされた位置を知る

タッチの情報は、イベントハンドラ内のobjectから得ることができます。
例の場合、senderからタッチされた情報を得るには以下のようにします。

// transformGestureの場合

   var gesture = sender as TransformGesture;
   TouchHit hit;

   gesture.GetTargetHitResult(out hit);

これでhitにはタッチされた場所などの情報が渡されます。あとはhit.Pointで位置が取得で見ます。

hit.NomalにはタッチされたColliderとの法線が得られます。
例えば床に当たったときは(0f,1f,0f)が、壁等の場合は(1f,0f,0f)などが得られますので、必要に応じて組み合わせます。

シーン上のタップの状況を知る

TouchScriptにはタッチジェスチャごとにSendMassageを送ることが出来ますが、シーン全体のタッチを管理するTouchManagerのイベントハンドラからタッチ情報を得ることも出来ます。

// using TouchScript; として

// touchはTouchPointが入る
// touch.Idはタッチした順の値

   TouchManager.Instance.TouchesBegan +=
       (sender, args) => {
           foreach (var touch in args.Touches)
               Debug.Log("Began: " + touch.Id);
       };

    TouchManager.Instance.TouchesEnded +=
       (sender, args) => {
       foreach (var touch in args.Touches)
               Debug.Log("Ended: " + touch.Id);
       };

例ではtouchから TouchPointの情報を得ることが出来ます。具体的にはタップした順や位置、transform、入力方法などです。

ただこのイベントだと「どのオブジェクトがタッチされたか」しか分からないのです。(もしジェスチャまで分かる方法があるなら教えて下さい)
なので、ジェスチャごとの挙動は各ジェスチャのイベントハンドラに書いた方が良いでしょう。

複数のジェスチャを認識する

TouchScriptは一つのGameObjectに複数のジェスチャコンポーネントが割り当てられていると、排他的に登録順に処理していきます。

そのため、一つのジェスチャが認識中は他のジェスチャを認識しません。
例えば、とあるボタンは長押しをすると技の詳細表示、そのままフリックすると技を発動したい、とします。普通に割り当てたままだと、LongPressGestureがタッチ情報を掴んでしまいflickGestureへ流れなくなります。

そんな時はfriendlyGesturesというのを割り当てます。
やり方は、インスペクタから同時に認識させたいジェスチャのコンポーネントへジェスチャを含んだGameObjectをD&Dするか、スクリプトで割り当てます。

 
GetComponent<LongPressGesture>().AddFriendlyGesture(GetComponent<FlickGesture>());
 これで長押しとフリックが同時に認識するようになります。

まとめ

TouchScriptはやりたいことをイベントハンドラに登録すれば出来てしまうと言うお手軽さと、マウスでもマルチタッチジェスチャがテストできるのが素敵なフレームワークです。

なのですけど、多機能なだけに「これ、どこにセットするんだっけ」と毎回ググる羽目になるので自分宛の備忘録のつもりに書いてみました。

この記事からstackEditで書いて投稿しています。今更感満載ですが、markdownでかけるのは楽です。

Blogger標準のエディタも悪くは無いんですけど、WYSIWYGなエディタの宿命なのかよく分からない見出しタグが入るのが残念でした。
しばらくこれを試してみようと思います。

2017/02/03

ブログの表示が遅いのでテンプレートを変更した


 もうタイトルですべてを言い切った感がありますが、ここのところブログの表示が妙に遅かったのです。
 サーバーが混んでるのかとも思っていましたが、googleさんがそんなに遅いはずは…と思い直し、いろいろ弄った結果ブログのテンプレートを変えることにしました。