[Csnd] pvs pitch shift

보낸 사람: “Matt J. Ingalls” <ingalls@mills.edu>
날짜: 2004.08.03, (화), 7:58:39 AM Asia/Seoul
받는 사람: csound@lists.bath.ac.uk
제목: [Csnd] pvs pitch shift
답장 받는 사람:: csound@lists.bath.ac.uk

finally figured out how to do pitch shifting and spectral stretching with pvs streams! [thanks to rwd for pointing me to Stephan Bernsee’s dspdimension.com]

made a user-opcode that does it – see below. on my machine i can only do one channel in real-time, but i bet its fine on newer ones. however still might be worth making a real opcode that does this anyway, so that you dont even have to convert fsig to ftables first.
-m

nchnls = 2

opcode pvshift, 0, kkiiiii

; our input values are:
; kpitch – pitch shift amount [.5=down octave,
; 1=noshift, 2=up octave, etc]
; kstretch – spectral shift amount [ususal range is
; .99-1.01, where 1=nostretch]
; inumbins – number of fft bins [size of tables]
; iampin – table containing amp data
; iampout – table to write modified amp data
; ifreqin – table containing freq data
; ifreqout – table to write modified freq data

kpitch, kstretch, inumbins, iampin, iampout, ifreqin, ifreqout xin

; make sure we start with an empty table
iclear ftgen 0, 0, inumbins, 2, 0
tablecopy iampout, iclear
tablecopy ifreqout, iclear

; perform a do-while loop, cycling through the tables and shifting pitch
kcount = 0
loop:
kindex = kcount/kpitch
if (kindex < inumbins) then
kval table kindex, iampin
kamp table kcount, iampout
tablew kval+kamp, kcount, iampout

kval table kindex, ifreqin
tablew kval*kpitch, kcount, ifreqout
endif

kcount = kcount + 1
kpitch = kpitch * kstretch

if (kcount < inumbins) kgoto loop

endop

instr 2 ; to test the pvshift opcode

; get input and do pvanal
ifftsize = 1024
iNumBins = ifftsize/2 + 1

ainl, ainr ins
fsigl pvsanal ainl, ifftsize, ifftsize/4, ifftsize*2, 0
; [ or alternatively use pvsfread with a pvoc-ex file here ]

; make ftables
iampin ftgen 0,0,iNumBins,2,0
iampout ftgen 0,0,iNumBins,2,0
ifreqin ftgen 0,0,iNumBins,2,0
ifreqout ftgen 0,0,iNumBins,2,0

; our gui controls
kfiltl invalue “filtl”
kfilth invalue “filth”
kpitch invalue “pitch”
kstretch invalue “stretch”

; export fsig to tables
kflag pvsftw fsigl, iampin, ifreqin
if (kflag > 0) then ; only proc when frame is ready

; pitch shift/stretch
pvshift kpitch, kstretch, iNumBins, iampin, iampout, ifreqin, ifreqout

; read modified data back to fsrc
pvsftr fsigl, iampout, ifreqout

endif

; resynthesize and output – compare with untouched right channel
aoutl pvsynth fsigl

outs aoutl, ainr

endin


Send bugs reports to csound-bugs@cs.bath.ac.uk
(or to http://www.cs.bath.ac.uk/cgi-bin/csound )
To unsubscribe, send email to csound-unsubscribe@lists.bath.ac.uk

loscil 사용시 ibas의 설정으로 인한 pitch설정

사운드 파일을 불러들여 작업할 경우에 사운드 파일이 ‘멜로디가 있는’파일이라면 해당이 안되겠지만, 셈플링된 파일 예를들어 특정 frequency를 가진 trumpet의 사운드 파일을 불러들여 사용할 경우에는 이 설정이 심히 중요하다고 보여진다

예를들어 A-0의 frequency를 가진 피아노 소리를 불러들여온다고 하면, HZ는 13.750가 되며, cpspch값은 3.09이다.

loscil에서 amp, kcps, f-number, ibas…
이렇게 값을 줄때에,

ibas값을 1로 준다면, kcps에서 3.09를 주면 3.09만큼 높아진 소리가 난다. 따라서, 1로 주어졌을경우, cpspch의 기본값을 0으로 설정한 후 (즉 최저음이 3.09라 치고 다시 계산하여야 한다.) kcps값으로 음정을 조절하여야 한다.
다시말하면, ibas가 1이면, kcps에서 0으로 주어져야 원래 사운드 파일의 음정을 들을 수 있다.

반대로, Hz값으로 설정하여 ibas에 13.750값을 준다면, kcps에서 원래의 pitch값을 줄 수 있다.
즉 다시말하면 ibas값을 13.750을 주게되면  kcps에서 3.09를 주어야 원래의 사운드 파일의 음정을 들을 수 있다.

sndwarp (Granular systhesis)

ar[,ac]   sndwarp   xamp, xtimewarp, xresample, ifn1, ibeg,\
iwsize, irandw, ioverlap, ifn2, itimemode

-Granular systhesis로 쓰이는데, 이는 즉 사운드 파일을 토막내서 재구성 한다고 생각하면 쉬울것이다. 토막낸 하나의 partial에 fade in/out을 줄수 있다(envelope개념) 그리고, 각각의 조각들을 어떤 시간으로 배치시킬것인가. 그 배치의 형태는 어떠할것인지를 결정한다.

-xamp : amplitude

-xtimewarp : 시간안에 어떻게 input signal 에 수축시키고 늘릴것인지를 결정. 두가지 방법이 있는데 그것은 itimemode에서 주어진 시간에 의존된다.itimemode 가 0일때 , xitimewarp 는 사운드 시간만큼 scale할것이다. 예를들어서  2의 a value값은 2배로 늘려줄것이다. .itimemode 가any non-zero value 이면 xtimewarp 는 a time pointer 고 사용된다.
pitch는 변하지 않는다.

-xresample : 소리의 pitch를 변화하기 위한 요소. 예를들어 2의 값이라면 원래소리보다 옥타브가 높은소리가 나지만 사운드 파일의 시간은 늘어나지 않는다.

-ifn1 : 부를 sound file

-ifn2 : envelope를 걸어주기 위한 ftable

-ibeg : begining point

-irandw : 샘플의 숫자.배치할때 간격을 일정하게 하지 않아도 된다.

-iwsize : window size

-ioverlap – 파샬들을 overlapping할때 어느정도 할것인가를 결정.

EXAMPLE>
iwindfun=1
isampfun=2
ibeg=0
iwindsize=2000
iwindrand=400
ioverlap=10
awarp line 1, p3, 10
aresamp line 1, p3, 2
kenv line 1, p3, .1
asig sndwarp kenv,awarp,aresamp,isampfun,ibeg,iwindsize,iwindrand, \
ioverlap,iwindfun,0
Now, here’s an example using xtimewarp as a time pointer and using stereo:
itimemode = 1
atime line 0, p3, 10
ar1, ar2 sndwarpst kenv, atime, aresamp, sampfun, ibeg, \
iwindsize, iwindrand, ioverlap, \
iwindfun, itimemode