毎年1月に楽器のトレードショー(通称:NAMM )が通例だとAnaheimで行われます。数年前はCESとNAMMに行かせていただくというとってもありがたい海外出張をさせていただいて以来のNAMM出張に来ています。今年も場所はAnaheim, Californiaです。

さて、特にアメリカだと歩いて行けるコンビニ的なところがホテルの近くになかったりして、時間に制約があるのに朝ご飯で時間を取られてしまう事が多いと思うのですが、僕はいつも「サンドイッチ(野菜なし)」を朝ご飯に食べられるように用意しています。
今回もホテルの近くにあるスーパーマーケットを事前に調査しておいて、ホテルに到着して一息入れたらすぐにスーパーマーケット(今回はWalmartでも食料品だけ売ってるWalmart Neighborhood Market)に行って材料を買ってきました。距離は1.5kmくらいでそこそこ近かったです。

これで朝ご飯はスピーディで、美味しく食べられます。パンにマヨネーズ、マスタード、ハム、チーズだけを挟むだけなんですが、おいしいんですよ。ポイントはパンと持参したマヨネーズ。アメリカだと日本のサイズの70%くらいのパンが売っていて、これがチーズの大きさにぴったりなんです。日本で感じられる「えっ、まだチーズに達してないじゃん」的な経験はすることがないのです。
ということでまた機会がありましたら、お試しくださーい!

ちなみに現地のスーパーに行くとこんなのが見られてなかなか楽しいです!!日本ではなかなかお目にかかれない感じですよね。
バレンタインデーだと思われるピンクのクッキー↓

新年あけましておめでとうございます! 2013年のお正月は天気がよく、よい一年になりそうな気がしています。

どちらかというと、レシピのメモ的なPOSTになりますが、、、
スタ丼が食べたくなって、ちょうど豚肉があったのでお昼ご飯に作りました。
レシピはこちらを参考にしましたよっと!
写真を撮るのも忘れる程、うまかった!ということで写真はサンプルです。。。


それでは2013年もよろしくお願いします!!

2012年は新しいものに関わり、いろいろ感じ、いろいろ試しと、ここ数年の中で最も変化に富んだ一年で、かつ、本当に楽しい一年でした。忙しかったですけどねf(^-^;)

今年の個人的なキーワードはこんな感じです。

2012年個人的キーワード

  • JavaScript
  • Web Audio API
  • Web MIDI API
  • Web RTC
  • HTML5
  • 信号処理
  • 音源(アナログ、FM)
  • ハッカソン
  • Google I/O
  • コミュニティ
  • アドベントカレンダー

そして、今年最大の残念な出来事はこれですね。

忘れもしない8月31日。現地でチャリの状態を確認をしたら壊れてて走れなかった事件。部品は取寄せ中だけど、フレームを変えてもいいかもと考え中。さて、来年は何回走りにいけるのかな〜。

2012年中は本当にお世話になりました。2013年もどうぞよろしくお願いいたします。

Web Music Developers JPのアドベントカレンダーの12月25日の記事です!

前回、前々回とWeb MIDI APIのレビューとエミュレーションライブラリ(WebMIDIAPIShim:Polyfill)を使ったMIDI INのサンプルを紹介してきました。MIDI INを紹介したのでMIDI OUTで何か作ろうと頭をひねったのですが「やっぱりMIDIファイルプレーヤーがいいかな〜?」という結論になりました。ちょっと思い返したら、12月2日のアドベントカレンダーで @toyoshim さんが「WebMidiLinkで遊んでみた」と題してSMFプレーヤーを公開されていることに気がつき、横着応用をして対応することにしましたf(^-^;) 数行の改変ですので、改変に関しては文字で説明させていただき、動作に関しては動画でお送りすることにしました。曲はYs2のオープニングでMIDIデータはOnLine Game Friend’sからダウンロードして使用しています。

原理はWebMIDLinkでは別ウィンドウに開いているWebシンセを鳴らす為にpostMessage() (HTML5 Web Messaging)を使い独自メッセージ(ほぼMIDIメッセージです)を送っていますが、このデモではそれをWeb MIDI APIのgetOutput()で取得したMIDIデバイスにsend()メソッドを使って送信しています。

