/************************************************** * EDexplorer.csd (Hudson Lacerda - 2006) * * A simple CSound program to explore scales based on equal divisions * of octave (or pseudo-octave), using Bill Sethares' concept of * ``induced spectra'' to relate timbre and scale. * * See: * * Hudson Lacerda * * **************************************************/ -g -M 0 -d -odevaudio --sched -+rtaudio=alsa ;******************************* sr=44100 kr=2205 ksmps=20 nchnls=1 ih1=-1 ih2=-1 ih3=-1 ih5=-1 FLpanel "Equal Divisions Explorer",380,500,50,50 ;***** start of container itypea = 5 itypeb = 1 gk1, giha FLslider "FLslider 1 - Number of Divisions ", 2, 100, 0 ,itypea, ih1, 260,15, 20,50 gk2, gihb FLtext "FLtext 1", 2, 100, 1, itypeb, 60, 15, 300, 50 gk3, gihc FLslider "FLslider 2 - Octave for timbre", 1.5, 3, 0 ,itypea, ih3, 260,15, 20,100 gk4, gihd FLtext "FLtext 2", 1.5, 3, 0.000001, itypeb, 60, 15, 300, 100 gk5, gihe FLslider "FLslider 3 - Octave for pitches", 1.5, 3, 0, itypea, ih5, 260, 15, 20, 150 gk6, gihf FLtext "FLtext 3", 1.5, 3, 0.000001, itypeb, 60, 15, 300, 150 gk7, gihg FLslider "FLslider 4 - Frequency for pitch 69", 100, 2000, 0, itypea, ih5, 260, 15, 20, 200 gk8, gihh FLtext "FLtext 4", 100, 2000, 0.1, itypeb, 60, 15, 300, 200 gk9,gihi FLslider "FLslider 5 - Amplitude factor for partials", 0.1, 1.0, 0, itypea, ih5, 260, 15, 20, 250 gk10, gihj FLtext "FLtext 5", 0.1, 1.0, 0.01, itypeb, 60, 15, 300, 250 gk11, gihk FLslider "FLslider 6 - Amplitude (Volume)", 0, 32000, 0, itypea, ih5, 260, 15, 20, 300 gk12, gihl FLtext "FLtext 6", 0, 32000, 1.0, itypeb, 60, 15, 300, 300 gk13, gihm FLslider "FLslider 7 - Number of partials", 1, 11, 0, itypea, ih5, 260, 15, 20, 350 gk14, gihn FLtext "FLtext 7", 1, 11, 1.0, itypeb, 60, 15, 300, 350 ibtype = 2 gkquantize, iquantize FLbutton "Button 1 - Quantize partials", 1, 0, ibtype, 340, 25, 20, 400, -1 iASCIIe = 101 ; "e" (score event) as ASCII iASCIIi = 105 ; "i" (score event) as ASCII gkquit, iquit FLbutton "Button 2 - Quit", 1, 0, 1, 340, 25, 20, 450, iASCIIe, 99, 0, 0 ;; init values FLsetVal_i 12, giha FLsetVal_i 12, gihb FLsetVal_i 2.0, gihc FLsetVal_i 2.0, gihd FLsetVal_i 2.0, gihe FLsetVal_i 2.0, gihf FLsetVal_i 440.0, gihg FLsetVal_i 440.0, gihh FLsetVal_i 0, iquantize FLsetVal_i .75, gihi FLsetVal_i 19000, gihk FLsetVal_i 19000, gihl FLsetVal_i 6, gihm FLsetVal_i 6, gihn gkquit init 0 FLpanelEnd ;***** end of container FLrun ;***** runs the widget thread, it is always required! ; instr 99 ; event_i "e", 0, 0, 0.1 ; quit csound ; endin instr 100 ;; update interfce FLsetVal 1 , gk1, gihb ; slider envia dado para text FLsetVal 1 , gk3, gihd ; slider envia dado para text FLsetVal 1 , gk5, gihf ; slider envia dado para text FLsetVal 1 , gk7, gihh ; slider envia dado para text FLsetVal 1 , gk9, gihj ; slider envia dado para text FLsetVal 1 , gk11, gihl ; slider envia dado para text FLsetVal 1 , gk13, gihn ; slider envia dado para text endin ;;; opcode to quantize partials into the scale opcode Quantize, k, kkkkk kfreq,kbasepitch,kbasefreq,kmodulo,kndiv xin kpitch = round(kndiv * (log(kfreq/kbasefreq)/log(kmodulo))) kfreq2 = kbasefreq*(kmodulo^(kpitch/kndiv)) xout kfreq2 endop ;;; instr 1 ixtra=.25 xtratim ixtra krel release kf init 0 kaa init 0 ks init 0 ks = gk4 ; 2^(gk3/1200) midinoteoncps kf, kaa ifreq notnum kf = gk8 * gk6 ^ ((ifreq-69)/round(gk2)) ka1 linseg 0, .01, 1, 1, 1, 0, 1 ka = ka1*kaa if krel > .5 then ka2 linseg 1, ixtra, 0 ka = ka1*kaa*ka2 endif kvol = gk12 ;;; 11 is the maximum number of partials ka1=(ka/128)*(kvol)/ 11 ka2=ka1*(gk10 ) ka3=ka1*(gk10^2) ka4=ka1*(gk10^3) ka5=ka1*(gk10^4) ka6=ka1*(gk10^5) ka7=ka1*(gk10^6) ka8=ka1*(gk10^7) ka9=ka1*(gk10^8) ka10=ka1*(gk10^9) ka11=ka1*(gk10^10) kf1=kf kf2=kf*ks^logbtwo(2) kf3=kf*ks^logbtwo(3) kf4=kf*ks^logbtwo(4) kf5=kf*ks^logbtwo(5) kf6=kf*ks^logbtwo(6) kf7=kf*ks^logbtwo(7) kf8=kf*ks^logbtwo(8) kf9=kf*ks^logbtwo(9) kf10=kf*ks^logbtwo(10) kf11=kf*ks^logbtwo(11) gk2=round(gk2) ;;; Quantization of partials into the scale ;;; kfreq2 Quantize kfreq,kbasepitch,kbasefreq,kmodulo,kndiv xin if (gkquantize > .5) then kf2 Quantize kf2, 0, kf, gk6, gk2 kf3 Quantize kf3, 0, kf, gk6, gk2 kf4 Quantize kf4, 0, kf, gk6, gk2 kf5 Quantize kf5, 0, kf, gk6, gk2 kf6 Quantize kf6, 0, kf, gk6, gk2 kf7 Quantize kf7, 0, kf, gk6, gk2 kf8 Quantize kf8, 0, kf, gk6, gk2 kf9 Quantize kf9, 0, kf, gk6, gk2 kf10 Quantize kf10, 0, kf, gk6, gk2 kf11 Quantize kf11, 0, kf, gk6, gk2 endif a1 oscil ka1,kf1,1 a2 oscil ka2,kf2,1 a3 oscil ka3,kf3,1 a4 oscil ka4,kf4,1 a5 oscil ka5,kf5,1 a6 oscil ka6,kf6,1 a7 oscil ka7,kf7,1 a8 oscil ka8,kf8,1 a9 oscil ka9,kf9,1 a10 oscil ka10,kf10,1 a11 oscil ka11,kf11,1 knpartials = round(gk14) aout = a1 if(knpartials>10)then aout = aout+a11 endif if(knpartials>9)then aout = aout+a10 endif if(knpartials>8)then aout = aout+a9 endif if(knpartials>7)then aout = aout+a8 endif if(knpartials>6)then aout = aout+a7 endif if(knpartials>5)then aout = aout+a6 endif if(knpartials>4)then aout = aout+a5 endif if(knpartials>3)then aout = aout+a4 endif if(knpartials>2)then aout = aout+a3 endif if(knpartials>1)then aout = aout+a2 endif ;;; lowpass ; aout tone aout, 1000 aout tone aout, 2000 out aout endin ;******************************* f1 0 4096 10 1 i 100 0 [2*3600]