So-net無料ブログ作成

FCB13th Live参戦 [雑記]

2016年10月30日(日)。川崎市教育文化会館で行われた、FCB(ファミコンバンド)によるゲーム音楽演奏会「FCB 13th LIVE キョウブンに消ゆ」に参戦して参りました。

演目は
・ハドソンメドレラ
・オホーツクに消ゆ(完全版)
・熱血硬派くにおくん
・ルート16ターボ
・信長の野望
・FF3
等々4時間にも及ぶ、尻が痛くなるほどの大ボリュームです(毎回だけどww)。

ゲーム画面を徹底再現するマニアックな寸劇は、今回も健在。「オホーツクに消ゆ(完全版)」もほぼすべてのシーンを完全再現する徹底ぶりです。

前回、前々回の参戦時はこっそり観て、こっそり帰ってきた感じですが、今回はメンバーの方から「一言ご挨拶をいただけたら……」と依頼があり、「オホーツクに消ゆ」演奏後にいそいそと登壇。

箸にも棒にもかからず毒にも薬にもならないようなことをお話させていただきました。

もう少し実のあることを話せればよかったんですがねー。そういうの不慣れなものでねー、かたじけない……。

ともあれ、ファミコン版「オホーツクに消ゆ」の発売から29年もたって、全曲演奏してくださったFCBのみなさまには、ただただ感謝の気持ちでいっぱいでございます。

さらに、ハドソンで数々のゲーム音楽を作られた国本剛章さんがベースで飛び入り参加するなど、今回の「FCB 13th」は超濃い舞台でした。「カトちゃんケンちゃん」(PCエンジンソフトの中で一番好きな曲)を、作曲者ご本人のベースで聴けるなんてことは、滅多にありませんからな!

会場には「オホーツクに消ゆ」FC版グラフィックや、マンガ「べーしっ君」でおなじみの荒井清和画伯も来ており、終演後に合流。「いやー、渋谷へ買い物に出たついでにフラッと来てみたんだよねー。まさか全曲やるとは思わなかった。1曲目のタイトル曲が始まったとたんにウワッと涙腺緩んだー」と話しておりました。

FCB指揮者いちけnさん(@ike_ike_ike)のtweetによれば、次回「FCB LIVE」の開催は未定とのこと。これまでほぼ2年おきに開催されていましたが、次までのインターバルはそれよりも長いものになるのでしょうか。

いつかまた、白熱の寸劇と演奏が観られることを切に願っております。

VIVA、FCB!


余談ですが、「ファミソン8BIT SP~ゲームソング編」には、桃井はるこさんが詞をつけて歌ってくださった「オホーツクに消ゆ」のエンディングテーマが収録されていますよ。

ファミソン8BIT SP~ゲームソング編

ファミソン8BIT SP~ゲームソング編

  • アーティスト:
  • 出版社/メーカー: メディアファクトリー
  • 発売日: 2014/03/26
  • メディア: CD

サウンドアドベンチャー オホーツクに消ゆ

サウンドアドベンチャー オホーツクに消ゆ

  • アーティスト: 上野利幸
  • 出版社/メーカー: アンダーグラウンド・リベレーション・フォース
  • 発売日: 2002/01/21
  • メディア: CD

べーしっ君 完全版 (立東舎)

べーしっ君 完全版 (立東舎)

  • 作者: 荒井 清和
  • 出版社/メーカー: リットーミュージック
  • 発売日: 2016/07/25
  • メディア: コミック

ソリティ馬 オリジナルサウンドトラック

ソリティ馬 オリジナルサウンドトラック

  • アーティスト: 一之瀬剛
  • 出版社/メーカー: ゲームフリーク
  • メディア: CD

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:ゲーム

SUPER FAMICOM: THE BOX ART COLLECTION [本]

ひょんなことから、面白い洋書が発売されていることを知りオーダーしてみました。

SUPER FAMICOM: THE BOX ART COLLECTION(英BITMAP BOOKS刊)。その名の通り、スーファミソフト260タイトルのパッケージを、原寸大で収録した、ゴージャスなハードカバーの本です。

sfc_bac_cover.jpg
▲黒字に金箔押のタイトルが映える表紙。日本語で「スーパーファミコン。ボックスアートコレクション」の文字も入っておりますが、「・」と「。」を間違えちゃったんだろうなあ。

sfc_bac_1.jpg
▲私が音楽を担当させていただいた、「マリオのスーパーピクロス」もバッチリ紹介!

sfc_bac_2.jpg
▲不朽の名作RPG「MOTHER2」の対向ページには、味の素マヨネーズ製「もと子ちゃんのワンダーキッチン」(非売品)という、これまたレアなソフトが掲載されております。

どういう基準で260種類をセレクトしたのかがよくわかりませんが、私がプレイしたことのないようなマニアックなタイトルが多数収録されておりました。

