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