Browse code

Piano example

neauoire authored on 25/04/2021 20:47:32
Showing 3 changed files
... ...
@@ -57,6 +57,8 @@ RTN
57 57
 - Implement Uxambly REPL
58 58
 - Load disks at a different place than 0x0000.
59 59
 - Curl device? 8-bit web browser?
60
+	- Replace LTS/GTS? `LTS = #80 ADD SWP #80 ADD SWP LTH`
61
+	- `#80 ADD SWP #80 ADD GTH`
60 62
 
61 63
 ## Palettes
62 64
 
... ...
@@ -32,7 +32,7 @@ else
32 32
 fi
33 33
 
34 34
 echo "Assembling.."
35
-./bin/assembler projects/software/nasu.usm bin/boot.rom
35
+./bin/assembler projects/demos/piano.usm bin/boot.rom
36 36
 
37 37
 echo "Running.."
38 38
 if [ "${2}" = '--cli' ]; 
39 39
new file mode 100644
... ...
@@ -0,0 +1,527 @@
1
+( piano )
2
+
3
+%RTN { JMP2r }
4
+%8+ { #0008 ADD2 } %8- { #0008 SUB2 }
5
+%8* { #0008 MUL2 } %8/ { #0008 DIV2 }
6
+%2/ { #0002 DIV2 }
7
+%++ { #0001 ADD2 }
8
+%MOD { DUP2 DIV MUL SUB }
9
+%TOS { #00 SWP }
10
+%PRINT-SHORT { .Console/short DEO2 #0d .Console/char DEO }
11
+
12
+( devices )
13
+
14
+|00 @System     [ &vector $2 &pad      $6 &r      $2 &g     $2 &b      $2 ]
15
+|10 @Console    [ &pad    $8 &char     $1 &byte   $1 &short $2 &string $2 ]
16
+|20 @Screen     [ &vector $2 &width    $2 &height $2 &pad   $2 &x      $2 &y     $2 &addr $2 &color $1 ]
17
+|30 @Audio      [ &pad    $8 &adsr     $2 &length $2 &addr  $2 &volume $1 &pitch $1 ]
18
+|40 @Controller [ &vector $2 &button   $1 &key    $1 ]
19
+|60 @Mouse      [ &vector $2 &x        $2 &y      $2 &state $1 &chord  $1 ]
20
+|70 @File       [ &vector $2 &success  $2 &offset $2 &pad   $2 &name   $2 &length $2 &load $2 &save $2 ]
21
+|a0 @DateTime   [ &year   $2 &month    $1 &day    $1 &hour  $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1 ]
22
+
23
+( variables )
24
+
25
+|0000
26
+
27
+@last $1
28
+@octave $1
29
+@addr $1
30
+
31
+@pointer [ &x $2 &y $2 ]
32
+@color $1
33
+@rect [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 ]
34
+
35
+@adsr-view [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 ]
36
+@wave-view [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 ]
37
+@octave-view [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 ]
38
+
39
+@center    [ &x $2 &y $2 ]
40
+@knob [ &x $2 &y $2 &value $1 ]
41
+
42
+( program )
43
+
44
+|0100 ( -> )
45
+	
46
+	( theme ) 
47
+	#0fe5 .System/r DEO2 
48
+	#0fc5 .System/g DEO2 
49
+	#0f25 .System/b DEO2
50
+
51
+	( vectors ) 
52
+	;on-control .Controller/vector DEO2
53
+	;on-mouse .Mouse/vector DEO2
54
+
55
+	( find center )
56
+	.Screen/width DEI2 2/ .center/x POK2
57
+	.Screen/height DEI2 2/ .center/y POK2
58
+
59
+	( place octave )
60
+	.center/x PEK2 #0050 SUB2 .octave-view/x1 POK2
61
+	.center/y PEK2 #0008 ADD2 .octave-view/y1 POK2
62
+	.octave-view/x1 PEK2 #0048 ADD2 .octave-view/x2 POK2
63
+	.octave-view/y1 PEK2 #0018 ADD2 .octave-view/y2 POK2
64
+
65
+	( place adsr )
66
+	.center/x PEK2 .adsr-view/x1 POK2
67
+	.center/y PEK2 #0008 ADD2 .adsr-view/y1 POK2
68
+	.adsr-view/x1 PEK2 #0058 ADD2 .adsr-view/x2 POK2
69
+	.adsr-view/y1 PEK2 #0018 ADD2 .adsr-view/y2 POK2
70
+
71
+	( place waveform )
72
+	.center/x PEK2 #0050 SUB2 .wave-view/x1 POK2
73
+	.center/y PEK2 #0020 SUB2 .wave-view/y1 POK2
74
+	.wave-view/x1 PEK2 #00a8 ADD2 .wave-view/x2 POK2
75
+	.wave-view/y1 PEK2 #0020 ADD2 .wave-view/y2 POK2
76
+
77
+	( default settings )
78
+	#ff .last POK
79
+	#048c .Audio/adsr DEO2
80
+	#88 .Audio/volume DEO
81
+	;sine-wave .Audio/addr DEO2
82
+	;sine-wave/end ;sine-wave SUB2 #0001 SFT2 .Audio/length DEO2
83
+
84
+
85
+	( background ) 
86
+	;redraw JSR2
87
+
88
+BRK
89
+
90
+@on-mouse ( -> )
91
+
92
+	;draw-cursor JSR2 
93
+
94
+	.Mouse/state DEI #00 NEQ ,&no-touch JNZ BRK &no-touch
95
+
96
+	( wave-view )
97
+	.Mouse/x DEI2 DUP2 .wave-view/x1 PEK2 GTH2 ROT ROT .wave-view/x2 PEK2 LTH2 #0101 EQU2
98
+	.Mouse/y DEI2 DUP2 .wave-view/y1 PEK2 GTH2 ROT ROT .wave-view/y2 PEK2 LTH2 #0101 EQU2
99
+	#0101 EQU2 ;on-touch-wave-view JNZ2
100
+
101
+	( adsr-view )
102
+	.Mouse/x DEI2 DUP2 .adsr-view/x1 PEK2 GTH2 ROT ROT .adsr-view/x2 PEK2 LTH2 #0101 EQU2
103
+	.Mouse/y DEI2 DUP2 .adsr-view/y1 PEK2 GTH2 ROT ROT .adsr-view/y2 PEK2 LTH2 #0101 EQU2
104
+	#0101 EQU2 ;on-touch-adsr-view JNZ2
105
+
106
+	( octave-view )
107
+	.Mouse/x DEI2 DUP2 .octave-view/x1 PEK2 GTH2 ROT ROT .octave-view/x2 PEK2 LTH2 #0101 EQU2
108
+	.Mouse/y DEI2 DUP2 .octave-view/y1 PEK2 GTH2 ROT ROT .octave-view/y2 PEK2 LTH2 #0101 EQU2
109
+	#0101 EQU2 ;on-touch-octave-view JNZ2
110
+
111
+BRK
112
+
113
+@on-touch-wave-view ( -> )
114
+
115
+	.Mouse/x DEI2 .wave-view/x1 PEK2 SUB2 .Audio/length DEO2
116
+	;draw-wave JSR2
117
+	;draw-cursor JSR2 
118
+
119
+BRK
120
+
121
+@on-touch-octave-view ( -> )
122
+
123
+	.Mouse/x DEI2 .octave-view/x1 PEK2 SUB2 #0008 DIV2 SWP POP #08 NEQ ,&no-mod JNZ
124
+		.Mouse/y DEI2 .octave-view/y1 PEK2 SUB2 #0008 DIV2 SWP POP 
125
+		DUP #00 NEQ ,&no-incr JNZ
126
+			.octave PEK #01 ADD .octave POK
127
+		&no-incr
128
+		DUP #02 NEQ ,&no-decr JNZ
129
+			.octave PEK #01 SUB .octave POK
130
+		&no-decr
131
+		POP
132
+		( release ) #00 .Mouse/state DEO
133
+		;draw-octave JSR2
134
+		BRK
135
+	&no-mod
136
+
137
+	.Mouse/x DEI2 .octave-view/x1 PEK2 SUB2 #0008 DIV2 DUP2 SWP POP .last POK ;notes ADD2 GET ;play JSR2
138
+
139
+	( release ) #00 .Mouse/state DEO
140
+	;draw-octave JSR2
141
+
142
+BRK 
143
+
144
+@on-touch-adsr-view ( -> )
145
+
146
+	.Mouse/x DEI2 .adsr-view/x1 PEK2 SUB2 8/ SWP POP #03 DIV
147
+	DUP #00 NEQ ,&no-a JNZ
148
+		.Audio/adsr DEI
149
+		#10 .Mouse/state DEI #10 EQU #e0 MUL ADD ADD
150
+		.Audio/adsr DEO &no-a
151
+	DUP #01 NEQ ,&no-d JNZ
152
+		.Audio/adsr DEI
153
+		DUP #f0 AND STH #01 .Mouse/state DEI #10 EQU #0e MUL ADD ADD #0f AND STHr ADD
154
+		.Audio/adsr DEO &no-d
155
+	DUP #02 NEQ ,&no-s JNZ
156
+		.Audio/adsr #01 ADD DEI
157
+		#10 .Mouse/state DEI #10 EQU #e0 MUL ADD ADD
158
+		.Audio/adsr #01 ADD DEO &no-s
159
+	DUP #03 NEQ ,&no-r JNZ
160
+		.Audio/adsr #01 ADD DEI
161
+		DUP #f0 AND STH #01 .Mouse/state DEI #10 EQU #0e MUL ADD ADD #0f AND STHr ADD
162
+		.Audio/adsr #01 ADD DEO &no-r
163
+	POP
164
+	( release ) #00 .Mouse/state DEO
165
+	;draw-adsr JSR2
166
+	;draw-cursor JSR2 
167
+
168
+BRK
169
+
170
+@on-control ( -> )
171
+
172
+	( clear last cursor )
173
+	;clear .Screen/addr DEO2 
174
+	.pointer/x PEK2 .Screen/x DEO2 
175
+	.pointer/y PEK2 .Screen/y DEO2 
176
+	#30 .Screen/color DEO
177
+
178
+	.Controller/key DEI
179
+	DUP #61 NEQ ,&no-c JNZ
180
+		#00 .last POK ;notes GET ;play JSR2 &no-c
181
+	DUP #73 NEQ ,&no-d JNZ
182
+		#01 .last POK ;notes #0001 ADD2 GET ;play JSR2 &no-d
183
+	DUP #64 NEQ ,&no-e JNZ
184
+		#02 .last POK ;notes #0002 ADD2 GET ;play JSR2 &no-e
185
+	DUP #66 NEQ ,&no-f JNZ
186
+		#03 .last POK ;notes #0003 ADD2 GET ;play JSR2 &no-f
187
+	DUP #67 NEQ ,&no-g JNZ
188
+		#04 .last POK ;notes #0004 ADD2 GET ;play JSR2 &no-g
189
+	DUP #68 NEQ ,&no-a JNZ
190
+		#05 .last POK ;notes #0005 ADD2 GET ;play JSR2 &no-a
191
+	DUP #6a NEQ ,&no-b JNZ
192
+		#06 .last POK ;notes #0006 ADD2 GET ;play JSR2 &no-b
193
+	DUP #6b NEQ ,&no-c2 JNZ
194
+		#07 .last POK ;notes #0007 ADD2 GET ;play JSR2 &no-c2
195
+	POP
196
+
197
+	.Controller/button DEI #f0 AND
198
+	DUP #04 SFT #01 AND #01 NEQ ,&no-up JNZ
199
+		( move ) .Audio/addr DEI2 #0010 SUB2 .Audio/addr DEO2 &no-up
200
+	DUP #05 SFT #01 AND #01 NEQ ,&no-down JNZ
201
+		( move ) .Audio/addr DEI2 #0010 ADD2 .Audio/addr DEO2 &no-down
202
+	DUP #06 SFT #01 AND #01 NEQ ,&no-left JNZ
203
+		( move ) .Audio/addr DEI2 #0001 SUB2 .Audio/addr DEO2 &no-left
204
+	DUP #07 SFT #01 AND #01 NEQ ,&no-right JNZ
205
+		( move ) .Audio/addr DEI2 #0001 ADD2 .Audio/addr DEO2 &no-right
206
+	POP
207
+
208
+	;redraw JSR2
209
+
210
+BRK
211
+
212
+@play ( pitch -- )
213
+	
214
+	.octave PEK #0c MUL ADD .Audio/pitch DEO
215
+
216
+RTN
217
+
218
+@redraw ( -- )
219
+
220
+	;draw-octave JSR2
221
+	;draw-adsr JSR2
222
+	;draw-wave JSR2
223
+
224
+RTN
225
+
226
+@draw-cursor ( -- )
227
+	
228
+	( clear last cursor )
229
+	;clear .Screen/addr DEO2 
230
+	.pointer/x PEK2 .Screen/x DEO2 
231
+	.pointer/y PEK2 .Screen/y DEO2 
232
+	#30 .Screen/color DEO
233
+	( record pointer positions )
234
+	.Mouse/x DEI2 .pointer/x POK2 
235
+	.Mouse/y DEI2 .pointer/y POK2
236
+	( draw new cursor )
237
+	;cursor .Screen/addr DEO2 
238
+	.pointer/x PEK2 .Screen/x DEO2 
239
+	.pointer/y PEK2 .Screen/y DEO2 
240
+	( colorize on state )
241
+	#31 [ .Mouse/state DEI #00 NEQ ] ADD .Screen/color DEO
242
+
243
+RTN
244
+
245
+@draw-octave ( -- )
246
+	
247
+	.octave-view/x1 PEK2 .octave-view/y1 PEK2
248
+
249
+	OVR2 OVR2 ;keys-left-icns #21 .last PEK #00 EQU ADD ;draw-key JSR2
250
+	OVR2 #0008 ADD2 OVR2 ;keys-middle-icns #21 .last PEK #01 EQU ADD ;draw-key JSR2
251
+	OVR2 #0010 ADD2 OVR2 ;keys-right-icns #21 .last PEK #02 EQU ADD ;draw-key JSR2
252
+	OVR2 #0018 ADD2 OVR2 ;keys-left-icns #21 .last PEK #03 EQU ADD ;draw-key JSR2
253
+	OVR2 #0020 ADD2 OVR2 ;keys-middle-icns #21 .last PEK #04 EQU ADD ;draw-key JSR2
254
+	OVR2 #0028 ADD2 OVR2 ;keys-middle-icns #21 .last PEK #05 EQU ADD ;draw-key JSR2
255
+	SWP2 #0030 ADD2 SWP2 ;keys-right-icns #21 .last PEK #06 EQU ADD ;draw-key JSR2
256
+
257
+	;arrow-icns .Screen/addr DEO2
258
+	.octave-view/x1 PEK2 #0040 ADD2 .Screen/x DEO2
259
+	.octave-view/y1 PEK2 .Screen/y DEO2
260
+	#21 .Screen/color DEO
261
+
262
+	;arrow-icns #0008 ADD2 .Screen/addr DEO2
263
+	.octave-view/y1 PEK2 #0010 ADD2 .Screen/y DEO2
264
+	#21 .Screen/color DEO
265
+
266
+	;font-hex .octave PEK #03 ADD #00 SWP #0008 MUL2 ADD2 .Screen/addr DEO2
267
+	.octave-view/x2 PEK2 #0008 SUB2 .Screen/x DEO2
268
+	.octave-view/y1 PEK2 #0008 ADD2 .Screen/y DEO2
269
+	#23 .Screen/color DEO
270
+
271
+RTN
272
+
273
+@draw-key ( x* y* addr* color -- )
274
+		
275
+	STH
276
+	.Screen/addr DEO2 
277
+	SWP2 .Screen/x DEO2
278
+	DUP2 #0018 ADD2
279
+	&loop
280
+		( move ) OVR2 .Screen/y DEO2
281
+		( draw ) DUPr STHr .Screen/color DEO
282
+		( incr ) .Screen/addr DEI2 8+ .Screen/addr DEO2  
283
+		( incr ) SWP2 8+ SWP2
284
+		OVR2 OVR2 LTH2 ,&loop JNZ
285
+	POP2 POP2 
286
+	POPr
287
+
288
+RTN
289
+
290
+@draw-adsr ( -- )
291
+
292
+	.adsr-view/x1 PEK2 .adsr-view/y1 PEK2
293
+		.Audio/adsr DEI #04 SFT
294
+		;draw-knob JSR2
295
+	.adsr-view/x1 PEK2 #0018 ADD2 .adsr-view/y1 PEK2
296
+		.Audio/adsr DEI #0f AND
297
+		;draw-knob JSR2
298
+	.adsr-view/x1 PEK2 #0030 ADD2 .adsr-view/y1 PEK2
299
+		.Audio/adsr #01 ADD DEI #04 SFT
300
+		;draw-knob JSR2
301
+	.adsr-view/x1 PEK2 #0048 ADD2 .adsr-view/y1 PEK2
302
+		.Audio/adsr #01 ADD DEI #0f AND
303
+		;draw-knob JSR2
304
+
305
+RTN
306
+
307
+@draw-wave ( -- )
308
+	
309
+	.wave-view/x1 PEK2
310
+	.wave-view/y1 PEK2
311
+	.wave-view/x2 PEK2 #0001 ADD2
312
+	.wave-view/y2 PEK2
313
+	#00 ;fill-rect JSR2
314
+
315
+	#01 ;draw-wave-length JSR2
316
+
317
+	.wave-view/x1 PEK2 .Screen/x DEO2
318
+
319
+	( waveform )
320
+	#00 #a8
321
+	&loop
322
+		( dotted line )
323
+		OVR #01 AND ,&no-dot JNZ 
324
+			.wave-view/y1 PEK2 #0010 ADD2 .Screen/y DEO2
325
+			#03 .Screen/color DEO
326
+		&no-dot
327
+		OVR TOS .Audio/addr DEI2 ADD2 GET 
328
+		#02 DIV #40 ADD DUP #07 SFT #80 MUL SUB 
329
+		TOS #0004 DIV2 .wave-view/y1 PEK2 ADD2 .Screen/y DEO2
330
+		.Screen/x DEI2 #0001 ADD2 .Screen/x DEO2
331
+		( draw ) OVR .Audio/length DEI2 SWP POP GTH #02 MUL #01 ADD .Screen/color DEO
332
+		( incr ) SWP #01 ADD SWP
333
+		DUP2 LTH ,&loop JNZ
334
+	POP2
335
+
336
+	( range )
337
+	.wave-view/x1 PEK2 .Screen/x DEO2
338
+	.wave-view/y1 PEK2 #0010 SUB2 .Screen/y DEO2
339
+	.Audio/addr DEI2 ;draw-short JSR2
340
+	.wave-view/x2 PEK2 #0020 SUB2 .Screen/x DEO2
341
+	.Audio/length DEI2 ;draw-short JSR2
342
+
343
+RTN
344
+
345
+@draw-wave-length ( color -- )
346
+	
347
+	STH
348
+	.wave-view/x1 PEK2 .Audio/length DEI2 ADD2 .Screen/x DEO2
349
+	.wave-view/y1 PEK2 DUP2 #0020 ADD2
350
+	&loop
351
+		OVR2 .Screen/y DEO2
352
+		( draw ) DUPr STHr .Screen/color DEO
353
+		( incr ) SWP2 #0001 ADD2 SWP2
354
+		OVR2 OVR2 LTH2 ,&loop JNZ
355
+	POP2 POP2
356
+	POPr
357
+
358
+RTN
359
+
360
+@draw-knob ( x* y* value -- )
361
+
362
+	( load ) .knob/value POK .knob/y POK2 .knob/x POK2
363
+
364
+	.knob/x PEK2 .Screen/x DEO2
365
+	.knob/y PEK2 .Screen/y DEO2 ;knob_icns .Screen/addr DEO2 #21 .Screen/color DEO
366
+	.knob/x PEK2 8+ .Screen/x DEO2 ;knob_icns 8+ .Screen/addr DEO2 #21 .Screen/color DEO
367
+	.knob/y PEK2 8+ .Screen/y DEO2 ;knob_icns #0018 ADD2 .Screen/addr DEO2 #21 .Screen/color DEO
368
+	.knob/x PEK2 .Screen/x DEO2 ;knob_icns #0010 ADD2 .Screen/addr DEO2 #21 .Screen/color DEO
369
+	.knob/x PEK2 #00 #00 .knob/value PEK ;knob-offsetx ADD2 GET ADD2 .Screen/x DEO2
370
+	.knob/y PEK2 #00 #00 .knob/value PEK ;knob-offsety ADD2 GET ADD2 .Screen/y DEO2
371
+	;knob_icns #0020 ADD2 .Screen/addr DEO2
372
+	#25 .Screen/color DEO
373
+	.knob/x PEK2 #0004 ADD2 .Screen/x DEO2
374
+	.knob/y PEK2 #0010 ADD2 .Screen/y DEO2
375
+	;font-hex #00 .knob/value PEK #08 MUL ADD2 .Screen/addr DEO2
376
+	#21 .Screen/color DEO
377
+
378
+RTN
379
+
380
+@draw-short ( short -- )
381
+
382
+	.addr POK2
383
+	;font-hex #00 ;addr GET #f0 AND #04 SFT #08 MUL ADD2 .Screen/addr DEO2
384
+	( draw ) #22 .Screen/color DEO
385
+	.Screen/x DEI2 8+ .Screen/x DEO2
386
+	;font-hex #00 ;addr GET #0f AND #08 MUL ADD2 .Screen/addr DEO2
387
+	( draw ) #22 .Screen/color DEO
388
+	.Screen/x DEI2 8+ .Screen/x DEO2
389
+	;font-hex #00 ;addr ++ GET #f0 AND #04 SFT #08 MUL ADD2 .Screen/addr DEO2
390
+	( draw ) #22 .Screen/color DEO
391
+	.Screen/x DEI2 8+ .Screen/x DEO2
392
+	;font-hex #00 ;addr ++ GET #0f AND #08 MUL ADD2 .Screen/addr DEO2
393
+	( draw ) #22 .Screen/color DEO
394
+
395
+RTN
396
+
397
+@fill-rect ( x1 y1 x2 y2 color -- )
398
+	
399
+	.color POK
400
+	( x1 x2 y1 y2 ) ROT2 SWP2
401
+	&ver
402
+		( save ) OVR2 .Screen/y DEO2
403
+		STH2 STH2 OVR2 OVR2
404
+		&hor
405
+			( save ) OVR2 .Screen/x DEO2
406
+			( draw ) .color PEK .Screen/color DEO
407
+			( incr ) SWP2 ++ SWP2
408
+			OVR2 OVR2 LTS2 ,&hor JNZ
409
+		POP2 POP2 STH2r STH2r
410
+		( incr ) SWP2 ++ SWP2
411
+		OVR2 OVR2 LTS2 ,&ver JNZ
412
+	POP2 POP2 POP2 POP2
413
+
414
+RTN
415
+
416
+@line-rect ( x1 y1 x2 y2 color -- )
417
+
418
+	( load ) .color POK DUP2 STH2 .rect/y2 POK2 .rect/x2 POK2 DUP2 STH2 .rect/y1 POK2 .rect/x1 POK2
419
+	STH2r STH2r
420
+	&ver
421
+		( save ) OVR2 .Screen/y DEO2
422
+		( draw ) .rect/x1 PEK2 .Screen/x DEO2 .color PEK DUP .Screen/color DEO
423
+		( draw ) .rect/x2 PEK2 .Screen/x DEO2 .Screen/color DEO
424
+		( incr ) SWP2 ++ SWP2
425
+		OVR2 OVR2 LTS2 ,&ver JNZ
426
+	POP2 POP2
427
+	.rect/x1 PEK2 .rect/x2 PEK2
428
+	&hor
429
+		( save ) OVR2 .Screen/x DEO2
430
+		( draw ) .rect/y1 PEK2 .Screen/y DEO2 .color PEK DUP .Screen/color DEO
431
+		( draw ) .rect/y2 PEK2 .Screen/y DEO2 .Screen/color DEO
432
+		( incr ) SWP2 ++ SWP2
433
+		OVR2 OVR2 ++ LTS2 ,&hor JNZ
434
+	POP2 POP2
435
+
436
+RTN
437
+
438
+@clear  [ 
439
+	0000 0000 0000 0000 ]
440
+
441
+@cursor [ 
442
+	80c0 e0f0 f8e0 1000 ]
443
+
444
+@arrow-icns [
445
+	0010 387c fe10 1000
446
+	0010 1010 fe7c 3810 ]
447
+
448
+@notes [
449
+	3c 3e 40 41 43 45 47
450
+	48 4a 4c 4d 4f 51 53 ]
451
+
452
+@keys-left-icns [
453
+	7c7c 7c7c 7c7c 7c7c
454
+	7c7c 7c7c 7c7c 7e7f
455
+	7f7f 7f7f 7f7f 3e00 ]
456
+
457
+@keys-middle-icns [
458
+	1c1c 1c1c 1c1c 1c1c
459
+	1c1c 1c1c 1c1c 3e7f
460
+	7f7f 7f7f 7f7f 3e00 ]
461
+
462
+@keys-right-icns [
463
+	1f1f 1f1f 1f1f 1f1f
464
+	1f1f 1f1f 1f1f 3f7f
465
+	7f7f 7f7f 7f7f 3e00 ]
466
+
467
+@knob_icns [
468
+	0003 0c10 2020 4040
469
+	00c0 3008 0404 0202
470
+	4040 2020 100c 0300
471
+	0202 0404 0830 c000
472
+	0000 183c 3c18 0000 ]
473
+
474
+@knob-offsetx [
475
+	01 00 00 00 00 01 02 03
476
+	05 06 07 08 08 08 08 07 ]
477
+
478
+@knob-offsety [
479
+	07 06 05 03 02 01 00 00
480
+	00 00 01 02 03 05 06 07 ]
481
+
482
+@font-hex ( 0-F )
483
+[
484
+	007c 8282 8282 827c 0030 1010 1010 1010
485
+	007c 8202 7c80 80fe 007c 8202 1c02 827c
486
+	000c 1424 4484 fe04 00fe 8080 7c02 827c
487
+	007c 8280 fc82 827c 007c 8202 1e02 0202
488
+	007c 8282 7c82 827c 007c 8282 7e02 827c
489
+	007c 8202 7e82 827e 00fc 8282 fc82 82fc
490
+	007c 8280 8080 827c 00fc 8282 8282 82fc
491
+	007c 8280 f080 827c 007c 8280 f080 8080 ]
492
+
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 ]
0 528
\ No newline at end of file