筆者はSuperFamicomGuyという人物(twitterアカウント @SuperFamicomGuy)。過日、都内某所で偶然この方にお目にかかり、本書の存在を知ったのでした。

出版不況の影響で、日本ではこの手のマニア向けの本を作ってくれるチャレンジ精神旺盛な出版社は皆無。気になる方は、英国からお取り寄せするのが吉です。

惜しいのは、「MARIO PAINT」の日本語タイトルが「マリオとワリオ」になっているなど、日本語回りのミスがほどほどにある点。言ってくれれば校正したのにな~。(^_^)


Super Famicom: The Box Art Collection

Super Famicom: The Box Art Collection

  • 作者: Bitmap Books
  • 出版社/メーカー: Bitmap Books
  • 発売日: 2016/05/01
  • メディア: ハードカバー



nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:ゲーム

『ポケモン 赤・緑 スーパーミュージック・コレクション』発売! [雑記]

本日、CD『ポケモン 赤・緑 スーパーミュージック・コレクション』(オーバーラップ OVCP-0006)が発売されました。


【早期購入特典あり】ポケモン 赤・緑 スーパーミュージック・コレクション(オリジナルステッカー付)

【早期購入特典あり】ポケモン 赤・緑 スーパーミュージック・コレクション(オリジナルステッカー付)

  • アーティスト:
  • 出版社/メーカー: オーバーラップ
  • 発売日: 2016/04/27
  • メディア: CD


『ポケモン 赤・緑』のゲーム音源とポケモンの鳴き声、『ポケモン ファイアレッド・リーフグリーン』のゲーム音源に加え、ボーナストラックとして増田順一さんによるオリジナル楽曲『ポケモンテクノ』などが収録された、4枚組のゲームサウンドトラックアルバムです。

で、本CDのハイライトのひとつは、ブックレットに掲載されている「増田順一氏 ロングインタビュー 『ポケモン音楽と鳴き声の創造』」。

ゲームフリーク本社で行われた2時間に及ぶロングインタビューを、私が担当させていただいております。

誌面に限りのあるブックレットでは、「時代の変化によるポケモン音楽の変遷」や「鳴き声の制作秘話」を中心に、インタビューの一部を掲載しています。

そしてさらに! CDを購入してくださったすべての方は、特設サイトに掲載されている「ロングインタビュー完全版」を読むことができますぞ!

「完全版」では、「増田さんの子供時代からの音楽遍歴」「『ポケモン 赤・緑』開発時の音楽制作環境」など、よりマニアックな話題を深く掘り下げております。

CDブックレットの奥付に書かれているアクセス方法を読んで、「完全版」をぜひごらんくださいませね。奥付の情報は、うっかりすると見落としがちですからね。:-)

Amiga_Signboard.jpg
▲ブックレット掲載の増田さんの写真撮影は、「ポケモン 赤・緑」開発時のゲームフリーク所在地である下北沢で行われました。そこで偶然、懐かしい看板を発見! ロングインタビュー完全版の話題にもつながる看板です。:-)

ポケットラジオ「RAD-F127N」を購入 [家電]

5~6年ぶりに、ラジオを買い増してみました。

今回購入するラジオに求めた条件は、次の4点です。

・安い
・バッグに放り込んで常時携帯できるサイズ
・ワイドFM(FM補完放送)に対応している
・連続使用可能時間が長い


これらの条件を満たした機種のひとつが、AudioCommのAM/FMポケットラジオ RAD-F127N。

・寸法 幅55mm×高さ91mm×厚さ20mm
・重さ 約66g(電池含まず)/約88g(単4電池2本含む)
・連続使用可能時間 AM受信時 約140時間/FM受信時 約130時間(イヤホン使用時)


と、ほぼほぼ理想的なスペックでありながら、ジョーシン電機で税込950円で購入することができました。


OHM AudioComm AM/FMポケットラジオ ダークグレー RAD-F127N-H

OHM AudioComm AM/FMポケットラジオ ダークグレー RAD-F127N-H

  • 出版社/メーカー: オーム電機
  • メディア: エレクトロニクス



OHM AudioComm AM/FMポケットラジオ ピンク RAD-F127N-P

OHM AudioComm AM/FMポケットラジオ ピンク RAD-F127N-P

  • 出版社/メーカー: オーム電機
  • メディア: エレクトロニクス



拙宅(練馬区の木造住宅)で使用したところ、AMは、NHK、TBS、文化放送が強力に入感。ニッポン放送、RFラジオ日本はノイズ混じりながら入感します。

FM受信時は内蔵ロッドアンテナを伸ばすか、(アンテナ代わりとなる)付属イヤホンの接続が必須。

TOKYO-FM、J-WAVE、InterFM、NHK-FM、TBS(FM補完)、文化放送(FM補完)、ニッポン放送(FM補完)は強力に受信でき、比較的ラクにチューニングできました。

その他のFM局の選局には、慣れと辛抱強さが必要かも……。

