<info>
Transposer with amplitude and frequency modulation

Jean Piche, 1996-2000
</info>
<tk_interface>
cgraph 		transpose 			-label "Transposition\nFactor" -rel log -min 0.1 -max 10 -init 1
csepar
csepar -label "ring\nmodulation"
cgraph 		ampmodran 			-label "Range" -rel lin -min 0 -max 1 -init .5 
cgraph 		ampmodfreq  			-label "Freq" -unit Hz -rel log -min 0.001 -max 2000 -init 5 
csepar
csepar -label "frequency\nmodulation"
cgraph 		freqmoddepth 	 		-label "Range" -rel lin   -min 0 -max 1 -init .5  
cgraph 		freqmodfreq 			-label "Frequency"  -unit Hz -rel log -min 0.001 -max 2000 -init 5 
csepar
cgraph 		gain 			-label Gain -unit x -rel log -min .05 -max 20  -init 1 
ctoggle 		modamp  			-label "Amp modulation"
ctoggle 		modfreq 			-label "Freq modulation"
ctoggle 		antialias 			-label "Anti-alias filter"
ctoggle 		loop 			-label "Loop sound" -init 1
cfilein 		source 			-label "Source sound"
cslider  		total_time 			-label "Total duration" -max 500 -in 30 -min 1
cslider 		xtrans 			-label "Transpose" -ra k -u semitones -rel lin -ori h -res 1 -min -48 -c lightpink1 -max 48 -init 0
cslider 		xfine 			-label "Fine Tune" -ra k -u % -rel lin -ori h -res .1 -min -100 -c lightpink1 -max 100 -init 0
cslider 		ori 			-label "Original Level" -ra k -u x -rel lin -ori h -res .1 -min 0 -c lightpink1 -max 2 -init 0
</tk_interface>
<mono>
instr	1   

kiamp	=	gkmodamp  
kifreq 	= 	gkmodfreq
kialias 	= 	gkantialias
ktrans	= 	gktranspose
irap	=	i(gkxtrans)
ifin	=	i(gkxfine)*.0001
inot	=	abs(   (irap%12 *0.01)+ifin )         
iorg	=	int(irap/12)+inot 
ioct	=	cpspch(6+iorg   )
itra	=	ioct /cpspch(6.00)    
print	iorg     
ktrsum	= 	ktrans*itra *[sinfo source sr]/sr  
iloop	= 	i(gkloop)  



amplitude:
amp = 1
if (kiamp == 0) goto frequency
amp		oscili		gkampmodran, 	gkampmodfreq, 	11

frequency:
kpit = 0
if (kifreq == 0) goto ok
kpit		oscili		gkfreqmoddepth, gkfreqmodfreq , 11

ok:
ag0		diskin		"[source]" , 1 , [offsource], iloop 
ag 		diskin		"[source]" , (1+kpit)*ktrsum , [offsource], iloop 

ag 		= 	ag*gkgain*(amp)
if (kialias == 0)		goto noaalias
kalias		=	sr * ktrsum * 0.4
if (ktrsum >= 1) 				goto noaalias

aliasg1		butterlp		ag, kalias
aliasg2		butterlp		aliasg1, kalias
aliasg3		butterlp		aliasg2, kalias
ag		butterlp		aliasg3, kalias
noaalias:
	 	out 		ag+(ag0*gkori)
		endin
</mono>
<stereo>
instr	1   

kiamp	=	gkmodamp  
kifreq 	= 	gkmodfreq
kialias 	= 	gkantialias
ktrans	= 	gktranspose
irap	=	i(gkxtrans)
ifini	=	i(gkxfine)*.01
ifin	pow 	2,ifini/12  

ipin	=	irap+46   
itra	table	ipin, 13            
ktrsum	= 	ktrans*ifin*itra *[sinfo source sr]/sr   
iloop	= 	i(gkloop)  



amplitude:
amp = 1
amp2=1 
if (kiamp == 0) goto frequency
amp		oscili		gkampmodran, 	gkampmodfreq, 	11
amp2 = -amp

frequency:
kpit = 0
if (kifreq == 0) goto ok
kpit		oscili		gkfreqmoddepth, gkfreqmodfreq , 11

ok:
ag0, ad0 		diskin		"[source]" , 1 , [offsource], iloop 
ag, ad 		diskin		"[source]" , (1+kpit)*ktrsum , [offsource], iloop 

ad 		= 	ad*gkgain*(amp)
ag 		= 	ag*gkgain*(amp2)
if (kialias == 0)		goto noaalias
kalias		=	sr * ktrsum * .4      
if (ktrsum >= 1) 				goto noaalias
 display	kalias, .1  

aliasd1		butterlp		ad, kalias
aliasg1		butterlp		ag, kalias
aliasd2		butterlp		aliasd1, kalias
aliasg2		butterlp		aliasg1, kalias
aliasd3		butterlp		aliasd2, kalias
aliasg3		butterlp		aliasg2, kalias
ag		butterlp		aliasg3, kalias
ad		butterlp		aliasd3, kalias
noaalias:
;display	ktrsum, .5  
	 	outs 		ag+(ag0*gkori), ad		+(ad0*gkori)
										 endin
</stereo>
<quad>
; quad template

			instr 1
	

	outq 	a1, a2, a3, a4
			endin
</quad>
<score>
f11 0 8192 10 1
f13	0	128 	-2      0.070     0.074     0.079     0.083     0.088     0.094     0.099     0.105     0.111    0.118     0.125     0.132     0.140     0.149     0.157     0.167     0.177     0.187     0.198     0.210     0.223     0.236     0.250     0.265     0.281     0.297     0.315     0.334     0.354     0.375    0.397   0.420     0.445     0.472     0.500     0.530     0.561     0.595     0.630     0.667     0.707     0.749     0.794     0.841     0.891     0.944     1.000     1.059     1.122     1.189     1.260     1.335    1.414     1.498     1.587     1.682     1.782     1.888     2.000     2.119     2.245     2.378     2.520     2.670     2.828     2.996     3.175     3.363     3.563     3.775     4.000     4.238     4.490     4.757    5.039     5.339     5.656     5.993     6.349     6.727     7.127     7.551     8.000     8.475     8.979     9.514       10.079     10.678     11.314     11.986     12.699     13.453     14.254     15.102     16.000     
i1 0 [total_time]
e
</score>
