( 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 $4 &type $1 &write $1 &error $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 |16 @Types/lock-output |01 @Types/pl |02 @Types/nil |07 @Types/op |04 @Styles/selected |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 ) #0f76 .System/r DEO2 #0fe6 .System/g DEO2 #0fc6 .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 #0058 ADD2 ;src/x STA2 ( ) DUP2 ;select/x STA2 ( ) #0030 ADD2 ;timer/x STA2 .grid/x2 LDZ2 ( ) #0040 SUB2 ;voices/x STA2 .grid/y2 LDZ2 #0008 ADD2 ( ) DUP2 ;select/y STA2 ( ) DUP2 ;timer/y STA2 ( ) DUP2 ;src/y STA2 ( ) ;voices/y STA2 ( | Unlock ) file/ help/ select/ voices/ ( | vectors ) ;on-button .Controller/vector DEO2 ;on-mouse .Mouse/vector DEO2 ;timer/on-play .Screen/vector DEO2 timer/ .Console/type DEI ?{ ;grid/on-console .Console/vector DEO2 BRK } ;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 ) "3 20 "Dec 20 "2025 00 01 ( icon ) 83 =appicon @manifest/dat ( . ) ={ =dict/orca ( - ) 01 "n =file/ =dict ( - ) 01 0d =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 ( @|Macros ) %grid/get ( addr* -- cell ) { ;grid/buf ADD2 LDA } %grid/ ( cell addr* -- ) { ;grid/buf ADD2 STA } %MOD ( a b -- res ) { DIVk MUL SUB } %MOD2 ( a* b* -- res* ) { DIV2k MUL2 SUB2 } %MIN1 ( a -- 1|+ ) { DUP #00 EQU ADD } %POP? ( a b bool -- a/b ) { [ JMP SWP ] POP } %ciuc ( char -- bool ) { LIT "A SUB #1a LTH } %chrb36 ( char -- b36 ) { #00 SWP ;chr/b36 ADD2 LDA } %b36chr ( value -- res ) { #00 SWP #24 MOD ;b36/chr ADD2 LDA } %chrmid ( char -- midi ) { DUP chrb36 SWP ciuc #24 MUL ADD #00 SWP ;midi/lut ADD2 LDA } %below ( addr* -- next-row* ) { ;grid/width LDZ ADD2 } %above ( addr* -- prev-row* ) { ;grid/width LDZ SUB2 } %get-row ( row -- addr* ) { #00 SWP ;grid/width LDZ MUL2 } %get-addr ( x y -- addr* ) { get-row ROT #00 SWP ADD2 } ( @|Ports ) %types/set-op ( addr* -- addr* ) { LITr -Types/op STH2k LIT2r =types/buf ADD2r STAr } %types/set-pl ( addr* -- addr* ) { LITr -Types/pl STH2k LIT2r =types/buf ADD2r STAr } %types/ ( addr* -- ) { LITr -Types/op STH2 LIT2r =types/buf ADD2r STAr } %types/ ( addr* -- ) { LITr -Types/pl STH2 LIT2r =types/buf ADD2r STAr } %types/lock-lut ( addr* -- addr* ) { LITr -Types/lock-lut STH2k LIT2r =types/buf ADD2r STAr } %types/lock-default ( addr* -- addr* ) { LITr -Types/lock-default STH2k LIT2r =types/buf ADD2r STAr } %types/lock-output ( addr* -- addr* ) { LITr -Types/lock-output STH2k LIT2r =types/buf ADD2r STAr } %types/ ( addr* -- ) { LITr -Types/lock-lut STH2 LIT2r =types/buf ADD2r STAr } %ports/w ( addr* -- value ) { types/set-pl grid/get } %ports/w1 ( addr* -- value ) { #0001 SUB2 ports/w } %ports/w-val ( addr* -- value ) { ports/w chrb36 } %ports/w1-val ( addr* -- value ) { #0001 SUB2 ports/w-val } %ports/e-val ( addr* -- value ) { ports/e chrb36 } %ports/e1-val ( addr* -- value ) { INC2 ports/e-val } %ports/e ( addr* -- value ) { types/lock-default grid/get } %ports/e1 ( addr* -- value ) { INC2 ports/e } %ports/e1-case ( addr* case -- value ) { ports/e1 DUP chrb36 SWP ciuc } %ports/ ( value addr* -- ) { types/lock-default grid/ } %ports/ ( value addr* -- ) { types/lock-output grid/ } %ports/ ( addr* -- ) { LIT "* ROT ROT ports/ } %ports/s ( addr* -- value ) { below grid/get } %ports/ ( value addr* -- ) { below ports/ } %ports/ ( bool . addr* -- ) { [ LIT2 "*. ] ROT POP? STH2r ports/ } ( @|Src ) @src/on-console ( -> ) .Console/read DEI ( ) DUP #20 GTH ?{ POP file/ ;grid/on-console .Console/vector DEO2 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 #01 font/ ?{ !/ } [ LIT2 "* 02 ] font/ ( >> ) @src/ ( -- ) ;voices/x LDA2 .Screen/x DEI2 SUB2 #03 SFT2 SUB &>lf #20 font/ INC DUP ?&>lf POP JMP2r @src/ ( to* from* -- ) ( validate ) SUB2k #0003 LTH2 ?{ / &>l DUP2 grid/get / INC2 GTH2k ?&>l #00 / } POP2 POP2 JMP2r @src/default-path "lobby.orca $1 ( @|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 STHk #f1 AND button-mod STHr select/ POP BRK @button-mod ( button -- button x y ) DUP #11 NEQ ?{ #00fc JMP2r } DUP #21 NEQ ?{ #0004 JMP2r } DUP #41 NEQ ?{ #f800 JMP2r } DUP #81 NEQ ?{ #0800 JMP2r } DUP #10 NEQ ?{ #00ff JMP2r } DUP #20 NEQ ?{ #0001 JMP2r } DUP #40 NEQ ?{ #ff00 JMP2r } DUP #80 NEQ ?{ #0100 JMP2r } #0000 JMP2r @on-mouse ( -> ) #41 cursor/ [ LIT2 &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 ?{ insert/ } DUP #01 NEQ ?{ timer/ } POP2 BRK } get-pos select/ insert/ 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/ ( -- ) ;grid/width LDZ ;grid/height LDZ MUL2 ,&len STR2 ;&mmu .System/expansion DEO2 JMP2r &mmu [ 00 &len $2 0000 =&buf -Types/nil ] @variables/ ( -- ) ;&mmu .System/expansion DEO2 JMP2r &mmu [ 00 0024 0000 =&buf ". ] %variables/get ( chr -- value ) { chrb36 .variables/buf ADD LDZ } %variables/ ( chr -- value ) { chrb36 .variables/buf ADD STZ } ( @|Grid ) @grid/on-console ( -> ) .Console/read DEI insert/ BRK @ ( -- ) types/ variables/ .grid/height LDZ #00 ( | reset head ) &>ver DUP .head/y STZ ( row ) LITr 00 STHk [ LIT2r =grid/width ] LDZr 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/ .timer/frame LDZ2 INC2 .timer/frame STZ2 [ LIT2 00 -timer/beat ] STZ !voices/ @grid/ ( -- ) ( | x ) #0010 .&x1 STZ2 .Screen/width DEI2 ( ) DUP2 #03 SFT2 NIP #04 SUB .&width STZ ( ) #01 SFT2 .&width LDZ #01 SFT #00 SWP #30 SFT2 ADD2 #0004 ADD2 .&x2 STZ2 ( | y ) #0010 .&y1 STZ2 .Screen/height DEI2 ( ) DUP2 #04 SFT2 NIP #03 SUB .&height STZ ( ) #01 SFT2 .&height LDZ #01 SFT #00 SWP #40 SFT2 ADD2 .&y2 STZ2 ( | length ) ;&height LDZ ;&width LDZ ( ) MUL2 .&length STZ2 JMP2r @grid/ ( -- ) ;grid/width LDZ ;grid/height LDZ MUL2 ,&len STR2 ;&mmu .System/expansion DEO2 JMP2r &mmu [ 00 &len $2 0000 =&buf ". ] @grid/ ( -- ) [ LIT2 01 _&req ] STR JMP2r @grid/ ( -- ) LIT &req $1 ?{ JMP2r } [ LIT2 00 _&req ] STR ( | draw ) .&height LDZ #00 &>ver ( row ) LITr 00 STHk [ LIT2r =grid/width ] LDZr MUL2r ( x ) .&x1 LDZ2 .Screen/x DEO2 ( y ) #00 OVR #40 SFT2 .&y1 LDZ2 ADD2 .Screen/y DEO2 .&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 .Types/nil NEQ ?/ grid/get DUP LIT ". EQU ?/ #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 -- ) 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 #03 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 ( l ) STH2k #0001 SUB2 LDA LIT "* EQU ?&bang ( t ) STH2kr above LDA LIT "* EQU ?&bang ( r ) STH2kr INC2 LDA LIT "* EQU ?&bang ( b ) 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 ?{ #04 ADD GTHk ?&>ln } 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 #01 ;font/color STA /count STH #0800 &>wd INCk STHkr GTH [ LIT2 ".| ] ROT POP? font/ INC GTHk ?&>wd POP2 POPr JMP2r ( @|Font ) @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 @font/ ( short* -- ) DUP2 #0064 DIV2 / ( >> ) @font/ ( short* -- ) DUP2 #000a DIV2 / ( >> ) @font/ ( value* -- ) #000a DIV2k MUL2 SUB2 LIT "0 ADD / POP JMP2r ( @|File ) @file/ ( -- ) grid/ types/ variables/ src/ timer/ ( | default speed ) #0f timer/ ! @file/ ( -- ) ( b ) .select/x2 LDZ .select/y1 LDZ get-addr INC2 ( a ) .select/from LDZ2 get-addr src/ grid/ types/ #0000 ;src/buf file/ !select/ @file/ ( -- ) #0000 ;src/buf file/ src/ grid/ timer/ #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 DUP2 ,&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 ( | write snarf ) ;dict/snarf .File/name DEO2 ,&ptr LDR2 OVR2 SUB2 .File/length DEO2 .File/write DEO2 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 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 ) .&beat LDZk INC SWP STZ ( >> ) @timer/on-pause ( -> ) grid/ BRK @timer/ ( -- ) .Screen/vector DEI2 ;&on-play EQU2 ?{ ;&on-play .Screen/vector DEO2 !/ } ;&on-pause .Screen/vector DEO2 / !/ @timer/ ( -- ) ;&on-pause .Screen/vector DEO2 !/ @timer/ ( -- ) #0000 .&frame STZ2 JMP2r @timer/ ( -- ) .&speed LDZ #04 GTH ?{ JMP2r } #ff !/ @timer/ ( -- ) .&speed LDZ #3c LTH ?{ JMP2r } #01 !/ @timer/ ( mod -- ) .&speed LDZ ADD ( >> ) @timer/ ( speed -- ) .&speed STZ [ LIT2 00 -&beat ] STZ !/ @timer/ ( -- ) ,&x LDR2 #0008 ADD2 .Screen/x DEO2 ,&y LDR2 .Screen/y DEO2 .Screen/vector DEI2 ;&on-play NEQ2 INC ;font/color STA #0e10 ;&speed LDZ DIV2 !font/ @timer/ ( -- ) [ LIT2 &x $2 ] .Screen/x DEO2 [ LIT2 &y $2 ] .Screen/y DEO2 ( | icon ) ;beat-icn .Screen/addr DEO2 [ LIT2 01 -&frame-lb ] LDZ AND INC .Screen/sprite DEO JMP2r ( @|Select ) %add-pos ( xy xy -- xy ) { ROT ADD STH ADD STHr } @select/ ( x y mod -- ) #0e AND DUP ( | handlers ) #04 EQU ?/ #02 EQU ?/ / !insert/ @select/ ( x y -- ) /validate-from ?{ POP2 JMP2r } /validate-to ?{ POP2 JMP2r } STH2k .&from LDZ2 add-pos STH2r .&to LDZ2 add-pos !/ @select/ ( x y mod -- ) /validate-from ?{ POP2 JMP2r } /validate-to ?{ POP2 JMP2r } edit/ STH2k .&from LDZ2 add-pos STH2r .&to LDZ2 add-pos / !edit/ @select/ ( x y mod -- ) POP /validate-to ?{ POP2 JMP2r } .&to LDZ2 add-pos !/ @select/validate-from ( x y -- x y bool ) DUP .&y1 LDZ ADD #80 LTH ?{ #00 JMP2r } OVR .&x1 LDZ ADD #80 LTH JMP2r @select/validate-to ( x y -- x y bool ) DUP .&y2 LDZ ADD .grid/height LDZ LTH ?{ #00 JMP2r } OVR .&x2 LDZ ADD .grid/width LDZ LTH 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/ @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/ ( -- ) [ LIT2 &x $2 ] .Screen/x DEO2 [ LIT2 &y $2 ] .Screen/y DEO2 ( | icon ) #00 .Controller/vector DEI2 ;insert/on-button EQU2 STHk ( get addr ) #40 SFT2 ;&icns ADD2 .Screen/addr DEO2 ( draw ) 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 #00 ROT font/ #00 SWP !font/ @insert/ ( -- ) select/ / ;on-button ;&on-button .Controller/vector DEI2 ;&on-button EQU2 [ JMP SWP2 POP2 ] .Controller/vector DEO2 !select/ @insert/on-button ( -> ) .Controller/key DEI / BRK @insert/ ( -- ) .select/to LDZ2 INC ,&anchor STR2 JMP2r @insert/ ( -- ) [ LIT2 &anchor $2 ] INC2k ,&anchor STR2 !select/ @insert/ ( char -- ) DUP ?{ POP JMP2r } DUP #08 NEQ ?{ #ff00 select/ LIT ". select/ POP JMP2r } DUP #0a NEQ ?{ / POP JMP2r } DUP #0d NEQ ?{ / POP JMP2r } DUP #1b NEQ ?{ / POP JMP2r } DUP #20 NEQ ?{ #0100 select/ POP JMP2r } select/ #0100 !select/ @text/ ( addr* -- ) ;&buf ,&ptr STR2 &>w INC2 DUP2 ;grid/buf ADD2 LDA2 LIT2 ".. EQU2 ?{ DUP2 ports/e DUP / ?&>w } POP2 #00 ( >> ) @text/ ( c -- ) [ LIT2 &ptr =&buf ] INC2k ,&ptr STR2 STA JMP2r @text/ ( -- ) ;&buf &>ws LDAk DUP ?{ POP POP2 JMP2r } .Console/write DEO INC2 !&>ws ( @|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 @random/from-range ( a b -- num ) EQUk ?{ OVR SUB random/generate ADD SWP INC MOD ADD JMP2r } 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 ) @chr/capitalize ( num case -- ) ?{ b36chr JMP2r } DUP #09 GTH ?{ b36chr JMP2r } b36chr #20 SUB JMP2r @chr/vel ( char -- vel ) DUP LIT "0 EQU ?{ chrb36 #03 MUL DUP ?{ POP #7f } JMP2r } 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 @move ( from* to* -- ) DUP2 grid/get LIT ". EQU ?{ POP2 ports/ JMP2r } STH2 DUP2 grid/get STH2r ports/ LIT ". ROT ROT ports/ 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 &snarf ".snarf $1 ( Operators ) @op-a "A "Outputs 20 "sum 20 "of 20 "inputs $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( a ) ports/w1-val ( b ) STH2kr ports/e1-case STH ( res ) ADD STHr chr/capitalize STH2r ports/ JMP2r @op-b "B "Outputs 20 "difference 20 "of 20 "inputs $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( a ) ports/w1-val ( b ) STH2kr ports/e1-case STH ( sort ) GTHk [ JMP SWP ] ( res ) SUB STHr chr/capitalize STH2r ports/ JMP2r @op-c "C "Outputs 20 "modulo 20 "of 20 "frame $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2 .timer/frame LDZ2 ( rate* ) #00 STH2kr ports/w1-val EQUk ADD DIV2 ( mod* ) #00 STH2kr ports/e1-case STH ( res ) EQUk ADD MOD2 NIP STHr chr/capitalize STH2r ports/ JMP2r @op-d "D "Bangs 20 "on 20 "modulo 20 "of 20 "frame $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2 .timer/frame LDZ2 ( rate* ) #00 STH2kr ports/w1-val EQUk ADD ( mod* ) #00 STH2kr ports/e1-val EQUk ADD ( res ) MUL2 MOD2 #0000 EQU2 ports/ JMP2r @op-e "E "Moves 20 "eastward 20 "or 20 "bangs $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) .head/x LDZ INC .grid/width LDZ EQU ?{ INC2k !move } ports/ JMP2r @op-f "F "Bangs 20 "if 20 "inputs 20 "are 20 "equal $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( a ) ports/w1 ( b ) STH2kr ports/e1 ( res ) EQU ports/ JMP2r @op-g "G "Writes 20 "operands 20 "with 20 "offset $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( x ) STH2kr #0003 SUB2 ports/w-val ( load ) #00 SWP ADD2 ( y ) STH2kr #0002 SUB2 ports/w-val ( load ) INC get-row ADD2 ,&save STR2 ( len ) STH2kr ports/w1-val MIN1 #00 &>l ( load ) #00 OVR STH2kr INC2 ADD2 ports/e ( 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 ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( res ) ports/s STH2r ports/ JMP2r @op-i "I "Increments 20 "southward 20 "operand $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( step ) ports/w1-val ( value ) STH2kr ports/s chrb36 ADD ( mod ) STH2kr ports/e1-case STH ( res ) MIN1 MOD STHr chr/capitalize STH2r ports/ JMP2r @op-j "J "Outputs 20 "northward 20 "operand $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( get above ) above ports/w ( ignore cable ) DUP [ LIT "J ] NEQ ?{ POP POP2r JMP2r } ( skip down ) STH2r &>w below DUP2 grid/get chrb36 #13 EQU ?&>w ports/ JMP2r @op-k "K "Reads 20 "multiple 20 "variables $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ports/w1-val #00 &>l #00 OVR STH2kr INC2 ADD2 STH2k ports/e DUP LIT ". EQU ?{ ( load ) DUP 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 ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( a ) ports/w1-val ( b ) STH2kr ports/e1-case STH ( res ) LTHk POP? STHr chr/capitalize STH2r ports/ JMP2r @op-m "M "Outputs 20 "product 20 "of 20 "inputs $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( a ) ports/w1-val ( b ) STH2kr ports/e1-case STH ( res ) MUL STHr chr/capitalize STH2r ports/ JMP2r @op-n "N "Moves 20 "Northward 20 "or 20 "bangs $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) ;head/y LDZ EQU ?{ DUP2 above !move } ports/ JMP2r @op-o "O "Reads 20 "operand 20 "with 20 "offset $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( x ) STH2kr #0002 SUB2 ports/w-val INC #00 SWP ADD2 ( y ) STH2kr ports/w1-val get-row ADD2 ( val ) ports/e STH2r ports/ JMP2r @op-p "P "Writes 20 "eastward 20 "operand $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( key ) #0002 SUB2 ports/w-val ( len ) STH2kr ports/w1-val MIN1 #00 &>l #00 OVR STH2kr below ADD2 types/ INC GTHk ?&>l POP ( read ) STH2kr ports/e1 ROT ROT MOD #00 SWP STH2r below ADD2 ports/ JMP2r @op-q "Q "Reads 20 "operands 20 "with 20 "offset $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( x ) STH2kr #0003 SUB2 ports/w-val ( load ) #00 SWP INC2 ADD2 ( y ) STH2kr #0002 SUB2 ports/w-val ( load ) get-row ADD2 ,&load STR2 ( len ) STH2kr ports/w1-val MIN1 ( save ) #00 OVR STH2kr below SWP2 SUB2 INC2 ,&save STR2 #00 &>l ( load ) #00 OVR [ LIT2 &load $2 ] ADD2 ports/e ( 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 ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( a-min ) ports/w1-val ( b-max ) STH2kr ports/e1-case STH ( sort ) LTHk [ JMP SWP ] ( res ) random/from-range STHr chr/capitalize STH2r ports/ JMP2r @op-s "S "Moves 20 "southward 20 "or 20 "bangs $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) .head/y LDZ INC .grid/height LDZ EQU ?{ DUP2 below !move } ports/ JMP2r @op-t "T "Reads 20 "eastward 20 "operand $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( key ) #0002 SUB2 ports/w-val ( len ) STH2kr ports/w1-val MIN1 #00 &>l #00 OVR STH2kr INC2 ADD2 types/ INC GTHk ?&>l POP ( read ) MOD #00 SWP STH2kr INC2 ADD2 ports/e STH2r ports/ JMP2r @op-u "U "Bangs 20 "on 20 "Euclidean 20 "rhythm $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( step ) ports/w1-val ( max ) STH2kr ports/e1-val MIN1 STH2 ( frame ADD max SUB 1 ) .timer/frame LDZ2 #00 STHkr ADD2 #0001 SUB2 ( MUL step ) OVRr #00 STHr MUL2 ( % max ) #00 STHkr MOD2 ( ADD step ) SWPr #00 STHr ADD2 ( bucket GTH= max ) #00 STHr LTH2 #01 NEQ ports/ JMP2r @op-v "V "Reads 20 "and 20 "writes 20 "variable $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( key ) ports/w1 ( val ) STH2kr ports/e1 DUP LIT ". EQU ?&idle OVR LIT ". EQU ?&load ( save ) SWP variables/ POP2r JMP2r &load NIP variables/get STH2r ports/ JMP2r &idle POP2 POP2r JMP2r @op-w "W "Moves 20 "westward 20 "or 20 "bangs $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) ;head/x LDZ EQU ?{ DUP2 #0001 SUB2 !move } ports/ JMP2r @op-x "X "Writes 20 "operand 20 "with 20 "offset $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( x ) STH2kr #0002 SUB2 ports/w-val #00 SWP ADD2 ( y ) STH2kr ports/w1-val INC get-row ADD2 ( val ) STH2r ports/e1 ROT ROT ports/ JMP2r @op-y "Y "Outputs 20 "westward 20 "operand $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( get above ) ports/w1 ( ignore cable ) DUP [ LIT "Y ] NEQ ?{ POP POP2r JMP2r } ( skip down ) STH2r &>w INC2 DUP2 grid/get chrb36 #22 EQU ?&>w ports/ JMP2r @op-z "Z "Transitions 20 "operand 20 "to 20 "input $1 &lc ( addr* -- ) get-bang [ ?&* POP2 ] JMP2r &* ( addr* -- ) types/set-op STH2k ( rate ) ports/w1-val ( val ) STH2kr ports/s chrb36 ( target ) STH2kr ports/e1-case STH ( res ) SWP lerp STHr chr/capitalize STH2r ports/ JMP2r ( @|special ) @op-bang "* "Bangs 20 "neighboring 20 "operands $1 &* ( addr* -- ) LIT ". ROT ROT grid/ JMP2r @op-comment "# "Comments 20 "line $1 &* ( addr* -- ) STH2k ( set itself ) types/lock-lut ( get edge ) [ LIT2 00 -grid/width ] LDZ .head/x LDZ SUB ADD2 STH2r INC2 &>l types/lock-lut ( stop at hash ) DUP2 grid/get LIT "# EQU ?&end INC2 GTH2k ?&>l &end POP2 POP2 JMP2r @op-midi ": "Sends 20 "midi 20 "bytes $1 &* ( addr* -- ) INC2k STH2k ( channel ) ports/e-val #90 ORA ;&chn STA ( octave ) INC2r STH2kr ports/e-val INC #0c MUL ( note ) INC2r STH2kr ports/e DUP ,¬e STR chrmid ADD ,&pitch STR ( velocity ) INC2r STH2kr ports/e chr/vel ,&vel STR ( length ) INC2r STH2r ports/e-val MIN1 INC ,&len STR [ LIT2 ". ¬e $1 ] NEQ ?{ POP2 JMP2r } get-bang ?{ types/ JMP2r } ( bang ) types/ [ LIT2 &chn $1 &pitch $1 ] [ LIT2 &len $1 &vel $1 ] !voices/ @op-pitch "; "Sends 20 "pitch 20 "byte $1 &* ( addr* -- ) STH2k ( octave ) ports/e1-val ( note ) STH2kr INC2 ports/e1 ( has note ) DUP LIT ". NEQ ?{ POP2 POP2r JMP2r } get-bang ?{ POP2 STH2r types/ JMP2r } ( bang ) STH2r types/ chrmid SWP INC #0c MUL ADD .Console/write DEO JMP2r @op-byte "/ "Sends 20 "hexadecimal 20 "byte $1 &* ( addr* -- ) STH2k ( hn ) ports/e1 ( ln ) STH2kr INC2 ports/e1 ( hv ) OVR LIT ". NEQ ?{ POP2 POP2r JMP2r } ( lv ) DUP LIT ". NEQ ?{ POP2 POP2r JMP2r } get-bang ?{ POP2 STH2r types/ JMP2r } ( bang ) STH2r types/ chrb36 #0f AND SWP chrb36 #0f AND #40 SFT ADD .Console/write DEO JMP2r @op-string "" "Sends 20 "string 20 "bytes $1 &* ( addr* -- ) STH2k ports/e1 LIT ". NEQ ?{ POP2r JMP2r } STH2kr text/ get-bang ?{ STH2r types/ JMP2r } ( bang ) STH2r types/ !text/ @op-self "$ "Loads 20 "orca 20 "file $1 &* ( addr* -- ) STH2k ports/e1 LIT ". NEQ ?{ POP2r JMP2r } STH2kr text/ get-bang ?{ STH2r types/ JMP2r } ( bang ) STH2r types/ .head/pos LDZ2 INC ;text/buf !file/ @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-comment =op-self =op-midi =op-pitch =op-byte =op-string ] @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 ] @chr/b36 ( 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 ] @b36/chr ( 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-string/* ( 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 0018 1818 187e 1818 1818 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 1818 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 @text/buf $80 @edit/buf