東京のようなFM局過密地域では、選局ダイヤルを少し回しただけで、さまざまな局が入ってくるため、ダイヤル操作に慎重さが求められます。

価格を考えるとコストパフォーマンスの高いラジオといえますが、「ステレオイヤホン使用時の音声出力が、左右逆位相」という、とても残念なウィークポイントがあるのでした。

ラジオそのものがモノラル仕様のため、ステレオイヤホンを接続すると「モノラル音が左右逆位相」で出力されます。

ステレオイヤホンでしばらく聴いていると、定位の定まらない音像が脳内を浮遊して、気持ち悪くなってきます。X-)

さらに、このヘンテコな左右逆位相仕様のせいで、ステレオミニジャック付きモノラルイヤホン(左右の音を混合して片耳で聴くためのイヤホン)を使うと、左右の音が互いを打ち消し合い、音がまったく聞こえません。

まあ、付属イヤホンを使うぶんには問題にならないんですけれどもね。






ウォーターサーバーはいりません [雑記]

スマホに03-6327-5387という見慣れない番号から着信。 出てみると……

「So-netをご利用いただいているので、無料でウォーターサーバーを設置できます」やら「富士山のパナジウム天然水代だけ、費用負担していただければ構いません」

とおっしゃる。

でもね、そのお水がお高いんでしょ? 拙者はディスカウントストアの安売り天然水で十分だし、なんなら水道水をガブガブ飲んじゃう人なのです。ウォーターサーバーとか必要ないんですよ、わかってくださいよ。と丁重にお断りしました。

迷惑電話ストップサービスに、上記番号を登録しておきます。



サントリー 天然水(南アルプス)

サントリー 天然水(南アルプス)

  • 出版社/メーカー: サントリー
  • メディア: 食品&飲料



まるごとシールブックDX「バッジとれ~るセンター デコレーションシールブック」発売のお知らせ [雑記]

拙者が企画・構成したシールブック「バッジとれ~るセンター デコレーションシールブック」(600円+税・小学館)が明日、3月30日に発売となります!


バッジとれ~るセンター デコレーションシールブック (まるごとシールブックDX)

バッジとれ~るセンター デコレーションシールブック (まるごとシールブックDX)

  • 作者: 任天堂
  • 出版社/メーカー: 小学館
  • 発売日: 2016/03/30
  • メディア: 文庫



本書はニンテンドー3DSダウンロードソフト「バッジとれ~るセンター」でゲットできるバッジをシールブック化したもので、全16シート301枚の任天堂キャラクターシールが収録されております。

内容は以下のとおり。こちらのサイトで試し読みすることもできます……というか、全ページ大公開中! ですなww。

・「マリオ と なかまたち」シール(1)
・「マリオ と なかまたち」シール(2)
・「マリオカート8」カートシール
・「マリオカート8」バイクシール
・「スーパーマリオブラザーズ」季節のマリオシール
・「とびだせ どうぶつの森」フェイスシール(1)
・「とびだせ どうぶつの森」フェイスシール(2)
・「とびだせ どうぶつの森」しずえのコーデシール
・「ゼルダの伝説 風のタクト HD」シール(1)
・「ゼルダの伝説 風のタクト HD」シール(2)
・「スプラトゥーン」シール(1)
・「スプラトゥーン」シール(2)
・「ニッキー コレクション「シール(1)
・「ニッキー コレクション」シール(2)
・「だるめしスポーツ店」シール
・「バッジとれ~るセンター」お得意様バッジシール



btc_cover.jpg
▲まるごとシールブックDX「バッジとれ~るセンター デコレーションシールブック」表紙。

btc_box_f.jpg
▲一部書店では、このようなポップアップケースでディスプレイされています。「一箱まとめて全部くれや!」的な交渉をすると、箱ごと売ってもらえるかもしれませんが保証はしません。

btc_box_l.jpg
▲ポップアップケース左側面には、「とびだせ どうぶつの森」のしずえさんがびっしり! このシールブックでしか見られないしずえのコーデが、多数収録されております。

btc_box_r.jpg
▲ポップアップケース右側面には、ニッキーねえさんと、パンダくん&ネコくんが勢ぞろい。なんと、ニッキーねえさんのキュートでワンダホーなビキニ姿も拝めます!
[コピーライト]Nintendo


厳選に厳選を重ねたシール(バッジ)を極限まで隙間なく詰め込んでおりますが、実は、誌面の制約上泣く泣く掲載を見送ったシール(バッジ)が、まだまだ大量にございます。

(「バッジとれ~るセンター」プレイヤーならご存知であろう)「ドット絵シリーズ」は殊に秀逸で、絵師の匠の技が光る作品群……なのですが、今回は断腸の思いで掲載を断念。

第一弾が好調なら続編制作の道も開けますので、みなさま、よしなにお願いいたします。


ワンチャンアルデー無事終了 [雑記]

昨日、南青山FutureSEVENで行われた「ゲーム音楽親睦会 ワンチャンアルデー!」は大変な盛況でありました。

