CUIで音楽製作環境の構築(macOS版)

エンジニアならターミナルで作曲したい。そして、音楽自体もプログラミングしたい。macOSで音楽プログラミングの環境構築のまとめ。

オーディオファイルを直接吐くツールもいろいろあるけど、やはりここは、古き良きMIDIを経由するのが楽しい。しかし、macOSなどは、MIDI再生環境が入っていない。

> 結構脱線しているので、2022/10/18に再構築して自分のためにメモ。

# MIDI環境の構築

macOSでMIDIを再生するには、サウンドフォントを利用して、MIDIプレイヤーで再生すると良い。
プレイヤーには、timidity++を使う方法と、fluidsynthを使う方法がある。

最初に、timidity++とテキスト音楽サクラを使う方法を紹介する。


## timidity++のインストール - MIDIプレイヤー

複数のサウンドフォントを組み合わせるなら、timidity++が便利。設定ファイル(timidity.cfg)でサウンドフォントの組み合わせを指定できる。デフォルトでも結構良い音のが入っている。
それほどこだわっていないなら、サウンドフォントを別途ダウンロードしなくても良いかも。

```
# HomebrewでTimidity++をインストール
$ brew install timidity
$ timidity --version
```

## MML→MIDIコンパイラ - コンパイラ

やはり、コマンドライン上で作曲なら、テキストで作曲できるMML→MIDIコンパイラを使うべき。
macOS版のテキスト音楽「サクラ」v2をインストール。このサクラは、Windows用を対象に作られたSHIFT_JIS版のサクラであり、FreePascalでコンパイルしたもので完成度はお墨付き。

```
$ wget https://sakuramml.com/download/sakuramml_mac_2_379.zip
$ unzip sakuramml_mac_2_379.zip
$ cd sakuramml_mac_2_379
```

作業フォルダのsakuramml_mac_2_379に、music.mmlというファイルを作成する。

```music.mml
TR=1 l4 cdef
TR=2 l4 efga
```

MMLファイルをMIDIファイルへコンパイルするには、以下のように書く。

```
# コンパイル
$ ./csakura music.mml
```

なお、サクラには、Rustで作り直したUTF-8版もある。シンプルで、手軽に使いたい場合にお勧め。

```
# ダウンロード
$ wget https://github.com/kujirahand/sakuramml-rust/releases/download/0.1.4/macos-sakuramml.zip
$ unzip macos-sakuramml.zip
# コンパイル
$ ./sakuramml music.mml
```

なお、MMLコンパイラはサクラ以外にもたくさんある。

## MIDIファイルを再生

以下のコマンドでMIDIファイルを再生できる。以前は、-Odのオプションを省略して即時演奏できたが、2.15.0では、オプションが必要だった。

```
$ timidity -Od music.mid
```

なお、オーディオファイル(OGG Vorbis)として出力するには、以下のように書く。どんな形式のオーディオ形式を出力できるかは「timidity -h」で確認できる。

```
$ timidity -Ov music.mid
```

# FluidSynthを使う場合

```
$ brew install fluidsynth
```

M1/M2 Macの場合、以下のエラーが出る。

> fluidsynth: error: Unable to open file '/opt/homebrew/Cellar/fluid-synth/2.3.0/share/soundfonts/default.sf2'

そこで、以下のSoundFontをダウンロードの上、上記のパスにSoundFontをコピーすると、以下のコマンドでMIDIの再生ができるようになる。

```
$ fluidsynth -i music.mid
```

なお、明示的にSoundFontを指定できる。

```
$ fluidsynth -i Yamaha_XG_Sound_Set.sf2 music.mid
```


# サウンドフォント(SoundFont)を使う場合

ＭＩＤＩファイルを独自の音源で再生するには、サウンドフォントを利用する。

サウンドフォントはいろいろある。でも、結構リンク切れてる。以下はGM/GS音源の定番を集めたもの。SourceForgeやGitHubにあればリンク切れがないの安心。

 - SourceForgeからダウンロード
    - https://sourceforge.net/projects/androidframe/files/soundfonts/

無料のサウンドフォントが一杯あるので困ることはない。個性派のサウンドフォントを組み合わせて作曲すると良い個性が出せる。


デフォルトの設定ファイルのディレクトリは以下の通り。

```
# /usr/local/Cellar/timidity/バージョン/share/timidity
cd /usr/local/Cellar/timidity/2.15.0_1/share/timidity
vi timidity.cfg
```

ただし、v2.15では、SoundFountではなくて、Freepatsが設定されている。Freepatsは任意の楽器を一つずつ選ぶ感じみたい。
いろいろ種類もあるけど、やっぱりSoundFontの方が選択肢が多い気がする。そこで、楽曲ごとに任意の設定ファイルを指定する「-c」オプションを利用するのが良さそうな気がした。

```
timiditiy -c 設定ファイル.cfg input.mid
```

最終的にオーディオファイルに変換したいとき:

```
timidity -c 設定ファイル.cfg input.mid -Ow -o out.wav
```

変換したWAVを再生する:

```
afplay out.wav
```

その後、ffmpegなどでmp3とか好きな形式に変換できる。



## 曲データもGitHubで管理

サウンドフォント以外、全てテキストデータなので、GitHubに作曲の経過を記録できる。あのとき作ったフレーズよかったの逆戻りが可能。

 - SoundFont データ
 - timidityの設定ファイル
 - MMLファイル(曲データ)
 - Makefile

曲のコンパイルから演奏まで、すべてmakeで管理できる。

# 雑感

気に入ったサウンドフォント

 - ゲームボーイサウンドフォント -- http://asialunar.info/gbsf.html

サウンドフォント自体をばらして合成できたら面白そう。音源を自分で組み立てる感じ感がある。
サウンドフォントの仕様も公開されていて、難しくなさそう。既にありそうだけど、サウンドフォントを自由に組み立てるエディタの作成も面白そう。

適当なサウンドフォントでWAVで書き出して、書き出したWAVデータ同士をくっつけて最終的な曲にするのも楽しそう。また、自分で録音した変な音のサウンドフォントを作れば、個性的な曲が手軽に作れそう。

# 参考

- (fluidsynth) https://qiita.com/yktakaha4/items/009306108b9c9fe06a37
- (Vimで作曲) https://qiita.com/Bakudankun/items/1a9db0b9b3885613a113