SoXコマンドでサンプリング音楽用の素材を作って遊ぶ

[mixiグループアドベントカレンダー](http://qiita.com/advent-calendar/2015/mixi)の10日目の投稿です。

今日は「家族アルバム みてね」の「1秒動画」という機能で使っているSoXというコマンドラインツールを紹介します。

# 自己紹介

ミクシィ社で「[家族アルバム みてね](https://mitene.us)」の開発チームに所属し、 @ainame や @yprestoと一緒にiOS/Androidのクライアントアプリ・APIや今回紹介する1秒動画の機能などを開発しています。

# 「家族アルバム みてね」について

- 子どもの写真・動画を家族内だけで安心して共有できるパパ・ママの子育てを楽しく支えるサービスです
- [Google Play 2015 ベストアプリ](https://play.google.com/store/apps/collection/promotion_3001cd4_apps_bestof2015)に選ばれました！

# 「1秒動画」について

「1秒動画」機能とは動画を20本以上アップロードし、一定期間経つと自動的にそれらの動画をまとめて子どもの成長をより実感してこれまでの子育てを振り返ることが出来る機能です。

サンプルですが、こんな感じです。

[![1秒動画サンプル](http://img.youtube.com/vi/cImw3Pg0Yv8/0.jpg)](http://www.youtube.com/watch?v=cImw3Pg0Yv8)

# SoX（Sound eXchange）

SoX - http://sox.sourceforge.net は、コマンドラインのみで音声メディアファイルを手軽にトリミングや形式変更したり、1秒動画のように複雑なエフェクト処理などを施すことが出来る機能が非常に豊富なツールです。

1秒動画の機能を実装する上では一部ですが、以下のような用途で使っています。

- トリミング
- 音声ボリュームの正規化
- 音声合成

使い勝手はただのコマンドラインなので、ちょっとした編集をサクサクとスクリプトで処理したり、サービスの内部で自動処理したりなどの使い方が主になるかとは思いますが、それ以外にも異常に機能が多く非常に面白くそう、かつ、それほど知られていない？ツールなので、一部の機能を紹介しながらついでに音楽を作って遊んでみたいと思います。

## インストール

MacOSであればhomebrewでサクッと入ります。

```bash
$ brew install sox
```

# 音楽を作ってSoXコマンドを学ぶ

過去に自分が趣味のバンドで作っていた曲を素材としてそこから音源をサンプリングして別の音楽を作ってみるのを目指します。

- 素材

[![素材](http://img.youtube.com/vi/0tlSVKpzMcs/3.jpg)](http://www.youtube.com/watch?v=0tlSVKpzMcs)

各種コマンドオプションの細かい利用方法は日本語訳を行ってくださっている方のドキュメントを参照してください。

http://www.hcn.zaq.ne.jp/___/unix/sox-ja.html

## step1. 素材を破壊する

まずは大胆に素材のピッチ(pitch)と速度(speeed)を変えて元の音楽を破壊してみました。

playコマンドを使いながらオプションを与えると、書き出しを行わずにその場で再生を行うことができ便利です。

```
$ play original.mp3 trim 87.6 100 pitch -650 speed 0.5
```

これで良いだろうというところで実際にファイルに書き出します。

```
$ sox <input> <output> [option]
```
のような形式で実行します。

今回はこんな感じです。

```
$ sox original.mp3 step1.wav trim 87.6 100 pitch -650 speed 0.5
```

出来上がった音源を聞いてみると、ピッチがガクッと下がり、速度も鈍くなり全く別の音楽になってしまいましたが面白いのでこれを使います。

出来た音源はこちら⬇️
https://soundcloud.com/radioboo/remix_step_1/s-HuuK2

## step2. 切り出して素材を作る

step1で作った奇妙な音楽を元に、さらに今回は[カットアップ](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)でリミックスを作ろうと思うのでそのため素材を作りたいと思います。
適当にランダムな箇所をtrimしたものを10個ほど用意したいです。

シェルでも簡単に書けるのですが、せっかくなので今回は**ruby-sox**というgemを使ってみます。

https://github.com/TMXCredit/ruby-sox

```rb
#!/bin/ruby

require 'ruby-sox'

duration     = 120
sample_count = 10
input_file_name = 'step1.mp3'

sample_count.times do |count|
  random_duration = rand(duration)
  sox = Sox::Cmd.new.add_input(input_file_name)
    .set_output("step2/step2_#{count}.mp3")
    .set_effects(:trim => "#{random_duration} 2.0")
   .run
end
```

出来た音源はこちら⬇️
https://soundcloud.com/radioboo/sets/step_2-cutups/s-nUjmJ

## step3. 素材にエフェクトをかける

エフェクトは様々な種類が用意されていて面白い処理がたくさんできます。
せっかくなので、step2でできたファイルにエフェクトをかけてみたくなったのでいくつか紹介します。

### モジュレーション系

#### flanger

```bash
$ sox step2/step2_4.mp3 step3/step3_4_phaser.mp3 phaser 0.6 0.66 3 0.6 2 -t
```

### イコライザ/フィルター系

#### bass

```bash
$ sox step2/step2_2.mp3 step3/step3_2_bass_filter.mp3 bass -30
```

#### treble

```bash
$ sox step2/step2_3.mp3 step3/step3_3_treble_filter.mp3 treble -70
```

### その他

#### reverse

```bash
$ sox step2/step2_9.mp3 step3/step3_9_reverse.mp3 reverse
```

その他、空間系のreverbやdelayなどたくさんのeffectと細かいオプションが用意されています。

出来た音源はこちら⬇️
https://soundcloud.com/radioboo/sets/step_3-effects/s-3Y1mG

## シンセサイザーとして使う

SoXがすごいと思ったのは、既存の音声ファイルを編集するだけではなく、自分で波形を構築して音声を生成することができる点です。詳しくは日本語訳ドキュメントの```synth```エフェクトの項目を読んでもらいたいですが、以下にいくつかサンプルを作成して今回のリミックスの素材にしてみたいと思います。

まずはシンセサイズする元になる単純な波形（sine/triangle/saw）を作ってみます。
```play```コマンド```synth```エフェクトを指定して簡単に再生できます。


```bash
# 400Hzの正弦波を1秒再生
$ play -n synth 1 sine 400
# 1000Hzのノコギリ波を1秒再生
$ play -n synth 1 saw 1000
# 100Hzの三角波を1秒再生
$ play -n synth 1 saw 100
# 周波数をスイープしながら再生することもできます
$ play -n synth 3 saw 100-800
```

さらに、これらの波形を合成してよりシンセサイザーらしい波形を作ってみます。

```bash
$ sox -n synth.mp3 synth 3 saw 100-3000 synth 3 square fmod 300-1000
```
https://soundcloud.com/radioboo/synth/s-5IgqP

whitenoiseを混ぜることで、なんだか凶暴なノイズミュージックにもなりそうです。

```bash
$ sox -n noise.mp3 synth 100 saw 100-3000 whitenoise synth 100 square fmod 300-1000 norm
```
https://soundcloud.com/radioboo/sound-exchange


## 切り出したトラックをつなげて音楽にする

上記までにできた音源をボリューム調整しながら、ミックス・結合したりフェードイン・フェードアウトを設定することなども可能なので、曲っぽく構成を作ることもできそうです。

が、今回はちょっと時間がなくてそこまできませんでしたので、またの機会にします…。
完全にランダムに、ある音楽をサンプリングした別の音楽を量産したりするみたいなこともできそうです（楽しそう）。

# まとめ

- SoXはちょっとした音声メディアファイルに対する処理を簡単に書くことができる
- 音声にエフェクトをかけて効果的に聴かせることができる
- シンセサイザーのように自分で好きな音を生み出すことができる（ゲームの効果音とかを作るのにも便利そう）

# 参考資料

http://www.hcn.zaq.ne.jp/___/unix/sox-ja.html


# さいごに

明日は @satetsu888 さんが唐突にbitcoinの話を書いてくれると思います！