source: buchla-68k/ram/asgvce.c@ 6262b5c

Last change on this file since 6262b5c was 6262b5c, checked in by Thomas Lopatic <thomas@…>, 7 years ago

Added include files for global functions and variables.

  • Property mode set to 100644
File size: 9.6 KB
Line 
1/*
2 =============================================================================
3 asgvce.c -- MIDAS-VII -- assign voice / enter notes into score
4 Version 12 -- 1988-10-03 -- D.N. Lynx Crowe
5 =============================================================================
6*/
7
8#undef DEBUGGER /* define to enable debug trace */
9
10#define DEBUGIT 0
11
12#include "all.h"
13
14extern int16_t sc_trak(int32_t tval);
15extern int16_t sc_trek(int32_t tval);
16extern void chgsdf(void);
17extern void chgsef(void);
18extern void execkey(int16_t trg, int16_t pch, int16_t vce, int16_t tag);
19extern void se_disp(struct s_entry *ep, int16_t sd, struct gdsel *gdstb[], int16_t cf);
20
21#if DEBUGIT
22extern short debugsw;
23#endif
24
25/*
26
27*/
28
29extern int16_t clksrc; /* clock source */
30extern int16_t curasg; /* current assignment table */
31extern int16_t legato; /* "legato" mode flag */
32extern int16_t lstbgnc; /* last note begin entry count */
33extern int16_t lstendc; /* last note end entry count */
34extern int16_t lstflag; /* last note list end flag */
35extern int16_t ndisp; /* current display number */
36extern int16_t newflag; /* new data entered while t_ctr EQ t_cur */
37extern int16_t nkdown; /* number of keys down */
38extern int16_t recsw; /* record/play switch */
39extern int16_t sd; /* score display direction */
40extern int16_t se; /* score execution direction */
41extern int16_t stepenb; /* step enable */
42extern int16_t stepint; /* note interval */
43extern int16_t stepwgt; /* note weight */
44extern int16_t velflag; /* velocity display enable flag */
45
46extern int16_t grpmode[]; /* group mode table */
47extern int16_t grpstat[]; /* group status table */
48extern int16_t ins2grp[]; /* instrument to group assigments */
49extern int16_t vce2grp[]; /* voice to group map */
50extern int16_t lastvce[]; /* last voice assigned in each group */
51extern int16_t lastvel[]; /* last velocity seen by each group */
52extern int16_t tuntab[]; /* current tuning table */
53extern int16_t vce2trg[]; /* voice to trigger map (-1 EQ NULL) */
54
55extern int16_t stepfrm[][17]; /* steps per frame table */
56
57extern uint16_t *obj8; /* score display object pointer */
58
59extern struct gdsel *gdstbc[]; /* group status table - center slice */
60
61extern struct n_entry *lstbgns[NLSTENTS]; /* note begin pointers */
62extern struct n_entry *lstends[NLSTENTS]; /* note end pointers */
63
64extern struct nevent *nefree; /* pointer to free note entries */
65extern struct nevent *nelist; /* pointer to note entry list */
66
67extern struct nevent nevents[NNEVTS]; /* note event list */
68
69/*
70
71*/
72
73/*
74 =============================================================================
75 clrnl() -- clear note list
76 =============================================================================
77*/
78
79void clrnl(void)
80{
81 register int16_t i;
82
83 DB_ENTR("clrnl");
84
85 for (i = 0; i < NNEVTS - 1; i++) {
86
87 nevents[i].nxt = &nevents[i + 1];
88 nevents[i].note = 0;
89 nevents[i].group = 0;
90 }
91
92 nevents[NNEVTS - 1].nxt = (struct nevent *)0L;
93
94 nelist = (struct nevent *)0L;
95 nefree = &nevents[0];
96 nkdown = 0;
97
98 DB_EXIT("clrnl");
99}
100
101/*
102
103*/
104
105/*
106 =============================================================================
107 ne_end() -- enter a note end event
108 =============================================================================
109*/
110
111void ne_end(int16_t trg, int16_t grp)
112{
113 register int16_t nn;
114 register int32_t fcend;
115 register struct nevent *nx;
116 register struct n_entry *ep;
117
118 DB_ENTR("ne_end");
119
120 /* must be recording into a voice in record mode ... */
121
122 if ((recsw EQ 0) OR (grpmode[grp] NE 2)) {
123
124 DB_EXIT("ne_end");
125 return; /* ... or, we're done */
126 }
127
128 DB_CMNT("ne_end - recording");
129
130 /* make pointers point in the forward direction */
131
132 if (sd EQ D_BAK)
133 chgsdf();
134
135 if (se EQ D_BAK)
136 chgsef();
137/*
138
139*/
140 nn = trg & 0x007F; /* note number */
141
142 if (clksrc NE CK_STEP) { /* not in step mode */
143
144 DB_CMNT("ne_end - non-step");
145
146 if (E_NULL NE (ep = (struct n_entry *)e_alc(E_SIZE1))) {
147
148 DB_CMNT("ne_end - enter note end");
149 ep->e_time = t_cur;
150 ep->e_type = EV_NEND | 0x80;
151 ep->e_note = nn;
152 ep->e_group = grp;
153 ep->e_vel = SM_SCALE(64);
154
155 p_cur = e_ins((struct s_entry *)ep,
156 ep_adj(p_cur, 0, t_cur))->e_fwd;
157
158 if (t_cur EQ t_ctr)
159 newflag = TRUE;
160
161 se_disp(ep, D_FWD, gdstbc, 1);
162
163 } else {
164
165 DB_CMNT("ne_end - no space");
166 }
167
168 DB_EXIT("ne_end");
169 return;
170/*
171
172*/
173 } else if (nkdown GE 1) { /* process note entry in step mode */
174
175 DB_CMNT("ne_end - log key up");
176
177 if (0 EQ --nkdown) { /* if all keys are up ... */
178
179 if (stepenb) {
180
181 /* advance by the note weight */
182
183 DB_CMNT("ne_end - advance weight");
184 fcend = fc_val + stepfrm[3][stepint];
185 fc_val += stepfrm[stepwgt][stepint];
186 sc_trek(fc_val);
187 sc_trak(fc_val);
188 DB_CMNT("ne_end - doing note ends");
189 }
190
191 while (nelist) {
192
193 nn = nelist->note; /* get note */
194 grp = nelist->group; /* get group */
195
196 if (E_NULL NE (ep = (struct n_entry *)e_alc(E_SIZE1))) {
197
198 DB_CMNT("ne_end - enter note end");
199 ep->e_time = t_cur;
200 ep->e_type = EV_NEND | 0x80;
201 ep->e_note = nn;
202 ep->e_group = grp;
203 ep->e_vel = SM_SCALE(64);
204
205 p_cur = e_ins((struct s_entry *)ep,
206 ep_adj(p_cur, 0, t_cur))->e_fwd;
207
208 se_disp(ep, D_FWD, gdstbc, 1);
209
210 if (lstendc < NLSTENTS)
211 lstends[lstendc++] = ep;
212
213 } else {
214
215 DB_CMNT("ne_end - no space");
216 }
217/*
218
219*/
220 DB_CMNT("ne_end - freeing nevent");
221 nx = nelist->nxt; /* get next nelist ptr */
222 nelist->nxt = nefree; /* free nelist entry */
223 nefree = nelist; /* ... */
224 nelist = nx; /* update nelist */
225 }
226
227 lstflag = TRUE; /* indicate end of list */
228
229 DB_CMNT("ne_end - note ends done");
230
231 if (stepenb) {
232
233 if (fc_val LT fcend) { /* advance to the interval */
234
235 DB_CMNT("ne_end - advance interval");
236 fc_val = fcend;
237 sc_trek(fc_val);
238 sc_trak(fc_val);
239 }
240 }
241 }
242
243 } else {
244
245 nkdown = 0; /* no keys down */
246
247 lstendc = 0; /* no step entries to delete */
248 lstbgnc = 0;
249 lstflag = FALSE;
250 }
251
252 DB_EXIT("ne_end");
253}
254
255/*
256
257*/
258
259/*
260 =============================================================================
261 ne_bgn() -- enter a note begin event
262 =============================================================================
263*/
264
265void ne_bgn(int16_t grp, int16_t key, int16_t vel)
266{
267 register struct n_entry *ep;
268 register struct nevent *np;
269
270 DB_ENTR("ne_bgn");
271
272 /* must be recording into a group in record mode ... */
273
274 if ((recsw NE 0) AND (grpmode[grp] EQ 2)) {
275
276 DB_CMNT("ne_bgn - recording");
277
278 /* make pointers point in the forward direction */
279
280 if (sd EQ D_BAK)
281 chgsdf();
282
283 if (se EQ D_BAK)
284 chgsef();
285
286 if (lstflag) { /* cancel old list of notes */
287
288 lstbgnc = 0;
289 lstendc = 0;
290 lstflag = FALSE;
291 }
292
293 if (clksrc EQ CK_STEP) { /* step mode */
294
295 DB_CMNT("ne_bgn - step");
296 ++nkdown; /* count keys down */
297
298 if (nefree) { /* log a key closure */
299
300 np = nefree;
301 nefree = np->nxt;
302 np->note = key;
303 np->group = grp;
304 np->nxt = nelist;
305 nelist = np;
306 DB_CMNT("ne_bgn - key logged");
307
308 } else {
309
310 DB_CMNT("ne_bgn - nefree empty");
311 }
312 }
313/*
314
315*/
316 if (E_NULL NE (ep = (struct n_entry *)e_alc(E_SIZE1))) {
317
318 DB_CMNT("ne_bgn - enter note begin");
319 ep->e_time = t_cur;
320 ep->e_type = EV_NBEG | 0x80;
321 ep->e_note = key;
322 ep->e_group = grp;
323 ep->e_vel = (clksrc EQ CK_STEP) ? SM_SCALE(64) : vel;
324
325 p_cur = e_ins((struct s_entry *)ep,
326 ep_adj(p_cur, 0, t_cur))->e_fwd;
327
328 se_disp(ep, D_FWD, gdstbc, 1);
329
330 if (t_cur EQ t_ctr)
331 newflag = TRUE;
332
333 if ((clksrc EQ CK_STEP) AND (lstbgnc < NLSTENTS))
334 lstbgns[lstbgnc++] = ep;
335
336 } else {
337
338 DB_CMNT("ne_bgn - no space");
339 }
340 }
341
342 DB_EXIT("ne_bgn");
343}
344
345/*
346
347*/
348
349/*
350 =============================================================================
351 showvel() -- display velocity for a group
352 =============================================================================
353*/
354
355void showvel(int16_t g, int16_t v)
356{
357 int8_t buf[6];
358
359 if (v_regs[5] & 0x0180)
360 vbank(0);
361
362 lastvel[g] = v;
363
364 sprintf(buf, "%03d", (v / 252));
365
366 vputs(obj8, 5, (g * 5) + 6, buf, SDW11ATR);
367}
368
369/*
370
371*/
372
373/*
374 =============================================================================
375 asgvce() -- assign a voice
376 =============================================================================
377*/
378
379void asgvce(int16_t grp, int16_t port, int16_t chan, int16_t key, int16_t vel)
380{
381 register int16_t i;
382 register int16_t tv;
383 register int16_t vp;
384 register int16_t trg;
385 register int16_t aflag;
386 register struct nevent *np;
387 register struct n_entry *ep;
388
389 DB_ENTR("asgvce");
390
391 trg = (port << 11) + (chan << 7) + key; /* trigger number */
392 vp = lastvce[grp] + 1; /* voice to start with */
393 vp = (vp > 11) ? 0 : vp; /* ... (adjust into range) */
394
395/*
396
397*/
398
399 DB_CMNT("asgvce - search unassgined");
400
401 for (i = 12; i--; ) { /* search for unassigned voice */
402
403 if ((vce2trg[vp] EQ -1) AND (vce2grp[vp] EQ (grp + 1))) {
404
405 if ((ndisp EQ 2) AND velflag AND (NOT recsw))
406 showvel(grp, vel);
407
408 lastvce[grp] = vp;
409 execkey(trg, tuntab[key], vp, 0);
410 DB_EXIT("asgvce - free voice");
411 return;
412 }
413
414 if (++vp > 11)
415 vp = 0;
416 }
417
418 DB_CMNT("asgvce - seach non-held");
419
420 for (i = 12; i--; ) { /* search for non-held voice */
421
422 tv = vce2trg[vp];
423
424 if (tv EQ -1)
425 aflag = TRUE; /* OK - unassigned */
426 else if (0 EQ (tv & (MKEYHELD << 8)))
427 aflag = TRUE; /* OK - not held */
428 else
429 aflag = FALSE; /* NO - held */
430
431 if (aflag AND (vce2grp[vp] EQ (grp + 1))) {
432
433 if ((ins2grp[grp] & GTAG1) AND
434 (tv NE trg) AND (tv NE -1))
435 legato = 1;
436
437 if ((ndisp EQ 2) AND velflag AND (NOT recsw))
438 showvel(grp, vel);
439
440 lastvce[grp] = vp;
441 execkey(trg, tuntab[key], vp, 0);
442 DB_EXIT("asgvce - stolen voice");
443 return;
444 }
445
446 if (++vp > 11)
447 vp = 0;
448 }
449
450 DB_EXIT("asgvce - no voice");
451}
452
Note: See TracBrowser for help on using the repository browser.