演者の方々の興味深いトークと、素晴らしい演奏(奇抜な演奏も含む)にも感動!

大石由梨香さんのピアノと歌、あだっちさんのルーパー芸(ピアノ生演奏を幾重にもオーバーダブしてひとり連弾)、ikeさん×ヒトミchの新ユニット「ワンチャンアルデー」によるピアノ・リコーダーアンサンブル、沖政一志さんの箏演奏、どれもあっぱれでした。というか、楽器演奏できる人を心底羨ましく思いましたわ~。

拙者はといえば、(拙者のトークを聴くために)はるばる京都からお越しいただい方や、濱文様の文鳥手ぬぐいをプレゼントしてくださった方もいて、お心遣いが有り難いやら申し訳ないやら……。十分ご満足いただけたかどうか、はなはだ心配ではあります。

といったわけで、本来ならここで会場のようすでも公開すべきなんでしょうが、あろうことか写真を取るのをすっかり忘れておりました。かたじけない!

また機会があれば、今回お話できなかった小ネタをご披露しますね~。






3月19日の「ワンチャンアルデー」に登壇します [雑記]

不肖わたくし、3月19日(土)に開催される「ゲーム音楽親睦会 ワンチャンアルデー!」に登壇いたします。

以下、告知サイトからの転載です。

ゲーム音楽の演奏会が終わった後、ほとんど同じメンバーで二次会。
よく見る光景ですね。

むしろ二次会がメインと言っている人すらいます。

…でもそれなら、最初から飲み会で、酒のツマミに演奏やトークがついてくるイベントがあっても良くね?

ゲーム音楽が好きで、飲み会はもっと好き。そんなあなたの願いを叶えるイベント、それが「ゲーム音楽親睦会 ワンチャンアルデー!」です。

●そんなわけで、これは「いきなり二次会みたいなもの」です。
軽い気持ちでお越しください!


日時: 2016年3月19日(土) 18:00開場 18:30開始 21:30終了
場所: 南青山FutureSEVEN
参加費: 4,000円
・FutureSEVEN専属シェフによる、ブッフェ形式の美味しいお食事付き
・1ドリンク付き(追加ドリンクは、バーカウンターで1杯500円を頂きます。)

拙者はゲスト5名のうちのひとりであり、持ち時間は10分程度であります。

トゥーシャイボーイでおなじみの拙者であるにもかかわらず、ikeさんからのお誘いをなぜ受諾してしまったのか? それは、うっかりしていたから! ……というわけで、今さら仮病で休むわけにもいかないので、パワポでスライドをちまちま作っていたりします。

今後、いつ同様のお誘いがあるか、それをうっかり引き受けるかは未定につき、興味がある方はぜひお越しください。

詳細は主催者ikeさんのblog「ピアノであそぼ日記」をご覧ください。



新迷解 ポケモンおもしろことわざ

新迷解 ポケモンおもしろことわざ

  • 作者: げゑせんうえの
  • 出版社/メーカー: 小学館
  • 発売日: 2006/11
  • メディア: 単行本



新迷解 もっと!ポケモンおもしろことわざ

新迷解 もっと!ポケモンおもしろことわざ

  • 作者: げゑせん うえの
  • 出版社/メーカー: 小学館
  • 発売日: 2011/12/08
  • メディア: 単行本



Arduino EEPROMの初期値 [Arduino]

サインスマートのLeonardo互換ボードでEEPROMを使ってみようと思ったのですが、そもそも初期値はどーなってるの? というわけで、メモリダンプしてみました。

以下、EEPROMメモリダンプスケッチ。

※初出時、最終アドレスが0x1ffとなっていたため、0x3ffに修正しました。(2016/1/16)

[ dumpEEPROM.ino ]
/*
 *  Arduino EEPROM Dump
 *  Written by Toshiyuki UENO MMXVI
 */
#include  <EEPROM.h>

void dumpEEPROM(unsigned int start_adrs, unsigned int end_adrs){
  unsigned int i, a;
  char s[4];

  if(start_adrs >= 1024 || end_adrs >= 1024 || start_adrs > end_adrs){
    return; // error
  }
  a = int(start_adrs / 16);
  Serial.print("      +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F");
  for(i = a; i <= end_adrs; i++){
    if((i % 16) == 0){
      sprintf(s, "\n%04X:", i);
      Serial.print(s);
    }
    if(i >= start_adrs){
      sprintf(s, " %02X", EEPROM.read(i));
      Serial.print(s);
    } else {
      Serial.print("   ");
    }
  }
  Serial.println("");
}

void setup() {
  Serial.begin(9600);
  while(!Serial);       // シリアルポートオープン待ち
  dumpEEPROM(0, 1023);
}

void loop() {
}

実行結果は次のとおり。

      +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
