Browse code

Added waveforms

neauoire authored on 28/04/2021 18:54:19
Showing 6 changed files
1 1
new file mode 100755
... ...
@@ -0,0 +1,16 @@
1
+#!/bin/bash
2
+
3
+echo "Formatting.."
4
+clang-format -i wavpcm.c
5
+
6
+echo "Cleaning.."
7
+rm -f ../../bin/wavpcm
8
+
9
+echo "Building.."
10
+mkdir -p ../../bin
11
+cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined -lm wavpcm.c -o ../../bin/wavpcm
12
+
13
+echo "Running.."
14
+../../bin/wavpcm
15
+
16
+echo "Done."
0 17
new file mode 100644
... ...
@@ -0,0 +1,63 @@
1
+#include <stdio.h>
2
+#include <math.h>
3
+
4
+/* 
5
+Copyright (c) 2020 Devine Lu Linvega
6
+
7
+Permission to use, copy, modify, and distribute this software for any
8
+purpose with or without fee is hereby granted, provided that the above
9
+copyright notice and this permission notice appear in all copies.
10
+
11
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12
+WITH REGARD TO THIS SOFTWARE.
13
+*/
14
+
15
+#define PI 3.14159265358979323846
16
+#define SAMPLES 256
17
+#define RATE 1
18
+
19
+typedef unsigned char Uint8;
20
+
21
+int
22
+clamp(int val, int min, int max)
23
+{
24
+	return (val >= min) ? (val <= max) ? val : max : min;
25
+}
26
+
27
+Uint8
28
+sinw(int i)
29
+{
30
+	return 0x7f * sin(i * RATE * 2 * PI / SAMPLES);
31
+}
32
+
33
+Uint8
34
+triw(int i)
35
+{
36
+	if(i < 0x40)
37
+		return i * 2;
38
+	if(i >= 0xc0)
39
+		return (i - 0xc0) * 2 - 0x7f;
40
+	return 0x7f - (i - 0x40) * 2;
41
+}
42
+
43
+Uint8
44
+sqrw(int i)
45
+{
46
+	return ((i * RATE) % 0xff) < 0x80 ? 0x7f : 0x80;
47
+}
48
+
49
+int
50
+main()
51
+{
52
+	int i;
53
+	printf("%d:\n\n", SAMPLES);
54
+	for(i = 0; i < SAMPLES; ++i) {
55
+		if(i % 0x10 == 0)
56
+			printf("\n");
57
+		else if(i % 2 == 0)
58
+			printf(" ");
59
+		printf("%02x", (triw(i) + sinw(i)) / 2);
60
+	}
61
+	printf("\n\n");
62
+	return 0;
63
+}
... ...
@@ -8,6 +8,8 @@
8 8
 %TOS { #00 SWP }
9 9
 %MOD { DUP2 DIV MUL SUB }
10 10
 
11
+%WAVEFORM { #1000 }
12
+
11 13
 ( devices )
12 14
 
13 15
 |00 @System     [ &vector $2 &pad      $6 &r      $2 &g     $2 &b      $2 ]
... ...
@@ -20,6 +22,7 @@
20 22
 |70 @Midi       [ &vector $2 &channel  $1 &note   $1 &velocity $1 ]
21 23
 |80 @Controller [ &vector $2 &button   $1 &key    $1 ]
22 24
 |90 @Mouse      [ &vector $2 &x        $2 &y      $2 &state $1 &chord  $1 ]
25
+|a0 @File       [ &vector $2 &success  $2 &offset $2 &pad   $2 &name  $2 &length $2 &load $2 &save $2 ]
23 26
 
24 27
 ( variables )
25 28
 
... ...
@@ -51,34 +54,49 @@
51 54
 	;on-midi .Midi/vector DEO2
52 55
 	;on-frame .Screen/vector DEO2
53 56
 
57
+	( load waveform )
58
+	;sin-path .File/name DEO2 #0100 .File/length DEO2 WAVEFORM .File/load DEO2
59
+	;tri-path .File/name DEO2 #0100 .File/length DEO2 WAVEFORM #0100 ADD2 .File/load DEO2
60
+	;sqr-path .File/name DEO2 #0100 .File/length DEO2 WAVEFORM #0200 ADD2 .File/load DEO2
61
+
54 62
 	( find center )
55 63
 	.Screen/width DEI2 2/ .center/x POK2
56 64
 	.Screen/height DEI2 2/ .center/y POK2
57 65
 
58 66
 	( place octave )
59
-	.center/x PEK2 #0050 SUB2 .octave-view/x1 POK2
67
+	.center/x PEK2 #0080 SUB2 .octave-view/x1 POK2
60 68
 	.center/y PEK2 8+ .octave-view/y1 POK2
61
-	.octave-view/x1 PEK2 #0048 ADD2 .octave-view/x2 POK2
69
+	.octave-view/x1 PEK2 #0050 ADD2 .octave-view/x2 POK2
62 70
 	.octave-view/y1 PEK2 #0018 ADD2 .octave-view/y2 POK2
63 71
 
64 72
 	( place adsr )
65
-	.center/x PEK2 .adsr-view/x1 POK2
73
+	.center/x PEK2 #0020 SUB2 .adsr-view/x1 POK2
66 74
 	.center/y PEK2 8+ .adsr-view/y1 POK2
67
-	.adsr-view/x1 PEK2 #0058 ADD2 .adsr-view/x2 POK2
75
+	.adsr-view/x1 PEK2 #00a0 ADD2 .adsr-view/x2 POK2
68 76
 	.adsr-view/y1 PEK2 #0018 ADD2 .adsr-view/y2 POK2
69 77
 
70 78
 	( place waveform )
71
-	.center/x PEK2 #0050 SUB2 .wave-view/x1 POK2
79
+	.center/x PEK2 #0080 SUB2 .wave-view/x1 POK2
72 80
 	.center/y PEK2 #0020 SUB2 .wave-view/y1 POK2
73
-	.wave-view/x1 PEK2 #00a8 ADD2 .wave-view/x2 POK2
81
+	.wave-view/x1 PEK2 #0100 ADD2 .wave-view/x2 POK2
74 82
 	.wave-view/y1 PEK2 #0020 ADD2 .wave-view/y2 POK2
75 83
 
76 84
 	( default settings )
77 85
 	#ff .last-note POK
78 86
 	#048c .Audio0/adsr DEO2
79 87
 	#88 .Audio0/volume DEO
80
-	;sine-wave .Audio0/addr DEO2
81
-	;sine-wave/end ;sine-wave SUB2 #0001 SFT2 .Audio0/length DEO2
88
+	WAVEFORM .Audio0/addr DEO2
89
+	#0100 .Audio0/length DEO2
90
+
91
+	#011a .Audio1/adsr DEO2
92
+	#88 .Audio1/volume DEO
93
+	WAVEFORM #0100 ADD2 .Audio1/addr DEO2
94
+	#0100 .Audio1/length DEO2
95
+
96
+	#1118 .Audio2/adsr DEO2
97
+	#88 .Audio2/volume DEO
98
+	WAVEFORM #0200 ADD2 .Audio2/addr DEO2
99
+	#0100 .Audio2/length DEO2
82 100
 
83 101
 	( inital drawing ) 
84 102
 	;draw-octave JSR2
... ...
@@ -132,7 +150,7 @@ BRK
132 150
 
133 151
 @on-touch-octave-view ( -> )
134 152
 
135
-	.Mouse/x DEI2 .octave-view/x1 PEK2 SUB2 8/ SWP POP #08 NEQ ,&no-mod JNZ
153
+	.Mouse/x DEI2 .octave-view/x1 PEK2 SUB2 8/ SWP POP #09 NEQ ,&no-mod JNZ
136 154
 		.Mouse/y DEI2 .octave-view/y1 PEK2 SUB2 8/ SWP POP 
137 155
 		DUP #00 NEQ ,&no-incr JNZ
138 156
 			.octave PEK #01 ADD .octave POK &no-incr
... ...
@@ -144,10 +162,11 @@ BRK
144 162
 		BRK
145 163
 	&no-mod
146 164
 
147
-	.Mouse/x DEI2 .octave-view/x1 PEK2 SUB2 8/ DUP2 SWP POP .last-note POK ;notes ADD2 GET ;play JSR2
148
-
149
-	( release ) #00 .Mouse/state DEO
150
-	;draw-octave JSR2
165
+	.Mouse/x DEI2 .octave-view/x1 PEK2 SUB2 8/ SWP POP #06 GTH ,&no-key JNZ
166
+		.Mouse/x DEI2 .octave-view/x1 PEK2 SUB2 8/ DUP2 SWP POP .last-note POK ;notes ADD2 GET ;play JSR2
167
+		( release ) #00 .Mouse/state DEO
168
+		;draw-octave JSR2
169
+	&no-key
151 170
 
152 171
 BRK 
153 172
 
... ...
@@ -170,6 +189,14 @@ BRK
170 189
 		.Audio0/adsr #01 ADD DEI
171 190
 		DUP #f0 AND STH #01 .Mouse/state DEI #10 EQU #0e MUL ADD ADD #0f AND STHr ADD
172 191
 		.Audio0/adsr #01 ADD DEO &no-r
192
+	DUP #05 NEQ ,&no-left JNZ
193
+		.Audio0/volume DEI 
194
+		#10 .Mouse/state DEI #10 EQU #e0 MUL ADD ADD
195
+		.Audio0/volume DEO &no-left
196
+	DUP #06 NEQ ,&no-right JNZ
197
+		.Audio0/volume DEI
198
+		DUP #f0 AND STH #01 .Mouse/state DEI #10 EQU #0e MUL ADD ADD #0f AND STHr ADD
199
+		.Audio0/volume DEO &no-right
173 200
 	POP
174 201
 
175 202
 	( release ) #00 .Mouse/state DEO
... ...
@@ -223,7 +250,7 @@ BRK
223 250
 
224 251
 @play ( pitch -- )
225 252
 	
226
-	.octave PEK #0c MUL ADD .Audio0/pitch DEO
253
+	DUP .octave PEK #0c MUL ADD .Audio0/pitch DEO
227 254
 
228 255
 RTN
229 256
 
... ...
@@ -258,8 +285,9 @@ RTN
258 285
 	OVR2 #0028 ADD2 OVR2 ;keys-middle-icns #21 .last-note PEK #05 EQU ADD ;draw-key JSR2
259 286
 	SWP2 #0030 ADD2 SWP2 ;keys-right-icns #21 .last-note PEK #06 EQU ADD ;draw-key JSR2
260 287
 
288
+	.octave-view/x1 PEK2 #0048 ADD2 .Screen/x DEO2
289
+
261 290
 	;arrow-icns .Screen/addr DEO2
262
-	.octave-view/x1 PEK2 #0040 ADD2 .Screen/x DEO2
263 291
 	.octave-view/y1 PEK2 .Screen/y DEO2
264 292
 	#21 .Screen/color DEO
265 293
 
... ...
@@ -268,7 +296,6 @@ RTN
268 296
 	#21 .Screen/color DEO
269 297
 
270 298
 	;font-hex .octave PEK #03 ADD #00 SWP #0008 MUL2 ADD2 .Screen/addr DEO2
271
-	.octave-view/x2 PEK2 #0008 SUB2 .Screen/x DEO2
272 299
 	.octave-view/y1 PEK2 8+ .Screen/y DEO2
273 300
 	#23 .Screen/color DEO
274 301
 
... ...
@@ -306,6 +333,14 @@ RTN
306 333
 		.Audio0/adsr #01 ADD DEI #0f AND
307 334
 		;draw-knob JSR2
308 335
 
336
+	( volume )
337
+	.adsr-view/x2 PEK2 #0028 SUB2 .adsr-view/y1 PEK2
338
+		.Audio0/volume DEI #04 SFT
339
+		;draw-knob JSR2
340
+	.adsr-view/x2 PEK2 #0010 SUB2 .adsr-view/y1 PEK2
341
+		.Audio0/volume DEI #0f AND
342
+		;draw-knob JSR2
343
+
309 344
 RTN
310 345
 
311 346
 @draw-wave ( -- )
... ...
@@ -321,7 +356,7 @@ RTN
321 356
 	.wave-view/x1 PEK2 .Screen/x DEO2
322 357
 
323 358
 	( waveform )
324
-	#00 #a8
359
+	#00 #ff
325 360
 	&loop
326 361
 		( dotted line )
327 362
 		OVR #01 AND ,&no-dot JNZ 
... ...
@@ -490,38 +525,6 @@ RTN
490 525
 	007c 8280 8080 827c 00fc 8282 8282 82fc
491 526
 	007c 8280 f080 827c 007c 8280 f080 8080 ]
492 527
 
493
-@sine-wave [
494
-	0004 090e 1217 1c20 2529 2e32 363b 3f43 
495
-	474b 4e52 5659 5c60 6365 686b 6d70 7274 
496
-	7677 797a 7b7c 7d7e 7e7e 7e7e 7e7e 7d7c
497
-	7b7a 7978 7674 7270 6e6b 6966 6360 5d5a 
498
-	5753 4f4c 4844 403c 3833 2f2a 2621 1d18 
499
-	140f 0a05 01fc f7f2 eee9 e4e0 dbd7 d2ce
500
-	cac5 c1bd b9b5 b1ae aaa7 a3a0 9d9a 9795 
501
-	9290 8e8c 8a88 8785 8483 8282 8181 8181 
502
-	8181 8282 8384 8687 898a 8c8e 9193 9598
503
-	9b9e a1a4 a8ab afb2 b6ba bec2 c6cb cfd3 
504
-	d8dc e1e6 eaef f4f8 ] &end
505
-
506
-@tri-wave [
507
-	0002 0406 080a 0c0e 1012 1416 181a 1c1e 
508
-	2022 2426 282a 2c2e 3032 3436 383a 3c3e 
509
-	4041 4345 4749 4b4d 4f51 5355 5759 5b5d
510
-	5f61 6365 6769 6b6d 6f71 7375 7779 7b7d 
511
-	7f7d 7b79 7775 7371 6f6d 6b69 6765 6361 
512
-	5f5d 5b59 5755 5351 4f4d 4b49 4745 4341
513
-	403e 3c3a 3836 3432 302e 2c2a 2826 2422 
514
-	201e 1c1a 1816 1412 100e 0c0a 0806 0402 
515
-	00fe fcfa f8f6 f4f2 f0ee ecea e8e6 e4e2
516
-	e0de dcda d8d6 d4d2 d0ce ccca c8c6 c4c2 
517
-	c1bf bdbb b9b7 b5b3 ]
518
-
519
-@arc [
520
-	8000 8d00 9a02 a706 b40b c011 cb18 d520
521
-	df2a e734 ee40 f44b f958 fd65 ff72 ff80
522
-	ff8d fd9a f9a7 f4b4 eec0 e7cb dfd5 d5df
523
-	cbe7 c0ee b4f4 a7f9 9afd 8dff 80ff 72ff
524
-	65fd 58f9 4bf4 40ee 34e7 2adf 20d5 18cb
525
-	11c0 0bb4 06a7 029a 008d 0080 0072 0265
526
-	0658 0b4b 113f 1834 202a 2a20 3418 3f11
527
-	4b0b 5806 6502 7200 ]
528 528
\ No newline at end of file
529
+@sin-path "projects/sounds/sin.pcm $1
530
+@tri-path "projects/sounds/tri.pcm $1
531
+@sqr-path "projects/sounds/sqr.pcm $1
529 532
\ No newline at end of file
530 533
new file mode 100644
531 534
Binary files /dev/null and b/projects/sounds/sin.pcm differ
532 535
new file mode 100644
... ...
@@ -0,0 +1 @@
1
+��������������������������������������������������������������������������������������������������������������������������������
0 2
\ No newline at end of file
1 3
new file mode 100644
2 4
Binary files /dev/null and b/projects/sounds/tri.pcm differ