diskin2を使ってみる。
本当はサンプラにしたかった。が、まずはdiskin2を使ってみる。結論はあんまり期待しないほうがいいと思う。ちょっと考えたが、あるポイントからあるポイントまでループとか難しそう。
まずは、発音させるとp3の音の長さを無視して最後までサンプルを再生する楽器を作る。この楽器はデバッグ用にサンプルの長さも表示する。かつ、エフェクトを書けるつもりでマルチタップのエコーをかけて再生(マルチタップ大好き)。
<CsoundSynthesizer> <CsOptions> -d -W -o samplePlay.wav </CsOptions> <CsInstruments> sr = 44100 ksmps = 1 nchnls = 2 gatap init 0 ;エフェクタ用 #include "userDefinedOpcode/multiTapOnBeat.udo" instr 1 imod = p4 Sfile = p5 ; ここでサンプルファイルをパラメータに読み込む iskptm = 0 ;サンプルでスキップする頭の秒数 iwarp = 0 ;ループ iformat = 6 ; 32bit float iwsize = 32 ; interpolation window size ilen filelen Sfile ;ファイルの長さを取得 print ilen ;サンプルの長さをコンパイル時に表示する。 p3=ilen ;発音長のp3パラメータを強制的にサンプルの長さにする。 kpitch linseg 1, 4, imod ;1倍(すなわち音程を変えない)から4秒の間にimodへ変化するピッチ ain diskin2 Sfile, kpitch, iskptm,iwarp,iformat,iwsize ar = ain al = ain outs al, ar gatap = gatap+al ;エフェクタ、左チャネルだけ、本当は両方のチャネルにするべき。手抜き endin ;; effector - multitap instr 100 atmp multiTapOnBeat gatap, 120, 8, 0.6 outs atmp, atmp gatap = 0 endin </CsInstruments> <CsScore> i100 0 5 ;エフェクタ i1 0 0.1 -4 "sample.WAV" ;発音長は0.1でも楽器内でサンプル長の発音に強制しているのでOK i1 1 0.1 2.0 "sample.WAV" i1 2 0.1 8.0 "sample.WAV" e </CsScore> </CsoundSynthesizer>
適当なsample.WAVを環境変数SSDIRで指定したサンプル用ディレクトに入れておく。ファイルが2チャンネルだったら、
ain1, ain2 disikin2 Sfile, kpitch, iskptm, iwarp, iformat, iwsize
などとする。ファイルが32bit floatでないなら、マニュアルを見てiformatの値を変更すべき。srの値は書き出す時の値なので(あまり)関係ない。audacityでフォーマットを見たり、変更したりしても良いだろう。
soundin, diskinというopcodeがあるが、ピッチを変更できるのはdiskin2のみである。
filesrと言うコマンドでファイルのサンプルレートを返したり、filenchnlsでチャネル数を返すが、フォーマットを返すopcodeはないようだ。
文字列のパラメータは「S」ではじめる