aboutsummaryrefslogtreecommitdiff
path: root/site/udo/fnml/instrument_vocal.udo
blob: f5ac011720498438297174e33a833d30bad6fe12 (plain)
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