CUIで音楽製作環境の構築(2023年10月版)

エンジニアの皆さんの中には、ターミナル上(CUI)で、音楽制作をしている方が相当数います。2020年に同じタイトルでQiita寄稿したのですが、2600以上の閲覧数がありました。(エンジニアの中の2600という数が妙にリアル)。その後、いろいろ調べたり、自分でSoundFontプレイヤーを組み込んだ、CUI版のテキスト音楽「サクラ」を開発したので、その紹介をしつつ、音楽環境をアップデートしてみましょう。

# CUI音楽家に超オススメのピコサクラ(CUI版)

そもそも、本記事を書こうと思ったのは、CUIで演奏できる自作のSoundFontプレイヤー+MMLコンパイラを作ったからです！CUIなので画面が味気ないのは仕方ないとしても、以下のように「picosakura」コマンドに音楽データのMMLファイルを与えるだけで、MMLファイルをコンパイルし、指定のSoundFontを使って音楽演奏をしてくれます。

![スクリーンショット 2023-10-30 11.03.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/503d1fa0-1408-4db8-daf5-6f82219caf42.png)

なお、コマンドラインではなく、ブラウザ上で試したいという方は、[ピコサクラWeb版](https://sakuramml.com/picosakura/)を試してみてください。ブラウザ上で、SoundFontを利用して演奏が可能です！

![スクリーンショット 2023-10-30 10.55.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/559af29e-c209-a9ec-7096-3a876c2977ac.png)

音楽制作自体はターミナルで行いたいという方も、ブラウザ上で動くサクラのチュートリアルがあります。良かったら、以下のチュートリアルでMMLの記述方法を確認してみてください。

https://sakuramml.com/go.php?16

サクラを使うと、MMLと呼ばれる音楽記法(ABC記法とも言う)を使って、音楽制作を行うためのツールです。そもそも、テキスト音楽「サクラ」とは「一体何だ！」と思っている方も、一度ご覧ください！



## ピコサクラCUI版のインストール

ピコサクラCUI版(正式名称: picosakura-rust)は、Rustで開発したSoundFontプレイヤー+MMLコンパイラで、以下よりWindow/macOSのバイナリをダウンロードできます。

https://github.com/kujirahand/picosakura-rust/releases

:::note info
ちなみに、プログラマー諸氏であれば、既にRustをインストールしてありますよね？Rustがセットアップしてあるならば、以下のコマンドでコンパイルできます。Linuxメインの方は、こちらが便利でしょうか。

```bash
git clone https://github.com/kujirahand/picosakura-rust.git
cd picosakura-rust
cargo build --release
```

上記コマンドを実行すると`picosakura-rust/target/release/picosakura`にバイナリが生成されます。後は、適当に環境変数PATHにpicosakuraのバイナリを配置したパスを追加してください。
:::

## ピコサクラCUI版の使い方

基本的には以下のようにして再生を行います。

```bash
picosakura (演奏ファイル.mml)
```

細かいオプションは、`picosakura --help`で表示できます。

最初につまづきそうな点ですが、picosakuraコマンドは、デフォルトで、`(カレントディレクトリ)/fonts/TimGM6mb.sf2`のSoundFontを利用して演奏を行おうとします。もし、任意のSoundFontを使いたい場合には、下記のように、引数にサウンドフォントのパスを指定します。

```bash
picosakura --soundfont (SounfFontのパス) (演奏ファイル.mml)
```

### オリジナル曲を作るとき

そのため、オリジナル曲を作成する際には、再生用に簡単なバッチファイルを作って、そのバッチファイルを実行すれば、演奏が始まるという状態にすると便利です。

hello.mmlとplay.shというファイルを作成します。

```bash
touch hello.mml
touch play.sh
```

簡単に演奏できるバッチを作成します。

```bash:play.sh
#!/bin/bash
SF=/path/to/soundfont
picosakura --soundfont $SF hello.mml
```

そして、`./play.sh`でMMLファイルの再生が可能です。

## SoundFontを探そう！

picosakuraがデフォルトで用意しているサウンドフォントは、バランスが良い上に、ファイルサイズも、6MBほどしかない優秀な「TimGM6mb.sf2」です。これは、オープンソースのSoundFoutです。とは言え、もうちょっとファイルの大きなものの方が、楽器が揃っていて楽しいです。

以下からGS対応のものなど、いろいろダウンロードできます。

https://sourceforge.net/projects/androidframe/files/soundfonts/

また、ネットをさまようと、他にもいろいろなSoundFontがあります。XG対応のものとか、検索で、SC-88とかいろいろ名機を入力すると、それっぽいものが集まります。

https://musical-artifacts.com/artifacts?formats=sf2&tags=yamaha+xg

## 作成した曲をMP3に変換する

なお、せっかく曲を作ったら、MP3に変換して、YouTube動画にしてアップしたいですよね。
ピコサクラには、WAVファイルの書き出し機能も整っています。

以下のコマンドを実行すると「sakura2.mml」を「a.wav」という名前でWAVファイルにエクスポートします。

```bash
picosakura -w a.wav sakura2.mml
```

あとは、[ffmpeg](https://ffmpeg.org/)を使ってWAVをMP3に変換しましょう。以下は「a.wav」を「a.mp3」に変換するコマンドです。

```bash
ffmpeg -i "a.wav" -vn -ac 2 -ar 44100 -ab 256k -acodec libmp3lame -f mp3 "a.mp3"
```

https://ffmpeg.org/

## 曲のソースコードやSoundFontの管理はGitで

CUI環境の良いところなんですが、曲のソースコードや、SoundFontの管理は全部Gitでバージョン管理できます。フレーズを書き換えたけど、前の方が良かったなぁなんて場合は、Gitで履歴をたどることもできて、良い感じに試行錯誤できます。

また、GitHubに曲制作のリポジトリを作っておくと、曲の公開からデータの管理まで、いろいろできて便利です。GitHubのIssuesをメモ代わりに使うこともできるので、「あのピアノのパターンを差し替えたい」とかメモを残しておけます。また、修正したらIssuesを閉じると、タスク管理ツールの代わりにも使えるので便利です。

https://github.com


## スクリプト言語を交ぜて作曲しよう

MMLを使ったテキスト音楽の利点なんですが、ソースコードを複数のテキストファイルに分けておいて、コンパイル前にマージすることもできます。また、ランダムにフレーズを生成して気に入ったコードを採用するなんてこともできます。

サクラ自体にも、簡単な制御構文FUNCTIONやIF/WHILE/FORが備わっていますが、普段書き慣れているPython/なでしこ/Ruby/Perl/PHPを使って、MMLを動的生成するようにすれば、かなり、良い感じに曲を生成できます。

なお、先日、なでしこを使って、ベースラインのフレーズをランダムに作成する、TRndM5というツールを作ってみました。こうしたツールを手軽に作れるのも、MMLならではの良さと言えます！

![スクリーンショット 2023-10-30 11.40.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/15cbe2cd-b2e0-863f-676e-603f73bc0f2a.png)

https://n3s.nadesi.com/widget.php?2652&run=1


## ピコサクラCUI版だけで全部揃った？！

これまでは、timidity++だったり、FluidSynthだったり、いろいろなアプリをインストールして、音楽制作していたのですが、ピコサクラCUI版さえあれば、いろいろなタイプの曲を作れるようになりました。しかし、ピコサクラCUI版さあれば、本当に手軽に音楽制作ができます！

…とは言え、実は、ピコサクラの演奏エンジンは、rustysynthというライブラリをラップしただけなんです。そのため、機能はrustysynthに依存しています。作者のsinshu様ありがとうございます！リバーブなどエフェクトにも対応しており、素晴らしいライブラリです。

https://github.com/sinshu/rustysynth


### FluidSynthを使う場合

しかし、ピコサクラの演奏エンジンで、うまく鳴らないという場合があれば、FluidSynthを使うと良いでしょう。macOSであれば、下記のコマンド一発で、FluidSynthがインストールできます。

```bash
brew install fluidsynth
```

そして、FluidSynthでSoundFontを使ってMIDIを鳴らすには、下記のようにします。前述のように、再生用のバッチを用意するなら、サクラでMML→MIDIだけをやっておいて、再生は、FluidSynthにお任せできます。

```bash
# FluidSynthで演奏
fluidsynth -i /path/to/soundfont.sf2 hello.mid
```

### サクラのコンパイラのみバージョン

サクラのMML→MIDI変換エンジンは、以下より入手できます。

https://github.com/kujirahand/sakuramml-rust

同じように、Rustがインストールされていれば、以下のコマンドでコンパイルできます。

```bash
git clone https://github.com/kujirahand/sakuramml-rust.git
cargo build --release
```

すると、`sakuramml-rust/target/release/sakuramml`という名前のバイナリが作成されます。

以下は、`hello.mml`を`hello.mid`という名前でコンパイルし、FluidSynthで演奏する例です。

```bash
#!/bin/bash
# サクラで演奏なしにMMLをMIDIに変換
sakuramml hello.mml
# FluidSynthで演奏
fluidsynth -i /path/to/soundfont.sf2 hello.mid
```

## 高機能なサクラv2が使いたい場合

ところで、今回紹介したのは、テキスト音楽「サクラ」のRust実装版を使ったものでした。2000年前半に作成した、サクラv2は、音楽家の方の意見を聞いて意見を取り入れて作ったツールです。とてもマニアックな機能が満載です。

サクラv2は、Delphiで作っていたため、Rustで作り直そうと一念発起して作ったのが、sakuramml-rustなんですが、なかなか、v2の全ての機能を網羅するに至っていません。sakuramml-rustでは、v2の書きにくいとこを改善しつつ、高速なRustで作り直したため、良いところもあります。

とは言え、v2が良いという方は、v2版をインストールして使うこともできます。最近のDelphiは、Unicode対応した際、ずいぶん変わってしまいましたので、最新のDelphiではコンパイルできません。Delphi7を使うか、オープンソースのFree Pascalを使ってコンパイルできます。

https://github.com/kujirahand/sakuramml

バイナリが必要の場合は、以下より、Windows/macOS/Raspberry Piバージョンをダウンロードできます。

https://sakuramml.com/go.php?4


## その他のMMLコンパイラも使えるよ

サクラ以外にも、いろいろなMMLコンパイラがあります。既にあまりメンテナンスされていないものもありますが、一応リストアップしておきます。

- [mml2mid](http://hpc.jp/~mml2mid/)
- [spice](https://gorry.haun.org/spice/)
- [zmmlc](https://github.com/zhidao/zmmlc)
- [pmml](https://github.com/furandon-pig/pmml-0.2p1-fork-201405)
- [mucom](https://github.com/onitama/mucom88)

上記は、数分で調べただけなので、上記に列挙されていなくて、自分は、このコンパイラ使っているというのがあれば、ぜひご紹介ください！

## まとめ

以上、CUIの音楽制作環境の構築方法について紹介しました。仕事の息抜きの音楽制作は、素晴らしい気分転換になりますよね。

とは言え、筆者がサクラを作ろうと思ったのは、自分だけの特別なオリジナル曲が作りたい！と思ったからでした。MMLであれば、スクリプトと組み合わせて作曲できるので、あまり世に出ていない、**特別な音楽**を作成できる可能性があります。

エンジニアだからこそ作れる音楽で、世間を席巻しましょう！

# 参考

https://qiita.com/kujirahand/items/26013f733e6e8bfc43cb

https://qiita.com/kujirahand/items/df2918b70c5715b7dd6b