音の鳴るブログ

鳴らないこともある

今日からはじめる CLI 音楽入門 1

コマンドラインからピロピロ鳴らせると良い。バックグラウンドにあったりして見えないターミナルの状態を音を聴くことで判断できるかもしれないし、判断できなかったとしても単純に音が鳴ると楽しい。

そこで、この記事では Mac/Linuxコマンドラインから音を出すための方法について説明します。ただし、Windows については調査不足のため言及しません。

play コマンドをインストールする

sox という音をあれこれするためのツールがあります。 ffmpeg の音声ファイル限定版みたいなものですが、これをインストールすれば play という再生コマンドがついてくるのでこれを利用します。

Linux を使っていて ALSA aplay コマンドがある場合は sox はなくても構いません。

ReadMe を聴いてみる

では、さっそく適当なファイルから音を生成して聞いてみます。サブディレクトリに README.md が大量に見つかりそうなディレクトリに移動して以下のコマンドを実行します。耳に悪い音がする可能性があるので、念のためにイヤホンではなくボリュームをしぼったスピーカーで聞くほうが良いかと思います。

find . -name "README.md" | xargs cat | play -t u8 -c 1 -r 4000 -

おそらくローパスフィルタのかかったホワイトノイズのような音が聞こえたと思います。これが基本の形です。

それぞれのコマンドの説明はしませんが find から cat までで、カレントディレクトリ以下の README.md の内容を結合して出力、それを u8 (unsinged char) の音声信号として play コマンドで再生しています。

play コマンドのオプションは以下の通り。

  • -t : データの形式 (今回は unsigned char)
  • -c : チャンネル数 (今回はモノラル)
  • -r : サンプルレート (今回は 4000Hz)
  • - : stdin から入力する

もし Linux ユーザで ALSA aplay コマンドを使いたいなら、こう書きます。( -t を -f とすれば良いです )

find . -name "README.md " | xargs cat | aplay -f u8 -c 1 -r 4000

KEN_ALL.CSV を聴いてみる

さて、最初の例ではあまり面白みがなかったので、もう少しマシなデータを試してみましょう。 KEN_ALL.CSV という日本郵便が配布している郵便番号データがあります。量も多いしデータの特徴的にも都合が良いので、このデータを使ってみましょう。 「読み仮名データの促音・拗音を小書きで表記するもの - 全国一括」のデータをダウンロードします。

解凍して以下のコマンドを実行します。

cat KEN_ALL.CSV | play -t u8 -c 1 -r 4000 -

最初の例と比べるとうっすら何かが聞こえてきます。いけそうな感触があるとテンション上がりますよね。 ですが、まだまだいまいちなので、もうちょっと工夫して5列目のデータを取り出して聴きいてみます。

cat KEN_ALL.CSV | awk -F , '{print $5}' | play -t u8 -c 1 -r 4000 -

かなり音楽っぽいものが聴こえてきたと思います。なぜこうなるのかは説明しづらいですが、同じデータが繰り返されるとそれが周期となって音程感が出るとかそういうやつです。一番最初の ReadMe だとほぼランダムに文字が出てくるのでパターンがみられずホワイトノイズっぽくなり、KEN_ALL.CSV だとある程度パターンがあるので何かが聴こえる感じ、KEN_ALL.CSV の5列目は市区町村の項目なのでよりパターンが強調されてメロディーが聴こえる。

データがどうなっているのか目視したい場合は head とかを使えば良いです。(KEN_ALL.CSVShift_JIS なので nkfUTF-8 に変換しています)

cat KEN_ALL.CSV | nkf | awk -F , '{print $5}' | head
"サッポロシチュウオウク"
"サッポロシチュウオウク"
"サッポロシチュウオウク"
"サッポロシチュウオウク"
"サッポロシチュウオウク"
"サッポロシチュウオウク"
"サッポロシチュウオウク"
"サッポロシチュウオウク"
"サッポロシチュウオウク"
"サッポロシチュウオウク"

この「"サッポロシチュウオウク"」が 15bytes くらいあるので、その繰り返しが 4000Hz / 15 = 266Hz くらいの音程となり、市区町村の大きさに応じて持続時間が変化しているわけです。

ちなみに6列目なんかはそのまま聴いても面白くないですが、grep コマンドを経由させると非常に緊張感のある良いサウンドが聴けたりします。以下の例では各階に郵便番号がふってあるような高層ビルの名前から音を生成しています。

cat KEN_ALL.CSV | nkf | grep '[0-9]カイ' | awk -F , '{print $6}' | play -t u8 -c 1 -r 4000 -

このあたりは色々試行錯誤してみると面白いのではないでしょうか?

とりあえず今回はここまで。次回はプログラムを書いて好きな音を出してみます。