1
2 /*
3 # Sfront, a SAOL to C translator
4 # This file: Launches notes for control driver
5 #
6 # Copyright (c) 1999-2006, Regents of the University of California
7 # All rights reserved.
8 #
9 # Redistribution and use in source and binary forms, with or without
10 # modification, are permitted provided that the following conditions are
11 # met:
12 #
13 # Redistributions of source code must retain the above copyright
14 # notice, this list of conditions and the following disclaimer.
15 #
16 # Redistributions in binary form must reproduce the above copyright
17 # notice, this list of conditions and the following disclaimer in the
18 # documentation and/or other materials provided with the distribution.
19 #
20 # Neither the name of the University of California, Berkeley nor the
21 # names of its contributors may be used to endorse or promote products
22 # derived from this software without specific prior written permission.
23 #
24 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 #
36 # Maintainer: John Lazzaro, lazzaro@cs.berkeley.edu
37 */
38
39
40 #include "tree.h"
41
42
43 /*********************************************************/
44 /* core routine for control parsing */
45 /*********************************************************/
46
makecontrolsys(void)47 void makecontrolsys(void)
48
49 {
50
51 int lc = 0;
52
53 if (cmidi || session)
54 {
55 z[lc++]="unsigned char ndata, vdata;";
56 z[lc++]="unsigned short ec;";
57 }
58 if (csasl)
59 {
60 z[lc++]="unsigned char priority;";
61 z[lc++]="unsigned short id;";
62 z[lc++]="unsigned short label;";
63 z[lc++]="unsigned int pnum;";
64 z[lc++]="float * p;";
65 }
66 z[lc++]="float oldtime;";
67 z[lc++]="instr_line * oldest;";
68 z[lc++]="int ne, newevents, netevents;";
69 z[lc++]="unsigned char cmd;";
70 z[lc++]="float fval;\n";
71
72 if (cin)
73 z[lc++]="newevents = csys_newdata(ENGINE_PTR);";
74
75 if (session && cmidi)
76 {
77 z[lc++]="netevents = nsys_newdata();";
78 z[lc++]="if (netevents || (newevents & CSYS_MIDIEVENTS))";
79 z[lc++]="do";
80 z[lc++]=" {";
81 z[lc++]=" if (netevents)";
82 z[lc++]=" {";
83 z[lc++]=" netevents = nsys_midievent(&cmd,&ndata,&vdata,&ec);";
84 z[lc++]=" ne = netevents ? CSYS_MIDIEVENTS : ";
85 z[lc++]=" (newevents & CSYS_MIDIEVENTS); ";
86 z[lc++]=" }";
87 z[lc++]=" else";
88 z[lc++]=" {";
89 z[lc++]=" ne = csys_midievent(ENGINE_PTR_COMMA &cmd,&ndata,&vdata,&ec,&fval);";
90 z[lc++]=" if (cmd >= CSYS_MIDI_TSTART)";
91 z[lc++]=" nsys_midisend(cmd, ndata, vdata, ec);";
92 z[lc++]=" }";
93 }
94 else
95 {
96 if (cmidi)
97 {
98 z[lc++]="if (newevents & CSYS_MIDIEVENTS)";
99 z[lc++]="do";
100 z[lc++]=" {";
101 z[lc++]=" ne = csys_midievent(ENGINE_PTR_COMMA &cmd,&ndata,&vdata,&ec,&fval);";
102 }
103 if (session)
104 {
105 z[lc++]="netevents = nsys_newdata();";
106 z[lc++]="if (netevents)";
107 z[lc++]="do";
108 z[lc++]=" {";
109 z[lc++]=" ne = nsys_midievent(&cmd,&ndata,&vdata,&ec);";
110 }
111 }
112
113 if (cmidi || session)
114 {
115 z[lc++]=" if ((ec < CSYS_MAXEXTCHAN)||((cmd&0xF0)==CSYS_MIDI_SPECIAL))";
116 z[lc++]=" switch(cmd&0xF0) {";
117 z[lc++]=" case CSYS_MIDI_NOTEON:";
118 z[lc++]=" if ((EV(cme_first)[ec])==NULL)";
119 z[lc++]=" break;";
120 z[lc++]=" if (vdata != 0)";
121 z[lc++]=" {";
122 z[lc++]=" if (*EV(cme_next)[ec] == NULL)";
123 z[lc++]=" *EV(cme_next)[ec] = *EV(cme_first)[ec] = *EV(cme_last)[ec];";
124 z[lc++]=" else";
125 z[lc++]=" {";
126 z[lc++]=" oldest = NULL;";
127 z[lc++]=" oldtime = MAXENDTIME;";
128 z[lc++]=" *EV(cme_next)[ec] = *EV(cme_first)[ec];";
129 z[lc++]=" while ((*EV(cme_next)[ec]) < (*EV(cme_end)[ec]))";
130 z[lc++]=" {";
131 z[lc++]=" if (((*EV(cme_next)[ec])->noteon == NOTUSEDYET)||";
132 z[lc++]=" ((*EV(cme_next)[ec])->noteon == ALLDONE))";
133 z[lc++]=" break;";
134 z[lc++]=" if ((*EV(cme_next)[ec])->starttime < oldtime)";
135 z[lc++]=" {";
136 z[lc++]=" oldest = (*EV(cme_next)[ec]);";
137 z[lc++]=" oldtime = (*EV(cme_next)[ec])->starttime;";
138 z[lc++]=" }";
139 z[lc++]=" (*EV(cme_next)[ec])++;";
140 z[lc++]=" }";
141 z[lc++]=" if ((*EV(cme_next)[ec]) == (*EV(cme_end)[ec]))";
142 z[lc++]=" {";
143 z[lc++]=" *EV(cme_next)[ec] = oldest;";
144 z[lc++]=" oldest->nstate->iline = NULL;";
145 z[lc++]=" }";
146 z[lc++]=" if ((*EV(cme_next)[ec]) > (*EV(cme_last)[ec]))";
147 z[lc++]=" *EV(cme_last)[ec] = *EV(cme_next)[ec];";
148 z[lc++]=" }";
149 z[lc++]=" (*EV(cme_next)[ec])->starttime = EV(scorebeats) - EV(scoremult);";
150 z[lc++]=" (*EV(cme_next)[ec])->endtime = MAXENDTIME;";
151 z[lc++]=" (*EV(cme_next)[ec])->abstime = 0.0F;";
152 z[lc++]=" (*EV(cme_next)[ec])->time = 0.0F;";
153 z[lc++]=" (*EV(cme_next)[ec])->sdur = -1.0F;";
154 z[lc++]=" (*EV(cme_next)[ec])->released = 0;";
155 z[lc++]=" (*EV(cme_next)[ec])->turnoff = 0;";
156 z[lc++]=" (*EV(cme_next)[ec])->noteon = TOBEPLAYED;";
157 z[lc++]=" (*EV(cme_next)[ec])->numchan = ec + CSYS_EXTCHANSTART;";
158 z[lc++]=" (*EV(cme_next)[ec])->preset = cme_preset[ec];";
159 z[lc++]=" (*EV(cme_next)[ec])->notenum = ndata;";
160 z[lc++]=" (*EV(cme_next)[ec])->p[0] = ndata ;";
161 z[lc++]=" (*EV(cme_next)[ec])->p[1] = vdata ;";
162 z[lc++]=" break;";
163 z[lc++]=" }";
164 z[lc++]=" case CSYS_MIDI_NOTEOFF:";
165 z[lc++]=" if ((EV(cme_first)[ec])==NULL)";
166 z[lc++]=" break;";
167 z[lc++]=" oldest = NULL;";
168 z[lc++]=" oldtime = MAXENDTIME;";
169 z[lc++]=" for (sysidx=*EV(cme_first)[ec];sysidx<=*EV(cme_last)[ec];sysidx++)";
170 z[lc++]=" if ((sysidx->notenum == ndata) && ";
171 z[lc++]=" (sysidx->numchan == ec + CSYS_EXTCHANSTART) &&";
172 z[lc++]=" (sysidx->starttime < oldtime))";
173 z[lc++]=" {";
174 z[lc++]=" oldest = sysidx;";
175 z[lc++]=" oldtime = sysidx->starttime;";
176 z[lc++]=" }";
177 z[lc++]=" if (oldest)";
178 z[lc++]=" {";
179 z[lc++]=" oldest->endtime = EV(scorebeats) - EV(scoremult);";
180 z[lc++]=" oldest->notenum += 256;";
181 z[lc++]=" }";
182 z[lc++]=" break;";
183 z[lc++]=" case CSYS_MIDI_PTOUCH:";
184 z[lc++]=" NG(CSYS_FRAMELEN*(ec+CSYS_EXTCHANSTART)+CSYS_TOUCHPOS+ndata)=vdata;";
185 z[lc++]=" break;";
186 z[lc++]=" case CSYS_MIDI_CTOUCH:";
187 z[lc++]=" NG(CSYS_FRAMELEN*(ec+CSYS_EXTCHANSTART)+CSYS_CHTOUCHPOS)=ndata;";
188 z[lc++]=" break;";
189 z[lc++]=" case CSYS_MIDI_WHEEL:";
190 z[lc++]=" NG(CSYS_FRAMELEN*(ec + CSYS_EXTCHANSTART) + CSYS_BENDPOS) = ";
191 z[lc++]=" 128*vdata + ndata;";
192 z[lc++]=" break;";
193 z[lc++]=" case CSYS_MIDI_CC:";
194 z[lc++]=" NG(CSYS_FRAMELEN*(ec+CSYS_EXTCHANSTART)+CSYS_CCPOS+ndata)=vdata;";
195 z[lc++]=" switch(ndata) {";
196 z[lc++]=" case CSYS_MIDI_CC_BANKSELECT_LSB:";
197 z[lc++]=" EV(csys_banklsb) = vdata;";
198 z[lc++]=" EV(csys_bank) = EV(csys_banklsb) + 128*EV(csys_bankmsb);";
199 z[lc++]=" break;";
200 z[lc++]=" case CSYS_MIDI_CC_BANKSELECT_MSB:";
201 z[lc++]=" EV(csys_bankmsb) = vdata;";
202 z[lc++]=" EV(csys_bank) = EV(csys_banklsb) + 128*EV(csys_bankmsb);";
203 z[lc++]=" break;";
204 z[lc++]=" case CSYS_MIDI_CC_ALLSOUNDOFF:";
205
206 /* Uncomment following line to make an ALLSOUNDOFF on any channel */
207 /* kill all instrs on all channels. */
208 /*
209 z[lc++]=" for (ec = 0; ec < CSYS_MAXEXTCHAN; ec++)";
210 */
211
212 z[lc++]=" if ((EV(cme_first)[ec]))";
213 z[lc++]=" for (sysidx=*EV(cme_first)[ec];sysidx<=*EV(cme_last)[ec];sysidx++)";
214 z[lc++]=" {";
215 z[lc++]=" sysidx->noteon = ALLDONE;";
216 z[lc++]=" sysidx->nstate->iline = NULL;";
217 z[lc++]=" }";
218 z[lc++]=" break;";
219 z[lc++]=" case CSYS_MIDI_CC_ALLNOTESOFF:";
220
221 /* Uncomment following line to make an ALLNOTESOFF on any channel */
222 /* kill all instrs on all channels. */
223 /*
224 z[lc++]=" for (ec = 0; ec < CSYS_MAXEXTCHAN; ec++)";
225 */
226
227 z[lc++]=" if ((EV(cme_first)[ec]))";
228 z[lc++]=" for (sysidx=*EV(cme_first)[ec];sysidx<=*EV(cme_last)[ec];sysidx++)";
229 z[lc++]=" {";
230 z[lc++]=" sysidx->endtime = EV(scorebeats) - EV(scoremult);";
231 z[lc++]=" sysidx->notenum += 256;";
232 z[lc++]=" }";
233 z[lc++]=" break;";
234 z[lc++]=" case CSYS_MIDI_CC_RESETALLCONTROL:";
235 z[lc++]=" for (i = 0; i < CSYS_MIDI_CC_ALLSOUNDOFF; i++)";
236 z[lc++]=" NG(CSYS_FRAMELEN*(ec+CSYS_EXTCHANSTART)+CSYS_CCPOS+i)=0.0F;";
237 z[lc++]=" NG(CSYS_FRAMELEN*(ec + CSYS_EXTCHANSTART)+";
238 z[lc++]=" CSYS_MIDI_CC_CHANVOLUME_MSB) = 100.0F;";
239 z[lc++]=" NG(CSYS_FRAMELEN*(ec + CSYS_EXTCHANSTART)+";
240 z[lc++]=" CSYS_MIDI_CC_PAN_MSB) = 64.0F;";
241 z[lc++]=" NG(CSYS_FRAMELEN*(ec + CSYS_EXTCHANSTART)+";
242 z[lc++]=" CSYS_MIDI_CC_EXPRESSION_MSB) = 127.0F;";
243 z[lc++]=" EV(csys_bank) = EV(csys_banklsb) = EV(csys_bankmsb) = 0;";
244 z[lc++]=" break;";
245 z[lc++]=" default:";
246 z[lc++]=" break;";
247 z[lc++]=" }";
248 z[lc++]=" break;";
249 z[lc++]=" case CSYS_MIDI_PROGRAM:";
250 z[lc++]=" if ((CSYS_NULLPROGRAM == 0) && (ndata >= CSYS_MAXPRESETS))";
251 z[lc++]=" break;";
252 z[lc++]=" if ((EV(cme_first)[ec]))";
253 z[lc++]=" for (sysidx=*EV(cme_first)[ec];sysidx<=*EV(cme_last)[ec];sysidx++)";
254 z[lc++]=" if ((sysidx->numchan == ec + CSYS_EXTCHANSTART) &&";
255 z[lc++]=" (sysidx->noteon <= PLAYING))";
256 z[lc++]=" {";
257 z[lc++]=" sysidx->endtime = EV(scorebeats) - EV(scoremult);";
258 z[lc++]=" sysidx->notenum += 256;";
259 z[lc++]=" }";
260 z[lc++]=" if ((CSYS_NULLPROGRAM == 0) || (ndata < CSYS_MAXPRESETS))";
261 z[lc++]=" {";
262 z[lc++]=" EV(cme_first)[ec] = EV(cmp_first)[ndata];";
263 z[lc++]=" EV(cme_last)[ec] = EV(cmp_last)[ndata];";
264 z[lc++]=" EV(cme_end)[ec] = EV(cmp_end)[ndata];";
265 z[lc++]=" EV(cme_next)[ec] = EV(cmp_next)[ndata];";
266 z[lc++]=" }";
267 z[lc++]=" else";
268 z[lc++]=" EV(cme_first)[ec] = EV(cme_last)[ec] = EV(cme_end)[ec] = EV(cme_next)[ec] = NULL;";
269 z[lc++]=" break;";
270 z[lc++]=" case CSYS_MIDI_SPECIAL:";
271 z[lc++]=" if (cmd == CSYS_MIDI_NEWTEMPO)";
272 z[lc++]=" {";
273 z[lc++]=" if (fval <= 0.0F)";
274 z[lc++]=" break;";
275 z[lc++]=" EV(kbase) = EV(kcycleidx);";
276 z[lc++]=" EV(scorebase) = EV(scorebeats);";
277 z[lc++]=" EV(tempo) = fval;";
278 z[lc++]=" EV(scoremult) = 1.666667e-02F*EV(KTIME)*EV(tempo);";
279 z[lc++]=" EV(endkcycle) = EV(kbase) + (int)(EV(KRATE)*(EV(endtime)-EV(scorebase))*";
280 z[lc++]=" (60.0F/EV(tempo)));";
281 z[lc++]=" break;";
282 z[lc++]=" }";
283 z[lc++]=" if (cmd == CSYS_MIDI_ENDTIME)";
284 z[lc++]=" {";
285 z[lc++]=" if (fval <= EV(scorebeats))";
286 z[lc++]=" {";
287 z[lc++]=" EV(endtime) = EV(scorebeats);";
288 z[lc++]=" EV(endkcycle) = EV(kcycleidx);";
289 z[lc++]=" }";
290 z[lc++]=" else";
291 z[lc++]=" {";
292 z[lc++]=" EV(endtime) = fval;";
293 z[lc++]=" EV(endkcycle) = EV(kbase) + (int)(EV(KRATE)*(EV(endtime)-EV(scorebase))*";
294 z[lc++]=" (60.0F/EV(tempo)));";
295 z[lc++]=" }";
296 z[lc++]=" break;";
297 z[lc++]=" }";
298 z[lc++]=" if (cmd == CSYS_MIDI_POWERUP)";
299 z[lc++]=" {";
300 z[lc++]=" ec &= 0xFFF0;";
301 z[lc++]=" memset(&(NGU(CSYS_FRAMELEN*(ec+CSYS_EXTCHANSTART))), 0,";
302 z[lc++]=" sizeof(NGU(0))*CSYS_FRAMELEN*16);";
303 z[lc++]=" for (i = 0; i < 16; i++)";
304 z[lc++]=" {";
305 z[lc++]=" NG(CSYS_FRAMELEN*(ec + CSYS_EXTCHANSTART)+";
306 z[lc++]=" CSYS_MIDI_CC_CHANVOLUME_MSB) = 100.0F;";
307 z[lc++]=" NG(CSYS_FRAMELEN*(ec + CSYS_EXTCHANSTART)+";
308 z[lc++]=" CSYS_MIDI_CC_PAN_MSB) = 64.0F;";
309 z[lc++]=" NG(CSYS_FRAMELEN*(ec + CSYS_EXTCHANSTART)+";
310 z[lc++]=" CSYS_MIDI_CC_EXPRESSION_MSB) = 127.0F;";
311 z[lc++]=" NG(CSYS_FRAMELEN*(ec + CSYS_EXTCHANSTART)+";
312 z[lc++]=" CSYS_BENDPOS) = 8192.0F;";
313 z[lc++]=" NG(CSYS_FRAMELEN*(ec + CSYS_EXTCHANSTART)+";
314 z[lc++]=" CSYS_EXTPOS) = (float)ec;";
315 z[lc++]=" if ((EV(cme_first)[ec]))";
316 z[lc++]=" for (sysidx=*EV(cme_first)[ec];sysidx<=*EV(cme_last)[ec];sysidx++)";
317 z[lc++]=" if (sysidx->numchan == (ec + CSYS_EXTCHANSTART))";
318 z[lc++]=" {";
319 z[lc++]=" sysidx->endtime = EV(scorebeats) - EV(scoremult);";
320 z[lc++]=" sysidx->notenum += 256;";
321 z[lc++]=" }";
322 z[lc++]=" EV(cme_first)[ec] = EV(cmp_first)[i % CSYS_MAXPRESETS];";
323 z[lc++]=" EV(cme_last)[ec] = EV(cmp_last)[i % CSYS_MAXPRESETS];";
324 z[lc++]=" EV(cme_end)[ec] = EV(cmp_end)[i % CSYS_MAXPRESETS];";
325 z[lc++]=" EV(cme_next)[ec] = EV(cmp_next)[i % CSYS_MAXPRESETS];";
326 z[lc++]=" ec++;";
327 z[lc++]=" }";
328 z[lc++]=" break;";
329 z[lc++]=" }";
330 z[lc++]=" break;";
331 z[lc++]=" default:";
332 z[lc++]=" break;";
333 z[lc++]=" }";
334 z[lc++]=" } while (ne != CSYS_DONE);";
335
336 if (session)
337 z[lc++]=" nsys_endcycle();";
338 }
339
340 if (csasl)
341 {
342 z[lc++]="if (newevents & CSYS_SASLEVENTS)";
343 z[lc++]="do";
344 z[lc++]="{";
345 z[lc++]=" ne = csys_saslevent(ENGINE_PTR_COMMA &cmd,&priority,&id,&label,&fval,&pnum,&p);";
346 z[lc++]=" switch(cmd) {";
347 z[lc++]=" case CSYS_SASL_ENDTIME:";
348 z[lc++]=" if (fval <= EV(scorebeats))";
349 z[lc++]=" {";
350 z[lc++]=" EV(endtime) = EV(scorebeats);";
351 z[lc++]=" EV(endkcycle) = EV(kcycleidx);";
352 z[lc++]=" }";
353 z[lc++]=" else";
354 z[lc++]=" {";
355 z[lc++]=" EV(endtime) = fval;";
356 z[lc++]=" EV(endkcycle) = EV(kbase) + (int)(EV(KRATE)*(EV(endtime)-EV(scorebase))*";
357 z[lc++]=" (60.0F/EV(tempo)));";
358 z[lc++]=" }";
359 z[lc++]=" break;";
360 z[lc++]=" case CSYS_SASL_TEMPO:";
361 z[lc++]=" if (fval <= 0.0F)";
362 z[lc++]=" break;";
363 z[lc++]=" EV(kbase) = EV(kcycleidx);";
364 z[lc++]=" EV(scorebase) = EV(scorebeats);";
365 z[lc++]=" EV(tempo) = fval;";
366 z[lc++]=" EV(scoremult) = 1.666667e-02F*EV(KTIME)*EV(tempo);";
367 z[lc++]=" EV(endkcycle) = EV(kbase) + (int)(EV(KRATE)*(EV(endtime)-EV(scorebase))*";
368 z[lc++]=" (60.0F/EV(tempo)));";
369 z[lc++]=" break;";
370 z[lc++]=" case CSYS_SASL_CONTROL:";
371 z[lc++]=" if (id > CSYS_SASL_NOINSTR)";
372 z[lc++]=" break;";
373 z[lc++]=" if (EV(maxsc) == CSYS_SASL_MAXCONTROL)";
374 z[lc++]=" break;";
375 z[lc++]=" EV(saslcontrol)[EV(maxsc)].id = id;";
376 z[lc++]=" EV(saslcontrol)[EV(maxsc)].label = label;";
377 z[lc++]=" EV(saslcontrol)[EV(maxsc)].fptr = pnum;";
378 z[lc++]=" EV(saslcontrol)[EV(maxsc)++].fval = fval;";
379 z[lc++]=" break;";
380 z[lc++]=" case CSYS_SASL_TABLE:";
381 z[lc++]=" if (id > GBL_ENDTBL)";
382 z[lc++]=" break;";
383 z[lc++]=" EV(sasltable)[EV(maxtb)].tgen = label;";
384 z[lc++]=" EV(sasltable)[EV(maxtb)].pnum = pnum;";
385 z[lc++]=" EV(sasltable)[EV(maxtb)].p = NULL;";
386 z[lc++]=" if (pnum)";
387 z[lc++]=" {"; /* calloc uses pnum+1 for tgen_sample */
388 z[lc++]=" EV(sasltable)[EV(maxtb)].p = (float *)";
389 z[lc++]=" calloc(pnum+1, sizeof(float));";
390 z[lc++]=" while ((pnum--) > 0)";
391 z[lc++]=" EV(sasltable)[EV(maxtb)].p[pnum] = p[pnum];";
392 z[lc++]=" }";
393 z[lc++]=" EV(sasltable)[EV(maxtb)++].index = id;";
394 z[lc++]=" break;";
395 z[lc++]=" case CSYS_SASL_INSTR:";
396 z[lc++]=" if (id >= CSYS_MAXSASLINSTR)";
397 z[lc++]=" break;";
398 z[lc++]=" if (*EV(cs_next)[id] == NULL)";
399 z[lc++]=" *EV(cs_next)[id] = *EV(cs_first)[id] = *EV(cs_last)[id];";
400 z[lc++]=" else";
401 z[lc++]=" {";
402 z[lc++]=" oldest = NULL;";
403 z[lc++]=" oldtime = MAXENDTIME;";
404 z[lc++]=" *EV(cs_next)[id] = *EV(cs_first)[id];";
405 z[lc++]=" while ((*EV(cs_next)[id]) < (*EV(cs_end)[id]))";
406 z[lc++]=" {";
407 z[lc++]=" if (((*EV(cs_next)[id])->noteon == NOTUSEDYET)||";
408 z[lc++]=" ((*EV(cs_next)[id])->noteon == ALLDONE))";
409 z[lc++]=" break;";
410 z[lc++]=" if ((*EV(cs_next)[id])->starttime < oldtime)";
411 z[lc++]=" {";
412 z[lc++]=" oldest = (*EV(cs_next)[id]);";
413 z[lc++]=" oldtime = (*EV(cs_next)[id])->starttime;";
414 z[lc++]=" }";
415 z[lc++]=" (*EV(cs_next)[id])++;";
416 z[lc++]=" }";
417 z[lc++]=" if ((*EV(cs_next)[id]) == (*EV(cs_end)[id]))";
418 z[lc++]=" {";
419 z[lc++]=" *EV(cs_next)[id] = oldest;";
420 z[lc++]=" oldest->nstate->iline = NULL;";
421 z[lc++]=" }";
422 z[lc++]=" if ((*EV(cs_next)[id]) > (*EV(cs_last)[id]))";
423 z[lc++]=" *EV(cs_last)[id] = *EV(cs_next)[id];";
424 z[lc++]=" }";
425 z[lc++]=" (*EV(cs_next)[id])->starttime = EV(scorebeats) - EV(scoremult);";
426 z[lc++]=" (*EV(cs_next)[id])->endtime = MAXENDTIME;";
427 z[lc++]=" (*EV(cs_next)[id])->abstime = 0.0F;";
428 z[lc++]=" (*EV(cs_next)[id])->time = 0.0F;";
429 z[lc++]=" (*EV(cs_next)[id])->sdur = fval;";
430 z[lc++]=" (*EV(cs_next)[id])->released = 0;";
431 z[lc++]=" (*EV(cs_next)[id])->turnoff = 0;";
432 z[lc++]=" (*EV(cs_next)[id])->noteon = TOBEPLAYED;";
433 z[lc++]=" (*EV(cs_next)[id])->numchan = 0;";
434 z[lc++]=" (*EV(cs_next)[id])->notenum = 0;";
435 z[lc++]=" (*EV(cs_next)[id])->preset = 0;";
436 z[lc++]=" (*EV(cs_next)[id])->label = label;";
437 z[lc++]=" pnum = (pnum > MAXPFIELDS) ? MAXPFIELDS : pnum;";
438 z[lc++]=" while ((pnum--) > 0)";
439 z[lc++]=" (*EV(cs_next)[id])->p[pnum] = p[pnum];";
440 z[lc++]=" break;";
441 z[lc++]=" case CSYS_SASL_NOOP:";
442 z[lc++]=" break;";
443 z[lc++]=" default:";
444 z[lc++]=" break;";
445 z[lc++]="}";
446 z[lc++]=" } while (ne != CSYS_DONE);";
447 }
448 printraw(lc);
449 fprintf(outfile,"\n");
450
451 }
452
453 /*********************************************************/
454 /* SASL control command for control driver */
455 /*********************************************************/
456
457
makesaslcontrolsys(void)458 void makesaslcontrolsys(void)
459
460 {
461
462 int lc = 0;
463
464 z[lc++]="for (i = 0; i < EV(maxsc); i++)";
465 z[lc++]=" {";
466 z[lc++]=" if (EV(saslcontrol)[i].id == CSYS_SASL_NOINSTR)";
467 z[lc++]=" {";
468 z[lc++]=" if (EV(saslcontrol)[i].fptr < GBL_ENDVAR)";
469 z[lc++]=" NG(EV(saslcontrol)[i].fptr) = EV(saslcontrol)[i].fval;";
470 z[lc++]=" }";
471 z[lc++]=" else";
472 z[lc++]=" {";
473 z[lc++]=" for (sysidx= *EV(cs_first)[EV(saslcontrol)[i].id];";
474 z[lc++]=" sysidx<= *EV(cs_last)[EV(saslcontrol)[i].id];sysidx++)";
475 z[lc++]=" if ((sysidx->label == EV(saslcontrol)[i].label)&&";
476 z[lc++]=" (sysidx->noteon == PLAYING))";
477 z[lc++]=" sysidx->nstate->v[EV(saslcontrol)[i].fptr].f";
478 z[lc++]=" = EV(saslcontrol)[i].fval;";
479
480 /* extra loops needed for other sources of labelled instrs */
481
482 if (allsasl->numlabels && allsasl->instrroot)
483 {
484 z[lc++]="";
485 z[lc++]=" if ((EV(saslcontrol)[i].label <= CSYS_LABELNUM) &&";
486 z[lc++]=" EV(css_first)[EV(saslcontrol)[i].id])";
487 z[lc++]=" for (sysidx= *EV(css_first)[EV(saslcontrol)[i].id];";
488 z[lc++]=" sysidx<= *EV(css_last)[EV(saslcontrol)[i].id];sysidx++)";
489 z[lc++]=" if ((sysidx->label == EV(saslcontrol)[i].label)&&";
490 z[lc++]=" (sysidx->noteon == PLAYING))";
491 z[lc++]=" sysidx->nstate->v[EV(saslcontrol)[i].fptr].f";
492 z[lc++]=" = EV(saslcontrol)[i].fval;";
493 }
494
495
496 if (abssasl->numlabels && abssasl->instrroot)
497 {
498 z[lc++]="";
499 z[lc++]=" if ((EV(saslcontrol)[i].label <= CSYS_LABELNUM) &&";
500 z[lc++]=" EV(csa_first)[EV(saslcontrol)[i].id])";
501 z[lc++]=" for (sysidx= *EV(csa_first)[EV(saslcontrol)[i].id];";
502 z[lc++]=" sysidx<= *EV(csa_last)[EV(saslcontrol)[i].id];sysidx++)";
503 z[lc++]=" if ((sysidx->label == EV(saslcontrol)[i].label)&&";
504 z[lc++]=" (sysidx->noteon == PLAYING))";
505 z[lc++]=" sysidx->nstate->v[EV(saslcontrol)[i].fptr].f";
506 z[lc++]=" = EV(saslcontrol)[i].fval;";
507
508 }
509
510
511 z[lc++]=" }";
512 z[lc++]=" }";
513 z[lc++]="EV(maxsc) = 0;";
514
515 printraw(lc);
516 fprintf(outfile,"\n");
517
518 }
519
520
521 /*********************************************************/
522 /* cross-control command for control driver */
523 /*********************************************************/
524
makesaslcrosscontrol(char * prefix)525 void makesaslcrosscontrol(char * prefix)
526
527 {
528
529 fprintf(outfile," for (i = 0; i < CSYS_MAXSASLINSTR; i++)\n");
530 fprintf(outfile," for (sysidx= *EV(cs_first)[i];sysidx<= *EV(cs_last)[i];sysidx++)\n");
531 fprintf(outfile," if ((sysidx->label == EV(%scontrolidx)->label)&&\n", prefix);
532 fprintf(outfile," (sysidx->noteon == PLAYING))\n");
533 fprintf(outfile," sysidx->nstate->v[EV(%scontrolidx)->imptr].f\n",prefix);
534 fprintf(outfile," = EV(%scontrolidx)->imval;\n",prefix);
535
536 }
537
538 /*********************************************************/
539 /* SASL table command for control driver */
540 /*********************************************************/
541
542
makesasltablesys(void)543 void makesasltablesys(void)
544
545 {
546
547 int lc = 0;
548
549 z[lc++]="for (i = 0; i < EV(maxtb); i++)";
550 z[lc++]=" {";
551 z[lc++]=" switch (EV(sasltable)[i].tgen) {";
552 z[lc++]=" case CSYS_SASL_TGEN_SAMPLE:";
553 z[lc++]=" tgen_sample(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
554 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
555 z[lc++]=" break;";
556 z[lc++]=" case CSYS_SASL_TGEN_DATA:";
557 z[lc++]=" tgen_data(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
558 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
559 z[lc++]=" break;";
560 z[lc++]=" case CSYS_SASL_TGEN_RANDOM:";
561 z[lc++]=" tgen_random(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
562 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
563 z[lc++]=" break;";
564 z[lc++]=" case CSYS_SASL_TGEN_STEP:";
565 z[lc++]=" tgen_step(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
566 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
567 z[lc++]=" break;";
568 z[lc++]=" case CSYS_SASL_TGEN_LINESEG:";
569 z[lc++]=" tgen_lineseg(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
570 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
571 z[lc++]=" break;";
572 z[lc++]=" case CSYS_SASL_TGEN_EXPSEG:";
573 z[lc++]=" tgen_expseg(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
574 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
575 z[lc++]=" break;";
576 z[lc++]=" case CSYS_SASL_TGEN_CUBICSEG:";
577 z[lc++]=" tgen_cubicseg(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
578 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
579 z[lc++]=" break;";
580 z[lc++]=" case CSYS_SASL_TGEN_POLYNOMIAL:";
581 z[lc++]=" tgen_polynomial(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
582 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
583 z[lc++]=" break;";
584 z[lc++]=" case CSYS_SASL_TGEN_SPLINE:";
585 z[lc++]=" tgen_spline(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
586 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
587 z[lc++]=" break;";
588 z[lc++]=" case CSYS_SASL_TGEN_WINDOW :";
589 z[lc++]=" tgen_window(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
590 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
591 z[lc++]=" break;";
592 z[lc++]=" case CSYS_SASL_TGEN_HARM :";
593 z[lc++]=" tgen_harm(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
594 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
595 z[lc++]=" break;";
596 z[lc++]=" case CSYS_SASL_TGEN_HARM_PHASE:";
597 z[lc++]=" tgen_harm_phase(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
598 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
599 z[lc++]=" break;";
600 z[lc++]=" case CSYS_SASL_TGEN_PERIODIC:";
601 z[lc++]=" tgen_periodic(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
602 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
603 z[lc++]=" break;";
604 z[lc++]=" case CSYS_SASL_TGEN_BUZZ :";
605 z[lc++]=" tgen_buzz(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
606 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
607 z[lc++]=" break;";
608 z[lc++]=" case CSYS_SASL_TGEN_CONCAT:";
609 z[lc++]=" tgen_concat_global(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
610 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
611 z[lc++]=" break;";
612 z[lc++]=" case CSYS_SASL_TGEN_EMPTY :";
613 z[lc++]=" tgen_empty(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
614 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
615 z[lc++]=" break;";
616 z[lc++]=" case CSYS_SASL_TGEN_DESTROY:";
617 z[lc++]=" tgen_destroy(ENGINE_PTR_COMMA &(EV(gtables)[EV(sasltable)[i].index]),";
618 z[lc++]=" EV(sasltable)[i].pnum, EV(sasltable)[i].p);";
619 z[lc++]=" break;";
620 z[lc++]=" }";
621 z[lc++]=" }";
622 z[lc++]="EV(maxtb) = 0;";
623
624 printraw(lc);
625 fprintf(outfile,"\n");
626
627 }
628
629