キノコの自省録

テクノロジーとコンテンツの融合を目指して

RaspberryPiでGPIO(I2S)を使ってマイクから録音する

RaspberryPiで録音方法について調べると、大抵USBマイクの紹介記事が見つかります。USBマイクは楽ですが、USB-Aが必要なのでRaspberryPi Zeroの場合はmicroB→HostA変換する必要がありますし、そもそも場所を取るので取り付けに困ったりします。特に、小型化したいとか、基板上に配置したいといった場合に苦労します。

ということで、GPIOで録音する方法を紹介。

方法

RaspberryPiはA-Dコンバータを積んでいないので、デジタル信号を入力する必要があります。音声信号のデジタル入出力は、I2S、PDM、TDMなどがあります。I2Sが一番メジャーで、RaspberryPiもI2Sをサポートしています。

そんなわけで、I2SでRaspberryPiに入力して録音する方法を模索します。

マイクの調達

まずはI2SでRaspberryPiにマイク音声を入力するって、どんな部品を調達すればいいいんでしょう?というところから。”I2S RaspberryPi”とかで検索すると、お値段の高いハイレゾDACに関する記事が大量に見つかります。いや、そっちじゃないんです。DACじゃなくてADCが欲しいんです。

それはさておき、I2SをOutputにするADCは例えばこんなものがあります。

ADAU1977 データシートおよび製品情報 | アナログ・デバイセズ

このADAU1977は、RaspberryPiに標準でDeviceTreeにドライバが登録されています。ただ、チップ単体販売なので、基板を作らなければならないので非常に面倒くさいです。私も扱ったことがないので、たぶんできるよとしか言えません。

しかし、世の中には、I2S出力するデジタルマイクが存在したりします。便利な世の中になったものです。手に入りやすいところではADMP441, SPH0645LM4H, ICS-43432あたり。ADMP441なら秋月電子DIP化キットが売っているので、今回はこれを使います。1つ750円。

ADMP441 DIPモジュール: パーツ一般 秋月電子通商 電子部品 ネット通販

SPH0645LM4Hにもスイッチサイエンス製のモジュールキットがあります。こちらはAmazonでも購入可能。


SPH0645LM4H搭載 I2S MEMSマイクモジュール

ADMP44 DIP化キットはんだ付けの注意

マイクの開口部が実装面の裏にあるので、ピンヘッダの装着面に注意しましょう。この通り、ちゃんと説明書に書いてあります。が、私ははんだ付けしてから気づきました……。

f:id:kinokorori:20180224212215j:plain

ピン配置

ピンの配置は次の通りです。直接挿すだけなので、難しくないです。L/RはGNDの場合は左チャンネル、+Vの場合は右チャンネルになりますが、1つしかマイクがない場合はどのみちモノラルになります。

電源電圧は1.8V~3.3Vなので、3.3Vピンに接続しましょう。動作時の消費電流が1.4mAなので、余裕で給電可能です。

f:id:kinokorori:20180225014458p:plain

RaspberryPiの設定(ソフト)

上記の通り、I2SのGPIOピンは18,19,20(,21)を接続し、ALT0で利用します。ただし、ALT0でI2Sを有効にするだけでなく、デバイスドライバも必要です。しかし、RaspberryPiのデフォルトでは、I2Sマイクで利用可能なモジュールが存在しません。

ただ、カーネルソースにはモジュールがあるので、カーネルをビルドしてカーネルモジュールとくっつけて利用する説明が数多く存在します。

この辺とか。

GitHub - nejohnson2/rpi-i2s: Using the ICS43432 MEMS microphone on a Raspberry Pi with i2s

調べていると、Device-Treeを利用した、もっと簡単な方法を公開している人がいましたので、今回はそちらを紹介します。

GitHub - gtalusan/admp441-rpi: ADMP441 for the Raspberry Pi

手順は書いてありますが、少し補足説明を加えておきます。

kernelフォルダのビルド

git cloneして、kernelフォルダの中身をビルドします。

$ git clone https://github.com/gtalusan/admp441-rpi.git
$ cd admp441-rpi
$ cd kernel
$ make
$ make install

おそらく、make時に以下のようなエラーが出ると思います。

make -C /lib/modules/4.9.59+/build M=/home/pi/admp441-rpi/kernel modules
make[1]: *** /lib/modules/4.9.59+/build: No such file or directory.  Stop.
Makefile:4: recipe for target 'all' failed
make: *** [all] Error 2

このエラーが発生した場合、

$ sudo apt-get install raspberrypi-kernel-headers

