Browse code

Made Audio.value unsigned

Andrew Alderwick authored on 13/04/2021 20:54:18
Showing 4 changed files
... ...
@@ -470,24 +470,24 @@ RTN
470 470
 RTN
471 471
 
472 472
 @adsr-envelope ( -- )
473
-	#7f ,adsr #00 ~Audio.play #04 MUL ADD2 PEK2 SOUND
474
-	#40 ,adsr #00 ~Audio.play #04 MUL ADD2 #0001 ADD2 PEK2 SOUND
475
-	#40 ,adsr #00 ~Audio.play #04 MUL ADD2 #0002 ADD2 PEK2 SOUND
473
+	#ff ,adsr #00 ~Audio.play #04 MUL ADD2 PEK2 SOUND
474
+	#80 ,adsr #00 ~Audio.play #04 MUL ADD2 #0001 ADD2 PEK2 SOUND
475
+	#80 ,adsr #00 ~Audio.play #04 MUL ADD2 #0002 ADD2 PEK2 SOUND
476 476
 	#00 ,adsr #00 ~Audio.play #04 MUL ADD2 #0003 ADD2 PEK2 SOUND
477 477
 	SOUND_FINISH
478 478
 	BRK
479 479
 
480 480
 @square-wave ( -- )
481
-	#5800 SOUND
482
-	#5880 SOUND
483 481
 	#a800 SOUND
484 482
 	#a880 SOUND
483
+	#5800 SOUND
484
+	#5880 SOUND
485 485
 	BRK
486 486
 
487 487
 @triangle-wave ( -- )
488
-	#7f40 SOUND
489
-	#8180 SOUND
490
-	#0040 SOUND
488
+	#ff40 SOUND
489
+	#0080 SOUND
490
+	#8040 SOUND
491 491
 	BRK
492 492
 
493 493
 @ch1_txt [ CHN0 00 ]
... ...
@@ -87,9 +87,10 @@ apu_play_note(Note *note, Uint16 wave_vector, Uint16 envelope_vector, Uint8 volu
87 87
 	for(i = 0; i < 2; ++i) {
88 88
 		note->volume[i] = 0xf & (volume >> 4 * (1 - i));
89 89
 		note->wv[i].count = note->wv[i].period = 0;
90
-		note->wv[i].end_value = 0;
90
+		note->wv[i].end_value = 0x8000 * (1 - i);
91 91
 		note->wv[i].queue.n = note->wv[i].queue.i = 0;
92 92
 		note->wv[i].queue.finishes = 0;
93
+		note->wv[i].queue.is_envelope = i;
93 94
 	}
94 95
 	note->wv[0].vector = wave_vector;
95 96
 	note->wv[0].advance = note_advances[pitch % 12] >> (8 - pitch / 12);
... ...
@@ -17,7 +17,7 @@ typedef signed int Sint32;
17 17
 
18 18
 typedef struct {
19 19
 	Uint16 *dat;
20
-	Uint8 i, n, sz, finishes;
20
+	Uint8 i, n, sz, finishes, is_envelope;
21 21
 } Queue;
22 22
 
23 23
 typedef struct {
... ...
@@ -253,7 +253,10 @@ audio_poke(Uxn *u, Uint16 ptr, Uint8 b0, Uint8 b1)
253 253
 			apu.queue->sz = apu.queue->sz < 4 ? 4 : apu.queue->sz * 2;
254 254
 			apu.queue->dat = SDL_realloc(apu.queue->dat, apu.queue->sz * sizeof(*apu.queue->dat));
255 255
 		}
256
-		apu.queue->dat[apu.queue->n++] = (m[0xb] << 8) + m[0xc];
256
+		if(apu.queue->is_envelope)
257
+			apu.queue->dat[apu.queue->n++] = (m[0xb] << 7) + (m[0xc] >> 1);
258
+		else
259
+			apu.queue->dat[apu.queue->n++] = (m[0xb] << 8) + m[0xc] + 0x8000;
257 260
 		apu.queue->dat[apu.queue->n++] = (m[0xd] << 8) + b1;
258 261
 	} else if(b0 == 0xf && apu.queue != NULL)
259 262
 		apu.queue->finishes = 1;