1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
#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
|