aboutsummaryrefslogtreecommitdiff
path: root/BUG3/oprepare.udo
blob: 6350600f28787e1763e8b0a80fe2ae8005ef60b5 (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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#ifndef UDO_OPREPARE
#define UDO_OPREPARE ##
/*
	Debugger - Unfixed Bugs : BUG #3

	Offline preparation system: record a sound in one k-cycle to a ftable for future use
	To be used where online playback would be too CPU heavy
	In the case of BUG3, it is used for the 909 hi-hat

	Instruments to be prepared should be prepended with src_
*/


/*
	Internal preparation instrument: loop through gSoprepare
	p4	index of gSoprepare to process
	p5	instrument name to schedule when all sounds have been prepared
*/
gSoprepare[] init 1 		; filled by oprepare opcode: input instrument names without src_ prepended
giopreparedfns[] init 1		; filled by oprepare opcode: output ftable numbers corresponding to above
instr _oprepare
	iprepareindex = p4
	SonComplete = p5
	if (iprepareindex >= lenarray(gSoprepare)) then
		event_i "i", SonComplete, 0, 3600
		turnoff
	else 
		Sprepareinstr = gSoprepare[iprepareindex]
		Srcinstr = sprintf("src_%s", Sprepareinstr)
		ilen = 0.3
		p3 = ilen
		ifn ftgen 0, 0, sr*ilen, 7, 0
		giopreparedfns[iprepareindex] = ifn
		ktimek timeinstk
		if (ktimek == 1) then
			kcycles = ilen * kr
			kcount init 0
loop:
			apos phasor (1/(ftlen(ifn)/sr))
			aproc subinstr Srcinstr, 1, 0.1
			tabw aproc, apos, ifn, 1
			loop_lt kcount, 1, kcycles, loop
		elseif (ktimek == 5) then
			scoreline_i sprintf("i\"_oprepare\" 0 1 %d \"%s\"", iprepareindex+1, SonComplete)
			turnoff
		endif
	endif
	
endin


/*
	Start the offline preparation

	oprepare Snames[], SonComplete

	Snames[]	list of instruments to process (instrument name without src_ prepended)
	SonComplete	instrument to be scheduled when preparation process has completed
*/
opcode oprepare, 0, S[]S
	Snames[], SonComplete xin
	gSoprepare = Snames
	giopreparedfns[] init lenarray(Snames)
	scoreline_i sprintf("i\"_oprepare\" 0 1 0 \"%s\"", SonComplete)
endop


/*
	Get the ftable number of a specified instrument name as originally passed to oprepare

	ifn oprepare_getfn Sname

	ifn	the ftable
	Sname	name of offline-prepared instrument
*/
opcode oprepare_getfn, i, S
	Sname xin
	ifn = -1
	index = 0
	while (index < lenarray(gSoprepare)) do
		if (strcmp(gSoprepare[index], Sname) == 0) then
			ifn = giopreparedfns[index]
		endif
		index += 1
	od
complete:
	xout ifn
endop


#end