を実行してみてください。それでも解決しない場合、おそらくraspberrypi-kernel-headersでインストールされるバージョンと、uname -rのバージョンがずれています。カーネルビルドを施したのであれば、ターゲットのbuildから、ビルドに用いたlinuxディレクトリへのシンボリックリンクを貼ってみてください。

Device Tree Overlay

Device-Treeに登録します。

$ cd ../dts
$ dtc -@ -I dts -O dtb -o i2s-soundcard.dtbo i2s-soundcard-overlay.dts
$ sudo cp i2s-soundcard.dtbo /boot/overlays

これはただ実行するだけです。dtc実行時にwarningが出ますが、特に問題はなさそうです。

Configuration

以上の全てが完了後、/etc/modulesの末尾にadmp441を追加し、/boot/config.txtに、dtoverlay=i2s-soundcard,alsaname=mems-micを追加します。

編集を終えたらリブートをかけます。これで完了です。

※ ADMP411専用っぽい感じがしますが、I2SのMEMSマイクなら、同じモジュールで動作する可能性が高いです。

録音

まずは、録音デバイスの確認。arecord -lを叩いてチェックしてみます。

$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: memsmic [mems-mic], device 0: bcm2835-i2s-admp441-hifi admp441-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

先ほど登録したmems-micがデバイスとして見えています。 では、早速録音してみます。

$ arecord -D plughw:1 -c1 -r 48000 -f S32_LE -t wav -V mono voice.wav
Recording WAVE 'voice.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Stereo

これでvoice.wavに音声が録音されます。録音できました、やったーと思いきや、めちゃくちゃゲインが低いです。再生してもなんだかほとんど聞こえません。

ゲイン調整

alsamixerやamixerでボリュームを調整できるよう、ALSAのPCMプラグインを登録します。ALSAのPCMプラグインは、ユーザ設定の場合は~/.asoundrcファイルに、システム全体に反映させる場合は/etc/asound.confに書き出します。今回は~/.asoundrcに書き出します。ファイル内容は以下の通りです。

pcm.dmic_hw {
    type hw
    card memsmic
    channels 2
    format S32_LE
}

pcm.dmic_sv {
    type softvol
    slave.pcm dmic_hw
    control {
        name "Boost Capture Volume"
        card memsmic
    }
    min_dB -3.0
    max_dB 30.0
}

上記内容は、基本的にここの情報を参照して、少し組み替えています。 https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout/raspberry-pi-wiring-and-test

※PCMプラグインのフォーマットについては、こちらを参照のこと。 ALSA project - the C library reference: PCM (digital audio) plugins

登録はしたものの、alsamixerを開いても項目が出てきません。しかし、一度以下のようにもう一度arecordを実行したところ、alsamixerやamixerで設定できるようになりました。

$ arecord -D plughw:1 -c1 -r 48000 -f S32_LE -t wav -V mono -v voice.wav

うーん、これは要調査ですね。とりあえず今回は、この問題は横に置いておきます。

$ alsamixer

でalsamixerを起動し、F6キーを押して、”mems-mic”を選択します。mems-micのボリューム設定に切り替わったら、F4キー、またはTABキーを押して、Captureの音量設定に切り替えます。

f:id:kinokorori:20180304015007p:plain

ボリュームを適当にあげて、再度録音してみましょう。今度はだいぶ録音音量が大きくなったはずです。

RaspberryPi ZeroでGPIOを使って音声出力をするお話(2)

以下の続編(解説編)です。音声出力というより、どちらかというとGPIOのAlternative Functionの話です。

kinokorori.hatenablog.com

そもそも一体何をしているのか

dtoverlayを使用した方法では、以下のような指定をして、PWMを有効にしました。

dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4

また、gpio_altを使用した方法では、最終的には、以下を実行して、PWMを有効にしました。

$ gpio_alt -p 13 -f 0
$ gpio_alt -p 18 -f 5

果たしてこれは何をしているのでしょう、というお話。

PWM(パルス幅変調)を用いて音声出力する機能が、RaspberryPiに備わっています。それを有効にしているだけといえばだけです。PWMにはPWM0とPWM1の2pinが必要で、それをgpio_altやdtoverlayを使って有効にしているというのが、解説先で紹介されている方法です。

上記例では、GPIO 13のファンクションを0(ALT0)、GPIO 18のファンクションを5(ALT5)にすることで、GPIO13をPWM1に、GPIO18をPWM0に設定しています。

ALTって何?

