Browse code

Splitted audio device into four

Andrew Alderwick authored on 26/04/2021 18:49:34
Showing 5 changed files
... ...
@@ -6,8 +6,6 @@
6 6
 %++ { #0001 ADD2 }
7 7
 %MOD { DUP2 DIV MUL SUB }
8 8
 %TRACK { ;track/ch1 #00 .track/active PEK #0020 MUL2 ADD2 }
9
-%SOUND { STH #00 .Audio/value DEO2 STHr #00 .Audio/delay DEO2 }
10
-%SOUND_FINISH { #00 .Audio/finish DEO }
11 9
 
12 10
 ( variables )
13 11
 
... ...
@@ -21,15 +19,16 @@
21 19
 @knob [ &x $2 &y $2 &value $1 ]
22 20
 @head [ &pos $1 ]
23 21
 @track [ &active $1 &ch1 $20 &ch2 $20 &ch3 $20 &ch4 $20 ]
24
-@adsr [ &ch1 $2 &ch2 $2 &ch3 $2 &ch4 $2 ]
25
-@volume [ &ch1 $1 &ch2 $1 &ch3 $1 &ch4 $1 ]
26 22
 
27 23
 ( devices )
28 24
 
29 25
 |00 @System [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
30 26
 |10 @Console [ &vector $2 &pad $6 &char $1 &byte $1 &short $2 &string $2 ]
31 27
 |20 @Screen [ &vector $2 &width $2 &height $2 &pad $2 &x $2 &y $2 &addr $2 &color $1 ]
32
-|30 @Audio [ &pad $8 &adsr $2 &len $2 &addr $2 &volume $1 &pitch $1 ]
28
+|30 @Audio0 [ &vector $2 &output $1 &pad $5 &adsr $2 &len $2 &addr $2 &volume $1 &pitch $1 ]
29
+|40 @Audio1 [ &vector $2 &output $1 &pad $5 &adsr $2 &len $2 &addr $2 &volume $1 &pitch $1 ]
30
+|50 @Audio2 [ &vector $2 &output $1 &pad $5 &adsr $2 &len $2 &addr $2 &volume $1 &pitch $1 ]
31
+|60 @Audio3 [ &vector $2 &output $1 &pad $5 &adsr $2 &len $2 &addr $2 &volume $1 &pitch $1 ]
33 32
 |80 @Controller [ &vector $2 &button $1 &key $1 ]
34 33
 |90 @Mouse [ &vector $2 &x $2 &y $2 &state $1 &chord $1 ]
35 34
 |a0 @File [ &vector $2 &success $2 &offset $2 &pad $2 &name $2 &length $2 &load $2 &save $2 ]
... ...
@@ -56,12 +55,19 @@
56 55
 	.trkframe/x2 PEK2 .ctlframe/x2 POK2 .chnframe/y2 PEK2 .ctlframe/y2 POK2
57 56
 
58 57
 	( default settings )
59
-	#048c .adsr/ch1 POK2 #88 .volume/ch1 POK
60
-	#159d .adsr/ch2 POK2 #88 .volume/ch2 POK
61
-	#26ae .adsr/ch3 POK2 #88 .volume/ch3 POK
62
-	#260e .adsr/ch4 POK2 #88 .volume/ch4 POK
63
-
64
-	.volume/ch3 PEK .Audio/volume DEO
58
+	#048c .Audio0/adsr DEO2 #88 .Audio0/volume DEO
59
+	#159d .Audio1/adsr DEO2 #88 .Audio1/volume DEO
60
+	#26ae .Audio2/adsr DEO2 #88 .Audio2/volume DEO
61
+	#0000 .Audio3/adsr DEO2 #88 .Audio3/volume DEO
62
+
63
+	;square-wave .Audio0/addr DEO2
64
+	;square-wave/end ;square-wave SUB2 .Audio0/len DEO2
65
+	;triangle-wave .Audio1/addr DEO2
66
+	;triangle-wave/end ;triangle-wave SUB2 .Audio1/len DEO2
67
+	;sine-wave .Audio2/addr DEO2
68
+	;sine-wave/end ;sine-wave SUB2 .Audio2/len DEO2
69
+	;noise-wave .Audio3/addr DEO2
70
+	;noise-wave-end ;noise-wave SUB2 .Audio3/len DEO2
65 71
 
66 72
 	;draw-timeline JSR2
67 73
 	;draw-controls JSR2
... ...
@@ -122,10 +128,7 @@ BRK
122 128
 
123 129
 @play ( pitch -- )
124 130
 
125
-	.adsr/ch3 PEK2 .Audio/adsr DEO2
126
-	;triangle-wave .Audio/addr DEO2
127
-	;triangle-wave/end ;triangle-wave SUB2 .Audio/len DEO2
128
-	.Audio/pitch DEO
131
+	.Audio0/pitch DEO
129 132
 
130 133
 RTN
131 134
 
... ...
@@ -157,29 +160,29 @@ BRK
157 160
 	
158 161
 	.Mouse/x DEI2 .ctlframe/x1 PEK2 SUB2 8- 8/ SWP POP #02 DIV
159 162
 	DUP #00 NEQ ,&no-a JNZ
160
-		.adsr .track/active PEK #02 MUL ADD PEK
163
+		.Audio0/adsr .track/active PEK #10 MUL ADD DEI
161 164
 		#10 .Mouse/state DEI #10 EQU #e0 MUL ADD ADD
162
-		.adsr .track/active PEK #02 MUL ADD POK &no-a
165
+		.Audio0/adsr .track/active PEK #10 MUL ADD DEO &no-a
163 166
 	DUP #01 NEQ ,&no-d JNZ
164
-		.adsr .track/active PEK #02 MUL ADD PEK
167
+		.Audio0/adsr .track/active PEK #10 MUL ADD DEI
165 168
 		DUP #f0 AND STH #01 .Mouse/state DEI #10 EQU #0e MUL ADD ADD #0f AND STHr ADD
166
-		.adsr .track/active PEK #02 MUL ADD POK &no-d
169
+		.Audio0/adsr .track/active PEK #10 MUL ADD DEO &no-d
167 170
 	DUP #02 NEQ ,&no-s JNZ
168
-		.adsr .track/active PEK #02 MUL ADD #01 ADD PEK
171
+		.Audio0/adsr .track/active PEK #10 MUL ADD #01 ADD DEI
169 172
 		#10 .Mouse/state DEI #10 EQU #e0 MUL ADD ADD
170
-		.adsr .track/active PEK #02 MUL ADD #01 ADD POK &no-s
173
+		.Audio0/adsr .track/active PEK #10 MUL ADD #01 ADD DEO &no-s
171 174
 	DUP #03 NEQ ,&no-r JNZ
172
-		.adsr .track/active PEK #02 MUL ADD #01 ADD PEK
175
+		.Audio0/adsr .track/active PEK #10 MUL ADD #01 ADD DEI
173 176
 		DUP #f0 AND STH #01 .Mouse/state DEI #10 EQU #0e MUL ADD ADD #0f AND STHr ADD
174
-		.adsr .track/active PEK #02 MUL ADD #01 ADD POK &no-r
177
+		.Audio0/adsr .track/active PEK #10 MUL ADD #01 ADD DEO &no-r
175 178
 	DUP #05 NEQ ,&no-left JNZ
176
-		;volume #00 .track/active PEK ADD2 GET
179
+		.Audio0/volume .track/active PEK #10 MUL ADD DEI
177 180
 		#10 .Mouse/state DEI #10 EQU #e0 MUL ADD ADD
178
-		;volume #00 .track/active PEK ADD2 PUT &no-left
181
+		.Audio0/volume .track/active PEK #10 MUL ADD DEO &no-left
179 182
 	DUP #06 NEQ ,&no-right JNZ
180
-		;volume #00 .track/active PEK ADD2 GET
183
+		.Audio0/volume .track/active PEK #10 MUL ADD DEI
181 184
 		DUP #f0 AND STH #01 .Mouse/state DEI #10 EQU #0e MUL ADD ADD #0f AND STHr ADD
182
-		;volume #00 .track/active PEK ADD2 PUT &no-right
185
+		.Audio0/volume .track/active PEK #10 MUL ADD DEO &no-right
183 186
 	POP
184 187
 	( release ) #00 .Mouse/state DEO
185 188
 	;draw-controls JSR2
... ...
@@ -193,44 +196,28 @@ BRK
193 196
 	DUP #ff NEQ ,&skip1 JNZ
194 197
 		POP ,&listen2 JMP
195 198
 	&skip1
196
-	.adsr/ch1 PEK2 .Audio/adsr DEO2
197
-	.volume/ch1 PEK .Audio/volume DEO
198
-	;square-wave .Audio/addr DEO2
199
-	;square-wave/end ;square-wave SUB2 .Audio/len DEO2
200
-	#00 SWP ;notes ADD2 GET .Audio/pitch DEO
199
+	#00 SWP ;notes ADD2 GET .Audio0/pitch DEO
201 200
 	&listen2
202 201
 	;track/ch2 #00 .head/pos PEK #08 DIV ADD2 GET
203 202
 	#01 SUB
204 203
 	DUP #ff NEQ ,&skip2 JNZ
205 204
 		POP ,&listen3 JMP
206 205
 	&skip2
207
-	.adsr/ch2 PEK2 .Audio/adsr DEO2
208
-	.volume/ch2 PEK .Audio/volume DEO
209
-	;triangle-wave .Audio/addr DEO2
210
-	;triangle-wave/end ;triangle-wave SUB2 .Audio/len DEO2
211
-	#00 SWP ;notes ADD2 GET .Audio/pitch DEO
206
+	#00 SWP ;notes ADD2 GET .Audio1/pitch DEO
212 207
 	&listen3
213 208
 	;track/ch3 #00 .head/pos PEK #08 DIV ADD2 GET
214 209
 	#01 SUB
215 210
 	DUP #ff NEQ ,&skip3 JNZ
216 211
 		POP ,&listen4 JMP
217 212
 	&skip3
218
-	.adsr/ch3 PEK2 .Audio/adsr DEO2
219
-	.volume/ch3 PEK .Audio/volume DEO
220
-	;sine-wave .Audio/addr DEO2
221
-	;sine-wave/end ;sine-wave SUB2 .Audio/len DEO2
222
-	#00 SWP ;notes ADD2 GET .Audio/pitch DEO
213
+	#00 SWP ;notes ADD2 GET .Audio2/pitch DEO
223 214
 	&listen4
224 215
 	;track/ch4 #00 .head/pos PEK #08 DIV ADD2 GET
225 216
 	#01 SUB
226 217
 	DUP #ff NEQ ,&skip4 JNZ
227 218
 		POP ,&end JMP
228 219
 	&skip4
229
-	#0000 .Audio/adsr DEO2
230
-	.volume/ch4 PEK .Audio/volume DEO
231
-	;noise-wave .Audio/addr DEO2
232
-	;noise-wave-end ;noise-wave SUB2 .Audio/len DEO2
233
-	#00 SWP ;notes ADD2 GET #80 ORA .Audio/pitch DEO
220
+	#00 SWP ;notes ADD2 GET #80 ORA .Audio3/pitch DEO
234 221
 	&end
235 222
 
236 223
 RTN
... ...
@@ -400,31 +387,31 @@ RTN
400 387
 	( env )
401 388
 	.ctlframe/x1 PEK2 8+ .ctlframe/y1 PEK2 8+ #22 ;env_txt ;draw-label JSR2
402 389
 	.ctlframe/x1 PEK2 8+ .ctlframe/y1 PEK2 #0010 ADD2
403
-		.adsr .track/active PEK #02 MUL ADD PEK #04 SFT
390
+		.Audio0/adsr .track/active PEK #10 MUL ADD DEI #04 SFT
404 391
 		;draw-knob JSR2
405 392
 	.ctlframe/x1 PEK2 #0018 ADD2 .ctlframe/y1 PEK2 #0010 ADD2
406
-		.adsr .track/active PEK #02 MUL ADD PEK #0f AND
393
+		.Audio0/adsr .track/active PEK #10 MUL ADD DEI #0f AND
407 394
 		;draw-knob JSR2
408 395
 	.ctlframe/x1 PEK2 #0028 ADD2 .ctlframe/y1 PEK2 #0010 ADD2
409
-		.adsr .track/active PEK #02 MUL ADD #01 ADD PEK #04 SFT
396
+		.Audio0/adsr .track/active PEK #10 MUL ADD #01 ADD DEI #04 SFT
410 397
 		;draw-knob JSR2
411 398
 	.ctlframe/x1 PEK2 #0038 ADD2 .ctlframe/y1 PEK2 #0010 ADD2
412
-		.adsr .track/active PEK #02 MUL ADD #01 ADD PEK #0f AND
399
+		.Audio0/adsr .track/active PEK #10 MUL ADD #01 ADD DEI #0f AND
413 400
 		;draw-knob JSR2
414 401
 	( vol )
415 402
 	.ctlframe/x1 PEK2 #0058 ADD2 .ctlframe/y1 PEK2 8+ #22 ;vol_txt ;draw-label JSR2
416 403
 	.ctlframe/x1 PEK2 #0058 ADD2 .ctlframe/y1 PEK2 #0010 ADD2
417
-		;volume #00 .track/active PEK ADD2 GET #04 SFT
404
+		.Audio0/volume .track/active PEK #10 MUL ADD DEI #04 SFT
418 405
 	;draw-knob/force JSR2
419 406
 	.ctlframe/x1 PEK2 #0068 ADD2 .ctlframe/y1 PEK2 #0010 ADD2
420
-		;volume #00 .track/active PEK ADD2 GET #0f AND
407
+		.Audio0/volume .track/active PEK #10 MUL ADD DEI #0f AND
421 408
 	;draw-knob/force JSR2
422 409
 
423 410
 RTN
424 411
 
425 412
 @draw-vu ( -- )
426 413
 	.ctlframe/x1 PEK2 #0088 ADD2 .ctlframe/y1 PEK2 #0010 ADD2
427
-		.Audio/volume DEI DUP STH #04 SFT
414
+		.Audio0/output .track/active PEK #10 MUL ADD DEI DUP STH #04 SFT
428 415
 	;draw-knob/force JSR2
429 416
 	.ctlframe/x1 PEK2 #0098 ADD2 .ctlframe/y1 PEK2 #0010 ADD2
430 417
 		STHr #0f AND
... ...
@@ -513,8 +500,8 @@ RTN
513 500
 
514 501
 RTN
515 502
 
516
-@ch1_txt [ "SQR  00 ]
517
-@ch2_txt [ "TRI  00 ]
503
+@ch1_txt [ "SQR 20 00 ]
504
+@ch2_txt [ "TRI 20 00 ]
518 505
 @ch3_txt [ "SINE 00 ]
519 506
 @ch4_txt [ "DRUM 00 ]
520 507
 @env_txt [ "Envelope 00 ]
... ...
@@ -12,7 +12,7 @@
12 12
 |00 @System     [ &vector $2 &pad      $6 &r      $2 &g     $2 &b      $2 ]
13 13
 |10 @Console    [ &pad    $8 &char     $1 &byte   $1 &short $2 &string $2 ]
14 14
 |20 @Screen     [ &vector $2 &width    $2 &height $2 &pad   $2 &x      $2 &y     $2 &addr $2 &color $1 ]
15
-|30 @Audio      [ &pad    $8 &adsr     $2 &length $2 &addr  $2 &volume $1 &pitch $1 ]
15
+|30 @Audio      [ &vector $2 &output   $1 &pad    $5 &adsr     $2 &length $2 &addr  $2 &volume $1 &pitch $1 ]
16 16
 |70 @Midi       [ &vector $2 &message  $2 ]
17 17
 |80 @Controller [ &vector $2 &button   $1 &key    $1 ]
18 18
 |90 @Mouse      [ &vector $2 &x        $2 &y      $2 &state $1 &chord  $1 ]
... ...
@@ -87,9 +87,8 @@ BRK
87 87
 	
88 88
 	.wave-view/x1 PEK2 #0028 ADD2 .Screen/x DEO2
89 89
 	.wave-view/y1 PEK2 #0010 SUB2 .Screen/y DEO2
90
-	.Audio/volume DEI #04 SFT TOS #0008 MUL2 ;meter ADD2 .Screen/addr DEO2
90
+	.Audio/output DEI #04 SFT TOS #0008 MUL2 ;meter ADD2 .Screen/addr DEO2
91 91
 	#21 .Screen/color DEO
92
-	#88 .Audio/volume DEO
93 92
 
94 93
 
95 94
 BRK
... ...
@@ -54,8 +54,8 @@ apu_render(Apu *c, Sint16 *sample, Sint16 *end)
54 54
 			c->i %= c->len;
55 55
 		}
56 56
 		s = (Sint8)(c->addr[c->i]) * envelope(c, c->age++);
57
-		*sample++ += s * c->volume_l / 0x180;
58
-		*sample++ += s * c->volume_r / 0x180;
57
+		*sample++ += s * c->volume[0] / 0x180;
58
+		*sample++ += s * c->volume[1] / 0x180;
59 59
 	}
60 60
 }
61 61
 
... ...
@@ -81,17 +81,13 @@ apu_start(Apu *c, Uint16 adsr, Uint8 pitch)
81 81
 }
82 82
 
83 83
 Uint8
84
-apu_get_vu(Apu *c, Apu *end)
84
+apu_get_vu(Apu *c)
85 85
 {
86 86
 	size_t i;
87
-	Sint32 sum[2] = {0, 0};
88
-	for(; c < end; ++c) {
89
-		if(!c->advance) continue;
90
-		sum[0] += envelope(c, c->age) * c->volume_l;
91
-		sum[1] += envelope(c, c->age) * c->volume_r;
92
-	}
87
+	Sint32 sum[2];
88
+	if(!c->advance || !c->period) return 0;
93 89
 	for(i = 0; i < 2; ++i) {
94
-		sum[i] /= 0x800;
90
+		sum[i] = envelope(c, c->age) * c->volume[i] / 0x800;
95 91
 		if(sum[i] > 0xf) sum[i] = 0xf;
96 92
 	}
97 93
 	return (sum[0] << 4) | sum[1];
... ...
@@ -20,10 +20,10 @@ typedef struct {
20 20
 	Uint8 *addr;
21 21
 	Uint32 count, advance, period, age, a, d, s, r;
22 22
 	Uint16 i, len;
23
-	Sint8 volume_l, volume_r;
23
+	Sint8 volume[2];
24 24
 	Uint8 pitch, repeat;
25 25
 } Apu;
26 26
 
27 27
 void apu_render(Apu *c, Sint16 *sample, Sint16 *end);
28 28
 void apu_start(Apu *c, Uint16 adsr, Uint8 pitch);
29
-Uint8 apu_get_vu(Apu *c, Apu *end);
29
+Uint8 apu_get_vu(Apu *c);
... ...
@@ -25,7 +25,7 @@ static SDL_Texture *gTexture;
25 25
 static Ppu ppu;
26 26
 static Apu apu[POLYPHONY];
27 27
 static Mpu mpu;
28
-static Device *devscreen, *devmouse, *devctrl, *devmidi;
28
+static Device *devscreen, *devmouse, *devctrl, *devmidi, *devaudio0;
29 29
 
30 30
 Uint8 zoom = 0, debug = 0, reqdraw = 0;
31 31
 
... ...
@@ -251,26 +251,21 @@ file_talk(Device *d, Uint8 b0, Uint8 w)
251 251
 static void
252 252
 audio_talk(Device *d, Uint8 b0, Uint8 w)
253 253
 {
254
-	Apu *c;
255
-	if(!w) {
256
-		if(b0 == 0xe) d->dat[0xe] = apu_get_vu(apu, apu + POLYPHONY);
257
-		return;
254
+	Apu *c = &apu[d - devaudio0];
255
+	if(!w && b0 == 0x2) {
256
+		d->dat[0x2] = apu_get_vu(c);
258 257
 	}
259
-	c = &apu[d->dat[0x7] % POLYPHONY];
260
-	SDL_LockAudioDevice(audio_id);
261
-	if(b0 == 0x1) c->period -= (Sint16)mempeek16(d->dat, 0x0);
262
-	if(b0 == 0x3 || b0 == 0xf) c->len = mempeek16(d->dat, (b0 & 0x8) | 0x2);
263
-	if(b0 == 0x5 || b0 == 0xf) c->addr = &d->mem[mempeek16(d->dat, (b0 & 0x8) | 0x4)];
264
-	if(b0 == 0x6 || b0 == 0xf) {
265
-		c->volume_l = d->dat[(b0 & 0x8) | 0x6] >> 4;
266
-		c->volume_r = d->dat[(b0 & 0x8) | 0x6] & 0xf;
267
-	}
268
-	if(b0 == 0xf) {
258
+	if(w && b0 == 0xf) {
259
+		SDL_LockAudioDevice(audio_id);
260
+		c->period -= (Sint16)mempeek16(d->dat, 0x0);
261
+		c->len = mempeek16(d->dat, 0xa);
262
+		c->addr = &d->mem[mempeek16(d->dat, 0xc)];
263
+		c->volume[0] = d->dat[0xe] >> 4;
264
+		c->volume[1] = d->dat[0xe] & 0xf;
269 265
 		c->repeat = !(d->dat[0xf] & 0x80);
270 266
 		apu_start(c, mempeek16(d->dat, 0x8), d->dat[0xf] & 0x7f);
271
-		d->dat[0x7]++;
267
+		SDL_UnlockAudioDevice(audio_id);
272 268
 	}
273
-	SDL_UnlockAudioDevice(audio_id);
274 269
 }
275 270
 
276 271
 void
... ...
@@ -378,10 +373,10 @@ main(int argc, char **argv)
378 373
 	portuxn(&u, 0x0, "system", system_talk);
379 374
 	portuxn(&u, 0x1, "console", console_talk);
380 375
 	devscreen = portuxn(&u, 0x2, "screen", screen_talk);
381
-	portuxn(&u, 0x3, "audio", audio_talk);
382
-	portuxn(&u, 0x4, "---", nil_talk);
383
-	portuxn(&u, 0x5, "---", nil_talk);
384
-	portuxn(&u, 0x6, "---", nil_talk);
376
+	devaudio0 = portuxn(&u, 0x3, "audio0", audio_talk);
377
+	portuxn(&u, 0x4, "audio1", audio_talk);
378
+	portuxn(&u, 0x5, "audio2", audio_talk);
379
+	portuxn(&u, 0x6, "audio3", audio_talk);
385 380
 	devmidi = portuxn(&u, 0x7, "midi", midi_talk);
386 381
 	devctrl = portuxn(&u, 0x8, "controller", nil_talk);
387 382
 	devmouse = portuxn(&u, 0x9, "mouse", nil_talk);