またデモではエミュレーションライブラリとプラグイン(Jazz-Soft.netのJazz-Plugin)を使っていますが、数行のJavaScriptだけでMIDI機器を手軽に操ることのできる時代がそこまで来ていると思うとワクワクしちゃっていますf(^-^;) ちなみに今年2012年はMIDIの仕様が正式に世の中に出て30周年の節目(あと数日ですが、、、)。その節目の年にWeb MIDI APIという形で、もっと世の中に浸透するといいですね。

Web MIDI API 2nd WDについて3回に分けての紹介してきました。せっかくなので、すっごく簡単なまとめとしてスライドにもしましたので、もしよろしかったらどうぞ!! (追記:Web MIDI APIの仕様は日に日に更新されています。2013年1月8日の段階で既にこの説明の説明からは変更されていますのでご注意ください。)

Web MIDI API 2nd WD from Ryoya Kawai

というネタでWeb Music Developers JPの2012年のアドベントカレンダーを〆させて頂きます!!


Web Music Developers JPのアドベントカレンダーは2012年10月初旬の発足以来、実質的に最初のイベントでした。顔を合わせていないにも関わらず、たくさんの方にご賛同いただき、そして何よりもお忙しい師走の時期にお時間を裂いていただき、楽しい&興味深い&ハイレベルな内容のネタをご提供いただき本当にありがとうございました。心から御礼申し上げます。皆様の記事のお陰で僕自身は間違いなく毎日アドベントした毎日でしたが、僕と同じように多くの方がアドベントした毎日をお送り頂けたと信じております。今後もWeb Music Developers JPのコミュニティ活動は継続し発展をして行きたいと考えておりますので、今後ともどうぞよろしくおねがいいたします。

Web Music Developers JPのアドベントカレンダーの12月20日の記事です!

追記:Web MIDI APIの仕様は日に日に更新されています。2013年1月8日の段階で既にこの説明の説明からは変更されていますのでご注意ください。

前回は「Second Web MIDI API Working Draftのレビュー」を行いました。今回はWeb MIDI APIのWorkingDraft 第二版の末尾にあるサンプルコードのレビューを行います。とてもシンプルで分かりやすいサンプルコードになっていてとても参考になると思います。

ではさっそくレビューにはいります。

MIDI機器を取得

MIDI機器を扱う為の準備。

var midi = null;  // global MIDIAccess object

function onMIDISuccess( midiAccess ) {
 console.log( "MIDI ready!" );
 midi = midiAccess;  // store in the global 
}

function onMIDIFailure(msg) {
  console.log( "Failed to get MIDI access - " + msg );
}

navigator.getMIDIAccess( onMIDISuccess, onMIDIFailure );

getMIDIAccessメソッド成功時のcallback関数をonMIDISuccess[3-6行目]とする。onMIDISuccessでGlobal変数midi[1行目]にインターフェイスMIDIAccessを代入[5行目]。getMIDIAccessメソッドがエラーとなった場合のcallback関数としてonMIDIFailure[8-9行目]をと指定。

MIDI機器のリストアップ

MIDI入力元、出力先を指定する為にリストアップ。

function enumerateInputsAndOutputs( midiAccess ) {
 var inputs = midiAccess.enumerateInputs();
 var outputs = midiAccess.enumerateOutputs();
 var i;

 for (i=0; i<inputs.length; i++) {
  console.log(inputs[i]);
 }

 for (i=0; i<outputs.length; i++) {
  console.log(outputs[i]);
 }
}

インターフェイスMIDIAccessのメソッドenumerateInputs[2行目]/enumerateOutputs[3行目]を実行してMIDI機器のリストを取得して入力機器、出力機器を別々にconsole.logでデバッガのWebコンソールに出力[入力機器:6-8行目、出力機器:10-12行目]。

MIDIの入力信号を処理

受け取ったMIDI信号を処理。