BCM2835(RaspberryPiのCPU)のGPIOピンには、切り替え可能な機能が最大6種類割り振られています。それがALT0やALT5と呼ばれるものです。raspi-configを使用して、I2CやSPIなどを有効にしたことがあると思いますが、それは、対応するピンをALT0に変更するということを裏で行っています。ALTを設定していない状態の場合、大抵はINです。単純に外部からHIGH/LOWを受け取るだけの単純な機能ということです。

ALT0がどういう機能なのか、ALT5がどういう機能なのかは、このページを参照するのが良いと思います。

RPi BCM2835 GPIOs - eLinux.org

この表の通り、GPIO13のALT0はPWM1、GPIO18のALT5はPWM0です。GPIO18をALT0(I2S)として使いたい場合、別のPWM0の機能を持つピンを探せばよいということです。GPIO12のALT0にPWM0がありますので、gpio_altの場合、

$ gpio_alt -p 13 -f 0
$ gpio_alt -p 12 -f 0

を実行して、GPIO18からGPIO12に配線しなおせば、ちゃんと音声の再生ができるようになります。

dtoverlayの場合は、

dtoverlay=pwm-2chan,pin=12,func=4,pin2=13,func2=4

となります。func=4がALT0です。紛らわしいので注意。うまく再生できない場合はgpio readallで確認しましょう。

Raspberry PiにNode.js + Expressをインストールする虎の巻

Node.js + Expressのインストール手順を紹介。半分は自分備忘録用。Raspberry Piとタイトルで書いてますが、基本的にどのLinux環境でもほとんど一緒です。自分の場合、AWS-Linuxでも同じ手順でやってます。

なお、gitがインストールされていることが前提。Raspbianならsudo apt-get install gitです。

$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ vim ~/.bash_profile
    #.bash_profileに以下を設定
    if [[ -s ~/.nvm/nvm.sh ]] ; then
            source ~/.nvm/nvm.sh
    fi
$ . ~/.bash_profile
$ nvm install --lts
$ nvm use --lts

ここでNode.jsが使用可能に。

$ node -v
v8.9.4

※バージョンはltsを指定しているので、インストールした日によって変わります。

最後にExpressの用意とプロジェクトテンプレートの展開。

$ npm install express-generator -g
$ express kinoko_project
$ cd kinoko_project
$ npm install

ここでExpressを使用したプロジェクトが使用可能に。

$ npm start

デフォルトポートは3000なので、localhost:3000にアクセスすれば、Webページが見れるはず。

続・Witch Criedをニコニコ闘会議2018に出展しました

続きです。

Witch Criedをニコニコ闘会議2018に出展しました - キノコの自省録

このゲーム、作ったはいいけど知名度が全く上がらず、かといって宣伝手段もないという状態だったので、 せめて多くの人の目に触れてくれれば、という思いで自作ゲームフェスに応募しました。

結果として、動画やゲーム自体の閲覧数が増え、さらに何人かのゲーム実況者の方に実況していただけたということで、思ったより多くの効果がありました。非常に感謝しています。 ようやく本当の意味でリリースが出来たと思っています。これでメイも報われました。

実況動画紹介。

www.nicovideo.jp

↑ めちゃくちゃイケボでFateの詠唱をしています。こういう動画、待ってました。

www.nicovideo.jp

↑ 色んな魔法詠唱をされていて、むしろ自分が参考になりました。

まだまだ、感想・実況お待ちしています。

このゲームへの想い

このゲームは、前々から書いていますが、「音声魔法インタフェースを世に広めること」を目的としています。 VRの時代に、30年前と変わらずポチポチ選択するしか魔法が撃てないって有り得ないでしょう。 そういう不満があって、このゲームを作りました。

世に広めることが主目的なので、人目に触れないというのは、個人的に最も不本意なことでした。

なんでこんなにボリューミーなのか

このゲーム、割ときっちりステージを組んでいて、そこそこボリューミーです。

正直、魔法を詠唱する楽しさだけ体験してもらうなら、ステージが2, 3あれば十分です。実際、オツムの弱い子達さんはチュートリアルから進んでません。 個人的にはその楽しみ方も全然OKで、そういう人の方がむしろ多いのでは?とさえ思っています。

じゃあなんでステージをカッチリ作ったのか、というと、音声魔法インタフェースが実際にゲームのインタフェースとして有用かどうかを示すためです。 面白いね、でもこれじゃ普通のゲームには使えないね、という評価を避けたかったということです。 詠唱時間と威力をトレードオフにして、選ぶという行為を詠唱することですり替えることで、それなりにゲームのインタフェースとしての優秀さは出せたのではないかと思います。