0000: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0020: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0030: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0040: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0050: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0060: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0070: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0080: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0090: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00C0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00D0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00E0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0100: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0110: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0120: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0130: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0140: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0150: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0160: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0170: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0180: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0190: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
01A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
01B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
01C0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
01D0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
01E0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
01F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0200: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0210: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0220: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0230: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0240: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0250: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0260: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0270: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0280: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0290: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
02A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
02B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
02C0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
02D0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
02E0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
02F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0300: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0310: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0320: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0330: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0340: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0350: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0360: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0370: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0380: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0390: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
03A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
03B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
03C0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
03D0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
03E0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
03F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

すべて0xffでした。EEPROM使用前にゼロクリアしたほうがよさげですな。


Arduinoをはじめようキット

Arduinoをはじめようキット

  • 出版社/メーカー: スイッチサイエンス
  • メディア: おもちゃ&ホビー



Arduinoをはじめよう 第3版 (Make:PROJECTS)

Arduinoをはじめよう 第3版 (Make:PROJECTS)

  • 作者: Massimo Banzi
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2015/11/28
  • メディア: 単行本(ソフトカバー)



Arduino Leonardoで\記号を打つ [Arduino]

Arduino LeonardoでUSBキーボードエミュレーションを行う場合、IDE付属のKeyboardライブラリを使うと記号が化けたり、「\」「|」「半角/全角キー」などの打てない文字・キーがあったりします。

Keyboardライブラリは101キーボードをエミュレートするため、106/109キーボードにしかない文字やキーを打てず、キーバインドの異なる記号は化けてしまうのです。

そこで、Keyboard.h/Keyboard.cppを改変し、日本語106/109キーボード対応版を作成してみました。(Arduino IDE 1.6.7で動作確認済)

ユーザーフォルダ\Documents\Arduino\libraries\Keyboard_jp フォルダを作成して、そのフォルダ内に下のKeyboard_jp.h、Keyboard_jp.cppを保存すると利用できます。


以下の関数の使用方法は、IDE付属Keyboardライブラリと同じです。「Arduinoリファレンス・キーボードライブラリ」を参照してください。また、Keyboar_jpで使用できる修飾キーは、Keyboard_jp.hを参照してください。

vold begin(void)
void end(void)
size_t write(uint8_t k)
size_t press(uint8_t k)
size_t release(uint8_t k)
void releaseAll(void)


Keyboard_jpで追加された関数は以下の3つです。動作はKeyboard.write、Keyboard.press、Keyboard.releaseと同じですが、引数が(キーコードではなく)UsageIndexであることに注意してください。UsageIndexの詳細は、「Keyboard Scan Code Specification」(Microsoft Word形式)を参照してください。

size_t writeRaw(uint8_t k)
size_t pressRaw(uint8_t k)
size_t releaseRaw(uint8_t k)


