いらないモノ、ひつようなモノ

書籍、音楽、そして若干のテクノロジー

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」ではじめる