ただ、一方で、魔法を使うということの難しさと面倒くささが浮き彫りになっているという側面もあります。 その辺りは今後の課題というところでしょう。

ちなみに、選ぶ・放つという行為を無手で出来るため、コントローラーを激しく操作しながら魔法を発動するということが可能になります。 つまり魔法詠唱+アクションゲームということです。個人的にはこの組み合わせが一番親和性が高いと思っていて、本当はそっちを作りたかったんですが、スマホだと入力インタフェースに限界があるため、それは断念しました。 じゃあPCは?となると、PC用マイク持っている人がそもそも少数という問題があります。

※授賞懇親会でこの話をしたところ、PCゲーでもマイク使うゲームが滅茶苦茶人気を集めていたとか。ならPCゲームも有りかなと今は思ってます。

失敗

最も失敗だったのは、iOS専用になってしまったことです。Cocos2dをエンジンに採用したのはいいんですが、なんとなくぼんやり作り始めた時はバージョン2で、これがObjective-Cなんですね。 なので、他のプラットフォームに移植できなくなりました。 程なくしてCocos2d-xというC++のバージョンが出たのですが、移植するのが絶望的に面倒だったため、そのまま2d-2で開発継続してしまいました。

一部、魔法リストなどはUIKit系使っているため、そのままではAndroidに移植できないとか、手持ちのAndroid端末が古い機器しかないなどの都合もあります。

それでも、3, 4年くらい前にリリース出来たのであれば、iOS専用品であっても注目も集めたかもしれませんが、今はもうレッドオーシャンな上に、アプリが多すぎてニュースサイトも機能していないほどになっています。 そのため、発信力がないと、現状、「誰かが見つけてくれるのを待つ」という苦しい事態になっています。

ダラダラと長期間かけて開発してしまったことも影響しています。これは素直に実力不足です。長期間の開発になると、環境がどんどん変化するため、最新リリースで既に時代遅れになるということです。

ゲーム登録サイトは結構ありますが、iOS+Cocos2dだと、登録しようもないんですよね。割と手詰まりになりました。 そんなわけで、今回のニコニコ自作ゲームフェスはその辺りを救済して貰えたと思っています。感謝。

※アプリなら検索ワードが直刺さるので、結構見つけてくれます。ゲームは厳しいです。

ニコニコ自作ゲームフェスについて

個人的にはレギュレーション違反にならなかっただけでも感謝、作品が割と多くの人の目に触れただけで圧倒的に感謝です。 授賞イベントでクリエイターの人たちとお話しする機会もあって、なかなか勉強になりました。

一方で、昨年はツクールMV作品のみ受付で、今年は以前に戻ってどんな作品でも受付可能に変更したというレギュレーションの変更については、思うところがあります。

ツクールMV作品のみとした前回のレギュレーションは、明らかにドワンゴカドカワの傘下になった影響だと思います。 去年がどうだったのか知りませんが、レギュレーションを変えたということは、2016以前に比べて、2017はあまり盛り上がらなかったのでしょうか?まあ、常識的に考えれば、条件を滅茶苦茶絞って盛り上がるとはちょっと思えません。

ネットワークコミュニティが台頭して、オープン化戦略の有用性がはっきり認められている時代に、わざわざ間口を狭めて自社コンテンツのみを推奨するような決定は、正直言って緩慢な自殺行為に見えます。

ただ、今年は間口が広がりました。おかげで作品を登録することができました。しかし、協賛企業を見ると、以前よりだいぶ寂しくなったように見える、というより、ツクールMVやRPG作品を投稿してほしいように見えます。一方で、以前のような、特にそんなしがらみなく作品を集めたいという願いも感じられます。単純に、以前に戻せなかったのか、思惑が働いたのかはわかりません。

今回の間口を広げたという決定が良い方向であると、未来志向へシフトしてくれるという意思表示だということを願ってやみません。

※私は別にカドカワが嫌いなわけではありません。

Witch Criedをニコニコ闘会議2018に出展しました

Witch Criedが敢闘賞を受賞したため、ニコニコ闘会議の自作ゲームブースに出展してきました。

f:id:kinokorori:20180210154611j:plain

ニコニコ自作ゲームフェスは、コンテンツ(ストーリー、デザイン)やコンセプトに大きな比重を置いているようです。 なので、コンセプトはともかく、それを実現するエンジニアリングに重点を置いてる本作は、結構場違いだった感はあるのですが……。

とりあえず詳細はまた改めて記載します。

