**pvshift이외에 pv stream 관련 opcode들을 다음에도 몇개 더 소개하겠습니다
pvshift
Description
pv stream 의frequency components가 spectrum을 stretching또는 compressing하면서 이동.
Syntax
fsig pvshift fsigin, kshift, klowest[, ikeepform, igain]
Performance
fsig — pv stream 출력
fsigin — pv stream 입력
kshift — frequency의 이동 량 (Hz, 양수/음수).
klowest — 이동 될frequency의 최하지점
ikeepform — input signal formants를 지속시킴;
0:formants를 지속시키지 않음;
1:원래 amps을 사용하면서 formants 지속
2:원래의 spec envelope을 사용하여0 filtering하면서 formants지속
(기본값: 0).
igain — amplitude scaling (기본값 1).
이 옵코드는 pv stream의 구성요소를 특정 frequency에서부터 일정한 양(Hz)만큼 위아래로 이동시킨다. 이 옵코드는 harmonic spectrum을 inharmonic spectrum으로 전환하는데 사용되면 좋다. ikeepform flag는 가능한 흥미롭고 비범한 spectrum의 변화를 위해 시도되고 formant를 유지하는데 사용할 수 있다.
Examples
Example 288. Example
asig in ; 이 부분에 시그널을 넣는다.
fsig pvsanal asig, 1024, 256, 1024, 1 ; 시그널 분석
ftps pvshift fsig, 100, 0 ; 각 성분에 100 Hz를 더함
atps pvsynth ftps ; 합성
입력 시그널에 따라서 음정있는 소리가 inharmonic하게 변경될 수 있다.(벨소리와 같은)
———————————————————————————–
다음은 Matt J. Ingalls이 만든 pvs streams을 사용한 pitch shift예제 입니다.
다음은 채널 하나를 real time으로 사용하였음.
-m
nchnls = 2
opcode pvshift, 0, kkiiiii
; 입력값은 다음과 같다:
; kpitch – pitch shift 의 양[.5=한 옥타브 내림 1=이동없음, 2=옥타브 올림, etc]
; kstretch – spectral shift의 양 [일반적으로; .99-1.01, 1=no stretch]
; inumbins – fft bins의 수 [table의 size]
; iampin – amp data를 포함하고있는 table
; iampout – 수정된 amp data를 쓸 table
; ifreqin – freq data를 포함하는 table
; ifreqout – 수정된freq data 를 쓸 table
kpitch, kstretch, inumbins, iampin, iampout, ifreqin, ifreqout xin
; 반드시 빈 table로 시작해야 한다
iclear ftgen 0, 0, inumbins, 2, 0
tablecopy iampout, iclear
tablecopy ifreqout, iclear
; do-while loop, table들과 이동하는 pitch의 순환(cycling)
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 ; pvshift opcode 의 test
; 입력을 넣고 pv anal 을 실행
ifftsize = 1024
iNumBins = ifftsize/2 + 1
ainl, ainr ins
fsigl pvsanal ainl, ifftsize, ifftsize/4, ifftsize*2, 0
; [ 또는 pvoc-ex file와 함께 pvsfread를 대신 사용할수있음 ]
; 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
; gui controls
kfiltl invalue “filtl”
kfilth invalue “filth”
kpitch invalue “pitch”
kstretch invalue “stretch”
; fsig 를 tables로 내보냄
kflag pvsftw fsigl, iampin, ifreqin
if (kflag > 0) then ; frame이 준비되었을때만
; pitch shift/stretch
pvshift kpitch, kstretch, iNumBins, iampin, iampout, ifreqin, ifreqout
; 다시 fsrc로 수정된 data를 읽는다read modified data back to fsrc
pvsftr fsigl, iampout, ifreqout
endif
; 재합성, 출력 – 건드리지 않은 오른쪽 채널과 비교
aoutl pvsynth fsigl
outs aoutl, ainr
endin