ちょっとまって！そのFDD、捨てないで演奏してみませんか？

# はじめに
この記事は、**[限界開発鯖 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/approvers)**の20日目の記事です。
**FDDで演奏する方法を解説しています。**
前回：**[Proxyを華麗にスルーしてWi-Fiを飛ばすには](https://qiita.com/yangniao23/items/be9eaf95ed87b1084bac)** ~~ネタモロ被りして急遽変えたのは内緒~~
次回：[RISC-Vなんにもわからないけどベアメタル開発環境とか紹介してみる](https://qiita.com/Iwancof/items/dfcf6d1c5cba972ab63a)

# とりあえずこれを見てくれ！
**<font color=blue>とりあえずこれを見てください。</font>**
**[Floppy Disks - Megalovania - Undertale (Remastered) - Youtube](https://www.youtube.com/watch?v=0TfrqAMRKDU)**
<a href="https://www.youtube.com/watch?v=0TfrqAMRKDU"><img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/02ba9f2a-facd-0098-7390-ef20b7c486dc.png"></a>
**FDDのクセに、<u>めちゃくちゃエモい</u>演奏ができていることがわかると思います。**
FDDは中古で叩き売られててやっすいので、いい感じのおもちゃになります。
ビジュアル的に映えるので、**文化祭の出し物**とかにしても良いと思います。
なお、予算については、Arduino、FDD3台 (中古)、ジャンパ線で**だいたい3000円ぐらいでした。**

# お前は誰
**[こるく](https://twitter.com/Colk_)**といいます。
**[限界開発鯖](https://approvers.dev)**とかいう**~~ヤバい~~プログラマーコミュニティー**に所属している**茨城の高専生**です。
なお、筆者は**ハードウェアの知識は皆無です。かなり適当なことを口走っています。**
**マサカリ**などありましたら**<u>やさしく</u>コメント**していただけると助かります。 

# おねがい
**※これは書きかけの記事です！**
**随時記事内容をアップデートしていく予定です。**

もう1度言いますが、筆者は**ハードウェアの知識は皆無です。**
この記事は3年前に文化祭に出したときの曖昧な記憶を基に書いてます。
何が言いたいかと言うと、**この記事の内容を実践してなんか損失を被った場合でも、責任は負えません。**

# 必要なもの
## ソフトウェア
- [x]  Windows または Mac
    - [x]  Windows、Macどちらでも動作しました（検証済み）
- [x]  JavaDevelopmentKit (JDK)
    - <font color=red>**11以上** 8系ではエラーが出ますわよ！（1敗）</font>
- [x]  [Arduino IDE](https://www.arduino.cc/en/software)
    - [x]  **TimerOne**ライブラリをインストールしておいてください
- [x]  [Moppy2 ControllGUI](https://github.com/Sammy1Am/Moppy2/releases)
    - 今回のキモです、実際にMIDIを読み取り、それに従いArduinoに信号を送ります 
- [x]  [Moppy2 Sourcecode](https://github.com/Sammy1Am/Moppy2/releases)
    - 実際にArduinoがFDDを制御する際に使います
- [x]  MIDIシーケンサー（任意）
    - [Domino](http://takabosoft.com/domino)がおすすめ
- [x]  演奏させたいMIDIのファイル
    - 後述しますが、Moppy2にサンプルが付属しています 

## ハードウェア
- [x]  Arduino
    - Arduino UNOやESP8266などを推奨
- [x]  USB-A オス USB-B オス ケーブル
    - ArduinoとPCをつなぎます
- [x]  FDD（1台以上）
    - サイズは問い台ませんが、3.5インチがわかりやすい
- [x]  電源
    - PC電源や安定化電源など、DC 5Vが出れば大丈夫
- [x]  大量のジャンパ線
    - 新しく買うのならメスメス、 オスオスだけを買っておくといいでしょう
    - **なおメス端子が無いと詰みます**

# やっていき！ｗ
## ハードウェア準備編
といってもやることは配線です。
### FDDのピンの見方
**まず、接続するFDDをすべて背面が手前になるように置いてください。**
画像のような状態で作業を進めていきます。
<a href="http://s-sasaji.ddo.jp/bml3mk5/fddctrl01.htm"><img width=450 src="http://s-sasaji.ddo.jp/bml3mk5/FD_235HG_back.jpg"></a>
**下の画像を見てください。**
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/4a014c9e-68f6-8958-d7cd-6de2f3ac6f68.png">
FDDのピンは、このように番号が割り振れらています。

### 配線！
Moppy2、Arduino Unoを用いれば、**最大9台のFDDを接続することができます。**

####1. <font color=blue>**11番ピン**と、**12番ピン**</font>を接続する
**Drive Select(B)を何らかの方法でショートさせます。**
一番簡単なのは、ジャンパ線でつなげてしまう方法でしょう。
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/4d83dfbe-0ac2-5eaf-e911-bd1f6fc28a68.png">

####2. <font color=blue>**18番ピンをArduinoの2番ピン、20番ピンをArduinoの3番ピン**</font>に接続する
実際に制御を行う**ステップピン、ダイレクションピンをArduinoに接続します。**
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/076d37c2-6d18-0c33-f927-1b4268f9dd88.png">

####3. <font color=blue>**17番ピン、19番ピンをArduinoのGND**</font>に接続する
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/163a8e1a-d851-6448-e154-992af171dfd5.png">


####4. 電源を接続する
**以下の画像を参考にしてください。**
<a href="http://s-sasaji.ddo.jp/bml3mk5/fddctrl01.htm"><img width=450 src="http://s-sasaji.ddo.jp/bml3mk5/FD_235HG_back.jpg"></a>
PCの電源が使える場合は、4ピン電源を接続すれば準備は完了です。
それ以外の電源を用意した場合、電源の1番右に**+5V**を、その隣に**GND(負極)**を接続してください。
**残りの2本は使いません。**

####複数のFDDを接続する場合
複数のFDDを接続する場合でも、大まかな流れは変わりません。
ただ、2台目以降は**手順2でArduino側に接続するピンが変わります。**
1台目は<font color=blue>**18番ピンをArduinoの2番ピン、20番ピンをArduinoの3番ピン**</font>に接続しました。
**2台目は、<font color=blue>18番ピンをArduinoの4番ピン、20番ピンをArduinoの5番ピン</font>に接続します。**

このように、それぞれのFDDを**18番をArduinoの偶数ピン、19番をArduinoの奇数ピン**に接続していけばよいです。
7台目以降は、A0、A1...と続いていきます。

#### これでハードウェアの準備は完了です！

## ソフトウェア準備編
**<font color=red>JDK11以上、ArduinoIDE、TimerOneについては事前にインストールしてください。</font>**

### ArduinoIDEの準備
**<font color=red>ArduinoIDE、TimerOneがインストールされている前提で進めます。</font>**
1. [公式のダウンロードページ](https://github.com/Sammy1Am/Moppy2/releases)へ行きます
2. 最新のバージョンを選択した後、**`Source code (zip)`**をダウンロード
3. zipファイルを解凍
4. `Microcontroller/Moppy2-Arduino/Moppy2-Arduino.ino`をArduinoIDEで開く
5. プロジェクトを接続されているArduinoにUploadする
6. 準備完了！

### Moppy2のダウンロード
1. [公式のダウンロードページ](https://github.com/Sammy1Am/Moppy2/releases)へ行きます
2. 最新のバージョンを選択した後、**`MoppyControlGUI-(バージョン).zip`**をダウンロード
3. zipファイルを解凍
4. `bin/MoppyControlGUI.bat`を実行
    - このとき、<font color=red>**11以上のJDKが入っていないとエラーが起きます**</font>
5. こんなかんじの画面が開ければOK！
<img width=450 a![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/a864d3c3-79c1-f99f-6712-62eab61c8a7b.png)
lt="fdd-melody.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/c833651d-d5cc-8a1f-78cf-fb7baaa479f9.png">

## ついに演奏！
#### 1. 接続されているArduinoのシリアルポートを選択します
<img width=450 alt="fdd-melody.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/322b4727-6900-b889-802a-9371c4ee4708.png">
#### 2. AddFileより、演奏したいMIDIファイルを追加します
<img width=450 alt="fdd-melody.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/e3e920da-efb0-953a-8671-43c5d7ec4c92.png">
**先程ダウンロードした`MoppyControlGUI`の`samplesongs`中に、サンプルのMIDIが入っています。**
#### 3. 演奏開始！
**演奏したい曲をダブルクリックします**
<img width=450 alt="fdd-melody.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/56005c0c-8e3b-9ee9-c5f4-f7944161e2ef.png>


#### これで演奏が始まったと思います！

# 補足
## 演奏用のMIDIについて
（追記予定）

# さいごに
## あとがき
いかがだってでしょうか。今回は一般誤家庭に落ちているArduinoを使ってFDDを演奏する試みでした。
みなさんもこの機会に中古屋でFDDを購入して演奏してみてはいかがでしょうか。
なおここでは書きませんでしたが、どうやらラズパイを使う方法もあるようです。
実際にFDDを演奏してみると、メーカーや型番によって音が全然違うことがわかると思います。
和音やハーモニーなど、いろいろなFDDを使って試行錯誤して演奏してみてくださいね。

## Special Thanks!
- FD-1165さん ([FD-1165](https://www.nicovideo.jp/user/37161782))
    - 急な頼みだったのに懇切丁寧に教えてくれました
- フライさん ([@loxygenK](https://twitter.com/loxygenK))
    - Arduinoを買ってくれました
- [[DIY] Faire de la musique avec un lecteur floppy et un Arduino](https://www.firediy.fr/article/faire-de-la-musique-avec-un-lecteur-floppy-et-un-arduino)
- [Floppy Diskdrive  pinout and wiring @ old.pinouts.ru](https://old.pinouts.ru/HD/InternalDisk_pinout.shtml)
- [Moppy2 Wiki](https://github.com/Sammy1Am/Moppy2/wiki/Getting-Started)
- [FPGAでFDDコントローラを作る (1) ヘッド操作](http://s-sasaji.ddo.jp/bml3mk5/fddctrl01.htm)