[ Keyboard_jp.h ]
/*
  Keyboard_jp.h

  Copyright (c) 2015, Arduino LLC
  Original code (pre-library): Copyright (c) 2011, Peter Barrett
  Modified for Japanese 106/109 Keyboard by Toshiyuki UENO MMXVI

  This library is free software; you can redistribute it y it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#ifndef KEYBOARD_h
#define KEYBOARD_h

#include "HID.h"

#if !defined(_USING_HID)

#warning "Using legacy HID core (non pluggable)"

#else

//================================================================================
//================================================================================
//  Keyboard

#define KEY_RETURN        0x80  // 0x28
#define KEY_ESC           0x81  // 0x29
#define KEY_BACKSPACE     0x82  // 0x2a
#define KEY_TAB           0x83  // 0x2b

#define KEY_KANJI         0x8d  // 0x35 Hankaku/Zenkaku | Kanji

#define KEY_CAPS_LOCK     0x91  // 0x39
#define KEY_F1            0x92  // 0x3a
#define KEY_F2            0x93  // 0x3b
#define KEY_F3            0x94  // 0x3c
#define KEY_F4            0x95  // 0x3d
#define KEY_F5            0x96  // 0x3e
#define KEY_F6            0x97  // 0x3f
#define KEY_F7            0x98  // 0x40
#define KEY_F8            0x99  // 0x41
#define KEY_F9            0x9a  // 0x42
#define KEY_F10           0x9b  // 0x43
#define KEY_F11           0x9c  // 0x44
#define KEY_F12           0x9d  // 0x45
#define KEY_PRINT_SCREEN  0x9e  // 0x46
#define KEY_SCROLL_LOCK   0x9f  // 0x47
#define KEY_PAUSE         0xa0  // 0x48
#define KEY_INSERT        0xa1  // 0x49
#define KEY_HOME          0xa2  // 0x4a
#define KEY_PAGE_UP       0xa3  // 0x4b
#define KEY_DELETE        0xa4  // 0x4c
#define KEY_END           0xa5  // 0x4d
#define KEY_PAGE_DOWN     0xa6  // 0x4e
#define KEY_RIGHT_ARROW   0xa7  // 0x4f
#define KEY_LEFT_ARROW    0xa8  // 0x50
#define KEY_DOWN_ARROW    0xa9  // 0x51
#define KEY_UP_ARROW      0xaa  // 0x52

#define KEY_KANA          0xe0  // 0x88 Katakana/Hiragana
#define KEY_HENKAN        0xe2  // 0x8a
#define KEY_MUHENKAN      0xe3  // 0x8b

#define KEY_LEFT_CTRL     0xf8  // 0xe0
#define KEY_LEFT_SHIFT    0xf9  // 0xe1
#define KEY_LEFT_ALT      0xfa  // 0xe2
#define KEY_LEFT_GUI      0xfb  // 0xe3
#define KEY_RIGHT_CTRL    0xfc  // 0xe4
#define KEY_RIGHT_SHIFT   0xfd  // 0xe5
#define KEY_RIGHT_ALT     0xfe  // 0xe6
#define KEY_RIGHT_GUI     0xff  // 0xe7

//  Low level key report: up to 6 keys and shift, ctrl etc at once
typedef struct
{
  uint8_t modifiers;
  uint8_t reserved;
  uint8_t keys[6];
} KeyReport;

class Keyboard_ : public Print
{
private:
  KeyReport _keyReport;
  void sendReport(KeyReport* keys);
public:
  Keyboard_(void);
  void begin(void);
  void end(void);
  size_t write(uint8_t k);
  size_t press(uint8_t k);
  size_t release(uint8_t k);
  void releaseAll(void);
  size_t writeRaw(uint8_t k);
  size_t pressRaw(uint8_t k);
  size_t releaseRaw(uint8_t k);
};
extern Keyboard_ Keyboard;

#endif
#endif


[ Keyboard_jp.cpp ]
/*
  Keyboard_jp.cpp

  Copyright (c) 2015, Arduino LLC
  Original code (pre-library): Copyright (c) 2011, Peter Barrett
  Modified for Japanese 106/109 Keyboard by Toshiyuki UENO MMXVI
  
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#include "Keyboard_jp.h"

#if defined(_USING_HID)

//================================================================================
//================================================================================
//  Keyboard

static const uint8_t _hidReportDescriptor[] PROGMEM = {

  //  Keyboard
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)  // 47
    0x09, 0x06,                    // USAGE (Keyboard)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x85, 0x02,                    //   REPORT_ID (2)
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
   
  0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)
    0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    
  0x95, 0x08,                    //   REPORT_COUNT (8)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)
    
  0x95, 0x06,                    //   REPORT_COUNT (6)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0xfe,                    //   LOGICAL_MAXIMUM (101)  *** modified 0x65 to 0xfe
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
    
  0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))
    0x29, 0xfe,                    //   USAGE_MAXIMUM (Keyboard Application)  *** modified 0x65 to 0xfe
    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
    0xc0,                          // END_COLLECTION
};

Keyboard_::Keyboard_(void) 
{
  static HIDSubDescriptor node(_hidReportDescriptor, sizeof(_hidReportDescriptor));
  HID().AppendDescriptor(&node);
}

void Keyboard_::begin(void)
{
}

void Keyboard_::end(void)
{
}

void Keyboard_::sendReport(KeyReport* keys)
{
  HID().SendReport(2,keys,sizeof(KeyReport));
}

extern
const uint16_t _asciimap[128] PROGMEM;

#define SHIFT 0x8000

const uint16_t _asciimap[128] =
{
  0x00,        // NUL
  0x00,        // SOH
  0x00,        // STX
  0x00,        // ETX
  0x00,        // EOT
  0x00,        // ENQ
  0x00,        // ACK
  0x00,        // BEL
  0x2a,        // BS   Backspace
  0x2b,        // TAB  Tab
  0x28,        // LF   Enter
  0x00,        // VT
  0x00,        // FF
  0x00,        // CR
  0x00,        // SO
  0x00,        // SI
  0x00,        // DEL
  0x00,        // DC1
  0x00,        // DC2
  0x00,        // DC3
  0x00,        // DC4
  0x00,        // NAK
  0x00,        // SYN
  0x00,        // ETB
  0x00,        // CAN
  0x00,        // EM
  0x00,        // SUB
  0x00,        // ESC
  0x00,        // FS
  0x00,        // GS
  0x00,        // RS
  0x00,        // US
 
  0x2c,        // " "
  0x1e|SHIFT,  // !
  0x1f|SHIFT,  // "
  0x20|SHIFT,  // #
  0x21|SHIFT,  // $
  0x22|SHIFT,  // %
  0x23|SHIFT,  // &
  0x24|SHIFT,  // '
  0x25|SHIFT,  // (
  0x26|SHIFT,  // )
  0x34|SHIFT,  // *
  0x33|SHIFT,  // +
  0x36,        // ,
  0x2d,        // -
  0x37,        // .
  0x38,        // /
  0x27,        // 0
  0x1e,        // 1
  0x1f,        // 2
  0x20,        // 3
  0x21,        // 4
  0x22,        // 5
  0x23,        // 6
  0x24,        // 7
  0x25,        // 8
  0x26,        // 9
  0x34,        // :
  0x33,        // ;
  0x36|SHIFT,  // <
  0x2d|SHIFT,  // =
  0x37|SHIFT,  // >
  0x38|SHIFT,  // ?
  0x2f,        // @
  0x04|SHIFT,  // A
  0x05|SHIFT,  // B
  0x06|SHIFT,  // C
  0x07|SHIFT,  // D
  0x08|SHIFT,  // E
  0x09|SHIFT,  // F
  0x0a|SHIFT,  // G
  0x0b|SHIFT,  // H
  0x0c|SHIFT,  // I
  0x0d|SHIFT,  // J
  0x0e|SHIFT,  // K
  0x0f|SHIFT,  // L
  0x10|SHIFT,  // M
  0x11|SHIFT,  // N
  0x12|SHIFT,  // O
  0x13|SHIFT,  // P
  0x14|SHIFT,  // Q
  0x15|SHIFT,  // R
  0x16|SHIFT,  // S
  0x17|SHIFT,  // T
  0x18|SHIFT,  // U
  0x19|SHIFT,  // V
  0x1a|SHIFT,  // W
  0x1b|SHIFT,  // X
  0x1c|SHIFT,  // Y
  0x1d|SHIFT,  // Z
  0x30,        // [
  0x89,        // Yen(Backslash)
  0x31,        // ]
  0x2e,        // ^
  0x87|SHIFT,  // _
  0x2f|SHIFT,  // @
  0x04,        // a
  0x05,        // b
  0x06,        // c
  0x07,        // d
  0x08,        // e
  0x09,        // f
  0x0a,        // g
  0x0b,        // h
  0x0c,        // i
  0x0d,        // j
  0x0e,        // k
  0x0f,        // l
  0x10,        // m
  0x11,        // n
  0x12,        // o
  0x13,        // p
  0x14,        // q
  0x15,        // r
  0x16,        // s
  0x17,        // t
  0x18,        // u
  0x19,        // v
  0x1a,        // w
  0x1b,        // x
  0x1c,        // y
  0x1d,        // z
  0x30|SHIFT,  // {
  0x89|SHIFT,  // |
  0x31|SHIFT,  // }
  0x2e|SHIFT,  // ~
  0            // DEL
};


uint8_t USBPutChar(uint8_t c);

// press() adds the specified key (printing, non-printing, or modifier)
// to the persistent key report and sends the report.  Because of the way 
// USB HID works, the host acts like the key remains pressed until we 
// call release(), releaseAll(), or otherwise clear the report and resend.
size_t Keyboard_::press(uint8_t k) 
{
  uint8_t i;
  uint16_t c;

  if (k >= 0xf8) {          // it's a modifier key
    _keyReport.modifiers |= (1 << (k-0xf8));
    k = 0;
  } else if (k >= 0x80){    // it's a non-printing key and KANJI key
    k -= 0x58;
  } else {                  // it's a printing key
    c = pgm_read_word(_asciimap + k);
    k = uint8_t(c) & 0xff;
    if (!c) {
      setWriteError();
      return 0;
    }
    if (c & SHIFT) {
      _keyReport.modifiers |= 0x02;
    }
  }

  // Add k to the key report only if it's not already present
  // and if there is an empty slot.
  if (_keyReport.keys[0] != k && _keyReport.keys[1] != k && 
    _keyReport.keys[2] != k && _keyReport.keys[3] != k &&
    _keyReport.keys[4] != k && _keyReport.keys[5] != k) {
    
    for (i=0; i<6; i++) {
      if (_keyReport.keys[i] == 0x00) {
        _keyReport.keys[i] = k;
        break;
      }
    }
    if (i == 6) {
      setWriteError();
      return 0;
    }  
  }
  sendReport(&_keyReport);
  return 1;
}

// release() takes the specified key out of the persistent key report and
// sends the report.  This tells the OS the key is no longer pressed and that
// it shouldn't be repeated any more.
size_t Keyboard_::release(uint8_t k) 
{
  uint8_t i;
  uint16_t c;

  if (k >= 0xf8) {          // it's a modifier key
    _keyReport.modifiers &= ~(1<<(k-0xf8));
    k = 0;
  } else if (k >= 0x80) {   // it's a non-printing key and KANJI key
    k -= 0x58;
  } else {                  // it's printing key
    c = pgm_read_word(_asciimap + k);
    k = uint8_t(c) & 0xff;
    if (!k) {
      return 0;
    }
    if (c & SHIFT) {
      _keyReport.modifiers &= ~(0x02);
    }
  }

  // Test the key report to see if k is present.  Clear it if it exists.
  // Check all positions in case the key is present more than once (which it shouldn't be)
  for (i=0; i<6; i++) {
    if (0 != k && _keyReport.keys[i] == k) {
      _keyReport.keys[i] = 0x00;
    }
  }

  sendReport(&_keyReport);
  return 1;
}

void Keyboard_::releaseAll(void)
{
  _keyReport.keys[0] = 0;
  _keyReport.keys[1] = 0;
  _keyReport.keys[2] = 0;
  _keyReport.keys[3] = 0;
  _keyReport.keys[4] = 0;
  _keyReport.keys[5] = 0;
  _keyReport.modifiers = 0;
  sendReport(&_keyReport);
}

size_t Keyboard_::write(uint8_t c)
{  
  uint8_t p = press(c);  // Keydown
  release(c);            // Keyup
  return p;              // just return the result of press() since release() almost always returns 1
}

size_t Keyboard_::pressRaw(uint8_t k) {
  uint8_t  i;
  
  if(!k){
    return 0;
  }

  // Add k to the key report only if it's not already present
  // and if there is an empty slot.
  if (_keyReport.keys[0] != k && _keyReport.keys[1] != k && 
    _keyReport.keys[2] != k && _keyReport.keys[3] != k &&
    _keyReport.keys[4] != k && _keyReport.keys[5] != k) {
    
    for (i=0; i<6; i++) {
      if (_keyReport.keys[i] == 0x00) {
        _keyReport.keys[i] = k;
        break;
      }
    }
    if (i == 6) {
      // setWriteError();
      return 0;
    }  
  }
  sendReport(&_keyReport);
  return 1;
}

size_t Keyboard_::releaseRaw(uint8_t k) {
  uint8_t i;
  if (!k) {
    return 0;
  }

  // Test the key report to see if k is present.  Clear it if it exists.
  // Check all positions in case the key is present more than once (which it shouldn't be)
  for (i=0; i<6; i++) {
    if (0 != k && _keyReport.keys[i] == k) {
      _keyReport.keys[i] = 0x00;
    }
  }

  sendReport(&_keyReport);
  return 1;
}

size_t Keyboard_::writeRaw(uint8_t c)
{  
  uint8_t p = pressRaw(c);  // Keydown
  releaseRaw(c);            // Keyup
  return p;                 // just return the result of press() since release() almost always returns 1
}

Keyboard_ Keyboard;

#endif

以下は、サンプルスケッチ(Keyboar_jp使用例)です。Digital Pin 2-GND間、Digital Pin 4-GND間に接続したタクトスイッチを押下すると、円記号を含む文字列を出力します。Pin 2ボタン押下時はKeyboard.write、Keyboard.printを使用して出力、Pin4ボタン押下時はKeyboard.writeRawを使用して出力しています。

[ Keyboard_jp_test ]
/*
 * Keyboard_jp サンプルスケッチ
 * Written by Toshiyuki UENO
 */

