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 ¬e $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 |
532 | 535 |
new file mode 100644 |
... | ... |
@@ -0,0 +1 @@ |
1 |
+�������������������������������������������������������������������������������������������������������������������������������� |
|
0 | 2 |
\ No newline at end of file |