comparison target-utils/buzplayer/melentry.c @ 823:9092ff68e37d

buzplayer: implement PWT mode melody entry
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 30 May 2021 04:42:05 +0000
parents eb5960dc258c
children
comparison
equal deleted inserted replaced
822:7c02cc7f28df 823:9092ff68e37d
3 #include <stdlib.h> 3 #include <stdlib.h>
4 #include "types.h" 4 #include "types.h"
5 #include "melody.h" 5 #include "melody.h"
6 6
7 extern struct melentry *melody_buf_start, *melody_buf_tailptr; 7 extern struct melentry *melody_buf_start, *melody_buf_tailptr;
8 extern int melody_mode;
8 9
9 void 10 void
10 melody_init() 11 melody_init()
11 { 12 {
12 melody_buf_tailptr = melody_buf_start; 13 melody_buf_tailptr = melody_buf_start;
14 melody_mode = 1;
15 pwt_off();
16 }
17
18 void
19 melody_init_pwt()
20 {
21 melody_buf_tailptr = melody_buf_start;
22 melody_mode = 2;
23 pwt_on();
13 } 24 }
14 25
15 void 26 void
16 melody_entry(argbulk) 27 melody_entry(argbulk)
17 char *argbulk; 28 char *argbulk;
18 { 29 {
19 char *argv[3]; 30 char *argv[3];
20 u32 tone, dur; 31 u32 tone, dur;
21 32
33 if (melody_mode != 1) {
34 printf("ERROR: wrong mode for melody entry\n");
35 return;
36 }
22 if (parse_args(argbulk, 2, 2, argv, 0) < 0) 37 if (parse_args(argbulk, 2, 2, argv, 0) < 0)
23 return; 38 return;
24 tone = strtoul(argv[0], 0, 0); 39 tone = strtoul(argv[0], 0, 0);
25 dur = strtoul(argv[1], 0, 0); 40 dur = strtoul(argv[1], 0, 0);
26 if (tone > 255 || dur < 1 || dur > 0xFFFF) { 41 if (tone > 255 || dur < 1 || dur > 0xFFFF) {
29 } 44 }
30 melody_buf_tailptr->tone = tone; 45 melody_buf_tailptr->tone = tone;
31 melody_buf_tailptr->dur = dur; 46 melody_buf_tailptr->dur = dur;
32 melody_buf_tailptr++; 47 melody_buf_tailptr++;
33 } 48 }
49
50 void
51 pwt_entry_note(argbulk)
52 char *argbulk;
53 {
54 char *argv[4];
55 u32 tone, vol, dur;
56
57 if (melody_mode != 2) {
58 printf("ERROR: wrong mode for melody entry\n");
59 return;
60 }
61 if (parse_args(argbulk, 3, 3, argv, 0) < 0)
62 return;
63 tone = strtoul(argv[0], 0, 0);
64 vol = strtoul(argv[1], 0, 0);
65 dur = strtoul(argv[2], 0, 0);
66 if (tone > 47 || vol > 63 || dur < 1 || dur > 0xFFFF) {
67 printf("ERROR: argument(s) out of range\n");
68 return;
69 }
70 melody_buf_tailptr->tone = tone;
71 melody_buf_tailptr->vol = (vol << 1) | 1;
72 melody_buf_tailptr->dur = dur;
73 melody_buf_tailptr++;
74 }
75
76 void
77 pwt_entry_rest(argbulk)
78 char *argbulk;
79 {
80 char *argv[2];
81 u32 dur;
82
83 if (melody_mode != 2) {
84 printf("ERROR: wrong mode for melody entry\n");
85 return;
86 }
87 if (parse_args(argbulk, 1, 1, argv, 0) < 0)
88 return;
89 dur = strtoul(argv[0], 0, 0);
90 if (dur < 1 || dur > 0xFFFF) {
91 printf("ERROR: argument out of range\n");
92 return;
93 }
94 melody_buf_tailptr->tone = 0;
95 melody_buf_tailptr->vol = 0;
96 melody_buf_tailptr->dur = dur;
97 melody_buf_tailptr++;
98 }