source: buchla-68k/ram/scwrite.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.1 KB
Line 
1/*
2 =============================================================================
3 scwrite.c -- librarian - write score functions
4 Version 14 -- 1988-06-22 -- D.N. Lynx Crowe
5 =============================================================================
6*/
7
8#define DEBUGIT 0
9
10#include "stddefs.h"
11#include "stdio.h"
12#include "hwdefs.h"
13#include "graphdef.h"
14#include "vsdd.h"
15#include "score.h"
16#include "scfns.h"
17
18#include "midas.h"
19#include "libdsp.h"
20
21#if DEBUGIT
22extern short debugsw;
23#endif
24
25extern int32_t chksum(int8_t *area, int32_t len);
26
27extern int16_t wr_ec(FILE *fp, int8_t *from, int32_t len);
28extern void ldwmsg(int8_t *line1, int8_t *line2, int8_t *line3, uint16_t fgcolor, uint16_t bgcolor);
29
30extern int32_t schksum; /* score checksum */
31extern int32_t snbreq; /* number of disk bytes required */
32extern int32_t snlreq; /* number of score bytes required */
33extern int32_t sntbreq; /* total number of disk bytes required */
34extern int32_t sntlreq; /* total number of score bytes required */
35
36extern int32_t nlpersc[N_SCORES]; /* number of longs per score */
37extern int32_t scsums[N_SCORES]; /* score checksums */
38
39extern struct s_time stimes[N_SCORES][N_SECTS]; /* section times */
40
41/*
42
43*/
44
45int32_t m1con = -1L; /* null score constant */
46
47int16_t scsizes[N_ETYPES][2] = { /* score event sizes (in bytes) */
48
49 /* [0] = score, [1] = disk */
50
51 {20, 0}, /* 0 - EV_NULL */
52 {20, 6}, /* 1 - EV_SCORE */
53 {24, 6}, /* 2 - EV_SBGN */
54 {24, 6}, /* 3 - EV_SEND */
55 {24, 7}, /* 4 - EV_INST */
56 {20, 9}, /* 5 - EV_NBEG */
57 {20, 9}, /* 6 - EV_NEND */
58 {20, 5}, /* 7 - EV_STOP */
59 {20, 7}, /* 8 - EV_INTP */
60 {24, 6}, /* 9 - EV_TMPO */
61 {24, 6}, /* 10 - EV_TUNE */
62 {24, 7}, /* 11 - EV_GRP */
63 {24, 7}, /* 12 - EV_LOCN */
64 {24, 7}, /* 13 - EV_DYN */
65 {24, 8}, /* 14 - EV_ANVL */
66 {24, 7}, /* 15 - EV_ANRS */
67 {24, 6}, /* 16 - EV_ASGN */
68 {32, 8}, /* 17 - EV_TRNS */
69 {20, 6}, /* 18 - EV_REPT */
70 {20, 6}, /* 19 - EV_PNCH */
71 {20, 7}, /* 20 - EV_PRES */
72 {20, 6}, /* 21 - EV_FINI */
73 {20, 7}, /* 22 - EV_CPRS */
74 {20, 5}, /* 23 - EV_BAR */
75 {20, 5} /* 24 - EV_NEXT */
76};
77
78/*
79
80*/
81
82/*
83 =============================================================================
84 scsize() -- return number of bytes needed for a score
85 =============================================================================
86*/
87
88int32_t scsize(int16_t sn)
89{
90 register int32_t nb, nl, sc;
91 register struct s_entry *ep;
92 register int16_t go;
93
94 snbreq = nb = 0L; /* number of disk bytes required */
95 snlreq = nl = 0L; /* number of score bytes required */
96 schksum = sc = 0L; /* score checksum */
97
98 ep = scores[sn]; /* pointer to score begin */
99
100 if (E_NULL EQ ep) { /* empty scores don't take any space */
101
102#if DEBUGIT
103 if (debugsw)
104 printf("scsize(%d): empty score\n", sn);
105#endif
106 return(0L);
107 }
108
109 go = TRUE;
110
111/*
112
113*/
114 do {
115 ep->e_type &= 0x7F; /* clear new-data flag */
116
117 nl += scsizes[ep->e_type][0];
118 nb += scsizes[ep->e_type][1];
119
120 switch (ep->e_type) {
121
122 case EV_BAR: /* bar marker */
123 case EV_STOP: /* stop */
124 case EV_NEXT: /* next */
125
126 sc += ep->e_type + ep->e_time;
127 break;
128
129 case EV_SCORE: /* score begin */
130 case EV_SBGN: /* section begin */
131 case EV_SEND: /* section end */
132 case EV_TMPO: /* tempo */
133 case EV_TUNE: /* tuning */
134 case EV_ASGN: /* I/O assign */
135 case EV_REPT: /* repeat */
136 case EV_PNCH: /* punch in/out */
137
138 sc += ep->e_type + ep->e_time + ep->e_data1;
139 break;
140
141 case EV_NBEG: /* note begin */
142 case EV_NEND: /* note end */
143
144 sc += ep->e_type + ep->e_time + ep->e_data1
145 + ep->e_data2 + ((struct n_entry *)ep)->e_vel;
146
147 break;
148/*
149
150*/
151 case EV_INST: /* instrument change */
152 case EV_INTP: /* interpolate */
153 case EV_GRP: /* group status */
154 case EV_LOCN: /* location */
155 case EV_DYN: /* dynamics */
156 case EV_PRES: /* polyphonic pressure */
157 case EV_CPRS: /* channel pressure */
158 case EV_ANRS: /* analog resolution */
159
160 sc += ep->e_type + ep->e_time + ep->e_data1
161 + ep->e_data2;
162
163 break;
164
165 case EV_TRNS: /* transposition */
166
167 sc += ep->e_type + ep->e_time + ep->e_data1
168 + (int16_t)ep->e_lft;
169
170 break;
171
172 case EV_ANVL: /* analog value */
173
174 sc += ep->e_type + ep->e_time + ep->e_data1
175 + (int16_t)(0x0000FFFFL & ((int32_t)ep->e_dn >> 16));
176
177 break;
178
179 case EV_FINI: /* score end */
180
181 sc += ep->e_type + ep->e_time + ep->e_data1;
182 go = FALSE;
183 break;
184 }
185
186 ep = ep->e_fwd;
187
188 } while (go);
189
190 schksum = sc;
191 snbreq = nb;
192 snlreq = (nl + 3L) >> 2;
193
194#if DEBUGIT
195 if (debugsw)
196 printf("scsize(%d): %ld bytes, checksum = %ld\n", nb, schksum);
197#endif
198
199 return(nb);
200}
201
202/*
203
204*/
205
206/*
207 =============================================================================
208 scsizer() -- return number of bytes necessary for storing active scores
209 =============================================================================
210*/
211
212int32_t scsizer(void)
213{
214 register int16_t i;
215 register int32_t nb;
216
217 sntlreq = 0L;
218 nb = 0L;
219
220 for (i = 0; i < N_SCORES; i++) {
221
222 nlpersc[i] = 0L;
223 scsums[i] = 0L;
224
225 nb += 4L; /* overhead for number of longs or -1L marker */
226
227 if (scores[i] NE E_NULL) {
228
229 /* add storage length of events + name + times */
230
231 nb += scsize(i) + 16L
232 + (int32_t)(N_SECTS * sizeof (struct s_time));
233
234 nlpersc[i] = snlreq; /* update size table */
235 scsums[i] = schksum; /* update checksum table */
236 sntlreq += snlreq; /* update total longs count */
237 }
238 }
239
240 nb += 4L; /* overhead for total longs count */
241
242#if DEBUGIT
243 if (debugsw)
244 printf("scsizer(): %ld bytes required\n", nb);
245#endif
246
247 sntbreq = nb;
248
249 return(nb);
250}
251
252/*
253
254*/
255
256/*
257 =============================================================================
258 scwrite() -- store a score
259 =============================================================================
260*/
261
262int16_t scwrite(int16_t sn, FILE *fp)
263{
264 register struct s_entry *ep;
265 register int16_t go;
266 int8_t scid[48];
267
268 ep = scores[sn]; /* pointer to score begin */
269
270#if DEBUGIT
271 if (debugsw)
272 printf("scwrite(%d, $%08lX): ep = $%08lX\n", sn, fp, ep);
273#endif
274
275 if (E_NULL EQ ep) { /* empty scores only get a flag */
276
277 sprintf(scid, "score %d was empty", sn + 1);
278
279 ldwmsg((int8_t *)0L, scid, (int8_t *)0L, LCFBX10, LCBBX10);
280
281 if (wr_ec(fp, &m1con, 4L))
282 return(FAILURE);
283 else
284 return(SUCCESS);
285 }
286
287 sprintf(scid, " writing score %d", sn + 1);
288
289 ldwmsg("Busy -- Please stand by", (int8_t *)0L, scid,
290 LCFBX10, LCBBX10);
291
292 if (wr_ec(fp, &nlpersc[sn], 4L)) /* number of longs required */
293 return(FAILURE);
294
295 if (wr_ec(fp, &scname[sn], 16L)) /* score name */
296 return(FAILURE);
297
298 if (wr_ec(fp, &stimes[sn], (int32_t)(N_SECTS * 12))) /* section times */
299 return(FAILURE);
300
301 go = TRUE;
302
303 do {
304
305 switch (ep->e_type) {
306
307 case EV_BAR: /* bar marker */
308 case EV_STOP: /* stop */
309 case EV_NEXT: /* next */
310
311 if (wr_ec(fp, &ep->e_type, 1L))
312 return(FAILURE);
313
314 if (wr_ec(fp, &ep->e_time, 4L))
315 return(FAILURE);
316
317 break;
318
319 case EV_SCORE: /* score begin */
320 case EV_SBGN: /* section begin */
321 case EV_SEND: /* section end */
322 case EV_TMPO: /* tempo */
323 case EV_TUNE: /* tuning */
324 case EV_ASGN: /* I/O assign */
325 case EV_REPT: /* repeat */
326 case EV_PNCH: /* punch in/out */
327
328 if (wr_ec(fp, &ep->e_type, 1L))
329 return(FAILURE);
330
331 if (wr_ec(fp, &ep->e_time, 4L))
332 return(FAILURE);
333
334 if (wr_ec(fp, &ep->e_data1, 1L))
335 return(FAILURE);
336
337 break;
338/*
339
340*/
341 case EV_INST: /* instrument change */
342 case EV_INTP: /* interpolate */
343 case EV_GRP: /* group status */
344 case EV_LOCN: /* location */
345 case EV_DYN: /* dynamics */
346 case EV_PRES: /* polyphonic pressure */
347 case EV_CPRS: /* channel pressure */
348 case EV_ANRS: /* analog resolution */
349
350 if (wr_ec(fp, &ep->e_type, 1L))
351 return(FAILURE);
352
353 if (wr_ec(fp, &ep->e_time, 4L))
354 return(FAILURE);
355
356 if (wr_ec(fp, &ep->e_data1, 1L))
357 return(FAILURE);
358
359 if (wr_ec(fp, &ep->e_data2, 1L))
360 return(FAILURE);
361
362 break;
363/*
364
365*/
366 case EV_NBEG: /* note begin */
367 case EV_NEND: /* note end */
368
369 if (wr_ec(fp, &ep->e_type, 1L))
370 return(FAILURE);
371
372 if (wr_ec(fp, &ep->e_time, 4L))
373 return(FAILURE);
374
375 if (wr_ec(fp, &ep->e_data1, 1L))
376 return(FAILURE);
377
378 if (wr_ec(fp, &ep->e_data2, 1L))
379 return(FAILURE);
380
381 if (wr_ec(fp, &(((struct n_entry *)ep)->e_vel), 2L))
382 return(FAILURE);
383
384 break;
385
386 case EV_TRNS: /* transposition */
387
388 if (wr_ec(fp, &ep->e_type, 1L))
389 return(FAILURE);
390
391 if (wr_ec(fp, &ep->e_time, 4L))
392 return(FAILURE);
393
394 if (wr_ec(fp, &ep->e_data1, 1L))
395 return(FAILURE);
396
397 if (wr_ec(fp, &ep->e_lft, 2L))
398 return(FAILURE);
399
400 break;
401/*
402
403*/
404 case EV_ANVL: /* analog value */
405
406 if (wr_ec(fp, &ep->e_type, 1L))
407 return(FAILURE);
408
409 if (wr_ec(fp, &ep->e_time, 4L))
410 return(FAILURE);
411
412 if (wr_ec(fp, &ep->e_data1, 1L))
413 return(FAILURE);
414
415 if (wr_ec(fp, &ep->e_dn, 2L))
416 return(FAILURE);
417
418 break;
419
420 case EV_FINI: /* score end */
421
422 if (wr_ec(fp, &ep->e_type, 1L))
423 return(FAILURE);
424
425 if (wr_ec(fp, &ep->e_time, 4L))
426 return(FALSE);
427
428 if (wr_ec(fp, &ep->e_data1, 1L))
429 return(FAILURE);
430
431 go = FALSE;
432
433#if DEBUGIT
434 if (debugsw)
435 printf("scwrite(): EV_FINI\n");
436#endif
437 break;
438
439 }
440
441 ep = ep->e_fwd;
442
443 } while (go);
444
445#if DEBUGIT
446 if (debugsw)
447 printf("scwrite(): SUCCESS\n");
448#endif
449
450 return(SUCCESS);
451}
Note: See TracBrowser for help on using the repository browser.