#include  "Keyboard_jp.h"

// define Button Pin Number
// Button[0] = 2, Button[1] = 4
const int BUTTON[] = { 2, 4 };

void setup() {
  int i;
  for( i = 0; i <= 1; i++ ){
    pinMode(BUTTON[i], INPUT_PULLUP);
  }
  Keyboard.begin();
  delay(1000);  // wait for initialization
}

void loop() {
  int i;
  for( i = 0; i <= 1; i++ ){
    if( !digitalRead(BUTTON[i]) ){
      if( i == 0 ){                       // if press button[0]                 
        Keyboard.write('a');
        Keyboard.write('A');
        Keyboard.write('_');
        Keyboard.write('\\');
        Keyboard.write(KEY_RETURN);
        delay(100);
        Keyboard.print("aA_\\");
        Keyboard.write(KEY_RETURN);
      } else if( i == 1 ){                // if press button[1]
        Keyboard.writeRaw(0x04);   // 'a'
        Keyboard.pressRaw(0xe1);   // press LeftShift
        Keyboard.writeRaw(0x04);   // 'A'
        Keyboard.writeRaw(0x87);   // '_'
        Keyboard.releaseRaw(0xe1); // release LeftShift
        Keyboard.writeRaw(0x89);   // '\'
        Keyboard.writeRaw(0x28);   // Return(ENTER)
      }
      delay(100);                         // button debounce
      while( !digitalRead(BUTTON[i]) ){}; // wait button release
      delay(100);                         // button debounce
    }
  }
}

【謝辞】
Keyboard_jpライブラリの作成にあたり、「まごころ誠実堂~Arduinoで任意のUSBコードを送る 解決編」を参考にさせていただきました。



Arduino Leonardo (ソケット・ヘッダ付き)

Arduino Leonardo (ソケット・ヘッダ付き)

  • 出版社/メーカー: Arduino
  • メディア: 付属品



サインスマート(SainSmart) レオナルド 互換 Leonardo R3 ケーブル付 ブラック

サインスマート(SainSmart) レオナルド 互換 Leonardo R3 ケーブル付 ブラック

  • 出版社/メーカー: サインスマート(SainSmart)
  • メディア: おもちゃ&ホビー