ちなみにマグカップを頂きました。

f:id:kinokorori:20180211004238j:plain:w350

デカマグカップですね。このマグカップ、どこかで見覚えが……。

f:id:kinokorori:20180211004334j:plain:w350

プリントマグの定番品なんでしょうかね。 プリントマグも面白そうと思ってしまった。

今回、こんな名刺も用意していきました。名刺大事。

f:id:kinokorori:20180211015009j:plain:w300

名刺は100枚500円~1200円程度で作れるので、絶対作った方が良いと思います。 私は今回ラクスルで作ってもらいました。

Witch Cried攻略手引き

ウィッチクライド AppLink

Witch Criedのプレイ実況動画をあげていただいたようです。 マサさん、ありがとうございます。

www.nicovideo.jp

めっちゃ笑って視聴させていただきました。いや、魔法使うって大変ですね。

このゲーム、自分が適当に難易度設定したこともありますが、結構むずいです。 ぶっちゃけ魔法がちゃんと発動するかどうかで、難易度がかなり変動します。

とりあえず、攻略のポイントをちょっと紹介しておきます。

ポイント1:パズルゲー

RPGとかSLGっぽく見えますが、パズルゲーが一番近いです。パズルです。

ポイント2:敵の属性に合わせて魔法を発動しよう

これはゲームの基本ですが、このゲームも基本的に相手に弱点属性を設定してあります。 大体は見ればわかると思います。爬虫類系はわかりにくいですかね。弱点は冷気です。

逆に、雪だるまに氷魔法を撃つなど、敵の属性と同属性の魔法をぶつけると、攻撃力が倍加することがあります。注意。

ポイント3:あまり大声を出さないようにしよう

実況動画でも紹介されてましたが、マイク入力レベルを振り切ってしまうと、発動しにくくなります。 理系用語ではサチる(satulation)と言いますが、ピークを振り切ると、認識レベルがガタ落ちします。

サチってもちゃんと発動するように音声認識を調整しておけと言われると、大変耳が痛いところであります。

ポイント4:同じトーンで発話しよう

強い語調で詠唱しても、魔法の威力が上がるわけではありません。却って悪い結果になります。

意外と人間、焦ると早口になったり、トーンが上がったりします。契約時と同じトーンを心がけましょう。 魔法契約時の音声は、魔法契約画面から再生が可能です。たぶん再生すると、「えっ、こんな風にしゃべったっけ?」とビックリします。

ポイント5:カンペを用意しよう

割と何の魔法を契約したか忘れます。カンペ用意すると大変楽。

ポイント6:長い詠唱にチャレンジしよう

10秒を超える詠唱魔法が発動できると、格段に楽になります。

ポイント7:なんでもかんでも力押しするのはやめよう

ポイント1で書いたように、パズルゲーの側面が強いです。 ガードの手数を増やしたり、攻撃力をアップさせたりする魔法があることを思い出してください。

ここから先は、個別モンスター攻略のポイント。

ネタバレに近いので閲覧注意。

続きを読む

Witch Cried ver1.1.2をリリースしました

もう2週間以上前になりますが、Witch Cried ver 1.1.2をリリースしました。 主な修正点は以下の通りです。

  • 魔法封印時のテキストバグ修正
  • iPadでアプリアイコンが出ないバグを修正
  • セリフボックスで、次送りアイコンを表示

アプリレビュー欄でバグ報告くださった方ありがとうございました。

iPadでアプリアイコンが出ないよ、というのは友人からも聞いていたのですが、そんなわけないだろと思ってました……。 原因は、info.plistにiPad用のアイコン設定が残っていた影響のようです。おそらく。 一応直ったと思うのですが、いまいち自信がないところ。

ウィッチクライド

ウィッチクライド

  • MASAAKI MAKINO
  • ゲーム
  • 無料

ついでに、Webページの方にも設定用語集を追加しておきました。 この作品を作るにあたり、ストーリーモードとバトルステージをリンクさせたり、 それなりにストーリーを盛り込む必要があったので、設定は割と真面目に考えています。これでも半分くらい。 http://kinokorori.ninja-x.jp/witchcried.html

ニコニコ自作ゲームフェス2018

Witch Criedを、ニコニコ自作ゲームフェス2018に応募しました。ニコニコ動画にアプリ紹介置いていたので、タグ付けただけで応募完了。

上げ直しもしていないし、レギュレーションもあんまり確認してないし、レギュレーション違反で蹴られんじゃなかろうかと思っていたんですが、受理された模様です。

www.nicovideo.jp