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

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

Added missing includes and declarations.

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