きつねダンスが流行ってるのでFoxDot始めてみた

# 流行っているきつねダンスに乗じたい
北海道日本ハムファイターズの「きつねダンス」が今とても流行っています。
Ylvisが歌う「The Fox」に合わせて、チアダンサーが踊るというものです。

**きつね × 音楽**
ということで流行に乗じてFoxDotを始めてみようというコーナーです。

> ちなみに私の音楽歴はリコーダーと鍵盤ハーモニカです。
> ド素人ということをご理解ください。


# FoxDot
Pythonに近しい？書き方で音楽を奏でることができるものです。
ライブコーディング、Algorave(アルゴレイヴ)と呼ばれるものの一種で、
即興でリズムを作り、音楽を奏でてフロアを沸かすという最高にロックなプログラミングです。

>以下の動画が雰囲気を掴むのに良いかもしれません。
[Live Coding Pop Music with Python and SuperCollider](https://www.youtube.com/watch?v=xXNB1BbKY8A&t=517s)
[Live coding music with FoxDot | Python | Algorave | Pakistan](https://www.youtube.com/watch?v=ziD5diimFHM)
[DOMMUNE Tokyo - live coding performances - algorave tokyo x yorkshire](https://www.youtube.com/watch?v=Tjf-NJNfOP4&t=1780s)

他にはSonicPiやTidalCyclesなどを用いるパターンもありますが、今回はFoxDotでいきましょう。(きつねダンスの流行りに乗りたいので)

# FoxDotの環境準備
### SuperColliderのインストール
まずは[SuperCollider](https://supercollider.github.io/)をインストールします。
音を鳴らすための環境です。 IDEみたいなもので、この上でコーディングしていきます。

### Pythonのインストール
Homebrewもしくは、[Python公式サイト](https://www.python.org/)からインストールしてください。
```bash:バージョン確認
$ python3 -V
Python 3.10.6
```

### FoxDotをOSにインストール
以下のコマンドでFoxDotをOSにインストールしていきます。
```bash:OSにインストール
pip3 install FoxDot
```

### FoxDotをSuperColliderにインストール
続いて、SuperColliderを開いて左側の白い画面に以下のコマンドを入力します。
```javascript:SuperColliderにインストール
Quarks.install("FoxDot")
```
macの場合は、⌘ + Enterで実行です。
```
BatLib installed.
.
.
.
FoxDot installed.
```
などが出たらOKです。

一度ここでSuperColliderを再起動します。

### FoxDotの起動
SuperColliderで以下のコマンドを実行して、サーバーを開きます。
```javascript:SuperCollider
FoxDot.start
```
![スクリーンショット 2022-10-29 10.45.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613121/13b6e728-b461-cabe-73d0-9cedb7453ffb.png)
⌘ + Enterで実行です。
これでFoxDotの信号を受信できる準備が整いました。

次にTerminal側で以下のコマンドを実行してFoxDotを起動します。
```bash:Terminal
python3 -m FoxDot
```

:::note info
「ModuleNotFoundError: No module named '_tkinter'」が表示された場合
```bash:python-tk
brew install python-tk
```
:::

coolな画面が表示されたら準備バッチリです。
![スクリーンショット 2022-10-03 23.14.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613121/9123fd57-7c31-9280-0822-f47bedf69d11.png)

# 音を鳴らしてみる
テンポ...BPMってやつを決めていきます。
とりあえず分かりやすく60で。
> メジャースケール、マイナースケールなどを決めることもできるっぽいですが
> 名前しか聞き馴染みないので今回はスルーすることにしました
```javascript:BPMの指定
Clock.bpm = 60
```

次に鳴らせる音、音色を確認してみます。
```javascript:音色の確認
print(SynthDefs)
```
```python:結果
['loop', 'stretch', 'play1', 'play2', 'audioin', 'noise', 'dab', 'varsaw', 'lazer', 'growl', 'bass', 'dirt', 'crunch', 'rave', 'scatter', 'charm', 'bell', 'gong', 'soprano', 'dub', 'viola', 'scratch', 'klank', 'feel', 'glass', 'soft', 'quin', 'pluck', 'spark', 'blip', 'ripple', 'creep', 'orient', 'zap', 'marimba', 'fuzz', 'bug', 'pulse', 'saw', 'snick', 'twang', 'karp', 'arpy', 'nylon', 'donk', 'squish', 'swell', 'razz', 'sitar', 'star', 'jbass', 'sawbass', 'prophet', 'pads', 'pasha', 'ambi', 'space', 'keys', 'dbass', 'sinepad']
```
いっぱい使えそうですが、よくわからないので今回は**pluck**と**play**を扱ってみます。

### シンセサイザー(pluck)
![スクリーンショット 2022-10-29 17.38.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613121/3abb3fcc-457f-36dd-c359-50daed0089d2.png)

3行目：**p1 >> pluck()** は「ド」の音を4回鳴らします。
4行目：**p1.stop()** は3行目のp1を停止できます。
6行目：**p2 >> pluck([0, 1, 2, 3, 4, 5, 6, 7])** は「ドレミファソラシド」が順番に鳴らせます。pluck([0])が「ド」、pluck([2])が「ミ」に対応しているわけですね。
8行目：**p3 >> pluck([5, 2, 1], dur=[1, 1/2, 1/4])** で指定している**dur**は音の長さ、拍数を変更しています。　4分音符、8分音符、16分音符というわけです。
10行目：**Clock.clear()** で全部停止です。

実行したいコード(鳴らしたい音)の行にカーソルを合わせて**⌘ + Enter**で実行です。
複数行選択すれば複数を一気に実行することも可能です。

### ドラム(play)
![スクリーンショット 2022-10-29 17.52.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613121/b6b3121f-3c6c-189f-0a20-41b313461970.png)

3行目：**d1 >> play('x-o-', sample=2)** 最初の **''** あるいは **""** の中に繰り返したい音を入力します。
ここではベースドラムとハイハット、スネアドラムを叩くようにしています。
> ※ドラムセットのどれに該当するか分かっていません。

'x'はベースドラム、'X'はヘビーキック
'o'はスネアドラム、'O'はヘビースネア
'-'はハイハット(クローズ)、'='はハイハット(オープン)
'*'はクラップ
...とドラムに関する色々あるみたいなので、細かく音作りできそうですね。。

**sample**で数値を変えると音も変わります。

:::note info
**sample=2**と**sample=4**を指定するだけでもそれっぽくなりました。
:::

7行目：**d3 >> play('x-o[---]')** で **[]** を使っていますが、音が細かくなります。
ハイハットを3回タタタンと細かく鳴らせるようになります。

9行目：**d4 >> play('{xX}-{oO}-{\*x}')** で **{}** を使っていますが、音がランダムに選択されるようになります。
今回は「ベースドラムかヘビーキック」、ハイハット、「スネアドラムかヘビースネア」、ハイハット、「クラップかベースドラム」というようにしてみました。
これだけでもかなりそれっぽいです。

# まとめ
簡単にそれっぽい音が鳴らせるようになりました。
**What does the fox say?**

# 追記
YoutubeにPyConJP 2019で田中慎太郎氏が発表したライブコーディングの動画がありますので、
ご興味ある方は見てみてください。
[02-502_Pythonでライブをしよう -FoxDotを使った新時代のPython活用法-(田中 慎太郎)](https://www.youtube.com/watch?v=lCQWLAJf6xQ&t=1704s)
> 大学生時代にPyConJP2018での田中慎太郎氏の[Webスクレイピングに関する発表](https://www.youtube.com/watch?v=zgTP_4-XEpw)に感銘を受け、尊敬している方のため紹介させていただきました。