Raspberry PiのScratchで、USBウェブカメラを活用する方法を発見！

#ラズパイのScratchで録音／再生がしたい！

ラズパイクラスの子どもたちとScratch、Sonic Pi、Minecraftなどを楽しんでいるわけですが、Scratchで録音／再生がしたくて、ずっとできずにいました。USBサウンドカードを繋いで、マイクを刺せばできそうなんだけど、どれがいいのかよくわからない。

##USBウェブカメラがいいのでは？
一方、写真も取り込みたいのでカメラが必要。でも、ラズパイ専用カメラは高いし、ケーブルがやわなので、パス。おっ、サウンドカードとマイクを買うより、USBウェブカメラが安い。そして、音声も取れるやんか。一石二鳥。
とりあえず、買ってみたけど、なかなか時間が取れない。。
https://www.logicool.co.jp/ja-jp/product/hd-webcam-c270
https://www.logicool.co.jp/ja-jp/product/hd-webcam-c310

##標準のオーディオ出力を使いながら、USBウェブカメラで録音するのは難しい？

最近、音声合成や音声認識でALSA関係をいじくり始めていて、USBウェブカメラをマイクとして使うのはいい感じ。それなら、やっぱりScratchもなんとかしたいと、いよいよ本腰を入れることに。

ところが、インターネットをかなり彷徨ったところ、USBウェブカメラで録音しつつ、標準のオーディオ出力を使いつつという例がない。ラズパイ財団の仕事としてラズパイ用のScratchをバリバリ整備／改造しているTim Rowledgeさんとやりとりしたけど、ALSAの設定がわけわかんない！というところで止まっている模様。掲示板などでも、世界的に皆さん困っている感じ？

何度このメッセージを見たことか。
![no device.png](https://qiita-image-store.s3.amazonaws.com/0/5412/4a931dfb-5785-af60-3c47-67976eaf458e.png)
これをググって、Tim Rowledgeさんとつながることができたわけですが。彼は、ガシガシのSqueaker/Smalltalkerで、ラズパイ用のVMの高速化、ラズパイ用のScratchイメージの改良をやっている人です。最近の高速化はこの人のおかげ！！！

というわけで、ScratchもSqueakもオープンソースだから、好きにしていいよと言われつつ、ALSA設定の深い森へ。。。。。。もうだめだ、遭難するー。と思ったら、、、できました！

##ALSAの秘密の設定

デフォルトの「再生」を標準オーディオ出力、0番のサウンドカード（ALSA用語）にしたまま、デフォルトのキャプチャー（録音）としてUSBウェブカメラのマイク、1番のサウンドカードを指定、という、合わせ技。コントロールのデフォルト設定は特に必要ないです。あと、よくある、ドライバーの読み込み順を入れ替える作戦も不要。

Scratchは、とにかく、システムのデフォルトの入出力を見ています。なので、今回のような場合は、 ``` type asym ``` を使った合わせ技が必要でした。

``` nano ~/.asoundrc ``` で編集します。

```
pcm.!default {
	type asym
	playback.pcm {
		type hw
		card 0
	}
	capture.pcm {
		type hw
		card 1
	}
}

ctl.!default {
	type hw
	card 0
}
```

このファイルは消しても自動的にできるし、ある環境では、せっかく書いた設定にテンプレートを必ず追加してくるという不思議な動きをしていました。そういう時は、chmod 444 でpiさんに触らせなくするとオッケー。（2018-1-30追記：type asmが、type hwに書き換わっていて、色々とおかしな動きになりました。原因は不明。chmod 444やっていなかった環境。）


``` $ alsamixer ``` で、音量調節をすると、やったー。録音できた。


![PreviewScreenSnapz006.png](https://qiita-image-store.s3.amazonaws.com/0/5412/f974eedc-cd7e-625f-e551-7f3354444b9d.png)
（2018-1-30追記：録音 → 停止で良いはずですが、これでは録音できない場合がありました。その時は、録音 → 再生で。）




##USBウェブカメラで写真も撮りたい。
さて、こちらの方が先にできていました。もしかすると何もしないでも使えていたかも。Scratchでコスチュームのタブを開くと、なんと　[カメラ]ボタン出現。新しいコスチュームとして撮った写真を使えます。


![PreviewScreenSnapz007.png](https://qiita-image-store.s3.amazonaws.com/0/5412/e5617d9d-39d9-c485-d0e5-6201c8dfd8ce.png)

![PreviewScreenSnapz010.png](https://qiita-image-store.s3.amazonaws.com/0/5412/b8611889-d097-7c0c-0e9e-648bc349309f.png)

もう一つの使い方は、[( gpioserveron ) を送る]でGPIOサーバーを起動しておいて、[( photo ) を送る]ブロックでシャッターを切る方法。スクリプト中に使えます。

![FinderScreenSnapz006.png](https://qiita-image-store.s3.amazonaws.com/0/5412/f054c54a-a0e6-496e-aaef-3f2be70f1a77.png)

ラズパイ財団のページにも説明されています。「Scratch GPIO」
https://www.raspberrypi.org/documentation/usage/gpio/scratch1/README.md
このページは、当然ながらTim Rowledgeさんもコミットしています。

（追記：2019-02-20）
[( photo ) を送る]ブロックだけでなく、[( photo640@480 ) を送る]など、サイズ指定もできます。注意！：あまり大きなサイズにすると、永遠に時間がかかります＝おそらくフリーズ。

Scratch以外にも使えるのでラズパイ財団の「USING A STANDARD USB WEBCAM」ページをみて、fswebcamというツールをインストールしておきます。
https://www.raspberrypi.org/documentation/usage/webcams/

```
sudo apt-get install fswebcam
```


以上！


参考ページ
Advanced Linux Sound Architecture/Troubleshooting
　　2.2 Setting the default microphone/capture device
https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture/Troubleshooting#Setting_the_default_microphone.2Fcapture_device