( Orca ) |00 @System/vector $2 &expansion $2 &wst $1 &rst $1 &metadata $2 &r $2 &g $2 &b $2 &debug $1 &state $1 |10 @Console/vector $2 &read $1 &pad $5 &write $1 |20 @Screen/vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1 |80 @Controller/vector $2 &button $1 &key $1 |90 @Mouse/vector $2 &x $2 &y $2 &state $1 &chord $1 &pad $4 &scrolly &scrolly-hb $1 &scrolly-lb $1 |a0 @File/vector $2 &success $1 &success-lb $1 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2 |c0 @DateTime &year $2 &month $1 &day $1 &hour $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1 ( @|enums ) |10 @Types/lock-default |12 @Types/lock-lut |1c @Types/lock-right |1d @Types/lock-output |01 @Types/pl |08 @Types/op |0a @Types/io |04 @Styles/selected |80 @Row/width |000 @timer &beat $1 &speed $1 &frame $1 &frame-lb $1 @help $1 @src/buf $3f &cap $1 @grid/length $2 &x1 $2 &y1 $2 &x2 $2 &y2 $2 &size &width $1 &height $1 @select/from &x1 $1 &y1 $1 &to &x2 $1 &y2 $1 @head/pos &x $1 &y $1 &addr $2 @variables/buf $24 @voices/buf ( len vel chn pitch ) $40 &cap |100 @on-reset ( -> ) ( | meta ) ;meta #06 DEO2 ( | theme ) #0f64 .System/r DEO2 #0fd4 .System/g DEO2 #0fb4 .System/b DEO2 theme/ random/ ( | resize ) #02a8 .Screen/width DEO2 #01c8 .Screen/height DEO2 grid/ [ LIT2 15 -Screen/auto ] DEO ( | cache positions ) .grid/x1 LDZ2 ( ) DUP2 #0078 ADD2 ;src/x STA2 ( ) DUP2 ;select/widget/x STA2 ( ) DUP2 #0030 ADD2 ;timer/widget/x STA2 ( ) #0060 ADD2 ;draw-speed/x STA2 .grid/x2 LDZ2 ( ) #0040 SUB2 ;voices/x STA2 .grid/y2 LDZ2 #0008 ADD2 ( ) DUP2 ;select/widget/y STA2 ( ) DUP2 ;timer/widget/y STA2 ( ) DUP2 ;draw-speed/y STA2 ( ) DUP2 ;src/y STA2 ( ) ;voices/y STA2 ( | Unlock ) file/ help/ select/widget/ ( | vectors ) ;on-button .Controller/vector DEO2 ;on-mouse .Mouse/vector DEO2 ;timer/on-play .Screen/vector DEO2 ;src/on-console .Console/vector DEO2 BRK @meta 00 ( name ) "Orca 0a ( details ) "A 20 "Livecoding 20 "Playground 0a ( author ) "By 20 "Hundred 20 "Rabbits 0a ( date ) "19 20 "Jun 20 "2025 00 01 ( icon ) 83 =appicon @manifest/dat ( . ) ={ =dict/orca ( - ) 01 "n =file/ =dict ( - ) 01 "o =file/ =dict ( - ) 01 "s =file/ =dict ( - ) 01 "q =file/ =dict } ={ =dict/edit ( - ) 01 "i =insert/ =dict ( - ) 01 "c =edit/ =dict ( - ) 01 "v =edit/ =dict ( - ) 01 "x =edit/ =dict ( - ) 01 "/ =edit/ =dict ( - ) 00 08 =edit/ =dict } ={ =dict/play ( - ) 01 ", =timer/ =dict ( - ) 01 ". =timer/ =dict ( - ) 00 20 =timer/ =dict ( - ) 00 0d =timer/ =dict } ={ =dict/view ( - ) 01 "h =help/ =dict } ={ =dict/select ( - ) 01 "a =select/ =dict ( - ) 00 1b =select/ =dict } $1 @manifest/scan ( but key -- fn* ) ORAk ?{ POP2 #ffff JMP2r } ,&bk STR2 ;&dat &>cat LDA2k OVR2 #0004 ADD2 &>opt LDA2k [ LIT2 &bk $2 ] NEQ2 ?{ NIP2 NIP2 INC2 INC2 LDA2 JMP2r } #0006 ADD2 GTH2k ?&>opt POP2 POP2 LDA2 LDAk ?&>cat POP2 #ffff JMP2r ( @|src ) @src/on-console ( -> ) .Console/read DEI ( ) DUP #20 GTH ?{ POP file/ BRK } / BRK @src/ ( -- ) [ LIT2 -&buf _&ptr ] STR JMP2r @src/ ( -- ) [ LIT2 -&buf _&ptr ] STR ;&default-path &>lr LDAk DUP ?{ POP POP2 / #00 !src/ } / INC2 !&>lr @src/ ( c -- ) [ LIT2 00 &ptr -&buf ] INCk ,&ptr STR STZ2 JMP2r @src/ ( -- ) #00 !/ @src/ ( -- ) #01 ( >> ) @src/ ( value -- ) DUP [ LIT &last 00 ] NEQ ?{ POP JMP2r } ( >> ) @src/ ( value -- ) DUP ,&last STR [ LIT2 &x $2 ] .Screen/x DEO2 [ LIT2 &y $2 ] .Screen/y DEO2 ;&buf #02 font/ ?{ !/ } [ LIT2 "* 02 ] font/ ( >> ) @src/ ( -- ) ;voices/x LDA2 .Screen/x DEI2 SUB2 #03 SFT2 SUB &>lf #20 font/ INC DUP ?&>lf POP JMP2r @src/default-path "untitled.orca $1 ( @|Macros ) %ciuc ( char -- bool ) { LIT "A SUB #1a LTH } %cilc ( char -- bool ) { LIT "a SUB #1a LTH } %chrb36 ( char -- b36 ) { #00 SWP ;chrb36/lut ADD2 LDA } %b36chr ( b36 -- char ) { #24 [ DIVk MUL SUB ] #00 SWP ;b36clc ADD2 LDA } %chrmid ( char -- midi ) { DUP chrb36 SWP ciuc #24 MUL ADD #00 SWP ;midi/lut ADD2 LDA } %set-case ( value case -- raw ) { SWP b36chr DUP #60 GTH ROT AND #50 SFT SUB } %below ( addr* -- next-row* ) { ;Row/width ADD2 } %above ( addr* -- prev-row* ) { ;Row/width SUB2 } %get-row ( row* -- addr* ) { ;Row/width MUL2 } %get-addr ( x y -- addr* ) { #00 SWP get-row ROT #00 SWP ADD2 } ( @|vectors ) @on-button ( -> ) .Controller/button DEI2 ( | handlers ) DUP2 manifest/scan INC2k ORA ?{ ( | not in manifest ) POP2 OVR #f0 AND ?on-button-arrow select/ POP BRK } JSR2 POP2 BRK @on-button-arrow ( button key -> ) POP DUP DUP #0f AND ,&mod STR #04 SFT #00 OVR #03 AND ;&vec ADD2 LDA ,&y STR #02 SFT #00 SWP #03 AND ;&vec ADD2 LDA ,&x STR [ LIT2 &x $1 &y $1 ] [ LIT &mod $1 ] select/ #0f AND .Controller/button DEO BRK &vec 00 ff 01 00 @on-mouse ( -> ) #41 cursor/ [ LIT &last $1 ] .Mouse/state DEI DUP ,&last STR ( | handlers ) DUP2 #0001 EQU2 ?/down DUP2 #0101 EQU2 ?/drag POP2 BRK @on-mouse/down ( mouse* -> ) POP2 ( | check for menubar ) .Mouse/y DEI2 .grid/y2 LDZ2 #0008 ADD2 SUB2 #04 SFT2 ORA ?{ .Mouse/x DEI2 .grid/x1 LDZ2 SUB2 #03 SFT2 #0006 DIV2 ( | handlers ) DUP #00 NEQ ?{ insert/ } DUP #01 NEQ ?{ timer/ } POP2 BRK } get-pos select/ BRK @on-mouse/drag ( mouse* -> ) POP2 get-pos select/ BRK @get-pos ( -- x y ) ( x ) .Mouse/x DEI2 .grid/x1 LDZ2 SUB2 #83 SFT2 ( y ) .Mouse/y DEI2 .grid/y1 LDZ2 SUB2 #04 SFT2 ORA2 JMP2r ( @|core ) %types/get ( addr* -- cell ) { ;types/buf ADD2 LDA } %types/ ( type addr* -- ) { ;types/buf ADD2 STA } @types/ ( -- ) .grid/height LDZ #00 &>ver ( row ) [ LITr 00 ] STHk [ LIT2r =Row/width ] MUL2r ( ) .grid/width LDZ #00 &>hor #0000 STH2kr ;types/buf ADD2 STA2 INC2r INC2r INC INC GTHk ?&>hor POP2 POP2r INC GTHk ?&>ver POP2 JMP2r @variables/ ( -- ) ;&buf DUP2 #0024 ADD2 SWP2 &>l [ LIT2 ".. ] OVR2 STA2 INC2 INC2 GTH2k ?&>l POP2 POP2 JMP2r %variables/get ( var -- value ) { .variables/buf ADD LDZ } %variables/ ( var -- value ) { .variables/buf ADD STZ } ( @|Grid ) %grid/get ( addr* -- cell ) { ;grid/buf ADD2 LDA } %grid/ ( cell addr* -- ) { ;grid/buf ADD2 STA } @ ( -- ) types/ variables/ .grid/height LDZ #00 ( | reset head ) &>ver DUP .head/y STZ ( row ) [ LITr 00 ] STHk [ LIT2r =Row/width ] MUL2r ( ) .grid/width LDZ #00 &>hor DUP .head/x STZ DUP2r [ LITr -head/addr ] STZ2r STH2kr types/get #f0 AND ?{ STH2kr #00 STH2kr grid/get DUP ADD ;library/lut ADD2 LDA2 JSR2 } INC2r INC GTHk ?&>hor POP2r POP2 INC GTHk ?&>ver POP2 ( | end ) grid/ timer/widget/ .timer/frame LDZ2 INC2 .timer/frame STZ2 [ LIT2 00 -timer/beat ] STZ !voices/ @grid/ ( -- ) ( | x ) #0010 .grid/x1 STZ2 .Screen/width DEI2 ( ) DUP2 #03 SFT2 NIP #04 SUB .grid/width STZ ( ) #01 SFT2 .grid/width LDZ #01 SFT #00 SWP #30 SFT2 ADD2 #0004 ADD2 .grid/x2 STZ2 ( | y ) #0010 .grid/y1 STZ2 .Screen/height DEI2 ( ) DUP2 #04 SFT2 NIP #03 SUB .grid/height STZ ( ) #01 SFT2 .grid/height LDZ #01 SFT #00 SWP #40 SFT2 ADD2 .grid/y2 STZ2 ( | length ) ;grid/height LDZ ;grid/width LDZ ( ) MUL2 .grid/length STZ2 JMP2r @grid/ ( -- ) .grid/height LDZ #00 &>res-ver ( row ) [ LITr 00 ] STHk [ LIT2r =Row/width ] MUL2r ( ) .grid/width LDZ #00 &>res-hor [ LIT2 ".. ] STH2kr ;grid/buf ADD2 STA2 INC2r INC2r INC INC GTHk ?&>res-hor POP2 POP2r INC GTHk ?&>res-ver POP2 JMP2r @grid/ ( -- ) [ LIT2 01 _&req ] STR JMP2r @grid/ ( -- ) [ LIT &req $1 ] ?{ JMP2r } [ LIT2 00 _&req ] STR ( | draw ) .select/to LDZ2 get-addr grid/get ;&highlight STA .grid/height LDZ #00 &>ver ( row ) [ LITr 00 ] STHk [ LIT2r =Row/width ] MUL2r ( x ) .grid/x1 LDZ2 .Screen/x DEO2 ( y ) #00 OVR #40 SFT2 .grid/y1 LDZ2 ADD2 .Screen/y DEO2 .grid/width LDZ #00 &>hor ( +bound x y ) ROTk STH2kr / ( -bound ) POP INC2r INC GTHk ?&>hor POP2 POP2r INC GTHk ?&>ver POP2 .help LDZ ?help/ JMP2r @grid/ ( x y addr* -- ) OVR2 select/is-within ?/ DUP2 types/get STHk ?/ grid/get DUP LIT ". EQU ?/ DUP cilc ?/ #00 SWP #40 SFT2 ;font/glyphs ADD2 .Screen/addr DEO2 ( draw ) #0f STHr AND INC .Screen/sprite DEO POP2 JMP2r @grid/ ( x y value . type -- ) #00 OVR #40 SFT2 ;font/glyphs ADD2 .Screen/addr DEO2 [ LIT &highlight $1 ] NEQ DUP ADD INC .Screen/sprite DEO POP2 POPr JMP2r @grid/ ( x y value . type -- ) POP POPr #0703 AND2 ORA ?{ ;font/dot .Screen/addr DEO2 [ LIT2 03 -Screen/sprite ] DEO JMP2r } ;font/space .Screen/addr DEO2 [ LIT2 01 -Screen/sprite ] DEO JMP2r @grid/ ( x y addr* . type -- ) grid/get #00 SWP #40 SFT2 ;font/glyphs ADD2 .Screen/addr DEO2 ( draw ) #0f STHr AND INC .Screen/sprite DEO POP2 JMP2r @grid/ ( x y addr* -- ) grid/get #00 SWP #40 SFT2 ;font/glyphs ADD2 .Screen/addr DEO2 [ LIT2 -Styles/selected -Screen/sprite ] DEO POP2 JMP2r @help/ ( -- ) .help LDZk #00 EQU SWP STZ !grid/ @help/ ( -- ) .Screen/width DEI2 #0200 GTH2 ?{ JMP2r } #0020 #0000 &>l ( x ) DUP2 #84 SFT2 .grid/x1 LDZ2 ADD2 #0020 ADD2 .Screen/x DEO2 ( y ) DUP2 #000f AND2 #40 SFT2 .grid/y1 LDZ2 ADD2 #0020 ADD2 .Screen/y DEO2 .Screen/y DEI2 .grid/y2 LDZ2 #0030 SUB2 GTH2 ?{ DUP2k ADD2 ;&lut ADD2 LDA2 ( glyph ) LDAk #0c font/ ( space ) ;Screen/sprite DEO ( text ) INC2 #01 font/ } INC2 GTH2k ?&>l POP2 POP2 ( | toggle message ) ( x ) .grid/x1 LDZ2 #0030 ADD2 .Screen/x DEO2 ( y ) .grid/y1 LDZ2 #0130 ADD2 .Screen/y DEO2 ;dict/guide #02 !font/ @get-bang ( -- bang ) .head/addr LDZ2 ;grid/buf ADD2 STH2k ( left ) #0001 SUB2 LDA LIT "* EQU ?&bang ( top ) STH2kr above LDA LIT "* EQU ?&bang ( right ) STH2kr INC2 LDA LIT "* EQU ?&bang ( bottom ) STH2kr below LDA LIT "* EQU ?&bang POP2r #00 JMP2r &bang POP2r #01 JMP2r ( @|voices ) ( len vel chn note ) @voices/find ( chn pitch -- ) ,&t STR2 [ LIT2 -&cap -&buf ] &>lf LDZk #00 EQU ?{ INCk INC LDZ2 [ LIT2 &t $2 ] NEQ2 ?{ NIP JMP2r } } #04 ADD GTHk ?&>lf POP2 #ff JMP2r @voices/next ( -- voice ) [ LIT2 -&cap -&buf ] &>ln LDZk #00 EQU ?&end #04 ADD GTHk ?&>ln &end NIP JMP2r @voices/count ( -- count ) LITr 00 [ LIT2 -&cap -&buf ] &>lc LDZk #00 NEQ STH ADDr #04 ADD GTHk ?&>lc POP2 STHr JMP2r @voices/ ( voice -- ) ( chn ) INC INC LDZ2 SWP .Console/write DEO ( note ) .Console/write DEO ( vel ) #00 .Console/write DEO JMP2r @voices/ ( chn pitch len vel -- ) OVR2 /find DUP #ff EQU ?{ DUP / #00 OVR STZ } POP ( save ) /next STHk STZ2 INCkr INCr STHr STZ2 STHr ( chn ) INC INCk LDZ2 SWP .Console/write DEO ( note ) .Console/write DEO ( vel ) LDZ .Console/write DEO !/ @voices/ ( -- ) #1000 ( record changes ) [ LITr 00 ] &>lu DUP #20 SFT .&buf ADD LDZk #00 EQU ?{ ( decrement ) LDZk #01 SUB OVR STZ LDZk ?{ DUP / } INCr } POP INC GTHk ?&>lu POP2 STHr ?{ JMP2r } ( >> ) @voices/ ( -- ) [ LIT2 &x $2 ] .Screen/x DEO2 [ LIT2 &y $2 ] .Screen/y DEO2 #02 ;font/color STA /count STH #0800 &>wd INCk STHkr GTH [ LIT2 "-+ ] ROT [ JMP SWP POP ] font/ INC GTHk ?&>wd POP2 POPr JMP2r ( @|Font ) @font/ ( short* -- ) SWP / ( >> ) @font/ ( byte -- ) DUP #04 SFT / ( >> ) @font/ ( byte -- ) #0f AND DUP #09 GTH #07 MUL ADD #30 ADD !/ @font/ ( char color -- ) ,&color STR ( >> ) @font/ ( char -- ) #00 SWP #40 SFT2 ;&glyphs ADD2 .Screen/addr DEO2 [ LIT2 &color 01 -Screen/sprite ] DEO JMP2r @font/ ( str* color -- ) ,&color STR &>while LDAk DUP ?{ POP POP2 JMP2r } / INC2 !&>while ( @|ports ) @ports/get-right1-val ( addr* -- value ) INC2 ( >> ) @ports/get-right-val ( addr* -- value ) ports/get-right-raw chrb36 JMP2r @ports/get-left1-val ( addr* -- value ) #0001 SUB2 ( >> ) @ports/get-left-val ( addr* -- value ) ports/get-left-raw chrb36 JMP2r @ports/get-left1-raw ( addr* -- value ) #0001 SUB2 ( >> ) @ports/get-left-raw ( addr* -- value ) ( type ) STH2k .Types/pl STH2r types/ grid/get JMP2r @ports/get-right1-case ( addr* -- value case ) ports/get-right1-raw DUP chrb36 SWP ciuc JMP2r @ports/get-right1-raw ( addr* -- value ) INC2 ( >> ) @ports/get-right-raw ( addr* -- value ) STH2k ( type ) .Types/lock-right STH2r types/ grid/get JMP2r @ports/ ( value addr* -- ) below ( >> ) @ports/ ( value addr* -- ) STH2k ( type ) .Types/lock-output STH2r types/ grid/ JMP2r @ports/ ( value addr* -- ) STH2k ( type ) .Types/lock-default STH2r types/ grid/ JMP2r @ports/ ( addr* -- ) STH2 ( type ) .Types/lock-lut STH2r types/ JMP2r ( @|File ) @file/ ( -- ) grid/ types/ variables/ src/ ( | default speed ) #0b timer/ ! @file/ ( -- ) #0000 ;src/buf file/ src/ grid/ #00 !src/ @file/ ( x y path* -- ) .File/name DEO2 #0001 .File/length DEO2 STH2k POP ,&anchor-x STR &>stream ;&b .File/read DEO2 .File/success-lb DEI ?{ POP2r JMP2r } [ LIT2 0a &b $1 ] NEQk ?{ ( pop chars ) POP2 ( reset x ) NIPr [ LITr &anchor-x $1 ] SWPr ( incr y ) INCr !&>stream } STH2kr get-addr grid/ [ LIT2r 0100 ] ADD2r POP !&>stream @file/ ( -- ) ;src/buf .File/name DEO2 #0001 .File/length DEO2 .grid/height LDZ #00 &>ver .grid/width LDZ #00 &>hor OVR2 NIP OVR SWP get-addr ;grid/buf ADD2 .File/write DEO2 INC GTHk ?&>hor POP2 ( linebreak ) ;&lb .File/write DEO2 INC GTHk ?&>ver POP2 !src/ &lb 0a @file/ ( -- ) #800f DEO JMP2r ( @|Edit ) @edit/ ( -- ) edit/ LIT ". !select/ @edit/ ( -- ) ;&buf ,&ptr STR2 .select/y2 LDZ INC .select/y1 LDZ &>ver STHk .select/x2 LDZ INC .select/x1 LDZ &>hor DUP STHkr get-addr grid/get / INC GTHk ?&>hor POP2 POPr ( linebreak ) #0a / INC GTHk ?&>ver POP2 JMP2r @edit/ ( c -- ) #00 [ LIT2 &ptr =&buf ] INC2k ,&ptr STR2 STA2 JMP2r @edit/ ( -- ) ,&ptr LDR2 ;&buf .select/from LDZ2 OVR ,&anchor STR STH2 &>lp GTH2k ?{ POP2 POP2 POP2r !grid/ } LDAk DUP #0a NEQ ?{ ( linebreak ) POP NIPr [ LITr &anchor 00 ] SWPr INCr INC2 !&>lp } ( insert ) STH2kr get-addr grid/ ( move ) LIT2r 0100 ADD2r INC2 !&>lp @edit/ ( -- ) LIT ". !select/ @edit/ ( -- ) [ LIT2 "#. ] ( get cell ) .select/from LDZ2 get-addr grid/get ( toggle ) [ LIT "# ] NEQ [ JMP SWP POP ] ,&c STR ( | apply ) .select/y2 LDZ INC .select/y1 LDZ &>l STHk [ LIT &c $1 ] ( l ) DUP .select/x1 LDZ STHkr get-addr grid/ ( r ) .select/x2 LDZ STHr get-addr grid/ INC GTHk ?&>l POP2 JMP2r ( @|Timer ) @timer/on-play ( -> ) ( on beat ) .timer LDZ2 NEQ ?{ } ( inc beat ) .timer/beat LDZk INC SWP STZ ( >> ) @timer/on-pause ( -> ) [ LIT2 01 &f $1 ] INCk ,&f STR AND ?{ grid/ } BRK @timer/ ( -- ) .Screen/vector DEI2 ;&on-play EQU2 ?{ ;&on-play .Screen/vector DEO2 JMP2r } ;&on-pause .Screen/vector DEO2 !/widget/ @timer/ ( -- ) ;&on-pause .Screen/vector DEO2 !/widget/ @timer/ #ff !/ @timer/ #01 !/ @timer/ ( mod -- ) .&speed LDZ ADD ( >> ) @timer/ ( speed -- ) #1f AND #04 GTHk [ JMP SWP POP ] .&speed STZ [ LIT2 00 -&beat ] STZ !draw-speed @timer/widget/ ( -- ) [ LIT2 &widget/x $2 ] .Screen/x DEO2 [ LIT2 &widget/y $2 ] .Screen/y DEO2 ( | icon ) ;beat-icn .Screen/addr DEO2 [ LIT2 01 -&frame-lb ] LDZ AND DUP ADD INC .Screen/sprite DEO ( | text ) .Screen/vector DEI2 ;&on-play NEQ2 #02 ADD ;font/color STA .&frame LDZ2 !font/ @draw-speed ( -- ) [ LIT2 &x $2 ] .Screen/x DEO2 [ LIT2 &y $2 ] .Screen/y DEO2 .timer/speed LDZ !font/ ( @|Select ) %add-pos ( xy xy -- xy ) { ROT ADD STH ADD STHr } @select/ ( x y mod -- ) DUP #04 NEQ ?{ POP ( | scale ) /validate-to ?{ POP2 JMP2r } .&to LDZ2 add-pos !/ } #01 NEQ ?{ ( | drag ) /validate-from ?{ POP2 JMP2r } /validate-to ?{ POP2 JMP2r } edit/ STH2k .&from LDZ2 add-pos STH2r .&to LDZ2 add-pos / !edit/ } ( | move ) /validate-from ?{ POP2 JMP2r } /validate-to ?{ POP2 JMP2r } STH2k .&from LDZ2 add-pos STH2r .&to LDZ2 add-pos !/ @select/validate-from ( x y -- x y bool ) DUP .&y1 LDZ #ff00 NEQ2 STH OVR .&x1 LDZ #ff00 NEQ2 STHr AND JMP2r @select/validate-to ( x y -- x y bool ) DUP .&y2 LDZ INC [ LIT2 01 -grid/height ] LDZ NEQ2 STH OVR .&x2 LDZ INC [ LIT2 01 -grid/width ] LDZ NEQ2 STHr AND JMP2r @select/is-within ( x y -- bool ) DUP .&y1 LDZ LTH ?&outside DUP .&y2 LDZ GTH ?&outside OVR .&x1 LDZ LTH ?&outside OVR .&x2 LDZ GTH ?&outside POP2 #01 JMP2r &outside POP2 #00 JMP2r @select/ ( -- ) .&from LDZ2 !/ @select/ ( -- ) #0000 .grid/size LDZ2 !/ @select/ ( x y -- ) DUP .grid/height LDZ LTH ?{ POP2 JMP2r } OVR .grid/width LDZ LTH ?{ POP2 JMP2r } DUP2 !/ @select/ ( x y -- ) DUP .grid/height LDZ LTH ?{ POP2 JMP2r } INCk .&y1 LDZ GTH ?{ POP2 JMP2r } OVR .grid/width LDZ LTH ?{ POP2 JMP2r } OVR INC .&x1 LDZ GTH ?{ POP2 JMP2r } .&from LDZ2 SWP2 ( >> ) @select/ ( from* to* -- ) DUP2 .&to LDZ2 NEQ2 ?{ POP2 POP2 JMP2r } .&to STZ2 .&from STZ2 [ LIT2 00 -help ] STZ grid/ !select/widget/ @select/ ( char -- ) DUP ?{ POP JMP2r } DUP #20 SUB #5f LTH ?{ POP LIT ". } ,&c STR .&y2 LDZ INC .&y1 LDZ &>ver STHk .&x2 LDZ INC .&x1 LDZ &>hor [ LIT &c $1 ] OVR STHkr get-addr grid/ INC GTHk ?&>hor POP2 POPr INC GTHk ?&>ver POP2 grid/ !src/ @select/widget/ ( -- ) [ LIT2 &widget/x $2 ] .Screen/x DEO2 [ LIT2 &widget/y $2 ] .Screen/y DEO2 ( | icon ) #00 .Controller/vector DEI2 ;insert/on-button EQU2 STHk ( get addr ) #40 SFT2 ;select/icns ADD2 .Screen/addr DEO2 ( draw ) INCr INCr DUPr [ LITr -Screen/sprite ] DEOr ( set color ) [ LIT2r =font/color ] STAr ( | draw size ) .select/from LDZ2 .select/to LDZ2 EQU2k ?{ SWP2 SUB2 DUP2 } ( | value ) POP2 !font/ @insert/ ( -- ) .select/to LDZ2 INC ,&anchor STR2 ;on-button ;&on-button .Controller/vector DEI2 ;&on-button EQU2 [ JMP SWP2 POP2 ] .Controller/vector DEO2 !select/widget/ @insert/on-button ( -> ) .Controller/key DEI [ #00 ] EQUk NIP ?&end [ #1b ] NEQk NIP ?{ / POP BRK } [ #0d ] NEQk NIP ?{ [ LIT2 &anchor $2 ] INC2k ,&anchor STR2 select/ POP BRK } [ #20 ] NEQk NIP ?{ #0100 #00 select/ POP BRK } [ #08 ] NEQk NIP ?{ #ff00 #00 select/ LIT ". select/ POP BRK } DUP #7e GTH ?{ DUP select/ #0100 #00 select/ } &end POP BRK ( @|Cursor ) @cursor/ ( color -- ) ;fill-icn .Screen/addr DEO2 #40 / ;&sprite-icn .Screen/addr DEO2 .Mouse/x DEI2 ,&x STR2 .Mouse/y DEI2 ,&y STR2 ( >> ) @cursor/ ( color -- ) [ LIT2 &x $2 ] .Screen/x DEO2 [ LIT2 &y $2 ] .Screen/y DEO2 .Screen/sprite DEO JMP2r @cursor/sprite-icn [ 80c0 e0f0 f8fc feff f8d8 8c0c 0606 0000 ] ( @|Random ) @random/ ( -- ) ( seed ) [ LIT2 00 -DateTime/second ] DEI [ LIT2 00 -DateTime/minute ] DEI #60 SFT2 EOR2 [ LIT2 00 -DateTime/hour ] DEI #c0 SFT2 EOR2 ,&x STR2 [ LIT2 00 -DateTime/hour ] DEI #04 SFT2 [ LIT2 00 -DateTime/day ] DEI DUP2 ADD2 EOR2 [ LIT2 00 -DateTime/month ] DEI #60 SFT2 EOR2 .DateTime/year DEI2 #a0 SFT2 EOR2 ,&y STR2 JMP2r @random/generate ( -- number* ) [ LIT2 &x $2 ] DUP2 #50 SFT2 EOR2 DUP2 #03 SFT2 EOR2 [ LIT2 &y $2 ] DUP2 ,&x STR2 DUP2 #01 SFT2 EOR2 EOR2 ,&y STR2k POP JMP2r ( @|Theme ) @theme/ ( -- ) ;&path .File/name DEO2 #0002 .File/length DEO2 ;&r .File/read DEO2 ;&g .File/read DEO2 ;&b .File/read DEO2 .File/success DEI2 ORA #01 JCN JMP2r LIT2 &r $2 .System/r DEO2 LIT2 &g $2 .System/g DEO2 LIT2 &b $2 .System/b DEO2 JMP2r &path ".theme $1 ( @|stdlib ) @chrvel ( char -- vel ) DUP LIT "0 EQU ?&silence chrb36 #03 MUL DUP ?&has-vel POP #7f &has-vel JMP2r &silence POP #00 JMP2r @lerp ( rate target val -- val ) DUP2 GTHk [ JMP SWP SUB ] STH ( if rate GTH target ) ROT DUP STHr LTH ?{ POP2 JMP2r } ( target val rate ) STH GTHk ?&no-below NIP STHr SUB JMP2r &no-below NIP STHr ADD JMP2r @ ( short* -: ) SWP /b &b ( byte -: ) DUP #04 SFT /c &c ( byte -: ) #0f AND DUP #09 GTH #27 MUL ADD [ LIT "0 ] ADD #18 DEO JMP2r @dict &orca "Orca $1 &view "View $1 &edit "Edit $1 &play "Play $1 &select "Select $1 &guide "Ctrl+h 20 "to 20 "toggle 20 "guide. $1 ( @|operators ) @op-a "A "Outputs 20 "sum 20 "of 20 "inputs $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( a ) ports/get-left1-val ( b ) STH2kr ports/get-right1-case ,&case STR ( res ) ADD [ LIT &case $1 ] set-case STH2r !ports/ @op-b "B "Outputs 20 "difference 20 "of 20 "inputs $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( a ) ports/get-left1-val ( b ) STH2kr ports/get-right1-case ,&case STR ( res ) SUB DUP #80 LTH ?{ #24 SWP SUB } [ LIT &case $1 ] set-case STH2r !ports/ @op-c "C "Outputs 20 "modulo 20 "of 20 "frame $1 &lc get-bang ?&* POP2 JMP2r &* STH2 .Types/op STH2kr types/ .timer/frame LDZ2 #00 ( rate* ) STH2kr ports/get-left1-val ( min1* ) EQUk ADD DIV2 #00 ( mod* ) STH2kr ports/get-right1-case ,&case STR ( min1* ) EQUk ADD ( mod2 ) [ DIV2k MUL2 SUB2 ] ( res ) NIP [ LIT &case $1 ] set-case STH2r !ports/ @op-d "D "Bangs 20 "on 20 "modulo 20 "of 20 "frame $1 &lc get-bang ?&* POP2 JMP2r &* STH2 .Types/op STH2kr types/ .timer/frame LDZ2 #00 ( rate* ) STH2kr ports/get-left1-val ( min1* ) EQUk ADD #00 ( mod* ) STH2kr ports/get-right1-val ( min1* ) EQUk ADD ( mod2 ) MUL2 [ DIV2k MUL2 SUB2 ] #0000 EQU2 ( bang ) [ LIT2 "*. ] ROT [ JMP SWP POP ] STH2r !ports/ @op-e "E "Moves 20 "eastward 20 "or 20 "bangs $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ grid/get ,&self STR ( wall ) .head/x LDZ INC .grid/width LDZ EQU ?&collide ( cell ) STH2kr INC2 grid/get LIT ". NEQ ?&collide ( write new ) [ LIT &self $1 ] STH2kr INC2 ports/ ( erase old ) LIT ". STH2r !ports/ &collide LIT "* STH2r !ports/ @op-f "F "Bangs 20 "if 20 "inputs 20 "are 20 "equal $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( a ) ports/get-left1-raw ( b ) STH2kr ports/get-right1-raw ( bang ) EQU [ LIT2 "*. ] ROT [ JMP SWP POP ] STH2r !ports/ @op-g "G "Writes 20 "operands 20 "with 20 "offset $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( x ) STH2kr #0003 SUB2 ports/get-left-val ( load ) #00 SWP ADD2 ( y ) STH2kr #0002 SUB2 ports/get-left-val ( load ) #00 SWP INC2 get-row ADD2 ,&save STR2 ( len ) STH2kr ports/get-left1-val ( min1 ) DUP #00 EQU ADD #00 &>l ( load ) #00 OVR STH2kr INC2 ADD2 ports/get-right-raw ( save ) OVR #00 SWP [ LIT2 &save $2 ] ADD2 ports/ INC GTHk ?&>l POP2 POP2r JMP2r @op-h "H "Holds 20 "southward 20 "operand $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( cell ) below grid/get STH2r !ports/ @op-i "I "Increments 20 "southward 20 "operand $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( step ) ports/get-left1-val ( mod ) STH2kr ports/get-right1-case ,&case STR ( min1 ) DUP #00 EQU ADD ( res ) SWP STH2kr below grid/get chrb36 ADD SWP ( MOD ) [ DIVk MUL SUB ] [ LIT &case $1 ] set-case STH2r !ports/ @op-j "J "Outputs 20 "northward 20 "operand $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( get above ) above ports/get-left-raw ( ignore cable ) DUP [ LIT "J ] NEQ ?{ POP POP2r JMP2r } ( skip down ) STH2r &>w below DUP2 grid/get chrb36 #13 EQU ?&>w !ports/ @op-k "K "Reads 20 "multiple 20 "variables $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ports/get-left1-val #00 &>l #00 OVR STH2kr INC2 ADD2 STH2k ports/get-right-raw DUP LIT ". EQU ?{ ( load ) DUP chrb36 variables/get ( save ) STH2kr ports/ } POP POP2r INC GTHk ?&>l POP2 POP2r JMP2r @op-l "L "Outputs 20 "smallest 20 "of 20 "inputs $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( a ) ports/get-left1-val ( b ) STH2kr ports/get-right1-case ,&case STR ( res ) [ LTHk JMP SWP POP ] [ LIT &case $1 ] set-case STH2r !ports/ @op-m "M "Outputs 20 "product 20 "of 20 "inputs $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( a ) ports/get-left1-val ( b ) STH2kr ports/get-right1-case ,&case STR ( res ) MUL [ LIT &case $1 ] set-case STH2r !ports/ @op-n "N "Moves 20 "Northward 20 "or 20 "bangs $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ grid/get ,&self STR ( wall ) .head/y LDZ #01 SUB #ff EQU ?&collide ( cell ) STH2kr above grid/get LIT ". NEQ ?&collide ( write new ) [ LIT &self $1 ] STH2kr above ports/ ( erase old ) LIT ". STH2r !ports/ &collide LIT "* STH2r !ports/ @op-o "O "Reads 20 "operand 20 "with 20 "offset $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( x ) STH2kr #0002 SUB2 ports/get-left-val INC #00 SWP ADD2 ( y ) STH2kr ports/get-left1-val #00 SWP get-row ADD2 ( val ) ports/get-right-raw STH2r !ports/ @op-p "P "Writes 20 "eastward 20 "operand $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( key ) #0002 SUB2 ports/get-left-val ( len ) STH2kr ports/get-left1-val ( min1 ) DUP #00 EQU ADD #00 &>l #00 OVR STH2kr below ADD2 ports/ INC GTHk ?&>l POP ( read ) STH2kr ports/get-right1-raw ROT ROT ( MOD ) [ DIVk MUL SUB ] #00 SWP STH2r below ADD2 !ports/ @op-q "Q "Reads 20 "operands 20 "with 20 "offset $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( x ) STH2kr #0003 SUB2 ports/get-left-val ( load ) #00 SWP INC2 ADD2 ( y ) STH2kr #0002 SUB2 ports/get-left-val ( load ) #00 SWP get-row ADD2 ,&load STR2 ( len ) STH2kr ports/get-left1-val ( min1 ) DUP #00 EQU ADD ( save ) #00 OVR STH2kr below SWP2 SUB2 INC2 ,&save STR2 #00 &>l ( load ) #00 OVR [ LIT2 &load $2 ] ADD2 ports/get-right-raw ( save ) OVR #00 SWP [ LIT2 &save $2 ] ADD2 ports/ INC GTHk ?&>l POP2 POP2r JMP2r @op-r "R "Outputs 20 "random 20 "value $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( a-min ) ports/get-left1-val ( b-max ) STH2kr ports/get-right1-case ,&case STR ( min1 ) DUP #00 EQU ADD ( mod ) OVR SUB random/generate ADD SWP ( min1 ) DUP #00 EQU ADD ( MOD ) [ DIVk MUL SUB ] ADD [ LIT &case $1 ] set-case STH2r !ports/ @op-s "S "Moves 20 "southward 20 "or 20 "bangs $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ grid/get ,&self STR ( wall ) .head/y LDZ INC .grid/height LDZ EQU ?&collide ( cell ) STH2kr below grid/get LIT ". NEQ ?&collide ( write new ) [ LIT &self $1 ] STH2kr below ports/ ( erase old ) LIT ". STH2r !ports/ &collide LIT "* STH2r !ports/ @op-t "T "Reads 20 "eastward 20 "operand $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( key ) #0002 SUB2 ports/get-left-val ( len ) STH2kr ports/get-left1-val ( min1 ) DUP #00 EQU ADD #00 &>l #00 OVR STH2kr INC2 ADD2 ports/ INC GTHk ?&>l POP ( read ) ( MOD ) [ DIVk MUL SUB ] #00 SWP STH2kr INC2 ADD2 ports/get-right-raw STH2r !ports/ @op-u "U "Bangs 20 "on 20 "Euclidean 20 "rhythm $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( step ) ports/get-left1-val ( max ) STH2kr ports/get-right1-val ( min1 ) DUP #00 EQU ADD STH2 ( frame ADD max SUB 1 ) .timer/frame LDZ2 #00 STHkr ADD2 #0001 SUB2 ( MUL step ) OVRr #00 STHr MUL2 ( % max ) #00 STHkr ( mod2 ) [ DIV2k MUL2 SUB2 ] ( ADD step ) SWPr #00 STHr ADD2 ( bucket GTH= max ) #00 STHr LTH2 #01 NEQ ( bang if equal ) #fc MUL LIT ". ADD STH2r !ports/ @op-v "V "Reads 20 "and 20 "writes 20 "variable $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( key ) ports/get-left1-raw ( val ) STH2kr ports/get-right1-raw DUP LIT ". EQU ?&idle OVR LIT ". EQU ?&load ( save ) SWP chrb36 variables/ POP2r JMP2r &load NIP chrb36 variables/get STH2r below !ports/ &idle POP2 POP2r JMP2r @op-w "W "Moves 20 "westward 20 "or 20 "bangs $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ grid/get ,&self STR ( wall ) .head/x LDZ #01 SUB #ff EQU ?&collide ( cell ) STH2kr #0001 SUB2 grid/get LIT ". NEQ ?&collide ( write new ) [ LIT &self $1 ] STH2kr #0001 SUB2 ports/ ( erase old ) LIT ". STH2r !ports/ &collide LIT "* STH2r !ports/ @op-x "X "Writes 20 "operand 20 "with 20 "offset $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( x ) STH2kr #0002 SUB2 ports/get-left-val #00 SWP ADD2 ( y ) STH2kr ports/get-left1-val INC #00 SWP get-row ADD2 ( val ) STH2r ports/get-right1-raw ROT ROT !ports/ @op-y "Y "Outputs 20 "westward 20 "operand $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( get above ) ports/get-left1-raw ( ignore cable ) DUP [ LIT "Y ] NEQ ?{ POP POP2r JMP2r } ( skip down ) STH2r &>w INC2 DUP2 grid/get chrb36 #22 EQU ?&>w !ports/ @op-z "Z "Transitions 20 "operand 20 "to 20 "input $1 &lc get-bang ?&* POP2 JMP2r &* STH2k .Types/op STH2kr types/ ( rate ) ports/get-left1-val ( target ) STH2kr ports/get-right1-case ,&case STR ( val ) STH2kr below grid/get chrb36 ( res ) lerp [ LIT &case $1 ] set-case STH2r !ports/ ( @|special ) @op-bang "* "Bangs 20 "neighboring 20 "operands $1 &* LIT ". ROT ROT grid/ JMP2r @op-comment "# "Comments 20 "a 20 "line $1 &* STH2k ( set itself ) DUP2 ports/ ( get edge ) [ LIT2 00 -grid/width ] LDZ .head/x LDZ SUB ADD2 STH2r INC2 &>l DUP2 ports/ ( stop at hash ) DUP2 grid/get LIT "# EQU ?&end INC2 GTH2k ?&>l &end POP2 POP2 JMP2r @op-midi ": "Send 20 "a 20 "midi 20 "note $1 &* INC2k STH2k ( channel ) ports/get-right-val ,&chn STR ( octave ) INC2r STH2kr ports/get-right-val #0c MUL ( note ) INC2r STH2kr ports/get-right-raw chrmid ADD ,&pitch STR ( velocity ) INC2r STH2kr ports/get-right-raw chrvel ,&vel STR ( length ) INC2r STH2r ports/get-right-val INC ,&len STR get-bang ?&has-bang POP2 JMP2r &has-bang ,&pitch LDR ?&has-pitch POP2 JMP2r &has-pitch .Types/io ROT ROT types/ [ LIT2 &chn $1 &pitch $1 ] [ LIT2 &len $1 &vel $1 ] !voices/ @op-pitch "; "Send 20 "a 20 "raw 20 "pitch 20 "byte $1 &* STH2k ( octave ) ports/get-right1-val ( note ) STH2kr INC2 ports/get-right1-raw ( has note ) DUP LIT ". NEQ ?&has-note [ POP2 POP2r JMP2r ] &has-note ( has bang ) get-bang ?&is-bang [ POP2 POP2r JMP2r ] &is-bang ( animate ) .Types/io STH2r types/ ( get note ) chrmid SWP [ #0c MUL ] ADD .Console/write DEO JMP2r @op-byte "/ "Send 20 "a 20 "raw 20 "hexadecimal 20 "byte $1 &* STH2k ( hn ) ports/get-right1-val ( ln ) STH2kr INC2 ports/get-right1-val ( has bang ) get-bang ?&is-bang [ POP2 POP2r JMP2r ] &is-bang ( animate ) .Types/io STH2r types/ #0f AND SWP #0f AND #40 SFT ADD .Console/write DEO JMP2r @op-self "$ "Load 20 "orca 20 "file $1 &* STH2k ;&buf ,&ptr STR2 &>w INC2 DUP2 ;grid/buf ADD2 LDA2 LIT2 ".. EQU2 ?&end DUP2 ports/get-right-raw DUP / ?&>w &end POP2 #00 / get-bang ?{ POP2r JMP2r } .head/pos LDZ2 INC ;&buf file/ .Types/io STH2r types/ JMP2r @op-self/ ( c -- ) [ LIT2 &ptr =&buf ] INC2k ,&ptr STR2 STA JMP2r @op-null POP2 JMP2r ( @|tables ) @help/lut [ =op-a =op-b =op-c =op-d =op-e =op-f =op-g =op-h =op-i =op-j =op-k =op-l =op-m =op-n =op-o =op-p =op-q =op-r =op-s =op-t =op-u =op-v =op-w =op-x =op-y =op-z =op-bang =op-comment =op-midi =op-pitch =op-byte =op-self ] @midi/lut [ ( lc ) 00 00 00 00 00 00 00 00 00 00 0a 0c 01 03 05 06 08 0a 0c 0d 0f 11 12 14 16 18 19 1b 1d 1e 20 22 24 25 27 29 ( uc ) 00 00 00 00 00 00 00 00 00 00 09 0b 00 02 04 05 07 09 0b 0c 0e 10 11 13 15 17 18 1a 1c 1d 1f 21 23 24 26 28 ] @chrb36/lut ( char to b36 ) [ ( padding ) $20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08 09 00 00 00 00 00 00 00 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 00 00 00 00 00 00 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 00 00 00 00 00 ] @b36clc ( b36 to char-lc ) [ 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a ] @library/lut ( 00 _ ) =op-null ( 01 _ ) =op-null ( 02 _ ) =op-null ( 03 _ ) =op-null ( 04 _ ) =op-null ( 05 _ ) =op-null ( 06 _ ) =op-null ( 07 _ ) =op-null ( 08 _ ) =op-null ( 09 _ ) =op-null ( 0a _ ) =op-null ( 0b _ ) =op-null ( 0c _ ) =op-null ( 0d _ ) =op-null ( 0e _ ) =op-null ( 0f _ ) =op-null ( 10 _ ) =op-null ( 11 _ ) =op-null ( 12 _ ) =op-null ( 13 _ ) =op-null ( 14 _ ) =op-null ( 15 _ ) =op-null ( 16 _ ) =op-null ( 17 _ ) =op-null ( 18 _ ) =op-null ( 19 _ ) =op-null ( 1a _ ) =op-null ( 1b _ ) =op-null ( 1c _ ) =op-null ( 1d _ ) =op-null ( 1e _ ) =op-null ( 1f _ ) =op-null ( 20 _ ) =op-null ( 21 ! ) =op-null ( 22 " ) =op-null ( 23 # ) =op-comment/* ( 24 $ ) =op-self/* ( 25 % ) =op-null ( 26 & ) =op-null ( 27 ' ) =op-null ( 28 _ ) =op-null ( 29 _ ) =op-null ( 2A * ) =op-bang/* ( 2B + ) =op-null ( 2C , ) =op-null ( 2D - ) =op-null ( 2E . ) =op-null ( 2F / ) =op-byte/* ( 30 0 ) =op-null ( 31 1 ) =op-null ( 32 2 ) =op-null ( 33 3 ) =op-null ( 34 4 ) =op-null ( 35 5 ) =op-null ( 36 6 ) =op-null ( 37 7 ) =op-null ( 38 8 ) =op-null ( 39 9 ) =op-null ( 3A : ) =op-midi/* ( 3B ; ) =op-pitch/* ( 3C < ) =op-null ( 3D = ) =op-null ( 3E > ) =op-null ( 3F ? ) =op-null ( 40 @ ) =op-null ( 41 A ) =op-a/* ( 42 B ) =op-b/* ( 43 C ) =op-c/* ( 44 D ) =op-d/* ( 45 E ) =op-e/* ( 46 F ) =op-f/* ( 47 G ) =op-g/* ( 48 H ) =op-h/* ( 49 I ) =op-i/* ( 4A J ) =op-j/* ( 4B K ) =op-k/* ( 4C L ) =op-l/* ( 4D M ) =op-m/* ( 4E N ) =op-n/* ( 4F O ) =op-o/* ( 50 P ) =op-p/* ( 51 Q ) =op-q/* ( 52 R ) =op-r/* ( 53 S ) =op-s/* ( 54 T ) =op-t/* ( 55 U ) =op-u/* ( 56 V ) =op-v/* ( 57 W ) =op-w/* ( 58 X ) =op-x/* ( 59 Y ) =op-y/* ( 5A Z ) =op-z/* ( 5B ) =op-null ( 5C \ ) =op-null ( 5D ) =op-null ( 5E ^ ) =op-null ( 5F _ ) =op-null ( 60 ` ) =op-null ( 61 a ) =op-a/lc ( 62 b ) =op-b/lc ( 63 c ) =op-c/lc ( 64 d ) =op-d/lc ( 65 e ) =op-e/lc ( 66 f ) =op-f/lc ( 67 g ) =op-g/lc ( 68 h ) =op-h/lc ( 69 i ) =op-i/lc ( 6A j ) =op-j/lc ( 6B k ) =op-k/lc ( 6C l ) =op-l/lc ( 6D m ) =op-m/lc ( 6E n ) =op-n/lc ( 6F o ) =op-o/lc ( 70 p ) =op-p/lc ( 71 q ) =op-q/lc ( 72 r ) =op-r/lc ( 73 s ) =op-s/lc ( 74 t ) =op-t/lc ( 75 u ) =op-u/lc ( 76 v ) =op-v/lc ( 77 w ) =op-w/lc ( 78 x ) =op-x/lc ( 79 y ) =op-y/lc ( 7A z ) =op-z/lc ( 7B { ) =op-null ( 7C | ) =op-null ( 7D } ) =op-null ( 7E ~ ) =op-null ( 7F _ ) =op-null ( @|spritesheet ) @select/icns [ 0000 c682 0000 0000 0000 82c6 0000 0000 0000 6618 1818 1818 1818 1866 0000 0000 ] @beat-icn [ 0000 0000 0038 7c7c 7c38 0000 0000 0000 ] @font/glyphs ( orca.816 ) $200 &space 0000 0000 0000 0000 0000 0000 0000 0000 0000 183c 3c3c 1818 1800 1818 0000 0000 0066 6666 2400 0000 0000 0000 0000 0000 0000 006c 6cfe 6c6c 6cfe 6c6c 0000 0000 1818 7cc6 c2c0 7c06 0686 c67c 1818 0000 0000 0000 c2c6 0c18 3060 c686 0000 0000 0000 386c 6c38 76dc cccc cc76 0000 0000 0030 3030 6000 0000 0000 0000 0000 0000 0000 0c18 3030 3030 3030 180c 0000 0000 0000 3018 0c0c 0c0c 0c0c 1830 0000 0000 0000 0000 0066 3cff 3c66 0000 0000 0000 0000 0000 0018 187e 1818 0000 0000 0000 0000 0000 0000 0000 0018 1818 3000 0000 0000 0000 0000 00fe 0000 0000 0000 0000 &dot 0000 0000 0000 0000 0000 1818 0000 0000 0000 0000 0206 0c18 3060 c080 0000 0000 0000 3c66 c3c3 dbdb c3c3 663c 0000 0000 0000 1838 7818 1818 1818 187e 0000 0000 0000 7cc6 060c 1830 60c0 c6fe 0000 0000 0000 7cc6 0606 3c06 0606 c67c 0000 0000 0000 0c1c 3c6c ccfe 0c0c 0c1e 0000 0000 0000 fec0 c0c0 fc06 0606 c67c 0000 0000 0000 3860 c0c0 fcc6 c6c6 c67c 0000 0000 0000 fec6 0606 0c18 3030 3030 0000 0000 0000 7cc6 c6c6 7cc6 c6c6 c67c 0000 0000 0000 7cc6 c6c6 7e06 0606 0c78 0000 0000 0000 0000 1818 0000 0018 1800 0000 0000 0000 0000 1818 0000 0018 1830 0000 0000 0000 0006 0c18 3060 3018 0c06 0000 0000 0000 0000 007e 0000 7e00 0000 0000 0000 0000 0060 3018 0c06 0c18 3060 0000 0000 0000 7cc6 c60c 1818 1800 1818 0000 0000 0000 007c c6c6 dede dedc c07c 0000 0000 0000 1038 6cc6 c6fe c6c6 c6c6 0000 0000 0000 fc66 6666 7c66 6666 66fc 0000 0000 0000 3c66 c2c0 c0c0 c0c2 663c 0000 0000 0000 f86c 6666 6666 6666 6cf8 0000 0000 0000 fe66 6268 7868 6062 66fe 0000 0000 0000 fe66 6268 7868 6060 60f0 0000 0000 0000 3c66 c2c0 c0de c6c6 663a 0000 0000 0000 c6c6 c6c6 fec6 c6c6 c6c6 0000 0000 0000 3c18 1818 1818 1818 183c 0000 0000 0000 1e0c 0c0c 0c0c cccc cc78 0000 0000 0000 e666 666c 7878 6c66 66e6 0000 0000 0000 f060 6060 6060 6062 66fe 0000 0000 0000 c3e7 ffff dbc3 c3c3 c3c3 0000 0000 0000 c6e6 f6fe dece c6c6 c6c6 0000 0000 0000 7cc6 c6c6 c6c6 c6c6 c67c 0000 0000 0000 fc66 6666 7c60 6060 60f0 0000 0000 0000 7cc6 c6c6 c6c6 c6d6 de7c 0c0e 0000 0000 fc66 6666 7c6c 6666 66e6 0000 0000 0000 7cc6 c660 380c 06c6 c67c 0000 0000 0000 ffdb 9918 1818 1818 183c 0000 0000 0000 c6c6 c6c6 c6c6 c6c6 c67c 0000 0000 0000 c3c3 c3c3 c3c3 c366 3c18 0000 0000 0000 c3c3 c3c3 c3db dbff 6666 0000 0000 0000 c3c3 663c 1818 3c66 c3c3 0000 0000 0000 c3c3 c366 3c18 1818 183c 0000 0000 0000 ffc3 860c 1830 60c1 c3ff 0000 0000 0000 3c30 3030 3030 3030 303c 0000 0000 0000 0080 c0e0 7038 1c0e 0602 0000 0000 0000 3c0c 0c0c 0c0c 0c0c 0c3c 0000 0000 1038 6cc6 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00ff 0000 3030 1800 0000 0000 0000 0000 0000 0000 0000 0000 0078 0c7c cccc cc76 0000 0000 0000 e060 6078 6c66 6666 667c 0000 0000 0000 0000 007c c6c0 c0c0 c67c 0000 0000 0000 1c0c 0c3c 6ccc cccc cc76 0000 0000 0000 0000 007c c6fe c0c0 c67c 0000 0000 0000 386c 6460 f060 6060 60f0 0000 0000 0000 0000 0076 cccc cccc cc7c 0ccc 7800 0000 e060 606c 7666 6666 66e6 0000 0000 0000 1818 0038 1818 1818 183c 0000 0000 0000 0606 000e 0606 0606 0606 6666 3c00 0000 e060 6066 6c78 786c 66e6 0000 0000 0000 3818 1818 1818 1818 183c 0000 0000 0000 0000 00e6 ffdb dbdb dbdb 0000 0000 0000 0000 00dc 6666 6666 6666 0000 0000 0000 0000 007c c6c6 c6c6 c67c 0000 0000 0000 0000 00dc 6666 6666 667c 6060 f000 0000 0000 0076 cccc cccc cc7c 0c0c 1e00 0000 0000 00dc 7666 6060 60f0 0000 0000 0000 0000 007c c660 380c c67c 0000 0000 0000 1030 30fc 3030 3030 361c 0000 0000 0000 0000 00cc cccc cccc cc76 0000 0000 0000 0000 00c3 c3c3 c366 3c18 0000 0000 0000 0000 00c3 c3c3 dbdb ff66 0000 0000 0000 0000 00c3 663c 183c 66c3 0000 0000 0000 0000 00c6 c6c6 c6c6 c67e 060c f800 0000 0000 00fe cc18 3060 c6fe 0000 0000 0000 0e18 1818 7018 1818 180e 0000 0000 0000 1818 1818 0018 1818 1818 0000 0000 0000 7018 1818 0e18 1818 1870 0000 0000 0000 76dc 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 @fill-icn [ ffff ffff ffff ffff ffff ffff ffff ffff ] @appicon [ 0000 0000 0000 0000 0000 0000 0001 0100 0007 0f0f 0fcf ce6d 070f 1f1f dfff ffff 0080 8080 8000 00c0 80c0 c0c0 c080 c0e0 0000 0000 0107 0f0f 0000 0001 0608 1011 7f38 2000 feff ffff ff7f 78fe 0100 f0f8 c000 0000 0080 c0c0 e0c0 0000 8040 2020 0f0f 0f07 0300 0000 1111 1108 0403 0000 ffff ffff fffc 1000 9898 f8f0 0003 ec10 c0c0 c080 0000 0000 2020 2040 8000 0000 ] @types/buf $4000 @grid/buf $4000 @op-self/buf $80 @edit/buf