function onMIDIMessage( event ) {
  var str = "MIDI message received at timestamp " + event.timestamp + "[" +
               event.data.length + " bytes]: ";
  for (var i=0; i<event.data.length; i++)
    str += "0x" + event.data[i].toString(16) + " ";
  console.log( str );
}

function startLoggingMIDIInput( midiAccess, indexOfPort ) {
  var input = midiAccess.getInput( indexOfPort );
  input.onmessage = onMIDIMessage;
}

インターフェイスMIDIAccessのメソッドgetInputで入力機器を指定して取得[9行目]し、MIDIメッセージを受信した場合のcallback関数(onmessage)をonMIDIMessageに指定[10行目]。 関数onMIDIessageは、MIDI入力を16進数変換してconsole.logでデバッガのWebコンソールに出力。

MIDIの出力ポートからMIDI信号を出力

MIDI信号を送信。

function sendMiddleC( midiAccess, indexOfPort ) {
  var output = midiAccess.getOutput( indexOfPort );
  output.send( [0x90, 60, 0x7f] );
   // note on, middle C, full velocity - omitting the timestamp means send immediately.
  output.send( [0x80, 60, 0x40], window.performance.now() + 1000.0 );
   // note off, middle C, release velocity = 64, 
   // timestamp = now + 1000ms.
}

インターフェイスMIDIAccessのメソッドgetOutputで出力機器を指定して取得[2行目]し、即座(timestampなし)に[90 60 7f]を実行するようMIDIメッセージを送信[3行目]、次に1000ms後に[80 60 40]が実行されるようMIDIメッセージを送信[4行目]。

  • [90 60 7f]:「MIDIポート1のC4を127の音量で発音する」というMIDIメッセージ
  • [80 60 40]:「MIDIポート1のC4を64の速度(機器によって異なる)で発音を停止する」というMIDIメッセージ

(RunningStatusの送信は許可されていません。)

MIDIの入力機器から受信したMIDIメッセージを出力機器へ送信するLoopback

var midi = null;  // global MIDIAccess object
var output = null;

function echoMIDIMessage( event ) {
  if (output)
    output.send( event.data, event.timestamp );
}

function onMIDISuccess( midiAccess ) {
  console.log( "MIDI ready!" );
  try { 
    var input = midiAccess.getInput( 0 );
    output = midiAccess.getOutput( 0 );
    input.onmessage = echoMIDIMessage;
  }
  catch (e) {
    console.log("Exception! Couldn't get i/o ports." + e );
  }
}

function onMIDIFailure(msg) {
  console.log( "Failed to get MIDI access - " + msg );
}

navigator.getMIDIAccess( onMIDISuccess, onMIDIFailure );
  • インターフェイスMIDIAccessを代入するGlobal変数midiを初期化[1行目]。
  • インターフェイスMIDIAccessのメソッドgetOutputで取得するインターフェイスMIDIOutputを代入するGlobal変数outputを初期化[2行目]。
  • getMIDIAccessメソッド成功時のcallback関数をonMIDISuccess[9-19行目]とする[25行目]。
  • MIDISuccessでは、getInputで先頭ににリストアップされた入力機器を取得[12行目]、getOutputで先頭ににリストアップされた出力機器を取得[13行目]、MIDIメッセージを受信した場合のcallback関数としてechoMIDIMessageを指定[14行目]。
  • echoMIDIMessageでは、選択した入力機器から受信したMIDIメッセージをそのまま選択した出力機器へ送信[6行目]。

というのがサンプルコードになります。 これでかなりイメージが湧くかな、と思います。

そして、Web MIDI APIの編集者の1人であるChris Wilsonさんが公開くださっているプラグインを使ったエミュレーションライブラリ(Polyfill)を実際に使って簡単なMIDI INのみのデモを作ってみましのた!!動作にはUSB-MIDIキーボードとJazz SoftのJazz-Pluginのインストールが必須となります。こんなに簡単にUSB-MIDI機器がブラウザにつながってしまう世の中になるのか〜、って思うとワクワクしちゃいます!

デモはこちらです!

それでは次回Web Music Developers JPのAdventCalenderの最終日は、MIDI OUTなデモが作成できたらな〜、と考えています!(作成できなかった場合、すみません。。。)