#ifndef UDO_FNMI_VOCAL #define UDO_FNMI_VOCAL ## #include "wavetables.udo" #include "sequencing_melodic.udo" #include "sounddb.udo" #include "bussing.udo" i_[], gifnmi_vocal_collectionid sounddb_getcollection "VocalAhh1" opcode fnmi_vocal_chord, aa, kpj ktrig, iaddoctave, ireadattackratio xin icollectionid = gifnmi_vocal_collectionid ireadattackratio = (ireadattackratio == -1) ? 0.1 : ireadattackratio if (ktrig == 1) then klen = mel_length:k() knotenum = table:k(0, gimel_current_notes) kpanstep = 1 / knotenum kindex = 0 while (kindex < knotenum) do kpan = kpanstep * kindex schedulek "fnmi_vocal", 0, klen, icollectionid, table:k(kindex+1, gimel_current_notes), kpan, ireadattackratio if (iaddoctave == 1) then schedulek "fnmi_vocal", 0, klen, icollectionid, table:k(kindex+1, gimel_current_notes) + 12, 1-kpan, ireadattackratio endif kindex += 1 od endif aL, aR bus_read "fnmi_vocal_chord" xout aL, aR endop /* instr tester ktrig = 0 if (gkmel_section_change == 1) then ktrig = 1 endif aL, aR fnmi_vocal_chord ktrig outs aL, aR endin */ instr fnmi_vocal icollectionid = p4 inote = p5 ipan = p6 ireadattackratio = p7 ifileid, ipitchratio sounddb_mel_nearestnote icollectionid, inote ifn = gisounddb[ifileid][0] ilen = gisounddb[ifileid][2] idur = p3 kamp linseg 1, idur*0.1, 1, idur*0.5, 1, idur*0.4, 0 ireadrate random 0.01, 1 ivibrate = random(0.25, 4) klfo oscil 0.006, ivibrate, gifnSine kpitchratio = ipitchratio + klfo atime = abs:a(oscil:a(0.68, ireadrate)) if (ireadattackratio != 0) then atime = (delay:a(atime, idur*ireadattackratio) + linseg:a(0, idur*ireadattackratio, 0.1)) * ilen endif aL, aR mincer atime, kamp*0.2, kpitchratio, ifn, 1, 2048 aL butterhp aL, 340 aR butterhp aR, 340 bus_mix("fnmi_vocal_chord", aL*ipan, aR*(1-ipan)) endin #end