home *** CD-ROM | disk | FTP | other *** search
/ Set of Apple II Hard Drive Images / hard.hdv / HARD / FORTH / SOURCE / ERICMASC.WRD < prev    next >
Encoding:
Text File  |  1995-06-23  |  15.3 KB  |  663 lines  |  [04] ASCII Text (0x0000)

  1. ( ERIC'S VERSION OF MASC )
  2. ( META LANGUAGE FOR ADAPTIVE SYTHESIS )
  3.  
  4. \ : DECIMAL DEC ;
  5.  
  6. : 2@ DUP 2+ @ OVER @ ROT DROP ;
  7.                                              
  8. ( PASSPT APPLE MIDI INTERFACE REGISTERS )    
  9.  
  10. HEX                                           
  11. C0A8 CONSTANT CTRLREG               
  12.                                               
  13. CTRLREG 1+ CONSTANT DATAREG            
  14.        
  15. VARIABLE FIRSTTIME  1 FIRSTTIME !                                        
  16.        
  17. : INIT 13 CTRLREG C! 11 CTRLREG C! 0 FIRSTTIME ! ;
  18.  
  19. : ?XMIT ( -- TDRE )   CTRLREG C@ 2 AND ;                                               
  20. DECIMAL                                                                                               
  21. VARIABLE %TO      0 %TO !
  22.        
  23. : TO   1 %TO ! ;             
  24.                               
  25. : FROM/TO   
  26.    %TO @ IF ! 0 %TO ! ELSE @ THEN ;                                                                             
  27. : PARAMETER  ( N -- NAME )                  
  28.    CREATE , DOES> FROM/TO ;            
  29.  
  30. : PARAMETERS   ( SIZE -- NAME )            
  31.    CREATE DUP , 0 DO 0 , LOOP                
  32.    DOES> SWAP 2* + 2+ FROM/TO ;
  33.  
  34. : <BUILDS 0 CONSTANT ;                                                              
  35.  
  36. ( MIDI SEQUENCE PLAYBACK ROUTINE )
  37.  
  38. HEX
  39.  
  40. VARIABLE USERKEY  0 USERKEY  C!
  41. VARIABLE USERSTOP 0 USERSTOP C!
  42.  
  43. : ?USERSTOP USERSTOP @ IF QUIT THEN ;
  44.  
  45. VARIABLE PLAYPTR
  46. VARIABLE LASTSTATUS
  47. VARIABLE LENTEST
  48. VARIABLE VIRGIN  0 VIRGIN C!
  49.  
  50. 1 OBJECT MIDIOUT
  51.          BOT LDA,
  52.          1 PARM STA,
  53.          INX, INX,
  54. OBJ-CODE
  55. VIRGIN LDA,
  56. 0= IF,
  57.     13 # LDA,
  58.     CTRLREG STA,
  59.     11 # LDA,
  60.     CTRLREG STA,
  61.     1 # LDA,
  62.     VIRGIN STA,
  63. THEN, 
  64. 1 PARM LDA,
  65. DATAREG STA,
  66. BEGIN,
  67.   CTRLREG LDA, 
  68.   2 # AND,  \ (DONE WHEN TRDE BIT BECOMES 1)
  69. 0= NOT UNTIL, 
  70. OBJ-END
  71.  
  72.  
  73. HEX
  74. VARIABLE SPEEDVAL  1A SPEEDVAL !
  75. : SETSPEED ( NUM -- ) SPEEDVAL ! ;
  76. : GETSPEED ( -- NUM ) SPEEDVAL @ ;
  77.  
  78. 2 OBJECT DELTA               \ DELAY FOR DELTA TIME PASSED IN
  79.          BOT       LDA,
  80.          1 PARM    STA,
  81.          BOT 1+    LDA,
  82.          2 PARM    STA,
  83.                    INX, INX,
  84. OBJ-CODE
  85.     CLC,
  86.     1 PARM LDA,
  87.     0= IF,
  88.       2 PARM LDA,
  89.       0= IF,
  90.         SEC,
  91.       THEN,
  92.     THEN,
  93.     CS NOT IF,
  94.       BEGIN,
  95.         SPEEDVAL LDA,
  96.         HEX FCA8 JSR,     \ CALL APPLE DELAY ROUTINE
  97.      
  98.         1 PARM DEC,       \ DECREMENT 2 BYTE VALUE
  99.         1 PARM LDA,
  100.         FF # CMP,
  101.         0= IF,
  102.           2 PARM DEC,
  103.         THEN,     
  104.         CLC,
  105.         1 PARM LDA,
  106.         0= IF,
  107.           2 PARM LDA,
  108.           0= IF,
  109.             SEC,
  110.           THEN,
  111.         THEN,
  112.       CS UNTIL,
  113.     THEN,
  114. OBJ-END
  115.  
  116.  
  117. 2 OBJECT PLAY
  118.          BOT 2 + LDA,
  119.          PLAYPTR STA,
  120.          BOT 3 + LDA,
  121.          PLAYPTR 1+ STA,
  122.          INX, INX, INX, INX,
  123. OBJ-CODE
  124.  
  125. 0 # LDA,
  126. USERKEY STA,
  127. USERSTOP STA,
  128.  
  129. CLC,
  130. PLAYPTR LDA,          \ GET START ADRS OF SEQUENCE INTO N
  131. 8 # ADC,
  132. N STA,
  133. PLAYPTR 1+ LDA,
  134. 0 # ADC,
  135. N 1+ STA, 
  136.  
  137. BEGIN,
  138.          C000 LDA,           \ CHECK IF KEY PRESSED
  139.          0< IF,
  140.             C010 LDA,
  141.             7F # AND,
  142.             USERKEY STA,     \ SAVE USER'S KEY
  143.             1B # CMP,        \ USER WANTS TO ESCAPE        
  144.             0= IF,
  145.                1 # LDA,
  146.                USERSTOP STA,
  147.                OBJ-EXIT
  148.             THEN,
  149.             20 # CMP,        \ SPACEBAR = EXIT NOW BUT DONT STOP
  150.             0= IF,
  151.                OBJ-EXIT
  152.             THEN,
  153.          THEN,
  154.        
  155.          0 # LDY,            \ GET 1ST BYTE OF DELTA TIME 
  156.          N )Y LDA, 
  157.          0< IF,              \ IF > $80
  158.              7F # AND,         \ MASK HI BIT, SHIFT RIGHT 
  159.              .A LSR, 
  160.              2 'PARM DELTA STA,        \ SAVE DELTA TIME HI BYTE 
  161.              0 # LDA, \ GET LO BIT OF THAT BYTE INTO HI BIT OF A
  162.              .A ROR, 
  163.              INY,        \ OR IT WITH THE SECOND DELTA TIME BYTE
  164.              N )Y ORA, 
  165.              1 'PARM DELTA STA, \ SAVE AS THE LO BYTE OF DELTA 
  166.  
  167.              CLC,            \ INCREMENT N BY 2
  168.              N LDA, 
  169.              2 # ADC, 
  170.              N STA, 
  171.              N 1+ LDA, 
  172.              0 # ADC, 
  173.              N 1+ STA, 
  174.  
  175.              CLC,  \ SIGNAL THAT WE WANT TO CALL DELTA
  176.          ELSE, 
  177.              0= IF,
  178.                  CLC,        \ INCREMENT N BY 1
  179.                  N LDA, 
  180.                  1 # ADC, 
  181.                  N STA, 
  182.                  N 1+ LDA, 
  183.                  0 # ADC, 
  184.                  N 1+ STA, 
  185.                  SEC, \ SIGNAL THAT WE DONT WANT TO CALL DELTA
  186.              ELSE,
  187.                  1 'PARM DELTA STA, \ STORE 1 BYTE DELTA TIME  
  188.                  0 # LDA, 
  189.                  2 'PARM DELTA STA, 
  190.  
  191.                  CLC,        \ INCREMENT N BY 1
  192.                  N LDA, 
  193.                  1 # ADC, 
  194.                  N STA, 
  195.                  N 1+ LDA, 
  196.                  0 # ADC, 
  197.                  N 1+ STA, 
  198.                  CLC,
  199.              THEN,
  200.          THEN, 
  201.          
  202.          CS NOT IF,
  203.              OBJ-CALL DELTA  \ ONLY IF NON 0 DELTA TIME ABOVE 
  204.          THEN,
  205.  
  206.          0 # LDY,            \ GET MIDI INSTRUCTION 
  207.          N )Y LDA, 
  208.  
  209.          FF # CMP,             \ CHECK FOR END-OF-TRACK
  210.          0= IF, 
  211.             SEC,
  212.          ELSE,
  213.  
  214.            N )Y LDA,         \ GET THE SAME BYTE AGAIN
  215.            0< IF,              \ IF > $80 
  216.                LASTSTATUS STA,  \ SAVE IT AS THE CURR STS BYTE
  217.    
  218.                1 'PARM MIDIOUT STA,
  219.                OBJ-CALL MIDIOUT
  220.  
  221.                CLC,          \ INCREMENT N BY 1
  222.                N LDA,   
  223.                1 # ADC,  
  224.                N STA,  
  225.                N 1+ LDA,  
  226.                0 # ADC, 
  227.                N 1+ STA,
  228.  
  229.                N )Y LDA,     \ GET DATA BYTE
  230.            THEN, 
  231.  
  232.            1 'PARM MIDIOUT STA,
  233.            OBJ-CALL MIDIOUT
  234.  
  235.            
  236.            \ DETERMINE IF 1 OR 2 BYTE INSTRUCTION
  237.            
  238.            2 # LDA,
  239.            LENTEST STA,
  240.            LASTSTATUS LDA,  \ CHECK STATUS BYTE
  241.            C0 # CMP,
  242.            CS IF, 
  243.             E0 # CMP,
  244.             CC IF,           \ 1 BYTE
  245.              1 # LDA,
  246.              LENTEST STA,
  247.             THEN,
  248.            THEN,
  249.            
  250.            LENTEST LDA,
  251.            2 # CMP,
  252.            0= IF,
  253.              1 # LDY, 
  254.              N )Y LDA, 
  255.              1 'PARM MIDIOUT STA,
  256.              OBJ-CALL MIDIOUT
  257.              CLC,            \ INCREMENT N BY 2
  258.              N LDA, 
  259.              2 # ADC, 
  260.              N STA, 
  261.              N 1+ LDA,  
  262.              0 # ADC,  
  263.              N 1+ STA, 
  264.            THEN,
  265.            CLC,    \ SIGNAL THAT MORE WORK TO DO
  266.           
  267.          THEN, 
  268. CS UNTIL, 
  269.  
  270. OBJ-END 
  271.  
  272.  
  273. 0 PARAMETER DEBUGGING   
  274. 0 PARAMETER SEQUENCING
  275. 0 PARAMETER NEEDZERODLY                                 
  276. 0 PARAMETER PREVSTAT
  277. 0 PARAMETER DLYLENGTH
  278.        
  279. HEX                                           
  280. : MSND ( BYTE -- ) 
  281. DEBUGGING IF HEX . DEC ELSE
  282.    SEQUENCING IF   
  283.       NEEDZERODLY IF
  284.           0 C,   0 TO NEEDZERODLY
  285.       THEN
  286.       DUP 7F > OVER F0 < AND IF
  287.           DUP PREVSTAT = IF        ( CHECK FOR RUNNING STS )
  288.               DROP
  289.           ELSE
  290.               DUP TO PREVSTAT  C,
  291.           THEN
  292.       ELSE
  293.           C,
  294.       THEN
  295.       0 TO DLYLENGTH  ( TO SIGNAL THAT THERE WAS AN EVENT SINCE LAST DELAY )
  296.    ELSE
  297.       MIDIOUT 
  298.    THEN
  299. THEN 
  300. ;                                                     
  301.    
  302. VARIABLE JOYX   0 JOYX !
  303. VARIABLE JOYY   0 JOYY !
  304.     
  305. HEX
  306. CODE JOY
  307.   XSAVE STX,
  308.   0 # LDX,  0 # LDY,  80 # LDA,  SEC,
  309.   C070 BIT, C064 BIT,  10 C, 03 C,  INX,  D0 C, 02 C,
  310.   NOP, NOP, C065 BIT,  10 C, 03 C,  INY,  D0 C, 02 C,
  311.   NOP, NOP, 1 # SBC,   B0 C, E8 C,
  312.   ' JOYX STX,  ' JOYY STY,  
  313.   XSAVE LDX,  NEXT JMP,
  314. END-CODE 
  315.  
  316.  
  317.  ( CODE TO TRAP PROGRAM CHANGES )
  318.  
  319. CODE WAITPC
  320. BEGIN,
  321.    C0A8 LDA,
  322.    1 # AND,
  323. 0= NOT UNTIL,
  324. BEGIN,
  325.    C0A9 LDA,
  326.    F0 # AND,
  327.    C0 # CMP,
  328. 0= UNTIL, 
  329. BEGIN,
  330.    C0A8 LDA,
  331.    1 # AND,
  332. 0= NOT UNTIL,
  333.  
  334. C0A9 LDA,
  335.      PHA,
  336. 0 #  LDA,
  337. PUSH JMP,
  338.  
  339. END-CODE
  340.   
  341. HEX
  342. 40 PARAMETER VEL   ( KEY VELOCITY)      
  343. 40 PARAMETER SAVEVEL
  344. 10 PARAMETER ACCENTINC ( ACCENTED KEY VELOCITY)
  345.  
  346. 0 PARAMETER CHANNEL                     
  347.  
  348. : VOL ( NUM -- ) DUP TO VEL TO SAVEVEL ;               
  349. : AC  ( -- ) VEL  DUP TO SAVEVEL  ACCENTINC + TO VEL ;
  350.  
  351. : CHNL ( NUM --) TO CHANNEL ;           
  352.  
  353. : END-INST
  354.    1 TO NEEDZERODLY  ;
  355.  
  356. : ON  ( KEY -- )  90 CHANNEL 0F AND      
  357.        + MSND MSND VEL MSND END-INST ;        
  358.  
  359. : OFF ( KEY -- )  90 CHANNEL 0F AND         
  360.        + MSND MSND 0 MSND END-INST ;          
  361.  
  362.  
  363. : CTRL-CHG ( VALUE CTRL-NUMBER -- )        
  364.    CHANNEL 0F AND B0 + MSND MSND MSND END-INST ;     
  365.  
  366. : RESETCTRLS   0 79 CTRL-CHG ;
  367.  
  368. 0 PARAMETER VARIATION
  369.  
  370. : VAR ( VARIATION# -- )
  371.    TO VARIATION ;
  372.  
  373. : PGM ( PROGRAM -- )
  374.    VARIATION 0 CTRL-CHG  0 32 CTRL-CHG   
  375.    C0 CHANNEL 0F AND + MSND 1 - MSND END-INST ;        
  376.  
  377. : AFTERTOUCH ( KEY VALUE -- )
  378.    CHANNEL 0F AND A0 + MSND SWAP MSND MSND END-INST ;
  379.  
  380. : PRESSURE ( VALUE )
  381.    CHANNEL 0F AND D0 + MSND MSND END-INST ;
  382.  
  383. : BEND ( -8192 THRU +8191 )
  384.    CHANNEL 0F AND E0 + MSND
  385.    DUP 80 MOD MSND 80 / MSND END-INST ;
  386.  
  387. ( CONTROLLERS ) 
  388. HEX
  389.                 
  390. : DAMPER ( 0..7 -- )                       
  391.    0 MAX 7 MIN 10 * 40 CTRL-CHG ;   
  392.                                                              
  393. : SOST ( 1=ON 0=OFF -- )              
  394.    0 MAX 1 MIN 40 * 42 CTRL-CHG ;   
  395.                                                              
  396. : SOFT ( 1=ON 0=OFF -- )              
  397.    0 MAX 1 MIN 40 * 43 CTRL-CHG ;                                                             
  398. : MODWHEEL ( 0-127 )  7F AND   1 CTRL-CHG ;
  399.                 
  400. : VOLUME ( 0-127 )    7F AND   7 CTRL-CHG ;
  401.  
  402. : EXPRESSION ( 0-127 ) 7F AND 0B CTRL-CHG ;
  403.  
  404. : PORTAMENTO ( 0-127 ) 7F AND 41 CTRL-CHG ;
  405.  
  406. : PANPOT ( 0-40-7F = LEFT,CENTER,RIGHT )  7F AND 0A CTRL-CHG ;
  407.  
  408. : PORTATIME ( 0-127 ) 7F AND 5 CTRL-CHG ;
  409.  
  410. : REVERB ( 0-127 ) 7F AND 5B CTRL-CHG ;
  411.  
  412. : CHORUS ( 0-127 ) 7F AND 5D CTRL-CHG ;
  413.  
  414.  
  415.  
  416. DECIMAL
  417.  
  418. : DELAY ( INTEGER -- ) 
  419.    SEQUENCING IF
  420.       DLYLENGTH 1 = IF  ( THERE HASN'T BEEN AN EVENT SINCE LAST DELAY)
  421.           -1 ALLOT  HERE C@ +  ( ADD PREV DELAY TO THIS DELAY)
  422.       THEN
  423.       DLYLENGTH 2 = IF
  424.           -2 ALLOT  HERE C@ 128 - 128 * HERE 1+ C@ + +
  425.       THEN
  426.  
  427.       0 TO NEEDZERODLY
  428.       1 TO DLYLENGTH
  429.       DUP 127 > IF
  430.          DUP 128 / 128 + C,  2 TO DLYLENGTH
  431.       THEN
  432.       128 MOD C,
  433.  
  434.    ELSE
  435.       DELTA 
  436.    THEN
  437. ;
  438.   
  439. 240 PARAMETER MGATE                   
  440.    
  441. : // MGATE DELAY  SAVEVEL TO VEL ;                    
  442.  
  443.  
  444. : KK  ( KEY -- )                           
  445.    DUP ON // OFF ;
  446.                                                            
  447. : CD+ ( NUM -- ) 
  448.    0 DO I PICK ON LOOP ;
  449.                
  450. : CD- ( NUM -- ) 
  451.    0 DO I PICK OFF LOOP ;               
  452.  
  453. HEX
  454.  
  455. : MUTE ( CHNL -- ) ( TURNS ALL SOUNDS OFF FOR CHANNEL )
  456.   B0 + MSND 78 MSND 00 MSND END-INST ;
  457.  
  458. : SHUTUP
  459.   CHANNEL MUTE ;
  460.  
  461. : QUIET ( -- )      
  462.   10 0 DO I MUTE LOOP ;
  463.  
  464.  
  465. 4 PARAMETER OCTAVE
  466.  
  467. : OCT ( N -- )   TO OCTAVE ;
  468. : O+ ( -- )  OCTAVE 1+ TO OCTAVE ;
  469. : O- ( -- )  OCTAVE 1 - TO OCTAVE ;
  470.                                                 
  471. DECIMAL
  472. : PITCH  ( NAME -- )  CREATE ,       
  473.    DOES> @ OCTAVE 12 * + 12 + ;                             
  474.                        
  475. 0  PITCH B#   0  PITCH C                
  476. 1  PITCH C#   1  PITCH D&               
  477. 2  PITCH D                              
  478. 3  PITCH D#   3  PITCH E&               
  479. 4  PITCH E    4  PITCH F&               
  480. 5  PITCH F    5  PITCH E#               
  481. 6  PITCH F#   6  PITCH G& 
  482. 7  PITCH G            
  483. 8  PITCH G#   8  PITCH A&               
  484. 9  PITCH A             
  485. 10 PITCH A#   10 PITCH B&                                              
  486. 11 PITCH B    11 PITCH C&
  487.  
  488. 960 PARAMETER WHOLEDELTA                                                   
  489.          
  490. : DURATION CREATE , , DOES>                        
  491.    WHOLEDELTA SWAP 2@ */ TO MGATE ;                                                   
  492. 2  1 DURATION BN    4  3 DURATION BN3
  493. 1  1 DURATION WN    2  3 DURATION WN3
  494. 1  2 DURATION HN    1  3 DURATION HN3   
  495. 1  4 DURATION QN    1  6 DURATION QN3   
  496. 1  8 DURATION EN    1 12 DURATION EN3   
  497. 1 16 DURATION SN    1 24 DURATION SN3   
  498. 1 32 DURATION TN    1 48 DURATION TN3                                         
  499. 1 64 DURATION GN    1 96 DURATION GN3
  500.  
  501. 3  2 DURATION WN.                              
  502. 3  4 DURATION HN.                       
  503. 3  8 DURATION QN.             
  504. 3 16 DURATION EN.                       
  505. 3 32 DURATION SN.             
  506. 3 64 DURATION TN.
  507.  
  508. 1 80 DURATION GN5
  509. 1 40 DURATION TN5
  510. 1 20 DURATION SN5
  511. 1 10 DURATION EN5
  512. 1  5 DURATION QN5
  513. 2  5 DURATION HN5
  514. 4  5 DURATION WN5
  515. 8  5 DURATION BN5
  516.  
  517. 0 PARAMETER TIEVAL
  518.  
  519. : <TIE
  520.    0 TO TIEVAL ;
  521.  
  522. : &
  523.    MGATE TIEVAL + TO TIEVAL ;
  524.  
  525. : TIE>
  526.    & TIEVAL TO MGATE ;
  527.  
  528. ( GRACE NOTES - SUBTRACTION WITHIN A TIE )
  529. ( EX: 3 C GN // 3 D HN GN- // )
  530.  
  531. : GN-
  532.    MGATE GN MGATE - TO MGATE 
  533. ;
  534.  
  535.  
  536. : CD ( KEYS  NUM -- )     ( PLAY A CHORD )                      
  537. DUP 0 DO I 2 + PICK ON LOOP 
  538. MGATE DELAY 0 DO OFF LOOP ;                                            
  539.  
  540.  
  541. ( PASTING SEQUENCES )
  542.  
  543. HEX
  544.  
  545. VARIABLE LASTDLY
  546. VARIABLE LASTDLYLEN
  547. VARIABLE FIRSTDLY
  548. VARIABLE FIRSTDLYLEN
  549.  
  550. : PASTE  ( ADRS LEN -- )
  551.  
  552. \ MAKE SURE WE HAVE A DELAY
  553. NEEDZERODLY IF  0 C,  0 TO NEEDZERODLY  THEN
  554.  
  555. \ GET LAST DELAY OF CURRENT SEQUENCE
  556. 0 LASTDLY !  
  557. 1 LASTDLYLEN !
  558. HERE 2 - C@  \ CHECK 2 PREVIOUS BYTES TO GET DELAY
  559. DUP 7F > IF 
  560.     80 - 80 * LASTDLY !
  561.     2 LASTDLYLEN !
  562. ELSE
  563.     DROP
  564. THEN
  565. HERE 1 - C@
  566. LASTDLY @ + LASTDLY !
  567.  
  568. \ GET FIRST DELAY OF NEW SEQUENCE
  569. SWAP 8 + SWAP OVER \ POINT TO FIRST DELAY
  570. C@
  571. 0 FIRSTDLY !  
  572. 1 FIRSTDLYLEN !
  573. DUP 7F > IF 
  574.     80 - 80 * FIRSTDLY !
  575.     2 FIRSTDLYLEN !
  576.     OVER 1+ C@
  577.     FIRSTDLY @ + FIRSTDLY !
  578. ELSE
  579.     FIRSTDLY !
  580. THEN
  581.  
  582. \ STORE SUM OVER OLD DELAY
  583. LASTDLYLEN @ -1 * ALLOT
  584. LASTDLY @ FIRSTDLY @ + 
  585. DUP 7F > IF 
  586.     DUP 80 / 80 + C,
  587.     80 MOD
  588. THEN C,
  589.  
  590. \ PREPARE FOR CMOVE
  591. \ STACK CURRENTLY HAS: ADRS OF FIRSTDLY, SEQ LEN
  592. SWAP FIRSTDLYLEN @ +     \ POINT TO FIRST EVENT OF NEW SEQ
  593. SWAP 8 - FIRSTDLYLEN @ - 3 -  \ ADJUST LEN FOR HEADER (8)
  594.                          \  AND TRAILER (3) AND FIRST DELAY
  595. DUP ROT ROT            \ LEN ADRS LEN
  596. HERE SWAP              \ LEN ADRS HERE LEN 
  597. CMOVE                  \ LEN
  598. ALLOT
  599.  
  600. 1 TO DLYLENGTH     \ ADJUST DLYLENGTH FOR FUTURE EVENTS
  601. HERE 2 - C@ 7F > IF
  602.      2 TO DLYLENGTH
  603. THEN
  604.  
  605. 0 TO PREVSTAT
  606. 0 TO NEEDZERODLY   \ GET READY FOR ADDING MORE TO SEQUENCE
  607. ;
  608.  
  609. ( FORTH SEQUENCER )
  610.  
  611. HEX
  612.  
  613. 1 PARAMETER PLAYING  \ SET TO 1 TO PLAY SEQUENCES BY NAMING THEM
  614.  
  615. ( SEQUENCE STORES 0 AS THE INITIAL LENGTH AND PFA ADRS FOR END-SEQ)
  616. ( WHEN WORD IS EXECUTED, RETURNS STARTING ADDRESS AND LENGTH )
  617.  
  618. VARIABLE SEQPFA
  619.  
  620. : SEQUENCE  ( -- ) ( -- STARTADRS, LENGTH )
  621.    CREATE  HERE SEQPFA ! 
  622.    0 C, FF C, 7F C, 04 C, GETSPEED , 0 ,
  623.    0 TO PREVSTAT
  624.    1 TO NEEDZERODLY
  625.    1 TO SEQUENCING
  626.    0 TO DLYLENGTH   ( IN CASE FIRST EVENT IN SEQUENCE IS A DELAY ) 
  627.    DOES> DUP 6 + @  
  628.    SEQUENCING IF PASTE ELSE   PLAYING IF PLAY THEN   THEN
  629. ;
  630.  
  631. : END-SEQ
  632.    ( STORE TERMINATOR BYTES FOR PLAYBACK PROGRAM )
  633.    NEEDZERODLY IF
  634.        0 C,
  635.    THEN
  636.    FF C, 2F C, 0 C, 
  637.    0 TO PREVSTAT
  638.    0 TO NEEDZERODLY
  639.    0 TO SEQUENCING
  640.    ( CALCULATE LENGTH OF SEQUENCE & STORE IT )
  641.    HERE SEQPFA @ - SEQPFA @ 6 + !
  642. ;
  643.  
  644. ( LOADING AND SAVING SEQUENCES )
  645.  
  646. ( SYNTAX: PREFIX" /PATHNAME" )
  647.  
  648. : PREFIX"
  649.    1 PAD C! ASCII " WORD PAD 1+ ! PAD C6 MLI
  650. ;
  651.  
  652. : BSAVE"  ( START.ADRS LENGTH -- )
  653.    OVER                         ( ADRS LEN ADRS )
  654.    ASCII " WORD DUP             ( ADRS LEN ADRS WORD WORD )
  655.    ROT                          ( ADRS LEN WORD WORD ADRS )
  656.    6 ( BIN ) SWAP               ( ADRS LEN WORD WORD 6 ADRS )
  657.    ( CREATEF USES TOP 3 PARMS, OPENF USES WORD, WRITEF USES ADRS,LEN )
  658.    (CREATEF) ?DERR \ CREATE NEW FILE 
  659.    (OPENF) ?DERR   \ PASS PATHNAME - RETURN FILE#
  660.    (WRITEF) ?DERR  \ WRITE THE BINARY DATA TO THE FILE
  661.    0 (CLOSEF) ?DERR
  662. ;
  663.