リズムマシンヌ
へぼいドラム
エンベロープと基本波形の組み合わせでドラム音が作れるのでは。
SynthDef("kk", { var e = EnvGen.ar(Env.perc(0, 0.2)); o = SinOsc.ar(e**10*1000+60, 0, e); Out.ar(0, Pan2.ar(o, 0)); }).play;
キックです。アタックのノイズっぽい感じはエンベロープの10乗。底を60Hzにすると胴鳴りのような。
SynthDef("sn", { var e = EnvGen.ar(Env.perc(0, 0.1)); o = LFNoise0.ar(4000, e); Out.ar(0, Pan2.ar(o, 0)); }).play;
SynthDef("hh", { var e = EnvGen.ar(Env.perc(0, 0.1)); o = LFNoise0.ar(4000, e) * SinOsc.ar(5000); Out.ar(0, Pan2.ar(o, 0)); }).play;
上のスネアにサイン波を掛けてリング変調しただけのハット的な何か。
超手抜きー
へぼいパターン
ドラム音ができたので、次は簡単なドラムパターンを組めないかしら。
ここでスコアをガリガリ書く手もなくはないが、Patternというものでパターンを作ることもできる。(変な文章)
まず音源の方を若干手直し
SynthDef("kk", { var e = EnvGen.ar(Env.perc(0, 0.2), doneAction:2); o = SinOsc.ar(e**10*1000+60, 0, e); Out.ar(0, Pan2.ar(o, 0)); }).store; SynthDef("sn", { arg amp; var e = EnvGen.ar(Env.perc(0, 0.1), doneAction:2); o = LFNoise0.ar(4000, e) * amp; Out.ar(0, Pan2.ar(o, 0)); }).store; SynthDef("hh", { var e = EnvGen.ar(Env.perc(0, 0.1), doneAction:2); o = LFNoise0.ar(4000, e) * SinOsc.ar(5000); Out.ar(0, Pan2.ar(o, 0)); }).store;
EnvGenにdoneAction:2というのが混ざりましたが、これは音が鳴り終わるたびにシンセを消すというような意味。
これを入れないと、音出しするたびに楽器が増えるというえらいことになって、お後がよろしくないようだ。
あとスネアにampという引数を足しましたが、これは自分が現状、バックビートというか、オフセットの書き方がよくわからぬゆえ、音量を上げ下げしてバックビートぽく鳴らすというイカサマです。
イカサマでも鳴りゃいいんだよという考えもある。(乱暴)
然る後に下をまとめて実行。
( Tempo.bpm = 180; // BPMは180 a = Pbind( \instrument, \kk, \dur, Pseq([4,1,3],inf) ); // キックのパターン b = Pbind( \instrument, \sn, \dur, Pseq([2,2,2,2],inf), \amp, Pseq([0,1,0,1],inf) ); // スネアのパターン c = Pbind( \instrument, \hh, \dur, 1 ); // ハイハットのパターン p = Ppar([a,b,c]); // パターンを重ねる p.play; // パターンを演奏 )
おー、いきなり見たいことないもんだらけでわかんねえよ。
詳しくはStreamsのヘルプを見よ(超丸投げ)。
ともあれたどたどしい8ビートらしきが鳴りはじめ、非常に感動的です。
たどたどしい…というかヨレヨレである。何だこれは。(注:当方の環境では)
到底これではリアルタイムに演奏するなんて無理な気がしますがー
レイテンシーをいじると良くなるとか諸説ありますが、一向に良くならないので先送り。
このへんwin版ならではかもです。
パターンのレンダリング
レンダリングの方法を考えます。さきほどの
p = Ppar([a,b,c]);
まで実行した後で
q = p.asScore(16); // 16拍分をスコアに変換 q = q.add([16, [\c_set, 0, 0]]); // 末尾にc_setを追加 o = ServerOptions.new.numOutputBusChannels = 1; q.recordNRT("hoge.osc", "hoge.wav", headerFormat: "WAV", sampleFormat: "int16", options: o);
とやると書き出せた。わお。
今度はもはやサンプルレベルで縦が揃っていると思われマーベラス。
ついでにやや音割れ気味。
試しに
Tempo.bpm = 1000;
狂ったようにテンポ速くしても大丈夫です。非実時間処理は素晴らしいなあ。
さてこんな感じで、ドラムにベース足すとかいろいろすれば妙なテクノのごときも作れそうですね。