Wolfram Cloudでのファイル出力


目次

まえがき

昨年度の授業でMathematicaもしくはWolfram Cloudを利用し、音声ファイルやGIFファイルを作成して提出する課題がありました。

Mathematicaは演習室のPCにインストールされており、ライセンス数の関係で授業の際に受講者全員が同時には使用できないため、半分ずつ交代制で使用するか、Wolfram Cloudを各自が利用するという方法を取っていました。

課題としては最終的にファイルを提出する必要があるので、Wolfram CloudでMathematicaのファイル出力コマンドを試すことにしたのですが、音声の生成はできてもそれをファイルとして取り出すことに難儀しました。

僕は根性でたどり着きましたが、他の受講者は諦めてMathematicaから出力していたように思います。

英語で色々な語句を組み合わせながら検索してコマンドを探すのは課題の本質ではないので、今後同じような人の役に立つようにメモを残しておきます。

Wolfram CloudでWAVファイルを作成する

まずはサウンドを作成します。

Sound[{
  Play[Sin[440 2 Pi t], {t, 0, 1}],
  Play[Sin[0 t], {t, 0, 0.5}],
  Play[Sin[440 2 Pi t], {t, 0, 1}]
}]
中央イ(A)の正弦波(440Hz)

Shift+Enterか、セルの右上歯車マークからEvaluate Cellをクリックすることで処理が実行されます。

Image in a image block
実物は左下のボタンをクリックすると音声が再生される

上の画像が生成される音です。今度はこれをファイルとして保存します。

output = Sound[{
  Play[Sin[440 2 Pi t], {t, 0, 1}],
  Play[Sin[0 t], {t, 0, 0.5}],
  Play[Sin[440 2 Pi t], {t, 0, 1}]
}]
CloudExport[output, "WAV", "example.wav"]

これを実行すれば、生成した音がWAVファイルとしてWolfram CloudのMy Filesに出力されます。その後はダウンロードするだけです。

"example.wav"にフォルダのパスを書き加え、"Exports/example.wav”というようにすると、My FilesのExportsフォルダに出力されるようになります。

コマンド解説

まず、初期状態では扱いが面倒なので変数に格納します。

output = Sound[{
  Play[Sin[440 2 Pi t], {t, 0, 1}],
  Play[Sin[0 t], {t, 0, 0.5}],
  Play[Sin[440 2 Pi t], {t, 0, 1}]
}]

そして、変数をCloudObjectとしてExportします。ここでファイル名と拡張子を指定します。

CloudExport[output, "WAV", "example.wav"]

CloudExport関数は、CloudObject関数とExport関数の組み合わせと同じ結果になります。(僕がたどり着いた方法は組み合わせの方でした。)

Export[CloudObject["example.wav"], output, "WAV"]

CloudExport[output, "WAV", "example.wav"]
同じことをしてる

Wolfram CloudでMP3ファイルを作成する

WAVファイルの場合とほぼ同じです。異なる点は、指定する拡張子とファイル名の拡張子です。

CloudExport[output, "MP3", "example.mp3"]

これでMP3ファイルになります。

Wolfram CloudでGIFファイルを作成する

まずはアニメーションを作成します。

Animate[Plot[Sin[x + phase], {x, 0, 4 Pi}], {phase, 0, 2 Pi}]

ここでは正弦波が流れていくアニメーションを作りました。

Image in a image block

Animate関数からGIFへの変換は不都合がある(順再生後に逆再生してまた順再生というループになる)ため、Table関数で複数枚の静止画として切り出します。

Animate関数の中身をそのままTable関数に移し替え、変数を使ってListAnimate関数で繋げると、先程と同じアニメーションになります。

plots = Table[Plot[Sin[x + phase], {x, 0, 4 Pi}], {phase, 0, 2 Pi}]
ListAnimate[plots]
Image in a image block

このとき、Table関数の結果として複数の静止画が出力されますが、これは処理の負荷を大きくするため、

plots = Table[Plot[Sin[x + phase], {x, 0, 4 Pi}], {phase, 0, 2 Pi}];

というように、末尾にセミコロンをつけることで、不要な結果の表示を省略します。

変数plotsは複数の静止画で、これらを繋げるとアニメーションが作れます。

plots = Table[Plot[Sin[x + phase], {x, 0, 4 Pi}], {phase, 0, 2 Pi}];
ListAnimate[plots]
CloudExport[plots, "GIF","example.gif" ]
Image in a image block
Image in a image block

GIFを滑らかにする

GIFのアニメーションを滑らかにするには単位時間あたりの静止画を増加させる必要があります。

{phase, 0, 2 Pi}の部分を{phase, 0, 2 Pi, 0.1}とすれば、4つめの引数である0.1刻みで静止画が作られます(つまり静止画が大量に生成されて処理が重くなるので末尾のセミコロンがついているか確認必須)。

plots = Table[Plot[Sin[x + phase], {x, 0, 4 Pi}], {phase, 0, 2 Pi, 0.1}];
ListAnimate[plots]
CloudExport[plots, "GIF","example.gif" ]

フレームレートを変更していないためコマが増えた分だけゆっくりになっていますが、かなり滑らかなGIFになりました。

Image in a image block

3DグラフィックスをGIF出力

方法は同じです。

3次元の関数部分:https://reference.wolfram.com/language/tutorial/IntroductionToManipulate.html#21221623

plots = Table[Plot3D[Sin[n x y], {x, 0, 3}, {y, 0, 3}], {n, 1, 5, 0.1}];
ListAnimate[plots];
CloudExport[plots, "GIF","example.gif"]
Image in a image block