14.SpuerColliderの出音を録音する
SuperColliderの出音を録音したい場合があります。
録音の方法やファイルフォーマットの設定の仕方について書きます。
録音の仕方は(僕の知っている限りでは)3種類ありますので、順に説明していきます。
1.メニューからStartRecoidingを選択する
2.レコーディングボタンを押す
3.コードを実行する
1.メニューからStartRecoidingを選択する
読んだままの手順です。
Serverメニューから「StartRecording」を選択した瞬間からレコーディングが始まります。
レコーディング中はSC3の右下に、赤い「R」マークが表示されます。
目的の音を鳴らしたり、Pbindをplayしたりすると、それがそのままレコーディングされます。
レコーディングを止めるには、command+.(コマンド&ピリオド)です。
レコーディングを止めると録音されたファイルが生成されます。
ファイルの場所はPost windowに表示されます。
デフォルトだと(macの場合)ミュージックフォルダの下に「SuperCollider Recordings」というフォルダが自動で作られて、そこにaiffファイルが生成されます。
wavに変更する方法は、後で書きます。
2.レコーディングボタンを押す
s.makeWindow;
このコードを実行すると小さなウィンドウが現れます。
ウィンドウ内の右肩にrecord>というボタンがありますので、それを押すと、その瞬間からレコーディングが始まります。
レコーディング中は同じボタンがstop[]という表示に変わります。これを押すとレコーディングを止めることができます。
3.コードで書く
s.record;
このコードを実行した瞬間からレコーディングが始まります。
レコーディングを止めるには、次のコードを実行します。
s.stopRecording;
recordメソッドでは、レコーディングの長さの指定もできます。単位は秒です。
s.record(duration:3.0);
さらに、コードで書く便利な点は、以下のようなことができることです。
(
s.record(duration:3.0);
{SinOsc.ar(220, 0, 0.3)!2}.play;
)
こうするとレコーディングが始まると同時にサイン波が鳴り、3秒後にレコーディングを終えます。(音を止めるにはコマンド&ピリオドが必要です。)
同じようなことをPbindに仕込むこともできます。
(
SynthDef(\tone1, {
arg freq=220, gate=1;
var sig, env;
env = EnvGen.kr(Env.asr(0.01, 1.0, 0.05), gate, doneAction:2);
sig = Pulse.ar([freq, freq*2]);
Out.ar(0, sig * env);
}).add;
s.record(duration:3);
Pbind(
\instrument, \tone1,
\midinote, Pseq([38, 36, 38, 45, 50, 45, 24, 36], inf),
\dur, 0.5,
\sustain, 0.2
).play(TempoClock(140/60));
)
※上記コードのようにすると実行するたびにレコーディングされてしまうので、レコーディングの必要がない場合(ただ再生して聴きたい場合)は、s.record;の行をコメントアウトするのを忘れずに。
レコーディングファイルのフォーマットなど変更方法
レコーディングファイルの各種フォーマットの変更方法です。
レコーディングを行なう前に下記を実行しておくと、次のレコーディングから反映されます。
・書き出すファイルを.aiffではなく.wavにする。
s.recHeaderFormat = "wav";
・書き出すファイルのビットレートの指定。(下記では24bitに指定)
s.recSampleFormat = "int24";
もしレコーディングファイルをDAWなどに読み込ませた時に"ファイルを開けない"などのエラーになる場合、この値が(デフォルトで?)32bitになっている可能性があります。32bitに対応していないDAWもあると思いますので、ここの値には気を配っておくのがよいと思います。
ちなみに、レコーディングファイルのサンプリングレートは、サーバ起動時のレートに準じます。
変更する場合は、下記を実行してサーバをリブートします(Serverメニューから選択)。
s.options.sampleRate = 44100;
又は
s.options.sampleRate = 48000;
など希望する数字に。
・書き出すファイルのチャンネル数指定。
s.recChannels = 1;
デフォルトでは2になっていて、ステレオファイルで録音されます。
モノラルファイルにしたい場合は、上記を実行したあとにレコーディングを行います。
左チャンネル(output0)だけが録音されます。
・書き出すファイルパスの指定。
書き出すファイルのパスを変更したい場合、.recordの引数(パラメータ)として、pathを設定します。
(
s.record(path:"/Users/kuri/Desktop/test/rec_test.aiff", duration:3);
{SinOsc.ar(440, 0, 0.3)}.play;
)
// kuriの部分はご自身の環境に合わせて変更をお願いします。
// パスを書くには、希望するディレクトリにrec_test.aiffを作成してSC3エディタ上に
// ドラッグ&ドロップすることで入力されます。
*パス変更時の注意点1
上記のようにファイル名(rec_test.aiff)まで含めたパスを書く必要があります。
*パス変更時の注意点2
同じコードで再びレコーディングを行うと、rec_test.aiffを上書きしてしまいます。
書き出したファイルをキープしておきたい場合(上書き更新したくない場合)は、あらためてファイル名をつけなおしてコードを実行します。
(下記の例のようにrec_test2.aiffにするなど。)
(
s.record(path:"/Users/kuri/Desktop/test/rec_test2.aiff", duration:3);
{SinOsc.ar(440, 0, 0.3)}.play;
)
デフォルトのパスでレコーディングを行った場合は、ファイル名に自動的に日時が付くので、レコーディングするたびに新しいファイルが生成されます。(上書きされない。)
メソッドのヘルプページを参照する
ところで、SC3を使用中にヘルプを参照したい場合、調べたいワードの上にカーソルを置いた状態でcommand+dしますよね。
これまでこのnoteの記事でもいくつかのクラスをcommand+dで調べてきましたが、recordのようなメソッドについても同じようにヘルプウィンドウで調べることができます。
ただ、クラスの場合command+dをするとそのクラスのヘルプ画面に直接飛んでくれるのに対して、メソッドの場合は目的のヘルプページに行くのに一手間かかるんです。
例えば
s.record;
このrecord上にカーソルを置いてcommand+dするとヘルプウィンドウが下記のような表示になります。
これは「何に対する.recordなの?」と聞かれています。
SC3では「メソッドは、.(ドット)の前にあるものに対して指示を出す」という構造になっていますが
(※「02.コードのつくり」の回を参照ください。)
同じメソッド名でも「何に対して指示しているメソッドか」によって、メソッドが持つ引数(パラメータ)が変化するので、こういうふうに聞かれるわけです。
一番わかりやすい例が
.ar
です。
.arは(オーディオレートの信号を生成せよ)というメソッドですが、同じ.arというメソッドでもドットの前にあるクラスによってそのパラメータが変わってきます。
SinOsc.ar(freq: 440.0, phase: 0.0, mul: 1.0, add: 0.0)
Saw.ar(freq: 440.0, mul: 1.0, add: 0.0)
Pulse.ar(freq: 440.0, width: 0.5, mul: 1.0, add: 0.0)
Line.ar(start: 0.0, end: 1.0, dur: 1.0, mul: 1.0, add: 0.0, doneAction: 0)
なので.arを調べようとcommand+dをすると、「何に対して指示しているarメソッドなの?」ということで、おびただしい数のヘルプ候補が出てきます。
話をもどしまして、つまり
s.record;
のコードはs(サーバ)に対して「録音せよ」と指示しているので、このrecordを調べたい場合、(先ほどのヘルプウィンドウの"選択画面"にて)Serverをクリックすると目的のヘルプにたどり着くことができます。
こういうわけで、おなじみの.playや.scopeや.plotなども、command+dで調べようとすると「何に対する指示なのか」ということを聞かれます。
その答えはドットの直前を見れば一目瞭然なのですが、はっきりしない場合もあります。
僕はそんなとき、「これかな?」と思うものを複数クリックしてみて、どちらか適していそうなほうを読んだり、両方とも実験したりしながら調べていきます。
参考に、これまでこのnoteで出てきたメソッドを調べる場合の例を書いておきます。
UGen(ユニットジェネレータ)という新しいワードが出てきますので先に説明しておきます。
UGenは、オーディオを生成したり処理したりするクラスの総称です。
なのでSynthDef内で使うものであれば大抵のものはUGenに分類されます。
逆にUGenではないクラスはPbindとかPfxとか、TempoClockとか、シーケンスさせる側で使っているものです。
では、これまでこのnoteで出てきたメソッドを調べる場合の参考例です。
.play
「01.基本的なこと色々」の回より。
{ SinOsc.ar(220, 0, 0.3)!2 }.play;
{波カッコ}はfunction(関数)です。なのでこのコードは、{function}に対してplayするように指示しているので、playをcommand+dしたあとにFunctionを選択します。
いろいろと難しそうなことも書かれていますが、.playの引数(パラメータ)の中にfadeTimeをいうのを見つけることができます。これは再生するときのフェードインタイムではないでしょうか。実験してみます。
{ SinOsc.ar(220, 0, 0.3)!2 }.play(fadeTime: 3.0);
やっぱりそうでした。
という感じで、ひとつplayについて知ることができました。
「02.コードのつくり」の回の.scopeや.plotもFunctionに対する指示です。
command+dしてFunctionを選択すると、.scopeにはnumChannelsという引数、.plotにはdurationやminval, maxvalという引数があることがわかります。minvalとmaxvalはプロットしたときの縦の目盛り、durationは横の目盛り尺を設定できるものです。ぜひ実験してみてください。
.dup
「03.フィルター」の回より
{ Saw.ar(220, 0.3).dup(2) }.plot;
これはSaw.ar(220, 0.3)に対して指示しているわけですが(function内にあるのでfunctionに対して指示しているのではない)、、command+dしたときにクリックすべき箇所は、Objectです。
SC3では、クラスも数字も文字列も、全部Objectと呼ばれます。
Objectの中に種類があって、
クラスというObject、
数字というObject、
文字列というObject、という感じです。
ヘルプウィンドウに他にあたはまるものがないので、Objectで。
これで求めるヘルプ画面にたどり着けます。
.new、.add
「07.作った音色をシーケンスする:前編」の回より
SynthDef.new(\synth1,{Out.ar(0, Saw.ar(220, 0.3)!2)}).add;
.new、.add、どちらもSynthDefを選択することでヘルプ画面にたどり着けます。
Synth.new(\synth1);
この.newはSynthを選択することでヘルプ画面にたどり着けます。
.value
{a=5; b=2; a+b;}.value;
この.valueはFunctionを選択することでヘルプ画面にたどり着けます。
.new、.play
「08.作った音色をシーケンスする:後編」の回より
(
Pbind.new(
\instrument, \synth1,
\note, 0,
\dur, 1
).play;
)この.newはPbindを選択することでヘルプ画面にたどり着けます。
.playはPatternを選択、です。(大文字のPで始まっているものはPatternファミリーなので、こんなふうにPatternという呼び名でひとくくりになっていることがあります。)
.midicps
60.midicps;
この.midicpsはSimpleNumberを選択することでヘルプ画面にたどり着けます。
.read、.play
「11.SuperColliderでオーディオファイル(wav/aiff)を鳴らす」の回より
a = Buffer.read(s, "/Users/kuri/Desktop/samples/rythm01.wav");
a.play;
この.readも.playもBufferを選択することでヘルプ画面にたどり着けます。
a.play(true)とすることで、ループ再生しますし
a.play(true, 0.5)などとすることで、サンプルのボリュームをコントロールできることがわかります。
「13.SuperColliderでモジュレーション」の回より
.poll
(
SynthDef(\pitch_mod2, {
var sig, freq=440, amp=0.3, mod;
mod = SinOsc.ar(1, 0, 10);
sig = SinOsc.ar(freq + mod.poll);
Out.ar(0, sig!2 * amp)
}).play;
)
この.pollはUGenを選択することでヘルプ画面にたどり着けます。
trigの値を変えると1秒間に出力する間隔を変更できることがわかります。
.lag
(
SynthDef(\amp_mod1, {
var sig, freq=440, amp=0.3, mod, env;
env = EnvGen.kr(Env.perc(0.01, 2.0), doneAction:2);
mod = LFPulse.ar(8).lag(0.05);
sig = SinOsc.ar(freq);
Out.ar(0, sig!2 * amp * mod * env)
}).play;
)
この.lagはUGenを選択することでヘルプ画面にたどり着けます。
.neg
{LFSaw.ar(1).neg}.plot(2);
この.negはどれを選べばいいか難しいです。UGenという選択肢があれば嬉しいのですがAbstractFunctionが正解だと思います。
ただ、どれを選択しても詳しい説明が書いてあるわけではないですね。
.negは対象をネガティブ(負の数)にします。
今日はこんなところで終わります。
次回は、僕がこれまで参考にしたSC3に関する情報ページ(日本語)について書きたいと考えています。
今日のまとめ
・レコーディングの方法は以下の3種類
1.メニューからStartRecoidingを選択する
2.レコーディングボタンを押す
3.コードを実行する
・レコーディングされたファイルのパスはPost windowに表示される。
・レコーディングするファイルフォーマットも変更可能。
・.recordの引数でファイルのパスを設定した場合、レコーディングするたびにそのファイルが上書き更新されるので注意。
・同じ名前のメソッドでも、何に対して指示するメソッドかによって、そのメソッドが持つ引数(パラメータ)が違う
<目次>にも今回のリンクを作っておきます。https://note.com/sc3/n/nb08177c4c01
この記事が気に入ったらサポートをしてみませんか?