androidでMIDI-INテスト

 Android, 携帯電話  androidでMIDI-INテスト はコメントを受け付けていません。
7月 212012
 

楽器できないけどmidi好きのta9marです。

android用USB-MIDI-Driver作った方がいたので、使わせてもらいました

kshojiさん / USB-MIDI-Driver
https://github.com/kshoji/USB-MIDI-Driver

物理接続構成
GalaxyNexus <-> microUSB-B USB-A変換 <-> USB-MIDI keyboard

ちっこいUSB-MIDI鍵盤引っ張り出してGNさんに接続。EVOLUTIONってかいてある。

(いつも使ってるIFのROLAND UA-20だとMIDIイベント全く取ってくれなかったので><)

サンプルアプリ繋いだらMIDI EVENTが表示されたのを確認。
これを音が出るように改造してみるテスト。

結果がこちら。

ド、レ、ミとか、音階ごとに単音のMIDIファイルを作っておいて、鍵盤押されたらMediaPlayerクラスで再生。

横音ハンドベルの時みたいに、pcmで録音するのはアプリ容量的にも、稼動的にも厳しいので今回はMIDIに。

以前作ったメモリ上にMIDIファイルイメージ作るクラス使おうと思ったら、MediaPlayerクラスはメモリから再生できないみたい。なので一度ファイルに書き出した。
1つ作って、コピーしてバイナリエディタで音階書き換える地道な作業。
(midiの音階は例えば38(0x26)だとオクターブ2のミ#(E+2)とか決まってます)

40個ほどmidiファイル作って、リソースとしてにつっこんで、ソースはべた書き。

@Override
public void onMidiNoteOn(int cable, int channel, int note, int velocity) {
    if (velocity &gt; 0) {
        MediaPlayer mediaPlayer=null;
        switch(note){
            case 0x26: //38:E+2
                mediaPlayer = MediaPlayer.create(this, R.raw.note26);
                break;
            case 0x27: //39:E2
                mediaPlayer = MediaPlayer.create(this, R.raw.note27);
                break;
            case 0x28: //40:F2
                mediaPlayer = MediaPlayer.create(this, R.raw.note28);
                break;
            case 0x29: //41:F+2
                mediaPlayer = MediaPlayer.create(this, R.raw.note29);
                break;
            case 0x2a: //42:G2
                mediaPlayer = MediaPlayer.create(this, R.raw.note2a);
                break;
            case 0x2b: //43:G+2
                mediaPlayer = MediaPlayer.create(this, R.raw.note2b);
                break;
      :
     <中略>
      :
            case 0x50: //80:F+5
                mediaPlayer = MediaPlayer.create(this, R.raw.note50);
                break;
            default:
                break;

        }
        if(mediaPlayer!=null){
            mediaPlayer.setOnCompletionListener(this);
            mediaPlayer.start();
        }
    }
}

再生終了した音ファイルはonCompletionでリリース。

@Override
public void onCompletion(MediaPlayer mp) {
    mp.release();
}

MIDI-INは取れて活用できたのでテストとしては満足だけど、ミニ鍵盤ではどうにも面白いネタが出来そうにない。
どうにかしてRoland UA-20認識させてRoland XP-60からイベント取りたい。

次はMIDI-OUTも試したいけど、やはりUA-20経由になるのでどうにかしないと。。。

(あとgithubの使い方覚えないとな。。。)

MHL(microUSB→HDMI)→HDMI-DVI変換してみた

 Android, 携帯電話  MHL(microUSB→HDMI)→HDMI-DVI変換してみた はコメントを受け付けていません。
7月 102012
 

映像外部出力好きのta9marです。

Xperia系は昨年のarc/acroからmicroHDMI端子が搭載されており、TV出力してにやにやしておりました。
ところがGX/SXからは省略されてしまい、microUSB端子に繋ぐMHL規格になるとか。

Galaxy系ではMHLが採用されてましたが、Xperiaまでその流れになるとは・・・
そこでMHLの実験してみました。 よく分からないまま。。。

用意したのは

①Galaxy純正オプションのMHLアダプタ(microUSB-HDMI)+HDMIケーブル
②BuffaloのMHLケーブル(microUSB-HDMI)まず①純正MHLアダプタにHDMIケーブルでTVに接続。

各社MHLアダプタ見たところ、電源が必須のようです。スマホ充電用のmicroUSBさして供給する形。
この構成は当然ですが問題なく映りました。

次、②のMHLケーブル。http://buffalo.jp/products/catalog/supply/phone/cable/hdmi/bsmpc16m/
「MHL機能を搭載したデジタルハイビジョンテレビと接続~」が具体的に理解できないまま購入(^^;
これは電源供給が要らないので、スマホのmicroUSBとTVのHDMIを直結するのでスマートです。

しかし、この構成はあえなく撃沈。TVにHDMIついてればいい訳ではなく、MHL機能搭載TVというものじゃないとダメっぽいです。
家の最新のBRAVIA(昨年モデル)でも付いてないので、相当最近の規格なのでしょう。無念です。

ここからはお遊び。

iPhone4sはアナログ出力もあるので、VGA変換アダプタさせばアナログRGB出力できます。
モニターやプロジェクターにサクッと出力されて感動しました。(おいandroidぉぉぉ!><)
という事で、HDMI付いてるTVやモニタ以外で映せないかの実験。 ベストはVGAコネクタによるアナログ出力です。

用意したのは

①HDMI→DVI-I変換コネクタ
②DVI-I→VGA変換コネクタ

ひとまずMHLは置いておいて、スマホ側は確実なacroHDのmicroHDMI。

まずは直結。
microHDMI→[HDMI-DVI-I変換]→[DVI-I-VGA]→モニター/プロジェクター

これは映りませんでした。コネクタ的には繋がるのですが、出力元からアナログデータが出てないようで、何も出力されず。アナログは無理ぽです。

ならは次はデジタル。これは問題ないでしょう。
microHDMI→[HDMI-DVI-I変換] →モニター/プロジェクター

とおもったら、モニタ側のDVI端子がDVI-D端子でささりません。
DVI-Iはデジタル+アナログ両方に対応していて、アナログ分ピン数が多い為、DVI-Dにはささりません。(Dは24pin、Iは29pin)

HDMI→DVI-D変換コネクタを買えばいいのですが、買いなおすのもアレなので、pinを引っこ抜いて見ました。

右側の3pin×8列=24pinを残し、左の※の部分(4pin+平べったい1pin)を全部ペンチで抜きました。少しぐっと力を入れるとすぐ抜けます。

無事DVI-Dにささり、DVI出力されました!

送料込み399円の安物にしては使えます!(^^;

http://www.amazon.co.jp/PLANEX-HDMI-to-DVI-I%E5%A4%89%E6%8F%9B%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF-XX-PL-HDDVAD/dp/B0067GNVWK/ref=sr_1_7?ie=UTF8&qid=1341928275&sr=8-7

同じメーカーのHDMI-DVI-D変換コネクタは800円程するので、地味に400円程度お得でした

http://www.amazon.co.jp/PLANEX-HDMI-to-DVI%E5%A4%89%E6%8F%9B%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF-PL-HDDVAD/dp/B000V4NYP8/ref=sr_1_3?ie=UTF8&qid=1341928275&sr=8-3

 

GalaxyNexusでUSB MIDI MONITORを試した

 Android, 携帯電話  GalaxyNexusでUSB MIDI MONITORを試した はコメントを受け付けていません。
7月 072012
 

USB MIDI MONITORというアプリを試してみた。(今回は作ってみたではない)

GalaxyNexusにUSBでRolandのMIDI I/F機器UA-20(もう売ってない)を接続。

UA-20にMIDI-INで鍵盤からMIDIデータを入れてみるテスト。

見づらいですが、鍵盤押した時にNoteON、話したときにNoteOFFイベントが出てます。これは上がる!

1年位前にいつかADKでやろうと決めていたものですが、既に標準的なMIDI I/Fで出来ているとは・・・
USB Host使うのでAndroid3.0以降用なんですが、そろそろ4.0時代なのでまあ問題ないよなあ。。。

使用したアプリはこちら
https://play.google.com/store/apps/details?id=com.extreamsd.usbmidimonitor&hl=ja

7月 052012
 

前回のエントリ
http://init0.net/wp/archives/405

ほんの少しプチっと切れるけど、ギャップレス風になったよ!って纏めたのですが、テスト曲がまさかのmp3でした。
mp3はそもそもギャップレスできないと有名。

再度ogg vorbisで実験してみました。

①上の再生ボタンが今までどおりの再生です。
1曲目のMediaPlayer再生完了をonCompletionで認識し、2曲目のMediaPlayer再生しています。

オートフォーカス動きまくってToastの文字見えないですが「onCompletion」と表示しています。

②下の再生ボタンが、API Level:16のsetNextMediaPlayerを使った再生です。
1曲目のMediaPlayer再生と同時に、setNextMediaPlayerで2曲目のMediaPlayerを指定しています。
Toastは「setNextMediaPlayer」と、比較のため「onCompletion」を表示しています。

明らかにプチっとも音が切れていません。これはすごい。

一応apkも公開しておきます。
http://init0.net/android/mediaplayertest16/MediaplayerTest.apk

大変だったのは、ノンストップCD音源のまま動画公開するわけにも行かず、フリー風な楽曲漁っても出てこなかったので、急遽自分で鍵盤押さえてマイクで録音したという(^^;
Sus4からの解決で決まり!

7月 022012
 

6/30(土)に日本androidの会横浜支部の定例会でもくもくしてきたので、その内容をメモ。

#いきなりADT20で新規プロジェクト作れないループにはまって時間半分失ったという

それは置いておいてGalaxyNexusにAndroid4.1焼いたので、出たばかりのAPI Level 16使ってみよう実験。

音系という事でMediaplayer。

音楽プレイヤーを作る時、普通に作ると、1曲再生し再生完了を検出したら、次の曲を再生する。

(あまり機会は無いけど)NonStop系の楽曲を聴く場合、CDで聞くとつなぎ目が無く再生されるのに、Androidでこの方法で再生すると繋がらない。体感ざっくりで500[ms]程度は無音が入って台無し。

API Level:16(Android4.1)で追加された、setNextMediaPlayer()を使ってみた。
説明に「as seamlessly as possible」と書かれていたから、これはギャップレス再生ができるのかな?と。

まずはいままでのやりかた。
music1が1曲目、music2が2曲目のコンテンツファイル(mp3とかoggとか)とすると。
MediaPlayerに読み込ませてstart()する。
2曲目の再生遅延を無くすために2曲目も読み込ませておく。

MediaPlayer mPlayer,mPlayer2;
などしておいて、


mPlayer=MediaPlayer.create(this, music1);
mPlayer.start();
mPlayer.setOnCompletionListener(this);
mPlayer2=MediaPlayer.create(this, music2);

1曲目の再生終了を検出するため、setOnCompletionListener登録しておく。

@Override
public void onCompletion(MediaPlayer mp) {
    mPlayer2.start();
    Toast.makeText(this, "onCompletion", Toast.LENGTH_SHORT).show();
}

再生完了するとonCompletionが呼ばれるので、そこですかさず2曲目をstart()する。

これを下記のように作り直した。

mPlayer=MediaPlayer.create(this, music1);
mPlayer.start();
//mPlayer.setOnCompletionListener(this);

mPlayer2=MediaPlayer.create(this, music2);
mPlayer.setNextMediaPlayer(mPlayer2);

これで1曲目再生完了後、2曲目が自動で再生されます。

GalaxyNexusで再生すると、連続再生されました。(ユーロビートのNonStopMixのCDを発掘したのを使った)
ただ一瞬プチッと切れたのが分かります。 ※最後の補足参照の事[12/7/5追記]
このへんが「as seamlessly as possible」なのだろうと。
端末毎に違いが出る可能性はありますね。

尚、onCompletionは不要です。
onCompletion登録しても、従来どおり呼ばれます。
ただ、2重に再生startしても無駄です。

4.1未満ならsetNextMediaPlayer設定しない、onCompletionで次の曲再生する。
4.1以上ならsetNextMediaPlayer設定し、onCompletionは何もしない(もしくはsetOnCompletionListener登録しない)
など処理を分けるといいかもですね。

※補足追記[12/7/5]
うっかりMP3でやったため音が切れていたことが判明(mp3はパディング入る)
oggで実施すると切れない事が確認できました。

つづきはWebで!(その2の意)
http://init0.net/wp/archives/419